- add sources.
[platform/framework/web/crosswalk.git] / src / cc / trees / proxy.h
1 // Copyright 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef CC_TREES_PROXY_H_
6 #define CC_TREES_PROXY_H_
7
8 #include <string>
9
10 #include "base/basictypes.h"
11 #include "base/logging.h"
12 #include "base/memory/ref_counted.h"
13 #include "base/memory/scoped_ptr.h"
14 #include "base/time/time.h"
15 #include "base/values.h"
16 #include "cc/base/cc_export.h"
17
18 namespace base { class SingleThreadTaskRunner; }
19
20 namespace gfx {
21 class Rect;
22 class Vector2d;
23 }
24
25 namespace cc {
26
27 class OutputSurface;
28 struct RendererCapabilities;
29
30 // Abstract class responsible for proxying commands from the main-thread side of
31 // the compositor over to the compositor implementation.
32 class CC_EXPORT Proxy {
33  public:
34   base::SingleThreadTaskRunner* MainThreadTaskRunner() const;
35   bool HasImplThread() const;
36   base::SingleThreadTaskRunner* ImplThreadTaskRunner() const;
37
38   // Debug hooks.
39   bool IsMainThread() const;
40   bool IsImplThread() const;
41   bool IsMainThreadBlocked() const;
42 #ifndef NDEBUG
43   void SetMainThreadBlocked(bool is_main_thread_blocked);
44   void SetCurrentThreadIsImplThread(bool is_impl_thread);
45 #endif
46
47   virtual ~Proxy();
48
49   virtual bool CompositeAndReadback(void* pixels, gfx::Rect rect) = 0;
50
51   virtual void FinishAllRendering() = 0;
52
53   virtual bool IsStarted() const = 0;
54
55   // Indicates that the compositing surface associated with our context is
56   // ready to use.
57   virtual void SetLayerTreeHostClientReady() = 0;
58
59   virtual void SetVisible(bool visible) = 0;
60
61   // Attempts to recreate the context and renderer synchronously after the
62   // output surface is lost. Calls
63   // LayerTreeHost::OnCreateAndInitializeOutputSurfaceAttempted with the result.
64   virtual void CreateAndInitializeOutputSurface() = 0;
65
66   virtual const RendererCapabilities& GetRendererCapabilities() const = 0;
67
68   virtual void SetNeedsAnimate() = 0;
69   virtual void SetNeedsUpdateLayers() = 0;
70   virtual void SetNeedsCommit() = 0;
71   virtual void SetNeedsRedraw(gfx::Rect damage_rect) = 0;
72   virtual void SetNextCommitWaitsForActivation() = 0;
73
74   virtual void NotifyInputThrottledUntilCommit() = 0;
75
76   // Defers commits until it is reset. It is only supported when in threaded
77   // mode. It's an error to make a sync call like CompositeAndReadback while
78   // commits are deferred.
79   virtual void SetDeferCommits(bool defer_commits) = 0;
80
81   virtual void MainThreadHasStoppedFlinging() = 0;
82
83   virtual bool CommitRequested() const = 0;
84   virtual bool BeginMainFrameRequested() const = 0;
85
86   // Must be called before using the proxy.
87   virtual void Start(scoped_ptr<OutputSurface> first_output_surface) = 0;
88   virtual void Stop() = 0;   // Must be called before deleting the proxy.
89
90   // Forces 3D commands on all contexts to wait for all previous SwapBuffers
91   // to finish before executing in the GPU process.
92   virtual void ForceSerializeOnSwapBuffers() = 0;
93
94   // Maximum number of sub-region texture updates supported for each commit.
95   virtual size_t MaxPartialTextureUpdates() const = 0;
96
97   virtual void AcquireLayerTextures() = 0;
98
99   virtual scoped_ptr<base::Value> AsValue() const = 0;
100
101   // Testing hooks
102   virtual bool CommitPendingForTesting() = 0;
103   virtual scoped_ptr<base::Value> SchedulerStateAsValueForTesting();
104
105  protected:
106   explicit Proxy(
107       scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner);
108   friend class DebugScopedSetImplThread;
109   friend class DebugScopedSetMainThread;
110   friend class DebugScopedSetMainThreadBlocked;
111
112  private:
113   scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
114   scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner_;
115 #ifndef NDEBUG
116   bool impl_thread_is_overridden_;
117   bool is_main_thread_blocked_;
118 #endif
119
120   DISALLOW_COPY_AND_ASSIGN(Proxy);
121 };
122
123 #ifndef NDEBUG
124 class DebugScopedSetMainThreadBlocked {
125  public:
126   explicit DebugScopedSetMainThreadBlocked(Proxy* proxy) : proxy_(proxy) {
127     DCHECK(!proxy_->IsMainThreadBlocked());
128     proxy_->SetMainThreadBlocked(true);
129   }
130   ~DebugScopedSetMainThreadBlocked() {
131     DCHECK(proxy_->IsMainThreadBlocked());
132     proxy_->SetMainThreadBlocked(false);
133   }
134  private:
135   Proxy* proxy_;
136   DISALLOW_COPY_AND_ASSIGN(DebugScopedSetMainThreadBlocked);
137 };
138 #else
139 class DebugScopedSetMainThreadBlocked {
140  public:
141   explicit DebugScopedSetMainThreadBlocked(Proxy* proxy) {}
142   ~DebugScopedSetMainThreadBlocked() {}
143  private:
144   DISALLOW_COPY_AND_ASSIGN(DebugScopedSetMainThreadBlocked);
145 };
146 #endif
147
148 }  // namespace cc
149
150 #endif  // CC_TREES_PROXY_H_