Title: [126790] trunk/Source
Revision
126790
Author
[email protected]
Date
2012-08-27 13:46:43 -0700 (Mon, 27 Aug 2012)

Log Message

[chromium] Have RenderSurface create and add its own generated RenderPass
https://bugs.webkit.org/show_bug.cgi?id=94957

Reviewed by Adrienne Walker.

Source/WebCore:

Have CCRenderSurface create and add its RenderPass to the appropriate
data structures. Previously CCLayerTreeHostImpl had this responsibility
but this limits us to a single RenderPass per RenderSurface. In ubercomp
we have layers that generate many RenderPasses that all contribute to a
single RenderSurface. This target RenderSurface can create all the needed
RenderPasses in the correct order for itself when asked to now.

We invent CCRenderPassSink and make FrameData implement it, so that the
RenderSurface does not need to know the details of how the RenderPasses
it generates will be stored.

Test: CCRenderSurfaceTest.sanityCheckSurfaceCreatesCorrectRenderPass

* WebCore.gypi:
* platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp:
(WebCore::CCLayerTreeHostImpl::FrameData::appendRenderPass):
(WebCore):
(WebCore::CCLayerTreeHostImpl::calculateRenderPasses):
* platform/graphics/chromium/cc/CCLayerTreeHostImpl.h:
(FrameData):
* platform/graphics/chromium/cc/CCRenderPassSink.h: Added.
(WebCore):
(CCRenderPassSink):
* platform/graphics/chromium/cc/CCRenderSurface.cpp:
(WebCore::CCRenderSurface::appendRenderPasses):
(WebCore):
* platform/graphics/chromium/cc/CCRenderSurface.h:
(WebCore):
(CCRenderSurface):

Source/WebKit/chromium:

Test that a RenderSurface generates the RenderPass that we expect.

* tests/CCRenderSurfaceTest.cpp:

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (126789 => 126790)


--- trunk/Source/WebCore/ChangeLog	2012-08-27 20:39:18 UTC (rev 126789)
+++ trunk/Source/WebCore/ChangeLog	2012-08-27 20:46:43 UTC (rev 126790)
@@ -1,3 +1,40 @@
+2012-08-27  Dana Jansens  <[email protected]>
+
+        [chromium] Have RenderSurface create and add its own generated RenderPass
+        https://bugs.webkit.org/show_bug.cgi?id=94957
+
+        Reviewed by Adrienne Walker.
+
+        Have CCRenderSurface create and add its RenderPass to the appropriate
+        data structures. Previously CCLayerTreeHostImpl had this responsibility
+        but this limits us to a single RenderPass per RenderSurface. In ubercomp
+        we have layers that generate many RenderPasses that all contribute to a
+        single RenderSurface. This target RenderSurface can create all the needed
+        RenderPasses in the correct order for itself when asked to now.
+
+        We invent CCRenderPassSink and make FrameData implement it, so that the
+        RenderSurface does not need to know the details of how the RenderPasses
+        it generates will be stored.
+
+        Test: CCRenderSurfaceTest.sanityCheckSurfaceCreatesCorrectRenderPass
+
+        * WebCore.gypi:
+        * platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp:
+        (WebCore::CCLayerTreeHostImpl::FrameData::appendRenderPass):
+        (WebCore):
+        (WebCore::CCLayerTreeHostImpl::calculateRenderPasses):
+        * platform/graphics/chromium/cc/CCLayerTreeHostImpl.h:
+        (FrameData):
+        * platform/graphics/chromium/cc/CCRenderPassSink.h: Added.
+        (WebCore):
+        (CCRenderPassSink):
+        * platform/graphics/chromium/cc/CCRenderSurface.cpp:
+        (WebCore::CCRenderSurface::appendRenderPasses):
+        (WebCore):
+        * platform/graphics/chromium/cc/CCRenderSurface.h:
+        (WebCore):
+        (CCRenderSurface):
+
 2012-08-27  Takashi Sakamoto  <[email protected]>
 
         ShadowRoot insertion point change aborts css transition

Modified: trunk/Source/WebCore/WebCore.gypi (126789 => 126790)


--- trunk/Source/WebCore/WebCore.gypi	2012-08-27 20:39:18 UTC (rev 126789)
+++ trunk/Source/WebCore/WebCore.gypi	2012-08-27 20:46:43 UTC (rev 126790)
@@ -8475,6 +8475,7 @@
             'platform/graphics/chromium/cc/CCRenderPass.h',
             'platform/graphics/chromium/cc/CCRenderPassDrawQuad.cpp',
             'platform/graphics/chromium/cc/CCRenderPassDrawQuad.h',
+            'platform/graphics/chromium/cc/CCRenderPassSink.h',
             'platform/graphics/chromium/cc/CCRenderSurface.cpp',
             'platform/graphics/chromium/cc/CCRenderSurface.h',
             'platform/graphics/chromium/cc/CCRenderSurfaceFilters.cpp',

Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp (126789 => 126790)


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp	2012-08-27 20:39:18 UTC (rev 126789)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp	2012-08-27 20:46:43 UTC (rev 126790)
@@ -266,6 +266,13 @@
     }
 }
 
+void CCLayerTreeHostImpl::FrameData::appendRenderPass(PassOwnPtr<CCRenderPass> renderPass)
+{
+    CCRenderPass* pass = renderPass.get();
+    renderPasses.append(pass);
+    renderPassesById.set(pass->id(), renderPass);
+}
+
 bool CCLayerTreeHostImpl::calculateRenderPasses(FrameData& frame)
 {
     ASSERT(frame.renderPasses.isEmpty());
@@ -275,22 +282,9 @@
     TRACE_EVENT1("cc", "CCLayerTreeHostImpl::calculateRenderPasses", "renderSurfaceLayerList.size()", static_cast<long long unsigned>(frame.renderSurfaceLayerList->size()));
 
     // Create the render passes in dependency order.
-    HashMap<CCRenderSurface*, CCRenderPass*> surfacePassMap;
     for (int surfaceIndex = frame.renderSurfaceLayerList->size() - 1; surfaceIndex >= 0 ; --surfaceIndex) {
         CCLayerImpl* renderSurfaceLayer = (*frame.renderSurfaceLayerList)[surfaceIndex];
-        CCRenderSurface* renderSurface = renderSurfaceLayer->renderSurface();
-
-        int renderPassId = renderSurfaceLayer->id();
-        IntRect outputRect = renderSurface->contentRect();
-        const WebTransformationMatrix& transformToRootTarget = renderSurface->screenSpaceTransform();
-        OwnPtr<CCRenderPass> pass = CCRenderPass::create(renderPassId, outputRect, transformToRootTarget);
-        pass->setDamageRect(renderSurface->damageTracker()->currentDamageRect());
-        pass->setFilters(renderSurfaceLayer->filters());
-        pass->setBackgroundFilters(renderSurfaceLayer->backgroundFilters());
-
-        surfacePassMap.add(renderSurface, pass.get());
-        frame.renderPasses.append(pass.get());
-        frame.renderPassesById.add(renderPassId, pass.release());
+        renderSurfaceLayer->renderSurface()->appendRenderPasses(frame);
     }
 
     bool recordMetricsForFrame = true; // FIXME: In the future, disable this when about:tracing is off.
@@ -310,24 +304,25 @@
 
     CCLayerIteratorType end = CCLayerIteratorType::end(frame.renderSurfaceLayerList);
     for (CCLayerIteratorType it = CCLayerIteratorType::begin(frame.renderSurfaceLayerList); it != end; ++it) {
-        CCRenderSurface* renderSurface = it.targetRenderSurfaceLayer()->renderSurface();
-        CCRenderPass* pass = surfacePassMap.get(renderSurface);
+        int targetRenderPassId = it.targetRenderSurfaceLayer()->id();
+        CCRenderPass* targetRenderPass = frame.renderPassesById.get(targetRenderPassId);
         bool hadMissingTiles = false;
 
         occlusionTracker.enterLayer(it);
 
         if (it.representsContributingRenderSurface()) {
-            CCRenderPass* contributingRenderPass = surfacePassMap.get(it->renderSurface());
-            pass->appendQuadsForRenderSurfaceLayer(*it, contributingRenderPass, &occlusionTracker);
+            int contributingRenderPassId = it->id();
+            CCRenderPass* contributingRenderPass = frame.renderPassesById.get(contributingRenderPassId);
+            targetRenderPass->appendQuadsForRenderSurfaceLayer(*it, contributingRenderPass, &occlusionTracker);
         } else if (it.representsItself() && !it->visibleContentRect().isEmpty()) {
             bool hasOcclusionFromOutsideTargetSurface;
             if (occlusionTracker.occluded(*it, it->visibleContentRect(), &hasOcclusionFromOutsideTargetSurface)) {
                 if (hasOcclusionFromOutsideTargetSurface)
-                    pass->setHasOcclusionFromOutsideTargetSurface(hasOcclusionFromOutsideTargetSurface);
+                    targetRenderPass->setHasOcclusionFromOutsideTargetSurface(hasOcclusionFromOutsideTargetSurface);
             } else {
                 it->willDraw(m_resourceProvider.get());
                 frame.willDrawLayers.append(*it);
-                pass->appendQuadsForLayer(*it, &occlusionTracker, hadMissingTiles);
+                targetRenderPass->appendQuadsForLayer(*it, &occlusionTracker, hadMissingTiles);
             }
         }
 
@@ -344,6 +339,7 @@
     for (size_t i = 0; i < frame.renderPasses.size(); ++i) {
         for (size_t j = 0; j < frame.renderPasses[i]->quadList().size(); ++j)
             ASSERT(frame.renderPasses[i]->quadList()[j]->sharedQuadStateId() >= 0);
+        ASSERT(frame.renderPassesById.contains(frame.renderPasses[i]->id()));
     }
 #endif
 

Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.h (126789 => 126790)


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.h	2012-08-27 20:39:18 UTC (rev 126789)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.h	2012-08-27 20:46:43 UTC (rev 126790)
@@ -29,6 +29,7 @@
 #include "CCInputHandler.h"
 #include "CCLayerSorter.h"
 #include "CCRenderPass.h"
+#include "CCRenderPassSink.h"
 #include "CCRenderer.h"
 #include "SkColor.h"
 #include <public/WebCompositorOutputSurfaceClient.h>
@@ -85,12 +86,15 @@
     virtual void setActiveGestureAnimation(PassOwnPtr<CCActiveGestureAnimation>) OVERRIDE;
     virtual void scheduleAnimation() OVERRIDE;
 
-    struct FrameData {
+    struct FrameData : public CCRenderPassSink {
         Vector<IntRect> occludingScreenSpaceRects;
         CCRenderPassList renderPasses;
         CCRenderPassIdHashMap renderPassesById;
         CCLayerList* renderSurfaceLayerList;
         CCLayerList willDrawLayers;
+
+        // CCRenderPassSink implementation.
+        virtual void appendRenderPass(PassOwnPtr<CCRenderPass>) OVERRIDE;
     };
 
     // Virtual for testing.

Added: trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderPassSink.h (0 => 126790)


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderPassSink.h	                        (rev 0)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderPassSink.h	2012-08-27 20:46:43 UTC (rev 126790)
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef CCRenderPassSink_h
+#define CCRenderPassSink_h
+
+#include <wtf/PassOwnPtr.h>
+
+namespace WebCore {
+
+class CCRenderPass;
+
+class CCRenderPassSink {
+public:
+    virtual void appendRenderPass(PassOwnPtr<CCRenderPass>) = 0;
+};
+
+}
+#endif // CCRenderPassSink_h

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


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderSurface.cpp	2012-08-27 20:39:18 UTC (rev 126789)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderSurface.cpp	2012-08-27 20:46:43 UTC (rev 126790)
@@ -34,7 +34,9 @@
 #include "CCLayerImpl.h"
 #include "CCMathUtil.h"
 #include "CCQuadSink.h"
+#include "CCRenderPass.h"
 #include "CCRenderPassDrawQuad.h"
+#include "CCRenderPassSink.h"
 #include "CCSharedQuadState.h"
 #include "TextStream.h"
 #include <public/WebTransformationMatrix.h>
@@ -179,6 +181,15 @@
     return clippedRectInTarget;
 }
 
+void CCRenderSurface::appendRenderPasses(CCRenderPassSink& passSink)
+{
+    OwnPtr<CCRenderPass> pass = CCRenderPass::create(m_owningLayer->id(), m_contentRect, m_screenSpaceTransform);
+    pass->setDamageRect(m_damageTracker->currentDamageRect());
+    pass->setFilters(m_owningLayer->filters());
+    pass->setBackgroundFilters(m_owningLayer->backgroundFilters());
+    passSink.appendRenderPass(pass.release());
+}
+
 void CCRenderSurface::appendQuads(CCQuadSink& quadSink, bool forReplica, int renderPassId)
 {
     ASSERT(!forReplica || m_owningLayer->hasReplica());

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


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderSurface.h	2012-08-27 20:39:18 UTC (rev 126789)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderSurface.h	2012-08-27 20:46:43 UTC (rev 126790)
@@ -41,6 +41,7 @@
 class CCDamageTracker;
 class CCQuadSink;
 class CCRenderPass;
+class CCRenderPassSink;
 class CCLayerImpl;
 class TextStream;
 
@@ -103,6 +104,7 @@
 
     CCDamageTracker* damageTracker() const { return m_damageTracker.get(); }
 
+    void appendRenderPasses(CCRenderPassSink&);
     void appendQuads(CCQuadSink&, bool forReplica, int renderPassId);
 
 private:

Modified: trunk/Source/WebKit/chromium/ChangeLog (126789 => 126790)


--- trunk/Source/WebKit/chromium/ChangeLog	2012-08-27 20:39:18 UTC (rev 126789)
+++ trunk/Source/WebKit/chromium/ChangeLog	2012-08-27 20:46:43 UTC (rev 126790)
@@ -1,3 +1,14 @@
+2012-08-27  Dana Jansens  <[email protected]>
+
+        [chromium] Have RenderSurface create and add its own generated RenderPass
+        https://bugs.webkit.org/show_bug.cgi?id=94957
+
+        Reviewed by Adrienne Walker.
+
+        Test that a RenderSurface generates the RenderPass that we expect.
+
+        * tests/CCRenderSurfaceTest.cpp:
+
 2012-08-27  Justin Novosad  <[email protected]>
 
         [Chromium] Fixing infinite recursion in Canvas2DLayerManager

Modified: trunk/Source/WebKit/chromium/tests/CCRenderSurfaceTest.cpp (126789 => 126790)


--- trunk/Source/WebKit/chromium/tests/CCRenderSurfaceTest.cpp	2012-08-27 20:39:18 UTC (rev 126789)
+++ trunk/Source/WebKit/chromium/tests/CCRenderSurfaceTest.cpp	2012-08-27 20:46:43 UTC (rev 126790)
@@ -27,6 +27,7 @@
 #include "CCRenderSurface.h"
 
 #include "CCLayerImpl.h"
+#include "CCRenderPassSink.h"
 #include "CCSharedQuadState.h"
 #include "CCSingleThreadProxy.h"
 #include "MockCCQuadCuller.h"
@@ -133,4 +134,49 @@
     EXPECT_FALSE(sharedQuadState->opaque);
 }
 
+class TestCCRenderPassSink : public CCRenderPassSink {
+public:
+    virtual void appendRenderPass(PassOwnPtr<CCRenderPass> renderPass) OVERRIDE { m_renderPasses.append(renderPass); }
+
+    const Vector<OwnPtr<CCRenderPass> >& renderPasses() const { return m_renderPasses; }
+
+private:
+    Vector<OwnPtr<CCRenderPass> > m_renderPasses;
+
+};
+
+TEST(CCRenderSurfaceTest, sanityCheckSurfaceCreatesCorrectRenderPass)
+{
+    // This will fake that we are on the correct thread for testing purposes.
+    DebugScopedSetImplThread setImplThread;
+
+    OwnPtr<CCLayerImpl> rootLayer = CCLayerImpl::create(1);
+
+    OwnPtr<CCLayerImpl> owningLayer = CCLayerImpl::create(2);
+    owningLayer->createRenderSurface();
+    ASSERT_TRUE(owningLayer->renderSurface());
+    owningLayer->setRenderTarget(owningLayer.get());
+    CCRenderSurface* renderSurface = owningLayer->renderSurface();
+
+    rootLayer->addChild(owningLayer.release());
+
+    IntRect contentRect = IntRect(IntPoint::zero(), IntSize(50, 50));
+    WebTransformationMatrix origin;
+    origin.translate(30, 40);
+
+    renderSurface->setScreenSpaceTransform(origin);
+    renderSurface->setContentRect(contentRect);
+
+    TestCCRenderPassSink passSink;
+
+    renderSurface->appendRenderPasses(passSink);
+
+    ASSERT_EQ(1u, passSink.renderPasses().size());
+    CCRenderPass* pass = passSink.renderPasses()[0].get();
+
+    EXPECT_EQ(2, pass->id());
+    EXPECT_EQ(contentRect, pass->outputRect());
+    EXPECT_EQ(origin, pass->transformToRootTarget());
+}
+
 } // namespace
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to