Merge "Cleanup DeferredLayerUpdater" into lmp-dev

This commit is contained in:
John Reck
2014-10-03 22:22:51 +00:00
committed by Android (Google) Code Review
8 changed files with 36 additions and 50 deletions

View File

@@ -493,7 +493,6 @@ public class ThreadedRenderer extends HardwareRenderer {
private static native void nInvokeFunctor(long functor, boolean waitForCompletion); 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 long nCreateTextureLayer(long nativeProxy);
private static native void nBuildLayer(long nativeProxy, long node); private static native void nBuildLayer(long nativeProxy, long node);
private static native boolean nCopyLayerInto(long nativeProxy, long layer, long bitmap); private static native boolean nCopyLayerInto(long nativeProxy, long layer, long bitmap);

View File

@@ -320,13 +320,6 @@ static void android_view_ThreadedRenderer_invokeFunctor(JNIEnv* env, jobject cla
RenderProxy::invokeFunctor(functor, waitForCompletion); 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, static jlong android_view_ThreadedRenderer_createTextureLayer(JNIEnv* env, jobject clazz,
jlong proxyPtr) { jlong proxyPtr) {
RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
@@ -443,7 +436,6 @@ static JNINativeMethod gMethods[] = {
{ "nDestroy", "(J)V", (void*) android_view_ThreadedRenderer_destroy }, { "nDestroy", "(J)V", (void*) android_view_ThreadedRenderer_destroy },
{ "nRegisterAnimatingRenderNode", "(JJ)V", (void*) android_view_ThreadedRenderer_registerAnimatingRenderNode }, { "nRegisterAnimatingRenderNode", "(JJ)V", (void*) android_view_ThreadedRenderer_registerAnimatingRenderNode },
{ "nInvokeFunctor", "(JZ)V", (void*) android_view_ThreadedRenderer_invokeFunctor }, { "nInvokeFunctor", "(JZ)V", (void*) android_view_ThreadedRenderer_invokeFunctor },
{ "nCreateDisplayListLayer", "(JII)J", (void*) android_view_ThreadedRenderer_createDisplayListLayer },
{ "nCreateTextureLayer", "(J)J", (void*) android_view_ThreadedRenderer_createTextureLayer }, { "nCreateTextureLayer", "(J)J", (void*) android_view_ThreadedRenderer_createTextureLayer },
{ "nBuildLayer", "(JJ)V", (void*) android_view_ThreadedRenderer_buildLayer }, { "nBuildLayer", "(JJ)V", (void*) android_view_ThreadedRenderer_buildLayer },
{ "nCopyLayerInto", "(JJJ)Z", (void*) android_view_ThreadedRenderer_copyLayerInto }, { "nCopyLayerInto", "(JJJ)Z", (void*) android_view_ThreadedRenderer_copyLayerInto },

View File

@@ -18,38 +18,52 @@
#include "OpenGLRenderer.h" #include "OpenGLRenderer.h"
#include "LayerRenderer.h" #include "LayerRenderer.h"
#include "renderthread/EglManager.h"
#include "renderthread/RenderTask.h"
namespace android { namespace android {
namespace uirenderer { namespace uirenderer {
static void defaultLayerDestroyer(Layer* layer) { class DeleteLayerTask : public renderthread::RenderTask {
Caches::getInstance().resourceCache.decrementRefcount(layer); public:
DeleteLayerTask(renderthread::EglManager& eglManager, Layer* layer)
: mEglManager(eglManager)
, mLayer(layer)
{}
virtual void run() {
mEglManager.requireGlContext();
LayerRenderer::destroyLayer(mLayer);
mLayer = 0;
delete this;
} }
DeferredLayerUpdater::DeferredLayerUpdater(Layer* layer, LayerDestroyer destroyer) private:
renderthread::EglManager& mEglManager;
Layer* mLayer;
};
DeferredLayerUpdater::DeferredLayerUpdater(renderthread::RenderThread& thread, Layer* layer)
: mSurfaceTexture(0) : mSurfaceTexture(0)
, mTransform(0) , mTransform(0)
, mNeedsGLContextAttach(false) , mNeedsGLContextAttach(false)
, mUpdateTexImage(false) , mUpdateTexImage(false)
, mLayer(layer) , mLayer(layer)
, mCaches(Caches::getInstance()) , mCaches(Caches::getInstance())
, mDestroyer(destroyer) { , mRenderThread(thread) {
mWidth = mLayer->layer.getWidth(); mWidth = mLayer->layer.getWidth();
mHeight = mLayer->layer.getHeight(); mHeight = mLayer->layer.getHeight();
mBlend = mLayer->isBlend(); mBlend = mLayer->isBlend();
mColorFilter = SkSafeRef(mLayer->getColorFilter()); mColorFilter = SkSafeRef(mLayer->getColorFilter());
mAlpha = mLayer->getAlpha(); mAlpha = mLayer->getAlpha();
mMode = mLayer->getMode(); mMode = mLayer->getMode();
if (!mDestroyer) {
mDestroyer = defaultLayerDestroyer;
}
} }
DeferredLayerUpdater::~DeferredLayerUpdater() { DeferredLayerUpdater::~DeferredLayerUpdater() {
SkSafeUnref(mColorFilter); SkSafeUnref(mColorFilter);
setTransform(0); setTransform(0);
mDestroyer(mLayer); mRenderThread.queue(new DeleteLayerTask(mRenderThread.eglManager(), mLayer));
mLayer = 0;
} }
void DeferredLayerUpdater::setPaint(const SkPaint* paint) { void DeferredLayerUpdater::setPaint(const SkPaint* paint) {
@@ -121,7 +135,12 @@ void DeferredLayerUpdater::doUpdateTexImage() {
void DeferredLayerUpdater::detachSurfaceTexture() { void DeferredLayerUpdater::detachSurfaceTexture() {
if (mSurfaceTexture.get()) { 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; mSurfaceTexture = 0;
mLayer->clearTexture(); mLayer->clearTexture();
} }

View File

@@ -25,19 +25,18 @@
#include "Layer.h" #include "Layer.h"
#include "Rect.h" #include "Rect.h"
#include "RenderNode.h" #include "RenderNode.h"
#include "renderthread/RenderThread.h"
namespace android { namespace android {
namespace uirenderer { namespace uirenderer {
typedef void (*LayerDestroyer)(Layer* layer);
// Container to hold the properties a layer should be set to at the start // Container to hold the properties a layer should be set to at the start
// of a render pass // of a render pass
class DeferredLayerUpdater : public VirtualLightRefBase { class DeferredLayerUpdater : public VirtualLightRefBase {
public: public:
// Note that DeferredLayerUpdater assumes it is taking ownership of the layer // Note that DeferredLayerUpdater assumes it is taking ownership of the layer
// and will not call incrementRef on it as a result. // 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 ~DeferredLayerUpdater();
ANDROID_API bool setSize(uint32_t width, uint32_t height) { ANDROID_API bool setSize(uint32_t width, uint32_t height) {
@@ -99,8 +98,7 @@ private:
Layer* mLayer; Layer* mLayer;
Caches& mCaches; Caches& mCaches;
renderthread::RenderThread& mRenderThread;
LayerDestroyer mDestroyer;
void doUpdateTexImage(); void doUpdateTexImage();
}; };

View File

@@ -344,11 +344,6 @@ void CanvasContext::runWithGlContext(RenderTask* task) {
task->run(); task->run();
} }
Layer* CanvasContext::createRenderLayer(int width, int height) {
requireSurface();
return LayerRenderer::createRenderLayer(mRenderThread.renderState(), width, height);
}
Layer* CanvasContext::createTextureLayer() { Layer* CanvasContext::createTextureLayer() {
requireSurface(); requireSurface();
return LayerRenderer::createTextureLayer(mRenderThread.renderState()); return LayerRenderer::createTextureLayer(mRenderThread.renderState());

View File

@@ -83,7 +83,6 @@ public:
void runWithGlContext(RenderTask* task); void runWithGlContext(RenderTask* task);
Layer* createRenderLayer(int width, int height);
Layer* createTextureLayer(); Layer* createTextureLayer();
ANDROID_API static void setTextureAtlas(RenderThread& thread, ANDROID_API static void setTextureAtlas(RenderThread& thread,

View File

@@ -257,31 +257,16 @@ void RenderProxy::enqueueDestroyLayer(Layer* layer) {
RenderThread::getInstance().queue(task); RenderThread::getInstance().queue(task);
} }
CREATE_BRIDGE3(createDisplayListLayer, CanvasContext* context, int width, int height) { CREATE_BRIDGE2(createTextureLayer, RenderThread* thread, CanvasContext* context) {
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) {
Layer* layer = args->context->createTextureLayer(); Layer* layer = args->context->createTextureLayer();
if (!layer) return 0; if (!layer) return 0;
return new DeferredLayerUpdater(layer, RenderProxy::enqueueDestroyLayer); return new DeferredLayerUpdater(*args->thread, layer);
} }
DeferredLayerUpdater* RenderProxy::createTextureLayer() { DeferredLayerUpdater* RenderProxy::createTextureLayer() {
SETUP_TASK(createTextureLayer); SETUP_TASK(createTextureLayer);
args->context = mContext; args->context = mContext;
args->thread = &mRenderThread;
void* retval = postAndWait(task); void* retval = postAndWait(task);
DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(retval); DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(retval);
return layer; return layer;

View File

@@ -80,7 +80,6 @@ public:
ANDROID_API void runWithGlContext(RenderTask* task); ANDROID_API void runWithGlContext(RenderTask* task);
static void enqueueDestroyLayer(Layer* layer); static void enqueueDestroyLayer(Layer* layer);
ANDROID_API DeferredLayerUpdater* createDisplayListLayer(int width, int height);
ANDROID_API DeferredLayerUpdater* createTextureLayer(); ANDROID_API DeferredLayerUpdater* createTextureLayer();
ANDROID_API void buildLayer(RenderNode* node); ANDROID_API void buildLayer(RenderNode* node);
ANDROID_API bool copyLayerInto(DeferredLayerUpdater* layer, SkBitmap* bitmap); ANDROID_API bool copyLayerInto(DeferredLayerUpdater* layer, SkBitmap* bitmap);