diff --git a/src/asahi/lib/agx_helpers.h b/src/asahi/lib/agx_helpers.h index ce228fe6305..2280298c4f3 100644 --- a/src/asahi/lib/agx_helpers.h +++ b/src/asahi/lib/agx_helpers.h @@ -139,4 +139,21 @@ agx_pack_line_width(float 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; + } +} + #endif diff --git a/src/asahi/lib/cmdbuf.xml b/src/asahi/lib/cmdbuf.xml index 2904a2e4e1d..3dbf0c15739 100644 --- a/src/asahi/lib/cmdbuf.xml +++ b/src/asahi/lib/cmdbuf.xml @@ -165,7 +165,9 @@ - + + + @@ -179,8 +181,7 @@ - - + diff --git a/src/gallium/drivers/asahi/agx_state.c b/src/gallium/drivers/asahi/agx_state.c index bc388cd416c..b648b6afbaa 100644 --- a/src/gallium/drivers/asahi/agx_state.c +++ b/src/gallium/drivers/asahi/agx_state.c @@ -1559,12 +1559,8 @@ agx_link_varyings_vs_fs(struct agx_pool *pool, struct agx_varyings_vs *vs, agx_pack(bindings + i, CF_BINDING, cfg) { cfg.base_coefficient_register = fs->bindings[i].cf_base; cfg.components = fs->bindings[i].count; - cfg.perspective = fs->bindings[i].perspective; - - cfg.shade_model = fs->bindings[i].smooth ? AGX_SHADE_MODEL_GOURAUD - : first_provoking_vertex - ? AGX_SHADE_MODEL_FLAT_VERTEX_0 - : AGX_SHADE_MODEL_FLAT_VERTEX_2; + cfg.shade_model = + agx_translate_shade_model(fs, i, first_provoking_vertex); if (fs->bindings[i].slot == VARYING_SLOT_PNTC) { assert(fs->bindings[i].offset == 0); @@ -1580,10 +1576,12 @@ agx_link_varyings_vs_fs(struct agx_pool *pool, struct agx_varyings_vs *vs, } if (fs->bindings[i].slot == VARYING_SLOT_POS) { - if (fs->bindings[i].offset == 2) + if (fs->bindings[i].offset == 2) { cfg.source = AGX_COEFFICIENT_SOURCE_FRAGCOORD_Z; - else - assert(!cfg.perspective && "W must not be perspective divided"); + } else { + assert(!fs->bindings[i].perspective && + "W must not be perspective divided"); + } } assert(cfg.base_coefficient_register + cfg.components <= fs->nr_cf &&