From: Conor McCarthy cmccarthy@codeweavers.com
--- libs/vkd3d-shader/d3dbc.c | 1 + libs/vkd3d-shader/ir.c | 8 ++++++-- libs/vkd3d-shader/tpf.c | 1 + libs/vkd3d-shader/vkd3d_shader_main.c | 5 +++-- libs/vkd3d-shader/vkd3d_shader_private.h | 7 ++++++- 5 files changed, 17 insertions(+), 5 deletions(-)
diff --git a/libs/vkd3d-shader/d3dbc.c b/libs/vkd3d-shader/d3dbc.c index 8db246f9..7e643f47 100644 --- a/libs/vkd3d-shader/d3dbc.c +++ b/libs/vkd3d-shader/d3dbc.c @@ -976,6 +976,7 @@ int vkd3d_shader_sm1_parser_create(const struct vkd3d_shader_compile_info *compi return VKD3D_ERROR_OUT_OF_MEMORY; } ins = &instructions->elements[instructions->count]; + ins->source_index = instructions->count; shader_sm1_read_instruction(sm1, ins);
if (ins->handler_idx == VKD3DSIH_INVALID) diff --git a/libs/vkd3d-shader/ir.c b/libs/vkd3d-shader/ir.c index be43a038..17df48a6 100644 --- a/libs/vkd3d-shader/ir.c +++ b/libs/vkd3d-shader/ir.c @@ -21,7 +21,7 @@ static void VKD3D_PRINTF_FUNC(3, 4) shader_normaliser_error(struct vkd3d_shader_normaliser *normaliser, enum vkd3d_shader_error error, const char *format, ...) { - struct vkd3d_shader_location location = {0}; + struct vkd3d_shader_location location = {normaliser->instructions.source_name, normaliser->source_index + 1, 0}; va_list args;
va_start(args, format); @@ -33,7 +33,7 @@ static void VKD3D_PRINTF_FUNC(3, 4) shader_normaliser_error(struct vkd3d_shader_ static void VKD3D_PRINTF_FUNC(3, 4) shader_normaliser_warning(struct vkd3d_shader_normaliser *normaliser, enum vkd3d_shader_error error, const char *format, ...) { - struct vkd3d_shader_location location = {0}; + struct vkd3d_shader_location location = {normaliser->instructions.source_name, normaliser->source_index + 1, 0}; va_list args;
va_start(args, format); @@ -990,6 +990,8 @@ static enum vkd3d_result shader_instruction_normalise_io_params(struct vkd3d_sha unsigned int i; int result = 1;
+ normaliser->source_index = ins->source_index; + switch (ins->handler_idx) { case VKD3DSIH_DCL_INPUT: @@ -1060,6 +1062,7 @@ enum vkd3d_result shader_normaliser_normalise_io_registers(struct vkd3d_shader_n for (i = 0, has_control_point_phase = false; i < instructions->count; ++i) { ins = &instructions->elements[i]; + normaliser->source_index = ins->source_index;
switch (ins->handler_idx) { @@ -1105,6 +1108,7 @@ enum vkd3d_result shader_normaliser_normalise_io_registers(struct vkd3d_shader_n } }
+ normaliser->source_index = 0; if (!shader_signature_merge(input_signature, normaliser->input_range_map, false, normaliser) || !shader_signature_merge(output_signature, normaliser->output_range_map, false, normaliser) || !shader_signature_merge(patch_constant_signature, normaliser->pc_range_map, true, normaliser)) diff --git a/libs/vkd3d-shader/tpf.c b/libs/vkd3d-shader/tpf.c index 426cc624..64fa461b 100644 --- a/libs/vkd3d-shader/tpf.c +++ b/libs/vkd3d-shader/tpf.c @@ -2206,6 +2206,7 @@ int vkd3d_shader_sm4_parser_create(const struct vkd3d_shader_compile_info *compi return VKD3D_ERROR_OUT_OF_MEMORY; } ins = &instructions->elements[instructions->count]; + ins->source_index = instructions->count; shader_sm4_read_instruction(sm4, ins);
if (ins->handler_idx == VKD3DSIH_INVALID) diff --git a/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d-shader/vkd3d_shader_main.c index 58fb51e4..dac7d380 100644 --- a/libs/vkd3d-shader/vkd3d_shader_main.c +++ b/libs/vkd3d-shader/vkd3d_shader_main.c @@ -451,7 +451,7 @@ bool vkd3d_shader_parser_init(struct vkd3d_shader_parser *parser, parser->location.column = 0; parser->shader_version = *version; parser->ops = ops; - return shader_instruction_array_init(&parser->instructions, instruction_reserve); + return shader_instruction_array_init(&parser->instructions, instruction_reserve, source_name); }
void VKD3D_PRINTF_FUNC(3, 4) vkd3d_shader_parser_error(struct vkd3d_shader_parser *parser, @@ -1671,7 +1671,8 @@ void *shader_param_allocator_get(struct vkd3d_shader_param_allocator *allocator, return params; }
-bool shader_instruction_array_init(struct vkd3d_shader_instruction_array *instructions, unsigned int reserve) +bool shader_instruction_array_init(struct vkd3d_shader_instruction_array *instructions, unsigned int reserve, + const char *source_name) { memset(instructions, 0, sizeof(*instructions)); /* Size the parameter initial allocations so they are large enough for most shaders. The diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index 0e01743e..a100136d 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -918,6 +918,7 @@ struct vkd3d_shader_instruction unsigned int resource_stride; enum vkd3d_data_type resource_data_type[VKD3D_VEC4_SIZE]; bool coissue, structured, raw; + unsigned int source_index; const struct vkd3d_shader_src_param *predicate; union { @@ -1004,6 +1005,8 @@ static inline struct vkd3d_shader_dst_param *shader_dst_param_allocator_get(
struct vkd3d_shader_instruction_array { + const char *source_name; + struct vkd3d_shader_instruction *elements; size_t capacity; size_t count; @@ -1015,7 +1018,8 @@ struct vkd3d_shader_instruction_array size_t icb_count; };
-bool shader_instruction_array_init(struct vkd3d_shader_instruction_array *instructions, unsigned int reserve); +bool shader_instruction_array_init(struct vkd3d_shader_instruction_array *instructions, unsigned int reserve, + const char *source_name); bool shader_instruction_array_reserve(struct vkd3d_shader_instruction_array *instructions, unsigned int reserve); bool shader_instruction_array_add_icb(struct vkd3d_shader_instruction_array *instructions, struct vkd3d_shader_immediate_constant_buffer *icb); @@ -1372,6 +1376,7 @@ int dxbc_writer_write(struct dxbc_writer *dxbc, struct vkd3d_shader_code *code); struct vkd3d_shader_normaliser { struct vkd3d_shader_message_context *message_context; + unsigned int source_index; bool failed;
struct vkd3d_shader_instruction_array instructions;