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 #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 430 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
441 channel_lock_.AssertAcquired(); | 441 channel_lock_.AssertAcquired(); |
442 DCHECK(preemption_state_ == CHECKING || preemption_state_ == PREEMPTING); | 442 DCHECK(preemption_state_ == CHECKING || preemption_state_ == PREEMPTING); |
443 DCHECK(!scheduled_); | 443 DCHECK(!scheduled_); |
444 | 444 |
445 preemption_state_ = WOULD_PREEMPT_DESCHEDULED; | 445 preemption_state_ = WOULD_PREEMPT_DESCHEDULED; |
446 preempting_flag_->Reset(); | 446 preempting_flag_->Reset(); |
447 TRACE_COUNTER_ID1("gpu", "GpuChannel::Preempting", this, 0); | 447 TRACE_COUNTER_ID1("gpu", "GpuChannel::Preempting", this, 0); |
448 } | 448 } |
449 | 449 |
450 GpuChannelMessageFilter::GpuChannelMessageFilter() | 450 GpuChannelMessageFilter::GpuChannelMessageFilter() |
451 : sender_(nullptr), peer_pid_(base::kNullProcessId) {} | 451 : channel_(nullptr), peer_pid_(base::kNullProcessId) {} |
452 | 452 |
453 GpuChannelMessageFilter::~GpuChannelMessageFilter() {} | 453 GpuChannelMessageFilter::~GpuChannelMessageFilter() {} |
454 | 454 |
455 void GpuChannelMessageFilter::OnFilterAdded(IPC::Sender* sender) { | 455 void GpuChannelMessageFilter::OnFilterAdded(IPC::Channel* channel) { |
456 DCHECK(!sender_); | 456 DCHECK(!channel_); |
457 sender_ = sender; | 457 channel_ = channel; |
458 for (scoped_refptr<IPC::MessageFilter>& filter : channel_filters_) { | 458 for (scoped_refptr<IPC::MessageFilter>& filter : channel_filters_) { |
459 filter->OnFilterAdded(sender_); | 459 filter->OnFilterAdded(channel_); |
460 } | 460 } |
461 } | 461 } |
462 | 462 |
463 void GpuChannelMessageFilter::OnFilterRemoved() { | 463 void GpuChannelMessageFilter::OnFilterRemoved() { |
464 DCHECK(sender_); | 464 DCHECK(channel_); |
465 for (scoped_refptr<IPC::MessageFilter>& filter : channel_filters_) { | 465 for (scoped_refptr<IPC::MessageFilter>& filter : channel_filters_) { |
466 filter->OnFilterRemoved(); | 466 filter->OnFilterRemoved(); |
467 } | 467 } |
468 sender_ = nullptr; | 468 channel_ = nullptr; |
469 peer_pid_ = base::kNullProcessId; | 469 peer_pid_ = base::kNullProcessId; |
470 } | 470 } |
471 | 471 |
472 void GpuChannelMessageFilter::OnChannelConnected(int32_t peer_pid) { | 472 void GpuChannelMessageFilter::OnChannelConnected(int32_t peer_pid) { |
473 DCHECK(peer_pid_ == base::kNullProcessId); | 473 DCHECK(peer_pid_ == base::kNullProcessId); |
474 peer_pid_ = peer_pid; | 474 peer_pid_ = peer_pid; |
475 for (scoped_refptr<IPC::MessageFilter>& filter : channel_filters_) { | 475 for (scoped_refptr<IPC::MessageFilter>& filter : channel_filters_) { |
476 filter->OnChannelConnected(peer_pid); | 476 filter->OnChannelConnected(peer_pid); |
477 } | 477 } |
478 } | 478 } |
479 | 479 |
480 void GpuChannelMessageFilter::OnChannelError() { | 480 void GpuChannelMessageFilter::OnChannelError() { |
481 for (scoped_refptr<IPC::MessageFilter>& filter : channel_filters_) { | 481 for (scoped_refptr<IPC::MessageFilter>& filter : channel_filters_) { |
482 filter->OnChannelError(); | 482 filter->OnChannelError(); |
483 } | 483 } |
484 } | 484 } |
485 | 485 |
486 void GpuChannelMessageFilter::OnChannelClosing() { | 486 void GpuChannelMessageFilter::OnChannelClosing() { |
487 for (scoped_refptr<IPC::MessageFilter>& filter : channel_filters_) { | 487 for (scoped_refptr<IPC::MessageFilter>& filter : channel_filters_) { |
488 filter->OnChannelClosing(); | 488 filter->OnChannelClosing(); |
489 } | 489 } |
490 } | 490 } |
491 | 491 |
492 void GpuChannelMessageFilter::AddChannelFilter( | 492 void GpuChannelMessageFilter::AddChannelFilter( |
493 scoped_refptr<IPC::MessageFilter> filter) { | 493 scoped_refptr<IPC::MessageFilter> filter) { |
494 channel_filters_.push_back(filter); | 494 channel_filters_.push_back(filter); |
495 if (sender_) | 495 if (channel_) |
496 filter->OnFilterAdded(sender_); | 496 filter->OnFilterAdded(channel_); |
497 if (peer_pid_ != base::kNullProcessId) | 497 if (peer_pid_ != base::kNullProcessId) |
498 filter->OnChannelConnected(peer_pid_); | 498 filter->OnChannelConnected(peer_pid_); |
499 } | 499 } |
500 | 500 |
501 void GpuChannelMessageFilter::RemoveChannelFilter( | 501 void GpuChannelMessageFilter::RemoveChannelFilter( |
502 scoped_refptr<IPC::MessageFilter> filter) { | 502 scoped_refptr<IPC::MessageFilter> filter) { |
503 if (sender_) | 503 if (channel_) |
504 filter->OnFilterRemoved(); | 504 filter->OnFilterRemoved(); |
505 channel_filters_.erase( | 505 channel_filters_.erase( |
506 std::find(channel_filters_.begin(), channel_filters_.end(), filter)); | 506 std::find(channel_filters_.begin(), channel_filters_.end(), filter)); |
507 } | 507 } |
508 | 508 |
509 // This gets called from the main thread and assumes that all messages which | 509 // This gets called from the main thread and assumes that all messages which |
510 // lead to creation of a new route are synchronous messages. | 510 // lead to creation of a new route are synchronous messages. |
511 // TODO(sunnyps): Create routes (and streams) on the IO thread so that we can | 511 // TODO(sunnyps): Create routes (and streams) on the IO thread so that we can |
512 // make the CreateCommandBuffer/VideoDecoder/VideoEncoder messages asynchronous. | 512 // make the CreateCommandBuffer/VideoDecoder/VideoEncoder messages asynchronous. |
513 void GpuChannelMessageFilter::AddRoute( | 513 void GpuChannelMessageFilter::AddRoute( |
514 int32_t route_id, | 514 int32_t route_id, |
515 const scoped_refptr<GpuChannelMessageQueue>& queue) { | 515 const scoped_refptr<GpuChannelMessageQueue>& queue) { |
516 base::AutoLock lock(routes_lock_); | 516 base::AutoLock lock(routes_lock_); |
517 routes_.insert(std::make_pair(route_id, queue)); | 517 routes_.insert(std::make_pair(route_id, queue)); |
518 } | 518 } |
519 | 519 |
520 void GpuChannelMessageFilter::RemoveRoute(int32_t route_id) { | 520 void GpuChannelMessageFilter::RemoveRoute(int32_t route_id) { |
521 base::AutoLock lock(routes_lock_); | 521 base::AutoLock lock(routes_lock_); |
522 routes_.erase(route_id); | 522 routes_.erase(route_id); |
523 } | 523 } |
524 | 524 |
525 bool GpuChannelMessageFilter::OnMessageReceived(const IPC::Message& message) { | 525 bool GpuChannelMessageFilter::OnMessageReceived(const IPC::Message& message) { |
526 DCHECK(sender_); | 526 DCHECK(channel_); |
527 | 527 |
528 if (message.should_unblock() || message.is_reply()) | 528 if (message.should_unblock() || message.is_reply()) |
529 return MessageErrorHandler(message, "Unexpected message type"); | 529 return MessageErrorHandler(message, "Unexpected message type"); |
530 | 530 |
531 if (message.type() == GpuChannelMsg_Nop::ID) { | 531 if (message.type() == GpuChannelMsg_Nop::ID) { |
532 IPC::Message* reply = IPC::SyncMessage::GenerateReply(&message); | 532 IPC::Message* reply = IPC::SyncMessage::GenerateReply(&message); |
533 Send(reply); | 533 Send(reply); |
534 return true; | 534 return true; |
535 } | 535 } |
536 | 536 |
537 for (scoped_refptr<IPC::MessageFilter>& filter : channel_filters_) { | 537 for (scoped_refptr<IPC::MessageFilter>& filter : channel_filters_) { |
538 if (filter->OnMessageReceived(message)) | 538 if (filter->OnMessageReceived(message)) |
539 return true; | 539 return true; |
540 } | 540 } |
541 | 541 |
542 scoped_refptr<GpuChannelMessageQueue> message_queue = | 542 scoped_refptr<GpuChannelMessageQueue> message_queue = |
543 LookupStreamByRoute(message.routing_id()); | 543 LookupStreamByRoute(message.routing_id()); |
544 | 544 |
545 if (!message_queue) | 545 if (!message_queue) |
546 return MessageErrorHandler(message, "Could not find message queue"); | 546 return MessageErrorHandler(message, "Could not find message queue"); |
547 | 547 |
548 if (!message_queue->PushBackMessage(message)) | 548 if (!message_queue->PushBackMessage(message)) |
549 return MessageErrorHandler(message, "Channel destroyed"); | 549 return MessageErrorHandler(message, "Channel destroyed"); |
550 | 550 |
551 return true; | 551 return true; |
552 } | 552 } |
553 | 553 |
554 bool GpuChannelMessageFilter::Send(IPC::Message* message) { | 554 bool GpuChannelMessageFilter::Send(IPC::Message* message) { |
555 return sender_->Send(message); | 555 return channel_->Send(message); |
556 } | 556 } |
557 | 557 |
558 scoped_refptr<GpuChannelMessageQueue> | 558 scoped_refptr<GpuChannelMessageQueue> |
559 GpuChannelMessageFilter::LookupStreamByRoute(int32_t route_id) { | 559 GpuChannelMessageFilter::LookupStreamByRoute(int32_t route_id) { |
560 base::AutoLock lock(routes_lock_); | 560 base::AutoLock lock(routes_lock_); |
561 auto it = routes_.find(route_id); | 561 auto it = routes_.find(route_id); |
562 if (it != routes_.end()) | 562 if (it != routes_.end()) |
563 return it->second; | 563 return it->second; |
564 return nullptr; | 564 return nullptr; |
565 } | 565 } |
(...skipping 496 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1062 | 1062 |
1063 return manager->gpu_memory_buffer_factory() | 1063 return manager->gpu_memory_buffer_factory() |
1064 ->AsImageFactory() | 1064 ->AsImageFactory() |
1065 ->CreateImageForGpuMemoryBuffer(handle, size, format, internalformat, | 1065 ->CreateImageForGpuMemoryBuffer(handle, size, format, internalformat, |
1066 client_id_, surface_handle); | 1066 client_id_, surface_handle); |
1067 } | 1067 } |
1068 } | 1068 } |
1069 } | 1069 } |
1070 | 1070 |
1071 } // namespace gpu | 1071 } // namespace gpu |
OLD | NEW |