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,
|
enum vkd3d_result vsir_update_dcl_temps(struct vsir_program *program,
|
||||||
struct vkd3d_shader_message_context *message_context)
|
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;
|
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)
|
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
|
/* The phase didn't have a dcl_temps instruction, but we added
|
||||||
* temps here, so we need to insert one. */
|
* 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;
|
return VKD3D_ERROR_OUT_OF_MEMORY;
|
||||||
|
|
||||||
ins = &program->instructions.elements[i + 1];
|
ins = vsir_program_iterator_next(&it);
|
||||||
vsir_instruction_init(ins, &program->instructions.elements[i].location, VSIR_OP_DCL_TEMPS);
|
vsir_instruction_init(ins, &location, VSIR_OP_DCL_TEMPS);
|
||||||
ins->declaration.count = temp_count;
|
ins->declaration.count = temp_count;
|
||||||
temp_count = 0;
|
temp_count = 0;
|
||||||
continue;
|
continue;
|
||||||
@@ -8937,13 +8940,15 @@ enum vkd3d_result vsir_update_dcl_temps(struct vsir_program *program,
|
|||||||
|
|
||||||
if (temp_count && program->shader_version.major >= 4)
|
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;
|
return VKD3D_ERROR_OUT_OF_MEMORY;
|
||||||
|
|
||||||
ins = &program->instructions.elements[0];
|
ins = vsir_program_iterator_next(&it);
|
||||||
vsir_instruction_init(ins, &program->instructions.elements[1].location, VSIR_OP_DCL_TEMPS);
|
vsir_instruction_init(ins, &location, VSIR_OP_DCL_TEMPS);
|
||||||
ins->declaration.count = temp_count;
|
ins->declaration.count = temp_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user