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;
|
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.
|
/* 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
|
* Many of our IR passes rely on this in order to insert instructions at the
|
||||||
* end of execution. */
|
* 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,
|
static enum vkd3d_result flattener_flatten_phases(struct hull_flattener *normaliser,
|
||||||
struct shader_phase_location_array *locations)
|
struct shader_phase_location_array *locations)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user