r600g: fixup map flushing.
authorDave Airlie <airlied@redhat.com>
Fri, 17 Sep 2010 04:36:18 +0000 (14:36 +1000)
committerDave Airlie <airlied@redhat.com>
Fri, 17 Sep 2010 05:29:32 +0000 (15:29 +1000)
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.

src/gallium/winsys/r600/drm/radeon_bo_pb.c

index df2c649ea847233ffe5d1615c0f674c3f13b14ca..6cc0f930335969c0cec81e5a111d3e7cf2ec9978 100644 (file)
@@ -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);