vkd3d-shader: Embed the parsing location in vkd3d_shader_instruction.

So that it can be used for printing meaningful error locations by
downstream processors.
This commit is contained in:
Giovanni Mascellani 2023-09-05 11:31:31 +02:00 committed by Alexandre Julliard
parent 531c41306d
commit cf871d2cb2
Notes: Alexandre Julliard 2023-09-22 22:46:19 +02:00
Approved-by: Francisco Casas (@fcasas)
Approved-by: Henri Verbeet (@hverbeet)
Approved-by: Alexandre Julliard (@julliard)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/317
5 changed files with 28 additions and 19 deletions

View File

@ -1098,7 +1098,7 @@ static void shader_sm1_read_instruction(struct vkd3d_shader_sm1_parser *sm1, str
goto fail; goto fail;
} }
vsir_instruction_init(ins, opcode_info->vkd3d_opcode); vsir_instruction_init(ins, &sm1->p.location, opcode_info->vkd3d_opcode);
ins->flags = (opcode_token & VKD3D_SM1_INSTRUCTION_FLAGS_MASK) >> VKD3D_SM1_INSTRUCTION_FLAGS_SHIFT; ins->flags = (opcode_token & VKD3D_SM1_INSTRUCTION_FLAGS_MASK) >> VKD3D_SM1_INSTRUCTION_FLAGS_SHIFT;
ins->coissue = opcode_token & VKD3D_SM1_COISSUE; ins->coissue = opcode_token & VKD3D_SM1_COISSUE;
ins->raw = false; ins->raw = false;

View File

@ -1999,7 +1999,7 @@ static struct vkd3d_shader_instruction *sm6_parser_add_instruction(struct sm6_pa
{ {
struct vkd3d_shader_instruction *ins = sm6_parser_require_space(sm6, 1); struct vkd3d_shader_instruction *ins = sm6_parser_require_space(sm6, 1);
assert(ins); assert(ins);
vsir_instruction_init(ins, handler_idx); vsir_instruction_init(ins, &sm6->p.location, handler_idx);
++sm6->p.instructions.count; ++sm6->p.instructions.count;
return ins; return ins;
} }
@ -2190,7 +2190,7 @@ static void sm6_parser_emit_dx_store_output(struct sm6_parser *sm6, struct sm6_b
return; return;
} }
vsir_instruction_init(ins, VKD3DSIH_MOV); vsir_instruction_init(ins, &sm6->p.location, VKD3DSIH_MOV);
if (!(dst_param = instruction_dst_params_alloc(ins, 1, sm6))) if (!(dst_param = instruction_dst_params_alloc(ins, 1, sm6)))
return; return;

View File

@ -31,7 +31,9 @@ static bool shader_instruction_is_dcl(const struct vkd3d_shader_instruction *ins
static void vkd3d_shader_instruction_make_nop(struct vkd3d_shader_instruction *ins) static void vkd3d_shader_instruction_make_nop(struct vkd3d_shader_instruction *ins)
{ {
vsir_instruction_init(ins, VKD3DSIH_NOP); struct vkd3d_shader_location location = ins->location;
vsir_instruction_init(ins, &location, VKD3DSIH_NOP);
} }
static void shader_register_eliminate_phase_addressing(struct vkd3d_shader_register *reg, static void shader_register_eliminate_phase_addressing(struct vkd3d_shader_register *reg,
@ -157,6 +159,7 @@ struct hull_flattener
unsigned int instance_count; unsigned int instance_count;
unsigned int phase_body_idx; unsigned int phase_body_idx;
enum vkd3d_shader_opcode phase; enum vkd3d_shader_opcode phase;
struct vkd3d_shader_location last_ret_location;
}; };
static bool flattener_is_in_fork_or_join_phase(const struct hull_flattener *flattener) static bool flattener_is_in_fork_or_join_phase(const struct hull_flattener *flattener)
@ -229,6 +232,7 @@ static void flattener_eliminate_phase_related_dcls(struct hull_flattener *normal
if (ins->handler_idx == VKD3DSIH_RET) if (ins->handler_idx == VKD3DSIH_RET)
{ {
normaliser->last_ret_location = ins->location;
vkd3d_shader_instruction_make_nop(ins); vkd3d_shader_instruction_make_nop(ins);
if (locations->count >= ARRAY_SIZE(locations->locations)) if (locations->count >= ARRAY_SIZE(locations->locations))
{ {
@ -309,9 +313,11 @@ void shader_register_init(struct vkd3d_shader_register *reg, enum vkd3d_shader_r
reg->immconst_type = VKD3D_IMMCONST_SCALAR; reg->immconst_type = VKD3D_IMMCONST_SCALAR;
} }
void vsir_instruction_init(struct vkd3d_shader_instruction *ins, enum vkd3d_shader_opcode handler_idx) void vsir_instruction_init(struct vkd3d_shader_instruction *ins, const struct vkd3d_shader_location *location,
enum vkd3d_shader_opcode handler_idx)
{ {
memset(ins, 0, sizeof(*ins)); memset(ins, 0, sizeof(*ins));
ins->location = *location;
ins->handler_idx = handler_idx; ins->handler_idx = handler_idx;
} }
@ -339,7 +345,7 @@ static enum vkd3d_result instruction_array_flatten_hull_shader_phases(struct vkd
if (!shader_instruction_array_reserve(&flattener.instructions, flattener.instructions.count + 1)) if (!shader_instruction_array_reserve(&flattener.instructions, flattener.instructions.count + 1))
return VKD3D_ERROR_OUT_OF_MEMORY; return VKD3D_ERROR_OUT_OF_MEMORY;
vsir_instruction_init(&instructions->elements[instructions->count++], VKD3DSIH_RET); vsir_instruction_init(&instructions->elements[instructions->count++], &flattener.last_ret_location, VKD3DSIH_RET);
} }
*src_instructions = flattener.instructions; *src_instructions = flattener.instructions;
@ -400,7 +406,8 @@ static void shader_dst_param_io_init(struct vkd3d_shader_dst_param *param, const
} }
static enum vkd3d_result control_point_normaliser_emit_hs_input(struct control_point_normaliser *normaliser, static enum vkd3d_result control_point_normaliser_emit_hs_input(struct control_point_normaliser *normaliser,
const struct shader_signature *s, unsigned int input_control_point_count, unsigned int dst) const struct shader_signature *s, unsigned int input_control_point_count, unsigned int dst,
const struct vkd3d_shader_location *location)
{ {
struct vkd3d_shader_instruction *ins; struct vkd3d_shader_instruction *ins;
struct vkd3d_shader_dst_param *param; struct vkd3d_shader_dst_param *param;
@ -418,7 +425,7 @@ static enum vkd3d_result control_point_normaliser_emit_hs_input(struct control_p
normaliser->instructions.count += count; normaliser->instructions.count += count;
ins = &normaliser->instructions.elements[dst]; ins = &normaliser->instructions.elements[dst];
vsir_instruction_init(ins, VKD3DSIH_HS_CONTROL_POINT_PHASE); vsir_instruction_init(ins, location, VKD3DSIH_HS_CONTROL_POINT_PHASE);
ins->flags = 1; ins->flags = 1;
++ins; ++ins;
@ -430,13 +437,13 @@ static enum vkd3d_result control_point_normaliser_emit_hs_input(struct control_p
if (e->sysval_semantic != VKD3D_SHADER_SV_NONE) if (e->sysval_semantic != VKD3D_SHADER_SV_NONE)
{ {
vsir_instruction_init(ins, VKD3DSIH_DCL_INPUT_SIV); vsir_instruction_init(ins, location, VKD3DSIH_DCL_INPUT_SIV);
param = &ins->declaration.register_semantic.reg; param = &ins->declaration.register_semantic.reg;
ins->declaration.register_semantic.sysval_semantic = vkd3d_siv_from_sysval(e->sysval_semantic); ins->declaration.register_semantic.sysval_semantic = vkd3d_siv_from_sysval(e->sysval_semantic);
} }
else else
{ {
vsir_instruction_init(ins, VKD3DSIH_DCL_INPUT); vsir_instruction_init(ins, location, VKD3DSIH_DCL_INPUT);
param = &ins->declaration.dst; param = &ins->declaration.dst;
} }
@ -507,7 +514,7 @@ static enum vkd3d_result instruction_array_normalise_hull_shader_control_point_i
case VKD3DSIH_HS_FORK_PHASE: case VKD3DSIH_HS_FORK_PHASE:
case VKD3DSIH_HS_JOIN_PHASE: case VKD3DSIH_HS_JOIN_PHASE:
ret = control_point_normaliser_emit_hs_input(&normaliser, input_signature, ret = control_point_normaliser_emit_hs_input(&normaliser, input_signature,
input_control_point_count, i); input_control_point_count, i, &ins->location);
*src_instructions = normaliser.instructions; *src_instructions = normaliser.instructions;
return ret; return ret;
default: default:

View File

@ -2327,7 +2327,7 @@ static void shader_sm4_read_instruction(struct vkd3d_shader_sm4_parser *sm4, str
return; return;
} }
vsir_instruction_init(ins, opcode_info->handler_idx); vsir_instruction_init(ins, &sm4->p.location, opcode_info->handler_idx);
if (ins->handler_idx == VKD3DSIH_HS_CONTROL_POINT_PHASE || ins->handler_idx == VKD3DSIH_HS_FORK_PHASE if (ins->handler_idx == VKD3DSIH_HS_CONTROL_POINT_PHASE || ins->handler_idx == VKD3DSIH_HS_FORK_PHASE
|| ins->handler_idx == VKD3DSIH_HS_JOIN_PHASE) || ins->handler_idx == VKD3DSIH_HS_JOIN_PHASE)
sm4->phase = ins->handler_idx; sm4->phase = ins->handler_idx;

View File

@ -968,8 +968,15 @@ struct vkd3d_shader_primitive_type
unsigned int patch_vertex_count; unsigned int patch_vertex_count;
}; };
struct vkd3d_shader_location
{
const char *source_name;
unsigned int line, column;
};
struct vkd3d_shader_instruction struct vkd3d_shader_instruction
{ {
struct vkd3d_shader_location location;
enum vkd3d_shader_opcode handler_idx; enum vkd3d_shader_opcode handler_idx;
DWORD flags; DWORD flags;
unsigned int dst_count; unsigned int dst_count;
@ -1008,7 +1015,8 @@ struct vkd3d_shader_instruction
} declaration; } declaration;
}; };
void vsir_instruction_init(struct vkd3d_shader_instruction *ins, enum vkd3d_shader_opcode handler_idx); void vsir_instruction_init(struct vkd3d_shader_instruction *ins, const struct vkd3d_shader_location *location,
enum vkd3d_shader_opcode handler_idx);
static inline bool vkd3d_shader_instruction_has_texel_offset(const struct vkd3d_shader_instruction *ins) static inline bool vkd3d_shader_instruction_has_texel_offset(const struct vkd3d_shader_instruction *ins)
{ {
@ -1035,12 +1043,6 @@ static inline bool register_is_constant(const struct vkd3d_shader_register *reg)
return (reg->type == VKD3DSPR_IMMCONST || reg->type == VKD3DSPR_IMMCONST64); return (reg->type == VKD3DSPR_IMMCONST || reg->type == VKD3DSPR_IMMCONST64);
} }
struct vkd3d_shader_location
{
const char *source_name;
unsigned int line, column;
};
struct vkd3d_shader_param_node struct vkd3d_shader_param_node
{ {
struct vkd3d_shader_param_node *next; struct vkd3d_shader_param_node *next;