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 |