Changeset 107130 in webkit
- Timestamp:
- Feb 8, 2012, 1:41:47 PM (15 years ago)
- Location:
- trunk/Source
- Files:
-
- 6 edited
-
WebCore/ChangeLog (modified) (1 diff)
-
WebCore/platform/graphics/chromium/cc/CCDamageTracker.cpp (modified) (5 diffs)
-
WebCore/platform/graphics/chromium/cc/CCDamageTracker.h (modified) (2 diffs)
-
WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp (modified) (1 diff)
-
WebKit/chromium/ChangeLog (modified) (1 diff)
-
WebKit/chromium/tests/CCDamageTrackerTest.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r107127 r107130 1 2012-02-08 Shawn Singh <shawnsingh@chromium.org> 2 3 [chromium] Remove incorrect early exit in CCDamageTracker 4 https://bugs.webkit.org/show_bug.cgi?id=76924 5 6 Reviewed by James Robinson. 7 8 New unit test added to CCDamageTrackerTest.cpp 9 10 This patch does three things: (1) adds unit test that demonstrates 11 that early exiting in CCDamageTracker is wrong, (2) removes the 12 early exit and cleans up the surrounding code, and (3) re-names 13 several functions in CCDamageTracker so that state updating is 14 implied by the name, and not just a bad side-effect of the functions. 15 16 * platform/graphics/chromium/cc/CCDamageTracker.cpp: 17 (WebCore::CCDamageTracker::updateDamageTrackingState): 18 (WebCore::CCDamageTracker::trackDamageFromActiveLayers): 19 (WebCore::CCDamageTracker::trackDamageFromSurfaceMask): 20 (WebCore::CCDamageTracker::trackDamageFromLeftoverRects): 21 * platform/graphics/chromium/cc/CCDamageTracker.h: 22 (CCDamageTracker): 23 * platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp: 24 (WebCore::CCLayerTreeHostImpl::trackDamageForAllSurfaces): 25 1 26 2012-02-08 James Robinson <jamesr@chromium.org> 2 27 -
trunk/Source/WebCore/platform/graphics/chromium/cc/CCDamageTracker.cpp
r106754 r107130 57 57 } 58 58 59 void CCDamageTracker::updateDamage RectForNextFrame(const Vector<RefPtr<CCLayerImpl> >& layerList, int targetSurfaceLayerID, CCLayerImpl* targetSurfaceMaskLayer)60 { 61 // 62 // This function computes the "damage rect" of a target surface . The damage63 // rect is the region of the surface that may have changed and needs to be redrawn.64 // This can be used to scissor what is actually drawn, to save GPU computation and65 // bandwidth.59 void CCDamageTracker::updateDamageTrackingState(const Vector<RefPtr<CCLayerImpl> >& layerList, int targetSurfaceLayerID, CCLayerImpl* targetSurfaceMaskLayer) 60 { 61 // 62 // This function computes the "damage rect" of a target surface, and updates the state 63 // that is used to correctly track damage across frames. The damage rect is the region 64 // of the surface that may have changed and needs to be redrawn. This can be used to 65 // scissor what is actually drawn, to save GPU computation and bandwidth. 66 66 // 67 67 // The surface's damage rect is computed as the union of all possible changes that … … 122 122 // 123 123 124 // These functions cannot be bypassed with early-exits, even if we know what the 125 // damage will be for this frame, because we need to update the damage tracker state 126 // to correctly track the next frame. 127 FloatRect damageFromActiveLayers = trackDamageFromActiveLayers(layerList, targetSurfaceLayerID); 128 FloatRect damageFromSurfaceMask = trackDamageFromSurfaceMask(targetSurfaceMaskLayer); 129 FloatRect damageFromLeftoverRects = trackDamageFromLeftoverRects(); 130 124 131 // If the target surface already knows its entire region is damaged, we can return early. 125 132 // FIXME: this should go away, or will be cleaner, after refactoring into RenderPass/RenderSchedule. 126 133 CCLayerImpl* layer = layerList[0].get(); 127 if (layer->targetRenderSurface()->surfacePropertyChangedOnlyFromDescendant()) { 128 m_currentDamageRect = FloatRect(layer->targetRenderSurface()->contentRect()); 129 // FIXME: this early exit is incorrect: https://bugs.webkit.org/show_bug.cgi?id=76924 130 return; 131 } 132 133 FloatRect damageFromActiveLayers = computeDamageFromActiveLayers(layerList, targetSurfaceLayerID); 134 FloatRect damageFromSurfaceMask = computeDamageFromSurfaceMask(targetSurfaceMaskLayer); 135 FloatRect damageFromLeftoverRects = computeDamageFromLeftoverRects(); 136 137 if (m_forceFullDamageNextUpdate) { 138 m_currentDamageRect = FloatRect(layer->targetRenderSurface()->contentRect()); 134 CCRenderSurface* targetSurface = layer->targetRenderSurface(); 135 136 if (m_forceFullDamageNextUpdate || targetSurface->surfacePropertyChangedOnlyFromDescendant()) { 137 m_currentDamageRect = FloatRect(targetSurface->contentRect()); 139 138 m_forceFullDamageNextUpdate = false; 140 139 } else { 140 // FIXME: can we need to clamp this damage to the surface's content rect? (affects performance, but not correctness) 141 141 m_currentDamageRect = damageFromActiveLayers; 142 142 m_currentDamageRect.uniteIfNonZero(damageFromSurfaceMask); … … 162 162 } 163 163 164 FloatRect CCDamageTracker:: computeDamageFromActiveLayers(const Vector<RefPtr<CCLayerImpl> >& layerList, int targetSurfaceLayerID)164 FloatRect CCDamageTracker::trackDamageFromActiveLayers(const Vector<RefPtr<CCLayerImpl> >& layerList, int targetSurfaceLayerID) 165 165 { 166 166 FloatRect damageRect = FloatRect(); … … 178 178 } 179 179 180 FloatRect CCDamageTracker:: computeDamageFromSurfaceMask(CCLayerImpl* targetSurfaceMaskLayer)180 FloatRect CCDamageTracker::trackDamageFromSurfaceMask(CCLayerImpl* targetSurfaceMaskLayer) 181 181 { 182 182 FloatRect damageRect = FloatRect(); … … 194 194 } 195 195 196 FloatRect CCDamageTracker:: computeDamageFromLeftoverRects()196 FloatRect CCDamageTracker::trackDamageFromLeftoverRects() 197 197 { 198 198 // After computing damage for all active layers, any leftover items in the current -
trunk/Source/WebCore/platform/graphics/chromium/cc/CCDamageTracker.h
r106754 r107130 45 45 46 46 void forceFullDamageNextUpdate() { m_forceFullDamageNextUpdate = true; } 47 void updateDamage RectForNextFrame(const Vector<RefPtr<CCLayerImpl> >& layerList, int targetSurfaceLayerID, CCLayerImpl* targetSurfaceMaskLayer);47 void updateDamageTrackingState(const Vector<RefPtr<CCLayerImpl> >& layerList, int targetSurfaceLayerID, CCLayerImpl* targetSurfaceMaskLayer); 48 48 const FloatRect& currentDamageRect() { return m_currentDamageRect; } 49 49 … … 51 51 CCDamageTracker(); 52 52 53 FloatRect computeDamageFromActiveLayers(const Vector<RefPtr<CCLayerImpl> >& layerList, int targetSurfaceLayerID);54 FloatRect computeDamageFromSurfaceMask(CCLayerImpl* targetSurfaceMaskLayer);55 FloatRect computeDamageFromLeftoverRects();53 FloatRect trackDamageFromActiveLayers(const Vector<RefPtr<CCLayerImpl> >& layerList, int targetSurfaceLayerID); 54 FloatRect trackDamageFromSurfaceMask(CCLayerImpl* targetSurfaceMaskLayer); 55 FloatRect trackDamageFromLeftoverRects(); 56 56 57 57 FloatRect removeRectFromCurrentFrame(int layerID); 58 58 void saveRectForNextFrame(int layerID, const FloatRect& targetSpaceRect); 59 59 60 // These helper functions are used only in computeDamageFromActiveLayers().60 // These helper functions are used only in trackDamageFromActiveLayers(). 61 61 void extendDamageForLayer(CCLayerImpl*, FloatRect& targetDamageRect); 62 62 void extendDamageForRenderSurface(CCLayerImpl*, FloatRect& targetDamageRect); -
trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp
r106700 r107130 149 149 CCRenderSurface* renderSurface = renderSurfaceLayer->renderSurface(); 150 150 ASSERT(renderSurface); 151 renderSurface->damageTracker()->updateDamage RectForNextFrame(renderSurface->layerList(), renderSurfaceLayer->id(), renderSurfaceLayer->maskLayer());151 renderSurface->damageTracker()->updateDamageTrackingState(renderSurface->layerList(), renderSurfaceLayer->id(), renderSurfaceLayer->maskLayer()); 152 152 } 153 153 } -
trunk/Source/WebKit/chromium/ChangeLog
r107125 r107130 1 2012-02-08 Shawn Singh <shawnsingh@chromium.org> 2 3 [chromium] Remove incorrect early exit in CCDamageTracker 4 https://bugs.webkit.org/show_bug.cgi?id=76924 5 6 Reviewed by James Robinson. 7 8 * tests/CCDamageTrackerTest.cpp: 9 (WebKitTests::emulateDrawingOneFrame): 10 (WebKitTests::TEST_F): 11 (WebKitTests): 12 1 13 2012-02-08 Sadrul Habib Chowdhury <sadrul@chromium.org> 2 14 -
trunk/Source/WebKit/chromium/tests/CCDamageTrackerTest.cpp
r106754 r107130 71 71 for (int i = renderSurfaceLayerList.size() - 1; i >= 0; --i) { 72 72 CCRenderSurface* targetSurface = renderSurfaceLayerList[i]->renderSurface(); 73 targetSurface->damageTracker()->updateDamage RectForNextFrame(targetSurface->layerList(), targetSurface->owningLayerId(), renderSurfaceLayerList[i]->maskLayer());73 targetSurface->damageTracker()->updateDamageTrackingState(targetSurface->layerList(), targetSurface->owningLayerId(), renderSurfaceLayerList[i]->maskLayer()); 74 74 } 75 75
Note:
See TracChangeset
for help on using the changeset viewer.