// 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 CCThreadProxy_h #define CCThreadProxy_h #include "base/time.h" #include "cc/animation_events.h" #include "cc/completion_event.h" #include "cc/layer_tree_host_impl.h" #include "cc/proxy.h" #include "cc/resource_update_controller.h" #include "cc/scheduler.h" namespace cc { class InputHandler; class LayerTreeHost; class ResourceUpdateQueue; class Scheduler; class ScopedThreadProxy; class Thread; class ThreadProxyContextRecreationTimer; class ThreadProxy : public Proxy, LayerTreeHostImplClient, SchedulerClient, ResourceUpdateControllerClient { public: static scoped_ptr create(LayerTreeHost*); virtual ~ThreadProxy(); // Proxy implementation virtual bool compositeAndReadback(void *pixels, const IntRect&) OVERRIDE; virtual void startPageScaleAnimation(const IntSize& targetPosition, bool useAnchor, float scale, base::TimeDelta duration) OVERRIDE; virtual void finishAllRendering() OVERRIDE; virtual bool isStarted() const OVERRIDE; virtual bool initializeContext() OVERRIDE; virtual void setSurfaceReady() OVERRIDE; virtual void setVisible(bool) OVERRIDE; virtual bool initializeRenderer() OVERRIDE; virtual bool recreateContext() OVERRIDE; virtual void renderingStats(RenderingStats*) OVERRIDE; virtual const RendererCapabilities& rendererCapabilities() const OVERRIDE; virtual void loseContext() 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 didAddAnimation() OVERRIDE { } virtual void start() OVERRIDE; virtual void stop() OVERRIDE; virtual size_t maxPartialTextureUpdates() const OVERRIDE; virtual void acquireLayerTextures() OVERRIDE; virtual void forceSerializeOnSwapBuffers() OVERRIDE; // LayerTreeHostImplClient implementation virtual void didLoseContextOnImplThread() OVERRIDE; virtual void onSwapBuffersCompleteOnImplThread() OVERRIDE; virtual void onVSyncParametersChanged(base::TimeTicks timebase, base::TimeDelta interval) OVERRIDE; virtual void onCanDrawStateChanged(bool canDraw) OVERRIDE; virtual void setNeedsRedrawOnImplThread() OVERRIDE; virtual void setNeedsCommitOnImplThread() OVERRIDE; virtual void postAnimationEventsToMainThreadOnImplThread(scoped_ptr, base::Time wallClockTime) OVERRIDE; virtual bool reduceContentsTextureMemoryOnImplThread(size_t limitBytes, int priorityCutoff) OVERRIDE; virtual void sendManagedMemoryStats() OVERRIDE; // SchedulerClient implementation virtual void scheduledActionBeginFrame() OVERRIDE; virtual ScheduledActionDrawAndSwapResult scheduledActionDrawAndSwapIfPossible() OVERRIDE; virtual ScheduledActionDrawAndSwapResult scheduledActionDrawAndSwapForced() OVERRIDE; virtual void scheduledActionCommit() OVERRIDE; virtual void scheduledActionBeginContextRecreation() OVERRIDE; virtual void scheduledActionAcquireLayerTexturesForMainThread() OVERRIDE; virtual void didAnticipatedDrawTimeChange(base::TimeTicks) OVERRIDE; // ResourceUpdateControllerClient implementation virtual void readyToFinalizeTextureUpdates() OVERRIDE; private: explicit ThreadProxy(LayerTreeHost*); friend class ThreadProxyContextRecreationTimer; // Set on impl thread, read on main thread. struct BeginFrameAndCommitState { BeginFrameAndCommitState(); ~BeginFrameAndCommitState(); base::TimeTicks monotonicFrameBeginTime; scoped_ptr scrollInfo; WebKit::WebTransformationMatrix implTransform; PrioritizedTextureManager::BackingList evictedContentsTexturesBackings; size_t memoryAllocationLimitBytes; }; scoped_ptr m_pendingBeginFrameRequest; // Called on main thread void beginFrame(); void didCommitAndDrawFrame(); void didCompleteSwapBuffers(); void setAnimationEvents(AnimationEventsVector*, base::Time wallClockTime); void beginContextRecreation(); void tryToRecreateContext(); // Called on impl thread struct ReadbackRequest { CompletionEvent completion; bool success; void* pixels; IntRect rect; }; void forceBeginFrameOnImplThread(CompletionEvent*); void beginFrameCompleteOnImplThread(CompletionEvent*, ResourceUpdateQueue*); void beginFrameAbortedOnImplThread(); void requestReadbackOnImplThread(ReadbackRequest*); void requestStartPageScaleAnimationOnImplThread(IntSize targetPosition, bool useAnchor, float scale, base::TimeDelta duration); void finishAllRenderingOnImplThread(CompletionEvent*); void initializeImplOnImplThread(CompletionEvent*, InputHandler*); void setSurfaceReadyOnImplThread(); void setVisibleOnImplThread(CompletionEvent*, bool); void initializeContextOnImplThread(GraphicsContext*); void initializeRendererOnImplThread(CompletionEvent*, bool* initializeSucceeded, RendererCapabilities*); void layerTreeHostClosedOnImplThread(CompletionEvent*); void setFullRootLayerDamageOnImplThread(); void acquireLayerTexturesForMainThreadOnImplThread(CompletionEvent*); void recreateContextOnImplThread(CompletionEvent*, GraphicsContext*, bool* recreateSucceeded, RendererCapabilities*); void renderingStatsOnImplThread(CompletionEvent*, RenderingStats*); ScheduledActionDrawAndSwapResult scheduledActionDrawAndSwapInternal(bool forcedDraw); void forceSerializeOnSwapBuffersOnImplThread(CompletionEvent*); void setNeedsForcedCommitOnImplThread(); // Accessed on main thread only. bool m_animateRequested; // Set only when setNeedsAnimate is called. bool m_commitRequested; // Set only when setNeedsCommit is called. bool m_commitRequestSentToImplThread; // Set by setNeedsCommit and setNeedsAnimate. bool m_forcedCommitRequested; scoped_ptr m_contextRecreationTimer; LayerTreeHost* m_layerTreeHost; bool m_rendererInitialized; RendererCapabilities m_RendererCapabilitiesMainThreadCopy; bool m_started; bool m_texturesAcquired; bool m_inCompositeAndReadback; scoped_ptr m_layerTreeHostImpl; scoped_ptr m_inputHandlerOnImplThread; scoped_ptr m_schedulerOnImplThread; RefPtr m_mainThreadProxy; // Holds on to the context we might use for compositing in between initializeContext() // and initializeRenderer() calls. scoped_ptr m_contextBeforeInitializationOnImplThread; // Set when the main thread is waiting on a scheduledActionBeginFrame to be issued. CompletionEvent* m_beginFrameCompletionEventOnImplThread; // Set when the main thread is waiting on a readback. ReadbackRequest* m_readbackRequestOnImplThread; // Set when the main thread is waiting on a commit to complete. CompletionEvent* m_commitCompletionEventOnImplThread; // Set when the main thread is waiting on layers to be drawn. CompletionEvent* m_textureAcquisitionCompletionEventOnImplThread; scoped_ptr m_currentResourceUpdateControllerOnImplThread; // Set when the next draw should post didCommitAndDrawFrame to the main thread. bool m_nextFrameIsNewlyCommittedFrameOnImplThread; bool m_renderVSyncEnabled; base::TimeDelta m_totalCommitTime; size_t m_totalCommitCount; bool m_deferCommits; bool m_deferredCommitPending; }; } #endif