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 der Treiber zum Rendern eines oder mehrerer Grundtypen benötigt.
Rückgabewert
D3dDrawPrimitives2 gibt einen der folgenden Rückrufcodes zurück:
Hinweise
D3dDrawPrimitives2 muss in Microsoft Direct3D-Treibern implementiert werden.
Der Treiber muss die folgenden Schritte ausführen:
- Stellen Sie sicher, dass das vom dwhContext-Member der D3DHAL_DRAWPRIMITIVES2DATA-Struktur bei pdp angegebene Kontexthandle gültig ist.
- Überprüfen Sie, ob ein Umdrehen auf die dem Kontext zugeordnete Zeichnungsoberfläche nicht ausgeführt wird. Wenn die Zeichnungsoberfläche an einem Flip beteiligt ist, sollte der Treiber den ddrval-Member von D3DHAL_DRAWPRIMITIVES2DATA auf DDERR_WASSTILLDRAWING festlegen und DDHAL_DRIVER_HANDLED zurückgeben.
- Bestimmen Sie den Speicherort der ersten D3DHAL_DP2COMMAND-Struktur , indem Sie die Anzahl der Bytes im dwCommandOffset-Element von D3DHAL_DRAWPRIMITIVES2DATA dem Befehlspuffer hinzufügen, auf den das lpDDCommands-Element von D3DHAL_DRAWPRIMITIVES2DATA verweist.
- Bestimmen Sie die Position des ersten Scheitelpunkts im Vertexpuffer. Dies sollte nur erfolgen, wenn im Vertexpuffer Daten vorhanden sind. Das heißt, wenn ein D3DDP2OP_Xxx-Befehlstoken empfangen wird (außer wenn das Token D3DDP2OP_LINELIST_IMM oder D3DDP2OP_TRIANGLEFAN_IMM ist). Diese beiden Opcodes geben an, dass die Vertexdaten sofort im Befehlsdatenstrom und nicht in einem Vertexpuffer übergeben werden. Angenommen, der Vertexpuffer enthält Daten. Wenn sich der Vertexpuffer im Benutzerspeicher befindet, ist der erste Scheitelpunkt dwVertexOffset bytes in den Puffer, auf den lpVertices zeigt. Andernfalls sollte der Treiber dwVertexOffset auf den Arbeitsspeicher anwenden, der der DD_SURFACE_LOCAL Struktur zugeordnet ist, auf die lpDDVertex verweist. dwVertexOffset, lpVertices und lpDDVertex sind Member von D3DHAL_DRAWPRIMITIVES2DATA.
- Überprüfen Sie den dwVertexType-Member von D3DHAL_DRAWPRIMITIVES2DATA, um sicherzustellen, dass der Treiber die angeforderte 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 sind festgelegt.
- Verarbeiten Sie alle Befehle im Befehlspuffer sequenziell. Für jede D3DHAL_DP2COMMAND-Struktur sollte der Treiber die folgenden Schritte ausführen:
- Wenn der Befehl D3DDP2OP_RENDERSTATE ist, verarbeiten Sie die folgenden wStateCount-D3DHAL_DP2RENDERSTATE-Strukturen im Befehlspuffer, 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 das lpdwRStates zeigt. wStateCount und lpdwRStates sind Mitglieder 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 zugeordnet ist, für jede Texturzustandsstruktur.
- Wenn der Befehl D3DDP2OP_VIEWPORTINFO ist, verarbeiten Sie die D3DHAL_DP2VIEWPORTINFO-Struktur , die im Befehlspuffer folgt, und aktualisieren Sie die viewport-Informationen, die im internen Renderingkontext des Treibers gespeichert sind.
- Wenn der Befehl D3DDP2OP_WINFO ist, verarbeiten Sie die D3DHAL_DP2WINFO-Struktur , die im Befehlspuffer folgt, und aktualisieren Sie die im internen Renderingkontext des Treibers gespeicherten W-Pufferungsinformationen.
- Verarbeiten Sie andernfalls die D3DHAL_DP2Xxx-Primitive-Strukturen , die dem Befehl D3DDP2OP_Xxx primitives Rendering im Befehlspuffer folgen.
- Wenn der Befehl unbekannt ist, rufen Sie den D3dParseUnknownCommand-Rückruf der Laufzeit auf. Die Runtime stellt diesen Rückruf für den DdGetDriverInfo-Rückruf des Treibers mit der GUID_D3DParseUnknownCommandCallback GUID bereit.
Wenn der Treiber D3dDrawPrimitives2 fehlschlagen muss, sollte er den dwErrorOffset-Member von D3DHAL_DRAWPRIMITIVES2DATA mit dem Offset in den Befehlspuffer fü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öheren Schnittstellen geschrieben wurden, da solche Anwendungen das Konzept eines aktuellen Vertexpuffers nicht mehr verwenden (d. h. Vertexdaten werden nicht mehr über den lpDVertex-Member von D3DHAL_DRAWPRIMITIVES2DATA übergeben). Daher sollte die D3dDrawPrimitives2-Funktion des Treibers bei diesen Anwendungen niemals dazu führen, dass das Rendering aus einem Vertexpuffer angehalten wird, selbst wenn der Puffer implizit oder explizit ist und eine ausstehende Sperre vorhanden ist.
Wenn der Treiber mit einer DirectX 8.0-Runtime verwendet wird, sollte der Treiber manchmal beim Rendern aus einem impliziten aktuellen Vertexpuffer angehalten werden, um Synchronisierungsprobleme und daraus resultierende Beschädigungen zu vermeiden. Darüber hinaus ruft die DirectX 8.0-Runtime die D3dDrawPrimitives2-Funktion des Treibers auf, um aus einem gesperrten expliziten aktuellen Vertexpuffer häufiger als wirklich erforderlich zu rendern, damit die Leistung beeinträchtigt wird. Im Folgenden werden Problemumgehungen für einen Treiber, der mit einer DirectX 8.0-Runtime verwendet wird, angehalten:
-
Der Treiber sollte beim Übergang zwischen dem Rendern von Benutzer-Arbeitsspeicher-Grundtypen (identifiziert durch D3DHALDP2_USERMEMVERTICES) und dem Rendern aus einem impliziten aktuellen Vertexpuffer nur dann angehalten werden, wenn er den Puffer nicht umbenennt (nicht D3DHALDP2_SWAPVERTEXBUFFER).
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 für einen impliziten aktuellen Vertexpuffer nicht angehalten werden sollte:
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 Runtime das D3DHALDP2_REQCOMMANDBUFSIZE-Flag festlegt, muss der Treiber nicht angehalten werden. Zufällig legt die DirectX 8.0-Runtime auch D3DHALDP2_REQCOMMANDBUFSIZE fest, wenn sie am häufigsten aus einem gesperrten expliziten aktuellen Vertexpuffer gerendert wird. Der Treiber kann daher die Leistung verbessern, indem er nicht angehalten wird, wenn er D3DHALDP2_REQCOMMANDBUFSIZE beim Rendern aus einem gesperrten expliziten aktuellen Vertexpuffer erkennt.
Das folgende Beispiel zeigt, wann D3dDrawPrimitives2 in einem expliziten aktuellen Vertexpuffer angehalten werden soll:
DrawPrimitives2(Explicit VB, 0); // Stall when locked (happens rarely)
Das folgende Beispiel zeigt, wenn D3dDrawPrimitives2 nicht auf einem expliziten aktuellen Vertexpuffer stehen bleibt:
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 Kopfzeile d3dhal.h (include D3dhal.h) Weitere Informationen