提交 789c1e79 编写于 作者: J Jason Simmons 提交者: GitHub

Disable rendering if the rasterizer can not create a GL/EGL context (#2817)

Fixes https://github.com/flutter/flutter/issues/4972
上级 9eb5df41
...@@ -27,14 +27,18 @@ GaneshCanvas::GaneshCanvas() { ...@@ -27,14 +27,18 @@ GaneshCanvas::GaneshCanvas() {
GaneshCanvas::~GaneshCanvas() { GaneshCanvas::~GaneshCanvas() {
} }
void GaneshCanvas::SetupGrGLInterface() { bool GaneshCanvas::SetupGrGLInterface() {
sk_surface_ = nullptr; sk_surface_ = nullptr;
gr_context_ = skia::AdoptRef(GrContext::Create( gr_context_ = skia::AdoptRef(GrContext::Create(
kOpenGL_GrBackend, kOpenGL_GrBackend,
reinterpret_cast<GrBackendContext>(GrGLCreateNativeInterface()))); reinterpret_cast<GrBackendContext>(GrGLCreateNativeInterface())));
DCHECK(gr_context_);
if (!gr_context_)
return false;
gr_context_->setResourceCacheLimits(kMaxGaneshResourceCacheCount, gr_context_->setResourceCacheLimits(kMaxGaneshResourceCacheCount,
kMaxGaneshResourceCacheBytes); kMaxGaneshResourceCacheBytes);
return true;
} }
bool GaneshCanvas::SelectPixelConfig(GrPixelConfig* config) { bool GaneshCanvas::SelectPixelConfig(GrPixelConfig* config) {
......
...@@ -21,7 +21,7 @@ class GaneshCanvas { ...@@ -21,7 +21,7 @@ class GaneshCanvas {
GaneshCanvas(); GaneshCanvas();
~GaneshCanvas(); ~GaneshCanvas();
void SetupGrGLInterface(); bool SetupGrGLInterface();
SkCanvas* GetCanvas(int32_t fbo, const SkISize& size); SkCanvas* GetCanvas(int32_t fbo, const SkISize& size);
......
...@@ -52,12 +52,19 @@ void RasterizerDirect::Setup(PlatformView* platform_view, ...@@ -52,12 +52,19 @@ void RasterizerDirect::Setup(PlatformView* platform_view,
// The context needs to be made current before the GrGL interface can be // The context needs to be made current before the GrGL interface can be
// setup. // setup.
bool success = platform_view->ContextMakeCurrent(); 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"; if (success) {
platform_view_ = platform_view;
ganesh_canvas_.SetupGrGLInterface(); } else {
LOG(ERROR) << "WARNING: Flutter will be unable to render to the display";
platform_view_ = platform_view; }
continuation.Run(); continuation.Run();
...@@ -80,6 +87,11 @@ void RasterizerDirect::Draw(uint64_t layer_tree_ptr, ...@@ -80,6 +87,11 @@ void RasterizerDirect::Draw(uint64_t layer_tree_ptr,
const DrawCallback& callback) { const DrawCallback& callback) {
TRACE_EVENT0("flutter", "RasterizerDirect::Draw"); TRACE_EVENT0("flutter", "RasterizerDirect::Draw");
if (platform_view_ == nullptr) {
callback.Run();
return;
}
std::unique_ptr<flow::LayerTree> layer_tree( std::unique_ptr<flow::LayerTree> layer_tree(
reinterpret_cast<flow::LayerTree*>(layer_tree_ptr)); reinterpret_cast<flow::LayerTree*>(layer_tree_ptr));
...@@ -88,8 +100,7 @@ void RasterizerDirect::Draw(uint64_t layer_tree_ptr, ...@@ -88,8 +100,7 @@ void RasterizerDirect::Draw(uint64_t layer_tree_ptr,
platform_view_->Resize(size); platform_view_->Resize(size);
} }
if (platform_view_ == nullptr || !platform_view_->ContextMakeCurrent() || if (!platform_view_->ContextMakeCurrent() || !layer_tree->root_layer()) {
!layer_tree->root_layer()) {
callback.Run(); callback.Run();
return; return;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册