Pular para o conteúdo principal
Obtém um ponteiro de CPU para o sub-recurso especificado no recurso, mas pode não divulgar o valor do ponteiro para os aplicativos. Map também invalida o cache da CPU, quando necessário, para que as leituras da CPU nesse endereço reflitam quaisquer modificações feitas pela GPU.

Sintaxe

Parâmetros

Subresource
Tipo: UINT
Especifica o número de índice do sub-recurso. pReadRange [in, optional]
Tipo: const D3D12_RANGE *
Um ponteiro para uma estrutura D3D12_RANGE que descreve o intervalo de memória a ser acessado. Isso indica a região que a CPU pode ler, e as coordenadas são relativas ao sub-recurso. Um ponteiro nulo indica que todo o sub-recurso pode ser lido pela CPU. É válido especificar que a CPU não lerá nenhum dado passando um intervalo em que End seja menor ou igual a Begin. ppData [out, optional]
Tipo: void **
Um ponteiro para um bloco de memória que recebe um ponteiro para os dados do recurso. Um ponteiro nulo é válido e é útil para armazenar em cache um intervalo de endereços virtuais da CPU para métodos como WriteToSubresource. Quando ppData não é NULL, o ponteiro retornado nunca é deslocado por nenhum valor em pReadRange.

Valor retornado

Tipo: HRESULT Este método retorna um dos Códigos de retorno do Direct3D 12.

Comentários

Map e Unmap podem ser chamados com segurança por vários threads. Chamadas aninhadas de Map têm suporte e são contadas por referência. A primeira chamada para Map aloca um intervalo de endereços virtuais da CPU para o recurso. A última chamada para Unmap desaloca o intervalo de endereços virtuais da CPU. O endereço virtual da CPU geralmente é retornado ao aplicativo; mas manipular o conteúdo de texturas com layouts desconhecidos impede a divulgação do endereço virtual da CPU. Consulte WriteToSubresource para obter mais detalhes. Os aplicativos não podem depender de o endereço ser consistente, a menos que Map esteja aninhado de forma persistente. Não há garantia de que os ponteiros retornados por Map tenham todos os recursos de ponteiros normais, mas a maioria dos aplicativos não notará diferença no uso normal. Por exemplo, ponteiros com comportamento WRITE_COMBINE têm garantias de ordenação de memória da CPU mais fracas do que o comportamento WRITE_BACK. Não há garantia de que a memória acessível tanto pela CPU quanto pela GPU compartilhe as mesmas garantias de memória atômica que a CPU tem, devido a limitações do PCIe. Use fences para sincronização. Há duas categorias de modelo de uso para Map: simples e avançado. Os modelos de uso simples maximizam o desempenho das ferramentas, portanto recomenda-se que os aplicativos se mantenham nos modelos simples até que se comprove que os modelos avançados são necessários para o aplicativo.

Modelos de uso simples

Os aplicativos devem se ater às abstrações de tipo de heap UPLOAD, DEFAULT e READBACK, para oferecer suporte razoavelmente bom a todas as arquiteturas de adaptador.
Os aplicativos devem evitar leituras da CPU a partir de ponteiros para recursos em heaps UPLOAD, mesmo que acidentalmente. As leituras da CPU funcionarão, mas são proibitivamente lentas em muitas arquiteturas de GPU comuns, portanto considere o seguinte:
  • Não faça a CPU ler recursos associados a heaps que sejam D3D12_HEAP_TYPE_UPLOAD ou que tenham D3D12_CPU_PAGE_PROPERTY_WRITE_COMBINE.
  • A região de memória para a qual pData aponta pode ser alocada com PAGE_WRITECOMBINE, e seu aplicativo deve respeitar todas as restrições associadas a essa memória.
  • Até mesmo o código C++ a seguir pode ler da memória e provocar a penalidade de desempenho, porque o código pode se expandir para o código de assembly x86 a seguir.Código C++:
    Código de assembly x86:
  • Use as configurações de otimização e as construções de linguagem apropriadas para ajudar a evitar essa penalidade de desempenho. Por exemplo, você pode evitar a otimização xor usando um ponteiro volatile ou otimizando para velocidade de código em vez de tamanho de código.
Recomenda-se que os aplicativos deixem os recursos sem mapeamento enquanto a CPU não os modificar e usem intervalos precisos e restritos o tempo todo. Isso habilita os modos mais rápidos para ferramentas, como a Depuração de gráficos e a camada de depuração. Essas ferramentas precisam rastrear todas as modificações da CPU na memória que a GPU possa ler.

Modelos de uso avançados

Recursos em heaps acessíveis pela CPU podem ser mapeados de forma persistente, o que significa que Map pode ser chamado uma vez, imediatamente após a criação do recurso. Unmap nunca precisa ser chamado, mas o endereço retornado por Map não deve mais ser usado depois que a última referência ao recurso for liberada. Ao usar o mapeamento persistente, o aplicativo deve garantir que a CPU termine de gravar os dados na memória antes que a GPU execute uma lista de comandos que leia ou grave essa memória. Em cenários comuns, o aplicativo precisa apenas gravar na memória antes de chamar ExecuteCommandLists; mas usar uma fence para atrasar a execução da lista de comandos também funciona.
Todos os tipos de memória acessíveis pela CPU dão suporte ao uso de mapeamento persistente, em que o recurso é mapeado, mas nunca tem o mapeamento desfeito, desde que o aplicativo não acesse o ponteiro após o recurso ter sido descartado.

Exemplos

O exemplo D3D12Bundles usa ID3D12Resource::Map da seguinte maneira: Copie os dados do triângulo para o buffer de vértices.
Crie um heap de upload para os buffers de constantes.
Consulte o Código de exemplo na referência do D3D12.

Requisitos

Cabeçalho: d3d12_xs.h ou d3d12_x.h
Biblioteca: d3d12_xs.lib ou d3d12_x.lib
Plataformas com suporte: consoles XBOX Series e família XBOX One

Confira também

ID3D12Resource Sub-recursos Unmap
Última modificação em 6 de outubro de 2026