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