[Mesa-dev] [PATCH] nouveau: avoid emitting new fences unnecessarily
Samuel Pitoiset
samuel.pitoiset at gmail.com
Sat Oct 10 12:41:19 PDT 2015
Does this fix those texelFetch piglit tests ? Or is it the second patch ?
Anyway, this patch is :
Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
On 10/10/2015 08:12 AM, Ilia Mirkin wrote:
> Right now we emit on every kick, but this is only necessary if something
> will ever be able to observe that the fence completed. If there are no
> refs, leave the fence alone and emit it another day.
>
> This also happens to work around an issue for the kick handler -- a kick
> can be a result of e.g. nouveau_bo_wait or explicit kick, or it can be
> due to lack of space in the pushbuf. We want the emit to happen in the
> current batch, so we want there to always be enough space. However an
> explicit kick could take the reserved space for the implicitly-triggered
> kick's fence emission if it happened right after. With the new mechanism,
> hopefully there's no way to cause two fences to be emitted into the same
> reserved space.
>
> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
> Cc: mesa-stable at lists.freedesktop.org
> Fixes: 47d11990b (nouveau: make sure there's always room to emit a fence)
> ---
> src/gallium/drivers/nouveau/nouveau_fence.c | 12 +++++++++---
> 1 file changed, 9 insertions(+), 3 deletions(-)
>
> diff --git a/src/gallium/drivers/nouveau/nouveau_fence.c b/src/gallium/drivers/nouveau/nouveau_fence.c
> index ee4e08d..18b1592 100644
> --- a/src/gallium/drivers/nouveau/nouveau_fence.c
> +++ b/src/gallium/drivers/nouveau/nouveau_fence.c
> @@ -190,8 +190,10 @@ nouveau_fence_wait(struct nouveau_fence *fence)
> /* wtf, someone is waiting on a fence in flush_notify handler? */
> assert(fence->state != NOUVEAU_FENCE_STATE_EMITTING);
>
> - if (fence->state < NOUVEAU_FENCE_STATE_EMITTED)
> + if (fence->state < NOUVEAU_FENCE_STATE_EMITTED) {
> + PUSH_SPACE(screen->pushbuf, 8);
> nouveau_fence_emit(fence);
> + }
>
> if (fence->state < NOUVEAU_FENCE_STATE_FLUSHED)
> if (nouveau_pushbuf_kick(screen->pushbuf, screen->pushbuf->channel))
> @@ -224,8 +226,12 @@ nouveau_fence_wait(struct nouveau_fence *fence)
> void
> nouveau_fence_next(struct nouveau_screen *screen)
> {
> - if (screen->fence.current->state < NOUVEAU_FENCE_STATE_EMITTING)
> - nouveau_fence_emit(screen->fence.current);
> + if (screen->fence.current->state < NOUVEAU_FENCE_STATE_EMITTING) {
> + if (screen->fence.current->ref > 1)
> + nouveau_fence_emit(screen->fence.current);
> + else
> + return;
> + }
>
> nouveau_fence_ref(NULL, &screen->fence.current);
>
More information about the mesa-dev
mailing list