Remove legacy callDrawGlFunction2 from HWUI

Bug: 151439970
Test: CtsUiRenderingTestCases passes

Change-Id: I1c29df17bb6e8b078467edf73cb3547db6948cdd
diff --git a/libs/hwui/GlFunctorLifecycleListener.h b/libs/hwui/GlFunctorLifecycleListener.h
deleted file mode 100644
index 5adc469..0000000
--- a/libs/hwui/GlFunctorLifecycleListener.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include <utils/Functor.h>
-#include <utils/RefBase.h>
-
-namespace android {
-namespace uirenderer {
-
-class GlFunctorLifecycleListener : public VirtualLightRefBase {
-public:
-    virtual ~GlFunctorLifecycleListener() {}
-    virtual void onGlFunctorReleased(Functor* functor) = 0;
-};
-
-}  // namespace uirenderer
-}  // namespace android
diff --git a/libs/hwui/SkiaCanvas.cpp b/libs/hwui/SkiaCanvas.cpp
index 49e606b..242b8b0 100644
--- a/libs/hwui/SkiaCanvas.cpp
+++ b/libs/hwui/SkiaCanvas.cpp
@@ -843,9 +843,4 @@
     LOG_ALWAYS_FATAL("SkiaCanvas can't directly draw RenderNodes");
 }
 
-void SkiaCanvas::callDrawGLFunction(Functor* functor,
-                                    uirenderer::GlFunctorLifecycleListener* listener) {
-    LOG_ALWAYS_FATAL("SkiaCanvas can't directly draw GL Content");
-}
-
 }  // namespace android
diff --git a/libs/hwui/SkiaCanvas.h b/libs/hwui/SkiaCanvas.h
index 260a7e4..1df2b26 100644
--- a/libs/hwui/SkiaCanvas.h
+++ b/libs/hwui/SkiaCanvas.h
@@ -152,8 +152,6 @@
 
     virtual void drawLayer(uirenderer::DeferredLayerUpdater* layerHandle) override;
     virtual void drawRenderNode(uirenderer::RenderNode* renderNode) override;
-    virtual void callDrawGLFunction(Functor* functor,
-                                    uirenderer::GlFunctorLifecycleListener* listener) override;
     virtual void drawPicture(const SkPicture& picture) override;
 
 protected:
diff --git a/libs/hwui/hwui/Canvas.h b/libs/hwui/hwui/Canvas.h
index 48cf9a9..333567b 100644
--- a/libs/hwui/hwui/Canvas.h
+++ b/libs/hwui/hwui/Canvas.h
@@ -20,7 +20,6 @@
 #include <utils/Functor.h>
 
 #include <androidfw/ResourceTypes.h>
-#include "GlFunctorLifecycleListener.h"
 #include "Properties.h"
 #include "utils/Macros.h"
 
@@ -162,8 +161,7 @@
 
     virtual void drawLayer(uirenderer::DeferredLayerUpdater* layerHandle) = 0;
     virtual void drawRenderNode(uirenderer::RenderNode* renderNode) = 0;
-    virtual void callDrawGLFunction(Functor* functor,
-                                    uirenderer::GlFunctorLifecycleListener* listener) = 0;
+
     virtual void drawWebViewFunctor(int /*functor*/) {
         LOG_ALWAYS_FATAL("Not supported");
     }
diff --git a/libs/hwui/jni/android_graphics_DisplayListCanvas.cpp b/libs/hwui/jni/android_graphics_DisplayListCanvas.cpp
index e064cc8..7c1422d 100644
--- a/libs/hwui/jni/android_graphics_DisplayListCanvas.cpp
+++ b/libs/hwui/jni/android_graphics_DisplayListCanvas.cpp
@@ -67,40 +67,8 @@
     JavaVM* mVm;
     jobject mRunnable;
 };
-
-class GlFunctorReleasedCallbackBridge : public GlFunctorLifecycleListener {
-public:
-    GlFunctorReleasedCallbackBridge(JNIEnv* env, jobject javaCallback) {
-        mLooper = Looper::getForThread();
-        mMessage = new InvokeRunnableMessage(env, javaCallback);
-    }
-
-    virtual void onGlFunctorReleased(Functor* functor) override {
-        mLooper->sendMessage(mMessage, 0);
-    }
-
-private:
-    sp<Looper> mLooper;
-    sp<InvokeRunnableMessage> mMessage;
-};
 #endif
 
-// ---------------- @FastNative -----------------------------
-
-static void android_view_DisplayListCanvas_callDrawGLFunction(JNIEnv* env, jobject clazz,
-        jlong canvasPtr, jlong functorPtr, jobject releasedCallback) {
-#ifdef __ANDROID__ // Layoutlib does not support GL
-    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
-    Functor* functor = reinterpret_cast<Functor*>(functorPtr);
-    sp<GlFunctorReleasedCallbackBridge> bridge;
-    if (releasedCallback) {
-        bridge = new GlFunctorReleasedCallbackBridge(env, releasedCallback);
-    }
-    canvas->callDrawGLFunction(functor, bridge.get());
-#endif
-}
-
-
 // ---------------- @CriticalNative -------------------------
 
 static jlong android_view_DisplayListCanvas_createDisplayListCanvas(CRITICAL_JNI_PARAMS_COMMA jlong renderNodePtr,
@@ -183,12 +151,6 @@
 const char* const kClassPathName = "android/graphics/RecordingCanvas";
 
 static JNINativeMethod gMethods[] = {
-
-    // ------------ @FastNative ------------------
-
-    { "nCallDrawGLFunction", "(JJLjava/lang/Runnable;)V",
-            (void*) android_view_DisplayListCanvas_callDrawGLFunction },
-
     // ------------ @CriticalNative --------------
     { "nCreateDisplayListCanvas", "(JII)J",     (void*) android_view_DisplayListCanvas_createDisplayListCanvas },
     { "nResetDisplayListCanvas",  "(JJII)V",    (void*) android_view_DisplayListCanvas_resetDisplayListCanvas },
diff --git a/libs/hwui/jni/android_graphics_HardwareRenderer.cpp b/libs/hwui/jni/android_graphics_HardwareRenderer.cpp
index 69c80be..42743db 100644
--- a/libs/hwui/jni/android_graphics_HardwareRenderer.cpp
+++ b/libs/hwui/jni/android_graphics_HardwareRenderer.cpp
@@ -256,12 +256,6 @@
     rootRenderNode->addVectorDrawableAnimator(animator);
 }
 
-static void android_view_ThreadedRenderer_invokeFunctor(JNIEnv* env, jobject clazz,
-        jlong functorPtr, jboolean waitForCompletion) {
-    Functor* functor = reinterpret_cast<Functor*>(functorPtr);
-    RenderProxy::invokeFunctor(functor, waitForCompletion);
-}
-
 static jlong android_view_ThreadedRenderer_createTextureLayer(JNIEnv* env, jobject clazz,
         jlong proxyPtr) {
     RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
@@ -684,7 +678,6 @@
          (void*)android_view_ThreadedRenderer_registerAnimatingRenderNode},
         {"nRegisterVectorDrawableAnimator", "(JJ)V",
          (void*)android_view_ThreadedRenderer_registerVectorDrawableAnimator},
-        {"nInvokeFunctor", "(JZ)V", (void*)android_view_ThreadedRenderer_invokeFunctor},
         {"nCreateTextureLayer", "(J)J", (void*)android_view_ThreadedRenderer_createTextureLayer},
         {"nBuildLayer", "(JJ)V", (void*)android_view_ThreadedRenderer_buildLayer},
         {"nCopyLayerInto", "(JJJ)Z", (void*)android_view_ThreadedRenderer_copyLayerInto},
diff --git a/libs/hwui/pipeline/skia/FunctorDrawable.h b/libs/hwui/pipeline/skia/FunctorDrawable.h
index cf2f93b..988a896 100644
--- a/libs/hwui/pipeline/skia/FunctorDrawable.h
+++ b/libs/hwui/pipeline/skia/FunctorDrawable.h
@@ -16,8 +16,6 @@
 
 #pragma once
 
-#include "GlFunctorLifecycleListener.h"
-
 #include <SkCanvas.h>
 #include <SkDrawable.h>
 
@@ -36,44 +34,21 @@
  */
 class FunctorDrawable : public SkDrawable {
 public:
-    FunctorDrawable(Functor* functor, GlFunctorLifecycleListener* listener, SkCanvas* canvas)
-            : mBounds(canvas->getLocalClipBounds())
-            , mAnyFunctor(std::in_place_type<LegacyFunctor>, functor, listener) {}
-
     FunctorDrawable(int functor, SkCanvas* canvas)
             : mBounds(canvas->getLocalClipBounds())
-            , mAnyFunctor(std::in_place_type<NewFunctor>, functor) {}
+            , mWebViewHandle(WebViewFunctorManager::instance().handleFor(functor)) {}
 
     virtual ~FunctorDrawable() {}
 
     virtual void syncFunctor(const WebViewSyncData& data) const {
-        if (mAnyFunctor.index() == 0) {
-            std::get<0>(mAnyFunctor).handle->sync(data);
-        } else {
-            (*(std::get<1>(mAnyFunctor).functor))(DrawGlInfo::kModeSync, nullptr);
-        }
+        mWebViewHandle->sync(data);
     }
 
 protected:
     virtual SkRect onGetBounds() override { return mBounds; }
 
     const SkRect mBounds;
-
-    struct LegacyFunctor {
-        explicit LegacyFunctor(Functor* functor, GlFunctorLifecycleListener* listener)
-                : functor(functor), listener(listener) {}
-        Functor* functor;
-        sp<GlFunctorLifecycleListener> listener;
-    };
-
-    struct NewFunctor {
-        explicit NewFunctor(int functor) {
-            handle = WebViewFunctorManager::instance().handleFor(functor);
-        }
-        sp<WebViewFunctor::Handle> handle;
-    };
-
-    std::variant<NewFunctor, LegacyFunctor> mAnyFunctor;
+    sp<WebViewFunctor::Handle> mWebViewHandle;
 };
 
 }  // namespace skiapipeline
diff --git a/libs/hwui/pipeline/skia/GLFunctorDrawable.cpp b/libs/hwui/pipeline/skia/GLFunctorDrawable.cpp
index e7ebfb0..f502fc3 100644
--- a/libs/hwui/pipeline/skia/GLFunctorDrawable.cpp
+++ b/libs/hwui/pipeline/skia/GLFunctorDrawable.cpp
@@ -18,7 +18,6 @@
 #include <GrContext.h>
 #include <private/hwui/DrawGlInfo.h>
 #include "FunctorDrawable.h"
-#include "GlFunctorLifecycleListener.h"
 #include "GrBackendSurface.h"
 #include "GrRenderTarget.h"
 #include "GrRenderTargetContext.h"
@@ -32,14 +31,6 @@
 namespace uirenderer {
 namespace skiapipeline {
 
-GLFunctorDrawable::~GLFunctorDrawable() {
-    if (auto lp = std::get_if<LegacyFunctor>(&mAnyFunctor)) {
-        if (lp->listener) {
-            lp->listener->onGlFunctorReleased(lp->functor);
-        }
-    }
-}
-
 static void setScissor(int viewportHeight, const SkIRect& clip) {
     SkASSERT(!clip.isEmpty());
     // transform to Y-flipped GL space, and prevent negatives
@@ -195,11 +186,7 @@
         setScissor(info.height, clipRegion.getBounds());
     }
 
-    if (mAnyFunctor.index() == 0) {
-        std::get<0>(mAnyFunctor).handle->drawGl(info);
-    } else {
-        (*(std::get<1>(mAnyFunctor).functor))(DrawGlInfo::kModeDraw, &info);
-    }
+    mWebViewHandle->drawGl(info);
 
     if (clearStencilAfterFunctor) {
         // clear stencil buffer as it may be used by Skia
diff --git a/libs/hwui/pipeline/skia/GLFunctorDrawable.h b/libs/hwui/pipeline/skia/GLFunctorDrawable.h
index 2ea4f67..4092e8d 100644
--- a/libs/hwui/pipeline/skia/GLFunctorDrawable.h
+++ b/libs/hwui/pipeline/skia/GLFunctorDrawable.h
@@ -33,7 +33,7 @@
 public:
     using FunctorDrawable::FunctorDrawable;
 
-    virtual ~GLFunctorDrawable();
+    virtual ~GLFunctorDrawable() {}
 
 protected:
     void onDraw(SkCanvas* canvas) override;
diff --git a/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp b/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp
index 88c1d0e..e292cbd 100644
--- a/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp
+++ b/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp
@@ -132,23 +132,6 @@
     }
 }
 
-
-void SkiaRecordingCanvas::callDrawGLFunction(Functor* functor,
-                                             uirenderer::GlFunctorLifecycleListener* listener) {
-#ifdef __ANDROID__ // Layoutlib does not support GL, Vulcan etc.
-    FunctorDrawable* functorDrawable;
-    if (Properties::getRenderPipelineType() == RenderPipelineType::SkiaVulkan) {
-        functorDrawable = mDisplayList->allocateDrawable<VkInteropFunctorDrawable>(
-                functor, listener, asSkCanvas());
-    } else {
-        functorDrawable =
-                mDisplayList->allocateDrawable<GLFunctorDrawable>(functor, listener, asSkCanvas());
-    }
-    mDisplayList->mChildFunctors.push_back(functorDrawable);
-    drawDrawable(functorDrawable);
-#endif
-}
-
 void SkiaRecordingCanvas::drawWebViewFunctor(int functor) {
 #ifdef __ANDROID__ // Layoutlib does not support GL, Vulcan etc.
     FunctorDrawable* functorDrawable;
diff --git a/libs/hwui/pipeline/skia/SkiaRecordingCanvas.h b/libs/hwui/pipeline/skia/SkiaRecordingCanvas.h
index 1a976a6..83e9349 100644
--- a/libs/hwui/pipeline/skia/SkiaRecordingCanvas.h
+++ b/libs/hwui/pipeline/skia/SkiaRecordingCanvas.h
@@ -72,8 +72,7 @@
     virtual void enableZ(bool enableZ) override;
     virtual void drawLayer(uirenderer::DeferredLayerUpdater* layerHandle) override;
     virtual void drawRenderNode(uirenderer::RenderNode* renderNode) override;
-    virtual void callDrawGLFunction(Functor* functor,
-                                    uirenderer::GlFunctorLifecycleListener* listener) override;
+
     void drawWebViewFunctor(int functor) override;
 
 private:
diff --git a/libs/hwui/pipeline/skia/VkFunctorDrawable.cpp b/libs/hwui/pipeline/skia/VkFunctorDrawable.cpp
index 715a7cb..50b45e6 100644
--- a/libs/hwui/pipeline/skia/VkFunctorDrawable.cpp
+++ b/libs/hwui/pipeline/skia/VkFunctorDrawable.cpp
@@ -121,12 +121,7 @@
         return nullptr;
     }
     std::unique_ptr<VkFunctorDrawHandler> draw;
-    if (mAnyFunctor.index() == 0) {
-        return std::make_unique<VkFunctorDrawHandler>(std::get<0>(mAnyFunctor).handle, matrix, clip,
-                                                      image_info);
-    } else {
-        LOG_ALWAYS_FATAL("Not implemented");
-    }
+    return std::make_unique<VkFunctorDrawHandler>(mWebViewHandle, matrix, clip, image_info);
 }
 
 }  // namespace skiapipeline
diff --git a/libs/hwui/pipeline/skia/VkInteropFunctorDrawable.cpp b/libs/hwui/pipeline/skia/VkInteropFunctorDrawable.cpp
index 27c957d..403d907 100644
--- a/libs/hwui/pipeline/skia/VkInteropFunctorDrawable.cpp
+++ b/libs/hwui/pipeline/skia/VkInteropFunctorDrawable.cpp
@@ -155,11 +155,7 @@
         glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
         glClear(GL_COLOR_BUFFER_BIT);
 
-        if (mAnyFunctor.index() == 0) {
-            std::get<0>(mAnyFunctor).handle->drawGl(info);
-        } else {
-            (*(std::get<1>(mAnyFunctor).functor))(DrawGlInfo::kModeDraw, &info);
-        }
+        mWebViewHandle->drawGl(info);
 
         EGLSyncKHR glDrawFinishedFence =
                 eglCreateSyncKHR(eglGetCurrentDisplay(), EGL_SYNC_FENCE_KHR, NULL);
@@ -190,15 +186,6 @@
     canvas->restore();
 }
 
-VkInteropFunctorDrawable::~VkInteropFunctorDrawable() {
-    if (auto lp = std::get_if<LegacyFunctor>(&mAnyFunctor)) {
-        if (lp->listener) {
-            ScopedDrawRequest _drawRequest{};
-            lp->listener->onGlFunctorReleased(lp->functor);
-        }
-    }
-}
-
 void VkInteropFunctorDrawable::syncFunctor(const WebViewSyncData& data) const {
     ScopedDrawRequest _drawRequest{};
     FunctorDrawable::syncFunctor(data);
diff --git a/libs/hwui/pipeline/skia/VkInteropFunctorDrawable.h b/libs/hwui/pipeline/skia/VkInteropFunctorDrawable.h
index b12774f..e6ea175 100644
--- a/libs/hwui/pipeline/skia/VkInteropFunctorDrawable.h
+++ b/libs/hwui/pipeline/skia/VkInteropFunctorDrawable.h
@@ -35,7 +35,7 @@
 public:
     using FunctorDrawable::FunctorDrawable;
 
-    virtual ~VkInteropFunctorDrawable();
+    virtual ~VkInteropFunctorDrawable() {}
 
     static void vkInvokeFunctor(Functor* functor);
 
diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp
index b66a13d..b764f74b 100644
--- a/libs/hwui/renderthread/RenderProxy.cpp
+++ b/libs/hwui/renderthread/RenderProxy.cpp
@@ -128,20 +128,6 @@
     mRenderThread.queue().runSync([=]() { mContext->destroy(); });
 }
 
-void RenderProxy::invokeFunctor(Functor* functor, bool waitForCompletion) {
-    ATRACE_CALL();
-    RenderThread& thread = RenderThread::getInstance();
-    auto invoke = [&thread, functor]() { CanvasContext::invokeFunctor(thread, functor); };
-    if (waitForCompletion) {
-        // waitForCompletion = true is expected to be fairly rare and only
-        // happen in destruction. Thus it should be fine to temporarily
-        // create a Mutex
-        thread.queue().runSync(std::move(invoke));
-    } else {
-        thread.queue().post(std::move(invoke));
-    }
-}
-
 void RenderProxy::destroyFunctor(int functor) {
     ATRACE_CALL();
     RenderThread& thread = RenderThread::getInstance();
diff --git a/libs/hwui/renderthread/RenderProxy.h b/libs/hwui/renderthread/RenderProxy.h
index 1b3dc15..16eabad 100644
--- a/libs/hwui/renderthread/RenderProxy.h
+++ b/libs/hwui/renderthread/RenderProxy.h
@@ -82,7 +82,6 @@
     int syncAndDrawFrame();
     void destroy();
 
-    static void invokeFunctor(Functor* functor, bool waitForCompletion);
     static void destroyFunctor(int functor);
 
     DeferredLayerUpdater* createTextureLayer();
diff --git a/libs/hwui/tests/common/TestUtils.h b/libs/hwui/tests/common/TestUtils.h
index 91a808d..36c5a8c1 100644
--- a/libs/hwui/tests/common/TestUtils.h
+++ b/libs/hwui/tests/common/TestUtils.h
@@ -287,18 +287,6 @@
 
     static std::unique_ptr<uint16_t[]> asciiToUtf16(const char* str);
 
-    class MockFunctor : public Functor {
-    public:
-        virtual status_t operator()(int what, void* data) {
-            mLastMode = what;
-            return DrawGlInfo::kStatusDone;
-        }
-        int getLastMode() const { return mLastMode; }
-
-    private:
-        int mLastMode = -1;
-    };
-
     static SkColor getColor(const sk_sp<SkSurface>& surface, int x, int y);
 
     static SkRect getClipBounds(const SkCanvas* canvas);
@@ -311,30 +299,32 @@
         int glesDraw = 0;
     };
 
-    static void expectOnRenderThread() { EXPECT_EQ(gettid(), TestUtils::getRenderThreadTid()); }
+    static void expectOnRenderThread(const std::string_view& function = "unknown") {
+        EXPECT_EQ(gettid(), TestUtils::getRenderThreadTid()) << "Called on wrong thread: " << function;
+    }
 
     static WebViewFunctorCallbacks createMockFunctor(RenderMode mode) {
         auto callbacks = WebViewFunctorCallbacks{
                 .onSync =
                         [](int functor, void* client_data, const WebViewSyncData& data) {
-                            expectOnRenderThread();
+                            expectOnRenderThread("onSync");
                             sMockFunctorCounts[functor].sync++;
                         },
                 .onContextDestroyed =
                         [](int functor, void* client_data) {
-                            expectOnRenderThread();
+                            expectOnRenderThread("onContextDestroyed");
                             sMockFunctorCounts[functor].contextDestroyed++;
                         },
                 .onDestroyed =
                         [](int functor, void* client_data) {
-                            expectOnRenderThread();
+                            expectOnRenderThread("onDestroyed");
                             sMockFunctorCounts[functor].destroyed++;
                         },
         };
         switch (mode) {
             case RenderMode::OpenGL_ES:
                 callbacks.gles.draw = [](int functor, void* client_data, const DrawGlInfo& params) {
-                    expectOnRenderThread();
+                    expectOnRenderThread("draw");
                     sMockFunctorCounts[functor].glesDraw++;
                 };
                 break;
diff --git a/libs/hwui/tests/unit/CanvasContextTests.cpp b/libs/hwui/tests/unit/CanvasContextTests.cpp
index 28cff5b..1771c35 100644
--- a/libs/hwui/tests/unit/CanvasContextTests.cpp
+++ b/libs/hwui/tests/unit/CanvasContextTests.cpp
@@ -42,14 +42,3 @@
 
     canvasContext->destroy();
 }
-
-RENDERTHREAD_TEST(CanvasContext, invokeFunctor) {
-    TestUtils::MockFunctor functor;
-    CanvasContext::invokeFunctor(renderThread, &functor);
-    if (Properties::getRenderPipelineType() == RenderPipelineType::SkiaVulkan) {
-        // we currently don't support OpenGL WebViews on the Vulkan backend
-        ASSERT_EQ(functor.getLastMode(), DrawGlInfo::kModeProcessNoContext);
-    } else {
-        ASSERT_EQ(functor.getLastMode(), DrawGlInfo::kModeProcess);
-    }
-}
diff --git a/libs/hwui/tests/unit/RenderNodeTests.cpp b/libs/hwui/tests/unit/RenderNodeTests.cpp
index 1cd9bd8..c19e1ed 100644
--- a/libs/hwui/tests/unit/RenderNodeTests.cpp
+++ b/libs/hwui/tests/unit/RenderNodeTests.cpp
@@ -231,39 +231,41 @@
 }
 
 TEST(RenderNode, releasedCallback) {
-    class DecRefOnReleased : public GlFunctorLifecycleListener {
-    public:
-        explicit DecRefOnReleased(int* refcnt) : mRefCnt(refcnt) {}
-        void onGlFunctorReleased(Functor* functor) override { *mRefCnt -= 1; }
-
-    private:
-        int* mRefCnt;
-    };
-
-    int refcnt = 0;
-    sp<DecRefOnReleased> listener(new DecRefOnReleased(&refcnt));
-    Functor noopFunctor;
+    int functor = WebViewFunctor_create(
+            nullptr, TestUtils::createMockFunctor(RenderMode::OpenGL_ES), RenderMode::OpenGL_ES);
 
     auto node = TestUtils::createNode(0, 0, 200, 400, [&](RenderProperties& props, Canvas& canvas) {
-        refcnt++;
-        canvas.callDrawGLFunction(&noopFunctor, listener.get());
+        canvas.drawWebViewFunctor(functor);
     });
-    TestUtils::syncHierarchyPropertiesAndDisplayList(node);
-    EXPECT_EQ(1, refcnt);
+    TestUtils::runOnRenderThreadUnmanaged([&] (RenderThread&) {
+        TestUtils::syncHierarchyPropertiesAndDisplayList(node);
+    });
+    auto& counts = TestUtils::countsForFunctor(functor);
+    EXPECT_EQ(1, counts.sync);
+    EXPECT_EQ(0, counts.destroyed);
 
     TestUtils::recordNode(*node, [&](Canvas& canvas) {
-        refcnt++;
-        canvas.callDrawGLFunction(&noopFunctor, listener.get());
+        canvas.drawWebViewFunctor(functor);
     });
-    EXPECT_EQ(2, refcnt);
+    EXPECT_EQ(1, counts.sync);
+    EXPECT_EQ(0, counts.destroyed);
 
-    TestUtils::syncHierarchyPropertiesAndDisplayList(node);
-    EXPECT_EQ(1, refcnt);
+    TestUtils::runOnRenderThreadUnmanaged([&] (RenderThread&) {
+        TestUtils::syncHierarchyPropertiesAndDisplayList(node);
+    });
+    EXPECT_EQ(2, counts.sync);
+    EXPECT_EQ(0, counts.destroyed);
+
+    WebViewFunctor_release(functor);
+    EXPECT_EQ(2, counts.sync);
+    EXPECT_EQ(0, counts.destroyed);
 
     TestUtils::recordNode(*node, [](Canvas& canvas) {});
-    EXPECT_EQ(1, refcnt);
-    TestUtils::syncHierarchyPropertiesAndDisplayList(node);
-    EXPECT_EQ(0, refcnt);
+    TestUtils::runOnRenderThreadUnmanaged([&] (RenderThread&) {
+        TestUtils::syncHierarchyPropertiesAndDisplayList(node);
+    });
+    EXPECT_EQ(2, counts.sync);
+    EXPECT_EQ(1, counts.destroyed);
 }
 
 RENDERTHREAD_TEST(RenderNode, prepareTree_nullableDisplayList) {
diff --git a/libs/hwui/tests/unit/SkiaDisplayListTests.cpp b/libs/hwui/tests/unit/SkiaDisplayListTests.cpp
index d08aea6..74a5654 100644
--- a/libs/hwui/tests/unit/SkiaDisplayListTests.cpp
+++ b/libs/hwui/tests/unit/SkiaDisplayListTests.cpp
@@ -48,7 +48,10 @@
     SkCanvas dummyCanvas;
     RenderNodeDrawable drawable(nullptr, &dummyCanvas);
     skiaDL->mChildNodes.emplace_back(nullptr, &dummyCanvas);
-    GLFunctorDrawable functorDrawable(nullptr, nullptr, &dummyCanvas);
+    int functor1 = WebViewFunctor_create(
+            nullptr, TestUtils::createMockFunctor(RenderMode::OpenGL_ES), RenderMode::OpenGL_ES);
+    GLFunctorDrawable functorDrawable{functor1, &dummyCanvas};
+    WebViewFunctor_release(functor1);
     skiaDL->mChildFunctors.push_back(&functorDrawable);
     skiaDL->mMutableImages.push_back(nullptr);
     skiaDL->appendVD(nullptr);
@@ -97,16 +100,13 @@
     SkiaDisplayList skiaDL;
 
     SkCanvas dummyCanvas;
-    TestUtils::MockFunctor functor;
-    GLFunctorDrawable functorDrawable(&functor, nullptr, &dummyCanvas);
-    skiaDL.mChildFunctors.push_back(&functorDrawable);
 
-    int functor2 = WebViewFunctor_create(
+    int functor1 = WebViewFunctor_create(
             nullptr, TestUtils::createMockFunctor(RenderMode::OpenGL_ES), RenderMode::OpenGL_ES);
-    auto& counts = TestUtils::countsForFunctor(functor2);
+    auto& counts = TestUtils::countsForFunctor(functor1);
     skiaDL.mChildFunctors.push_back(
-            skiaDL.allocateDrawable<GLFunctorDrawable>(functor2, &dummyCanvas));
-    WebViewFunctor_release(functor2);
+            skiaDL.allocateDrawable<GLFunctorDrawable>(functor1, &dummyCanvas));
+    WebViewFunctor_release(functor1);
 
     SkRect bounds = SkRect::MakeWH(200, 200);
     VectorDrawableRoot vectorDrawable(new VectorDrawable::Group());
@@ -120,7 +120,6 @@
         });
     });
 
-    EXPECT_EQ(functor.getLastMode(), DrawGlInfo::kModeSync);
     EXPECT_EQ(counts.sync, 1);
     EXPECT_EQ(counts.destroyed, 0);
     EXPECT_EQ(vectorDrawable.mutateProperties()->getBounds(), bounds);