vkd3d-shader/ir: Introduce an abstraction to iterate through vsir instructions.

This commit is contained in:
Giovanni Mascellani
2025-07-16 21:58:36 +02:00
committed by Henri Verbeet
parent ba545669cd
commit 2d848b5bc0
Notes: Henri Verbeet 2025-07-17 14:18:45 +02:00
Approved-by: Francisco Casas (@fcasas)
Approved-by: Elizabeth Figura (@zfigura)
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1614
2 changed files with 44 additions and 4 deletions

View File

@@ -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, static enum vkd3d_result vsir_program_lower_instructions(struct vsir_program *program,
struct vsir_transformation_context *ctx) 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; 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; 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) switch (ins->opcode)
{ {
@@ -1704,6 +1705,8 @@ static enum vkd3d_result vsir_program_lower_instructions(struct vsir_program *pr
default: default:
break; break;
} }
it.idx = idx;
} }
return VKD3D_OK; return VKD3D_OK;

View File

@@ -1419,6 +1419,43 @@ bool shader_instruction_array_clone_instruction(struct vkd3d_shader_instruction_
unsigned int dst, unsigned int src); unsigned int dst, unsigned int src);
void shader_instruction_array_destroy(struct vkd3d_shader_instruction_array *instructions); 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 enum vkd3d_shader_config_flags
{ {
VKD3D_SHADER_CONFIG_FLAG_FORCE_VALIDATION = 0x00000001, VKD3D_SHADER_CONFIG_FLAG_FORCE_VALIDATION = 0x00000001,