From ae1aa1496561ef0faf0524c4b95d21d63e12a9ee Mon Sep 17 00:00:00 2001 From: Marek Olšák Date: Mon, 13 Sep 2010 07:44:32 +0200 Subject: r300g: fix map_buffer https://bugs.freedesktop.org/show_bug.cgi?id=30145 --- src/gallium/winsys/radeon/drm/radeon_drm_buffer.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_buffer.c b/src/gallium/winsys/radeon/drm/radeon_drm_buffer.c index cef59975ca8..19f194b36cb 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); } -- cgit v1.2.3