mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-09-12 18:50:22 -07:00
vkd3d-shader/ir: Introduce an abstraction to iterate through vsir instructions.
This commit is contained in:
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
@@ -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;
|
||||||
|
@@ -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,
|
||||||
|
Reference in New Issue
Block a user