Index: Source/WebKit/chromium/tests/CCLayerTreeHostCommonTest.cpp |
=================================================================== |
--- Source/WebKit/chromium/tests/CCLayerTreeHostCommonTest.cpp (revision 118118) |
+++ Source/WebKit/chromium/tests/CCLayerTreeHostCommonTest.cpp (working copy) |
@@ -1325,6 +1325,69 @@ |
EXPECT_TRUE(childOfAnimatingSurface->visibleLayerRect().isEmpty()); |
} |
+TEST(CCLayerTreeHostCommonTest, verifyBackFaceCullingWithPreserves3dForFlatteningSurface) |
+{ |
+ // Verify the behavior of back-face culling for a renderSurface that is created |
+ // when it flattens its subtree, and its parent has preserves-3d. |
+ |
+ const TransformationMatrix identityMatrix; |
+ RefPtr<LayerChromium> parent = LayerChromium::create(); |
+ RefPtr<LayerChromiumWithForcedDrawsContent> frontFacingSurface = adoptRef(new LayerChromiumWithForcedDrawsContent()); |
+ RefPtr<LayerChromiumWithForcedDrawsContent> backFacingSurface = adoptRef(new LayerChromiumWithForcedDrawsContent()); |
+ RefPtr<LayerChromiumWithForcedDrawsContent> child1 = adoptRef(new LayerChromiumWithForcedDrawsContent()); |
+ RefPtr<LayerChromiumWithForcedDrawsContent> child2 = adoptRef(new LayerChromiumWithForcedDrawsContent()); |
+ |
+ parent->createRenderSurface(); |
+ parent->addChild(frontFacingSurface); |
+ parent->addChild(backFacingSurface); |
+ frontFacingSurface->addChild(child1); |
+ backFacingSurface->addChild(child2); |
+ |
+ // RenderSurfaces are not double-sided |
+ frontFacingSurface->setDoubleSided(false); |
+ backFacingSurface->setDoubleSided(false); |
+ |
+ TransformationMatrix backfaceMatrix; |
+ backfaceMatrix.translate(50, 50); |
+ backfaceMatrix.rotate3d(0, 1, 0, 180); |
+ backfaceMatrix.translate(-50, -50); |
+ |
+ setLayerPropertiesForTesting(parent.get(), identityMatrix, identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100), true); // parent transform style is preserve3d. |
+ setLayerPropertiesForTesting(frontFacingSurface.get(), identityMatrix, identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100), false); // surface transform style is flat. |
+ setLayerPropertiesForTesting(backFacingSurface.get(), backfaceMatrix, identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100), false); // surface transform style is flat. |
+ setLayerPropertiesForTesting(child1.get(), identityMatrix, identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100), false); |
+ setLayerPropertiesForTesting(child2.get(), identityMatrix, identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100), false); |
+ |
+ Vector<RefPtr<LayerChromium> > renderSurfaceLayerList; |
+ Vector<RefPtr<LayerChromium> > dummyLayerList; |
+ int dummyMaxTextureSize = 512; |
+ parent->renderSurface()->setContentRect(IntRect(IntPoint(), parent->bounds())); |
+ parent->setClipRect(IntRect(IntPoint::zero(), parent->bounds())); |
+ renderSurfaceLayerList.append(parent.get()); |
+ |
+ CCLayerTreeHostCommon::calculateDrawTransformsAndVisibility(parent.get(), parent.get(), identityMatrix, identityMatrix, renderSurfaceLayerList, dummyLayerList, dummyMaxTextureSize); |
+ |
+ // Verify which renderSurfaces were created. |
+ EXPECT_TRUE(frontFacingSurface->renderSurface()); |
+ EXPECT_FALSE(backFacingSurface->renderSurface()); // because it should be culled |
+ EXPECT_FALSE(child1->renderSurface()); |
+ EXPECT_FALSE(child2->renderSurface()); |
+ |
+ // Verify the renderSurfaceLayerList. The back-facing surface should be culled. |
+ ASSERT_EQ(2u, renderSurfaceLayerList.size()); |
+ EXPECT_EQ(parent->id(), renderSurfaceLayerList[0]->id()); |
+ EXPECT_EQ(frontFacingSurface->id(), renderSurfaceLayerList[1]->id()); |
+ |
+ // Verify root surface's layerList. |
+ ASSERT_EQ(1u, renderSurfaceLayerList[0]->renderSurface()->layerList().size()); |
+ EXPECT_EQ(frontFacingSurface->id(), renderSurfaceLayerList[0]->renderSurface()->layerList()[0]->id()); |
+ |
+ // Verify frontFacingSurface's layerList. |
+ ASSERT_EQ(2u, renderSurfaceLayerList[1]->renderSurface()->layerList().size()); |
+ EXPECT_EQ(frontFacingSurface->id(), renderSurfaceLayerList[1]->renderSurface()->layerList()[0]->id()); |
+ EXPECT_EQ(child1->id(), renderSurfaceLayerList[1]->renderSurface()->layerList()[1]->id()); |
+} |
+ |
// FIXME: |
// continue working on https://bugs.webkit.org/show_bug.cgi?id=68942 |
// - add a test to verify clipping that changes the "center point" |