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;
|
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;
|
||||||
|
@ -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;
|
||||||
|
@ -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:
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user