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.
This commit is contained in:
Jason Simmons 2016-02-01 10:33:23 -08:00
parent 20b8d0bdc8
commit 052d65cc14
5 changed files with 13 additions and 0 deletions

View File

@ -49,4 +49,8 @@ PaintContext::ScopedFrame::~ScopedFrame() {
PaintContext::~PaintContext() {
}
void PaintContext::OnGrContextDestroyed() {
raster_cache_.Clear();
}
} // namespace flow

View File

@ -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_; }

View File

@ -112,4 +112,8 @@ void RasterCache::SweepAfterFrame() {
cache_.erase(it);
}
void RasterCache::Clear() {
cache_.clear();
}
} // namespace flow

View File

@ -25,6 +25,8 @@ class RasterCache {
GrContext* context, SkPicture* picture, const SkMatrix& ctm);
void SweepAfterFrame();
void Clear();
private:
struct Entry {
Entry();

View File

@ -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;
}