diff --git a/src/asahi/lib/agx_nir_lower_gs.c b/src/asahi/lib/agx_nir_lower_gs.c index e2b3352ebf1..c2ca0349948 100644 --- a/src/asahi/lib/agx_nir_lower_gs.c +++ b/src/asahi/lib/agx_nir_lower_gs.c @@ -339,31 +339,6 @@ lower_gs_count_instr(nir_builder *b, nir_intrinsic_instr *intr, void *data) } } -static bool -lower_prolog_id(nir_builder *b, nir_intrinsic_instr *intr, void *data) -{ - b->cursor = nir_before_instr(&intr->instr); - - nir_def *id; - if (intr->intrinsic == nir_intrinsic_load_primitive_id) - id = load_primitive_id(b); - else if (intr->intrinsic == nir_intrinsic_load_instance_id) - id = load_instance_id(b); - else - return false; - - b->cursor = nir_instr_remove(&intr->instr); - nir_def_rewrite_uses(&intr->def, id); - return true; -} - -bool -agx_nir_lower_sw_vs_id(nir_shader *s) -{ - return nir_shader_intrinsics_pass(s, lower_prolog_id, - nir_metadata_control_flow, NULL); -} - static bool lower_id(nir_builder *b, nir_intrinsic_instr *intr, void *data) { diff --git a/src/asahi/lib/agx_nir_lower_gs.h b/src/asahi/lib/agx_nir_lower_gs.h index 0a970d8c70b..bf34bfcbd97 100644 --- a/src/asahi/lib/agx_nir_lower_gs.h +++ b/src/asahi/lib/agx_nir_lower_gs.h @@ -24,9 +24,7 @@ struct nir_def *agx_load_per_vertex_input(struct nir_builder *b, nir_intrinsic_instr *intr, struct nir_def *vertex); -bool agx_nir_lower_index_buffer(struct nir_shader *s, unsigned index_size_B); - -bool agx_nir_lower_sw_vs_id(nir_shader *s); +bool agx_nir_lower_sw_vs(struct nir_shader *s, unsigned index_size_B); bool agx_nir_lower_vs_before_gs(struct nir_shader *vs, const struct nir_shader *libagx, diff --git a/src/asahi/lib/agx_nir_lower_ia.c b/src/asahi/lib/agx_nir_lower_ia.c index 89893fc014c..c83bff3f25b 100644 --- a/src/asahi/lib/agx_nir_lower_ia.c +++ b/src/asahi/lib/agx_nir_lower_ia.c @@ -22,7 +22,7 @@ static nir_def * load_vertex_id(nir_builder *b, unsigned index_size_B) { - nir_def *id = nir_load_primitive_id(b); + nir_def *id = nir_channel(b, nir_load_global_invocation_id(b, 32), 0); /* If drawing with an index buffer, pull the vertex ID. Otherwise, the * vertex ID is just the index as-is. @@ -43,21 +43,26 @@ load_vertex_id(nir_builder *b, unsigned index_size_B) } static bool -lower_vertex_id(nir_builder *b, nir_intrinsic_instr *intr, void *data) +lower(nir_builder *b, nir_intrinsic_instr *intr, void *data) { - if (intr->intrinsic != nir_intrinsic_load_vertex_id) - return false; - unsigned *index_size_B = data; - b->cursor = nir_instr_remove(&intr->instr); - assert(intr->def.bit_size == 32); - nir_def_rewrite_uses(&intr->def, load_vertex_id(b, *index_size_B)); - return true; + b->cursor = nir_before_instr(&intr->instr); + + if (intr->intrinsic == nir_intrinsic_load_vertex_id) { + nir_def_replace(&intr->def, load_vertex_id(b, *index_size_B)); + return true; + } else if (intr->intrinsic == nir_intrinsic_load_instance_id) { + nir_def_replace(&intr->def, + nir_channel(b, nir_load_global_invocation_id(b, 32), 1)); + return true; + } + + return false; } bool -agx_nir_lower_index_buffer(nir_shader *s, unsigned index_size_B) +agx_nir_lower_sw_vs(nir_shader *s, unsigned index_size_B) { - return nir_shader_intrinsics_pass(s, lower_vertex_id, - nir_metadata_control_flow, &index_size_B); + return nir_shader_intrinsics_pass(s, lower, nir_metadata_control_flow, + &index_size_B); } diff --git a/src/asahi/lib/agx_nir_prolog_epilog.c b/src/asahi/lib/agx_nir_prolog_epilog.c index 6dc74c6fc61..459bde7b80c 100644 --- a/src/asahi/lib/agx_nir_prolog_epilog.c +++ b/src/asahi/lib/agx_nir_prolog_epilog.c @@ -169,8 +169,7 @@ agx_nir_vs_prolog(nir_builder *b, const void *key_) lower_vbo(b->shader, key->attribs, key->robustness); if (!key->hw) { - agx_nir_lower_index_buffer(b->shader, key->sw_index_size_B); - agx_nir_lower_sw_vs_id(b->shader); + agx_nir_lower_sw_vs(b->shader, key->sw_index_size_B); } /* Finally, lower uniforms according to our ABI */