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 &&