zink: add flags to `zink_gfx_program` and `zink_context`
authorantonino <antonino.maniscalco@collabora.com>
Tue, 21 Feb 2023 09:29:25 +0000 (10:29 +0100)
committerMarge Bot <emma+marge@anholt.net>
Wed, 29 Mar 2023 19:18:40 +0000 (19:18 +0000)
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 <michael.blumenkrantz@gmail.com>
Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21238>

src/gallium/drivers/zink/zink_program.c
src/gallium/drivers/zink/zink_types.h

index 0e6f88f..3dc6e62 100644 (file)
@@ -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)
index fc31744..e45d5e2 100644 (file)
@@ -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