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 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);
|
||||||
|
|||||||
@@ -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 },
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user