Merge "Fix draw order for non-RenderNode draw commands"

This commit is contained in:
TreeHugger Robot
2016-11-28 21:42:35 +00:00
committed by Android (Google) Code Review
4 changed files with 24 additions and 15 deletions

View File

@@ -32,7 +32,6 @@ namespace skiapipeline {
void SkiaRecordingCanvas::initDisplayList(uirenderer::RenderNode* renderNode, int width,
int height) {
mBarrierPending = false;
mCurrentBarrier = nullptr;
SkASSERT(mDisplayList.get() == nullptr);
@@ -76,8 +75,6 @@ void SkiaRecordingCanvas::drawCircle(uirenderer::CanvasPropertyPrimitive* x,
}
void SkiaRecordingCanvas::insertReorderBarrier(bool enableReorder) {
mBarrierPending = enableReorder;
if (nullptr != mCurrentBarrier) {
// finish off the existing chunk
SkDrawable* drawable =
@@ -86,6 +83,12 @@ void SkiaRecordingCanvas::insertReorderBarrier(bool enableReorder) {
mCurrentBarrier = nullptr;
drawDrawable(drawable);
}
if (enableReorder) {
mCurrentBarrier = (StartReorderBarrierDrawable*)
mDisplayList->allocateDrawable<StartReorderBarrierDrawable>(
mDisplayList.get());
drawDrawable(mCurrentBarrier);
}
}
void SkiaRecordingCanvas::drawLayer(uirenderer::DeferredLayerUpdater* layerUpdater) {
@@ -97,15 +100,6 @@ void SkiaRecordingCanvas::drawLayer(uirenderer::DeferredLayerUpdater* layerUpdat
}
void SkiaRecordingCanvas::drawRenderNode(uirenderer::RenderNode* renderNode) {
// lazily create the chunk if needed
if (mBarrierPending) {
mCurrentBarrier = (StartReorderBarrierDrawable*)
mDisplayList->allocateDrawable<StartReorderBarrierDrawable>(
mDisplayList.get());
drawDrawable(mCurrentBarrier);
mBarrierPending = false;
}
// record the child node
mDisplayList->mChildNodes.emplace_back(renderNode, asSkCanvas(), true, mCurrentBarrier);
auto& renderNodeDrawable = mDisplayList->mChildNodes.back();

View File

@@ -76,7 +76,6 @@ class SkiaRecordingCanvas : public SkiaCanvas {
private:
SkLiteRecorder mRecorder;
std::unique_ptr<SkiaDisplayList> mDisplayList;
bool mBarrierPending;
StartReorderBarrierDrawable* mCurrentBarrier;
/**

View File

@@ -1542,6 +1542,14 @@ RENDERTHREAD_TEST(FrameBuilder, zReorder) {
canvas.insertReorderBarrier(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
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);
drawOrderedRect(&canvas, 12);
});
FrameBuilder frameBuilder(SkRect::MakeWH(100, 100), 100, 100,
sLightGeometry, Caches::getInstance());
@@ -1549,7 +1557,7 @@ RENDERTHREAD_TEST(FrameBuilder, zReorder) {
ZReorderTestRenderer renderer;
frameBuilder.replayBakedOps<TestDispatcher>(renderer);
EXPECT_EQ(10, renderer.getIndex());
EXPECT_EQ(13, renderer.getIndex());
};
RENDERTHREAD_TEST(FrameBuilder, projectionReorder) {

View File

@@ -114,13 +114,21 @@ TEST(RenderNodeDrawable, zReorder) {
canvas.insertReorderBarrier(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
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);
drawOrderedRect(&canvas, 12);
});
//create a canvas not backed by any device/pixels, but with dimensions to avoid quick rejection
ZReorderCanvas canvas(100, 100);
RenderNodeDrawable drawable(parent.get(), &canvas, false);
canvas.drawDrawable(&drawable);
EXPECT_EQ(10, canvas.getIndex());
EXPECT_EQ(13, canvas.getIndex());
}
TEST(RenderNodeDrawable, composeOnLayer)