Commit b6a63e7a authored by kylechar's avatar kylechar Committed by Commit Bot

Make context current before checking skia readback

SkiaOutputSurfaceImplOnGpu needs to make the GL context current before
asking skia to check readback completion.

Also avoid checking for completion if there are no readback requests
pending and immediately after issuing the async request.

Bug: 1040643
Change-Id: Ia78363c476dc697ce35dce24fab881e2a60c264e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2025644Reviewed-by: default avatarJonathan Backer <backer@chromium.org>
Commit-Queue: kylechar <kylechar@chromium.org>
Cr-Commit-Position: refs/heads/master@{#736097}
parent 154a8c83
...@@ -1271,7 +1271,7 @@ void SkiaOutputSurfaceImplOnGpu::CopyOutput( ...@@ -1271,7 +1271,7 @@ void SkiaOutputSurfaceImplOnGpu::CopyOutput(
surface->asyncRescaleAndReadPixelsYUV420( surface->asyncRescaleAndReadPixelsYUV420(
kRec709_SkYUVColorSpace, SkColorSpace::MakeSRGB(), src_rect, kRec709_SkYUVColorSpace, SkColorSpace::MakeSRGB(), src_rect,
{geometry.result_bounds.width(), geometry.result_bounds.height()}, {geometry.result_bounds.width(), geometry.result_bounds.height()},
SkSurface::RescaleGamma::kSrc, filter_quality, OnYUVReadbackDone, SkSurface::RescaleGamma::kSrc, filter_quality, &OnYUVReadbackDone,
context.release()); context.release());
} else if (request->result_format() == } else if (request->result_format() ==
CopyOutputRequest::ResultFormat::RGBA_BITMAP) { CopyOutputRequest::ResultFormat::RGBA_BITMAP) {
...@@ -1286,11 +1286,11 @@ void SkiaOutputSurfaceImplOnGpu::CopyOutput( ...@@ -1286,11 +1286,11 @@ void SkiaOutputSurfaceImplOnGpu::CopyOutput(
std::move(request), geometry.result_bounds, color_space, weak_ptr_); std::move(request), geometry.result_bounds, color_space, weak_ptr_);
surface->asyncRescaleAndReadPixels( surface->asyncRescaleAndReadPixels(
dst_info, src_rect, SkSurface::RescaleGamma::kSrc, filter_quality, dst_info, src_rect, SkSurface::RescaleGamma::kSrc, filter_quality,
OnRGBAReadbackDone, context.release()); &OnRGBAReadbackDone, context.release());
} else { } else {
NOTIMPLEMENTED(); // ResultFormat::RGBA_TEXTURE NOTIMPLEMENTED(); // ResultFormat::RGBA_TEXTURE
} }
CheckReadbackCompletion(); ScheduleCheckReadbackCompletion();
} }
gpu::DecoderContext* SkiaOutputSurfaceImplOnGpu::decoder() { gpu::DecoderContext* SkiaOutputSurfaceImplOnGpu::decoder() {
...@@ -1697,23 +1697,27 @@ void SkiaOutputSurfaceImplOnGpu::MarkContextLost() { ...@@ -1697,23 +1697,27 @@ void SkiaOutputSurfaceImplOnGpu::MarkContextLost() {
} }
} }
void SkiaOutputSurfaceImplOnGpu::CheckReadbackCompletion() { void SkiaOutputSurfaceImplOnGpu::ScheduleCheckReadbackCompletion() {
gr_context()->checkAsyncWorkCompletion();
if (num_readbacks_pending_ > 0 && !readback_poll_pending_) { if (num_readbacks_pending_ > 0 && !readback_poll_pending_) {
base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
FROM_HERE, FROM_HERE,
base::BindOnce( base::BindOnce(&SkiaOutputSurfaceImplOnGpu::CheckReadbackCompletion,
[](base::WeakPtr<SkiaOutputSurfaceImplOnGpu> impl_on_gpu) {
if (!impl_on_gpu)
return;
impl_on_gpu->readback_poll_pending_ = false;
impl_on_gpu->CheckReadbackCompletion();
},
weak_ptr_factory_.GetWeakPtr()), weak_ptr_factory_.GetWeakPtr()),
kReadbackPollingInterval); kReadbackPollingInterval);
readback_poll_pending_ = true; readback_poll_pending_ = true;
} }
} }
void SkiaOutputSurfaceImplOnGpu::CheckReadbackCompletion() {
readback_poll_pending_ = false;
// If there are no pending readback requests or we can't make the context
// current then exit. There is no thing to do here.
if (num_readbacks_pending_ == 0 || !MakeCurrent(/*need_fbo0=*/false))
return;
gr_context()->checkAsyncWorkCompletion();
ScheduleCheckReadbackCompletion();
}
} // namespace viz } // namespace viz
...@@ -252,6 +252,14 @@ class SkiaOutputSurfaceImplOnGpu : public gpu::ImageTransportSurfaceDelegate, ...@@ -252,6 +252,14 @@ class SkiaOutputSurfaceImplOnGpu : public gpu::ImageTransportSurfaceDelegate,
return scoped_output_device_paint_->sk_surface(); return scoped_output_device_paint_->sk_surface();
} }
// Schedules a task to check if any skia readback requests have completed
// after a short delay. Will not schedule a task if there is already a
// scheduled task or no readback requests are pending.
void ScheduleCheckReadbackCompletion();
// Checks if any skia readback requests have completed. If there are still
// pending readback requests after checking then it will reschedule itself
// after a short delay.
void CheckReadbackCompletion(); void CheckReadbackCompletion();
class ReleaseCurrent { class ReleaseCurrent {
......
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