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

Commit 1562f2e5 authored by John Reck's avatar John Reck Committed by Android (Google) Code Review
Browse files

Merge "Fence on destruction"

parents 7bc016e8 fae904d6
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