diff --git a/src/asahi/lib/agx_helpers.h b/src/asahi/lib/agx_helpers.h index 8b60ad39cb83e..6efaff2e28ead 100644 --- a/src/asahi/lib/agx_helpers.h +++ b/src/asahi/lib/agx_helpers.h @@ -152,20 +152,3 @@ agx_pack_line_width(float line_width) /* Clamp to maximum line width */ return MIN2(line_width_fixed, 0xFF); } - -static enum agx_shade_model -agx_translate_shade_model(struct agx_varyings_fs *fs, unsigned binding, - bool first_provoking_vertex) -{ - if (fs->bindings[binding].smooth) { - if (fs->bindings[binding].perspective) - return AGX_SHADE_MODEL_PERSPECTIVE; - else - return AGX_SHADE_MODEL_LINEAR; - } else { - if (!first_provoking_vertex) - return AGX_SHADE_MODEL_FLAT_VERTEX_2; - else - return AGX_SHADE_MODEL_FLAT_VERTEX_0; - } -} diff --git a/src/asahi/lib/agx_nir_lower_uvs.c b/src/asahi/lib/agx_nir_lower_uvs.c index 4b51ac460ca25..c7c6b9ad79c02 100644 --- a/src/asahi/lib/agx_nir_lower_uvs.c +++ b/src/asahi/lib/agx_nir_lower_uvs.c @@ -252,11 +252,24 @@ agx_assign_uvs(struct agx_varyings_vs *varyings, } } +static inline enum agx_shade_model +translate_flat_shade_model(unsigned provoking_vertex) +{ + static_assert(AGX_SHADE_MODEL_FLAT_VERTEX_0 == 0, "hw"); + static_assert(AGX_SHADE_MODEL_FLAT_VERTEX_2 == 2, "hw"); + + assert(provoking_vertex <= 2); + + if (provoking_vertex == 1) + return AGX_SHADE_MODEL_FLAT_VERTEX_1; + else + return (enum agx_shade_model)provoking_vertex; +} + void agx_link_varyings_vs_fs(void *out, struct agx_varyings_vs *vs, unsigned nr_user_indices, struct agx_varyings_fs *fs, - bool first_provoking_vertex, - uint8_t sprite_coord_enable, + unsigned provoking_vertex, uint8_t sprite_coord_enable, bool *generate_primitive_id) { assert(fs->nr_bindings > 0); @@ -280,8 +293,13 @@ agx_link_varyings_vs_fs(void *out, struct agx_varyings_vs *vs, agx_pack(bindings + i, CF_BINDING, cfg) { cfg.base_coefficient_register = b.cf_base; cfg.components = b.count; - cfg.shade_model = - agx_translate_shade_model(fs, i, first_provoking_vertex); + + if (b.smooth) { + cfg.shade_model = b.perspective ? AGX_SHADE_MODEL_PERSPECTIVE + : AGX_SHADE_MODEL_LINEAR; + } else { + cfg.shade_model = translate_flat_shade_model(provoking_vertex); + } if (b.slot == VARYING_SLOT_PNTC || (b.slot >= VARYING_SLOT_TEX0 && b.slot <= VARYING_SLOT_TEX7 && diff --git a/src/asahi/lib/agx_uvs.h b/src/asahi/lib/agx_uvs.h index d94f1d71d48a9..6a0d772dda8e4 100644 --- a/src/asahi/lib/agx_uvs.h +++ b/src/asahi/lib/agx_uvs.h @@ -86,6 +86,6 @@ struct agx_varyings_fs; void agx_link_varyings_vs_fs(void *out, struct agx_varyings_vs *vs, unsigned nr_user_indices, struct agx_varyings_fs *fs, - bool first_provoking_vertex, + unsigned provoking_vertex, uint8_t sprite_coord_enable, bool *generate_primitive_id); diff --git a/src/gallium/drivers/asahi/agx_state.c b/src/gallium/drivers/asahi/agx_state.c index 33938258f75d4..4355a106b16dc 100644 --- a/src/gallium/drivers/asahi/agx_state.c +++ b/src/gallium/drivers/asahi/agx_state.c @@ -3395,7 +3395,7 @@ agx_encode_state(struct agx_batch *batch, uint8_t *out) agx_link_varyings_vs_fs(t.cpu, &batch->linked_varyings, vs->uvs.user_size, &ctx->linked.fs->cf, - ctx->rast->base.flatshade_first, + ctx->rast->base.flatshade_first ? 0 : 2, (batch->reduced_prim == MESA_PRIM_POINTS) ? ctx->rast->base.sprite_coord_enable : 0,