順序指定されていないアクセス ビュー (UAV) の型を指定した読み込み

順序なしアクセス ビュー (UAV) 型指定された読み込みは、シェーダーが特定の DXGI_FORMATを持つ UAV から読み取る機能です。

概要

順序指定されていないアクセス ビュー (UAV) は、順序指定されていないアクセス リソース (これには、バッファー、テクスチャ、テクスチャ配列などが含まれますが、マルチサンプリングなしです) のビューです。 UAV により、複数のスレッドからの順序指定されていない読み取り/書き込みアクセスが一時的に許可されます。 つまり、このリソースの種類は、メモリの競合を発生させることなく、複数のスレッドによって同時に読み書きできます。 この同時アクセスは、アトミック関数の使用を通じて処理されます。

D3D12 (および D3D11.3) は、型指定ありの UAV 読み込みで使用できる形式の一覧に基づき拡張されています。

サポートされている形式と API 呼び出し

以前は、次の 3 つの形式が型指定ありの UAV 読み込みをサポートしていました。D3D11.0 ハードウェアには、これらの 3 つの形式が必要です。 これらは、すべての D3D11.3 および D3D12 ハードウェアでサポートされます。

  • R32_FLOAT
  • R32_UINT
  • R32_SINT

D3D12 または D3D11.3 ハードウェアでは、次の形式がセットとしてサポートされています。したがって、どれか 1 つがサポートされている場合、すべてがサポートされます。

  • R32G32B32A32_FLOAT
  • R32G32B32A32_UINT
  • R32G32B32A32_SINT
  • R16G16B16A16_FLOAT
  • R16G16B16A16_UINT
  • R16G16B16A16_SINT
  • R8G8B8A8_UNORM
  • R8G8B8A8_UINT
  • R8G8B8A8_SINT
  • R16_FLOAT
  • R16_UINT
  • R16_SINT
  • R8_UNORM
  • R8_UINT
  • R8_SINT

D3D12 および D3D11.3 ハードウェアでは、次の形式はオプションとして個別にサポートされています。したがって、サポートされているかテストするために、形式ごとに 1 つのクエリを行う必要があります。

  • R16G16B16A16_UNORM
  • R16G16B16A16_SNORM
  • R32G32_FLOAT
  • R32G32_UINT
  • R32G32_SINT
  • R10G10B10A2_UNORM
  • R10G10B10A2_UINT
  • R11G11B10_FLOAT
  • R8G8B8A8_SNORM
  • R16G16_FLOAT
  • R16G16_UNORM
  • R16G16_UINT
  • R16G16_SNORM
  • R16G16_SINT
  • R8G8_UNORM
  • R8G8_UINT
  • R8G8_SNORM
  • R8G8_SINT
  • R16_UNORM
  • R16_SNORM
  • R8_SNORM
  • A8_UNORM
  • B5G6R5_UNORM
  • B5G5R5A1_UNORM
  • B4G4R4A4_UNORM

追加の形式のサポートを確認するには、最初のパラメーターとして D3D12_FEATURE_DATA_D3D12_OPTIONS 構造体を使用して CheckFeatureSupport を呼び出します (「機能クエリ」を参照)。 上記の "セットとしてサポート" の一覧がサポートされている場合、TypedUAVLoadAdditionalFormats フィールドが設定されます。 D3D12_FEATURE_DATA_FORMAT_SUPPORT構造体 (D3D12_FORMAT_SUPPORT2 列挙型のD3D12_FORMAT_SUPPORT2_UAV_TYPED_LOAD メンバーに対して返された構造体をチェックする) を使用して、CheckFeatureSupport を 2 回目に呼び出して、上記でサポートされている必要に応じてサポートされている形式の一覧でサポートを決定します。次に例を示します。

D3D12_FEATURE_DATA_D3D12_OPTIONS FeatureData;
ZeroMemory(&FeatureData, sizeof(FeatureData));
HRESULT hr = pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS, &FeatureData, sizeof(FeatureData));
if (SUCCEEDED(hr))
{
    // TypedUAVLoadAdditionalFormats contains a Boolean that tells you whether the feature is supported or not
    if (FeatureData.TypedUAVLoadAdditionalFormats)
    {
        // Can assume “all-or-nothing” subset is supported (e.g. R32G32B32A32_FLOAT)
        // Cannot assume other formats are supported, so we check:
        D3D12_FEATURE_DATA_FORMAT_SUPPORT FormatSupport = {DXGI_FORMAT_R32G32_FLOAT, D3D12_FORMAT_SUPPORT1_NONE, D3D12_FORMAT_SUPPORT2_NONE};
        hr = pDevice->CheckFeatureSupport(D3D12_FEATURE_FORMAT_SUPPORT, &FormatSupport, sizeof(FormatSupport));
        if (SUCCEEDED(hr) && (FormatSupport.Support2 & D3D12_FORMAT_SUPPORT2_UAV_TYPED_LOAD) != 0)
        {
            // DXGI_FORMAT_R32G32_FLOAT supports UAV Typed Load!
        }
    }
}

HLSL から型指定ありの UAV 読み込みを使用

型指定された UAV の場合、HLSL フラグはD3D_SHADER_REQUIRES_TYPED_UAV_LOAD_ADDITIONAL_FORMATS。

型指定ありの UAV 読み込みを処理するシェーダー コードの例を次に示します。

RWTexture2D<float4> uav1;
uint2 coord;
float4 main() : SV_Target
{
  return uav1.Load(coord);
}

HLSL から UNORM および SNORM の型指定ありの UAV 読み込みを使用

型指定ありの UAV 読み込みを使用して UNORM または SNORM リソースから読み取りを行う場合、HLSL オブジェクトの要素型が unorm または snorm になるように適切に宣言する必要があります。 HLSL で宣言された要素型と基になるリソース データ型を一致させないようにするために、これは未定義の動作として指定されます。 たとえば、R8_UNORM データを含むバッファー リソースで型指定された UAV 読み込みを使用している場合は、要素の型を として unorm float宣言する必要があります。

RWBuffer<unorm float> uav;

レンダリング

リソース バインディング

HLSL でのリソース バインド

シェーダー モデル 5.1

HLSL でのルート署名の指定