[Mesa-dev] [PATCH v2] nv50: fix PIPE_QUERY_TIMESTAMP_DISJOINT, based on nvc0

Samuel Pitoiset samuel.pitoiset at gmail.com
Sat May 23 10:05:59 PDT 2015



On 05/23/2015 06:59 PM, Ilia Mirkin wrote:
> On Sat, May 23, 2015 at 12:59 PM, Samuel Pitoiset
> <samuel.pitoiset at gmail.com> wrote:
>>
>> On 05/23/2015 06:53 PM, Ilia Mirkin wrote:
>>> Reviewed-by: Ilia Mirkin <imirkin at 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...

Sure. No regressions. I tested all queries. :)

>
>>
>>> On Sat, May 23, 2015 at 12:52 PM, Samuel Pitoiset
>>> <samuel.pitoiset at 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.pitoiset at 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 at lists.freedesktop.org
>>>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>>



More information about the mesa-dev mailing list