summaryrefslogtreecommitdiff
path: root/src/gallium/winsys/dri/nouveau
diff options
context:
space:
mode:
authorBen Skeggs <skeggsb@gmail.com>2008-03-21 17:38:24 +1100
committerBen Skeggs <skeggsb@gmail.com>2008-03-21 17:38:24 +1100
commit5d2577e576635559da202d0d062601e404843b2c (patch)
tree31e185ac9716d37d1a03a23daec0f449a0ba5574 /src/gallium/winsys/dri/nouveau
parent95e8cad9a38181052790b34837daa6717e0c5171 (diff)
nouveau: try combining prev and next resources on free
Fixes some cases where we end up with a list of many unused chunks that are too small to be useful.
Diffstat (limited to 'src/gallium/winsys/dri/nouveau')
-rw-r--r--src/gallium/winsys/dri/nouveau/nouveau_resource.c29
1 files changed, 17 insertions, 12 deletions
diff --git a/src/gallium/winsys/dri/nouveau/nouveau_resource.c b/src/gallium/winsys/dri/nouveau/nouveau_resource.c
index 5d9d578b4f..3bbcb5c45e 100644
--- a/src/gallium/winsys/dri/nouveau/nouveau_resource.c
+++ b/src/gallium/winsys/dri/nouveau/nouveau_resource.c
@@ -88,6 +88,22 @@ nouveau_resource_free(struct nouveau_resource **res)
if (!res || !*res)
return;
r = *res;
+ *res = NULL;
+
+ r->in_use = 0;
+
+ if (r->next && !r->next->in_use) {
+ struct nouveau_resource *new = r->next;
+
+ new->prev = r->prev;
+ if (r->prev)
+ r->prev->next = new;
+ new->size += r->size;
+ new->start = r->start;
+
+ free(r);
+ r = new;
+ }
if (r->prev && !r->prev->in_use) {
r->prev->next = r->next;
@@ -95,17 +111,6 @@ nouveau_resource_free(struct nouveau_resource **res)
r->next->prev = r->prev;
r->prev->size += r->size;
free(r);
- } else
- if (r->next && !r->next->in_use) {
- r->next->prev = r->prev;
- if (r->prev)
- r->prev->next = r->next;
- r->next->size += r->size;
- r->next->start = r->start;
- free(r);
- } else {
- r->in_use = 0;
}
-
- *res = NULL;
+
}