From 052d65cc1411a8c466efa17034c8f15a39401665 Mon Sep 17 00:00:00 2001 From: Jason Simmons Date: Mon, 1 Feb 2016 10:33:23 -0800 Subject: [PATCH] Clear the Flow raster cache when a GrContext is destroyed After an application is suspended and the GrContext associated with the Flutter view is destroyed, the raster cache still contains images tied to the defunct context. The SkyShell process will crash if these images are used after the application resumes. --- flow/paint_context.cc | 4 ++++ flow/paint_context.h | 2 ++ flow/raster_cache.cc | 4 ++++ flow/raster_cache.h | 2 ++ sky/shell/gpu/direct/rasterizer_direct.cc | 1 + 5 files changed, 13 insertions(+) diff --git a/flow/paint_context.cc b/flow/paint_context.cc index ffa4b7c5f6b..0cc2e992322 100644 --- a/flow/paint_context.cc +++ b/flow/paint_context.cc @@ -49,4 +49,8 @@ PaintContext::ScopedFrame::~ScopedFrame() { PaintContext::~PaintContext() { } +void PaintContext::OnGrContextDestroyed() { + raster_cache_.Clear(); +} + } // namespace flow diff --git a/flow/paint_context.h b/flow/paint_context.h index e0fb8faded7..3177050d2c7 100644 --- a/flow/paint_context.h +++ b/flow/paint_context.h @@ -51,6 +51,8 @@ class PaintContext { SkCanvas& canvas, bool instrumentation_enabled = true); + void OnGrContextDestroyed(); + RasterCache& raster_cache() { return raster_cache_; } const instrumentation::Counter& frame_count() const { return frame_count_; } const instrumentation::Stopwatch& frame_time() const { return frame_time_; } diff --git a/flow/raster_cache.cc b/flow/raster_cache.cc index 4a2b71f343a..0e1f7da0e2c 100644 --- a/flow/raster_cache.cc +++ b/flow/raster_cache.cc @@ -112,4 +112,8 @@ void RasterCache::SweepAfterFrame() { cache_.erase(it); } +void RasterCache::Clear() { + cache_.clear(); +} + } // namespace flow diff --git a/flow/raster_cache.h b/flow/raster_cache.h index 884794f9810..633339f1239 100644 --- a/flow/raster_cache.h +++ b/flow/raster_cache.h @@ -25,6 +25,8 @@ class RasterCache { GrContext* context, SkPicture* picture, const SkMatrix& ctm); void SweepAfterFrame(); + void Clear(); + private: struct Entry { Entry(); diff --git a/sky/shell/gpu/direct/rasterizer_direct.cc b/sky/shell/gpu/direct/rasterizer_direct.cc index 2ab63b9f936..40438db8857 100644 --- a/sky/shell/gpu/direct/rasterizer_direct.cc +++ b/sky/shell/gpu/direct/rasterizer_direct.cc @@ -130,6 +130,7 @@ void RasterizerDirect::Draw(uint64_t layer_tree_ptr, void RasterizerDirect::OnOutputSurfaceDestroyed() { if (context_) { CHECK(context_->MakeCurrent(surface_.get())); + paint_context_.OnGrContextDestroyed(); ganesh_canvas_.SetGrGLInterface(nullptr); context_ = nullptr; }