Changeset 107130 in webkit


Ignore:
Timestamp:
Feb 8, 2012 1:41:47 PM (12 years ago)
Author:
shawnsingh@chromium.org
Message:

[chromium] Remove incorrect early exit in CCDamageTracker
https://bugs.webkit.org/show_bug.cgi?id=76924

Reviewed by James Robinson.

Source/WebCore:

New unit test added to CCDamageTrackerTest.cpp

This patch does three things: (1) adds unit test that demonstrates
that early exiting in CCDamageTracker is wrong, (2) removes the
early exit and cleans up the surrounding code, and (3) re-names
several functions in CCDamageTracker so that state updating is
implied by the name, and not just a bad side-effect of the functions.

  • platform/graphics/chromium/cc/CCDamageTracker.cpp:

(WebCore::CCDamageTracker::updateDamageTrackingState):
(WebCore::CCDamageTracker::trackDamageFromActiveLayers):
(WebCore::CCDamageTracker::trackDamageFromSurfaceMask):
(WebCore::CCDamageTracker::trackDamageFromLeftoverRects):

  • platform/graphics/chromium/cc/CCDamageTracker.h:

(CCDamageTracker):

  • platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp:

(WebCore::CCLayerTreeHostImpl::trackDamageForAllSurfaces):

Source/WebKit/chromium:

  • tests/CCDamageTrackerTest.cpp:

(WebKitTests::emulateDrawingOneFrame):
(WebKitTests::TEST_F):
(WebKitTests):

Location:
trunk/Source
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r107127 r107130  
     12012-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
    1262012-02-08  James Robinson  <jamesr@chromium.org>
    227
  • trunk/Source/WebCore/platform/graphics/chromium/cc/CCDamageTracker.cpp

    r106754 r107130  
    5757}
    5858
    59 void CCDamageTracker::updateDamageRectForNextFrame(const Vector<RefPtr<CCLayerImpl> >& layerList, int targetSurfaceLayerID, CCLayerImpl* targetSurfaceMaskLayer)
    60 {
    61     //
    62     // This function computes the "damage rect" of a target surface. The damage
    63     // 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 and
    65     // bandwidth.
     59void 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.
    6666    //
    6767    // The surface's damage rect is computed as the union of all possible changes that
     
    122122    //
    123123
     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
    124131    // If the target surface already knows its entire region is damaged, we can return early.
    125132    // FIXME: this should go away, or will be cleaner, after refactoring into RenderPass/RenderSchedule.
    126133    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());
    139138        m_forceFullDamageNextUpdate = false;
    140139    } else {
     140        // FIXME: can we need to clamp this damage to the surface's content rect? (affects performance, but not correctness)
    141141        m_currentDamageRect = damageFromActiveLayers;
    142142        m_currentDamageRect.uniteIfNonZero(damageFromSurfaceMask);
     
    162162}
    163163
    164 FloatRect CCDamageTracker::computeDamageFromActiveLayers(const Vector<RefPtr<CCLayerImpl> >& layerList, int targetSurfaceLayerID)
     164FloatRect CCDamageTracker::trackDamageFromActiveLayers(const Vector<RefPtr<CCLayerImpl> >& layerList, int targetSurfaceLayerID)
    165165{
    166166    FloatRect damageRect = FloatRect();
     
    178178}
    179179
    180 FloatRect CCDamageTracker::computeDamageFromSurfaceMask(CCLayerImpl* targetSurfaceMaskLayer)
     180FloatRect CCDamageTracker::trackDamageFromSurfaceMask(CCLayerImpl* targetSurfaceMaskLayer)
    181181{
    182182    FloatRect damageRect = FloatRect();
     
    194194}
    195195
    196 FloatRect CCDamageTracker::computeDamageFromLeftoverRects()
     196FloatRect CCDamageTracker::trackDamageFromLeftoverRects()
    197197{
    198198    // After computing damage for all active layers, any leftover items in the current
  • trunk/Source/WebCore/platform/graphics/chromium/cc/CCDamageTracker.h

    r106754 r107130  
    4545
    4646    void forceFullDamageNextUpdate() { m_forceFullDamageNextUpdate = true; }
    47     void updateDamageRectForNextFrame(const Vector<RefPtr<CCLayerImpl> >& layerList, int targetSurfaceLayerID, CCLayerImpl* targetSurfaceMaskLayer);
     47    void updateDamageTrackingState(const Vector<RefPtr<CCLayerImpl> >& layerList, int targetSurfaceLayerID, CCLayerImpl* targetSurfaceMaskLayer);
    4848    const FloatRect& currentDamageRect() { return m_currentDamageRect; }
    4949
     
    5151    CCDamageTracker();
    5252
    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();
    5656
    5757    FloatRect removeRectFromCurrentFrame(int layerID);
    5858    void saveRectForNextFrame(int layerID, const FloatRect& targetSpaceRect);
    5959
    60     // These helper functions are used only in computeDamageFromActiveLayers().
     60    // These helper functions are used only in trackDamageFromActiveLayers().
    6161    void extendDamageForLayer(CCLayerImpl*, FloatRect& targetDamageRect);
    6262    void extendDamageForRenderSurface(CCLayerImpl*, FloatRect& targetDamageRect);
  • trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp

    r106700 r107130  
    149149        CCRenderSurface* renderSurface = renderSurfaceLayer->renderSurface();
    150150        ASSERT(renderSurface);
    151         renderSurface->damageTracker()->updateDamageRectForNextFrame(renderSurface->layerList(), renderSurfaceLayer->id(), renderSurfaceLayer->maskLayer());
     151        renderSurface->damageTracker()->updateDamageTrackingState(renderSurface->layerList(), renderSurfaceLayer->id(), renderSurfaceLayer->maskLayer());
    152152    }
    153153}
  • trunk/Source/WebKit/chromium/ChangeLog

    r107125 r107130  
     12012-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
    1132012-02-08  Sadrul Habib Chowdhury  <sadrul@chromium.org>
    214
  • trunk/Source/WebKit/chromium/tests/CCDamageTrackerTest.cpp

    r106754 r107130  
    7171    for (int i = renderSurfaceLayerList.size() - 1; i >= 0; --i) {
    7272        CCRenderSurface* targetSurface = renderSurfaceLayerList[i]->renderSurface();
    73         targetSurface->damageTracker()->updateDamageRectForNextFrame(targetSurface->layerList(), targetSurface->owningLayerId(), renderSurfaceLayerList[i]->maskLayer());
     73        targetSurface->damageTracker()->updateDamageTrackingState(targetSurface->layerList(), targetSurface->owningLayerId(), renderSurfaceLayerList[i]->maskLayer());
    7474    }
    7575
Note: See TracChangeset for help on using the changeset viewer.