> ## 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 pipeline de Mesh Shader

> Visão geral da API do pipeline de Mesh Shader

## Criação do estado de pipeline

Para ver exemplos de uso dessas APIs, consulte [Uso do pipeline de Mesh Shader](/pt-BR/build/core-features/graphics/newfeatures/ms/ms-usage).

O exemplo de código a seguir mostra as APIs de suporte ao recurso Mesh Shader.

```c theme={null}
typedef  enum D3D12_FEATURE {
    ...
    D3D12_FEATURE_D3D12_OPTIONS7,
} D3D12_FEATURE;

typedef enum D3D12_MESH_SHADER_TIER
{
    D3D12_MESH_SHADER_TIER_NOT_SUPPORTED,
    D3D12_MESH_SHADER_TIER_1
} D3D12_MESH_SHADER_TIER;

typedef struct D3D12_FEATURE_DATA_D3D12_OPTIONS7 
{
    _Out_  D3D12_MESH_SHADER_TIER       MeshShaderTier;
    _Out_  D3D12_SAMPLER_FEEDBACK_TIER  SamplerFeedbackTier;
} D3D12_FEATURE_DATA_D3D12_OPTIONS7;

HRESULT ID3D12Device::CheckFeatureSupport(
  D3D12_FEATURE Feature,
  void*         pFeatureSupportData,
  UINT          FeatureSupportDataSize
);
```

O exemplo de código a seguir mostra as especificações de estado do pipeline de Mesh Shader, que usam as APIs de criação de Pipeline Stream.

```
typedef struct D3D12_PIPELINE_STATE_STREAM_DESC {
    _In_  SIZE_T SizeInBytes;
    _In_  void*  pPipelineStateSubobjectStream;
} D3D12_PIPELINE_STATE_STREAM_DESC;

HRESULT ID3D12Device2::CreatePipelineState(
    const D3D12_PIPELINE_STATE_STREAM_DESC* pDesc,
    REFIID                                  riid,
    void**                                  ppPipelineState
);
```

O exemplo de código a seguir mostra as APIs do Direct3D 12 para despachar grupos de threads do pipeline de Mesh Shader para a GPU.

```c theme={null}
void ID3D12GraphicsCommandList::DispatchMesh(uint groupCountX, uint groupCountY, uint groupCountZ);

typedef enum D3D12_INDIRECT_ARGUMENT_TYPE {
    ...
    D3D12_INDIRECT_ARGUMENT_TYPE_DISPATCH_MESH
} D3D12_INDIRECT_ARGUMENT_TYPE;

typedef struct D3D12_INDIRECT_ARGUMENT_DESC
{
    D3D12_INDIRECT_ARGUMENT_TYPE Type; // = D3D12_INDIRECT_ARGUMENT_TYPE_DISPATCH_MESH
    union 
    {
        ...
        struct 
        {
            UINT ThreadGroupCountX;
            UINT ThreadGroupCountY;
            UINT ThreadGroupCountZ;
        } D3D12_DISPATCH_MESH_ARGUMENTS;
    }
} D3D12_INDIRECT_ARGUMENT_DESC;

void ID3D12GraphicsCommandList::ExecuteIndirect(
    ID3D12CommandSignature* pCommandSignature,
    UINT                    MaxCommandCount,
    ID3D12Resource*         pArgumentBuffer,
    UINT64                  ArgumentBufferOffset,
    ID3D12Resource*         pCountBuffer,
    UINT64                  CountBufferOffset
);
```

O exemplo de código a seguir mostra a criação e o despacho de um pipeline de Mesh Shader.

```
struct MyPsoStreamDesc
{
    CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE        pRootSignature;
    CD3DX12_PIPELINE_STATE_STREAM_AS                    AS;
    CD3DX12_PIPELINE_STATE_STREAM_MS                    MS;
    CD3DX12_PIPELINE_STATE_STREAM_PS                    PS;
    CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC            BlendState;
    CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL1        DepthStencilState;
    CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER            RasterizerState;
    CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS RTFormats;
    CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT  DepthFormat;
    CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC           SampleDesc;
    CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK           SampleMask;
}

void CreatePipelineState(ID3D12Device* d3dDevice)
{
    // Check Mesh Shader pipeline feature support.
    D3D12_FEATURE_DATA_D3D12_OPTIONS7 options;
    device->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS7, &options, sizeof(options));

    if (options.MeshShaderTier == D3D12_MESH_SHADER_TIER_NOT_SUPPORTED)
        throw std::exception("Mesh Shaders not supported!"); 

    // Set up PSO Stream Desc.
    MyPsoStreamDesc psoDesc;
    psoDesc.AS = D3D12_SHADER_BYTECODE{ ... };
    psoDesc.MS = D3D12_SHADER_BYTECODE{ ... };
    ...

    // Create Pipeline State Object with stream desc.
    D3D12_PIPELINE_STATE_STREAM_DESC desc = { sizeof(psoDesc), &psoDesc };
    device->CreatePipelineState(&desc, IID_PPV_ARGS(&msPso));
}

void Draw(ID3D12GraphicsCommandList* commandList)
{
    // Set up pipeline and root signature parameters.
    commandList->SetPipelineState(&msPso);
    commandList->SetGraphicsRootSignature(&msRootSig);
    ...

    // Dispatch threadgroups.
    commandList->DispatchMesh(someGroupCount, 1, 1);
}
```

## Intrínsecos do Mesh Shader

### Atributos

| Nome | Descrição |
| - | - |
| **OutputTopology** | Especifica o tipo de primitivo exportado pelo shader: "line" ou "triangle". Deve corresponder ao tipo da matriz de saída compartilhada *indices* (*uint2* para linhas ou *uint3* para triângulos). |

### Funções

| | |
| - | - |
| Nome | **SetMeshOutputCounts** |
| Parâmetros | *uint numVerts* *uint numPrims* |
| Descrição | Declara o número de vértices e primitivos do grupo de threads a serem exportados; as contagens assumem zero por padrão se a função não for chamada. Deve ser menor ou igual aos comprimentos das matrizes de saída compartilhadas, deve ser chamada a partir de um contexto de execução não divergente e pressupõe valores de parâmetros constantes no grupo de threads. Deve preceder todas as gravações nas matrizes de saída. |

### Parâmetros

| Nome | Modificador | Descrição |
| - | - | - |
| *payload* | in | Dados de payload de tipo personalizado de até 16 KB passados de um Amplification Shader para seu cluster de instâncias de Mesh Shader. Esses dados são compartilhados entre todas as instâncias do cluster. Não se aplica se nenhum estágio de Amplification Shader preceder o Mesh Shader no pipeline. |
| Matriz *vertices* | out | A matriz de saída compartilhada na qual os atributos de vértice são exportados. Define o tipo de atributo de vértice personalizado e a contagem máxima de exportação de vértices pelo comprimento da matriz. |
| Matriz *indices* | out | A matriz de saída compartilhada na qual os índices de primitivos são exportados. Define o tipo de primitivo a ser exportado e a contagem máxima de exportação de primitivos pelo comprimento da matriz. Esses índices de primitivos indexam diretamente a matriz *vertices*. O tipo deve ser uint2 para linhas ou uint3 para triângulos. |
| Matriz *primitives* | out | A matriz de saída compartilhada na qual os atributos de primitivos são exportados. Define o tipo de atributo de primitivo definido pelo usuário. Seu comprimento deve ser igual ao da matriz *indices*. |

## Intrínsecos do Amplification Shader

### Funções

| | |
| - | - |
| Nome | **DispatchMesh** |
| Parâmetros | *uint groupsX* *uint groupsY* *uint groupsZ* *groupshared payload\_t payload* |
| Descrição | Despacha um cluster de grupos de threads de Mesh Shader com dados de payload opcionais. Pode ser chamada no máximo uma vez a partir de um caminho de código não divergente. Nenhum grupo de threads é despachado se a função não for chamada. Os grupos de threads de Mesh Shader subsequentes têm seus GroupIDs e DispatchThreadIDs localizados em seu próprio cluster. |

## Consulte também

[Visão geral do pipeline de Mesh Shader](/pt-BR/build/core-features/graphics/newfeatures/ms/ms-overview)

[Por que Mesh Shaders?](/pt-BR/build/core-features/graphics/newfeatures/ms/ms-why)

[Uso do pipeline de Mesh Shader](/pt-BR/build/core-features/graphics/newfeatures/ms/ms-usage)


## Related topics

- [Visão geral do pipeline de Mesh Shader](/pt-BR/build/core-features/graphics/newfeatures/ms/ms-overview.md)
- [Visão geral da API C de serviços - PFEventPipeline.h](/pt-BR/services/playfab/api-references/c/pfeventpipeline/pfeventpipeline_members.md)
- [Visão geral da API do Multiplayer Manager](/pt-BR/services/xbox-services/multiplayer/mpm/concepts/live-multiplayer-manager-api-overview.md)
- [Por que usar Mesh Shaders?](/pt-BR/build/core-features/graphics/newfeatures/ms/ms-why.md)
- [Exemplo de culling de meshlets](/pt-BR/build/core-features/graphics/newfeatures/ms/ms-meshlet-culling.md)
