// 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 CC_SINGLE_THREAD_PROXY_H_ #define CC_SINGLE_THREAD_PROXY_H_ #include #include "base/time.h" #include "cc/animation_events.h" #include "cc/layer_tree_host_impl.h" #include "cc/proxy.h" namespace cc { class LayerTreeHost; class SingleThreadProxy : public Proxy, LayerTreeHostImplClient { public: static scoped_ptr create(LayerTreeHost*); virtual ~SingleThreadProxy(); // Proxy implementation virtual bool compositeAndReadback(void *pixels, const gfx::Rect&) OVERRIDE; virtual void startPageScaleAnimation(gfx::Vector2d targetOffset, bool useAnchor, float scale, base::TimeDelta duration) OVERRIDE; virtual void finishAllRendering() OVERRIDE; virtual bool isStarted() const OVERRIDE; virtual bool initializeOutputSurface() OVERRIDE; virtual void setSurfaceReady() OVERRIDE; virtual void setVisible(bool) OVERRIDE; virtual bool initializeRenderer() OVERRIDE; virtual bool recreateOutputSurface() OVERRIDE; virtual void renderingStats(RenderingStats*) OVERRIDE; virtual const RendererCapabilities& rendererCapabilities() const OVERRIDE; virtual void setNeedsAnimate() OVERRIDE; virtual void setNeedsCommit() OVERRIDE; virtual void setNeedsRedraw() OVERRIDE; virtual void setDeferCommits(bool) OVERRIDE; virtual bool commitRequested() const OVERRIDE; virtual void mainThreadHasStoppedFlinging() OVERRIDE { } virtual void start() OVERRIDE; virtual void stop() OVERRIDE; virtual size_t maxPartialTextureUpdates() const OVERRIDE; virtual void acquireLayerTextures() OVERRIDE { } virtual void forceSerializeOnSwapBuffers() OVERRIDE; virtual bool commitPendingForTesting() OVERRIDE; virtual skia::RefPtr capturePicture() OVERRIDE; // LayerTreeHostImplClient implementation virtual void didLoseOutputSurfaceOnImplThread() OVERRIDE; virtual void onSwapBuffersCompleteOnImplThread() OVERRIDE; virtual void onVSyncParametersChanged(base::TimeTicks timebase, base::TimeDelta interval) OVERRIDE { } virtual void onCanDrawStateChanged(bool canDraw) OVERRIDE { } virtual void onHasPendingTreeStateChanged(bool havePendingTree) OVERRIDE; virtual void setNeedsRedrawOnImplThread() OVERRIDE; virtual void didUploadVisibleHighResolutionTileOnImplThread() OVERRIDE; virtual void setNeedsCommitOnImplThread() OVERRIDE; virtual void setNeedsManageTilesOnImplThread() OVERRIDE; virtual void postAnimationEventsToMainThreadOnImplThread(scoped_ptr, base::Time wallClockTime) OVERRIDE; virtual bool reduceContentsTextureMemoryOnImplThread(size_t limitBytes, int priorityCutoff) OVERRIDE; virtual void reduceWastedContentsTextureMemoryOnImplThread() OVERRIDE; virtual void sendManagedMemoryStats() OVERRIDE; virtual bool isInsideDraw() OVERRIDE; virtual void renewTreePriority() OVERRIDE { } // Called by the legacy path where RenderWidget does the scheduling. void compositeImmediately(); private: explicit SingleThreadProxy(LayerTreeHost*); bool commitAndComposite(); void doCommit(scoped_ptr); bool doComposite(); void didSwapFrame(); // Accessed on main thread only. LayerTreeHost* m_layerTreeHost; bool m_outputSurfaceLost; // Holds on to the context between initializeContext() and initializeRenderer() calls. Shouldn't // be used for anything else. scoped_ptr m_outputSurfaceBeforeInitialization; // Used on the Thread, but checked on main thread during initialization/shutdown. scoped_ptr m_layerTreeHostImpl; bool m_rendererInitialized; RendererCapabilities m_RendererCapabilitiesForMainThread; bool m_nextFrameIsNewlyCommittedFrame; bool m_insideDraw; base::TimeDelta m_totalCommitTime; size_t m_totalCommitCount; }; // For use in the single-threaded case. In debug builds, it pretends that the // code is running on the impl thread to satisfy assertion checks. class DebugScopedSetImplThread { public: explicit DebugScopedSetImplThread(Proxy* proxy) : m_proxy(proxy) { #ifndef NDEBUG m_previousValue = m_proxy->m_implThreadIsOverridden; m_proxy->setCurrentThreadIsImplThread(true); #endif } ~DebugScopedSetImplThread() { #ifndef NDEBUG m_proxy->setCurrentThreadIsImplThread(m_previousValue); #endif } private: bool m_previousValue; Proxy* m_proxy; }; // For use in the single-threaded case. In debug builds, it pretends that the // code is running on the main thread to satisfy assertion checks. class DebugScopedSetMainThread { public: explicit DebugScopedSetMainThread(Proxy* proxy) : m_proxy(proxy) { #ifndef NDEBUG m_previousValue = m_proxy->m_implThreadIsOverridden; m_proxy->setCurrentThreadIsImplThread(false); #endif } ~DebugScopedSetMainThread() { #ifndef NDEBUG m_proxy->setCurrentThreadIsImplThread(m_previousValue); #endif } private: bool m_previousValue; Proxy* m_proxy; }; // For use in the single-threaded case. In debug builds, it pretends that the // code is running on the impl thread and that the main thread is blocked to // satisfy assertion checks class DebugScopedSetImplThreadAndMainThreadBlocked { public: explicit DebugScopedSetImplThreadAndMainThreadBlocked(Proxy* proxy) : m_implThread(proxy) , m_mainThreadBlocked(proxy) { } private: DebugScopedSetImplThread m_implThread; DebugScopedSetMainThreadBlocked m_mainThreadBlocked; }; } // namespace cc #endif // CC_SINGLE_THREAD_PROXY_H_