v3d: Fix shaders using pixel center W but no varyings.
authorEric Anholt <eric@anholt.net>
Thu, 14 Jun 2018 18:04:05 +0000 (11:04 -0700)
committerEric Anholt <eric@anholt.net>
Fri, 15 Jun 2018 23:09:39 +0000 (16:09 -0700)
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
src/broadcom/compiler/v3d_compiler.h
src/broadcom/compiler/vir.c
src/gallium/drivers/v3d/v3dx_draw.c

index 51b4fd6..4cbdb76 100644 (file)
@@ -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;
                         }
                 }
index 4eeda23..24af18e 100644 (file)
@@ -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
index 0de5335..28e25cb 100644 (file)
@@ -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);
 }
index 97127a1..1771973 100644 (file)
@@ -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;