etnaviv: don't flush implicit flush resources when forced

Resources only need to become visible when the application requested
the context flush, so we can safely skip the flushing when the flush
is forced internally by running out of commandstream space.

Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
Reviewed-by: Christian Gmeiner <christian.gmeiner@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23329>
This commit is contained in:
Lucas Stach
2023-05-31 00:18:57 +02:00
committed by Marge Bot
parent fbd37e6168
commit 6611866246
+18 -9
View File
@@ -508,7 +508,7 @@ etna_reset_gpu_state(struct etna_context *ctx)
static void
etna_flush(struct pipe_context *pctx, struct pipe_fence_handle **fence,
enum pipe_flush_flags flags)
enum pipe_flush_flags flags, bool internal)
{
struct etna_context *ctx = etna_context(pctx);
int out_fence_fd = -1;
@@ -516,14 +516,16 @@ etna_flush(struct pipe_context *pctx, struct pipe_fence_handle **fence,
list_for_each_entry(struct etna_acc_query, aq, &ctx->active_acc_queries, node)
etna_acc_query_suspend(aq, ctx);
/* flush all resources that need an implicit flush */
set_foreach(ctx->flush_resources, entry) {
struct pipe_resource *prsc = (struct pipe_resource *)entry->key;
if (!internal) {
/* flush all resources that need an implicit flush */
set_foreach(ctx->flush_resources, entry) {
struct pipe_resource *prsc = (struct pipe_resource *)entry->key;
pctx->flush_resource(pctx, prsc);
pipe_resource_reference(&prsc, NULL);
pctx->flush_resource(pctx, prsc);
pipe_resource_reference(&prsc, NULL);
}
_mesa_set_clear(ctx->flush_resources, NULL);
}
_mesa_set_clear(ctx->flush_resources, NULL);
etna_cmd_stream_flush(ctx->stream, ctx->in_fence_fd,
(flags & PIPE_FLUSH_FENCE_FD) ? &out_fence_fd : NULL,
@@ -540,12 +542,19 @@ etna_flush(struct pipe_context *pctx, struct pipe_fence_handle **fence,
etna_reset_gpu_state(ctx);
}
static void
etna_context_flush(struct pipe_context *pctx, struct pipe_fence_handle **fence,
enum pipe_flush_flags flags)
{
etna_flush(pctx, fence, flags, false);
}
static void
etna_context_force_flush(struct etna_cmd_stream *stream, void *priv)
{
struct pipe_context *pctx = priv;
pctx->flush(pctx, NULL, 0);
etna_flush(pctx, NULL, 0, true);
/* update derived states as the context is now fully dirty */
etna_state_update(etna_context(pctx));
@@ -619,7 +628,7 @@ etna_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags)
pctx->destroy = etna_context_destroy;
pctx->draw_vbo = etna_draw_vbo;
pctx->flush = etna_flush;
pctx->flush = etna_context_flush;
pctx->set_debug_callback = etna_set_debug_callback;
pctx->create_fence_fd = etna_create_fence_fd;
pctx->fence_server_sync = etna_fence_server_sync;