if (nir_is_arrayed_io(var, shader->info.stage) ||
/* For NV_mesh_shader. */
(shader->info.stage == MESA_SHADER_MESH &&
- var->data.location == VARYING_SLOT_PRIMITIVE_INDICES)) {
+ var->data.location == VARYING_SLOT_PRIMITIVE_INDICES &&
+ !var->data.per_primitive)) {
assert(glsl_type_is_array(type));
type = glsl_get_array_element(type);
}
if (stage == MESA_SHADER_MESH) {
/* NV_mesh_shader: this is flat array for the whole workgroup. */
if (var->data.location == VARYING_SLOT_PRIMITIVE_INDICES)
- return false;
+ return var->data.per_primitive;
}
if (var->data.mode == nir_var_shader_in)
type = glsl_get_array_element(type);
}
+ /* NV_mesh_shader:
+ * PRIMITIVE_INDICES is a flat array, not a proper arrayed output,
+ * as opposed to D3D-style mesh shaders where it's addressed by
+ * the primitive index.
+ * Prevent assigning several slots to primitive indices,
+ * to avoid some issues.
+ */
+ if (state->builder.shader->info.stage == MESA_SHADER_MESH &&
+ var->data.location == VARYING_SLOT_PRIMITIVE_INDICES &&
+ !nir_is_arrayed_io(var, state->builder.shader->info.stage))
+ return 1;
+
return state->type_size(type, var->data.bindless);
}
semantics.per_view = var->data.per_view;
semantics.invariant = var->data.invariant;
- /* NV_mesh_shader: prevent assigning several slots to primitive indices. */
- if (b->shader->info.stage == MESA_SHADER_MESH &&
- var->data.location == VARYING_SLOT_PRIMITIVE_INDICES &&
- !nir_is_arrayed_io(var, b->shader->info.stage))
- semantics.num_slots = 1;
-
nir_intrinsic_set_io_semantics(store, semantics);
nir_builder_instr_insert(b, &store->instr);