turnip: Execute ir3_nir_lower_gs pass again
authorBrian Ho <brian@brkho.com>
Mon, 4 May 2020 20:55:06 +0000 (13:55 -0700)
committerBrian Ho <brian@brkho.com>
Tue, 12 May 2020 20:42:55 +0000 (13:42 -0700)
This commit fixes a GS regression introduced in !4562 where
ir3's GS lowering pass was moved from common code (ir3_nir) to
freedreno-specific code (ir3_shader). For GS support in turnip, we
need to add the GS lowering pass back in, this time in tu_shader.

As for the nir_gather_info change, the GS lowering pass has always
introduced a discard_if intrinsic into the GS. Previously, we simply
ran nir_shader_gather_info before GS lowering, but now since we lower
the GS before we need to remove the assertion that only a FS can use
the discard_if intrinsic.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4892>

src/compiler/nir/nir_gather_info.c
src/freedreno/vulkan/tu_shader.c

index e80a65f19fd618dc8333ce476c3f562fde21f600..f62adb6e1f45ef31ba626ae8d9860a91a204a4dd 100644 (file)
@@ -290,8 +290,11 @@ gather_intrinsic_info(nir_intrinsic_instr *instr, nir_shader *shader,
    /* fallthrough: quads with helper lanes only might be discarded entirely */
    case nir_intrinsic_discard:
    case nir_intrinsic_discard_if:
-      assert(shader->info.stage == MESA_SHADER_FRAGMENT);
-      shader->info.fs.uses_discard = true;
+      /* Freedreno uses the discard_if intrinsic to end GS invocations that
+       * don't produce a vertex, so we only set uses_discard if executing on
+       * a fragment shader. */
+      if (shader->info.stage == MESA_SHADER_FRAGMENT)
+         shader->info.fs.uses_discard = true;
       break;
 
    case nir_intrinsic_interp_deref_at_centroid:
index 4fda6538fdf8b4ed5bbcf47dec68ca93b1808f75..f6cf0b757617087d2bbd0c6ba3c0d0bd082e2bf0 100644 (file)
@@ -567,6 +567,9 @@ tu_shader_create(struct tu_device *dev,
    if (stage == MESA_SHADER_FRAGMENT)
       NIR_PASS_V(nir, nir_lower_input_attachments, true);
 
+   if (stage == MESA_SHADER_GEOMETRY)
+      NIR_PASS_V(nir, ir3_nir_lower_gs);
+
    NIR_PASS_V(nir, tu_lower_io, shader, layout);
 
    NIR_PASS_V(nir, nir_lower_io, nir_var_all, ir3_glsl_type_size, 0);