mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2024-11-21 16:46:41 -08:00
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:
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
@ -1098,7 +1098,7 @@ static void shader_sm1_read_instruction(struct vkd3d_shader_sm1_parser *sm1, str
|
||||
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->coissue = opcode_token & VKD3D_SM1_COISSUE;
|
||||
ins->raw = false;
|
||||
|
@ -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);
|
||||
assert(ins);
|
||||
vsir_instruction_init(ins, handler_idx);
|
||||
vsir_instruction_init(ins, &sm6->p.location, handler_idx);
|
||||
++sm6->p.instructions.count;
|
||||
return ins;
|
||||
}
|
||||
@ -2190,7 +2190,7 @@ static void sm6_parser_emit_dx_store_output(struct sm6_parser *sm6, struct sm6_b
|
||||
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)))
|
||||
return;
|
||||
|
@ -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)
|
||||
{
|
||||
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,
|
||||
@ -157,6 +159,7 @@ struct hull_flattener
|
||||
unsigned int instance_count;
|
||||
unsigned int phase_body_idx;
|
||||
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)
|
||||
@ -229,6 +232,7 @@ static void flattener_eliminate_phase_related_dcls(struct hull_flattener *normal
|
||||
|
||||
if (ins->handler_idx == VKD3DSIH_RET)
|
||||
{
|
||||
normaliser->last_ret_location = ins->location;
|
||||
vkd3d_shader_instruction_make_nop(ins);
|
||||
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;
|
||||
}
|
||||
|
||||
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));
|
||||
ins->location = *location;
|
||||
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))
|
||||
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;
|
||||
@ -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,
|
||||
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_dst_param *param;
|
||||
@ -418,7 +425,7 @@ static enum vkd3d_result control_point_normaliser_emit_hs_input(struct control_p
|
||||
normaliser->instructions.count += count;
|
||||
|
||||
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;
|
||||
|
||||
@ -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)
|
||||
{
|
||||
vsir_instruction_init(ins, VKD3DSIH_DCL_INPUT_SIV);
|
||||
vsir_instruction_init(ins, location, VKD3DSIH_DCL_INPUT_SIV);
|
||||
param = &ins->declaration.register_semantic.reg;
|
||||
ins->declaration.register_semantic.sysval_semantic = vkd3d_siv_from_sysval(e->sysval_semantic);
|
||||
}
|
||||
else
|
||||
{
|
||||
vsir_instruction_init(ins, VKD3DSIH_DCL_INPUT);
|
||||
vsir_instruction_init(ins, location, VKD3DSIH_DCL_INPUT);
|
||||
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_JOIN_PHASE:
|
||||
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;
|
||||
return ret;
|
||||
default:
|
||||
|
@ -2327,7 +2327,7 @@ static void shader_sm4_read_instruction(struct vkd3d_shader_sm4_parser *sm4, str
|
||||
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
|
||||
|| ins->handler_idx == VKD3DSIH_HS_JOIN_PHASE)
|
||||
sm4->phase = ins->handler_idx;
|
||||
|
@ -968,8 +968,15 @@ struct vkd3d_shader_primitive_type
|
||||
unsigned int patch_vertex_count;
|
||||
};
|
||||
|
||||
struct vkd3d_shader_location
|
||||
{
|
||||
const char *source_name;
|
||||
unsigned int line, column;
|
||||
};
|
||||
|
||||
struct vkd3d_shader_instruction
|
||||
{
|
||||
struct vkd3d_shader_location location;
|
||||
enum vkd3d_shader_opcode handler_idx;
|
||||
DWORD flags;
|
||||
unsigned int dst_count;
|
||||
@ -1008,7 +1015,8 @@ struct vkd3d_shader_instruction
|
||||
} 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)
|
||||
{
|
||||
@ -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);
|
||||
}
|
||||
|
||||
struct vkd3d_shader_location
|
||||
{
|
||||
const char *source_name;
|
||||
unsigned int line, column;
|
||||
};
|
||||
|
||||
struct vkd3d_shader_param_node
|
||||
{
|
||||
struct vkd3d_shader_param_node *next;
|
||||
|
Loading…
Reference in New Issue
Block a user