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

Side by Side Diff: content/common/gpu/gpu_channel.h

Issue 1336623004: content/gpu: Simplify gpu channel message handling. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: couple of things missed in the last patch Created 5 years, 3 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
« no previous file with comments | « no previous file | content/common/gpu/gpu_channel.cc » ('j') | content/common/gpu/gpu_channel.cc » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 <string> 8 #include <string>
9 9
10 #include "base/containers/hash_tables.h" 10 #include "base/containers/hash_tables.h"
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
99 return io_task_runner_; 99 return io_task_runner_;
100 } 100 }
101 101
102 // IPC::Listener implementation: 102 // IPC::Listener implementation:
103 bool OnMessageReceived(const IPC::Message& msg) override; 103 bool OnMessageReceived(const IPC::Message& msg) override;
104 void OnChannelError() override; 104 void OnChannelError() override;
105 105
106 // IPC::Sender implementation: 106 // IPC::Sender implementation:
107 bool Send(IPC::Message* msg) override; 107 bool Send(IPC::Message* msg) override;
108 108
109 // Requeue the message that is currently being processed to the beginning of
110 // the queue. Used when the processing of a message gets aborted because of
111 // unscheduling conditions.
112 void RequeueMessage();
113
114 // SubscriptionRefSet::Observer implementation 109 // SubscriptionRefSet::Observer implementation
115 void OnAddSubscription(unsigned int target) override; 110 void OnAddSubscription(unsigned int target) override;
116 void OnRemoveSubscription(unsigned int target) override; 111 void OnRemoveSubscription(unsigned int target) override;
117 112
118 // This is called when a command buffer transitions from the unscheduled 113 // This is called when a command buffer transitions from the unscheduled
119 // state to the scheduled state, which potentially means the channel 114 // state to the scheduled state, which potentially means the channel
120 // transitions from the unscheduled to the scheduled state. When this occurs 115 // transitions from the unscheduled to the scheduled state. When this occurs
121 // deferred IPC messaged are handled. 116 // deferred IPC messaged are handled.
122 void OnScheduled(); 117 void OnScheduled();
123 118
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
172 const gpu::ValueState& state); 167 const gpu::ValueState& state);
173 168
174 // Visible for testing. 169 // Visible for testing.
175 const gpu::ValueStateMap* pending_valuebuffer_state() const { 170 const gpu::ValueStateMap* pending_valuebuffer_state() const {
176 return pending_valuebuffer_state_.get(); 171 return pending_valuebuffer_state_.get();
177 } 172 }
178 173
179 // Visible for testing. 174 // Visible for testing.
180 GpuChannelMessageFilter* filter() const { return filter_.get(); } 175 GpuChannelMessageFilter* filter() const { return filter_.get(); }
181 176
182 uint32_t GetCurrentOrderNum() const { return current_order_num_; } 177 // Returns the global order number for the last processed IPC message.
183 uint32_t GetProcessedOrderNum() const { return processed_order_num_; } 178 uint32_t GetProcessedOrderNum() const;
179
180 // Returns the global order number for the last unprocessed IPC message.
184 uint32_t GetUnprocessedOrderNum() const; 181 uint32_t GetUnprocessedOrderNum() const;
185 182
183 void HandleMessage();
184
186 protected: 185 protected:
187 // The message filter on the io thread. 186 // The message filter on the io thread.
188 scoped_refptr<GpuChannelMessageFilter> filter_; 187 scoped_refptr<GpuChannelMessageFilter> filter_;
189 188
190 // Map of routing id to command buffer stub. 189 // Map of routing id to command buffer stub.
191 base::ScopedPtrHashMap<int32, scoped_ptr<GpuCommandBufferStub>> stubs_; 190 base::ScopedPtrHashMap<int32, scoped_ptr<GpuCommandBufferStub>> stubs_;
192 191
193 private: 192 private:
194 class StreamState { 193 class StreamState {
195 public: 194 public:
196 StreamState(int32 id, GpuStreamPriority priority); 195 StreamState(int32 id, GpuStreamPriority priority);
197 ~StreamState(); 196 ~StreamState();
198 197
199 int32 id() const { return id_; } 198 int32 id() const { return id_; }
200 GpuStreamPriority priority() const { return priority_; } 199 GpuStreamPriority priority() const { return priority_; }
201 200
202 void AddRoute(int32 route_id); 201 void AddRoute(int32 route_id);
203 void RemoveRoute(int32 route_id); 202 void RemoveRoute(int32 route_id);
204 bool HasRoute(int32 route_id) const; 203 bool HasRoute(int32 route_id) const;
205 bool HasRoutes() const; 204 bool HasRoutes() const;
206 205
207 private: 206 private:
208 int32 id_; 207 int32 id_;
209 GpuStreamPriority priority_; 208 GpuStreamPriority priority_;
210 base::hash_set<int32> routes_; 209 base::hash_set<int32> routes_;
211 }; 210 };
212 211
213 friend class GpuChannelMessageFilter;
214 friend class GpuChannelMessageQueue;
215
216 void OnDestroy(); 212 void OnDestroy();
217 213
218 bool OnControlMessageReceived(const IPC::Message& msg); 214 bool OnControlMessageReceived(const IPC::Message& msg);
219 215
220 void HandleMessage(); 216 void ScheduleHandleMessage();
221 217
222 // Message handlers. 218 // Message handlers.
223 void OnCreateOffscreenCommandBuffer( 219 void OnCreateOffscreenCommandBuffer(
224 const gfx::Size& size, 220 const gfx::Size& size,
225 const GPUCreateCommandBufferConfig& init_params, 221 const GPUCreateCommandBufferConfig& init_params,
226 int32 route_id, 222 int32 route_id,
227 bool* succeeded); 223 bool* succeeded);
228 void OnDestroyCommandBuffer(int32 route_id); 224 void OnDestroyCommandBuffer(int32 route_id);
229 void OnCreateJpegDecoder(int32 route_id, IPC::Message* reply_msg); 225 void OnCreateJpegDecoder(int32 route_id, IPC::Message* reply_msg);
230 226
231 // Update processed order number and defer preemption.
232 void MessageProcessed(uint32_t order_number);
233
234 // The lifetime of objects of this class is managed by a GpuChannelManager. 227 // The lifetime of objects of this class is managed by a GpuChannelManager.
235 // The GpuChannelManager destroy all the GpuChannels that they own when they 228 // The GpuChannelManager destroy all the GpuChannels that they own when they
236 // are destroyed. So a raw pointer is safe. 229 // are destroyed. So a raw pointer is safe.
237 GpuChannelManager* gpu_channel_manager_; 230 GpuChannelManager* gpu_channel_manager_;
238 231
239 scoped_ptr<IPC::SyncChannel> channel_; 232 scoped_ptr<IPC::SyncChannel> channel_;
240 233
241 // Uniquely identifies the channel within this GPU process. 234 // Uniquely identifies the channel within this GPU process.
242 std::string channel_id_; 235 std::string channel_id_;
243 236
(...skipping 29 matching lines...) Expand all
273 scoped_refptr<gpu::gles2::SubscriptionRefSet> subscription_ref_set_; 266 scoped_refptr<gpu::gles2::SubscriptionRefSet> subscription_ref_set_;
274 267
275 scoped_refptr<gpu::ValueStateMap> pending_valuebuffer_state_; 268 scoped_refptr<gpu::ValueStateMap> pending_valuebuffer_state_;
276 269
277 scoped_ptr<GpuJpegDecodeAccelerator> jpeg_decoder_; 270 scoped_ptr<GpuJpegDecodeAccelerator> jpeg_decoder_;
278 271
279 gpu::gles2::DisallowedFeatures disallowed_features_; 272 gpu::gles2::DisallowedFeatures disallowed_features_;
280 GpuWatchdog* watchdog_; 273 GpuWatchdog* watchdog_;
281 bool software_; 274 bool software_;
282 275
283 // Current IPC order number being processed.
284 uint32_t current_order_num_;
285
286 // Last finished IPC order number.
287 uint32_t processed_order_num_;
288
289 size_t num_stubs_descheduled_; 276 size_t num_stubs_descheduled_;
290 277
291 // Map of stream id to stream state. 278 // Map of stream id to stream state.
292 base::hash_map<int32, StreamState> streams_; 279 base::hash_map<int32, StreamState> streams_;
293 280
294 bool allow_future_sync_points_; 281 bool allow_future_sync_points_;
295 bool allow_real_time_streams_; 282 bool allow_real_time_streams_;
296 283
297 // Member variables should appear before the WeakPtrFactory, to ensure 284 // Member variables should appear before the WeakPtrFactory, to ensure
298 // that any WeakPtrs to Controller are invalidated before its members 285 // that any WeakPtrs to Controller are invalidated before its members
299 // variable's destructors are executed, rendering them invalid. 286 // variable's destructors are executed, rendering them invalid.
300 base::WeakPtrFactory<GpuChannel> weak_factory_; 287 base::WeakPtrFactory<GpuChannel> weak_factory_;
301 288
302 DISALLOW_COPY_AND_ASSIGN(GpuChannel); 289 DISALLOW_COPY_AND_ASSIGN(GpuChannel);
303 }; 290 };
304 291
305 // This filter does three things: 292 // This filter does three things:
306 // - it counts and timestamps each message forwarded to the channel 293 // - it counts and timestamps each message forwarded to the channel
307 // so that we can preempt other channels if a message takes too long to 294 // so that we can preempt other channels if a message takes too long to
308 // process. To guarantee fairness, we must wait a minimum amount of time 295 // process. To guarantee fairness, we must wait a minimum amount of time
309 // before preempting and we limit the amount of time that we can preempt in 296 // before preempting and we limit the amount of time that we can preempt in
310 // one shot (see constants above). 297 // one shot (see constants above).
311 // - it handles the GpuCommandBufferMsg_InsertSyncPoint message on the IO 298 // - it handles the GpuCommandBufferMsg_InsertSyncPoint message on the IO
312 // thread, generating the sync point ID and responding immediately, and then 299 // thread, generating the sync point ID and responding immediately, and then
313 // posting a task to insert the GpuCommandBufferMsg_RetireSyncPoint message 300 // posting a task to insert the GpuCommandBufferMsg_RetireSyncPoint message
314 // into the channel's queue. 301 // into the channel's queue.
315 // - it generates mailbox names for clients of the GPU process on the IO thread. 302 // - it generates mailbox names for clients of the GPU process on the IO thread.
316 class GpuChannelMessageFilter : public IPC::MessageFilter { 303 class GpuChannelMessageFilter : public IPC::MessageFilter {
317 public: 304 public:
318 GpuChannelMessageFilter( 305 GpuChannelMessageFilter(GpuChannelMessageQueue* message_queue,
319 scoped_refptr<GpuChannelMessageQueue> message_queue, 306 gpu::SyncPointManager* sync_point_manager,
320 gpu::SyncPointManager* sync_point_manager, 307 base::SingleThreadTaskRunner* task_runner,
321 scoped_refptr<base::SingleThreadTaskRunner> task_runner, 308 bool future_sync_points);
322 bool future_sync_points);
323 309
324 // IPC::MessageFilter implementation. 310 // IPC::MessageFilter implementation.
325 void OnFilterAdded(IPC::Sender* sender) override; 311 void OnFilterAdded(IPC::Sender* sender) override;
326 void OnFilterRemoved() override; 312 void OnFilterRemoved() override;
327 void OnChannelConnected(int32 peer_pid) override; 313 void OnChannelConnected(int32 peer_pid) override;
328 void OnChannelError() override; 314 void OnChannelError() override;
329 void OnChannelClosing() override; 315 void OnChannelClosing() override;
330 bool OnMessageReceived(const IPC::Message& message) override; 316 bool OnMessageReceived(const IPC::Message& message) override;
331 317
332 void AddChannelFilter(scoped_refptr<IPC::MessageFilter> filter); 318 void AddChannelFilter(scoped_refptr<IPC::MessageFilter> filter);
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
390 376
391 bool a_stub_is_descheduled_; 377 bool a_stub_is_descheduled_;
392 378
393 // True if this channel can create future sync points. 379 // True if this channel can create future sync points.
394 bool future_sync_points_; 380 bool future_sync_points_;
395 381
396 // This number is only ever incremented/read on the IO thread. 382 // This number is only ever incremented/read on the IO thread.
397 static uint32_t global_order_counter_; 383 static uint32_t global_order_counter_;
398 }; 384 };
399 385
386 struct GpuChannelMessage {
387 uint32_t order_number;
388 base::TimeTicks time_received;
389 IPC::Message message;
390
391 // TODO(dyen): Temporary sync point data, remove once new sync point lands.
392 bool retire_sync_point;
393 uint32 sync_point;
394
395 GpuChannelMessage(uint32_t order_num, const IPC::Message& msg)
396 : order_number(order_num),
397 time_received(base::TimeTicks::Now()),
398 message(msg),
399 retire_sync_point(false),
400 sync_point(0) {}
401 };
402
403 class GpuChannelMessageQueue
404 : public base::RefCountedThreadSafe<GpuChannelMessageQueue> {
405 public:
406 static scoped_refptr<GpuChannelMessageQueue> Create(
407 const base::WeakPtr<GpuChannel>& gpu_channel,
408 base::SingleThreadTaskRunner* task_runner);
409
410 // Returns the global order number for the last processed IPC message.
411 uint32_t GetUnprocessedOrderNum() const;
412
413 // Returns the global order number for the last unprocessed IPC message.
414 uint32_t processed_order_num() const { return processed_order_num_; }
415
416 // Returns the global order number for the next IPC message to be processed.
417 uint32_t current_order_num() const { return current_order_num_; }
418
419 bool HasQueuedMessages() const;
420
421 base::TimeTicks GetNextMessageTimeTick() const;
422
423 GpuChannelMessage* GetNextMessage() const;
424
425 // Should be called after a message returned by GetNextMessage is processed.
426 // Returns true if there are more messages on the queue.
427 bool MessageProcessed(uint32_t order_number);
428
429 void PushBackMessage(uint32_t order_number, const IPC::Message& message);
430
431 bool GenerateSyncPointMessage(gpu::SyncPointManager* sync_point_manager,
432 uint32_t order_number,
433 const IPC::Message& message,
434 bool retire_sync_point,
435 uint32_t* sync_point_number);
436
437 void DeleteAndDisableMessages(GpuChannelManager* gpu_channel_manager);
438
439 private:
440 friend class base::RefCountedThreadSafe<GpuChannelMessageQueue>;
441
442 GpuChannelMessageQueue(const base::WeakPtr<GpuChannel>& gpu_channel,
443 base::SingleThreadTaskRunner* task_runner);
444 ~GpuChannelMessageQueue();
445
446 void ScheduleHandleMessage();
447
448 void PushMessageHelper(scoped_ptr<GpuChannelMessage> msg);
449
450 bool HasQueuedMessagesHelper() const;
451
452 bool enabled_;
453
454 // Highest IPC order number seen, set when queued on the IO thread.
455 uint32_t unprocessed_order_num_;
456 // Both deques own the messages.
457 std::deque<GpuChannelMessage*> channel_messages_;
458 std::deque<GpuChannelMessage*> out_of_order_messages_;
459
460 // This lock protects enabled_, unprocessed_order_num_, and both deques.
461 mutable base::Lock channel_messages_lock_;
462
463 // Last finished IPC order number. Not protected by a lock as it's only
464 // accessed on the main thread.
465 uint32_t processed_order_num_;
466
467 // Next unprocessed IPC message order number. Not protected by a lock as it's
468 // only accessed on the main thread.
469 uint32_t current_order_num_;
piman 2015/09/11 00:38:33 This is not referenced anywhere anymore. Remove/re
sunnyps 2015/09/11 01:53:22 Done.
470
471 base::WeakPtr<GpuChannel> gpu_channel_;
472 scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
473
474 DISALLOW_COPY_AND_ASSIGN(GpuChannelMessageQueue);
475 };
476
400 } // namespace content 477 } // namespace content
401 478
402 #endif // CONTENT_COMMON_GPU_GPU_CHANNEL_H_ 479 #endif // CONTENT_COMMON_GPU_GPU_CHANNEL_H_
OLDNEW
« no previous file with comments | « no previous file | content/common/gpu/gpu_channel.cc » ('j') | content/common/gpu/gpu_channel.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698