[Mesa-dev] [PATCH v2 3/3] nv50, nvc0: leave queries on during blit, turn them on for 2d engine

Ben Skeggs skeggsb at gmail.com
Sun May 11 16:22:18 PDT 2014


On Sun, May 11, 2014 at 10:34 AM, Ilia Mirkin <imirkin at alum.mit.edu> wrote:
> Fixes the new logic of the conditional rendering piglit test.
>
> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
> Cc: "10.2" <mesa-stable at lists.freedesktop.org>
Reviewed-by: Ben Skeggs <bskeggs at redhat.com>

> ---
>  src/gallium/drivers/nouveau/nv50/nv50_query.c   |  6 +++++-
>  src/gallium/drivers/nouveau/nv50/nv50_screen.c  |  2 ++
>  src/gallium/drivers/nouveau/nv50/nv50_surface.c | 15 +++++++++++++--
>  src/gallium/drivers/nouveau/nvc0/nvc0_query.c   |  5 ++++-
>  src/gallium/drivers/nouveau/nvc0/nvc0_screen.c  |  2 ++
>  src/gallium/drivers/nouveau/nvc0/nvc0_surface.c | 11 +++++++++--
>  6 files changed, 35 insertions(+), 6 deletions(-)
>
> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_query.c b/src/gallium/drivers/nouveau/nv50/nv50_query.c
> index 6f25a08..6a17139 100644
> --- a/src/gallium/drivers/nouveau/nv50/nv50_query.c
> +++ b/src/gallium/drivers/nouveau/nv50/nv50_query.c
> @@ -332,7 +332,7 @@ nv50_render_condition(struct pipe_context *pipe,
>     nv50->cond_cond = condition;
>     nv50->cond_mode = mode;
>
> -   PUSH_SPACE(push, 6);
> +   PUSH_SPACE(push, 9);
>
>     if (!pq) {
>        BEGIN_NV04(push, NV50_3D(COND_MODE), 1);
> @@ -351,6 +351,10 @@ nv50_render_condition(struct pipe_context *pipe,
>     PUSH_DATAh(push, q->bo->offset + q->offset);
>     PUSH_DATA (push, q->bo->offset + q->offset);
>     PUSH_DATA (push, NV50_3D_COND_MODE_RES_NON_ZERO);
> +
> +   BEGIN_NV04(push, NV50_2D(COND_ADDRESS_HIGH), 2);
> +   PUSH_DATAh(push, q->bo->offset + q->offset);
> +   PUSH_DATA (push, q->bo->offset + q->offset);
>  }
>
>  void
> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_screen.c b/src/gallium/drivers/nouveau/nv50/nv50_screen.c
> index fcac3c1..68d30ea 100644
> --- a/src/gallium/drivers/nouveau/nv50/nv50_screen.c
> +++ b/src/gallium/drivers/nouveau/nv50/nv50_screen.c
> @@ -398,6 +398,8 @@ nv50_screen_init_hwctx(struct nv50_screen *screen)
>     PUSH_DATA (push, 0);
>     BEGIN_NV04(push, SUBC_2D(0x0888), 1);
>     PUSH_DATA (push, 1);
> +   BEGIN_NV04(push, NV50_2D(COND_MODE), 1);
> +   PUSH_DATA (push, NV50_2D_COND_MODE_ALWAYS);
>
>     BEGIN_NV04(push, SUBC_3D(NV01_SUBCHAN_OBJECT), 1);
>     PUSH_DATA (push, screen->tesla->handle);
> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_surface.c b/src/gallium/drivers/nouveau/nv50/nv50_surface.c
> index 6b4dc4d..df3bc86 100644
> --- a/src/gallium/drivers/nouveau/nv50/nv50_surface.c
> +++ b/src/gallium/drivers/nouveau/nv50/nv50_surface.c
> @@ -611,6 +611,7 @@ struct nv50_blitctx
>     uint8_t mode;
>     uint16_t color_mask;
>     uint8_t filter;
> +   uint8_t render_condition_enable;
>     enum pipe_texture_target target;
>     struct {
>        struct pipe_framebuffer_state fb;
> @@ -933,7 +934,7 @@ nv50_blitctx_prepare_state(struct nv50_blitctx *blit)
>  {
>     struct nouveau_pushbuf *push = blit->nv50->base.pushbuf;
>
> -   if (blit->nv50->cond_query) {
> +   if (blit->nv50->cond_query && !blit->render_condition_enable) {
>        BEGIN_NV04(push, NV50_3D(COND_MODE), 1);
>        PUSH_DATA (push, NV50_3D_COND_MODE_ALWAYS);
>     }
> @@ -1071,7 +1072,7 @@ nv50_blitctx_post_blit(struct nv50_blitctx *blit)
>     nv50->samplers[2][0] = blit->saved.sampler[0];
>     nv50->samplers[2][1] = blit->saved.sampler[1];
>
> -   if (nv50->cond_query)
> +   if (nv50->cond_query && !blit->render_condition_enable)
>        nv50->base.pipe.render_condition(&nv50->base.pipe, nv50->cond_query,
>                                         nv50->cond_cond, nv50->cond_mode);
>
> @@ -1105,6 +1106,7 @@ nv50_blit_3d(struct nv50_context *nv50, const struct pipe_blit_info *info)
>     blit->mode = nv50_blit_select_mode(info);
>     blit->color_mask = nv50_blit_derive_color_mask(info);
>     blit->filter = nv50_blit_get_filter(info);
> +   blit->render_condition_enable = info->render_condition_enable;
>
>     nv50_blit_select_fp(blit, info);
>     nv50_blitctx_pre_blit(blit);
> @@ -1262,6 +1264,11 @@ nv50_blit_eng2d(struct nv50_context *nv50, const struct pipe_blit_info *info)
>        PUSH_DATA (push, 1); /* enable */
>     }
>
> +   if (nv50->cond_query && info->render_condition_enable) {
> +      BEGIN_NV04(push, NV50_2D(COND_MODE), 1);
> +      PUSH_DATA (push, NV50_2D_COND_MODE_RES_NON_ZERO);
> +   }
> +
>     if (mask != 0xffffffff) {
>        BEGIN_NV04(push, NV50_2D(ROP), 1);
>        PUSH_DATA (push, 0xca); /* DPSDxax */
> @@ -1384,6 +1391,10 @@ nv50_blit_eng2d(struct nv50_context *nv50, const struct pipe_blit_info *info)
>        BEGIN_NV04(push, NV50_2D(OPERATION), 1);
>        PUSH_DATA (push, NV50_2D_OPERATION_SRCCOPY);
>     }
> +   if (nv50->cond_query && info->render_condition_enable) {
> +      BEGIN_NV04(push, NV50_2D(COND_MODE), 1);
> +      PUSH_DATA (push, NV50_2D_COND_MODE_ALWAYS);
> +   }
>  }
>
>  static void
> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_query.c b/src/gallium/drivers/nouveau/nvc0/nvc0_query.c
> index 21aa358..856f685 100644
> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_query.c
> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_query.c
> @@ -585,12 +585,15 @@ nvc0_render_condition(struct pipe_context *pipe,
>     if (wait)
>        nvc0_query_fifo_wait(push, pq);
>
> -   PUSH_SPACE(push, 4);
> +   PUSH_SPACE(push, 7);
>     PUSH_REFN (push, q->bo, NOUVEAU_BO_GART | NOUVEAU_BO_RD);
>     BEGIN_NVC0(push, NVC0_3D(COND_ADDRESS_HIGH), 3);
>     PUSH_DATAh(push, q->bo->offset + q->offset);
>     PUSH_DATA (push, q->bo->offset + q->offset);
>     PUSH_DATA (push, cond);
> +   BEGIN_NVC0(push, NVC0_2D(COND_ADDRESS_HIGH), 2);
> +   PUSH_DATAh(push, q->bo->offset + q->offset);
> +   PUSH_DATA (push, q->bo->offset + q->offset);
>  }
>
>  void
> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
> index 2166788..1da991c 100644
> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
> @@ -677,6 +677,8 @@ nvc0_screen_create(struct nouveau_device *dev)
>     PUSH_DATA (push, 0x3f);
>     BEGIN_NVC0(push, SUBC_2D(0x0888), 1);
>     PUSH_DATA (push, 1);
> +   BEGIN_NVC0(push, NVC0_2D(COND_MODE), 1);
> +   PUSH_DATA (push, NVC0_2D_COND_MODE_ALWAYS);
>
>     BEGIN_NVC0(push, SUBC_2D(NVC0_GRAPH_NOTIFY_ADDRESS_HIGH), 2);
>     PUSH_DATAh(push, screen->fence.bo->offset + 16);
> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c b/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c
> index 4a550b0..acadb2c 100644
> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c
> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c
> @@ -503,6 +503,7 @@ struct nvc0_blitctx
>     uint8_t mode;
>     uint16_t color_mask;
>     uint8_t filter;
> +   uint8_t render_condition_enable;
>     enum pipe_texture_target target;
>     struct {
>        struct pipe_framebuffer_state fb;
> @@ -691,7 +692,7 @@ nvc0_blitctx_prepare_state(struct nvc0_blitctx *blit)
>
>     /* TODO: maybe make this a MACRO (if we need more logic) ? */
>
> -   if (blit->nvc0->cond_query)
> +   if (blit->nvc0->cond_query && !blit->render_condition_enable)
>        IMMED_NVC0(push, NVC0_3D(COND_MODE), NVC0_3D_COND_MODE_ALWAYS);
>
>     /* blend state */
> @@ -833,7 +834,7 @@ nvc0_blitctx_post_blit(struct nvc0_blitctx *blit)
>     nvc0->textures_dirty[4] |= 3;
>     nvc0->samplers_dirty[4] |= 3;
>
> -   if (nvc0->cond_query)
> +   if (nvc0->cond_query && !blit->render_condition_enable)
>        nvc0->base.pipe.render_condition(&nvc0->base.pipe, nvc0->cond_query,
>                                         nvc0->cond_cond, nvc0->cond_mode);
>
> @@ -868,6 +869,7 @@ nvc0_blit_3d(struct nvc0_context *nvc0, const struct pipe_blit_info *info)
>     blit->mode = nv50_blit_select_mode(info);
>     blit->color_mask = nv50_blit_derive_color_mask(info);
>     blit->filter = nv50_blit_get_filter(info);
> +   blit->render_condition_enable = info->render_condition_enable;
>
>     nvc0_blit_select_fp(blit, info);
>     nvc0_blitctx_pre_blit(blit);
> @@ -1030,6 +1032,9 @@ nvc0_blit_eng2d(struct nvc0_context *nvc0, const struct pipe_blit_info *info)
>        PUSH_DATA (push, 1); /* enable */
>     }
>
> +   if (nvc0->cond_query && info->render_condition_enable)
> +      IMMED_NVC0(push, NVC0_2D(COND_MODE), NVC0_2D_COND_MODE_RES_NON_ZERO);
> +
>     if (mask != 0xffffffff) {
>        IMMED_NVC0(push, NVC0_2D(ROP), 0xca); /* DPSDxax */
>        IMMED_NVC0(push, NVC0_2D(PATTERN_COLOR_FORMAT),
> @@ -1154,6 +1159,8 @@ nvc0_blit_eng2d(struct nvc0_context *nvc0, const struct pipe_blit_info *info)
>        IMMED_NVC0(push, NVC0_2D(CLIP_ENABLE), 0);
>     if (mask != 0xffffffff)
>        IMMED_NVC0(push, NVC0_2D(OPERATION), NVC0_2D_OPERATION_SRCCOPY);
> +   if (nvc0->cond_query && info->render_condition_enable)
> +      IMMED_NVC0(push, NVC0_2D(COND_MODE), NVC0_2D_COND_MODE_ALWAYS);
>  }
>
>  static void
> --
> 1.8.5.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