| Index: cc/occlusion_tracker.cc
|
| diff --git a/cc/occlusion_tracker.cc b/cc/occlusion_tracker.cc
|
| index 7740fdabe5d13b570ece81ac70109b3bbbc55c35..cfd9acbe0c92aa13a0548dcd3f89cfbc70676301 100644
|
| --- a/cc/occlusion_tracker.cc
|
| +++ b/cc/occlusion_tracker.cc
|
| @@ -47,6 +47,7 @@ void OcclusionTrackerBase<LayerType, RenderSurfaceType>::leaveLayer(const LayerI
|
|
|
| if (layerIterator.representsItself)
|
| markOccludedBehindLayer(layerIterator.currentLayer);
|
| + // TODO(danakj): This should be done when entering the contributing surface, but in a way that the surface's own occlusion won't occlude itself.
|
| else if (layerIterator.representsContributingRenderSurface)
|
| leaveToRenderTarget(renderTarget);
|
| }
|
| @@ -279,15 +280,15 @@ void OcclusionTrackerBase<LayerType, RenderSurfaceType>::markOccludedBehindLayer
|
| if (layerIsInUnsorted3dRenderingContext(layer))
|
| return;
|
|
|
| + if (!layerTransformsToTargetKnown(layer))
|
| + return;
|
| +
|
| Region opaqueContents = layer->visibleContentOpaqueRegion();
|
| if (opaqueContents.IsEmpty())
|
| return;
|
|
|
| DCHECK(layer->visibleContentRect().Contains(opaqueContents.bounds()));
|
|
|
| - if (!layerTransformsToTargetKnown(layer))
|
| - return;
|
| -
|
| bool clipped;
|
| gfx::QuadF visibleTransformedQuad = MathUtil::mapQuad(layer->drawTransform(), gfx::QuadF(opaqueContents.bounds()), clipped);
|
| // FIXME: Find a rect interior to each transformed quad.
|
| @@ -295,7 +296,7 @@ void OcclusionTrackerBase<LayerType, RenderSurfaceType>::markOccludedBehindLayer
|
| return;
|
|
|
| gfx::Rect clipRectInTarget = gfx::IntersectRects(
|
| - layerClipRectInTarget(layer),
|
| + layer->renderTarget()->renderSurface()->contentRect(),
|
| screenSpaceClipRectInTargetSurface(layer->renderTarget()->renderSurface(), m_screenSpaceClipRect));
|
|
|
| for (Region::Iterator opaqueContentRects(opaqueContents); opaqueContentRects.has_rect(); opaqueContentRects.next()) {
|
| @@ -335,7 +336,7 @@ void OcclusionTrackerBase<LayerType, RenderSurfaceType>::markOccludedBehindLayer
|
| }
|
|
|
| template<typename LayerType, typename RenderSurfaceType>
|
| -bool OcclusionTrackerBase<LayerType, RenderSurfaceType>::occluded(const LayerType* renderTarget, const gfx::Rect& contentRect, const gfx::Transform& drawTransform, bool implDrawTransformIsUnknown, const gfx::Rect& clippedRectInTarget, bool* hasOcclusionFromOutsideTargetSurface) const
|
| +bool OcclusionTrackerBase<LayerType, RenderSurfaceType>::occluded(const LayerType* renderTarget, gfx::Rect contentRect, const gfx::Transform& drawTransform, bool implDrawTransformIsUnknown, bool isClipped, gfx::Rect clipRectInTarget, bool* hasOcclusionFromOutsideTargetSurface) const
|
| {
|
| if (hasOcclusionFromOutsideTargetSurface)
|
| *hasOcclusionFromOutsideTargetSurface = false;
|
| @@ -363,13 +364,14 @@ bool OcclusionTrackerBase<LayerType, RenderSurfaceType>::occluded(const LayerTyp
|
| // Take the ToEnclosingRect at each step, as we want to contain any unoccluded partial pixels in the resulting Rect.
|
| Region unoccludedRegionInTargetSurface = gfx::ToEnclosingRect(MathUtil::mapClippedRect(drawTransform, gfx::RectF(contentRect)));
|
| // Layers can't clip across surfaces, so count this as internal occlusion.
|
| - // TODO(danakj): This would change if we clipped to the visibleContentRect().
|
| - unoccludedRegionInTargetSurface.Intersect(clippedRectInTarget);
|
| + if (isClipped)
|
| + unoccludedRegionInTargetSurface.Intersect(clipRectInTarget);
|
| unoccludedRegionInTargetSurface.Subtract(m_stack.back().occlusionFromInsideTarget);
|
| gfx::RectF unoccludedRectInTargetSurfaceWithoutOutsideOcclusion = unoccludedRegionInTargetSurface.bounds();
|
| unoccludedRegionInTargetSurface.Subtract(m_stack.back().occlusionFromOutsideTarget);
|
|
|
| // Treat other clipping as occlusion from outside the surface.
|
| + // TODO(danakj): Clip to visibleContentRect?
|
| unoccludedRegionInTargetSurface.Intersect(renderTarget->renderSurface()->contentRect());
|
| unoccludedRegionInTargetSurface.Intersect(screenSpaceClipRectInTargetSurface(renderTarget->renderSurface(), m_screenSpaceClipRect));
|
|
|
| @@ -384,7 +386,7 @@ bool OcclusionTrackerBase<LayerType, RenderSurfaceType>::occluded(const LayerTyp
|
| }
|
|
|
| template<typename LayerType, typename RenderSurfaceType>
|
| -gfx::Rect OcclusionTrackerBase<LayerType, RenderSurfaceType>::unoccludedContentRect(const LayerType* renderTarget, const gfx::Rect& contentRect, const gfx::Transform& drawTransform, bool implDrawTransformIsUnknown, const gfx::Rect& clippedRectInTarget, bool* hasOcclusionFromOutsideTargetSurface) const
|
| +gfx::Rect OcclusionTrackerBase<LayerType, RenderSurfaceType>::unoccludedContentRect(const LayerType* renderTarget, gfx::Rect contentRect, const gfx::Transform& drawTransform, bool implDrawTransformIsUnknown, bool isClipped, gfx::Rect clipRectInTarget, bool* hasOcclusionFromOutsideTargetSurface) const
|
| {
|
| if (hasOcclusionFromOutsideTargetSurface)
|
| *hasOcclusionFromOutsideTargetSurface = false;
|
| @@ -412,13 +414,14 @@ gfx::Rect OcclusionTrackerBase<LayerType, RenderSurfaceType>::unoccludedContentR
|
| // Take the ToEnclosingRect at each step, as we want to contain any unoccluded partial pixels in the resulting Rect.
|
| Region unoccludedRegionInTargetSurface = gfx::ToEnclosingRect(MathUtil::mapClippedRect(drawTransform, gfx::RectF(contentRect)));
|
| // Layers can't clip across surfaces, so count this as internal occlusion.
|
| - // TODO(danakj): This would change if we clipped to the visibleContentRect().
|
| - unoccludedRegionInTargetSurface.Intersect(clippedRectInTarget);
|
| + if (isClipped)
|
| + unoccludedRegionInTargetSurface.Intersect(clipRectInTarget);
|
| unoccludedRegionInTargetSurface.Subtract(m_stack.back().occlusionFromInsideTarget);
|
| gfx::RectF unoccludedRectInTargetSurfaceWithoutOutsideOcclusion = unoccludedRegionInTargetSurface.bounds();
|
| unoccludedRegionInTargetSurface.Subtract(m_stack.back().occlusionFromOutsideTarget);
|
|
|
| // Treat other clipping as occlusion from outside the surface.
|
| + // TODO(danakj): Clip to visibleContentRect?
|
| unoccludedRegionInTargetSurface.Intersect(renderTarget->renderSurface()->contentRect());
|
| unoccludedRegionInTargetSurface.Intersect(screenSpaceClipRectInTargetSurface(renderTarget->renderSurface(), m_screenSpaceClipRect));
|
|
|
| @@ -471,7 +474,6 @@ gfx::Rect OcclusionTrackerBase<LayerType, RenderSurfaceType>::unoccludedContribu
|
| // Take the ToEnclosingRect at each step, as we want to contain any unoccluded partial pixels in the resulting Rect.
|
| Region unoccludedRegionInTargetSurface = gfx::ToEnclosingRect(MathUtil::mapClippedRect(drawTransform, gfx::RectF(contentRect)));
|
| // Layers can't clip across surfaces, so count this as internal occlusion.
|
| - // TODO(danakj): This would change if we clipped to the visibleContentRect().
|
| if (surface->isClipped())
|
| unoccludedRegionInTargetSurface.Intersect(surface->clipRect());
|
| if (hasOcclusion) {
|
| @@ -500,14 +502,6 @@ gfx::Rect OcclusionTrackerBase<LayerType, RenderSurfaceType>::unoccludedContribu
|
| return unoccludedRect;
|
| }
|
|
|
| -template<typename LayerType, typename RenderSurfaceType>
|
| -gfx::Rect OcclusionTrackerBase<LayerType, RenderSurfaceType>::layerClipRectInTarget(const LayerType* layer) const
|
| -{
|
| - // TODO(danakj): Can we remove this use of drawableContentRect and just use the clipRect() and target surface contentRect?
|
| - // TODO(danakj): Or can we use visibleContentRect() which is much tighter?
|
| - return layer->drawableContentRect();
|
| -}
|
| -
|
| // Instantiate (and export) templates here for the linker.
|
| template class OcclusionTrackerBase<Layer, RenderSurface>;
|
| template class OcclusionTrackerBase<LayerImpl, RenderSurfaceImpl>;
|
|
|