Commit 691227a2 authored by Jonathan Backer's avatar Jonathan Backer Committed by Commit Bot

Defer DDL destruction until after SwapBuffers

This reordering allows us to issue SwapBuffers a little bit sooner
by moving DDL destructor after.

Bug: 974359
Change-Id: Iba9a81815cf1166d3d31bd9312adc8e0834bf512
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1797175Reviewed-by: default avatarVasiliy Telezhnikov <vasilyt@chromium.org>
Commit-Queue: Jonathan Backer <backer@chromium.org>
Cr-Commit-Position: refs/heads/master@{#695762}
parent fd797e58
......@@ -725,13 +725,13 @@ void SkiaOutputSurfaceImplOnGpu::FinishPaintCurrentFrame(
if (!output_sk_surface()->draw(ddl.get()))
DLOG(ERROR) << "output_sk_surface()->draw() failed.";
ddl = nullptr;
destroy_after_swap_.emplace_back(std::move(ddl));
if (overdraw_ddl) {
sk_sp<SkSurface> overdraw_surface = SkSurface::MakeRenderTarget(
gr_context(), overdraw_ddl->characterization(), SkBudgeted::kNo);
overdraw_surface->draw(overdraw_ddl.get());
overdraw_ddl = nullptr;
destroy_after_swap_.emplace_back(std::move(overdraw_ddl));
SkPaint paint;
sk_sp<SkImage> overdraw_image = overdraw_surface->makeImageSnapshot();
......@@ -833,6 +833,8 @@ void SkiaOutputSurfaceImplOnGpu::SwapBuffers(
output_device_->SwapBuffers(buffer_presented_callback_,
std::move(frame.latency_info));
}
destroy_after_swap_.clear();
}
void SkiaOutputSurfaceImplOnGpu::FinishPaintRenderPass(
......@@ -877,6 +879,8 @@ void SkiaOutputSurfaceImplOnGpu::FinishPaintRenderPass(
DCHECK(result);
}
offscreen.surface()->draw(ddl.get());
destroy_after_swap_.emplace_back(std::move(ddl));
GrFlushInfo flush_info = {
.fFlags = kNone_GrFlushFlags,
.fNumSemaphores = scoped_promise_image_access.end_semaphores().size(),
......@@ -921,6 +925,11 @@ void SkiaOutputSurfaceImplOnGpu::CopyOutput(
// TODO(crbug.com/898595): Do this on the GPU instead of CPU with Vulkan.
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
// Clear |destroy_after_swap_| if we CopyOutput without SwapBuffers.
base::ScopedClosureRunner cleanup(
base::BindOnce([](std::vector<std::unique_ptr<SkDeferredDisplayList>>) {},
std::move(destroy_after_swap_)));
if (deferred_framebuffer_draw_closure) {
std::move(deferred_framebuffer_draw_closure).Run();
DCHECK(context_state_->IsCurrent(nullptr /* surface */));
......
......@@ -263,6 +263,9 @@ class SkiaOutputSurfaceImplOnGpu : public gpu::ImageTransportSurfaceDelegate {
gl::GLApi* api_ = nullptr;
bool supports_alpha_ = false;
// Micro-optimization to get to issuing GPU SwapBuffers as soon as possible.
std::vector<std::unique_ptr<SkDeferredDisplayList>> destroy_after_swap_;
THREAD_CHECKER(thread_checker_);
base::WeakPtr<SkiaOutputSurfaceImplOnGpu> weak_ptr_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment