=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: vkd3d-shader: Introduce vkd3d_shader_binding_flags.

Alexandre Julliard julliard at winehq.org
Mon Oct 29 18:00:21 CDT 2018


Module: vkd3d
Branch: master
Commit: ae84b5210e58a9f49d93d6ad39f0df5ae4df4bd7
URL:    https://source.winehq.org/git/vkd3d.git/?a=commit;h=ae84b5210e58a9f49d93d6ad39f0df5ae4df4bd7

Author: Józef Kucia <jkucia at codeweavers.com>
Date:   Mon Oct 29 11:12:16 2018 +0100

vkd3d-shader: Introduce vkd3d_shader_binding_flags.

Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 include/private/vkd3d_shader.h | 13 ++++++++++---
 libs/vkd3d-shader/spirv.c      | 23 ++++++++++++++++-------
 libs/vkd3d/state.c             | 17 +++++++++--------
 3 files changed, 35 insertions(+), 18 deletions(-)

diff --git a/include/private/vkd3d_shader.h b/include/private/vkd3d_shader.h
index b9472a2..d55ed9f 100644
--- a/include/private/vkd3d_shader.h
+++ b/include/private/vkd3d_shader.h
@@ -19,7 +19,6 @@
 #ifndef __VKD3D_SHADER_H
 #define __VKD3D_SHADER_H
 
-#include <stdbool.h>
 #include <stdint.h>
 
 #ifdef __cplusplus
@@ -82,12 +81,20 @@ struct vkd3d_shader_descriptor_binding
     uint32_t binding;
 };
 
+enum vkd3d_shader_binding_flag
+{
+    VKD3D_SHADER_BINDING_FLAG_BUFFER = 0x00000001,
+    VKD3D_SHADER_BINDING_FLAG_IMAGE  = 0x00000002,
+
+    VKD3D_FORCE_32_BIT_ENUM(VKD3D_SHADER_BINDING_FLAG),
+};
+
 struct vkd3d_shader_resource_binding
 {
     enum vkd3d_shader_descriptor_type type;
     unsigned int register_index;
     enum vkd3d_shader_visibility shader_visibility;
-    bool is_buffer;
+    unsigned int flags; /* vkd3d_shader_binding_flags */
 
     struct vkd3d_shader_descriptor_binding binding;
 };
@@ -99,7 +106,7 @@ struct vkd3d_shader_combined_resource_sampler
     unsigned int resource_index;
     unsigned int sampler_index;
     enum vkd3d_shader_visibility shader_visibility;
-    bool is_buffer;
+    unsigned int flags; /* vkd3d_shader_binding_flags */
 
     struct vkd3d_shader_descriptor_binding binding;
 };
diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c
index d281d25..79af890 100644
--- a/libs/vkd3d-shader/spirv.c
+++ b/libs/vkd3d-shader/spirv.c
@@ -2057,9 +2057,9 @@ static struct vkd3d_shader_descriptor_binding vkd3d_dxbc_compiler_get_descriptor
 {
     const struct vkd3d_shader_interface *shader_interface = &compiler->shader_interface;
     enum vkd3d_shader_descriptor_type descriptor_type;
+    enum vkd3d_shader_binding_flag resource_type_flag;
     struct vkd3d_shader_descriptor_binding binding;
     unsigned int reg_idx = reg->idx[0].offset;
-    bool is_buffer_resource;
     unsigned int i;
 
     descriptor_type = VKD3D_SHADER_DESCRIPTOR_TYPE_UNKNOWN;
@@ -2074,7 +2074,9 @@ static struct vkd3d_shader_descriptor_binding vkd3d_dxbc_compiler_get_descriptor
     else
         FIXME("Unhandled register type %#x.\n", reg->type);
 
-    is_buffer_resource = resource_type == VKD3D_SHADER_RESOURCE_BUFFER;
+    resource_type_flag = resource_type == VKD3D_SHADER_RESOURCE_BUFFER
+            ? VKD3D_SHADER_BINDING_FLAG_BUFFER : VKD3D_SHADER_BINDING_FLAG_IMAGE;
+
     if (is_uav_counter)
     {
         assert(descriptor_type == VKD3D_SHADER_DESCRIPTOR_TYPE_UAV);
@@ -2098,11 +2100,13 @@ static struct vkd3d_shader_descriptor_binding vkd3d_dxbc_compiler_get_descriptor
         {
             const struct vkd3d_shader_resource_binding *current = &shader_interface->bindings[i];
 
+            if (!(current->flags & resource_type_flag))
+                continue;
+
             if (!vkd3d_dxbc_compiler_check_shader_visibility(compiler, current->shader_visibility))
                 continue;
 
-            if (current->type == descriptor_type && current->register_index == reg_idx
-                    && current->is_buffer == is_buffer_resource)
+            if (current->type == descriptor_type && current->register_index == reg_idx)
                 return current->binding;
         }
         if (shader_interface->binding_count)
@@ -3908,17 +3912,22 @@ static void vkd3d_dxbc_compiler_emit_combined_sampler_declarations(struct vkd3d_
     const struct vkd3d_shader_combined_resource_sampler *current;
     const unsigned int resource_index = resource->idx[0].offset;
     uint32_t image_type_id, type_id, ptr_type_id, var_id;
-    bool is_buffer_resource, depth;
+    enum vkd3d_shader_binding_flag resource_type_flag;
     struct vkd3d_symbol symbol;
     unsigned int i;
+    bool depth;
 
-    is_buffer_resource = resource_type == VKD3D_SHADER_RESOURCE_BUFFER;
+    resource_type_flag = resource_type == VKD3D_SHADER_RESOURCE_BUFFER
+            ? VKD3D_SHADER_BINDING_FLAG_BUFFER : VKD3D_SHADER_BINDING_FLAG_IMAGE;
 
     for (i = 0; i < shader_interface->combined_sampler_count; ++i)
     {
         current = &shader_interface->combined_samplers[i];
 
-        if (current->resource_index != resource_index || current->is_buffer != is_buffer_resource)
+        if (current->resource_index != resource_index)
+            continue;
+
+        if (!(current->flags & resource_type_flag))
             continue;
 
         if (!vkd3d_dxbc_compiler_check_shader_visibility(compiler, current->shader_visibility))
diff --git a/libs/vkd3d/state.c b/libs/vkd3d/state.c
index 7e0b1ee..4800ff3 100644
--- a/libs/vkd3d/state.c
+++ b/libs/vkd3d/state.c
@@ -607,14 +607,15 @@ static void d3d12_root_signature_append_vk_binding(struct d3d12_root_signature *
         bool buffer_descriptor, enum vkd3d_shader_visibility shader_visibility,
         struct vkd3d_descriptor_set_context *context)
 {
-    unsigned int i = context->descriptor_index++;
-
-    root_signature->descriptor_mapping[i].type = descriptor_type;
-    root_signature->descriptor_mapping[i].register_index = register_idx;
-    root_signature->descriptor_mapping[i].shader_visibility = shader_visibility;
-    root_signature->descriptor_mapping[i].is_buffer = buffer_descriptor;
-    root_signature->descriptor_mapping[i].binding.set = context->set_index;
-    root_signature->descriptor_mapping[i].binding.binding = context->descriptor_binding++;
+    struct vkd3d_shader_resource_binding *mapping
+            = &root_signature->descriptor_mapping[context->descriptor_index++];
+
+    mapping->type = descriptor_type;
+    mapping->register_index = register_idx;
+    mapping->shader_visibility = shader_visibility;
+    mapping->flags = buffer_descriptor ? VKD3D_SHADER_BINDING_FLAG_BUFFER : VKD3D_SHADER_BINDING_FLAG_IMAGE;
+    mapping->binding.set = context->set_index;
+    mapping->binding.binding = context->descriptor_binding++;
 }
 
 static uint32_t d3d12_root_signature_assign_vk_bindings(struct d3d12_root_signature *root_signature,




More information about the wine-cvs mailing list