From 89aa36359328ea48fa29be8dd439dd87043eaa03 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Wed, 29 Mar 2023 16:41:44 -0400 Subject: [PATCH] zink: block oom flushes during unordered blits this is broken beyond space and time Part-of: --- src/gallium/drivers/zink/zink_context.c | 3 ++- src/gallium/drivers/zink/zink_draw.cpp | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index 144ce2e7ea0..6518c3b271c 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -3172,6 +3172,7 @@ static void flush_batch(struct zink_context *ctx, bool sync) { struct zink_batch *batch = &ctx->batch; + assert(!ctx->unordered_blitting); if (ctx->clears_enabled) /* start rp to do all the clears */ zink_batch_rp(ctx); @@ -3502,7 +3503,7 @@ zink_set_framebuffer_state(struct pipe_context *pctx, ctx->gfx_pipeline_state.rast_samples = rast_samples; /* this is an ideal time to oom flush since it won't split a renderpass */ - if (ctx->oom_flush) + if (ctx->oom_flush && !ctx->unordered_blitting) flush_batch(ctx, false); else update_layered_rendering_state(ctx); diff --git a/src/gallium/drivers/zink/zink_draw.cpp b/src/gallium/drivers/zink/zink_draw.cpp index f4efa6389a0..7d39a94c7f5 100644 --- a/src/gallium/drivers/zink/zink_draw.cpp +++ b/src/gallium/drivers/zink/zink_draw.cpp @@ -906,7 +906,7 @@ zink_draw(struct pipe_context *pctx, batch->last_was_compute = false; ctx->batch.work_count = work_count; /* flush if there's >100k draws */ - if (unlikely(work_count >= 30000) || ctx->oom_flush) + if (!ctx->unordered_blitting && (unlikely(work_count >= 30000) || ctx->oom_flush)) pctx->flush(pctx, NULL, 0); } @@ -1079,7 +1079,7 @@ zink_launch_grid(struct pipe_context *pctx, const struct pipe_grid_info *info) batch->has_work = true; batch->last_was_compute = true; /* flush if there's >100k computes */ - if (unlikely(ctx->batch.work_count >= 30000) || ctx->oom_flush) + if (!ctx->unordered_blitting && (unlikely(ctx->batch.work_count >= 30000) || ctx->oom_flush)) pctx->flush(pctx, NULL, 0); }