Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1949e792 authored by John Reck's avatar John Reck
Browse files

Ensure there's a GL context before creating a Layer

 Bug: 13745587

Change-Id: Ib0ec059d9a5974a48734daeec9d83580cada94a3
parent 1f3f55b4
Loading
Loading
Loading
Loading
+10 −0
Original line number Original line Diff line number Diff line
@@ -490,6 +490,16 @@ void CanvasContext::runWithGlContext(RenderTask* task) {
    task->run();
    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() {
void CanvasContext::requireGlContext() {
    if (mEglSurface != EGL_NO_SURFACE) {
    if (mEglSurface != EGL_NO_SURFACE) {
        mGlobalContext->makeCurrent(mEglSurface);
        mGlobalContext->makeCurrent(mEglSurface);
+4 −0
Original line number Original line Diff line number Diff line
@@ -35,6 +35,7 @@ class RenderNode;
class DisplayListData;
class DisplayListData;
class OpenGLRenderer;
class OpenGLRenderer;
class Rect;
class Rect;
class Layer;


namespace renderthread {
namespace renderthread {


@@ -76,6 +77,9 @@ public:


    void runWithGlContext(RenderTask* task);
    void runWithGlContext(RenderTask* task);


    Layer* createRenderLayer(int width, int height);
    Layer* createTextureLayer();

private:
private:
    void setSurface(EGLNativeWindowType window);
    void setSurface(EGLNativeWindowType window);
    void swapBuffers();
    void swapBuffers();
+6 −5
Original line number Original line Diff line number Diff line
@@ -202,10 +202,9 @@ void RenderProxy::runWithGlContext(RenderTask* gltask) {
    postAndWait(task);
    postAndWait(task);
}
}


CREATE_BRIDGE2(createDisplayListLayer, int width, int height) {
CREATE_BRIDGE3(createDisplayListLayer, CanvasContext* context, int width, int height) {
    Layer* layer = LayerRenderer::createRenderLayer(args->width, args->height);
    Layer* layer = args->context->createRenderLayer(args->width, args->height);
    if (!layer) return 0;
    if (!layer) return 0;

    return new DeferredLayerUpdater(layer);
    return new DeferredLayerUpdater(layer);
}
}


@@ -213,20 +212,22 @@ DeferredLayerUpdater* RenderProxy::createDisplayListLayer(int width, int height)
    SETUP_TASK(createDisplayListLayer);
    SETUP_TASK(createDisplayListLayer);
    args->width = width;
    args->width = width;
    args->height = height;
    args->height = height;
    args->context = mContext;
    void* retval = postAndWait(task);
    void* retval = postAndWait(task);
    DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(retval);
    DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(retval);
    mDrawFrameTask.addLayer(layer);
    mDrawFrameTask.addLayer(layer);
    return layer;
    return layer;
}
}


CREATE_BRIDGE0(createTextureLayer) {
CREATE_BRIDGE1(createTextureLayer, CanvasContext* context) {
    Layer* layer = LayerRenderer::createTextureLayer();
    Layer* layer = args->context->createTextureLayer();
    if (!layer) return 0;
    if (!layer) return 0;
    return new DeferredLayerUpdater(layer);
    return new DeferredLayerUpdater(layer);
}
}


DeferredLayerUpdater* RenderProxy::createTextureLayer() {
DeferredLayerUpdater* RenderProxy::createTextureLayer() {
    SETUP_TASK(createTextureLayer);
    SETUP_TASK(createTextureLayer);
    args->context = mContext;
    void* retval = postAndWait(task);
    void* retval = postAndWait(task);
    DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(retval);
    DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(retval);
    mDrawFrameTask.addLayer(layer);
    mDrawFrameTask.addLayer(layer);