blob: 69065c9a56f8f22756cd7a5bd51d20e97254934b [file] [log] [blame]
/*
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 <WebCore/CoordinatedGraphicsState.h>
#include <WebCore/CoordinatedSurface.h>
#include <WebCore/GraphicsContext.h>
#include <WebCore/GraphicsLayer.h>
#include <WebCore/IntRect.h>
#include <WebCore/IntSize.h>
#include <WebCore/TextureMapper.h>
#include <WebCore/TextureMapperBackingStore.h>
#include <WebCore/TextureMapperFPSCounter.h>
#include <WebCore/TextureMapperLayer.h>
#include <WebCore/Timer.h>
#include <functional>
#include <wtf/HashSet.h>
#include <wtf/Lock.h>
#include <wtf/RunLoop.h>
#include <wtf/ThreadingPrimitives.h>
#include <wtf/Vector.h>
#if USE(GRAPHICS_SURFACE)
#include <WebCore/GraphicsSurface.h>
#include <WebCore/TextureMapperSurfaceBackingStore.h>
#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<CoordinatedGraphicsScene>, public WebCore::TextureMapperLayer::ScrollingClient {
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);
void detach();
void appendUpdate(std::function<void()>);
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<WebCore::CoordinatedLayerID>&);
void deleteLayers(const Vector<WebCore::CoordinatedLayerID>&);
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&);
#if USE(GRAPHICS_SURFACE)
void createPlatformLayerIfNeeded(WebCore::TextureMapperLayer*, const WebCore::CoordinatedGraphicsLayerState&);
void syncPlatformLayerIfNeeded(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<WebCore::CoordinatedSurface>);
void removeUpdateAtlas(uint32_t atlasID);
void syncImageBackings(const WebCore::CoordinatedGraphicsState&);
void createImageBacking(WebCore::CoordinatedImageBackingID);
void updateImageBacking(WebCore::CoordinatedImageBackingID, PassRefPtr<WebCore::CoordinatedSurface>);
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()>);
void dispatchOnClientRunLoop(std::function<void()>);
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);
// Render queue can be accessed ony from main thread or updatePaintNode call stack!
Vector<std::function<void()>> m_renderQueue;
Lock m_renderQueueMutex;
std::unique_ptr<WebCore::TextureMapper> m_textureMapper;
typedef HashMap<WebCore::CoordinatedImageBackingID, RefPtr<CoordinatedBackingStore>> ImageBackingMap;
ImageBackingMap m_imageBackings;
Vector<RefPtr<CoordinatedBackingStore>> m_releasedImageBackings;
typedef HashMap<WebCore::TextureMapperLayer*, RefPtr<CoordinatedBackingStore>> BackingStoreMap;
BackingStoreMap m_backingStores;
HashSet<RefPtr<CoordinatedBackingStore>> m_backingStoresWithPendingBuffers;
#if USE(GRAPHICS_SURFACE)
typedef HashMap<WebCore::TextureMapperLayer*, RefPtr<WebCore::TextureMapperSurfaceBackingStore>> SurfaceBackingStoreMap;
SurfaceBackingStoreMap m_surfaceBackingStores;
#endif
typedef HashMap<uint32_t /* atlasID */, RefPtr<WebCore::CoordinatedSurface>> 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<WebCore::TextureMapperLayer> m_rootLayer;
typedef HashMap<WebCore::CoordinatedLayerID, std::unique_ptr<WebCore::TextureMapperLayer>> LayerMap;
LayerMap m_layers;
typedef HashMap<WebCore::CoordinatedLayerID, WebCore::TextureMapperLayer*> 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