diff options
author | kbr@google.com <kbr@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-02-03 02:28:48 +0000 |
---|---|---|
committer | kbr@google.com <kbr@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-02-03 02:28:48 +0000 |
commit | 43f28f83bc268dea720843a2616058b64b3e8810 (patch) | |
tree | 3c3c4fc9c43dad15246fae82cb5b965e6b217281 /chrome/plugin | |
parent | 2d48004e1f2c8cecd015144c179f993d883aba9c (diff) | |
download | chromium_src-43f28f83bc268dea720843a2616058b64b3e8810.zip chromium_src-43f28f83bc268dea720843a2616058b64b3e8810.tar.gz chromium_src-43f28f83bc268dea720843a2616058b64b3e8810.tar.bz2 |
[GPU] Get GPU process running on the mac
Initial port of GPU process / plugin to Mac OS X. Uses new IOSurface
APIs and therefore currently runs only on 10.6. Alternate strategy
will need to be devised for 10.5.
Slight UI issues remain such as GPU plugins initially showing up in
the wrong place on the page. These will be fixed in follow-on bugs.
Minimal changes made to command buffer code to get it to compile on
Mac OS X. Commented out use of nested anonymous namespaces in
gles2_cmd_decoder.cc which were causing the linker to crash with a seg
fault.
Refactored gyp files so the OS test enabling the GPU plugin is in one
place, common.gypi, and other files test only the variable enable_gpu.
Slight change to gles2_demo_cc.cc to add some simple animation to
verify that updates from the GPU plugin are reaching the screen.
Changed Pepper test plugin to use 3D view by default and commented out
use of audio context because of recent issues.
TEST=none (ran Pepper Test Plugin with 3D view enabled)
BUG=http://crbug.com/25988
Review URL: http://codereview.chromium.org/558035
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@37934 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/plugin')
-rw-r--r-- | chrome/plugin/command_buffer_stub.cc | 29 | ||||
-rw-r--r-- | chrome/plugin/command_buffer_stub.h | 9 | ||||
-rw-r--r-- | chrome/plugin/webplugin_delegate_stub.cc | 15 | ||||
-rw-r--r-- | chrome/plugin/webplugin_delegate_stub.h | 8 |
4 files changed, 59 insertions, 2 deletions
diff --git a/chrome/plugin/command_buffer_stub.cc b/chrome/plugin/command_buffer_stub.cc index 4b062e8..b019b1f 100644 --- a/chrome/plugin/command_buffer_stub.cc +++ b/chrome/plugin/command_buffer_stub.cc @@ -5,14 +5,17 @@ #include "base/process_util.h" #include "base/shared_memory.h" #include "chrome/common/command_buffer_messages.h" +#include "chrome/common/plugin_messages.h" #include "chrome/plugin/command_buffer_stub.h" #include "chrome/plugin/plugin_channel.h" using gpu::Buffer; CommandBufferStub::CommandBufferStub(PluginChannel* channel, + int plugin_host_route_id, gfx::PluginWindowHandle window) : channel_(channel), + plugin_host_route_id_(plugin_host_route_id), window_(window) { route_id_ = channel->GenerateRouteID(); channel->AddRoute(route_id_, this, false); @@ -58,6 +61,11 @@ void CommandBufferStub::OnInitialize(int32 size, command_buffer_->SetPutOffsetChangeCallback( NewCallback(processor_.get(), &gpu::GPUProcessor::ProcessCommands)); +#if defined(OS_MACOSX) + processor_->SetSwapBuffersCallback( + NewCallback(this, + &CommandBufferStub::SwapBuffersCallback)); +#endif buffer.shared_memory->ShareToProcess(peer_handle, ring_buffer); } else { processor_ = NULL; @@ -108,6 +116,24 @@ void CommandBufferStub::OnGetTransferBuffer( base::CloseProcessHandle(peer_handle); } +#if defined(OS_MACOSX) +void CommandBufferStub::OnSetWindowSize(int32 width, int32 height) { + uint64 new_backing_store = processor_->SetWindowSize(width, height); + if (new_backing_store) { + Send(new PluginHostMsg_GPUPluginSetIOSurface(plugin_host_route_id_, + window_, + width, + height, + new_backing_store)); + } +} + +void CommandBufferStub::SwapBuffersCallback() { + Send(new PluginHostMsg_GPUPluginBuffersSwapped(plugin_host_route_id_, + window_)); +} +#endif + void CommandBufferStub::OnMessageReceived(const IPC::Message& msg) { IPC_BEGIN_MESSAGE_MAP(CommandBufferStub, msg) IPC_MESSAGE_HANDLER(CommandBufferMsg_Initialize, OnInitialize); @@ -119,6 +145,9 @@ void CommandBufferStub::OnMessageReceived(const IPC::Message& msg) { OnDestroyTransferBuffer); IPC_MESSAGE_HANDLER(CommandBufferMsg_GetTransferBuffer, OnGetTransferBuffer); +#if defined(OS_MACOSX) + IPC_MESSAGE_HANDLER(CommandBufferMsg_SetWindowSize, OnSetWindowSize); +#endif IPC_MESSAGE_UNHANDLED_ERROR() IPC_END_MESSAGE_MAP() } diff --git a/chrome/plugin/command_buffer_stub.h b/chrome/plugin/command_buffer_stub.h index 1001ce9..7759392 100644 --- a/chrome/plugin/command_buffer_stub.h +++ b/chrome/plugin/command_buffer_stub.h @@ -22,7 +22,9 @@ class CommandBufferService; class CommandBufferStub : public IPC::Channel::Listener, public IPC::Message::Sender { public: - CommandBufferStub(PluginChannel* channel, gfx::PluginWindowHandle window); + CommandBufferStub(PluginChannel* channel, + int plugin_host_route_id, + gfx::PluginWindowHandle window); virtual ~CommandBufferStub(); @@ -45,8 +47,13 @@ class CommandBufferStub : public IPC::Channel::Listener, void OnGetTransferBuffer(int32 id, base::SharedMemoryHandle* transfer_buffer, size_t* size); +#if defined(OS_MACOSX) + void OnSetWindowSize(int32 width, int32 height); + void SwapBuffersCallback(); +#endif scoped_refptr<PluginChannel> channel_; + int plugin_host_route_id_; gfx::PluginWindowHandle window_; int route_id_; scoped_ptr<gpu::CommandBufferService> command_buffer_; diff --git a/chrome/plugin/webplugin_delegate_stub.cc b/chrome/plugin/webplugin_delegate_stub.cc index cf6e842..80d6e62 100644 --- a/chrome/plugin/webplugin_delegate_stub.cc +++ b/chrome/plugin/webplugin_delegate_stub.cc @@ -139,6 +139,10 @@ void WebPluginDelegateStub::OnMessageReceived(const IPC::Message& msg) { OnHTTPRangeRequestReply) IPC_MESSAGE_HANDLER(PluginMsg_CreateCommandBuffer, OnCreateCommandBuffer) +#if defined(OS_MACOSX) + IPC_MESSAGE_HANDLER(PluginMsg_SetFakeGPUPluginWindowHandle, + OnSetFakeGPUPluginWindowHandle) +#endif IPC_MESSAGE_UNHANDLED_ERROR() IPC_END_MESSAGE_MAP() @@ -375,7 +379,8 @@ void WebPluginDelegateStub::OnInstallMissingPlugin() { void WebPluginDelegateStub::OnCreateCommandBuffer(int* route_id) { #if defined(ENABLE_GPU) command_buffer_stub_.reset(new CommandBufferStub( - static_cast<PluginChannel*>(PluginChannelBase::GetCurrentChannel()), + channel_, + instance_id_, delegate_->windowed_handle())); *route_id = command_buffer_stub_->route_id(); @@ -428,3 +433,11 @@ void WebPluginDelegateStub::OnHTTPRangeRequestReply( delegate_->CreateSeekableResourceClient(resource_id, range_request_id); webplugin_->OnResourceCreated(resource_id, resource_client); } + +#if defined(OS_MACOSX) +void WebPluginDelegateStub::OnSetFakeGPUPluginWindowHandle( + gfx::PluginWindowHandle window) { + delegate_->set_windowed_handle(window); +} +#endif + diff --git a/chrome/plugin/webplugin_delegate_stub.h b/chrome/plugin/webplugin_delegate_stub.h index b783832..5a04758 100644 --- a/chrome/plugin/webplugin_delegate_stub.h +++ b/chrome/plugin/webplugin_delegate_stub.h @@ -115,6 +115,14 @@ class WebPluginDelegateStub : public IPC::Channel::Listener, // If this is the GPU plugin, the stub object that forwards to the // command buffer service. scoped_ptr<CommandBufferStub> command_buffer_stub_; + +#if defined(OS_MACOSX) + // If this is the GPU plugin, we need to be receive a fake window + // handle which is used for subsequent communication back to the + // browser. + void OnSetFakeGPUPluginWindowHandle(gfx::PluginWindowHandle window); +#endif + #endif DISALLOW_IMPLICIT_CONSTRUCTORS(WebPluginDelegateStub); |