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

Commit fae904d6 authored by John Reck's avatar John Reck
Browse files

Fence on destruction

 Bug: 14052927
 destroyCanvasAndSurface() needs a fence as when it returns the
 underlying BufferQueue is going to be released from under
 the render thread.

Change-Id: I0147a1d5ec5adf0239c761ef22f65cd8c8a137df
parent db8b130a
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -67,7 +67,7 @@ public class ThreadedRenderer extends HardwareRenderer {
    void destroy(boolean full) {
        mInitialized = false;
        updateEnabledState(null);
        nDestroyCanvas(mNativeProxy);
        nDestroyCanvasAndSurface(mNativeProxy);
    }

    private void updateEnabledState(Surface surface) {
@@ -300,7 +300,7 @@ public class ThreadedRenderer extends HardwareRenderer {
    private static native void nDrawDisplayList(long nativeProxy, long displayList,
            int dirtyLeft, int dirtyTop, int dirtyRight, int dirtyBottom);
    private static native void nRunWithGlContext(long nativeProxy, Runnable runnable);
    private static native void nDestroyCanvas(long nativeProxy);
    private static native void nDestroyCanvasAndSurface(long nativeProxy);

    private static native void nInvokeFunctor(long nativeProxy, long functor, boolean waitForCompletion);

+3 −3
Original line number Diff line number Diff line
@@ -121,10 +121,10 @@ static void android_view_ThreadedRenderer_drawDisplayList(JNIEnv* env, jobject c
    proxy->drawDisplayList(displayList, dirtyLeft, dirtyTop, dirtyRight, dirtyBottom);
}

static void android_view_ThreadedRenderer_destroyCanvas(JNIEnv* env, jobject clazz,
static void android_view_ThreadedRenderer_destroyCanvasAndSurface(JNIEnv* env, jobject clazz,
        jlong proxyPtr) {
    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
    proxy->destroyCanvas();
    proxy->destroyCanvasAndSurface();
}

static void android_view_ThreadedRenderer_invokeFunctor(JNIEnv* env, jobject clazz,
@@ -194,7 +194,7 @@ static JNINativeMethod gMethods[] = {
    { "nPauseSurface", "(JLandroid/view/Surface;)V", (void*) android_view_ThreadedRenderer_pauseSurface },
    { "nSetup", "(JII)V", (void*) android_view_ThreadedRenderer_setup },
    { "nDrawDisplayList", "(JJIIII)V", (void*) android_view_ThreadedRenderer_drawDisplayList },
    { "nDestroyCanvas", "(J)V", (void*) android_view_ThreadedRenderer_destroyCanvas },
    { "nDestroyCanvasAndSurface", "(J)V", (void*) android_view_ThreadedRenderer_destroyCanvasAndSurface },
    { "nInvokeFunctor", "(JJZ)V", (void*) android_view_ThreadedRenderer_invokeFunctor },
    { "nRunWithGlContext", "(JLjava/lang/Runnable;)V", (void*) android_view_ThreadedRenderer_runWithGlContext },
    { "nCreateDisplayListLayer", "(JII)J", (void*) android_view_ThreadedRenderer_createDisplayListLayer },
+2 −2
Original line number Diff line number Diff line
@@ -318,10 +318,10 @@ CanvasContext::CanvasContext(bool translucent)
}

CanvasContext::~CanvasContext() {
    destroyCanvas();
    destroyCanvasAndSurface();
}

void CanvasContext::destroyCanvas() {
void CanvasContext::destroyCanvasAndSurface() {
    if (mCanvas) {
        delete mCanvas;
        mCanvas = 0;
+1 −1
Original line number Diff line number Diff line
@@ -56,7 +56,7 @@ public:
    void setup(int width, int height);
    void processLayerUpdates(const Vector<DeferredLayerUpdater*>* layerUpdaters, bool* hasFunctors);
    void drawDisplayList(RenderNode* displayList, Rect* dirty);
    void destroyCanvas();
    void destroyCanvasAndSurface();

    bool copyLayerInto(DeferredLayerUpdater* layer, SkBitmap* bitmap);

+8 −5
Original line number Diff line number Diff line
@@ -140,15 +140,18 @@ void RenderProxy::drawDisplayList(RenderNode* displayList,
    mDrawFrameTask.drawFrame(&mRenderThread);
}

CREATE_BRIDGE1(destroyCanvas, CanvasContext* context) {
    args->context->destroyCanvas();
CREATE_BRIDGE1(destroyCanvasAndSurface, CanvasContext* context) {
    args->context->destroyCanvasAndSurface();
    return NULL;
}

void RenderProxy::destroyCanvas() {
    SETUP_TASK(destroyCanvas);
void RenderProxy::destroyCanvasAndSurface() {
    SETUP_TASK(destroyCanvasAndSurface);
    args->context = mContext;
    post(task);
    // destroyCanvasAndSurface() needs a fence as when it returns the
    // underlying BufferQueue is going to be released from under
    // the render thread.
    postAndWait(task);
}

CREATE_BRIDGE2(invokeFunctor, CanvasContext* context, Functor* functor) {
Loading