From eb9ec4baa7e2f8fb8461564728a38d031ed816bd Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Fri, 12 Aug 2022 11:23:22 -0400 Subject: [PATCH] zink: add precompilation for compute shaders for compute shaders that don't need spec constants or cube lowering, precompiles are possible and can be performed immediately after disk cache lookup completes Reviewed-by: Dave Airlie Part-of: --- src/gallium/drivers/zink/zink_program.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/zink/zink_program.c b/src/gallium/drivers/zink/zink_program.c index 74285a9167e..89575e5a2cc 100644 --- a/src/gallium/drivers/zink/zink_program.c +++ b/src/gallium/drivers/zink/zink_program.c @@ -732,6 +732,15 @@ equals_compute_pipeline_state_local_size(const void *a, const void *b) sa->module == sb->module; } +static void +precompile_compute(struct zink_compute_program *comp, struct zink_screen *screen) +{ + zink_screen_get_pipeline_cache(screen, &comp->base, true); + comp->base_pipeline = zink_create_compute_pipeline(screen, comp, NULL); + if (comp->base_pipeline) + zink_screen_update_pipeline_cache(screen, &comp->base, true); +} + static struct zink_compute_program * create_compute_program(struct zink_context *ctx, nir_shader *nir) { @@ -761,7 +770,11 @@ create_compute_program(struct zink_context *ctx, nir_shader *nir) if (!zink_descriptor_program_init(ctx, &comp->base)) goto fail; - zink_screen_get_pipeline_cache(screen, &comp->base, false); + if (comp->use_local_size || (!screen->info.have_EXT_non_seamless_cube_map && comp->shader->has_cubes)) { + zink_screen_get_pipeline_cache(screen, &comp->base, false); + } else { + precompile_compute(comp, screen); + } return comp; fail: