On Tue, Mar 8, 2016 at 3:08 PM, Samuel Pitoiset <samuel.pitoi...@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.pitoi...@gmail.com> > --- > src/gallium/drivers/nouveau/Makefile.sources | 1 + > src/gallium/drivers/nouveau/nvc0/nvc0_context.h | 3 -- > .../drivers/nouveau/nvc0/nvc0_state_validate.c | 37 > +++++++++++++++------- > .../drivers/nouveau/nvc0/nvc0_state_validate.h | 19 +++++++++++ > src/gallium/drivers/nouveau/nvc0/nvc0_surface.c | 5 +-- > src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c | 3 +- > 6 files changed, 50 insertions(+), 18 deletions(-) > create mode 100644 src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.h > > diff --git a/src/gallium/drivers/nouveau/Makefile.sources > b/src/gallium/drivers/nouveau/Makefile.sources > index 65f08c7..f3df05b 100644 > --- a/src/gallium/drivers/nouveau/Makefile.sources > +++ b/src/gallium/drivers/nouveau/Makefile.sources > @@ -177,6 +177,7 @@ NVC0_C_SOURCES := \ > nvc0/nvc0_state.c \ > nvc0/nvc0_stateobj.h \ > nvc0/nvc0_state_validate.c \ > + nvc0/nvc0_state_validate.h \ > nvc0/nvc0_surface.c \ > nvc0/nvc0_tex.c \ > nvc0/nvc0_transfer.c \ > diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_context.h > b/src/gallium/drivers/nouveau/nvc0/nvc0_context.h > index 0f1ebb0..d0914b6 100644 > --- a/src/gallium/drivers/nouveau/nvc0/nvc0_context.h > +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_context.h > @@ -261,9 +261,6 @@ void nvc0_tfb_validate(struct nvc0_context *); > /* nvc0_state.c */ > extern void nvc0_init_state_functions(struct nvc0_context *); > > -/* nvc0_state_validate.c */ > -bool nvc0_state_validate(struct nvc0_context *, uint32_t state_mask);
I'd just keep sticking stuff in here... no point in making 50 different tiny header files IMHO. [This is also the style used for the most part.] > - > /* nvc0_surface.c */ > extern void nvc0_clear(struct pipe_context *, unsigned buffers, > const union pipe_color_union *color, > diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c > b/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c > index fbf45ce..9f53b5a 100644 > --- a/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c > +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c > @@ -3,6 +3,7 @@ > #include "util/u_math.h" > > #include "nvc0/nvc0_context.h" > +#include "nvc0/nvc0_state_validate.h" > > #if 0 > static void > @@ -672,10 +673,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 +713,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 +724,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_state_validate.h > b/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.h > new file mode 100644 > index 0000000..1230e7b > --- /dev/null > +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.h > @@ -0,0 +1,19 @@ > +#ifndef __NVC0_STATE_VALIDATE_H__ > +#define __NVC0_STATE_VALIDATE_H__ > + > +#include "nvc0/nvc0_context.h" > + > +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); > + > +#endif > diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c > b/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c > index 4957796..4613c2d 100644 > --- a/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c > +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c > @@ -33,6 +33,7 @@ > > #include "nvc0/nvc0_context.h" > #include "nvc0/nvc0_resource.h" > +#include "nvc0/nvc0_state_validate.h" > > #include "nv50/g80_defs.xml.h" > #include "nv50/g80_texture.xml.h" > @@ -693,7 +694,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 +1196,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..09d9309 100644 > --- a/src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c > +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c > @@ -31,6 +31,7 @@ > #include "nvc0/nvc0_context.h" > #include "nvc0/nvc0_query_hw.h" > #include "nvc0/nvc0_resource.h" > +#include "nvc0/nvc0_state_validate.h" > > #include "nvc0/nvc0_3d.xml.h" > > @@ -969,7 +970,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@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev