void CoordinatedDrawingArea::setRootCompositingLayer(GraphicsLayer* graphicsLayer) { // FIXME: Instead of using nested if statements, we should keep a compositing state // enum in the CoordinatedDrawingArea object and have a changeAcceleratedCompositingState function // that takes the new state. if (graphicsLayer) { if (!m_layerTreeHost) { // We're actually entering accelerated compositing mode. enterAcceleratedCompositingMode(graphicsLayer); } else { // We're already in accelerated compositing mode, but the root compositing layer changed. m_exitCompositingTimer.stop(); m_wantsToExitAcceleratedCompositingMode = false; // If we haven't sent the EnterAcceleratedCompositingMode message, make sure that the // layer tree host calls us back after the next layer flush so we can send it then. if (!m_compositingAccordingToProxyMessages) m_layerTreeHost->setShouldNotifyAfterNextScheduledLayerFlush(true); m_layerTreeHost->setRootCompositingLayer(graphicsLayer); } } else { if (m_layerTreeHost) m_layerTreeHost->setRootCompositingLayer(0); } }
DrawingAreaImpl::DrawingAreaImpl(WebPage* webPage, const WebPageCreationParameters& parameters) : DrawingArea(DrawingAreaTypeImpl, webPage) , m_backingStoreStateID(0) , m_isPaintingEnabled(true) , m_inUpdateBackingStoreState(false) , m_shouldSendDidUpdateBackingStoreState(false) , m_isWaitingForDidUpdate(false) , m_compositingAccordingToProxyMessages(false) , m_layerTreeStateIsFrozen(false) , m_wantsToExitAcceleratedCompositingMode(false) , m_isPaintingSuspended(!parameters.isVisible) , m_alwaysUseCompositing(false) , m_displayTimer(RunLoop::main(), this, &DrawingAreaImpl::displayTimerFired) , m_exitCompositingTimer(RunLoop::main(), this, &DrawingAreaImpl::exitAcceleratedCompositingMode) { if (webPage->corePage()->settings()->acceleratedDrawingEnabled() || webPage->corePage()->settings()->forceCompositingMode()) m_alwaysUseCompositing = true; #if USE(COORDINATED_GRAPHICS) m_alwaysUseCompositing = true; #endif if (m_alwaysUseCompositing) enterAcceleratedCompositingMode(0); }
void DrawingAreaProxyImpl::didUpdateBackingStoreState(uint64_t backingStoreStateID, const UpdateInfo& updateInfo, const LayerTreeContext& layerTreeContext) { ASSERT_ARG(backingStoreStateID, backingStoreStateID <= m_nextBackingStoreStateID); ASSERT_ARG(backingStoreStateID, backingStoreStateID > m_currentBackingStoreStateID); m_currentBackingStoreStateID = backingStoreStateID; m_isWaitingForDidUpdateBackingStoreState = false; if (m_nextBackingStoreStateID != m_currentBackingStoreStateID) sendUpdateBackingStoreState(RespondImmediately); #if USE(ACCELERATED_COMPOSITING) if (layerTreeContext != m_layerTreeContext) { if (!m_layerTreeContext.isEmpty()) { exitAcceleratedCompositingMode(); ASSERT(m_layerTreeContext.isEmpty()); } if (!layerTreeContext.isEmpty()) { enterAcceleratedCompositingMode(layerTreeContext); ASSERT(layerTreeContext == m_layerTreeContext); } } if (isInAcceleratedCompositingMode()) { ASSERT(!m_backingStore); return; } #endif // FIXME: We could just reuse our existing backing store if it's the same size as // updateInfo.viewSize. m_backingStore = nullptr; incorporateUpdate(updateInfo); }
void DrawingAreaProxyImpl::enterAcceleratedCompositingMode(uint64_t backingStoreStateID, const LayerTreeContext& layerTreeContext) { ASSERT_ARG(backingStoreStateID, backingStoreStateID <= m_currentBackingStoreStateID); if (backingStoreStateID < m_currentBackingStoreStateID) return; enterAcceleratedCompositingMode(layerTreeContext); }
void DrawingAreaProxyImpl::enterAcceleratedCompositingMode(uint64_t backingStoreStateID, const LayerTreeContext& layerTreeContext) { ASSERT_ARG(backingStoreStateID, backingStoreStateID <= m_currentBackingStoreStateID); if (backingStoreStateID < m_currentBackingStoreStateID) return; #if USE(ACCELERATED_COMPOSITING) enterAcceleratedCompositingMode(layerTreeContext); #endif }
void DrawingAreaImpl::pageCustomRepresentationChanged() { if (!m_alwaysUseCompositing) return; if (m_webPage->mainFrameHasCustomRepresentation()) { if (m_layerTreeHost) exitAcceleratedCompositingMode(); } else if (!m_layerTreeHost) enterAcceleratedCompositingMode(0); }
CoordinatedDrawingArea::CoordinatedDrawingArea(WebPage* webPage, const WebPageCreationParameters& parameters) : DrawingArea(DrawingAreaTypeCoordinated, webPage) , m_backingStoreStateID(0) , m_isPaintingEnabled(true) , m_inUpdateBackingStoreState(false) , m_shouldSendDidUpdateBackingStoreState(false) , m_isWaitingForDidUpdate(false) , m_compositingAccordingToProxyMessages(false) , m_layerTreeStateIsFrozen(false) , m_wantsToExitAcceleratedCompositingMode(false) , m_isPaintingSuspended(!(parameters.viewState & ViewState::IsVisible)) , m_displayTimer(RunLoop::main(), this, &CoordinatedDrawingArea::displayTimerFired) , m_exitCompositingTimer(RunLoop::main(), this, &CoordinatedDrawingArea::exitAcceleratedCompositingMode) { // Always use compositing in CoordinatedGraphics enterAcceleratedCompositingMode(0); }
void DrawingAreaProxyImpl::didUpdateBackingStoreState(uint64_t backingStoreStateID, const UpdateInfo& updateInfo, const LayerTreeContext& layerTreeContext) { ASSERT_ARG(backingStoreStateID, backingStoreStateID <= m_nextBackingStoreStateID); ASSERT_ARG(backingStoreStateID, backingStoreStateID > m_currentBackingStoreStateID); m_currentBackingStoreStateID = backingStoreStateID; m_isWaitingForDidUpdateBackingStoreState = false; // Stop the responsiveness timer that was started in sendUpdateBackingStoreState. m_webPageProxy->process()->responsivenessTimer()->stop(); #if USE(ACCELERATED_COMPOSITING) if (layerTreeContext != m_layerTreeContext) { if (!m_layerTreeContext.isEmpty()) { exitAcceleratedCompositingMode(); ASSERT(m_layerTreeContext.isEmpty()); } if (!layerTreeContext.isEmpty()) { enterAcceleratedCompositingMode(layerTreeContext); ASSERT(layerTreeContext == m_layerTreeContext); } } #endif if (m_nextBackingStoreStateID != m_currentBackingStoreStateID) sendUpdateBackingStoreState(RespondImmediately); else m_hasReceivedFirstUpdate = true; #if USE(ACCELERATED_COMPOSITING) if (isInAcceleratedCompositingMode()) { ASSERT(!m_backingStore); return; } #else UNUSED_PARAM(layerTreeContext); #endif // If we have a backing store the right size, reuse it. if (m_backingStore && (m_backingStore->size() != updateInfo.viewSize || m_backingStore->deviceScaleFactor() != updateInfo.deviceScaleFactor)) m_backingStore = nullptr; incorporateUpdate(updateInfo); }
void DrawingAreaImpl::setRootCompositingLayer(GraphicsLayer* graphicsLayer) { // FIXME: Instead of using nested if statements, we should keep a compositing state // enum in the DrawingAreaImpl object and have a changeAcceleratedCompositingState function // that takes the new state. if (graphicsLayer) { if (!m_layerTreeHost) { // We're actually entering accelerated compositing mode. enterAcceleratedCompositingMode(graphicsLayer); } else { // We're already in accelerated compositing mode, but the root compositing layer changed. m_exitCompositingTimer.stop(); m_wantsToExitAcceleratedCompositingMode = false; // If we haven't sent the EnterAcceleratedCompositingMode message, make sure that the // layer tree host calls us back after the next layer flush so we can send it then. if (!m_compositingAccordingToProxyMessages) m_layerTreeHost->setShouldNotifyAfterNextScheduledLayerFlush(true); m_layerTreeHost->setRootCompositingLayer(graphicsLayer); } } else { if (m_layerTreeHost) { m_layerTreeHost->setRootCompositingLayer(0); if (!m_alwaysUseCompositing) { // We'll exit accelerated compositing mode on a timer, to avoid re-entering // compositing code via display() and layout. // If we're leaving compositing mode because of a setSize, it is safe to // exit accelerated compositing mode right away. if (m_inUpdateBackingStoreState) exitAcceleratedCompositingMode(); else exitAcceleratedCompositingModeSoon(); } } } }
DrawingAreaImpl::DrawingAreaImpl(WebPage* webPage, const WebPageCreationParameters& parameters) : DrawingArea(DrawingAreaTypeImpl, webPage) , m_backingStoreStateID(0) , m_isPaintingEnabled(true) , m_inUpdateBackingStoreState(false) , m_shouldSendDidUpdateBackingStoreState(false) , m_isWaitingForDidUpdate(false) , m_compositingAccordingToProxyMessages(false) , m_layerTreeStateIsFrozen(false) , m_wantsToExitAcceleratedCompositingMode(false) , m_isPaintingSuspended(!parameters.isVisible) , m_alwaysUseCompositing(false) , m_shouldThrottleDisplay(true) , m_lastDisplayTime(0) , m_displayTimer(WebProcess::shared().runLoop(), this, &DrawingAreaImpl::displayTimerFired) , m_exitCompositingTimer(WebProcess::shared().runLoop(), this, &DrawingAreaImpl::exitAcceleratedCompositingMode) { if (webPage->corePage()->settings()->acceleratedDrawingEnabled()) m_alwaysUseCompositing = true; if (m_alwaysUseCompositing) enterAcceleratedCompositingMode(0); }
DrawingAreaWPE::DrawingAreaWPE(WebPage& webPage, const WebPageCreationParameters&) : DrawingArea(DrawingAreaTypeWPE, webPage) { webPage.corePage()->settings().setForceCompositingMode(true); enterAcceleratedCompositingMode(0); }