Module: Mesa
Branch: main
Commit: fe095fcdcd99fb05f1e2f726c77d26699fdb0c35
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=fe095fcdcd99fb05f1e2f726c77d26699fdb0c35

Author: Mike Blumenkrantz <[email protected]>
Date:   Fri Mar 31 17:21:39 2023 -0400

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: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22671>

---

 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 7de91a755ec..ffdb0cec510 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)

Reply via email to