Mesa (master): zink: clone shader before lowering clip_halfz
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Fri Jan 22 20:12:32 UTC 2021
Module: Mesa
Branch: master
Commit: 92ec7b577c8cb47b308bba1d21b4c2ec05f35f9f
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=92ec7b577c8cb47b308bba1d21b4c2ec05f35f9f
Author: Erik Faye-Lund <erik.faye-lund at 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.blumenkrantz at 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? */
More information about the mesa-commit
mailing list