Title: [93387] trunk
Revision
93387
Author
commit-qu...@webkit.org
Date
2011-08-18 22:44:52 -0700 (Thu, 18 Aug 2011)

Log Message

Computing screen-space transform for LayerChromium and CCLayerImpl
https://bugs.webkit.org/show_bug.cgi?id=66114

Source/WebCore:

Added a data member to LayerChromium and CCLayerImpl that holds
the screen-space transform.   The transform is computed in
calculateDrawTransformsAndVisibility(), which is used during
updating (LayerChromium) and drawing (CCLayerImpl).

Also fixed a FIXME in LayerRendererChromium::drawLayer, which
was not computing the entire hierarchy of transforms to determine
back-face visibility.  Now it simply uses the world space transform.

Patch by Shawn Singh <shawnsi...@chromium.org> on 2011-08-18
Reviewed by James Robinson.

Test: compositing/backface-visibility-hierarchical-transform.html

* platform/graphics/chromium/LayerChromium.h:
(WebCore::LayerChromium::screenSpaceTransform):
(WebCore::LayerChromium::setScreenSpaceTransform):
* platform/graphics/chromium/LayerRendererChromium.cpp:
(WebCore::LayerRendererChromium::updateLayers):
(WebCore::LayerRendererChromium::drawLayersInternal):
(WebCore::LayerRendererChromium::drawLayer):
* platform/graphics/chromium/cc/CCLayerImpl.h:
(WebCore::CCLayerImpl::screenSpaceTransform):
(WebCore::CCLayerImpl::setScreenSpaceTransform):

LayoutTests:

This case tests if backface visibility properly accounts for a hierarchy
of transforms.  In particular, this test forces Chromium to create a
hierarchy of RenderSurfaces.

Patch by Shawn Singh <shawnsi...@chromium.org> on 2011-08-18
Reviewed by James Robinson.

* compositing/backface-visibility-hierarchical-transform-expected.png: Added.
* compositing/backface-visibility-hierarchical-transform-expected.txt: Added.
* compositing/backface-visibility-hierarchical-transform.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (93386 => 93387)


--- trunk/LayoutTests/ChangeLog	2011-08-19 04:51:38 UTC (rev 93386)
+++ trunk/LayoutTests/ChangeLog	2011-08-19 05:44:52 UTC (rev 93387)
@@ -1,3 +1,18 @@
+2011-08-18  Shawn Singh  <shawnsi...@chromium.org>
+
+        Computing screen-space transform for LayerChromium and CCLayerImpl
+        https://bugs.webkit.org/show_bug.cgi?id=66114
+
+        This case tests if backface visibility properly accounts for a hierarchy
+        of transforms.  In particular, this test forces Chromium to create a
+        hierarchy of RenderSurfaces.
+
+        Reviewed by James Robinson.
+
+        * compositing/backface-visibility-hierarchical-transform-expected.png: Added.
+        * compositing/backface-visibility-hierarchical-transform-expected.txt: Added.
+        * compositing/backface-visibility-hierarchical-transform.html: Added.
+
 2011-08-18  Ben Wells  <benwe...@chromium.org>
 
         [skia] -webkit-transform breaks -webkit-mask

Added: trunk/LayoutTests/compositing/backface-visibility-hierarchical-transform-expected.png (0 => 93387)


--- trunk/LayoutTests/compositing/backface-visibility-hierarchical-transform-expected.png	                        (rev 0)
+++ trunk/LayoutTests/compositing/backface-visibility-hierarchical-transform-expected.png	2011-08-19 05:44:52 UTC (rev 93387)
@@ -0,0 +1,6 @@
+\x89PNG
+
+
+IHDR X')tEXtchecksume43420b383792f6c4145eca7e3911331g\xED\xCF\xE0
+\xD0IDATx\x9C\xED\xDC1
+\xC30EA)\xF8\xDE\xC6'\xDF\xDC \xD5#1Ӫ\xF9\xE5c\xED\x99Yt>o8\x8D\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\xD8\xF5\xFBy?\xFB?;0\xB7?\xF1\x80\xB5\\xB0r &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b{f\xDE\xDEp,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\xD8\xF5\xFBy?\xFB?;0\xB7?\xF1\x80\xB5\\xB0r &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b{f\xDE\xDEp,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\x98\xC0\x88	,\x80\xD8\x8E\xA9\xC4\xB5EIEND\xAEB`\x82
\ No newline at end of file

Added: trunk/LayoutTests/compositing/backface-visibility-hierarchical-transform-expected.txt (0 => 93387)


--- trunk/LayoutTests/compositing/backface-visibility-hierarchical-transform-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/compositing/backface-visibility-hierarchical-transform-expected.txt	2011-08-19 05:44:52 UTC (rev 93387)
@@ -0,0 +1 @@
+This test is only useful as a pixel test

Added: trunk/LayoutTests/compositing/backface-visibility-hierarchical-transform.html (0 => 93387)


--- trunk/LayoutTests/compositing/backface-visibility-hierarchical-transform.html	                        (rev 0)
+++ trunk/LayoutTests/compositing/backface-visibility-hierarchical-transform.html	2011-08-19 05:44:52 UTC (rev 93387)
@@ -0,0 +1,95 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <style type="text/css" media="screen">
+    div {
+      height: 100px;
+      width: 100px;
+    }
+
+    .red {
+        background-color: red;
+    }
+
+    .green {
+        background-color: green;
+    }
+
+    .test1location {
+        position: absolute;
+        top: 10px;
+        left: 10px;
+    }
+
+    .test2location {
+        position: absolute;
+        top: 120px;
+        left: 10px;
+    }
+
+    .preserves3d {
+      -webkit-transform-style: preserve-3d;
+    }
+
+    .firstRenderSurface {
+      -webkit-transform: rotateY(180deg);
+      -webkit-transform-style: flat;
+    }
+
+    .secondRenderSurface {
+      -webkit-transform: rotateY(0deg);
+      -webkit-transform-style: flat;
+    }
+
+    .backfaceVisible {
+      -webkit-backface-visibility: visible;
+    }
+
+    .backfaceHidden {
+      -webkit-backface-visibility: hidden;
+    }
+  </style>
+</head>
+<body>
+
+  <!-- In the pixel results, two green squares should be visible. -->
+  <!-- This tests whether backface culling is accounting for the hierarchy of transforms -->
+
+  <div class="test1location red">
+  </div>
+  <div class="test1location">
+    <div class="preserves3d">
+      <div class="firstRenderSurface">
+        <div class="preserves3d">
+          <div class="secondRenderSurface">
+            <div class="preserves3d backfaceVisible green">
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+
+  <div class="test2location green">
+  </div>
+  <div class="test2location">
+    <div class="preserves3d">
+      <div class="firstRenderSurface">
+        <div class="preserves3d">
+          <div class="secondRenderSurface">
+            <div class="preserves3d backfaceHidden red">
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+
+  <script>
+  if (window.layoutTestController) {
+    layoutTestController.dumpAsText(true);  // This is only useful as a pixel test.
+    document.write("<span style='position:absolute; top:-5000px'>This test is only useful as a pixel test</span>");
+  }
+  </script>
+</body>
+</html>
Property changes on: trunk/LayoutTests/compositing/backface-visibility-hierarchical-transform.html
___________________________________________________________________

Added: svn:executable

Modified: trunk/Source/WebCore/ChangeLog (93386 => 93387)


--- trunk/Source/WebCore/ChangeLog	2011-08-19 04:51:38 UTC (rev 93386)
+++ trunk/Source/WebCore/ChangeLog	2011-08-19 05:44:52 UTC (rev 93387)
@@ -1,3 +1,32 @@
+2011-08-18  Shawn Singh  <shawnsi...@chromium.org>
+
+        Computing screen-space transform for LayerChromium and CCLayerImpl
+        https://bugs.webkit.org/show_bug.cgi?id=66114
+
+        Added a data member to LayerChromium and CCLayerImpl that holds
+        the screen-space transform.   The transform is computed in
+        calculateDrawTransformsAndVisibility(), which is used during
+        updating (LayerChromium) and drawing (CCLayerImpl).
+
+        Also fixed a FIXME in LayerRendererChromium::drawLayer, which
+        was not computing the entire hierarchy of transforms to determine
+        back-face visibility.  Now it simply uses the world space transform.
+
+        Reviewed by James Robinson.
+
+        Test: compositing/backface-visibility-hierarchical-transform.html
+
+        * platform/graphics/chromium/LayerChromium.h:
+        (WebCore::LayerChromium::screenSpaceTransform):
+        (WebCore::LayerChromium::setScreenSpaceTransform):
+        * platform/graphics/chromium/LayerRendererChromium.cpp:
+        (WebCore::LayerRendererChromium::updateLayers):
+        (WebCore::LayerRendererChromium::drawLayersInternal):
+        (WebCore::LayerRendererChromium::drawLayer):
+        * platform/graphics/chromium/cc/CCLayerImpl.h:
+        (WebCore::CCLayerImpl::screenSpaceTransform):
+        (WebCore::CCLayerImpl::setScreenSpaceTransform):
+
 2011-08-18  Ben Wells  <benwe...@chromium.org>
 
         [skia] -webkit-transform breaks -webkit-mask

Modified: trunk/Source/WebCore/platform/graphics/chromium/LayerChromium.h (93386 => 93387)


--- trunk/Source/WebCore/platform/graphics/chromium/LayerChromium.h	2011-08-19 04:51:38 UTC (rev 93386)
+++ trunk/Source/WebCore/platform/graphics/chromium/LayerChromium.h	2011-08-19 05:44:52 UTC (rev 93387)
@@ -206,6 +206,8 @@
     void setTargetRenderSurface(RenderSurfaceChromium* surface) { m_targetRenderSurface = surface; }
     const TransformationMatrix& drawTransform() const { return m_drawTransform; }
     void setDrawTransform(const TransformationMatrix& matrix) { m_drawTransform = matrix; }
+    const TransformationMatrix& screenSpaceTransform() const { return m_screenSpaceTransform; }
+    void setScreenSpaceTransform(const TransformationMatrix& matrix) { m_screenSpaceTransform = matrix; }
     const IntRect& drawableContentRect() const { return m_drawableContentRect; }
     void setDrawableContentRect(const IntRect& rect) { m_drawableContentRect = rect; }
 
@@ -298,6 +300,7 @@
     IntRect m_scissorRect;
     RenderSurfaceChromium* m_targetRenderSurface;
     TransformationMatrix m_drawTransform;
+    TransformationMatrix m_screenSpaceTransform;
     IntRect m_drawableContentRect;
 
     String m_name;

Modified: trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp (93386 => 93387)


--- trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp	2011-08-19 04:51:38 UTC (rev 93386)
+++ trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp	2011-08-19 05:44:52 UTC (rev 93387)
@@ -130,7 +130,7 @@
 // Recursively walks the layer tree starting at the given node and computes all the
 // necessary transformations, scissor rectangles, render surfaces, etc.
 template<typename LayerType, typename RenderSurfaceType, typename LayerSorter>
-void calculateDrawTransformsAndVisibility(LayerType* layer, LayerType* rootLayer, const TransformationMatrix& parentMatrix, Vector<RefPtr<LayerType> >& renderSurfaceLayerList, Vector<RefPtr<LayerType> >& layerList, LayerSorter* layerSorter, int maxTextureSize)
+void calculateDrawTransformsAndVisibility(LayerType* layer, LayerType* rootLayer, const TransformationMatrix& parentMatrix, const TransformationMatrix& fullHierarchyMatrix, Vector<RefPtr<LayerType> >& renderSurfaceLayerList, Vector<RefPtr<LayerType> >& layerList, LayerSorter* layerSorter, int maxTextureSize)
 {
     typedef Vector<RefPtr<LayerType> > LayerList;
     // Compute the new matrix transformation that will be applied to this layer and
@@ -173,6 +173,10 @@
     FloatRect layerRect(-0.5 * layer->bounds().width(), -0.5 * layer->bounds().height(), layer->bounds().width(), layer->bounds().height());
     IntRect transformedLayerRect;
 
+    // fullHierarchyMatrix is the matrix that transforms objects between screen space (except projection matrix) and the most recent RenderSurface's space.
+    // nextHierarchyMatrix will only change if this layer uses a new RenderSurface, otherwise remains the same.
+    TransformationMatrix nextHierarchyMatrix = fullHierarchyMatrix;
+
     // FIXME: This seems like the wrong place to set this
     layer->setUsesLayerScissor(false);
 
@@ -214,6 +218,9 @@
         layerOriginTransform.translate3d(-0.5 * bounds.width(), -0.5 * bounds.height(), 0);
         renderSurface->setOriginTransform(layerOriginTransform);
 
+        // Update the aggregate hierarchy matrix to include the transform of the newly created RenderSurface.
+        nextHierarchyMatrix.multiply(layerOriginTransform);
+
         // The render surface scissor rect is the scissor rect that needs to
         // be applied before drawing the render surface onto its containing
         // surface and is therefore expressed in the parent's coordinate system.
@@ -262,6 +269,14 @@
         }
     }
 
+    // Note that at this point, layer->drawTransform() is not necessarily the same as local variable drawTransform.
+    // layerScreenSpaceTransform represents the transform between layer space (in pixels) and screen space.
+    // So we do not include projection P or scaling transform S (see comments above that describe P*M*S).
+    TransformationMatrix layerScreenSpaceTransform = nextHierarchyMatrix;
+    layerScreenSpaceTransform.multiply(layer->drawTransform());
+    layerScreenSpaceTransform.translate3d(-0.5 * bounds.width(), -0.5 * bounds.height(), 0);
+    layer->setScreenSpaceTransform(layerScreenSpaceTransform);
+
     if (layer->renderSurface())
         layer->setTargetRenderSurface(layer->renderSurface());
     else {
@@ -307,7 +322,7 @@
 
     for (size_t i = 0; i < layer->children().size(); ++i) {
         LayerType* child = layer->children()[i].get();
-        calculateDrawTransformsAndVisibility<LayerType, RenderSurfaceType, LayerSorter>(child, rootLayer, sublayerMatrix, renderSurfaceLayerList, descendants, layerSorter, maxTextureSize);
+        calculateDrawTransformsAndVisibility<LayerType, RenderSurfaceType, LayerSorter>(child, rootLayer, sublayerMatrix, nextHierarchyMatrix, renderSurfaceLayerList, descendants, layerSorter, maxTextureSize);
 
         if (child->renderSurface()) {
             RenderSurfaceType* childRenderSurface = child->renderSurface();
@@ -605,7 +620,7 @@
 
     {
         TRACE_EVENT("LayerRendererChromium::updateLayers::calcDrawEtc", this, 0);
-        calculateDrawTransformsAndVisibility<LayerChromium, RenderSurfaceChromium, void*>(rootLayer, rootLayer, identityMatrix, renderSurfaceLayerList, rootRenderSurface->layerList(), 0, m_maxTextureSize);
+        calculateDrawTransformsAndVisibility<LayerChromium, RenderSurfaceChromium, void*>(rootLayer, rootLayer, identityMatrix, identityMatrix, renderSurfaceLayerList, rootRenderSurface->layerList(), 0, m_maxTextureSize);
     }
 
 #ifndef NDEBUG
@@ -737,7 +752,7 @@
 
     {
         TRACE_EVENT("LayerRendererChromium::drawLayersInternal::calcDrawEtc", this, 0);
-        calculateDrawTransformsAndVisibility<CCLayerImpl, CCRenderSurface, CCLayerSorter>(rootDrawLayer, rootDrawLayer, identityMatrix, renderSurfaceLayerList, m_defaultRenderSurface->layerList(), &m_layerSorter, m_maxTextureSize);
+        calculateDrawTransformsAndVisibility<CCLayerImpl, CCRenderSurface, CCLayerSorter>(rootDrawLayer, rootDrawLayer, identityMatrix, identityMatrix, renderSurfaceLayerList, m_defaultRenderSurface->layerList(), &m_layerSorter, m_maxTextureSize);
     }
 
     // The GL viewport covers the entire visible area, including the scrollbars.
@@ -1013,18 +1028,11 @@
     } else
         GLC(m_context.get(), m_context->disable(GraphicsContext3D::SCISSOR_TEST));
 
+    // The layer should not be drawn if (1) it is not double-sided and (2) the back of the layer is facing the screen.
+    // This second condition is checked by computing the transformed normal of the layer.
     if (!layer->doubleSided()) {
-        // FIXME: Need to take into account the cumulative render surface transforms all the way from
-        //        the default render surface in order to determine visibility.
-        TransformationMatrix combinedDrawMatrix;
-        if (layer->targetRenderSurface()) {
-            combinedDrawMatrix = layer->targetRenderSurface()->drawTransform();
-            combinedDrawMatrix.multiply(layer->drawTransform());
-        } else
-            combinedDrawMatrix = layer->drawTransform();
-
         FloatRect layerRect(FloatPoint(0, 0), FloatSize(layer->bounds()));
-        FloatQuad mappedLayer = combinedDrawMatrix.mapQuad(FloatQuad(layerRect));
+        FloatQuad mappedLayer = layer->screenSpaceTransform().mapQuad(FloatQuad(layerRect));
         FloatSize horizontalDir = mappedLayer.p2() - mappedLayer.p1();
         FloatSize verticalDir = mappedLayer.p4() - mappedLayer.p1();
         FloatPoint3D xAxis(horizontalDir.width(), horizontalDir.height(), 0);

Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerImpl.h (93386 => 93387)


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerImpl.h	2011-08-19 04:51:38 UTC (rev 93386)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerImpl.h	2011-08-19 05:44:52 UTC (rev 93387)
@@ -158,6 +158,8 @@
 
     const TransformationMatrix& drawTransform() const { return m_drawTransform; }
     void setDrawTransform(const TransformationMatrix& matrix) { m_drawTransform = matrix; }
+    const TransformationMatrix& screenSpaceTransform() const { return m_screenSpaceTransform; }
+    void setScreenSpaceTransform(const TransformationMatrix& matrix) { m_screenSpaceTransform = matrix; }
     const IntRect& drawableContentRect() const { return m_drawableContentRect; }
     void setDrawableContentRect(const IntRect& rect) { m_drawableContentRect = rect; }
 
@@ -226,6 +228,7 @@
     float m_debugBorderWidth;
 
     TransformationMatrix m_drawTransform;
+    TransformationMatrix m_screenSpaceTransform;
 
     // The scissor rectangle that should be used when this layer is drawn.
     // Inherited by the parent layer and further restricted if this layer masks
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to