am c1d32f0c: Merge "Fix root RenderNode damage calculation" into lmp-dev
* commit 'c1d32f0c5c5832a3bbf923a92d62b2e434dfe70b': Fix root RenderNode damage calculation
This commit is contained in:
@@ -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.
|
||||
*
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user