Compartilhar via


Função D3DKMTPresent (d3dkmthk.h)

A função D3DKMTPresent envia um comando presente para o subsistema de kernel de elementos gráficos do Microsoft DirectX (Dxgkrnl.sys).

Sintaxe

NTSTATUS D3DKMTPresent(
  [in] D3DKMT_PRESENT *unnamedParam1
);

Parâmetros

[in] unnamedParam1

pData: um ponteiro para uma estrutura de D3DKMT_PRESENT que descreve parâmetros para apresentação.

Retornar valor

D3DKMTPresent retorna um valor NTSTATUS, como um dos seguintes valores:

Código de retorno Descrição
STATUS_SUCCESS O presente foi executado com êxito.
STATUS_DEVICE_REMOVED O adaptador gráfico foi interrompido ou o contexto de exibição foi redefinido.
STATUS_INVALID_PARAMETER Os parâmetros foram validados e determinados como incorretos.
STATUS_NO_MEMORY D3DKMTPresent não pôde ser concluído devido à memória insuficiente.
STATUS_GRAPHICS_ALLOCATION_INVALID O identificador da superfície primária foi invalidado devido a uma alteração no modo de exibição. Se o ICD (driver de cliente instalável) do OpenGL receber esse código de erro, ele deverá reabrir ou recriar o identificador primário, substituir todas as referências no buffer de comando para o identificador antigo pelo novo identificador e, em seguida, reenviar o buffer.
STATUS_GRAPHICS_GPU_EXCEPTION_ON_DEVICE Ocorreu um erro no contexto do dispositivo de renderização especificado pelo membro hContext de D3DKMT_PRESENT .

Observação

O código de erro STATUS_GRAPHICS_GPU_EXCEPTION_ON_DEVICE não indica o início de um processo de TDR (detecção e recuperação de tempo limite) ou que a GPU parou de responder. Por exemplo, o subsistema de kernel de elementos gráficos DirectX coloca um dispositivo em um estado de erro se o driver de miniporto de exibição indicou que um buffer DMA enviado desse dispositivo causou uma falha ou se o gerenciador de memória de vídeo não pôde colocar todas as alocações necessárias para um buffer de DMA mesmo depois de dividir o buffer de DMA. Depois que um dispositivo estiver em um estado de erro, ele não poderá executar mais nenhuma operação e deverá ser destruído e recriado. O ICD pode chamar a função D3DKMTGetDeviceState para determinar um motivo mais preciso para o erro.

Comentários

A função D3DKMTPresent pode retornar STATUS_INVALID_PARAMETER, dependendo da combinação de valores de parâmetro (ou seja, valores em membros da estrutura D3DKMT_PRESENT para a qual pData aponta). A lista a seguir descreve as combinações mais comuns de valores de parâmetro que podem fazer com que D3DKMTPresent retorne STATUS_INVALID PARAMETER:

  • O membro hDestination não é NULL e pelo menos uma das seguintes condições é verdadeira:

    • O membro pSrcSubRects é NULL.
    • O membro SubRectCnt é 0.
    • O sinalizador de campo de bits Blt do membro Flags não está definido.
    • O sinalizador de campo de bits SrcRectValid de Flags não está definido.
    • O sinalizador de campo de bits ColorFill de Flags está definido.
    • O sinalizador de campo de bits Flip, FlipDoNotFlip, FlipDoNotWait ou FlipRestart de Flags está definido.
    • O sinalizador de campo de bits SrcColorKey ou DstColorKey de Flags está definido.
    • O membro hSource é igual a hDestination.
    • A origem e o destino não são uma superfície primária.
  • O sinalizador de campo de bits Flip de Flags é definido e pelo menos uma das seguintes condições é verdadeira:

    • O sinalizador de campo de bits ColorFill de Flags está definido.
    • O sinalizador de campo de bits Blt de Sinalizadores está definido.
    • O sinalizador de campo de bits SrcColorKey ou DstColorKey de Flags está definido.
    • O sinalizador de campo de bits SrcRectValid ou DstRectValid de Flags está definido.
    • O sinalizador Girar campo de bits de Sinalizadores está definido.
    • O sinalizador de campo de bits RestrictVidPnSource de Flags está definido.
    • A origem não é uma superfície primária.
    • O driver de miniporto de exibição não dá suporte ao intervalo de inversão especificado pelo membro FlipInterval .
    • A função D3DKMTSetDisplayMode não foi chamada anteriormente.
  • O sinalizador de campo de bits ColorFill de Flags está definido e uma das seguintes condições é verdadeira:

    • pSrcSubRects é NULL.
    • SubRectCnt é 0.
    • O sinalizador de campo de bits Blt de Sinalizadores está definido.
    • O sinalizador de campo de bits Flip, FlipDoNotFlip, FlipDoNotWait ou FlipRestart de Flags está definido.
    • O sinalizador de campo de bits SrcColorKey ou DstColorKey de Flags está definido.
    • O sinalizador de campo de bits SrcRectValid de Flags está definido.
  • O sinalizador de campo de bits Blt de Flags está definido e uma das seguintes condições é verdadeira:

    • pSrcSubRects é NULL.
    • SubRectCnt é 0.
    • O sinalizador de campo de bits ColorFill de Flags está definido.
    • O sinalizador de campo de bits Flip, FlipDoNotFlip, FlipDoNotWait ou FlipRestart de Flags está definido.

Os drivers gráficos do modo de usuário que chamam D3DKMTPresent para o estilo blit presentes, com o sinalizador de campo de bits Blt do Conjunto de Sinalizadores , precisam ter um cuidado especial para garantir que todo o trabalho enviado anteriormente para os contextos apresentados seja totalmente drenável. A falha ao fazer isso pode resultar no deadlock do aplicativo em si ou, em alguns casos, em casos de deadlock da área de trabalho do usuário atual. Um contexto será totalmente drenável se ele contiver apenas esperas no objeto de sincronização de GPU em que o sinal correspondente já foi enfileirado no banco de dados do agendador de GPU e onde esse sinal em si não está por trás de outra espera não indisponível. Em outras palavras, se o espaço do usuário de todos os processos no sistema tiver sido pausado imediatamente após a chamada para D3DKMTPresent, a espera será atendida depois que a cadeia de renderização dependente já enfileirada no agendador de GPU terminar a renderização. Um driver nunca deve chamar blit presente em um contexto que dependa de uma espera de GPU que não esteja atualmente satisfeita e que deverá ser atendida por alguma operação posterior originária desse ou de outro processo.

Exemplos

O exemplo de código a seguir demonstra como um OpenGL ICD pode usar D3DKMTPresent para apresentar dados.

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;
}

Requisitos

Requisito Valor
Cliente mínimo com suporte Windows Vista
Plataforma de Destino Universal
Cabeçalho d3dkmthk.h (inclua D3dkmthk.h)
Biblioteca Gdi32.lib
DLL Gdi32.dll

Confira também

D3DKMTGetDeviceState

D3DKMTSetDisplayMode

D3DKMT_PRESENT