summaryrefslogtreecommitdiff
path: root/src/gallium/winsys/r600/drm
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2010-09-17 14:36:18 +1000
committerDave Airlie <airlied@redhat.com>2010-09-17 15:29:32 +1000
commit3ddc714b20ac4e28b80c6f88d1993445fff2262c (patch)
tree813c173b18eeb26b7697dd1c1d5da213cd930bfd /src/gallium/winsys/r600/drm
parent0d76bb5d4c5c867155f7fb381c46018e1560b790 (diff)
r600g: fixup map flushing.
long lived maps were getting removed when they shouldn't this tries to avoid that problem by only adding to the flush list on unmap.
Diffstat (limited to 'src/gallium/winsys/r600/drm')
-rw-r--r--src/gallium/winsys/r600/drm/radeon_bo_pb.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/src/gallium/winsys/r600/drm/radeon_bo_pb.c b/src/gallium/winsys/r600/drm/radeon_bo_pb.c
index df2c649ea8..6cc0f93033 100644
--- a/src/gallium/winsys/r600/drm/radeon_bo_pb.c
+++ b/src/gallium/winsys/r600/drm/radeon_bo_pb.c
@@ -39,8 +39,9 @@ static void radeon_bo_pb_destroy(struct pb_buffer *_buf)
{
struct radeon_bo_pb *buf = radeon_bo_pb(_buf);
+ LIST_DEL(&buf->maplist);
+
if (buf->bo->data != NULL) {
- LIST_DEL(&buf->maplist);
radeon_bo_unmap(buf->mgr->radeon, buf->bo);
}
radeon_bo_reference(buf->mgr->radeon, &buf->bo, NULL);
@@ -57,8 +58,10 @@ radeon_bo_pb_map_internal(struct pb_buffer *_buf,
if (p_atomic_read(&buf->bo->reference.count) > 1)
return NULL;
}
- if (buf->bo->data != NULL)
+ if (buf->bo->data != NULL) {
+ LIST_DELINIT(&buf->maplist);
return buf->bo->data;
+ }
if (flags & PB_USAGE_DONTBLOCK) {
uint32_t domain;
@@ -72,13 +75,14 @@ radeon_bo_pb_map_internal(struct pb_buffer *_buf,
if (radeon_bo_map(buf->mgr->radeon, buf->bo)) {
return NULL;
}
- LIST_ADDTAIL(&buf->maplist, &buf->mgr->buffer_map_list);
+ LIST_DELINIT(&buf->maplist);
return buf->bo->data;
}
static void radeon_bo_pb_unmap_internal(struct pb_buffer *_buf)
{
- (void)_buf;
+ struct radeon_bo_pb *buf = radeon_bo_pb(_buf);
+ LIST_ADDTAIL(&buf->maplist, &buf->mgr->buffer_map_list);
}
static void
@@ -218,7 +222,7 @@ void radeon_bo_pbmgr_flush_maps(struct pb_manager *_mgr)
LIST_FOR_EACH_ENTRY_SAFE(rpb, t_rpb, &mgr->buffer_map_list, maplist) {
radeon_bo_unmap(mgr->radeon, rpb->bo);
- LIST_DEL(&rpb->maplist);
+ LIST_DELINIT(&rpb->maplist);
}
LIST_INITHEAD(&mgr->buffer_map_list);