Blame SOURCES/0001-llvmpipe-make-last_fence-a-screen-rast-object-not-a-.patch

17363c
From 64e7c42f1b68250d2280320e01da2f5a0c4b07eb Mon Sep 17 00:00:00 2001
17363c
From: Dave Airlie <airlied@redhat.com>
17363c
Date: Fri, 22 Jul 2022 11:12:58 +1000
17363c
Subject: [PATCH 1/2] llvmpipe: make last_fence a screen/rast object not a
17363c
 context one.
17363c
17363c
When a flush happens the per-context setup is used to hold the fence
17363c
for the last scene sent to the rasterizer. However when multiple
17363c
contexts are in use, this fence won't get returned to be blocked on.
17363c
17363c
Instead move the last fence to the rasterizer object, and return
17363c
that instead as it should be valid across contexts.
17363c
17363c
Fixes gtk4 bugs on llvmpipe since overlapping vertex/fragment.
17363c
17363c
Fixes: 6bbbe15a783a ("Reinstate: llvmpipe: allow vertex processing and fragment processing in parallel")
17363c
Acked-by: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
17363c
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17702>
17363c
---
17363c
 src/gallium/drivers/llvmpipe/lp_flush.c       | 12 ++++++---
17363c
 src/gallium/drivers/llvmpipe/lp_rast.c        | 14 +++++++++-
17363c
 src/gallium/drivers/llvmpipe/lp_rast.h        |  3 ++-
17363c
 src/gallium/drivers/llvmpipe/lp_rast_priv.h   |  2 ++
17363c
 src/gallium/drivers/llvmpipe/lp_setup.c       | 26 +++++--------------
17363c
 src/gallium/drivers/llvmpipe/lp_setup.h       |  1 -
17363c
 .../drivers/llvmpipe/lp_setup_context.h       |  1 -
17363c
 7 files changed, 33 insertions(+), 26 deletions(-)
17363c
17363c
diff --git a/src/gallium/drivers/llvmpipe/lp_flush.c b/src/gallium/drivers/llvmpipe/lp_flush.c
17363c
index c231f334eaf..c72944232e7 100644
17363c
--- a/src/gallium/drivers/llvmpipe/lp_flush.c
17363c
+++ b/src/gallium/drivers/llvmpipe/lp_flush.c
17363c
@@ -38,7 +38,9 @@
17363c
 #include "lp_flush.h"
17363c
 #include "lp_context.h"
17363c
 #include "lp_setup.h"
17363c
-
17363c
+#include "lp_fence.h"
17363c
+#include "lp_screen.h"
17363c
+#include "lp_rast.h"
17363c
 
17363c
 /**
17363c
  * \param fence  if non-null, returns pointer to a fence which can be waited on
17363c
@@ -49,11 +51,15 @@ llvmpipe_flush( struct pipe_context *pipe,
17363c
                 const char *reason)
17363c
 {
17363c
    struct llvmpipe_context *llvmpipe = llvmpipe_context(pipe);
17363c
-
17363c
+   struct llvmpipe_screen *screen = llvmpipe_screen(pipe->screen);
17363c
    draw_flush(llvmpipe->draw);
17363c
 
17363c
    /* ask the setup module to flush */
17363c
-   lp_setup_flush(llvmpipe->setup, fence, reason);
17363c
+   lp_setup_flush(llvmpipe->setup, reason);
17363c
+
17363c
+   lp_rast_fence(screen->rast, (struct lp_fence **)fence);
17363c
+   if (fence && (!*fence))
17363c
+      *fence = (struct pipe_fence_handle *)lp_fence_create(0);
17363c
 
17363c
    /* Enable to dump BMPs of the color/depth buffers each frame */
17363c
    if (0) {
17363c
diff --git a/src/gallium/drivers/llvmpipe/lp_rast.c b/src/gallium/drivers/llvmpipe/lp_rast.c
17363c
index e27d78a3432..6cdaa51b62d 100644
17363c
--- a/src/gallium/drivers/llvmpipe/lp_rast.c
17363c
+++ b/src/gallium/drivers/llvmpipe/lp_rast.c
17363c
@@ -47,6 +47,7 @@
17363c
 #include "gallivm/lp_bld_format.h"
17363c
 #include "gallivm/lp_bld_debug.h"
17363c
 #include "lp_scene.h"
17363c
+#include "lp_screen.h"
17363c
 #include "lp_tex_sample.h"
17363c
 
17363c
 
17363c
@@ -1128,6 +1129,10 @@ lp_rast_queue_scene( struct lp_rasterizer *rast,
17363c
 {
17363c
    LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
17363c
 
17363c
+   lp_fence_reference(&rast->last_fence, scene->fence);
17363c
+   if (rast->last_fence)
17363c
+      rast->last_fence->issued = TRUE;
17363c
+
17363c
    if (rast->num_threads == 0) {
17363c
       /* no threading */
17363c
       unsigned fpstate = util_fpstate_get();
17363c
@@ -1384,6 +1389,8 @@ void lp_rast_destroy( struct lp_rasterizer *rast )
17363c
       align_free(rast->tasks[i].thread_data.cache);
17363c
    }
17363c
 
17363c
+   lp_fence_reference(&rast->last_fence, NULL);
17363c
+
17363c
    /* for synchronizing rasterization threads */
17363c
    if (rast->num_threads > 0) {
17363c
       util_barrier_destroy( &rast->barrier );
17363c
@@ -1394,4 +1401,9 @@ void lp_rast_destroy( struct lp_rasterizer *rast )
17363c
    FREE(rast);
17363c
 }
17363c
 
17363c
-
17363c
+void lp_rast_fence(struct lp_rasterizer *rast,
17363c
+                   struct lp_fence **fence)
17363c
+{
17363c
+   if (fence)
17363c
+      lp_fence_reference((struct lp_fence **)fence, rast->last_fence);
17363c
+}
17363c
diff --git a/src/gallium/drivers/llvmpipe/lp_rast.h b/src/gallium/drivers/llvmpipe/lp_rast.h
17363c
index 14a2710f7f5..1756345737f 100644
17363c
--- a/src/gallium/drivers/llvmpipe/lp_rast.h
17363c
+++ b/src/gallium/drivers/llvmpipe/lp_rast.h
17363c
@@ -388,5 +388,6 @@ lp_debug_draw_bins_by_cmd_length( struct lp_scene *scene );
17363c
 void
17363c
 lp_debug_draw_bins_by_coverage( struct lp_scene *scene );
17363c
 
17363c
-
17363c
+void lp_rast_fence(struct lp_rasterizer *rast,
17363c
+                   struct lp_fence **fence);
17363c
 #endif
17363c
diff --git a/src/gallium/drivers/llvmpipe/lp_rast_priv.h b/src/gallium/drivers/llvmpipe/lp_rast_priv.h
17363c
index c4da9cca2ff..8b28893aa22 100644
17363c
--- a/src/gallium/drivers/llvmpipe/lp_rast_priv.h
17363c
+++ b/src/gallium/drivers/llvmpipe/lp_rast_priv.h
17363c
@@ -129,6 +129,8 @@ struct lp_rasterizer
17363c
 
17363c
    /** For synchronizing the rasterization threads */
17363c
    util_barrier barrier;
17363c
+
17363c
+   struct lp_fence *last_fence;
17363c
 };
17363c
 
17363c
 void
17363c
diff --git a/src/gallium/drivers/llvmpipe/lp_setup.c b/src/gallium/drivers/llvmpipe/lp_setup.c
17363c
index ce681792683..ad92e2557c2 100644
17363c
--- a/src/gallium/drivers/llvmpipe/lp_setup.c
17363c
+++ b/src/gallium/drivers/llvmpipe/lp_setup.c
17363c
@@ -207,11 +207,6 @@ lp_setup_rasterize_scene( struct lp_setup_context *setup )
17363c
 
17363c
    lp_scene_end_binning(scene);
17363c
 
17363c
-   lp_fence_reference(&setup->last_fence, scene->fence);
17363c
-
17363c
-   if (setup->last_fence)
17363c
-      setup->last_fence->issued = TRUE;
17363c
-
17363c
    mtx_lock(&screen->rast_mutex);
17363c
    lp_rast_queue_scene(screen->rast, scene);
17363c
    mtx_unlock(&screen->rast_mutex);
17363c
@@ -387,17 +382,10 @@ fail:
17363c
 
17363c
 
17363c
 void
17363c
-lp_setup_flush( struct lp_setup_context *setup,
17363c
-                struct pipe_fence_handle **fence,
17363c
-                const char *reason)
17363c
+lp_setup_flush(struct lp_setup_context *setup,
17363c
+               const char *reason)
17363c
 {
17363c
-   set_scene_state( setup, SETUP_FLUSHED, reason );
17363c
-
17363c
-   if (fence) {
17363c
-      lp_fence_reference((struct lp_fence **)fence, setup->last_fence);
17363c
-      if (!*fence)
17363c
-         *fence = (struct pipe_fence_handle *)lp_fence_create(0);
17363c
-   }
17363c
+   set_scene_state(setup, SETUP_FLUSHED, reason);
17363c
 }
17363c
 
17363c
 
17363c
@@ -571,7 +559,7 @@ lp_setup_clear( struct lp_setup_context *setup,
17363c
    if (flags & PIPE_CLEAR_DEPTHSTENCIL) {
17363c
       unsigned flagszs = flags & PIPE_CLEAR_DEPTHSTENCIL;
17363c
       if (!lp_setup_try_clear_zs(setup, depth, stencil, flagszs)) {
17363c
-         lp_setup_flush(setup, NULL, __FUNCTION__);
17363c
+         set_scene_state( setup, SETUP_FLUSHED, __FUNCTION__ );
17363c
 
17363c
          if (!lp_setup_try_clear_zs(setup, depth, stencil, flagszs))
17363c
             assert(0);
17363c
@@ -583,7 +571,7 @@ lp_setup_clear( struct lp_setup_context *setup,
17363c
       for (i = 0; i < setup->fb.nr_cbufs; i++) {
17363c
          if ((flags & (1 << (2 + i))) && setup->fb.cbufs[i]) {
17363c
             if (!lp_setup_try_clear_color_buffer(setup, color, i)) {
17363c
-               lp_setup_flush(setup, NULL, __FUNCTION__);
17363c
+               set_scene_state( setup, SETUP_FLUSHED, __FUNCTION__ );
17363c
 
17363c
                if (!lp_setup_try_clear_color_buffer(setup, color, i))
17363c
                   assert(0);
17363c
@@ -1589,7 +1577,6 @@ lp_setup_destroy( struct lp_setup_context *setup )
17363c
 
17363c
    LP_DBG(DEBUG_SETUP, "number of scenes used: %d\n", setup->num_active_scenes);
17363c
    slab_destroy(&setup->scene_slab);
17363c
-   lp_fence_reference(&setup->last_fence, NULL);
17363c
 
17363c
    FREE( setup );
17363c
 }
17363c
@@ -1758,7 +1745,8 @@ lp_setup_end_query(struct lp_setup_context *setup, struct llvmpipe_query *pq)
17363c
       }
17363c
    }
17363c
    else {
17363c
-      lp_fence_reference(&pq->fence, setup->last_fence);
17363c
+      struct llvmpipe_screen *screen = llvmpipe_screen(setup->pipe->screen);
17363c
+      lp_rast_fence(screen->rast, &pq->fence);
17363c
    }
17363c
 
17363c
 fail:
17363c
diff --git a/src/gallium/drivers/llvmpipe/lp_setup.h b/src/gallium/drivers/llvmpipe/lp_setup.h
17363c
index 5ecef123417..fe360be63ca 100644
17363c
--- a/src/gallium/drivers/llvmpipe/lp_setup.h
17363c
+++ b/src/gallium/drivers/llvmpipe/lp_setup.h
17363c
@@ -64,7 +64,6 @@ lp_setup_clear(struct lp_setup_context *setup,
17363c
 
17363c
 void
17363c
 lp_setup_flush( struct lp_setup_context *setup,
17363c
-                struct pipe_fence_handle **fence,
17363c
                 const char *reason);
17363c
 
17363c
 
17363c
diff --git a/src/gallium/drivers/llvmpipe/lp_setup_context.h b/src/gallium/drivers/llvmpipe/lp_setup_context.h
17363c
index 420b78e2f52..fac84fb56ec 100644
17363c
--- a/src/gallium/drivers/llvmpipe/lp_setup_context.h
17363c
+++ b/src/gallium/drivers/llvmpipe/lp_setup_context.h
17363c
@@ -96,7 +96,6 @@ struct lp_setup_context
17363c
    struct lp_scene *scenes[MAX_SCENES];  /**< all the scenes */
17363c
    struct lp_scene *scene;               /**< current scene being built */
17363c
 
17363c
-   struct lp_fence *last_fence;
17363c
    struct llvmpipe_query *active_queries[LP_MAX_ACTIVE_BINNED_QUERIES];
17363c
    unsigned active_binned_queries;
17363c
 
17363c
-- 
17363c
2.37.1
17363c