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