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
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.062 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.062 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
Angehängte Grafiken
Dateityp: jpg DirectD3D11_D21_Test.jpg (60,4 KB, 27x aufgerufen)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.062 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
Antwort Antwort


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 18:58 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