From: Conor McCarthy cmccarthy@codeweavers.com
--- libs/vkd3d-shader/spirv.c | 9 +++++ libs/vkd3d-shader/trace.c | 45 +++++++++++++++++++++--- libs/vkd3d-shader/vkd3d_shader_private.h | 1 + 3 files changed, 51 insertions(+), 4 deletions(-)
diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c index 0e11c8c3..437193bd 100644 --- a/libs/vkd3d-shader/spirv.c +++ b/libs/vkd3d-shader/spirv.c @@ -10452,6 +10452,15 @@ int spirv_compiler_generate_spirv(struct spirv_compiler *compiler, return result; instructions = &normaliser.instructions;
+ if (TRACE_ON()) + { + struct vkd3d_shader_parser tmp_parser; + tmp_parser.shader_version = parser->shader_version; + tmp_parser.instructions = *instructions; + tmp_parser.is_normalised = true; + vkd3d_shader_trace(&tmp_parser); + } + if (compiler->shader_type != VKD3D_SHADER_TYPE_HULL) spirv_compiler_emit_shader_signature_outputs(compiler);
diff --git a/libs/vkd3d-shader/trace.c b/libs/vkd3d-shader/trace.c index 8e2cac16..0323c016 100644 --- a/libs/vkd3d-shader/trace.c +++ b/libs/vkd3d-shader/trace.c @@ -355,6 +355,8 @@ struct vkd3d_d3d_asm_compiler struct vkd3d_string_buffer buffer; struct vkd3d_shader_version shader_version; struct vkd3d_d3d_asm_colours colours; + bool is_normalised; + bool is_in_fork_or_join_phase; };
static int shader_ver_ge(const struct vkd3d_shader_version *v, int major, int minor) @@ -833,12 +835,23 @@ static void shader_print_subscript_range(struct vkd3d_d3d_asm_compiler *compiler vkd3d_string_buffer_printf(&compiler->buffer, "*]"); }
+static int shader_register_input_output_id_idx(const struct vkd3d_shader_register *reg) +{ + int i; + for (i = 2; i >= 0; --i) + if (reg->idx[i].offset != ~0u) + return i; + assert(false); + return 0; +} + static void shader_dump_register(struct vkd3d_d3d_asm_compiler *compiler, const struct vkd3d_shader_register *reg, bool is_declaration) { struct vkd3d_string_buffer *buffer = &compiler->buffer; unsigned int offset = reg->idx[0].offset; bool is_descriptor = false; + int io_id_idx = -1;
static const char * const rastout_reg_names[] = {"oPos", "oFog", "oPts"}; static const char * const misctype_reg_names[] = {"vPos", "vFace"}; @@ -852,6 +865,7 @@ static void shader_dump_register(struct vkd3d_d3d_asm_compiler *compiler, const
case VKD3DSPR_INPUT: shader_addline(buffer, "v"); + io_id_idx = shader_register_input_output_id_idx(reg); break;
case VKD3DSPR_CONST: @@ -900,6 +914,7 @@ static void shader_dump_register(struct vkd3d_d3d_asm_compiler *compiler, const shader_addline(buffer, "o"); else shader_addline(buffer, "oT"); + io_id_idx = shader_register_input_output_id_idx(reg); break;
case VKD3DSPR_CONSTINT: @@ -992,14 +1007,17 @@ static void shader_dump_register(struct vkd3d_d3d_asm_compiler *compiler, const
case VKD3DSPR_INCONTROLPOINT: shader_addline(buffer, "vicp"); + io_id_idx = shader_register_input_output_id_idx(reg); break;
case VKD3DSPR_OUTCONTROLPOINT: shader_addline(buffer, "vocp"); + io_id_idx = shader_register_input_output_id_idx(reg); break;
case VKD3DSPR_PATCHCONST: - shader_addline(buffer, "vpc"); + shader_addline(buffer, compiler->is_in_fork_or_join_phase ? "opc" : "vpc"); + io_id_idx = shader_register_input_output_id_idx(reg); break;
case VKD3DSPR_TESSCOORD: @@ -1153,18 +1171,23 @@ static void shader_dump_register(struct vkd3d_d3d_asm_compiler *compiler, const if (offset != ~0u) { bool is_sm_5_1 = shader_ver_ge(&compiler->shader_version, 5, 1); + unsigned int id_idx; + + id_idx = (io_id_idx >= 0 && compiler->is_normalised) ? io_id_idx : 0;
- if (reg->idx[0].rel_addr || reg->type == VKD3DSPR_IMMCONSTBUFFER + if (reg->idx[id_idx].rel_addr || reg->type == VKD3DSPR_IMMCONSTBUFFER || reg->type == VKD3DSPR_INCONTROLPOINT || (reg->type == VKD3DSPR_INPUT && (compiler->shader_version.type == VKD3D_SHADER_TYPE_GEOMETRY || compiler->shader_version.type == VKD3D_SHADER_TYPE_HULL))) { + if (!reg->idx[id_idx].rel_addr) + id_idx = 0; vkd3d_string_buffer_printf(buffer, "%s", compiler->colours.reset); - shader_print_subscript(compiler, offset, reg->idx[0].rel_addr); + shader_print_subscript(compiler, reg->idx[id_idx].offset, reg->idx[id_idx].rel_addr); } else { - vkd3d_string_buffer_printf(buffer, "%u%s", offset, compiler->colours.reset); + vkd3d_string_buffer_printf(buffer, "%u%s", reg->idx[id_idx].offset, compiler->colours.reset); }
/* For sm 5.1 descriptor declarations we need to print the register range instead of @@ -1173,6 +1196,13 @@ static void shader_dump_register(struct vkd3d_d3d_asm_compiler *compiler, const { shader_print_subscript_range(compiler, reg->idx[1].offset, reg->idx[2].offset); } + else if (compiler->is_normalised) + { + int i; + for (i = 0; i <= io_id_idx; ++i) + if (i != id_idx) + shader_print_subscript(compiler, reg->idx[i].offset, reg->idx[i].rel_addr); + } else { /* For descriptors in sm < 5.1 we move the reg->idx values up one slot @@ -1778,6 +1808,11 @@ static void shader_dump_instruction(struct vkd3d_d3d_asm_compiler *compiler, shader_dump_register_space(compiler, ins->declaration.structured_resource.resource.range.space); break;
+ case VKD3DSIH_HS_FORK_PHASE: + case VKD3DSIH_HS_JOIN_PHASE: + compiler->is_in_fork_or_join_phase = true; + break; + case VKD3DSIH_DEF: vkd3d_string_buffer_printf(buffer, " %sc%u%s", compiler->colours.reg, shader_get_float_offset(ins->dst[0].reg.type, ins->dst[0].reg.idx[0].offset), @@ -1920,6 +1955,8 @@ enum vkd3d_result vkd3d_dxbc_binary_to_text(struct vkd3d_shader_parser *parser, shader_version->minor, compiler.colours.reset);
indent = 0; + compiler.is_normalised = parser->is_normalised; + compiler.is_in_fork_or_join_phase = false; for (i = 0; i < parser->instructions.count; ++i) { struct vkd3d_shader_instruction *ins = &parser->instructions.elements[i]; diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index 1146b34f..df5161b5 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -1002,6 +1002,7 @@ struct vkd3d_shader_parser const struct vkd3d_shader_parser_ops *ops; struct vkd3d_shader_instruction_array instructions; size_t instruction_idx; + bool is_normalised; };
struct vkd3d_shader_parser_ops