Merge "Delete RenderProxy off of the cleaner thread" into sc-dev
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user