[PATCH vkd3d] vkd3d-shader: Allow a NULL buffer in vkd3d_string_buffer.

Giovanni Mascellani gmascellani at codeweavers.com
Mon Oct 4 03:32:27 CDT 2021


Semantically, a NULL buffer is considered equivalent to the empty string.
The accessor vkd3d_string_buffer_data implements this equivalence.

The reason for this change is to avoid asserting the result of a memory
allocation in vkd3d_string_buffer_init, while at the same time keeping
it always successful.

Signed-off-by: Giovanni Mascellani <gmascellani at codeweavers.com>
---
 libs/vkd3d-shader/glsl.c                 |  2 +-
 libs/vkd3d-shader/hlsl.c                 |  9 ++++---
 libs/vkd3d-shader/hlsl.y                 | 34 +++++++++++++-----------
 libs/vkd3d-shader/hlsl_codegen.c         |  8 +++---
 libs/vkd3d-shader/hlsl_sm1.c             |  2 +-
 libs/vkd3d-shader/hlsl_sm4.c             |  5 ++--
 libs/vkd3d-shader/preproc.l              |  7 ++---
 libs/vkd3d-shader/spirv.c                |  2 +-
 libs/vkd3d-shader/trace.c                |  2 +-
 libs/vkd3d-shader/vkd3d_shader_main.c    | 25 ++++++++++-------
 libs/vkd3d-shader/vkd3d_shader_private.h |  1 +
 11 files changed, 57 insertions(+), 40 deletions(-)

diff --git a/libs/vkd3d-shader/glsl.c b/libs/vkd3d-shader/glsl.c
index 7e028d23..fec412b1 100644
--- a/libs/vkd3d-shader/glsl.c
+++ b/libs/vkd3d-shader/glsl.c
@@ -127,7 +127,7 @@ int vkd3d_glsl_generator_generate(struct vkd3d_glsl_generator *generator,
 
     if ((code = vkd3d_malloc(generator->buffer.buffer_size)))
     {
-        memcpy(code, generator->buffer.buffer, generator->buffer.content_size);
+        memcpy(code, vkd3d_string_buffer_data(&generator->buffer), generator->buffer.content_size);
         out->size = generator->buffer.content_size;
         out->code = code;
     }
diff --git a/libs/vkd3d-shader/hlsl.c b/libs/vkd3d-shader/hlsl.c
index 66ca389a..e64d8808 100644
--- a/libs/vkd3d-shader/hlsl.c
+++ b/libs/vkd3d-shader/hlsl.c
@@ -64,7 +64,8 @@ void hlsl_fixme(struct hlsl_ctx *ctx, const struct vkd3d_shader_location loc, co
     string = hlsl_get_string_buffer(ctx);
     vkd3d_string_buffer_printf(string, "Aborting due to not yet implemented feature: ");
     vkd3d_string_buffer_vprintf(string, fmt, args);
-    vkd3d_shader_error(ctx->message_context, &loc, VKD3D_SHADER_ERROR_HLSL_NOT_IMPLEMENTED, "%s", string->buffer);
+    vkd3d_shader_error(ctx->message_context, &loc, VKD3D_SHADER_ERROR_HLSL_NOT_IMPLEMENTED,
+            "%s", vkd3d_string_buffer_data(string));
     hlsl_release_string_buffer(ctx, string);
     va_end(args);
 
@@ -855,7 +856,7 @@ struct vkd3d_string_buffer *hlsl_type_to_string(struct hlsl_ctx *ctx, const stru
 
             if ((inner_string = hlsl_type_to_string(ctx, t)))
             {
-                vkd3d_string_buffer_printf(string, "%s", inner_string->buffer);
+                vkd3d_string_buffer_printf(string, "%s", vkd3d_string_buffer_data(inner_string));
                 hlsl_release_string_buffer(ctx, inner_string);
             }
 
@@ -881,7 +882,7 @@ const char *debug_hlsl_type(struct hlsl_ctx *ctx, const struct hlsl_type *type)
 
     if (!(string = hlsl_type_to_string(ctx, type)))
         return NULL;
-    ret = vkd3d_dbg_sprintf("%s", string->buffer);
+    ret = vkd3d_dbg_sprintf("%s", vkd3d_string_buffer_data(string));
     hlsl_release_string_buffer(ctx, string);
     return ret;
 }
@@ -975,7 +976,7 @@ static void dump_ir_var(struct hlsl_ctx *ctx, struct vkd3d_string_buffer *buffer
         struct vkd3d_string_buffer *string;
 
         if ((string = hlsl_modifiers_to_string(ctx, var->modifiers)))
-            vkd3d_string_buffer_printf(buffer, "%s ", string->buffer);
+            vkd3d_string_buffer_printf(buffer, "%s ", vkd3d_string_buffer_data(string));
         hlsl_release_string_buffer(ctx, string);
     }
     vkd3d_string_buffer_printf(buffer, "%s %s", debug_hlsl_type(ctx, var->data_type), var->name);
diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y
index d1ef9eb4..4f5e629d 100644
--- a/libs/vkd3d-shader/hlsl.y
+++ b/libs/vkd3d-shader/hlsl.y
@@ -274,7 +274,8 @@ static struct hlsl_ir_node *add_implicit_conversion(struct hlsl_ctx *ctx, struct
         dst_string = hlsl_type_to_string(ctx, dst_type);
         if (src_string && dst_string)
             hlsl_error(ctx, *loc, VKD3D_SHADER_ERROR_HLSL_INVALID_TYPE,
-                    "Can't implicitly convert from %s to %s.", src_string->buffer, dst_string->buffer);
+                    "Can't implicitly convert from %s to %s.",
+                    vkd3d_string_buffer_data(src_string), vkd3d_string_buffer_data(dst_string));
         hlsl_release_string_buffer(ctx, src_string);
         hlsl_release_string_buffer(ctx, dst_string);
         return NULL;
@@ -298,7 +299,7 @@ static DWORD add_modifiers(struct hlsl_ctx *ctx, DWORD modifiers, DWORD mod, con
 
         if ((string = hlsl_modifiers_to_string(ctx, mod)))
             hlsl_error(ctx, loc, VKD3D_SHADER_ERROR_HLSL_INVALID_MODIFIER,
-                    "Modifier '%s' was already specified.", string->buffer);
+                    "Modifier '%s' was already specified.", vkd3d_string_buffer_data(string));
         hlsl_release_string_buffer(ctx, string);
         return modifiers;
     }
@@ -919,7 +920,8 @@ static struct hlsl_type *expr_common_type(struct hlsl_ctx *ctx, struct hlsl_type
 
         if ((string = hlsl_type_to_string(ctx, t1)))
             hlsl_error(ctx, *loc, VKD3D_SHADER_ERROR_HLSL_INVALID_TYPE,
-                    "Expression of type \"%s\" cannot be used in a numeric expression.", string->buffer);
+                    "Expression of type \"%s\" cannot be used in a numeric expression.",
+                    vkd3d_string_buffer_data(string));
         hlsl_release_string_buffer(ctx, string);
         return NULL;
     }
@@ -930,7 +932,8 @@ static struct hlsl_type *expr_common_type(struct hlsl_ctx *ctx, struct hlsl_type
 
         if ((string = hlsl_type_to_string(ctx, t2)))
             hlsl_error(ctx, *loc, VKD3D_SHADER_ERROR_HLSL_INVALID_TYPE,
-                    "Expression of type \"%s\" cannot be used in a numeric expression.", string->buffer);
+                    "Expression of type \"%s\" cannot be used in a numeric expression.",
+                    vkd3d_string_buffer_data(string));
         hlsl_release_string_buffer(ctx, string);
         return NULL;
     }
@@ -946,7 +949,7 @@ static struct hlsl_type *expr_common_type(struct hlsl_ctx *ctx, struct hlsl_type
         if (t1_string && t2_string)
             hlsl_error(ctx, *loc, VKD3D_SHADER_ERROR_HLSL_INVALID_TYPE,
                     "Expression data types \"%s\" and \"%s\" are incompatible.",
-                    t1_string->buffer, t2_string->buffer);
+                    vkd3d_string_buffer_data(t1_string), vkd3d_string_buffer_data(t2_string));
         hlsl_release_string_buffer(ctx, t1_string);
         hlsl_release_string_buffer(ctx, t2_string);
         return NULL;
@@ -1410,7 +1413,7 @@ static struct list *declare_vars(struct hlsl_ctx *ctx, struct hlsl_type *basic_t
 
                 if ((string = hlsl_modifiers_to_string(ctx, modifiers & invalid)))
                     hlsl_error(ctx, var->loc, VKD3D_SHADER_ERROR_HLSL_INVALID_MODIFIER,
-                            "Modifiers '%s' are not allowed on local variables.", string->buffer);
+                            "Modifiers '%s' are not allowed on local variables.", vkd3d_string_buffer_data(string));
                 hlsl_release_string_buffer(ctx, string);
             }
             if (var->semantic.name)
@@ -1673,7 +1676,7 @@ static struct list *add_call(struct hlsl_ctx *ctx, const char *name,
                     if ((string = hlsl_type_to_string(ctx, params->args[i]->data_type)))
                         hlsl_error(ctx, loc, VKD3D_SHADER_ERROR_HLSL_INVALID_TYPE,
                                 "Wrong type for argument %u of '%s': expected a numeric type, but got '%s'.\n",
-                                i + 1, name, string->buffer);
+                                i + 1, name, vkd3d_string_buffer_data(string));
                     hlsl_release_string_buffer(ctx, string);
                     free_parse_initializer(params);
                     return NULL;
@@ -1725,7 +1728,7 @@ static struct list *add_constructor(struct hlsl_ctx *ctx, struct hlsl_type *type
 
             if ((string = hlsl_type_to_string(ctx, arg->data_type)))
                 hlsl_error(ctx, arg->loc, VKD3D_SHADER_ERROR_HLSL_INVALID_TYPE,
-                        "Invalid type %s for constructor argument.", string->buffer);
+                        "Invalid type %s for constructor argument.", vkd3d_string_buffer_data(string));
             hlsl_release_string_buffer(ctx, string);
             continue;
         }
@@ -2171,7 +2174,8 @@ field:
 
                 if ((string = hlsl_modifiers_to_string(ctx, modifiers)))
                     hlsl_error(ctx, @1, VKD3D_SHADER_ERROR_HLSL_INVALID_MODIFIER,
-                            "Modifiers '%s' are not allowed on struct fields.", string->buffer);
+                            "Modifiers '%s' are not allowed on struct fields.",
+                            vkd3d_string_buffer_data(string));
                 hlsl_release_string_buffer(ctx, string);
             }
             $$ = gen_struct_fields(ctx, type, $3);
@@ -2355,7 +2359,7 @@ input_mods:
 
                 if ((string = hlsl_modifiers_to_string(ctx, $2)))
                     hlsl_error(ctx, @2, VKD3D_SHADER_ERROR_HLSL_INVALID_MODIFIER,
-                            "Modifier \"%s\" was already specified.", string->buffer);
+                            "Modifier \"%s\" was already specified.", vkd3d_string_buffer_data(string));
                 hlsl_release_string_buffer(ctx, string);
                 YYABORT;
             }
@@ -2386,7 +2390,7 @@ type:
                 string = hlsl_type_to_string(ctx, $3);
                 if (string)
                     hlsl_error(ctx, @3, VKD3D_SHADER_ERROR_HLSL_INVALID_TYPE,
-                            "Vector base type %s is not scalar.", string->buffer);
+                            "Vector base type %s is not scalar.", vkd3d_string_buffer_data(string));
                 hlsl_release_string_buffer(ctx, string);
                 YYABORT;
             }
@@ -2408,7 +2412,7 @@ type:
                 string = hlsl_type_to_string(ctx, $3);
                 if (string)
                     hlsl_error(ctx, @3, VKD3D_SHADER_ERROR_HLSL_INVALID_TYPE,
-                            "Matrix base type %s is not scalar.", string->buffer);
+                            "Matrix base type %s is not scalar.", vkd3d_string_buffer_data(string));
                 hlsl_release_string_buffer(ctx, string);
                 YYABORT;
             }
@@ -2779,7 +2783,7 @@ selection_statement:
 
                 if ((string = hlsl_type_to_string(ctx, condition->data_type)))
                     hlsl_error(ctx, instr->node.loc, VKD3D_SHADER_ERROR_HLSL_INVALID_TYPE,
-                            "if condition type %s is not scalar.", string->buffer);
+                            "if condition type %s is not scalar.", vkd3d_string_buffer_data(string));
                 hlsl_release_string_buffer(ctx, string);
             }
             $$ = $3;
@@ -3022,7 +3026,7 @@ postfix_expr:
 
                 if ((string = hlsl_type_to_string(ctx, $2)))
                     hlsl_error(ctx, @2, VKD3D_SHADER_ERROR_HLSL_INVALID_TYPE,
-                            "Constructor data type %s is not numeric.", string->buffer);
+                            "Constructor data type %s is not numeric.", vkd3d_string_buffer_data(string));
                 hlsl_release_string_buffer(ctx, string);
                 free_parse_initializer(&$4);
                 YYABORT;
@@ -3106,7 +3110,7 @@ unary_expr:
                 dst_string = hlsl_type_to_string(ctx, dst_type);
                 if (src_string && dst_string)
                     hlsl_error(ctx, @3, VKD3D_SHADER_ERROR_HLSL_INVALID_TYPE, "Can't cast from %s to %s.",
-                            src_string->buffer, dst_string->buffer);
+                            vkd3d_string_buffer_data(src_string), vkd3d_string_buffer_data(dst_string));
                 hlsl_release_string_buffer(ctx, src_string);
                 hlsl_release_string_buffer(ctx, dst_string);
                 YYABORT;
diff --git a/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d-shader/hlsl_codegen.c
index 9c9a3837..2240f489 100644
--- a/libs/vkd3d-shader/hlsl_codegen.c
+++ b/libs/vkd3d-shader/hlsl_codegen.c
@@ -45,7 +45,7 @@ static void prepend_uniform_copy(struct hlsl_ctx *ctx, struct list *instrs, stru
     if (!(name = hlsl_get_string_buffer(ctx)))
         return;
     vkd3d_string_buffer_printf(name, "<temp-%s>", temp->name);
-    temp->name = hlsl_strdup(ctx, name->buffer);
+    temp->name = hlsl_strdup(ctx, vkd3d_string_buffer_data(name));
     hlsl_release_string_buffer(ctx, name);
 
     if (!(load = hlsl_new_var_load(ctx, uniform, temp->loc)))
@@ -76,7 +76,8 @@ static void prepend_input_copy(struct hlsl_ctx *ctx, struct list *instrs, struct
         return;
     }
     new_semantic.index = semantic->index;
-    if (!(input = hlsl_new_var(ctx, hlsl_strdup(ctx, name->buffer), type, var->loc, &new_semantic, 0, NULL)))
+    if (!(input = hlsl_new_var(ctx, hlsl_strdup(ctx, vkd3d_string_buffer_data(name)),
+            type, var->loc, &new_semantic, 0, NULL)))
     {
         hlsl_release_string_buffer(ctx, name);
         vkd3d_free((void *)new_semantic.name);
@@ -147,7 +148,8 @@ static void append_output_copy(struct hlsl_ctx *ctx, struct list *instrs, struct
         return;
     }
     new_semantic.index = semantic->index;
-    if (!(output = hlsl_new_var(ctx, hlsl_strdup(ctx, name->buffer), type, var->loc, &new_semantic, 0, NULL)))
+    if (!(output = hlsl_new_var(ctx, hlsl_strdup(ctx, vkd3d_string_buffer_data(name)),
+            type, var->loc, &new_semantic, 0, NULL)))
     {
         vkd3d_free((void *)new_semantic.name);
         hlsl_release_string_buffer(ctx, name);
diff --git a/libs/vkd3d-shader/hlsl_sm1.c b/libs/vkd3d-shader/hlsl_sm1.c
index ee2870ec..e64ca5f2 100644
--- a/libs/vkd3d-shader/hlsl_sm1.c
+++ b/libs/vkd3d-shader/hlsl_sm1.c
@@ -326,7 +326,7 @@ static void write_sm1_uniforms(struct hlsl_ctx *ctx, struct vkd3d_bytecode_buffe
                 }
                 vkd3d_string_buffer_printf(name, "$%s", var->name);
                 vkd3d_free((char *)var->name);
-                var->name = hlsl_strdup(ctx, name->buffer);
+                var->name = hlsl_strdup(ctx, vkd3d_string_buffer_data(name));
                 hlsl_release_string_buffer(ctx, name);
             }
         }
diff --git a/libs/vkd3d-shader/hlsl_sm4.c b/libs/vkd3d-shader/hlsl_sm4.c
index f7249431..05612806 100644
--- a/libs/vkd3d-shader/hlsl_sm4.c
+++ b/libs/vkd3d-shader/hlsl_sm4.c
@@ -187,7 +187,8 @@ static void write_sm4_signature(struct hlsl_ctx *ctx, struct dxbc_writer *dxbc,
             default:
                 if ((string = hlsl_type_to_string(ctx, var->data_type)))
                     hlsl_error(ctx, var->loc, VKD3D_SHADER_ERROR_HLSL_INVALID_TYPE,
-                            "Invalid data type %s for semantic variable %s.", string->buffer, var->name);
+                            "Invalid data type %s for semantic variable %s.",
+                            vkd3d_string_buffer_data(string), var->name);
                 hlsl_release_string_buffer(ctx, string);
                 put_u32(&buffer, D3D_REGISTER_COMPONENT_UNKNOWN);
         }
@@ -1165,7 +1166,7 @@ static void write_sm4_expr(struct hlsl_ctx *ctx,
             struct vkd3d_string_buffer *string;
 
             if ((string = hlsl_type_to_string(ctx, expr->node.data_type)))
-                hlsl_fixme(ctx, expr->node.loc, "SM4 %s expression.", string->buffer);
+                hlsl_fixme(ctx, expr->node.loc, "SM4 %s expression.", vkd3d_string_buffer_data(string));
             hlsl_release_string_buffer(ctx, string);
             break;
         }
diff --git a/libs/vkd3d-shader/preproc.l b/libs/vkd3d-shader/preproc.l
index bf4d669f..75b8e358 100644
--- a/libs/vkd3d-shader/preproc.l
+++ b/libs/vkd3d-shader/preproc.l
@@ -321,7 +321,8 @@ static bool preproc_push_expansion(struct preproc_ctx *ctx,
         return false;
     exp = &ctx->expansion_stack[ctx->expansion_count++];
     exp->text = text;
-    exp->buffer.lexer_buffer = yy_scan_bytes(text->text.buffer, text->text.content_size, ctx->scanner);
+    exp->buffer.lexer_buffer = yy_scan_bytes(vkd3d_string_buffer_data(&text->text),
+            text->text.content_size, ctx->scanner);
     exp->buffer.location = text->location;
     exp->macro = macro;
     TRACE("Expansion stack size is now %zu.\n", ctx->expansion_count);
@@ -465,7 +466,7 @@ int yylex(YYSTYPE *lval, YYLTYPE *lloc, yyscan_t scanner)
                     {
                         for (i = 0; i < expansion->text.content_size; ++i)
                         {
-                            char c = expansion->text.buffer[i];
+                            char c = vkd3d_string_buffer_data(&expansion->text)[i];
 
                             if (c == '\\' || c == '"')
                                 vkd3d_string_buffer_printf(&ctx->buffer, "\\");
@@ -804,7 +805,7 @@ int preproc_lexer_parse(const struct vkd3d_shader_compile_info *compile_info,
         vkd3d_string_buffer_cleanup(&ctx.buffer);
         return VKD3D_ERROR_OUT_OF_MEMORY;
     }
-    memcpy(output_code, ctx.buffer.buffer, ctx.buffer.content_size);
+    memcpy(output_code, vkd3d_string_buffer_data(&ctx.buffer), ctx.buffer.content_size);
     out->size = ctx.buffer.content_size;
     out->code = output_code;
     vkd3d_string_buffer_trace(&ctx.buffer);
diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c
index f604b8ef..1894e140 100644
--- a/libs/vkd3d-shader/spirv.c
+++ b/libs/vkd3d-shader/spirv.c
@@ -2632,7 +2632,7 @@ static struct vkd3d_shader_descriptor_binding vkd3d_dxbc_compiler_get_descriptor
         if (shader_interface->binding_count)
         {
             struct vkd3d_string_buffer *buffer = vkd3d_shader_register_range_string(compiler, range);
-            const char *range_str = buffer ? buffer->buffer : "";
+            const char *range_str = buffer ? vkd3d_string_buffer_data(buffer) : "";
             FIXME("Could not find descriptor binding for type %#x, space %u, registers %s, shader type %#x.\n",
                     descriptor_type, range->space, range_str, compiler->shader_type);
             vkd3d_dxbc_compiler_error(compiler, VKD3D_SHADER_ERROR_SPV_DESCRIPTOR_BINDING_NOT_FOUND,
diff --git a/libs/vkd3d-shader/trace.c b/libs/vkd3d-shader/trace.c
index 45f38d13..340a4968 100644
--- a/libs/vkd3d-shader/trace.c
+++ b/libs/vkd3d-shader/trace.c
@@ -1938,7 +1938,7 @@ enum vkd3d_result vkd3d_dxbc_binary_to_text(struct vkd3d_shader_parser *parser,
 
     if ((code = vkd3d_malloc(buffer->content_size)))
     {
-        memcpy(code, buffer->buffer, buffer->content_size);
+        memcpy(code, vkd3d_string_buffer_data(buffer), buffer->content_size);
         out->size = buffer->content_size;
         out->code = code;
     }
diff --git a/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d-shader/vkd3d_shader_main.c
index ef9eaef5..8a2dd0e3 100644
--- a/libs/vkd3d-shader/vkd3d_shader_main.c
+++ b/libs/vkd3d-shader/vkd3d_shader_main.c
@@ -25,11 +25,9 @@ VKD3D_DEBUG_ENV_NAME("VKD3D_SHADER_DEBUG");
 
 void vkd3d_string_buffer_init(struct vkd3d_string_buffer *buffer)
 {
-    buffer->buffer_size = 16;
+    buffer->buffer_size = 0;
     buffer->content_size = 0;
-    buffer->buffer = vkd3d_malloc(buffer->buffer_size);
-    assert(buffer->buffer);
-    memset(buffer->buffer, 0, buffer->buffer_size);
+    buffer->buffer = NULL;
 }
 
 void vkd3d_string_buffer_cleanup(struct vkd3d_string_buffer *buffer)
@@ -37,20 +35,29 @@ void vkd3d_string_buffer_cleanup(struct vkd3d_string_buffer *buffer)
     vkd3d_free(buffer->buffer);
 }
 
+const char *vkd3d_string_buffer_data(const struct vkd3d_string_buffer *buffer)
+{
+    return buffer->buffer ? buffer->buffer : "";
+}
+
 static void vkd3d_string_buffer_clear(struct vkd3d_string_buffer *buffer)
 {
-    buffer->buffer[0] = '\0';
-    buffer->content_size = 0;
+    if (buffer->buffer)
+    {
+        buffer->buffer[0] = '\0';
+        buffer->content_size = 0;
+    }
 }
 
 static bool vkd3d_string_buffer_resize(struct vkd3d_string_buffer *buffer, int rc)
 {
-    unsigned int new_buffer_size = rc >= 0 ? buffer->content_size + rc + 1 : buffer->buffer_size * 2;
+    unsigned int new_buffer_size = rc >= 0 ? buffer->content_size + rc + 1 : max(32, buffer->buffer_size * 2);
 
     if (!vkd3d_array_reserve((void **)&buffer->buffer, &buffer->buffer_size, new_buffer_size, 1))
     {
         ERR("Failed to grow buffer.\n");
-        buffer->buffer[buffer->content_size] = '\0';
+        if (buffer->buffer)
+            buffer->buffer[buffer->content_size] = '\0';
         return false;
     }
     return true;
@@ -194,7 +201,7 @@ bool vkd3d_shader_message_context_copy_messages(struct vkd3d_shader_message_cont
 
     if (!(messages = vkd3d_malloc(context->messages.content_size + 1)))
         return false;
-    memcpy(messages, context->messages.buffer, context->messages.content_size + 1);
+    memcpy(messages, vkd3d_string_buffer_data(&context->messages), context->messages.content_size + 1);
     *out = messages;
     return true;
 }
diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h
index fa56ba1d..0bad2aa3 100644
--- a/libs/vkd3d-shader/vkd3d_shader_private.h
+++ b/libs/vkd3d-shader/vkd3d_shader_private.h
@@ -926,6 +926,7 @@ enum vkd3d_result vkd3d_dxbc_binary_to_text(struct vkd3d_shader_parser *parser,
 void vkd3d_string_buffer_cleanup(struct vkd3d_string_buffer *buffer);
 struct vkd3d_string_buffer *vkd3d_string_buffer_get(struct vkd3d_string_buffer_cache *list);
 void vkd3d_string_buffer_init(struct vkd3d_string_buffer *buffer);
+const char *vkd3d_string_buffer_data(const struct vkd3d_string_buffer *buffer);
 void vkd3d_string_buffer_cache_cleanup(struct vkd3d_string_buffer_cache *list);
 void vkd3d_string_buffer_cache_init(struct vkd3d_string_buffer_cache *list);
 int vkd3d_string_buffer_printf(struct vkd3d_string_buffer *buffer, const char *format, ...) VKD3D_PRINTF_FUNC(2, 3);
-- 
2.33.0




More information about the wine-devel mailing list