Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(65)

Unified Diff: cc/CCLayerTreeHostCommon.cpp

Issue 11079012: Refactor CCLayerTreeHostCommon - merge visible rect computation into calc draw transforms. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Same patch without renaming calculateVisibleRect() Created 8 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/CCLayerTreeHostCommon.h ('k') | cc/CCLayerTreeHostCommonTest.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/CCLayerTreeHostCommon.cpp
diff --git a/cc/CCLayerTreeHostCommon.cpp b/cc/CCLayerTreeHostCommon.cpp
index 141b3ffd172a8912bafe758e604579bd71c1ca02..6f4b99df112787a98a0044ffb12097c09271b84a 100644
--- a/cc/CCLayerTreeHostCommon.cpp
+++ b/cc/CCLayerTreeHostCommon.cpp
@@ -114,16 +114,27 @@ static IntRect calculateVisibleContentRect(LayerType* layer)
{
ASSERT(layer->renderTarget());
- IntRect targetSurfaceRect = layer->renderTarget()->renderSurface()->contentRect();
+ // Nothing is visible if the layer bounds are empty.
+ if (!layer->drawsContent() || layer->contentBounds().isEmpty() || layer->drawableContentRect().isEmpty())
+ return IntRect();
- targetSurfaceRect.intersect(layer->drawableContentRect());
+ IntRect targetSurfaceClipRect;
+
+ // First, compute visible bounds in target surface space.
+ if (layer->renderTarget()->renderSurface()->clipRect().isEmpty())
+ targetSurfaceClipRect = layer->drawableContentRect();
epenner 2012/10/10 18:35:59 I don't understand how this doesn't allow for poss
shawnsingh 2012/10/10 19:54:56 Aside from the max texture size safety, you're rig
epenner 2012/10/10 21:13:59 Done.
epenner 2012/10/10 21:13:59 IIUC The max texture size will limit the size of a
shawnsingh 2012/10/10 22:35:42 Looks like the root of the problem is that we are
+ else {
+ // In this case the target surface does clip layers that contribute to it. So, we
+ // have convert the current surface's clipRect from its ancestor surface space to
+ // the current surface space.
+ targetSurfaceClipRect = enclosingIntRect(CCMathUtil::projectClippedRect(layer->renderTarget()->renderSurface()->drawTransform().inverse(), layer->renderTarget()->renderSurface()->clipRect()));
+ targetSurfaceClipRect.intersect(layer->drawableContentRect());
+ }
- if (targetSurfaceRect.isEmpty() || layer->contentBounds().isEmpty())
+ if (targetSurfaceClipRect.isEmpty())
return IntRect();
- const IntRect contentRect = IntRect(IntPoint(), layer->contentBounds());
- IntRect visibleContentRect = CCLayerTreeHostCommon::calculateVisibleRect(targetSurfaceRect, contentRect, layer->drawTransform());
- return visibleContentRect;
+ return CCLayerTreeHostCommon::calculateVisibleRect(targetSurfaceClipRect, IntRect(IntPoint(), layer->contentBounds()), layer->drawTransform());
}
static bool isScaleOrTranslation(const WebTransformationMatrix& m)
@@ -568,15 +579,25 @@ static void calculateDrawTransformsInternal(LayerType* layer, LayerType* rootLay
// current target surface space that could cause more w < 0 headaches.
subtreeShouldBeClipped = false;
- if (layer->maskLayer())
+ if (layer->maskLayer()) {
layer->maskLayer()->setRenderTarget(layer);
+ layer->maskLayer()->setVisibleContentRect(IntRect(IntPoint(), layer->contentBounds()));
+ }
- if (layer->replicaLayer() && layer->replicaLayer()->maskLayer())
+ if (layer->replicaLayer() && layer->replicaLayer()->maskLayer()) {
layer->replicaLayer()->maskLayer()->setRenderTarget(layer);
+ layer->replicaLayer()->maskLayer()->setVisibleContentRect(IntRect(IntPoint(), layer->contentBounds()));
+ }
if (layer->filters().hasFilterThatMovesPixels())
nearestAncestorThatMovesPixels = renderSurface;
+ // The render surface clipRect is expressed in the space where this surface draws, i.e. the same space as clipRectFromAncestor.
+ if (ancestorClipsSubtree)
+ renderSurface->setClipRect(clipRectFromAncestor);
+ else
+ renderSurface->setClipRect(IntRect());
+
renderSurface->setNearestAncestorThatMovesPixels(nearestAncestorThatMovesPixels);
renderSurfaceLayerList.append(layer);
@@ -668,17 +689,15 @@ static void calculateDrawTransformsInternal(LayerType* layer, LayerType* rootLay
drawableContentRectOfLayer.intersect(clipRectForSubtree);
layer->setDrawableContentRect(drawableContentRectOfLayer);
+ // Compute the layer's visible content rect (the rect is in content space)
+ IntRect visibleContentRectOfLayer = calculateVisibleContentRect(layer);
+ layer->setVisibleContentRect(visibleContentRectOfLayer);
+
// Compute the remaining properties for the render surface, if the layer has one.
if (layer->renderSurface() && layer != rootLayer) {
RenderSurfaceType* renderSurface = layer->renderSurface();
IntRect clippedContentRect = localDrawableContentRectOfSubtree;
- // The render surface clipRect is expressed in the space where this surface draws, i.e. the same space as clipRectFromAncestor.
- if (ancestorClipsSubtree)
epenner 2012/10/10 18:35:59 It looks like this code intends to only set an emp
shawnsingh 2012/10/10 19:54:56 Yes... this is how we're encoding two different po
epenner 2012/10/10 21:13:59 It looks like line 124 checks clipRect().isEmpty()
shawnsingh 2012/10/10 22:35:42 I see what you are saying now - thanks for catchin
- renderSurface->setClipRect(clipRectFromAncestor);
- else
- renderSurface->setClipRect(IntRect());
-
// Don't clip if the layer is reflected as the reflection shouldn't be
// clipped. If the layer is animating, then the surface's transform to
// its target is not known on the main thread, and we should not use it
@@ -757,31 +776,6 @@ static void calculateDrawTransformsInternal(LayerType* layer, LayerType* rootLay
layer->renderTarget()->renderSurface()->addContributingDelegatedRenderPassLayer(layer);
}
-// FIXME: Instead of using the following function to set visibility rects on a second
-// tree pass, revise calculateVisibleContentRect() so that this can be done in a single
-// pass inside calculateDrawTransformsInternal<>().
-template<typename LayerType, typename LayerList, typename RenderSurfaceType>
-static void calculateVisibleRectsInternal(const LayerList& renderSurfaceLayerList)
-{
- // Use BackToFront since it's cheap and this isn't order-dependent.
- typedef CCLayerIterator<LayerType, LayerList, RenderSurfaceType, CCLayerIteratorActions::BackToFront> CCLayerIteratorType;
-
- CCLayerIteratorType end = CCLayerIteratorType::end(&renderSurfaceLayerList);
- for (CCLayerIteratorType it = CCLayerIteratorType::begin(&renderSurfaceLayerList); it != end; ++it) {
- if (it.representsTargetRenderSurface()) {
- LayerType* maskLayer = it->maskLayer();
- if (maskLayer)
- maskLayer->setVisibleContentRect(IntRect(IntPoint(), it->contentBounds()));
- LayerType* replicaMaskLayer = it->replicaLayer() ? it->replicaLayer()->maskLayer() : 0;
- if (replicaMaskLayer)
- replicaMaskLayer->setVisibleContentRect(IntRect(IntPoint(), it->contentBounds()));
- } else if (it.representsItself()) {
- IntRect visibleContentRect = calculateVisibleContentRect(*it);
- it->setVisibleContentRect(visibleContentRect);
- }
- }
-}
-
void CCLayerTreeHostCommon::calculateDrawTransforms(LayerChromium* rootLayer, const IntSize& deviceViewportSize, float deviceScaleFactor, int maxTextureSize, Vector<RefPtr<LayerChromium> >& renderSurfaceLayerList)
{
IntRect totalDrawableContentRect;
@@ -810,16 +804,6 @@ void CCLayerTreeHostCommon::calculateDrawTransforms(CCLayerImpl* rootLayer, cons
rootLayer->renderSurface()->layerList(), layerSorter, maxTextureSize, deviceScaleFactor, totalDrawableContentRect);
}
-void CCLayerTreeHostCommon::calculateVisibleRects(Vector<RefPtr<LayerChromium> >& renderSurfaceLayerList)
-{
- calculateVisibleRectsInternal<LayerChromium, Vector<RefPtr<LayerChromium> >, RenderSurfaceChromium>(renderSurfaceLayerList);
-}
-
-void CCLayerTreeHostCommon::calculateVisibleRects(Vector<CCLayerImpl*>& renderSurfaceLayerList)
-{
- calculateVisibleRectsInternal<CCLayerImpl, Vector<CCLayerImpl*>, CCRenderSurface>(renderSurfaceLayerList);
-}
-
static bool pointHitsRect(const IntPoint& viewportPoint, const WebTransformationMatrix& localSpaceToScreenSpaceTransform, FloatRect localSpaceRect)
{
// If the transform is not invertible, then assume that this point doesn't hit this rect.
« no previous file with comments | « cc/CCLayerTreeHostCommon.h ('k') | cc/CCLayerTreeHostCommonTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698