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( ...@@ -725,13 +725,13 @@ void SkiaOutputSurfaceImplOnGpu::FinishPaintCurrentFrame(
if (!output_sk_surface()->draw(ddl.get())) if (!output_sk_surface()->draw(ddl.get()))
DLOG(ERROR) << "output_sk_surface()->draw() failed."; DLOG(ERROR) << "output_sk_surface()->draw() failed.";
ddl = nullptr; destroy_after_swap_.emplace_back(std::move(ddl));
if (overdraw_ddl) { if (overdraw_ddl) {
sk_sp<SkSurface> overdraw_surface = SkSurface::MakeRenderTarget( sk_sp<SkSurface> overdraw_surface = SkSurface::MakeRenderTarget(
gr_context(), overdraw_ddl->characterization(), SkBudgeted::kNo); gr_context(), overdraw_ddl->characterization(), SkBudgeted::kNo);
overdraw_surface->draw(overdraw_ddl.get()); overdraw_surface->draw(overdraw_ddl.get());
overdraw_ddl = nullptr; destroy_after_swap_.emplace_back(std::move(overdraw_ddl));
SkPaint paint; SkPaint paint;
sk_sp<SkImage> overdraw_image = overdraw_surface->makeImageSnapshot(); sk_sp<SkImage> overdraw_image = overdraw_surface->makeImageSnapshot();
...@@ -833,6 +833,8 @@ void SkiaOutputSurfaceImplOnGpu::SwapBuffers( ...@@ -833,6 +833,8 @@ void SkiaOutputSurfaceImplOnGpu::SwapBuffers(
output_device_->SwapBuffers(buffer_presented_callback_, output_device_->SwapBuffers(buffer_presented_callback_,
std::move(frame.latency_info)); std::move(frame.latency_info));
} }
destroy_after_swap_.clear();
} }
void SkiaOutputSurfaceImplOnGpu::FinishPaintRenderPass( void SkiaOutputSurfaceImplOnGpu::FinishPaintRenderPass(
...@@ -877,6 +879,8 @@ void SkiaOutputSurfaceImplOnGpu::FinishPaintRenderPass( ...@@ -877,6 +879,8 @@ void SkiaOutputSurfaceImplOnGpu::FinishPaintRenderPass(
DCHECK(result); DCHECK(result);
} }
offscreen.surface()->draw(ddl.get()); offscreen.surface()->draw(ddl.get());
destroy_after_swap_.emplace_back(std::move(ddl));
GrFlushInfo flush_info = { GrFlushInfo flush_info = {
.fFlags = kNone_GrFlushFlags, .fFlags = kNone_GrFlushFlags,
.fNumSemaphores = scoped_promise_image_access.end_semaphores().size(), .fNumSemaphores = scoped_promise_image_access.end_semaphores().size(),
...@@ -921,6 +925,11 @@ void SkiaOutputSurfaceImplOnGpu::CopyOutput( ...@@ -921,6 +925,11 @@ void SkiaOutputSurfaceImplOnGpu::CopyOutput(
// TODO(crbug.com/898595): Do this on the GPU instead of CPU with Vulkan. // TODO(crbug.com/898595): Do this on the GPU instead of CPU with Vulkan.
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); 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) { if (deferred_framebuffer_draw_closure) {
std::move(deferred_framebuffer_draw_closure).Run(); std::move(deferred_framebuffer_draw_closure).Run();
DCHECK(context_state_->IsCurrent(nullptr /* surface */)); DCHECK(context_state_->IsCurrent(nullptr /* surface */));
......
...@@ -263,6 +263,9 @@ class SkiaOutputSurfaceImplOnGpu : public gpu::ImageTransportSurfaceDelegate { ...@@ -263,6 +263,9 @@ class SkiaOutputSurfaceImplOnGpu : public gpu::ImageTransportSurfaceDelegate {
gl::GLApi* api_ = nullptr; gl::GLApi* api_ = nullptr;
bool supports_alpha_ = false; 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_); THREAD_CHECKER(thread_checker_);
base::WeakPtr<SkiaOutputSurfaceImplOnGpu> weak_ptr_; 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