diff --git a/video/out/vo_gpu_next.c b/video/out/vo_gpu_next.c index 72c9cdb8ee..d2d2e9d9f5 100644 --- a/video/out/vo_gpu_next.c +++ b/video/out/vo_gpu_next.c @@ -577,6 +577,12 @@ static void draw_frame(struct vo *vo, struct vo_frame *frame) p->last_id = id; } + // Doesn't draw anything. Only checks for visibility. + struct ra_swapchain *sw = p->ra_ctx->swapchain; + bool should_draw = sw->fns->start_frame(sw, NULL); + if (!should_draw) + return; + struct pl_swapchain_frame swframe; if (!pl_swapchain_start_frame(p->sw, &swframe)) return; diff --git a/video/out/vulkan/context.c b/video/out/vulkan/context.c index bcc52f46f3..216e653c82 100644 --- a/video/out/vulkan/context.c +++ b/video/out/vulkan/context.c @@ -239,11 +239,15 @@ static bool start_frame(struct ra_swapchain *sw, struct ra_fbo *out_fbo) { struct priv *p = sw->priv; struct pl_swapchain_frame frame; + bool visible = true; if (p->params.check_visible) visible = p->params.check_visible(sw->ctx); - if (!visible) - return false; + + // If out_fbo is NULL, this was called from vo_gpu_next. Bail out. + if (out_fbo == NULL || !visible) + return visible; + if (!pl_swapchain_start_frame(p->vk->swapchain, &frame)) return false; if (!mppl_wrap_tex(sw->ctx->ra, frame.fbo, &p->proxy_tex))