Mesa (master): nv50: fix 64-bit queries with HUD, based on nvc0

Ilia Mirkin imirkin at kemper.freedesktop.org
Fri May 22 16:49:46 UTC 2015


Module: Mesa
Branch: master
Commit: 867fd2b5f586085c137af264e3eb640094e88526
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=867fd2b5f586085c137af264e3eb640094e88526

Author: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Date:   Thu May 21 20:06:19 2015 +0200

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 at gmail.com>
Reviewed-by: Ilia Mirkin <imirkin at alum.mit.edu>

---

 src/gallium/drivers/nouveau/nv50/nv50_query.c |   14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/src/gallium/drivers/nouveau/nv50/nv50_query.c b/src/gallium/drivers/nouveau/nv50/nv50_query.c
index 6690aa2..a3c8841 100644
--- a/src/gallium/drivers/nouveau/nv50/nv50_query.c
+++ b/src/gallium/drivers/nouveau/nv50/nv50_query.c
@@ -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




More information about the mesa-commit mailing list