Skip to content

Commit 749906b

Browse files
committed
Cleanup DeferredLayerUpdater
Bug: 17765082 DeferredLayerUpdater had fallen behind RT updates. Re-snap to latest expectations, ensuring to call requireGlContext() prior to detachSurfaceTexture to avoid leaking SurfaceTextures Change-Id: Ic65fb9831e5284f658866da8da9ad5af1d227699
1 parent a79caa5 commit 749906b

8 files changed

Lines changed: 36 additions & 50 deletions

File tree

core/java/android/view/ThreadedRenderer.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -493,7 +493,6 @@ private static native int nSyncAndDrawFrame(long nativeProxy,
493493

494494
private static native void nInvokeFunctor(long functor, boolean waitForCompletion);
495495

496-
private static native long nCreateDisplayListLayer(long nativeProxy, int width, int height);
497496
private static native long nCreateTextureLayer(long nativeProxy);
498497
private static native void nBuildLayer(long nativeProxy, long node);
499498
private static native boolean nCopyLayerInto(long nativeProxy, long layer, long bitmap);

core/jni/android_view_ThreadedRenderer.cpp

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -320,13 +320,6 @@ static void android_view_ThreadedRenderer_invokeFunctor(JNIEnv* env, jobject cla
320320
RenderProxy::invokeFunctor(functor, waitForCompletion);
321321
}
322322

323-
static jlong android_view_ThreadedRenderer_createDisplayListLayer(JNIEnv* env, jobject clazz,
324-
jlong proxyPtr, jint width, jint height) {
325-
RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
326-
DeferredLayerUpdater* layer = proxy->createDisplayListLayer(width, height);
327-
return reinterpret_cast<jlong>(layer);
328-
}
329-
330323
static jlong android_view_ThreadedRenderer_createTextureLayer(JNIEnv* env, jobject clazz,
331324
jlong proxyPtr) {
332325
RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
@@ -443,7 +436,6 @@ static JNINativeMethod gMethods[] = {
443436
{ "nDestroy", "(J)V", (void*) android_view_ThreadedRenderer_destroy },
444437
{ "nRegisterAnimatingRenderNode", "(JJ)V", (void*) android_view_ThreadedRenderer_registerAnimatingRenderNode },
445438
{ "nInvokeFunctor", "(JZ)V", (void*) android_view_ThreadedRenderer_invokeFunctor },
446-
{ "nCreateDisplayListLayer", "(JII)J", (void*) android_view_ThreadedRenderer_createDisplayListLayer },
447439
{ "nCreateTextureLayer", "(J)J", (void*) android_view_ThreadedRenderer_createTextureLayer },
448440
{ "nBuildLayer", "(JJ)V", (void*) android_view_ThreadedRenderer_buildLayer },
449441
{ "nCopyLayerInto", "(JJJ)Z", (void*) android_view_ThreadedRenderer_copyLayerInto },

libs/hwui/DeferredLayerUpdater.cpp

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,38 +18,52 @@
1818
#include "OpenGLRenderer.h"
1919

2020
#include "LayerRenderer.h"
21+
#include "renderthread/EglManager.h"
22+
#include "renderthread/RenderTask.h"
2123

2224
namespace android {
2325
namespace uirenderer {
2426

25-
static void defaultLayerDestroyer(Layer* layer) {
26-
Caches::getInstance().resourceCache.decrementRefcount(layer);
27-
}
27+
class DeleteLayerTask : public renderthread::RenderTask {
28+
public:
29+
DeleteLayerTask(renderthread::EglManager& eglManager, Layer* layer)
30+
: mEglManager(eglManager)
31+
, mLayer(layer)
32+
{}
33+
34+
virtual void run() {
35+
mEglManager.requireGlContext();
36+
LayerRenderer::destroyLayer(mLayer);
37+
mLayer = 0;
38+
delete this;
39+
}
2840

29-
DeferredLayerUpdater::DeferredLayerUpdater(Layer* layer, LayerDestroyer destroyer)
41+
private:
42+
renderthread::EglManager& mEglManager;
43+
Layer* mLayer;
44+
};
45+
46+
DeferredLayerUpdater::DeferredLayerUpdater(renderthread::RenderThread& thread, Layer* layer)
3047
: mSurfaceTexture(0)
3148
, mTransform(0)
3249
, mNeedsGLContextAttach(false)
3350
, mUpdateTexImage(false)
3451
, mLayer(layer)
3552
, mCaches(Caches::getInstance())
36-
, mDestroyer(destroyer) {
53+
, mRenderThread(thread) {
3754
mWidth = mLayer->layer.getWidth();
3855
mHeight = mLayer->layer.getHeight();
3956
mBlend = mLayer->isBlend();
4057
mColorFilter = SkSafeRef(mLayer->getColorFilter());
4158
mAlpha = mLayer->getAlpha();
4259
mMode = mLayer->getMode();
43-
44-
if (!mDestroyer) {
45-
mDestroyer = defaultLayerDestroyer;
46-
}
4760
}
4861

4962
DeferredLayerUpdater::~DeferredLayerUpdater() {
5063
SkSafeUnref(mColorFilter);
5164
setTransform(0);
52-
mDestroyer(mLayer);
65+
mRenderThread.queue(new DeleteLayerTask(mRenderThread.eglManager(), mLayer));
66+
mLayer = 0;
5367
}
5468

5569
void DeferredLayerUpdater::setPaint(const SkPaint* paint) {
@@ -121,7 +135,12 @@ void DeferredLayerUpdater::doUpdateTexImage() {
121135

122136
void DeferredLayerUpdater::detachSurfaceTexture() {
123137
if (mSurfaceTexture.get()) {
124-
mSurfaceTexture->detachFromContext();
138+
mRenderThread.eglManager().requireGlContext();
139+
status_t err = mSurfaceTexture->detachFromContext();
140+
if (err != 0) {
141+
// TODO: Elevate to fatal exception
142+
ALOGE("Failed to detach SurfaceTexture from context %d", err);
143+
}
125144
mSurfaceTexture = 0;
126145
mLayer->clearTexture();
127146
}

libs/hwui/DeferredLayerUpdater.h

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,19 +25,18 @@
2525
#include "Layer.h"
2626
#include "Rect.h"
2727
#include "RenderNode.h"
28+
#include "renderthread/RenderThread.h"
2829

2930
namespace android {
3031
namespace uirenderer {
3132

32-
typedef void (*LayerDestroyer)(Layer* layer);
33-
3433
// Container to hold the properties a layer should be set to at the start
3534
// of a render pass
3635
class DeferredLayerUpdater : public VirtualLightRefBase {
3736
public:
3837
// Note that DeferredLayerUpdater assumes it is taking ownership of the layer
3938
// and will not call incrementRef on it as a result.
40-
ANDROID_API DeferredLayerUpdater(Layer* layer, LayerDestroyer = 0);
39+
ANDROID_API DeferredLayerUpdater(renderthread::RenderThread& thread, Layer* layer);
4140
ANDROID_API ~DeferredLayerUpdater();
4241

4342
ANDROID_API bool setSize(uint32_t width, uint32_t height) {
@@ -99,8 +98,7 @@ class DeferredLayerUpdater : public VirtualLightRefBase {
9998

10099
Layer* mLayer;
101100
Caches& mCaches;
102-
103-
LayerDestroyer mDestroyer;
101+
renderthread::RenderThread& mRenderThread;
104102

105103
void doUpdateTexImage();
106104
};

libs/hwui/renderthread/CanvasContext.cpp

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -344,11 +344,6 @@ void CanvasContext::runWithGlContext(RenderTask* task) {
344344
task->run();
345345
}
346346

347-
Layer* CanvasContext::createRenderLayer(int width, int height) {
348-
requireSurface();
349-
return LayerRenderer::createRenderLayer(mRenderThread.renderState(), width, height);
350-
}
351-
352347
Layer* CanvasContext::createTextureLayer() {
353348
requireSurface();
354349
return LayerRenderer::createTextureLayer(mRenderThread.renderState());

libs/hwui/renderthread/CanvasContext.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,6 @@ class CanvasContext : public IFrameCallback {
8383

8484
void runWithGlContext(RenderTask* task);
8585

86-
Layer* createRenderLayer(int width, int height);
8786
Layer* createTextureLayer();
8887

8988
ANDROID_API static void setTextureAtlas(RenderThread& thread,

libs/hwui/renderthread/RenderProxy.cpp

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -257,31 +257,16 @@ void RenderProxy::enqueueDestroyLayer(Layer* layer) {
257257
RenderThread::getInstance().queue(task);
258258
}
259259

260-
CREATE_BRIDGE3(createDisplayListLayer, CanvasContext* context, int width, int height) {
261-
Layer* layer = args->context->createRenderLayer(args->width, args->height);
262-
if (!layer) return 0;
263-
return new DeferredLayerUpdater(layer, RenderProxy::enqueueDestroyLayer);
264-
}
265-
266-
DeferredLayerUpdater* RenderProxy::createDisplayListLayer(int width, int height) {
267-
SETUP_TASK(createDisplayListLayer);
268-
args->width = width;
269-
args->height = height;
270-
args->context = mContext;
271-
void* retval = postAndWait(task);
272-
DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(retval);
273-
return layer;
274-
}
275-
276-
CREATE_BRIDGE1(createTextureLayer, CanvasContext* context) {
260+
CREATE_BRIDGE2(createTextureLayer, RenderThread* thread, CanvasContext* context) {
277261
Layer* layer = args->context->createTextureLayer();
278262
if (!layer) return 0;
279-
return new DeferredLayerUpdater(layer, RenderProxy::enqueueDestroyLayer);
263+
return new DeferredLayerUpdater(*args->thread, layer);
280264
}
281265

282266
DeferredLayerUpdater* RenderProxy::createTextureLayer() {
283267
SETUP_TASK(createTextureLayer);
284268
args->context = mContext;
269+
args->thread = &mRenderThread;
285270
void* retval = postAndWait(task);
286271
DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(retval);
287272
return layer;

libs/hwui/renderthread/RenderProxy.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,6 @@ class ANDROID_API RenderProxy {
8080
ANDROID_API void runWithGlContext(RenderTask* task);
8181

8282
static void enqueueDestroyLayer(Layer* layer);
83-
ANDROID_API DeferredLayerUpdater* createDisplayListLayer(int width, int height);
8483
ANDROID_API DeferredLayerUpdater* createTextureLayer();
8584
ANDROID_API void buildLayer(RenderNode* node);
8685
ANDROID_API bool copyLayerInto(DeferredLayerUpdater* layer, SkBitmap* bitmap);

0 commit comments

Comments
 (0)