Compartilhar 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 [dentro, fora]

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

Valor de retorno

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 D3DKMTRender não pôde ser concluída 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ãoprivilegiadas (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 de NTSTATUS.

Observações

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

Se D3DKMTRender retornar STATUS_GRAPHICS_ALLOCATION_INVALID, a ICD do OpenGL 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 chamar D3DKMTRender novamente para reenviar o buffer.

Após uma chamada para D3DKMTRender, o ICD do OpenGL 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 no pCommandBuffer e CommandBufferSize membros da estrutura D3DKMT_RENDER que é apontado pelo parâmetro pData.

Para um dispositivo que usa o modo de contrato de buffer DMA garantido (para obter mais informações sobre esse modo, consulte Usando o modelo de buffer DMA de contrato garantido), o tamanho do buffer DMA que está disponível para o driver de miniporto 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 AllocationListSize membro do D3DKMT_RENDER.

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

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

Nota

Embora o driver possa solicitar o redimensionamento do buffer de comando e da lista de alocação, o gerenciador de memória de vídeo pode não ser capaz de cumprir. Portanto, se a chamada para D3DKMTRender for bem-sucedida, o driver deverá verificar os valores retornados no pCommandBuffer, CommandBufferSizee AllocationListSize membros.
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 no pCommandBuffer, CommandBufferSizee AllocationListSize membros porque eles são inválidos.

Exemplos

O exemplo de código a seguir demonstra como um ICD OpenGL 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
de cliente com suporte mínimo Windows Vista
da Plataforma de Destino Universal
cabeçalho d3dkmthk.h (inclua D3dkmthk.h)
biblioteca Gdi32.lib
de DLL Gdi32.dll

Consulte também

D3DKMTGetDeviceState

D3DKMT_RENDER