Fix missing first frame
Bug: 26776366
Change-Id: I46258c0ff35fdefe5c9f2ee610c904b2dbe8c5d9
diff --git a/libs/hwui/DeferredLayerUpdater.h b/libs/hwui/DeferredLayerUpdater.h
index 6a3c890..44a24c8 100644
--- a/libs/hwui/DeferredLayerUpdater.h
+++ b/libs/hwui/DeferredLayerUpdater.h
@@ -47,6 +47,9 @@
return false;
}
+ int getWidth() { return mWidth; }
+ int getHeight() { return mHeight; }
+
ANDROID_API bool setBlend(bool blend) {
if (blend != mBlend) {
mBlend = blend;
@@ -75,6 +78,10 @@
mTransform = matrix ? new SkMatrix(*matrix) : nullptr;
}
+ SkMatrix* getTransform() {
+ return mTransform;
+ }
+
ANDROID_API void setPaint(const SkPaint* paint);
void apply();
diff --git a/libs/hwui/FrameBuilder.cpp b/libs/hwui/FrameBuilder.cpp
index dc967e0..2fb76ce 100644
--- a/libs/hwui/FrameBuilder.cpp
+++ b/libs/hwui/FrameBuilder.cpp
@@ -669,6 +669,7 @@
}
void FrameBuilder::deferTextureLayerOp(const TextureLayerOp& op) {
+ if (CC_UNLIKELY(!op.layer->isRenderable())) return;
BakedOpState* bakedState = tryBakeOpState(op);
if (!bakedState) return; // quick rejected
currentLayer().deferUnmergeableOp(mAllocator, bakedState, OpBatchType::TextureLayer);
diff --git a/libs/hwui/Layer.h b/libs/hwui/Layer.h
index e00ae66..1e5498b 100644
--- a/libs/hwui/Layer.h
+++ b/libs/hwui/Layer.h
@@ -216,6 +216,10 @@
this->renderTarget = renderTarget;
}
+ inline bool isRenderable() const {
+ return renderTarget != GL_NONE;
+ }
+
void setWrap(GLenum wrap, bool bindTexture = false, bool force = false) {
texture.setWrap(wrap, bindTexture, force, renderTarget);
}
diff --git a/libs/hwui/LayerRenderer.cpp b/libs/hwui/LayerRenderer.cpp
index 5bce8ac..137316f 100644
--- a/libs/hwui/LayerRenderer.cpp
+++ b/libs/hwui/LayerRenderer.cpp
@@ -353,7 +353,7 @@
bool LayerRenderer::copyLayer(RenderState& renderState, Layer* layer, SkBitmap* bitmap) {
Caches& caches = Caches::getInstance();
- if (layer && layer->getRenderTarget() != GL_NONE
+ if (layer && layer->isRenderable()
&& bitmap->width() <= caches.maxTextureSize
&& bitmap->height() <= caches.maxTextureSize) {
diff --git a/libs/hwui/RecordingCanvas.cpp b/libs/hwui/RecordingCanvas.cpp
index cf78781..4eeadb7 100644
--- a/libs/hwui/RecordingCanvas.cpp
+++ b/libs/hwui/RecordingCanvas.cpp
@@ -574,15 +574,19 @@
// We ref the DeferredLayerUpdater due to its thread-safe ref-counting semantics.
mDisplayList->ref(layerHandle);
- Layer* layer = layerHandle->backingLayer();
+ // Note that the backing layer has *not* yet been updated, so don't trust
+ // its width, height, transform, etc...!
Matrix4 totalTransform(*(mState.currentSnapshot()->transform));
- totalTransform.multiply(layer->getTransform());
+ if (layerHandle->getTransform()) {
+ Matrix4 layerTransform(*layerHandle->getTransform());
+ totalTransform.multiply(layerTransform);
+ }
addOp(alloc().create_trivial<TextureLayerOp>(
- Rect(layer->getWidth(), layer->getHeight()),
+ Rect(layerHandle->getWidth(), layerHandle->getHeight()),
totalTransform,
getRecordedClip(),
- layer));
+ layerHandle->backingLayer()));
}
void RecordingCanvas::callDrawGLFunction(Functor* functor) {