1d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)/* 2d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * Copyright (C) 2009, 2010 Apple Inc. All rights reserved. 3d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * Copyright (C) 2014 Google Inc. All rights reserved. 4d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * 5d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 6d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * modification, are permitted provided that the following conditions 7d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * are met: 8d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 9d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 10d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 11d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 12d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * documentation and/or other materials provided with the distribution. 13d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * 14d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 15d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 17d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 18d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 19d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 20d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 21d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 22d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 24d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) */ 26d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 27d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "config.h" 28d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/rendering/compositing/GraphicsLayerUpdater.h" 29d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 30d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/HTMLMediaElement.h" 317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/inspector/InspectorTraceEvents.h" 32d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/rendering/RenderLayer.h" 33d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/rendering/RenderLayerReflectionInfo.h" 34d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/rendering/RenderPart.h" 35d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/rendering/compositing/CompositedLayerMapping.h" 36d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/rendering/compositing/RenderLayerCompositor.h" 37197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "platform/TraceEvent.h" 38d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 39c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 40d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 41197021e6b966cfb06891637935ef33fff06433d1Ben Murdochclass GraphicsLayerUpdater::UpdateContext { 42197021e6b966cfb06891637935ef33fff06433d1Ben Murdochpublic: 43197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch UpdateContext() 44197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch : m_compositingStackingContext(0) 45197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch , m_compositingAncestor(0) 46197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch { 4710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch } 4810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 49197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch UpdateContext(const UpdateContext& other, const RenderLayer& layer) 50197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch : m_compositingStackingContext(other.m_compositingStackingContext) 51197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch , m_compositingAncestor(other.compositingContainer(layer)) 52197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch { 53197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch CompositingState compositingState = layer.compositingState(); 54197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (compositingState != NotComposited && compositingState != PaintsIntoGroupedBacking) { 55197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch m_compositingAncestor = &layer; 56197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (layer.stackingNode()->isStackingContext()) 57197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch m_compositingStackingContext = &layer; 58197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } 59197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } 60197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 61197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch const RenderLayer* compositingContainer(const RenderLayer& layer) const 62197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch { 63197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return layer.stackingNode()->isNormalFlowOnly() ? m_compositingAncestor : m_compositingStackingContext; 64197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } 65197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 66c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) const RenderLayer* compositingStackingContext() const 67c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) { 68c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return m_compositingStackingContext; 69c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 70c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 71197021e6b966cfb06891637935ef33fff06433d1Ben Murdochprivate: 72197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch const RenderLayer* m_compositingStackingContext; 73197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch const RenderLayer* m_compositingAncestor; 74197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}; 7510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 7607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochGraphicsLayerUpdater::GraphicsLayerUpdater() 77a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch : m_needsRebuildTree(false) 78d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 79d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 80d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 81d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)GraphicsLayerUpdater::~GraphicsLayerUpdater() 82d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 83d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 84d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 85197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid GraphicsLayerUpdater::update(RenderLayer& layer, Vector<RenderLayer*>& layersNeedingPaintInvalidation) 86197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{ 87e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) TRACE_EVENT0("blink", "GraphicsLayerUpdater::update"); 88197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch updateRecursive(layer, DoNotForceUpdate, UpdateContext(), layersNeedingPaintInvalidation); 89197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch layer.compositor()->updateRootLayerPosition(); 90197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch} 91197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 92197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid GraphicsLayerUpdater::updateRecursive(RenderLayer& layer, UpdateType updateType, const UpdateContext& context, Vector<RenderLayer*>& layersNeedingPaintInvalidation) 93d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 9407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (layer.hasCompositedLayerMapping()) { 95e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) CompositedLayerMapping* mapping = layer.compositedLayerMapping(); 96d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 97197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (updateType == ForceUpdate || mapping->needsGraphicsLayerUpdate()) { 98197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch const RenderLayer* compositingContainer = context.compositingContainer(layer); 99197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch ASSERT(compositingContainer == layer.enclosingLayerWithCompositedLayerMapping(ExcludeSelf)); 10010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 101197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (mapping->updateRequiresOwnBackingStoreForAncestorReasons(compositingContainer)) { 1027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci TRACE_LAYER_INVALIDATION(&layer, InspectorLayerInvalidationTrackingEvent::AncestorRequiresNewLayer); 103197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch layersNeedingPaintInvalidation.append(&layer); 104197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch updateType = ForceUpdate; 105197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } 106d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 107197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (mapping->updateGraphicsLayerConfiguration()) 108197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch m_needsRebuildTree = true; 109d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 110c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) mapping->updateGraphicsLayerGeometry(compositingContainer, context.compositingStackingContext(), layersNeedingPaintInvalidation); 111d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 112197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (mapping->hasUnpositionedOverflowControlsLayers()) 113197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch layer.scrollableArea()->positionOverflowControls(IntSize()); 114d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 115197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch updateType = mapping->updateTypeForChildren(updateType); 116197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch mapping->clearNeedsGraphicsLayerUpdate(); 117197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } 118d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 119d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 12010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch UpdateContext childContext(context, layer); 12107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch for (RenderLayer* child = layer.firstChild(); child; child = child->nextSibling()) 122197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch updateRecursive(*child, updateType, childContext, layersNeedingPaintInvalidation); 12307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch} 124d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 125197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if ENABLE(ASSERT) 126d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 12707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochvoid GraphicsLayerUpdater::assertNeedsToUpdateGraphicsLayerBitsCleared(RenderLayer& layer) 12807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{ 12907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (layer.hasCompositedLayerMapping()) 13007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch layer.compositedLayerMapping()->assertNeedsToUpdateGraphicsLayerBitsCleared(); 131d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 13207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch for (RenderLayer* child = layer.firstChild(); child; child = child->nextSibling()) 13307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch assertNeedsToUpdateGraphicsLayerBitsCleared(*child); 134d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 135d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 13607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch#endif 13707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 138c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 139