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

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

Issue 1355643003: content/gpu: Remove separate queue for out-of-order messages. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@stub_scheduling
Patch Set: 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 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
173 uint32_t current_order_num() const { return current_order_num_; } 173 uint32_t current_order_num() const { return current_order_num_; }
174 174
175 // Returns the global order number for the last processed IPC message. 175 // Returns the global order number for the last processed IPC message.
176 uint32_t GetProcessedOrderNum() const; 176 uint32_t GetProcessedOrderNum() const;
177 177
178 // Returns the global order number for the last unprocessed IPC message. 178 // Returns the global order number for the last unprocessed IPC message.
179 uint32_t GetUnprocessedOrderNum() const; 179 uint32_t GetUnprocessedOrderNum() const;
180 180
181 void HandleMessage(); 181 void HandleMessage();
182 182
183 // Some messages such as WaitForGetOffsetInRange and WaitForTokenInRange are
184 // processed as soon as possible because the client is blocked until they
185 // are completed.
186 void HandleOutOfOrderMessage(const IPC::Message& msg);
187
183 protected: 188 protected:
184 // The message filter on the io thread. 189 // The message filter on the io thread.
185 scoped_refptr<GpuChannelMessageFilter> filter_; 190 scoped_refptr<GpuChannelMessageFilter> filter_;
186 191
187 // Map of routing id to command buffer stub. 192 // Map of routing id to command buffer stub.
188 base::ScopedPtrHashMap<int32, scoped_ptr<GpuCommandBufferStub>> stubs_; 193 base::ScopedPtrHashMap<int32, scoped_ptr<GpuCommandBufferStub>> stubs_;
189 194
190 private: 195 private:
191 class StreamState { 196 class StreamState {
192 public: 197 public:
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
295 // process. To guarantee fairness, we must wait a minimum amount of time 300 // process. To guarantee fairness, we must wait a minimum amount of time
296 // before preempting and we limit the amount of time that we can preempt in 301 // before preempting and we limit the amount of time that we can preempt in
297 // one shot (see constants above). 302 // one shot (see constants above).
298 // - it handles the GpuCommandBufferMsg_InsertSyncPoint message on the IO 303 // - it handles the GpuCommandBufferMsg_InsertSyncPoint message on the IO
299 // thread, generating the sync point ID and responding immediately, and then 304 // thread, generating the sync point ID and responding immediately, and then
300 // posting a task to insert the GpuCommandBufferMsg_RetireSyncPoint message 305 // posting a task to insert the GpuCommandBufferMsg_RetireSyncPoint message
301 // into the channel's queue. 306 // into the channel's queue.
302 // - it generates mailbox names for clients of the GPU process on the IO thread. 307 // - it generates mailbox names for clients of the GPU process on the IO thread.
303 class GpuChannelMessageFilter : public IPC::MessageFilter { 308 class GpuChannelMessageFilter : public IPC::MessageFilter {
304 public: 309 public:
305 GpuChannelMessageFilter(GpuChannelMessageQueue* message_queue, 310 GpuChannelMessageFilter(const base::WeakPtr<GpuChannel>& gpu_channel,
311 GpuChannelMessageQueue* message_queue,
306 gpu::SyncPointManager* sync_point_manager, 312 gpu::SyncPointManager* sync_point_manager,
307 base::SingleThreadTaskRunner* task_runner, 313 base::SingleThreadTaskRunner* task_runner,
308 bool future_sync_points); 314 bool future_sync_points);
309 315
310 // IPC::MessageFilter implementation. 316 // IPC::MessageFilter implementation.
311 void OnFilterAdded(IPC::Sender* sender) override; 317 void OnFilterAdded(IPC::Sender* sender) override;
312 void OnFilterRemoved() override; 318 void OnFilterRemoved() override;
313 void OnChannelConnected(int32 peer_pid) override; 319 void OnChannelConnected(int32 peer_pid) override;
314 void OnChannelError() override; 320 void OnChannelError() override;
315 void OnChannelClosing() override; 321 void OnChannelClosing() override;
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
355 void TransitionToChecking(); 361 void TransitionToChecking();
356 void TransitionToPreempting(); 362 void TransitionToPreempting();
357 void TransitionToWouldPreemptDescheduled(); 363 void TransitionToWouldPreemptDescheduled();
358 364
359 PreemptionState preemption_state_; 365 PreemptionState preemption_state_;
360 366
361 // Maximum amount of time that we can spend in PREEMPTING. 367 // Maximum amount of time that we can spend in PREEMPTING.
362 // It is reset when we transition to IDLE. 368 // It is reset when we transition to IDLE.
363 base::TimeDelta max_preemption_time_; 369 base::TimeDelta max_preemption_time_;
364 370
371 base::WeakPtr<GpuChannel> gpu_channel_;
365 // The message_queue_ is used to handle messages on the main thread. 372 // The message_queue_ is used to handle messages on the main thread.
366 scoped_refptr<GpuChannelMessageQueue> message_queue_; 373 scoped_refptr<GpuChannelMessageQueue> message_queue_;
367 IPC::Sender* sender_; 374 IPC::Sender* sender_;
368 base::ProcessId peer_pid_; 375 base::ProcessId peer_pid_;
369 gpu::SyncPointManager* sync_point_manager_; 376 gpu::SyncPointManager* sync_point_manager_;
370 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; 377 scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
371 scoped_refptr<gpu::PreemptionFlag> preempting_flag_; 378 scoped_refptr<gpu::PreemptionFlag> preempting_flag_;
372 std::vector<scoped_refptr<IPC::MessageFilter>> channel_filters_; 379 std::vector<scoped_refptr<IPC::MessageFilter>> channel_filters_;
373 380
374 // This timer is created and destroyed on the IO thread. 381 // This timer is created and destroyed on the IO thread.
375 scoped_ptr<base::OneShotTimer<GpuChannelMessageFilter>> timer_; 382 scoped_ptr<base::OneShotTimer<GpuChannelMessageFilter>> timer_;
376 383
377 bool a_stub_is_descheduled_; 384 bool a_stub_is_descheduled_;
378 385
379 // True if this channel can create future sync points. 386 // True if this channel can create future sync points.
380 bool future_sync_points_; 387 bool future_sync_points_;
381
382 // This number is only ever incremented/read on the IO thread.
383 static uint32_t global_order_counter_;
384 }; 388 };
385 389
386 struct GpuChannelMessage { 390 struct GpuChannelMessage {
387 uint32_t order_number; 391 uint32_t order_number;
388 base::TimeTicks time_received; 392 base::TimeTicks time_received;
389 IPC::Message message; 393 IPC::Message message;
390 394
391 // TODO(dyen): Temporary sync point data, remove once new sync point lands. 395 // TODO(dyen): Temporary sync point data, remove once new sync point lands.
392 bool retire_sync_point; 396 bool retire_sync_point;
393 uint32 sync_point; 397 uint32 sync_point;
394 398
395 GpuChannelMessage(uint32_t order_num, const IPC::Message& msg) 399 GpuChannelMessage(const IPC::Message& msg)
396 : order_number(order_num), 400 : order_number(0),
397 time_received(base::TimeTicks::Now()), 401 time_received(base::TimeTicks()),
398 message(msg), 402 message(msg),
399 retire_sync_point(false), 403 retire_sync_point(false),
400 sync_point(0) {} 404 sync_point(0) {}
401 405
402 private: 406 private:
403 DISALLOW_COPY_AND_ASSIGN(GpuChannelMessage); 407 DISALLOW_COPY_AND_ASSIGN(GpuChannelMessage);
404 }; 408 };
405 409
406 class GpuChannelMessageQueue 410 class GpuChannelMessageQueue
407 : public base::RefCountedThreadSafe<GpuChannelMessageQueue> { 411 : public base::RefCountedThreadSafe<GpuChannelMessageQueue> {
408 public: 412 public:
409 static scoped_refptr<GpuChannelMessageQueue> Create( 413 static scoped_refptr<GpuChannelMessageQueue> Create(
410 const base::WeakPtr<GpuChannel>& gpu_channel, 414 const base::WeakPtr<GpuChannel>& gpu_channel,
411 base::SingleThreadTaskRunner* task_runner); 415 base::SingleThreadTaskRunner* task_runner);
412 416
413 // Returns the global order number for the last processed IPC message. 417 // Returns the global order number for the last processed IPC message.
414 uint32_t GetUnprocessedOrderNum() const; 418 uint32_t GetUnprocessedOrderNum() const;
415 419
416 // Returns the global order number for the last unprocessed IPC message. 420 // Returns the global order number for the last unprocessed IPC message.
417 uint32_t processed_order_num() const { return processed_order_num_; } 421 uint32_t processed_order_num() const { return processed_order_num_; }
418 422
419 bool HasQueuedMessages() const; 423 bool HasQueuedMessages() const;
420 424
421 base::TimeTicks GetNextMessageTimeTick() const; 425 base::TimeTicks GetNextMessageTimeTick() const;
422 426
423 GpuChannelMessage* GetNextMessage() const; 427 GpuChannelMessage* GetNextMessage() const;
424 428
425 // Should be called after a message returned by GetNextMessage is processed. 429 // Should be called after a message returned by GetNextMessage is processed.
426 // Returns true if there are more messages on the queue. 430 // Returns true if there are more messages on the queue.
427 bool MessageProcessed(uint32_t order_number); 431 bool MessageProcessed();
428 432
429 void PushBackMessage(uint32_t order_number, const IPC::Message& message); 433 void PushBackMessage(const IPC::Message& message);
430 434
431 bool GenerateSyncPointMessage(gpu::SyncPointManager* sync_point_manager, 435 bool GenerateSyncPointMessage(gpu::SyncPointManager* sync_point_manager,
432 uint32_t order_number,
433 const IPC::Message& message, 436 const IPC::Message& message,
434 bool retire_sync_point, 437 bool retire_sync_point,
435 uint32_t* sync_point_number); 438 uint32_t* sync_point_number);
436 439
437 void DeleteAndDisableMessages(GpuChannelManager* gpu_channel_manager); 440 void DeleteAndDisableMessages(GpuChannelManager* gpu_channel_manager);
438 441
439 private: 442 private:
440 friend class base::RefCountedThreadSafe<GpuChannelMessageQueue>; 443 friend class base::RefCountedThreadSafe<GpuChannelMessageQueue>;
441 444
442 GpuChannelMessageQueue(const base::WeakPtr<GpuChannel>& gpu_channel, 445 GpuChannelMessageQueue(const base::WeakPtr<GpuChannel>& gpu_channel,
443 base::SingleThreadTaskRunner* task_runner); 446 base::SingleThreadTaskRunner* task_runner);
444 ~GpuChannelMessageQueue(); 447 ~GpuChannelMessageQueue();
445 448
446 void ScheduleHandleMessage(); 449 void ScheduleHandleMessage();
447 450
448 void PushMessageHelper(scoped_ptr<GpuChannelMessage> msg); 451 void PushMessageHelper(scoped_ptr<GpuChannelMessage> msg);
449 452
450 bool HasQueuedMessagesHelper() const; 453 // This number is only ever incremented/read on the IO thread.
454 static uint32_t global_order_counter_;
451 455
452 bool enabled_; 456 bool enabled_;
453 457
454 // Highest IPC order number seen, set when queued on the IO thread. 458 // Highest IPC order number seen, set when queued on the IO thread.
455 uint32_t unprocessed_order_num_; 459 uint32_t unprocessed_order_num_;
456 // Both deques own the messages. 460 // Both deques own the messages.
457 std::deque<GpuChannelMessage*> channel_messages_; 461 std::deque<GpuChannelMessage*> channel_messages_;
458 std::deque<GpuChannelMessage*> out_of_order_messages_;
459 462
460 // This lock protects enabled_, unprocessed_order_num_, and both deques. 463 // This lock protects enabled_, unprocessed_order_num_, and channel_messages_.
461 mutable base::Lock channel_messages_lock_; 464 mutable base::Lock channel_messages_lock_;
462 465
463 // Last finished IPC order number. Not protected by a lock as it's only 466 // Last finished IPC order number. Not protected by a lock as it's only
464 // accessed on the main thread. 467 // accessed on the main thread.
465 uint32_t processed_order_num_; 468 uint32_t processed_order_num_;
466 469
467 base::WeakPtr<GpuChannel> gpu_channel_; 470 base::WeakPtr<GpuChannel> gpu_channel_;
468 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; 471 scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
469 472
470 DISALLOW_COPY_AND_ASSIGN(GpuChannelMessageQueue); 473 DISALLOW_COPY_AND_ASSIGN(GpuChannelMessageQueue);
471 }; 474 };
472 475
473 } // namespace content 476 } // namespace content
474 477
475 #endif // CONTENT_COMMON_GPU_GPU_CHANNEL_H_ 478 #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