From 6bca4e7085b5ce76ae065f40df39f6e3481d7475 Mon Sep 17 00:00:00 2001 From: Christoph Bumiller Date: Fri, 29 Mar 2013 13:50:44 +0100 Subject: nvc0: use fence to check state of queries that don't write sequence This still isn't optimal, since the fence will signal a bit late, but better than checking on the bo, which may never be ready if it is shared (which is likely). --- src/gallium/drivers/nvc0/nvc0_query.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/nvc0/nvc0_query.c b/src/gallium/drivers/nvc0/nvc0_query.c index 5c4431e5af5..cd0dacd821b 100644 --- a/src/gallium/drivers/nvc0/nvc0_query.c +++ b/src/gallium/drivers/nvc0/nvc0_query.c @@ -46,6 +46,7 @@ struct nvc0_query { boolean is64bit; uint8_t rotate; int nesting; /* only used for occlusion queries */ + struct nouveau_fence *fence; struct nouveau_mm_allocation *mm; }; @@ -98,6 +99,7 @@ static void nvc0_query_destroy(struct pipe_context *pipe, struct pipe_query *pq) { nvc0_query_allocate(nvc0_context(pipe), nvc0_query(pq), 0); + nouveau_fence_ref(NULL, &nvc0_query(pq)->fence); FREE(nvc0_query(pq)); } @@ -337,13 +339,15 @@ nvc0_query_end(struct pipe_context *pipe, struct pipe_query *pq) nve4_mp_pm_query_end(nvc0, q); break; } + if (q->is64bit) + nouveau_fence_ref(nvc0->screen->base.fence.current, &q->fence); } static INLINE void nvc0_query_update(struct nouveau_client *cli, struct nvc0_query *q) { if (q->is64bit) { - if (!nouveau_bo_map(q->bo, NOUVEAU_BO_RD | NOUVEAU_BO_NOBLOCK, cli)) + if (nouveau_fence_signalled(q->fence)) q->state = NVC0_QUERY_STATE_READY; } else { if (q->data[0] == q->sequence) -- cgit v1.2.3