| Index: content/renderer/gpu/command_buffer_proxy.cc
|
| diff --git a/content/renderer/gpu/command_buffer_proxy.cc b/content/renderer/gpu/command_buffer_proxy.cc
|
| deleted file mode 100644
|
| index 82c06761023b6ea13b3415ff41f8f4e968249ec6..0000000000000000000000000000000000000000
|
| --- a/content/renderer/gpu/command_buffer_proxy.cc
|
| +++ /dev/null
|
| @@ -1,413 +0,0 @@
|
| -// Copyright (c) 2012 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 "content/renderer/gpu/command_buffer_proxy.h"
|
| -
|
| -#include "base/callback.h"
|
| -#include "base/debug/trace_event.h"
|
| -#include "base/logging.h"
|
| -#include "base/process_util.h"
|
| -#include "base/shared_memory.h"
|
| -#include "base/stl_util.h"
|
| -#include "content/common/child_process_messages.h"
|
| -#include "content/common/child_thread.h"
|
| -#include "content/common/gpu/gpu_messages.h"
|
| -#include "content/common/plugin_messages.h"
|
| -#include "content/common/view_messages.h"
|
| -#include "content/renderer/gpu/gpu_channel_host.h"
|
| -#include "content/renderer/plugin_channel_host.h"
|
| -#include "gpu/command_buffer/common/cmd_buffer_common.h"
|
| -#include "ui/gfx/size.h"
|
| -
|
| -using gpu::Buffer;
|
| -
|
| -CommandBufferProxy::CommandBufferProxy(
|
| - GpuChannelHost* channel,
|
| - int route_id)
|
| - : channel_(channel),
|
| - route_id_(route_id),
|
| - flush_count_(0) {
|
| -}
|
| -
|
| -CommandBufferProxy::~CommandBufferProxy() {
|
| - // Delete all the locally cached shared memory objects, closing the handle
|
| - // in this process.
|
| - for (TransferBufferMap::iterator it = transfer_buffers_.begin();
|
| - it != transfer_buffers_.end();
|
| - ++it) {
|
| - delete it->second.shared_memory;
|
| - it->second.shared_memory = NULL;
|
| - }
|
| -}
|
| -
|
| -bool CommandBufferProxy::OnMessageReceived(const IPC::Message& message) {
|
| - bool handled = true;
|
| - IPC_BEGIN_MESSAGE_MAP(CommandBufferProxy, message)
|
| - IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_UpdateState, OnUpdateState);
|
| - IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_Destroyed, OnDestroyed);
|
| - IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_NotifyRepaint,
|
| - OnNotifyRepaint);
|
| - IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_EchoAck, OnEchoAck);
|
| - IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_ConsoleMsg, OnConsoleMessage);
|
| - IPC_MESSAGE_UNHANDLED(handled = false)
|
| - IPC_END_MESSAGE_MAP()
|
| -
|
| - DCHECK(handled);
|
| - return handled;
|
| -}
|
| -
|
| -void CommandBufferProxy::OnChannelError() {
|
| - for (Decoders::iterator it = video_decoder_hosts_.begin();
|
| - it != video_decoder_hosts_.end(); ++it) {
|
| - it->second->OnChannelError();
|
| - }
|
| - OnDestroyed(gpu::error::kUnknown);
|
| -}
|
| -
|
| -void CommandBufferProxy::OnDestroyed(gpu::error::ContextLostReason reason) {
|
| - // Prevent any further messages from being sent.
|
| - channel_ = NULL;
|
| -
|
| - // When the client sees that the context is lost, they should delete this
|
| - // CommandBufferProxy and create a new one.
|
| - last_state_.error = gpu::error::kLostContext;
|
| - last_state_.context_lost_reason = reason;
|
| -
|
| - if (!channel_error_callback_.is_null()) {
|
| - channel_error_callback_.Run();
|
| - // Avoid calling the error callback more than once.
|
| - channel_error_callback_.Reset();
|
| - }
|
| -}
|
| -
|
| -void CommandBufferProxy::OnEchoAck() {
|
| - DCHECK(!echo_tasks_.empty());
|
| - base::Closure callback = echo_tasks_.front();
|
| - echo_tasks_.pop();
|
| - callback.Run();
|
| -}
|
| -
|
| -void CommandBufferProxy::OnConsoleMessage(
|
| - const GPUCommandBufferConsoleMessage& message) {
|
| - // TODO(gman): Pass this on to the console.
|
| - DLOG(INFO) << "CONSOLE_MESSAGE: "
|
| - << message.id << " : " << message.message;
|
| -}
|
| -
|
| -void CommandBufferProxy::SetChannelErrorCallback(
|
| - const base::Closure& callback) {
|
| - channel_error_callback_ = callback;
|
| -}
|
| -
|
| -bool CommandBufferProxy::Initialize() {
|
| - if (!channel_->factory()->IsMainThread())
|
| - return false;
|
| -
|
| - bool result;
|
| - if (!Send(new GpuCommandBufferMsg_Initialize(route_id_, &result))) {
|
| - LOG(ERROR) << "Could not send GpuCommandBufferMsg_Initialize.";
|
| - return false;
|
| - }
|
| -
|
| - if (!result) {
|
| - LOG(ERROR) << "Failed to initialize command buffer service.";
|
| - return false;
|
| - }
|
| -
|
| - return true;
|
| -}
|
| -
|
| -gpu::CommandBuffer::State CommandBufferProxy::GetState() {
|
| - // Send will flag state with lost context if IPC fails.
|
| - if (last_state_.error == gpu::error::kNoError) {
|
| - gpu::CommandBuffer::State state;
|
| - if (Send(new GpuCommandBufferMsg_GetState(route_id_, &state)))
|
| - OnUpdateState(state);
|
| - }
|
| -
|
| - return last_state_;
|
| -}
|
| -
|
| -gpu::CommandBuffer::State CommandBufferProxy::GetLastState() {
|
| - return last_state_;
|
| -}
|
| -
|
| -void CommandBufferProxy::Flush(int32 put_offset) {
|
| - if (last_state_.error != gpu::error::kNoError)
|
| - return;
|
| -
|
| - TRACE_EVENT1("gpu", "CommandBufferProxy::Flush", "put_offset", put_offset);
|
| -
|
| - Send(new GpuCommandBufferMsg_AsyncFlush(route_id_,
|
| - put_offset,
|
| - ++flush_count_));
|
| -}
|
| -
|
| -gpu::CommandBuffer::State CommandBufferProxy::FlushSync(int32 put_offset,
|
| - int32 last_known_get) {
|
| - TRACE_EVENT1("gpu", "CommandBufferProxy::FlushSync", "put_offset",
|
| - put_offset);
|
| - Flush(put_offset);
|
| - if (last_known_get == last_state_.get_offset) {
|
| - // Send will flag state with lost context if IPC fails.
|
| - if (last_state_.error == gpu::error::kNoError) {
|
| - gpu::CommandBuffer::State state;
|
| - if (Send(new GpuCommandBufferMsg_GetStateFast(route_id_,
|
| - &state)))
|
| - OnUpdateState(state);
|
| - }
|
| - }
|
| -
|
| - return last_state_;
|
| -}
|
| -
|
| -void CommandBufferProxy::SetGetBuffer(int32 shm_id) {
|
| - if (last_state_.error != gpu::error::kNoError)
|
| - return;
|
| -
|
| - Send(new GpuCommandBufferMsg_SetGetBuffer(route_id_, shm_id));
|
| -}
|
| -
|
| -void CommandBufferProxy::SetGetOffset(int32 get_offset) {
|
| - // Not implemented in proxy.
|
| - NOTREACHED();
|
| -}
|
| -
|
| -int32 CommandBufferProxy::CreateTransferBuffer(size_t size, int32 id_request) {
|
| - if (last_state_.error != gpu::error::kNoError)
|
| - return -1;
|
| -
|
| - // Take ownership of shared memory. This will close the handle if Send below
|
| - // fails. Otherwise, callee takes ownership before this variable
|
| - // goes out of scope by duping the handle.
|
| - scoped_ptr<base::SharedMemory> shm(
|
| - channel_->factory()->AllocateSharedMemory(size));
|
| - if (!shm.get())
|
| - return -1;
|
| -
|
| - base::SharedMemoryHandle handle = shm->handle();
|
| -#if defined(OS_POSIX)
|
| - DCHECK(!handle.auto_close);
|
| -#endif
|
| -
|
| - int32 id;
|
| - if (!Send(new GpuCommandBufferMsg_RegisterTransferBuffer(route_id_,
|
| - handle,
|
| - size,
|
| - id_request,
|
| - &id))) {
|
| - return -1;
|
| - }
|
| -
|
| - return id;
|
| -}
|
| -
|
| -int32 CommandBufferProxy::RegisterTransferBuffer(
|
| - base::SharedMemory* shared_memory,
|
| - size_t size,
|
| - int32 id_request) {
|
| - if (last_state_.error != gpu::error::kNoError)
|
| - return -1;
|
| -
|
| - int32 id;
|
| - if (!Send(new GpuCommandBufferMsg_RegisterTransferBuffer(
|
| - route_id_,
|
| - shared_memory->handle(), // Returns FileDescriptor with auto_close off.
|
| - size,
|
| - id_request,
|
| - &id))) {
|
| - return -1;
|
| - }
|
| -
|
| - return id;
|
| -}
|
| -
|
| -void CommandBufferProxy::DestroyTransferBuffer(int32 id) {
|
| - if (last_state_.error != gpu::error::kNoError)
|
| - return;
|
| -
|
| - // Remove the transfer buffer from the client side cache.
|
| - TransferBufferMap::iterator it = transfer_buffers_.find(id);
|
| - if (it != transfer_buffers_.end()) {
|
| - delete it->second.shared_memory;
|
| - transfer_buffers_.erase(it);
|
| - }
|
| -
|
| - Send(new GpuCommandBufferMsg_DestroyTransferBuffer(route_id_, id));
|
| -}
|
| -
|
| -Buffer CommandBufferProxy::GetTransferBuffer(int32 id) {
|
| - if (last_state_.error != gpu::error::kNoError)
|
| - return Buffer();
|
| -
|
| - // Check local cache to see if there is already a client side shared memory
|
| - // object for this id.
|
| - TransferBufferMap::iterator it = transfer_buffers_.find(id);
|
| - if (it != transfer_buffers_.end()) {
|
| - return it->second;
|
| - }
|
| -
|
| - // Assuming we are in the renderer process, the service is responsible for
|
| - // duplicating the handle. This might not be true for NaCl.
|
| - base::SharedMemoryHandle handle;
|
| - uint32 size;
|
| - if (!Send(new GpuCommandBufferMsg_GetTransferBuffer(route_id_,
|
| - id,
|
| - &handle,
|
| - &size))) {
|
| - return Buffer();
|
| - }
|
| -
|
| - // Cache the transfer buffer shared memory object client side.
|
| - base::SharedMemory* shared_memory = new base::SharedMemory(handle, false);
|
| -
|
| - // Map the shared memory on demand.
|
| - if (!shared_memory->memory()) {
|
| - if (!shared_memory->Map(size)) {
|
| - delete shared_memory;
|
| - return Buffer();
|
| - }
|
| - }
|
| -
|
| - Buffer buffer;
|
| - buffer.ptr = shared_memory->memory();
|
| - buffer.size = size;
|
| - buffer.shared_memory = shared_memory;
|
| - transfer_buffers_[id] = buffer;
|
| -
|
| - return buffer;
|
| -}
|
| -
|
| -void CommandBufferProxy::SetToken(int32 token) {
|
| - // Not implemented in proxy.
|
| - NOTREACHED();
|
| -}
|
| -
|
| -void CommandBufferProxy::OnNotifyRepaint() {
|
| - if (!notify_repaint_task_.is_null())
|
| - MessageLoop::current()->PostNonNestableTask(
|
| - FROM_HERE, notify_repaint_task_);
|
| - notify_repaint_task_.Reset();
|
| -}
|
| -
|
| -void CommandBufferProxy::SetParseError(
|
| - gpu::error::Error error) {
|
| - // Not implemented in proxy.
|
| - NOTREACHED();
|
| -}
|
| -
|
| -void CommandBufferProxy::SetContextLostReason(
|
| - gpu::error::ContextLostReason reason) {
|
| - // Not implemented in proxy.
|
| - NOTREACHED();
|
| -}
|
| -
|
| -bool CommandBufferProxy::Echo(const base::Closure& callback) {
|
| - if (last_state_.error != gpu::error::kNoError) {
|
| - return false;
|
| - }
|
| -
|
| - if (!Send(new GpuChannelMsg_Echo(GpuCommandBufferMsg_EchoAck(route_id_)))) {
|
| - return false;
|
| - }
|
| -
|
| - echo_tasks_.push(callback);
|
| -
|
| - return true;
|
| -}
|
| -
|
| -bool CommandBufferProxy::SetSurfaceVisible(bool visible) {
|
| - if (last_state_.error != gpu::error::kNoError) {
|
| - return false;
|
| - }
|
| -
|
| - return Send(new GpuCommandBufferMsg_SetSurfaceVisible(route_id_, visible));
|
| -}
|
| -
|
| -
|
| -bool CommandBufferProxy::SetParent(CommandBufferProxy* parent_command_buffer,
|
| - uint32 parent_texture_id) {
|
| - if (last_state_.error != gpu::error::kNoError)
|
| - return false;
|
| -
|
| - bool result;
|
| - if (parent_command_buffer) {
|
| - if (!Send(new GpuCommandBufferMsg_SetParent(
|
| - route_id_,
|
| - parent_command_buffer->route_id_,
|
| - parent_texture_id,
|
| - &result))) {
|
| - return false;
|
| - }
|
| - } else {
|
| - if (!Send(new GpuCommandBufferMsg_SetParent(
|
| - route_id_,
|
| - MSG_ROUTING_NONE,
|
| - 0,
|
| - &result))) {
|
| - return false;
|
| - }
|
| - }
|
| -
|
| - return result;
|
| -}
|
| -
|
| -void CommandBufferProxy::SetNotifyRepaintTask(const base::Closure& task) {
|
| - notify_repaint_task_ = task;
|
| -}
|
| -
|
| -scoped_refptr<GpuVideoDecodeAcceleratorHost>
|
| -CommandBufferProxy::CreateVideoDecoder(
|
| - media::VideoDecodeAccelerator::Profile profile,
|
| - media::VideoDecodeAccelerator::Client* client) {
|
| - int decoder_route_id;
|
| - if (!Send(new GpuCommandBufferMsg_CreateVideoDecoder(route_id_, profile,
|
| - &decoder_route_id))) {
|
| - LOG(ERROR) << "Send(GpuCommandBufferMsg_CreateVideoDecoder) failed";
|
| - return NULL;
|
| - }
|
| -
|
| - scoped_refptr<GpuVideoDecodeAcceleratorHost> decoder_host =
|
| - new GpuVideoDecodeAcceleratorHost(channel_, decoder_route_id, client);
|
| - bool inserted = video_decoder_hosts_.insert(std::make_pair(
|
| - decoder_route_id, decoder_host)).second;
|
| - DCHECK(inserted);
|
| -
|
| - channel_->AddRoute(decoder_route_id, decoder_host->AsWeakPtr());
|
| -
|
| - return decoder_host;
|
| -}
|
| -
|
| -gpu::error::Error CommandBufferProxy::GetLastError() {
|
| - return last_state_.error;
|
| -}
|
| -
|
| -bool CommandBufferProxy::Send(IPC::Message* msg) {
|
| - // Caller should not intentionally send a message if the context is lost.
|
| - DCHECK(last_state_.error == gpu::error::kNoError);
|
| -
|
| - if (channel_) {
|
| - if (channel_->Send(msg)) {
|
| - return true;
|
| - } else {
|
| - // Flag the command buffer as lost. Defer deleting the channel until
|
| - // OnChannelError is called after returning to the message loop in case
|
| - // it is referenced elsewhere.
|
| - last_state_.error = gpu::error::kLostContext;
|
| - return false;
|
| - }
|
| - }
|
| -
|
| - // Callee takes ownership of message, regardless of whether Send is
|
| - // successful. See IPC::Message::Sender.
|
| - delete msg;
|
| - return false;
|
| -}
|
| -
|
| -void CommandBufferProxy::OnUpdateState(const gpu::CommandBuffer::State& state) {
|
| - // Handle wraparound. It works as long as we don't have more than 2B state
|
| - // updates in flight across which reordering occurs.
|
| - if (state.generation - last_state_.generation < 0x80000000U)
|
| - last_state_ = state;
|
| -}
|
|
|