⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 98757 in webkit


Ignore:
Timestamp:
Oct 28, 2011, 1:44:58 PM (15 years ago)
Author:
enne@google.com
Message:

[chromium] Implicitly skip render surfaces that won't be drawn
https://bugs.webkit.org/show_bug.cgi?id=71038

Rather than having redundant checks in three places for how to walk
through a render surface list, instead don't add render surfaces that
don't need to get rendered to the render surface list.

Reviewed by James Robinson.

Covered by existing layout tests.

  • platform/graphics/chromium/LayerRendererChromium.cpp:

(WebCore::LayerRendererChromium::drawLayersOntoRenderSurfaces):

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

(WebCore::CCLayerTreeHost::paintLayerContents):
(WebCore::CCLayerTreeHost::updateCompositorResources):

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

(WebCore::calculateDrawTransformsAndVisibilityInternal):

Location:
trunk/Source/WebCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r98755 r98757  
     12011-10-28  Adrienne Walker  <enne@google.com>
     2
     3        [chromium] Implicitly skip render surfaces that won't be drawn
     4        https://bugs.webkit.org/show_bug.cgi?id=71038
     5
     6        Rather than having redundant checks in three places for how to walk
     7        through a render surface list, instead don't add render surfaces that
     8        don't need to get rendered to the render surface list.
     9
     10        Reviewed by James Robinson.
     11
     12        Covered by existing layout tests.
     13
     14        * platform/graphics/chromium/LayerRendererChromium.cpp:
     15        (WebCore::LayerRendererChromium::drawLayersOntoRenderSurfaces):
     16        * platform/graphics/chromium/cc/CCLayerTreeHost.cpp:
     17        (WebCore::CCLayerTreeHost::paintLayerContents):
     18        (WebCore::CCLayerTreeHost::updateCompositorResources):
     19        * platform/graphics/chromium/cc/CCLayerTreeHostCommon.cpp:
     20        (WebCore::calculateDrawTransformsAndVisibilityInternal):
     21
    1222011-10-28  Adam Barth  <abarth@webkit.org>
    223
  • trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp

    r98567 r98757  
    313313        CCRenderSurface* renderSurface = renderSurfaceLayer->renderSurface();
    314314        ASSERT(renderSurface);
    315 
    316         renderSurface->setSkipsDraw(true);
    317 
    318         if (!renderSurface->layerList().size())
    319             continue;
    320 
    321         // Skip completely transparent render surfaces.
    322         if (!renderSurface->drawOpacity())
    323             continue;
     315        ASSERT(renderSurface->layerList().size());
     316        ASSERT(renderSurface->drawOpacity());
    324317
    325318        if (useRenderSurface(renderSurface)) {
    326             renderSurface->setSkipsDraw(false);
    327 
    328319            if (renderSurfaceLayer != rootDrawLayer) {
    329320                GLC(m_context.get(), m_context->disable(GraphicsContext3D::SCISSOR_TEST));
  • trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHost.cpp

    r98471 r98757  
    331331        RenderSurfaceChromium* renderSurface = renderSurfaceLayer->renderSurface();
    332332        ASSERT(renderSurface);
    333 
    334         // Render surfaces whose drawable area has zero width or height
    335         // will have no layers associated with them and should be skipped.
    336         if (!renderSurface->layerList().size())
    337             continue;
    338 
    339         if (!renderSurface->drawOpacity())
    340             continue;
     333        ASSERT(renderSurface->layerList().size());
     334        ASSERT(renderSurface->drawOpacity());
    341335
    342336        renderSurfaceLayer->setLayerTreeHost(this);
     
    371365        RenderSurfaceChromium* renderSurface = renderSurfaceLayer->renderSurface();
    372366        ASSERT(renderSurface);
    373 
    374         if (!renderSurface->layerList().size() || !renderSurface->drawOpacity())
    375             continue;
     367        ASSERT(renderSurface->layerList().size());
     368        ASSERT(renderSurface->drawOpacity());
    376369
    377370        if (renderSurfaceLayer->maskLayer())
  • trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostCommon.cpp

    r98313 r98757  
    233233    bool useSurfaceForFlatDescendants = layer->parent() && layer->parent()->preserves3D() && !layer->preserves3D() && layer->descendantDrawsContent();
    234234    if (useSurfaceForMasking || useSurfaceForReflection || useSurfaceForFlatDescendants || ((useSurfaceForClipping || useSurfaceForOpacity) && layer->descendantDrawsContent())) {
     235        // Layer's opacity will be applied when drawing the render surface.
     236        float drawOpacity = layer->opacity();
     237        if (layer->parent() && layer->parent()->preserves3D())
     238            drawOpacity *= layer->parent()->drawOpacity();
     239
     240        // If this render surface isn't drawn, we can also skip its children.
     241        if (!drawOpacity)
     242            return;
     243
    235244        if (!layer->renderSurface())
    236245            layer->createRenderSurface();
     246
    237247        RenderSurfaceType* renderSurface = layer->renderSurface();
     248        renderSurface->clearLayerList();
    238249
    239250        // The origin of the new surface is the upper left corner of the layer.
     
    244255        transformedLayerRect = IntRect(0, 0, bounds.width(), bounds.height());
    245256
    246         // Layer's opacity will be applied when drawing the render surface.
    247         float drawOpacity = layer->opacity();
    248         if (layer->parent() && layer->parent()->preserves3D())
    249             drawOpacity *= layer->parent()->drawOpacity();
    250257        renderSurface->setDrawOpacity(drawOpacity);
    251258        layer->setDrawOpacity(1);
     
    262269        // surface and is therefore expressed in the parent's coordinate system.
    263270        renderSurface->setScissorRect(layer->parent() ? layer->parent()->scissorRect() : layer->scissorRect());
    264 
    265         renderSurface->clearLayerList();
    266271
    267272        if (layer->maskLayer()) {
     
    372377    }
    373378
     379    if (layer->renderSurface() && !layer->renderSurface()->layerList().size()) {
     380        // If a render surface has no layer list, then it and none of its
     381        // children needed to get drawn. Therefore, it should be the last layer
     382        // in the render surface list and we can trivially remove it.
     383        ASSERT(renderSurfaceLayerList.last() == layer);
     384        renderSurfaceLayerList.removeLast();
     385        layer->clearRenderSurface();
     386        return;
     387    }
     388
     389    // If neither this layer nor any of its children were added, early out.
     390    if (sortingStartIndex == descendants.size())
     391        return;
     392
    374393    if (layer->masksToBounds() || useSurfaceForMasking) {
    375394        IntRect drawableContentRect = layer->drawableContentRect();
Note: See TracChangeset for help on using the changeset viewer.