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

Signed-off-by: Zebediah Figura <zfigura@codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Matteo Bruni <mbruni@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Zebediah Figura 2021-02-27 18:03:10 -06:00 committed by Alexandre Julliard
parent 48a1db2976
commit 35105d4e29
3 changed files with 37 additions and 34 deletions

View File

@ -730,46 +730,45 @@ const char *debug_hlsl_type(const struct hlsl_type *type)
return ret; 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; struct vkd3d_string_buffer *string;
size_t len;
if (!(string = vkd3d_malloc(110))) if (!(string = vkd3d_string_buffer_get(string_buffers)))
return NULL; return NULL;
string[0] = 0;
if (modifiers & HLSL_STORAGE_EXTERN) if (modifiers & HLSL_STORAGE_EXTERN)
strcat(string, "extern "); /* 7 */ vkd3d_string_buffer_printf(string, "extern ");
if (modifiers & HLSL_STORAGE_NOINTERPOLATION) if (modifiers & HLSL_STORAGE_NOINTERPOLATION)
strcat(string, "nointerpolation "); /* 16 */ vkd3d_string_buffer_printf(string, "nointerpolation ");
if (modifiers & HLSL_MODIFIER_PRECISE) if (modifiers & HLSL_MODIFIER_PRECISE)
strcat(string, "precise "); /* 8 */ vkd3d_string_buffer_printf(string, "precise ");
if (modifiers & HLSL_STORAGE_SHARED) if (modifiers & HLSL_STORAGE_SHARED)
strcat(string, "shared "); /* 7 */ vkd3d_string_buffer_printf(string, "shared ");
if (modifiers & HLSL_STORAGE_GROUPSHARED) if (modifiers & HLSL_STORAGE_GROUPSHARED)
strcat(string, "groupshared "); /* 12 */ vkd3d_string_buffer_printf(string, "groupshared ");
if (modifiers & HLSL_STORAGE_STATIC) if (modifiers & HLSL_STORAGE_STATIC)
strcat(string, "static "); /* 7 */ vkd3d_string_buffer_printf(string, "static ");
if (modifiers & HLSL_STORAGE_UNIFORM) if (modifiers & HLSL_STORAGE_UNIFORM)
strcat(string, "uniform "); /* 8 */ vkd3d_string_buffer_printf(string, "uniform ");
if (modifiers & HLSL_STORAGE_VOLATILE) if (modifiers & HLSL_STORAGE_VOLATILE)
strcat(string, "volatile "); /* 9 */ vkd3d_string_buffer_printf(string, "volatile ");
if (modifiers & HLSL_MODIFIER_CONST) if (modifiers & HLSL_MODIFIER_CONST)
strcat(string, "const "); /* 6 */ vkd3d_string_buffer_printf(string, "const ");
if (modifiers & HLSL_MODIFIER_ROW_MAJOR) if (modifiers & HLSL_MODIFIER_ROW_MAJOR)
strcat(string, "row_major "); /* 10 */ vkd3d_string_buffer_printf(string, "row_major ");
if (modifiers & HLSL_MODIFIER_COLUMN_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)) 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) else if (modifiers & HLSL_STORAGE_IN)
strcat(string, "in "); /* 3 */ vkd3d_string_buffer_printf(string, "in ");
else if (modifiers & HLSL_STORAGE_OUT) else if (modifiers & HLSL_STORAGE_OUT)
strcat(string, "out "); /* 4 */ vkd3d_string_buffer_printf(string, "out ");
if ((len = strlen(string))) if (string->content_size)
string[len - 1] = 0; string->buffer[--string->content_size] = 0;
return string; return string;
} }
@ -818,11 +817,14 @@ static void dump_ir_var(struct vkd3d_string_buffer *buffer, const struct hlsl_ir
{ {
if (var->modifiers) if (var->modifiers)
{ {
char *string; struct vkd3d_string_buffer_cache string_buffers;
struct vkd3d_string_buffer *string;
if ((string = hlsl_modifiers_to_string(var->modifiers))) vkd3d_string_buffer_cache_init(&string_buffers);
vkd3d_string_buffer_printf(buffer, "%s ", string); if ((string = hlsl_modifiers_to_string(&string_buffers, var->modifiers)))
vkd3d_free(string); 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); vkd3d_string_buffer_printf(buffer, "%s %s", debug_hlsl_type(var->data_type), var->name);
if (var->semantic) if (var->semantic)

View File

@ -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, struct vkd3d_string_buffer *hlsl_type_to_string(struct vkd3d_string_buffer_cache *string_buffers,
const struct hlsl_type *type) DECLSPEC_HIDDEN; 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; 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, void hlsl_add_function(struct rb_tree *funcs, char *name, struct hlsl_ir_function_decl *decl,

View File

@ -291,12 +291,12 @@ static bool declare_variable(struct hlsl_ctx *ctx, struct hlsl_ir_var *decl, boo
if (invalid) 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, hlsl_error(ctx, decl->loc, VKD3D_SHADER_ERROR_HLSL_INVALID_MODIFIER,
"Modifiers '%s' are not allowed on local variables.", string); "Modifiers '%s' are not allowed on local variables.", string->buffer);
vkd3d_free(string); vkd3d_string_buffer_release(&ctx->string_buffers, string);
} }
if (decl->semantic) if (decl->semantic)
@ -332,12 +332,12 @@ static DWORD add_modifiers(struct hlsl_ctx *ctx, DWORD modifiers, DWORD mod, con
{ {
if (modifiers & mod) 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, hlsl_error(ctx, loc, VKD3D_SHADER_ERROR_HLSL_INVALID_MODIFIER,
"Modifier '%s' was already specified.", string); "Modifier '%s' was already specified.", string->buffer);
vkd3d_free(string); vkd3d_string_buffer_release(&ctx->string_buffers, string);
return modifiers; return modifiers;
} }
if ((mod & HLSL_MODIFIERS_MAJORITY_MASK) && (modifiers & HLSL_MODIFIERS_MAJORITY_MASK)) if ((mod & HLSL_MODIFIERS_MAJORITY_MASK) && (modifiers & HLSL_MODIFIERS_MAJORITY_MASK))