nouveau: remove fence_del(), _ref() can be used for the same purpose.
authorBen Skeggs <skeggsb@gmail.com>
Wed, 26 Dec 2007 19:02:01 +0000 (06:02 +1100)
committerBen Skeggs <skeggsb@gmail.com>
Wed, 26 Dec 2007 19:02:01 +0000 (06:02 +1100)
src/mesa/drivers/dri/nouveau_winsys/nouveau_bo.c
src/mesa/drivers/dri/nouveau_winsys/nouveau_drmif.h
src/mesa/drivers/dri/nouveau_winsys/nouveau_fence.c
src/mesa/drivers/dri/nouveau_winsys/nouveau_pushbuf.c

index 09e66d1bdcd2235d8b336fc3a6479ab9ce97bfee..ca1e89e959d3539b83aadb1413bfbc18a1eb1853 100644 (file)
@@ -115,7 +115,7 @@ nouveau_bo_tmp_del(void *priv)
 {
        struct nouveau_resource *r = priv;
 
-       nouveau_fence_del((struct nouveau_fence **)&r->priv);
+       nouveau_fence_ref(NULL, (struct nouveau_fence **)&r->priv);
        nouveau_resource_free(&r);
 }
 
@@ -398,10 +398,7 @@ nouveau_bo_validate(struct nouveau_channel *chan, struct nouveau_bo *bo,
                        return ret;
        }
 
-       if (nvbo->fence)
-               nouveau_fence_del(&nvbo->fence);
        nouveau_fence_ref(fence, &nvbo->fence);
-
        return 0;
 }
 
index 724677961e6a6ac4428897ae881f88c4272a0047..1ce7174e7580e81ec1a5663e1c5dab5d97dc607f 100644 (file)
@@ -94,11 +94,9 @@ nouveau_fence_new(struct nouveau_channel *, struct nouveau_fence **);
 extern int
 nouveau_fence_ref(struct nouveau_fence *, struct nouveau_fence **);
 
-extern void
-nouveau_fence_del(struct nouveau_fence **);
-
 extern int
 nouveau_fence_signal_cb(struct nouveau_fence *, void (*)(void *), void *);
+
 extern void
 nouveau_fence_emit(struct nouveau_fence *);
 
index 53037d1682327d69015c69d5fccba7afe9fc43dc..7714e6f2485a6ce1884e0e82f0ba5a4e608a9271 100644 (file)
 #include "nouveau_dma.h"
 #include "nouveau_local.h"
 
-int
-nouveau_fence_new(struct nouveau_channel *chan, struct nouveau_fence **fence)
-{
-       struct nouveau_fence_priv *nvfence;
-
-       if (!chan || !fence || *fence)
-               return -EINVAL;
-       
-       nvfence = calloc(1, sizeof(struct nouveau_fence_priv));
-       if (!nvfence)
-               return -ENOMEM;
-       nvfence->base.channel = chan;
-       nvfence->refcount = 1;
-
-       *fence = &nvfence->base;
-       return 0;
-}
-
-int
-nouveau_fence_ref(struct nouveau_fence *ref, struct nouveau_fence **fence)
-{
-       struct nouveau_fence_priv *nvfence;
-
-       if (!ref || !fence || *fence)
-               return -EINVAL;
-       nvfence = nouveau_fence(ref);
-       nvfence->refcount++;
-
-       *fence = &nvfence->base;
-       return 0;
-}
-
 static void
 nouveau_fence_del_unsignalled(struct nouveau_fence *fence)
 {
@@ -82,7 +50,7 @@ nouveau_fence_del_unsignalled(struct nouveau_fence *fence)
                nvchan->fence_tail = le;
 }
 
-void
+static void
 nouveau_fence_del(struct nouveau_fence **fence)
 {
        struct nouveau_fence_priv *nvfence;
@@ -107,6 +75,46 @@ nouveau_fence_del(struct nouveau_fence **fence)
        free(nvfence);
 }
 
+int
+nouveau_fence_new(struct nouveau_channel *chan, struct nouveau_fence **fence)
+{
+       struct nouveau_fence_priv *nvfence;
+
+       if (!chan || !fence || *fence)
+               return -EINVAL;
+       
+       nvfence = calloc(1, sizeof(struct nouveau_fence_priv));
+       if (!nvfence)
+               return -ENOMEM;
+       nvfence->base.channel = chan;
+       nvfence->refcount = 1;
+
+       *fence = &nvfence->base;
+       return 0;
+}
+
+int
+nouveau_fence_ref(struct nouveau_fence *ref, struct nouveau_fence **fence)
+{
+       struct nouveau_fence_priv *nvfence;
+
+       if (!fence)
+               return -EINVAL;
+
+       if (*fence) {
+               nouveau_fence_del(fence);
+               *fence = NULL;
+       }
+
+       if (ref) {
+               nvfence = nouveau_fence(ref);
+               nvfence->refcount++;    
+               *fence = &nvfence->base;
+       }
+
+       return 0;
+}
+
 int
 nouveau_fence_signal_cb(struct nouveau_fence *fence, void (*func)(void *),
                        void *priv)
@@ -159,28 +167,31 @@ nouveau_fence_flush(struct nouveau_channel *chan)
        uint32_t sequence = *nvchan->ref_cnt;
 
        while (nvchan->fence_head) {
-               struct nouveau_fence *fence = NULL;
                struct nouveau_fence_priv *nvfence;
        
-               nouveau_fence_ref(nvchan->fence_head, &fence);
                nvfence = nouveau_fence(nvchan->fence_head);
-
-               if (nvfence->sequence > sequence) {
-                       nouveau_fence_del(&fence);
+               if (nvfence->sequence > sequence)
                        break;
-               }
 
                nouveau_fence_del_unsignalled(&nvfence->base);
                nvfence->signalled = 1;
 
-               while (nvfence->signal_cb) {
-                       struct nouveau_fence_cb *cb = nvfence->signal_cb;
-                       nvfence->signal_cb = cb->next;
-                       cb->func(cb->priv);
-                       free(cb);
-               }
+               if (nvfence->signal_cb) {
+                       struct nouveau_fence *fence = NULL;
+
+                       nouveau_fence_ref(nvchan->fence_head, &fence);
 
-               nouveau_fence_del(&fence);
+                       while (nvfence->signal_cb) {
+                               struct nouveau_fence_cb *cb;
+                               
+                               cb = nvfence->signal_cb;
+                               nvfence->signal_cb = cb->next;
+                               cb->func(cb->priv);
+                               free(cb);
+                       }
+
+                       nouveau_fence_ref(NULL, &fence);
+               }
        }
 }
 
@@ -197,7 +208,7 @@ nouveau_fence_wait(struct nouveau_fence **fence)
                while (!nvfence->signalled)
                        nouveau_fence_flush(nvfence->base.channel);
        }
-       nouveau_fence_del(fence);
+       nouveau_fence_ref(NULL, fence);
 
        return 0;
 }
index 148406b85a7836a126b16348f45f169421757f56..020b1e08407dae78fae5fd99648fe3b0849dc8f2 100644 (file)
@@ -169,7 +169,7 @@ nouveau_pushbuf_flush(struct nouveau_channel *chan, unsigned min)
        /* Fence + kickoff */
        nouveau_fence_emit(fence);
        FIRE_RING_CH(chan);
-       nouveau_fence_del(&fence);
+       nouveau_fence_ref(NULL, &fence);
 
        /* Allocate space for next push buffer */
        assert(!nouveau_pushbuf_space(chan, min));