summaryrefslogtreecommitdiffstats
path: root/chrome/renderer
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/renderer')
-rw-r--r--chrome/renderer/command_buffer_proxy.cc77
-rw-r--r--chrome/renderer/command_buffer_proxy.h12
-rw-r--r--chrome/renderer/ggl/ggl.cc2
-rw-r--r--chrome/renderer/gpu_channel_host.cc17
-rw-r--r--chrome/renderer/gpu_channel_host.h6
-rw-r--r--chrome/renderer/pepper_plugin_delegate_impl.cc2
-rw-r--r--chrome/renderer/render_thread.cc8
-rw-r--r--chrome/renderer/webgraphicscontext3d_command_buffer_impl.cc2
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;