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

Side by Side Diff: Source/WebCore/platform/graphics/chromium/cc/CCOcclusionTracker.cpp

Issue 10146014: Merge 113677 - [chromium] Viewport is not filled when out of texture memory on mac (Closed) Base URL: http://svn.webkit.org/repository/webkit/branches/chromium/1084/
Patch Set: Created 8 years, 8 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2012 Google Inc. All rights reserved. 2 * Copyright (C) 2012 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
187 boundsInLayerSpace.height() / static_cast<double>( boundsInContentSpace.height())); 187 boundsInLayerSpace.height() / static_cast<double>( boundsInContentSpace.height()));
188 188
189 // The draw transform expects the origin to be in the middle of the layer. 189 // The draw transform expects the origin to be in the middle of the layer.
190 transform.translate(-boundsInContentSpace.width() / 2.0, -boundsInContentSpa ce.height() / 2.0); 190 transform.translate(-boundsInContentSpace.width() / 2.0, -boundsInContentSpa ce.height() / 2.0);
191 191
192 return transform; 192 return transform;
193 } 193 }
194 194
195 // FIXME: Remove usePaintTracking when paint tracking is on for paint culling. 195 // FIXME: Remove usePaintTracking when paint tracking is on for paint culling.
196 template<typename LayerType> 196 template<typename LayerType>
197 static inline Region computeOcclusionBehindLayer(const LayerType* layer, const T ransformationMatrix& transform, bool usePaintTracking) 197 static inline Region computeOcclusionBehindLayer(const LayerType* layer, const T ransformationMatrix& transform, const Region& opaqueContents, bool usePaintTrack ing)
198 { 198 {
199 Region opaqueRegion; 199 ASSERT(layer->visibleLayerRect().contains(opaqueContents.bounds()));
200 200
201 FloatQuad unoccludedQuad = transform.mapQuad(FloatQuad(layer->visibleLayerRe ct())); 201 FloatQuad unoccludedQuad = transform.mapQuad(FloatQuad(layer->visibleLayerRe ct()));
202 bool isPaintedAxisAligned = unoccludedQuad.isRectilinear(); 202 bool isPaintedAxisAligned = unoccludedQuad.isRectilinear();
203 if (!isPaintedAxisAligned) 203 if (!isPaintedAxisAligned)
204 return opaqueRegion; 204 return Region();
205 205
206 if (layer->opaque()) 206 Region transformedOpaqueContents;
207 opaqueRegion = enclosedIntRect(unoccludedQuad.boundingBox()); 207 if (usePaintTracking && transform.isIdentity())
208 else if (usePaintTracking && transform.isIdentity()) 208 transformedOpaqueContents = opaqueContents;
209 opaqueRegion = layer->visibleContentOpaqueRegion();
210 else if (usePaintTracking) { 209 else if (usePaintTracking) {
211 Region contentRegion = layer->visibleContentOpaqueRegion(); 210 Vector<IntRect> contentRects = opaqueContents.rects();
212 Vector<IntRect> contentRects = contentRegion.rects();
213 for (size_t i = 0; i < contentRects.size(); ++i) 211 for (size_t i = 0; i < contentRects.size(); ++i)
214 opaqueRegion.unite(enclosedIntRect(transform.mapRect(FloatRect(conte ntRects[i])))); 212 transformedOpaqueContents.unite(enclosedIntRect(transform.mapRect(Fl oatRect(contentRects[i]))));
215 } 213 }
216 return opaqueRegion; 214
215 return transformedOpaqueContents;
217 } 216 }
218 217
219 template<typename LayerType, typename RenderSurfaceType> 218 template<typename LayerType, typename RenderSurfaceType>
220 void CCOcclusionTrackerBase<LayerType, RenderSurfaceType>::markOccludedBehindLay er(const LayerType* layer) 219 void CCOcclusionTrackerBase<LayerType, RenderSurfaceType>::markOccludedBehindLay er(const LayerType* layer)
221 { 220 {
222 ASSERT(!m_stack.isEmpty()); 221 ASSERT(!m_stack.isEmpty());
223 ASSERT(layer->targetRenderSurface() == m_stack.last().surface); 222 ASSERT(layer->targetRenderSurface() == m_stack.last().surface);
224 if (m_stack.isEmpty()) 223 if (m_stack.isEmpty())
225 return; 224 return;
226 225
227 if (!layerOpacityKnown(layer) || layer->drawOpacity() < 1) 226 if (!layerOpacityKnown(layer) || layer->drawOpacity() < 1)
228 return; 227 return;
229 228
229 Region opaqueContents = layer->visibleContentOpaqueRegion();
230 if (opaqueContents.isEmpty())
231 return;
232
230 // FIXME: Remove m_usePaintTracking when paint tracking is on for paint cull ing. 233 // FIXME: Remove m_usePaintTracking when paint tracking is on for paint cull ing.
231 if (layerTransformsToScreenKnown(layer)) 234 if (layerTransformsToScreenKnown(layer))
232 m_stack.last().occlusionInScreen.unite(computeOcclusionBehindLayer<Layer Type>(layer, contentToScreenSpaceTransform<LayerType>(layer), m_usePaintTracking )); 235 m_stack.last().occlusionInScreen.unite(computeOcclusionBehindLayer<Layer Type>(layer, contentToScreenSpaceTransform<LayerType>(layer), opaqueContents, m_ usePaintTracking));
233 if (layerTransformsToTargetKnown(layer)) 236 if (layerTransformsToTargetKnown(layer))
234 m_stack.last().occlusionInTarget.unite(computeOcclusionBehindLayer<Layer Type>(layer, contentToTargetSurfaceTransform<LayerType>(layer), m_usePaintTracki ng)); 237 m_stack.last().occlusionInTarget.unite(computeOcclusionBehindLayer<Layer Type>(layer, contentToTargetSurfaceTransform<LayerType>(layer), opaqueContents, m_usePaintTracking));
235 } 238 }
236 239
237 static inline bool testContentRectOccluded(const IntRect& contentRect, const Tra nsformationMatrix& contentSpaceTransform, const IntRect& scissorRect, const Regi on& occlusion) 240 static inline bool testContentRectOccluded(const IntRect& contentRect, const Tra nsformationMatrix& contentSpaceTransform, const IntRect& scissorRect, const Regi on& occlusion)
238 { 241 {
239 FloatRect transformedRect = contentSpaceTransform.mapRect(FloatRect(contentR ect)); 242 FloatRect transformedRect = contentSpaceTransform.mapRect(FloatRect(contentR ect));
240 // Take the enclosingIntRect, as we want to include partial pixels in the te st. 243 // Take the enclosingIntRect, as we want to include partial pixels in the te st.
241 IntRect targetRect = intersection(enclosingIntRect(transformedRect), scissor Rect); 244 IntRect targetRect = intersection(enclosingIntRect(transformedRect), scissor Rect);
242 return targetRect.isEmpty() || occlusion.contains(targetRect); 245 return targetRect.isEmpty() || occlusion.contains(targetRect);
243 } 246 }
244 247
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
379 template void CCOcclusionTrackerBase<CCLayerImpl, CCRenderSurface>::markOccluded BehindLayer(const CCLayerImpl*); 382 template void CCOcclusionTrackerBase<CCLayerImpl, CCRenderSurface>::markOccluded BehindLayer(const CCLayerImpl*);
380 template bool CCOcclusionTrackerBase<CCLayerImpl, CCRenderSurface>::occluded(con st CCLayerImpl*, const IntRect& contentRect) const; 383 template bool CCOcclusionTrackerBase<CCLayerImpl, CCRenderSurface>::occluded(con st CCLayerImpl*, const IntRect& contentRect) const;
381 template IntRect CCOcclusionTrackerBase<CCLayerImpl, CCRenderSurface>::unocclude dContentRect(const CCLayerImpl*, const IntRect& contentRect) const; 384 template IntRect CCOcclusionTrackerBase<CCLayerImpl, CCRenderSurface>::unocclude dContentRect(const CCLayerImpl*, const IntRect& contentRect) const;
382 template const Region& CCOcclusionTrackerBase<CCLayerImpl, CCRenderSurface>::cur rentOcclusionInScreenSpace() const; 385 template const Region& CCOcclusionTrackerBase<CCLayerImpl, CCRenderSurface>::cur rentOcclusionInScreenSpace() const;
383 template const Region& CCOcclusionTrackerBase<CCLayerImpl, CCRenderSurface>::cur rentOcclusionInTargetSurface() const; 386 template const Region& CCOcclusionTrackerBase<CCLayerImpl, CCRenderSurface>::cur rentOcclusionInTargetSurface() const;
384 template IntRect CCOcclusionTrackerBase<CCLayerImpl, CCRenderSurface>::layerScis sorRectInTargetSurface(const CCLayerImpl*) const; 387 template IntRect CCOcclusionTrackerBase<CCLayerImpl, CCRenderSurface>::layerScis sorRectInTargetSurface(const CCLayerImpl*) const;
385 388
386 389
387 } // namespace WebCore 390 } // namespace WebCore
388 #endif // USE(ACCELERATED_COMPOSITING) 391 #endif // USE(ACCELERATED_COMPOSITING)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698