Funzione D3DKMTPresent (d3dkmthk.h)

La funzione D3DKMTPresent invia un comando presente al sottosistema del kernel grafico Microsoft DirectX (Dxgkrnl.sys).

Sintassi

NTSTATUS D3DKMTPresent(
  [in] D3DKMT_PRESENT *unnamedParam1
);

Parametri

[in] unnamedParam1

pData: puntatore a una struttura D3DKMT_PRESENT che descrive i parametri per la presentazione.

Valore restituito

D3DKMTPresent restituisce un valore NTSTATUS, ad esempio uno dei valori seguenti:

Codice restituito Descrizione
STATUS_SUCCESS Il presente è stato eseguito 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 determinati per essere non corretti.
STATUS_NO_MEMORY D3DKMTPresent non è stato possibile completare a causa di memoria insufficiente.
STATUS_GRAPHICS_ALLOCATION_INVALID L'handle della superficie primaria è stato invalidato a causa di una modifica della modalità di visualizzazione. Se il driver client installabile OpenGL riceve questo codice di errore, deve riaprire o ricreare l'handle primario, sostituire tutti i riferimenti nel buffer dei comandi nell'handle precedente con il nuovo handle e quindi inviare nuovamente il buffer.
STATUS_GRAPHICS_GPU_EXCEPTION_ON_DEVICE Errore nel contesto del dispositivo di rendering specificato dal membro hContext di D3DKMT_PRESENT .

Nota

Il codice di errore STATUS_GRAPHICS_GPU_EXCEPTION_ON_DEVICE non indica l'avvio di un processo di rilevamento timeout e ripristino (TDR) o che la GPU ha arrestato la risposta. Ad esempio, il sottosistema kernel della grafica DirectX inserisce un dispositivo in uno stato di errore se il driver miniport visualizzato indica che un buffer DMA inviato da questo dispositivo ha causato un errore o se la gestione memoria video non è riuscita a visualizzare tutte le allocazioni necessarie per un buffer DMA anche dopo la suddivisione del buffer DMA. Dopo che un dispositivo si trova in uno stato di errore, non può eseguire altre operazioni e deve essere distrutto e ricreato. L'ICD può chiamare la funzione D3DKMTGetDeviceState per determinare un motivo più preciso per l'errore.

Commenti

La funzione D3DKMTPresent potrebbe restituire STATUS_INVALID_PARAMETER, a seconda della combinazione di valori dei parametri, ovvero i valori nei membri della struttura D3DKMT_PRESENT a cui pData punta. Nell'elenco seguente vengono descritte le combinazioni più comuni dei valori dei parametri che potrebbero causare la restituzione di STATUS_INVALID PARAMETER di D3DKMTPresent :

  • Il membro hDestination non è NULL e almeno una delle seguenti condizioni è true:

    • Il membro pSrcSubRects è NULL.
    • Il membro SubRectCnt è 0.
    • Il flag di campo bit Blt del membro Flags non è impostato.
    • Il flag di campo bit SrcRectValid di Flags non è impostato.
    • Viene impostato il flag di bit-field ColorFill di Flags .
    • Il flag Flip, FlipDoNotFlip, FlipDoNotWait o FlipRestart è impostato.
    • Il flag di campo a bit SrcColorKey o DstColorKey di Flags è impostato.
    • Il membro hSource è uguale a hDestination.
    • L'origine e la destinazione non sono una superficie primaria.
  • Il flag di campo a bit flip di Flag è impostato e almeno una delle condizioni seguenti è true:

    • Viene impostato il flag di bit-field ColorFill di Flags .
    • Il flag di campo bit Blt di Flag è impostato.
    • Il flag di campo a bit SrcColorKey o DstColorKey di Flags è impostato.
    • Il flag di campo a bit SrcRectValid o DstRectValid di Flags è impostato.
    • Viene impostato il flag Ruotare il campo bit di Flag .
    • È impostato il flag di campo a bit RestrictVidPnSource di Flags .
    • L'origine non è una superficie primaria.
    • Il driver miniport visualizzato non supporta l'intervallo di capovolgimento specificato dal membro FlipInterval .
    • La funzione D3DKMTSetDisplayMode non è stata chiamata in precedenza.
  • Il flag di campo bit di ColorFill di Flag è impostato e una delle condizioni seguenti è true:

    • pSrcSubRects è NULL.
    • SubRectCnt è 0.
    • Il flag di campo bit Blt di Flag è impostato.
    • Il flag Flip, FlipDoNotFlip, FlipDoNotWait o FlipRestart è impostato.
    • Il flag di campo a bit SrcColorKey o DstColorKey di Flags è impostato.
    • Il flag di campo bit SrcRectValid di Flags è impostato.
  • Il flag di campo a bit Blt di Flag è impostato e una delle condizioni seguenti è true:

    • pSrcSubRects è NULL.
    • SubRectCnt è 0.
    • Viene impostato il flag di bit-field ColorFill di Flags .
    • Il flag Flip, FlipDoNotFlip, FlipDoNotWait o FlipRestart è impostato.

Driver grafici in modalità utente che chiamano D3DKMTPresent per lo stile blit presente, con il flag di campo a bit Blt del set Flags , è necessario prestare particolare attenzione per garantire che tutto il lavoro inviato in precedenza al contesto sia completamente svuotabile. In alcuni casi, il deadlock dell'applicazione può causare il deadlock dell'applicazione o in alcuni casi il deadlock del desktop dell'utente corrente. Un contesto è completamente svuotabile se contiene solo attese sull'oggetto di sincronizzazione GPU in cui il segnale corrispondente è già stato accodato al database dell'utilità di pianificazione GPU e dove tale segnale non è dietro un'altra attesa non restrittiva. In altre parole, se lo spazio utente di tutti i processi nel sistema è stato sospeso immediatamente dopo la chiamata a D3DKMTPresent, l'attesa verrà soddisfatta dopo che la catena di rendering dipendente già accodata all'utilità di pianificazione GPU finirebbe il rendering. Un driver non deve mai chiamare blit presente in un contesto che dipende da un'attesa GPU che non è attualmente soddisfatta e previsto essere soddisfatta da alcune operazioni successive provenienti da questo o un altro processo.

Esempio

Nell'esempio di codice seguente viene illustrato come un ICD OpenGL può usare D3DKMTPresent per presentare i dati.

HRESULT Present(D3DKMT_HANDLE hDevice, 
                HWND hWnd, 
                RECT* pSrcRect,
                 RECT* pDstRect)
{
    D3DKMT_PRESENT PresentData = {0};

    PresentData.hDevice = hDevice;
    PresentData.Flags.Blt = 
    PresentData.Flags.DstRectValid = 
    PresentData.Flags.SrcRectValid = TRUE;
    PresentData.hWindow = hWnd;
    PresentData.DstRect = *pDstRect;
    PresentData.SrcRect = *pSrcRect;
    PresentData.SubRectCnt = 1;  
    PresentData.pSrcSubRects = pSrcRect; 

    if (NT_SUCCESS((*pfnKTPresent)(&PresentData))) {
        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

D3DKMTSetDisplayMode

D3DKMT_PRESENT