Beban tampilan akses tidak berurut (UAV) yang di ketik
Beban Berjenis Tampilan Akses Tidak Berurut (UAV) adalah kemampuan bagi shader untuk membaca dari UAV dengan DXGI_FORMAT tertentu.
- Gambaran Umum
- Format dan panggilan API yang didukung
- Menggunakan beban UAV yang ditik dari HLSL
- Menggunakan beban UAV jenis UNORM dan SNORM dari HLSL
- Topik terkait
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
- R8G8_SINT
- R16_UNORM
- R16_SNORM
- R8_SNORM
- A8_UNORM
- B5G6R5_UNORM
- B5G5R5A1_UNORM
- B4G4R4A4_UNORM
Untuk menentukan dukungan untuk format tambahan apa pun, panggil CheckFeatureSupport dengan struktur D3D12_FEATURE_DATA_D3D12_OPTIONS sebagai parameter pertama (lihat Kueri Kemampuan). Bidang TypedUAVLoadAdditionalFormats akan diatur jika daftar "didukung sebagai set" di atas didukung. Lakukan panggilan kedua ke CheckFeatureSupport, menggunakan struktur D3D12_FEATURE_DATA_FORMAT_SUPPORT (memeriksa struktur yang dikembalikan terhadap anggota D3D12_FORMAT_SUPPORT2_UAV_TYPED_LOAD enum D3D12_FORMAT_SUPPORT2 ) untuk menentukan dukungan dalam daftar format yang didukung secara opsional yang tercantum di atas, misalnya:
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!
}
}
}
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);
}
Menggunakan beban UAV jenis UNORM dan SNORM dari HLSL
Saat menggunakan beban UAV yang diketik untuk membaca dari sumber daya UNORM atau SNORM, Anda harus mendeklarasikan jenis elemen objek HLSL dengan benar menjadi unorm
atau snorm
. Ini ditentukan sebagai perilaku yang tidak terdefinisi untuk tidak cocok dengan jenis elemen yang dideklarasikan dalam HLSL dengan jenis data sumber daya yang mendasar. Misalnya, jika Anda menggunakan beban UAV yang diketik pada sumber daya buffer dengan data R8_UNORM, maka Anda harus mendeklarasikan jenis elemen sebagai unorm float
:
RWBuffer<unorm float> uav;
Topik terkait