Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(369)

Side by Side Diff: gpu/command_buffer/service/gpu_scheduler.h

Issue 7395020: Create new GLSurface for cross process image transport. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: "" Created 9 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef GPU_COMMAND_BUFFER_SERVICE_GPU_SCHEDULER_H_ 5 #ifndef GPU_COMMAND_BUFFER_SERVICE_GPU_SCHEDULER_H_
6 #define GPU_COMMAND_BUFFER_SERVICE_GPU_SCHEDULER_H_ 6 #define GPU_COMMAND_BUFFER_SERVICE_GPU_SCHEDULER_H_
7 7
8 #include <map> 8 #include <map>
9 #include <queue> 9 #include <queue>
10 #include <vector> 10 #include <vector>
11 11
12 #include "base/callback.h" 12 #include "base/callback.h"
13 #include "base/memory/ref_counted.h" 13 #include "base/memory/ref_counted.h"
14 #include "base/memory/scoped_ptr.h" 14 #include "base/memory/scoped_ptr.h"
15 #include "base/shared_memory.h" 15 #include "base/shared_memory.h"
16 #include "base/task.h" 16 #include "base/task.h"
17 #include "gpu/command_buffer/common/command_buffer.h" 17 #include "gpu/command_buffer/common/command_buffer.h"
18 #include "gpu/command_buffer/service/cmd_buffer_engine.h" 18 #include "gpu/command_buffer/service/cmd_buffer_engine.h"
19 #include "gpu/command_buffer/service/cmd_parser.h" 19 #include "gpu/command_buffer/service/cmd_parser.h"
20 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" 20 #include "gpu/command_buffer/service/gles2_cmd_decoder.h"
21 #include "ui/gfx/native_widget_types.h" 21 #include "ui/gfx/native_widget_types.h"
22 #include "ui/gfx/size.h" 22 #include "ui/gfx/size.h"
23 #include "ui/gfx/surface/transport_dib.h" 23 #include "ui/gfx/surface/transport_dib.h"
24 24
25 #if defined(OS_MACOSX) 25 #if defined(OS_MACOSX)
26 #include "ui/gfx/surface/accelerated_surface_mac.h" 26 #include "ui/gfx/surface/accelerated_surface_mac.h"
27 #elif defined(TOUCH_UI)
28 #include "ui/gfx/surface/accelerated_surface_linux.h"
29 #endif 27 #endif
30 28
31 namespace gfx { 29 namespace gfx {
32 class GLContext; 30 class GLContext;
33 class GLShareGroup; 31 class GLShareGroup;
34 class GLSurface; 32 class GLSurface;
35 } 33 }
36 34
37 namespace gpu { 35 namespace gpu {
38 namespace gles2 { 36 namespace gles2 {
39 class ContextGroup; 37 class ContextGroup;
40 } 38 }
41 39
42 // This class processes commands in a command buffer. It is event driven and 40 // This class processes commands in a command buffer. It is event driven and
43 // posts tasks to the current message loop to do additional work. 41 // posts tasks to the current message loop to do additional work.
44 class GpuScheduler : public CommandBufferEngine { 42 class GpuScheduler : public CommandBufferEngine {
45 public: 43 public:
46 // If a group is not passed in one will be created. 44 // If a group is not passed in one will be created.
47 static GpuScheduler* Create(CommandBuffer* command_buffer, 45 static GpuScheduler* Create(CommandBuffer* command_buffer,
48 SurfaceManager* surface_manager, 46 SurfaceManager* surface_manager,
49 gles2::ContextGroup* group); 47 gles2::ContextGroup* group);
50 48
51 // This constructor is for unit tests. 49 // This constructor is for unit tests.
52 static GpuScheduler* CreateForTests(CommandBuffer* command_buffer, 50 static GpuScheduler* CreateForTests(CommandBuffer* command_buffer,
53 gles2::GLES2Decoder* decoder, 51 gles2::GLES2Decoder* decoder,
54 CommandParser* parser); 52 CommandParser* parser);
55 53
56 virtual ~GpuScheduler(); 54 virtual ~GpuScheduler();
57 55
58 // Perform platform specific and common initialization. 56 // Platform specific code to create GLContexts and GLSurfaces that are
57 // handed off to the next function.
59 bool Initialize(gfx::PluginWindowHandle hwnd, 58 bool Initialize(gfx::PluginWindowHandle hwnd,
60 const gfx::Size& size, 59 const gfx::Size& size,
61 bool software, 60 bool software,
62 const gles2::DisallowedExtensions& disallowed_extensions, 61 const gles2::DisallowedExtensions& disallowed_extensions,
63 const char* allowed_extensions, 62 const char* allowed_extensions,
64 const std::vector<int32>& attribs, 63 const std::vector<int32>& attribs,
65 gfx::GLShareGroup* share_group); 64 gfx::GLShareGroup* share_group);
66 65
66 // Takes ownership of GLSurface and GLContext.
67 bool InitializeCommon(
68 const scoped_refptr<gfx::GLSurface>& surface,
69 const scoped_refptr<gfx::GLContext>& context,
70 const gfx::Size& size,
71 const gles2::DisallowedExtensions& disallowed_extensions,
72 const char* allowed_extensions,
73 const std::vector<int32>& attribs);
74
67 void Destroy(); 75 void Destroy();
68 void DestroyCommon(); 76 void DestroyCommon();
69 77
70 bool SetParent(GpuScheduler* parent_scheduler, uint32 parent_texture_id); 78 bool SetParent(GpuScheduler* parent_scheduler, uint32 parent_texture_id);
71 79
72 void PutChanged(); 80 void PutChanged();
73 81
74 // Sets whether commands should be processed by this scheduler. Setting to 82 // Sets whether commands should be processed by this scheduler. Setting to
75 // false unschedules. Setting to true reschedules. Whether or not the 83 // false unschedules. Setting to true reschedules. Whether or not the
76 // scheduler is currently scheduled is "reference counted". Every call with 84 // scheduler is currently scheduled is "reference counted". Every call with
77 // false must eventually be paired by a call with true. 85 // false must eventually be paired by a call with true.
78 void SetScheduled(bool is_scheduled); 86 void SetScheduled(bool is_scheduled);
79 87
80 // Returns whether the scheduler is currently scheduled to process commands. 88 // Returns whether the scheduler is currently scheduled to process commands.
81 bool IsScheduled(); 89 bool IsScheduled();
82 90
83 // Sets a callback that is invoked just before scheduler is rescheduled. 91 // Sets a callback that is invoked just before scheduler is rescheduled.
84 // Takes ownership of callback object. 92 // Takes ownership of callback object.
85 void SetScheduledCallback(Callback0::Type* scheduled_callback); 93 void SetScheduledCallback(Callback0::Type* scheduled_callback);
86 94
87 // Implementation of CommandBufferEngine. 95 // Implementation of CommandBufferEngine.
88 virtual Buffer GetSharedMemoryBuffer(int32 shm_id); 96 virtual Buffer GetSharedMemoryBuffer(int32 shm_id);
89 virtual void set_token(int32 token); 97 virtual void set_token(int32 token);
90 virtual bool SetGetOffset(int32 offset); 98 virtual bool SetGetOffset(int32 offset);
91 virtual int32 GetGetOffset(); 99 virtual int32 GetGetOffset();
92 100
93 // Asynchronously resizes an offscreen frame buffer. 101 // Asynchronously resizes an offscreen frame buffer.
94 void ResizeOffscreenFrameBuffer(const gfx::Size& size); 102 void ResizeOffscreenFrameBuffer(const gfx::Size& size);
95 103
96 #if defined(OS_MACOSX) || defined(TOUCH_UI) 104 #if defined(OS_MACOSX)
97 // To prevent the GPU process from overloading the browser process, 105 // To prevent the GPU process from overloading the browser process,
98 // we need to track the number of swap buffers calls issued and 106 // we need to track the number of swap buffers calls issued and
99 // acknowledged per on-screen context, and keep the GPU from getting 107 // acknowledged per on-screen context, and keep the GPU from getting
100 // too far ahead of the browser. Note that this 108 // too far ahead of the browser. Note that this
101 // is also predicated on a flow control mechanism between the 109 // is also predicated on a flow control mechanism between the
102 // renderer and GPU processes. 110 // renderer and GPU processes.
103 uint64 swap_buffers_count() const; 111 uint64 swap_buffers_count() const;
104 uint64 acknowledged_swap_buffers_count() const; 112 uint64 acknowledged_swap_buffers_count() const;
105 void set_acknowledged_swap_buffers_count( 113 void set_acknowledged_swap_buffers_count(
106 uint64 acknowledged_swap_buffers_count); 114 uint64 acknowledged_swap_buffers_count);
107 #endif
108 115
109 #if defined(OS_MACOSX)
110 // Needed only on Mac OS X, which does not render into an on-screen 116 // Needed only on Mac OS X, which does not render into an on-screen
111 // window and therefore requires the backing store to be resized 117 // window and therefore requires the backing store to be resized
112 // manually. Returns an opaque identifier for the new backing store. 118 // manually. Returns an opaque identifier for the new backing store.
113 // There are two versions of this method: one for use with the IOSurface 119 // There are two versions of this method: one for use with the IOSurface
114 // available in Mac OS X 10.6; and, one for use with the 120 // available in Mac OS X 10.6; and, one for use with the
115 // TransportDIB-based version used on Mac OS X 10.5. 121 // TransportDIB-based version used on Mac OS X 10.5.
116 virtual uint64 SetWindowSizeForIOSurface(const gfx::Size& size); 122 virtual uint64 SetWindowSizeForIOSurface(const gfx::Size& size);
117 virtual TransportDIB::Handle SetWindowSizeForTransportDIB( 123 virtual TransportDIB::Handle SetWindowSizeForTransportDIB(
118 const gfx::Size& size); 124 const gfx::Size& size);
119 virtual void SetTransportDIBAllocAndFree( 125 virtual void SetTransportDIBAllocAndFree(
120 Callback2<size_t, TransportDIB::Handle*>::Type* allocator, 126 Callback2<size_t, TransportDIB::Handle*>::Type* allocator,
121 Callback1<TransportDIB::Id>::Type* deallocator); 127 Callback1<TransportDIB::Id>::Type* deallocator);
122 // Returns the id of the current surface that is being rendered to 128 // Returns the id of the current surface that is being rendered to
123 // (or 0 if no such surface has been created). 129 // (or 0 if no such surface has been created).
124 virtual uint64 GetSurfaceId(); 130 virtual uint64 GetSurfaceId();
125 131
126 void DidDestroySurface(); 132 void DidDestroySurface();
127 #endif 133 #endif
128 134
129 #if defined(TOUCH_UI)
130 virtual void CreateBackSurface(const gfx::Size& size);
131 // Should not be back_surface_ or front_surface_.
132 virtual void ReleaseSurface(uint64 surface_id);
133
134 // Returns the id of the surface (or 0 if no such surface has been created).
135 virtual uint64 GetBackSurfaceId();
136 virtual uint64 GetFrontSurfaceId();
137 #endif
138
139 // Sets a callback that is called when a glResizeCHROMIUM command 135 // Sets a callback that is called when a glResizeCHROMIUM command
140 // is processed. 136 // is processed.
141 void SetResizeCallback(Callback1<gfx::Size>::Type* callback); 137 void SetResizeCallback(Callback1<gfx::Size>::Type* callback);
142 138
143 // Sets a callback which is called when a SwapBuffers command is processed. 139 // Sets a callback which is called when a SwapBuffers command is processed.
144 // Must be called after Initialize(). 140 // Must be called after Initialize().
145 // It is not defined on which thread this callback is called. 141 // It is not defined on which thread this callback is called.
146 void SetSwapBuffersCallback(Callback0::Type* callback); 142 void SetSwapBuffersCallback(Callback0::Type* callback);
147 143
148 void SetCommandProcessedCallback(Callback0::Type* callback); 144 void SetCommandProcessedCallback(Callback0::Type* callback);
149 145
150 // Sets a callback which is called when set_token() is called, and passes the 146 // Sets a callback which is called when set_token() is called, and passes the
151 // just-set token to the callback. DCHECKs that no callback has previously 147 // just-set token to the callback. DCHECKs that no callback has previously
152 // been registered for this notification. 148 // been registered for this notification.
153 void SetTokenCallback(const base::Callback<void(int32)>& callback); 149 void SetTokenCallback(const base::Callback<void(int32)>& callback);
154 150
155 // Get the GLES2Decoder associated with this scheduler. 151 // Get the GLES2Decoder associated with this scheduler.
156 gles2::GLES2Decoder* decoder() const { return decoder_.get(); } 152 gles2::GLES2Decoder* decoder() const { return decoder_.get(); }
157 153
158 protected:
159 // Perform common initialization. Takes ownership of GLSurface and GLContext.
160 bool InitializeCommon(
161 const scoped_refptr<gfx::GLSurface>& surface,
162 const scoped_refptr<gfx::GLContext>& context,
163 const gfx::Size& size,
164 const gles2::DisallowedExtensions& disallowed_extensions,
165 const char* allowed_extensions,
166 const std::vector<int32>& attribs);
167
168
169 private: 154 private:
170 // If a group is not passed in one will be created. 155 // If a group is not passed in one will be created.
171 GpuScheduler(CommandBuffer* command_buffer, 156 GpuScheduler(CommandBuffer* command_buffer,
172 gles2::GLES2Decoder* decoder, 157 gles2::GLES2Decoder* decoder,
173 CommandParser* parser); 158 CommandParser* parser);
174 159
175 // Called via a callback just before we are supposed to call the 160 // Called via a callback just before we are supposed to call the
176 // user's resize callback.
177 void WillResize(gfx::Size size);
178
179 // Called via a callback just before we are supposed to call the
180 // user's swap buffers callback. 161 // user's swap buffers callback.
181 void WillSwapBuffers(); 162 void WillSwapBuffers();
182 163
183 // The GpuScheduler holds a weak reference to the CommandBuffer. The 164 // The GpuScheduler holds a weak reference to the CommandBuffer. The
184 // CommandBuffer owns the GpuScheduler and holds a strong reference to it 165 // CommandBuffer owns the GpuScheduler and holds a strong reference to it
185 // through the ProcessCommands callback. 166 // through the ProcessCommands callback.
186 CommandBuffer* command_buffer_; 167 CommandBuffer* command_buffer_;
187 168
188 scoped_ptr<gles2::GLES2Decoder> decoder_; 169 scoped_ptr<gles2::GLES2Decoder> decoder_;
189 scoped_ptr<CommandParser> parser_; 170 scoped_ptr<CommandParser> parser_;
190 171
191 // Greater than zero if this is waiting to be rescheduled before continuing. 172 // Greater than zero if this is waiting to be rescheduled before continuing.
192 int unscheduled_count_; 173 int unscheduled_count_;
193 174
194 scoped_ptr<Callback0::Type> scheduled_callback_; 175 scoped_ptr<Callback0::Type> scheduled_callback_;
195 176
196 #if defined(OS_MACOSX) || defined(TOUCH_UI) 177 #if defined(OS_MACOSX)
197 uint64 swap_buffers_count_; 178 uint64 swap_buffers_count_;
198 uint64 acknowledged_swap_buffers_count_; 179 uint64 acknowledged_swap_buffers_count_;
199 #endif
200
201 #if defined(OS_MACOSX)
202 scoped_ptr<AcceleratedSurface> surface_; 180 scoped_ptr<AcceleratedSurface> surface_;
203 #elif defined(TOUCH_UI)
204 std::map<uint64, scoped_refptr<AcceleratedSurface> >
205 surfaces_;
206 scoped_refptr<AcceleratedSurface> back_surface_;
207 scoped_refptr<AcceleratedSurface> front_surface_;
208 #endif 181 #endif
209 182
210 ScopedRunnableMethodFactory<GpuScheduler> method_factory_; 183 ScopedRunnableMethodFactory<GpuScheduler> method_factory_;
211 scoped_ptr<Callback1<gfx::Size>::Type> wrapped_resize_callback_;
212 scoped_ptr<Callback0::Type> wrapped_swap_buffers_callback_; 184 scoped_ptr<Callback0::Type> wrapped_swap_buffers_callback_;
213 scoped_ptr<Callback0::Type> command_processed_callback_; 185 scoped_ptr<Callback0::Type> command_processed_callback_;
214 base::Callback<void(int32)> set_token_callback_; 186 base::Callback<void(int32)> set_token_callback_;
215 }; 187 };
216 188
217 } // namespace gpu 189 } // namespace gpu
218 190
219 #endif // GPU_COMMAND_BUFFER_SERVICE_GPU_SCHEDULER_H_ 191 #endif // GPU_COMMAND_BUFFER_SERVICE_GPU_SCHEDULER_H_
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/gles2_cmd_decoder.cc ('k') | gpu/command_buffer/service/gpu_scheduler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698