PFND3DDDI_RENDERCB funzione di callback (d3dumddi.h)
La funzione pfnRenderCb invia il buffer dei comandi corrente per il rendering al driver miniport di visualizzazione.
Sintassi
PFND3DDDI_RENDERCB Pfnd3dddiRendercb;
HRESULT Pfnd3dddiRendercb(
HANDLE hDevice,
D3DDDICB_RENDER *unnamedParam2
)
{...}
Parametri
hDevice
Handle per il dispositivo di visualizzazione (contesto grafico).
unnamedParam2
pData [in, out]
Puntatore a una struttura D3DDDICB_RENDER che descrive il buffer dei comandi corrente da eseguire per il rendering.
Valore restituito
pfnRenderCb restituisce uno dei valori seguenti:
Codice restituito | Descrizione |
---|---|
S_OK | Il rendering del buffer dei comandi è stato eseguito correttamente. |
D3DDDIERR_PRIVILEGEDINSTRUCTION | Il driver miniport di visualizzazione ha rilevato un'istruzione privilegiata nel buffer dei comandi; Le istruzioni con privilegi non possono essere presenti in un buffer dei comandi. |
D3DDDIERR_ILLEGALINSTRUCTION | Il driver miniport di visualizzazione ha rilevato istruzioni che l'hardware grafico non può supportare. |
D3DDDIERR_INVALIDHANDLE | Il driver miniport di visualizzazione ha rilevato un handle non valido nel buffer dei comandi. |
D3DDDIERR_CANTRENDERLOCKEDALLOCATION | Gestione memoria video ha rilevato riferimenti a un'allocazione bloccata nell'elenco di allocazione. Si noti che la gestione memoria video restituisce questo errore solo se non è stato in grado di riposizionare l'allocazione in un segmento di memoria AGP o di sistema. |
D3DDDIERR_INVALIDUSERBUFFER | Il driver miniport di visualizzazione ha rilevato un sovraccarico o un sovraccarico di dati o istruzioni. Ovvero, il driver ha ricevuto meno o più istruzioni o dati del previsto. |
E_OUTOFMEMORY | PfnRenderCb non è riuscito a completare a causa di memoria insufficiente. |
E_INVALIDARG | I parametri sono stati convalidati e sono stati determinati come non corretti. |
Questa funzione potrebbe anche restituire altri valori HRESULT.
Commenti
Quando il driver di visualizzazione in modalità utente deve inviare il buffer dei comandi corrente per il rendering al driver miniport di visualizzazione (ad esempio, durante una chiamata alla funzione Flush o Flush (D3D10) del driver di visualizzazione in modalità utente, il driver di visualizzazione in modalità utente deve chiamare la funzione pfnRenderCb . Il driver di visualizzazione in modalità utente deve impostare il parametro hDevice sul valore fornito dal runtime di Microsoft Direct3D durante la chiamata a CreateDevice o CreateDevice (D3D10). Nella struttura D3DDDICB_RENDER a cui punta il parametro pData , è necessario impostare anche il driver di visualizzazione in modalità utente:
- Membro CommandLength al numero di byte di comandi nel buffer dei comandi che inizia dall'offset zero.
- Membro CommandOffset su diverso da zero se il driver di visualizzazione in modalità utente deve specificare un offset al primo comando hardware nel buffer dei comandi.
- Membro NumAllocations al numero di elementi nell'elenco di allocazione.
- Membro NumPatchLocations al numero di elementi nell'elenco patch-location.
Se il driver di visualizzazione in modalità utente rileva che la maggior parte degli scaricamenti del buffer dei comandi è perché il driver esaurisce lo spazio nel buffer dei comandi, nell'elenco di allocazioni o nel percorso patch, il driver può richiedere il ridimensionamento. Per ridimensionare il buffer dei comandi, il driver imposta il flag di campo di bit ResizeCommandBuffer nel membro Flags di D3DDDICB_RENDER e inserisce le dimensioni richieste nel membro NewCommandBufferSize di D3DDDICB_RENDER. Analogamente, per ridimensionare l'elenco di allocazione, il driver imposta il flag di campo di bit ResizeAllocationList nel membro Flags di D3DDDICB_RENDER e inserisce il numero richiesto di elementi nel membro NewAllocationListSize di D3DDDICB_RENDER. Per ridimensionare l'elenco patch-location, il driver imposta il flag di campo di bit ResizePatchLocationList nel membro Flags di D3DDDICB_RENDER e inserisce il numero richiesto di elementi nel membro NewPatchLocationListSize di D3DDDICB_RENDER.
Esempio
Nell'esempio di codice seguente viene illustrato come inviare il buffer dei comandi corrente per il rendering al driver miniport di visualizzazione. Questo esempio di codice genera l'elenco di allocazione dopo la generazione del buffer dei comandi e dell'elenco di patch. Questo non è ottimale per le prestazioni perché il buffer dei comandi viene analizzato più del necessario. Tuttavia, questa implementazione è più semplice da mostrare. In un driver di produzione, la generazione del buffer dei comandi contemporaneamente all'allocazione e agli elenchi di patch è più efficiente.
VOID CD3DContext::SubmitDXVABuffer(DWORD Size) {
D3DDDICB_RENDER renderCBData = {0};
DWORD dwAllocationListUsed;
HRESULT hr;
if (GenerateAllocationListFromCmdBuf(R200UpdateQSParamsForDXVASubmit(m_pR200Ctx, Size), m_sContexts[MULTI_ENGINE_NODE_VIDEO].pHwCmdBufAllocList, m_dwHwCmdBufAllocListSize, &dwAllocationListUsed) == FALSE)
{
DBG_BREAK;
return;
}
// 3-D and video packets must be in sync. If the last packet that was sent went to
// the 3-D engine, that packet must finish before the new packet runs on the hardware.
renderCBData.CommandOffset = 0;
renderCBData.CommandLength = Size + sizeof(UMD_CMDBUF_INFO);
renderCBData.NumAllocations = dwAllocationListUsed;
renderCBData.hContext = m_sContexts[MULTI_ENGINE_NODE_VIDEO].hContext;
// Copy command-buffer data from the internal buffer to the buffer that was created by dxgkrnl
memcpy(m_sContexts[MULTI_ENGINE_NODE_VIDEO].pHwCmdBuf, m_pHwCmdBuf + GetCmdBufPreambleSize(m_pR200Ctx), renderCBData.CommandLength);
m_d3dCallbacks.pfnRenderCb(m_hD3D, &renderCBData);
// Makes video the last engine that work was submitted to
m_LastEngineSubmit = MULTI_ENGINE_NODE_VIDEO;
}
Requisiti
Requisito | Valore |
---|---|
Client minimo supportato | Disponibile in Windows Vista e versioni successive dei sistemi operativi Windows. |
Piattaforma di destinazione | Desktop |
Intestazione | d3dumddi.h (include D3dumddi.h) |