Bug 1346777 - Transform layer geometry properly when intermediate surface is used
MozReview-Commit-ID: H3YmadD8sFz
--- a/gfx/layers/composite/ContainerLayerComposite.cpp
+++ b/gfx/layers/composite/ContainerLayerComposite.cpp
@@ -103,20 +103,16 @@ PrintUniformityInfo(Layer* aLayer)
}
static Maybe<gfx::Polygon>
SelectLayerGeometry(const Maybe<gfx::Polygon>& aParentGeometry,
const Maybe<gfx::Polygon>& aChildGeometry)
{
// Both the parent and the child layer were split.
if (aParentGeometry && aChildGeometry) {
- // As we use intermediate surface in these cases, this branch should never
- // get executed.
- MOZ_ASSERT(false,
- "Both parent and child geometry present in nested 3D context!");
return Some(aParentGeometry->ClipPolygon(*aChildGeometry));
}
// The parent layer was split.
if (aParentGeometry) {
return aParentGeometry;
}
@@ -448,22 +444,26 @@ RenderLayers(ContainerT* aContainer, Lay
gfx::IntRect clearRect = layerToRender->GetClearRect();
if (!clearRect.IsEmpty()) {
// Clear layer's visible rect on FrameBuffer with transparent pixels
gfx::Rect fbRect(clearRect.x, clearRect.y, clearRect.width, clearRect.height);
compositor->ClearRect(fbRect);
layerToRender->SetClearRect(gfx::IntRect(0, 0, 0, 0));
}
} else {
+ // Since we force an intermediate surface for nested 3D contexts,
+ // aGeometry and childGeometry are both in the same coordinate space.
Maybe<gfx::Polygon> geometry =
SelectLayerGeometry(aGeometry, childGeometry);
// If we are dealing with a nested 3D context, we might need to transform
- // the geometry to the coordinate space of the parent 3D context leaf.
- const bool isLeafLayer = layer->AsContainerLayer() == nullptr;
+ // the geometry back to the coordinate space of the current layer before
+ // rendering the layer.
+ ContainerLayer* container = layer->AsContainerLayer();
+ const bool isLeafLayer = !container || container->UseIntermediateSurface();
if (geometry && isLeafLayer) {
TransformLayerGeometry(layer, geometry);
}
layerToRender->RenderLayer(clipRect, geometry);
}
new file mode 100644
--- /dev/null
+++ b/layout/reftests/transform-3d/intermediate-1-ref.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+<meta charset="UTF-8">
+<style type="text/css">
+
+div {
+ position: absolute;
+ width: 100px;
+ height: 100px;
+}
+
+.opacity {
+ opacity: 0.99;
+}
+
+.green {
+ background-color: green;
+}
+
+.red {
+ width: 300px;
+ height: 100px;
+ background-color: red;
+}
+
+.translate {
+ transform: translateX(100px);
+}
+
+</style>
+</head>
+
+<body>
+<div class="red"></div>
+<div class="green">
+ <div class="translate opacity green">
+ <div class="translate green"></div>
+ </div>
+</div>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/transform-3d/intermediate-1.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+<meta charset="UTF-8">
+<style type="text/css">
+
+div {
+ position: absolute;
+ width: 100px;
+ height: 100px;
+}
+
+.opacity {
+ opacity: 0.99;
+}
+
+.green {
+ transform-style: preserve-3d;
+ background-color: green;
+}
+
+.flat {
+ transform: translateZ(0px);
+}
+
+.red {
+ width: 300px;
+ height: 100px;
+ background-color: red;
+}
+
+.translate {
+ transform: translateX(100px);
+}
+
+</style>
+</head>
+
+<body>
+<div class="red"></div>
+<div class="green">
+ <div class="flat">
+ <div class="translate opacity green">
+ <div class="translate green"> </div>
+ </div>
+ </div>
+</div>
+</body>
+</html>
--- a/layout/reftests/transform-3d/reftest.list
+++ b/layout/reftests/transform-3d/reftest.list
@@ -83,8 +83,9 @@ fails-if(webrender) == mask-layer-1.html
skip-if(webrender) == mask-layer-2.html mask-layer-ref.html
skip-if(webrender) == mask-layer-3.html mask-layer-ref.html
fails-if(webrender) == split-intersect1.html split-intersect1-ref.html
fuzzy(255,150) fails-if(webrender) == split-intersect2.html split-intersect2-ref.html
fuzzy(255,100) fails-if(webrender) == split-non-ortho1.html split-non-ortho1-ref.html
fuzzy-if(winWidget,150,120) fails-if(webrender) == component-alpha-1.html component-alpha-1-ref.html
fails-if(webrender) == nested-transform-1.html nested-transform-1-ref.html
fails-if(webrender) == transform-geometry-1.html transform-geometry-1-ref.html
+fails-if(webrender) == intermediate-1.html intermediate-1-ref.html