DirectX 11 für UWP

O-M-G! Wenn ich mich verschätze, dann ordentlich!

Irgendwie glaubte ich, dass ich in ein paar Stunden die “paar Kernklassen” von DirectX von C++ auf C manuell übersetzen zu können.

Schließlich wollte ich doch nur ein UWP Fenster mit einem Framebuffer erstellen lassen können …


So wie Mönche im Mittelalter die wenigen Bücher Seite für Seite und Buchstabe für Buchstabe händisch abmalten, so investiere ich “gerne” meine Freizeit in die Übersetzung von COM-Klassen von C++ nach C.

Denn Microsofts generierter C++ Code ist nur MSVC treu, bringt aber andere Compiler gerne zum Verzweifeln. Und nachdem Fingerübungen gut für die Feinmotorik sind, weitete ich meine UWP-Spielchen auf DirectX aus.

Übersetzung von COM C++ nach C

Ein in den Headern definiertes Interface, das z.B. so aussieht:

1interface DECLARE_INTERFACE("12345678-abcd-1234-5678-1234567890ab") 
2IMyClass : public IUnknown
3{
4        STDMETHOD(MyFunc1)(DWORD param1) PURE;
5        STDMETHOD(MyFunc2)(INT param1, void* param2) PURE;
6};

wird in etwa so übersetzt:

 1typedef struct IMyClass_interface IMyClass;
 2
 3typedef struct
 4{
 5  wrt_result(WRT_ABI *QueryInterface)(IMyClass* This, wrt_iid const* riid, void** ppvObject);
 6  wrt_ulong(WRT_ABI *AddRef)(IMyClass* This);
 7  wrt_ulong(WRT_ABI *Release)(IMyClass* This);
 8    
 9  wrt_result(WRT_ABI *MyFunc1)(IMyClass* This, wrt_dword param1);
10  wrt_result(WRT_ABI *MyFunc2)(IMyClass* This, wrt_int param1, void* param2);
11} IMyClass_vtbl;
12
13struct IMyClass_interface
14{
15  IMyClass_vtbl const* lpVtbl;
16};

Dabei sind meine eigenen Datentypen wie wrt_result oder wrt_dword nur Hilfsmittel, um weniger Abhängigkeiten zu Microsoft Headern zu schaffen. Man könnte auch die originalen HRESULT oder DWORD Typen nutzen.

Wieviele Klassen hat DirectX ?

Antwort: Fu**ing viele!

In den UWP DirectX Beispielen wird mit D2D1Factory3, DWriteFactory3, D3D11Device3, D3D11DeviceContext3 oder DXGIDevice3 gearbeitet.
Ich Naivling dachte: Das ist schnell erledigt … und stürzte mich ins Verderben.

Denn die Zahl 3 bedeutete schon mal, dass es ein Original, ein 2 und 3 Interface zu jeder Klasse gab und nachdem schon teilweise das Original mit 20+ Methoden ausgestattet war, wurde der Spaß mit den höheren Interface Versionen nicht weniger.

Doch am Schlimmsten war, dass jede der 20 Methoden ein neues Interface einführte, das mit einer Factory zu weiteren Instanzen führen konnte.

Inzwischen habe ich 140 Klassen und mindestens genau so viele struct und enum Typen in mein “kleines” Projekt integriert und ich bin erst bei Interface 2 angekommen. Die Methodenanzahl geht also schon weit über 2000 hinaus, und ich habe bereits über 8000 Zeilen an übersetztem Code abgetippt.

Dem gegenüber steht dann ein OpenGL 1.1, wo ich mit einem Subset von 90 flachen C-Funktionen ganze 3D-Welten und 2D-Framebuffer umsetzen kann.

Lerneffekte

Ein Hintergedanke von dieser “Fingerübung” stammt noch aus meiner Schulzeit:

Repetitio est mater studiorum.
Wiederholung ist der Mutter der Studien.

Denn beim Abtippen merkte ich erst, wie viele weitere Klassen (und damit Möglichkeiten) sich hinter DirectX versteckt. Und durch das wiederholte Niederschreiben der Schnittstellennamen, ergibt sich teilweise ein gewisses “Gefühl” für die Materie.

Das hätte man vermutlich in einem guten Buch auch nachlesen können, doch wenn der Code durch die eigenen Hände geht, bleibt stets mehr hängen.

Fazit

Ich bin noch nicht fertig und weiß auch noch gar nicht, ob meine Bemühungen überhaupt fruchten werden. Denn erst mit allen vollständigen Schnittstellen kann ich das erste Demoprogramm erstellen und versuchen es auszuführen.

Ziel soll jedenfalls sein, dass eine beliebige Rastergrafik auf dem Bildschirm erscheint und dass kein Microsoft-Header zum Einsatz kommen soll, sondern dass nur COM-Aufrufe gegen die binäre Schnittstelle stattfinden.

📧 📋 🐘 | 🔔
 

Meine Dokus über:
 
Weitere externe Links zu:
Alle extern verlinkten Webseiten stehen nicht in Zusammenhang mit opengate.at.
Für deren Inhalt wird keine Haftung übernommen.



Wenn sich eine triviale Erkenntnis mit Dummheit in der Interpretation paart, dann gibt es in der Regel Kollateralschäden in der Anwendung.
frei zitiert nach A. Van der Bellen
... also dann paaren wir mal eine komplexe Erkenntnis mit Klugheit in der Interpretation!