Mesa (master): r300g: fix map_buffer

Marek Olšák mareko at kemper.freedesktop.org
Mon Sep 13 05:54:00 UTC 2010


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

Author: Marek Olšák <maraeo at gmail.com>
Date:   Mon Sep 13 07:44:32 2010 +0200

r300g: fix map_buffer

https://bugs.freedesktop.org/show_bug.cgi?id=30145

---

 src/gallium/winsys/radeon/drm/radeon_drm_buffer.c |   21 +++++++++++++++++----
 1 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_buffer.c b/src/gallium/winsys/radeon/drm/radeon_drm_buffer.c
index cef5997..19f194b 100644
--- a/src/gallium/winsys/radeon/drm/radeon_drm_buffer.c
+++ b/src/gallium/winsys/radeon/drm/radeon_drm_buffer.c
@@ -20,9 +20,6 @@ struct radeon_drm_buffer {
 
     struct radeon_bo *bo;
 
-    /* The CS associated with the last buffer_map. */
-    struct radeon_libdrm_cs *cs;
-
     boolean flinked;
     uint32_t flink;
 
@@ -95,9 +92,21 @@ radeon_drm_buffer_map_internal(struct pb_buffer *_buf,
     struct radeon_libdrm_cs *cs = flush_ctx;
     int write = 0;
 
+    /* Note how we use radeon_bo_is_referenced_by_cs here. There are
+     * basically two places this map function can be called from:
+     * - pb_map
+     * - create_buffer (in the buffer reuse case)
+     *
+     * Since pb managers are per-winsys managers, not per-context managers,
+     * and we shouldn't reuse buffers if they are in-use in any context,
+     * we simply ask: is this buffer referenced by *any* CS?
+     *
+     * The problem with buffer_create is that it comes from pipe_screen,
+     * so we have no CS to look at, though luckily the following code
+     * is sufficient to tell whether the buffer is in use. */
     if (flags & PB_USAGE_DONTBLOCK) {
         if (_buf->base.usage & RADEON_PB_USAGE_VERTEX)
-            if (cs && radeon_bo_is_referenced_by_cs(buf->bo, cs->cs))
+            if (radeon_bo_is_referenced_by_cs(buf->bo, NULL))
 		return NULL;
     }
 
@@ -110,6 +119,10 @@ radeon_drm_buffer_map_internal(struct pb_buffer *_buf,
             return NULL;
     }
 
+    /* If we don't have any CS and the buffer is referenced,
+     * we cannot flush. */
+    assert(cs || !radeon_bo_is_referenced_by_cs(buf->bo, NULL));
+
     if (cs && radeon_bo_is_referenced_by_cs(buf->bo, cs->cs)) {
         cs->flush_cs(cs->flush_data);
     }




More information about the mesa-commit mailing list