Zebediah Figura : vkd3d-shader/hlsl: Write SM5 RDEF extensions.

Alexandre Julliard julliard at winehq.org
Thu Aug 19 15:57:49 CDT 2021


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

Author: Zebediah Figura <zfigura at codeweavers.com>
Date:   Tue Aug 17 12:39:01 2021 -0500

vkd3d-shader/hlsl: Write SM5 RDEF extensions.

Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Matteo Bruni <mbruni at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 libs/vkd3d-shader/hlsl_sm4.c | 39 +++++++++++++++++++++++++++++++++++++--
 1 file changed, 37 insertions(+), 2 deletions(-)

diff --git a/libs/vkd3d-shader/hlsl_sm4.c b/libs/vkd3d-shader/hlsl_sm4.c
index cba56ee..9f5c18d 100644
--- a/libs/vkd3d-shader/hlsl_sm4.c
+++ b/libs/vkd3d-shader/hlsl_sm4.c
@@ -129,13 +129,18 @@ static D3D_SHADER_VARIABLE_TYPE sm4_base_type(const struct hlsl_type *type)
 static void write_sm4_type(struct hlsl_ctx *ctx, struct vkd3d_bytecode_buffer *buffer, struct hlsl_type *type)
 {
     const struct hlsl_type *array_type = get_array_type(type);
+    const char *name = array_type->name ? array_type->name : "<unnamed>";
+    const struct hlsl_profile_info *profile = ctx->profile;
     unsigned int field_count = 0, array_size = 0;
+    size_t fields_offset = 0, name_offset = 0;
     struct hlsl_struct_field *field;
-    size_t fields_offset = 0;
 
     if (type->bytecode_offset)
         return;
 
+    if (profile->major_version >= 5)
+        name_offset = put_string(buffer, name);
+
     if (type->type == HLSL_CLASS_ARRAY)
         array_size = get_array_size(type);
 
@@ -162,6 +167,15 @@ static void write_sm4_type(struct hlsl_ctx *ctx, struct vkd3d_bytecode_buffer *b
     put_u32(buffer, type->dimy | (type->dimx << 16));
     put_u32(buffer, array_size | (field_count << 16));
     put_u32(buffer, fields_offset);
+
+    if (profile->major_version >= 5)
+    {
+        put_u32(buffer, 0); /* FIXME: unknown */
+        put_u32(buffer, 0); /* FIXME: unknown */
+        put_u32(buffer, 0); /* FIXME: unknown */
+        put_u32(buffer, 0); /* FIXME: unknown */
+        put_u32(buffer, name_offset);
+    }
 }
 
 static void write_sm4_rdef(struct hlsl_ctx *ctx, struct dxbc_writer *dxbc)
@@ -197,6 +211,18 @@ static void write_sm4_rdef(struct hlsl_ctx *ctx, struct dxbc_writer *dxbc)
     put_u32(&buffer, 0); /* FIXME: compilation flags */
     creator_position = put_u32(&buffer, 0);
 
+    if (profile->major_version >= 5)
+    {
+        put_u32(&buffer, TAG_RD11);
+        put_u32(&buffer, 15 * sizeof(uint32_t)); /* size of RDEF header including this header */
+        put_u32(&buffer, 6 * sizeof(uint32_t)); /* size of buffer desc */
+        put_u32(&buffer, 8 * sizeof(uint32_t)); /* size of binding desc */
+        put_u32(&buffer, 10 * sizeof(uint32_t)); /* size of variable desc */
+        put_u32(&buffer, 9 * sizeof(uint32_t)); /* size of type desc */
+        put_u32(&buffer, 3 * sizeof(uint32_t)); /* size of member desc */
+        put_u32(&buffer, 0); /* unknown; possibly a null terminator */
+    }
+
     /* Bound resources. */
 
     resources_offset = bytecode_get_size(&buffer);
@@ -293,6 +319,14 @@ static void write_sm4_rdef(struct hlsl_ctx *ctx, struct dxbc_writer *dxbc)
                 put_u32(&buffer, flags);
                 put_u32(&buffer, 0); /* type */
                 put_u32(&buffer, 0); /* FIXME: default value */
+
+                if (profile->major_version >= 5)
+                {
+                    put_u32(&buffer, 0); /* texture start */
+                    put_u32(&buffer, 0); /* texture count */
+                    put_u32(&buffer, 0); /* sampler start */
+                    put_u32(&buffer, 0); /* sampler count */
+                }
             }
         }
 
@@ -301,7 +335,8 @@ static void write_sm4_rdef(struct hlsl_ctx *ctx, struct dxbc_writer *dxbc)
         {
             if (var->is_uniform && var->buffer == cbuffer)
             {
-                size_t var_offset = vars_start + j * 6 * sizeof(uint32_t);
+                const unsigned int var_size = (profile->major_version >= 5 ? 10 : 6);
+                size_t var_offset = vars_start + j * var_size * sizeof(uint32_t);
                 size_t string_offset = put_string(&buffer, var->name);
 
                 set_u32(&buffer, var_offset, string_offset);




More information about the wine-cvs mailing list