nvc0: tie buffer memory release to the buffer fence
authorChristoph Bumiller <e0425955@student.tuwien.ac.at>
Wed, 5 Jan 2011 00:41:49 +0000 (01:41 +0100)
committerChristoph Bumiller <e0425955@student.tuwien.ac.at>
Sat, 8 Jan 2011 01:12:20 +0000 (02:12 +0100)
... instead of the next fence to be emitted. This way we have a
chance to reclaim the storage earlier.

src/gallium/drivers/nvc0/nvc0_buffer.c

index 8021e4348b2556811d6399ff3ba21d24a7b58b14..0c19c526e0a3568b3843bb2327b7e5d686a4274b 100644 (file)
@@ -51,8 +51,12 @@ nvc0_buffer_allocate(struct nvc0_screen *screen, struct nvc0_resource *buf,
 static INLINE void
 release_allocation(struct nvc0_mm_allocation **mm, struct nvc0_fence *fence)
 {
-   (*mm)->next = fence->buffers;
-   fence->buffers = (*mm);
+   if (fence && fence->state != NVC0_FENCE_STATE_SIGNALLED) {
+      (*mm)->next = fence->buffers;
+      fence->buffers = (*mm);
+   } else {
+      nvc0_mm_free(*mm);
+   }
    (*mm) = NULL;
 }
 
@@ -60,13 +64,12 @@ static void
 nvc0_buffer_destroy(struct pipe_screen *pscreen,
                     struct pipe_resource *presource)
 {
-   struct nvc0_screen *screen = nvc0_screen(pscreen);
    struct nvc0_resource *res = nvc0_resource(presource);
 
    nouveau_bo_ref(NULL, &res->bo);
 
    if (res->mm)
-      release_allocation(&res->mm, screen->fence.current);
+      release_allocation(&res->mm, res->fence);
 
    if (res->data && !(res->status & NVC0_BUFFER_STATUS_USER_MEMORY))
       FREE(res->data);