Osorterad åtkomstvy (UAV) har skrivits in
Osorterad åtkomstvy (UAV) Inläsning är möjligheten för en skuggning att läsa från en UAV med en specifik DXGI_FORMAT.
- Översikt
- format som stöds och API-anrop
- Använda inskrivna UAV-inläsningar från HLSL-
- Använda UNORM- och SNORM-skrivna UAV-belastningar från HLSL-
- Relaterade ämnen
Överblick
En osorterad åtkomstvy (UAV) är en vy över en osorterad åtkomstresurs (som kan innehålla buffertar, texturer och strukturmatriser, men utan flera samplingar). En UAV tillåter temporärt oordnad läs-/skrivåtkomst från flera trådar. Det innebär att den här resurstypen kan läsas/skrivas samtidigt av flera trådar utan att generera minneskonflikter. Den här samtidiga åtkomsten hanteras med hjälp av Atomic Functions.
D3D12 (och D3D11.3) expanderar listan över format som kan användas med inskrivna UAV-inläsningar.
Format och API-anrop som stöds
Tidigare har följande tre format som stöds skrivit UAV-inläsningar och krävts för D3D11.0-maskinvara. De stöds för all D3D11.3- och D3D12-maskinvara.
- R32_FLOAT
- R32_UINT
- R32_SINT
Följande format stöds som en uppsättning på D3D12- eller D3D11.3-maskinvara, så om någon stöds stöds alla.
- 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
Följande format stöds valfritt och individuellt på D3D12- och D3D11.3-maskinvara, så en enda fråga måste göras på varje format för att testa för support.
- 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
Om du vill fastställa stödet för ytterligare format anropar du CheckFeatureSupport med D3D12_FEATURE_DATA_D3D12_OPTIONS-strukturen som den första parametern (se Funktionsfråga). Fältet TypedUAVLoadAdditionalFormats anges om listan "stöds som en uppsättning" ovan stöds. Gör ett andra anrop till CheckFeatureSupport, med hjälp av en D3D12_FEATURE_DATA_FORMAT_SUPPORT struktur (kontrollera den returnerade strukturen mot den D3D12_FORMAT_SUPPORT2_UAV_TYPED_LOAD medlemmen i D3D12_FORMAT_SUPPORT2-uppräkningen) för att fastställa stöd i listan över format som eventuellt stöds ovan, till exempel:
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!
}
}
}
Använda inskrivna UAV-inläsningar från HLSL
För inskrivna UAV:er är HLSL-flaggan D3D_SHADER_REQUIRES_TYPED_UAV_LOAD_ADDITIONAL_FORMATS.
Här är exempel på skuggningskod för att bearbeta en typinskriven UAV-inläsning:
RWTexture2D<float4> uav1;
uint2 coord;
float4 main() : SV_Target
{
return uav1.Load(coord);
}
Använda UNORM- och SNORM-skrivna UAV-inläsningar från HLSL
När du använder inskrivna UAV-inläsningar för att läsa från en UNORM- eller SNORM-resurs måste du deklarera elementtypen för HLSL-objektet korrekt som unorm
eller snorm
. Det anges som odefinierat beteende för att matcha elementtypen som deklarerats i HLSL med den underliggande resursdatatypen. Om du till exempel använder inskrivna UAV-inläsningar på en buffertresurs med R8_UNORM data måste du deklarera elementtypen som unorm float
:
RWBuffer<unorm float> uav;
Relaterade ämnen