From: Conor McCarthy cmccarthy@codeweavers.com
--- libs/vkd3d-shader/d3d_asm.c | 3 +++ libs/vkd3d-shader/ir.c | 7 ------- libs/vkd3d-shader/spirv.c | 12 ++++++++++++ libs/vkd3d-shader/vkd3d_shader_private.h | 7 +++++++ 4 files changed, 22 insertions(+), 7 deletions(-)
diff --git a/libs/vkd3d-shader/d3d_asm.c b/libs/vkd3d-shader/d3d_asm.c index dd96b7fa5..f28b88912 100644 --- a/libs/vkd3d-shader/d3d_asm.c +++ b/libs/vkd3d-shader/d3d_asm.c @@ -2108,6 +2108,9 @@ enum vkd3d_result vkd3d_dxbc_binary_to_text(const struct vsir_program *program, { struct vkd3d_shader_instruction *ins = &program->instructions.elements[i];
+ if (compiler.dialect == VSIR_ASM_VSIR) + vkd3d_string_buffer_printf(buffer, "%u: ", i + 1); + switch (ins->handler_idx) { case VKD3DSIH_ELSE: diff --git a/libs/vkd3d-shader/ir.c b/libs/vkd3d-shader/ir.c index 56e8d974d..78b724648 100644 --- a/libs/vkd3d-shader/ir.c +++ b/libs/vkd3d-shader/ir.c @@ -39,13 +39,6 @@ static inline bool shader_register_is_phase_instance_id(const struct vkd3d_shade return reg->type == VKD3DSPR_FORKINSTID || reg->type == VKD3DSPR_JOININSTID; }
-static bool vsir_instruction_is_dcl(const struct vkd3d_shader_instruction *instruction) -{ - enum vkd3d_shader_opcode handler_idx = instruction->handler_idx; - return (VKD3DSIH_DCL <= handler_idx && handler_idx <= VKD3DSIH_DCL_VERTICES_OUT) - || handler_idx == VKD3DSIH_HS_DECLS; -} - static void vkd3d_shader_instruction_make_nop(struct vkd3d_shader_instruction *ins) { struct vkd3d_shader_location location = ins->location; diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c index 298ad31d9..03f09a37a 100644 --- a/libs/vkd3d-shader/spirv.c +++ b/libs/vkd3d-shader/spirv.c @@ -362,6 +362,7 @@ struct vkd3d_spirv_builder uint32_t invocation_count; SpvExecutionModel execution_model;
+ uint32_t file_string_id; uint32_t current_id; uint32_t main_function_id; struct rb_tree declarations; @@ -930,6 +931,14 @@ static void vkd3d_spirv_build_op_name(struct vkd3d_spirv_builder *builder, vkd3d_spirv_build_string(stream, name, name_size); }
+static void vkd3d_spirv_build_op_line(struct vkd3d_spirv_builder *builder, uint32_t line_number) +{ + if (!builder->file_string_id) + /* The source name is not particularly useful here, if one is available at all, so emit an empty string. */ + builder->file_string_id = vkd3d_spirv_build_op_r1(builder, &builder->execution_mode_stream, SpvOpString, 0); + vkd3d_spirv_build_op3(&builder->function_stream, SpvOpLine, builder->file_string_id, line_number, 0); +} + static void vkd3d_spirv_build_op_member_name(struct vkd3d_spirv_builder *builder, uint32_t type_id, uint32_t member, const char *fmt, ...) { @@ -9448,6 +9457,9 @@ static int spirv_compiler_handle_instruction(struct spirv_compiler *compiler, { int ret = VKD3D_OK;
+ if (TRACE_ON() && !vsir_instruction_is_dcl(instruction) && instruction->handler_idx != VKD3DSIH_NOP) + vkd3d_spirv_build_op_line(&compiler->spirv_builder, compiler->location.line); + switch (instruction->handler_idx) { case VKD3DSIH_DCL_GLOBAL_FLAGS: diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index e5f706e95..85263fa49 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -1189,6 +1189,13 @@ static inline bool vkd3d_shader_instruction_has_texel_offset(const struct vkd3d_ return ins->texel_offset.u || ins->texel_offset.v || ins->texel_offset.w; }
+static inline bool vsir_instruction_is_dcl(const struct vkd3d_shader_instruction *instruction) +{ + enum vkd3d_shader_opcode handler_idx = instruction->handler_idx; + return (VKD3DSIH_DCL <= handler_idx && handler_idx <= VKD3DSIH_DCL_VERTICES_OUT) + || handler_idx == VKD3DSIH_HS_DECLS; +} + static inline bool register_is_constant(const struct vkd3d_shader_register *reg) { return (reg->type == VKD3DSPR_IMMCONST || reg->type == VKD3DSPR_IMMCONST64);