asahi: rework cf binding xml

for flat shading of fans.

Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26614>
This commit is contained in:
Alyssa Rosenzweig 2023-11-25 22:31:15 -04:00
parent 2fec6bf951
commit 403a20a9f2
3 changed files with 28 additions and 12 deletions

View file

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

View file

@ -165,7 +165,9 @@
<enum name="Shade model">
<value name="Flat vertex 0" value="0"/>
<value name="Flat vertex 2" value="2"/>
<value name="Gouraud" value="3"/>
<value name="Linear" value="3"/>
<value name="Flat vertex 1" value="6"/>
<value name="Perspective" value="7"/>
</enum>
<enum name="Coefficient source">
@ -179,8 +181,7 @@
<struct name="CF binding" size="4">
<field name="Components" size="2" start="0" type="uint" modifier="minus(1)"/>
<field name="Shade model" size="2" start="2" type="Shade model"/>
<field name="Perspective" size="1" start="4" type="bool"/>
<field name="Shade model" size="3" start="2" type="Shade model"/>
<field name="Source" size="3" start="5" type="Coefficient source"/>
<field name="Base slot" size="8" start="8" type="uint"/>
<field name="Base coefficient register" size="8" start="16" type="uint"/>

View file

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