Compartilhar via


Usar segmentos de memória para descrever o espaço de endereço da GPU

O gerenciador de memória de vídeo (VidMm) é responsável por gerenciar o espaço de endereço da GPU. Antes de fazer isso, o driver da miniporta de exibição no modo kernel (KMD) deve descrever o espaço de endereço da GPU para VidMm usando segmentos de memória.

O KMD cria segmentos de memória para generalizar e virtualizar recursos de memória de vídeo. Ele pode configurar segmentos de memória de acordo com os tipos de memória que o hardware suporta (por exemplo, memória de buffer de quadros ou abertura de memória do sistema).

Durante a inicialização do driver, o KMD deve retornar a lista de tipos de segmento que descrevem como VidMm pode gerenciar recursos de memória. O KMD especifica o número de tipos de segmento aos quais ele dá suporte e descreve cada tipo de segmento respondendo a chamadas para sua função DxgkDdiQueryAdapterInfo. O driver descreve cada segmento usando uma estrutura DXGK_SEGMENTDESCRIPTOR. Para obter mais informações, consulte Inicializando o uso de segmentos de memória.

Depois disso, o número e os tipos de segmentos permanecem inalterados. VidMm:

  • Garante que cada processo receba uma parcela justa dos recursos em qualquer segmento específico,

  • Gerencia todos os segmentos de forma independente.

Os segmentos não se sobrepõem. Portanto, VidMm pode alocar uma quantidade razoável de recursos de memória de vídeo de um segmento, independentemente da quantidade de recursos que um aplicativo detém de outro segmento.

O KMD atribui um identificador de segmento a cada um de seus segmentos de memória. Posteriormente, quando VidMm solicitar a criação de alocações para recursos de vídeo e renderizar esses recursos, o KMD:

  • Identifica os segmentos que dão suporte à solicitação.

  • Especifica, em ordem, os segmentos que o driver prefere que VidMm use.

Para obter mais informações, consulte Especificação de segmentos ao criar alocações.

O KMD não é necessário para especificar todos os recursos de memória de vídeo disponíveis para a GPU em seus segmentos de memória. No entanto, o KMD deve especificar todos os recursos de memória que VidMm gerencia entre todos os processos em execução no sistema. Por exemplo:

  • Um microcódigo de sombreador de vértice que implementa um pipeline de função fixa pode residir no espaço de endereço da GPU, mas fora da memória que VidMm gerencia (ou seja, não faz parte de um segmento). Essa configuração é possível porque o microcódigo está sempre disponível para todos os processos e nunca é a fonte de contenção entre os processos.

  • Para recursos como buffers de vértice, texturas, destinos de renderização e código de sombreador específico do aplicativo, VidMm deve alocar recursos de memória de vídeo de um dos segmentos de memória do driver. Esse requisito ocorre porque os tipos de recursos devem estar disponíveis de forma justa para todos os processos.

A figura a seguir mostra um exemplo de como um KMD pode configurar segmentos de memória do espaço de endereço da GPU.

Diagrama que ilustra a divisão do espaço de endereço da GPU em segmentos de memória.

Os números na figura correspondem aos seguintes segmentos de memória:

  1. O segmento linear acessível pela CPU: esse segmento é acessível pela CPU e é organizado como um espaço de endereço linear.

  2. Segmento linear não acessível à CPU: esse segmento é organizado como um espaço de endereço linear, mas não pode ser acessado pela CPU. Ele é usado para recursos que não exigem acesso à CPU.

  3. Segmento de abertura AGP somente de leitura: esse segmento é usado para acesso somente de leitura à memória AGP (porta de gráficos acelerados).

  4. Segmento de abertura: esse segmento é usado para recursos acessados por meio da abertura da AGP.

As caixas ocultas representam segmentos de memória que o KMD não expõe ao VidMm. Memória de vídeo que está oculta de VidMm não pode ser mapeado no espaço do usuário ou disponibilizado exclusivamente para qualquer processo específico. Isso quebra as regras fundamentais da memória virtual que exigem que todos os processos em execução no sistema tenham acesso a toda a memória.