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

# Visão geral da API do Direct3D 12 para Sampler Feedback

> Visão geral da API do Direct3D 12 para Sampler Feedback

O conjunto de APIs de suporte ao Sampler Feedback tem as mesmas APIs no XBOX e no Direct3D 12 para PC, com extensões do XBOX para quaisquer recursos de hardware do XBOX Series X|S que vão além dos recursos padrão ou que não foram adotados no PC. Em particular, o filtro personalizado de mapa MinMip não será implementado no Direct3D 12 para PC.

O conjunto de APIs de Sampler Feedback fornece a seguinte funcionalidade.

1. Criar um recurso de mapa de feedback, com layout de feedback MinMip ou MipRegionUsed.
2. Criar um descritor de UAV (exibição de acesso não ordenado) para um recurso de mapa de feedback.
3. Copiar dados de um recurso de mapa de feedback para um UAV padrão (ou vice-versa), para leitura dos dados de sampler feedback pela CPU/GPU.

As APIs de extensão do XBOX fornecem a seguinte funcionalidade.

1. Criar um descritor de SRV (exibição de recurso de sombreador) para um mapa MinMip.
2. Criar um descritor de sampler para filtragem de mapa MinMip.
3. Criar um descritor de UAV para um recurso de mapa de feedback, usando parâmetros de exibição adicionais.
4. Permitir a criação de recursos de mapa de feedback e o acesso direto da CPU/GPU a esses recursos, sem usar as abstrações de formato e layout de recursos de feedback do conjunto de APIs padrão.

### Novos métodos de ID3D12Device8 para recursos e exibições de mapas de feedback

Usando a API padrão do Direct3D 12, os mapas de feedback são criados por meio de uma abstração. Os recursos têm dimensões lógicas e um tipo de mapa de feedback conhecidos pelo título, mas as dimensões físicas e o formato de hardware são conhecidos apenas pelo driver. Essa abstração permite o suporte a diversas codificações de mapas de feedback específicas de hardware. No entanto, na GPU do XBOX Series X|S, os mapas de feedback sempre usarão o formato R8\_UINT internamente, e as dimensões físicas do mapa de feedback são calculadas trivialmente a partir das dimensões da textura em blocos divididas pelas dimensões da região de mip do sampler feedback.

```cpp theme={null}
typedef struct D3D12_MIP_REGION
{
    UINT Width;
    UINT Height;
    UINT Depth;
} D3D12_MIP_REGION;

typedef struct D3D12_RESOURCE_DESC1
{
    D3D12_RESOURCE_DIMENSION Dimension;
    UINT64 Alignment;
    UINT64 Width;
    UINT Height;
    UINT16 DepthOrArraySize;
    UINT16 MipLevels;
    DXGI_FORMAT Format;
    DXGI_SAMPLE_DESC SampleDesc;
    D3D12_TEXTURE_LAYOUT Layout;
    D3D12_RESOURCE_FLAGS Flags;
    D3D12_MIP_REGION SamplerFeedbackMipRegion;
} D3D12_RESOURCE_DESC1;

D3D12_RESOURCE_ALLOCATION_INFO ID3D12Device8::GetResourceAllocationInfo2(
    UINT visibleMask,
    UINT numResourceDescs,
    _In_reads_(numResourceDescs) const D3D12_RESOURCE_DESC1* pResourceDescs,
    _Out_writes_opt_(numResourceDescs) D3D12_RESOURCE_ALLOCATION_INFO1* pResourceAllocationInfo1);

HRESULT ID3D12Device8::CreateCommittedResource2(
    _In_ const D3D12_HEAP_PROPERTIES* pHeapProperties,
    D3D12_HEAP_FLAGS HeapFlags,
    _In_ const D3D12_RESOURCE_DESC1* pDesc,
    D3D12_RESOURCE_STATES InitialResourceState,
    _In_opt_ const D3D12_CLEAR_VALUE* pOptimizedClearValue,
    _In_opt_ ID3D12ProtectedResourceSession* pProtectedSession,
    _In_ REFIID riidResource, // Expected: ID3D12Resource1*
    _COM_Outptr_ void** ppvResource);

HRESULT ID3D12Device8::CreatePlacedResource1(
    _In_ ID3D12Heap* pHeap,
    UINT64 HeapOffset,
    _In_ const D3D12_RESOURCE_DESC1* pDesc,
    D3D12_RESOURCE_STATES InitialState,
    _In_opt_ const D3D12_CLEAR_VALUE* pOptimizedClearValue,
    _In_ REFIID riid, // Expected: ID3D12Resource*
    _COM_Outptr_ void** ppvResource);

typedef enum DXGI_FORMAT
{
    ...
    DXGI_FORMAT_SAMPLER_FEEDBACK_MIN_MIP_OPAQUE = 187,
    DXGI_FORMAT_SAMPLER_FEEDBACK_MIP_REGION_USED_OPAQUE  = 188,
    ...
} DXGI_FORMAT;
```

`CreateCommittedResource2` e `CreatePlacedResource1` criam recursos do Direct3D 12 de forma semelhante às APIs existentes `CreateCommittedResource` e `CreatePlacedResource`, com o acréscimo de também poderem criar recursos de mapa de feedback. Uma struct D3D12\_RESOURCE\_DESC1 usada para criar recursos de mapa de feedback deve especificar DXGI\_FORMAT\_SAMPLER\_FEEDBACK\_MIN\_MIP\_OPAQUE ou DXGI\_FORMAT\_SAMPLER\_FEEDBACK\_MIP\_REGION\_USED\_OPAQUE para o formato, bem como D3D12\_TEXTURE\_LAYOUT\_UNKNOWN para o layout. Os campos Width, Height, DepthOrArraySize e MipLevel devem corresponder aos valores da textura em blocos de destino. Cada uma das dimensões de SamplerFeedbackMipRegion deve ser uma potência de dois.

Por exemplo, para criar um mapa de feedback MinMip para uma textura BC1\_UNORM de 4096 × 4096 com mipmaps, usando uma região de mip de 512 × 256 (para que um texel de feedback cubra um bloco de 64 KB no mip 0), a descrição do recurso seria configurada.

```cpp theme={null}
D3D12_RESOURCE_DESC1 MinMipFeedbackDesc = 
{
    D3D12_RESOURCE_DIMENSION_TEXTURE2D,          // Dimension.
    0,                                           // Alignment.
    4096,                                        // Width (of paired tiled texture).
    4096,                                        // Height (of paired tiled texture).
    1,                                           // DepthOrArraySize (of the MinMip feedback map).
    12,                                          // MipLevels (of paired tiled texture).
    DXGI_FORMAT_SAMPLER_FEEDBACK_MIN_MIP_OPAQUE, // Format (of MinMip feedback map).
    { 1, 0 },                                    // SampleDesc.
    D3D12_TEXTURE_LAYOUT_UNKNOWN,                // Layout.
    D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS,  // Flags.
    { 512, 256, 1 }                              // SamplerFeedbackMipRegion (to define the size of the feedback map).
};
```

O mapa de feedback MinMip resultante teria dimensões físicas de 8 × 16, com um nível de mip, o formato R8\_UINT e um layout de textura D3D12XBOX\_TEXTURE\_LAYOUT\_SWIZZLE\_MODE\_256B\_S.

`GetResourceAllocationInfo2` retorna o tamanho e o alinhamento dos recursos com base nas descrições de recursos D3D12\_RESOURCE\_DESC1 de entrada. Essas informações são necessárias para criar mapas de feedback posicionados em ID3D12Heap.

```cpp theme={null}
void ID3D12Device8::CreateSamplerFeedbackUnorderedAccessView(
    _In_opt_ ID3D12Resource* pTargetedResource,
    _In_opt_ ID3D12Resource* pFeedbackResource,
    _In_ D3D12_CPU_DESCRIPTOR_HANDLE DestDescriptor);

void ID3D12Device8::CreateSamplerFeedbackUnorderedAccessViewX(
    _In_opt_ ID3D12Resource* pTargetedResource,
    _In_opt_ ID3D12Resource* pFeedbackResource,
    _In_opt_ const D3D12_UNORDERED_ACCESS_VIEW_DESC* pDesc,
    _In_ D3D12_CPU_DESCRIPTOR_HANDLE DestDescriptor);
```

`CreateSamplerFeedbackUnorderedAccessView` e `CreateSamplerFeedbackUnorderedAccessViewX` criam um descritor de UAV para sampler feedback, com base em um recurso de destino e em um recurso de feedback. A API de extensão também aceita uma descrição de UAV opcional para oferecer suporte a exibições de sub-recursos de recursos de textura de matriz de feedback. Essa API garante que as dimensões do mapa de feedback atendam aos requisitos de hardware de fração em potência de dois para coletar sampler feedback em relação ao recurso de destino.

### Novos métodos de extensão de ID3D12Device8 para exibições e samplers de mapas MinMip

```cpp theme={null}
void ID3D12Device8::CreateMinMipShaderResourceViewX(
    _In_opt_ ID3D12Resource* pTargetedResource,
    _In_opt_ const D3D12_RESOURCE_DESC* pTargetedResourceDesc,
    _In_opt_ ID3D12Resource* pMinMipResource,
    _In_opt_ const D3D12_SHADER_RESOURCE_VIEW_DESC* pDesc,
    _In_ D3D12_CPU_DESCRIPTOR_HANDLE DestDescriptor);
```

`CreateMinMipShaderResourceViewX` é uma API de extensão do XBOX que cria uma exibição de recurso de sombreador de mapa MinMip com base em um recurso de destino (ou descrição) combinado com um recurso MinMip. De forma semelhante à criação de um UAV de mapa de feedback, essa API combina atributos do recurso de destino (largura, altura, níveis de mip) com atributos do recurso de mapa MinMip (largura, altura, formato) para produzir um descritor de recurso vinculado.

O recurso de mapa MinMip deve ter o seguinte:

1. Dimensões que sejam uma fração em potência de dois das dimensões do recurso de destino
2. O formato R8\_UINT
3. Uma contagem de MipLevels igual a 1

É recomendável que os recursos de mapa MinMip tenham o modo swizzle D3D12XBOX\_TEXTURE\_LAYOUT\_SWIZZLE\_MODE\_256B\_S, pois espera-se que esses recursos sejam pequenos.

```cpp theme={null}
typedef enum D3D12XBOX_SAMPLER_FLAGS : UINT
{
    ...
    D3D12XBOX_SAMPLER_FLAG_ENABLE_MINMIP_FILTER = 0x0100
} D3D12XBOX_SAMPLER_FLAGS;

typedef enum D3D12XBOX_MINMIP_FILTER_SLOPE : UINT
{
    D3D12XBOX_MINMIP_FILTER_SLOPE_2_5 = 0,
    D3D12XBOX_MINMIP_FILTER_SLOPE_3   = 1,
    D3D12XBOX_MINMIP_FILTER_SLOPE_4   = 2,
    D3D12XBOX_MINMIP_FILTER_SLOPE_5   = 3,
    D3D12XBOX_MINMIP_FILTER_SLOPE_8   = 4,
    D3D12XBOX_MINMIP_FILTER_SLOPE_16  = 5,
    D3D12XBOX_MINMIP_FILTER_SLOPE_32  = 6,
    D3D12XBOX_MINMIP_FILTER_SLOPE_64  = 7
} D3D12XBOX_MINMIP_FILTER_SLOPE;

typedef enum D3D12XBOX_MINMIP_FILTER_OFFSET : UINT
{
    D3D12XBOX_MINMIP_FILTER_OFFSET_1_4    = 0,
    D3D12XBOX_MINMIP_FILTER_OFFSET_1_8    = 1,
    D3D12XBOX_MINMIP_FILTER_OFFSET_1_16   = 2,
    D3D12XBOX_MINMIP_FILTER_OFFSET_1_32   = 3,
    D3D12XBOX_MINMIP_FILTER_OFFSET_1_64   = 4,
    D3D12XBOX_MINMIP_FILTER_OFFSET_1_128  = 5
} D3D12XBOX_MINMIP_FILTER_OFFSET;

typedef struct D3D12XBOX_SAMPLER_DESC
{
    D3D12XBOX_SAMPLER_FLAGS Flags;

    ...

    D3D12XBOX_MINMIP_FILTER_SLOPE MinMipSlopeU;
    D3D12XBOX_MINMIP_FILTER_OFFSET MinMipOffsetU;
    D3D12XBOX_MINMIP_FILTER_SLOPE MinMipSlopeVOrW;
    D3D12XBOX_MINMIP_FILTER_OFFSET MinMipOffsetVOrW;
} D3D12XBOX_SAMPLER_DESC;
```

Para criar um descritor de sampler para amostragem a partir de um mapa MinMip, use a API de extensão do XBOX existente `ID3D12Device::CreateSamplerX` com os novos campos e sinalizadores da struct D3D12XBOX\_SAMPLER\_DESC preenchidos. As inclinações e os deslocamentos do filtro podem ser especificados usando os valores das enumerações D3D12XBOX\_MINMIP\_FILTER\_SLOPE e D3D12XBOX\_MINMIP\_FILTER\_OFFSET.

### Novo comportamento do método ID3D12GraphicsCommandList1::ResolveSubresourceRegion

```cpp theme={null}
typedef enum D3D12_RESOLVE_MODE
{
    ...
    D3D12_RESOLVE_MODE_ENCODE_SAMPLER_FEEDBACK = 4,
    D3D12_RESOLVE_MODE_DECODE_SAMPLER_FEEDBACK = 5
} D3D12_RESOLVE_MODE;

void ID3D12GraphicsCommandList1::ResolveSubresourceRegion( 
    _In_ ID3D12Resource* pDstResource,
    _In_ UINT DstSubresource,
    _In_ UINT DstX,
    _In_ UINT DstY,
    _In_ ID3D12Resource* pSrcResource,
    _In_ UINT SrcSubresource,
    _In_opt_ D3D12_RECT* pSrcRect,
    _In_ DXGI_FORMAT Format,
    _In_ D3D12_RESOLVE_MODE ResolveMode);
```

O método `ResolveSubresourceRegion` foi aprimorado para copiar dados para ou de um recurso de feedback, com um recurso de textura R8\_UINT padrão como origem ou destino, respectivamente.

### Novos objetos e métodos de HLSL (linguagem de sombreador de alto nível)

O modelo de sombreador 6.5 do HLSL introduziu novos objetos de API para mapas de feedback: FeedbackTexture2D e FeedbackTexture2DArray.

Esses são recursos somente gravação que se associam a registradores de UAV (u#) no HLSL. Esses novos objetos podem ser usados em todos os estágios de sombreador, mas determinados métodos são restritos apenas a sombreadores de pixel, de forma semelhante às restrições existentes em alguns métodos de Texture2D e Texture2DArray.

Os métodos desses novos objetos incluem `WriteSamplerFeedback*`, `WriteSamplerFeedbackBias*`, `WriteSamplerFeedbackLevelZero`, `WriteSamplerFeedbackGrad*` e `WriteSamplerFeedbackLevel`.

Um protótipo de função para uma variante de `FeedbackTexture2D::WriteSamplerFeedback` é semelhante ao exemplo de código a seguir.

```cpp theme={null}
void FeedbackTexture2D::WriteSamplerFeedback(
    in Texture2D SampledTexture,
    in SamplerState S,
    in float2 Location);
```

O parâmetro *SampledTexture* indica para qual textura gerar o feedback. Se o parâmetro *SampledTexture* não corresponder ao recurso usado ao criar o UAV de feedback, o comportamento será indefinido em algumas plataformas. Na GPU do XBOX Series X|S, o parâmetro *SampledTexture* deve estar presente, mas é ignorado. O descritor de UAV de recurso vinculado do mapa de feedback contém todas as informações necessárias para executar o sampler feedback.

## Consulte também

[Design de hardware de GPU do Sampler Feedback](/pt-BR/build/core-features/graphics/newfeatures/sfs/sf-gpu-design)

[Visão geral do Sampler Feedback (versão prévia)](/pt-BR/build/core-features/graphics/newfeatures/sfs/sf-overview)


## Related topics

- [Sampler Feedback e SFS no XBOX Series X|S](/pt-BR/build/core-features/graphics/newfeatures/sfs/index.md)
- [Diretório de tópicos NDA: links ativos do Microsoft Learn](/pt-BR/nda/nda-topic-directory.md)
- [Índice de tópicos sob NDA para desenvolvimento de console com o XBOX GDK](/pt-BR/nda/nda-overview.md)
- [Visão geral da API do pipeline de Mesh Shader](/pt-BR/build/core-features/graphics/newfeatures/ms/ms-api-design.md)
- [Visão geral do DirectStorage](/pt-BR/build/console-features/storage/directstorage/directstorage-overview.md)
