[Mesa-dev] [PATCH v2 1/2] nvc0: rework the validation path for 3D

Ilia Mirkin imirkin at alum.mit.edu
Tue Mar 8 20:39:42 UTC 2016


Thanks. Series is Reviewed-by: Ilia Mirkin <imirkin at alum.mit.edu>

On Tue, Mar 8, 2016 at 3:36 PM, Samuel Pitoiset
<samuel.pitoiset at gmail.com> wrote:
> This exposes an interface for state validation that will be also used
> to rework the compute validation path.
>
> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
> ---
>  src/gallium/drivers/nouveau/nvc0/nvc0_context.h    | 10 +++++-
>  .../drivers/nouveau/nvc0/nvc0_state_validate.c     | 36 ++++++++++++++--------
>  src/gallium/drivers/nouveau/nvc0/nvc0_surface.c    |  4 +--
>  src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c        |  2 +-
>  4 files changed, 36 insertions(+), 16 deletions(-)
>
> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_context.h b/src/gallium/drivers/nouveau/nvc0/nvc0_context.h
> index 0f1ebb0..54afe88 100644
> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_context.h
> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_context.h
> @@ -262,7 +262,15 @@ void nvc0_tfb_validate(struct nvc0_context *);
>  extern void nvc0_init_state_functions(struct nvc0_context *);
>
>  /* nvc0_state_validate.c */
> -bool nvc0_state_validate(struct nvc0_context *, uint32_t state_mask);
> +struct nvc0_state_validate {
> +   void (*func)(struct nvc0_context *);
> +   uint32_t states;
> +};
> +
> +bool nvc0_state_validate(struct nvc0_context *, uint32_t,
> +                         struct nvc0_state_validate *, int, uint32_t *,
> +                         struct nouveau_bufctx *);
> +bool nvc0_state_validate_3d(struct nvc0_context *, uint32_t);
>
>  /* nvc0_surface.c */
>  extern void nvc0_clear(struct pipe_context *, unsigned buffers,
> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c b/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c
> index fbf45ce..c0ed5c0 100644
> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c
> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c
> @@ -672,10 +672,8 @@ nvc0_switch_pipe_context(struct nvc0_context *ctx_to)
>     ctx_to->screen->cur_ctx = ctx_to;
>  }
>
> -static struct state_validate {
> -    void (*func)(struct nvc0_context *);
> -    uint32_t states;
> -} validate_list[] = {
> +static struct nvc0_state_validate
> +validate_list_3d[] = {
>      { nvc0_validate_fb,            NVC0_NEW_3D_FRAMEBUFFER },
>      { nvc0_validate_blend,         NVC0_NEW_3D_BLEND },
>      { nvc0_validate_zsa,           NVC0_NEW_3D_ZSA },
> @@ -714,7 +712,9 @@ static struct state_validate {
>  };
>
>  bool
> -nvc0_state_validate(struct nvc0_context *nvc0, uint32_t mask)
> +nvc0_state_validate(struct nvc0_context *nvc0, uint32_t mask,
> +                    struct nvc0_state_validate *validate_list, int size,
> +                    uint32_t *dirty, struct nouveau_bufctx *bufctx)
>  {
>     uint32_t state_mask;
>     int ret;
> @@ -723,26 +723,38 @@ nvc0_state_validate(struct nvc0_context *nvc0, uint32_t mask)
>     if (nvc0->screen->cur_ctx != nvc0)
>        nvc0_switch_pipe_context(nvc0);
>
> -   state_mask = nvc0->dirty_3d & mask;
> +   state_mask = *dirty & mask;
>
>     if (state_mask) {
> -      for (i = 0; i < ARRAY_SIZE(validate_list); ++i) {
> -         struct state_validate *validate = &validate_list[i];
> +      for (i = 0; i < size; ++i) {
> +         struct nvc0_state_validate *validate = &validate_list[i];
>
>           if (state_mask & validate->states)
>              validate->func(nvc0);
>        }
> -      nvc0->dirty_3d &= ~state_mask;
> +      *dirty &= ~state_mask;
>
> -      nvc0_bufctx_fence(nvc0, nvc0->bufctx_3d, false);
> +      nvc0_bufctx_fence(nvc0, bufctx, false);
>     }
>
> -   nouveau_pushbuf_bufctx(nvc0->base.pushbuf, nvc0->bufctx_3d);
> +   nouveau_pushbuf_bufctx(nvc0->base.pushbuf, bufctx);
>     ret = nouveau_pushbuf_validate(nvc0->base.pushbuf);
>
> +   return !ret;
> +}
> +
> +bool
> +nvc0_state_validate_3d(struct nvc0_context *nvc0, uint32_t mask)
> +{
> +   bool ret;
> +
> +   ret = nvc0_state_validate(nvc0, mask, validate_list_3d,
> +                             ARRAY_SIZE(validate_list_3d), &nvc0->dirty_3d,
> +                             nvc0->bufctx_3d);
> +
>     if (unlikely(nvc0->state.flushed)) {
>        nvc0->state.flushed = false;
>        nvc0_bufctx_fence(nvc0, nvc0->bufctx_3d, true);
>     }
> -   return !ret;
> +   return ret;
>  }
> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c b/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c
> index 4957796..a4a8bf7 100644
> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c
> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c
> @@ -693,7 +693,7 @@ nvc0_clear(struct pipe_context *pipe, unsigned buffers,
>     uint32_t mode = 0;
>
>     /* don't need NEW_BLEND, COLOR_MASK doesn't affect CLEAR_BUFFERS */
> -   if (!nvc0_state_validate(nvc0, NVC0_NEW_3D_FRAMEBUFFER))
> +   if (!nvc0_state_validate_3d(nvc0, NVC0_NEW_3D_FRAMEBUFFER))
>        return;
>
>     if (buffers & PIPE_CLEAR_COLOR && fb->nr_cbufs) {
> @@ -1195,7 +1195,7 @@ nvc0_blit_3d(struct nvc0_context *nvc0, const struct pipe_blit_info *info)
>
>     nvc0_blitctx_prepare_state(blit);
>
> -   nvc0_state_validate(nvc0, ~0);
> +   nvc0_state_validate_3d(nvc0, ~0);
>
>     x_range = (float)info->src.box.width / (float)info->dst.box.width;
>     y_range = (float)info->src.box.height / (float)info->dst.box.height;
> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c b/src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c
> index 647aa10..e0e0ad2 100644
> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c
> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c
> @@ -969,7 +969,7 @@ nvc0_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
>        IMMED_NVC0(push, NVC0_3D(PATCH_VERTICES), nvc0->state.patch_vertices);
>     }
>
> -   nvc0_state_validate(nvc0, ~0);
> +   nvc0_state_validate_3d(nvc0, ~0);
>
>     if (nvc0->vertprog->vp.need_draw_parameters) {
>        PUSH_SPACE(push, 9);
> --
> 2.7.1
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list