diff options
author | Dave Airlie <airlied@redhat.com> | 2010-09-17 14:36:18 +1000 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2010-09-17 15:29:32 +1000 |
commit | 3ddc714b20ac4e28b80c6f88d1993445fff2262c (patch) | |
tree | 813c173b18eeb26b7697dd1c1d5da213cd930bfd | |
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.
-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 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); |