Partilhar via


Função D3DKMTRender (d3dkmthk.h)

A função D3DKMTRender envia o buffer de comando atual para o subsistema de kernel de elementos gráficos do Microsoft DirectX (Dxgkrnl.sys).

Sintaxe

NTSTATUS D3DKMTRender(
  D3DKMT_RENDER *unnamedParam1
);

Parâmetros

unnamedParam1

pData [in, out]

Um ponteiro para uma estrutura D3DKMT_RENDER que descreve os parâmetros para enviar o buffer de comando atual para o subsistema de kernel gráfico.

Retornar valor

D3DKMTRender retorna um dos seguintes valores:

Código de retorno Descrição
STATUS_SUCCESS O buffer de comando foi enviado 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 O D3DKMTRender não pôde ser concluído devido à memória insuficiente.
STATUS_INVALID_HANDLE O OpenGL ICD detectou um identificador inválido no buffer de comando.
STATUS_PRIVILEGED_INSTRUCTION D3DKMTRender detectou instruções não privilegiadas (ou seja, instruções que acessam a memória além do privilégio do processo de CPU atual).

Essa função também pode retornar outros valores NTSTATUS .

Comentários

Um buffer de comando normalmente contém muitos comandos gráficos.

Se D3DKMTRender retornar STATUS_GRAPHICS_ALLOCATION_INVALID, o OpenGL ICD deverá reabrir ou recriar o identificador primário, substituir todas as referências no buffer de comando para o identificador anterior pelo novo identificador e, em seguida, chamar D3DKMTRender novamente para reenviar o buffer.

Após uma chamada para D3DKMTRender, o OpenGL ICD deve determinar o endereço base e o tamanho do buffer de comando que ele deve usar para seu próximo envio dos valores retornados nos membros pCommandBuffer e CommandBufferSize da estrutura D3DKMT_RENDER que é apontada pelo parâmetro pData .

Para um dispositivo que usa o modo de contrato de buffer de DMA garantido (para obter mais informações sobre esse modo, consulte Usando o modelo de buffer de DMA de contrato garantido), o tamanho do buffer de DMA que está disponível para o driver de miniporta de exibição para traduzir o buffer de comando no próximo envio é o mesmo que o tamanho do buffer de comando em si. Para esse dispositivo, o OpenGL ICD também deve determinar o tamanho da lista de alocação que estará disponível para o driver de miniporto de exibição durante a tradução do buffer de comando no próximo envio do valor retornado no membro AllocationListSize do D3DKMT_RENDER.

Para dispositivos que não usam contrato de buffer de DMA garantido, o OpenGL ICD pode usar as informações retornadas nos membros CommandBufferSize e AllocationListSize para determinar o tamanho do próximo buffer de DMA e lista de alocação que estarão disponíveis para tradução. No entanto, em condições de memória baixa, o buffer DMA real e a lista de alocação fornecidos para o driver de miniporta de exibição podem ser menores do que o necessário.

Se o OpenGL ICD detectar que a maioria das liberações de buffer de comando é porque o driver fica sem espaço na lista de buffers de comandos ou alocação, o driver pode solicitar que eles sejam redimensionados. Para redimensionar o buffer de comando, o driver define o sinalizador de campo de bits ResizeCommandBuffer no membro Flags do D3DKMT_RENDER e coloca o tamanho solicitado no membro CommandBufferSize do D3DKMT_RENDER. Da mesma forma, para redimensionar a lista de alocação, o driver define o sinalizador de campo de bits ResizeAllocationList no membro Flags do D3DKMT_RENDER e coloca o número solicitado de elementos no membro AllocationListSize do D3DKMT_RENDER.

Observação

Embora o driver possa solicitar o redimensionamento do buffer de comandos e da lista de alocação, o gerenciador de memória de vídeo pode não conseguir cumprir. Portanto, se a chamada para D3DKMTRender for bem-sucedida, o driver deverá verificar os valores retornados nos membros pCommandBuffer, CommandBufferSize e AllocationListSize .
No entanto, se a chamada para D3DKMTRender falhar, o driver determinará que o buffer de comandos, a lista de alocação ou ambos não foram redimensionados. Portanto, o driver não deve processar os valores retornados nos membros pCommandBuffer, CommandBufferSize e AllocationListSize porque eles são inválidos.

Exemplos

O exemplo de código a seguir demonstra como um OpenGL ICD pode usar D3DKMTRender para renderizar primitivos 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;
}

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

D3DKMT_RENDER