Module: Mesa Branch: master Commit: 26b009b054bdd66b831a5df05c102ade7e36594c URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=26b009b054bdd66b831a5df05c102ade7e36594c
Author: Mike Blumenkrantz <[email protected]> Date: Sat Jan 23 10:42:48 2021 -0500 zink: move tess/geom shader info to vs shader key now that there exists a shader key for vertex stages, we can stop modifying the zink_shader values and instead use this as a more reliable method of detecting the state Reviewed-by: Erik Faye-Lund <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8682> --- src/gallium/drivers/zink/zink_compiler.c | 17 +++-------------- src/gallium/drivers/zink/zink_compiler.h | 2 -- src/gallium/drivers/zink/zink_program.c | 16 +++++++++++++--- src/gallium/drivers/zink/zink_shader_keys.h | 1 + 4 files changed, 17 insertions(+), 19 deletions(-) diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c index 69d611522eb..df47c6c0742 100644 --- a/src/gallium/drivers/zink/zink_compiler.c +++ b/src/gallium/drivers/zink/zink_compiler.c @@ -314,17 +314,6 @@ 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) @@ -333,8 +322,8 @@ 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->nir->info.stage != MESA_SHADER_FRAGMENT) { - if (last_vertex_stage(zs)) { + if (zs->nir->info.stage < MESA_SHADER_FRAGMENT) { + if (zink_vs_key(key)->last_vertex_stage) { if (zs->streamout.so_info_slots) streamout = &zs->streamout; @@ -343,7 +332,7 @@ zink_shader_compile(struct zink_screen *screen, struct zink_shader *zs, struct z NIR_PASS_V(nir, nir_lower_clip_halfz); } } - } else { + } else if (zs->nir->info.stage == MESA_SHADER_FRAGMENT) { if (!zink_fs_key(key)->samples && nir->info.outputs_written & BITFIELD64_BIT(FRAG_RESULT_SAMPLE_MASK)) { nir = nir_shader_clone(NULL, zs->nir); diff --git a/src/gallium/drivers/zink/zink_compiler.h b/src/gallium/drivers/zink/zink_compiler.h index 66f02aba476..80629cafbcf 100644 --- a/src/gallium/drivers/zink/zink_compiler.h +++ b/src/gallium/drivers/zink/zink_compiler.h @@ -73,8 +73,6 @@ struct zink_shader { size_t num_bindings; struct set *programs; - bool has_tess_shader; // vertex shaders need to know if a tesseval shader exists - bool has_geometry_shader; // vertex shaders need to know if a geometry shader exists union { struct zink_shader *generated; // a generated shader that this shader "owns" bool is_generated; // if this is a driver-created shader (e.g., tcs) diff --git a/src/gallium/drivers/zink/zink_program.c b/src/gallium/drivers/zink/zink_program.c index 85ded82b0f0..57a6ddbba41 100644 --- a/src/gallium/drivers/zink/zink_program.c +++ b/src/gallium/drivers/zink/zink_program.c @@ -168,7 +168,6 @@ create_pipeline_layout(VkDevice dev, VkDescriptorSetLayout dsl) return layout; } - static void shader_key_vs_gen(struct zink_context *ctx, struct zink_shader *zs, struct zink_shader *shaders[ZINK_SHADER_COUNT], struct zink_shader_key *key) @@ -178,6 +177,19 @@ shader_key_vs_gen(struct zink_context *ctx, struct zink_shader *zs, vs_key->shader_id = zs->shader_id; vs_key->clip_halfz = ctx->rast_state->base.clip_halfz; + switch (zs->nir->info.stage) { + case MESA_SHADER_VERTEX: + vs_key->last_vertex_stage = !shaders[PIPE_SHADER_TESS_EVAL] && !shaders[PIPE_SHADER_GEOMETRY]; + break; + case MESA_SHADER_TESS_EVAL: + vs_key->last_vertex_stage = !shaders[PIPE_SHADER_GEOMETRY]; + break; + case MESA_SHADER_GEOMETRY: + vs_key->last_vertex_stage = true; + break; + default: + unreachable("impossible case"); + } } static void @@ -332,8 +344,6 @@ update_shader_modules(struct zink_context *ctx, struct zink_shader *stages[ZINK_ enum pipe_shader_type type = pipe_shader_type_from_mesa(i); if (dirty[i]) { struct zink_shader_module *zm; - dirty[i]->has_geometry_shader = dirty[MESA_SHADER_GEOMETRY] || stages[PIPE_SHADER_GEOMETRY]; - dirty[i]->has_tess_shader = dirty[MESA_SHADER_TESS_EVAL] || stages[PIPE_SHADER_TESS_EVAL]; zm = get_shader_module_for_stage(ctx, dirty[i], prog); zink_shader_module_reference(zink_screen(ctx->base.screen), &prog->modules[type], zm); /* we probably need a new pipeline when we switch shader modules */ diff --git a/src/gallium/drivers/zink/zink_shader_keys.h b/src/gallium/drivers/zink/zink_shader_keys.h index 873a0e815e7..84bb7a40fd5 100644 --- a/src/gallium/drivers/zink/zink_shader_keys.h +++ b/src/gallium/drivers/zink/zink_shader_keys.h @@ -29,6 +29,7 @@ struct zink_vs_key { unsigned shader_id; bool clip_halfz; + bool last_vertex_stage; }; struct zink_fs_key { _______________________________________________ mesa-commit mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-commit
