freedreno/a6xx: Fix view_seqno in tex cache key

If the view's seqno increments, it needs to happen *before* the tex cache
key is constructed.  Normally this happens when the sampler views are
bound.  But if the texture backing a current sampler view is rebound we
need to handle this before the cache lookup.

Signed-off-by: Rob Clark <robdclark@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21408>
This commit is contained in:
Rob Clark 2023-02-15 14:06:17 -08:00 committed by Marge Bot
parent 818b49932a
commit 3c668513b9

View file

@ -608,11 +608,9 @@ build_texture_state(struct fd_context *ctx, enum pipe_shader_type type,
if (tex->textures[i]) {
view = fd6_pipe_sampler_view(tex->textures[i]);
if (unlikely(view->rsc_seqno !=
fd_resource(view->base.texture)->seqno)) {
fd6_sampler_view_update(ctx,
fd6_pipe_sampler_view(tex->textures[i]));
}
struct fd_resource *rsc = fd_resource(view->base.texture);
fd6_assert_valid_format(rsc, view->base.format);
assert(view->rsc_seqno == rsc->seqno);
} else {
static const struct fd6_pipe_sampler_view dummy_view = {};
view = &dummy_view;
@ -683,7 +681,7 @@ handle_invalidates(struct fd_context *ctx)
{
struct fd6_context *fd6_ctx = fd6_context(ctx);
fd_screen_assert_locked(ctx->screen);
fd_screen_lock(ctx->screen);
hash_table_foreach (fd6_ctx->tex_cache, entry) {
struct fd6_texture_state *state = entry->data;
@ -692,6 +690,22 @@ handle_invalidates(struct fd_context *ctx)
remove_tex_entry(fd6_ctx, entry);
}
fd_screen_unlock(ctx->screen);
for (unsigned type = 0; type < ARRAY_SIZE(ctx->tex); type++) {
struct fd_texture_stateobj *tex = &ctx->tex[type];
for (unsigned i = 0; i < tex->num_textures; i++) {
struct fd6_pipe_sampler_view *so =
fd6_pipe_sampler_view(tex->textures[i]);
if (!so)
continue;
fd6_sampler_view_update(ctx, so);
}
}
fd6_ctx->tex_cache_needs_invalidate = false;
}
@ -703,6 +717,9 @@ fd6_texture_state(struct fd_context *ctx, enum pipe_shader_type type)
struct fd6_texture_state *state = NULL;
struct fd6_texture_key key;
if (unlikely(fd6_ctx->tex_cache_needs_invalidate))
handle_invalidates(ctx);
memset(&key, 0, sizeof(key));
for (unsigned i = 0; i < tex->num_textures; i++) {
@ -730,9 +747,6 @@ fd6_texture_state(struct fd_context *ctx, enum pipe_shader_type type)
uint32_t hash = tex_key_hash(&key);
fd_screen_lock(ctx->screen);
if (unlikely(fd6_ctx->tex_cache_needs_invalidate))
handle_invalidates(ctx);
struct hash_entry *entry =
_mesa_hash_table_search_pre_hashed(fd6_ctx->tex_cache, hash, &key);