panfrost: Enable helper invocations when texturing
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Fri, 7 Jun 2019 23:00:49 +0000 (16:00 -0700)
committerAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Mon, 17 Jun 2019 15:22:37 +0000 (08:22 -0700)
it turns out we have explicit control over helper invocations; if a
particular bit in the fragment shader descriptor is set, helper
invocations are launched; if it clear, they are not. Helper invocations
are required whenever computing derivatives, whether explicitly
(dFdx/dFdy) *or* implicitly (any texturing). Accordingly, we set this
bit when texturing to fix edge case behaviour (literally, haha).

Thank you to Jason Ekstrand and Ilia Mirkin for pointing out the
representative dEQP test failed along triangle edges and for suggesting
helper invocations / derivatives as a list of suspect pieces (which led
to discovering the helper invocations enable bit in the first place).

Ideally we would use the new NIR analysis pass for this, but that hasn't
landed quite yet.

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
src/gallium/drivers/panfrost/ci/expected-failures.txt
src/gallium/drivers/panfrost/include/panfrost-job.h
src/gallium/drivers/panfrost/pan_context.c
src/gallium/drivers/panfrost/pandecode/decode.c

index c5386966554593cbc3fd2d18ce2963f249d511e3..8bfe988e99ce99b8bd3359c7fbc3f399f99256da 100644 (file)
@@ -361,44 +361,6 @@ dEQP-GLES2.functional.texture.filtering.2d.linear_mipmap_nearest_nearest_repeat_
 dEQP-GLES2.functional.texture.filtering.2d.linear_mipmap_nearest_nearest_repeat_rgb888
 dEQP-GLES2.functional.texture.filtering.2d.linear_mipmap_nearest_nearest_repeat_rgba4444
 dEQP-GLES2.functional.texture.filtering.2d.linear_mipmap_nearest_nearest_repeat_rgba8888
-dEQP-GLES2.functional.texture.filtering.2d.linear_nearest_clamp_etc1
-dEQP-GLES2.functional.texture.filtering.2d.linear_nearest_clamp_l8_npot
-dEQP-GLES2.functional.texture.filtering.2d.linear_nearest_clamp_l8_pot
-dEQP-GLES2.functional.texture.filtering.2d.linear_nearest_clamp_rgb888_npot
-dEQP-GLES2.functional.texture.filtering.2d.linear_nearest_clamp_rgb888_pot
-dEQP-GLES2.functional.texture.filtering.2d.linear_nearest_clamp_rgba4444_npot
-dEQP-GLES2.functional.texture.filtering.2d.linear_nearest_clamp_rgba4444_pot
-dEQP-GLES2.functional.texture.filtering.2d.linear_nearest_clamp_rgba8888_npot
-dEQP-GLES2.functional.texture.filtering.2d.linear_nearest_clamp_rgba8888_pot
-dEQP-GLES2.functional.texture.filtering.2d.linear_nearest_mirror_etc1
-dEQP-GLES2.functional.texture.filtering.2d.linear_nearest_mirror_l8_pot
-dEQP-GLES2.functional.texture.filtering.2d.linear_nearest_mirror_rgb888_pot
-dEQP-GLES2.functional.texture.filtering.2d.linear_nearest_mirror_rgba4444_pot
-dEQP-GLES2.functional.texture.filtering.2d.linear_nearest_mirror_rgba8888_pot
-dEQP-GLES2.functional.texture.filtering.2d.linear_nearest_repeat_etc1
-dEQP-GLES2.functional.texture.filtering.2d.linear_nearest_repeat_l8_pot
-dEQP-GLES2.functional.texture.filtering.2d.linear_nearest_repeat_rgb888_pot
-dEQP-GLES2.functional.texture.filtering.2d.linear_nearest_repeat_rgba4444_pot
-dEQP-GLES2.functional.texture.filtering.2d.linear_nearest_repeat_rgba8888_pot
-dEQP-GLES2.functional.texture.filtering.2d.nearest_linear_clamp_etc1
-dEQP-GLES2.functional.texture.filtering.2d.nearest_linear_clamp_l8_npot
-dEQP-GLES2.functional.texture.filtering.2d.nearest_linear_clamp_l8_pot
-dEQP-GLES2.functional.texture.filtering.2d.nearest_linear_clamp_rgb888_npot
-dEQP-GLES2.functional.texture.filtering.2d.nearest_linear_clamp_rgb888_pot
-dEQP-GLES2.functional.texture.filtering.2d.nearest_linear_clamp_rgba4444_npot
-dEQP-GLES2.functional.texture.filtering.2d.nearest_linear_clamp_rgba4444_pot
-dEQP-GLES2.functional.texture.filtering.2d.nearest_linear_clamp_rgba8888_npot
-dEQP-GLES2.functional.texture.filtering.2d.nearest_linear_clamp_rgba8888_pot
-dEQP-GLES2.functional.texture.filtering.2d.nearest_linear_mirror_etc1
-dEQP-GLES2.functional.texture.filtering.2d.nearest_linear_mirror_l8_pot
-dEQP-GLES2.functional.texture.filtering.2d.nearest_linear_mirror_rgb888_pot
-dEQP-GLES2.functional.texture.filtering.2d.nearest_linear_mirror_rgba4444_pot
-dEQP-GLES2.functional.texture.filtering.2d.nearest_linear_mirror_rgba8888_pot
-dEQP-GLES2.functional.texture.filtering.2d.nearest_linear_repeat_etc1
-dEQP-GLES2.functional.texture.filtering.2d.nearest_linear_repeat_l8_pot
-dEQP-GLES2.functional.texture.filtering.2d.nearest_linear_repeat_rgb888_pot
-dEQP-GLES2.functional.texture.filtering.2d.nearest_linear_repeat_rgba4444_pot
-dEQP-GLES2.functional.texture.filtering.2d.nearest_linear_repeat_rgba8888_pot
 dEQP-GLES2.functional.texture.filtering.2d.nearest_mipmap_linear_linear_clamp_etc1
 dEQP-GLES2.functional.texture.filtering.2d.nearest_mipmap_linear_linear_clamp_rgba8888
 dEQP-GLES2.functional.texture.filtering.2d.nearest_mipmap_linear_linear_mirror_etc1
@@ -429,40 +391,6 @@ dEQP-GLES2.functional.texture.filtering.2d.nearest_mipmap_nearest_nearest_repeat
 dEQP-GLES2.functional.texture.filtering.2d.nearest_mipmap_nearest_nearest_repeat_rgb888
 dEQP-GLES2.functional.texture.filtering.2d.nearest_mipmap_nearest_nearest_repeat_rgba4444
 dEQP-GLES2.functional.texture.filtering.2d.nearest_mipmap_nearest_nearest_repeat_rgba8888
-dEQP-GLES2.functional.texture.filtering.cube.linear_nearest_clamp_etc1
-dEQP-GLES2.functional.texture.filtering.cube.linear_nearest_clamp_l8_npot
-dEQP-GLES2.functional.texture.filtering.cube.linear_nearest_clamp_l8_pot
-dEQP-GLES2.functional.texture.filtering.cube.linear_nearest_clamp_rgb888_npot
-dEQP-GLES2.functional.texture.filtering.cube.linear_nearest_clamp_rgb888_pot
-dEQP-GLES2.functional.texture.filtering.cube.linear_nearest_clamp_rgba4444_npot
-dEQP-GLES2.functional.texture.filtering.cube.linear_nearest_clamp_rgba4444_pot
-dEQP-GLES2.functional.texture.filtering.cube.linear_nearest_clamp_rgba8888_npot
-dEQP-GLES2.functional.texture.filtering.cube.linear_nearest_clamp_rgba8888_pot
-dEQP-GLES2.functional.texture.filtering.cube.linear_nearest_mirror_l8_pot
-dEQP-GLES2.functional.texture.filtering.cube.linear_nearest_mirror_rgb888_pot
-dEQP-GLES2.functional.texture.filtering.cube.linear_nearest_mirror_rgba4444_pot
-dEQP-GLES2.functional.texture.filtering.cube.linear_nearest_mirror_rgba8888_pot
-dEQP-GLES2.functional.texture.filtering.cube.linear_nearest_repeat_l8_pot
-dEQP-GLES2.functional.texture.filtering.cube.linear_nearest_repeat_rgb888_pot
-dEQP-GLES2.functional.texture.filtering.cube.linear_nearest_repeat_rgba4444_pot
-dEQP-GLES2.functional.texture.filtering.cube.linear_nearest_repeat_rgba8888_pot
-dEQP-GLES2.functional.texture.filtering.cube.nearest_linear_clamp_etc1
-dEQP-GLES2.functional.texture.filtering.cube.nearest_linear_clamp_l8_npot
-dEQP-GLES2.functional.texture.filtering.cube.nearest_linear_clamp_l8_pot
-dEQP-GLES2.functional.texture.filtering.cube.nearest_linear_clamp_rgb888_npot
-dEQP-GLES2.functional.texture.filtering.cube.nearest_linear_clamp_rgb888_pot
-dEQP-GLES2.functional.texture.filtering.cube.nearest_linear_clamp_rgba4444_npot
-dEQP-GLES2.functional.texture.filtering.cube.nearest_linear_clamp_rgba4444_pot
-dEQP-GLES2.functional.texture.filtering.cube.nearest_linear_clamp_rgba8888_npot
-dEQP-GLES2.functional.texture.filtering.cube.nearest_linear_clamp_rgba8888_pot
-dEQP-GLES2.functional.texture.filtering.cube.nearest_linear_mirror_l8_pot
-dEQP-GLES2.functional.texture.filtering.cube.nearest_linear_mirror_rgb888_pot
-dEQP-GLES2.functional.texture.filtering.cube.nearest_linear_mirror_rgba4444_pot
-dEQP-GLES2.functional.texture.filtering.cube.nearest_linear_mirror_rgba8888_pot
-dEQP-GLES2.functional.texture.filtering.cube.nearest_linear_repeat_l8_pot
-dEQP-GLES2.functional.texture.filtering.cube.nearest_linear_repeat_rgb888_pot
-dEQP-GLES2.functional.texture.filtering.cube.nearest_linear_repeat_rgba4444_pot
-dEQP-GLES2.functional.texture.filtering.cube.nearest_linear_repeat_rgba8888_pot
 dEQP-GLES2.functional.texture.filtering.cube.nearest_mipmap_linear_linear_clamp_etc1
 dEQP-GLES2.functional.texture.filtering.cube.nearest_mipmap_linear_linear_clamp_rgba8888
 dEQP-GLES2.functional.texture.filtering.cube.nearest_mipmap_linear_linear_mirror_rgba8888
index e320785542bea16fe8e254ca04308f14c17616d3..4b8272fd95920c45b20ae8fdd943e2240066368e 100644 (file)
@@ -403,7 +403,19 @@ enum mali_format {
 #define MALI_GET_ALPHA_COVERAGE(nibble) ((float) nibble / 15.0f)
 
 /* Applies to unknown1 */
-#define MALI_NO_ALPHA_TO_COVERAGE (1 << 10)
+
+/* Should the hardware perform early-Z testing? Normally should be set
+ * for performance reasons. Clear if you use: discard,
+ * alpha-to-coverage... * It's also possible this disables
+ * forward-pixel kill; we're not quite sure which bit is which yet.
+ * TODO: How does this interact with blending?*/
+
+#define MALI_EARLY_Z (1 << 10)
+
+/* Should the hardware calculate derivatives (via helper invocations)? Set in a
+ * fragment shader that uses texturing or derivative functions */
+
+#define MALI_HELPER_INVOCATIONS (1 << 11)
 
 /* Flags denoting the fragment shader's use of tilebuffer readback. If the
  * shader might read any part of the tilebuffer, set MALI_READS_TILEBUFFER. If
index 8dbdc84209d9065616e7897fb44f1dd4ee33f04b..7004fb14cacbf8d782c1167efd9c1d9a9637f6bb 100644 (file)
@@ -1088,7 +1088,15 @@ panfrost_emit_for_draw(struct panfrost_context *ctx, bool with_vertex_data)
 
                 /* Set late due to depending on render state */
                 /* The one at the end seems to mean "1 UBO" */
-                ctx->fragment_shader_core.midgard1.unknown1 = MALI_NO_ALPHA_TO_COVERAGE | 0x200 | 0x2201;
+                unsigned flags = MALI_EARLY_Z | 0x200 | 0x2000 | 0x1;
+
+                /* Any time texturing is used, derivatives are implicitly
+                 * calculated, so we need to enable helper invocations */
+
+                if (ctx->sampler_view_count[PIPE_SHADER_FRAGMENT])
+                        flags |= MALI_HELPER_INVOCATIONS;
+
+                ctx->fragment_shader_core.midgard1.unknown1 = flags;
 
                 /* Assign texture/sample count right before upload */
                 ctx->fragment_shader_core.texture_count = ctx->sampler_view_count[PIPE_SHADER_FRAGMENT];
@@ -1107,7 +1115,7 @@ panfrost_emit_for_draw(struct panfrost_context *ctx, bool with_vertex_data)
 
                 if (variant->can_discard) {
                         ctx->fragment_shader_core.unknown2_3 |= MALI_CAN_DISCARD;
-                        ctx->fragment_shader_core.midgard1.unknown1 &= ~MALI_NO_ALPHA_TO_COVERAGE;
+                        ctx->fragment_shader_core.midgard1.unknown1 &= ~MALI_EARLY_Z;
                         ctx->fragment_shader_core.midgard1.unknown1 |= 0x4000;
                         ctx->fragment_shader_core.midgard1.unknown1 = 0x4200;
                 }
index fdb820a37f4d5717134446db4942e5673db1e889..90b2579a436357ebcbaf3a95002d69eb4841aee3 100644 (file)
@@ -223,7 +223,8 @@ static const struct pandecode_flag_info mfbd_extra_flag_info[] = {
 
 #define FLAG_INFO(flag) { MALI_##flag, "MALI_" #flag }
 static const struct pandecode_flag_info shader_unknown1_flag_info [] = {
-        FLAG_INFO(NO_ALPHA_TO_COVERAGE),
+        FLAG_INFO(EARLY_Z),
+        FLAG_INFO(HELPER_INVOCATIONS),
         FLAG_INFO(READS_TILEBUFFER),
         FLAG_INFO(READS_ZS),
         {}