diff --git a/src/gallium/drivers/etnaviv/etnaviv_context.c b/src/gallium/drivers/etnaviv/etnaviv_context.c index ec7cc282538..9561260b2b8 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_context.c +++ b/src/gallium/drivers/etnaviv/etnaviv_context.c @@ -109,6 +109,9 @@ etna_context_destroy(struct pipe_context *pctx) if (ctx->pending_resources) _mesa_hash_table_destroy(ctx->pending_resources, NULL); + if (ctx->updated_resources) + _mesa_set_destroy(ctx->updated_resources, NULL); + if (ctx->flush_resources) _mesa_set_destroy(ctx->flush_resources, NULL); @@ -534,6 +537,13 @@ etna_flush(struct pipe_context *pctx, struct pipe_fence_handle **fence, pipe_resource_reference(&prsc, NULL); } _mesa_set_clear(ctx->flush_resources, NULL); + + /* reset shared resources update tracking */ + set_foreach(ctx->updated_resources, entry) { + struct pipe_resource *prsc = (struct pipe_resource *)entry->key; + pipe_resource_reference(&prsc, NULL); + } + _mesa_set_clear(ctx->updated_resources, NULL); } etna_cmd_stream_flush(ctx->stream, ctx->in_fence_fd, @@ -625,6 +635,11 @@ etna_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags) if (!ctx->flush_resources) goto fail; + ctx->updated_resources = _mesa_set_create(NULL, _mesa_hash_pointer, + _mesa_key_pointer_equal); + if (!ctx->updated_resources) + goto fail; + /* context ctxate setup */ ctx->screen = screen; /* need some sane default in case gallium frontends don't set some state: */ diff --git a/src/gallium/drivers/etnaviv/etnaviv_context.h b/src/gallium/drivers/etnaviv/etnaviv_context.h index 874867d7da2..807fc0f14ff 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_context.h +++ b/src/gallium/drivers/etnaviv/etnaviv_context.h @@ -201,6 +201,8 @@ struct etna_context { /* resources that must be flushed implicitly at the context flush time */ struct set *flush_resources; + /* resources that need to be updated after a context flush */ + struct set *updated_resources; bool is_noop; diff --git a/src/gallium/drivers/etnaviv/etnaviv_texture.c b/src/gallium/drivers/etnaviv/etnaviv_texture.c index 1cd06d308ff..0ad354d5667 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_texture.c +++ b/src/gallium/drivers/etnaviv/etnaviv_texture.c @@ -165,6 +165,14 @@ etna_update_sampler_source(struct pipe_sampler_view *view, int num) struct etna_context *ctx = etna_context(view->context); bool enable_sampler_ts = false; + if (base->shared && !_mesa_set_search(ctx->updated_resources, view->texture)) { + for (int i = view->u.tex.first_level; i <= view->u.tex.last_level; i++) + etna_resource_level_mark_changed(&base->levels[i]); + + pipe_reference(NULL, &view->texture->reference); + _mesa_set_add(ctx->updated_resources, view->texture); + } + if (base->render && etna_resource_newer(etna_resource(base->render), base)) from = etna_resource(base->render);