Condividi tramite


Funzione D3DKMTRender (d3dkmthk.h)

La funzione D3DKMTRender invia il buffer del comando corrente al sottosistema kernel grafico Microsoft DirectX (Dxgkrnl.sys).

Sintassi

NTSTATUS D3DKMTRender(
  D3DKMT_RENDER *unnamedParam1
);

Parametri

unnamedParam1

pData [in, out]

Puntatore a una struttura D3DKMT_RENDER che descrive i parametri per l'invio del buffer del comando corrente al sottosistema del kernel grafico.

Valore restituito

D3DKMTRender restituisce uno dei valori seguenti:

Codice restituito Descrizione
STATUS_SUCCESS Il buffer dei comandi è stato inviato correttamente.
STATUS_DEVICE_REMOVED La scheda grafica è stata arrestata o il contesto di visualizzazione è stato reimpostato.
STATUS_INVALID_PARAMETER I parametri sono stati convalidati e sono stati determinati come non corretti.
STATUS_NO_MEMORY Impossibile completare D3DKMTRender a causa di memoria insufficiente.
STATUS_INVALID_HANDLE La progettazione immagine e configurazione OpenGL ha rilevato un handle non valido nel buffer dei comandi.
STATUS_PRIVILEGED_INSTRUCTION D3DKMTRender ha rilevato istruzioni non privilegiate, ovvero istruzioni che accedono alla memoria oltre il privilegio del processo cpu corrente.

Questa funzione potrebbe anche restituire altri valori NTSTATUS .

Commenti

Un buffer dei comandi contiene in genere molti comandi grafici.

Se D3DKMTRender restituisce STATUS_GRAPHICS_ALLOCATION_INVALID, la configurazione di OpenGL deve riaprire o ricreare l'handle primario, sostituire tutti i riferimenti nel buffer dei comandi con l'handle precedente con il nuovo handle e quindi chiamare di nuovo D3DKMTRender per inviare di nuovo il buffer.

Dopo una chiamata a D3DKMTRender, l'ICD OpenGL 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 pCommandBuffer e CommandBufferSize della struttura D3DKMT_RENDER a cui punta il parametro pData .

Per un dispositivo che usa la modalità di contratto del buffer DMA garantito (per altre informazioni su questa modalità, vedere Uso del modello di buffer DMA del contratto garantito), le dimensioni del buffer DMA disponibile per il driver miniport di visualizzazione per convertire il buffer dei comandi al successivo invio corrisponde alle dimensioni del buffer del comando stesso. Per un dispositivo di questo tipo, l'ICD OpenGL deve anche determinare le dimensioni dell'elenco di allocazione che sarà disponibile per il driver miniport di visualizzazione durante la conversione del buffer dei comandi al successivo invio dal valore restituito nel membro AllocationListSize di D3DKMT_RENDER.

Per i dispositivi che non usano un contratto di buffer DMA garantito, la progettazione immagine e configurazione OpenGL può usare le informazioni restituite nei membri CommandBufferSize e AllocationListSize per determinare le dimensioni del buffer DMA successivo e dell'elenco di allocazione che saranno disponibili per la traduzione. Tuttavia, in condizioni di memoria insufficiente, il buffer DMA effettivo e l'elenco di allocazione forniti al driver miniport di visualizzazione potrebbero essere inferiori a quelli necessari.

Se OpenGL ICD rileva che la maggior parte degli scaricamenti del buffer dei comandi è perché il driver esaurisce lo spazio nel buffer dei comandi o nell'elenco di allocazione, 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 D3DKMT_RENDER e inserisce le dimensioni richieste nel membro CommandBufferSize di D3DKMT_RENDER. Analogamente, per ridimensionare l'elenco di allocazione, il driver imposta il flag di campo di bit ResizeAllocationList nel membro Flags di D3DKMT_RENDER e inserisce il numero richiesto di elementi nel membro AllocationListSize di D3DKMT_RENDER.

Nota

Anche se il driver può richiedere il ridimensionamento sia del buffer dei comandi che dell'elenco di allocazione, la gestione memoria video potrebbe non essere in grado di conformarsi. Pertanto, se la chiamata a D3DKMTRender ha esito positivo, il driver deve verificare i valori restituiti nei membri pCommandBuffer, CommandBufferSize e AllocationListSize .
Tuttavia, se la chiamata a D3DKMTRender ha esito negativo, il driver determina che il buffer dei comandi, l'elenco di allocazione o entrambi non sono stati ridimensionati. Di conseguenza, il driver non deve elaborare i valori restituiti nei membri pCommandBuffer, CommandBufferSize e AllocationListSize perché non sono validi.

Esempio

L'esempio di codice seguente illustra come una progettazione immagine e configurazione openGL può usare D3DKMTRender per eseguire il rendering di primitive 3D.

HRESULT Render(D3DKMT_HANDLE hDevice, UINT CommandOffset, UINT CommandLength)
{
    D3DKMT_RENDER RenderData;

    memset(&RenderData, 0, sizeof(RenderData));
    RenderData.hDevice = hDevice;
    RenderData.CommandOffset = CommandOffset;
    RenderData.CommandLength = CommandLength;

    if (NT_SUCCESS((*pfnKTRender)(&RenderData))) {
        return S_OK;
    }
    return E_FAIL;
}

Requisiti

Requisito Valore
Client minimo supportato Windows Vista
Piattaforma di destinazione Universale
Intestazione d3dkmthk.h (include D3dkmthk.h)
Libreria Gdi32.lib
DLL Gdi32.dll

Vedi anche

D3DKMTGetDeviceState

D3DKMT_RENDER