diff options
author | Ben Skeggs <skeggsb@gmail.com> | 2007-12-27 06:02:01 +1100 |
---|---|---|
committer | Ben Skeggs <skeggsb@gmail.com> | 2007-12-27 06:02:01 +1100 |
commit | a794fcfbdbc0417ed9960bd92e0ac49367660635 (patch) | |
tree | 059e2cad7c147a6f2e2f5e88d9c72f5ca5c05066 /src/mesa | |
parent | f33467d72a0bcfc48a21c9d2bf158dabda926442 (diff) |
nouveau: remove fence_del(), _ref() can be used for the same purpose.
Diffstat (limited to 'src/mesa')
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)); |