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

Side by Side Diff: gpu/ipc/service/gpu_channel.cc

Issue 2752393002: gpu: Add SequenceId for identifying sync point sequences. (Closed)
Patch Set: fix failing tests Created 3 years, 9 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
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 #include "gpu/ipc/service/gpu_channel.h" 5 #include "gpu/ipc/service/gpu_channel.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #if defined(OS_WIN) 9 #if defined(OS_WIN)
10 #include <windows.h> 10 #include <windows.h>
(...skipping 16 matching lines...) Expand all
27 #include "base/threading/thread_task_runner_handle.h" 27 #include "base/threading/thread_task_runner_handle.h"
28 #include "base/timer/timer.h" 28 #include "base/timer/timer.h"
29 #include "base/trace_event/memory_dump_manager.h" 29 #include "base/trace_event/memory_dump_manager.h"
30 #include "base/trace_event/process_memory_dump.h" 30 #include "base/trace_event/process_memory_dump.h"
31 #include "base/trace_event/trace_event.h" 31 #include "base/trace_event/trace_event.h"
32 #include "build/build_config.h" 32 #include "build/build_config.h"
33 #include "gpu/command_buffer/common/mailbox.h" 33 #include "gpu/command_buffer/common/mailbox.h"
34 #include "gpu/command_buffer/service/command_executor.h" 34 #include "gpu/command_buffer/service/command_executor.h"
35 #include "gpu/command_buffer/service/image_factory.h" 35 #include "gpu/command_buffer/service/image_factory.h"
36 #include "gpu/command_buffer/service/mailbox_manager.h" 36 #include "gpu/command_buffer/service/mailbox_manager.h"
37 #include "gpu/command_buffer/service/sync_point_manager.h"
38 #include "gpu/ipc/common/gpu_messages.h" 37 #include "gpu/ipc/common/gpu_messages.h"
39 #include "gpu/ipc/service/gpu_channel_manager.h" 38 #include "gpu/ipc/service/gpu_channel_manager.h"
40 #include "gpu/ipc/service/gpu_channel_manager_delegate.h" 39 #include "gpu/ipc/service/gpu_channel_manager_delegate.h"
41 #include "gpu/ipc/service/gpu_memory_buffer_factory.h" 40 #include "gpu/ipc/service/gpu_memory_buffer_factory.h"
42 #include "ipc/ipc_channel.h" 41 #include "ipc/ipc_channel.h"
43 #include "ipc/message_filter.h" 42 #include "ipc/message_filter.h"
44 #include "ui/gl/gl_context.h" 43 #include "ui/gl/gl_context.h"
45 #include "ui/gl/gl_image_shared_memory.h" 44 #include "ui/gl/gl_image_shared_memory.h"
46 #include "ui/gl/gl_surface.h" 45 #include "ui/gl/gl_surface.h"
47 46
(...skipping 10 matching lines...) Expand all
58 const int64_t kPreemptWaitTimeMs = 2 * kVsyncIntervalMs; 57 const int64_t kPreemptWaitTimeMs = 2 * kVsyncIntervalMs;
59 58
60 // Once we trigger a preemption, the maximum duration that we will wait 59 // Once we trigger a preemption, the maximum duration that we will wait
61 // before clearing the preemption. 60 // before clearing the preemption.
62 const int64_t kMaxPreemptTimeMs = kVsyncIntervalMs; 61 const int64_t kMaxPreemptTimeMs = kVsyncIntervalMs;
63 62
64 // Stop the preemption once the time for the longest pending IPC drops 63 // Stop the preemption once the time for the longest pending IPC drops
65 // below this threshold. 64 // below this threshold.
66 const int64_t kStopPreemptThresholdMs = kVsyncIntervalMs; 65 const int64_t kStopPreemptThresholdMs = kVsyncIntervalMs;
67 66
67 CommandBufferId GenerateCommandBufferId(int channel_id, int32_t route_id) {
68 return CommandBufferId::FromUnsafeValue(
69 (static_cast<uint64_t>(channel_id) << 32) | route_id);
70 }
71
68 } // anonymous namespace 72 } // anonymous namespace
69 73
70 scoped_refptr<GpuChannelMessageQueue> GpuChannelMessageQueue::Create( 74 scoped_refptr<GpuChannelMessageQueue> GpuChannelMessageQueue::Create(
71 int32_t stream_id,
72 GpuStreamPriority stream_priority,
73 GpuChannel* channel, 75 GpuChannel* channel,
74 const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner, 76 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
75 const scoped_refptr<PreemptionFlag>& preempting_flag, 77 scoped_refptr<PreemptionFlag> preempting_flag,
76 const scoped_refptr<PreemptionFlag>& preempted_flag, 78 scoped_refptr<PreemptionFlag> preempted_flag,
77 SyncPointManager* sync_point_manager) { 79 SyncPointManager* sync_point_manager) {
78 return new GpuChannelMessageQueue(stream_id, stream_priority, channel, 80 return new GpuChannelMessageQueue(
79 io_task_runner, preempting_flag, 81 channel, std::move(io_task_runner), std::move(preempting_flag),
80 preempted_flag, sync_point_manager); 82 std::move(preempted_flag), sync_point_manager);
81 }
82
83 scoped_refptr<SyncPointOrderData>
84 GpuChannelMessageQueue::GetSyncPointOrderData() {
85 return sync_point_order_data_;
86 } 83 }
87 84
88 GpuChannelMessageQueue::GpuChannelMessageQueue( 85 GpuChannelMessageQueue::GpuChannelMessageQueue(
89 int32_t stream_id,
90 GpuStreamPriority stream_priority,
91 GpuChannel* channel, 86 GpuChannel* channel,
92 const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner, 87 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
93 const scoped_refptr<PreemptionFlag>& preempting_flag, 88 scoped_refptr<PreemptionFlag> preempting_flag,
94 const scoped_refptr<PreemptionFlag>& preempted_flag, 89 scoped_refptr<PreemptionFlag> preempted_flag,
95 SyncPointManager* sync_point_manager) 90 SyncPointManager* sync_point_manager)
96 : stream_id_(stream_id), 91 : enabled_(true),
97 stream_priority_(stream_priority),
98 enabled_(true),
99 scheduled_(true), 92 scheduled_(true),
100 channel_(channel), 93 channel_(channel),
101 preemption_state_(IDLE), 94 preemption_state_(IDLE),
102 max_preemption_time_( 95 max_preemption_time_(
103 base::TimeDelta::FromMilliseconds(kMaxPreemptTimeMs)), 96 base::TimeDelta::FromMilliseconds(kMaxPreemptTimeMs)),
104 timer_(new base::OneShotTimer), 97 timer_(new base::OneShotTimer),
105 sync_point_order_data_(SyncPointOrderData::Create()), 98 sync_point_order_data_(sync_point_manager->CreateSyncPointOrderData()),
106 io_task_runner_(io_task_runner), 99 io_task_runner_(std::move(io_task_runner)),
107 preempting_flag_(preempting_flag), 100 preempting_flag_(std::move(preempting_flag)),
108 preempted_flag_(preempted_flag), 101 preempted_flag_(std::move(preempted_flag)),
109 sync_point_manager_(sync_point_manager) { 102 sync_point_manager_(sync_point_manager) {
110 timer_->SetTaskRunner(io_task_runner); 103 timer_->SetTaskRunner(io_task_runner_);
111 io_thread_checker_.DetachFromThread(); 104 io_thread_checker_.DetachFromThread();
112 } 105 }
113 106
114 GpuChannelMessageQueue::~GpuChannelMessageQueue() { 107 GpuChannelMessageQueue::~GpuChannelMessageQueue() {
115 DCHECK(!enabled_); 108 DCHECK(!enabled_);
116 DCHECK(channel_messages_.empty()); 109 DCHECK(channel_messages_.empty());
117 } 110 }
118 111
119 void GpuChannelMessageQueue::Disable() { 112 void GpuChannelMessageQueue::Disable() {
120 { 113 {
121 base::AutoLock auto_lock(channel_lock_); 114 base::AutoLock auto_lock(channel_lock_);
122 DCHECK(enabled_); 115 DCHECK(enabled_);
123 enabled_ = false; 116 enabled_ = false;
124 } 117 }
125 118
126 // We guarantee that the queues will no longer be modified after enabled_ 119 // We guarantee that the queues will no longer be modified after enabled_
127 // is set to false, it is now safe to modify the queue without the lock. 120 // is set to false, it is now safe to modify the queue without the lock.
128 // All public facing modifying functions check enabled_ while all 121 // All public facing modifying functions check enabled_ while all
129 // private modifying functions DCHECK(enabled_) to enforce this. 122 // private modifying functions DCHECK(enabled_) to enforce this.
130 while (!channel_messages_.empty()) { 123 while (!channel_messages_.empty()) {
131 const IPC::Message& msg = channel_messages_.front()->message; 124 const IPC::Message& msg = channel_messages_.front()->message;
132 if (msg.is_sync()) { 125 if (msg.is_sync()) {
133 IPC::Message* reply = IPC::SyncMessage::GenerateReply(&msg); 126 IPC::Message* reply = IPC::SyncMessage::GenerateReply(&msg);
134 reply->set_reply_error(); 127 reply->set_reply_error();
135 channel_->Send(reply); 128 channel_->Send(reply);
136 } 129 }
137 channel_messages_.pop_front(); 130 channel_messages_.pop_front();
138 } 131 }
139 132
140 sync_point_order_data_->Destroy(); 133 if (sync_point_order_data_) {
141 sync_point_order_data_ = nullptr; 134 sync_point_order_data_->Destroy();
135 sync_point_order_data_ = nullptr;
136 }
142 137
143 io_task_runner_->PostTask( 138 io_task_runner_->PostTask(
144 FROM_HERE, base::Bind(&GpuChannelMessageQueue::DisableIO, this)); 139 FROM_HERE, base::Bind(&GpuChannelMessageQueue::DisableIO, this));
145 } 140 }
146 141
147 void GpuChannelMessageQueue::DisableIO() { 142 void GpuChannelMessageQueue::DisableIO() {
148 DCHECK(io_thread_checker_.CalledOnValidThread()); 143 DCHECK(io_thread_checker_.CalledOnValidThread());
149 timer_ = nullptr; 144 timer_ = nullptr;
150 } 145 }
151 146
152 bool GpuChannelMessageQueue::IsScheduled() const { 147 bool GpuChannelMessageQueue::IsScheduled() const {
153 base::AutoLock lock(channel_lock_); 148 base::AutoLock lock(channel_lock_);
154 return scheduled_; 149 return scheduled_;
155 } 150 }
156 151
157 void GpuChannelMessageQueue::OnRescheduled(bool scheduled) { 152 void GpuChannelMessageQueue::SetScheduled(bool scheduled) {
158 base::AutoLock lock(channel_lock_); 153 base::AutoLock lock(channel_lock_);
159 DCHECK(enabled_); 154 DCHECK(enabled_);
160 if (scheduled_ == scheduled) 155 if (scheduled_ == scheduled)
161 return; 156 return;
162 scheduled_ = scheduled; 157 scheduled_ = scheduled;
163 if (scheduled) 158 if (scheduled)
164 channel_->PostHandleMessage(this); 159 channel_->PostHandleMessage();
165 if (preempting_flag_) { 160 if (preempting_flag_) {
166 io_task_runner_->PostTask( 161 io_task_runner_->PostTask(
167 FROM_HERE, 162 FROM_HERE,
168 base::Bind(&GpuChannelMessageQueue::UpdatePreemptionState, this)); 163 base::Bind(&GpuChannelMessageQueue::UpdatePreemptionState, this));
169 } 164 }
170 } 165 }
171 166
172 uint32_t GpuChannelMessageQueue::GetUnprocessedOrderNum() const {
173 return sync_point_order_data_->unprocessed_order_num();
174 }
175
176 uint32_t GpuChannelMessageQueue::GetProcessedOrderNum() const {
177 return sync_point_order_data_->processed_order_num();
178 }
179
180 bool GpuChannelMessageQueue::PushBackMessage(const IPC::Message& message) { 167 bool GpuChannelMessageQueue::PushBackMessage(const IPC::Message& message) {
181 base::AutoLock auto_lock(channel_lock_); 168 base::AutoLock auto_lock(channel_lock_);
182 if (enabled_) { 169 if (enabled_) {
183 if (message.type() == GpuCommandBufferMsg_WaitForTokenInRange::ID || 170 if (message.type() == GpuCommandBufferMsg_WaitForTokenInRange::ID ||
184 message.type() == GpuCommandBufferMsg_WaitForGetOffsetInRange::ID) { 171 message.type() == GpuCommandBufferMsg_WaitForGetOffsetInRange::ID) {
185 channel_->PostHandleOutOfOrderMessage(message); 172 channel_->PostHandleOutOfOrderMessage(message);
186 return true; 173 return true;
187 } 174 }
188 175
189 uint32_t order_num = sync_point_order_data_->GenerateUnprocessedOrderNumber( 176 uint32_t order_num =
190 sync_point_manager_); 177 sync_point_order_data_->GenerateUnprocessedOrderNumber();
191 std::unique_ptr<GpuChannelMessage> msg( 178 std::unique_ptr<GpuChannelMessage> msg(
192 new GpuChannelMessage(message, order_num, base::TimeTicks::Now())); 179 new GpuChannelMessage(message, order_num, base::TimeTicks::Now()));
193 180
194 if (channel_messages_.empty()) { 181 if (channel_messages_.empty()) {
195 DCHECK(scheduled_); 182 DCHECK(scheduled_);
196 channel_->PostHandleMessage(this); 183 channel_->PostHandleMessage();
197 } 184 }
198 185
199 channel_messages_.push_back(std::move(msg)); 186 channel_messages_.push_back(std::move(msg));
200 187
201 if (preempting_flag_) 188 if (preempting_flag_)
202 UpdatePreemptionStateHelper(); 189 UpdatePreemptionStateHelper();
203 190
204 return true; 191 return true;
205 } 192 }
206 return false; 193 return false;
207 } 194 }
208 195
209 const GpuChannelMessage* GpuChannelMessageQueue::BeginMessageProcessing() { 196 const GpuChannelMessage* GpuChannelMessageQueue::BeginMessageProcessing() {
210 base::AutoLock auto_lock(channel_lock_); 197 base::AutoLock auto_lock(channel_lock_);
211 DCHECK(enabled_); 198 DCHECK(enabled_);
212 // If we have been preempted by another channel, just post a task to wake up. 199 // If we have been preempted by another channel, just post a task to wake up.
213 if (preempted_flag_ && preempted_flag_->IsSet()) { 200 if (preempted_flag_ && preempted_flag_->IsSet()) {
214 channel_->PostHandleMessage(this); 201 channel_->PostHandleMessage();
215 return nullptr; 202 return nullptr;
216 } 203 }
217 if (channel_messages_.empty()) 204 if (channel_messages_.empty())
218 return nullptr; 205 return nullptr;
219 sync_point_order_data_->BeginProcessingOrderNumber( 206 sync_point_order_data_->BeginProcessingOrderNumber(
220 channel_messages_.front()->order_number); 207 channel_messages_.front()->order_number);
221 return channel_messages_.front().get(); 208 return channel_messages_.front().get();
222 } 209 }
223 210
224 void GpuChannelMessageQueue::PauseMessageProcessing() { 211 void GpuChannelMessageQueue::PauseMessageProcessing() {
225 base::AutoLock auto_lock(channel_lock_); 212 base::AutoLock auto_lock(channel_lock_);
226 DCHECK(!channel_messages_.empty()); 213 DCHECK(!channel_messages_.empty());
227 214
228 // If we have been preempted by another channel, just post a task to wake up. 215 // If we have been preempted by another channel, just post a task to wake up.
229 if (scheduled_) 216 if (scheduled_)
230 channel_->PostHandleMessage(this); 217 channel_->PostHandleMessage();
231 218
232 sync_point_order_data_->PauseProcessingOrderNumber( 219 sync_point_order_data_->PauseProcessingOrderNumber(
233 channel_messages_.front()->order_number); 220 channel_messages_.front()->order_number);
234 } 221 }
235 222
236 void GpuChannelMessageQueue::FinishMessageProcessing() { 223 void GpuChannelMessageQueue::FinishMessageProcessing() {
237 base::AutoLock auto_lock(channel_lock_); 224 base::AutoLock auto_lock(channel_lock_);
238 DCHECK(!channel_messages_.empty()); 225 DCHECK(!channel_messages_.empty());
239 DCHECK(scheduled_); 226 DCHECK(scheduled_);
240 227
241 sync_point_order_data_->FinishProcessingOrderNumber( 228 sync_point_order_data_->FinishProcessingOrderNumber(
242 channel_messages_.front()->order_number); 229 channel_messages_.front()->order_number);
243 channel_messages_.pop_front(); 230 channel_messages_.pop_front();
244 231
245 if (!channel_messages_.empty()) 232 if (!channel_messages_.empty())
246 channel_->PostHandleMessage(this); 233 channel_->PostHandleMessage();
247 234
248 if (preempting_flag_) { 235 if (preempting_flag_) {
249 io_task_runner_->PostTask( 236 io_task_runner_->PostTask(
250 FROM_HERE, 237 FROM_HERE,
251 base::Bind(&GpuChannelMessageQueue::UpdatePreemptionState, this)); 238 base::Bind(&GpuChannelMessageQueue::UpdatePreemptionState, this));
252 } 239 }
253 } 240 }
254 241
255 void GpuChannelMessageQueue::UpdatePreemptionState() { 242 void GpuChannelMessageQueue::UpdatePreemptionState() {
256 DCHECK(io_thread_checker_.CalledOnValidThread()); 243 DCHECK(io_thread_checker_.CalledOnValidThread());
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
436 DCHECK(preempting_flag_); 423 DCHECK(preempting_flag_);
437 channel_lock_.AssertAcquired(); 424 channel_lock_.AssertAcquired();
438 DCHECK(preemption_state_ == CHECKING || preemption_state_ == PREEMPTING); 425 DCHECK(preemption_state_ == CHECKING || preemption_state_ == PREEMPTING);
439 DCHECK(!scheduled_); 426 DCHECK(!scheduled_);
440 427
441 preemption_state_ = WOULD_PREEMPT_DESCHEDULED; 428 preemption_state_ = WOULD_PREEMPT_DESCHEDULED;
442 preempting_flag_->Reset(); 429 preempting_flag_->Reset();
443 TRACE_COUNTER_ID1("gpu", "GpuChannel::Preempting", this, 0); 430 TRACE_COUNTER_ID1("gpu", "GpuChannel::Preempting", this, 0);
444 } 431 }
445 432
446 GpuChannelMessageFilter::GpuChannelMessageFilter() 433 GpuChannelMessageFilter::GpuChannelMessageFilter(
447 : channel_(nullptr), peer_pid_(base::kNullProcessId) {} 434 scoped_refptr<GpuChannelMessageQueue> message_queue)
435 : message_queue_(std::move(message_queue)),
436 channel_(nullptr),
437 peer_pid_(base::kNullProcessId) {}
448 438
449 GpuChannelMessageFilter::~GpuChannelMessageFilter() {} 439 GpuChannelMessageFilter::~GpuChannelMessageFilter() {}
450 440
451 void GpuChannelMessageFilter::OnFilterAdded(IPC::Channel* channel) { 441 void GpuChannelMessageFilter::OnFilterAdded(IPC::Channel* channel) {
452 DCHECK(!channel_); 442 DCHECK(!channel_);
453 channel_ = channel; 443 channel_ = channel;
454 for (scoped_refptr<IPC::MessageFilter>& filter : channel_filters_) { 444 for (scoped_refptr<IPC::MessageFilter>& filter : channel_filters_) {
455 filter->OnFilterAdded(channel_); 445 filter->OnFilterAdded(channel_);
456 } 446 }
457 } 447 }
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
494 } 484 }
495 485
496 void GpuChannelMessageFilter::RemoveChannelFilter( 486 void GpuChannelMessageFilter::RemoveChannelFilter(
497 scoped_refptr<IPC::MessageFilter> filter) { 487 scoped_refptr<IPC::MessageFilter> filter) {
498 if (channel_) 488 if (channel_)
499 filter->OnFilterRemoved(); 489 filter->OnFilterRemoved();
500 channel_filters_.erase( 490 channel_filters_.erase(
501 std::find(channel_filters_.begin(), channel_filters_.end(), filter)); 491 std::find(channel_filters_.begin(), channel_filters_.end(), filter));
502 } 492 }
503 493
504 // This gets called from the main thread and assumes that all messages which
505 // lead to creation of a new route are synchronous messages.
506 // TODO(sunnyps): Create routes (and streams) on the IO thread so that we can
507 // make the CreateCommandBuffer/VideoDecoder/VideoEncoder messages asynchronous.
508 void GpuChannelMessageFilter::AddRoute(
509 int32_t route_id,
510 const scoped_refptr<GpuChannelMessageQueue>& queue) {
511 base::AutoLock lock(routes_lock_);
512 routes_.insert(std::make_pair(route_id, queue));
513 }
514
515 void GpuChannelMessageFilter::RemoveRoute(int32_t route_id) {
516 base::AutoLock lock(routes_lock_);
517 routes_.erase(route_id);
518 }
519
520 bool GpuChannelMessageFilter::OnMessageReceived(const IPC::Message& message) { 494 bool GpuChannelMessageFilter::OnMessageReceived(const IPC::Message& message) {
521 DCHECK(channel_); 495 DCHECK(channel_);
522 496
523 if (message.should_unblock() || message.is_reply()) 497 if (message.should_unblock() || message.is_reply())
524 return MessageErrorHandler(message, "Unexpected message type"); 498 return MessageErrorHandler(message, "Unexpected message type");
525 499
526 if (message.type() == GpuChannelMsg_Nop::ID) { 500 if (message.type() == GpuChannelMsg_Nop::ID) {
527 IPC::Message* reply = IPC::SyncMessage::GenerateReply(&message); 501 IPC::Message* reply = IPC::SyncMessage::GenerateReply(&message);
528 Send(reply); 502 Send(reply);
529 return true; 503 return true;
530 } 504 }
531 505
532 for (scoped_refptr<IPC::MessageFilter>& filter : channel_filters_) { 506 for (scoped_refptr<IPC::MessageFilter>& filter : channel_filters_) {
533 if (filter->OnMessageReceived(message)) 507 if (filter->OnMessageReceived(message))
534 return true; 508 return true;
535 } 509 }
536 510
537 scoped_refptr<GpuChannelMessageQueue> message_queue = 511 if (!message_queue_->PushBackMessage(message))
538 LookupStreamByRoute(message.routing_id());
539
540 if (!message_queue)
541 return MessageErrorHandler(message, "Could not find message queue");
542
543 if (!message_queue->PushBackMessage(message))
544 return MessageErrorHandler(message, "Channel destroyed"); 512 return MessageErrorHandler(message, "Channel destroyed");
545 513
546 return true; 514 return true;
547 } 515 }
548 516
549 bool GpuChannelMessageFilter::Send(IPC::Message* message) { 517 bool GpuChannelMessageFilter::Send(IPC::Message* message) {
550 return channel_->Send(message); 518 return channel_->Send(message);
551 } 519 }
552 520
553 scoped_refptr<GpuChannelMessageQueue>
554 GpuChannelMessageFilter::LookupStreamByRoute(int32_t route_id) {
555 base::AutoLock lock(routes_lock_);
556 auto it = routes_.find(route_id);
557 if (it != routes_.end())
558 return it->second;
559 return nullptr;
560 }
561
562 bool GpuChannelMessageFilter::MessageErrorHandler(const IPC::Message& message, 521 bool GpuChannelMessageFilter::MessageErrorHandler(const IPC::Message& message,
563 const char* error_msg) { 522 const char* error_msg) {
564 DLOG(ERROR) << error_msg; 523 DLOG(ERROR) << error_msg;
565 if (message.is_sync()) { 524 if (message.is_sync()) {
566 IPC::Message* reply = IPC::SyncMessage::GenerateReply(&message); 525 IPC::Message* reply = IPC::SyncMessage::GenerateReply(&message);
567 reply->set_reply_error(); 526 reply->set_reply_error();
568 Send(reply); 527 Send(reply);
569 } 528 }
570 return true; 529 return true;
571 } 530 }
(...skipping 28 matching lines...) Expand all
600 io_task_runner_(io_task_runner), 559 io_task_runner_(io_task_runner),
601 share_group_(share_group), 560 share_group_(share_group),
602 mailbox_manager_(mailbox), 561 mailbox_manager_(mailbox),
603 watchdog_(watchdog), 562 watchdog_(watchdog),
604 allow_view_command_buffers_(allow_view_command_buffers), 563 allow_view_command_buffers_(allow_view_command_buffers),
605 allow_real_time_streams_(allow_real_time_streams), 564 allow_real_time_streams_(allow_real_time_streams),
606 weak_factory_(this) { 565 weak_factory_(this) {
607 DCHECK(gpu_channel_manager); 566 DCHECK(gpu_channel_manager);
608 DCHECK(client_id); 567 DCHECK(client_id);
609 568
610 filter_ = new GpuChannelMessageFilter(); 569 message_queue_ =
570 GpuChannelMessageQueue::Create(this, io_task_runner, preempting_flag,
571 preempted_flag, sync_point_manager);
611 572
612 scoped_refptr<GpuChannelMessageQueue> control_queue = 573 filter_ = new GpuChannelMessageFilter(message_queue_);
613 CreateStream(GPU_STREAM_DEFAULT, GpuStreamPriority::HIGH);
614 AddRouteToStream(MSG_ROUTING_CONTROL, GPU_STREAM_DEFAULT);
615 } 574 }
616 575
617 GpuChannel::~GpuChannel() { 576 GpuChannel::~GpuChannel() {
618 // Clear stubs first because of dependencies. 577 // Clear stubs first because of dependencies.
619 stubs_.clear(); 578 stubs_.clear();
620 579
621 for (auto& kv : streams_) 580 message_queue_->Disable();
622 kv.second->Disable();
623 581
624 if (preempting_flag_.get()) 582 if (preempting_flag_.get())
625 preempting_flag_->Reset(); 583 preempting_flag_->Reset();
626 } 584 }
627 585
628 IPC::ChannelHandle GpuChannel::Init(base::WaitableEvent* shutdown_event) { 586 IPC::ChannelHandle GpuChannel::Init(base::WaitableEvent* shutdown_event) {
629 DCHECK(shutdown_event); 587 DCHECK(shutdown_event);
630 DCHECK(!channel_); 588 DCHECK(!channel_);
631 589
632 mojo::MessagePipe pipe; 590 mojo::MessagePipe pipe;
(...skipping 12 matching lines...) Expand all
645 603
646 base::WeakPtr<GpuChannel> GpuChannel::AsWeakPtr() { 604 base::WeakPtr<GpuChannel> GpuChannel::AsWeakPtr() {
647 return weak_factory_.GetWeakPtr(); 605 return weak_factory_.GetWeakPtr();
648 } 606 }
649 607
650 base::ProcessId GpuChannel::GetClientPID() const { 608 base::ProcessId GpuChannel::GetClientPID() const {
651 DCHECK_NE(peer_pid_, base::kNullProcessId); 609 DCHECK_NE(peer_pid_, base::kNullProcessId);
652 return peer_pid_; 610 return peer_pid_;
653 } 611 }
654 612
655 uint32_t GpuChannel::GetProcessedOrderNum() const {
656 uint32_t processed_order_num = 0;
657 for (auto& kv : streams_) {
658 processed_order_num =
659 std::max(processed_order_num, kv.second->GetProcessedOrderNum());
660 }
661 return processed_order_num;
662 }
663
664 uint32_t GpuChannel::GetUnprocessedOrderNum() const {
665 uint32_t unprocessed_order_num = 0;
666 for (auto& kv : streams_) {
667 unprocessed_order_num =
668 std::max(unprocessed_order_num, kv.second->GetUnprocessedOrderNum());
669 }
670 return unprocessed_order_num;
671 }
672
673 bool GpuChannel::OnMessageReceived(const IPC::Message& msg) { 613 bool GpuChannel::OnMessageReceived(const IPC::Message& msg) {
674 // All messages should be pushed to channel_messages_ and handled separately. 614 // All messages should be pushed to channel_messages_ and handled separately.
675 NOTREACHED(); 615 NOTREACHED();
676 return false; 616 return false;
677 } 617 }
678 618
679 void GpuChannel::OnChannelConnected(int32_t peer_pid) { 619 void GpuChannel::OnChannelConnected(int32_t peer_pid) {
680 peer_pid_ = peer_pid; 620 peer_pid_ = peer_pid;
681 } 621 }
682 622
(...skipping 10 matching lines...) Expand all
693 << " with type " << message->type(); 633 << " with type " << message->type();
694 634
695 if (!channel_) { 635 if (!channel_) {
696 delete message; 636 delete message;
697 return false; 637 return false;
698 } 638 }
699 639
700 return channel_->Send(message); 640 return channel_->Send(message);
701 } 641 }
702 642
703 void GpuChannel::OnStreamRescheduled(int32_t stream_id, bool scheduled) { 643 void GpuChannel::OnCommandBufferScheduled(GpuCommandBufferStub* stub) {
704 scoped_refptr<GpuChannelMessageQueue> queue = LookupStream(stream_id); 644 message_queue_->SetScheduled(true);
705 DCHECK(queue); 645 // TODO(sunnyps): Enable gpu scheduler task queue for stub's sequence.
706 queue->OnRescheduled(scheduled); 646 }
647
648 void GpuChannel::OnCommandBufferDescheduled(GpuCommandBufferStub* stub) {
649 message_queue_->SetScheduled(false);
650 // TODO(sunnyps): Disable gpu scheduler task queue for stub's sequence.
707 } 651 }
708 652
709 GpuCommandBufferStub* GpuChannel::LookupCommandBuffer(int32_t route_id) { 653 GpuCommandBufferStub* GpuChannel::LookupCommandBuffer(int32_t route_id) {
710 auto it = stubs_.find(route_id); 654 auto it = stubs_.find(route_id);
711 if (it == stubs_.end()) 655 if (it == stubs_.end())
712 return nullptr; 656 return nullptr;
713 657
714 return it->second.get(); 658 return it->second.get();
715 } 659 }
716 660
717 void GpuChannel::LoseAllContexts() { 661 void GpuChannel::LoseAllContexts() {
718 gpu_channel_manager_->LoseAllContexts(); 662 gpu_channel_manager_->LoseAllContexts();
719 } 663 }
720 664
721 void GpuChannel::MarkAllContextsLost() { 665 void GpuChannel::MarkAllContextsLost() {
722 for (auto& kv : stubs_) 666 for (auto& kv : stubs_)
723 kv.second->MarkContextLost(); 667 kv.second->MarkContextLost();
724 } 668 }
725 669
726 bool GpuChannel::AddRoute(int32_t route_id, 670 bool GpuChannel::AddRoute(int32_t route_id,
727 int32_t stream_id, 671 SequenceId sequence_id,
728 IPC::Listener* listener) { 672 IPC::Listener* listener) {
729 if (router_.AddRoute(route_id, listener)) { 673 // TODO(sunnyps): Add route id to sequence id mapping to filter.
730 AddRouteToStream(route_id, stream_id); 674 return router_.AddRoute(route_id, listener);
731 return true;
732 }
733 return false;
734 } 675 }
735 676
736 void GpuChannel::RemoveRoute(int32_t route_id) { 677 void GpuChannel::RemoveRoute(int32_t route_id) {
737 router_.RemoveRoute(route_id); 678 router_.RemoveRoute(route_id);
738 RemoveRouteFromStream(route_id);
739 } 679 }
740 680
741 bool GpuChannel::OnControlMessageReceived(const IPC::Message& msg) { 681 bool GpuChannel::OnControlMessageReceived(const IPC::Message& msg) {
742 bool handled = true; 682 bool handled = true;
743 IPC_BEGIN_MESSAGE_MAP(GpuChannel, msg) 683 IPC_BEGIN_MESSAGE_MAP(GpuChannel, msg)
744 IPC_MESSAGE_HANDLER(GpuChannelMsg_CreateCommandBuffer, 684 IPC_MESSAGE_HANDLER(GpuChannelMsg_CreateCommandBuffer,
745 OnCreateCommandBuffer) 685 OnCreateCommandBuffer)
746 IPC_MESSAGE_HANDLER(GpuChannelMsg_DestroyCommandBuffer, 686 IPC_MESSAGE_HANDLER(GpuChannelMsg_DestroyCommandBuffer,
747 OnDestroyCommandBuffer) 687 OnDestroyCommandBuffer)
748 IPC_MESSAGE_HANDLER(GpuChannelMsg_GetDriverBugWorkArounds, 688 IPC_MESSAGE_HANDLER(GpuChannelMsg_GetDriverBugWorkArounds,
749 OnGetDriverBugWorkArounds) 689 OnGetDriverBugWorkArounds)
750 IPC_MESSAGE_UNHANDLED(handled = false) 690 IPC_MESSAGE_UNHANDLED(handled = false)
751 IPC_END_MESSAGE_MAP() 691 IPC_END_MESSAGE_MAP()
752 return handled; 692 return handled;
753 } 693 }
754 694
755 scoped_refptr<SyncPointOrderData> GpuChannel::GetSyncPointOrderData( 695 void GpuChannel::PostHandleMessage() {
756 int32_t stream_id) { 696 task_runner_->PostTask(FROM_HERE, base::Bind(&GpuChannel::HandleMessage,
757 auto it = streams_.find(stream_id); 697 weak_factory_.GetWeakPtr()));
758 DCHECK(it != streams_.end());
759 DCHECK(it->second);
760 return it->second->GetSyncPointOrderData();
761 }
762
763 void GpuChannel::PostHandleMessage(
764 const scoped_refptr<GpuChannelMessageQueue>& queue) {
765 task_runner_->PostTask(FROM_HERE,
766 base::Bind(&GpuChannel::HandleMessage,
767 weak_factory_.GetWeakPtr(), queue));
768 } 698 }
769 699
770 void GpuChannel::PostHandleOutOfOrderMessage(const IPC::Message& msg) { 700 void GpuChannel::PostHandleOutOfOrderMessage(const IPC::Message& msg) {
771 task_runner_->PostTask(FROM_HERE, 701 task_runner_->PostTask(FROM_HERE,
772 base::Bind(&GpuChannel::HandleOutOfOrderMessage, 702 base::Bind(&GpuChannel::HandleOutOfOrderMessage,
773 weak_factory_.GetWeakPtr(), msg)); 703 weak_factory_.GetWeakPtr(), msg));
774 } 704 }
775 705
776 void GpuChannel::HandleMessage( 706 void GpuChannel::HandleMessage() {
777 const scoped_refptr<GpuChannelMessageQueue>& message_queue) {
778 const GpuChannelMessage* channel_msg = 707 const GpuChannelMessage* channel_msg =
779 message_queue->BeginMessageProcessing(); 708 message_queue_->BeginMessageProcessing();
780 if (!channel_msg) 709 if (!channel_msg)
781 return; 710 return;
782 711
783 const IPC::Message& msg = channel_msg->message; 712 const IPC::Message& msg = channel_msg->message;
784 int32_t routing_id = msg.routing_id(); 713 int32_t routing_id = msg.routing_id();
785 GpuCommandBufferStub* stub = LookupCommandBuffer(routing_id); 714 GpuCommandBufferStub* stub = LookupCommandBuffer(routing_id);
786 715
787 DCHECK(!stub || stub->IsScheduled()); 716 DCHECK(!stub || stub->IsScheduled());
788 717
789 DVLOG(1) << "received message @" << &msg << " on channel @" << this 718 DVLOG(1) << "received message @" << &msg << " on channel @" << this
790 << " with type " << msg.type(); 719 << " with type " << msg.type();
791 720
792 HandleMessageHelper(msg); 721 HandleMessageHelper(msg);
793 722
794 // If we get descheduled or yield while processing a message. 723 // If we get descheduled or yield while processing a message.
795 if ((stub && stub->HasUnprocessedCommands()) || 724 if (stub && (stub->HasUnprocessedCommands() || !stub->IsScheduled())) {
796 !message_queue->IsScheduled()) {
797 DCHECK((uint32_t)GpuCommandBufferMsg_AsyncFlush::ID == msg.type() || 725 DCHECK((uint32_t)GpuCommandBufferMsg_AsyncFlush::ID == msg.type() ||
798 (uint32_t)GpuCommandBufferMsg_WaitSyncToken::ID == msg.type()); 726 (uint32_t)GpuCommandBufferMsg_WaitSyncToken::ID == msg.type());
799 message_queue->PauseMessageProcessing(); 727 DCHECK_EQ(stub->IsScheduled(), message_queue_->IsScheduled());
728 message_queue_->PauseMessageProcessing();
800 } else { 729 } else {
801 message_queue->FinishMessageProcessing(); 730 message_queue_->FinishMessageProcessing();
802 } 731 }
803 } 732 }
804 733
805 void GpuChannel::HandleMessageHelper(const IPC::Message& msg) { 734 void GpuChannel::HandleMessageHelper(const IPC::Message& msg) {
806 int32_t routing_id = msg.routing_id(); 735 int32_t routing_id = msg.routing_id();
807 736
808 bool handled = false; 737 bool handled = false;
809 if (routing_id == MSG_ROUTING_CONTROL) { 738 if (routing_id == MSG_ROUTING_CONTROL) {
810 handled = OnControlMessageReceived(msg); 739 handled = OnControlMessageReceived(msg);
811 } else { 740 } else {
(...skipping 12 matching lines...) Expand all
824 } 753 }
825 754
826 void GpuChannel::HandleOutOfOrderMessage(const IPC::Message& msg) { 755 void GpuChannel::HandleOutOfOrderMessage(const IPC::Message& msg) {
827 HandleMessageHelper(msg); 756 HandleMessageHelper(msg);
828 } 757 }
829 758
830 void GpuChannel::HandleMessageForTesting(const IPC::Message& msg) { 759 void GpuChannel::HandleMessageForTesting(const IPC::Message& msg) {
831 HandleMessageHelper(msg); 760 HandleMessageHelper(msg);
832 } 761 }
833 762
834 scoped_refptr<GpuChannelMessageQueue> GpuChannel::CreateStream(
835 int32_t stream_id,
836 GpuStreamPriority stream_priority) {
837 DCHECK(streams_.find(stream_id) == streams_.end());
838 scoped_refptr<GpuChannelMessageQueue> queue = GpuChannelMessageQueue::Create(
839 stream_id, stream_priority, this, io_task_runner_,
840 (stream_id == GPU_STREAM_DEFAULT) ? preempting_flag_ : nullptr,
841 preempted_flag_, sync_point_manager_);
842 streams_.insert(std::make_pair(stream_id, queue));
843 streams_to_num_routes_.insert(std::make_pair(stream_id, 0));
844 return queue;
845 }
846
847 scoped_refptr<GpuChannelMessageQueue> GpuChannel::LookupStream(
848 int32_t stream_id) {
849 auto stream_it = streams_.find(stream_id);
850 if (stream_it != streams_.end())
851 return stream_it->second;
852 return nullptr;
853 }
854
855 void GpuChannel::DestroyStreamIfNecessary(
856 const scoped_refptr<GpuChannelMessageQueue>& queue) {
857 int32_t stream_id = queue->stream_id();
858 if (streams_to_num_routes_[stream_id] == 0) {
859 queue->Disable();
860 streams_to_num_routes_.erase(stream_id);
861 streams_.erase(stream_id);
862 }
863 }
864
865 void GpuChannel::AddRouteToStream(int32_t route_id, int32_t stream_id) {
866 DCHECK(streams_.find(stream_id) != streams_.end());
867 DCHECK(routes_to_streams_.find(route_id) == routes_to_streams_.end());
868 streams_to_num_routes_[stream_id]++;
869 routes_to_streams_.insert(std::make_pair(route_id, stream_id));
870 filter_->AddRoute(route_id, streams_[stream_id]);
871 }
872
873 void GpuChannel::RemoveRouteFromStream(int32_t route_id) {
874 DCHECK(routes_to_streams_.find(route_id) != routes_to_streams_.end());
875 int32_t stream_id = routes_to_streams_[route_id];
876 DCHECK(streams_.find(stream_id) != streams_.end());
877 routes_to_streams_.erase(route_id);
878 streams_to_num_routes_[stream_id]--;
879 filter_->RemoveRoute(route_id);
880 DestroyStreamIfNecessary(streams_[stream_id]);
881 }
882
883 #if defined(OS_ANDROID) 763 #if defined(OS_ANDROID)
884 const GpuCommandBufferStub* GpuChannel::GetOneStub() const { 764 const GpuCommandBufferStub* GpuChannel::GetOneStub() const {
885 for (const auto& kv : stubs_) { 765 for (const auto& kv : stubs_) {
886 const GpuCommandBufferStub* stub = kv.second.get(); 766 const GpuCommandBufferStub* stub = kv.second.get();
887 if (stub->decoder() && !stub->decoder()->WasContextLost()) 767 if (stub->decoder() && !stub->decoder()->WasContextLost())
888 return stub; 768 return stub;
889 } 769 }
890 return nullptr; 770 return nullptr;
891 } 771 }
892 #endif 772 #endif
(...skipping 28 matching lines...) Expand all
921 !allow_view_command_buffers_) { 801 !allow_view_command_buffers_) {
922 DLOG(ERROR) << "GpuChannel::CreateCommandBuffer(): attempt to create a " 802 DLOG(ERROR) << "GpuChannel::CreateCommandBuffer(): attempt to create a "
923 "view context on a non-priviledged channel"; 803 "view context on a non-priviledged channel";
924 return nullptr; 804 return nullptr;
925 } 805 }
926 806
927 int32_t share_group_id = init_params.share_group_id; 807 int32_t share_group_id = init_params.share_group_id;
928 GpuCommandBufferStub* share_group = LookupCommandBuffer(share_group_id); 808 GpuCommandBufferStub* share_group = LookupCommandBuffer(share_group_id);
929 809
930 if (!share_group && share_group_id != MSG_ROUTING_NONE) { 810 if (!share_group && share_group_id != MSG_ROUTING_NONE) {
931 DLOG(ERROR) 811 DLOG(ERROR) << "GpuChannel::CreateCommandBuffer(): invalid share group id";
932 << "GpuChannel::CreateCommandBuffer(): invalid share group id";
933 return nullptr; 812 return nullptr;
934 } 813 }
935 814
936 int32_t stream_id = init_params.stream_id;
937 if (share_group && stream_id != share_group->stream_id()) {
938 DLOG(ERROR) << "GpuChannel::CreateCommandBuffer(): stream id does not "
939 "match share group stream id";
940 return nullptr;
941 }
piman 2017/03/17 19:12:38 I think we should keep this check (or eventually r
sunnyps 2017/03/17 21:48:23 Added stream id check back. There's a unit test fo
942
943 GpuStreamPriority stream_priority = init_params.stream_priority; 815 GpuStreamPriority stream_priority = init_params.stream_priority;
944 if (!allow_real_time_streams_ && 816 if (!allow_real_time_streams_ &&
945 stream_priority == GpuStreamPriority::REAL_TIME) { 817 stream_priority == GpuStreamPriority::REAL_TIME) {
946 DLOG(ERROR) << "GpuChannel::CreateCommandBuffer(): real time stream " 818 DLOG(ERROR) << "GpuChannel::CreateCommandBuffer(): real time stream "
947 "priority not allowed"; 819 "priority not allowed";
948 return nullptr; 820 return nullptr;
949 } 821 }
950 822
951 if (share_group && !share_group->decoder()) { 823 if (share_group && !share_group->decoder()) {
952 // This should catch test errors where we did not Initialize the 824 // This should catch test errors where we did not Initialize the
953 // share_group's CommandBuffer. 825 // share_group's CommandBuffer.
954 DLOG(ERROR) << "GpuChannel::CreateCommandBuffer(): shared context was " 826 DLOG(ERROR) << "GpuChannel::CreateCommandBuffer(): shared context was "
955 "not initialized"; 827 "not initialized";
956 return nullptr; 828 return nullptr;
957 } 829 }
958 830
959 if (share_group && share_group->decoder()->WasContextLost()) { 831 if (share_group && share_group->decoder()->WasContextLost()) {
960 DLOG(ERROR) << "GpuChannel::CreateCommandBuffer(): shared context was " 832 DLOG(ERROR) << "GpuChannel::CreateCommandBuffer(): shared context was "
961 "already lost"; 833 "already lost";
962 return nullptr; 834 return nullptr;
963 } 835 }
964 836
965 scoped_refptr<GpuChannelMessageQueue> queue = LookupStream(stream_id); 837 CommandBufferId command_buffer_id =
966 if (!queue) 838 GenerateCommandBufferId(client_id_, route_id);
967 queue = CreateStream(stream_id, stream_priority); 839
840 // TODO(sunnyps): Lookup sequence id using stream id to sequence id map.
841 SequenceId sequence_id = message_queue_->sequence_id();
968 842
969 std::unique_ptr<GpuCommandBufferStub> stub(GpuCommandBufferStub::Create( 843 std::unique_ptr<GpuCommandBufferStub> stub(GpuCommandBufferStub::Create(
970 this, share_group, init_params, route_id, std::move(shared_state_shm))); 844 this, share_group, init_params, command_buffer_id, sequence_id, route_id,
845 std::move(shared_state_shm)));
971 846
972 if (!stub) { 847 if (!AddRoute(route_id, sequence_id, stub.get())) {
973 DestroyStreamIfNecessary(queue);
974 return nullptr;
975 }
976
977 if (!AddRoute(route_id, stream_id, stub.get())) {
978 DestroyStreamIfNecessary(queue);
979 DLOG(ERROR) << "GpuChannel::CreateCommandBuffer(): failed to add route"; 848 DLOG(ERROR) << "GpuChannel::CreateCommandBuffer(): failed to add route";
980 return nullptr; 849 return nullptr;
981 } 850 }
982 851
983 return stub; 852 return stub;
984 } 853 }
985 854
986 void GpuChannel::OnDestroyCommandBuffer(int32_t route_id) { 855 void GpuChannel::OnDestroyCommandBuffer(int32_t route_id) {
987 TRACE_EVENT1("gpu", "GpuChannel::OnDestroyCommandBuffer", 856 TRACE_EVENT1("gpu", "GpuChannel::OnDestroyCommandBuffer", "route_id",
988 "route_id", route_id); 857 route_id);
989 858
990 std::unique_ptr<GpuCommandBufferStub> stub; 859 std::unique_ptr<GpuCommandBufferStub> stub;
991 auto it = stubs_.find(route_id); 860 auto it = stubs_.find(route_id);
992 if (it != stubs_.end()) { 861 if (it != stubs_.end()) {
993 stub = std::move(it->second); 862 stub = std::move(it->second);
994 stubs_.erase(it); 863 stubs_.erase(it);
995 } 864 }
996 // In case the renderer is currently blocked waiting for a sync reply from the 865 // In case the renderer is currently blocked waiting for a sync reply from the
997 // stub, we need to make sure to reschedule the correct stream here. 866 // stub, we need to make sure to reschedule the correct stream here.
998 if (stub && !stub->IsScheduled()) { 867 if (stub && !stub->IsScheduled()) {
999 // This stub won't get a chance to reschedule the stream so do that now. 868 // This stub won't get a chance to be scheduled so do that now.
1000 OnStreamRescheduled(stub->stream_id(), true); 869 OnCommandBufferScheduled(stub.get());
1001 } 870 }
1002 871
1003 RemoveRoute(route_id); 872 RemoveRoute(route_id);
1004 } 873 }
1005 874
1006 void GpuChannel::OnGetDriverBugWorkArounds( 875 void GpuChannel::OnGetDriverBugWorkArounds(
1007 std::vector<std::string>* gpu_driver_bug_workarounds) { 876 std::vector<std::string>* gpu_driver_bug_workarounds) {
1008 gpu_driver_bug_workarounds->clear(); 877 gpu_driver_bug_workarounds->clear();
1009 #define GPU_OP(type, name) \ 878 #define GPU_OP(type, name) \
1010 if (gpu_channel_manager_->gpu_driver_bug_workarounds().name) \ 879 if (gpu_channel_manager_->gpu_driver_bug_workarounds().name) \
1011 gpu_driver_bug_workarounds->push_back(#name); 880 gpu_driver_bug_workarounds->push_back(#name);
1012 GPU_DRIVER_BUG_WORKAROUNDS(GPU_OP) 881 GPU_DRIVER_BUG_WORKAROUNDS(GPU_OP)
1013 #undef GPU_OP 882 #undef GPU_OP
1014 } 883 }
1015 884
1016 void GpuChannel::CacheShader(const std::string& key, 885 void GpuChannel::CacheShader(const std::string& key,
1017 const std::string& shader) { 886 const std::string& shader) {
1018 gpu_channel_manager_->delegate()->StoreShaderToDisk(client_id_, key, shader); 887 gpu_channel_manager_->delegate()->StoreShaderToDisk(client_id_, key, shader);
1019 } 888 }
1020 889
1021 void GpuChannel::AddFilter(IPC::MessageFilter* filter) { 890 void GpuChannel::AddFilter(IPC::MessageFilter* filter) {
1022 io_task_runner_->PostTask( 891 io_task_runner_->PostTask(
1023 FROM_HERE, base::Bind(&GpuChannelMessageFilter::AddChannelFilter, 892 FROM_HERE, base::Bind(&GpuChannelMessageFilter::AddChannelFilter, filter_,
1024 filter_, make_scoped_refptr(filter))); 893 make_scoped_refptr(filter)));
1025 } 894 }
1026 895
1027 void GpuChannel::RemoveFilter(IPC::MessageFilter* filter) { 896 void GpuChannel::RemoveFilter(IPC::MessageFilter* filter) {
1028 io_task_runner_->PostTask( 897 io_task_runner_->PostTask(
1029 FROM_HERE, base::Bind(&GpuChannelMessageFilter::RemoveChannelFilter, 898 FROM_HERE, base::Bind(&GpuChannelMessageFilter::RemoveChannelFilter,
1030 filter_, make_scoped_refptr(filter))); 899 filter_, make_scoped_refptr(filter)));
1031 } 900 }
1032 901
1033 uint64_t GpuChannel::GetMemoryUsage() { 902 uint64_t GpuChannel::GetMemoryUsage() {
1034 // Collect the unique memory trackers in use by the |stubs_|. 903 // Collect the unique memory trackers in use by the |stubs_|.
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1072 941
1073 return manager->gpu_memory_buffer_factory() 942 return manager->gpu_memory_buffer_factory()
1074 ->AsImageFactory() 943 ->AsImageFactory()
1075 ->CreateImageForGpuMemoryBuffer(handle, size, format, internalformat, 944 ->CreateImageForGpuMemoryBuffer(handle, size, format, internalformat,
1076 client_id_, surface_handle); 945 client_id_, surface_handle);
1077 } 946 }
1078 } 947 }
1079 } 948 }
1080 949
1081 } // namespace gpu 950 } // namespace gpu
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698