diff options
Diffstat (limited to 'chrome/renderer')
-rw-r--r-- | chrome/renderer/command_buffer_proxy.cc | 77 | ||||
-rw-r--r-- | chrome/renderer/command_buffer_proxy.h | 12 | ||||
-rw-r--r-- | chrome/renderer/ggl/ggl.cc | 2 | ||||
-rw-r--r-- | chrome/renderer/gpu_channel_host.cc | 17 | ||||
-rw-r--r-- | chrome/renderer/gpu_channel_host.h | 6 | ||||
-rw-r--r-- | chrome/renderer/pepper_plugin_delegate_impl.cc | 2 | ||||
-rw-r--r-- | chrome/renderer/render_thread.cc | 8 | ||||
-rw-r--r-- | chrome/renderer/webgraphicscontext3d_command_buffer_impl.cc | 2 |
8 files changed, 86 insertions, 40 deletions
diff --git a/chrome/renderer/command_buffer_proxy.cc b/chrome/renderer/command_buffer_proxy.cc index 0a0f9ad..0cc1e6a 100644 --- a/chrome/renderer/command_buffer_proxy.cc +++ b/chrome/renderer/command_buffer_proxy.cc @@ -53,16 +53,6 @@ void CommandBufferProxy::OnChannelError() { last_state_.error = gpu::error::kLostContext; } -bool CommandBufferProxy::Send(IPC::Message* msg) { - if (channel_) - return channel_->Send(msg); - - // Callee takes ownership of message, regardless of whether Send is - // successful. See IPC::Message::Sender. - delete msg; - return false; -} - bool CommandBufferProxy::Initialize(int32 size) { DCHECK(!ring_buffer_.get()); @@ -94,14 +84,21 @@ Buffer CommandBufferProxy::GetRingBuffer() { } gpu::CommandBuffer::State CommandBufferProxy::GetState() { - Send(new GpuCommandBufferMsg_GetState(route_id_, &last_state_)); + // Send will flag state with lost context if IPC fails. + if (last_state_.error == gpu::error::kNoError) + Send(new GpuCommandBufferMsg_GetState(route_id_, &last_state_)); + return last_state_; } gpu::CommandBuffer::State CommandBufferProxy::Flush(int32 put_offset) { - Send(new GpuCommandBufferMsg_Flush(route_id_, - put_offset, - &last_state_)); + // Send will flag state with lost context if IPC fails. + if (last_state_.error == gpu::error::kNoError) { + Send(new GpuCommandBufferMsg_Flush(route_id_, + put_offset, + &last_state_)); + } + return last_state_; } @@ -111,14 +108,22 @@ void CommandBufferProxy::SetGetOffset(int32 get_offset) { } int32 CommandBufferProxy::CreateTransferBuffer(size_t size) { - int32 id; - if (Send(new GpuCommandBufferMsg_CreateTransferBuffer(route_id_, size, &id))) - return id; + if (last_state_.error == gpu::error::kNoError) { + int32 id; + if (Send(new GpuCommandBufferMsg_CreateTransferBuffer(route_id_, + size, + &id))) { + return id; + } + } return -1; } void CommandBufferProxy::DestroyTransferBuffer(int32 id) { + if (last_state_.error != gpu::error::kNoError) + return; + // Remove the transfer buffer from the client side4 cache. TransferBufferMap::iterator it = transfer_buffers_.find(id); DCHECK(it != transfer_buffers_.end()); @@ -132,6 +137,9 @@ void CommandBufferProxy::DestroyTransferBuffer(int32 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); @@ -197,8 +205,12 @@ void CommandBufferProxy::SetSwapBuffersCallback(Callback0::Type* callback) { } void CommandBufferProxy::ResizeOffscreenFrameBuffer(const gfx::Size& size) { + if (last_state_.error != gpu::error::kNoError) + return; + IPC::Message* message = new GpuCommandBufferMsg_ResizeOffscreenFrameBuffer(route_id_, size); + // We need to set the unblock flag on this message to guarantee the // order in which it is processed in the GPU process. Ordinarily in // certain situations, namely if a synchronous message is being @@ -220,11 +232,17 @@ void CommandBufferProxy::SetNotifyRepaintTask(Task* task) { #if defined(OS_MACOSX) void CommandBufferProxy::SetWindowSize(const gfx::Size& size) { + if (last_state_.error != gpu::error::kNoError) + return; + Send(new GpuCommandBufferMsg_SetWindowSize(route_id_, size)); } #endif void CommandBufferProxy::AsyncGetState(Task* completion_task) { + if (last_state_.error != gpu::error::kNoError) + return; + IPC::Message* message = new GpuCommandBufferMsg_AsyncGetState(route_id_); // Do not let a synchronous flush hold up this message. If this handler is @@ -237,6 +255,9 @@ void CommandBufferProxy::AsyncGetState(Task* completion_task) { } void CommandBufferProxy::AsyncFlush(int32 put_offset, Task* completion_task) { + if (last_state_.error != gpu::error::kNoError) + return; + IPC::Message* message = new GpuCommandBufferMsg_AsyncFlush(route_id_, put_offset); @@ -249,6 +270,28 @@ void CommandBufferProxy::AsyncFlush(int32 put_offset, Task* completion_task) { pending_async_flush_tasks_.push(linked_ptr<Task>(completion_task)); } +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) { last_state_ = state; diff --git a/chrome/renderer/command_buffer_proxy.h b/chrome/renderer/command_buffer_proxy.h index 89a00df..245c0580 100644 --- a/chrome/renderer/command_buffer_proxy.h +++ b/chrome/renderer/command_buffer_proxy.h @@ -32,8 +32,7 @@ class Task; // Client side proxy that forwards messages synchronously to a // CommandBufferStub. class CommandBufferProxy : public gpu::CommandBuffer, - public IPC::Channel::Listener, - public IPC::Message::Sender { + public IPC::Channel::Listener { public: CommandBufferProxy(IPC::Channel::Sender* channel, int route_id); virtual ~CommandBufferProxy(); @@ -42,9 +41,6 @@ class CommandBufferProxy : public gpu::CommandBuffer, virtual void OnMessageReceived(const IPC::Message& message); virtual void OnChannelError(); - // IPC::Message::Sender implementation: - virtual bool Send(IPC::Message* msg); - int route_id() const { return route_id_; } // CommandBuffer implementation: @@ -89,6 +85,12 @@ class CommandBufferProxy : public gpu::CommandBuffer, void AsyncFlush(int32 put_offset, Task* completion_task); private: + + // Send an IPC message over the GPU channel. This is private to fully + // encapsulate the channel; all callers of this function must explicitly + // verify that the context has not been lost. + bool Send(IPC::Message* msg); + // Message handlers: void OnUpdateState(const gpu::CommandBuffer::State& state); void OnNotifyRepaint(); diff --git a/chrome/renderer/ggl/ggl.cc b/chrome/renderer/ggl/ggl.cc index cfe6743..67fc932 100644 --- a/chrome/renderer/ggl/ggl.cc +++ b/chrome/renderer/ggl/ggl.cc @@ -158,7 +158,7 @@ bool Context::Initialize(gfx::NativeViewId view, const int32* attrib_list) { DCHECK(size.width() >= 0 && size.height() >= 0); - if (channel_->state() != GpuChannelHost::CONNECTED) + if (channel_->state() != GpuChannelHost::kConnected) return false; // Ensure the gles2 library is initialized first in a thread safe way. diff --git a/chrome/renderer/gpu_channel_host.cc b/chrome/renderer/gpu_channel_host.cc index e2e14be..6ce8d7d 100644 --- a/chrome/renderer/gpu_channel_host.cc +++ b/chrome/renderer/gpu_channel_host.cc @@ -10,7 +10,7 @@ #include "chrome/renderer/command_buffer_proxy.h" #include "chrome/renderer/gpu_video_service_host.h" -GpuChannelHost::GpuChannelHost() : state_(UNCONNECTED) { +GpuChannelHost::GpuChannelHost() : state_(kUnconnected) { } GpuChannelHost::~GpuChannelHost() { @@ -26,7 +26,7 @@ void GpuChannelHost::Connect(const std::string& channel_name) { // It is safe to send IPC messages before the channel completes the connection // and receives the hello message from the GPU process. The messages get // cached. - state_ = CONNECTED; + state_ = kConnected; } void GpuChannelHost::set_gpu_info(const GPUInfo& gpu_info) { @@ -55,7 +55,7 @@ void GpuChannelHost::OnChannelConnected(int32 peer_pid) { } void GpuChannelHost::OnChannelError() { - state_ = LOST; + state_ = kLost; // Channel is invalid and will be reinitialized if this host is requested // again. @@ -76,12 +76,13 @@ void GpuChannelHost::OnChannelError() { } bool GpuChannelHost::Send(IPC::Message* message) { - if (!channel_.get()) { - delete message; - return false; - } + if (channel_.get()) + return channel_->Send(message); - return channel_->Send(message); + // Callee takes ownership of message, regardless of whether Send is + // successful. See IPC::Message::Sender. + delete message; + return false; } CommandBufferProxy* GpuChannelHost::CreateViewCommandBuffer( diff --git a/chrome/renderer/gpu_channel_host.h b/chrome/renderer/gpu_channel_host.h index dc738bd..818202e 100644 --- a/chrome/renderer/gpu_channel_host.h +++ b/chrome/renderer/gpu_channel_host.h @@ -30,12 +30,12 @@ class GpuChannelHost : public IPC::Channel::Listener, public: enum State { // Not yet connected. - UNCONNECTED, + kUnconnected, // Ready to use. - CONNECTED, + kConnected, // An error caused the host to become disconnected. Recreate channel to // reestablish connection. - LOST + kLost }; // Called on the render thread diff --git a/chrome/renderer/pepper_plugin_delegate_impl.cc b/chrome/renderer/pepper_plugin_delegate_impl.cc index d7b6c87..d056fdb 100644 --- a/chrome/renderer/pepper_plugin_delegate_impl.cc +++ b/chrome/renderer/pepper_plugin_delegate_impl.cc @@ -196,7 +196,7 @@ bool PlatformContext3DImpl::Init() { if (!host) return false; - DCHECK(host->state() == GpuChannelHost::CONNECTED); + DCHECK(host->state() == GpuChannelHost::kConnected); // TODO(apatrick): Let Pepper plugins configure their back buffer surface. static const int32 attribs[] = { diff --git a/chrome/renderer/render_thread.cc b/chrome/renderer/render_thread.cc index a43a6ec..b871bbe 100644 --- a/chrome/renderer/render_thread.cc +++ b/chrome/renderer/render_thread.cc @@ -765,12 +765,12 @@ void RenderThread::EstablishGpuChannel() { if (gpu_channel_.get()) { // Do nothing if we already have a GPU channel or are already // establishing one. - if (gpu_channel_->state() == GpuChannelHost::UNCONNECTED || - gpu_channel_->state() == GpuChannelHost::CONNECTED) + if (gpu_channel_->state() == GpuChannelHost::kUnconnected || + gpu_channel_->state() == GpuChannelHost::kConnected) return; // Recreate the channel if it has been lost. - if (gpu_channel_->state() == GpuChannelHost::LOST) + if (gpu_channel_->state() == GpuChannelHost::kLost) gpu_channel_ = NULL; } @@ -791,7 +791,7 @@ GpuChannelHost* RenderThread::GetGpuChannel() { if (!gpu_channel_.get()) return NULL; - if (gpu_channel_->state() != GpuChannelHost::CONNECTED) + if (gpu_channel_->state() != GpuChannelHost::kConnected) return NULL; return gpu_channel_.get(); diff --git a/chrome/renderer/webgraphicscontext3d_command_buffer_impl.cc b/chrome/renderer/webgraphicscontext3d_command_buffer_impl.cc index 5246bdc..f8725af 100644 --- a/chrome/renderer/webgraphicscontext3d_command_buffer_impl.cc +++ b/chrome/renderer/webgraphicscontext3d_command_buffer_impl.cc @@ -72,7 +72,7 @@ bool WebGraphicsContext3DCommandBufferImpl::initialize( GpuChannelHost* host = render_thread->EstablishGpuChannelSync(); if (!host) return false; - DCHECK(host->state() == GpuChannelHost::CONNECTED); + DCHECK(host->state() == GpuChannelHost::kConnected); // Convert WebGL context creation attributes into GGL/EGL size requests. const int alpha_size = attributes.alpha ? 8 : 0; |