Bagikan melalui


Beban Tampilan Akses Tidak Berurut Yang Dititik

Beban Berjenis Tampilan Akses Tidak Berurut (UAV) adalah kemampuan bagi shader untuk membaca dari UAV dengan DXGI_FORMAT tertentu.

Gambaran Umum

Tampilan akses yang tidak diurutkan (UAV) adalah tampilan sumber daya akses yang tidak diurutkan (yang dapat mencakup buffer, tekstur, dan array tekstur, meskipun tanpa multi-pengambilan sampel). UAV memungkinkan akses baca/tulis yang tidak diurutkan secara sementara dari beberapa utas. Ini berarti bahwa jenis sumber daya ini dapat dibaca/ditulis secara bersamaan oleh beberapa utas tanpa menghasilkan konflik memori. Akses simultan ini ditangani melalui penggunaan Atomic Functions.

D3D12 dan D3D11.3 meluas pada daftar format yang dapat digunakan dengan beban UAV jenis.

Format dan panggilan API yang didukung

Sebelumnya, tiga format berikut mendukung beban UAV jenis yang didukung, dan diperlukan untuk perangkat keras D3D11.0. Mereka didukung untuk semua perangkat keras D3D11.3 dan D3D12.

  • R32_FLOAT
  • R32_UINT
  • R32_SINT

Format berikut didukung sebagai set pada perangkat keras D3D12 atau D3D11.3, jadi jika ada yang didukung, semua didukung.

  • 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

Format berikut secara opsional dan didukung secara individual pada perangkat keras D3D12 dan D3D11.3, sehingga satu kueri perlu dibuat pada setiap format untuk menguji dukungan.

  • 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
  • 8G8_SINT
  • R16_UNORM
  • R16_SNORM
  • R8_SNORM
  • A8_UNORM
  • B5G6R5_UNORM
  • B5G5R5A1_UNORM
  • B4G4R4A4_UNORM

Untuk menentukan dukungan untuk format tambahan apa pun, panggil ID3D11Device::CheckFeatureSupport dengan struktur D3D11_FEATURE_DATA_D3D11_OPTIONS2 sebagai parameter pertama. Bit TypedUAVLoadAdditionalFormats akan diatur jika daftar "didukung sebagai set" di atas didukung. Lakukan panggilan kedua ke CheckFeatureSupport, menggunakan struktur D3D11_FEATURE_DATA_FORMAT_SUPPORT2 (memeriksa struktur yang dikembalikan terhadap anggota D3D12_FORMAT_SUPPORT2_UAV_TYPED_LOAD enum D3D11_FORMAT_SUPPORT2 ) untuk menentukan dukungan dalam daftar format yang didukung secara opsional di atas, misalnya:

D3D11_FEATURE_DATA_D3D11_OPTIONS2 FeatureData;
ZeroMemory(&FeatureData, sizeof(FeatureData));
HRESULT hr = pDevice->CheckFeatureSupport(D3D11_FEATURE_D3D11_OPTIONS2, &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:
        D3D11_FEATURE_DATA_FORMAT_SUPPORT2 FormatSupport;
        ZeroMemory(&FormatSupport, sizeof(FormatSupport));
        FormatSupport.InFormat = DXGI_FORMAT_R32G32_FLOAT;
        hr = pDevice->CheckFeatureSupport(D3D11_FEATURE_FORMAT_SUPPORT2, &FormatSupport, sizeof(FormatSupport));
        if (SUCCEEDED(hr) && (FormatSupport.OutFormatSupport2 & D3D11_FORMAT_SUPPORT2_UAV_TYPED_LOAD) != 0)
        {
            // DXGI_FORMAT_R32G32_FLOAT supports UAV Typed Load!
        }
    }
}

Menggunakan beban UAV yang ditik dari HLSL

Untuk UAV yang ditik, bendera HLSL D3D_SHADER_REQUIRES_TYPED_UAV_LOAD_ADDITIONAL_FORMATS.

Berikut adalah contoh kode shader untuk memproses beban UAV yang ditik:

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

Fitur Direct3D 11.3

Model Shader 5.1