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 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);

View File

@ -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 },

View File

@ -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();
}

View File

@ -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();
};

View File

@ -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());

View File

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

View File

@ -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;

View File

@ -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);