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 |
11 #include <queue> | 11 #include <queue> |
12 #include <vector> | 12 #include <vector> |
13 | 13 |
14 #include "base/bind.h" | 14 #include "base/bind.h" |
15 #include "base/command_line.h" | 15 #include "base/command_line.h" |
16 #include "base/debug/trace_event.h" | 16 #include "base/debug/trace_event.h" |
17 #include "base/message_loop/message_loop_proxy.h" | 17 #include "base/message_loop/message_loop_proxy.h" |
18 #include "base/stl_util.h" | 18 #include "base/stl_util.h" |
19 #include "base/strings/string_util.h" | 19 #include "base/strings/string_util.h" |
20 #include "base/timer/timer.h" | 20 #include "base/timer/timer.h" |
21 #include "content/common/gpu/devtools_gpu_agent.h" | 21 #include "content/common/gpu/devtools_gpu_agent.h" |
22 #include "content/common/gpu/gpu_channel_manager.h" | 22 #include "content/common/gpu/gpu_channel_manager.h" |
23 #include "content/common/gpu/gpu_messages.h" | 23 #include "content/common/gpu/gpu_messages.h" |
24 #include "content/common/gpu/sync_point_manager.h" | 24 #include "content/common/gpu/sync_point_manager.h" |
25 #include "content/public/common/content_switches.h" | 25 #include "content/public/common/content_switches.h" |
26 #include "gpu/command_buffer/common/mailbox.h" | 26 #include "gpu/command_buffer/common/mailbox.h" |
27 #include "gpu/command_buffer/service/gpu_scheduler.h" | 27 #include "gpu/command_buffer/service/gpu_scheduler.h" |
28 #include "gpu/command_buffer/service/image_manager.h" | |
29 #include "gpu/command_buffer/service/mailbox_manager.h" | 28 #include "gpu/command_buffer/service/mailbox_manager.h" |
30 #include "ipc/ipc_channel.h" | 29 #include "ipc/ipc_channel.h" |
31 #include "ipc/message_filter.h" | 30 #include "ipc/message_filter.h" |
32 #include "ui/gl/gl_context.h" | 31 #include "ui/gl/gl_context.h" |
33 #include "ui/gl/gl_image.h" | |
34 #include "ui/gl/gl_surface.h" | 32 #include "ui/gl/gl_surface.h" |
35 | 33 |
36 #if defined(OS_POSIX) | 34 #if defined(OS_POSIX) |
37 #include "ipc/ipc_channel_posix.h" | 35 #include "ipc/ipc_channel_posix.h" |
38 #endif | 36 #endif |
39 | 37 |
40 namespace content { | 38 namespace content { |
41 namespace { | 39 namespace { |
42 | 40 |
43 // Number of milliseconds between successive vsync. Many GL commands block | 41 // Number of milliseconds between successive vsync. Many GL commands block |
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
378 GpuWatchdog* watchdog, | 376 GpuWatchdog* watchdog, |
379 gfx::GLShareGroup* share_group, | 377 gfx::GLShareGroup* share_group, |
380 gpu::gles2::MailboxManager* mailbox, | 378 gpu::gles2::MailboxManager* mailbox, |
381 int client_id, | 379 int client_id, |
382 bool software) | 380 bool software) |
383 : gpu_channel_manager_(gpu_channel_manager), | 381 : gpu_channel_manager_(gpu_channel_manager), |
384 messages_processed_(0), | 382 messages_processed_(0), |
385 client_id_(client_id), | 383 client_id_(client_id), |
386 share_group_(share_group ? share_group : new gfx::GLShareGroup), | 384 share_group_(share_group ? share_group : new gfx::GLShareGroup), |
387 mailbox_manager_(mailbox ? mailbox : new gpu::gles2::MailboxManager), | 385 mailbox_manager_(mailbox ? mailbox : new gpu::gles2::MailboxManager), |
388 image_manager_(new gpu::gles2::ImageManager), | |
389 watchdog_(watchdog), | 386 watchdog_(watchdog), |
390 software_(software), | 387 software_(software), |
391 handle_messages_scheduled_(false), | 388 handle_messages_scheduled_(false), |
392 currently_processing_message_(NULL), | 389 currently_processing_message_(NULL), |
393 weak_factory_(this), | 390 weak_factory_(this), |
394 num_stubs_descheduled_(0) { | 391 num_stubs_descheduled_(0) { |
395 DCHECK(gpu_channel_manager); | 392 DCHECK(gpu_channel_manager); |
396 DCHECK(client_id); | 393 DCHECK(client_id); |
397 | 394 |
398 channel_id_ = IPC::Channel::GenerateVerifiedChannelID("gpu"); | 395 channel_id_ = IPC::Channel::GenerateVerifiedChannelID("gpu"); |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
545 bool use_virtualized_gl_context = false; | 542 bool use_virtualized_gl_context = false; |
546 #if defined(OS_MACOSX) | 543 #if defined(OS_MACOSX) |
547 use_virtualized_gl_context = true; | 544 use_virtualized_gl_context = true; |
548 #endif | 545 #endif |
549 | 546 |
550 scoped_ptr<GpuCommandBufferStub> stub( | 547 scoped_ptr<GpuCommandBufferStub> stub( |
551 new GpuCommandBufferStub(this, | 548 new GpuCommandBufferStub(this, |
552 share_group, | 549 share_group, |
553 window, | 550 window, |
554 mailbox_manager_.get(), | 551 mailbox_manager_.get(), |
555 image_manager_.get(), | |
556 gfx::Size(), | 552 gfx::Size(), |
557 disallowed_features_, | 553 disallowed_features_, |
558 init_params.attribs, | 554 init_params.attribs, |
559 init_params.gpu_preference, | 555 init_params.gpu_preference, |
560 use_virtualized_gl_context, | 556 use_virtualized_gl_context, |
561 route_id, | 557 route_id, |
562 surface_id, | 558 surface_id, |
563 watchdog_, | 559 watchdog_, |
564 software_, | 560 software_, |
565 init_params.active_url)); | 561 init_params.active_url)); |
566 if (preempted_flag_.get()) | 562 if (preempted_flag_.get()) |
567 stub->SetPreemptByFlag(preempted_flag_); | 563 stub->SetPreemptByFlag(preempted_flag_); |
568 if (!router_.AddRoute(route_id, stub.get())) { | 564 if (!router_.AddRoute(route_id, stub.get())) { |
569 DLOG(ERROR) << "GpuChannel::CreateViewCommandBuffer(): " | 565 DLOG(ERROR) << "GpuChannel::CreateViewCommandBuffer(): " |
570 "failed to add route"; | 566 "failed to add route"; |
571 return false; | 567 return false; |
572 } | 568 } |
573 stubs_.AddWithID(stub.release(), route_id); | 569 stubs_.AddWithID(stub.release(), route_id); |
574 return true; | 570 return true; |
575 } | 571 } |
576 | 572 |
577 GpuCommandBufferStub* GpuChannel::LookupCommandBuffer(int32 route_id) { | 573 GpuCommandBufferStub* GpuChannel::LookupCommandBuffer(int32 route_id) { |
578 return stubs_.Lookup(route_id); | 574 return stubs_.Lookup(route_id); |
579 } | 575 } |
580 | 576 |
581 void GpuChannel::CreateImage( | |
582 gfx::PluginWindowHandle window, | |
583 int32 image_id, | |
584 gfx::Size* size) { | |
585 TRACE_EVENT1("gpu", | |
586 "GpuChannel::CreateImage", | |
587 "image_id", | |
588 image_id); | |
589 | |
590 *size = gfx::Size(); | |
591 | |
592 if (image_manager_->LookupImage(image_id)) { | |
593 LOG(ERROR) << "CreateImage failed, image_id already in use."; | |
594 return; | |
595 } | |
596 | |
597 scoped_refptr<gfx::GLImage> image = gfx::GLImage::CreateGLImage(window); | |
598 if (!image.get()) | |
599 return; | |
600 | |
601 image_manager_->AddImage(image.get(), image_id); | |
602 *size = image->GetSize(); | |
603 } | |
604 | |
605 void GpuChannel::DeleteImage(int32 image_id) { | |
606 TRACE_EVENT1("gpu", | |
607 "GpuChannel::DeleteImage", | |
608 "image_id", | |
609 image_id); | |
610 | |
611 image_manager_->RemoveImage(image_id); | |
612 } | |
613 | |
614 void GpuChannel::LoseAllContexts() { | 577 void GpuChannel::LoseAllContexts() { |
615 gpu_channel_manager_->LoseAllContexts(); | 578 gpu_channel_manager_->LoseAllContexts(); |
616 } | 579 } |
617 | 580 |
618 void GpuChannel::MarkAllContextsLost() { | 581 void GpuChannel::MarkAllContextsLost() { |
619 for (StubMap::Iterator<GpuCommandBufferStub> it(&stubs_); | 582 for (StubMap::Iterator<GpuCommandBufferStub> it(&stubs_); |
620 !it.IsAtEnd(); it.Advance()) { | 583 !it.IsAtEnd(); it.Advance()) { |
621 it.GetCurrentValue()->MarkContextLost(); | 584 it.GetCurrentValue()->MarkContextLost(); |
622 } | 585 } |
623 } | 586 } |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
749 int32 route_id, | 712 int32 route_id, |
750 bool* succeeded) { | 713 bool* succeeded) { |
751 TRACE_EVENT0("gpu", "GpuChannel::OnCreateOffscreenCommandBuffer"); | 714 TRACE_EVENT0("gpu", "GpuChannel::OnCreateOffscreenCommandBuffer"); |
752 GpuCommandBufferStub* share_group = stubs_.Lookup(init_params.share_group_id); | 715 GpuCommandBufferStub* share_group = stubs_.Lookup(init_params.share_group_id); |
753 | 716 |
754 scoped_ptr<GpuCommandBufferStub> stub(new GpuCommandBufferStub( | 717 scoped_ptr<GpuCommandBufferStub> stub(new GpuCommandBufferStub( |
755 this, | 718 this, |
756 share_group, | 719 share_group, |
757 gfx::GLSurfaceHandle(), | 720 gfx::GLSurfaceHandle(), |
758 mailbox_manager_.get(), | 721 mailbox_manager_.get(), |
759 image_manager_.get(), | |
760 size, | 722 size, |
761 disallowed_features_, | 723 disallowed_features_, |
762 init_params.attribs, | 724 init_params.attribs, |
763 init_params.gpu_preference, | 725 init_params.gpu_preference, |
764 false, | 726 false, |
765 route_id, | 727 route_id, |
766 0, | 728 0, |
767 watchdog_, | 729 watchdog_, |
768 software_, | 730 software_, |
769 init_params.active_url)); | 731 init_params.active_url)); |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
836 uint64 GpuChannel::GetMemoryUsage() { | 798 uint64 GpuChannel::GetMemoryUsage() { |
837 uint64 size = 0; | 799 uint64 size = 0; |
838 for (StubMap::Iterator<GpuCommandBufferStub> it(&stubs_); | 800 for (StubMap::Iterator<GpuCommandBufferStub> it(&stubs_); |
839 !it.IsAtEnd(); it.Advance()) { | 801 !it.IsAtEnd(); it.Advance()) { |
840 size += it.GetCurrentValue()->GetMemoryUsage(); | 802 size += it.GetCurrentValue()->GetMemoryUsage(); |
841 } | 803 } |
842 return size; | 804 return size; |
843 } | 805 } |
844 | 806 |
845 } // namespace content | 807 } // namespace content |
OLD | NEW |