/* Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies) Copyright (C) 2013 Company 100, Inc. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef CoordinatedGraphicsScene_h #define CoordinatedGraphicsScene_h #if USE(COORDINATED_GRAPHICS) #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if USE(GRAPHICS_SURFACE) #include #include #endif #if USE(COORDINATED_GRAPHICS_THREADED) #include #endif namespace WebKit { class CoordinatedBackingStore; class CoordinatedGraphicsSceneClient { public: virtual ~CoordinatedGraphicsSceneClient() { } virtual void purgeBackingStores() = 0; virtual void renderNextFrame() = 0; virtual void updateViewport() = 0; virtual void commitScrollOffset(uint32_t layerID, const WebCore::IntSize& offset) = 0; }; class CoordinatedGraphicsScene : public ThreadSafeRefCounted, public WebCore::TextureMapperLayer::ScrollingClient #if USE(COORDINATED_GRAPHICS_THREADED) , public WebCore::TextureMapperPlatformLayerProxy::Compositor #endif { public: explicit CoordinatedGraphicsScene(CoordinatedGraphicsSceneClient*); virtual ~CoordinatedGraphicsScene(); void paintToCurrentGLContext(const WebCore::TransformationMatrix&, float, const WebCore::FloatRect&, const WebCore::Color& backgroundColor, bool drawsBackground, const WebCore::FloatPoint&, WebCore::TextureMapper::PaintFlags = 0); void paintToGraphicsContext(PlatformGraphicsContext*, const WebCore::Color& backgroundColor, bool drawsBackground); #if PLATFORM(QT) void setScrollPosition(const WebCore::FloatPoint&); #endif void detach(); void appendUpdate(std::function); WebCore::TextureMapperLayer* findScrollableContentsLayerAt(const WebCore::FloatPoint&); virtual void commitScrollOffset(uint32_t layerID, const WebCore::IntSize& offset); // The painting thread must lock the main thread to use below two methods, because two methods access members that the main thread manages. See m_client. // Currently, QQuickWebPage::updatePaintNode() locks the main thread before calling both methods. void purgeGLResources(); bool isActive() const { return m_isActive; } void setActive(bool); void commitSceneState(const WebCore::CoordinatedGraphicsState&); void setViewBackgroundColor(const WebCore::Color& color) { m_viewBackgroundColor = color; } WebCore::Color viewBackgroundColor() const { return m_viewBackgroundColor; } private: void setRootLayerID(WebCore::CoordinatedLayerID); void createLayers(const Vector&); void deleteLayers(const Vector&); void setLayerState(WebCore::CoordinatedLayerID, const WebCore::CoordinatedGraphicsLayerState&); void setLayerChildrenIfNeeded(WebCore::TextureMapperLayer*, const WebCore::CoordinatedGraphicsLayerState&); void updateTilesIfNeeded(WebCore::TextureMapperLayer*, const WebCore::CoordinatedGraphicsLayerState&); void createTilesIfNeeded(WebCore::TextureMapperLayer*, const WebCore::CoordinatedGraphicsLayerState&); void removeTilesIfNeeded(WebCore::TextureMapperLayer*, const WebCore::CoordinatedGraphicsLayerState&); void setLayerFiltersIfNeeded(WebCore::TextureMapperLayer*, const WebCore::CoordinatedGraphicsLayerState&); void setLayerAnimationsIfNeeded(WebCore::TextureMapperLayer*, const WebCore::CoordinatedGraphicsLayerState&); void syncPlatformLayerIfNeeded(WebCore::TextureMapperLayer*, const WebCore::CoordinatedGraphicsLayerState&); #if USE(GRAPHICS_SURFACE) void createPlatformLayerIfNeeded(WebCore::TextureMapperLayer*, const WebCore::CoordinatedGraphicsLayerState&); void destroyPlatformLayerIfNeeded(WebCore::TextureMapperLayer*, const WebCore::CoordinatedGraphicsLayerState&); #endif void setLayerRepaintCountIfNeeded(WebCore::TextureMapperLayer*, const WebCore::CoordinatedGraphicsLayerState&); void syncUpdateAtlases(const WebCore::CoordinatedGraphicsState&); void createUpdateAtlas(uint32_t atlasID, PassRefPtr); void removeUpdateAtlas(uint32_t atlasID); void syncImageBackings(const WebCore::CoordinatedGraphicsState&); void createImageBacking(WebCore::CoordinatedImageBackingID); void updateImageBacking(WebCore::CoordinatedImageBackingID, PassRefPtr); void clearImageBackingContents(WebCore::CoordinatedImageBackingID); void removeImageBacking(WebCore::CoordinatedImageBackingID); WebCore::TextureMapperLayer* layerByID(WebCore::CoordinatedLayerID id) { ASSERT(m_layers.contains(id)); ASSERT(id != WebCore::InvalidCoordinatedLayerID); return m_layers.get(id); } WebCore::TextureMapperLayer* getLayerByIDIfExists(WebCore::CoordinatedLayerID); WebCore::TextureMapperLayer* rootLayer() { return m_rootLayer.get(); } void syncRemoteContent(); void adjustPositionForFixedLayers(const WebCore::FloatPoint& contentPosition); void dispatchOnMainThread(std::function); void dispatchOnClientRunLoop(std::function); void updateViewport(); void renderNextFrame(); void purgeBackingStores(); void createLayer(WebCore::CoordinatedLayerID); void deleteLayer(WebCore::CoordinatedLayerID); void assignImageBackingToLayer(WebCore::TextureMapperLayer*, WebCore::CoordinatedImageBackingID); void removeReleasedImageBackingsIfNeeded(); void ensureRootLayer(); void commitPendingBackingStoreOperations(); void prepareContentBackingStore(WebCore::TextureMapperLayer*); void createBackingStoreIfNeeded(WebCore::TextureMapperLayer*); void removeBackingStoreIfNeeded(WebCore::TextureMapperLayer*); void resetBackingStoreSizeToLayerSize(WebCore::TextureMapperLayer*); void dispatchCommitScrollOffset(uint32_t layerID, const WebCore::IntSize& offset); #if USE(COORDINATED_GRAPHICS_THREADED) virtual void onNewBufferAvailable() override; #endif // Render queue can be accessed ony from main thread or updatePaintNode call stack! Vector> m_renderQueue; Lock m_renderQueueMutex; std::unique_ptr m_textureMapper; typedef HashMap> ImageBackingMap; ImageBackingMap m_imageBackings; Vector> m_releasedImageBackings; typedef HashMap> BackingStoreMap; BackingStoreMap m_backingStores; HashSet> m_backingStoresWithPendingBuffers; #if USE(GRAPHICS_SURFACE) typedef HashMap> SurfaceBackingStoreMap; SurfaceBackingStoreMap m_surfaceBackingStores; #endif #if USE(COORDINATED_GRAPHICS_THREADED) typedef HashMap> PlatformLayerProxyMap; PlatformLayerProxyMap m_platformLayerProxies; #endif typedef HashMap> SurfaceMap; SurfaceMap m_surfaces; // Below two members are accessed by only the main thread. The painting thread must lock the main thread to access both members. CoordinatedGraphicsSceneClient* m_client; bool m_isActive; std::unique_ptr m_rootLayer; typedef HashMap> LayerMap; LayerMap m_layers; typedef HashMap LayerRawPtrMap; LayerRawPtrMap m_fixedLayers; WebCore::CoordinatedLayerID m_rootLayerID; WebCore::FloatPoint m_scrollPosition; WebCore::FloatPoint m_renderedContentsScrollPosition; WebCore::Color m_viewBackgroundColor; WebCore::TextureMapperFPSCounter m_fpsCounter; RunLoop& m_clientRunLoop; }; } // namespace WebKit #endif // USE(COORDINATED_GRAPHICS) #endif // CoordinatedGraphicsScene_h