| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "config.h" | 5 #include "config.h" |
| 6 | 6 |
| 7 #include "cc/occlusion_tracker.h" | 7 #include "cc/occlusion_tracker.h" |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 | 10 |
| 11 #include "FloatRect.h" |
| 11 #include "cc/layer.h" | 12 #include "cc/layer.h" |
| 12 #include "cc/layer_impl.h" | 13 #include "cc/layer_impl.h" |
| 13 #include "cc/math_util.h" | 14 #include "cc/math_util.h" |
| 14 #include "cc/overdraw_metrics.h" | 15 #include "cc/overdraw_metrics.h" |
| 16 #include "ui/gfx/quad_f.h" |
| 15 #include "ui/gfx/rect_conversions.h" | 17 #include "ui/gfx/rect_conversions.h" |
| 16 | 18 |
| 17 using namespace std; | 19 using namespace std; |
| 18 using WebKit::WebTransformationMatrix; | 20 using WebKit::WebTransformationMatrix; |
| 19 | 21 |
| 20 namespace cc { | 22 namespace cc { |
| 21 | 23 |
| 22 template<typename LayerType, typename RenderSurfaceType> | 24 template<typename LayerType, typename RenderSurfaceType> |
| 23 OcclusionTrackerBase<LayerType, RenderSurfaceType>::OcclusionTrackerBase(gfx::Re
ct rootTargetRect, bool recordMetricsForFrame) | 25 OcclusionTrackerBase<LayerType, RenderSurfaceType>::OcclusionTrackerBase(gfx::Re
ct rootTargetRect, bool recordMetricsForFrame) |
| 24 : m_rootTargetRect(rootTargetRect) | 26 : m_rootTargetRect(rootTargetRect) |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 115 } | 117 } |
| 116 } | 118 } |
| 117 | 119 |
| 118 template<typename RenderSurfaceType> | 120 template<typename RenderSurfaceType> |
| 119 static inline Region transformSurfaceOpaqueRegion(const RenderSurfaceType* surfa
ce, const Region& region, const WebTransformationMatrix& transform) | 121 static inline Region transformSurfaceOpaqueRegion(const RenderSurfaceType* surfa
ce, const Region& region, const WebTransformationMatrix& transform) |
| 120 { | 122 { |
| 121 // Verify that rects within the |surface| will remain rects in its target su
rface after applying |transform|. If this is true, then | 123 // Verify that rects within the |surface| will remain rects in its target su
rface after applying |transform|. If this is true, then |
| 122 // apply |transform| to each rect within |region| in order to transform the
entire Region. | 124 // apply |transform| to each rect within |region| in order to transform the
entire Region. |
| 123 | 125 |
| 124 bool clipped; | 126 bool clipped; |
| 125 FloatQuad transformedBoundsQuad = MathUtil::mapQuad(transform, FloatQuad(reg
ion.bounds()), clipped); | 127 gfx::QuadF transformedBoundsQuad = MathUtil::mapQuad(transform, gfx::QuadF(r
egion.bounds()), clipped); |
| 126 // FIXME: Find a rect interior to each transformed quad. | 128 // FIXME: Find a rect interior to each transformed quad. |
| 127 if (clipped || !transformedBoundsQuad.isRectilinear()) | 129 if (clipped || !transformedBoundsQuad.IsRectilinear()) |
| 128 return Region(); | 130 return Region(); |
| 129 | 131 |
| 130 Region transformedRegion; | 132 Region transformedRegion; |
| 131 | 133 |
| 132 Vector<WebCore::IntRect> rects = region.rects(); | 134 Vector<WebCore::IntRect> rects = region.rects(); |
| 133 for (size_t i = 0; i < rects.size(); ++i) { | 135 for (size_t i = 0; i < rects.size(); ++i) { |
| 134 // We've already checked for clipping in the mapQuad call above, these c
alls should not clip anything further. | 136 // We've already checked for clipping in the mapQuad call above, these c
alls should not clip anything further. |
| 135 gfx::Rect transformedRect = gfx::ToEnclosedRect(MathUtil::mapClippedRect
(transform, cc::FloatRect(rects[i]))); | 137 gfx::Rect transformedRect = gfx::ToEnclosedRect(MathUtil::mapClippedRect
(transform, cc::FloatRect(rects[i]))); |
| 136 if (!surface->clipRect().IsEmpty()) | 138 if (!surface->clipRect().IsEmpty()) |
| 137 transformedRect.Intersect(surface->clipRect()); | 139 transformedRect.Intersect(surface->clipRect()); |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 244 } | 246 } |
| 245 } | 247 } |
| 246 | 248 |
| 247 // FIXME: Remove usePaintTracking when paint tracking is on for paint culling. | 249 // FIXME: Remove usePaintTracking when paint tracking is on for paint culling. |
| 248 template<typename LayerType> | 250 template<typename LayerType> |
| 249 static inline void addOcclusionBehindLayer(Region& region, const LayerType* laye
r, const WebTransformationMatrix& transform, const Region& opaqueContents, const
gfx::Rect& clipRectInTarget, const gfx::Size& minimumTrackingSize, std::vector<
gfx::Rect>* occludingScreenSpaceRects) | 251 static inline void addOcclusionBehindLayer(Region& region, const LayerType* laye
r, const WebTransformationMatrix& transform, const Region& opaqueContents, const
gfx::Rect& clipRectInTarget, const gfx::Size& minimumTrackingSize, std::vector<
gfx::Rect>* occludingScreenSpaceRects) |
| 250 { | 252 { |
| 251 DCHECK(layer->visibleContentRect().Contains(opaqueContents.bounds())); | 253 DCHECK(layer->visibleContentRect().Contains(opaqueContents.bounds())); |
| 252 | 254 |
| 253 bool clipped; | 255 bool clipped; |
| 254 FloatQuad visibleTransformedQuad = MathUtil::mapQuad(transform, FloatQuad(la
yer->visibleContentRect()), clipped); | 256 gfx::QuadF visibleTransformedQuad = MathUtil::mapQuad(transform, gfx::QuadF(
layer->visibleContentRect()), clipped); |
| 255 // FIXME: Find a rect interior to each transformed quad. | 257 // FIXME: Find a rect interior to each transformed quad. |
| 256 if (clipped || !visibleTransformedQuad.isRectilinear()) | 258 if (clipped || !visibleTransformedQuad.IsRectilinear()) |
| 257 return; | 259 return; |
| 258 | 260 |
| 259 Vector<WebCore::IntRect> contentRects = opaqueContents.rects(); | 261 Vector<WebCore::IntRect> contentRects = opaqueContents.rects(); |
| 260 for (size_t i = 0; i < contentRects.size(); ++i) { | 262 for (size_t i = 0; i < contentRects.size(); ++i) { |
| 261 // We've already checked for clipping in the mapQuad call above, these c
alls should not clip anything further. | 263 // We've already checked for clipping in the mapQuad call above, these c
alls should not clip anything further. |
| 262 gfx::Rect transformedRect = gfx::ToEnclosedRect(MathUtil::mapClippedRect
(transform, cc::FloatRect(contentRects[i]))); | 264 gfx::Rect transformedRect = gfx::ToEnclosedRect(MathUtil::mapClippedRect
(transform, cc::FloatRect(contentRects[i]))); |
| 263 transformedRect.Intersect(clipRectInTarget); | 265 transformedRect.Intersect(clipRectInTarget); |
| 264 if (transformedRect.width() >= minimumTrackingSize.width() || transforme
dRect.height() >= minimumTrackingSize.height()) { | 266 if (transformedRect.width() >= minimumTrackingSize.width() || transforme
dRect.height() >= minimumTrackingSize.height()) { |
| 265 if (occludingScreenSpaceRects) | 267 if (occludingScreenSpaceRects) |
| 266 occludingScreenSpaceRects->push_back(transformedRect); | 268 occludingScreenSpaceRects->push_back(transformedRect); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 290 gfx::Rect clipRectInTarget = layerClipRectInTarget(layer); | 292 gfx::Rect clipRectInTarget = layerClipRectInTarget(layer); |
| 291 if (layerTransformsToTargetKnown(layer)) | 293 if (layerTransformsToTargetKnown(layer)) |
| 292 addOcclusionBehindLayer<LayerType>(m_stack.last().occlusionInTarget, lay
er, layer->drawTransform(), opaqueContents, clipRectInTarget, m_minimumTrackingS
ize, 0); | 294 addOcclusionBehindLayer<LayerType>(m_stack.last().occlusionInTarget, lay
er, layer->drawTransform(), opaqueContents, clipRectInTarget, m_minimumTrackingS
ize, 0); |
| 293 | 295 |
| 294 // We must clip the occlusion within the layer's clipRectInTarget within scr
een space as well. If the clip rect can't be moved to screen space and | 296 // We must clip the occlusion within the layer's clipRectInTarget within scr
een space as well. If the clip rect can't be moved to screen space and |
| 295 // remain rectilinear, then we don't add any occlusion in screen space. | 297 // remain rectilinear, then we don't add any occlusion in screen space. |
| 296 | 298 |
| 297 if (layerTransformsToScreenKnown(layer)) { | 299 if (layerTransformsToScreenKnown(layer)) { |
| 298 WebTransformationMatrix targetToScreenTransform = m_stack.last().target-
>renderSurface()->screenSpaceTransform(); | 300 WebTransformationMatrix targetToScreenTransform = m_stack.last().target-
>renderSurface()->screenSpaceTransform(); |
| 299 bool clipped; | 301 bool clipped; |
| 300 FloatQuad clipQuadInScreen = MathUtil::mapQuad(targetToScreenTransform,
FloatQuad(clipRectInTarget), clipped); | 302 gfx::QuadF clipQuadInScreen = MathUtil::mapQuad(targetToScreenTransform,
gfx::QuadF(clipRectInTarget), clipped); |
| 301 // FIXME: Find a rect interior to the transformed clip quad. | 303 // FIXME: Find a rect interior to the transformed clip quad. |
| 302 if (clipped || !clipQuadInScreen.isRectilinear()) | 304 if (clipped || !clipQuadInScreen.IsRectilinear()) |
| 303 return; | 305 return; |
| 304 gfx::Rect clipRectInScreen = gfx::IntersectRects(m_rootTargetRect, gfx::
ToEnclosedRect(clipQuadInScreen.boundingBox())); | 306 gfx::Rect clipRectInScreen = gfx::IntersectRects(m_rootTargetRect, gfx::
ToEnclosedRect(clipQuadInScreen.BoundingBox())); |
| 305 addOcclusionBehindLayer<LayerType>(m_stack.last().occlusionInScreen, lay
er, layer->screenSpaceTransform(), opaqueContents, clipRectInScreen, m_minimumTr
ackingSize, m_occludingScreenSpaceRects); | 307 addOcclusionBehindLayer<LayerType>(m_stack.last().occlusionInScreen, lay
er, layer->screenSpaceTransform(), opaqueContents, clipRectInScreen, m_minimumTr
ackingSize, m_occludingScreenSpaceRects); |
| 306 } | 308 } |
| 307 } | 309 } |
| 308 | 310 |
| 309 static inline bool testContentRectOccluded(const gfx::Rect& contentRect, const W
ebTransformationMatrix& contentSpaceTransform, const gfx::Rect& clipRectInTarget
, const Region& occlusion) | 311 static inline bool testContentRectOccluded(const gfx::Rect& contentRect, const W
ebTransformationMatrix& contentSpaceTransform, const gfx::Rect& clipRectInTarget
, const Region& occlusion) |
| 310 { | 312 { |
| 311 gfx::RectF transformedRect = MathUtil::mapClippedRect(contentSpaceTransform,
gfx::RectF(contentRect)); | 313 gfx::RectF transformedRect = MathUtil::mapClippedRect(contentSpaceTransform,
gfx::RectF(contentRect)); |
| 312 // Take the gfx::ToEnclosingRect, as we want to include partial pixels in th
e test. | 314 // Take the gfx::ToEnclosingRect, as we want to include partial pixels in th
e test. |
| 313 gfx::Rect targetRect = gfx::IntersectRects(gfx::ToEnclosingRect(transformedR
ect), clipRectInTarget); | 315 gfx::Rect targetRect = gfx::IntersectRects(gfx::ToEnclosingRect(transformedR
ect), clipRectInTarget); |
| 314 return targetRect.IsEmpty() || occlusion.Contains(targetRect); | 316 return targetRect.IsEmpty() || occlusion.Contains(targetRect); |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 477 template void OcclusionTrackerBase<LayerImpl, RenderSurfaceImpl>::finishedRender
Target(const LayerImpl* finishedTarget); | 479 template void OcclusionTrackerBase<LayerImpl, RenderSurfaceImpl>::finishedRender
Target(const LayerImpl* finishedTarget); |
| 478 template void OcclusionTrackerBase<LayerImpl, RenderSurfaceImpl>::leaveToRenderT
arget(const LayerImpl* newTarget); | 480 template void OcclusionTrackerBase<LayerImpl, RenderSurfaceImpl>::leaveToRenderT
arget(const LayerImpl* newTarget); |
| 479 template void OcclusionTrackerBase<LayerImpl, RenderSurfaceImpl>::markOccludedBe
hindLayer(const LayerImpl*); | 481 template void OcclusionTrackerBase<LayerImpl, RenderSurfaceImpl>::markOccludedBe
hindLayer(const LayerImpl*); |
| 480 template bool OcclusionTrackerBase<LayerImpl, RenderSurfaceImpl>::occluded(const
LayerImpl*, const gfx::Rect& contentRect, const WebKit::WebTransformationMatrix
& drawTransform, bool implDrawTransformIsUnknown, const gfx::Rect& clippedRectIn
Target, bool* hasOcclusionFromOutsideTargetSurface) const; | 482 template bool OcclusionTrackerBase<LayerImpl, RenderSurfaceImpl>::occluded(const
LayerImpl*, const gfx::Rect& contentRect, const WebKit::WebTransformationMatrix
& drawTransform, bool implDrawTransformIsUnknown, const gfx::Rect& clippedRectIn
Target, bool* hasOcclusionFromOutsideTargetSurface) const; |
| 481 template gfx::Rect OcclusionTrackerBase<LayerImpl, RenderSurfaceImpl>::unocclude
dContentRect(const LayerImpl*, const gfx::Rect& contentRect, const WebKit::WebTr
ansformationMatrix& drawTransform, bool implDrawTransformIsUnknown, const gfx::R
ect& clippedRectInTarget, bool* hasOcclusionFromOutsideTargetSurface) const; | 483 template gfx::Rect OcclusionTrackerBase<LayerImpl, RenderSurfaceImpl>::unocclude
dContentRect(const LayerImpl*, const gfx::Rect& contentRect, const WebKit::WebTr
ansformationMatrix& drawTransform, bool implDrawTransformIsUnknown, const gfx::R
ect& clippedRectInTarget, bool* hasOcclusionFromOutsideTargetSurface) const; |
| 482 template gfx::Rect OcclusionTrackerBase<LayerImpl, RenderSurfaceImpl>::unocclude
dContributingSurfaceContentRect(const LayerImpl*, bool forReplica, const gfx::Re
ct& contentRect, bool* hasOcclusionFromOutsideTargetSurface) const; | 484 template gfx::Rect OcclusionTrackerBase<LayerImpl, RenderSurfaceImpl>::unocclude
dContributingSurfaceContentRect(const LayerImpl*, bool forReplica, const gfx::Re
ct& contentRect, bool* hasOcclusionFromOutsideTargetSurface) const; |
| 483 template gfx::Rect OcclusionTrackerBase<LayerImpl, RenderSurfaceImpl>::layerClip
RectInTarget(const LayerImpl*) const; | 485 template gfx::Rect OcclusionTrackerBase<LayerImpl, RenderSurfaceImpl>::layerClip
RectInTarget(const LayerImpl*) const; |
| 484 | 486 |
| 485 | 487 |
| 486 } // namespace cc | 488 } // namespace cc |
| OLD | NEW |