| Index: cc/occlusion_tracker.cc
|
| diff --git a/cc/occlusion_tracker.cc b/cc/occlusion_tracker.cc
|
| index b131c089ed502b2613884a53c6a5ea659f8a376b..e00cc1353122ab2c9859361c28b213d58c4fe8f7 100644
|
| --- a/cc/occlusion_tracker.cc
|
| +++ b/cc/occlusion_tracker.cc
|
| @@ -23,6 +23,7 @@ OcclusionTrackerBase<LayerType, RenderSurfaceType>::OcclusionTrackerBase(gfx::Re
|
| : m_rootTargetRect(rootTargetRect)
|
| , m_overdrawMetrics(OverdrawMetrics::create(recordMetricsForFrame))
|
| , m_occludingScreenSpaceRects(0)
|
| + , m_nonOccludingScreenSpaceRects(0)
|
| {
|
| }
|
|
|
| @@ -248,7 +249,7 @@ void OcclusionTrackerBase<LayerType, RenderSurfaceType>::leaveToRenderTarget(con
|
|
|
| // FIXME: Remove usePaintTracking when paint tracking is on for paint culling.
|
| template<typename LayerType>
|
| -static inline void addOcclusionBehindLayer(Region& region, const LayerType* layer, const WebTransformationMatrix& transform, const Region& opaqueContents, const gfx::Rect& clipRectInTarget, const gfx::Size& minimumTrackingSize, std::vector<gfx::Rect>* occludingScreenSpaceRects)
|
| +static inline void addOcclusionBehindLayer(Region& region, const LayerType* layer, const WebTransformationMatrix& transform, const Region& opaqueContents, const gfx::Rect& clipRectInTarget, const gfx::Size& minimumTrackingSize, std::vector<gfx::Rect>* occludingScreenSpaceRects, std::vector<gfx::Rect>* nonOccludingScreenSpaceRects)
|
| {
|
| DCHECK(layer->visibleContentRect().Contains(opaqueContents.bounds()));
|
|
|
| @@ -268,6 +269,18 @@ static inline void addOcclusionBehindLayer(Region& region, const LayerType* laye
|
| region.Union(transformedRect);
|
| }
|
| }
|
| +
|
| + if (nonOccludingScreenSpaceRects) {
|
| + Region nonOpaqueContents = SubtractRegions(gfx::Rect(layer->contentBounds()), opaqueContents);
|
| + for (Region::Iterator nonOpaqueContentRects(nonOpaqueContents); nonOpaqueContentRects.has_rect(); nonOpaqueContentRects.next()) {
|
| + // We've already checked for clipping in the mapQuad call above, these calls should not clip anything further.
|
| + gfx::Rect transformedRect = gfx::ToEnclosedRect(MathUtil::mapClippedRect(transform, gfx::RectF(nonOpaqueContentRects.rect())));
|
| + transformedRect.Intersect(clipRectInTarget);
|
| + if (transformedRect.IsEmpty())
|
| + continue;
|
| + nonOccludingScreenSpaceRects->push_back(transformedRect);
|
| + }
|
| + }
|
| }
|
|
|
| template<typename LayerType, typename RenderSurfaceType>
|
| @@ -290,7 +303,7 @@ void OcclusionTrackerBase<LayerType, RenderSurfaceType>::markOccludedBehindLayer
|
|
|
| gfx::Rect clipRectInTarget = layerClipRectInTarget(layer);
|
| if (layerTransformsToTargetKnown(layer))
|
| - addOcclusionBehindLayer<LayerType>(m_stack.back().occlusionInTarget, layer, layer->drawTransform(), opaqueContents, clipRectInTarget, m_minimumTrackingSize, 0);
|
| + addOcclusionBehindLayer<LayerType>(m_stack.back().occlusionInTarget, layer, layer->drawTransform(), opaqueContents, clipRectInTarget, m_minimumTrackingSize, 0, 0);
|
|
|
| // We must clip the occlusion within the layer's clipRectInTarget within screen space as well. If the clip rect can't be moved to screen space and
|
| // remain rectilinear, then we don't add any occlusion in screen space.
|
| @@ -303,7 +316,7 @@ void OcclusionTrackerBase<LayerType, RenderSurfaceType>::markOccludedBehindLayer
|
| if (clipped || !clipQuadInScreen.IsRectilinear())
|
| return;
|
| gfx::Rect clipRectInScreen = gfx::IntersectRects(m_rootTargetRect, gfx::ToEnclosedRect(clipQuadInScreen.BoundingBox()));
|
| - addOcclusionBehindLayer<LayerType>(m_stack.back().occlusionInScreen, layer, layer->screenSpaceTransform(), opaqueContents, clipRectInScreen, m_minimumTrackingSize, m_occludingScreenSpaceRects);
|
| + addOcclusionBehindLayer<LayerType>(m_stack.back().occlusionInScreen, layer, layer->screenSpaceTransform(), opaqueContents, clipRectInScreen, m_minimumTrackingSize, m_occludingScreenSpaceRects, m_nonOccludingScreenSpaceRects);
|
| }
|
| }
|
|
|
|
|