+ const unsigned end = start + nr;
+ unsigned mask = 0;
+ unsigned i;
+
+ assert(s < 6);
+
+ if (pimages) {
+ for (i = start; i < end; ++i) {
+ struct pipe_image_view *img = &nvc0->images[s][i];
+ const unsigned p = i - start;
+
+ if (img->resource == pimages[p].resource &&
+ img->format == pimages[p].format &&
+ img->access == pimages[p].access) {
+ if (img->resource == NULL)
+ continue;
+ if (img->resource->target == PIPE_BUFFER &&
+ img->u.buf.offset == pimages[p].u.buf.offset &&
+ img->u.buf.size == pimages[p].u.buf.size)
+ continue;
+ if (img->resource->target != PIPE_BUFFER &&
+ img->u.tex.first_layer == pimages[p].u.tex.first_layer &&
+ img->u.tex.last_layer == pimages[p].u.tex.last_layer &&
+ img->u.tex.level == pimages[p].u.tex.level)
+ continue;
+ }
+
+ mask |= (1 << i);
+ if (pimages[p].resource)
+ nvc0->images_valid[s] |= (1 << i);
+ else
+ nvc0->images_valid[s] &= ~(1 << i);
+
+ img->format = pimages[p].format;
+ img->access = pimages[p].access;
+ if (pimages[p].resource && pimages[p].resource->target == PIPE_BUFFER)
+ img->u.buf = pimages[p].u.buf;
+ else
+ img->u.tex = pimages[p].u.tex;
+
+ pipe_resource_reference(
+ &img->resource, pimages[p].resource);
+
+ if (nvc0->screen->base.class_3d >= GM107_3D_CLASS) {
+ if (nvc0->images_tic[s][i]) {
+ struct nv50_tic_entry *old =
+ nv50_tic_entry(nvc0->images_tic[s][i]);
+ nvc0_screen_tic_unlock(nvc0->screen, old);
+ pipe_sampler_view_reference(&nvc0->images_tic[s][i], NULL);
+ }
+
+ nvc0->images_tic[s][i] =
+ gm107_create_texture_view_from_image(&nvc0->base.pipe,
+ &pimages[p]);
+ }
+ }
+ if (!mask)
+ return false;
+ } else {
+ mask = ((1 << nr) - 1) << start;
+ if (!(nvc0->images_valid[s] & mask))
+ return false;
+ for (i = start; i < end; ++i) {
+ pipe_resource_reference(&nvc0->images[s][i].resource, NULL);
+ if (nvc0->screen->base.class_3d >= GM107_3D_CLASS) {
+ struct nv50_tic_entry *old = nv50_tic_entry(nvc0->images_tic[s][i]);
+ if (old) {
+ nvc0_screen_tic_unlock(nvc0->screen, old);
+ pipe_sampler_view_reference(&nvc0->images_tic[s][i], 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);
+
+ return true;