Compartilhar via


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

A função DxgkDdiAcquireSwizzlingRange torna uma alocação acessível por meio da abertura da CPU (unidade de processamento central) para o segmento especificado.

Sintaxe

DXGKDDI_ACQUIRESWIZZLINGRANGE DxgkddiAcquireswizzlingrange;

NTSTATUS DxgkddiAcquireswizzlingrange(
  [in]     IN_CONST_HANDLE hAdapter,
  [in/out] INOUT_PDXGKARG_ACQUIRESWIZZLINGRANGE pAcquireSwizzlingRange
)
{...}

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] pAcquireSwizzlingRange

Um ponteiro para uma estrutura DXGKARG_ACQUIRESWIZZLINGRANGE que contém informações para tornar uma alocação acessível por meio da abertura da CPU.

Retornar valor

DxgkDdiAcquireSwizzlingRange retorna um dos seguintes valores:

Código de retorno Descrição
STATUS_SUCCESS DxgkDdiAcquireSwizzlingRange tornou a alocação acessível com êxito.
STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNSUPPORTED DxgkDdiAcquireSwizzlingRange não pôde programar o intervalo de giro para a alocação. O gerenciador de memória de vídeo não consegue adquirir o intervalo de giro sem fazer mais tentativas.
STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNAVAILABLE DxgkDdiAcquireSwizzlingRange não pôde programar o intervalo de giro para a alocação porque outro intervalo de swizzling está usando atualmente os recursos de GPU (unidade de processamento gráfico) necessários. O gerenciador de memória de vídeo tenta liberar um intervalo que está em uso no momento e tenta configurar o intervalo de giro novamente.

Comentários

A função DxgkDdiAcquireSwizzlingRange é chamada depois que o driver de exibição no modo de usuário solicita um endereço virtual que faz referência aos bits de uma alocação (ou seja, depois que o driver de exibição do modo de usuário chama a função pfnLockCb com o sinalizador de campo de bit AcquireAperture definido no membro Flags da estrutura D3DDDICB_LOCK e enquanto a alocação está localizada atualmente em um segmento de memória acessível pela CPU). Se o sinalizador de campo de bit AcquireAperture não estiver definido na chamada para pfnLockCb, DxgkDdiAcquireSwizzlingRange não será chamado e a alocação deverá estar em um formato que o driver de exibição do modo de usuário ou um aplicativo possa processar.

Quando DxgkDdiAcquireSwizzlingRange é chamado, o driver de miniporta de exibição deve tornar a alocação especificada (ou seja, o membro hAllocation da estrutura DXGKARG_ACQUIRESWIZZLINGRANGE para a qual o parâmetro pAcquireSwizzlingRange aponta) acessível por meio da abertura de CPU para o segmento especificado (ou seja, o membro SegmentId de DXGKARG_ACQUIRESWIZZLINGRANGE). A alocação deve aparecer exatamente como aparece na memória do computador após uma remoção deswizzling.

Nem todas as solicitações do driver de exibição no modo de usuário são acessíveis para o driver de miniporta de exibição. Os intervalos de giro adquiridos pelo gerenciador de memória de vídeo são armazenados em cache com base na alocação à qual estão associados e nos dados privados especificados. Na primeira solicitação do driver de exibição do modo de usuário para acessar uma alocação, a função DxgkDdiAcquireSwizzlingRange do driver de miniporta de exibição é chamada para tornar a alocação acessível. Em solicitações subsequentes com dados privados correspondentes, o mapeamento de configuração anterior é usado para acessar a alocação.

O gerenciador de memória de vídeo chama a função DxgkDdiReleaseSwizzlingRange do driver de miniporta de exibição para liberar um intervalo de swizzling quando uma alocação é removida ou destruída ou quando outra alocação requer uma abertura. Uma alocação pode ser associada a qualquer número de intervalos de giro (por exemplo, uma abertura por nível de MIP).

O número de intervalos giratórios aos quais um adaptador dá suporte é exposto pelo driver no membro NumberOfSwizzlingRanges da estrutura DXGK_DRIVERCAPS quando a função DxgkDdiQueryAdapterInfo do driver é chamada. Todos os intervalos são iguais (ou seja, qualquer intervalo pode deswizzle ou untile qualquer tipo de swizzling ou tiling). O gerenciador de memória de vídeo arbitra os intervalos de giro disponíveis entre todos os aplicativos que os exigem.

O driver deve usar MMIO (E/S mapeada na memória) para configurar um intervalo de giro. Esses acessos de intervalo de swizzling não devem interferir na execução da GPU (ou seja, a GPU não deve estar ociosa quando DxgkDdiAcquireSwizzlingRange é chamado).

Todas as chamadas para DxgkDdiAcquireSwizzlingRange são serializadas entre si, mas não com nenhuma outra função DDI.

Se a GPU der suporte a intervalos giratórios que redirecionam acessos de CPU para segmentos de memória não acessíveis à CPU ou memória do sistema, o driver de exibição do modo de usuário poderá definir a combinação de sinalizadores de campo de bit AcquireAperture e UseAlternateVA no membro Flags da estrutura D3DDDICB_LOCK em uma chamada para a função pfnLockCb para bloquear a alocação. Nessa situação, o gerenciador de memória de vídeo chama a função DxgkDdiAcquireSwizzlingRange do driver de miniporta de exibição para adquirir um intervalo de giro para a alocação, embora a alocação esteja localizada em um segmento de memória não acessível pela CPU ou em um segmento de abertura. Os intervalos de giro são associados a alguns recursos de GPU (por exemplo, intervalos de abertura de PCI) que o driver gerencia e não são acessíveis ou contabilizados pelo gerenciador de memória de vídeo.

Uma chamada para DxgkDdiAcquireSwizzlingRange para adquirir um intervalo de swizzling pode falhar porque um recurso gerenciado pelo driver acabou. Embora o intervalo de swizzling em si seja gratuito, ele pode não ser utilizável devido ao recurso ausente. O driver pode indicar que um intervalo de giro não está disponível para o gerenciador de memória de vídeo retornando STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNAVAILABLE de DxgkDdiAcquireSwizzlingRange. Em seguida, o gerenciador de memória de vídeo tenta liberar um intervalo giratório que está em uso no momento e, em seguida, chama a função DxgkDdiAcquireSwizzlingRange do driver novamente para configurar o novo intervalo de giro. Se todos os intervalos de giro forem liberados e o driver ainda falhar com STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNAVAILABLE, o gerenciador de memória de vídeo não conseguirá adquirir um intervalo de giro para a alocação.

DxgkDdiAcquireSwizzlingRange 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
IRQL PASSIVE_LEVEL

Confira também

D3DDDICB_LOCK

DXGKARG_ACQUIRESWIZZLINGRANGE

DXGK_DRIVERCAPS

DxgkDdiAddDevice

DxgkDdiCreateAllocation

DxgkDdiQueryAdapterInfo

DxgkDdiReleaseSwizzlingRange

pfnLockCb