Module: Mesa Branch: master Commit: 92ec7b577c8cb47b308bba1d21b4c2ec05f35f9f URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=92ec7b577c8cb47b308bba1d21b4c2ec05f35f9f
Author: Erik Faye-Lund <erik.faye-l...@collabora.com> Date: Fri Jan 22 16:14:32 2021 +0100 zink: clone shader before lowering clip_halfz If we don't clone the shader before lowering clip_halfz, we risk ending up performing the same lowering multiple times, each time we compile a new variant. This fixes rendering in Neverball. Fixes: 15f478fe840 ("zink: only run nir_lower_clip_halfz for last vertex processing stage") Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/4147 Reviewed-By: Mike Blumenkrantz <michael.blumenkra...@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8652> --- src/gallium/drivers/zink/zink_compiler.c | 35 +++++++++++++++++--------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c index 01b5be7f6df..040e9c8339b 100644 --- a/src/gallium/drivers/zink/zink_compiler.c +++ b/src/gallium/drivers/zink/zink_compiler.c @@ -313,6 +313,17 @@ update_so_info(struct zink_shader *sh, } } +static bool +last_vertex_stage(struct zink_shader *zs) +{ + assert(zs->nir->info.stage != MESA_SHADER_FRAGMENT); + if (zs->has_geometry_shader) + return zs->nir->info.stage == MESA_SHADER_GEOMETRY; + if (zs->has_tess_shader) + return zs->nir->info.stage == MESA_SHADER_TESS_EVAL; + return true; +} + VkShaderModule zink_shader_compile(struct zink_screen *screen, struct zink_shader *zs, struct zink_shader_key *key, unsigned char *shader_slot_map, unsigned char *shader_slots_reserved) @@ -321,26 +332,18 @@ zink_shader_compile(struct zink_screen *screen, struct zink_shader *zs, struct z void *streamout = NULL; nir_shader *nir = zs->nir; /* TODO: use a separate mem ctx here for ralloc */ - if (zs->has_geometry_shader) { - if (zs->nir->info.stage == MESA_SHADER_GEOMETRY) { - streamout = &zs->streamout; - NIR_PASS_V(nir, nir_lower_clip_halfz); - } - } else if (zs->has_tess_shader) { - if (zs->nir->info.stage == MESA_SHADER_TESS_EVAL) { - streamout = &zs->streamout; + if (zs->nir->info.stage != MESA_SHADER_FRAGMENT) { + if (last_vertex_stage(zs)) { + if (zs->streamout.so_info_slots) + streamout = &zs->streamout; + + nir = nir_shader_clone(NULL, zs->nir); NIR_PASS_V(nir, nir_lower_clip_halfz); } } else { - streamout = &zs->streamout; - NIR_PASS_V(nir, nir_lower_clip_halfz); - } - if (!zs->streamout.so_info_slots) - streamout = NULL; - if (zs->nir->info.stage == MESA_SHADER_FRAGMENT) { - nir = nir_shader_clone(NULL, nir); if (!zink_fs_key(key)->samples && nir->info.outputs_written & BITFIELD64_BIT(FRAG_RESULT_SAMPLE_MASK)) { + nir = nir_shader_clone(NULL, zs->nir); /* VK will always use gl_SampleMask[] values even if sample count is 0, * so we need to skip this write here to mimic GL's behavior of ignoring it */ @@ -376,7 +379,7 @@ zink_shader_compile(struct zink_screen *screen, struct zink_shader *zs, struct z if (vkCreateShaderModule(screen->dev, &smci, NULL, &mod) != VK_SUCCESS) mod = VK_NULL_HANDLE; - if (zs->nir->info.stage == MESA_SHADER_FRAGMENT) + if (nir != zs->nir) ralloc_free(nir); /* TODO: determine if there's any reason to cache spirv output? */ _______________________________________________ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit