| 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 #if defined(OS_WIN) | 5 #if defined(OS_WIN) |
| 6 #include <windows.h> | 6 #include <windows.h> |
| 7 #endif | 7 #endif |
| 8 | 8 |
| 9 #include "content/common/gpu/gpu_channel.h" | 9 #include "content/common/gpu/gpu_channel.h" |
| 10 | 10 |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 119 | 119 |
| 120 if (message.type() == GpuCommandBufferMsg_RetireSyncPoint::ID) { | 120 if (message.type() == GpuCommandBufferMsg_RetireSyncPoint::ID) { |
| 121 // This message should not be sent explicitly by the renderer. | 121 // This message should not be sent explicitly by the renderer. |
| 122 NOTREACHED(); | 122 NOTREACHED(); |
| 123 handled = true; | 123 handled = true; |
| 124 } | 124 } |
| 125 | 125 |
| 126 // All other messages get processed by the GpuChannel. | 126 // All other messages get processed by the GpuChannel. |
| 127 if (!handled) { | 127 if (!handled) { |
| 128 messages_forwarded_to_channel_++; | 128 messages_forwarded_to_channel_++; |
| 129 if (preempting_flag_.get()) | 129 if (preempting_flag_) |
| 130 pending_messages_.push(PendingMessage(messages_forwarded_to_channel_)); | 130 pending_messages_.push(PendingMessage(messages_forwarded_to_channel_)); |
| 131 UpdatePreemptionState(); | 131 UpdatePreemptionState(); |
| 132 } | 132 } |
| 133 | 133 |
| 134 if (message.type() == GpuCommandBufferMsg_InsertSyncPoint::ID) { | 134 if (message.type() == GpuCommandBufferMsg_InsertSyncPoint::ID) { |
| 135 uint32 sync_point = sync_point_manager_->GenerateSyncPoint(); | 135 uint32 sync_point = sync_point_manager_->GenerateSyncPoint(); |
| 136 IPC::Message* reply = IPC::SyncMessage::GenerateReply(&message); | 136 IPC::Message* reply = IPC::SyncMessage::GenerateReply(&message); |
| 137 GpuCommandBufferMsg_InsertSyncPoint::WriteReplyParams(reply, sync_point); | 137 GpuCommandBufferMsg_InsertSyncPoint::WriteReplyParams(reply, sync_point); |
| 138 Send(reply); | 138 Send(reply); |
| 139 message_loop_->PostTask(FROM_HERE, base::Bind( | 139 message_loop_->PostTask(FROM_HERE, base::Bind( |
| (...skipping 350 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 490 | 490 |
| 491 return true; | 491 return true; |
| 492 } | 492 } |
| 493 | 493 |
| 494 std::string GpuChannel::GetChannelName() { | 494 std::string GpuChannel::GetChannelName() { |
| 495 return channel_id_; | 495 return channel_id_; |
| 496 } | 496 } |
| 497 | 497 |
| 498 #if defined(OS_POSIX) | 498 #if defined(OS_POSIX) |
| 499 int GpuChannel::TakeRendererFileDescriptor() { | 499 int GpuChannel::TakeRendererFileDescriptor() { |
| 500 if (!channel_.get()) { | 500 if (!channel_) { |
| 501 NOTREACHED(); | 501 NOTREACHED(); |
| 502 return -1; | 502 return -1; |
| 503 } | 503 } |
| 504 return channel_->TakeClientFileDescriptor(); | 504 return channel_->TakeClientFileDescriptor(); |
| 505 } | 505 } |
| 506 #endif // defined(OS_POSIX) | 506 #endif // defined(OS_POSIX) |
| 507 | 507 |
| 508 bool GpuChannel::OnMessageReceived(const IPC::Message& message) { | 508 bool GpuChannel::OnMessageReceived(const IPC::Message& message) { |
| 509 bool message_processed = true; | 509 bool message_processed = true; |
| 510 if (log_messages_) { | 510 if (log_messages_) { |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 554 | 554 |
| 555 bool GpuChannel::Send(IPC::Message* message) { | 555 bool GpuChannel::Send(IPC::Message* message) { |
| 556 // The GPU process must never send a synchronous IPC message to the renderer | 556 // The GPU process must never send a synchronous IPC message to the renderer |
| 557 // process. This could result in deadlock. | 557 // process. This could result in deadlock. |
| 558 DCHECK(!message->is_sync()); | 558 DCHECK(!message->is_sync()); |
| 559 if (log_messages_) { | 559 if (log_messages_) { |
| 560 DVLOG(1) << "sending message @" << message << " on channel @" << this | 560 DVLOG(1) << "sending message @" << message << " on channel @" << this |
| 561 << " with type " << message->type(); | 561 << " with type " << message->type(); |
| 562 } | 562 } |
| 563 | 563 |
| 564 if (!channel_.get()) { | 564 if (!channel_) { |
| 565 delete message; | 565 delete message; |
| 566 return false; | 566 return false; |
| 567 } | 567 } |
| 568 | 568 |
| 569 return channel_->Send(message); | 569 return channel_->Send(message); |
| 570 } | 570 } |
| 571 | 571 |
| 572 void GpuChannel::RequeueMessage() { | 572 void GpuChannel::RequeueMessage() { |
| 573 DCHECK(currently_processing_message_); | 573 DCHECK(currently_processing_message_); |
| 574 deferred_messages_.push_front( | 574 deferred_messages_.push_front( |
| (...skipping 21 matching lines...) Expand all Loading... |
| 596 if (scheduled) { | 596 if (scheduled) { |
| 597 num_stubs_descheduled_--; | 597 num_stubs_descheduled_--; |
| 598 OnScheduled(); | 598 OnScheduled(); |
| 599 } else { | 599 } else { |
| 600 num_stubs_descheduled_++; | 600 num_stubs_descheduled_++; |
| 601 } | 601 } |
| 602 DCHECK_LE(num_stubs_descheduled_, stubs_.size()); | 602 DCHECK_LE(num_stubs_descheduled_, stubs_.size()); |
| 603 bool a_stub_is_descheduled = num_stubs_descheduled_ > 0; | 603 bool a_stub_is_descheduled = num_stubs_descheduled_ > 0; |
| 604 | 604 |
| 605 if (a_stub_is_descheduled != a_stub_was_descheduled) { | 605 if (a_stub_is_descheduled != a_stub_was_descheduled) { |
| 606 if (preempting_flag_.get()) { | 606 if (preempting_flag_) { |
| 607 io_message_loop_->PostTask( | 607 io_message_loop_->PostTask( |
| 608 FROM_HERE, | 608 FROM_HERE, |
| 609 base::Bind(&GpuChannelMessageFilter::UpdateStubSchedulingState, | 609 base::Bind(&GpuChannelMessageFilter::UpdateStubSchedulingState, |
| 610 filter_, a_stub_is_descheduled)); | 610 filter_, a_stub_is_descheduled)); |
| 611 } | 611 } |
| 612 } | 612 } |
| 613 } | 613 } |
| 614 | 614 |
| 615 void GpuChannel::CreateViewCommandBuffer( | 615 void GpuChannel::CreateViewCommandBuffer( |
| 616 const gfx::GLSurfaceHandle& window, | 616 const gfx::GLSurfaceHandle& window, |
| (...skipping 30 matching lines...) Expand all Loading... |
| 647 disallowed_features_, | 647 disallowed_features_, |
| 648 init_params.allowed_extensions, | 648 init_params.allowed_extensions, |
| 649 init_params.attribs, | 649 init_params.attribs, |
| 650 init_params.gpu_preference, | 650 init_params.gpu_preference, |
| 651 use_virtualized_gl_context, | 651 use_virtualized_gl_context, |
| 652 *route_id, | 652 *route_id, |
| 653 surface_id, | 653 surface_id, |
| 654 watchdog_, | 654 watchdog_, |
| 655 software_, | 655 software_, |
| 656 init_params.active_url)); | 656 init_params.active_url)); |
| 657 if (preempted_flag_.get()) | 657 if (preempted_flag_) |
| 658 stub->SetPreemptByFlag(preempted_flag_); | 658 stub->SetPreemptByFlag(preempted_flag_); |
| 659 router_.AddRoute(*route_id, stub.get()); | 659 router_.AddRoute(*route_id, stub.get()); |
| 660 stubs_.AddWithID(stub.release(), *route_id); | 660 stubs_.AddWithID(stub.release(), *route_id); |
| 661 #endif // ENABLE_GPU | 661 #endif // ENABLE_GPU |
| 662 } | 662 } |
| 663 | 663 |
| 664 GpuCommandBufferStub* GpuChannel::LookupCommandBuffer(int32 route_id) { | 664 GpuCommandBufferStub* GpuChannel::LookupCommandBuffer(int32 route_id) { |
| 665 return stubs_.Lookup(route_id); | 665 return stubs_.Lookup(route_id); |
| 666 } | 666 } |
| 667 | 667 |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 714 | 714 |
| 715 void GpuChannel::AddRoute(int32 route_id, IPC::Listener* listener) { | 715 void GpuChannel::AddRoute(int32 route_id, IPC::Listener* listener) { |
| 716 router_.AddRoute(route_id, listener); | 716 router_.AddRoute(route_id, listener); |
| 717 } | 717 } |
| 718 | 718 |
| 719 void GpuChannel::RemoveRoute(int32 route_id) { | 719 void GpuChannel::RemoveRoute(int32 route_id) { |
| 720 router_.RemoveRoute(route_id); | 720 router_.RemoveRoute(route_id); |
| 721 } | 721 } |
| 722 | 722 |
| 723 gpu::PreemptionFlag* GpuChannel::GetPreemptionFlag() { | 723 gpu::PreemptionFlag* GpuChannel::GetPreemptionFlag() { |
| 724 if (!preempting_flag_.get()) { | 724 if (!preempting_flag_) { |
| 725 preempting_flag_ = new gpu::PreemptionFlag; | 725 preempting_flag_ = new gpu::PreemptionFlag; |
| 726 io_message_loop_->PostTask( | 726 io_message_loop_->PostTask( |
| 727 FROM_HERE, base::Bind( | 727 FROM_HERE, base::Bind( |
| 728 &GpuChannelMessageFilter::SetPreemptingFlagAndSchedulingState, | 728 &GpuChannelMessageFilter::SetPreemptingFlagAndSchedulingState, |
| 729 filter_, preempting_flag_, num_stubs_descheduled_ > 0)); | 729 filter_, preempting_flag_, num_stubs_descheduled_ > 0)); |
| 730 } | 730 } |
| 731 return preempting_flag_.get(); | 731 return preempting_flag_.get(); |
| 732 } | 732 } |
| 733 | 733 |
| 734 void GpuChannel::SetPreemptByFlag( | 734 void GpuChannel::SetPreemptByFlag( |
| 735 scoped_refptr<gpu::PreemptionFlag> preempted_flag) { | 735 scoped_refptr<gpu::PreemptionFlag> preempted_flag) { |
| 736 preempted_flag_ = preempted_flag; | 736 preempted_flag_ = preempted_flag; |
| 737 | 737 |
| 738 for (StubMap::Iterator<GpuCommandBufferStub> it(&stubs_); | 738 for (StubMap::Iterator<GpuCommandBufferStub> it(&stubs_); |
| 739 !it.IsAtEnd(); it.Advance()) { | 739 !it.IsAtEnd(); it.Advance()) { |
| 740 it.GetCurrentValue()->SetPreemptByFlag(preempted_flag_); | 740 it.GetCurrentValue()->SetPreemptByFlag(preempted_flag_); |
| 741 } | 741 } |
| 742 } | 742 } |
| 743 | 743 |
| 744 GpuChannel::~GpuChannel() { | 744 GpuChannel::~GpuChannel() { |
| 745 if (preempting_flag_.get()) | 745 if (preempting_flag_) |
| 746 preempting_flag_->Reset(); | 746 preempting_flag_->Reset(); |
| 747 } | 747 } |
| 748 | 748 |
| 749 void GpuChannel::OnDestroy() { | 749 void GpuChannel::OnDestroy() { |
| 750 TRACE_EVENT0("gpu", "GpuChannel::OnDestroy"); | 750 TRACE_EVENT0("gpu", "GpuChannel::OnDestroy"); |
| 751 gpu_channel_manager_->RemoveChannel(client_id_); | 751 gpu_channel_manager_->RemoveChannel(client_id_); |
| 752 } | 752 } |
| 753 | 753 |
| 754 bool GpuChannel::OnControlMessageReceived(const IPC::Message& msg) { | 754 bool GpuChannel::OnControlMessageReceived(const IPC::Message& msg) { |
| 755 bool handled = true; | 755 bool handled = true; |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 865 disallowed_features_, | 865 disallowed_features_, |
| 866 init_params.allowed_extensions, | 866 init_params.allowed_extensions, |
| 867 init_params.attribs, | 867 init_params.attribs, |
| 868 init_params.gpu_preference, | 868 init_params.gpu_preference, |
| 869 false, | 869 false, |
| 870 *route_id, | 870 *route_id, |
| 871 0, | 871 0, |
| 872 watchdog_, | 872 watchdog_, |
| 873 software_, | 873 software_, |
| 874 init_params.active_url)); | 874 init_params.active_url)); |
| 875 if (preempted_flag_.get()) | 875 if (preempted_flag_) |
| 876 stub->SetPreemptByFlag(preempted_flag_); | 876 stub->SetPreemptByFlag(preempted_flag_); |
| 877 router_.AddRoute(*route_id, stub.get()); | 877 router_.AddRoute(*route_id, stub.get()); |
| 878 stubs_.AddWithID(stub.release(), *route_id); | 878 stubs_.AddWithID(stub.release(), *route_id); |
| 879 TRACE_EVENT1("gpu", "GpuChannel::OnCreateOffscreenCommandBuffer", | 879 TRACE_EVENT1("gpu", "GpuChannel::OnCreateOffscreenCommandBuffer", |
| 880 "route_id", route_id); | 880 "route_id", route_id); |
| 881 } | 881 } |
| 882 | 882 |
| 883 void GpuChannel::OnDestroyCommandBuffer(int32 route_id) { | 883 void GpuChannel::OnDestroyCommandBuffer(int32 route_id) { |
| 884 TRACE_EVENT1("gpu", "GpuChannel::OnDestroyCommandBuffer", | 884 TRACE_EVENT1("gpu", "GpuChannel::OnDestroyCommandBuffer", |
| 885 "route_id", route_id); | 885 "route_id", route_id); |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 935 if (it.GetCurrentValue()->surface_id() == surface_id) { | 935 if (it.GetCurrentValue()->surface_id() == surface_id) { |
| 936 stats->texture_upload_count += texture_upload_count; | 936 stats->texture_upload_count += texture_upload_count; |
| 937 stats->total_texture_upload_time += total_texture_upload_time; | 937 stats->total_texture_upload_time += total_texture_upload_time; |
| 938 stats->total_processing_commands_time += total_processing_commands_time; | 938 stats->total_processing_commands_time += total_processing_commands_time; |
| 939 } | 939 } |
| 940 } | 940 } |
| 941 } | 941 } |
| 942 | 942 |
| 943 void GpuChannel::MessageProcessed() { | 943 void GpuChannel::MessageProcessed() { |
| 944 messages_processed_++; | 944 messages_processed_++; |
| 945 if (preempting_flag_.get()) { | 945 if (preempting_flag_) { |
| 946 io_message_loop_->PostTask( | 946 io_message_loop_->PostTask( |
| 947 FROM_HERE, | 947 FROM_HERE, |
| 948 base::Bind(&GpuChannelMessageFilter::MessageProcessed, | 948 base::Bind(&GpuChannelMessageFilter::MessageProcessed, |
| 949 filter_, messages_processed_)); | 949 filter_, messages_processed_)); |
| 950 } | 950 } |
| 951 } | 951 } |
| 952 | 952 |
| 953 void GpuChannel::CacheShader(const std::string& key, | 953 void GpuChannel::CacheShader(const std::string& key, |
| 954 const std::string& shader) { | 954 const std::string& shader) { |
| 955 gpu_channel_manager_->Send( | 955 gpu_channel_manager_->Send( |
| 956 new GpuHostMsg_CacheShader(client_id_, key, shader)); | 956 new GpuHostMsg_CacheShader(client_id_, key, shader)); |
| 957 } | 957 } |
| 958 | 958 |
| 959 } // namespace content | 959 } // namespace content |
| OLD | NEW |