Index: chrome/plugin/command_buffer_stub.cc |
=================================================================== |
--- chrome/plugin/command_buffer_stub.cc (revision 0) |
+++ chrome/plugin/command_buffer_stub.cc (revision 0) |
@@ -0,0 +1,135 @@ |
+// Copyright (c) 2009 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "base/process_util.h" |
+#include "base/shared_memory.h" |
+#include "chrome/common/command_buffer_messages.h" |
+#include "chrome/plugin/command_buffer_stub.h" |
+#include "chrome/plugin/plugin_channel.h" |
+ |
+CommandBufferStub::CommandBufferStub(PluginChannel* channel, |
+ gfx::NativeView view) |
+ : channel_(channel), |
+ view_(view) { |
+ route_id_ = channel->GenerateRouteID(); |
+ channel->AddRoute(route_id_, this, false); |
+} |
+ |
+CommandBufferStub::~CommandBufferStub() { |
+ channel_->RemoveRoute(route_id_); |
+} |
+ |
+void CommandBufferStub::OnChannelError() { |
+ NOTREACHED() << "CommandBufferService::OnChannelError called"; |
+} |
+ |
+bool CommandBufferStub::Send(IPC::Message* message) { |
+ if (!channel_) { |
+ delete message; |
+ return false; |
+ } |
+ |
+ return channel_->Send(message); |
+} |
+ |
+void CommandBufferStub::OnInitialize(int32 size, |
+ base::SharedMemoryHandle* ring_buffer) { |
+ DCHECK(!command_buffer_.get()); |
+ |
+ *ring_buffer = base::SharedMemory::NULLHandle(); |
+ |
+ // Assume service is responsible for duplicating the handle from the calling |
+ // process. |
+ base::ProcessHandle peer_handle; |
+ if (base::OpenProcessHandle(channel_->peer_pid(), &peer_handle)) |
+ return; |
+ |
+ command_buffer_.reset(new gpu::CommandBufferService); |
+ |
+ // Initialize the CommandBufferService and GPUProcessor. |
+ base::SharedMemory* shared_memory = command_buffer_->Initialize(size); |
+ if (shared_memory) { |
+ processor_ = new gpu::GPUProcessor(command_buffer_.get()); |
+ if (processor_->Initialize(view_)) { |
+ command_buffer_->SetPutOffsetChangeCallback( |
+ NewCallback(processor_.get(), |
+ &gpu::GPUProcessor::ProcessCommands)); |
+ shared_memory->ShareToProcess(peer_handle, ring_buffer); |
+ } else { |
+ processor_ = NULL; |
+ command_buffer_.reset(); |
+ } |
+ } |
+ |
+ base::CloseProcessHandle(peer_handle); |
+} |
+ |
+void CommandBufferStub::OnSyncOffsets(int32 put_offset, int32* get_offset) { |
+ *get_offset = command_buffer_->SyncOffsets(put_offset); |
+} |
+ |
+void CommandBufferStub::OnGetGetOffset(int32* get_offset) { |
+ *get_offset = command_buffer_->GetGetOffset(); |
+} |
+ |
+void CommandBufferStub::OnGetPutOffset(int32* put_offset) { |
+ *put_offset = command_buffer_->GetPutOffset(); |
+} |
+ |
+void CommandBufferStub::OnCreateTransferBuffer(int32 size, int32* id) { |
+ *id = command_buffer_->CreateTransferBuffer(size); |
+} |
+ |
+void CommandBufferStub::OnDestroyTransferBuffer(int32 id) { |
+ command_buffer_->DestroyTransferBuffer(id); |
+} |
+ |
+void CommandBufferStub::OnGetTransferBuffer(int32 id, |
+ base::SharedMemoryHandle* transfer_buffer) { |
+ *transfer_buffer = 0; |
+ |
+ // Assume service is responsible for duplicating the handle to the calling |
+ // process. |
+ base::ProcessHandle peer_handle; |
+ if (base::OpenProcessHandle(channel_->peer_pid(), &peer_handle)) |
+ return; |
+ |
+ base::SharedMemory* shared_memory = command_buffer_->GetTransferBuffer(id); |
+ if (shared_memory) { |
+ shared_memory->ShareToProcess(peer_handle, transfer_buffer); |
+ } |
+ |
+ base::CloseProcessHandle(peer_handle); |
+} |
+ |
+void CommandBufferStub::OnGetToken(int32* token) { |
+ *token = command_buffer_->GetToken(); |
+} |
+ |
+void CommandBufferStub::OnResetParseError(int32* parse_error) { |
+ *parse_error = command_buffer_->ResetParseError(); |
+} |
+ |
+void CommandBufferStub::OnGetErrorStatus(bool* error_status) { |
+ *error_status = command_buffer_->GetErrorStatus(); |
+} |
+ |
+void CommandBufferStub::OnMessageReceived(const IPC::Message& msg) { |
+ IPC_BEGIN_MESSAGE_MAP(CommandBufferStub, msg) |
+ IPC_MESSAGE_HANDLER(CommandBufferMsg_Initialize, OnInitialize); |
+ IPC_MESSAGE_HANDLER(CommandBufferMsg_SyncOffsets, OnSyncOffsets); |
+ IPC_MESSAGE_HANDLER(CommandBufferMsg_GetGetOffset, OnGetGetOffset); |
+ IPC_MESSAGE_HANDLER(CommandBufferMsg_GetPutOffset, OnGetPutOffset); |
+ IPC_MESSAGE_HANDLER(CommandBufferMsg_CreateTransferBuffer, |
+ OnCreateTransferBuffer); |
+ IPC_MESSAGE_HANDLER(CommandBufferMsg_DestroyTransferBuffer, |
+ OnDestroyTransferBuffer); |
+ IPC_MESSAGE_HANDLER(CommandBufferMsg_GetTransferBuffer, |
+ OnGetTransferBuffer); |
+ IPC_MESSAGE_HANDLER(CommandBufferMsg_GetToken, OnGetToken); |
+ IPC_MESSAGE_HANDLER(CommandBufferMsg_ResetParseError, OnResetParseError); |
+ IPC_MESSAGE_HANDLER(CommandBufferMsg_GetErrorStatus, OnGetErrorStatus); |
+ IPC_MESSAGE_UNHANDLED_ERROR() |
+ IPC_END_MESSAGE_MAP() |
+} |
Property changes on: chrome\plugin\command_buffer_stub.cc |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |