Udostępnij przez


Typizowane nieuporządkowany widok dostępu (UAV) ładuje

Nieuporządkowany widok dostępu (UAV) Typd Load (UAV) to możliwość odczytywania cieniowania z UAV z określonym DXGI_FORMAT.

Przegląd

Widok nieuporządkowanego dostępu (UAV) to widok nieuporządkowanego zasobu dostępu (który może zawierać, tekstury i tablice tekstur, choć bez próbkowania wielokrotnego). Funkcja UAV umożliwia czasowo nieurządkowany dostęp do odczytu/zapisu z wielu wątków. Oznacza to, że ten typ zasobu może być odczytywany/zapisywany jednocześnie przez wiele wątków bez generowania konfliktów pamięci. Ten równoczesny dostęp jest obsługiwany za pomocą Atomic Functions.

D3D12 (i D3D11.3) rozszerza listę formatów, których można używać z typowymi obciążeniami UAV.

Obsługiwane formaty i wywołania interfejsu API

Wcześniej następujące trzy formaty obsługiwały typizowane obciążenia UAV i były wymagane dla sprzętu D3D11.0. Są one obsługiwane dla wszystkich sprzętu D3D11.3 i D3D12.

  • R32_FLOAT
  • R32_UINT
  • R32_SINT

Następujące formaty są obsługiwane jako zestaw na sprzęcie D3D12 lub D3D11.3, więc jeśli którykolwiek z nich jest obsługiwany, wszystkie są obsługiwane.

  • 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

Następujące formaty są opcjonalne i indywidualnie obsługiwane w przypadku sprzętu D3D12 i D3D11.3, więc w każdym formacie należy wykonać pojedyncze zapytanie w celu przetestowania obsługi.

  • 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

Aby określić obsługę wszelkich dodatkowych formatów, wywołaj CheckFeatureSupport za pomocą struktury D3D12_FEATURE_DATA_D3D12_OPTIONS jako pierwszego parametru (zapoznaj się z Capability Querying). Pole TypedUAVLoadAdditionalFormats zostanie ustawione, jeśli jest obsługiwana lista "obsługiwana jako zestaw" powyżej. Wykonaj drugie wywołanie CheckFeatureSupportprzy użyciu struktury D3D12_FEATURE_DATA_FORMAT_SUPPORT (sprawdzanie zwróconej struktury względem elementu członkowskiego D3D12_FORMAT_SUPPORT2_UAV_TYPED_LOAD wyliczenia D3D12_FORMAT_SUPPORT2), aby określić obsługę na liście opcjonalnie obsługiwanych formatów wymienionych powyżej, na przykład:

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!
        }
    }
}

Używanie typowanych obciążeń UAV z HLSL

W przypadku typowanych niezależnych dostawców oprogramowania flaga HLSL jest D3D_SHADER_REQUIRES_TYPED_UAV_LOAD_ADDITIONAL_FORMATS.

Oto przykładowy kod cieniowania do przetwarzania typizowanego ładowania UAV:

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

Używanie funkcji UNORM i SNORM typizowanego ładowania UAV z HLSL

W przypadku używania typowych obciążeń UAV do odczytu z zasobu UNORM lub SNORM należy prawidłowo zadeklarować typ elementu obiektu HLSL, aby był unorm lub snorm. Określono to jako niezdefiniowane zachowanie w celu niezgodności typu elementu zadeklarowanego w HLSL z bazowym typem danych zasobu. Jeśli na przykład używasz typowych obciążeń UAV dla zasobu buforu z danymi R8_UNORM, musisz zadeklarować typ elementu jako unorm float:

RWBuffer<unorm float> uav;

Renderowanie

powiązania zasobów

powiązanie zasobów w HLSL

model cieniowania 5.1

określanie podpisów głównych w HLSL