diff --git a/src/compiler/nir/nir.c b/src/compiler/nir/nir.c index b8ddf57ea30..1ec73e41909 100644 --- a/src/compiler/nir/nir.c +++ b/src/compiler/nir/nir.c @@ -2461,6 +2461,8 @@ nir_intrinsic_from_system_value(gl_system_value val) return nir_intrinsic_load_ray_geometry_index; case SYSTEM_VALUE_RAY_INSTANCE_CUSTOM_INDEX: return nir_intrinsic_load_ray_instance_custom_index; + case SYSTEM_VALUE_MESH_VIEW_COUNT: + return nir_intrinsic_load_mesh_view_count; case SYSTEM_VALUE_FRAG_SHADING_RATE: return nir_intrinsic_load_frag_shading_rate; default: @@ -2602,6 +2604,8 @@ nir_system_value_from_intrinsic(nir_intrinsic_op intrin) return SYSTEM_VALUE_RAY_INSTANCE_CUSTOM_INDEX; case nir_intrinsic_load_frag_shading_rate: return SYSTEM_VALUE_FRAG_SHADING_RATE; + case nir_intrinsic_load_mesh_view_count: + return SYSTEM_VALUE_MESH_VIEW_COUNT; default: unreachable("intrinsic doesn't produce a system value"); } diff --git a/src/compiler/nir/nir_intrinsics.py b/src/compiler/nir/nir_intrinsics.py index 90b4e07c4ef..24f47f6279b 100644 --- a/src/compiler/nir/nir_intrinsics.py +++ b/src/compiler/nir/nir_intrinsics.py @@ -1020,6 +1020,10 @@ intrinsic("printf", src_comp=[1, 1], dest_comp=1, bit_sizes=[32]) # the driver to at least provide a base location system_value("printf_buffer_address", 1, bit_sizes=[32,64]) +# Mesh shading MultiView intrinsics +system_value("mesh_view_count", 1) +load("mesh_view_indices", [1], [BASE, RANGE], [CAN_ELIMINATE, CAN_REORDER]) + # IR3-specific version of most SSBO intrinsics. The only different # compare to the originals is that they add an extra source to hold # the dword-offset, which is needed by the backend code apart from diff --git a/src/compiler/nir/nir_lower_system_values.c b/src/compiler/nir/nir_lower_system_values.c index 5fdf0587d8e..2d30fb34fe6 100644 --- a/src/compiler/nir/nir_lower_system_values.c +++ b/src/compiler/nir/nir_lower_system_values.c @@ -137,7 +137,8 @@ lower_system_value_instr(nir_builder *b, nir_instr *instr, void *_state) assert(deref->deref_type == nir_deref_type_var); assert(deref->var->data.location == SYSTEM_VALUE_SAMPLE_MASK_IN || deref->var->data.location == SYSTEM_VALUE_RAY_OBJECT_TO_WORLD || - deref->var->data.location == SYSTEM_VALUE_RAY_WORLD_TO_OBJECT); + deref->var->data.location == SYSTEM_VALUE_RAY_WORLD_TO_OBJECT || + deref->var->data.location == SYSTEM_VALUE_MESH_VIEW_INDICES); } nir_variable *var = deref->var; @@ -207,6 +208,11 @@ lower_system_value_instr(nir_builder *b, nir_instr *instr, void *_state) break; } + case SYSTEM_VALUE_MESH_VIEW_INDICES: + return nir_load_mesh_view_indices(b, intrin->dest.ssa.num_components, + bit_size, column, .base = 0, + .range = intrin->dest.ssa.num_components * bit_size / 8); + default: break; }