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

# メッシュ シェーダー パイプライン API の概要

> メッシュ シェーダー パイプライン API の概要

## パイプライン ステートの作成

これらの API の使用例については、[メッシュ シェーダー パイプラインの使用方法](/build/core-features/graphics/newfeatures/ms/ms-usage)を参照してください。

以下のコード例は、メッシュ シェーダー機能サポート API を示しています。

```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
);
```

以下のコード例は、Pipeline Stream 作成 API を使用するメッシュ シェーダー パイプライン ステートの仕様を示しています。

```
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
);
```

以下のコード例は、メッシュ シェーダー パイプラインのスレッドグループを GPU にディスパッチする Direct3D 12 API を示しています。

```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
);
```

以下のコード例は、メッシュ シェーダー パイプラインの作成とディスパッチを示しています。

```
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);
}
```

## メッシュ シェーダー組み込み関数

### 属性

| 名前                 | 説明                                                                                                                                  |
| ------------------ | ----------------------------------------------------------------------------------------------------------------------------------- |
| **OutputTopology** | シェーダーからエクスポートされるプリミティブ型を指定します。"line" または "triangle" のいずれかです。共有出力配列 *indices* の型 (line なら *uint2*、triangle なら *uint3*) と一致する必要があります。 |

### 関数

|        |                                                                                                                                                                           |
| ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 名前     | **SetMeshOutputCounts**                                                                                                                                                   |
| パラメーター | *uint numVerts* *uint numPrims*                                                                                                                                           |
| 説明     | スレッドグループがエクスポートする頂点数とプリミティブ数を宣言します。呼び出されなかった場合、カウントは既定でゼロになります。共有出力配列の長さ以下でなければならず、非分岐な実行コンテキストから呼び出す必要があり、パラメーター値はスレッドグループ内で定数であるとみなされます。すべての出力配列への書き込みに先立って呼び出す必要があります。 |

### パラメーター

| 名前              | 修飾子 | 説明                                                                                                                                                                          |
| --------------- | --- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| *payload*       | in  | Amplification Shader からそのメッシュ シェーダー インスタンスのクラスターに渡される、最大 16 KB のカスタム型ペイロード データ。このデータはクラスター内のすべてのインスタンスで共有されます。パイプラインでメッシュ シェーダーの前段に Amplification Shader ステージがない場合には該当しません。 |
| *vertices* 配列   | out | 頂点属性をエクスポートするための共有出力配列。カスタム頂点属性型と、配列長による最大頂点エクスポート数を定義します。                                                                                                                  |
| *indices* 配列    | out | プリミティブ インデックスをエクスポートするための共有出力配列。エクスポートするプリミティブ型と、配列長による最大プリミティブ エクスポート数を定義します。これらのプリミティブ インデックスは *vertices* 配列を直接インデックス指定します。型は line なら uint2、triangle なら uint3 とする必要があります。 |
| *primitives* 配列 | out | プリミティブ属性をエクスポートするための共有出力配列。ユーザー定義のプリミティブ属性型を定義します。その長さは *indices* 配列と等しくなければなりません。                                                                                          |

## Amplification Shader 組み込み関数

### 関数

|        |                                                                                                                                                                                                    |
| ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 名前     | **DispatchMesh**                                                                                                                                                                                   |
| パラメーター | *uint groupsX* *uint groupsY* *uint groupsZ* *groupshared payload\_t payload*                                                                                                                      |
| 説明     | オプションのペイロード データを伴って、メッシュ シェーダー スレッドグループのクラスターをディスパッチします。非分岐なコード パスから最大 1 回だけ呼び出せます。呼び出されなかった場合はゼロ個のスレッドグループがディスパッチされます。後続のメッシュ シェーダー スレッドグループでは、GroupID および DispatchThreadID が自身のクラスター内でローカル化されます。 |

## 関連項目

[メッシュ シェーダー パイプラインの概要](/build/core-features/graphics/newfeatures/ms/ms-overview)

[なぜメッシュ シェーダーなのか?](/build/core-features/graphics/newfeatures/ms/ms-why)

[メッシュ シェーダー パイプラインの使用方法](/build/core-features/graphics/newfeatures/ms/ms-usage)


## Related topics

- [メッシュ シェーダー パイプラインの概要](/ja-jp/build/core-features/graphics/newfeatures/ms/ms-overview.md)
- [なぜメッシュ シェーダーなのか?](/ja-jp/build/core-features/graphics/newfeatures/ms/ms-why.md)
- [メッシュレット](/ja-jp/build/core-features/graphics/newfeatures/ms/ms-meshlet-render.md)
- [メッシュレット カリングの例](/ja-jp/build/core-features/graphics/newfeatures/ms/ms-meshlet-culling.md)
- [XBOX Series X|S のメッシュ シェーダーとメッシュレット](/ja-jp/build/core-features/graphics/newfeatures/ms/index.md)
