型指定された順序なしアクセス ビュー (UAV) の読み込み
順序なしアクセス ビュー (UAV) 型指定された読み込みは、シェーダーが特定の DXGI_FORMATを持つ UAV から読み取る機能です。
- の概要
- サポートされている形式と API 呼び出し
- HLSL からの型指定された UAV 読み込みを使用する
- HLSL からの UNORM および SNORM 型の UAV 読み込みの使用
- 関連トピック
概要
順序なしアクセス ビュー (UAV) は、順序指定されていないアクセス リソースのビューです (マルチサンプリングを使用せずに、バッファー、テクスチャ、テクスチャ配列を含めることができます)。 UAV を使用すると、複数のスレッドから一時的に順序付けられていない読み取り/書き込みアクセスが可能になります。 つまり、このリソースの種類は、メモリの競合を生成することなく、複数のスレッドで同時に読み取り/書き込みを行うことができます。 この同時アクセスは、Atomic Functionsを使用して処理されます。
D3D12 (および D3D11.3) は、型指定された UAV 読み込みで使用できる形式の一覧を展開します。
サポートされている形式と API 呼び出し
以前は、次の 3 つの形式で型指定された UAV 読み込みがサポートされ、D3D11.0 ハードウェアに必要でした。 これらは、すべての D3D11.3 および D3D12 ハードウェアでサポートされています。
- R32_FLOAT
- R32_UINT
- R32_SINT
D3D12 または D3D11.3 ハードウェアでは、次の形式がセットとしてサポートされているため、サポートされている場合はすべてサポートされます。
- 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を呼び出します (Capability Queryingを参照してください)。 上記の "set としてサポートされている" リストがサポートされている場合、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);
}
UNORM および SNORM 型の UAV 読み込みを HLSL から使用する
型指定された UAV 読み込みを使用して UNORM または SNORM リソースから読み取る場合は、HLSL オブジェクトの要素型を適切に宣言して、unorm
または snorm
する必要があります。 HLSL で宣言された要素型と基になるリソース データ型が一致しない場合は、未定義の動作として指定されます。 たとえば、R8_UNORM データを含むバッファー リソースで型指定された UAV 読み込みを使用している場合は、要素の型を unorm float
として宣言する必要があります。
RWBuffer<unorm float> uav;
関連トピック
-
リソース バインド の
-
HLSL でのリソース バインドの
-
HLSL でのルート署名の指定の