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 |