Condividi tramite


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 che contiene 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:

Osservazioni

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 ddrval membro 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 dwCommandOffset membro di D3DHAL_DRAWPRIMITIVES2DATA al buffer dei comandi a cui il lpDDCommands membro di D3DHAL_DRAWPRIMITIVES2DATA punti.
  • Determinare la posizione del primo vertice nel vertex buffer. Questa operazione deve essere eseguita solo se sono presenti dati nel vertex buffer; 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 comandi, anziché in un vertex buffer. Supponendo quindi che siano presenti dati nel vertex buffer, se il vertex buffer è in memoria utente, il primo vertice è dwVertexOffset byte nel buffer a cui lpVertices punta. In caso contrario, il driver deve applicare dwVertexOffset alla memoria associata alla struttura di DD_SURFACE_LOCAL a cui lpDDVertex punti. dwVertexOffset, lpVerticese 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 dei vertici non vengono specificate; ovvero, se D3DFVF_XYZRHW non è impostato.
    • Le normali sono specificate; ovvero, se D3DFVF_NORMAL è impostato.
    • Vengono impostati uno dei bit di D3DFVF_RESERVED 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 D3DHAL_DP2RENDERSTATEwStateCount 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 lpdwRStates punti. 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 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 D3DHAL_DP2WINFO che segue 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 comandodi rendering primitivo D3DDP2OP_ Xxx nel buffer dei comandi.
    • Se il comando è sconosciuto, chiamare D3dParseUnknownCommand del runtime callback. Il runtime fornisce questo callback al callback del driver DdGetDriverInfo callback con il GUID GUID_D3DParseUnknownCommandCallback.
Il driver non deve eseguire il probe della leggibilità della memoria in cui sono archiviati il comando e i vertex buffer. Tuttavia, il driver deve rimanere entro i limiti specificati dal dwCommandLength e dwVertexLength membri di D3DHAL_DRAWPRIMITIVES2DATA.

Se il driver deve avere esito negativo D3dDrawPrimitives2, deve compilare il dwErrorOffset membro 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 Di 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 di vertici corrente, ovvero i dati dei vertici non vengono più passati tramite il lpDDVertex membro di D3DHAL_DRAWPRIMITIVES2DATA). Pertanto, con queste applicazioni, la funzione D3dDrawPrimitives2 del driver non dovrebbe mai causare l'arresto del rendering da un buffer dei vertici 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, il driver funzione D3dDrawPrimitives2 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 essere bloccato alla fine del relativo D3dDrawPrimitives2 funzione 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 dei vertici esplicito bloccato solo quando necessario, in modo che le prestazioni vengano raramente influenzate. Un buffer dei vertici implicito viene creato dal CreateD3DBuffer del driver callback con solo il flag DDSCAPS_EXECUTEBUFFER impostato. Un buffer dei vertici esplicito viene creato dal CreateD3DBuffer del driver callback con i flag DDSCAPS_EXECUTEBUFFER e DDSCAPS2_VERTEXBUFFER impostati. Il buffer dei vertici esplicito viene bloccato dalla lockD3DBuffer del driver callback.

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 di DirectX 8.0 chiama la funzione D3dDrawPrimitives 2 del driver per eseguire il rendering da un buffer di vertici corrente esplicito bloccato più spesso necessario in modo che le prestazioni vengano ridotte. Di seguito sono riportate le soluzioni alternative di blocco per un driver usato con un runtime DirectX 8.0:

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

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

    Fabbisogno

    Requisito Valore
    piattaforma di destinazione Desktop
    intestazione d3dhal.h (include D3dhal.h)

    Vedere anche

    D3DHAL_DP2INDEXEDLINELIST

    D3DHAL_DP2INDEXEDLINESTRIP

    D3DHAL_DP2INDEXEDTRIANGLEFAN

    D3DHAL_DP2INDEXEDTRIANGLELIST

    D3DHAL_DP2INDEXEDTRIANGLESTRIP

    D3DHAL_DP2LINELIST

    D3DHAL_DP2LINESTRIP

    D3DHAL_DP2POINTS

    D3DHAL_DP2TRIANGLEFAN

    D3DHAL_DP2TRIANGLELIST

    D3DHAL_DP2TRIANGLESTRIP

    FVF