Ensure there's a GL context before creating a Layer

 Bug: 13745587

Change-Id: Ib0ec059d9a5974a48734daeec9d83580cada94a3
diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp
index fa82627..c231f6f 100644
--- a/libs/hwui/renderthread/CanvasContext.cpp
+++ b/libs/hwui/renderthread/CanvasContext.cpp
@@ -490,6 +490,16 @@
     task->run();
 }
 
+Layer* CanvasContext::createRenderLayer(int width, int height) {
+    requireGlContext();
+    return LayerRenderer::createRenderLayer(width, height);
+}
+
+Layer* CanvasContext::createTextureLayer() {
+    requireGlContext();
+    return LayerRenderer::createTextureLayer();
+}
+
 void CanvasContext::requireGlContext() {
     if (mEglSurface != EGL_NO_SURFACE) {
         mGlobalContext->makeCurrent(mEglSurface);
diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h
index eb9096d..6f1c37f 100644
--- a/libs/hwui/renderthread/CanvasContext.h
+++ b/libs/hwui/renderthread/CanvasContext.h
@@ -35,6 +35,7 @@
 class DisplayListData;
 class OpenGLRenderer;
 class Rect;
+class Layer;
 
 namespace renderthread {
 
@@ -76,6 +77,9 @@
 
     void runWithGlContext(RenderTask* task);
 
+    Layer* createRenderLayer(int width, int height);
+    Layer* createTextureLayer();
+
 private:
     void setSurface(EGLNativeWindowType window);
     void swapBuffers();
diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp
index 489dc90..e817e61 100644
--- a/libs/hwui/renderthread/RenderProxy.cpp
+++ b/libs/hwui/renderthread/RenderProxy.cpp
@@ -202,10 +202,9 @@
     postAndWait(task);
 }
 
-CREATE_BRIDGE2(createDisplayListLayer, int width, int height) {
-    Layer* layer = LayerRenderer::createRenderLayer(args->width, args->height);
+CREATE_BRIDGE3(createDisplayListLayer, CanvasContext* context, int width, int height) {
+    Layer* layer = args->context->createRenderLayer(args->width, args->height);
     if (!layer) return 0;
-
     return new DeferredLayerUpdater(layer);
 }
 
@@ -213,20 +212,22 @@
     SETUP_TASK(createDisplayListLayer);
     args->width = width;
     args->height = height;
+    args->context = mContext;
     void* retval = postAndWait(task);
     DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(retval);
     mDrawFrameTask.addLayer(layer);
     return layer;
 }
 
-CREATE_BRIDGE0(createTextureLayer) {
-    Layer* layer = LayerRenderer::createTextureLayer();
+CREATE_BRIDGE1(createTextureLayer, CanvasContext* context) {
+    Layer* layer = args->context->createTextureLayer();
     if (!layer) return 0;
     return new DeferredLayerUpdater(layer);
 }
 
 DeferredLayerUpdater* RenderProxy::createTextureLayer() {
     SETUP_TASK(createTextureLayer);
+    args->context = mContext;
     void* retval = postAndWait(task);
     DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(retval);
     mDrawFrameTask.addLayer(layer);