From: Brian Ho Date: Mon, 4 May 2020 20:55:06 +0000 (-0700) Subject: turnip: Execute ir3_nir_lower_gs pass again X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=a43e9740646a42e3c2d914ad7e0eb20f4113d153;p=mesa.git turnip: Execute ir3_nir_lower_gs pass again 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: --- diff --git a/src/compiler/nir/nir_gather_info.c b/src/compiler/nir/nir_gather_info.c index e80a65f19fd..f62adb6e1f4 100644 --- a/src/compiler/nir/nir_gather_info.c +++ b/src/compiler/nir/nir_gather_info.c @@ -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: diff --git a/src/freedreno/vulkan/tu_shader.c b/src/freedreno/vulkan/tu_shader.c index 4fda6538fdf..f6cf0b75761 100644 --- a/src/freedreno/vulkan/tu_shader.c +++ b/src/freedreno/vulkan/tu_shader.c @@ -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);