[PATCH 3/5] wined3d: Introduce shader_spirv_resource_bindings_add_shader().

Jan Sikorski jsikorski at codeweavers.com
Tue Aug 10 03:34:28 CDT 2021


Extracted from shader_spirv_resource_bindings_init().

Signed-off-by: Jan Sikorski <jsikorski at codeweavers.com>
---
 dlls/wined3d/shader_spirv.c | 125 ++++++++++++++++++++----------------
 1 file changed, 68 insertions(+), 57 deletions(-)

diff --git a/dlls/wined3d/shader_spirv.c b/dlls/wined3d/shader_spirv.c
index 7617ee9d6ef..fb9f9dc4ff1 100644
--- a/dlls/wined3d/shader_spirv.c
+++ b/dlls/wined3d/shader_spirv.c
@@ -657,86 +657,97 @@ static enum wined3d_data_type wined3d_data_type_from_vkd3d(enum vkd3d_shader_res
     }
 }
 
-static bool shader_spirv_resource_bindings_init(struct shader_spirv_resource_bindings *bindings,
-        struct wined3d_shader_resource_bindings *wined3d_bindings,
-        const struct wined3d_state *state, uint32_t shader_mask)
+static bool shader_spirv_resource_bindings_add_shader(struct shader_spirv_resource_bindings *bindings,
+        struct wined3d_shader_resource_bindings *wined3d_bindings, struct wined3d_shader *shader,
+        enum wined3d_shader_type shader_type)
 {
     struct vkd3d_shader_scan_descriptor_info *descriptor_info;
     enum wined3d_shader_descriptor_type wined3d_type;
     enum vkd3d_shader_visibility shader_visibility;
-    enum wined3d_shader_type shader_type;
     VkDescriptorType vk_descriptor_type;
     VkShaderStageFlagBits vk_stage;
-    struct wined3d_shader *shader;
     size_t binding_idx;
     unsigned int i;
 
-    bindings->binding_count = 0;
-    bindings->uav_counter_count = 0;
-    bindings->vk_binding_count = 0;
-    bindings->so_stage = WINED3D_SHADER_TYPE_GEOMETRY;
-    wined3d_bindings->count = 0;
-
-    for (shader_type = 0; shader_type < WINED3D_SHADER_TYPE_COUNT; ++shader_type)
+    if (shader_type == WINED3D_SHADER_TYPE_COMPUTE)
     {
-        bindings->binding_base[shader_type] = bindings->vk_binding_count;
+        descriptor_info = &((struct shader_spirv_compute_program_vk *)shader->backend_data)->descriptor_info;
+    }
+    else
+    {
+        descriptor_info = &((struct shader_spirv_graphics_program_vk *)shader->backend_data)->descriptor_info;
+        if (shader_type == WINED3D_SHADER_TYPE_GEOMETRY && !shader->function)
+            bindings->so_stage = WINED3D_SHADER_TYPE_VERTEX;
+    }
 
-        if (!(shader_mask & (1u << shader_type)) || !(shader = state->shader[shader_type]))
-            continue;
+    vk_stage = vk_shader_stage_from_wined3d(shader_type);
+    shader_visibility = vkd3d_shader_visibility_from_wined3d(shader_type);
 
-        if (shader_type == WINED3D_SHADER_TYPE_COMPUTE)
+    for (i = 0; i < descriptor_info->descriptor_count; ++i)
+    {
+        struct vkd3d_shader_descriptor_info *d = &descriptor_info->descriptors[i];
+        uint32_t flags;
+
+        if (d->register_space)
         {
-            descriptor_info = &((struct shader_spirv_compute_program_vk *)shader->backend_data)->descriptor_info;
+            WARN("Unsupported register space %u.\n", d->register_space);
+            return false;
         }
+
+        if (d->resource_type == VKD3D_SHADER_RESOURCE_BUFFER)
+            flags = VKD3D_SHADER_BINDING_FLAG_BUFFER;
         else
-        {
-            descriptor_info = &((struct shader_spirv_graphics_program_vk *)shader->backend_data)->descriptor_info;
-            if (shader_type == WINED3D_SHADER_TYPE_GEOMETRY && !shader->function)
-                bindings->so_stage = WINED3D_SHADER_TYPE_VERTEX;
-        }
+            flags = VKD3D_SHADER_BINDING_FLAG_IMAGE;
 
-        vk_stage = vk_shader_stage_from_wined3d(shader_type);
-        shader_visibility = vkd3d_shader_visibility_from_wined3d(shader_type);
+        vk_descriptor_type = vk_descriptor_type_from_vkd3d(d->type, d->resource_type);
+        if (!shader_spirv_resource_bindings_add_binding(bindings, d->type, vk_descriptor_type,
+                d->register_index, shader_visibility, vk_stage, flags, &binding_idx))
+            return false;
 
-        for (i = 0; i < descriptor_info->descriptor_count; ++i)
-        {
-            struct vkd3d_shader_descriptor_info *d = &descriptor_info->descriptors[i];
-            uint32_t flags;
+        wined3d_type = wined3d_descriptor_type_from_vkd3d(d->type);
+        if (!wined3d_shader_resource_bindings_add_binding(wined3d_bindings, shader_type,
+                wined3d_type, d->register_index, wined3d_shader_resource_type_from_vkd3d(d->resource_type),
+                wined3d_data_type_from_vkd3d(d->resource_data_type), binding_idx))
+            return false;
 
-            if (d->register_space)
-            {
-                WARN("Unsupported register space %u.\n", d->register_space);
+        if (d->type == VKD3D_SHADER_DESCRIPTOR_TYPE_UAV
+                && (d->flags & VKD3D_SHADER_DESCRIPTOR_INFO_FLAG_UAV_COUNTER))
+        {
+            if (!shader_spirv_resource_bindings_add_uav_counter_binding(bindings,
+                    d->register_index, shader_visibility, vk_stage, &binding_idx))
                 return false;
-            }
+            if (!wined3d_shader_resource_bindings_add_binding(wined3d_bindings,
+                    shader_type, WINED3D_SHADER_DESCRIPTOR_TYPE_UAV_COUNTER, d->register_index,
+                    WINED3D_SHADER_RESOURCE_BUFFER, WINED3D_DATA_UINT, binding_idx))
+                return false;
+        }
+    }
 
-            if (d->resource_type == VKD3D_SHADER_RESOURCE_BUFFER)
-                flags = VKD3D_SHADER_BINDING_FLAG_BUFFER;
-            else
-                flags = VKD3D_SHADER_BINDING_FLAG_IMAGE;
+    return true;
+}
 
-            vk_descriptor_type = vk_descriptor_type_from_vkd3d(d->type, d->resource_type);
-            if (!shader_spirv_resource_bindings_add_binding(bindings, d->type, vk_descriptor_type,
-                    d->register_index, shader_visibility, vk_stage, flags, &binding_idx))
-                return false;
+static bool shader_spirv_resource_bindings_init(struct shader_spirv_resource_bindings *bindings,
+        struct wined3d_shader_resource_bindings *wined3d_bindings,
+        const struct wined3d_state *state, uint32_t shader_mask)
+{
+    enum wined3d_shader_type shader_type;
+    struct wined3d_shader *shader;
 
-            wined3d_type = wined3d_descriptor_type_from_vkd3d(d->type);
-            if (!wined3d_shader_resource_bindings_add_binding(wined3d_bindings, shader_type,
-                    wined3d_type, d->register_index, wined3d_shader_resource_type_from_vkd3d(d->resource_type),
-                    wined3d_data_type_from_vkd3d(d->resource_data_type), binding_idx))
-                return false;
+    bindings->binding_count = 0;
+    bindings->uav_counter_count = 0;
+    bindings->vk_binding_count = 0;
+    bindings->so_stage = WINED3D_SHADER_TYPE_GEOMETRY;
+    wined3d_bindings->count = 0;
 
-            if (d->type == VKD3D_SHADER_DESCRIPTOR_TYPE_UAV
-                    && (d->flags & VKD3D_SHADER_DESCRIPTOR_INFO_FLAG_UAV_COUNTER))
-            {
-                if (!shader_spirv_resource_bindings_add_uav_counter_binding(bindings,
-                        d->register_index, shader_visibility, vk_stage, &binding_idx))
-                    return false;
-                if (!wined3d_shader_resource_bindings_add_binding(wined3d_bindings,
-                        shader_type, WINED3D_SHADER_DESCRIPTOR_TYPE_UAV_COUNTER, d->register_index,
-                        WINED3D_SHADER_RESOURCE_BUFFER, WINED3D_DATA_UINT, binding_idx))
-                    return false;
-            }
-        }
+    for (shader_type = 0; shader_type < WINED3D_SHADER_TYPE_COUNT; ++shader_type)
+    {
+        bindings->binding_base[shader_type] = bindings->vk_binding_count;
+
+        if (!(shader_mask & (1u << shader_type)) || !(shader = state->shader[shader_type]))
+            continue;
+
+        if (!shader_spirv_resource_bindings_add_shader(bindings, wined3d_bindings, shader, shader_type))
+            return false;
     }
 
     return true;
-- 
2.30.2




More information about the wine-devel mailing list