[Mesa-dev] [PATCH] RFC: llvmpipe map scene buffers outside thread.

Dave Airlie airlied at gmail.com
Sun Nov 8 19:58:32 PST 2015


From: Dave Airlie <airlied at redhat.com>

There might be a reason we do this inside the thread, but I'm not aware of it
yet, move stuff around and see if this jogs anyone's memory.

Doing this outside the thread at least with front buffer rendering avoids
problems with XGetImage failing in the thread and deadlocking, now things
crash, which is a lot nicer from a piglit point of view.
---
 src/gallium/drivers/llvmpipe/lp_scene.c | 21 ++++++++++++++++-----
 src/gallium/drivers/llvmpipe/lp_scene.h |  5 +++--
 src/gallium/drivers/llvmpipe/lp_setup.c |  1 +
 3 files changed, 20 insertions(+), 7 deletions(-)

diff --git a/src/gallium/drivers/llvmpipe/lp_scene.c b/src/gallium/drivers/llvmpipe/lp_scene.c
index 2441b3c..1a6fe5c 100644
--- a/src/gallium/drivers/llvmpipe/lp_scene.c
+++ b/src/gallium/drivers/llvmpipe/lp_scene.c
@@ -147,7 +147,7 @@ lp_scene_bin_reset(struct lp_scene *scene, unsigned x, unsigned y)
 
 
 void
-lp_scene_begin_rasterization(struct lp_scene *scene)
+lp_scene_map_buffers(struct lp_scene *scene)
 {
    const struct pipe_framebuffer_state *fb = &scene->fb;
    int i;
@@ -200,16 +200,20 @@ lp_scene_begin_rasterization(struct lp_scene *scene)
    }
 }
 
-
+void
+lp_scene_begin_rasterization(struct lp_scene *scene)
+{
+   scene->started = true;
+}
 
 
 /**
  * Free all the temporary data in a scene.
  */
-void
-lp_scene_end_rasterization(struct lp_scene *scene )
+static void
+lp_scene_unmap_buffers(struct lp_scene *scene )
 {
-   int i, j;
+   int i;
 
    /* Unmap color buffers */
    for (i = 0; i < scene->fb.nr_cbufs; i++) {
@@ -232,7 +236,14 @@ lp_scene_end_rasterization(struct lp_scene *scene )
                               zsbuf->u.tex.first_layer);
       scene->zsbuf.map = NULL;
    }
+}
 
+void
+lp_scene_end_rasterization(struct lp_scene *scene )
+{
+   int i, j;
+   lp_scene_unmap_buffers(scene);
+   scene->started = false;
    /* Reset all command lists:
     */
    for (i = 0; i < scene->tiles_x; i++) {
diff --git a/src/gallium/drivers/llvmpipe/lp_scene.h b/src/gallium/drivers/llvmpipe/lp_scene.h
index b1464bb..7ed38c9 100644
--- a/src/gallium/drivers/llvmpipe/lp_scene.h
+++ b/src/gallium/drivers/llvmpipe/lp_scene.h
@@ -178,6 +178,7 @@ struct lp_scene {
 
    struct cmd_bin tile[TILES_X][TILES_Y];
    struct data_block_list data;
+   boolean started;
 };
 
 
@@ -405,8 +406,8 @@ lp_scene_begin_rasterization(struct lp_scene *scene);
 void
 lp_scene_end_rasterization(struct lp_scene *scene );
 
-
-
+void
+lp_scene_map_buffers(struct lp_scene *scene);
 
 
 #endif /* LP_BIN_H */
diff --git a/src/gallium/drivers/llvmpipe/lp_setup.c b/src/gallium/drivers/llvmpipe/lp_setup.c
index 1778b13..df2c323 100644
--- a/src/gallium/drivers/llvmpipe/lp_setup.c
+++ b/src/gallium/drivers/llvmpipe/lp_setup.c
@@ -176,6 +176,7 @@ lp_setup_rasterize_scene( struct lp_setup_context *setup )
     * Certainly, lp_scene_end_rasterization() would need to be deferred too
     * and there's probably other bits why this doesn't actually work.
     */
+   lp_scene_map_buffers(scene);
    lp_rast_queue_scene(screen->rast, scene);
    lp_rast_finish(screen->rast);
    pipe_mutex_unlock(screen->rast_mutex);
-- 
2.5.0



More information about the mesa-dev mailing list