[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