From e130ada24310f0e3adc0349c0fb2098ad20d65d9 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Thu, 14 Jun 2018 11:04:05 -0700 Subject: [PATCH] v3d: Fix shaders using pixel center W but no varyings. The docs called this field "uses both center W and centroid W", but actually it's "do you need center W even if varyings don't obviously call for it?" Fixes dEQP-GLES3.functional.shaders.builtin_variable.fragcoord_w --- src/broadcom/compiler/nir_to_vir.c | 17 +++++------------ src/broadcom/compiler/v3d_compiler.h | 4 ++-- src/broadcom/compiler/vir.c | 2 +- src/gallium/drivers/v3d/v3dx_draw.c | 2 +- 4 files changed, 9 insertions(+), 16 deletions(-) diff --git a/src/broadcom/compiler/nir_to_vir.c b/src/broadcom/compiler/nir_to_vir.c index 51b4fd6848d..4cbdb764eab 100644 --- a/src/broadcom/compiler/nir_to_vir.c +++ b/src/broadcom/compiler/nir_to_vir.c @@ -2006,9 +2006,10 @@ vir_emit_last_thrsw(struct v3d_compile *c) c->last_thrsw->is_last_thrsw = true; } -/* There's a flag in the shader for "centroid W used in addition to center W", - * so we need to walk the program after VIR optimization to see if both are - * used. +/* There's a flag in the shader for "center W is needed for reasons other than + * non-centroid varyings", so we just walk the program after VIR optimization + * to see if it's used. It should be harmless to set even if we only use + * center W for varyings. */ static void vir_check_payload_w(struct v3d_compile *c) @@ -2016,19 +2017,11 @@ vir_check_payload_w(struct v3d_compile *c) if (c->s->info.stage != MESA_SHADER_FRAGMENT) return; - bool any_centroid = false; - for (int i = 0; i < ARRAY_SIZE(c->centroid_flags); i++) { - if (c->centroid_flags[i]) - any_centroid = true; - } - if (!any_centroid) - return; - vir_for_each_inst_inorder(inst, c) { for (int i = 0; i < vir_get_nsrc(inst); i++) { if (inst->src[i].file == QFILE_REG && inst->src[i].index == 0) { - c->uses_centroid_and_center_w = true; + c->uses_center_w = true; return; } } diff --git a/src/broadcom/compiler/v3d_compiler.h b/src/broadcom/compiler/v3d_compiler.h index 4eeda23f5de..24af18e8f9e 100644 --- a/src/broadcom/compiler/v3d_compiler.h +++ b/src/broadcom/compiler/v3d_compiler.h @@ -478,7 +478,7 @@ struct v3d_compile { uint32_t centroid_flags[BITSET_WORDS(V3D_MAX_FS_INPUTS)]; - bool uses_centroid_and_center_w; + bool uses_center_w; struct v3d_ubo_range *ubo_ranges; bool *ubo_range_used; @@ -663,7 +663,7 @@ struct v3d_fs_prog_data { bool writes_z; bool discard; - bool uses_centroid_and_center_w; + bool uses_center_w; }; /* Special nir_load_input intrinsic index for loading the current TLB diff --git a/src/broadcom/compiler/vir.c b/src/broadcom/compiler/vir.c index 0de5335d12a..28e25cb23e2 100644 --- a/src/broadcom/compiler/vir.c +++ b/src/broadcom/compiler/vir.c @@ -841,7 +841,7 @@ uint64_t *v3d_compile_fs(const struct v3d_compiler *compiler, prog_data->writes_z = (c->s->info.outputs_written & (1 << FRAG_RESULT_DEPTH)); prog_data->discard = c->s->info.fs.uses_discard; - prog_data->uses_centroid_and_center_w = c->uses_centroid_and_center_w; + prog_data->uses_center_w = c->uses_center_w; return v3d_return_qpu_insts(c, final_assembly_size); } diff --git a/src/gallium/drivers/v3d/v3dx_draw.c b/src/gallium/drivers/v3d/v3dx_draw.c index 97127a1b69b..17719738056 100644 --- a/src/gallium/drivers/v3d/v3dx_draw.c +++ b/src/gallium/drivers/v3d/v3dx_draw.c @@ -178,7 +178,7 @@ v3d_emit_gl_shader_state(struct v3d_context *v3d, v3d->prog.fs->prog_data.fs->discard); shader.fragment_shader_uses_real_pixel_centre_w_in_addition_to_centroid_w2 = - v3d->prog.fs->prog_data.fs->uses_centroid_and_center_w; + v3d->prog.fs->prog_data.fs->uses_center_w; shader.number_of_varyings_in_fragment_shader = v3d->prog.fs->prog_data.base->num_inputs; -- 2.30.2