Merge "Cleanup DeferredLayerUpdater" into lmp-dev
This commit is contained in:
@ -493,7 +493,6 @@ public class ThreadedRenderer extends HardwareRenderer {
|
||||
|
||||
private static native void nInvokeFunctor(long functor, boolean waitForCompletion);
|
||||
|
||||
private static native long nCreateDisplayListLayer(long nativeProxy, int width, int height);
|
||||
private static native long nCreateTextureLayer(long nativeProxy);
|
||||
private static native void nBuildLayer(long nativeProxy, long node);
|
||||
private static native boolean nCopyLayerInto(long nativeProxy, long layer, long bitmap);
|
||||
|
@ -320,13 +320,6 @@ static void android_view_ThreadedRenderer_invokeFunctor(JNIEnv* env, jobject cla
|
||||
RenderProxy::invokeFunctor(functor, waitForCompletion);
|
||||
}
|
||||
|
||||
static jlong android_view_ThreadedRenderer_createDisplayListLayer(JNIEnv* env, jobject clazz,
|
||||
jlong proxyPtr, jint width, jint height) {
|
||||
RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
|
||||
DeferredLayerUpdater* layer = proxy->createDisplayListLayer(width, height);
|
||||
return reinterpret_cast<jlong>(layer);
|
||||
}
|
||||
|
||||
static jlong android_view_ThreadedRenderer_createTextureLayer(JNIEnv* env, jobject clazz,
|
||||
jlong proxyPtr) {
|
||||
RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
|
||||
@ -443,7 +436,6 @@ static JNINativeMethod gMethods[] = {
|
||||
{ "nDestroy", "(J)V", (void*) android_view_ThreadedRenderer_destroy },
|
||||
{ "nRegisterAnimatingRenderNode", "(JJ)V", (void*) android_view_ThreadedRenderer_registerAnimatingRenderNode },
|
||||
{ "nInvokeFunctor", "(JZ)V", (void*) android_view_ThreadedRenderer_invokeFunctor },
|
||||
{ "nCreateDisplayListLayer", "(JII)J", (void*) android_view_ThreadedRenderer_createDisplayListLayer },
|
||||
{ "nCreateTextureLayer", "(J)J", (void*) android_view_ThreadedRenderer_createTextureLayer },
|
||||
{ "nBuildLayer", "(JJ)V", (void*) android_view_ThreadedRenderer_buildLayer },
|
||||
{ "nCopyLayerInto", "(JJJ)Z", (void*) android_view_ThreadedRenderer_copyLayerInto },
|
||||
|
@ -18,38 +18,52 @@
|
||||
#include "OpenGLRenderer.h"
|
||||
|
||||
#include "LayerRenderer.h"
|
||||
#include "renderthread/EglManager.h"
|
||||
#include "renderthread/RenderTask.h"
|
||||
|
||||
namespace android {
|
||||
namespace uirenderer {
|
||||
|
||||
static void defaultLayerDestroyer(Layer* layer) {
|
||||
Caches::getInstance().resourceCache.decrementRefcount(layer);
|
||||
}
|
||||
class DeleteLayerTask : public renderthread::RenderTask {
|
||||
public:
|
||||
DeleteLayerTask(renderthread::EglManager& eglManager, Layer* layer)
|
||||
: mEglManager(eglManager)
|
||||
, mLayer(layer)
|
||||
{}
|
||||
|
||||
DeferredLayerUpdater::DeferredLayerUpdater(Layer* layer, LayerDestroyer destroyer)
|
||||
virtual void run() {
|
||||
mEglManager.requireGlContext();
|
||||
LayerRenderer::destroyLayer(mLayer);
|
||||
mLayer = 0;
|
||||
delete this;
|
||||
}
|
||||
|
||||
private:
|
||||
renderthread::EglManager& mEglManager;
|
||||
Layer* mLayer;
|
||||
};
|
||||
|
||||
DeferredLayerUpdater::DeferredLayerUpdater(renderthread::RenderThread& thread, Layer* layer)
|
||||
: mSurfaceTexture(0)
|
||||
, mTransform(0)
|
||||
, mNeedsGLContextAttach(false)
|
||||
, mUpdateTexImage(false)
|
||||
, mLayer(layer)
|
||||
, mCaches(Caches::getInstance())
|
||||
, mDestroyer(destroyer) {
|
||||
, mRenderThread(thread) {
|
||||
mWidth = mLayer->layer.getWidth();
|
||||
mHeight = mLayer->layer.getHeight();
|
||||
mBlend = mLayer->isBlend();
|
||||
mColorFilter = SkSafeRef(mLayer->getColorFilter());
|
||||
mAlpha = mLayer->getAlpha();
|
||||
mMode = mLayer->getMode();
|
||||
|
||||
if (!mDestroyer) {
|
||||
mDestroyer = defaultLayerDestroyer;
|
||||
}
|
||||
}
|
||||
|
||||
DeferredLayerUpdater::~DeferredLayerUpdater() {
|
||||
SkSafeUnref(mColorFilter);
|
||||
setTransform(0);
|
||||
mDestroyer(mLayer);
|
||||
mRenderThread.queue(new DeleteLayerTask(mRenderThread.eglManager(), mLayer));
|
||||
mLayer = 0;
|
||||
}
|
||||
|
||||
void DeferredLayerUpdater::setPaint(const SkPaint* paint) {
|
||||
@ -121,7 +135,12 @@ void DeferredLayerUpdater::doUpdateTexImage() {
|
||||
|
||||
void DeferredLayerUpdater::detachSurfaceTexture() {
|
||||
if (mSurfaceTexture.get()) {
|
||||
mSurfaceTexture->detachFromContext();
|
||||
mRenderThread.eglManager().requireGlContext();
|
||||
status_t err = mSurfaceTexture->detachFromContext();
|
||||
if (err != 0) {
|
||||
// TODO: Elevate to fatal exception
|
||||
ALOGE("Failed to detach SurfaceTexture from context %d", err);
|
||||
}
|
||||
mSurfaceTexture = 0;
|
||||
mLayer->clearTexture();
|
||||
}
|
||||
|
@ -25,19 +25,18 @@
|
||||
#include "Layer.h"
|
||||
#include "Rect.h"
|
||||
#include "RenderNode.h"
|
||||
#include "renderthread/RenderThread.h"
|
||||
|
||||
namespace android {
|
||||
namespace uirenderer {
|
||||
|
||||
typedef void (*LayerDestroyer)(Layer* layer);
|
||||
|
||||
// Container to hold the properties a layer should be set to at the start
|
||||
// of a render pass
|
||||
class DeferredLayerUpdater : public VirtualLightRefBase {
|
||||
public:
|
||||
// Note that DeferredLayerUpdater assumes it is taking ownership of the layer
|
||||
// and will not call incrementRef on it as a result.
|
||||
ANDROID_API DeferredLayerUpdater(Layer* layer, LayerDestroyer = 0);
|
||||
ANDROID_API DeferredLayerUpdater(renderthread::RenderThread& thread, Layer* layer);
|
||||
ANDROID_API ~DeferredLayerUpdater();
|
||||
|
||||
ANDROID_API bool setSize(uint32_t width, uint32_t height) {
|
||||
@ -99,8 +98,7 @@ private:
|
||||
|
||||
Layer* mLayer;
|
||||
Caches& mCaches;
|
||||
|
||||
LayerDestroyer mDestroyer;
|
||||
renderthread::RenderThread& mRenderThread;
|
||||
|
||||
void doUpdateTexImage();
|
||||
};
|
||||
|
@ -344,11 +344,6 @@ void CanvasContext::runWithGlContext(RenderTask* task) {
|
||||
task->run();
|
||||
}
|
||||
|
||||
Layer* CanvasContext::createRenderLayer(int width, int height) {
|
||||
requireSurface();
|
||||
return LayerRenderer::createRenderLayer(mRenderThread.renderState(), width, height);
|
||||
}
|
||||
|
||||
Layer* CanvasContext::createTextureLayer() {
|
||||
requireSurface();
|
||||
return LayerRenderer::createTextureLayer(mRenderThread.renderState());
|
||||
|
@ -83,7 +83,6 @@ public:
|
||||
|
||||
void runWithGlContext(RenderTask* task);
|
||||
|
||||
Layer* createRenderLayer(int width, int height);
|
||||
Layer* createTextureLayer();
|
||||
|
||||
ANDROID_API static void setTextureAtlas(RenderThread& thread,
|
||||
|
@ -257,31 +257,16 @@ void RenderProxy::enqueueDestroyLayer(Layer* layer) {
|
||||
RenderThread::getInstance().queue(task);
|
||||
}
|
||||
|
||||
CREATE_BRIDGE3(createDisplayListLayer, CanvasContext* context, int width, int height) {
|
||||
Layer* layer = args->context->createRenderLayer(args->width, args->height);
|
||||
if (!layer) return 0;
|
||||
return new DeferredLayerUpdater(layer, RenderProxy::enqueueDestroyLayer);
|
||||
}
|
||||
|
||||
DeferredLayerUpdater* RenderProxy::createDisplayListLayer(int width, int height) {
|
||||
SETUP_TASK(createDisplayListLayer);
|
||||
args->width = width;
|
||||
args->height = height;
|
||||
args->context = mContext;
|
||||
void* retval = postAndWait(task);
|
||||
DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(retval);
|
||||
return layer;
|
||||
}
|
||||
|
||||
CREATE_BRIDGE1(createTextureLayer, CanvasContext* context) {
|
||||
CREATE_BRIDGE2(createTextureLayer, RenderThread* thread, CanvasContext* context) {
|
||||
Layer* layer = args->context->createTextureLayer();
|
||||
if (!layer) return 0;
|
||||
return new DeferredLayerUpdater(layer, RenderProxy::enqueueDestroyLayer);
|
||||
return new DeferredLayerUpdater(*args->thread, layer);
|
||||
}
|
||||
|
||||
DeferredLayerUpdater* RenderProxy::createTextureLayer() {
|
||||
SETUP_TASK(createTextureLayer);
|
||||
args->context = mContext;
|
||||
args->thread = &mRenderThread;
|
||||
void* retval = postAndWait(task);
|
||||
DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(retval);
|
||||
return layer;
|
||||
|
@ -80,7 +80,6 @@ public:
|
||||
ANDROID_API void runWithGlContext(RenderTask* task);
|
||||
|
||||
static void enqueueDestroyLayer(Layer* layer);
|
||||
ANDROID_API DeferredLayerUpdater* createDisplayListLayer(int width, int height);
|
||||
ANDROID_API DeferredLayerUpdater* createTextureLayer();
|
||||
ANDROID_API void buildLayer(RenderNode* node);
|
||||
ANDROID_API bool copyLayerInto(DeferredLayerUpdater* layer, SkBitmap* bitmap);
|
||||
|
Reference in New Issue
Block a user