From: Giovanni Mascellani gmascellani@codeweavers.com
--- libs/vkd3d-shader/d3d_asm.c | 20 ++++++++++---------- libs/vkd3d-shader/vkd3d_shader_main.c | 8 +++++++- libs/vkd3d-shader/vkd3d_shader_private.h | 2 +- 3 files changed, 18 insertions(+), 12 deletions(-)
diff --git a/libs/vkd3d-shader/d3d_asm.c b/libs/vkd3d-shader/d3d_asm.c index 02a8888e6..3573a6af0 100644 --- a/libs/vkd3d-shader/d3d_asm.c +++ b/libs/vkd3d-shader/d3d_asm.c @@ -1953,7 +1953,7 @@ static void shader_dump_instruction(struct vkd3d_d3d_asm_compiler *compiler,
enum vkd3d_result vkd3d_dxbc_binary_to_text(const struct vkd3d_shader_instruction_array *instructions, const struct vkd3d_shader_version *shader_version, const struct vkd3d_shader_compile_info *compile_info, - struct vkd3d_shader_code *out, enum vsir_asm_dialect dialect) + struct vkd3d_string_buffer *buffer, enum vsir_asm_dialect dialect) { enum vkd3d_shader_compile_option_formatting_flags formatting; struct vkd3d_d3d_asm_compiler compiler = @@ -1961,7 +1961,6 @@ enum vkd3d_result vkd3d_dxbc_binary_to_text(const struct vkd3d_shader_instructio .dialect = dialect, }; enum vkd3d_result result = VKD3D_OK; - struct vkd3d_string_buffer *buffer; unsigned int indent, i, j; const char *indent_str;
@@ -2012,8 +2011,7 @@ enum vkd3d_result vkd3d_dxbc_binary_to_text(const struct vkd3d_shader_instructio else indent_str = "";
- buffer = &compiler.buffer; - vkd3d_string_buffer_init(buffer); + compiler.buffer = *buffer;
compiler.shader_version = *shader_version; shader_version = &compiler.shader_version; @@ -2062,7 +2060,7 @@ enum vkd3d_result vkd3d_dxbc_binary_to_text(const struct vkd3d_shader_instructio } }
- vkd3d_shader_code_from_string_buffer(out, buffer); + *buffer = compiler.buffer;
return result; } @@ -2071,13 +2069,15 @@ void vkd3d_shader_trace(const struct vkd3d_shader_instruction_array *instruction const struct vkd3d_shader_version *shader_version) { const char *p, *q, *end; - struct vkd3d_shader_code code; + struct vkd3d_string_buffer buffer; + + vkd3d_string_buffer_init(&buffer);
- if (vkd3d_dxbc_binary_to_text(instructions, shader_version, NULL, &code, VSIR_ASM_VSIR) != VKD3D_OK) + if (vkd3d_dxbc_binary_to_text(instructions, shader_version, NULL, &buffer, VSIR_ASM_VSIR) != VKD3D_OK) return;
- end = (const char *)code.code + code.size; - for (p = code.code; p < end; p = q) + end = (const char *)buffer.buffer + buffer.content_size; + for (p = buffer.buffer; p < end; p = q) { if (!(q = memchr(p, '\n', end - p))) q = end; @@ -2086,5 +2086,5 @@ void vkd3d_shader_trace(const struct vkd3d_shader_instruction_array *instruction TRACE(" %.*s", (int)(q - p), p); }
- vkd3d_shader_free_shader_code(&code); + vkd3d_string_buffer_cleanup(&buffer); } diff --git a/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d-shader/vkd3d_shader_main.c index 6822f87d7..48430b136 100644 --- a/libs/vkd3d-shader/vkd3d_shader_main.c +++ b/libs/vkd3d-shader/vkd3d_shader_main.c @@ -1566,8 +1566,14 @@ static int vkd3d_shader_parser_compile(struct vkd3d_shader_parser *parser, switch (compile_info->target_type) { case VKD3D_SHADER_TARGET_D3D_ASM: - ret = vkd3d_dxbc_binary_to_text(&parser->instructions, &parser->shader_version, compile_info, out, VSIR_ASM_D3D); + { + struct vkd3d_string_buffer buffer; + + vkd3d_string_buffer_init(&buffer); + ret = vkd3d_dxbc_binary_to_text(&parser->instructions, &parser->shader_version, compile_info, &buffer, VSIR_ASM_D3D); + vkd3d_shader_code_from_string_buffer(out, &buffer); break; + }
case VKD3D_SHADER_TARGET_GLSL: if ((ret = scan_with_parser(&scan_info, message_context, &scan_descriptor_info, parser)) < 0) diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index 5ac744c35..0a21976b9 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -1332,7 +1332,7 @@ enum vsir_asm_dialect
enum vkd3d_result vkd3d_dxbc_binary_to_text(const struct vkd3d_shader_instruction_array *instructions, const struct vkd3d_shader_version *shader_version, const struct vkd3d_shader_compile_info *compile_info, - struct vkd3d_shader_code *out, enum vsir_asm_dialect dialect); + struct vkd3d_string_buffer *buffer, enum vsir_asm_dialect dialect); 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);