am c1d32f0c: Merge "Fix root RenderNode damage calculation" into lmp-dev

* commit 'c1d32f0c5c5832a3bbf923a92d62b2e434dfe70b':
  Fix root RenderNode damage calculation
This commit is contained in:
John Reck
2014-07-17 18:14:18 +00:00
committed by Android Git Automerger
6 changed files with 50 additions and 29 deletions

View File

@@ -326,6 +326,12 @@ public abstract class HardwareRenderer {
void onHardwarePostDraw(HardwareCanvas canvas);
}
/**
* Indicates that the content drawn by HardwareDrawCallbacks needs to
* be updated, which will be done by the next call to draw()
*/
abstract void invalidateRoot();
/**
* Draws the specified view.
*

View File

@@ -96,6 +96,7 @@ public class ThreadedRenderer extends HardwareRenderer {
private RenderNode mRootNode;
private Choreographer mChoreographer;
private boolean mProfilingEnabled;
private boolean mRootNodeNeedsUpdate;
ThreadedRenderer(Context context, boolean translucent) {
final TypedArray a = context.obtainStyledAttributes(
@@ -255,30 +256,41 @@ public class ThreadedRenderer extends HardwareRenderer {
return changed;
}
private void updateRootDisplayList(View view, HardwareDrawCallbacks callbacks) {
private void updateViewTreeDisplayList(View view) {
view.mPrivateFlags |= View.PFLAG_DRAWN;
view.mRecreateDisplayList = (view.mPrivateFlags & View.PFLAG_INVALIDATED)
== View.PFLAG_INVALIDATED;
view.mPrivateFlags &= ~View.PFLAG_INVALIDATED;
Trace.traceBegin(Trace.TRACE_TAG_VIEW, "getDisplayList");
HardwareCanvas canvas = mRootNode.start(mSurfaceWidth, mSurfaceHeight);
try {
canvas.save();
canvas.translate(mInsetLeft, mInsetTop);
callbacks.onHardwarePreDraw(canvas);
canvas.drawRenderNode(view.getDisplayList());
callbacks.onHardwarePostDraw(canvas);
canvas.restore();
} finally {
mRootNode.end(canvas);
Trace.traceEnd(Trace.TRACE_TAG_VIEW);
}
view.getDisplayList();
view.mRecreateDisplayList = false;
}
private void updateRootDisplayList(View view, HardwareDrawCallbacks callbacks) {
Trace.traceBegin(Trace.TRACE_TAG_VIEW, "getDisplayList");
updateViewTreeDisplayList(view);
if (mRootNodeNeedsUpdate || !mRootNode.isValid()) {
HardwareCanvas canvas = mRootNode.start(mSurfaceWidth, mSurfaceHeight);
try {
canvas.save();
canvas.translate(mInsetLeft, mInsetTop);
callbacks.onHardwarePreDraw(canvas);
canvas.drawRenderNode(view.getDisplayList());
callbacks.onHardwarePostDraw(canvas);
canvas.restore();
mRootNodeNeedsUpdate = false;
} finally {
mRootNode.end(canvas);
}
}
Trace.traceEnd(Trace.TRACE_TAG_VIEW);
}
@Override
void invalidateRoot() {
mRootNodeNeedsUpdate = true;
}
@Override
void draw(View view, AttachInfo attachInfo, HardwareDrawCallbacks callbacks) {
attachInfo.mIgnoreDirtyState = true;

View File

@@ -2440,8 +2440,11 @@ public final class ViewRootImpl implements ViewParent,
if (attachInfo.mHardwareRenderer != null && attachInfo.mHardwareRenderer.isEnabled()) {
// Draw with hardware renderer.
mIsAnimating = false;
mHardwareYOffset = yOffset;
mHardwareXOffset = xOffset;
if (mHardwareYOffset != yOffset || mHardwareXOffset != xOffset) {
mHardwareYOffset = yOffset;
mHardwareXOffset = xOffset;
mAttachInfo.mHardwareRenderer.invalidateRoot();
}
mResizeAlpha = resizeAlpha;
dirty.setEmpty();
@@ -2827,6 +2830,10 @@ public final class ViewRootImpl implements ViewParent,
// Set the new focus host and node.
mAccessibilityFocusedHost = view;
mAccessibilityFocusedVirtualView = node;
if (mAttachInfo.mHardwareRenderer != null) {
mAttachInfo.mHardwareRenderer.invalidateRoot();
}
}
@Override