Sintaxe
Parâmetros
SubresourceTipo: 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.
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.Requisitos
Cabeçalho: d3d12_xs.h ou d3d12_x.hBiblioteca: d3d12_xs.lib ou d3d12_x.lib
Plataformas com suporte: consoles XBOX Series e família XBOX One
