if (!can_do_blit(info))
return false;
- fd_fence_ref(&ctx->last_fence, NULL);
-
batch = fd_bc_alloc_batch(&ctx->screen->batch_cache, ctx, true);
fd6_emit_restore(batch, batch->draw);
fd_screen_unlock(ctx->screen);
+ /* Clearing last_fence must come after the batch dependency tracking
+ * (resource_read()/resource_write()), as that can trigger a flush,
+ * re-populating last_fence
+ */
+ fd_fence_ref(&ctx->last_fence, NULL);
+
fd_batch_set_stage(batch, FD_STAGE_BLIT);
fd_log_stream(batch, stream, util_dump_blit_info(stream, info));
return;
}
- fd_fence_ref(&ctx->last_fence, NULL);
-
/* Upload a user index buffer. */
struct pipe_resource *indexbuf = NULL;
unsigned index_offset = 0;
/* and any buffers used, need to be resolved: */
batch->resolve |= buffers;
+ /* Clearing last_fence must come after the batch dependency tracking
+ * (resource_read()/resource_written()), as that can trigger a flush,
+ * re-populating last_fence
+ */
+ fd_fence_ref(&ctx->last_fence, NULL);
+
DBG("%p: %x %ux%u num_draws=%u (%s/%s)", batch, buffers,
pfb->width, pfb->height, batch->num_draws,
util_format_short_name(pipe_surface_format(pfb->cbufs[0])),
if (!fd_render_condition_check(pctx))
return;
- fd_fence_ref(&ctx->last_fence, NULL);
-
if (ctx->in_discard_blit) {
fd_batch_reset(batch);
fd_context_all_dirty(ctx);
fd_screen_unlock(ctx->screen);
+ /* Clearing last_fence must come after the batch dependency tracking
+ * (resource_read()/resource_written()), as that can trigger a flush,
+ * re-populating last_fence
+ */
+ fd_fence_ref(&ctx->last_fence, NULL);
+
DBG("%p: %x %ux%u depth=%f, stencil=%u (%s/%s)", batch, buffers,
pfb->width, pfb->height, depth, stencil,
util_format_short_name(pipe_surface_format(pfb->cbufs[0])),