diff options
author | Dave Airlie <[email protected]> | 2010-09-17 14:36:18 +1000 |
---|---|---|
committer | Dave Airlie <[email protected]> | 2010-09-17 15:29:32 +1000 |
commit | 3ddc714b20ac4e28b80c6f88d1993445fff2262c (patch) | |
tree | 813c173b18eeb26b7697dd1c1d5da213cd930bfd /src/gallium/winsys | |
parent | 0d76bb5d4c5c867155f7fb381c46018e1560b790 (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')
-rw-r--r-- | src/gallium/winsys/r600/drm/radeon_bo_pb.c | 14 |
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 df2c649ea84..6cc0f930335 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); |