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);