asahi: extend varying linking for tri fan weirdness

Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29179>
This commit is contained in:
Alyssa Rosenzweig 2024-04-22 23:59:38 -04:00 committed by Marge Bot
parent d763ab2de0
commit cad60ab4b1
4 changed files with 24 additions and 23 deletions

View File

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

View File

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

View File

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

View File

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