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 driver per eseguire il rendering di una o più primitive.

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:

  • Assicurarsi 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 del vertice. Questa operazione deve essere eseguita solo se nel buffer del vertice sono presenti dati; ovvero quando viene ricevuto un token di comando D3DDP2OP_Xxx (tranne quando il token è D3DDP2OP_LINELIST_IMM o D3DDP2OP_TRIANGLEFAN_IMM). Questi due opcode indicano che i dati del vertice vengono passati immediatamente nel flusso di comandi, anziché in un buffer dei vertici. Quindi, presupponendo che nel buffer del vertice siano presenti dati, se il buffer del vertice è in 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 lpDVertex . 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 riuscire la chiamata se esiste una delle condizioni seguenti:
    • Le coordinate del vertice non sono specificate; ovvero, se D3DFVF_XYZRHW non è impostato.
    • Le normali sono specificate; ovvero, se D3DFVF_NORMAL è impostato.
    • Vengono impostati uno qualsiasi dei bit di D3DFVF_RESERVED 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 di stato di rendering. Quando viene impostato il flag D3DHALDP2_EXECUTEBUFFER, il driver deve anche riflettere 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 di D3DHAL_DP2VIEWPORTINFO che segue 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 di D3DHAL_DP2WINFO che segue nel buffer dei comandi, aggiornando le informazioni sul buffer w 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 vengono archiviati i buffer del comando e dei vertici. 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 driver tramite DirectX 8.0 e Runtime DirectX 8.1.

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

 
Se il driver viene usato con un runtime DirectX 8.1 o versione successiva, la funzione D3dDrawPrimitives2 del driver non deve mai causare il rendering dal buffer del vertice corrente (passato tramite lpDDVertex) per bloccare se il buffer è implicito. Se il buffer è esplicito e c'è un blocco in sospeso su di esso, il driver deve essere bloccato alla fine della funzione D3dDrawPrimitives2 se non rinomina il buffer (non imposta D3DHALDP2_SWAPVERTEXBUFFER). Se il driver rinomina il buffer, il driver non si blocca. DirectX 8.1 e versioni successive chiamano la funzione D3dDrawPrimitives2 del driver per eseguire il rendering da un buffer del vertice esplicito bloccato solo quando necessario, in modo che le prestazioni siano raramente interessate. Un buffer del vertice implicito viene creato dal callback CreateD3DBuffer del driver con solo il flag di DDSCAPS_EXECUTEBUFFER impostato. Un buffer del vertice esplicito viene creato dal callback CreateD3DBuffer del driver con i flag di DDSCAPS_EXECUTEBUFFER e DDSCAPS2_VERTEXBUFFER impostata. Il buffer del vertice esplicito diventa bloccato dal callback LockD3DBuffer del driver.

Se il driver viene usato con un runtime DirectX 8.0, il driver deve talvolta bloccarsi durante il rendering da un buffer del vertice corrente implicito per impedire 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 del vertice corrente esplicito bloccato più spesso necessario in modo che le prestazioni vengano ridotte. Di seguito sono riportate le soluzioni alternative per un driver usato con un runtime DirectX 8.0:

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

    L'esempio seguente mostra quando D3dDrawPrimitives2 deve essere bloccato in un buffer del vertice implicito:

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

    L'esempio seguente mostra quando D3dDrawPrimitives2 non deve essere bloccato in un buffer del vertice 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 di D3DHALDP2_REQCOMMANDBUFSIZE, il driver non deve essere bloccato. Per coincidenza, il runtime DirectX 8.0 imposta anche D3DHALDP2_REQCOMMANDBUFSIZE quando esegue il rendering più comune da un buffer del vertice corrente esplicito bloccato. Il driver può quindi migliorare le prestazioni non bloccando quando rileva D3DHALDP2_REQCOMMANDBUFSIZE durante il rendering da un buffer del vertice corrente esplicito bloccato.

    L'esempio seguente mostra quando D3dDrawPrimitives2 deve essere bloccato su un buffer del vertice corrente esplicito:

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

    L'esempio seguente mostra quando D3dDrawPrimitives2 non deve essere bloccato su un buffer del vertice 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

    Requisito Valore
    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