LPD3DHAL_DRAWPRIMITIVES2CB funzione di callback (d3dhal.h)

La funzione D3dDrawPrimitives2 esegue il rendering delle primitive e restituisce lo stato di rendering aggiornato.

Sintassi

LPD3DHAL_DRAWPRIMITIVES2CB Lpd3dhalDrawprimitives2cb;

DWORD Lpd3dhalDrawprimitives2cb(
  LPD3DHAL_DRAWPRIMITIVES2DATA unnamedParam1
)
{...}

Parametri

unnamedParam1

pdp [in]

Punta a una struttura D3DHAL_DRAWPRIMITIVES2DATA contenente le informazioni necessarie per il rendering di una o più primitive da parte del driver.

Valore restituito

D3dDrawPrimitives2 restituisce uno dei codici di callback seguenti:

Commenti

D3dDrawPrimitives2 deve essere implementato nei driver Microsoft Direct3D.

Il driver deve eseguire le operazioni seguenti:

  • Verificare che l'handle di contesto specificato dal membro dwhContext della struttura D3DHAL_DRAWPRIMITIVES2DATA in pdp sia valido.
  • Verificare che un capovolgimento alla superficie di disegno associata al contesto non sia in corso. Se la superficie di disegno è coinvolta in un capovolgimento, il driver deve impostare il membro ddrval di D3DHAL_DRAWPRIMITIVES2DATA su DDERR_WASSTILLDRAWING e restituire DDHAL_DRIVER_HANDLED.
  • Determinare la posizione della prima struttura D3DHAL_DP2COMMAND aggiungendo il numero di byte nel membro dwCommandOffset di D3DHAL_DRAWPRIMITIVES2DATA al buffer dei comandi a cui il membro lpDDCommands di D3DHAL_DRAWPRIMITIVES2DATA punti.
  • Determinare la posizione del primo vertice nel buffer dei vertici. Questa operazione deve essere eseguita solo se sono presenti dati nel buffer dei vertici; ovvero quando viene ricevuto un token di comando D3DDP2OP_Xxx (tranne quando il token è D3DDP2OP_LINELIST_IMM o D3DDP2OP_TRIANGLEFAN_IMM). Questi due codici opcode indicano che i dati dei vertici vengono passati immediatamente nel flusso di comando, anziché in un buffer dei vertici. Supponendo quindi che nel vertex buffer siano presenti dati, se il vertex buffer si trova nella memoria utente, il primo vertice è dwVertexOffset byte nel buffer a cui punta lpVertices . In caso contrario, il driver deve applicare dwVertexOffset alla memoria associata alla struttura DD_SURFACE_LOCAL a cui punta lpDDVertex . dwVertexOffset, lpVertices e lpDDVertex sono membri di D3DHAL_DRAWPRIMITIVES2DATA.
  • Controllare il membro dwVertexType di D3DHAL_DRAWPRIMITIVES2DATA per assicurarsi che il driver supporti il FVF richiesto. Il driver deve non eseguire la chiamata se si verifica una delle condizioni seguenti:
    • Le coordinate dei vertici non sono specificate; ovvero, se D3DFVF_XYZRHW non è impostato.
    • Le normali sono specificate; ovvero, se D3DFVF_NORMAL è impostato.
    • Vengono impostati uno dei D3DFVF_RESERVED bit x riservati.
  • Elaborare tutti i comandi nel buffer dei comandi in sequenza. Per ogni struttura D3DHAL_DP2COMMAND, il driver deve eseguire le operazioni seguenti:
    • Se il comando è D3DDP2OP_RENDERSTATE, elaborare le strutture wStateCount D3DHAL_DP2RENDERSTATE che seguono nel buffer dei comandi, aggiornando lo stato del driver per ogni struttura dello stato di rendering. Quando il flag D3DHALDP2_EXECUTEBUFFER è impostato, il driver deve riflettere anche la modifica dello stato nella matrice a cui punta lpdwRStates . wStateCount e lpdwRStates sono membri di D3DHAL_DRAWPRIMITIVES2DATA.
    • Se il comando è D3DDP2OP_TEXTURESTAGESTATE, elaborare le strutture wStateCount D3DHAL_DP2TEXTURESTAGESTATE che seguono nel buffer dei comandi, aggiornando lo stato della trama del driver associato alla fase di trama specificata per ogni struttura dello stato della trama.
    • Se il comando è D3DDP2OP_VIEWPORTINFO, elaborare la struttura D3DHAL_DP2VIEWPORTINFO seguente nel buffer dei comandi, aggiornando le informazioni sul riquadro di visualizzazione archiviate nel contesto di rendering interno del driver.
    • Se il comando è D3DDP2OP_WINFO, elaborare la struttura D3DHAL_DP2WINFO seguente nel buffer dei comandi, aggiornando le informazioni di w-buffering archiviate nel contesto di rendering interno del driver.
    • In caso contrario, elaborare le strutture primitive D3DHAL_DP2Xxx che seguono il comando di rendering primitivo D3DDP2OP_Xxx nel buffer dei comandi.
    • Se il comando è sconosciuto, chiamare il callback D3dParseUnknownCommand del runtime. Il runtime fornisce questo callback al callback DdGetDriverInfo del driver con il GUID GUID_D3DParseUnknownCommandCallback.
Il driver non deve eseguire il probe per la leggibilità della memoria in cui sono archiviati i buffer dei vertici e dei comandi. Tuttavia, il driver deve rimanere entro i limiti specificati dai membri dwCommandLength e dwVertexLength di D3DHAL_DRAWPRIMITIVES2DATA.

Se il driver deve avere esito negativo D3dDrawPrimitives2, deve compilare il membro dwErrorOffset di D3DHAL_DRAWPRIMITIVES2DATA con l'offset nel buffer dei comandi in cui è possibile trovare il primo D3DHAL_DP2COMMAND non gestito.

Nota I commenti seguenti sono validi solo per le applicazioni scritte usando interfacce Microsoft DirectX 7.0 e che comunicano con i driver tramite i runtime DirectX 8.0 e DirectX 8.1.

I commenti seguenti non sono validi per le applicazioni scritte tramite interfacce DirectX 8.0 e successive perché tali applicazioni non usano più il concetto di buffer dei vertici corrente, ovvero i dati dei vertici non vengono più passati tramite il membro lpDDVertex di D3DHAL_DRAWPRIMITIVES2DATA. Pertanto, con queste applicazioni, la funzione D3dDrawPrimitives2 del driver non dovrebbe mai causare la blocco del rendering da un buffer dei vertici anche se il buffer è implicito o esplicito e vi è un blocco in sospeso.

 
Se il driver viene usato con un runtime DirectX 8.1 o versione successiva, la funzione D3dDrawPrimitives2 del driver non dovrebbe mai causare il rendering dal buffer dei vertici corrente (passato tramite lpDDVertex) per bloccarsi se il buffer è implicito. Se il buffer è esplicito e vi è un blocco in sospeso, il driver deve bloccarsi alla fine della relativa funzione D3dDrawPrimitives2 se non rinomina il buffer (non imposta D3DHALDP2_SWAPVERTEXBUFFER). Se il driver rinomina il buffer, il driver non si blocca. I runtime DirectX 8.1 e versioni successive chiamano la funzione D3dDrawPrimitives2 del driver per eseguire il rendering da un buffer vertice esplicito bloccato solo quando necessario, in modo che le prestazioni vengano raramente influenzate. Un buffer di vertici implicito viene creato dal callback CreateD3DBuffer del driver con solo il flag DDSCAPS_EXECUTEBUFFER impostato. Un buffer dei vertici esplicito viene creato dal callback CreateD3DBuffer del driver con i flag DDSCAPS_EXECUTEBUFFER e DDSCAPS2_VERTEXBUFFER impostati. Il buffer dei vertici esplicito viene bloccato dal callback LockD3DBuffer del driver.

Se il driver viene usato con un runtime DirectX 8.0, a volte il driver deve bloccarsi durante il rendering da un buffer di vertici corrente implicito per evitare problemi di sincronizzazione e danneggiamento risultante. Inoltre, il runtime DirectX 8.0 chiama la funzione D3dDrawPrimitives2 del driver per eseguire il rendering da un buffer dei vertici corrente esplicito bloccato più spesso è davvero necessario in modo che le prestazioni vengano ridotte. Di seguito sono riportate le soluzioni alternative in stallo per un driver usato con un runtime DirectX 8.0:

  • Il driver deve bloccarsi quando passa tra primitive di memoria utente di rendering (identificate da D3DHALDP2_USERMEMVERTICES) e il rendering da un buffer di vertici corrente implicito solo se non rinomina il buffer (non imposta D3DHALDP2_SWAPVERTEXBUFFER).

    L'esempio seguente mostra quando D3dDrawPrimitives2 deve bloccarsi su un buffer di vertici corrente implicito:

    DrawPrimitives2(p*, D3DHALDP2_USERMEMVERTICES); // Do not stall
    DrawPrimitives2(Implicit VB, 0); // Stall 
    

    L'esempio seguente mostra quando D3dDrawPrimitives2 non deve bloccarsi in un buffer di vertici corrente implicito:

    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
    

    Se il runtime imposta il flag D3DHALDP2_REQCOMMANDBUFSIZE, il driver non deve bloccarsi. Per coincidenza, il runtime di DirectX 8.0 imposta anche D3DHALDP2_REQCOMMANDBUFSIZE quando esegue il rendering più comune da un buffer di vertici corrente esplicito bloccato. Il driver può quindi migliorare le prestazioni non bloccando quando rileva D3DHALDP2_REQCOMMANDBUFSIZE durante il rendering da un buffer dei vertici corrente esplicito bloccato.

    L'esempio seguente mostra quando D3dDrawPrimitives2 deve bloccarsi in un buffer dei vertici corrente esplicito:

    DrawPrimitives2(Explicit VB, 0); // Stall when locked (happens rarely)
    

    L'esempio seguente mostra quando D3dDrawPrimitives2 non deve bloccarsi in un buffer di vertici corrente esplicito:

    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
    

    Requisiti

       
    Piattaforma di destinazione Desktop
    Intestazione d3dhal.h (include D3dhal.h)

    Vedi anche

    D3DHAL_DP2INDEXEDLINELIST

    D3DHAL_DP2INDEXEDLINESTRIP

    D3DHAL_DP2INDEXEDTRIANGLEFAN

    D3DHAL_DP2INDEXEDTRIANGLELIST

    D3DHAL_DP2INDEXEDTRIANGLESTRIP

    D3DHAL_DP2LINELIST

    D3DHAL_DP2LINESTRIP

    D3DHAL_DP2POINTS

    D3DHAL_DP2TRIANGLEFAN

    D3DHAL_DP2TRIANGLELIST

    D3DHAL_DP2TRIANGLESTRIP

    FVF