DXGKDDI_RENDER função de retorno de chamada (d3dkmddi.h)

A função DxgkDdiRender gera um buffer DMA (acesso direto à memória) do buffer de comando que o driver de exibição no modo de usuário passou.

Sintaxe

DXGKDDI_RENDER DxgkddiRender;

NTSTATUS DxgkddiRender(
  [in]     IN_CONST_HANDLE hContext,
  [in/out] INOUT_PDXGKARG_RENDER pRender
)
{...}

Parâmetros

[in] hContext

Um identificador para o contexto do dispositivo para o DMA e buffers de comando. A função DxgkDdiCreateContext do driver de miniporto de exibição retornou anteriormente esse identificador no membro hContext da estrutura DXGKARG_CREATECONTEXT à qual o parâmetro pCreateContext de DxgkDdiCreateContext aponta.

Se o driver não oferecer suporte à criação de contexto, o subsistema de kernel de elementos gráficos do Microsoft DirectX substituirá o identificador para o contexto por um identificador para o dispositivo. A função DxgkDdiCreateDevice do driver de miniporto de exibição retornou anteriormente o identificador do dispositivo no membro hDevice da estrutura DXGKARG_CREATEDEVICE para a qual o parâmetro pCreateDevice de DxgkDdiCreateDevice aponta.

[in/out] pRender

Um ponteiro para uma estrutura de DXGKARG_RENDER que contém informações sobre o DMA e buffers de comando.

Valor retornado

DxgkDdiRender retorna um dos seguintes valores:

Código de retorno Descrição
STATUS_SUCCESS Todo o buffer de comando foi traduzido.
STATUS_NO_MEMORY O DxgkDdiRender não pôde alocar a memória necessária para que ela fosse concluída.
STATUS_GRAPHICS_INSUFFICIENT_DMA_BUFFER O buffer DMA atual está esgotado.
STATUS_PRIVILEGED_INSTRUCTION DxgkDdiRender detectou instruções nãoprivilegadas (ou seja, instruções que acessam a memória além do privilégio do processo de CPU [unidade de processamento central] atual).
STATUS_ILLEGAL_INSTRUCTION DxgkDdiRender detectou instruções de que não era possível dar suporte ao hardware gráfico.
STATUS_INVALID_PARAMETER DxgkDdiRender detectou parâmetros de instrução que o hardware gráfico não podia dar suporte; no entanto, o hardware gráfico pode dar suporte às próprias instruções. O driver não é necessário para retornar esse código de erro. Em vez disso, ele pode retornar STATUS_ILLEGAL_INSTRUCTION quando detecta parâmetros de instrução sem suporte.
STATUS_INVALID_USER_BUFFER DxgkDdiRender detectou dados ou instruções em execução ou sobrecarga. Ou seja, o driver recebeu menos ou mais instruções ou dados do que o esperado. O driver não é necessário para retornar esse código de erro. Em vez disso, ele pode retornar STATUS_ILLEGAL_INSTRUCTION quando detecta dados ou instruções em execução ou sobrecarga.
STATUS_INVALID_HANDLE DxgkDdiRender detectou um identificador inválido no buffer de comando.
STATUS_GRAPHICS_DRIVER_MISMATCH O driver de miniporto de exibição não é compatível com o driver de exibição no modo de usuário que iniciou a chamada para DxgkDdiRender (ou seja, enviou o buffer de comando).
STATUS_GRAPHICS_GPU_EXCEPTION_ON_DEVICE O driver de miniporto de exibição detectou um erro no fluxo DMA. O dispositivo de contexto gráfico será colocado em um estado perdido se o driver retornar esse código de erro.

Comentários

O subsistema de kernel de elementos gráficos DirectX chama a função DxgkDdiRender do driver de miniporto de exibição para gerar um buffer DMA do buffer de comando que o driver de exibição no modo de usuário passou. Quando o driver de miniporto de exibição é convertido do buffer de comando para o buffer DMA, o driver também deve validar o buffer de comando para garantir que o buffer de comando não contenha comandos ou comandos privilegiados que possam ser usados para acessar a memória que não pertence ao processo. Além do buffer de DMA de saída, o driver de miniporto de exibição também deve gerar uma lista de locais de patch de saída. O gerenciador de memória de vídeo usa essa lista para dividir e corrigir buffers DMA adequadamente.

Tanto o pCommand do buffer de comando quanto a lista de locais de patch de entrada pPatchLocationListIn que o driver de exibição no modo de usuário gera são alocados do espaço de endereço no modo de usuário e são passados para o driver de miniporto de exibição intocado. O driver de miniporto de exibição deve usar __try/__except o código em qualquer acesso ao buffer e à lista e deve validar o conteúdo do buffer e da lista antes de copiar o conteúdo para os respectivos buffers de kernel (ou seja, antes de copiar o conteúdo do membro pCommand para o membro pDmaBuffer e o conteúdo do membro pPatchLocationListIn para o membro pPatchLocationListOut , que são todos membros da estrutura DXGKARG_RENDER à qual o parâmetro pRender aponta).

Aqui está um exemplo de como os drivers de miniporto de exibição devem acessar esses buffers usando __try e lógica __except . AllocationListIn aponta para o buffer do modo de usuário.

__try
  {
    for (Index = 0; Index < AllocationListInSize; AllocationTable++, 
           AllocationListIn++, AllocationListOut++, Index++) 
    {
      D3DKMT_HANDLE AllocationHandle = AllocationListIn->hAllocation;
      . . .
    }
  }
__except(EXCEPTION_EXECUTE_HANDLER)
  {
    Status = STATUS_INVALID_PARAMETER;
    SAMPLE_LOG_ERROR(
  "Exception occurred accessing user-mode allocation list. Returning Status=0x%I64x",
      Status);
    goto cleanup;
  }

Observação

O acesso aos buffers de kernel não requer proteção contra try/except código.

O driver de miniporto de exibição não é necessário para usar informações que o driver de exibição no modo de usuário fornece se recriar as informações for mais ideal. Por exemplo, se pPatchLocationListIn estiver vazio porque o driver de exibição no modo de usuário não forneceu uma lista de locais de patch de entrada, o driver de miniporto de exibição poderá gerar o conteúdo de pPatchLocationListOut com base no conteúdo do buffer de comando.

A lista de alocação fornecida pelo driver de exibição no modo de usuário é validada, copiada e convertida em uma lista de alocação no modo kernel durante a transição do kernel. O subsistema de kernel de gráficos DirectX converte cada elemento D3DDDI_ALLOCATIONLIST em um elemento DXGK_ALLOCATIONLIST convertendo o identificador tipo D3DKMT_HANDLE que o driver de exibição no modo de usuário fornece em um identificador específico do dispositivo, que retorna a função DxgkDdiOpenAllocation do driver de miniporto de exibição. O índice de cada alocação e o status de gravação da alocação (ou seja, a configuração do sinalizador de campo de bit WriteOperation ) permanece constante durante a conversão.

Além do identificador específico do dispositivo, o subsistema de kernel de gráficos DirectX fornece o driver de miniporto de exibição com o último endereço de segmento de GPU conhecido para cada alocação. Se o índice de alocação N for excluído no momento, o subsistema de kernel de elementos gráficos DirectX definirá o membro SegmentId do elemento Nth do membro pAllocationList de DXGKARG_RENDER como zero. Se o membro SegmentId do elemento Nth da lista de alocação não estiver definido como zero, o driver de miniporto de exibição deverá corrigir previamente o buffer de DMA gerado com as informações de endereço do segmento fornecidas. O driver deve pré-corrigir quando solicitado porque o subsistema de kernel de elementos gráficos DirectX pode não chamar a função DxgkDdiPatch em um buffer DMA que o driver deve ter corrigido corretamente.

Observação

Embora a função DxgkDdiRender do driver exiba previamente o buffer DMA, o driver ainda deve inserir todas as referências às alocações na lista de locais de patch de saída que o membro pPatchLocationListOut do DXGKARG_RENDER especifica. Essa lista deve conter todas as referências porque os endereços das alocações podem ser alterados antes que o buffer DMA seja enviado para a GPU; Portanto, o subsistema de kernel de elementos gráficos DirectX chamará a função DxgkDdiPatch para fazer o repositório do buffer DMA.

Para desassociar uma alocação, o driver de miniporto de exibição pode especificar um elemento na lista de alocação que faz referência a um identificador NULL e, em seguida, pode usar um elemento de local de patch que faz referência a essa alocação NULL . Normalmente, o driver deve usar o primeiro elemento da lista de alocação (elemento 0) como o elemento NULL .

Quando o driver de miniporto de exibição converte um buffer de comando para um buffer DMA, o driver de miniporto de exibição e o driver de exibição no modo de usuário devem executar as seguintes ações para as seguintes situações:

  • No modo DMA do contrato garantido (para obter mais informações, consulte Usando o modelo de buffer DMA do contrato garantido), o driver de exibição no modo de usuário deve garantir recursos suficientes para o comando de tradução. Se recursos suficientes não existirem para a tradução, o driver de miniporto de exibição deverá rejeitar o buffer de DMA.

  • O driver de exibição no modo de usuário sempre deve dividir comandos que podem ser convertidos em mais do que o tamanho de um único buffer DMA porque a função DxgkDdiRender do driver de miniporto de exibição não pode manipular um único comando maior que o tamanho do buffer DMA e que não pode ser dividido.

DxgkDdiRender deve ser tornado pageable.

O suporte para a função DxgkDdiRenderKm foi adicionado a partir do Windows 7 para adaptadores de exibição que dão suporte à Aceleração de Hardware GDI.

Requisitos

   
Cliente mínimo com suporte Disponível a partir do Windows Vista
Plataforma de Destino Desktop
Cabeçalho d3dkmddi.h
IRQL PASSIVE_LEVEL

Confira também

D3DDDI_ALLOCATIONLIST

DXGKARG_CREATECONTEXT

DXGKARG_CREATEDEVICE

DXGKARG_RENDER

DXGK_ALLOCATIONLIST

DxgkDdiCreateContext

DxgkDdiCreateDevice

DxgkDdiOpenAllocation

DxgkDdiPatch

DxgkDdiRenderKm