| 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 357 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 401 gfx::GLShareGroup* share_group, | 399 gfx::GLShareGroup* share_group, |
| 402 gpu::gles2::MailboxManager* mailbox, | 400 gpu::gles2::MailboxManager* mailbox, |
| 403 int client_id, | 401 int client_id, |
| 404 bool software, | 402 bool software, |
| 405 bool allow_future_sync_points) | 403 bool allow_future_sync_points) |
| 406 : gpu_channel_manager_(gpu_channel_manager), | 404 : gpu_channel_manager_(gpu_channel_manager), |
| 407 messages_processed_(0), | 405 messages_processed_(0), |
| 408 client_id_(client_id), | 406 client_id_(client_id), |
| 409 share_group_(share_group ? share_group : new gfx::GLShareGroup), | 407 share_group_(share_group ? share_group : new gfx::GLShareGroup), |
| 410 mailbox_manager_(mailbox ? mailbox : new gpu::gles2::MailboxManager), | 408 mailbox_manager_(mailbox ? mailbox : new gpu::gles2::MailboxManager), |
| 411 image_manager_(new gpu::gles2::ImageManager), | |
| 412 watchdog_(watchdog), | 409 watchdog_(watchdog), |
| 413 software_(software), | 410 software_(software), |
| 414 handle_messages_scheduled_(false), | 411 handle_messages_scheduled_(false), |
| 415 currently_processing_message_(NULL), | 412 currently_processing_message_(NULL), |
| 416 weak_factory_(this), | 413 weak_factory_(this), |
| 417 num_stubs_descheduled_(0), | 414 num_stubs_descheduled_(0), |
| 418 allow_future_sync_points_(allow_future_sync_points) { | 415 allow_future_sync_points_(allow_future_sync_points) { |
| 419 DCHECK(gpu_channel_manager); | 416 DCHECK(gpu_channel_manager); |
| 420 DCHECK(client_id); | 417 DCHECK(client_id); |
| 421 | 418 |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 570 bool use_virtualized_gl_context = false; | 567 bool use_virtualized_gl_context = false; |
| 571 #if defined(OS_MACOSX) | 568 #if defined(OS_MACOSX) |
| 572 use_virtualized_gl_context = true; | 569 use_virtualized_gl_context = true; |
| 573 #endif | 570 #endif |
| 574 | 571 |
| 575 scoped_ptr<GpuCommandBufferStub> stub( | 572 scoped_ptr<GpuCommandBufferStub> stub( |
| 576 new GpuCommandBufferStub(this, | 573 new GpuCommandBufferStub(this, |
| 577 share_group, | 574 share_group, |
| 578 window, | 575 window, |
| 579 mailbox_manager_.get(), | 576 mailbox_manager_.get(), |
| 580 image_manager_.get(), | |
| 581 gfx::Size(), | 577 gfx::Size(), |
| 582 disallowed_features_, | 578 disallowed_features_, |
| 583 init_params.attribs, | 579 init_params.attribs, |
| 584 init_params.gpu_preference, | 580 init_params.gpu_preference, |
| 585 use_virtualized_gl_context, | 581 use_virtualized_gl_context, |
| 586 route_id, | 582 route_id, |
| 587 surface_id, | 583 surface_id, |
| 588 watchdog_, | 584 watchdog_, |
| 589 software_, | 585 software_, |
| 590 init_params.active_url)); | 586 init_params.active_url)); |
| 591 if (preempted_flag_.get()) | 587 if (preempted_flag_.get()) |
| 592 stub->SetPreemptByFlag(preempted_flag_); | 588 stub->SetPreemptByFlag(preempted_flag_); |
| 593 if (!router_.AddRoute(route_id, stub.get())) { | 589 if (!router_.AddRoute(route_id, stub.get())) { |
| 594 DLOG(ERROR) << "GpuChannel::CreateViewCommandBuffer(): " | 590 DLOG(ERROR) << "GpuChannel::CreateViewCommandBuffer(): " |
| 595 "failed to add route"; | 591 "failed to add route"; |
| 596 return CREATE_COMMAND_BUFFER_FAILED_AND_CHANNEL_LOST; | 592 return CREATE_COMMAND_BUFFER_FAILED_AND_CHANNEL_LOST; |
| 597 } | 593 } |
| 598 stubs_.AddWithID(stub.release(), route_id); | 594 stubs_.AddWithID(stub.release(), route_id); |
| 599 return CREATE_COMMAND_BUFFER_SUCCEEDED; | 595 return CREATE_COMMAND_BUFFER_SUCCEEDED; |
| 600 } | 596 } |
| 601 | 597 |
| 602 GpuCommandBufferStub* GpuChannel::LookupCommandBuffer(int32 route_id) { | 598 GpuCommandBufferStub* GpuChannel::LookupCommandBuffer(int32 route_id) { |
| 603 return stubs_.Lookup(route_id); | 599 return stubs_.Lookup(route_id); |
| 604 } | 600 } |
| 605 | 601 |
| 606 void GpuChannel::CreateImage( | |
| 607 gfx::PluginWindowHandle window, | |
| 608 int32 image_id, | |
| 609 gfx::Size* size) { | |
| 610 TRACE_EVENT1("gpu", | |
| 611 "GpuChannel::CreateImage", | |
| 612 "image_id", | |
| 613 image_id); | |
| 614 | |
| 615 *size = gfx::Size(); | |
| 616 | |
| 617 if (image_manager_->LookupImage(image_id)) { | |
| 618 LOG(ERROR) << "CreateImage failed, image_id already in use."; | |
| 619 return; | |
| 620 } | |
| 621 | |
| 622 scoped_refptr<gfx::GLImage> image = gfx::GLImage::CreateGLImage(window); | |
| 623 if (!image.get()) | |
| 624 return; | |
| 625 | |
| 626 image_manager_->AddImage(image.get(), image_id); | |
| 627 *size = image->GetSize(); | |
| 628 } | |
| 629 | |
| 630 void GpuChannel::DeleteImage(int32 image_id) { | |
| 631 TRACE_EVENT1("gpu", | |
| 632 "GpuChannel::DeleteImage", | |
| 633 "image_id", | |
| 634 image_id); | |
| 635 | |
| 636 image_manager_->RemoveImage(image_id); | |
| 637 } | |
| 638 | |
| 639 void GpuChannel::LoseAllContexts() { | 602 void GpuChannel::LoseAllContexts() { |
| 640 gpu_channel_manager_->LoseAllContexts(); | 603 gpu_channel_manager_->LoseAllContexts(); |
| 641 } | 604 } |
| 642 | 605 |
| 643 void GpuChannel::MarkAllContextsLost() { | 606 void GpuChannel::MarkAllContextsLost() { |
| 644 for (StubMap::Iterator<GpuCommandBufferStub> it(&stubs_); | 607 for (StubMap::Iterator<GpuCommandBufferStub> it(&stubs_); |
| 645 !it.IsAtEnd(); it.Advance()) { | 608 !it.IsAtEnd(); it.Advance()) { |
| 646 it.GetCurrentValue()->MarkContextLost(); | 609 it.GetCurrentValue()->MarkContextLost(); |
| 647 } | 610 } |
| 648 } | 611 } |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 774 int32 route_id, | 737 int32 route_id, |
| 775 bool* succeeded) { | 738 bool* succeeded) { |
| 776 TRACE_EVENT0("gpu", "GpuChannel::OnCreateOffscreenCommandBuffer"); | 739 TRACE_EVENT0("gpu", "GpuChannel::OnCreateOffscreenCommandBuffer"); |
| 777 GpuCommandBufferStub* share_group = stubs_.Lookup(init_params.share_group_id); | 740 GpuCommandBufferStub* share_group = stubs_.Lookup(init_params.share_group_id); |
| 778 | 741 |
| 779 scoped_ptr<GpuCommandBufferStub> stub(new GpuCommandBufferStub( | 742 scoped_ptr<GpuCommandBufferStub> stub(new GpuCommandBufferStub( |
| 780 this, | 743 this, |
| 781 share_group, | 744 share_group, |
| 782 gfx::GLSurfaceHandle(), | 745 gfx::GLSurfaceHandle(), |
| 783 mailbox_manager_.get(), | 746 mailbox_manager_.get(), |
| 784 image_manager_.get(), | |
| 785 size, | 747 size, |
| 786 disallowed_features_, | 748 disallowed_features_, |
| 787 init_params.attribs, | 749 init_params.attribs, |
| 788 init_params.gpu_preference, | 750 init_params.gpu_preference, |
| 789 false, | 751 false, |
| 790 route_id, | 752 route_id, |
| 791 0, | 753 0, |
| 792 watchdog_, | 754 watchdog_, |
| 793 software_, | 755 software_, |
| 794 init_params.active_url)); | 756 init_params.active_url)); |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 861 uint64 GpuChannel::GetMemoryUsage() { | 823 uint64 GpuChannel::GetMemoryUsage() { |
| 862 uint64 size = 0; | 824 uint64 size = 0; |
| 863 for (StubMap::Iterator<GpuCommandBufferStub> it(&stubs_); | 825 for (StubMap::Iterator<GpuCommandBufferStub> it(&stubs_); |
| 864 !it.IsAtEnd(); it.Advance()) { | 826 !it.IsAtEnd(); it.Advance()) { |
| 865 size += it.GetCurrentValue()->GetMemoryUsage(); | 827 size += it.GetCurrentValue()->GetMemoryUsage(); |
| 866 } | 828 } |
| 867 return size; | 829 return size; |
| 868 } | 830 } |
| 869 | 831 |
| 870 } // namespace content | 832 } // namespace content |
| OLD | NEW |