DXGKDDI_RENDERKM funzione di callback (d3dkmddi.h)
Per le schede di visualizzazione che supportano l'accelerazione hardware GDI, la funzione DxgkDdiRenderKm genera un buffer DMA (Direct Memory Access) dal buffer di comando passato dal driver di visualizzazione canonico in modalità kernel passato.
Sintassi
DXGKDDI_RENDERKM DxgkddiRenderkm;
NTSTATUS DxgkddiRenderkm(
[in] IN_CONST_HANDLE hContext,
[in/out] INOUT_PDXGKARG_RENDER pRenderKmArgs
)
{...}
Parametri
[in] hContext
Handle al contesto del dispositivo per i buffer dei comandi e DMA. La funzione DxgkDdiCreateContext del driver di visualizzazione ha restituito in precedenza questo handle nel membro hContext della struttura DXGKARG_CREATECONTEXT a cui punta il parametro pCreateContext di DxgkDdiCreateContext .
Se il driver non supporta la creazione del contesto, il sottosistema kernel della grafica Microsoft DirectX sostituisce l'handle nel contesto con un handle al dispositivo. La funzione DxgkDdiCreateDevice del driver di visualizzazione ha restituito in precedenza l'handle del dispositivo nel membro hDevice della struttura DXGKARG_CREATEDEVICE a cui punta il parametro pCreateDevice di DxgkDdiCreateDevice.
[in/out] pRenderKmArgs
Puntatore a una struttura DXGKARG_RENDER che contiene informazioni sul buffer DMA e su un buffer di comandi formattato.
Se il driver miniport visualizzato supporta l'accelerazione hardware GDI, pRenderKmArgs-pCommand> punta al buffer dei comandi DXGK_RENDERKM_COMMAND.
Il driver deve convertire il buffer dei comandi di input in comandi buffer DMA e compilare l'elenco dei percorsi delle patch.
Valore restituito
DxgkDdiRenderKm restituisce uno dei valori seguenti:
Codice restituito | Descrizione |
---|---|
STATUS_SUCCESS | L'intero buffer dei comandi è stato convertito. |
STATUS_NO_MEMORY | DxgkDdiRenderKm non è stato in grado di allocare memoria necessaria per il completamento. |
STATUS_GRAPHICS_INSUFFICIENT_DMA_BUFFER | Il buffer DMA corrente è esaurito. |
STATUS_INVALID_PARAMETER | DxgkDdiRenderKm ha rilevato parametri di istruzione che l'hardware grafico non è riuscito a supportare; tuttavia, l'hardware grafico può supportare le istruzioni stesse. Il driver non è necessario per restituire questo codice di errore. Può invece restituire STATUS_ILLEGAL_INSTRUCTION quando rileva parametri di istruzione non supportati. |
STATUS_INVALID_USER_BUFFER | DxgkDdiRenderKm ha rilevato dati o istruzioni in esecuzione o overrun. Ovvero, il driver ha ricevuto meno o più istruzioni o dati del previsto. Il driver non è necessario per restituire questo codice di errore. Può invece restituire STATUS_ILLEGAL_INSTRUCTION quando rileva dati o istruzioni in esecuzione o overrun. |
STATUS_INVALID_HANDLE | DxgkDdiRenderKm ha rilevato un handle non valido nel buffer dei comandi. |
STATUS_GRAPHICS_GPU_EXCEPTION_ON_DEVICE | Il driver miniport visualizzato ha rilevato un errore nel flusso DMA. Il dispositivo contesto grafico viene inserito in uno stato perso se il driver restituisce questo codice di errore. |
Commenti
Il sottosistema kernel della grafica DirectX chiama la funzione DxgkDdiRenderKm del driver di visualizzazione per generare un buffer DMA dal buffer di comando passato dal driver di visualizzazione canonico in modalità kernel (CDD) fornito dal sistema operativo. Oltre al buffer DMA di output, il driver miniport visualizzato deve generare anche un elenco di posizioni delle patch di output. Gestione memoria video usa questo elenco per dividere e applicare patch ai buffer DMA in modo appropriato.
L'accesso ai buffer del kernel non richiede la protezione dal try/except
codice.
Il driver miniport visualizzato non è necessario per usare le informazioni fornite dal CDD se può ricreare le informazioni in modo ottimale. Ad esempio, se il membro pRender-pPatchLocationListIn è vuoto perché il driver di visualizzazione in modalità utente non ha fornito un elenco di patch di input, il driver miniport visualizzato può generare il contenuto del membro pRender-pPatchLocationListOut >> in base al contenuto del buffer dei comandi.
Oltre all'handle specifico del dispositivo, il sottosistema del kernel grafico DirectX fornisce il driver miniport visualizzato con l'ultimo indirizzo del segmento GPU noto per ogni allocazione. Se l'indice di allocazione N è attualmente in pagina, il sottosistema del kernel grafico DirectX imposta il membro SegmentId dell'elemento Ndel membro pAllocationList di DXGKARG_RENDER su zero. Se il membro SegmentId dell'elemento Ndell'elenco di allocazione non è impostato su zero, il driver miniport visualizzato deve applicare patch al buffer DMA generato con le informazioni sull'indirizzo del segmento specificato prima che il sottosistema del kernel grafico DirectX chiami la funzione DxgkDdiPatch per eseguire il repository del buffer DMA. Il driver deve eseguire questa patch iniziale quando richiesto perché il sottosistema kernel della grafica DirectX potrebbe non chiamare la funzione DxgkDdiPatch in un buffer DMA che il driver deve avere patch correttamente.
Anche se la funzione DxgkDdiRenderKm del driver esegue l'applicazione iniziale di patch del buffer DMA come descritto in precedenza, il driver deve comunque inserire tutti i riferimenti alle allocazioni nell'elenco della patch di output specificato dal membro pPatchLocationListOut di DXGKARG_RENDER . Questo elenco deve contenere tutti i riferimenti perché gli indirizzi delle allocazioni potrebbero cambiare prima che il buffer DMA venga inviato alla GPU; pertanto, il sottosistema kernel della grafica DirectX chiamerà la funzione DxgkDdiPatch per eseguire il repository del buffer DMA.
Per annullare l'associazione di un'allocazione, il driver miniport visualizzato può specificare un elemento nell'elenco di allocazione che fa riferimento a un handle NULL e quindi può usare un elemento patch-location che fa riferimento all'allocazione NULL . In genere, il driver deve usare il primo elemento dell'elenco di allocazione (elemento 0) come elemento NULL .
In modalità DMA del contratto garantito, quando il driver miniport visualizzato converte un buffer di comandi in un buffer DMA, il CDD deve garantire risorse sufficienti per il comando di traduzione. Se per la traduzione non esistono risorse sufficienti, il driver miniport visualizzato deve rifiutare il buffer DMA. Per altre informazioni, vedere Uso del modello di buffer DMA del contratto garantito.
DxgkDdiRenderKm deve essere reso paginabile.
Requisiti
Requisito | Valore |
---|---|
Client minimo supportato | Windows 7 |
Piattaforma di destinazione | Desktop |
Intestazione | d3dkmddi.h |
IRQL | PASSIVE_LEVEL |