nv50: fix 64-bit queries with HUD, based on nvc0
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Thu, 21 May 2015 18:06:19 +0000 (20:06 +0200)
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>
Fri, 22 May 2015 09:39:23 +0000 (11:39 +0200)
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>
src/gallium/drivers/nouveau/nv50/nv50_query.c

index 6690aa282eb2846c2e1b341d279ee79e49bb9b97..a3c884111990be6b653e46bccd1c7bcda1be96d1 100644 (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