diff options
Diffstat (limited to 'cc/layer_tree_host.h')
-rw-r--r-- | cc/layer_tree_host.h | 296 |
1 files changed, 295 insertions, 1 deletions
diff --git a/cc/layer_tree_host.h b/cc/layer_tree_host.h index 638cbb2..277b1f0 100644 --- a/cc/layer_tree_host.h +++ b/cc/layer_tree_host.h @@ -1,3 +1,297 @@ -// Copyright 2012 The Chromium Authors. All rights reserved. +// Copyright 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. + +#ifndef CCLayerTreeHost_h +#define CCLayerTreeHost_h + +#include "base/basictypes.h" +#include "base/hash_tables.h" +#include "base/memory/ref_counted.h" +#include "base/memory/scoped_ptr.h" +#include "CCAnimationEvents.h" +#include "CCGraphicsContext.h" +#include "CCLayerTreeHostClient.h" +#include "CCLayerTreeHostCommon.h" +#include "CCOcclusionTracker.h" +#include "CCPrioritizedTextureManager.h" +#include "CCProxy.h" +#include "CCRenderingStats.h" +#include "IntRect.h" +#include "RateLimiter.h" +#include "scoped_ptr_vector.h" +#include "SkColor.h" +#include <limits> + +#if defined(COMPILER_GCC) +namespace BASE_HASH_NAMESPACE { +template<> +struct hash<WebKit::WebGraphicsContext3D*> { + size_t operator()(WebKit::WebGraphicsContext3D* ptr) const { + return hash<size_t>()(reinterpret_cast<size_t>(ptr)); + } +}; +} // namespace BASE_HASH_NAMESPACE +#endif // COMPILER + +namespace cc { + +class CCFontAtlas; +class CCLayerChromium; +class CCLayerTreeHostImpl; +class CCLayerTreeHostImplClient; +class CCPrioritizedTextureManager; +class CCTextureUpdateQueue; +class HeadsUpDisplayLayerChromium; +class Region; +struct CCScrollAndScaleSet; + +struct CCLayerTreeSettings { + CCLayerTreeSettings(); + ~CCLayerTreeSettings(); + + bool acceleratePainting; + bool showFPSCounter; + bool showPlatformLayerTree; + bool showPaintRects; + bool showPropertyChangedRects; + bool showSurfaceDamageRects; + bool showScreenSpaceRects; + bool showReplicaScreenSpaceRects; + bool showOccludingRects; + bool renderVSyncEnabled; + double refreshRate; + size_t maxPartialTextureUpdates; + IntSize defaultTileSize; + IntSize maxUntiledLayerSize; + IntSize minimumOcclusionTrackingSize; + + bool showDebugInfo() const { return showPlatformLayerTree || showFPSCounter || showDebugRects(); } + bool showDebugRects() const { return showPaintRects || showPropertyChangedRects || showSurfaceDamageRects || showScreenSpaceRects || showReplicaScreenSpaceRects || showOccludingRects; } +}; + +// Provides information on an Impl's rendering capabilities back to the CCLayerTreeHost +struct RendererCapabilities { + RendererCapabilities(); + ~RendererCapabilities(); + + GC3Denum bestTextureFormat; + bool contextHasCachedFrontBuffer; + bool usingPartialSwap; + bool usingAcceleratedPainting; + bool usingSetVisibility; + bool usingSwapCompleteCallback; + bool usingGpuMemoryManager; + bool usingDiscardFramebuffer; + bool usingEglImage; + int maxTextureSize; +}; + +class CCLayerTreeHost : public RateLimiterClient { +public: + static scoped_ptr<CCLayerTreeHost> create(CCLayerTreeHostClient*, const CCLayerTreeSettings&); + virtual ~CCLayerTreeHost(); + + void setSurfaceReady(); + + // Returns true if any CCLayerTreeHost is alive. + static bool anyLayerTreeHostInstanceExists(); + + static bool needsFilterContext() { return s_needsFilterContext; } + static void setNeedsFilterContext(bool needsFilterContext) { s_needsFilterContext = needsFilterContext; } + bool needsSharedContext() const { return needsFilterContext() || settings().acceleratePainting; } + + // CCLayerTreeHost interface to CCProxy. + void willBeginFrame() { m_client->willBeginFrame(); } + void didBeginFrame() { m_client->didBeginFrame(); } + void updateAnimations(double monotonicFrameBeginTime); + void layout(); + void beginCommitOnImplThread(CCLayerTreeHostImpl*); + void finishCommitOnImplThread(CCLayerTreeHostImpl*); + void willCommit(); + void commitComplete(); + scoped_ptr<CCGraphicsContext> createContext(); + scoped_ptr<CCInputHandler> createInputHandler(); + virtual scoped_ptr<CCLayerTreeHostImpl> createLayerTreeHostImpl(CCLayerTreeHostImplClient*); + void didLoseContext(); + enum RecreateResult { + RecreateSucceeded, + RecreateFailedButTryAgain, + RecreateFailedAndGaveUp, + }; + RecreateResult recreateContext(); + void didCommitAndDrawFrame() { m_client->didCommitAndDrawFrame(); } + void didCompleteSwapBuffers() { m_client->didCompleteSwapBuffers(); } + void deleteContentsTexturesOnImplThread(CCResourceProvider*); + virtual void acquireLayerTextures(); + // Returns false if we should abort this frame due to initialization failure. + bool initializeRendererIfNeeded(); + void updateLayers(CCTextureUpdateQueue&, size_t contentsMemoryLimitBytes); + + CCLayerTreeHostClient* client() { return m_client; } + + // Only used when compositing on the main thread. + void composite(); + void scheduleComposite(); + + // Composites and attempts to read back the result into the provided + // buffer. If it wasn't possible, e.g. due to context lost, will return + // false. + bool compositeAndReadback(void *pixels, const IntRect&); + + void finishAllRendering(); + + int commitNumber() const { return m_commitNumber; } + + void renderingStats(CCRenderingStats*) const; + + const RendererCapabilities& rendererCapabilities() const; + + // Test only hook + void loseContext(int numTimes); + + void setNeedsAnimate(); + // virtual for testing + virtual void setNeedsCommit(); + void setNeedsRedraw(); + bool commitRequested() const; + + void setAnimationEvents(scoped_ptr<CCAnimationEventsVector>, double wallClockTime); + virtual void didAddAnimation(); + + LayerChromium* rootLayer() { return m_rootLayer.get(); } + const LayerChromium* rootLayer() const { return m_rootLayer.get(); } + void setRootLayer(scoped_refptr<LayerChromium>); + + const CCLayerTreeSettings& settings() const { return m_settings; } + + void setViewportSize(const IntSize& layoutViewportSize, const IntSize& deviceViewportSize); + + const IntSize& layoutViewportSize() const { return m_layoutViewportSize; } + const IntSize& deviceViewportSize() const { return m_deviceViewportSize; } + + void setPageScaleFactorAndLimits(float pageScaleFactor, float minPageScaleFactor, float maxPageScaleFactor); + + void setBackgroundColor(SkColor color) { m_backgroundColor = color; } + + void setHasTransparentBackground(bool transparent) { m_hasTransparentBackground = transparent; } + + CCPrioritizedTextureManager* contentsTextureManager() const; + + // Delete contents textures' backing resources until they use only bytesLimit bytes. This may + // be called on the impl thread while the main thread is running. + void reduceContentsTexturesMemoryOnImplThread(size_t bytesLimit, CCResourceProvider*); + // Returns true if there any evicted backing textures that have not been deleted. + bool evictedContentsTexturesBackingsExist() const; + // Retrieve the list of all contents textures' backings that have been evicted, to pass to the + // main thread to unlink them from their owning textures. + void getEvictedContentTexturesBackings(CCPrioritizedTextureManager::BackingVector&); + // Unlink the list of contents textures' backings from their owning textures on the main thread + // before updating layers. + void unlinkEvictedContentTexturesBackings(const CCPrioritizedTextureManager::BackingVector&); + // Deletes all evicted backings, unlinking them from their owning textures if needed. + // Returns true if this function had to unlink any backings from their owning texture when + // destroying them. If this was the case, the impl layer tree may contain invalid resources. + bool deleteEvictedContentTexturesBackings(); + + bool visible() const { return m_visible; } + void setVisible(bool); + + void startPageScaleAnimation(const IntSize& targetPosition, bool useAnchor, float scale, double durationSec); + + void applyScrollAndScale(const CCScrollAndScaleSet&); + void setImplTransform(const WebKit::WebTransformationMatrix&); + + void startRateLimiter(WebKit::WebGraphicsContext3D*); + void stopRateLimiter(WebKit::WebGraphicsContext3D*); + + // RateLimitClient implementation + virtual void rateLimit() OVERRIDE; + + bool bufferedUpdates(); + bool requestPartialTextureUpdate(); + void deleteTextureAfterCommit(scoped_ptr<CCPrioritizedTexture>); + + void setDeviceScaleFactor(float); + float deviceScaleFactor() const { return m_deviceScaleFactor; } + + void setFontAtlas(scoped_ptr<CCFontAtlas>); + + HeadsUpDisplayLayerChromium* hudLayer() const { return m_hudLayer.get(); } + +protected: + CCLayerTreeHost(CCLayerTreeHostClient*, const CCLayerTreeSettings&); + bool initialize(); + +private: + typedef std::vector<scoped_refptr<LayerChromium> > LayerList; + + void initializeRenderer(); + + void update(LayerChromium*, CCTextureUpdateQueue&, const CCOcclusionTracker*); + bool paintLayerContents(const LayerList&, CCTextureUpdateQueue&); + bool paintMasksForRenderSurface(LayerChromium*, CCTextureUpdateQueue&); + + void updateLayers(LayerChromium*, CCTextureUpdateQueue&); + + void prioritizeTextures(const LayerList&, CCOverdrawMetrics&); + void setPrioritiesForSurfaces(size_t surfaceMemoryBytes); + void setPrioritiesForLayers(const LayerList&); + size_t calculateMemoryForRenderSurfaces(const LayerList& updateList); + + void animateLayers(double monotonicTime); + bool animateLayersRecursive(LayerChromium* current, double monotonicTime); + void setAnimationEventsRecursive(const CCAnimationEventsVector&, LayerChromium*, double wallClockTime); + + bool m_animating; + bool m_needsAnimateLayers; + + CCLayerTreeHostClient* m_client; + + int m_commitNumber; + CCRenderingStats m_renderingStats; + + scoped_ptr<CCProxy> m_proxy; + bool m_rendererInitialized; + bool m_contextLost; + int m_numTimesRecreateShouldFail; + int m_numFailedRecreateAttempts; + + scoped_refptr<LayerChromium> m_rootLayer; + scoped_refptr<HeadsUpDisplayLayerChromium> m_hudLayer; + scoped_ptr<CCFontAtlas> m_fontAtlas; + + scoped_ptr<CCPrioritizedTextureManager> m_contentsTextureManager; + scoped_ptr<CCPrioritizedTexture> m_surfaceMemoryPlaceholder; + + CCLayerTreeSettings m_settings; + + IntSize m_layoutViewportSize; + IntSize m_deviceViewportSize; + float m_deviceScaleFactor; + + bool m_visible; + + typedef base::hash_map<WebKit::WebGraphicsContext3D*, scoped_refptr<RateLimiter> > RateLimiterMap; + RateLimiterMap m_rateLimiters; + + float m_pageScaleFactor; + float m_minPageScaleFactor, m_maxPageScaleFactor; + WebKit::WebTransformationMatrix m_implTransform; + bool m_triggerIdleUpdates; + + SkColor m_backgroundColor; + bool m_hasTransparentBackground; + + typedef ScopedPtrVector<CCPrioritizedTexture> TextureList; + TextureList m_deleteTextureAfterCommitList; + size_t m_partialTextureUpdateRequests; + + static bool s_needsFilterContext; + + DISALLOW_COPY_AND_ASSIGN(CCLayerTreeHost); +}; + +} // namespace cc + +#endif |