From: Conor McCarthy cmccarthy@codeweavers.com
--- libs/vkd3d-shader/ir.c | 7 ------- libs/vkd3d-shader/spirv.c | 13 +++++++++++++ libs/vkd3d-shader/vkd3d_shader_private.h | 7 +++++++ 3 files changed, 20 insertions(+), 7 deletions(-)
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..2e05a8d13 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,11 @@ 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) +{ + 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, ...) { @@ -1877,6 +1883,10 @@ static void vkd3d_spirv_builder_init(struct vkd3d_spirv_builder *builder, const
rb_init(&builder->declarations, vkd3d_spirv_declaration_compare);
+ /* OpString must appear before other declarations such as names. 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->debug_stream, SpvOpString, 0); + builder->main_function_id = vkd3d_spirv_alloc_id(builder); vkd3d_spirv_build_op_name(builder, builder->main_function_id, "%s", entry_point); } @@ -9448,6 +9458,9 @@ static int spirv_compiler_handle_instruction(struct spirv_compiler *compiler, { int ret = VKD3D_OK;
+ if (!compiler->strip_debug && !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);