From: Conor McCarthy cmccarthy@codeweavers.com
Makes the introduction of DXIL tracing neater. --- libs/vkd3d-shader/trace.c | 119 +++++++++++++++++++++----------------- 1 file changed, 66 insertions(+), 53 deletions(-)
diff --git a/libs/vkd3d-shader/trace.c b/libs/vkd3d-shader/trace.c index 6c30edc9..dc711f52 100644 --- a/libs/vkd3d-shader/trace.c +++ b/libs/vkd3d-shader/trace.c @@ -1851,6 +1851,70 @@ static void shader_dump_instruction(struct vkd3d_d3d_asm_compiler *compiler, shader_addline(buffer, "\n"); }
+static enum vkd3d_result vkd3d_dxbc_dump_instructions(struct vkd3d_shader_parser *parser, + enum vkd3d_shader_compile_option_formatting_flags formatting, struct vkd3d_d3d_asm_compiler *compiler) +{ + struct vkd3d_string_buffer *buffer = &compiler->buffer; + enum vkd3d_result result = VKD3D_OK; + unsigned int indent, i; + const char *indent_str; + + if (formatting & VKD3D_SHADER_COMPILE_OPTION_FORMATTING_INDENT) + indent_str = " "; + else + indent_str = ""; + + indent = 0; + while (!vkd3d_shader_parser_is_end(parser)) + { + struct vkd3d_shader_instruction ins; + + vkd3d_shader_parser_read_instruction(parser, &ins); + if (ins.handler_idx == VKD3DSIH_INVALID) + { + WARN("Skipping unrecognized instruction.\n"); + vkd3d_string_buffer_printf(buffer, "<unrecognized instruction>\n"); + result = VKD3D_ERROR; + continue; + } + + switch (ins.handler_idx) + { + case VKD3DSIH_ELSE: + case VKD3DSIH_ENDIF: + case VKD3DSIH_ENDLOOP: + case VKD3DSIH_ENDSWITCH: + --indent; + break; + + default: + break; + } + + for (i = 0; i < indent; ++i) + { + vkd3d_string_buffer_printf(buffer, "%s", indent_str); + } + + shader_dump_instruction(compiler, &ins); + + switch (ins.handler_idx) + { + case VKD3DSIH_ELSE: + case VKD3DSIH_IF: + case VKD3DSIH_LOOP: + case VKD3DSIH_SWITCH: + ++indent; + break; + + default: + break; + } + } + + return result; +} + enum vkd3d_result vkd3d_dxbc_binary_to_text(struct vkd3d_shader_parser *parser, const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_code *out) { @@ -1859,8 +1923,7 @@ enum vkd3d_result vkd3d_dxbc_binary_to_text(struct vkd3d_shader_parser *parser, struct vkd3d_d3d_asm_compiler compiler; enum vkd3d_result result = VKD3D_OK; struct vkd3d_string_buffer *buffer; - unsigned int indent, i; - const char *indent_str; + unsigned int i; void *code;
static const struct vkd3d_d3d_asm_colours no_colours = @@ -1905,10 +1968,6 @@ enum vkd3d_result vkd3d_dxbc_binary_to_text(struct vkd3d_shader_parser *parser, compiler.colours = colours; else compiler.colours = no_colours; - if (formatting & VKD3D_SHADER_COMPILE_OPTION_FORMATTING_INDENT) - indent_str = " "; - else - indent_str = "";
buffer = &compiler.buffer; vkd3d_string_buffer_init(buffer); @@ -1919,54 +1978,8 @@ enum vkd3d_result vkd3d_dxbc_binary_to_text(struct vkd3d_shader_parser *parser, shader_get_type_prefix(shader_version->type), shader_version->major, shader_version->minor, compiler.colours.reset);
- indent = 0; vkd3d_shader_parser_reset(parser); - while (!vkd3d_shader_parser_is_end(parser)) - { - struct vkd3d_shader_instruction ins; - - vkd3d_shader_parser_read_instruction(parser, &ins); - if (ins.handler_idx == VKD3DSIH_INVALID) - { - WARN("Skipping unrecognized instruction.\n"); - vkd3d_string_buffer_printf(buffer, "<unrecognized instruction>\n"); - result = VKD3D_ERROR; - continue; - } - - switch (ins.handler_idx) - { - case VKD3DSIH_ELSE: - case VKD3DSIH_ENDIF: - case VKD3DSIH_ENDLOOP: - case VKD3DSIH_ENDSWITCH: - --indent; - break; - - default: - break; - } - - for (i = 0; i < indent; ++i) - { - vkd3d_string_buffer_printf(buffer, "%s", indent_str); - } - - shader_dump_instruction(&compiler, &ins); - - switch (ins.handler_idx) - { - case VKD3DSIH_ELSE: - case VKD3DSIH_IF: - case VKD3DSIH_LOOP: - case VKD3DSIH_SWITCH: - ++indent; - break; - - default: - break; - } - } + result = vkd3d_dxbc_dump_instructions(parser, formatting, &compiler);
if (parser->failed) result = VKD3D_ERROR_INVALID_SHADER;