LPD3DHAL_DRAWPRIMITIVES2CB Rückruffunktion (d3dhal.h)
Die D3dDrawPrimitives2 Funktion rendert Grundtypen und gibt den aktualisierten Renderzustand zurück.
Syntax
LPD3DHAL_DRAWPRIMITIVES2CB Lpd3dhalDrawprimitives2cb;
DWORD Lpd3dhalDrawprimitives2cb(
LPD3DHAL_DRAWPRIMITIVES2DATA unnamedParam1
)
{...}
Parameter
unnamedParam1
pdp [in]
Verweist auf eine D3DHAL_DRAWPRIMITIVES2DATA Struktur, die die informationen enthält, die erforderlich sind, um einen oder mehrere Grundtypen zu rendern.
Rückgabewert
D3dDrawPrimitives2 gibt einen der folgenden Rückrufcodes zurück:
Bemerkungen
D3dDrawPrimitives2- müssen in Microsoft Direct3D-Treibern implementiert werden.
Der Treiber muss folgendes ausführen:
- Stellen Sie sicher, dass das vom dwhContext Element der D3DHAL_DRAWPRIMITIVES2DATA Struktur bei pdp- angegebene Kontexthandle gültig ist.
- Überprüfen Sie, ob ein Flip auf die dem Kontext zugeordnete Zeichnungsoberfläche nicht ausgeführt wird. Wenn die Zeichnungsoberfläche an einem Flip beteiligt ist, sollte der Treiber das ddrval Mitglied der D3DHAL_DRAWPRIMITIVES2DATA auf DDERR_WASSTILLDRAWING festlegen und DDHAL_DRIVER_HANDLED zurückgeben.
- Bestimmen Sie die Position der ersten D3DHAL_DP2COMMAND Struktur, indem Sie die Anzahl der Bytes im dwCommandOffset Member von D3DHAL_DRAWPRIMITIVES2DATA dem Befehlspuffer hinzufügen, dem das lpDDCommands Member von D3DHAL_DRAWPRIMITIVES2DATA Punkten hinzugefügt wird.
- Bestimmen Sie die Position des ersten Scheitelpunkts im Vertexpuffer. Dies sollte nur erfolgen, wenn daten im Vertexpuffer vorhanden sind. d. h., wenn ein D3DDP2OP_Xxx--Befehlstoken empfangen wird (außer wenn das Token D3DDP2OP_LINELIST_IMM oder D3DDP2OP_TRIANGLEFAN_IMM ist). Diese beiden Opcodes deuten darauf hin, dass die Vertexdaten sofort im Befehlsdatenstrom übergeben werden, anstatt in einem Vertexpuffer. Vorausgesetzt, der Vertexpuffer enthält Daten, wenn sich der Vertexpuffer im Benutzerspeicher befindet, wird der erste Scheitelpunkt dwVertexOffset Bytes in den Puffer gesetzt , auf den lpVertices verweist. Andernfalls sollte der Treiber dwVertexOffset- auf den Speicher anwenden, der der DD_SURFACE_LOCAL Struktur zugeordnet ist, auf die lpDDVertex Punkte angewendet wird. dwVertexOffset-, lpVertices-und lpDDVertex- sind Mitglieder von D3DHAL_DRAWPRIMITIVES2DATA.
- Überprüfen Sie das dwVertexType- Mitglied von D3DHAL_DRAWPRIMITIVES2DATA, um sicherzustellen, dass der Treiber den angeforderten FVF-unterstützt. Der Treiber sollte den Aufruf nicht ausführen, wenn eine der folgenden Bedingungen vorhanden ist:
- Vertexkoordinaten werden nicht angegeben; das heißt, wenn D3DFVF_XYZRHW nicht festgelegt ist.
- Normalwerte werden angegeben; das heißt, wenn D3DFVF_NORMAL festgelegt ist.
- Alle reservierten D3DFVF_RESERVED x Bits werden festgelegt.
- Verarbeiten Sie alle Befehle im Befehlspuffer sequenziell. Für jede D3DHAL_DP2COMMAND Struktur sollte der Treiber folgendes ausführen:
- Wenn der Befehl D3DDP2OP_RENDERSTATE ist, verarbeiten Sie die wStateCount-D3DHAL_DP2RENDERSTATE Strukturen, die im Befehlspuffer folgen, und aktualisieren Sie den Treiberstatus für jede Renderzustandsstruktur. Wenn das D3DHALDP2_EXECUTEBUFFER Flag festgelegt ist, sollte der Treiber auch die Zustandsänderung im Array widerspiegeln, auf die lpdwRStates verweist. wStateCount und lpdwRStates sind Member von D3DHAL_DRAWPRIMITIVES2DATA.
- Wenn der Befehl D3DDP2OP_TEXTURESTAGESTATE ist, verarbeiten Sie die wStateCount-D3DHAL_DP2TEXTURESTAGESTATE Strukturen, die im Befehlspuffer folgen, und aktualisieren Sie den Texturzustand des Treibers, der der angegebenen Texturstufe für jede Texturzustandsstruktur zugeordnet ist.
- Wenn der Befehl D3DDP2OP_VIEWPORTINFO ist, verarbeiten Sie die im Befehlspuffer folgende D3DHAL_DP2VIEWPORTINFO Struktur, und aktualisieren Sie die viewport-Informationen, die im internen Renderingkontext des Treibers gespeichert sind.
- Wenn der Befehl D3DDP2OP_WINFO ist, verarbeiten Sie die im Befehlspuffer folgende D3DHAL_DP2WINFO Struktur, und aktualisieren Sie die im internen Renderingkontext des Treibers gespeicherten W-Pufferinformationen.
- Verarbeiten Sie andernfalls die D3DHAL_DP2Xxx- primitiven Strukturen, die dem D3DDP2OP_Xxx- primitiven Renderingbefehl im Befehlspuffer folgen.
- Wenn der Befehl unbekannt ist, rufen Sie die D3dParseUnknownCommand Rückruf der Laufzeit auf. Die Laufzeit stellt diesen Rückruf an die DdGetDriverInfo Rückruf des Treibers mit der GUID_D3DParseUnknownCommandCallback GUID bereit.
Wenn der Treiber D3dDrawPrimitives2fehlschlagen muss, sollte er das dwErrorOffset Member von D3DHAL_DRAWPRIMITIVES2DATA mit dem Offset in den Befehlspuffer ausfüllen, in dem die erste nicht behandelte D3DHAL_DP2COMMAND gefunden werden kann.
Die folgenden Kommentare gelten nicht für Anwendungen, die mit DirectX 8.0 und höher geschrieben wurden, da solche Anwendungen das Konzept eines aktuellen Vertexpuffers nicht mehr verwenden (d. h. Vertexdaten werden nicht mehr über das lpDDVertex Member von D3DHAL_DRAWPRIMITIVES2DATA übergeben). Daher sollte mit diesen Anwendungen die D3dDrawPrimitives2--Funktion niemals dazu führen, dass das Rendern von einem Vertexpuffer angehalten wird, auch wenn der Puffer implizit oder explizit ist und eine herausragende Sperre vorhanden ist.
Wenn der Treiber mit einer DirectX 8.0-Laufzeit verwendet wird, sollte der Treiber manchmal beim Rendern aus einem impliziten aktuellen Vertexpuffer angehalten werden, um Synchronisierungsprobleme und daraus resultierende Beschädigungen zu verhindern. Darüber hinaus ruft die DirectX 8.0-Laufzeit die D3dDrawPrimitives2-Funktion des Treibers auf, um aus einem gesperrten expliziten Vertexpuffer zu rendern, desto häufiger ist die Leistung beeinträchtigt. Im Folgenden sind Problemumgehungen für einen Treiber aufgeführt, der mit einer DirectX 8.0-Laufzeit verwendet wird:
-
Der Treiber sollte angehalten werden, wenn er zwischen dem Rendern von Benutzerspeichergrundtypen (identifiziert durch D3DHALDP2_USERMEMVERTICES) und dem Rendern aus einem impliziten aktuellen Vertexpuffer wechselt, wenn der Puffer nicht umbenannt wird (wird nicht D3DHALDP2_SWAPVERTEXBUFFER festgelegt).
Das folgende Beispiel zeigt, wann D3dDrawPrimitives2- in einem impliziten aktuellen Vertexpuffer angehalten werden soll:
DrawPrimitives2(p*, D3DHALDP2_USERMEMVERTICES); // Do not stall DrawPrimitives2(Implicit VB, 0); // Stall
Das folgende Beispiel zeigt, wann D3dDrawPrimitives2- nicht auf einem impliziten aktuellen Vertexpuffer stehen soll:
DrawPrimitives2(p*, D3DHALDP2_USERMEMVERTICES); // Do not stall DrawPrimitives2(Explicit VB, 0); // Do not stall if not locked DrawPrimitives2(Explicit VB, D3DHALDP2_SWAPVERTEXBUFFER); // Do not stall whether locked DrawPrimitives2(Implicit VB, 0); // Do not stall whether locked DrawPrimitives2(Implicit VB, 0); // Do not stall whether locked DrawPrimitives2(p*, D3DHALDP2_USERMEMVERTICES); // Do not stall DrawPrimitives2(Implicit VB, D3DHALDP2_SWAPVERTEXBUFFER); // Do not stall because D3DHALDP2_SWAPVERTEXBUFFER is set
Wenn die Laufzeit die D3DHALDP2_REQCOMMANDBUFSIZE-Kennzeichnung festlegt, ist der Treiber nicht erforderlich, um angehalten zu werden. Zufällig legt die DirectX 8.0-Laufzeit auch D3DHALDP2_REQCOMMANDBUFSIZE fest, wenn sie am häufigsten aus einem gesperrten expliziten Vertexpuffer gerendert wird. Der Treiber kann daher die Leistung verbessern, indem er beim Rendern von einem gesperrten expliziten Vertexpuffer D3DHALDP2_REQCOMMANDBUFSIZE erkennt.
Das folgende Beispiel zeigt, wann D3dDrawPrimitives2- an einem expliziten aktuellen Vertexpuffer hängen soll:
DrawPrimitives2(Explicit VB, 0); // Stall when locked (happens rarely)
Das folgende Beispiel zeigt, wann D3dDrawPrimitives2- nicht für einen expliziten aktuellen Vertexpuffer stagniert:
DrawPrimitives2(Explicit VB, D3DHALDP2_REQCOMMANDBUFSIZE); // Do not stall whether locked DrawPrimitives2(Explicit VB, D3DHALDP2_SWAPVERTEXBUFFER); // Do not stall whether locked DrawPrimitives2(Explicit VB, D3DHALDP2_SWAPVERTEXBUFFER | D3DHALDP2_REQCOMMANDBUFSIZE); // Do not stall
Anforderungen
Anforderung Wert Zielplattform- Desktop Header- d3dhal.h (einschließlich D3dhal.h) Siehe auch