diff --git a/src/gallium/drivers/d3d12/d3d12_screen.cpp b/src/gallium/drivers/d3d12/d3d12_screen.cpp index 5b955364795..0f86f7833ca 100644 --- a/src/gallium/drivers/d3d12/d3d12_screen.cpp +++ b/src/gallium/drivers/d3d12/d3d12_screen.cpp @@ -754,6 +754,49 @@ can_attribute_at_vertex(struct d3d12_screen *screen) } } +static bool +can_shader_image_load_all_formats(struct d3d12_screen *screen) +{ + if (!screen->opts.TypedUAVLoadAdditionalFormats) + return false; + + /* All of these are required by ARB_shader_image_load_store */ + static const DXGI_FORMAT additional_formats[] = { + DXGI_FORMAT_R16G16B16A16_UNORM, + DXGI_FORMAT_R16G16B16A16_SNORM, + DXGI_FORMAT_R32G32_FLOAT, + DXGI_FORMAT_R32G32_UINT, + DXGI_FORMAT_R32G32_SINT, + DXGI_FORMAT_R10G10B10A2_UNORM, + DXGI_FORMAT_R10G10B10A2_UINT, + DXGI_FORMAT_R11G11B10_FLOAT, + DXGI_FORMAT_R8G8B8A8_SNORM, + DXGI_FORMAT_R16G16_FLOAT, + DXGI_FORMAT_R16G16_UNORM, + DXGI_FORMAT_R16G16_UINT, + DXGI_FORMAT_R16G16_SNORM, + DXGI_FORMAT_R16G16_SINT, + DXGI_FORMAT_R8G8_UNORM, + DXGI_FORMAT_R8G8_UINT, + DXGI_FORMAT_R8G8_SNORM, + DXGI_FORMAT_R8G8_SINT, + DXGI_FORMAT_R16_UNORM, + DXGI_FORMAT_R16_SNORM, + DXGI_FORMAT_R8_SNORM, + }; + + for (unsigned i = 0; i < ARRAY_SIZE(additional_formats); ++i) { + D3D12_FEATURE_DATA_FORMAT_SUPPORT support = { additional_formats[i] }; + if (FAILED(screen->dev->CheckFeatureSupport(D3D12_FEATURE_FORMAT_SUPPORT, &support, sizeof(support))) || + (support.Support1 & D3D12_FORMAT_SUPPORT1_TYPED_UNORDERED_ACCESS_VIEW) == D3D12_FORMAT_SUPPORT1_NONE || + (support.Support2 & (D3D12_FORMAT_SUPPORT2_UAV_TYPED_LOAD | D3D12_FORMAT_SUPPORT2_UAV_TYPED_STORE)) != + (D3D12_FORMAT_SUPPORT2_UAV_TYPED_LOAD | D3D12_FORMAT_SUPPORT2_UAV_TYPED_STORE)) + return false; + } + + return true; +} + static void d3d12_init_null_srvs(struct d3d12_screen *screen) { @@ -1010,6 +1053,7 @@ d3d12_init_screen(struct d3d12_screen *screen, struct sw_winsys *winsys, IUnknow d3d12_init_null_rtv(screen); screen->have_load_at_vertex = can_attribute_at_vertex(screen); + screen->support_shader_images = can_shader_image_load_all_formats(screen); return true; failed: diff --git a/src/gallium/drivers/d3d12/d3d12_screen.h b/src/gallium/drivers/d3d12/d3d12_screen.h index 9aa4ffb27a5..abd758bea1b 100644 --- a/src/gallium/drivers/d3d12/d3d12_screen.h +++ b/src/gallium/drivers/d3d12/d3d12_screen.h @@ -88,6 +88,7 @@ struct d3d12_screen { uint64_t memory_size_megabytes; double timestamp_multiplier; bool have_load_at_vertex; + bool support_shader_images; }; static inline struct d3d12_screen *