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.
Dopo una chiamata a pfnRenderCb, il driver di visualizzazione in modalità utente deve determinare l'indirizzo di base e le dimensioni del buffer dei comandi che deve usare per il successivo invio dai valori restituiti nei membri pNewCommandBuffer e NewCommandBufferSize di D3DDDICB_RENDER. Analogamente, il driver deve determinare l'indirizzo di base e il numero di elementi dell'elenco di allocazione e dell'elenco di posizioni patch successivi dai valori restituiti rispettivamente nei membri pNewAllocationList e NewAllocationListSize e pNewPatchLocationList e NewPatchLocationListSize .

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.

Nota Anche se il driver può richiedere il ridimensionamento del buffer dei comandi e l'allocazione e gli elenchi di percorsi patch, la gestione memoria video potrebbe non essere in grado di conformarsi. Pertanto, indipendentemente dal fatto che la chiamata a pfnRenderCb abbia esito positivo, il driver deve verificare i valori restituiti nei membri NewCommandBufferSize, NewAllocationListSize e NewPatchLocationListSize di D3DDDICB_RENDER.
 
Se il driver di visualizzazione in modalità utente imposta il membro hContext della struttura D3DDDICB_RENDER a cui punta il parametro pData su NULL, il runtime di Microsoft Direct3D invia l'operazione di rendering al contesto predefinito del dispositivo. Se il driver di visualizzazione in modalità utente imposta hContext su un handle valido restituito in precedenza dalla funzione pfnCreateContextCb e che rappresenta un contesto di dispositivo, il runtime Direct3D invia l'operazione di rendering a tale contesto. Nota direct3D versione 11: Per altre informazioni su come il driver chiama pfnRenderCb, vedere Modifiche da Direct3D 10.

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)

Vedi anche

CreateDevice

D3DDDICB_RENDER

D3DDDI_DEVICECALLBACKS

Svuotamento

pfnCreateContextCb