Title: [93186] trunk
Revision
93186
Author
commit-qu...@webkit.org
Date
2011-08-16 18:24:44 -0700 (Tue, 16 Aug 2011)

Log Message

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

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

Source/WebCore:

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

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).  This transform
will also be used for other things, such as HUD drawing, in upcoming
patches.

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 screen space transform.

* platform/graphics/chromium/LayerChromium.h:
(WebCore::LayerChromium::screenSpaceDrawTransform):
(WebCore::LayerChromium::setScreenSpaceDrawTransform):
* platform/graphics/chromium/LayerRendererChromium.cpp:
(WebCore::LayerRendererChromium::updateLayers):
(WebCore::LayerRendererChromium::drawLayersInternal):
(WebCore::LayerRendererChromium::drawLayer):
(WebCore::calculateDrawTransformsAndVisibility):
* platform/graphics/chromium/cc/CCLayerImpl.h:
(WebCore::CCLayerImpl::screenSpaceDrawTransform):
(WebCore::CCLayerImpl::setScreenSpaceDrawTransform):

LayoutTests:

This case tests if backface visibility properly accounts for a hierarchy
of transforms.

* 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 (93185 => 93186)


--- trunk/LayoutTests/ChangeLog	2011-08-17 01:11:04 UTC (rev 93185)
+++ trunk/LayoutTests/ChangeLog	2011-08-17 01:24:44 UTC (rev 93186)
@@ -1,3 +1,17 @@
+2011-08-16  Shawn Singh  <shawnsi...@chromium.org>
+
+        Computing screen-space transform for LayerChromium and CCLayerImpl
+        https://bugs.webkit.org/show_bug.cgi?id=66114
+
+        Reviewed by James Robinson.
+
+        This case tests if backface visibility properly accounts for a hierarchy
+        of transforms.
+
+        * 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-16  Ryosuke Niwa  <rn...@webkit.org>
 
         More rebaselines for Windows WebKit2 port.

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


--- trunk/LayoutTests/compositing/backface-visibility-hierarchical-transform-expected.png	                        (rev 0)
+++ trunk/LayoutTests/compositing/backface-visibility-hierarchical-transform-expected.png	2011-08-17 01:24:44 UTC (rev 93186)
@@ -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 => 93186)


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

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


--- trunk/LayoutTests/compositing/backface-visibility-hierarchical-transform.html	                        (rev 0)
+++ trunk/LayoutTests/compositing/backface-visibility-hierarchical-transform.html	2011-08-17 01:24:44 UTC (rev 93186)
@@ -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 (93185 => 93186)


--- trunk/Source/WebCore/ChangeLog	2011-08-17 01:11:04 UTC (rev 93185)
+++ trunk/Source/WebCore/ChangeLog	2011-08-17 01:24:44 UTC (rev 93186)
@@ -1,3 +1,35 @@
+2011-08-16  Shawn Singh  <shawnsi...@chromium.org>
+
+        Computing screen-space transform for LayerChromium and CCLayerImpl
+        https://bugs.webkit.org/show_bug.cgi?id=66114
+
+        Reviewed by James Robinson.
+
+        Test: compositing/backface-visibility-hierarchical-transform.html
+
+        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).  This transform
+        will also be used for other things, such as HUD drawing, in upcoming
+        patches.
+
+        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 screen space transform.
+
+        * platform/graphics/chromium/LayerChromium.h:
+        (WebCore::LayerChromium::screenSpaceDrawTransform):
+        (WebCore::LayerChromium::setScreenSpaceDrawTransform):
+        * platform/graphics/chromium/LayerRendererChromium.cpp:
+        (WebCore::LayerRendererChromium::updateLayers):
+        (WebCore::LayerRendererChromium::drawLayersInternal):
+        (WebCore::LayerRendererChromium::drawLayer):
+        (WebCore::calculateDrawTransformsAndVisibility):
+        * platform/graphics/chromium/cc/CCLayerImpl.h:
+        (WebCore::CCLayerImpl::screenSpaceDrawTransform):
+        (WebCore::CCLayerImpl::setScreenSpaceDrawTransform):
+
 2011-08-16  Hayato Ito  <hay...@chromium.org>
 
         Implement proper handling of events which happen in children of shadow hosts.

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


--- trunk/Source/WebCore/platform/graphics/chromium/LayerChromium.h	2011-08-17 01:11:04 UTC (rev 93185)
+++ trunk/Source/WebCore/platform/graphics/chromium/LayerChromium.h	2011-08-17 01:24:44 UTC (rev 93186)
@@ -199,6 +199,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; }
 
@@ -289,6 +291,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 (93185 => 93186)


--- trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp	2011-08-17 01:11:04 UTC (rev 93185)
+++ trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp	2011-08-17 01:24:44 UTC (rev 93186)
@@ -129,7 +129,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
@@ -172,6 +172,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);
 
@@ -213,6 +217,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.
@@ -261,6 +268,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 {
@@ -306,7 +321,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();
@@ -639,7 +654,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
@@ -778,7 +793,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.
@@ -1065,27 +1080,13 @@
     } else
         GLC(m_context.get(), m_context->disable(GraphicsContext3D::SCISSOR_TEST));
 
-    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();
+    // 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 computed by transforming a unit-z-vector (0, 0, 1, 0) from layer space to screen space
+    // and checking the sign of the z-component. That z-component algebraically simplifies to m33(), so we can avoid a
+    // matrix-vector computation.
+    if ((!layer->doubleSided()) && (layer->screenSpaceTransform().m33() < 0))
+        return;
 
-        FloatRect layerRect(FloatPoint(0, 0), FloatSize(layer->bounds()));
-        FloatQuad mappedLayer = combinedDrawMatrix.mapQuad(FloatQuad(layerRect));
-        FloatSize horizontalDir = mappedLayer.p2() - mappedLayer.p1();
-        FloatSize verticalDir = mappedLayer.p4() - mappedLayer.p1();
-        FloatPoint3D xAxis(horizontalDir.width(), horizontalDir.height(), 0);
-        FloatPoint3D yAxis(verticalDir.width(), verticalDir.height(), 0);
-        FloatPoint3D zAxis = xAxis.cross(yAxis);
-        if (zAxis.z() < 0)
-            return;
-    }
-
     layer->draw();
 
     // Draw the debug border if there is one.

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


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerImpl.h	2011-08-17 01:11:04 UTC (rev 93185)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerImpl.h	2011-08-17 01:24:44 UTC (rev 93186)
@@ -152,6 +152,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; }
 
@@ -218,6 +220,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