On 01:56 AM - Apr 13 2016, Samuel Pitoiset wrote: > This implements set_shader_images() and resource invalidation for > images. As OpenGL requires at least 8 images, we are going to expose > this minimum value even if this might be raised for Kepler, but this > limit is mainly for Fermi because the hardware only accepts 8 images. > > Based on original patch by Ilia Mirkin. > > Signed-off-by: Samuel Pitoiset <samuel.pitoi...@gmail.com> > --- > src/gallium/drivers/nouveau/nvc0/nvc0_context.c | 17 +++++++ > src/gallium/drivers/nouveau/nvc0/nvc0_context.h | 4 ++ > src/gallium/drivers/nouveau/nvc0/nvc0_screen.h | 1 + > src/gallium/drivers/nouveau/nvc0/nvc0_state.c | 53 > +++++++++++++++++++++- > .../drivers/nouveau/nvc0/nvc0_state_validate.c | 1 + > 5 files changed, 74 insertions(+), 2 deletions(-) > > diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_context.c > b/src/gallium/drivers/nouveau/nvc0/nvc0_context.c > index fcb8289..3e25572 100644 > --- a/src/gallium/drivers/nouveau/nvc0/nvc0_context.c > +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_context.c > @@ -301,6 +301,23 @@ nvc0_invalidate_resource_storage(struct nouveau_context > *ctx, > } > } > } > + > + for (s = 0; s < 5; ++s) {
Should be `s < 6` here I guess, since you later test for `s == 5`. > + for (i = 0; i < NVC0_MAX_IMAGES; ++i) { Any reason not to intend this second for loop? Pierre > + if (nvc0->images[s][i].resource == res) { > + nvc0->images_dirty[s] |= 1 << i; > + if (unlikely(s == 5)) { > + nvc0->dirty_cp |= NVC0_NEW_CP_SURFACES; > + nouveau_bufctx_reset(nvc0->bufctx_cp, NVC0_BIND_CP_SUF); > + } else { > + nvc0->dirty_3d |= NVC0_NEW_3D_SURFACES; > + nouveau_bufctx_reset(nvc0->bufctx_3d, NVC0_BIND_3D_SUF); > + } > + } > + if (!--ref) > + return ref; > + } > + } > } > > return ref; > diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_context.h > b/src/gallium/drivers/nouveau/nvc0/nvc0_context.h > index 91dffa1..617f4c2 100644 > --- a/src/gallium/drivers/nouveau/nvc0/nvc0_context.h > +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_context.h > @@ -237,6 +237,10 @@ struct nvc0_context { > uint32_t buffers_dirty[6]; > uint32_t buffers_valid[6]; > > + struct pipe_image_view images[6][NVC0_MAX_IMAGES]; > + uint16_t images_dirty[6]; > + uint16_t images_valid[6]; > + > struct util_dynarray global_residents; > }; > > diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.h > b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.h > index 0f78220..750bba0 100644 > --- a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.h > +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.h > @@ -23,6 +23,7 @@ > > #define NVC0_MAX_BUFFERS 32 > > +#define NVC0_MAX_IMAGES 8 > > struct nvc0_context; > > diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_state.c > b/src/gallium/drivers/nouveau/nvc0/nvc0_state.c > index a100fc4..e437a64 100644 > --- a/src/gallium/drivers/nouveau/nvc0/nvc0_state.c > +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_state.c > @@ -1232,10 +1232,59 @@ nvc0_set_compute_resources(struct pipe_context *pipe, > } > > static void > +nvc0_bind_images_range(struct nvc0_context *nvc0, const unsigned s, > + unsigned start, unsigned nr, > + struct pipe_image_view *pimages) > +{ > + const unsigned end = start + nr; > + const unsigned mask = ((1 << nr) - 1) << start; > + unsigned i; > + > + assert(s < 6); > + > + if (pimages) { > + for (i = start; i < end; ++i) { > + const unsigned p = i - start; > + if (pimages[p].resource) > + nvc0->images_valid[s] |= (1 << i); > + else > + nvc0->images_valid[s] &= ~(1 << i); > + > + nvc0->images[s][i].format = pimages[p].format; > + nvc0->images[s][i].access = pimages[p].access; > + if (pimages[p].resource->target == PIPE_BUFFER) > + nvc0->images[s][i].u.buf = pimages[p].u.buf; > + else > + nvc0->images[s][i].u.tex = pimages[p].u.tex; > + > + pipe_resource_reference( > + &nvc0->images[s][i].resource, pimages[p].resource); > + } > + } else { > + for (i = start; i < end; ++i) > + pipe_resource_reference(&nvc0->images[s][i].resource, NULL); > + nvc0->images_valid[s] &= ~mask; > + } > + nvc0->images_dirty[s] |= mask; > + > + if (s == 5) > + nouveau_bufctx_reset(nvc0->bufctx_cp, NVC0_BIND_CP_SUF); > + else > + nouveau_bufctx_reset(nvc0->bufctx_3d, NVC0_BIND_3D_SUF); > +} > + > +static void > nvc0_set_shader_images(struct pipe_context *pipe, unsigned shader, > - unsigned start_slot, unsigned count, > - struct pipe_image_view *views) > + unsigned start, unsigned nr, > + struct pipe_image_view *images) > { > + const unsigned s = nvc0_shader_stage(shader); > + nvc0_bind_images_range(nvc0_context(pipe), s, start, nr, images); > + > + if (s == 5) > + nvc0_context(pipe)->dirty_cp |= NVC0_NEW_CP_SURFACES; > + else > + nvc0_context(pipe)->dirty_3d |= NVC0_NEW_3D_SURFACES; > } > > static void > diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c > b/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c > index d0d9315..b57db46 100644 > --- a/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c > +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c > @@ -665,6 +665,7 @@ nvc0_switch_pipe_context(struct nvc0_context *ctx_to) > ctx_to->textures_dirty[s] = ~0; > ctx_to->constbuf_dirty[s] = (1 << NVC0_MAX_PIPE_CONSTBUFS) - 1; > ctx_to->buffers_dirty[s] = ~0; > + ctx_to->images_dirty[s] = ~0; > } > > /* Reset tfb as the shader that owns it may have been deleted. */ > -- > 2.8.0 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev
signature.asc
Description: PGP signature
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev