Ich hasse
D3D11_BLEND_DESC. Diese Struktur ist doch mal sowas von missraten:
Code: Alles auswählen
typedef struct D3D11_BLEND_DESC
{
BOOL AlphaToCoverageEnable;
BOOL IndependentBlendEnable;
D3D11_RENDER_TARGET_BLEND_DESC RenderTarget[ 8 ];
} D3D11_BLEND_DESC;
D3D11_RENDER_TARGET_BLEND_DESC ist 29 Bytes groß; mit Padding 32. Eigentlich super – schön rund.
Nun haben sie aber zwei
BOOL an den
Anfang der Struktur gepackt. Das bedeutet, dass die acht
D3D11_RENDER_TARGET_BLEND_DESCs bei acht Bytes Offset beginnen.
So. Nun erwartet
ID3D11Device::CreateBlendState() also nicht nur, dass man einen Parameter der astronomischen Größe von 264 Bytes zusammenpfriemelt, sondern 9/10 dieses Parameters sind auch logisch zusammenhängende Datenbrocken, aber innerhalb der Struktur an schwachen acht Bytes unausgerichtet. Will man nun also schlau sein und den Parameter zusammenkomponieren indem man einzelne
D3D11_RENDER_TARGET_BLEND_DESCs vordefiniert (z.B. für Alpha-Blending, für additives Blending etc), ist der Compiler gezwungen, die ganzen 264 Bytes in acht-Byte-Häppchen zusammenzukopieren (per Quad-Word-
mov) anstatt 16-Byte-Vektoranweisungen zu nutzen.
Wenn die Deppen die
BOOL-Parameter ans Ende gepackt hätten, oder acht Bytes Padding eingefügt hätten, könnte man sich die ganzen
mov-Ketten sparen.
Und wenn man die API
richtig entworfen hätte, hätte man jede Render-Target-Blend-Desc als einzelnen Zeiger übergeben statt in eine
struct gequetscht – wer sich dieses Monstrum an Blend-Einstellungen dann noch selber bauen will statt auf eine Kollektion vordefinierter
D3D11_RENDER_TARGET_BLEND_DESCs zuzugreifen, könnte das ja immernoch tun. Der Rest würde Nerven sparen.
Und wenn man die API
perfekt entworfen hätte, wären solche vordefinierten Kollektionen im D3D-Header zu finden und
nullptr würde den Default-State setzen, denn, seien wir ehrlich: Blending für alle acht Render-Targets einstellen zu
müssen obwohl die meisten Anwendungen nicht mehr als zwei nutzen ist pure Idiotie.
Also nochmal zusammengefasst:
- Acht Render-Target-Blendings einstellen zu müssen, obwohl man meistens nur ein oder zwei benutzt, ist dumm
- Die alle in einer Datenstruktur zusammenzufassen, damit man monströs Daten kopieren muss statt einzelne States zusammenzukomponieren, ist dumm
- Die Datenstruktur dann auch noch zu ruinieren indem man zwei BOOLs an den Anfang packt ist derp
- Dass das nicht nur in Direct3D 11, sondern auch schon seit 10.1 so ist, sagt mal wieder vieles