Merge "Delete RenderProxy off of the cleaner thread" into sc-dev

This commit is contained in:
Rob Carr
2021-06-25 02:18:17 +00:00
committed by Android (Google) Code Review
3 changed files with 19 additions and 3 deletions

View File

@@ -247,7 +247,7 @@ static jlong android_view_ThreadedRenderer_createProxy(JNIEnv* env, jobject claz
static void android_view_ThreadedRenderer_deleteProxy(JNIEnv* env, jobject clazz, static void android_view_ThreadedRenderer_deleteProxy(JNIEnv* env, jobject clazz,
jlong proxyPtr) { jlong proxyPtr) {
RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
delete proxy; RenderProxy::asyncDelete(proxy);
} }
static jboolean android_view_ThreadedRenderer_loadSystemProperties(JNIEnv* env, jobject clazz, static jboolean android_view_ThreadedRenderer_loadSystemProperties(JNIEnv* env, jobject clazz,

View File

@@ -26,6 +26,7 @@
#include "renderthread/CanvasContext.h" #include "renderthread/CanvasContext.h"
#include "renderthread/RenderTask.h" #include "renderthread/RenderTask.h"
#include "renderthread/RenderThread.h" #include "renderthread/RenderThread.h"
#include "thread/CommonPool.h"
#include "utils/Macros.h" #include "utils/Macros.h"
#include "utils/TimeUtils.h" #include "utils/TimeUtils.h"
@@ -42,6 +43,17 @@ RenderProxy::RenderProxy(bool translucent, RenderNode* rootRenderNode,
mDrawFrameTask.setContext(&mRenderThread, mContext, 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() { RenderProxy::~RenderProxy() {
destroyContext(); destroyContext();
} }

View File

@@ -62,10 +62,14 @@ enum {
* references RenderProxy fields. This is safe as RenderProxy cannot * references RenderProxy fields. This is safe as RenderProxy cannot
* be deleted if it is blocked inside a call. * be deleted if it is blocked inside a call.
*/ */
class RenderProxy { class RenderProxy final {
public: public:
RenderProxy(bool opaque, RenderNode* rootNode, IContextFactory* contextFactory); 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 // Won't take effect until next EGLSurface creation
void setSwapBehavior(SwapBehavior swapBehavior); void setSwapBehavior(SwapBehavior swapBehavior);