From 2d848b5bc0b28699f734259f82b48f33d4f6fab1 Mon Sep 17 00:00:00 2001 From: Giovanni Mascellani Date: Wed, 16 Jul 2025 21:58:36 +0200 Subject: [PATCH] vkd3d-shader/ir: Introduce an abstraction to iterate through vsir instructions. --- libs/vkd3d-shader/ir.c | 11 ++++--- libs/vkd3d-shader/vkd3d_shader_private.h | 37 ++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/libs/vkd3d-shader/ir.c b/libs/vkd3d-shader/ir.c index b060ccbb2..9ceb81f2c 100644 --- a/libs/vkd3d-shader/ir.c +++ b/libs/vkd3d-shader/ir.c @@ -1579,14 +1579,15 @@ static enum vkd3d_result vsir_program_lower_dcl_output(struct vsir_program *prog static enum vkd3d_result vsir_program_lower_instructions(struct vsir_program *program, struct vsir_transformation_context *ctx) { - struct vkd3d_shader_instruction_array *instructions = &program->instructions; + struct vsir_program_iterator it = vsir_program_iterator(&program->instructions); struct vkd3d_shader_message_context *message_context = ctx->message_context; - unsigned int tmp_idx = ~0u, i; + struct vkd3d_shader_instruction *ins; + unsigned int tmp_idx = ~0u; enum vkd3d_result ret; - for (i = 0; i < instructions->count; ++i) + for (ins = vsir_program_iterator_head(&it); ins; ins = vsir_program_iterator_next(&it)) { - struct vkd3d_shader_instruction *ins = &instructions->elements[i]; + size_t idx = it.idx; switch (ins->opcode) { @@ -1704,6 +1705,8 @@ static enum vkd3d_result vsir_program_lower_instructions(struct vsir_program *pr default: break; } + + it.idx = idx; } return VKD3D_OK; diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index 4fd16df89..347fd51fe 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -1419,6 +1419,43 @@ bool shader_instruction_array_clone_instruction(struct vkd3d_shader_instruction_ unsigned int dst, unsigned int src); void shader_instruction_array_destroy(struct vkd3d_shader_instruction_array *instructions); +struct vsir_program_iterator +{ + struct vkd3d_shader_instruction_array *array; + size_t idx; +}; + +static inline struct vsir_program_iterator vsir_program_iterator(struct vkd3d_shader_instruction_array *array) +{ + return (struct vsir_program_iterator){ .array = array }; +} + +static inline struct vkd3d_shader_instruction *vsir_program_iterator_current( + struct vsir_program_iterator *iterator) +{ + if (iterator->idx >= iterator->array->count) + return NULL; + + return &iterator->array->elements[iterator->idx]; +} + +static inline struct vkd3d_shader_instruction *vsir_program_iterator_head( + struct vsir_program_iterator *iterator) +{ + iterator->idx = 0; + + return vsir_program_iterator_current(iterator); +} + +static inline struct vkd3d_shader_instruction *vsir_program_iterator_next( + struct vsir_program_iterator *iterator) +{ + if (iterator->idx < iterator->array->count) + ++iterator->idx; + + return vsir_program_iterator_current(iterator); +} + enum vkd3d_shader_config_flags { VKD3D_SHADER_CONFIG_FLAG_FORCE_VALIDATION = 0x00000001,