From 65076f3ab0eb32d6c3cad47ec49471ea68f5da4d Mon Sep 17 00:00:00 2001 From: Lucas Stach Date: Sun, 12 Jan 2025 21:34:10 +0100 Subject: [PATCH] etnaviv: fix flatshading on halti5 GPUs Halti5 has no interpolation setting which will take into account the rasterizer flatshade state. Force the interpolation qualifier to flatshade for the color varyings when API level flatshade is enabled. Only set the new bit in the shader key on halti5 GPUs to avoid generating unnecessary shader variants on GPUs where the rasterizer flatshade state is properly applied to the varyings. Signed-off-by: Lucas Stach Reviewed-by: Christian Gmeiner Part-of: --- src/gallium/drivers/etnaviv/etnaviv_compiler_nir.c | 5 +++++ src/gallium/drivers/etnaviv/etnaviv_context.c | 3 +++ src/gallium/drivers/etnaviv/etnaviv_shader.h | 2 ++ 3 files changed, 10 insertions(+) diff --git a/src/gallium/drivers/etnaviv/etnaviv_compiler_nir.c b/src/gallium/drivers/etnaviv/etnaviv_compiler_nir.c index 41e839d8cd4..e9470752556 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_compiler_nir.c +++ b/src/gallium/drivers/etnaviv/etnaviv_compiler_nir.c @@ -1222,6 +1222,11 @@ etna_compile_shader(struct etna_shader_variant *v) unsigned idx = var->data.driver_location; sf->reg[idx].reg = idx + 1; sf->reg[idx].slot = var->data.location; + if (var->data.interpolation == INTERP_MODE_NONE && v->key.flatshade && + (var->data.location == VARYING_SLOT_COL0 || + var->data.location == VARYING_SLOT_COL1)) { + var->data.interpolation = INTERP_MODE_FLAT; + } sf->reg[idx].interpolation = var->data.interpolation; sf->reg[idx].num_components = glsl_get_components(var->type); sf->num_reg = MAX2(sf->num_reg, idx+1); diff --git a/src/gallium/drivers/etnaviv/etnaviv_context.c b/src/gallium/drivers/etnaviv/etnaviv_context.c index 8e8c21eee14..1a75977a2b3 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_context.c +++ b/src/gallium/drivers/etnaviv/etnaviv_context.c @@ -302,6 +302,9 @@ etna_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info, .sprite_coord_yinvert = !!ctx->rasterizer->sprite_coord_mode, }; + if (screen->info->halti >= 5) + key.flatshade = ctx->rasterizer->flatshade; + for (i = 0; i < pfb->nr_cbufs; i++) { if (pfb->cbufs[i]) key.frag_rb_swap |= !!translate_pe_format_rb_swap(pfb->cbufs[i]->format) << i; diff --git a/src/gallium/drivers/etnaviv/etnaviv_shader.h b/src/gallium/drivers/etnaviv/etnaviv_shader.h index ac48f0b7538..add5b50106f 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_shader.h +++ b/src/gallium/drivers/etnaviv/etnaviv_shader.h @@ -55,6 +55,8 @@ struct etna_shader_key unsigned sprite_coord_yinvert : 1; /* do we need to lower sample_tex_compare */ unsigned has_sample_tex_compare : 1; + /* color varyings should be flat shaded */ + unsigned flatshade : 1; }; uint32_t global; };