Commit 6060ab7a authored by Vasiliy Telezhnikov's avatar Vasiliy Telezhnikov Committed by Commit Bot

SkiaRenderer: Add missed MakeCurrent calls/checks

This CLs makes sure that GL Context made current inside
SwapBuffers and SetEnableDCOverlays to prevent potential crashes
inside DirectCompositionChildSurfaceWin.

Bug: 1007919
Change-Id: Ib28bd2a72405ea9f11fcbfecea50cecfb4d40760
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1827484Reviewed-by: default avatarJonathan Backer <backer@chromium.org>
Commit-Queue: Vasiliy Telezhnikov <vasilyt@chromium.org>
Cr-Commit-Position: refs/heads/master@{#700397}
parent 6f970dc9
...@@ -251,7 +251,7 @@ class VIZ_SERVICE_EXPORT SkiaOutputSurfaceImpl : public SkiaOutputSurface { ...@@ -251,7 +251,7 @@ class VIZ_SERVICE_EXPORT SkiaOutputSurfaceImpl : public SkiaOutputSurface {
// We defer the draw to the framebuffer until SwapBuffers or CopyOutput // We defer the draw to the framebuffer until SwapBuffers or CopyOutput
// to avoid the expense of posting a task and calling MakeCurrent. // to avoid the expense of posting a task and calling MakeCurrent.
base::OnceClosure deferred_framebuffer_draw_closure_; base::OnceCallback<bool()> deferred_framebuffer_draw_closure_;
base::WeakPtr<SkiaOutputSurfaceImpl> weak_ptr_; base::WeakPtr<SkiaOutputSurfaceImpl> weak_ptr_;
base::WeakPtrFactory<SkiaOutputSurfaceImpl> weak_ptr_factory_{this}; base::WeakPtrFactory<SkiaOutputSurfaceImpl> weak_ptr_factory_{this};
......
...@@ -684,7 +684,7 @@ void SkiaOutputSurfaceImplOnGpu::Reshape( ...@@ -684,7 +684,7 @@ void SkiaOutputSurfaceImplOnGpu::Reshape(
} }
} }
void SkiaOutputSurfaceImplOnGpu::FinishPaintCurrentFrame( bool SkiaOutputSurfaceImplOnGpu::FinishPaintCurrentFrame(
std::unique_ptr<SkDeferredDisplayList> ddl, std::unique_ptr<SkDeferredDisplayList> ddl,
std::unique_ptr<SkDeferredDisplayList> overdraw_ddl, std::unique_ptr<SkDeferredDisplayList> overdraw_ddl,
std::vector<ImageContextImpl*> image_contexts, std::vector<ImageContextImpl*> image_contexts,
...@@ -698,7 +698,7 @@ void SkiaOutputSurfaceImplOnGpu::FinishPaintCurrentFrame( ...@@ -698,7 +698,7 @@ void SkiaOutputSurfaceImplOnGpu::FinishPaintCurrentFrame(
DCHECK(!scoped_output_device_paint_); DCHECK(!scoped_output_device_paint_);
if (!MakeCurrent(true /* need_fbo0 */)) if (!MakeCurrent(true /* need_fbo0 */))
return; return false;
if (draw_rectangle) if (draw_rectangle)
output_device_->SetDrawRectangle(*draw_rectangle); output_device_->SetDrawRectangle(*draw_rectangle);
...@@ -771,7 +771,7 @@ void SkiaOutputSurfaceImplOnGpu::FinishPaintCurrentFrame( ...@@ -771,7 +771,7 @@ void SkiaOutputSurfaceImplOnGpu::FinishPaintCurrentFrame(
scoped_promise_image_access.end_semaphores().empty())) { scoped_promise_image_access.end_semaphores().empty())) {
// TODO(penghuang): handle vulkan device lost. // TODO(penghuang): handle vulkan device lost.
DLOG(ERROR) << "output_sk_surface()->flush() failed."; DLOG(ERROR) << "output_sk_surface()->flush() failed.";
return; return false;
} }
if (output_device_->need_swap_semaphore()) { if (output_device_->need_swap_semaphore()) {
auto& semaphore = scoped_promise_image_access.end_semaphores().back(); auto& semaphore = scoped_promise_image_access.end_semaphores().back();
...@@ -780,6 +780,7 @@ void SkiaOutputSurfaceImplOnGpu::FinishPaintCurrentFrame( ...@@ -780,6 +780,7 @@ void SkiaOutputSurfaceImplOnGpu::FinishPaintCurrentFrame(
} }
} }
ReleaseFenceSyncAndPushTextureUpdates(sync_fence_release); ReleaseFenceSyncAndPushTextureUpdates(sync_fence_release);
return true;
} }
void SkiaOutputSurfaceImplOnGpu::ScheduleOutputSurfaceAsOverlay( void SkiaOutputSurfaceImplOnGpu::ScheduleOutputSurfaceAsOverlay(
...@@ -790,13 +791,15 @@ void SkiaOutputSurfaceImplOnGpu::ScheduleOutputSurfaceAsOverlay( ...@@ -790,13 +791,15 @@ void SkiaOutputSurfaceImplOnGpu::ScheduleOutputSurfaceAsOverlay(
void SkiaOutputSurfaceImplOnGpu::SwapBuffers( void SkiaOutputSurfaceImplOnGpu::SwapBuffers(
OutputSurfaceFrame frame, OutputSurfaceFrame frame,
base::OnceClosure deferred_framebuffer_draw_closure, base::OnceCallback<bool()> deferred_framebuffer_draw_closure,
uint64_t sync_fence_release) { uint64_t sync_fence_release) {
TRACE_EVENT0("viz", "SkiaOutputSurfaceImplOnGpu::SwapBuffers"); TRACE_EVENT0("viz", "SkiaOutputSurfaceImplOnGpu::SwapBuffers");
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
if (deferred_framebuffer_draw_closure) { if (deferred_framebuffer_draw_closure) {
std::move(deferred_framebuffer_draw_closure).Run(); // Returns false if context not set to current, i.e lost
if (!std::move(deferred_framebuffer_draw_closure).Run())
return;
DCHECK(context_state_->IsCurrent(nullptr /* surface */)); DCHECK(context_state_->IsCurrent(nullptr /* surface */));
} else { } else {
if (!MakeCurrent(!dependency_->IsOffscreen() /* need_fbo0 */)) if (!MakeCurrent(!dependency_->IsOffscreen() /* need_fbo0 */))
...@@ -930,7 +933,7 @@ void SkiaOutputSurfaceImplOnGpu::CopyOutput( ...@@ -930,7 +933,7 @@ void SkiaOutputSurfaceImplOnGpu::CopyOutput(
const copy_output::RenderPassGeometry& geometry, const copy_output::RenderPassGeometry& geometry,
const gfx::ColorSpace& color_space, const gfx::ColorSpace& color_space,
std::unique_ptr<CopyOutputRequest> request, std::unique_ptr<CopyOutputRequest> request,
base::OnceClosure deferred_framebuffer_draw_closure) { base::OnceCallback<bool()> deferred_framebuffer_draw_closure) {
TRACE_EVENT0("viz", "SkiaOutputSurfaceImplOnGpu::CopyOutput"); TRACE_EVENT0("viz", "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_);
...@@ -941,7 +944,9 @@ void SkiaOutputSurfaceImplOnGpu::CopyOutput( ...@@ -941,7 +944,9 @@ void SkiaOutputSurfaceImplOnGpu::CopyOutput(
std::move(destroy_after_swap_))); std::move(destroy_after_swap_)));
if (deferred_framebuffer_draw_closure) { if (deferred_framebuffer_draw_closure) {
std::move(deferred_framebuffer_draw_closure).Run(); // returns false if context not set to current, i.e lost
if (!std::move(deferred_framebuffer_draw_closure).Run())
return;
DCHECK(context_state_->IsCurrent(nullptr /* surface */)); DCHECK(context_state_->IsCurrent(nullptr /* surface */));
} else { } else {
if (!MakeCurrent(true /* need_fbo0 */)) if (!MakeCurrent(true /* need_fbo0 */))
...@@ -1197,6 +1202,8 @@ void SkiaOutputSurfaceImplOnGpu::ReleaseImageContexts( ...@@ -1197,6 +1202,8 @@ void SkiaOutputSurfaceImplOnGpu::ReleaseImageContexts(
} }
void SkiaOutputSurfaceImplOnGpu::SetEnableDCLayers(bool enable) { void SkiaOutputSurfaceImplOnGpu::SetEnableDCLayers(bool enable) {
if (!MakeCurrent(false /* need_fbo0 */))
return;
output_device_->SetEnableDCLayers(enable); output_device_->SetEnableDCLayers(enable);
} }
......
...@@ -118,7 +118,7 @@ class SkiaOutputSurfaceImplOnGpu : public gpu::ImageTransportSurfaceDelegate { ...@@ -118,7 +118,7 @@ class SkiaOutputSurfaceImplOnGpu : public gpu::ImageTransportSurfaceDelegate {
gfx::OverlayTransform transform, gfx::OverlayTransform transform,
SkSurfaceCharacterization* characterization, SkSurfaceCharacterization* characterization,
base::WaitableEvent* event); base::WaitableEvent* event);
void FinishPaintCurrentFrame( bool FinishPaintCurrentFrame(
std::unique_ptr<SkDeferredDisplayList> ddl, std::unique_ptr<SkDeferredDisplayList> ddl,
std::unique_ptr<SkDeferredDisplayList> overdraw_ddl, std::unique_ptr<SkDeferredDisplayList> overdraw_ddl,
std::vector<ImageContextImpl*> image_contexts, std::vector<ImageContextImpl*> image_contexts,
...@@ -129,7 +129,7 @@ class SkiaOutputSurfaceImplOnGpu : public gpu::ImageTransportSurfaceDelegate { ...@@ -129,7 +129,7 @@ class SkiaOutputSurfaceImplOnGpu : public gpu::ImageTransportSurfaceDelegate {
void ScheduleOutputSurfaceAsOverlay( void ScheduleOutputSurfaceAsOverlay(
const OverlayProcessor::OutputSurfaceOverlayPlane& output_surface_plane); const OverlayProcessor::OutputSurfaceOverlayPlane& output_surface_plane);
void SwapBuffers(OutputSurfaceFrame frame, void SwapBuffers(OutputSurfaceFrame frame,
base::OnceClosure deferred_framebuffer_draw_closure, base::OnceCallback<bool()> deferred_framebuffer_draw_closure,
uint64_t sync_fence_release); uint64_t sync_fence_release);
void EnsureBackbuffer() { output_device_->EnsureBackbuffer(); } void EnsureBackbuffer() { output_device_->EnsureBackbuffer(); }
void DiscardBackbuffer() { output_device_->DiscardBackbuffer(); } void DiscardBackbuffer() { output_device_->DiscardBackbuffer(); }
...@@ -144,7 +144,7 @@ class SkiaOutputSurfaceImplOnGpu : public gpu::ImageTransportSurfaceDelegate { ...@@ -144,7 +144,7 @@ class SkiaOutputSurfaceImplOnGpu : public gpu::ImageTransportSurfaceDelegate {
const copy_output::RenderPassGeometry& geometry, const copy_output::RenderPassGeometry& geometry,
const gfx::ColorSpace& color_space, const gfx::ColorSpace& color_space,
std::unique_ptr<CopyOutputRequest> request, std::unique_ptr<CopyOutputRequest> request,
base::OnceClosure deferred_framebuffer_draw_closure); base::OnceCallback<bool()> deferred_framebuffer_draw_closure);
void BeginAccessImages(const std::vector<ImageContextImpl*>& image_contexts, void BeginAccessImages(const std::vector<ImageContextImpl*>& image_contexts,
std::vector<GrBackendSemaphore>* begin_semaphores, std::vector<GrBackendSemaphore>* begin_semaphores,
......
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