AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Direct2D 1.1 CreateDeviceContext
Thema durchsuchen
Ansicht
Themen-Optionen

Direct2D 1.1 CreateDeviceContext

Ein Thema von SonnyBoyPro · begonnen am 31. Jan 2014 · letzter Beitrag vom 4. Feb 2014
Antwort Antwort
Seite 1 von 2  1 2      
SonnyBoyPro

Registriert seit: 9. Mai 2007
68 Beiträge
 
#1

Direct2D 1.1 CreateDeviceContext

  Alt 31. Jan 2014, 11:12
Hallo zusammen,

bin gerade dabei die D2D1_1.h nach Delphi zu konvertieren.
Erstes Demo lauft bereits

Nur hab ich nun folgendes Problem:
Delphi-Quellcode:
 ID2D1Device = interface(ID2D1Resource)
        ['{47dd575d-ac05-4cdd-8049-9b02cd16f44c}']
        function ClearResources(millisecondsSinceUse: UINT32 = 0): HResult; stdcall;
        function CreateDeviceContext(const options: TD2D1_DEVICE_CONTEXT_OPTIONS; out deviceContext: ID2D1DeviceContext): HResult; stdcall;
nur bekomme ich beim verwenden der Funktion immer eine Zugriffsverletzung. Geh also davon aus das meine Konvertierung nicht passt. Original MSDN Deklaration
Code:
HRESULT CreateDeviceContext(
  D2D1_DEVICE_CONTEXT_OPTIONS options,
  [out] const ID2D1DeviceContext **deviceContext
);
Wie wird [out] const nach Pascal konvertiert? Stimmt meine Konvertierung oder muss man da was anderes machen ?

bg
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Direct2D 1.1 CreateDeviceContext

  Alt 31. Jan 2014, 16:51
Wie hast du denn ID2D1Factory1::CreateDevice übersetzt?
Vielleicht geht es auf dem gleichen Wege?

Ob das Device : ID2D1Device ungleich nil (assigend) ist hast du wahrscheinlich überprüft bevor du darauf zugreifst?!

Finde ich gut, dass du dir die Mühe machst!
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Direct2D 1.1 CreateDeviceContext

  Alt 31. Jan 2014, 17:01
Ja, das muss auf den gleichen Weg gehen.
Schau mal in d2d1_1.h in Zeile 2500 und 2568.
  Mit Zitat antworten Zitat
SonnyBoyPro

Registriert seit: 9. Mai 2007
68 Beiträge
 
#4

AW: Direct2D 1.1 CreateDeviceContext

  Alt 31. Jan 2014, 21:19
hab so übersetzt:
Delphi-Quellcode:
ID2D1Factory1 = interface(ID2D1Factory)
        ['{bb12d362-daee-4b9a-aa1d-14ba401cfa1f}']

        function CreateDevice(dxgiDevice: IDXGIDevice; out d2dDevice: ID2D1Device): HResult; stdcall;
momentan kämpf ich halt auf zwei Fronten: zum einen das Framework kapieren und zum anderen übersetzen. Und bin mir momentan auch nicht sicher ob ich
falsch übersetzt oder falsch angewendet habe.

Zum Aufruf:
die Klasse vom ID2D1Device ist beim Aufruf nicht nil. GetMaximumTextureMemory z.B. liefert einen Wert zurück.


Über D2D1CreateDeviceContext schaff ich's zumindest schon mal einen ID2D1DeviceContext für eine D11-Texture zu kreieren und darauf zu zeichnen

kurzes Code-Schnippsel:
Delphi-Quellcode:
hr := DeviceD11.CreateTexture2D(texDesc, nil, m_pOffscreenTexture);
    hr := DeviceD11.CreateShaderResourceView(m_pOffscreenTexture, nil, m_pTextureRV);

    { Direct2D 1.1 }
    D2D1CreateFactory(D2D1_FACTORY_TYPE_MULTI_THREADED, ID2D1Factory1, nil, gD2DFactory);
    DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, IDWriteFactory, IUnknown(gDWriteFactory));

    gDWriteFactory.CreateTextFormat('Calibri', nil, DWRITE_FONT_WEIGHT_REGULAR, DWRITE_FONT_STYLE_NORMAL, DWRITE_FONT_STRETCH_NORMAL, 72.0, 'de-gr',
        FTextFormat);
    FTextFormat.SetWordWrapping(DWRITE_WORD_WRAPPING_NO_WRAP);
    lDxgiSurface := nil;
    hr := m_pOffscreenTexture.QueryInterface(IDXGISurface, lDxgiSurface);
    hr := D2D1CreateDeviceContext(lDxgiSurface, TD2D1_CREATION_PROPERTIES(nil^),m_d2dContext);
    m_d2dContext.SetTextAntialiasMode(D2D1_TEXT_ANTIALIAS_MODE_GRAYSCALE);
Ergebnis siehe Anhang. Zwar noch nicht viel aber zumindest funktioniert's mal Direct2D 1.1 in Kombination mit Direct3D11

Sobald ich mal ne halbwegs fertig übersetzte Version habe bekommt die Community natürlich das Ergebnis zur Verfügung gestellt

bg
Miniaturansicht angehängter Grafiken
directd3d11_d21_test.jpg  
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Direct2D 1.1 CreateDeviceContext

  Alt 31. Jan 2014, 22:46
Hm, du hast ja sicher schon etwas mehr damit gemacht, als dieser Beispiel-Code zeigt.
Aber da weder in D2D1CreateDeviceContext noch in D2D1CreateFactory der gewünschte Debug-Level gesetzt wird, muss ich fragen:
Hast du den Direct 2D Debug Layer installiert?
In meinen Augen unverzichtbar, wenn man der API entwickelt.
Den Debug-Level auf Information gestellt und schon kriegt man alle Fehler aufgezeigt.


Anhand deines Codes könnte man beispielsweise die Vermutung anstellen, dass du Ressourcen mit deiner Instanz gD2DFactory erstellt hast und versuchst diese mit deinen DeviceContext aus D2D1CreateDeviceContext zu kombinieren.
Das ist nicht erlaubt, da diese Funktion zusammen mit den Context auch immer ein neues Device und Factory erstellt.
Siehe auch:

Wo zeigt denn der Callstack hin, wenn die Zugriffsverletztung kommt?
Sehr nervig ist es, wenn irgendwo tief unten im Grafikkartenspeicher irgendwas passiert.
Wenn einen da die Meldungen des Debug-Layers nicht weiterhelfen, kann das in eine ganz schöne Sucherei ausarten.
  Mit Zitat antworten Zitat
SonnyBoyPro

Registriert seit: 9. Mai 2007
68 Beiträge
 
#6

AW: Direct2D 1.1 CreateDeviceContext

  Alt 1. Feb 2014, 22:42
Hallo,
ja ich hab schon was mit Direct2D unter DirectX10.1 gemacht. Die Sache ist ganz einfach die: ursprünglich wollt ich ja meine MultiMedia Anwendung unter DirectX9 schreiben (wegen DirectShow und DBA). Das Problem ist aber das zwar Shared Surfaces mit D3D9Ex funktionieren, nur die Performance von der gerenderten Direct2D-> 10.1 Texture zu wünschen übrig läßt. Zumindest hab' ich nicht flüssig hinbekommen ... Lauftext ruckelt, etc. Problem ist laut MSDN vermutlich der permanente 10.1 Flush denn man braucht.

Drum will ich jetzt gleich auf DX11 umsteigen

Nun zum Debug-Layer. Hab mir das Teil installiert.. gutes Tool, danke für den Hinweis. Nun hab ich folgendes ausprobiert:
Delphi-Quellcode:
    lDXGIDevice:=nil;
    hr:=DeviceD11.QueryInterface(IDXGIDevice, lDXGIDevice);
    pFactoryOptions.DebugLevel:= D2D1_DEBUG_LEVEL_INFORMATION;
    D2D1CreateFactory(D2D1_FACTORY_TYPE_MULTI_THREADED, ID2D1Factory1, @pFactoryOptions, gD2DFactory1);
    hr:=gD2DFactory1.CreateDevice(lDXGIDevice, m_d2dDevice);
    hr:=m_d2dDevice.CreateDeviceContext(D2D1_DEVICE_CONTEXT_OPTIONS_ENABLE_MULTITHREADED_OPTIMIZATIONS, m_d2dContext);
das entspricht auch der Vorgehensweise von hier: [MSDN]http://msdn.microsoft.com/en-us/library/windows/desktop/hh780339(v=vs.85).aspx[/MSDN]

Und DebugLayer gibt mir folgendes aus:
Debug-Ausgabe:
D2D DEBUG ERROR - The parameter [printControlProperties->fontSubset] with value [1245036] for ID2D1Device::CreatePrintControl is not a valid enumeration value.

Ich wollte ja ein DeviceContext erstellen und kein PrintControl....
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Direct2D 1.1 CreateDeviceContext

  Alt 2. Feb 2014, 10:33
Ich wollte ja ein DeviceContext erstellen und kein PrintControl....
Häng doch mal ein Beispielprogramm an, mit allen notwendigen von dir bisher gewrappten Headern.
Ich habe eine Idee woran es liegen könnte, aber ohne vollständiges Beispiel ist das Glaskugel wischen.
  Mit Zitat antworten Zitat
SonnyBoyPro

Registriert seit: 9. Mai 2007
68 Beiträge
 
#8

AW: Direct2D 1.1 CreateDeviceContext

  Alt 2. Feb 2014, 19:36
Hallo TiGü,

ist alles kein Geheimnis, soll ja ohnehin OpenSource werden. Anbei das gezippte Projekt. Noch ein bisschen unstrukturiert, bin ja auch noch in der Vor-Entwicklungs-Phase

Im Ordner Source\D2 sind die Header-Übersetzungen von D2D1_1 und D3D11_1 sowie die D2DBaseTypes.

in der Datei D2D_test wird in der Unit constructor TD2DTest.Create(DeviceD11: ID3D11Device); das D2D Device created.
was auskommentiert ist unter { funktioniert } ist das was geht. Damit kann ich schon auf die Surface zeichnen.

Weiter unten sind dann die Test bei denen ich die Zugriffsverletzung bekomme.


Sollte sich unter XE2 compilieren lassen.

bg
Angehängte Dateien
Dateityp: zip CMCD11.zip (1,35 MB, 22x aufgerufen)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Direct2D 1.1 CreateDeviceContext

  Alt 3. Feb 2014, 10:11
Wie ich vermutet hatte, du hast die Reihenfolge der Interface-Methoden vertauscht.

Oder besser gesagt, du hast das für bare Münze genommen, was in der MSDN steht.
Hier musst du Vorsicht walten lassen, weil in der MSDN die Methoden idR. alphabetisch sortiert sind.
Das muss aber in den Orginaldefinition nicht sein!
Dadurch kommt die virtual method table (VMT) durcheinander.
Siehe auch hier!

Du musst dich beim Übersetzen immer an die Microsoft-Header direkt halten.

Dadurch, dass ClearResources vor CreateDeviceContext definiert wurde, hat sich alles verschoben und das Device hat die CreatePrintControl-Methode verwendet, obwohl du CreateDeviceContext gerufen hast.

Richtig(er) wäre also:

Delphi-Quellcode:
    IPrintDocumentPackageTarget = interface(IUnknown)

    end;

    ID2D1Device = interface(ID2D1Resource)
    ['{47dd575d-ac05-4cdd-8049-9b02cd16f44c}']
      function CreateDeviceContext(const options: TD2D1_DEVICE_CONTEXT_OPTIONS; out deviceContext: ID2D1DeviceContext): HResult; stdcall;
      function CreatePrintControl(wicFactory: IWICImagingFactory;
        documentTarget: IPrintDocumentPackageTarget;
        printControlProperties: TD2D1_PRINT_CONTROL_PROPERTIES;
        out printControl: ID2D1PrintControl): HResult; stdcall; // ToDo needs DocumentTarget.h --> Jedi ?!?
      function SetMaximumTextureMemory(maximumInBytes: UINT64): HResult; stdcall;
      function GetMaximumTextureMemory: UINT64; stdcall;
      function ClearResources(millisecondsSinceUse: UINT32 = 0): HResult; stdcall;
    end;
Das gleiche Problem hast du dann weiter unten im auskommentierten Code für m_d2dContext.CreateBitmapFromDxgiSurface.
Auch die Defintion von ID2D1DeviceContext ist ein bisschen durcheinander geraten.

Irgendwie sind auch die von dir verwendeten Header nicht ganz korrekt.
Bspw. musst du für SetTarget das ID2D1Bitmap1 noch umcasten nach ID2D1Image.
Eigentlich ist das aber nicht nötig!

Das liegt an der falschen Vererbungslinie in D2D1.pas von diesen J S Bladen.
Korrekt wäre ist ID2D1Bitmap1 -> ID2D1Bitmap -> ID2D1Image -> ID2D1Resource -> IUnknown.
In dieser Übersetzung ist aber Bitmap direkt von Resource abgeleitet.

Geändert von TiGü ( 3. Feb 2014 um 12:09 Uhr)
  Mit Zitat antworten Zitat
SonnyBoyPro

Registriert seit: 9. Mai 2007
68 Beiträge
 
#10

AW: Direct2D 1.1 CreateDeviceContext

  Alt 4. Feb 2014, 09:06
Hallo TiGü,

danke für die Info.
Header hätte ich vom Windows 8.0 SDK genommen. Gibts noch ein anderes Package?
Hab die d2d1_1.h nochmals angesehen -> Reihenfolge tatsächlich anders

Ich muss das Package sowieso nochmal durchschauen, weil ich auch teilweise die Übergabe nicht richtig deklariert habe. Also Txx statt PTxxx.

JSB: ja, da hatte ich auch schon meine Probleme damit, z.B. funktioniert irgendein Aufruf nicht, weil Delphi meinte das die Typen so nicht zusammenpassen, was aber laut MSDN so funktionieren musste --> JSB angepasst, ging.

Drum hab ich auch für mein Projekt die JSB abgespalten und verwende die Source-Dateien direkt und passe an wo notwendig.

bg

PS: sobald die Header ordentlich übersetzt sind, werden sie natürlich gepostet
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:23 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz