Ignore:
Timestamp:
Sep 26, 2013, 1:20:57 AM (12 years ago)
Author:
[email protected]
Message:

[CSS Regions] The layers from the flow thread should be collected under the regions' layers.
https://bugs.webkit.org/show_bug.cgi?id=120457

Patch by Mihai Maerean <Mihai Maerean> on 2013-09-26
Reviewed by David Hyatt.

Source/WebCore:

This patch is based on the work of Alexandru Chiculita at https://bugs.webkit.org/attachment.cgi?id=203872&action=review

The composited layers inside the named flow threads are collected as part of the regions.
When a region displays a layer that needs accelerated compositing we activate the accelerated compositing for
that region too (inside RenderFlowThread::updateAllLayerToRegionMappings).

Tests: fast/regions/layers/accelerated-compositing/crash-transform-inside-region.html

fast/regions/layers/accelerated-compositing/floated-region-with-transformed-child.html
fast/regions/layers/accelerated-compositing/move-layer-from-one-region-to-another.html
fast/regions/layers/accelerated-compositing/propagate-region-box-shadow-border-padding.html
fast/regions/layers/accelerated-compositing/propagate-region-box-shadow-border-padding-for-video.html
fast/regions/layers/accelerated-compositing/region-as-layer-in-another-flowthread.html
fast/regions/layers/accelerated-compositing/transform-transparent-positioned-video-inside-region.html
fast/regions/layers/accelerated-compositing/transformed-layer-inside-transformed-layer.html
fast/regions/layers/accelerated-compositing/z-index.html: Added.
fast/regions/layers/accelerated-compositing/z-index-update.html: Added.

  • rendering/FlowThreadController.cpp:

(WebCore::FlowThreadController::updateRenderFlowThreadLayersIfNeeded):

  • rendering/RenderFlowThread.cpp:

(WebCore::RenderFlowThread::layout): When the layout of the flow thread is over (including the 2 phase layout),
we update all the mappings between the layers inside the flow thread and the regions where those layers will be
painted.
(WebCore::RenderFlowThread::hasCompositingRegionDescendant): Whether any of the regions has a compositing descendant.
(WebCore::RenderFlowThread::getLayerListForRegion):
(WebCore::RenderFlowThread::regionForCompositedLayer):
(WebCore::RenderFlowThread::cachedRegionForCompositedLayer):
(WebCore::RenderFlowThread::updateLayerToRegionMappings): Triggers an update of the layers if a layer has moved
from a region to another since the last update.
(WebCore::RenderFlowThread::updateAllLayerToRegionMappings):

  • rendering/RenderFlowThread.h:
  • rendering/RenderGeometryMap.cpp:

(WebCore::RenderGeometryMap::pushRenderFlowThread):

  • rendering/RenderGeometryMap.h:
  • rendering/RenderLayer.cpp:

(WebCore::RenderLayer::calculateLayerBounds): The RenderNamedFlowThread is ignored when we calculate the bounds
of the RenderView.

  • rendering/RenderLayer.h:
  • rendering/RenderLayerBacking.cpp:

(WebCore::RenderLayerBacking::shouldClipCompositedBounds): Not if it's inside an out of flow Flow Thread.
(WebCore::RenderLayerBacking::updateGraphicsLayerGeometry): Now adjusts the ancestorCompositingBounds for the FlowThread.
(WebCore::enclosingFlowThreadAncestor):
(WebCore::RenderLayerBacking::adjustAncestorCompositingBoundsForFlowThread): Make sure that the region propagates
its borders, paddings, outlines or box-shadows to layers inside it.

  • rendering/RenderLayerBacking.h:
  • rendering/RenderLayerCompositor.cpp:

(WebCore::RenderLayerCompositor::computeCompositingRequirements): Now calls computeRegionCompositingRequirements.
(WebCore::RenderLayerCompositor::computeRegionCompositingRequirements):
(WebCore::RenderLayerCompositor::rebuildCompositingLayerTree): Do not iterate the RenderFlowThread directly. We
are going to collect composited layers as part of regions.
(WebCore::RenderLayerCompositor::rebuildRegionCompositingLayerTree):
(WebCore::RenderLayerCompositor::canBeComposited): CSS Regions flow threads do not need to be composited as we
use composited RenderRegions to render the background of the RenderFlowThread.
(WebCore::RenderLayerCompositor::requiresCompositingForIndirectReason): If it's a region.

  • rendering/RenderLayerCompositor.h:
  • rendering/RenderMultiColumnSet.cpp:

(WebCore::RenderMultiColumnSet::adjustRegionBoundsFromFlowThreadPortionRect):

  • rendering/RenderMultiColumnSet.h:
  • rendering/RenderElement.cpp:

(WebCore::RenderObject::propagateStyleToAnonymousChildren): Not for RenderFlowThreads, as they are updated
through the RenderView::styleDidChange function.

  • rendering/RenderRegion.cpp:

(WebCore::RenderRegion::setRequiresLayerForCompositing):
(WebCore::RenderRegion::adjustRegionBoundsFromFlowThreadPortionRect):

  • rendering/RenderRegion.h:

(WebCore::toRenderRegion):

  • rendering/RenderRegionSet.h:

(WebCore::RenderRegionSet::requiresLayer): Never.

  • rendering/RenderTreeAsText.cpp:

(WebCore::writeLayers):

LayoutTests:

  • fast/regions/layers/accelerated-compositing/crash-transform-inside-region.html: Added.
  • fast/regions/layers/accelerated-compositing/crash-transform-inside-region-expected.html: Added.
  • fast/regions/layers/accelerated-compositing/floated-region-with-transformed-child.html: Added.
  • fast/regions/layers/accelerated-compositing/floated-region-with-transformed-child-expected.html: Added.
  • fast/regions/layers/accelerated-compositing/move-layer-from-one-region-to-another.html: Added.
  • fast/regions/layers/accelerated-compositing/move-layer-from-one-region-to-another-expected.html: Added.
  • fast/regions/layers/accelerated-compositing/propagate-region-box-shadow-border-padding.html: Added.
  • fast/regions/layers/accelerated-compositing/propagate-region-box-shadow-border-padding-expected.html: Added.
  • fast/regions/layers/accelerated-compositing/propagate-region-box-shadow-border-padding-for-video.html: Added.
  • fast/regions/layers/accelerated-compositing/propagate-region-box-shadow-border-padding-for-video-expected.html: Added.
  • fast/regions/layers/accelerated-compositing/region-as-layer-in-another-flowthread.html: Added.
  • fast/regions/layers/accelerated-compositing/region-as-layer-in-another-flowthread-expected.html: Added.
  • fast/regions/layers/accelerated-compositing/transformed-layer-inside-transformed-layer.html: Added.
  • fast/regions/layers/accelerated-compositing/transformed-layer-inside-transformed-layer-expected.html: Added.
  • fast/regions/layers/accelerated-compositing/transform-transparent-positioned-video-inside-region.html: Added.
  • fast/regions/layers/accelerated-compositing/transform-transparent-positioned-video-inside-region-expected.html: Added.
  • fast/regions/layers/accelerated-compositing/z-index.html: Added.
  • fast/regions/layers/accelerated-compositing/z-index-expected.html: Added.
  • fast/regions/layers/accelerated-compositing/z-index-update-expected.html: Added.
  • fast/regions/layers/accelerated-compositing/z-index-update.html: Added.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/rendering/RenderFlowThread.cpp

    r155211 r156451  
    237237    // containers, but just adjusting the position of the RenderLayerBacking.
    238238    if (!m_needsTwoPhasesLayout) {
    239         updateLayerToRegionMappings();
    240         // FIXME: If we have layers that moved from one region to another, we should trigger
     239        // If we have layers that moved from one region to another, we trigger
    241240        // a composited layers rebuild in here to make sure that the regions will collect the right layers.
     241        if (isOutOfFlowRenderFlowThread() && updateAllLayerToRegionMappings())
     242            layer()->compositor().setCompositingLayersNeedRebuild();
    242243    }
    243244#endif
     
    251252
    252253#if USE(ACCELERATED_COMPOSITING)
     254bool RenderFlowThread::hasCompositingRegionDescendant() const
     255{
     256    for (RenderRegionList::const_iterator iter = m_regionList.begin(); iter != m_regionList.end(); ++iter) {
     257        RenderRegion* region = *iter;
     258        if (region->hasLayer() && region->layer()->hasCompositingDescendant())
     259            return true;
     260    }
     261    return false;
     262}
     263
     264const RenderLayerList* RenderFlowThread::getLayerListForRegion(RenderRegion* region) const
     265{
     266    if (!m_regionToLayerListMap)
     267        return 0;
     268    ASSERT(!m_layersToRegionMappingsDirty);
     269    RegionToLayerListMap::const_iterator iterator = m_regionToLayerListMap->find(region);
     270    return iterator == m_regionToLayerListMap->end() ? 0 : &iterator->value;
     271}
     272
     273// FIXME: make it const when it won't be calling regionAtBlockOffset.
    253274RenderRegion* RenderFlowThread::regionForCompositedLayer(RenderLayer* childLayer)
    254275{
    255     LayoutPoint leftTopLocation = childLayer->renderBox() ? childLayer->renderBox()->flipForWritingMode(LayoutPoint()) : LayoutPoint();
    256     LayoutPoint flowThreadOffset = flooredLayoutPoint(childLayer->renderer().localToContainerPoint(leftTopLocation, this, ApplyContainerFlip));
     276    if (childLayer->renderBox()) {
     277        RenderRegion* startRegion = 0;
     278        RenderRegion* endRegion = 0;
     279        getRegionRangeForBox(childLayer->renderBox(), startRegion, endRegion);
     280        // The video tag is such a box that doesn't have a region range because it's inline (by default).
     281        if (startRegion)
     282            return startRegion;
     283    }
     284
     285    // FIXME: remove this when we'll have region ranges for inlines as well.
     286    LayoutPoint flowThreadOffset = flooredLayoutPoint(childLayer->renderer().localToContainerPoint(LayoutPoint(), this, ApplyContainerFlip));
    257287    return regionAtBlockOffset(0, flipForWritingMode(isHorizontalWritingMode() ? flowThreadOffset.y() : flowThreadOffset.x()), true, DisallowRegionAutoGeneration);
    258288}
    259289
    260 void RenderFlowThread::updateRegionForRenderLayer(RenderLayer* layer, LayerToRegionMap& layerToRegionMap, RegionToLayerListMap& regionToLayerListMap, bool& needsLayerUpdate)
     290RenderRegion* RenderFlowThread::cachedRegionForCompositedLayer(RenderLayer* childLayer) const
     291{
     292    if (!m_layerToRegionMap)
     293        return 0;
     294    ASSERT(!m_layersToRegionMappingsDirty);
     295    return m_layerToRegionMap->get(childLayer);
     296}
     297
     298// FIXME: Make it const when regionForCompositedLayer will be const.
     299void RenderFlowThread::updateLayerToRegionMappings(RenderLayer* layer, LayerToRegionMap& layerToRegionMap, RegionToLayerListMap& regionToLayerListMap, bool& needsLayerUpdate)
    261300{
    262301    RenderRegion* region = regionForCompositedLayer(layer);
    263302    if (!needsLayerUpdate) {
    264         ASSERT(m_layerToRegionMap);
    265303        // Figure out if we moved this layer from a region to the other.
    266         RenderRegion* previousRegion = m_layerToRegionMap->get(layer);
     304        RenderRegion* previousRegion = cachedRegionForCompositedLayer(layer);
    267305        if (previousRegion != region)
    268306            needsLayerUpdate = true;
    269307    }
     308
    270309    if (!region)
    271310        return;
     311
    272312    layerToRegionMap.set(layer, region);
     313
    273314    RegionToLayerListMap::iterator iterator = regionToLayerListMap.find(region);
    274315    RenderLayerList& list = iterator == regionToLayerListMap.end() ? regionToLayerListMap.set(region, RenderLayerList()).iterator->value : iterator->value;
     316    ASSERT(!list.contains(layer));
    275317    list.append(layer);
    276318}
    277319
    278 bool RenderFlowThread::updateLayerToRegionMappings()
     320bool RenderFlowThread::updateAllLayerToRegionMappings()
    279321{
    280322    // We only need to map layers to regions for named flow threads.
     
    289331
    290332    // If the RenderFlowThread had a z-index layer update, then we need to update the composited layers too.
    291     bool needsLayerUpdate = m_layersToRegionMappingsDirty || !m_layerToRegionMap.get();
     333    bool needsLayerUpdate = layer()->isDirtyRenderFlowThread() || m_layersToRegionMappingsDirty || !m_layerToRegionMap.get();
    292334    layer()->updateLayerListsIfNeeded();
    293335
     
    295337    RegionToLayerListMap regionToLayerListMap;
    296338
    297     if (Vector<RenderLayer*>* negZOrderList = layer()->negZOrderList()) {
    298         size_t listSize = negZOrderList->size();
    299         for (size_t i = 0; i < listSize; ++i)
    300             updateRegionForRenderLayer(negZOrderList->at(i), layerToRegionMap, regionToLayerListMap, needsLayerUpdate);
    301     }
    302 
    303     if (Vector<RenderLayer*>* normalFlowList = layer()->normalFlowList()) {
    304         size_t listSize = normalFlowList->size();
    305         for (size_t i = 0; i < listSize; ++i)
    306             updateRegionForRenderLayer(normalFlowList->at(i), layerToRegionMap, regionToLayerListMap, needsLayerUpdate);
    307     }
    308    
    309     if (Vector<RenderLayer*>* posZOrderList = layer()->posZOrderList()) {
    310         size_t listSize = posZOrderList->size();
    311         for (size_t i = 0; i < listSize; ++i)
    312             updateRegionForRenderLayer(posZOrderList->at(i), layerToRegionMap, regionToLayerListMap, needsLayerUpdate);
    313     }
     339    RenderLayerList* lists[] = { layer()->negZOrderList(), layer()->normalFlowList(), layer()->posZOrderList()};
     340    for (size_t listIndex = 0; listIndex < sizeof(lists) / sizeof(lists[0]); ++listIndex)
     341        if (RenderLayerList* list = lists[listIndex])
     342            for (size_t i = 0, listSize = list->size(); i < listSize; ++i)
     343                updateLayerToRegionMappings(list->at(i), layerToRegionMap, regionToLayerListMap, needsLayerUpdate);
    314344
    315345    if (needsLayerUpdate) {
     
    318348        m_layerToRegionMap->swap(layerToRegionMap);
    319349
     350        if (!m_regionToLayerListMap)
     351            m_regionToLayerListMap = adoptPtr(new RegionToLayerListMap());
     352        m_regionToLayerListMap->swap(regionToLayerListMap);
     353
    320354        for (RenderRegionList::iterator iter = m_regionList.begin(); iter != m_regionList.end(); ++iter) {
    321355            RenderRegion* region = *iter;
    322             region->setRequiresLayerForCompositing(regionToLayerListMap.contains(region));
     356            region->setRequiresLayerForCompositing(m_regionToLayerListMap->contains(region));
    323357        }
    324358    }
Note: See TracChangeset for help on using the changeset viewer.