From 1949e7928eeec22cd3f74b5f763a4eb433238453 Mon Sep 17 00:00:00 2001 From: John Reck Date: Tue, 8 Apr 2014 15:18:56 -0700 Subject: [PATCH] Ensure there's a GL context before creating a Layer Bug: 13745587 Change-Id: Ib0ec059d9a5974a48734daeec9d83580cada94a3 --- libs/hwui/renderthread/CanvasContext.cpp | 10 ++++++++++ libs/hwui/renderthread/CanvasContext.h | 4 ++++ libs/hwui/renderthread/RenderProxy.cpp | 11 ++++++----- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index fa8262705426e..c231f6fbf00b7 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -490,6 +490,16 @@ void CanvasContext::runWithGlContext(RenderTask* task) { 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 eb9096d5d92c6..6f1c37f3242a3 100644 --- a/libs/hwui/renderthread/CanvasContext.h +++ b/libs/hwui/renderthread/CanvasContext.h @@ -35,6 +35,7 @@ class RenderNode; class DisplayListData; class OpenGLRenderer; class Rect; +class Layer; namespace renderthread { @@ -76,6 +77,9 @@ public: 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 489dc9026af65..e817e616f016f 100644 --- a/libs/hwui/renderthread/RenderProxy.cpp +++ b/libs/hwui/renderthread/RenderProxy.cpp @@ -202,10 +202,9 @@ void RenderProxy::runWithGlContext(RenderTask* gltask) { 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 @@ DeferredLayerUpdater* RenderProxy::createDisplayListLayer(int width, int height) SETUP_TASK(createDisplayListLayer); args->width = width; args->height = height; + args->context = mContext; void* retval = postAndWait(task); DeferredLayerUpdater* layer = reinterpret_cast(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(retval); mDrawFrameTask.addLayer(layer);