diff options
| author | 2016-03-25 18:34:11 -0700 | |
|---|---|---|
| committer | 2016-03-28 10:12:37 -0700 | |
| commit | aafb01d8ade0def3f51b74ae3bbc610c4ab33044 (patch) | |
| tree | 90378c4fa87983aa79174e99d2c96e82deb2557f /libs/hwui/FrameBuilder.cpp | |
| parent | 83b9db029b6fe02761e1c8e50eb8dce6f4d37d0f (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.cpp | 12 |
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); } |