Index: cc/layer_tree_host.h |
diff --git a/cc/layer_tree_host.h b/cc/layer_tree_host.h |
index 638cbb270ce9b24689d5095baf174ade4f4d1a13..277b1f06352ce6734a05d26a20d5bfa16c3eb8ac 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 |