Implement full View.buildLayer
Bug: 17152292 Change-Id: Ia3cc2aadf72fe14517f50762fc634794df51ad5a
This commit is contained in:
@@ -349,6 +349,8 @@ public abstract class HardwareRenderer {
|
||||
*/
|
||||
abstract HardwareLayer createTextureLayer();
|
||||
|
||||
abstract void buildLayer(RenderNode node);
|
||||
|
||||
abstract boolean copyLayerInto(HardwareLayer layer, Bitmap bitmap);
|
||||
|
||||
/**
|
||||
|
||||
@@ -331,6 +331,11 @@ public class ThreadedRenderer extends HardwareRenderer {
|
||||
return HardwareLayer.adoptTextureLayer(this, layer);
|
||||
}
|
||||
|
||||
@Override
|
||||
void buildLayer(RenderNode node) {
|
||||
nBuildLayer(mNativeProxy, node.getNativeDisplayList());
|
||||
}
|
||||
|
||||
@Override
|
||||
boolean copyLayerInto(final HardwareLayer layer, final Bitmap bitmap) {
|
||||
return nCopyLayerInto(mNativeProxy,
|
||||
@@ -468,6 +473,7 @@ public class ThreadedRenderer extends HardwareRenderer {
|
||||
|
||||
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);
|
||||
private static native void nPushLayerUpdate(long nativeProxy, long layer);
|
||||
private static native void nCancelLayerUpdate(long nativeProxy, long layer);
|
||||
|
||||
@@ -13640,11 +13640,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
|
||||
|
||||
switch (mLayerType) {
|
||||
case LAYER_TYPE_HARDWARE:
|
||||
// The only part of a hardware layer we can build in response to
|
||||
// this call is to ensure the display list is up to date.
|
||||
// The actual rendering of the display list into the layer must
|
||||
// be done at playback time
|
||||
updateDisplayListIfDirty();
|
||||
if (attachInfo.mHardwareRenderer != null && mRenderNode.isValid()) {
|
||||
attachInfo.mHardwareRenderer.buildLayer(mRenderNode);
|
||||
}
|
||||
break;
|
||||
case LAYER_TYPE_SOFTWARE:
|
||||
buildDrawingCache(true);
|
||||
|
||||
@@ -264,6 +264,13 @@ static jlong android_view_ThreadedRenderer_createTextureLayer(JNIEnv* env, jobje
|
||||
return reinterpret_cast<jlong>(layer);
|
||||
}
|
||||
|
||||
static void android_view_ThreadedRenderer_buildLayer(JNIEnv* env, jobject clazz,
|
||||
jlong proxyPtr, jlong nodePtr) {
|
||||
RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
|
||||
RenderNode* node = reinterpret_cast<RenderNode*>(nodePtr);
|
||||
proxy->buildLayer(node);
|
||||
}
|
||||
|
||||
static jboolean android_view_ThreadedRenderer_copyLayerInto(JNIEnv* env, jobject clazz,
|
||||
jlong proxyPtr, jlong layerPtr, jlong bitmapPtr) {
|
||||
RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
|
||||
@@ -367,6 +374,7 @@ static JNINativeMethod gMethods[] = {
|
||||
{ "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 },
|
||||
{ "nPushLayerUpdate", "(JJ)V", (void*) android_view_ThreadedRenderer_pushLayerUpdate },
|
||||
{ "nCancelLayerUpdate", "(JJ)V", (void*) android_view_ThreadedRenderer_cancelLayerUpdate },
|
||||
|
||||
@@ -244,6 +244,29 @@ void CanvasContext::invokeFunctor(RenderThread& thread, Functor* functor) {
|
||||
thread.renderState().invokeFunctor(functor, mode, NULL);
|
||||
}
|
||||
|
||||
void CanvasContext::buildLayer(RenderNode* node) {
|
||||
ATRACE_CALL();
|
||||
if (!mEglManager.hasEglContext() || !mCanvas) {
|
||||
return;
|
||||
}
|
||||
requireGlContext();
|
||||
// buildLayer() will leave the tree in an unknown state, so we must stop drawing
|
||||
stopDrawing();
|
||||
|
||||
TreeInfo info(TreeInfo::MODE_FULL, mRenderThread.renderState());
|
||||
info.frameTimeMs = mRenderThread.timeLord().frameTimeMs();
|
||||
info.damageAccumulator = &mDamageAccumulator;
|
||||
info.renderer = mCanvas;
|
||||
node->prepareTree(info);
|
||||
SkRect ignore;
|
||||
mDamageAccumulator.finish(&ignore);
|
||||
// Tickle the GENERIC property on node to mark it as dirty for damaging
|
||||
// purposes when the frame is actually drawn
|
||||
node->setPropertyFieldsDirty(RenderNode::GENERIC);
|
||||
|
||||
mCanvas->flushLayerUpdates();
|
||||
}
|
||||
|
||||
bool CanvasContext::copyLayerInto(DeferredLayerUpdater* layer, SkBitmap* bitmap) {
|
||||
requireGlContext();
|
||||
layer->apply();
|
||||
|
||||
@@ -65,6 +65,7 @@ public:
|
||||
// IFrameCallback, Chroreographer-driven frame callback entry point
|
||||
virtual void doFrame();
|
||||
|
||||
void buildLayer(RenderNode* node);
|
||||
bool copyLayerInto(DeferredLayerUpdater* layer, SkBitmap* bitmap);
|
||||
|
||||
void destroyHardwareResources();
|
||||
|
||||
@@ -284,6 +284,18 @@ DeferredLayerUpdater* RenderProxy::createTextureLayer() {
|
||||
return layer;
|
||||
}
|
||||
|
||||
CREATE_BRIDGE2(buildLayer, CanvasContext* context, RenderNode* node) {
|
||||
args->context->buildLayer(args->node);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void RenderProxy::buildLayer(RenderNode* node) {
|
||||
SETUP_TASK(buildLayer);
|
||||
args->context = mContext;
|
||||
args->node = node;
|
||||
postAndWait(task);
|
||||
}
|
||||
|
||||
CREATE_BRIDGE3(copyLayerInto, CanvasContext* context, DeferredLayerUpdater* layer,
|
||||
SkBitmap* bitmap) {
|
||||
bool success = args->context->copyLayerInto(args->layer, args->bitmap);
|
||||
|
||||
@@ -81,6 +81,7 @@ public:
|
||||
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);
|
||||
ANDROID_API void pushLayerUpdate(DeferredLayerUpdater* layer);
|
||||
ANDROID_API void cancelLayerUpdate(DeferredLayerUpdater* layer);
|
||||
|
||||
Reference in New Issue
Block a user