Switch Java calls to enableZ and disableZ; remove isRecordingFor

Bug: 155422223
Test: make

insertInOrderBarrier and insertReorderBarrier are @hide and deprecated.
Remove them and update all callers to enableZ and disableZ, which are
already public.

Update native code to refer to enableZ instead of insertReorderBarrier.

In addition, remove @hide Canvas#isRecordingFor. This method was
originally used to prevent a single RenderNode from being in two display
lists. This is now supported, so there's no reason to avoid it. The one
caller used it to determine whether to reorder drawing its child Views
(which, as the comment says, makes sense to determine based on whether
the Canvas isHardwareAccelerated) and whether to call
insertReorderBarrier/insertInOrderBarrier (now enableZ/disableZ). In the
latter case, there is no need for a conditional, since enableZ/disableZ
only work on a hardware Canvas.

Change-Id: Ib216a19d6aeff40b2e23532bacd62d1795c2ab27
This commit is contained in:
Leon Scroggins III
2020-05-05 15:53:29 -04:00
parent c8d49effd5
commit 0f53e10c07
21 changed files with 52 additions and 79 deletions

View File

@@ -54,11 +54,11 @@ public class CanvasPerfTest {
canvas = node.start(200, 200);
int save = canvas.save();
canvas.clipRect(1, 1, 199, 199);
canvas.insertReorderBarrier();
canvas.enableZ();
for (int i = 0; i < 5; i++) {
canvas.drawRenderNode(child);
}
canvas.insertInorderBarrier();
canvas.disableZ();
canvas.restoreToCount(save);
node.end(canvas);
}

View File

@@ -54,9 +54,9 @@ public class GhostView extends View {
mView.mRecreateDisplayList = true;
RenderNode renderNode = mView.updateDisplayListIfDirty();
if (renderNode.hasDisplayList()) {
dlCanvas.insertReorderBarrier(); // enable shadow for this rendernode
dlCanvas.enableZ(); // enable shadow for this rendernode
dlCanvas.drawRenderNode(renderNode);
dlCanvas.insertInorderBarrier(); // re-disable reordering/shadows
dlCanvas.disableZ(); // re-disable reordering/shadows
}
}
}

View File

@@ -4105,13 +4105,11 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
@Override
protected void dispatchDraw(Canvas canvas) {
boolean usingRenderNodeProperties = canvas.isRecordingFor(mRenderNode);
final int childrenCount = mChildrenCount;
final View[] children = mChildren;
int flags = mGroupFlags;
if ((flags & FLAG_RUN_ANIMATION) != 0 && canAnimate()) {
final boolean buildCache = !isHardwareAccelerated();
for (int i = 0; i < childrenCount; i++) {
final View child = children[i];
if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE) {
@@ -4152,12 +4150,12 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
boolean more = false;
final long drawingTime = getDrawingTime();
if (usingRenderNodeProperties) canvas.insertReorderBarrier();
canvas.enableZ();
final int transientCount = mTransientIndices == null ? 0 : mTransientIndices.size();
int transientIndex = transientCount != 0 ? 0 : -1;
// Only use the preordered list if not HW accelerated, since the HW pipeline will do the
// draw reordering internally
final ArrayList<View> preorderedList = usingRenderNodeProperties
final ArrayList<View> preorderedList = isHardwareAccelerated()
? null : buildOrderedChildList();
final boolean customOrder = preorderedList == null
&& isChildrenDrawingOrderEnabled();
@@ -4204,7 +4202,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
more |= drawChild(canvas, child, drawingTime);
}
}
if (usingRenderNodeProperties) canvas.insertInorderBarrier();
canvas.disableZ();
if (isShowingLayoutBounds()) {
onDebugDraw(canvas);

View File

@@ -249,11 +249,11 @@ public class ViewOverlay {
* This means that we need to insert reorder barriers manually though, so that children
* of the OverlayViewGroup can cast shadows and Z reorder with each other.
*/
canvas.insertReorderBarrier();
canvas.enableZ();
super.dispatchDraw(canvas);
canvas.insertInorderBarrier();
canvas.disableZ();
final int numDrawables = (mDrawables == null) ? 0 : mDrawables.size();
for (int i = 0; i < numDrawables; ++i) {
mDrawables.get(i).draw(canvas);

View File

@@ -62,9 +62,6 @@ public class Canvas extends BaseCanvas {
return mNativeCanvasWrapper;
}
/** @hide */
public boolean isRecordingFor(Object o) { return false; }
// may be null
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 117521088)
private Bitmap mBitmap;
@@ -204,22 +201,6 @@ public class Canvas extends BaseCanvas {
mBitmap = bitmap;
}
/**
* @deprecated use {@link #enableZ()} instead
* @hide */
@Deprecated
public void insertReorderBarrier() {
enableZ();
}
/**
* @deprecated use {@link #disableZ()} instead
* @hide */
@Deprecated
public void insertInorderBarrier() {
disableZ();
}
/**
* <p>Enables Z support which defaults to disabled. This allows for RenderNodes drawn with
* {@link #drawRenderNode(RenderNode)} to be re-arranged based off of their

View File

@@ -80,12 +80,6 @@ public final class RecordingCanvas extends DisplayListCanvas {
return nFinishRecording(mNativeCanvasWrapper);
}
/** @hide */
@Override
public boolean isRecordingFor(Object o) {
return o == mNode;
}
///////////////////////////////////////////////////////////////////////////
// Constructors
///////////////////////////////////////////////////////////////////////////
@@ -147,12 +141,12 @@ public final class RecordingCanvas extends DisplayListCanvas {
@Override
public void enableZ() {
nInsertReorderBarrier(mNativeCanvasWrapper, true);
nEnableZ(mNativeCanvasWrapper, true);
}
@Override
public void disableZ() {
nInsertReorderBarrier(mNativeCanvasWrapper, false);
nEnableZ(mNativeCanvasWrapper, false);
}
///////////////////////////////////////////////////////////////////////////
@@ -302,7 +296,7 @@ public final class RecordingCanvas extends DisplayListCanvas {
@CriticalNative
private static native int nGetMaximumTextureHeight();
@CriticalNative
private static native void nInsertReorderBarrier(long renderer, boolean enableReorder);
private static native void nEnableZ(long renderer, boolean enableZ);
@CriticalNative
private static native long nFinishRecording(long renderer);
@CriticalNative

View File

@@ -57,8 +57,8 @@ public:
LOG_ALWAYS_FATAL("SkiaCanvas does not produce a DisplayList");
return nullptr;
}
virtual void insertReorderBarrier(bool enableReorder) override {
LOG_ALWAYS_FATAL("SkiaCanvas does not support reordering barriers");
virtual void enableZ(bool enableZ) override {
LOG_ALWAYS_FATAL("SkiaCanvas does not support enableZ");
}
virtual void setBitmap(const SkBitmap& bitmap) override;

View File

@@ -144,7 +144,7 @@ public:
virtual void resetRecording(int width, int height,
uirenderer::RenderNode* renderNode = nullptr) = 0;
virtual uirenderer::DisplayList* finishRecording() = 0;
virtual void insertReorderBarrier(bool enableReorder) = 0;
virtual void enableZ(bool enableZ) = 0;
bool isHighContrastText() const { return uirenderer::Properties::enableHighContrastText; }

View File

@@ -124,10 +124,10 @@ static jint android_view_DisplayListCanvas_getMaxTextureSize(CRITICAL_JNI_PARAMS
#endif
}
static void android_view_DisplayListCanvas_insertReorderBarrier(CRITICAL_JNI_PARAMS_COMMA jlong canvasPtr,
static void android_view_DisplayListCanvas_enableZ(CRITICAL_JNI_PARAMS_COMMA jlong canvasPtr,
jboolean reorderEnable) {
Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
canvas->insertReorderBarrier(reorderEnable);
canvas->enableZ(reorderEnable);
}
static jlong android_view_DisplayListCanvas_finishRecording(CRITICAL_JNI_PARAMS_COMMA jlong canvasPtr) {
@@ -194,7 +194,7 @@ static JNINativeMethod gMethods[] = {
{ "nResetDisplayListCanvas", "(JJII)V", (void*) android_view_DisplayListCanvas_resetDisplayListCanvas },
{ "nGetMaximumTextureWidth", "()I", (void*) android_view_DisplayListCanvas_getMaxTextureSize },
{ "nGetMaximumTextureHeight", "()I", (void*) android_view_DisplayListCanvas_getMaxTextureSize },
{ "nInsertReorderBarrier", "(JZ)V", (void*) android_view_DisplayListCanvas_insertReorderBarrier },
{ "nEnableZ", "(JZ)V", (void*) android_view_DisplayListCanvas_enableZ },
{ "nFinishRecording", "(J)J", (void*) android_view_DisplayListCanvas_finishRecording },
{ "nDrawRenderNode", "(JJ)V", (void*) android_view_DisplayListCanvas_drawRenderNode },
{ "nDrawTextureLayer", "(JJ)V", (void*) android_view_DisplayListCanvas_drawTextureLayer },

View File

@@ -57,7 +57,7 @@ void SkiaRecordingCanvas::initDisplayList(uirenderer::RenderNode* renderNode, in
uirenderer::DisplayList* SkiaRecordingCanvas::finishRecording() {
// close any existing chunks if necessary
insertReorderBarrier(false);
enableZ(false);
mRecorder.restoreToCount(1);
return mDisplayList.release();
}
@@ -85,8 +85,8 @@ void SkiaRecordingCanvas::drawCircle(uirenderer::CanvasPropertyPrimitive* x,
drawDrawable(mDisplayList->allocateDrawable<AnimatedCircle>(x, y, radius, paint));
}
void SkiaRecordingCanvas::insertReorderBarrier(bool enableReorder) {
if (mCurrentBarrier && enableReorder) {
void SkiaRecordingCanvas::enableZ(bool enableZ) {
if (mCurrentBarrier && enableZ) {
// Already in a re-order section, nothing to do
return;
}
@@ -98,7 +98,7 @@ void SkiaRecordingCanvas::insertReorderBarrier(bool enableReorder) {
mCurrentBarrier = nullptr;
drawDrawable(drawable);
}
if (enableReorder) {
if (enableZ) {
mCurrentBarrier =
mDisplayList->allocateDrawable<StartReorderBarrierDrawable>(mDisplayList.get());
drawDrawable(mCurrentBarrier);

View File

@@ -69,7 +69,7 @@ public:
virtual void drawVectorDrawable(VectorDrawableRoot* vectorDrawable) override;
virtual void insertReorderBarrier(bool enableReorder) override;
virtual void enableZ(bool enableZ) override;
virtual void drawLayer(uirenderer::DeferredLayerUpdater* layerHandle) override;
virtual void drawRenderNode(uirenderer::RenderNode* renderNode) override;
virtual void callDrawGLFunction(Functor* functor,

View File

@@ -56,9 +56,9 @@ public:
(float)magnifier->height(), 0, 0, (float)props.getWidth(),
(float)props.getHeight(), nullptr);
});
canvas.insertReorderBarrier(true);
canvas.enableZ(true);
canvas.drawRenderNode(zoomImageView.get());
canvas.insertReorderBarrier(false);
canvas.enableZ(false);
}
void doFrame(int frameNr) override {

View File

@@ -36,7 +36,7 @@ public:
int cardsize = std::min(width, height) - dp(64);
renderer.drawColor(Color::White, SkBlendMode::kSrcOver);
renderer.insertReorderBarrier(true);
renderer.enableZ(true);
int x = dp(32);
for (int i = 0; i < 4; i++) {
@@ -52,7 +52,7 @@ public:
mCards.push_back(card);
}
renderer.insertReorderBarrier(false);
renderer.enableZ(false);
}
void doFrame(int frameNr) override {

View File

@@ -29,7 +29,7 @@ public:
sp<RenderNode> card;
void createContent(int width, int height, Canvas& canvas) override {
canvas.drawColor(0xFFFFFFFF, SkBlendMode::kSrcOver);
canvas.insertReorderBarrier(true);
canvas.enableZ(true);
card = TestUtils::createNode(50, 50, 250, 250, [](RenderProperties& props, Canvas& canvas) {
canvas.drawColor(0xFFFF00FF, SkBlendMode::kSrcOver);
@@ -47,7 +47,7 @@ public:
});
canvas.drawRenderNode(card.get());
canvas.insertReorderBarrier(false);
canvas.enableZ(false);
}
void doFrame(int frameNr) override {
int curFrame = frameNr % 150;

View File

@@ -27,7 +27,7 @@ public:
std::vector<sp<RenderNode> > cards;
void createContent(int width, int height, Canvas& canvas) override {
canvas.drawColor(0xFFFFFFFF, SkBlendMode::kSrcOver);
canvas.insertReorderBarrier(true);
canvas.enableZ(true);
int ci = 0;
for (int x = 0; x < width; x += mSpacing) {
@@ -45,7 +45,7 @@ public:
}
}
canvas.insertReorderBarrier(false);
canvas.enableZ(false);
}
void doFrame(int frameNr) override {
int curFrame = frameNr % 50;

View File

@@ -29,7 +29,7 @@ public:
std::vector<sp<RenderNode> > cards;
void createContent(int width, int height, Canvas& canvas) override {
canvas.drawColor(0xFFFFFFFF, SkBlendMode::kSrcOver);
canvas.insertReorderBarrier(true);
canvas.enableZ(true);
for (int x = dp(8); x < (width - dp(58)); x += dp(58)) {
for (int y = dp(8); y < (height - dp(58)); y += dp(58)) {
@@ -39,7 +39,7 @@ public:
}
}
canvas.insertReorderBarrier(false);
canvas.enableZ(false);
}
void doFrame(int frameNr) override {
int curFrame = frameNr % 150;

View File

@@ -29,7 +29,7 @@ public:
std::vector<sp<RenderNode> > cards;
void createContent(int width, int height, Canvas& canvas) override {
canvas.drawColor(0xFFFFFFFF, SkBlendMode::kSrcOver);
canvas.insertReorderBarrier(true);
canvas.enableZ(true);
for (int x = dp(16); x < (width - dp(116)); x += dp(116)) {
for (int y = dp(16); y < (height - dp(116)); y += dp(116)) {
@@ -39,7 +39,7 @@ public:
}
}
canvas.insertReorderBarrier(false);
canvas.enableZ(false);
}
void doFrame(int frameNr) override {
int curFrame = frameNr % 150;

View File

@@ -29,7 +29,7 @@ public:
std::vector<sp<RenderNode> > cards;
void createContent(int width, int height, Canvas& canvas) override {
canvas.drawColor(0xFFFFFFFF, SkBlendMode::kSrcOver);
canvas.insertReorderBarrier(true);
canvas.enableZ(true);
int outset = 50;
for (int i = 0; i < 10; i++) {
@@ -39,7 +39,7 @@ public:
cards.push_back(card);
}
canvas.insertReorderBarrier(false);
canvas.enableZ(false);
}
void doFrame(int frameNr) override {
int curFrame = frameNr % 10;

View File

@@ -67,7 +67,7 @@ public:
mBg = createBitmapNode(canvas, 0xFF9C27B0, 0, 0, width, height);
canvas.drawRenderNode(mBg.get());
canvas.insertReorderBarrier(true);
canvas.enableZ(true);
mSingleBitmap = mAllocator(dp(160), dp(120), kRGBA_8888_SkColorType,
[](SkBitmap& skBitmap) { skBitmap.eraseColor(0xFF0000FF); });
@@ -80,7 +80,7 @@ public:
mCards.push_back(card);
}
}
canvas.insertReorderBarrier(false);
canvas.enableZ(false);
}
void doFrame(int frameNr) override {

View File

@@ -133,14 +133,14 @@ void BM_DisplayListCanvas_basicViewGroupDraw(benchmark::State& benchState) {
int clipRestoreCount = canvas->save(SaveFlags::MatrixClip);
canvas->clipRect(1, 1, 199, 199, SkClipOp::kIntersect);
canvas->insertReorderBarrier(true);
canvas->enableZ(true);
// Draw child loop
for (int i = 0; i < benchState.range(0); i++) {
canvas->drawRenderNode(child.get());
}
canvas->insertReorderBarrier(false);
canvas->enableZ(false);
canvas->restoreToCount(clipRestoreCount);
delete canvas->finishRecording();

View File

@@ -108,27 +108,27 @@ protected:
TEST(RenderNodeDrawable, zReorder) {
auto parent = TestUtils::createSkiaNode(0, 0, 100, 100, [](RenderProperties& props,
SkiaRecordingCanvas& canvas) {
canvas.insertReorderBarrier(true);
canvas.insertReorderBarrier(false);
canvas.enableZ(true);
canvas.enableZ(false);
drawOrderedNode(&canvas, 0, 10.0f); // in reorder=false at this point, so played inorder
drawOrderedRect(&canvas, 1);
canvas.insertReorderBarrier(true);
canvas.enableZ(true);
drawOrderedNode(&canvas, 6, 2.0f);
drawOrderedRect(&canvas, 3);
drawOrderedNode(&canvas, 4, 0.0f);
drawOrderedRect(&canvas, 5);
drawOrderedNode(&canvas, 2, -2.0f);
drawOrderedNode(&canvas, 7, 2.0f);
canvas.insertReorderBarrier(false);
canvas.enableZ(false);
drawOrderedRect(&canvas, 8);
drawOrderedNode(&canvas, 9, -10.0f); // in reorder=false at this point, so played inorder
canvas.insertReorderBarrier(true); // reorder a node ahead of drawrect op
canvas.enableZ(true); // reorder a node ahead of drawrect op
drawOrderedRect(&canvas, 11);
drawOrderedNode(&canvas, 10, -1.0f);
canvas.insertReorderBarrier(false);
canvas.insertReorderBarrier(true); // test with two empty reorder sections
canvas.insertReorderBarrier(true);
canvas.insertReorderBarrier(false);
canvas.enableZ(false);
canvas.enableZ(true); // test with two empty reorder sections
canvas.enableZ(true);
canvas.enableZ(false);
drawOrderedRect(&canvas, 12);
});
@@ -1142,7 +1142,7 @@ TEST(ReorderBarrierDrawable, testShadowMatrix) {
0, 0, CANVAS_WIDTH, CANVAS_HEIGHT,
[](RenderProperties& props, SkiaRecordingCanvas& canvas) {
canvas.translate(TRANSLATE_X, TRANSLATE_Y);
canvas.insertReorderBarrier(true);
canvas.enableZ(true);
auto node = TestUtils::createSkiaNode(
CASTER_X, CASTER_Y, CASTER_X + CASTER_WIDTH, CASTER_Y + CASTER_HEIGHT,
@@ -1152,7 +1152,7 @@ TEST(ReorderBarrierDrawable, testShadowMatrix) {
props.mutableOutline().setShouldClip(true);
});
canvas.drawRenderNode(node.get());
canvas.insertReorderBarrier(false);
canvas.enableZ(false);
});
// create a canvas not backed by any device/pixels, but with dimensions to avoid quick rejection