Compartilhar via


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

A função DxgkDdiQueryCurrentFence consulta o identificador de cerca de envio concluído mais recentemente na unidade de execução do comando de hardware.

Sintaxe

DXGKDDI_QUERYCURRENTFENCE DxgkddiQuerycurrentfence;

NTSTATUS DxgkddiQuerycurrentfence(
  [in]     IN_CONST_HANDLE hAdapter,
  [in/out] INOUT_PDXGKARG_QUERYCURRENTFENCE pCurrentFence
)
{...}

Parâmetros

[in] hAdapter

Um identificador para um bloco de contexto associado a um adaptador de exibição. O driver de miniporta de exibição anteriormente forneceu esse identificador para o subsistema kernel de elementos gráficos do Microsoft DirectX no parâmetro de saída MiniportDeviceContext da função DxgkDdiAddDevice .

[in/out] pCurrentFence

Um ponteiro para uma estrutura DXGKARG_QUERYCURRENTFENCE que contém informações sobre os dados de limite atuais.

Retornar valor

DxgkDdiQueryCurrentFence retorna STATUS_SUCCESS ou um resultado de erro apropriado se os dados de limite não forem recuperados com êxito.

Comentários

Uma cerca é uma instrução que contém 64 bits de dados e um endereço. O driver de miniporta de exibição pode inserir uma cerca no fluxo de DMA (acesso direto à memória) que é enviado para a GPU (unidade de processamento gráfico). Quando a GPU lê a cerca, a GPU grava os dados de cerca no endereço de cerca especificado. No entanto, antes que a GPU possa gravar os dados de cerca na memória, ela deve garantir que todos os pixels dos primitivos que precedem a instrução de cerca sejam desativados e gravados corretamente na memória.

Nota A GPU não é necessária para parar todo o pipeline enquanto aguarda o último pixel dos primitivos que precedem a instrução de cerca para desativar; em vez disso, a GPU pode executar os primitivos que seguem a instrução de cerca.
 
O hardware que dá suporte ao espaço de endereço virtual por contexto de GPU deve dar suporte aos seguintes tipos de limite:
  • Cercas regulares são cercas que podem ser inseridas em um buffer de AMD criado no modo de usuário. Como o conteúdo de um buffer de DMA do modo de usuário não é confiável, as restrições dentro desse buffer de DMA devem se referir a um endereço virtual no espaço de endereço de contexto da GPU e não a um endereço físico. O acesso a esse endereço virtual é associado pelo mesmo mecanismo de validação de memória que qualquer outro endereço virtual que a GPU acessa.
  • As cercas privilegiadas são cercas que só podem ser inseridas em um buffer de AMD criado (e acessível somente) no modo kernel. As cercas dentro desse buffer de AMD referem-se a um endereço físico na memória.

    Observe que, se o endereço de destino da cerca estivesse acessível no modo de usuário, o software mal-intencionado poderia executar uma operação gráfica sobre o local de memória da cerca e, portanto, substituir o conteúdo do que o kernel esperava receber.

Observe que um buffer de DMA privilegiado pode conter cercas regulares e privilegiadas. No entanto, se um buffer de DMA privilegiado contiver uma cerca regular, o componente de kernel que gerou esse buffer de AMD estará ciente de que a cerca regular dentro pode nunca estar acessível.

Se o driver do miniporto de exibição tiver perdido a última cerca de um buffer DMA, a função DxgkDdiQueryCurrentFence do driver poderá ser chamada para relatar a cerca perdida. Por exemplo, se o hardware gerar uma cerca na memória, a função DxgkDdiInterruptRoutine do driver será disparada para ler a memória. No entanto, se os dados da cerca não estiverem disponíveis quando o driver tentar ler os dados (por exemplo, se houver um chipset defeituoso), a cerca normalmente será relatada na próxima interrupção, a menos que as interrupções tenham sido interrompidas. Se as interrupções forem interrompidas e o subsistema de kernel de elementos gráficos DirectX aguardar muito tempo por uma cerca, o subsistema chamará a função DxgkDdiQueryCurrentFence do driver para verificar a cerca atual e determinar qualquer cerca pendente que possa ter perdido.

Antes que o driver de miniporta de exibição retorne de uma chamada para DxgkDdiQueryCurrentFence, se o identificador de cerca de envio concluído por hardware mais recente ainda não tiver sido relatado, o driver deverá chamar a função DxgkCbNotifyInterrupt para relatar a cerca. Para implementar essa funcionalidade, o driver:

  1. Rastreia qual cerca foi relatada pela última vez ao sistema operacional.
  2. Gera a interrupção do IRQL para o dispositivo. Para elevar o IRQL ao nível de interrupção, o driver pode chamar a função DxgkCbSynchronizeExecution para sincronizar com sua função DxgkDdiInterruptRoutine .
  3. No IRQL de interrupção do dispositivo, compara a última cerca relatada com a cerca mais recente concluída por hardware.
  4. No IRQL de interrupção do dispositivo, chama DxgkCbNotifyInterrupt somente quando a cerca de hardware mais recente concluída é mais recente do que a última cerca relatada.
DxgkDdiQueryCurrentFence deve ser tornado paginável.

Requisitos

Requisito Valor
Cliente mínimo com suporte Windows Vista
Plataforma de Destino Área de Trabalho
Cabeçalho d3dkmddi.h (inclua D3dkmddi.h)
IRQL PASSIVE_LEVEL

Confira também

DXGKARG_QUERYCURRENTFENCE

DxgkCbNotifyInterrupt

DxgkCbSynchronizeExecution

DxgkDdiAddDevice

DxgkDdiInterruptRoutine