diff options
| -rw-r--r-- | libs/hwui/RenderNode.cpp | 16 | ||||
| -rw-r--r-- | libs/hwui/TreeInfo.h | 50 | ||||
| -rw-r--r-- | libs/hwui/renderthread/CanvasContext.cpp | 5 | ||||
| -rw-r--r-- | libs/hwui/renderthread/CanvasContext.h | 4 | ||||
| -rw-r--r-- | libs/hwui/renderthread/DrawFrameTask.cpp | 2 |
5 files changed, 28 insertions, 49 deletions
diff --git a/libs/hwui/RenderNode.cpp b/libs/hwui/RenderNode.cpp index 8011869360ca..39cb8e9229b1 100644 --- a/libs/hwui/RenderNode.cpp +++ b/libs/hwui/RenderNode.cpp @@ -254,7 +254,8 @@ void RenderNode::pushLayerUpdate(TreeInfo& info) { bool transformUpdateNeeded = false; if (!mLayer) { - mLayer = LayerRenderer::createRenderLayer(info.renderState, getWidth(), getHeight()); + mLayer = LayerRenderer::createRenderLayer( + info.canvasContext.getRenderState(), getWidth(), getHeight()); applyLayerPropertiesToLayer(info); damageSelf(info); transformUpdateNeeded = true; @@ -304,12 +305,10 @@ void RenderNode::pushLayerUpdate(TreeInfo& info) { info.renderer->pushLayerUpdate(mLayer); } - if (info.canvasContext) { - // There might be prefetched layers that need to be accounted for. - // That might be us, so tell CanvasContext that this layer is in the - // tree and should not be destroyed. - info.canvasContext->markLayerInUse(this); - } + // There might be prefetched layers that need to be accounted for. + // That might be us, so tell CanvasContext that this layer is in the + // tree and should not be destroyed. + info.canvasContext.markLayerInUse(this); } /** @@ -430,7 +429,8 @@ void RenderNode::prepareSubTree(TreeInfo& info, bool functorsNeedLayer, DisplayL TextureCache& cache = Caches::getInstance().textureCache; info.out.hasFunctors |= subtree->getFunctors().size(); for (auto&& bitmapResource : subtree->getBitmapResources()) { - info.prepareTextures = cache.prefetchAndMarkInUse(info.canvasContext, bitmapResource); + void* ownerToken = &info.canvasContext; + info.prepareTextures = cache.prefetchAndMarkInUse(ownerToken, bitmapResource); } for (auto&& op : subtree->getChildren()) { RenderNode* childNode = op->renderNode; diff --git a/libs/hwui/TreeInfo.h b/libs/hwui/TreeInfo.h index 98e61468ea70..1c3148726b63 100644 --- a/libs/hwui/TreeInfo.h +++ b/libs/hwui/TreeInfo.h @@ -55,70 +55,46 @@ public: MODE_RT_ONLY, }; - explicit TreeInfo(TraversalMode mode, RenderState& renderState) - : mode(mode) - , prepareTextures(mode == MODE_FULL) - , runAnimations(true) - , damageAccumulator(nullptr) - , renderState(renderState) - , renderer(nullptr) - , errorHandler(nullptr) - , canvasContext(nullptr) - {} - - explicit TreeInfo(TraversalMode mode, const TreeInfo& clone) - : mode(mode) - , prepareTextures(mode == MODE_FULL) - , runAnimations(clone.runAnimations) - , damageAccumulator(clone.damageAccumulator) - , renderState(clone.renderState) - , renderer(clone.renderer) - , errorHandler(clone.errorHandler) - , canvasContext(clone.canvasContext) + TreeInfo(TraversalMode mode, renderthread::CanvasContext& canvasContext) + : mode(mode) + , prepareTextures(mode == MODE_FULL) + , canvasContext(canvasContext) {} TraversalMode mode; // TODO: Remove this? Currently this is used to signal to stop preparing // textures if we run out of cache space. bool prepareTextures; + renderthread::CanvasContext& canvasContext; // TODO: buildLayer uses this to suppress running any animations, but this // should probably be refactored somehow. The reason this is done is // because buildLayer is not setup for injecting the animationHook, as well // as this being otherwise wasted work as all the animators will be // re-evaluated when the frame is actually drawn - bool runAnimations; + bool runAnimations = true; // Must not be null during actual usage - DamageAccumulator* damageAccumulator; - RenderState& renderState; + DamageAccumulator* damageAccumulator = nullptr; // The renderer that will be drawing the next frame. Use this to push any // layer updates or similar. May be NULL. - OpenGLRenderer* renderer; - ErrorHandler* errorHandler; - // May be NULL (TODO: can it really?) - renderthread::CanvasContext* canvasContext; + OpenGLRenderer* renderer = nullptr; + ErrorHandler* errorHandler = nullptr; struct Out { - Out() - : hasFunctors(false) - , hasAnimations(false) - , requiresUiRedraw(false) - , canDrawThisFrame(true) - {} - bool hasFunctors; + bool hasFunctors = false; // This is only updated if evaluateAnimations is true - bool hasAnimations; + bool hasAnimations = false; // This is set to true if there is an animation that RenderThread cannot // animate itself, such as if hasFunctors is true // This is only set if hasAnimations is true - bool requiresUiRedraw; + bool requiresUiRedraw = false; // This is set to true if draw() can be called this frame // false means that we must delay until the next vsync pulse as frame // production is outrunning consumption // NOTE that if this is false CanvasContext will set either requiresUiRedraw // *OR* will post itself for the next vsync automatically, use this // only to avoid calling draw() - bool canDrawThisFrame; + bool canDrawThisFrame = true; } out; // TODO: Damage calculations diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index 73af4c4493bb..fac26dc2bfa2 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -199,7 +199,6 @@ void CanvasContext::prepareTree(TreeInfo& info, int64_t* uiFrameInfo, info.damageAccumulator = &mDamageAccumulator; info.renderer = mCanvas; - info.canvasContext = this; mAnimationContext->startFrame(info.mode); for (const sp<RenderNode>& node : mRenderNodes) { @@ -507,7 +506,7 @@ void CanvasContext::prepareAndDraw(RenderNode* node) { .setVsync(mRenderThread.timeLord().computeFrameTimeNanos(), mRenderThread.timeLord().latestVsync()); - TreeInfo info(TreeInfo::MODE_RT_ONLY, mRenderThread.renderState()); + TreeInfo info(TreeInfo::MODE_RT_ONLY, *this); prepareTree(info, frameInfo, systemTime(CLOCK_MONOTONIC), node); if (info.out.canDrawThisFrame) { draw(); @@ -551,7 +550,7 @@ void CanvasContext::buildLayer(RenderNode* node) { // buildLayer() will leave the tree in an unknown state, so we must stop drawing stopDrawing(); - TreeInfo info(TreeInfo::MODE_FULL, mRenderThread.renderState()); + TreeInfo info(TreeInfo::MODE_FULL, *this); info.damageAccumulator = &mDamageAccumulator; info.renderer = mCanvas; info.runAnimations = false; diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h index f362584af3dd..30e6562526d5 100644 --- a/libs/hwui/renderthread/CanvasContext.h +++ b/libs/hwui/renderthread/CanvasContext.h @@ -130,6 +130,10 @@ public: mContentDrawBounds.set(left, top, right, bottom); } + RenderState& getRenderState() { + return mRenderThread.renderState(); + } + private: friend class RegisterFrameCallbackTask; // TODO: Replace with something better for layer & other GL object diff --git a/libs/hwui/renderthread/DrawFrameTask.cpp b/libs/hwui/renderthread/DrawFrameTask.cpp index a47c9ecf8b31..ab860c7d3b32 100644 --- a/libs/hwui/renderthread/DrawFrameTask.cpp +++ b/libs/hwui/renderthread/DrawFrameTask.cpp @@ -87,7 +87,7 @@ void DrawFrameTask::run() { bool canUnblockUiThread; bool canDrawThisFrame; { - TreeInfo info(TreeInfo::MODE_FULL, mRenderThread->renderState()); + TreeInfo info(TreeInfo::MODE_FULL, *mContext); canUnblockUiThread = syncFrameState(info); canDrawThisFrame = info.out.canDrawThisFrame; } |