[PATCH vkd3d 3/3] vkd3d: Send typed UAV unknown format read support info to vkd3d-shader.

Conor McCarthy cmccarthy at codeweavers.com
Mon Jul 11 09:28:24 CDT 2022


Fixes reflections in Control appearing with only the red component.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52146
Signed-off-by: Conor McCarthy <cmccarthy at codeweavers.com>
---
 libs/vkd3d/device.c        |  2 ++
 libs/vkd3d/state.c         | 17 +++++++++++++----
 libs/vkd3d/vkd3d_private.h |  2 ++
 tests/d3d12.c              |  2 +-
 4 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c
index eaedc444..983471b7 100644
--- a/libs/vkd3d/device.c
+++ b/libs/vkd3d/device.c
@@ -1310,6 +1310,7 @@ static void vkd3d_init_feature_level(struct vkd3d_vulkan_info *vk_info,
     CHECK_FEATURE(shaderClipDistance);
     CHECK_FEATURE(shaderCullDistance);
     CHECK_FEATURE(shaderImageGatherExtended);
+    CHECK_FEATURE(shaderStorageImageReadWithoutFormat);
     CHECK_FEATURE(shaderStorageImageWriteWithoutFormat);
     CHECK_FEATURE(tessellationShader);
 
@@ -1425,6 +1426,7 @@ static HRESULT vkd3d_init_device_caps(struct d3d12_device *device,
     vulkan_info->sparse_properties = physical_device_info->properties2.properties.sparseProperties;
     vulkan_info->rasterization_stream = physical_device_info->xfb_properties.transformFeedbackRasterizationStreamSelect;
     vulkan_info->transform_feedback_queries = physical_device_info->xfb_properties.transformFeedbackQueries;
+    vulkan_info->uav_read_without_format = features->shaderStorageImageReadWithoutFormat;
     vulkan_info->max_vertex_attrib_divisor = max(physical_device_info->vertex_divisor_properties.maxVertexAttribDivisor, 1);
 
     device->feature_options.DoublePrecisionFloatShaderOps = features->shaderFloat64;
diff --git a/libs/vkd3d/state.c b/libs/vkd3d/state.c
index 7a29ade8..212fe579 100644
--- a/libs/vkd3d/state.c
+++ b/libs/vkd3d/state.c
@@ -1944,6 +1944,13 @@ struct d3d12_pipeline_state *unsafe_impl_from_ID3D12PipelineState(ID3D12Pipeline
     return impl_from_ID3D12PipelineState(iface);
 }
 
+static inline unsigned int typed_uav_compile_option(const struct d3d12_device *device)
+{
+    return device->vk_info.uav_read_without_format
+            ? VKD3D_SHADER_COMPILE_OPTION_TYPED_UAV_READ_FORMAT_UNKNOWN
+            : VKD3D_SHADER_COMPILE_OPTION_TYPED_UAV_READ_FORMAT_R32UI;
+}
+
 static HRESULT create_shader_stage(struct d3d12_device *device,
         struct VkPipelineShaderStageCreateInfo *stage_desc, enum VkShaderStageFlagBits stage,
         const D3D12_SHADER_BYTECODE *code, const struct vkd3d_shader_interface_info *shader_interface)
@@ -1955,9 +1962,10 @@ static HRESULT create_shader_stage(struct d3d12_device *device,
     VkResult vr;
     int ret;
 
-    static const struct vkd3d_shader_compile_option options[] =
+    const struct vkd3d_shader_compile_option options[] =
     {
         {VKD3D_SHADER_COMPILE_OPTION_API_VERSION, VKD3D_SHADER_API_VERSION_1_4},
+        {VKD3D_SHADER_COMPILE_OPTION_TYPED_UAV, typed_uav_compile_option(device)},
     };
 
     stage_desc->sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
@@ -2001,14 +2009,15 @@ static HRESULT create_shader_stage(struct d3d12_device *device,
     return S_OK;
 }
 
-static int vkd3d_scan_dxbc(const D3D12_SHADER_BYTECODE *code,
+static int vkd3d_scan_dxbc(const struct d3d12_device *device, const D3D12_SHADER_BYTECODE *code,
         struct vkd3d_shader_scan_descriptor_info *descriptor_info)
 {
     struct vkd3d_shader_compile_info compile_info;
 
-    static const struct vkd3d_shader_compile_option options[] =
+    const struct vkd3d_shader_compile_option options[] =
     {
         {VKD3D_SHADER_COMPILE_OPTION_API_VERSION, VKD3D_SHADER_API_VERSION_1_4},
+        {VKD3D_SHADER_COMPILE_OPTION_TYPED_UAV, typed_uav_compile_option(device)},
     };
 
     compile_info.type = VKD3D_SHADER_STRUCTURE_TYPE_COMPILE_INFO;
@@ -2170,7 +2179,7 @@ static HRESULT d3d12_pipeline_state_find_and_init_uav_counters(struct d3d12_pipe
 
     shader_info.type = VKD3D_SHADER_STRUCTURE_TYPE_SCAN_DESCRIPTOR_INFO;
     shader_info.next = NULL;
-    if ((ret = vkd3d_scan_dxbc(code, &shader_info)) < 0)
+    if ((ret = vkd3d_scan_dxbc(device, code, &shader_info)) < 0)
     {
         WARN("Failed to scan shader bytecode, stage %#x, vkd3d result %d.\n", stage_flags, ret);
         return hresult_from_vkd3d_result(ret);
diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h
index f00181a2..9976fe58 100644
--- a/libs/vkd3d/vkd3d_private.h
+++ b/libs/vkd3d/vkd3d_private.h
@@ -143,6 +143,8 @@ struct vkd3d_vulkan_info
     bool rasterization_stream;
     bool transform_feedback_queries;
 
+    bool uav_read_without_format;
+
     bool vertex_attrib_zero_divisor;
     unsigned int max_vertex_attrib_divisor;
 
diff --git a/tests/d3d12.c b/tests/d3d12.c
index 57e072e4..c59333f8 100644
--- a/tests/d3d12.c
+++ b/tests/d3d12.c
@@ -21093,7 +21093,7 @@ static void test_typed_buffer_uav(void)
             D3D12_RESOURCE_STATE_UNORDERED_ACCESS, D3D12_RESOURCE_STATE_COPY_SOURCE);
 
     get_buffer_readback_with_command_list(resource, uav_desc.Format, &rb, queue, command_list);
-    todo check_readback_data_vec4(&rb.rb, NULL, &expected, 0);
+    check_readback_data_vec4(&rb.rb, NULL, &expected, 0);
     release_resource_readback(&rb);
 
     ID3D12Resource_Release(resource);
-- 
2.36.1




More information about the wine-devel mailing list