[Mesa-dev] [PATCH 1/2] nv50: add nesting support for occlusion queries

Ilia Mirkin imirkin at alum.mit.edu
Mon Jul 13 08:03:26 PDT 2015


This doesn't fix up nv50_query_result. And there's also all the rotate
logic in nvc0 which seems to think it's required. Quite frankly I
never fully grokked all that stuff, but it seems highly relevant to
this.

On Mon, Jul 13, 2015 at 4:49 AM, Samuel Pitoiset
<samuel.pitoiset at gmail.com> wrote:
> This is loosely based on nvc0.
>
> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
> ---
>  src/gallium/drivers/nouveau/nv50/nv50_query.c  | 27 ++++++++++++++++----------
>  src/gallium/drivers/nouveau/nv50/nv50_screen.h |  2 ++
>  2 files changed, 19 insertions(+), 10 deletions(-)
>
> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_query.c b/src/gallium/drivers/nouveau/nv50/nv50_query.c
> index 81f7474..80d3fd2 100644
> --- a/src/gallium/drivers/nouveau/nv50/nv50_query.c
> +++ b/src/gallium/drivers/nouveau/nv50/nv50_query.c
> @@ -49,6 +49,7 @@ struct nv50_query {
>     uint32_t offset; /* base + i * 32 */
>     uint8_t state;
>     boolean is64bit;
> +   int nesting; /* only used for occlusion queries */
>     struct nouveau_mm_allocation *mm;
>     struct nouveau_fence *fence;
>  };
> @@ -175,11 +176,16 @@ nv50_query_begin(struct pipe_context *pipe, struct pipe_query *pq)
>
>     switch (q->type) {
>     case PIPE_QUERY_OCCLUSION_COUNTER:
> -      PUSH_SPACE(push, 4);
> -      BEGIN_NV04(push, NV50_3D(COUNTER_RESET), 1);
> -      PUSH_DATA (push, NV50_3D_COUNTER_RESET_SAMPLECNT);
> -      BEGIN_NV04(push, NV50_3D(SAMPLECNT_ENABLE), 1);
> -      PUSH_DATA (push, 1);
> +      q->nesting = nv50->screen->num_occlusion_queries_active++;
> +      if (q->nesting) {
> +         nv50_query_get(push, q, 0x10, 0x0100f002);
> +      } else {
> +         PUSH_SPACE(push, 4);
> +         BEGIN_NV04(push, NV50_3D(COUNTER_RESET), 1);
> +         PUSH_DATA (push, NV50_3D_COUNTER_RESET_SAMPLECNT);
> +         BEGIN_NV04(push, NV50_3D(SAMPLECNT_ENABLE), 1);
> +         PUSH_DATA (push, 1);
> +      }
>        break;
>     case PIPE_QUERY_PRIMITIVES_GENERATED:
>        nv50_query_get(push, q, 0x10, 0x06805002);
> @@ -223,9 +229,11 @@ nv50_query_end(struct pipe_context *pipe, struct pipe_query *pq)
>     switch (q->type) {
>     case PIPE_QUERY_OCCLUSION_COUNTER:
>        nv50_query_get(push, q, 0, 0x0100f002);
> -      PUSH_SPACE(push, 2);
> -      BEGIN_NV04(push, NV50_3D(SAMPLECNT_ENABLE), 1);
> -      PUSH_DATA (push, 0);
> +      if (--nv50->screen->num_occlusion_queries_active == 0) {
> +         PUSH_SPACE(push, 2);
> +         BEGIN_NV04(push, NV50_3D(SAMPLECNT_ENABLE), 1);
> +         PUSH_DATA (push, 0);
> +      }
>        break;
>     case PIPE_QUERY_PRIMITIVES_GENERATED:
>        nv50_query_get(push, q, 0, 0x06805002);
> @@ -396,8 +404,7 @@ nv50_render_condition(struct pipe_context *pipe,
>        case PIPE_QUERY_OCCLUSION_COUNTER:
>        case PIPE_QUERY_OCCLUSION_PREDICATE:
>           if (likely(!condition)) {
> -            /* XXX: Placeholder, handle nesting here if available */
> -            if (unlikely(false))
> +            if (unlikely(q->nesting))
>                 cond = wait ? NV50_3D_COND_MODE_NOT_EQUAL :
>                               NV50_3D_COND_MODE_ALWAYS;
>              else
> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_screen.h b/src/gallium/drivers/nouveau/nv50/nv50_screen.h
> index 881051b..3a12a1f 100644
> --- a/src/gallium/drivers/nouveau/nv50/nv50_screen.h
> +++ b/src/gallium/drivers/nouveau/nv50/nv50_screen.h
> @@ -54,6 +54,8 @@ struct nv50_screen {
>     struct nv50_context *cur_ctx;
>     struct nv50_graph_state save_state;
>
> +   int num_occlusion_queries_active;
> +
>     struct nouveau_bo *code;
>     struct nouveau_bo *uniforms;
>     struct nouveau_bo *txc; /* TIC (offset 0) and TSC (65536) */
> --
> 2.4.5
>
> _______________________________________________
> 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