12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2011 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CC_TREES_THREAD_PROXY_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CC_TREES_THREAD_PROXY_H_ 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <string> 97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/weak_ptr.h" 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/animation/animation_events.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/base/completion_event.h" 1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "cc/base/delayed_unique_notifier.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/resource_update_controller.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/scheduler/scheduler.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host_impl.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/proxy.h" 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "cc/trees/proxy_timing_history.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace base { 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class SingleThreadTaskRunner; 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ContextProvider; 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class InputHandlerClient; 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHost; 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ResourceUpdateQueue; 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Scheduler; 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ScopedThreadProxy; 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class CC_EXPORT ThreadProxy : public Proxy, 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NON_EXPORTED_BASE(LayerTreeHostImplClient), 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NON_EXPORTED_BASE(SchedulerClient), 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NON_EXPORTED_BASE(ResourceUpdateControllerClient) { 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch static scoped_ptr<Proxy> Create( 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch LayerTreeHost* layer_tree_host, 425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner); 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~ThreadProxy(); 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) struct BeginMainFrameAndCommitState { 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) BeginMainFrameAndCommitState(); 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ~BeginMainFrameAndCommitState(); 50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch unsigned int begin_frame_id; 5203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) BeginFrameArgs begin_frame_args; 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<ScrollAndScaleSet> scroll_info; 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) size_t memory_allocation_limit_bytes; 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int memory_allocation_priority_cutoff; 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool evicted_ui_resources; 57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) }; 58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) struct MainThreadOnly { 60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MainThreadOnly(ThreadProxy* proxy, int layer_tree_host_id); 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ~MainThreadOnly(); 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const int layer_tree_host_id; 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Set only when SetNeedsAnimate is called. 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool animate_requested; 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Set only when SetNeedsCommit is called. 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool commit_requested; 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Set by SetNeedsAnimate, SetNeedsUpdateLayers, and SetNeedsCommit. 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool commit_request_sent_to_impl_thread; 71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool started; 73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool manage_tiles_pending; 74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool can_cancel_commit; 75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool defer_commits; 76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RendererCapabilities renderer_capabilities_main_thread_copy; 78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<BeginMainFrameAndCommitState> pending_deferred_commit; 80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::WeakPtrFactory<ThreadProxy> weak_factory; 81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) }; 82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Accessed on the main thread, or when main thread is blocked. 84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) struct MainThreadOrBlockedMainThread { 85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) explicit MainThreadOrBlockedMainThread(LayerTreeHost* host); 86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ~MainThreadOrBlockedMainThread(); 87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PrioritizedResourceManager* contents_texture_manager(); 89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) LayerTreeHost* layer_tree_host; 91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool commit_waits_for_activation; 92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool main_thread_inside_commit; 93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::TimeTicks last_monotonic_frame_begin_time; 95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) }; 96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) struct CompositorThreadOnly { 985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CompositorThreadOnly( 995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ThreadProxy* proxy, 1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int layer_tree_host_id, 1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RenderingStatsInstrumentation* rendering_stats_instrumentation); 102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ~CompositorThreadOnly(); 103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const int layer_tree_host_id; 105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Copy of the main thread side contents texture manager for work 107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // that needs to be done on the compositor thread. 108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PrioritizedResourceManager* contents_texture_manager; 109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<Scheduler> scheduler; 111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Set when the main thread is waiting on a 113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // ScheduledActionSendBeginMainFrame to be issued. 114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CompletionEvent* begin_main_frame_sent_completion_event; 115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Set when the main thread is waiting on a commit to complete. 117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CompletionEvent* commit_completion_event; 118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Set when the main thread is waiting on a pending tree activation. 120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CompletionEvent* completion_event_for_commit_held_on_tree_activation; 121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<ResourceUpdateController> current_resource_update_controller; 123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Set when the next draw should post DidCommitAndDrawFrame to the main 125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // thread. 126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool next_frame_is_newly_committed_frame; 127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool inside_draw; 129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool input_throttled_until_commit; 131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Set when we freeze animations to avoid checkerboarding. 133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool animations_frozen_until_next_draw; 134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::TimeTicks animation_time; 135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Whether a commit has been completed since the last time animations were 137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // ticked. If this happens, we need to animate again. 138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool did_commit_after_animating; 139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 14046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DelayedUniqueNotifier smoothness_priority_expiration_notifier; 141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ProxyTimingHistory timing_history; 143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<LayerTreeHostImpl> layer_tree_host_impl; 145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::WeakPtrFactory<ThreadProxy> weak_factory; 146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) }; 147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const MainThreadOnly& main() const; 149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const MainThreadOrBlockedMainThread& blocked_main() const; 150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const CompositorThreadOnly& impl() const; 151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Proxy implementation 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void FinishAllRendering() OVERRIDE; 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool IsStarted() const OVERRIDE; 1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void SetOutputSurface(scoped_ptr<OutputSurface>) OVERRIDE; 156b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void SetLayerTreeHostClientReady() OVERRIDE; 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetVisible(bool visible) OVERRIDE; 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual const RendererCapabilities& GetRendererCapabilities() const OVERRIDE; 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetNeedsAnimate() OVERRIDE; 160558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch virtual void SetNeedsUpdateLayers() OVERRIDE; 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetNeedsCommit() OVERRIDE; 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void SetNeedsRedraw(const gfx::Rect& damage_rect) OVERRIDE; 163424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual void SetNextCommitWaitsForActivation() OVERRIDE; 164a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void NotifyInputThrottledUntilCommit() OVERRIDE; 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetDeferCommits(bool defer_commits) OVERRIDE; 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool CommitRequested() const OVERRIDE; 1671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual bool BeginMainFrameRequested() const OVERRIDE; 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void MainThreadHasStoppedFlinging() OVERRIDE; 1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void Start() OVERRIDE; 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Stop() OVERRIDE; 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual size_t MaxPartialTextureUpdates() const OVERRIDE; 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void ForceSerializeOnSwapBuffers() OVERRIDE; 173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual bool SupportsImplScrolling() const OVERRIDE; 174c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void SetDebugState(const LayerTreeDebugState& debug_state) OVERRIDE; 1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void AsValueInto(base::debug::TracedValue* value) const OVERRIDE; 1766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual bool MainFrameWillHappenForTesting() OVERRIDE; 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // LayerTreeHostImplClient implementation 1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void UpdateRendererCapabilitiesOnImplThread() OVERRIDE; 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidLoseOutputSurfaceOnImplThread() OVERRIDE; 1815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void CommitVSyncParameters(base::TimeTicks timebase, 1825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::TimeDelta interval) OVERRIDE; 1835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void SetEstimatedParentDrawTime(base::TimeDelta draw_time) OVERRIDE; 1845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void BeginFrame(const BeginFrameArgs& args) OVERRIDE; 1850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual void SetMaxSwapsPendingOnImplThread(int max) OVERRIDE; 1860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual void DidSwapBuffersOnImplThread() OVERRIDE; 1870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual void DidSwapBuffersCompleteOnImplThread() OVERRIDE; 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnCanDrawStateChanged(bool can_draw) OVERRIDE; 189424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) virtual void NotifyReadyToActivate() OVERRIDE; 1905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Please call these 3 functions through 1915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // LayerTreeHostImpl's SetNeedsRedraw(), SetNeedsRedrawRect() and 1925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // SetNeedsAnimate(). 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetNeedsRedrawOnImplThread() OVERRIDE; 1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void SetNeedsRedrawRectOnImplThread(const gfx::Rect& dirty_rect) 1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OVERRIDE; 1965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void SetNeedsAnimateOnImplThread() OVERRIDE; 197d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual void SetNeedsManageTilesOnImplThread() OVERRIDE; 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidInitializeVisibleTileOnImplThread() OVERRIDE; 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetNeedsCommitOnImplThread() OVERRIDE; 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void PostAnimationEventsToMainThreadOnImplThread( 201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<AnimationEventsVector> queue) OVERRIDE; 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool ReduceContentsTextureMemoryOnImplThread(size_t limit_bytes, 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int priority_cutoff) 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OVERRIDE; 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool IsInsideDraw() OVERRIDE; 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void RenewTreePriority() OVERRIDE; 207010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void PostDelayedScrollbarFadeOnImplThread( 208010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const base::Closure& start_fade, 209010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::TimeDelta delay) OVERRIDE; 210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void DidActivateSyncTree() OVERRIDE; 211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void DidManageTiles() OVERRIDE; 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // SchedulerClient implementation 214a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual void SetNeedsBeginFrame(bool enable) OVERRIDE; 215a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual void WillBeginImplFrame(const BeginFrameArgs& args) OVERRIDE; 2168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) virtual void ScheduledActionSendBeginMainFrame() OVERRIDE; 217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual DrawResult ScheduledActionDrawAndSwapIfPossible() OVERRIDE; 218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual DrawResult ScheduledActionDrawAndSwapForced() OVERRIDE; 2195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void ScheduledActionAnimate() OVERRIDE; 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void ScheduledActionCommit() OVERRIDE; 221ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch virtual void ScheduledActionUpdateVisibleTiles() OVERRIDE; 222116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void ScheduledActionActivateSyncTree() OVERRIDE; 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void ScheduledActionBeginOutputSurfaceCreation() OVERRIDE; 224d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual void ScheduledActionManageTiles() OVERRIDE; 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidAnticipatedDrawTimeChange(base::TimeTicks time) OVERRIDE; 2267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual base::TimeDelta DrawDurationEstimate() OVERRIDE; 2278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) virtual base::TimeDelta BeginMainFrameToCommitDurationEstimate() OVERRIDE; 2287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual base::TimeDelta CommitToActivateDurationEstimate() OVERRIDE; 2298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) virtual void DidBeginImplFrameDeadline() OVERRIDE; 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ResourceUpdateControllerClient implementation 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void ReadyToFinalizeTextureUpdates() OVERRIDE; 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 234cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) protected: 235eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ThreadProxy(LayerTreeHost* layer_tree_host, 2365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, 237eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner); 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private: 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Called on main thread. 2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void SetRendererCapabilitiesMainThreadCopy( 2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const RendererCapabilities& capabilities); 2431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) void BeginMainFrame( 2441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_ptr<BeginMainFrameAndCommitState> begin_main_frame_state); 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void DidCommitAndDrawFrame(); 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void DidCompleteSwapBuffers(); 247a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void SetAnimationEvents(scoped_ptr<AnimationEventsVector> queue); 248f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void DidLoseOutputSurface(); 2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void RequestNewOutputSurface(); 250f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void DidInitializeOutputSurface(bool success, 251f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const RendererCapabilities& capabilities); 252558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch void SendCommitRequestToImplThreadIfNeeded(); 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Called on impl thread. 2557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) struct SchedulerStateRequest; 2567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void StartCommitOnImplThread(CompletionEvent* completion, 2585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ResourceUpdateQueue* queue); 2591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) void BeginMainFrameAbortedOnImplThread(bool did_handle); 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void FinishAllRenderingOnImplThread(CompletionEvent* completion); 26190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void InitializeImplOnImplThread(CompletionEvent* completion); 262b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) void SetLayerTreeHostClientReadyOnImplThread(); 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetVisibleOnImplThread(CompletionEvent* completion, bool visible); 264424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) void UpdateBackgroundAnimateTicking(); 265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void HasInitializedOutputSurfaceOnImplThread( 266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CompletionEvent* completion, 267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool* has_initialized_output_surface); 268f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void DeleteContentsTexturesOnImplThread(CompletionEvent* completion); 269f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void InitializeOutputSurfaceOnImplThread( 270f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<OutputSurface> output_surface); 271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void FinishGLOnImplThread(CompletionEvent* completion); 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void LayerTreeHostClosedOnImplThread(CompletionEvent* completion); 273cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DrawResult DrawSwapInternal(bool forced_draw); 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ForceSerializeOnSwapBuffersOnImplThread(CompletionEvent* completion); 2756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) void MainFrameWillHappenOnImplThreadForTesting(CompletionEvent* completion, 2766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) bool* main_frame_will_happen); 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void AsValueOnImplThread(CompletionEvent* completion, 2785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::debug::TracedValue* state) const; 27958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void SetSwapUsedIncompleteTileOnImplThread(bool used_incomplete_tile); 280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void MainThreadHasStoppedFlingingOnImplThread(); 281a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void SetInputThrottledUntilCommitOnImplThread(bool is_throttled); 282c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void SetDebugStateOnImplThread(const LayerTreeDebugState& debug_state); 283c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 284f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LayerTreeHost* layer_tree_host(); 285f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const LayerTreeHost* layer_tree_host() const; 2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Use accessors instead of this variable directly. 2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MainThreadOnly main_thread_only_vars_unsafe_; 2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MainThreadOnly& main(); 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Use accessors instead of this variable directly. 2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MainThreadOrBlockedMainThread main_thread_or_blocked_vars_unsafe_; 2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MainThreadOrBlockedMainThread& blocked_main(); 2945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Use accessors instead of this variable directly. 2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CompositorThreadOnly compositor_thread_vars_unsafe_; 2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CompositorThreadOnly& impl(); 2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::WeakPtr<ThreadProxy> main_thread_weak_ptr_; 3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::WeakPtr<ThreadProxy> impl_thread_weak_ptr_; 301a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ThreadProxy); 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // CC_TREES_THREAD_PROXY_H_ 308