提交 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() {
GaneshCanvas::~GaneshCanvas() {
}
void GaneshCanvas::SetupGrGLInterface() {
bool GaneshCanvas::SetupGrGLInterface() {
sk_surface_ = nullptr;
gr_context_ = skia::AdoptRef(GrContext::Create(
kOpenGL_GrBackend,
reinterpret_cast<GrBackendContext>(GrGLCreateNativeInterface())));
DCHECK(gr_context_);
if (!gr_context_)
return false;
gr_context_->setResourceCacheLimits(kMaxGaneshResourceCacheCount,
kMaxGaneshResourceCacheBytes);
return true;
}
bool GaneshCanvas::SelectPixelConfig(GrPixelConfig* config) {
......
......@@ -21,7 +21,7 @@ class GaneshCanvas {
GaneshCanvas();
~GaneshCanvas();
void SetupGrGLInterface();
bool SetupGrGLInterface();
SkCanvas* GetCanvas(int32_t fbo, const SkISize& size);
......
......@@ -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<flow::LayerTree> layer_tree(
reinterpret_cast<flow::LayerTree*>(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;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册