summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/hwui/jni/android_graphics_HardwareRenderer.cpp2
-rw-r--r--libs/hwui/renderthread/RenderProxy.cpp12
-rw-r--r--libs/hwui/renderthread/RenderProxy.h8
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);