diff --git a/src/gallium/drivers/zink/zink_batch.c b/src/gallium/drivers/zink/zink_batch.c index 5b4a76c5162..807b4ac193b 100644 --- a/src/gallium/drivers/zink/zink_batch.c +++ b/src/gallium/drivers/zink/zink_batch.c @@ -881,6 +881,7 @@ zink_end_batch(struct zink_context *ctx) if (sem) util_dynarray_append(&ctx->bs->signal_semaphores, VkSemaphore, sem); } + bs->has_work = true; } if (screen->threaded_submit) { diff --git a/src/gallium/drivers/zink/zink_clear.c b/src/gallium/drivers/zink/zink_clear.c index 754b37e63ae..d65eaf4df76 100644 --- a/src/gallium/drivers/zink/zink_clear.c +++ b/src/gallium/drivers/zink/zink_clear.c @@ -108,6 +108,7 @@ clear_in_rp(struct pipe_context *pctx, cr.layerCount = util_framebuffer_get_num_layers(fb); assert(ctx->in_rp); VKCTX(CmdClearAttachments)(ctx->bs->cmdbuf, num_attachments, attachments, 1, &cr); + ctx->bs->has_work = true; /* Rendering within a subpass containing a feedback loop creates a data race, except in the following cases: diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index 056bcd2a002..30cfe02038b 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -3026,6 +3026,10 @@ zink_batch_rp(struct zink_context *ctx) else clear_buffers = begin_rendering(ctx); assert(!ctx->rp_changed); + if (ctx->unordered_blitting) + ctx->bs->has_reordered_work = true; + else + ctx->bs->has_work = true; /* update the render-passes HUD query */ ctx->hud.render_passes++; @@ -4071,6 +4075,7 @@ zink_texture_barrier(struct pipe_context *pctx, unsigned flags) 0, NULL ); } + ctx->bs->has_work = true; } static inline void @@ -4083,6 +4088,7 @@ mem_barrier(struct zink_context *ctx, VkPipelineStageFlags src_stage, VkPipeline mb.dstAccessMask = dst; zink_batch_no_rp(ctx); VKCTX(CmdPipelineBarrier)(ctx->bs->cmdbuf, src_stage, dst_stage, 0, 1, &mb, 0, NULL, 0, NULL); + ctx->bs->has_work = true; } void @@ -5231,6 +5237,7 @@ zink_flush_dgc(struct zink_context *ctx) pipe_resource_reference(&pres, NULL); } + ctx->bs->has_work = true; util_dynarray_clear(&ctx->dgc.pipelines); util_dynarray_clear(&ctx->dgc.tokens); ctx->dgc.valid = false; diff --git a/src/gallium/drivers/zink/zink_draw.cpp b/src/gallium/drivers/zink/zink_draw.cpp index d9513e8156b..46bbb036fa6 100644 --- a/src/gallium/drivers/zink/zink_draw.cpp +++ b/src/gallium/drivers/zink/zink_draw.cpp @@ -1118,7 +1118,6 @@ zink_draw(struct pipe_context *pctx, VKCTX(CmdEndTransformFeedbackEXT)(bs->cmdbuf, 0, ctx->num_so_targets, counter_buffers, counter_buffer_offsets); } - bs->has_work = true; ctx->last_work_was_compute = false; ctx->work_count = work_count; /* flush if there's >100k draws */ diff --git a/src/gallium/drivers/zink/zink_query.c b/src/gallium/drivers/zink/zink_query.c index 28802ce6d88..da864f6f7e6 100644 --- a/src/gallium/drivers/zink/zink_query.c +++ b/src/gallium/drivers/zink/zink_query.c @@ -775,6 +775,7 @@ copy_pool_results_to_buffer(struct zink_context *ctx, struct zink_query *query, util_range_add(&res->base.b, &res->valid_buffer_range, offset, offset + result_size); assert(query_id < NUM_QUERIES); res->obj->unordered_read = res->obj->unordered_write = false; + ctx->bs->has_work = true; VKCTX(CmdCopyQueryPoolResults)(ctx->bs->cmdbuf, pool, query_id, num_results, res->obj->buffer, offset, base_result_size, flags); zink_cmd_debug_marker_end(ctx, ctx->bs->cmdbuf, marker); @@ -1089,6 +1090,7 @@ zink_end_query(struct pipe_context *pctx, struct zink_query_start *start = util_dynarray_top_ptr(&query->starts, struct zink_query_start); VKCTX(CmdWriteTimestamp)(ctx->bs->cmdbuf, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, start->vkq[0]->pool->query_pool, start->vkq[0]->query_id); + ctx->bs->has_work = true; zink_batch_usage_set(&query->batch_uses, ctx->bs); _mesa_set_add(&ctx->bs->active_queries, query); query->needs_update = true; @@ -1328,6 +1330,7 @@ zink_render_condition(struct pipe_context *pctx, VkQueryResultFlagBits flags = 0; zink_flush_dgc_if_enabled(ctx); + ctx->bs->has_work = true; if (query == NULL) { /* force conditional clears if they exist */ if (ctx->clears_enabled && !ctx->in_rp)