diff options
author | Rob Carr <racarr@google.com> | 2021-06-25 02:18:17 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2021-06-25 02:18:17 +0000 |
commit | 472d962453e89c3c9da5c6d0aa024978ca534b4d (patch) | |
tree | a78ecfd15781dbb139f86115d5c704ca94e9c59f /libs/hwui | |
parent | 4a9037a8cdad62c2b0b20de37696a3ee135679fa (diff) | |
parent | da3559683482a61d93b06bed6f46349f6f01dc63 (diff) |
Merge "Delete RenderProxy off of the cleaner thread" into sc-dev
Diffstat (limited to 'libs/hwui')
-rw-r--r-- | libs/hwui/jni/android_graphics_HardwareRenderer.cpp | 2 | ||||
-rw-r--r-- | libs/hwui/renderthread/RenderProxy.cpp | 12 | ||||
-rw-r--r-- | libs/hwui/renderthread/RenderProxy.h | 8 |
3 files changed, 19 insertions, 3 deletions
diff --git a/libs/hwui/jni/android_graphics_HardwareRenderer.cpp b/libs/hwui/jni/android_graphics_HardwareRenderer.cpp index 4d31cd90d40f..b2ff38cc4e23 100644 --- a/libs/hwui/jni/android_graphics_HardwareRenderer.cpp +++ b/libs/hwui/jni/android_graphics_HardwareRenderer.cpp @@ -247,7 +247,7 @@ static jlong android_view_ThreadedRenderer_createProxy(JNIEnv* env, jobject claz static void android_view_ThreadedRenderer_deleteProxy(JNIEnv* env, jobject clazz, jlong proxyPtr) { RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); - delete proxy; + RenderProxy::asyncDelete(proxy); } static jboolean android_view_ThreadedRenderer_loadSystemProperties(JNIEnv* env, jobject clazz, diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp index a77b5b569907..e538a92fbd97 100644 --- a/libs/hwui/renderthread/RenderProxy.cpp +++ b/libs/hwui/renderthread/RenderProxy.cpp @@ -26,6 +26,7 @@ #include "renderthread/CanvasContext.h" #include "renderthread/RenderTask.h" #include "renderthread/RenderThread.h" +#include "thread/CommonPool.h" #include "utils/Macros.h" #include "utils/TimeUtils.h" @@ -42,6 +43,17 @@ RenderProxy::RenderProxy(bool translucent, RenderNode* rootRenderNode, mDrawFrameTask.setContext(&mRenderThread, mContext, rootRenderNode); } +void RenderProxy::asyncDelete(RenderProxy* proxy) { + if (!proxy) return; + + if (proxy->mContext) { + // Use the common pool because ~RenderProxy blocks on calling into RenderThread + CommonPool::post([proxy]() { delete proxy; }); + } else { + delete proxy; + } +} + RenderProxy::~RenderProxy() { destroyContext(); } diff --git a/libs/hwui/renderthread/RenderProxy.h b/libs/hwui/renderthread/RenderProxy.h index 1b0f22e75a2d..5f6b5cde652d 100644 --- a/libs/hwui/renderthread/RenderProxy.h +++ b/libs/hwui/renderthread/RenderProxy.h @@ -62,10 +62,14 @@ enum { * references RenderProxy fields. This is safe as RenderProxy cannot * be deleted if it is blocked inside a call. */ -class RenderProxy { +class RenderProxy final { public: RenderProxy(bool opaque, RenderNode* rootNode, IContextFactory* contextFactory); - virtual ~RenderProxy(); + ~RenderProxy(); + + // Schedules a delete of the RenderProxy at a later date. Avoids blocking the current thread + // on destruction which ~RenderProxy does by default. + static void asyncDelete(RenderProxy*); // Won't take effect until next EGLSurface creation void setSwapBehavior(SwapBehavior swapBehavior); |