OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 CONTENT_COMMON_GPU_GPU_CHANNEL_H_ | 5 #ifndef CONTENT_COMMON_GPU_GPU_CHANNEL_H_ |
6 #define CONTENT_COMMON_GPU_GPU_CHANNEL_H_ | 6 #define CONTENT_COMMON_GPU_GPU_CHANNEL_H_ |
7 | 7 |
8 #include <deque> | 8 #include <deque> |
9 #include <string> | 9 #include <string> |
10 #include <vector> | 10 #include <vector> |
(...skipping 18 matching lines...) Expand all Loading... |
29 #endif | 29 #endif |
30 | 30 |
31 struct GPUCreateCommandBufferConfig; | 31 struct GPUCreateCommandBufferConfig; |
32 | 32 |
33 namespace base { | 33 namespace base { |
34 class MessageLoopProxy; | 34 class MessageLoopProxy; |
35 class WaitableEvent; | 35 class WaitableEvent; |
36 } | 36 } |
37 | 37 |
38 namespace gpu { | 38 namespace gpu { |
39 struct RefCountedCounter; | 39 class PreemptionFlag; |
40 namespace gles2 { | 40 namespace gles2 { |
41 class ImageManager; | 41 class ImageManager; |
42 } | 42 } |
43 } | 43 } |
44 | 44 |
45 #if defined(OS_ANDROID) | 45 #if defined(OS_ANDROID) |
46 namespace content { | 46 namespace content { |
47 class StreamTextureManagerAndroid; | 47 class StreamTextureManagerAndroid; |
48 } | 48 } |
49 #endif | 49 #endif |
50 | 50 |
51 namespace content { | 51 namespace content { |
52 class GpuChannelManager; | 52 class GpuChannelManager; |
53 class GpuWatchdog; | 53 class GpuWatchdog; |
| 54 class SyncPointMessageFilter; |
54 | 55 |
55 // Encapsulates an IPC channel between the GPU process and one renderer | 56 // Encapsulates an IPC channel between the GPU process and one renderer |
56 // process. On the renderer side there's a corresponding GpuChannelHost. | 57 // process. On the renderer side there's a corresponding GpuChannelHost. |
57 class GpuChannel : public IPC::Listener, | 58 class GpuChannel : public IPC::Listener, |
58 public IPC::Sender, | 59 public IPC::Sender, |
59 public base::RefCountedThreadSafe<GpuChannel> { | 60 public base::RefCountedThreadSafe<GpuChannel> { |
60 public: | 61 public: |
61 // Takes ownership of the renderer process handle. | 62 // Takes ownership of the renderer process handle. |
62 GpuChannel(GpuChannelManager* gpu_channel_manager, | 63 GpuChannel(GpuChannelManager* gpu_channel_manager, |
63 GpuWatchdog* watchdog, | 64 GpuWatchdog* watchdog, |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
122 // Destroy channel and all contained contexts. | 123 // Destroy channel and all contained contexts. |
123 void DestroySoon(); | 124 void DestroySoon(); |
124 | 125 |
125 // Generate a route ID guaranteed to be unique for this channel. | 126 // Generate a route ID guaranteed to be unique for this channel. |
126 int GenerateRouteID(); | 127 int GenerateRouteID(); |
127 | 128 |
128 // Called to add/remove a listener for a particular message routing ID. | 129 // Called to add/remove a listener for a particular message routing ID. |
129 void AddRoute(int32 route_id, IPC::Listener* listener); | 130 void AddRoute(int32 route_id, IPC::Listener* listener); |
130 void RemoveRoute(int32 route_id); | 131 void RemoveRoute(int32 route_id); |
131 | 132 |
132 gpu::RefCountedCounter* MessagesPendingCount() { | 133 gpu::PreemptionFlag* GetPreemptionFlag() { |
133 return unprocessed_messages_.get(); | 134 return processing_stalled_.get(); |
134 } | 135 } |
135 | 136 |
136 // If preempt_by_counter->count is non-zero, any stub on this channel | 137 // If |preemption_flag->IsSet()|, any stub on this channel |
137 // should stop issuing GL commands. Setting this to NULL stops deferral. | 138 // should stop issuing GL commands. Setting this to NULL stops deferral. |
138 void SetPreemptByCounter( | 139 void SetPreemptByFlag( |
139 scoped_refptr<gpu::RefCountedCounter> preempt_by_counter); | 140 scoped_refptr<gpu::PreemptionFlag> preemption_flag); |
140 | 141 |
141 #if defined(OS_ANDROID) | 142 #if defined(OS_ANDROID) |
142 StreamTextureManagerAndroid* stream_texture_manager() { | 143 StreamTextureManagerAndroid* stream_texture_manager() { |
143 return stream_texture_manager_.get(); | 144 return stream_texture_manager_.get(); |
144 } | 145 } |
145 #endif | 146 #endif |
146 | 147 |
147 protected: | 148 protected: |
148 virtual ~GpuChannel(); | 149 virtual ~GpuChannel(); |
149 | 150 |
(...skipping 23 matching lines...) Expand all Loading... |
173 // through binder thread. | 174 // through binder thread. |
174 void OnEstablishStreamTexture( | 175 void OnEstablishStreamTexture( |
175 int32 stream_id, SurfaceTexturePeer::SurfaceTextureTarget type, | 176 int32 stream_id, SurfaceTexturePeer::SurfaceTextureTarget type, |
176 int32 primary_id, int32 secondary_id); | 177 int32 primary_id, int32 secondary_id); |
177 #endif | 178 #endif |
178 | 179 |
179 // Collect rendering stats. | 180 // Collect rendering stats. |
180 void OnCollectRenderingStatsForSurface( | 181 void OnCollectRenderingStatsForSurface( |
181 int32 surface_id, IPC::Message* reply_message); | 182 int32 surface_id, IPC::Message* reply_message); |
182 | 183 |
| 184 // Decrement the count of unhandled IPC messages and defer preemption. |
| 185 void MessageProcessed(); |
| 186 |
183 // The lifetime of objects of this class is managed by a GpuChannelManager. | 187 // The lifetime of objects of this class is managed by a GpuChannelManager. |
184 // The GpuChannelManager destroy all the GpuChannels that they own when they | 188 // The GpuChannelManager destroy all the GpuChannels that they own when they |
185 // are destroyed. So a raw pointer is safe. | 189 // are destroyed. So a raw pointer is safe. |
186 GpuChannelManager* gpu_channel_manager_; | 190 GpuChannelManager* gpu_channel_manager_; |
187 | 191 |
188 scoped_ptr<IPC::SyncChannel> channel_; | 192 scoped_ptr<IPC::SyncChannel> channel_; |
189 | 193 |
190 // Number of routed messages for pending processing on a stub. | 194 // Pointer to number of routed messages that are pending processing on a |
191 scoped_refptr<gpu::RefCountedCounter> unprocessed_messages_; | 195 // stub. The lifetime is properly managed because we pass ownership to a |
| 196 // SyncPointMessageFilter, which we hold a reference to. |
| 197 base::AtomicRefCount* unprocessed_messages_; |
| 198 |
| 199 // Whether the processing of IPCs on this channel is stalled. |
| 200 scoped_refptr<gpu::PreemptionFlag> processing_stalled_; |
192 | 201 |
193 // If non-NULL, all stubs on this channel should stop processing GL | 202 // If non-NULL, all stubs on this channel should stop processing GL |
194 // commands (via their GpuScheduler) when preempt_by_counter_->count | 203 // commands (via their GpuScheduler) when preemption_flag_->IsSet() |
195 // is non-zero. | 204 scoped_refptr<gpu::PreemptionFlag> preemption_flag_; |
196 scoped_refptr<gpu::RefCountedCounter> preempt_by_counter_; | |
197 | 205 |
198 std::deque<IPC::Message*> deferred_messages_; | 206 std::deque<IPC::Message*> deferred_messages_; |
199 | 207 |
200 // The id of the client who is on the other side of the channel. | 208 // The id of the client who is on the other side of the channel. |
201 int client_id_; | 209 int client_id_; |
202 | 210 |
203 // Uniquely identifies the channel within this GPU process. | 211 // Uniquely identifies the channel within this GPU process. |
204 std::string channel_id_; | 212 std::string channel_id_; |
205 | 213 |
206 // Used to implement message routing functionality to CommandBuffer objects | 214 // Used to implement message routing functionality to CommandBuffer objects |
(...skipping 18 matching lines...) Expand all Loading... |
225 bool handle_messages_scheduled_; | 233 bool handle_messages_scheduled_; |
226 bool processed_get_state_fast_; | 234 bool processed_get_state_fast_; |
227 IPC::Message* currently_processing_message_; | 235 IPC::Message* currently_processing_message_; |
228 | 236 |
229 #if defined(OS_ANDROID) | 237 #if defined(OS_ANDROID) |
230 scoped_ptr<StreamTextureManagerAndroid> stream_texture_manager_; | 238 scoped_ptr<StreamTextureManagerAndroid> stream_texture_manager_; |
231 #endif | 239 #endif |
232 | 240 |
233 base::WeakPtrFactory<GpuChannel> weak_factory_; | 241 base::WeakPtrFactory<GpuChannel> weak_factory_; |
234 | 242 |
| 243 scoped_refptr<SyncPointMessageFilter> filter_; |
| 244 scoped_refptr<base::MessageLoopProxy> io_message_loop_; |
| 245 |
235 DISALLOW_COPY_AND_ASSIGN(GpuChannel); | 246 DISALLOW_COPY_AND_ASSIGN(GpuChannel); |
236 }; | 247 }; |
237 | 248 |
238 } // namespace content | 249 } // namespace content |
239 | 250 |
240 #endif // CONTENT_COMMON_GPU_GPU_CHANNEL_H_ | 251 #endif // CONTENT_COMMON_GPU_GPU_CHANNEL_H_ |
OLD | NEW |