> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# D3D12_FEATURE_DATA_ARCHITECTURE1

> Fornece detalhes sobre a arquitetura de cada adaptador, para que seu aplicativo possa otimizar melhor determinadas propriedades do adaptador.

Fornece detalhes sobre a arquitetura de cada adaptador, para que seu aplicativo possa otimizar melhor determinadas propriedades do adaptador.
<div class="alert">**Observação**  Esta estrutura, introduzida no Windows 10, versão 1703 (Creators Update), substitui a estrutura [D3D12\_FEATURE\_DATA\_ARCHITECTURE](/pt-BR/reference/graphics/d3d12/structs/d3d12_feature_data_architecture_public). Se o seu aplicativo for destinado ao Windows 10, versão 1703 (Creators Update) ou superior, use **D3D12\_FEATURE\_DATA\_ARCHITECTURE1** (e [D3D12\_FEATURE\_ARCHITECTURE1](/pt-BR/reference/graphics/d3d12/enums/d3d12_feature_public)).</div><div> </div>

## Sintaxe

```cpp theme={null}
typedef struct D3D12_FEATURE_DATA_ARCHITECTURE1
{
    UINT NodeIndex;
    BOOL TileBasedRenderer;
    BOOL UMA;
    BOOL CacheCoherentUMA;
    BOOL IsolatedMMU;
} D3D12_FEATURE_DATA_ARCHITECTURE1
```

### Membros

*NodeIndex*\
Tipo: UINT

Em operação com vários adaptadores, indica qual adaptador físico do dispositivo é relevante.
Consulte [Sistemas com vários adaptadores](https://learn.microsoft.com/en-us/windows/win32/direct3d12/multi-engine).
**NodeIndex** é preenchido pelo aplicativo antes de chamar [CheckFeatureSupport](/pt-BR/reference/graphics/d3d12/interfaces/id3d12device/methods/id3d12device_checkfeaturesupport_public), pois o aplicativo pode obter detalhes sobre a arquitetura de cada adaptador.

*TileBasedRenderer*\
Tipo: BOOL

Especifica se o hardware e o driver dão suporte a um renderizador baseado em blocos.
O runtime define esse membro como **TRUE** se o hardware e o driver derem suporte a um renderizador baseado em blocos.

*UMA*\
Tipo: BOOL

Especifica se o hardware e o driver dão suporte a UMA.
O runtime define esse membro como **TRUE** se o hardware e o driver derem suporte a UMA.

*CacheCoherentUMA*\
Tipo: BOOL

Especifica se o hardware e o driver dão suporte a UMA com coerência de cache.
O runtime define esse membro como **TRUE** se o hardware e o driver derem suporte a UMA com coerência de cache.

*IsolatedMMU*\
Tipo: BOOL

[SAL](https://learn.microsoft.com/en-us/visualstudio/code-quality/annotating-structs-and-classes): <code>*Out*</code>

Especifica se o hardware e o driver dão suporte a uma MMU (Unidade de Gerenciamento de Memória) isolada.
O runtime define esse membro como **TRUE** se a GPU respeitar propriedades da tabela de páginas da CPU como **MEM\_WRITE\_WATCH** (para obter mais informações, consulte [VirtualAlloc](https://learn.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-virtualalloc)) e **PAGE\_READONLY** (para obter mais informações, consulte [Constantes de proteção de memória](https://learn.microsoft.com/en-us/windows/win32/Memory/memory-protection-constants)).

Se for **TRUE**, o aplicativo deverá ter o cuidado de não usar memória com essas propriedades de tabela de páginas com a GPU, pois a GPU pode acionar essas propriedades de tabela de páginas de maneiras inesperadas. Por exemplo, as operações de gravação da GPU podem ser menos granulares do que o aplicativo espera, especialmente gravações feitas dentro de sombreadores. Determinadas páginas com observação de gravação (write-watch) podem parecer sujas, mesmo quando não é óbvio como as gravações da GPU podem tê-las afetado. As operações da GPU associadas a cenários de uso de heaps de upload e de readback funcionam bem com páginas com observação de gravação, mas podem ocasionalmente gerar falsos positivos que podem ser ignorados com segurança.

## Comentários

<h3><a id="How_to_use_UMA_and_CacheCoherentUMA" /><a id="how_to_use_uma_and_cachecoherentuma" /><a id="HOW_TO_USE_UMA_AND_CACHECOHERENTUMA" />Como usar UMA e CacheCoherentUMA</h3>
Os aplicativos D3D12 devem se preocupar em gerenciar a residência de memória e fornecer as propriedades de heap ideais.
Os aplicativos D3D12 podem permanecer simplificados e ser executados razoavelmente bem em muitas arquiteturas de GPU gerenciando apenas a residência dos recursos em heaps [D3D12\_HEAP\_TYPE](/pt-BR/reference/graphics/d3d12/enums/d3d12_heap_type_public)\_DEFAULT.
Esses aplicativos só precisam chamar [IDXGIAdapter3::QueryVideoMemoryInfo](https://learn.microsoft.com/en-us/windows/win32/api/dxgi1_4/nf-dxgi1_4-idxgiadapter3-queryvideomemoryinfo) para DXGI\_MEMORY\_SEGMENT\_GROUP\_LOCAL,
e devem tolerar que D3D12\_HEAP\_TYPE\_UPLOAD e D3D12\_HEAP\_TYPE\_READBACK venham desse mesmo grupo de segmentos de memória.

No entanto, um design tão simples é restritivo demais para aplicativos que levam os limites ao máximo.
Por isso, D3D12\_FEATURE\_DATA\_ARCHITECTURE ajuda os aplicativos a otimizar melhor para as propriedades do adaptador subjacente.

Alguns aplicativos podem querer otimizar melhor para adaptadores discretos e assumir a complexidade adicional de gerenciar os orçamentos tanto de memória do sistema quanto de memória de vídeo.
Se o tamanho dos heaps de upload rivalizar com o tamanho das texturas padrão, é possível obter quase o dobro de utilização da memória.
Ao oferecer suporte a essas otimizações, um aplicativo pode detectar dois orçamentos de residência ou reconhecer que **UMA** é **false**.

Alguns aplicativos podem querer otimizar melhor para adaptadores integrados/UMA, especialmente aqueles interessados em prolongar a vida útil da bateria em dispositivos móveis.
Aplicativos D3D12 simples são forçados a copiar dados entre heaps com atribuições diferentes, quando isso nem sempre é necessário em UMA.
No entanto, a propriedade UMA, por si só, abrange uma área cinzenta razoavelmente vaga de designs de GPU.
Não presuma que UMA significa que toda a memória acessível pela GPU pode ser livremente tornada acessível pela CPU, porque não significa.
Existe uma propriedade que se alinha mais a esse tipo de raciocínio: **CacheCoherentUMA**.

Quando **CacheCoherentUMA** é **false**, um único orçamento de residência está disponível, mas o design UMA normalmente se beneficia das três atribuições de heap.
Existem oportunidades de eliminar a cópia de recursos por meio do uso criterioso de recursos e heaps de upload e de readback, que fornecem acesso da CPU à memória.
No entanto, essas oportunidades não são bem definidas.
Portanto, os aplicativos devem ser cautelosos; e é aconselhável experimentar em diversos sistemas "UMA", pois pode ser justificável recorrer à habilitação ou exclusão de determinadas IDs de dispositivo.
Recomenda-se compreender a arquitetura de memória da GPU e como os tipos de heap se traduzem em propriedades de cache.
A viabilidade do sucesso provavelmente depende da frequência com que cada processador lê ou grava os dados, do tamanho e da localidade dos acessos aos dados etc.
Para desenvolvedores avançados: quando **UMA** é true e **CacheCoherentUMA** é **false**, a característica mais singular desses adaptadores é que os heaps de upload ainda usam combinação de gravação (write-combine).
No entanto, alguns adaptadores UMA se beneficiam tanto da propriedade sem acesso da CPU quanto da propriedade de combinação de gravação dos heaps padrão e de upload.
Consulte [GetCustomHeapProperties](/pt-BR/reference/graphics/d3d12/interfaces/id3d12device/methods/id3d12device_getcustomheapproperties_public) para obter mais detalhes.

Quando **CacheCoherentUMA** é true, os aplicativos podem considerar com mais convicção abandonar a atribuição de heaps e usar em todos os lugares o equivalente de heap personalizado dos heaps de upload.
Otimizações de UMA sem cópia, como as oferecidas por
[WriteToSubresource](/pt-BR/reference/graphics/d3d12/interfaces/id3d12resource/methods/id3d12resource_writetosubresource_public), são mais incentivadas de modo geral, pois mais cenários simplesmente se beneficiarão do uso compartilhado.
O modelo de memória é muito propício a mais cenários e a uma adoção mais ampla.
Ainda podem existir alguns casos extremos em que os benefícios não são obtidos com facilidade, mas eles devem ser muito mais raros e menos prejudiciais do que outras opções.
Para desenvolvedores avançados: **CacheCoherentUMA** significa que uma quantidade significativa dos caches na hierarquia de memória também é unificada ou integrada entre a CPU e a GPU.
A característica observável mais singular é que os heaps de upload, na verdade, usam write-back em **CacheCoherentUMA**.
Para essas arquiteturas, o uso de combinação de gravação em heaps de upload costuma ser prejudicial.

Os detalhes de baixo nível devem ser ignorados pela grande maioria dos aplicativos com um único adaptador.
Como de costume, aplicativos com um único adaptador podem simplificar o cenário e garantir que as gravações da CPU em heaps de upload usem padrões compatíveis com a combinação de gravação.
Os detalhes de nível inferior ajudam a reforçar os conceitos para aplicativos com vários adaptadores.
Aplicativos com vários adaptadores provavelmente precisam entender as propriedades da arquitetura do adaptador bem o suficiente para escolher as propriedades de heap personalizado ideais para mover dados entre adaptadores com eficiência.

## 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

[Estruturas principais](https://learn.microsoft.com/en-us/windows/win32/direct3d12/direct3d-12-structures)

[D3D12\_FEATURE](/pt-BR/reference/graphics/d3d12/enums/d3d12_feature_public)


## Related topics

- [D3D12_FEATURE_DATA_ARCHITECTURE](/pt-BR/reference/graphics/d3d12/structs/d3d12_feature_data_architecture_public.md)
- [D3D12_FEATURE](/pt-BR/reference/graphics/d3d12/enums/d3d12_feature_public.md)
- [D3D12_DESCRIPTOR_RANGE1](/pt-BR/reference/graphics/d3d12/structs/d3d12_descriptor_range1_public.md)
- [D3D12_ROOT_DESCRIPTOR_TABLE1](/pt-BR/reference/graphics/d3d12/structs/d3d12_root_descriptor_table1_public.md)
- [D3D12_FEATURE_DATA_D3D12_OPTIONS](/pt-BR/reference/graphics/d3d12/structs/d3d12_feature_data_d3d12_options_public.md)
