Simplify TreeInfo

Change-Id: I8f05e9046236d607016b6c2bb77a333cfb47ba47
This commit is contained in:
Chris Craik
2015-10-28 15:55:40 -07:00
parent 37028137f2
commit e2e53a7079
5 changed files with 28 additions and 49 deletions

View File

@@ -250,7 +250,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;
@@ -293,12 +294,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);
}
/**
@@ -419,7 +418,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;

View File

@@ -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

View File

@@ -197,7 +197,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) {
@@ -487,7 +486,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();
@@ -531,7 +530,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;

View File

@@ -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

View File

@@ -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;
}