Title: [113453] trunk/Source/WebCore
Revision
113453
Author
[email protected]
Date
2012-04-06 10:29:11 -0700 (Fri, 06 Apr 2012)

Log Message

[chromium] Surface replica should have a separate quad in the render pass
https://bugs.webkit.org/show_bug.cgi?id=83287

Patch by Dana Jansens <[email protected]> on 2012-04-06
Reviewed by Adrienne Walker.

Generate separate quads for a RenderSurface and its replica. The replica
quad is drawn independently of the surface itself. This allows us to
cull each one independently.

Covered by existing tests.

* platform/graphics/chromium/LayerRendererChromium.cpp:
(WebCore::LayerRendererChromium::drawRenderSurfaceQuad):
(WebCore::LayerRendererChromium::copyOffscreenTextureToDisplay):
* platform/graphics/chromium/cc/CCRenderPass.cpp:
(WebCore::CCRenderPass::appendQuadsForRenderSurfaceLayer):
* platform/graphics/chromium/cc/CCRenderSurface.cpp:
(WebCore::CCRenderSurface::setScissorRect):
(WebCore):
(WebCore::CCRenderSurface::drawContents):
(WebCore::CCRenderSurface::drawReplica):
(WebCore::CCRenderSurface::hasReplica):
* platform/graphics/chromium/cc/CCRenderSurface.h:
(CCRenderSurface):
* platform/graphics/chromium/cc/CCRenderSurfaceDrawQuad.cpp:
(WebCore::CCRenderSurfaceDrawQuad::create):
(WebCore::CCRenderSurfaceDrawQuad::CCRenderSurfaceDrawQuad):
* platform/graphics/chromium/cc/CCRenderSurfaceDrawQuad.h:
(CCRenderSurfaceDrawQuad):
(WebCore::CCRenderSurfaceDrawQuad::isReplica):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (113452 => 113453)


--- trunk/Source/WebCore/ChangeLog	2012-04-06 17:22:37 UTC (rev 113452)
+++ trunk/Source/WebCore/ChangeLog	2012-04-06 17:29:11 UTC (rev 113453)
@@ -1,3 +1,36 @@
+2012-04-06  Dana Jansens  <[email protected]>
+
+        [chromium] Surface replica should have a separate quad in the render pass
+        https://bugs.webkit.org/show_bug.cgi?id=83287
+
+        Reviewed by Adrienne Walker.
+
+        Generate separate quads for a RenderSurface and its replica. The replica
+        quad is drawn independently of the surface itself. This allows us to
+        cull each one independently.
+
+        Covered by existing tests.
+
+        * platform/graphics/chromium/LayerRendererChromium.cpp:
+        (WebCore::LayerRendererChromium::drawRenderSurfaceQuad):
+        (WebCore::LayerRendererChromium::copyOffscreenTextureToDisplay):
+        * platform/graphics/chromium/cc/CCRenderPass.cpp:
+        (WebCore::CCRenderPass::appendQuadsForRenderSurfaceLayer):
+        * platform/graphics/chromium/cc/CCRenderSurface.cpp:
+        (WebCore::CCRenderSurface::setScissorRect):
+        (WebCore):
+        (WebCore::CCRenderSurface::drawContents):
+        (WebCore::CCRenderSurface::drawReplica):
+        (WebCore::CCRenderSurface::hasReplica):
+        * platform/graphics/chromium/cc/CCRenderSurface.h:
+        (CCRenderSurface):
+        * platform/graphics/chromium/cc/CCRenderSurfaceDrawQuad.cpp:
+        (WebCore::CCRenderSurfaceDrawQuad::create):
+        (WebCore::CCRenderSurfaceDrawQuad::CCRenderSurfaceDrawQuad):
+        * platform/graphics/chromium/cc/CCRenderSurfaceDrawQuad.h:
+        (CCRenderSurfaceDrawQuad):
+        (WebCore::CCRenderSurfaceDrawQuad::isReplica):
+
 2012-04-05  Martin Robinson  <[email protected]>
 
         [GObject bindings] Fix the coding style issues in the generated bindings

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


--- trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp	2012-04-06 17:22:37 UTC (rev 113452)
+++ trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp	2012-04-06 17:29:11 UTC (rev 113453)
@@ -515,7 +515,11 @@
 void LayerRendererChromium::drawRenderSurfaceQuad(const CCRenderSurfaceDrawQuad* quad)
 {
     CCLayerImpl* layer = quad->layer();
-    layer->renderSurface()->draw(this, quad->surfaceDamageRect());
+    layer->renderSurface()->setScissorRect(this, quad->surfaceDamageRect());
+    if (quad->isReplica())
+        layer->renderSurface()->drawReplica(this);
+    else
+        layer->renderSurface()->drawContents(this);
     layer->renderSurface()->releaseContentsTexture();
 }
 
@@ -1197,7 +1201,11 @@
         drawTransform.translate3d(0.5 * m_defaultRenderSurface->contentRect().width(), 0.5 * m_defaultRenderSurface->contentRect().height(), 0);
         m_defaultRenderSurface->setDrawTransform(drawTransform);
         m_defaultRenderSurface->setDrawOpacity(1);
-        m_defaultRenderSurface->draw(this, m_defaultRenderSurface->contentRect());
+
+        m_defaultRenderSurface->setScissorRect(this, m_defaultRenderSurface->contentRect());
+        if (m_defaultRenderSurface->hasReplica())
+            m_defaultRenderSurface->drawReplica(this);
+        m_defaultRenderSurface->drawContents(this);
     }
 }
 

Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderPass.cpp (113452 => 113453)


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderPass.cpp	2012-04-06 17:22:37 UTC (rev 113452)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderPass.cpp	2012-04-06 17:29:11 UTC (rev 113453)
@@ -72,20 +72,25 @@
     // not be handled specially here.
     CCRenderSurface* surface = layer->renderSurface();
     OwnPtr<CCSharedQuadState> sharedQuadState = surface->createSharedQuadState();
-
     if (layer->hasDebugBorders()) {
         Color color(debugSurfaceBorderColorRed, debugSurfaceBorderColorGreen, debugSurfaceBorderColorBlue, debugSurfaceBorderAlpha);
         m_quadList.append(CCDebugBorderDrawQuad::create(sharedQuadState.get(), surface->contentRect(), color, debugSurfaceBorderWidth));
-        if (surface->hasReplica()) {
-            OwnPtr<CCSharedQuadState> sharedQuadState = surface->createReplicaSharedQuadState();
+    }
+    bool isReplica = false;
+    m_quadList.append(CCRenderSurfaceDrawQuad::create(sharedQuadState.get(), surface->contentRect(), layer, surfaceDamageRect(), isReplica));
+    m_sharedQuadStateList.append(sharedQuadState.release());
+
+    // Add replica after the surface so that it appears below the surface.
+    if (surface->hasReplica()) {
+        OwnPtr<CCSharedQuadState> sharedQuadState = surface->createReplicaSharedQuadState();
+        if (layer->hasDebugBorders()) {
             Color color(debugReplicaBorderColorRed, debugReplicaBorderColorGreen, debugReplicaBorderColorBlue, debugSurfaceBorderAlpha);
             m_quadList.append(CCDebugBorderDrawQuad::create(sharedQuadState.get(), surface->contentRect(), color, debugSurfaceBorderWidth));
-            m_sharedQuadStateList.append(sharedQuadState.release());
         }
+        bool isReplica = true;
+        m_quadList.append(CCRenderSurfaceDrawQuad::create(sharedQuadState.get(), surface->contentRect(), layer, surfaceDamageRect(), isReplica));
+        m_sharedQuadStateList.append(sharedQuadState.release());
     }
-
-    m_quadList.append(CCRenderSurfaceDrawQuad::create(sharedQuadState.get(), surface->contentRect(), layer, surfaceDamageRect()));
-    m_sharedQuadStateList.append(sharedQuadState.release());
 }
 
 }

Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderSurface.cpp (113452 => 113453)


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderSurface.cpp	2012-04-06 17:22:37 UTC (rev 113452)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderSurface.cpp	2012-04-06 17:29:11 UTC (rev 113453)
@@ -104,12 +104,37 @@
     m_contentsTexture->unreserve();
 }
 
-void CCRenderSurface::draw(LayerRendererChromium* layerRenderer, const FloatRect& surfaceDamageRect)
+void CCRenderSurface::setScissorRect(LayerRendererChromium* layerRenderer, const FloatRect& surfaceDamageRect) const
 {
+    if (m_owningLayer->parent() && m_owningLayer->parent()->usesLayerClipping() && layerRenderer->capabilities().usingPartialSwap) {
+        FloatRect clipAndDamageRect = m_clipRect;
+        clipAndDamageRect.intersect(surfaceDamageRect);
+        layerRenderer->setScissorToRect(enclosingIntRect(clipAndDamageRect));
+    } else if (layerRenderer->capabilities().usingPartialSwap)
+        layerRenderer->setScissorToRect(enclosingIntRect(surfaceDamageRect));
+    else if (m_owningLayer->parent() && m_owningLayer->parent()->usesLayerClipping())
+        layerRenderer->setScissorToRect(m_clipRect);
+    else
+        GLC(layerRenderer->context(), layerRenderer->context()->disable(GraphicsContext3D::SCISSOR_TEST));
+}
+
+void CCRenderSurface::drawContents(LayerRendererChromium* layerRenderer)
+{
     if (m_skipsDraw || !m_contentsTexture)
         return;
 
+    // FIXME: Cache this value so that we don't have to do it for both the surface and its replica.
     SkBitmap filterBitmap = applyFilters(layerRenderer);
+    drawLayer(layerRenderer, m_maskLayer, m_drawTransform, filterBitmap);
+}
+
+void CCRenderSurface::drawReplica(LayerRendererChromium* layerRenderer)
+{
+    ASSERT(hasReplica());
+    if (!hasReplica() || m_skipsDraw || !m_contentsTexture)
+        return;
+
+    SkBitmap filterBitmap = applyFilters(layerRenderer);
     // FIXME: By using the same RenderSurface for both the content and its reflection,
     // it's currently not possible to apply a separate mask to the reflection layer
     // or correctly handle opacity in reflections (opacity must be applied after drawing
@@ -120,22 +145,7 @@
     if (!m_maskLayer && m_owningLayer->replicaLayer())
         replicaMaskLayer = m_owningLayer->replicaLayer()->maskLayer();
 
-    if (m_owningLayer->parent() && m_owningLayer->parent()->usesLayerClipping() && layerRenderer->capabilities().usingPartialSwap) {
-        FloatRect clipAndDamageRect = m_clipRect;
-        clipAndDamageRect.intersect(surfaceDamageRect);
-        layerRenderer->setScissorToRect(enclosingIntRect(clipAndDamageRect));
-    } else if (layerRenderer->capabilities().usingPartialSwap)
-        layerRenderer->setScissorToRect(enclosingIntRect(surfaceDamageRect));
-    else if (m_owningLayer->parent() && m_owningLayer->parent()->usesLayerClipping())
-        layerRenderer->setScissorToRect(m_clipRect);
-    else
-        GLC(layerRenderer->context(), layerRenderer->context()->disable(GraphicsContext3D::SCISSOR_TEST));
-
-    // Reflection draws before the layer.
-    if (m_owningLayer->replicaLayer())
-        drawLayer(layerRenderer, replicaMaskLayer, m_replicaDrawTransform, filterBitmap);
-
-    drawLayer(layerRenderer, m_maskLayer, m_drawTransform, filterBitmap);
+    drawLayer(layerRenderer, replicaMaskLayer, m_replicaDrawTransform, filterBitmap);
 }
 
 void CCRenderSurface::drawLayer(LayerRendererChromium* layerRenderer, CCLayerImpl* maskLayer, const TransformationMatrix& drawTransform, const SkBitmap& filterBitmap)
@@ -273,7 +283,7 @@
     return m_owningLayer ? m_owningLayer->id() : 0;
 }
 
-bool CCRenderSurface::hasReplica()
+bool CCRenderSurface::hasReplica() const
 {
     return m_owningLayer->replicaLayer();
 }

Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderSurface.h (113452 => 113453)


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderSurface.h	2012-04-06 17:22:37 UTC (rev 113452)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderSurface.h	2012-04-06 17:29:11 UTC (rev 113453)
@@ -57,8 +57,11 @@
     bool prepareContentsTexture(LayerRendererChromium*);
     void releaseContentsTexture();
 
-    void draw(LayerRendererChromium*, const FloatRect& surfaceDamageRect);
+    void setScissorRect(LayerRendererChromium*, const FloatRect& surfaceDamageRect) const;
 
+    void drawContents(LayerRendererChromium*);
+    void drawReplica(LayerRendererChromium*);
+
     String name() const;
     void dumpSurface(TextStream&, int indent) const;
 
@@ -127,7 +130,7 @@
 
     int owningLayerId() const;
 
-    bool hasReplica();
+    bool hasReplica() const;
 
     void resetPropertyChangedFlag() { m_surfacePropertyChanged = false; }
     bool surfacePropertyChanged() const;

Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderSurfaceDrawQuad.cpp (113452 => 113453)


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderSurfaceDrawQuad.cpp	2012-04-06 17:22:37 UTC (rev 113452)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderSurfaceDrawQuad.cpp	2012-04-06 17:29:11 UTC (rev 113453)
@@ -29,15 +29,16 @@
 
 namespace WebCore {
 
-PassOwnPtr<CCRenderSurfaceDrawQuad> CCRenderSurfaceDrawQuad::create(const CCSharedQuadState* sharedQuadState, const IntRect& quadRect, CCLayerImpl* layer, const FloatRect& surfaceDamageRect)
+PassOwnPtr<CCRenderSurfaceDrawQuad> CCRenderSurfaceDrawQuad::create(const CCSharedQuadState* sharedQuadState, const IntRect& quadRect, CCLayerImpl* layer, const FloatRect& surfaceDamageRect, bool isReplica)
 {
-    return adoptPtr(new CCRenderSurfaceDrawQuad(sharedQuadState, quadRect, layer, surfaceDamageRect));
+    return adoptPtr(new CCRenderSurfaceDrawQuad(sharedQuadState, quadRect, layer, surfaceDamageRect, isReplica));
 }
 
-CCRenderSurfaceDrawQuad::CCRenderSurfaceDrawQuad(const CCSharedQuadState* sharedQuadState, const IntRect& quadRect, CCLayerImpl* layer, const FloatRect& surfaceDamageRect)
+CCRenderSurfaceDrawQuad::CCRenderSurfaceDrawQuad(const CCSharedQuadState* sharedQuadState, const IntRect& quadRect, CCLayerImpl* layer, const FloatRect& surfaceDamageRect, bool isReplica)
     : CCDrawQuad(sharedQuadState, CCDrawQuad::RenderSurface, quadRect)
     , m_layer(layer)
     , m_surfaceDamageRect(surfaceDamageRect)
+    , m_isReplica(isReplica)
 {
     ASSERT(m_layer);
 }

Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderSurfaceDrawQuad.h (113452 => 113453)


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderSurfaceDrawQuad.h	2012-04-06 17:22:37 UTC (rev 113452)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderSurfaceDrawQuad.h	2012-04-06 17:29:11 UTC (rev 113453)
@@ -36,19 +36,21 @@
 class CCRenderSurfaceDrawQuad : public CCDrawQuad {
     WTF_MAKE_NONCOPYABLE(CCRenderSurfaceDrawQuad);
 public:
-    static PassOwnPtr<CCRenderSurfaceDrawQuad> create(const CCSharedQuadState*, const IntRect&, CCLayerImpl*, const FloatRect& surfaceDamageRect);
+    static PassOwnPtr<CCRenderSurfaceDrawQuad> create(const CCSharedQuadState*, const IntRect&, CCLayerImpl*, const FloatRect& surfaceDamageRect, bool isReplica);
 
     CCLayerImpl* layer() const { return m_layer; }
+    bool isReplica() const { return m_isReplica; }
 
     // The surface damage rect for the target surface this quad draws into.
     // FIXME: This can be removed once render surfaces get their own layer type.
     const FloatRect& surfaceDamageRect() const { return m_surfaceDamageRect; }
 
 private:
-    CCRenderSurfaceDrawQuad(const CCSharedQuadState*, const IntRect&, CCLayerImpl*, const FloatRect& surfaceDamageRect);
+    CCRenderSurfaceDrawQuad(const CCSharedQuadState*, const IntRect&, CCLayerImpl*, const FloatRect& surfaceDamageRect, bool isReplica);
 
     CCLayerImpl* m_layer;
     FloatRect m_surfaceDamageRect;
+    bool m_isReplica;
 };
 
 }
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to