From a6de15eff5630e60122ebea6b5318009e1bbaffa Mon Sep 17 00:00:00 2001 From: antonino Date: Tue, 21 Feb 2023 10:29:25 +0100 Subject: [PATCH] zink: add flags to `zink_gfx_program` and `zink_context` Adds `optimal_keys` and `needs_inlining` to `zink_gfx_program` and `is_generated_gs_bound` to `zink_context` Those will be needed for shaders that rely on some uniforms to be inlined Reviewed-by: Mike Blumenkrantz Reviewed-by: Erik Faye-Lund Part-of: --- src/gallium/drivers/zink/zink_program.c | 7 ++++++- src/gallium/drivers/zink/zink_types.h | 3 +++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/zink/zink_program.c b/src/gallium/drivers/zink/zink_program.c index 0e6f88facd0..3dc6e6254c6 100644 --- a/src/gallium/drivers/zink/zink_program.c +++ b/src/gallium/drivers/zink/zink_program.c @@ -384,6 +384,7 @@ update_gfx_shader_modules(struct zink_context *ctx, state->modules[i] = zm->shader; if (prog->modules[i] == zm->shader) continue; + prog->optimal_keys &= !prog->shaders[i]->non_fs.is_generated; variant_hash ^= prog->module_hash[i]; hash_changed = true; default_variants &= zm->default_variant; @@ -565,7 +566,7 @@ ALWAYS_INLINE static void update_gfx_program_nonseamless(struct zink_context *ctx, struct zink_gfx_program *prog, bool has_nonseamless) { struct zink_screen *screen = zink_screen(ctx->base.screen); - if (screen->driconf.inline_uniforms) + if (screen->driconf.inline_uniforms || prog->needs_inlining) update_gfx_shader_modules(ctx, screen, prog, ctx->dirty_gfx_stages & prog->stages_present, &ctx->gfx_pipeline_state, true, has_nonseamless); @@ -1034,6 +1035,7 @@ zink_create_gfx_program(struct zink_context *ctx, prog->ctx = ctx; prog->gfx_hash = gfx_hash; prog->base.removed = true; + prog->optimal_keys = screen->optimal_keys; prog->has_edgeflags = prog->shaders[MESA_SHADER_VERTEX] && prog->shaders[MESA_SHADER_VERTEX]->has_edgeflags; @@ -1045,6 +1047,7 @@ zink_create_gfx_program(struct zink_context *ctx, if (stages[i]) { prog->shaders[i] = stages[i]; prog->stages_present |= BITFIELD_BIT(i); + prog->optimal_keys &= !prog->shaders[i]->non_fs.is_generated; } } if (stages[MESA_SHADER_TESS_EVAL] && !stages[MESA_SHADER_TESS_CTRL]) { @@ -2297,6 +2300,7 @@ zink_set_primitive_emulation_keys(struct zink_context *ctx) bind_gfx_stage(ctx, MESA_SHADER_GEOMETRY, ctx->gfx_stages[prev_vertex_stage]->non_fs.generated_gs[ctx->gfx_pipeline_state.gfx_prim_mode][zink_prim_type]); + ctx->is_generated_gs_bound = true; } } else if (ctx->gfx_stages[MESA_SHADER_GEOMETRY] && ctx->gfx_stages[MESA_SHADER_GEOMETRY]->non_fs.is_generated) @@ -2349,6 +2353,7 @@ zink_create_primitive_emulation_gs(struct zink_context *ctx) bind_gfx_stage(ctx, MESA_SHADER_GEOMETRY, ctx->gfx_stages[prev_vertex_stage]->non_fs.generated_gs[ctx->gfx_pipeline_state.gfx_prim_mode][zink_prim_type]); + ctx->is_generated_gs_bound = true; } } else if (ctx->gfx_stages[MESA_SHADER_GEOMETRY] && ctx->gfx_stages[MESA_SHADER_GEOMETRY]->non_fs.is_generated) diff --git a/src/gallium/drivers/zink/zink_types.h b/src/gallium/drivers/zink/zink_types.h index fc317449864..e45d5e2b8d8 100644 --- a/src/gallium/drivers/zink/zink_types.h +++ b/src/gallium/drivers/zink/zink_types.h @@ -1030,7 +1030,9 @@ struct zink_gfx_program { unsigned inlined_variant_count[ZINK_GFX_SHADER_COUNT]; uint32_t default_variant_hash; uint8_t inline_variants; //which stages are using inlined uniforms + bool needs_inlining; // whether this program requires some uniforms to be inlined bool has_edgeflags; + bool optimal_keys; /* separable */ struct zink_gfx_program *full_prog; @@ -1708,6 +1710,7 @@ struct zink_context { uint8_t dirty_gfx_stages; /* mask of changed gfx shader stages */ bool last_vertex_stage_dirty; bool compute_dirty; + bool is_generated_gs_bound; struct { VkRenderingAttachmentInfo attachments[PIPE_MAX_COLOR_BUFS + 2]; //+depth, +stencil