nv50: fix 64-bit queries with HUD, based on nvc0

A sequence number is written for 32-bits queries to make sure they are
ready, but not for 64-bits queries. Instead, we have to use a fence in
order to fix the HUD because it doesn't wait until the result is ready.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
This commit is contained in:
Samuel Pitoiset 2015-05-21 20:06:19 +02:00
parent 6921ea42a1
commit 867fd2b5f5

View file

@ -46,6 +46,7 @@ struct nv50_query {
boolean flushed;
boolean is64bit;
struct nouveau_mm_allocation *mm;
struct nouveau_fence *fence;
};
#define NV50_QUERY_ALLOC_SPACE 256
@ -92,6 +93,7 @@ static void
nv50_query_destroy(struct pipe_context *pipe, struct pipe_query *pq)
{
nv50_query_allocate(nv50_context(pipe), nv50_query(pq), 0);
nouveau_fence_ref(NULL, &nv50_query(pq)->fence);
FREE(nv50_query(pq));
}
@ -260,12 +262,22 @@ nv50_query_end(struct pipe_context *pipe, struct pipe_query *pq)
break;
}
q->ready = q->flushed = FALSE;
if (q->is64bit)
nouveau_fence_ref(nv50->screen->base.fence.current, &q->fence);
}
static INLINE boolean
nv50_query_ready(struct nv50_query *q)
{
return q->ready || (!q->is64bit && (q->data[0] == q->sequence));
if (q->is64bit) {
if (nouveau_fence_signalled(q->fence))
return TRUE;
} else {
if (q->data[0] == q->sequence)
return TRUE;
}
return FALSE;
}
static boolean