diff --git a/sky/shell/gpu/direct/ganesh_canvas.cc b/sky/shell/gpu/direct/ganesh_canvas.cc index 2a3c2a4df93e73a27d048c1390a818942854ae50..399325c01fb196160967100426c04f665d14faea 100644 --- a/sky/shell/gpu/direct/ganesh_canvas.cc +++ b/sky/shell/gpu/direct/ganesh_canvas.cc @@ -27,14 +27,18 @@ GaneshCanvas::GaneshCanvas() { GaneshCanvas::~GaneshCanvas() { } -void GaneshCanvas::SetupGrGLInterface() { +bool GaneshCanvas::SetupGrGLInterface() { sk_surface_ = nullptr; gr_context_ = skia::AdoptRef(GrContext::Create( kOpenGL_GrBackend, reinterpret_cast(GrGLCreateNativeInterface()))); - DCHECK(gr_context_); + + if (!gr_context_) + return false; + gr_context_->setResourceCacheLimits(kMaxGaneshResourceCacheCount, kMaxGaneshResourceCacheBytes); + return true; } bool GaneshCanvas::SelectPixelConfig(GrPixelConfig* config) { diff --git a/sky/shell/gpu/direct/ganesh_canvas.h b/sky/shell/gpu/direct/ganesh_canvas.h index 16c652c539ac22376090bdfaa3298d3ee7c872e9..e4537dd2280b02f33de4e1d431c4d7cf2a0c09b0 100644 --- a/sky/shell/gpu/direct/ganesh_canvas.h +++ b/sky/shell/gpu/direct/ganesh_canvas.h @@ -21,7 +21,7 @@ class GaneshCanvas { GaneshCanvas(); ~GaneshCanvas(); - void SetupGrGLInterface(); + bool SetupGrGLInterface(); SkCanvas* GetCanvas(int32_t fbo, const SkISize& size); diff --git a/sky/shell/gpu/direct/rasterizer_direct.cc b/sky/shell/gpu/direct/rasterizer_direct.cc index 242b58004cc1b79e857f0cedf21249095f1e0522..cecb6a8c241475315b1ae89047aa3ba96821aa88 100644 --- a/sky/shell/gpu/direct/rasterizer_direct.cc +++ b/sky/shell/gpu/direct/rasterizer_direct.cc @@ -52,12 +52,19 @@ void RasterizerDirect::Setup(PlatformView* platform_view, // The context needs to be made current before the GrGL interface can be // setup. bool success = platform_view->ContextMakeCurrent(); + if (success) { + success = ganesh_canvas_.SetupGrGLInterface(); + if (!success) + LOG(ERROR) << "Could not create the GL interface"; + } else { + LOG(ERROR) << "Could not make the context current for initial GL setup"; + } - CHECK(success) << "Could not make the context current for initial GL setup"; - - ganesh_canvas_.SetupGrGLInterface(); - - platform_view_ = platform_view; + if (success) { + platform_view_ = platform_view; + } else { + LOG(ERROR) << "WARNING: Flutter will be unable to render to the display"; + } continuation.Run(); @@ -80,6 +87,11 @@ void RasterizerDirect::Draw(uint64_t layer_tree_ptr, const DrawCallback& callback) { TRACE_EVENT0("flutter", "RasterizerDirect::Draw"); + if (platform_view_ == nullptr) { + callback.Run(); + return; + } + std::unique_ptr layer_tree( reinterpret_cast(layer_tree_ptr)); @@ -88,8 +100,7 @@ void RasterizerDirect::Draw(uint64_t layer_tree_ptr, platform_view_->Resize(size); } - if (platform_view_ == nullptr || !platform_view_->ContextMakeCurrent() || - !layer_tree->root_layer()) { + if (!platform_view_->ContextMakeCurrent() || !layer_tree->root_layer()) { callback.Run(); return; }