summaryrefslogtreecommitdiff
path: root/libs/hwui/FrameBuilder.cpp
diff options
context:
space:
mode:
author Chris Craik <ccraik@google.com> 2016-03-25 18:34:11 -0700
committer Chris Craik <ccraik@google.com> 2016-03-28 10:12:37 -0700
commitaafb01d8ade0def3f51b74ae3bbc610c4ab33044 (patch)
tree90378c4fa87983aa79174e99d2c96e82deb2557f /libs/hwui/FrameBuilder.cpp
parent83b9db029b6fe02761e1c8e50eb8dce6f4d37d0f (diff)
Consume TextureView matrix safely
Fixes: 27825042 TextureView's matrix may not be set at record time - delay using it until on RenderThread, when deferring the op. Change-Id: Icf8b55d656e304ec049ca803b042dc2359482db2
Diffstat (limited to 'libs/hwui/FrameBuilder.cpp')
-rw-r--r--libs/hwui/FrameBuilder.cpp12
1 files changed, 11 insertions, 1 deletions
diff --git a/libs/hwui/FrameBuilder.cpp b/libs/hwui/FrameBuilder.cpp
index 0ebb8866bdb3..b1314feebf34 100644
--- a/libs/hwui/FrameBuilder.cpp
+++ b/libs/hwui/FrameBuilder.cpp
@@ -699,7 +699,17 @@ void FrameBuilder::deferTextOnPathOp(const TextOnPathOp& op) {
void FrameBuilder::deferTextureLayerOp(const TextureLayerOp& op) {
if (CC_UNLIKELY(!op.layer->isRenderable())) return;
- BakedOpState* bakedState = tryBakeOpState(op);
+
+ const TextureLayerOp* textureLayerOp = &op;
+ // Now safe to access transform (which was potentially unready at record time)
+ if (!op.layer->getTransform().isIdentity()) {
+ // non-identity transform present, so 'inject it' into op by copying + replacing matrix
+ Matrix4 combinedMatrix(op.localMatrix);
+ combinedMatrix.multiply(op.layer->getTransform());
+ textureLayerOp = mAllocator.create<TextureLayerOp>(op, combinedMatrix);
+ }
+ BakedOpState* bakedState = tryBakeOpState(*textureLayerOp);
+
if (!bakedState) return; // quick rejected
currentLayer().deferUnmergeableOp(mAllocator, bakedState, OpBatchType::TextureLayer);
}