mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-09-12 18:50:22 -07:00
vkd3d-shader/ir: Use iterators in vsir_update_dcl_temps().
This commit is contained in:
committed by
Henri Verbeet
parent
e3fe2cec07
commit
d3ad3e071a
Notes:
Henri Verbeet
2025-08-21 16:35:05 +02:00
Approved-by: Giovanni Mascellani (@giomasce) Approved-by: Henri Verbeet (@hverbeet) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1675
@@ -8892,11 +8892,14 @@ enum vkd3d_result vsir_allocate_temp_registers(struct vsir_program *program,
|
||||
enum vkd3d_result vsir_update_dcl_temps(struct vsir_program *program,
|
||||
struct vkd3d_shader_message_context *message_context)
|
||||
{
|
||||
struct vsir_program_iterator it = vsir_program_iterator(&program->instructions);
|
||||
struct vkd3d_shader_location location;
|
||||
struct vkd3d_shader_instruction *ins;
|
||||
unsigned int temp_count = 0;
|
||||
|
||||
for (int i = program->instructions.count - 1; i >= 0; --i)
|
||||
for (ins = vsir_program_iterator_tail(&it); ins; ins = vsir_program_iterator_prev(&it))
|
||||
{
|
||||
struct vkd3d_shader_instruction *ins = &program->instructions.elements[i];
|
||||
location = ins->location;
|
||||
|
||||
if (ins->opcode == VSIR_OP_DCL_TEMPS)
|
||||
{
|
||||
@@ -8912,11 +8915,11 @@ enum vkd3d_result vsir_update_dcl_temps(struct vsir_program *program,
|
||||
{
|
||||
/* The phase didn't have a dcl_temps instruction, but we added
|
||||
* temps here, so we need to insert one. */
|
||||
if (!shader_instruction_array_insert_at(&program->instructions, i + 1, 1))
|
||||
if (!vsir_program_iterator_insert_after(&it, 1))
|
||||
return VKD3D_ERROR_OUT_OF_MEMORY;
|
||||
|
||||
ins = &program->instructions.elements[i + 1];
|
||||
vsir_instruction_init(ins, &program->instructions.elements[i].location, VSIR_OP_DCL_TEMPS);
|
||||
ins = vsir_program_iterator_next(&it);
|
||||
vsir_instruction_init(ins, &location, VSIR_OP_DCL_TEMPS);
|
||||
ins->declaration.count = temp_count;
|
||||
temp_count = 0;
|
||||
continue;
|
||||
@@ -8937,13 +8940,15 @@ enum vkd3d_result vsir_update_dcl_temps(struct vsir_program *program,
|
||||
|
||||
if (temp_count && program->shader_version.major >= 4)
|
||||
{
|
||||
struct vkd3d_shader_instruction *ins;
|
||||
ins = vsir_program_iterator_head(&it);
|
||||
location = ins->location;
|
||||
|
||||
if (!shader_instruction_array_insert_at(&program->instructions, 0, 1))
|
||||
vsir_program_iterator_prev(&it);
|
||||
if (!vsir_program_iterator_insert_after(&it, 1))
|
||||
return VKD3D_ERROR_OUT_OF_MEMORY;
|
||||
|
||||
ins = &program->instructions.elements[0];
|
||||
vsir_instruction_init(ins, &program->instructions.elements[1].location, VSIR_OP_DCL_TEMPS);
|
||||
ins = vsir_program_iterator_next(&it);
|
||||
vsir_instruction_init(ins, &location, VSIR_OP_DCL_TEMPS);
|
||||
ins->declaration.count = temp_count;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user