diff --git a/src/nouveau/vulkan/nvk_nir_lower_descriptors.c b/src/nouveau/vulkan/nvk_nir_lower_descriptors.c index ad607476d36..b8760d7ae52 100644 --- a/src/nouveau/vulkan/nvk_nir_lower_descriptors.c +++ b/src/nouveau/vulkan/nvk_nir_lower_descriptors.c @@ -198,6 +198,27 @@ lower_load_push_constant(nir_builder *b, nir_intrinsic_instr *load, return true; } +static bool +lower_load_view_index(nir_builder *b, nir_intrinsic_instr *load, + const struct lower_descriptors_ctx *ctx) +{ + const uint32_t root_table_offset = + nvk_root_descriptor_offset(draw.view_index); + + b->cursor = nir_instr_remove(&load->instr); + + nir_ssa_def *val = nir_load_ubo(b, 1, 32, + nir_imm_int(b, 0), + nir_imm_int(b, root_table_offset), + .align_mul = 4, + .align_offset = 0, + .range = root_table_offset + 4); + + nir_ssa_def_rewrite_uses(&load->dest.ssa, val); + + return true; +} + static void get_resource_deref_binding(nir_builder *b, nir_deref_instr *deref, uint32_t *set, uint32_t *binding, @@ -273,6 +294,9 @@ lower_intrin(nir_builder *b, nir_intrinsic_instr *intrin, case nir_intrinsic_load_push_constant: return lower_load_push_constant(b, intrin, ctx); + case nir_intrinsic_load_view_index: + return lower_load_view_index(b, intrin, ctx); + case nir_intrinsic_image_deref_load: case nir_intrinsic_image_deref_store: case nir_intrinsic_image_deref_atomic: