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

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.

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-Laufzeiten kommunizieren.

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.1- oder höher-Laufzeit verwendet wird, sollte die D3dDrawPrimitives2--Funktion niemals das Rendern aus dem aktuellen Vertexpuffer verursachen (über lpDDVertexübergeben), wenn der Puffer implizit ist. Wenn der Puffer explizit ist und eine ausstehende Sperre vorhanden ist, sollte der Treiber am Ende der D3dDrawPrimitives2- funktion stehen, wenn er den Puffer nicht umbenennt (legt nicht D3DHALDP2_SWAPVERTEXBUFFER fest). Wenn der Treiber den Puffer umbenennt, steht der Treiber nicht an. DirectX 8.1 und höhere Laufzeiten rufen die D3dDrawPrimitives2-Funktion auf, um aus einem gesperrten expliziten Vertexpuffer nur dann gerendert zu werden, wenn dies erforderlich ist, sodass die Leistung selten beeinträchtigt wird. Ein impliziter Vertexpuffer wird durch den CreateD3DBuffer Rückruf des Treibers erstellt, wobei nur das DDSCAPS_EXECUTEBUFFER Flag festgelegt ist. Ein expliziter Vertexpuffer wird vom CreateD3DBuffer Rückruf des Treibers erstellt, wobei die DDSCAPS_EXECUTEBUFFER und DDSCAPS2_VERTEXBUFFER Flags festgelegt sind. Der explizite Vertexpuffer wird durch den LockD3DBuffer Rückruf des Treibers gesperrt.

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

    D3DHAL_DP2INDEXEDLINELIST

    D3DHAL_DP2INDEXEDLINESTRIP

    D3DHAL_DP2INDEXEDTRIANGLEFAN

    D3DHAL_DP2INDEXEDTRIANGLELIST

    D3DHAL_DP2INDEXEDTRIANGLESTRIP

    D3DHAL_DP2LINELIST

    D3DHAL_DP2LINESTRIP

    D3DHAL_DP2POINTS

    D3DHAL_DP2TRIANGLEFAN

    D3DHAL_DP2TRIANGLELIST

    D3DHAL_DP2TRIANGLESTRIP

    FVF-