From: Zebediah Figura Subject: [PATCH vkd3d 2/6] vkd3d-shader: Return a vkd3d_string_buffer from hlsl_modifiers_to_string(). Message-Id: <20210223215701.477435-2-zfigura@codeweavers.com> Date: Tue, 23 Feb 2021 15:56:57 -0600 In-Reply-To: <20210223215701.477435-1-zfigura@codeweavers.com> References: <20210223215701.477435-1-zfigura@codeweavers.com> Signed-off-by: Zebediah Figura --- 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 78eacf28..10059e83 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_list *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_list string_buffers; + struct vkd3d_string_buffer *string; + + vkd3d_string_buffer_list_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_list_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 62f7d88b..467ed67c 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_list *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_list *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 1fb1b7f3..dd15f627 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)) -- 2.30.1