Compartilhar via


Bloquear alocações com swizzled

O gerenciador de memória de vídeo fornece suporte especial para acesso direto à CPU a alocações giradas (ou seja, alocações nas quais a função DxgkDdiCreateAllocation do driver de miniporta de vídeo define o sinalizador Swizzled no membro Flags da estrutura DXGK_ALLOCATIONINFO ).

Quando o gerenciador de memória de vídeo remove alocações acessíveis à CPU que não são marcadas pelo driver como deslizadas de um segmento de memória, o driver de miniporta de exibição sempre deve armazená-las em um formato linear. Portanto, essas alocações não podem ser giradas enquanto estão localizadas em um segmento de abertura e sempre devem ser giradas ou deswizzled pela função DxgkDdiBuildPagingBuffer do driver.

Por outro lado, as alocações marcadas como deslizadas não precisam ser sempre armazenadas em um formato linear quando removidas de um segmento de memória. Para essas alocações, o gerenciador de memória de vídeo rastreia o estado de giro dessas alocações e requer apenas a função DxgkDdiBuildPagingBuffer do driver para deswizzle uma alocação durante determinadas operações de transferência.

Depois que o driver de exibição do modo de usuário chama a função pfnLockCb do runtime do Microsoft Direct3D, o gerenciador de memória de vídeo e o driver de miniporta de exibição se comportam das seguintes maneiras, dependendo do estado da alocação:

  1. Alocação localizada em um segmento de memória

    O gerenciador de memória de vídeo tenta adquirir uma abertura de CPU para fornecer acesso linear à alocação. Se o gerenciador de memória de vídeo não puder adquirir a abertura, o gerenciador de memória de vídeo removerá a alocação de volta para a memória do sistema (a menos que o driver defina o membro DonotEvict da estrutura D3DDDICB_LOCKFLAGS ). Quando o gerenciador de memória de vídeo chama a função DxgkDdiBuildPagingBuffer do driver de miniporta de exibição para transferir a alocação, o driver de miniporto de exibição deve desativar a alocação.

  2. Alocação removida (girada) ou localizada em um segmento de abertura

    A alocação deve ser deswizzled antes que a CPU possa acessá-la. Portanto, o gerenciador de memória de vídeo primeiro tenta paginar na alocação em um segmento de memória. Depois que a alocação estiver localizada em um segmento de memória, o gerenciador de memória de vídeo e o driver de miniporto de exibição se comportarão como no número 1.

  3. Alocação removida (deswizzled)

    Se a alocação já estiver deswizzled para a memória do sistema, o gerenciador de memória de vídeo retornará o ponteiro de alocação existente sem processamento adicional.

    Para que a GPU use uma alocação que antes era deswizzled, a alocação deve ser rewizzled antes que a GPU a use. Portanto, em uma falha de superfície, o gerenciador de memória de vídeo e o driver de miniporta de vídeo se comportam das seguintes maneiras:

    • Alocação em um segmento de memória (deswizzled em tempo real pela abertura da CPU)

      A alocação já está em um formato giratório que a GPU pode processar. Portanto, nenhum processamento adicional é exigido pelo gerenciador de memória de vídeo.

    • Alocação removida para a memória do sistema (deswizzled)

      As páginas da alocação contêm dados deswizzled e não podem ser mapeadas em um segmento de abertura. Portanto, a alocação deve ser paginada em um segmento de memória. Quando o gerenciador de memória de vídeo chama a função DxgkDdiBuildPagingBuffer do driver de miniporta de exibição para paginar na alocação, o gerenciador de memória de vídeo solicita que o driver de miniporto de exibição gire a alocação.

Nota Depois que uma alocação girada estiver sob acesso à CPU por meio de uma abertura de CPU, ela ainda poderá ser removida antes que o driver de exibição do modo de usuário encerre o acesso à CPU. Esse caso é tratado como no número 2. A remoção é executada de forma a ser invisível para o aplicativo e o driver de exibição no modo de usuário. Além disso, um bloqueio sem substituição (ou seja, um bloqueio obtido pela configuração do membro IgnoreSync de D3DDDICB_LOCKFLAGS) não é permitido em uma alocação girada. Somente a CPU ou a GPU podem acessar essa alocação a qualquer momento.