summaryrefslogtreecommitdiff
path: root/src/mesa/drivers
diff options
context:
space:
mode:
authorBen Skeggs <skeggsb@gmail.com>2007-12-27 06:02:01 +1100
committerBen Skeggs <skeggsb@gmail.com>2007-12-27 06:02:01 +1100
commita794fcfbdbc0417ed9960bd92e0ac49367660635 (patch)
tree059e2cad7c147a6f2e2f5e88d9c72f5ca5c05066 /src/mesa/drivers
parentf33467d72a0bcfc48a21c9d2bf158dabda926442 (diff)
nouveau: remove fence_del(), _ref() can be used for the same purpose.
Diffstat (limited to 'src/mesa/drivers')
-rw-r--r--src/mesa/drivers/dri/nouveau_winsys/nouveau_bo.c5
-rw-r--r--src/mesa/drivers/dri/nouveau_winsys/nouveau_drmif.h4
-rw-r--r--src/mesa/drivers/dri/nouveau_winsys/nouveau_fence.c105
-rw-r--r--src/mesa/drivers/dri/nouveau_winsys/nouveau_pushbuf.c2
4 files changed, 61 insertions, 55 deletions
diff --git a/src/mesa/drivers/dri/nouveau_winsys/nouveau_bo.c b/src/mesa/drivers/dri/nouveau_winsys/nouveau_bo.c
index 09e66d1bdc..ca1e89e959 100644
--- a/src/mesa/drivers/dri/nouveau_winsys/nouveau_bo.c
+++ b/src/mesa/drivers/dri/nouveau_winsys/nouveau_bo.c
@@ -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;
}
diff --git a/src/mesa/drivers/dri/nouveau_winsys/nouveau_drmif.h b/src/mesa/drivers/dri/nouveau_winsys/nouveau_drmif.h
index 724677961e..1ce7174e75 100644
--- a/src/mesa/drivers/dri/nouveau_winsys/nouveau_drmif.h
+++ b/src/mesa/drivers/dri/nouveau_winsys/nouveau_drmif.h
@@ -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 *);
diff --git a/src/mesa/drivers/dri/nouveau_winsys/nouveau_fence.c b/src/mesa/drivers/dri/nouveau_winsys/nouveau_fence.c
index 53037d1682..7714e6f248 100644
--- a/src/mesa/drivers/dri/nouveau_winsys/nouveau_fence.c
+++ b/src/mesa/drivers/dri/nouveau_winsys/nouveau_fence.c
@@ -28,38 +28,6 @@
#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;
@@ -108,6 +76,46 @@ nouveau_fence_del(struct nouveau_fence **fence)
}
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;
}
diff --git a/src/mesa/drivers/dri/nouveau_winsys/nouveau_pushbuf.c b/src/mesa/drivers/dri/nouveau_winsys/nouveau_pushbuf.c
index 148406b85a..020b1e0840 100644
--- a/src/mesa/drivers/dri/nouveau_winsys/nouveau_pushbuf.c
+++ b/src/mesa/drivers/dri/nouveau_winsys/nouveau_pushbuf.c
@@ -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));