+static bool
+lower_system_values_to_inlined_uniforms_instr(nir_builder *b, nir_instr *instr, void *data)
+{
+ if (instr->type != nir_instr_type_intrinsic)
+ return false;
+
+ nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr);
+
+ int inlined_uniform_offset;
+ switch (intrin->intrinsic) {
+ case nir_intrinsic_load_flat_mask:
+ inlined_uniform_offset = ZINK_INLINE_VAL_FLAT_MASK * sizeof(uint32_t);
+ break;
+ case nir_intrinsic_load_provoking_last:
+ inlined_uniform_offset = ZINK_INLINE_VAL_PV_LAST_VERT * sizeof(uint32_t);
+ break;
+ default:
+ return false;
+ }
+
+ b->cursor = nir_before_instr(&intrin->instr);
+ nir_ssa_def *new_dest_def = nir_load_ubo(b, 1, 32, nir_imm_int(b, 0),
+ nir_imm_int(b, inlined_uniform_offset),
+ .align_mul = 4, .align_offset = 0,
+ .range_base = 0, .range = ~0);
+ nir_ssa_def_rewrite_uses(&intrin->dest.ssa, new_dest_def);
+ nir_instr_remove(instr);
+ return true;
+}
+
+bool
+zink_lower_system_values_to_inlined_uniforms(nir_shader *nir)
+{
+ return nir_shader_instructions_pass(nir, lower_system_values_to_inlined_uniforms_instr,
+ nir_metadata_dominance, NULL);
+}
+