Freigeben über


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.
Der Treiber muss nicht auf Lesbarkeit des Arbeitsspeichers überprüfen, in dem der Befehl und die Vertexpuffer gespeichert sind. Der Treiber muss jedoch innerhalb der Grenzen bleiben, die von den Elementen dwCommandLength und dwVertexLength von D3DHAL_DRAWPRIMITIVES2DATA angegeben werden.

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.

Hinweis Die folgenden Kommentare gelten nur für Anwendungen, die mit Microsoft DirectX 7.0-Schnittstellen geschrieben wurden und mit Treibern über DirectX 8.0- und DirectX 8.1-Runtimes kommunizieren.

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 Runtime von DirectX 8.1 oder höher verwendet wird, sollte die D3dDrawPrimitives2-Funktion des Treibers niemals dazu führen, dass das Rendering aus dem aktuellen Vertexpuffer (übergeben über lpDDVertex) angehalten wird, wenn der Puffer implizit ist. Wenn der Puffer explizit ist und eine ausstehende Sperre vorhanden ist, sollte der Treiber am Ende seiner D3dDrawPrimitives2-Funktion ins Stocken geraten, wenn er den Puffer nicht umbenannt (D3DHALDP2_SWAPVERTEXBUFFER nicht festgelegt). Wenn der Treiber den Puffer umbenannt, wird der Treiber nicht angehalten. DirectX 8.1 und höhere Laufzeiten rufen die D3dDrawPrimitives2-Funktion des Treibers auf, um nur bei Bedarf aus einem gesperrten expliziten Vertexpuffer zu rendern, sodass die Leistung selten beeinträchtigt wird. Ein impliziter Vertexpuffer wird vom CreateD3DBuffer-Rückruf des Treibers erstellt, wobei nur das flag DDSCAPS_EXECUTEBUFFER festgelegt ist. Ein expliziter Vertexpuffer wird durch den CreateD3DBuffer-Rückruf des Treibers erstellt, wobei die flags DDSCAPS_EXECUTEBUFFER und DDSCAPS2_VERTEXBUFFER festgelegt sind. Der explizite Vertexpuffer wird durch den LockD3DBuffer-Rückruf des Treibers gesperrt.

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

    D3DHAL_DP2INDEXEDLINELIST

    D3DHAL_DP2INDEXEDLINESTRIP

    D3DHAL_DP2INDEXEDTRIANGLEFAN

    D3DHAL_DP2INDEXEDTRIANGLELIST

    D3DHAL_DP2INDEXEDTRIANGLESTRIP

    D3DHAL_DP2LINELIST

    D3DHAL_DP2LINESTRIP

    D3DHAL_DP2POINTS

    D3DHAL_DP2TRIANGLEFAN

    D3DHAL_DP2TRIANGLELIST

    D3DHAL_DP2TRIANGLESTRIP

    FVF