Zebediah Figura : vkd3d-shader: Return a vkd3d_string_buffer from hlsl_modifiers_to_string().

Alexandre Julliard julliard at winehq.org
Tue Mar 2 15:31:17 CST 2021


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

Author: Zebediah Figura <zfigura at codeweavers.com>
Date:   Sat Feb 27 18:03:10 2021 -0600

vkd3d-shader: Return a vkd3d_string_buffer from hlsl_modifiers_to_string().

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.c | 54 +++++++++++++++++++++++++-----------------------
 libs/vkd3d-shader/hlsl.h |  3 ++-
 libs/vkd3d-shader/hlsl.y | 16 +++++++-------
 3 files changed, 38 insertions(+), 35 deletions(-)

diff --git a/libs/vkd3d-shader/hlsl.c b/libs/vkd3d-shader/hlsl.c
index e2a7770..fbbe001 100644
--- a/libs/vkd3d-shader/hlsl.c
+++ b/libs/vkd3d-shader/hlsl.c
@@ -730,46 +730,45 @@ const char *debug_hlsl_type(const struct hlsl_type *type)
     return ret;
 }
 
-char *hlsl_modifiers_to_string(unsigned int modifiers)
+struct vkd3d_string_buffer *hlsl_modifiers_to_string(struct vkd3d_string_buffer_cache *string_buffers,
+        unsigned int modifiers)
 {
-    char *string;
-    size_t len;
+    struct vkd3d_string_buffer *string;
 
-    if (!(string = vkd3d_malloc(110)))
+    if (!(string = vkd3d_string_buffer_get(string_buffers)))
         return NULL;
 
-    string[0] = 0;
     if (modifiers & HLSL_STORAGE_EXTERN)
-        strcat(string, "extern ");                       /* 7 */
+        vkd3d_string_buffer_printf(string, "extern ");
     if (modifiers & HLSL_STORAGE_NOINTERPOLATION)
-        strcat(string, "nointerpolation ");              /* 16 */
+        vkd3d_string_buffer_printf(string, "nointerpolation ");
     if (modifiers & HLSL_MODIFIER_PRECISE)
-        strcat(string, "precise ");                      /* 8 */
+        vkd3d_string_buffer_printf(string, "precise ");
     if (modifiers & HLSL_STORAGE_SHARED)
-        strcat(string, "shared ");                       /* 7 */
+        vkd3d_string_buffer_printf(string, "shared ");
     if (modifiers & HLSL_STORAGE_GROUPSHARED)
-        strcat(string, "groupshared ");                  /* 12 */
+        vkd3d_string_buffer_printf(string, "groupshared ");
     if (modifiers & HLSL_STORAGE_STATIC)
-        strcat(string, "static ");                       /* 7 */
+        vkd3d_string_buffer_printf(string, "static ");
     if (modifiers & HLSL_STORAGE_UNIFORM)
-        strcat(string, "uniform ");                      /* 8 */
+        vkd3d_string_buffer_printf(string, "uniform ");
     if (modifiers & HLSL_STORAGE_VOLATILE)
-        strcat(string, "volatile ");                     /* 9 */
+        vkd3d_string_buffer_printf(string, "volatile ");
     if (modifiers & HLSL_MODIFIER_CONST)
-        strcat(string, "const ");                        /* 6 */
+        vkd3d_string_buffer_printf(string, "const ");
     if (modifiers & HLSL_MODIFIER_ROW_MAJOR)
-        strcat(string, "row_major ");                    /* 10 */
+        vkd3d_string_buffer_printf(string, "row_major ");
     if (modifiers & HLSL_MODIFIER_COLUMN_MAJOR)
-        strcat(string, "column_major ");                 /* 13 */
+        vkd3d_string_buffer_printf(string, "column_major ");
     if ((modifiers & (HLSL_STORAGE_IN | HLSL_STORAGE_OUT)) == (HLSL_STORAGE_IN | HLSL_STORAGE_OUT))
-        strcat(string, "inout ");                        /* 6 */
+        vkd3d_string_buffer_printf(string, "inout ");
     else if (modifiers & HLSL_STORAGE_IN)
-        strcat(string, "in ");                           /* 3 */
+        vkd3d_string_buffer_printf(string, "in ");
     else if (modifiers & HLSL_STORAGE_OUT)
-        strcat(string, "out ");                          /* 4 */
+        vkd3d_string_buffer_printf(string, "out ");
 
-    if ((len = strlen(string)))
-        string[len - 1] = 0;
+    if (string->content_size)
+        string->buffer[--string->content_size] = 0;
 
     return string;
 }
@@ -818,11 +817,14 @@ static void dump_ir_var(struct vkd3d_string_buffer *buffer, const struct hlsl_ir
 {
     if (var->modifiers)
     {
-        char *string;
-
-        if ((string = hlsl_modifiers_to_string(var->modifiers)))
-            vkd3d_string_buffer_printf(buffer, "%s ", string);
-        vkd3d_free(string);
+        struct vkd3d_string_buffer_cache string_buffers;
+        struct vkd3d_string_buffer *string;
+
+        vkd3d_string_buffer_cache_init(&string_buffers);
+        if ((string = hlsl_modifiers_to_string(&string_buffers, var->modifiers)))
+            vkd3d_string_buffer_printf(buffer, "%s ", string->buffer);
+        vkd3d_string_buffer_release(&string_buffers, string);
+        vkd3d_string_buffer_cache_cleanup(&string_buffers);
     }
     vkd3d_string_buffer_printf(buffer, "%s %s", debug_hlsl_type(var->data_type), var->name);
     if (var->semantic)
diff --git a/libs/vkd3d-shader/hlsl.h b/libs/vkd3d-shader/hlsl.h
index 5a0470b..8107b26 100644
--- a/libs/vkd3d-shader/hlsl.h
+++ b/libs/vkd3d-shader/hlsl.h
@@ -499,7 +499,8 @@ const char *debug_hlsl_type(const struct hlsl_type *type) DECLSPEC_HIDDEN;
 
 struct vkd3d_string_buffer *hlsl_type_to_string(struct vkd3d_string_buffer_cache *string_buffers,
         const struct hlsl_type *type) DECLSPEC_HIDDEN;
-char *hlsl_modifiers_to_string(unsigned int modifiers) DECLSPEC_HIDDEN;
+struct vkd3d_string_buffer *hlsl_modifiers_to_string(struct vkd3d_string_buffer_cache *string_buffers,
+        unsigned int modifiers) DECLSPEC_HIDDEN;
 const char *hlsl_node_type_to_string(enum hlsl_ir_node_type type) DECLSPEC_HIDDEN;
 
 void hlsl_add_function(struct rb_tree *funcs, char *name, struct hlsl_ir_function_decl *decl,
diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y
index 1fb1b7f..dd15f62 100644
--- a/libs/vkd3d-shader/hlsl.y
+++ b/libs/vkd3d-shader/hlsl.y
@@ -291,12 +291,12 @@ static bool declare_variable(struct hlsl_ctx *ctx, struct hlsl_ir_var *decl, boo
 
         if (invalid)
         {
-            char *string;
+            struct vkd3d_string_buffer *string;
 
-            if ((string = hlsl_modifiers_to_string(invalid)))
+            if ((string = hlsl_modifiers_to_string(&ctx->string_buffers, invalid)))
                 hlsl_error(ctx, decl->loc, VKD3D_SHADER_ERROR_HLSL_INVALID_MODIFIER,
-                        "Modifiers '%s' are not allowed on local variables.", string);
-            vkd3d_free(string);
+                        "Modifiers '%s' are not allowed on local variables.", string->buffer);
+            vkd3d_string_buffer_release(&ctx->string_buffers, string);
         }
 
         if (decl->semantic)
@@ -332,12 +332,12 @@ static DWORD add_modifiers(struct hlsl_ctx *ctx, DWORD modifiers, DWORD mod, con
 {
     if (modifiers & mod)
     {
-        char *string;
+        struct vkd3d_string_buffer *string;
 
-        if ((string = hlsl_modifiers_to_string(mod)))
+        if ((string = hlsl_modifiers_to_string(&ctx->string_buffers, mod)))
             hlsl_error(ctx, loc, VKD3D_SHADER_ERROR_HLSL_INVALID_MODIFIER,
-                    "Modifier '%s' was already specified.", string);
-        vkd3d_free(string);
+                    "Modifier '%s' was already specified.", string->buffer);
+        vkd3d_string_buffer_release(&ctx->string_buffers, string);
         return modifiers;
     }
     if ((mod & HLSL_MODIFIERS_MAJORITY_MASK) && (modifiers & HLSL_MODIFIERS_MAJORITY_MASK))




More information about the wine-cvs mailing list