On Sat, May 23, 2015 at 12:59 PM, Samuel Pitoiset <samuel.pitoi...@gmail.com> wrote: > > > On 05/23/2015 06:53 PM, Ilia Mirkin wrote: >> >> Reviewed-by: Ilia Mirkin <imir...@alum.mit.edu> >> >> Seems in line with nvc0, but I assume you tested this? e.g. the >> occlquery mesa demo, or the relevant piglit tests? > > > Yes. And I added a temporary entry to the Gallium HUD for testing > timestamp-disjoint.
I meant just general testing of queries, since you're redoing the whole mechanism. Fixing timestamp disjoint is just icing on the cake... > > >> >> On Sat, May 23, 2015 at 12:52 PM, Samuel Pitoiset >> <samuel.pitoi...@gmail.com> wrote: >>> >>> PIPE_QUERY_TIMESTAMP_DISJOINT could not work because q->ready was always >>> set to FALSE. To fix this issue, add more different states for queries >>> according to nvc0. >>> >>> Signed-off-by: Samuel Pitoiset <samuel.pitoi...@gmail.com> >>> --- >>> src/gallium/drivers/nouveau/nv50/nv50_query.c | 39 >>> +++++++++++++++------------ >>> 1 file changed, 22 insertions(+), 17 deletions(-) >>> >>> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_query.c >>> b/src/gallium/drivers/nouveau/nv50/nv50_query.c >>> index da41209..55fcac8 100644 >>> --- a/src/gallium/drivers/nouveau/nv50/nv50_query.c >>> +++ b/src/gallium/drivers/nouveau/nv50/nv50_query.c >>> @@ -27,6 +27,11 @@ >>> #include "nv50/nv50_context.h" >>> #include "nv_object.xml.h" >>> >>> +#define NV50_QUERY_STATE_READY 0 >>> +#define NV50_QUERY_STATE_ACTIVE 1 >>> +#define NV50_QUERY_STATE_ENDED 2 >>> +#define NV50_QUERY_STATE_FLUSHED 3 >>> + >>> /* XXX: Nested queries, and simultaneous queries on multiple gallium >>> contexts >>> * (since we use only a single GPU channel per screen) will not work >>> properly. >>> * >>> @@ -42,8 +47,7 @@ struct nv50_query { >>> struct nouveau_bo *bo; >>> uint32_t base; >>> uint32_t offset; /* base + i * 32 */ >>> - boolean ready; >>> - boolean flushed; >>> + uint8_t state; >>> boolean is64bit; >>> struct nouveau_mm_allocation *mm; >>> struct nouveau_fence *fence; >>> @@ -66,7 +70,7 @@ nv50_query_allocate(struct nv50_context *nv50, struct >>> nv50_query *q, int size) >>> if (q->bo) { >>> nouveau_bo_ref(NULL, &q->bo); >>> if (q->mm) { >>> - if (q->ready) >>> + if (q->state == NV50_QUERY_STATE_READY) >>> nouveau_mm_free(q->mm); >>> else >>> nouveau_fence_work(screen->base.fence.current, >>> nouveau_mm_free_work, >>> @@ -203,7 +207,7 @@ nv50_query_begin(struct pipe_context *pipe, struct >>> pipe_query *pq) >>> default: >>> break; >>> } >>> - q->ready = FALSE; >>> + q->state = NV50_QUERY_STATE_ACTIVE; >>> return true; >>> } >>> >>> @@ -214,6 +218,8 @@ nv50_query_end(struct pipe_context *pipe, struct >>> pipe_query *pq) >>> struct nouveau_pushbuf *push = nv50->base.pushbuf; >>> struct nv50_query *q = nv50_query(pq); >>> >>> + q->state = NV50_QUERY_STATE_ENDED; >>> + >>> switch (q->type) { >>> case PIPE_QUERY_OCCLUSION_COUNTER: >>> nv50_query_get(push, q, 0, 0x0100f002); >>> @@ -256,29 +262,27 @@ nv50_query_end(struct pipe_context *pipe, struct >>> pipe_query *pq) >>> break; >>> case PIPE_QUERY_TIMESTAMP_DISJOINT: >>> /* This query is not issued on GPU because disjoint is forced to >>> FALSE */ >>> - q->ready = TRUE; >>> + q->state = NV50_QUERY_STATE_READY; >>> break; >>> default: >>> assert(0); >>> 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) >>> +static INLINE void >>> +nv50_query_update(struct nv50_query *q) >>> { >>> if (q->is64bit) { >>> if (nouveau_fence_signalled(q->fence)) >>> - return TRUE; >>> + q->state = NV50_QUERY_STATE_READY; >>> } else { >>> if (q->data[0] == q->sequence) >>> - return TRUE; >>> + q->state = NV50_QUERY_STATE_READY; >>> } >>> - return FALSE; >>> } >>> >>> static boolean >>> @@ -293,13 +297,14 @@ nv50_query_result(struct pipe_context *pipe, struct >>> pipe_query *pq, >>> uint64_t *data64 = (uint64_t *)q->data; >>> int i; >>> >>> - if (!q->ready) /* update ? */ >>> - q->ready = nv50_query_ready(q); >>> - if (!q->ready) { >>> + if (q->state != NV50_QUERY_STATE_READY) >>> + nv50_query_update(q); >>> + >>> + if (q->state != NV50_QUERY_STATE_READY) { >>> if (!wait) { >>> /* for broken apps that spin on GL_QUERY_RESULT_AVAILABLE */ >>> - if (!q->flushed) { >>> - q->flushed = TRUE; >>> + if (q->state != NV50_QUERY_STATE_FLUSHED) { >>> + q->state = NV50_QUERY_STATE_FLUSHED; >>> PUSH_KICK(nv50->base.pushbuf); >>> } >>> return FALSE; >>> @@ -307,7 +312,7 @@ nv50_query_result(struct pipe_context *pipe, struct >>> pipe_query *pq, >>> if (nouveau_bo_wait(q->bo, NOUVEAU_BO_RD, >>> nv50->screen->base.client)) >>> return FALSE; >>> } >>> - q->ready = TRUE; >>> + q->state = NV50_QUERY_STATE_READY; >>> >>> switch (q->type) { >>> case PIPE_QUERY_GPU_FINISHED: >>> -- >>> 2.4.1 >>> >>> _______________________________________________ >>> mesa-dev mailing list >>> mesa-dev@lists.freedesktop.org >>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev > > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev