From fe095fcdcd99fb05f1e2f726c77d26699fdb0c35 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Fri, 31 Mar 2023 17:21:39 -0400 Subject: [PATCH] zink: switch to a regular loop to wait on precompile shader fences even if these aren't done yet, it'll still be faster to wait than to start compiling new pipelines now Part-of: --- src/gallium/drivers/zink/zink_program.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/gallium/drivers/zink/zink_program.c b/src/gallium/drivers/zink/zink_program.c index 7de91a7..ffdb0ce 100644 --- a/src/gallium/drivers/zink/zink_program.c +++ b/src/gallium/drivers/zink/zink_program.c @@ -1129,16 +1129,24 @@ create_gfx_program_separable(struct zink_context *ctx, struct zink_shader **stag { struct zink_screen *screen = zink_screen(ctx->base.screen); unsigned shader_stages = BITFIELD_BIT(MESA_SHADER_VERTEX) | BITFIELD_BIT(MESA_SHADER_FRAGMENT); + bool is_separate = true; + for (unsigned i = 0; i < ZINK_GFX_SHADER_COUNT; i++) + is_separate &= !stages[i] || stages[i]->info.separate_shader; /* filter cases that need real pipelines */ if (ctx->shader_stages != shader_stages || - !stages[MESA_SHADER_VERTEX]->precompile.obj.mod || !stages[MESA_SHADER_FRAGMENT]->precompile.obj.mod || + !is_separate || /* TODO: maybe try variants? grimace */ !ZINK_SHADER_KEY_OPTIMAL_IS_DEFAULT(ctx->gfx_pipeline_state.optimal_key) || !zink_can_use_pipeline_libs(ctx)) return zink_create_gfx_program(ctx, stages, vertices_per_patch, ctx->gfx_hash); - /* ensure async gpl creation is done */ - util_queue_fence_wait(&stages[MESA_SHADER_VERTEX]->precompile.fence); - util_queue_fence_wait(&stages[MESA_SHADER_FRAGMENT]->precompile.fence); + for (unsigned i = 0; i < ZINK_GFX_SHADER_COUNT; i++) { + /* ensure async shader creation is done */ + if (stages[i]) { + util_queue_fence_wait(&stages[i]->precompile.fence); + if (!stages[i]->precompile.obj.mod) + return zink_create_gfx_program(ctx, stages, vertices_per_patch, ctx->gfx_hash); + } + } struct zink_gfx_program *prog = create_program(ctx, false); if (!prog) -- 2.7.4