diff --git a/src/gallium/drivers/v3d/v3d_resource.c b/src/gallium/drivers/v3d/v3d_resource.c index c3990cd05e1..38ff848d0bf 100644 --- a/src/gallium/drivers/v3d/v3d_resource.c +++ b/src/gallium/drivers/v3d/v3d_resource.c @@ -146,6 +146,29 @@ v3d_resource_transfer_unmap(struct pipe_context *pctx, slab_free(&v3d->transfer_pool, ptrans); } +static void +rebind_sampler_views(struct v3d_context *v3d, + struct v3d_resource *rsc) +{ + for (int st = 0; st < PIPE_SHADER_TYPES; st++) { + struct v3d_texture_stateobj *tex = v3d->tex + st; + + for (unsigned i = 0; i < tex->num_textures; i++) { + struct pipe_sampler_view *psview = tex->textures[i]; + + if (psview->texture != &rsc->base) + continue; + + struct v3d_sampler_view *sview = + v3d_sampler_view(psview); + + v3d_create_texture_shader_state_bo(v3d, sview); + + v3d_flag_dirty_sampler_state(v3d, st); + } + } +} + static void v3d_map_usage_prep(struct pipe_context *pctx, struct pipe_resource *prsc, @@ -164,6 +187,8 @@ v3d_map_usage_prep(struct pipe_context *pctx, v3d->dirty |= VC5_DIRTY_VTXBUF; if (prsc->bind & PIPE_BIND_CONSTANT_BUFFER) v3d->dirty |= VC5_DIRTY_CONSTBUF; + if (prsc->bind & PIPE_BIND_SAMPLER_VIEW) + rebind_sampler_views(v3d, rsc); } else { /* If we failed to reallocate, flush users so that we * don't violate any syncing requirements.