Conor McCarthy : vkd3d-shader: Get descriptor info for descriptor arrays.

Alexandre Julliard julliard at winehq.org
Mon Jul 26 15:28:33 CDT 2021


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

Author: Conor McCarthy <cmccarthy at codeweavers.com>
Date:   Fri Jul 23 23:01:38 2021 +1000

vkd3d-shader: Get descriptor info for descriptor arrays.

Signed-off-by: Conor McCarthy <cmccarthy at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 include/vkd3d_shader.h                | 5 ++++-
 libs/vkd3d-shader/spirv.c             | 4 +++-
 libs/vkd3d-shader/vkd3d_shader_main.c | 2 +-
 3 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/include/vkd3d_shader.h b/include/vkd3d_shader.h
index 0e01134..6cdbaf1 100644
--- a/include/vkd3d_shader.h
+++ b/include/vkd3d_shader.h
@@ -1137,7 +1137,10 @@ struct vkd3d_shader_descriptor_info
      * \ref vkd3d_shader_descriptor_info_flag.
      */
     unsigned int flags;
-    /** Size of this descriptor array, or 1 if a single descriptor. */
+    /**
+     *  Size of this descriptor array, or 1 if a single descriptor.
+     *  For an unbounded array this value is ~0u.
+     */
     unsigned int count;
 };
 
diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c
index f164322..ea02004 100644
--- a/libs/vkd3d-shader/spirv.c
+++ b/libs/vkd3d-shader/spirv.c
@@ -5541,13 +5541,15 @@ static const struct vkd3d_shader_descriptor_info *vkd3d_dxbc_compiler_get_descri
         const struct vkd3d_shader_register_range *range)
 {
     const struct vkd3d_shader_scan_descriptor_info *descriptor_info = compiler->scan_descriptor_info;
+    unsigned int register_last = (range->last == ~0u) ? range->first : range->last;
     const struct vkd3d_shader_descriptor_info *d;
     unsigned int i;
 
     for (i = 0; i < descriptor_info->descriptor_count; ++i)
     {
         d = &descriptor_info->descriptors[i];
-        if (d->type == type && d->register_space == range->space && d->register_index == range->first)
+        if (d->type == type && d->register_space == range->space && d->register_index <= range->first
+                    && (d->count == ~0u || d->count > register_last - d->register_index))
             return d;
     }
 
diff --git a/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d-shader/vkd3d_shader_main.c
index 54654f3..1a566a7 100644
--- a/libs/vkd3d-shader/vkd3d_shader_main.c
+++ b/libs/vkd3d-shader/vkd3d_shader_main.c
@@ -601,7 +601,7 @@ static bool vkd3d_shader_scan_add_descriptor(struct vkd3d_shader_scan_context *c
     d->resource_type = resource_type;
     d->resource_data_type = resource_data_type;
     d->flags = flags;
-    d->count = 1;
+    d->count = (range->last == ~0u) ? ~0u : range->last - range->first + 1;
     ++info->descriptor_count;
 
     return true;




More information about the wine-cvs mailing list