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