freedreno/a6xx: Move rsc seqno out of tex cache key

Since we invalidate tex cache entries if an associated pipe_resource is
rebound, we don't rely on the rsc_seqno being part of the tex cache key.

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-11 12:28:52 -08:00
committed by Marge Bot
parent 94abccf3ce
commit a3c73987ab
2 changed files with 31 additions and 26 deletions

View File

@@ -317,8 +317,8 @@ fd6_sampler_state_delete(struct pipe_context *pctx, void *hwcso)
hash_table_foreach (fd6_ctx->tex_cache, entry) {
struct fd6_texture_state *state = entry->data;
for (unsigned i = 0; i < ARRAY_SIZE(state->key.samp); i++) {
if (samp->seqno == state->key.samp[i].seqno) {
for (unsigned i = 0; i < ARRAY_SIZE(state->key.samp_seqno); i++) {
if (samp->seqno == state->key.samp_seqno[i]) {
remove_tex_entry(fd6_ctx, entry);
break;
}
@@ -479,8 +479,8 @@ fd6_sampler_view_destroy(struct pipe_context *pctx,
hash_table_foreach (fd6_ctx->tex_cache, entry) {
struct fd6_texture_state *state = entry->data;
for (unsigned i = 0; i < ARRAY_SIZE(state->key.view); i++) {
if (view->seqno == state->key.view[i].seqno) {
for (unsigned i = 0; i < ARRAY_SIZE(state->key.view_seqno); i++) {
if (view->seqno == state->key.view_seqno[i]) {
remove_tex_entry(fd6_ctx, entry);
break;
}
@@ -705,13 +705,7 @@ fd6_texture_state(struct fd_context *ctx, enum pipe_shader_type type,
struct fd6_pipe_sampler_view *view =
fd6_pipe_sampler_view(tex->textures[i]);
/* NOTE that if the backing rsc was uncompressed between the
* time that the CSO was originally created and now, the rsc
* seqno would have changed, so we don't have to worry about
* getting a bogus cache hit.
*/
key.view[i].rsc_seqno = fd_resource(view->base.texture)->seqno;
key.view[i].seqno = view->seqno;
key.view_seqno[i] = view->seqno;
}
for (unsigned i = 0; i < tex->num_samplers; i++) {
@@ -721,7 +715,7 @@ fd6_texture_state(struct fd_context *ctx, enum pipe_shader_type type,
struct fd6_sampler_stateobj *sampler =
fd6_sampler_stateobj(tex->samplers[i]);
key.samp[i].seqno = sampler->seqno;
key.samp_seqno[i] = sampler->seqno;
}
key.type = type;
@@ -737,11 +731,24 @@ fd6_texture_state(struct fd_context *ctx, enum pipe_shader_type type,
if (entry) {
state = entry->data;
for (unsigned i = 0; i < tex->num_textures; i++) {
uint16_t seqno = tex->textures[i] ?
fd_resource(tex->textures[i]->texture)->seqno : 0;
assert(state->view_rsc_seqno[i] == seqno);
}
goto out_unlock;
}
state = CALLOC_STRUCT(fd6_texture_state);
for (unsigned i = 0; i < tex->num_textures; i++) {
if (!tex->textures[i])
continue;
state->view_rsc_seqno[i] = fd_resource(tex->textures[i]->texture)->seqno;
}
state->key = key;
state->stateobj = fd_ringbuffer_new_object(ctx->pipe, 32 * 4);
@@ -778,8 +785,10 @@ fd6_rebind_resource(struct fd_context *ctx, struct fd_resource *rsc) assert_dt
hash_table_foreach (fd6_ctx->tex_cache, entry) {
struct fd6_texture_state *state = entry->data;
for (unsigned i = 0; i < ARRAY_SIZE(state->key.view); i++) {
if (rsc->seqno == state->key.view[i].rsc_seqno) {
STATIC_ASSERT(ARRAY_SIZE(state->view_rsc_seqno) == ARRAY_SIZE(state->key.view_seqno));
for (unsigned i = 0; i < ARRAY_SIZE(state->view_rsc_seqno); i++) {
if (rsc->seqno == state->view_rsc_seqno[i]) {
struct fd6_texture_state *tex = entry->data;
tex->invalidate = true;
fd6_ctx->tex_cache_needs_invalidate = true;

View File

@@ -112,24 +112,20 @@ void fd6_texture_fini(struct pipe_context *pctx);
*/
struct fd6_texture_key {
struct {
/* We need to track the seqno of the rsc as well as of the
* sampler view, because resource shadowing/etc can result
* that the underlying bo changes (which means the previous
* state was no longer valid.
*/
uint16_t rsc_seqno;
uint16_t seqno;
} view[16];
struct {
uint16_t seqno;
} samp[16];
uint16_t view_seqno[16];
uint16_t samp_seqno[16];
uint8_t type;
};
struct fd6_texture_state {
struct fd6_texture_key key;
struct fd_ringbuffer *stateobj;
/**
* Track the rsc seqno's associated with the texture views so
* we know what to invalidate when a rsc is rebound when the
* underlying bo changes. (For example, demotion from UBWC.)
*/
uint16_t view_rsc_seqno[16];
bool invalidate;
};