From 9a899e579a6c7845cd94961b22e3a2c475f50a62 Mon Sep 17 00:00:00 2001 From: Neil Roberts Date: Tue, 29 Sep 2020 17:24:51 +0200 Subject: [PATCH] =?utf8?q?v3d:=20Update=20the=20TEXTURE=5FSHADER=5FSTATE?= =?utf8?q?=20when=20there=E2=80=99s=20a=20new=20buf=20for=20a=20tex?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit When a texture is mapped with the DISCARD_WHOLE_RESOURCE flag set, v3d_map_usage_prep will try to allocate a new buffer for the resource. Previously, if the resource was used in a bound texture then nothing would cause it to update the sampler view with the offset for the new buffer. This commit just adds that in by looking at all sampler views and calling v3d_create_texture_shader_state_bo for each one that references this resource. Reviewed-by: Eric Anholt Part-of: --- src/gallium/drivers/v3d/v3d_resource.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/gallium/drivers/v3d/v3d_resource.c b/src/gallium/drivers/v3d/v3d_resource.c index c3990cd..38ff848 100644 --- a/src/gallium/drivers/v3d/v3d_resource.c +++ b/src/gallium/drivers/v3d/v3d_resource.c @@ -147,6 +147,29 @@ v3d_resource_transfer_unmap(struct pipe_context *pctx, } 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, unsigned usage) @@ -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. -- 2.7.4