mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-09-12 18:50:22 -07:00
vkd3d-shader/ir: Collect the hull shader phase flattener code together.
This commit is contained in:
committed by
Henri Verbeet
parent
b6725a3a00
commit
ad1aa739c2
Notes:
Henri Verbeet
2025-07-14 18:54:01 +02:00
Approved-by: Henri Verbeet (@hverbeet) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1612
@@ -1709,43 +1709,6 @@ static enum vkd3d_result vsir_program_lower_instructions(struct vsir_program *pr
|
||||
return VKD3D_OK;
|
||||
}
|
||||
|
||||
static void shader_register_eliminate_phase_addressing(struct vkd3d_shader_register *reg,
|
||||
unsigned int instance_id)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < reg->idx_count; ++i)
|
||||
{
|
||||
if (reg->idx[i].rel_addr && shader_register_is_phase_instance_id(®->idx[i].rel_addr->reg))
|
||||
{
|
||||
reg->idx[i].rel_addr = NULL;
|
||||
reg->idx[i].offset += instance_id;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void shader_instruction_eliminate_phase_instance_id(struct vkd3d_shader_instruction *ins,
|
||||
unsigned int instance_id)
|
||||
{
|
||||
struct vkd3d_shader_register *reg;
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < ins->src_count; ++i)
|
||||
{
|
||||
reg = (struct vkd3d_shader_register *)&ins->src[i].reg;
|
||||
if (shader_register_is_phase_instance_id(reg))
|
||||
{
|
||||
vsir_register_init(reg, VKD3DSPR_IMMCONST, reg->data_type, 0);
|
||||
reg->u.immconst_u32[0] = instance_id;
|
||||
continue;
|
||||
}
|
||||
shader_register_eliminate_phase_addressing(reg, instance_id);
|
||||
}
|
||||
|
||||
for (i = 0; i < ins->dst_count; ++i)
|
||||
shader_register_eliminate_phase_addressing(&ins->dst[i].reg, instance_id);
|
||||
}
|
||||
|
||||
/* Ensure that the program closes with a ret. sm1 programs do not, by default.
|
||||
* Many of our IR passes rely on this in order to insert instructions at the
|
||||
* end of execution. */
|
||||
@@ -2169,6 +2132,43 @@ static void flattener_eliminate_phase_related_dcls(struct hull_flattener *normal
|
||||
}
|
||||
}
|
||||
|
||||
static void shader_register_eliminate_phase_addressing(struct vkd3d_shader_register *reg,
|
||||
unsigned int instance_id)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < reg->idx_count; ++i)
|
||||
{
|
||||
if (reg->idx[i].rel_addr && shader_register_is_phase_instance_id(®->idx[i].rel_addr->reg))
|
||||
{
|
||||
reg->idx[i].rel_addr = NULL;
|
||||
reg->idx[i].offset += instance_id;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void shader_instruction_eliminate_phase_instance_id(struct vkd3d_shader_instruction *ins,
|
||||
unsigned int instance_id)
|
||||
{
|
||||
struct vkd3d_shader_register *reg;
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < ins->src_count; ++i)
|
||||
{
|
||||
reg = (struct vkd3d_shader_register *)&ins->src[i].reg;
|
||||
if (shader_register_is_phase_instance_id(reg))
|
||||
{
|
||||
vsir_register_init(reg, VKD3DSPR_IMMCONST, reg->data_type, 0);
|
||||
reg->u.immconst_u32[0] = instance_id;
|
||||
continue;
|
||||
}
|
||||
shader_register_eliminate_phase_addressing(reg, instance_id);
|
||||
}
|
||||
|
||||
for (i = 0; i < ins->dst_count; ++i)
|
||||
shader_register_eliminate_phase_addressing(&ins->dst[i].reg, instance_id);
|
||||
}
|
||||
|
||||
static enum vkd3d_result flattener_flatten_phases(struct hull_flattener *normaliser,
|
||||
struct shader_phase_location_array *locations)
|
||||
{
|
||||
|
Reference in New Issue
Block a user