| Index: content/common/gpu/gpu_channel.cc
|
| ===================================================================
|
| --- content/common/gpu/gpu_channel.cc (revision 93137)
|
| +++ content/common/gpu/gpu_channel.cc (working copy)
|
| @@ -33,8 +33,7 @@
|
| renderer_process_(base::kNullProcessHandle),
|
| renderer_pid_(base::kNullProcessId),
|
| share_group_(new gfx::GLShareGroup),
|
| - watchdog_(watchdog),
|
| - task_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {
|
| + watchdog_(watchdog) {
|
| DCHECK(gpu_channel_manager);
|
| DCHECK(renderer_id);
|
| const CommandLine* command_line = CommandLine::ForCurrentProcess();
|
| @@ -87,20 +86,9 @@
|
| << " with type " << message.type();
|
| }
|
|
|
| - // Control messages are not deferred and can be handled out of order with
|
| - // respect to routed ones.
|
| if (message.routing_id() == MSG_ROUTING_CONTROL)
|
| return OnControlMessageReceived(message);
|
|
|
| - // If the channel is unscheduled, defer sync and async messages until it is
|
| - // rescheduled. Also, even if the channel is scheduled, do not allow newly
|
| - // received messages to be handled before previously received deferred ones;
|
| - // append them to the deferred queue as well.
|
| - if (!IsScheduled() || !deferred_messages_.empty()) {
|
| - deferred_messages_.push(new IPC::Message(message));
|
| - return true;
|
| - }
|
| -
|
| if (!router_.RouteMessage(message)) {
|
| // Respond to sync messages even if router failed to route.
|
| if (message.is_sync()) {
|
| @@ -111,20 +99,6 @@
|
| return false;
|
| }
|
|
|
| - // If the channel becomes unscheduled as a result of handling the message,
|
| - // synthesize an IPC message to flush the command buffer that became
|
| - // unscheduled.
|
| - for (StubMap::Iterator<GpuCommandBufferStub> it(&stubs_);
|
| - !it.IsAtEnd();
|
| - it.Advance()) {
|
| - GpuCommandBufferStub* stub = it.GetCurrentValue();
|
| - if (!stub->IsScheduled()) {
|
| - DCHECK(deferred_messages_.empty());
|
| - deferred_messages_.push(new GpuCommandBufferMsg_Rescheduled(
|
| - stub->route_id()));
|
| - }
|
| - }
|
| -
|
| return true;
|
| }
|
|
|
| @@ -153,30 +127,6 @@
|
| return channel_->Send(message);
|
| }
|
|
|
| -bool GpuChannel::IsScheduled() {
|
| - for (StubMap::Iterator<GpuCommandBufferStub> it(&stubs_);
|
| - !it.IsAtEnd();
|
| - it.Advance()) {
|
| - GpuCommandBufferStub* stub = it.GetCurrentValue();
|
| - if (!stub->IsScheduled())
|
| - return false;
|
| - }
|
| -
|
| - return true;
|
| -}
|
| -
|
| -void GpuChannel::OnScheduled() {
|
| - // Post a task to handle any deferred messages. The deferred message queue is
|
| - // not emptied here, which ensures that OnMessageReceived will continue to
|
| - // defer newly received messages until the ones in the queue have all been
|
| - // handled by HandleDeferredMessages. HandleDeferredMessages is invoked as a
|
| - // task to prevent reentrancy.
|
| - MessageLoop::current()->PostTask(
|
| - FROM_HERE,
|
| - task_factory_.NewRunnableMethod(
|
| - &GpuChannel::HandleDeferredMessages));
|
| -}
|
| -
|
| void GpuChannel::LoseAllContexts() {
|
| gpu_channel_manager_->LoseAllContexts();
|
| }
|
| @@ -268,7 +218,7 @@
|
| // that matches the given render_view_id and delete the route.
|
| for (StubMap::const_iterator iter(&stubs_); !iter.IsAtEnd(); iter.Advance()) {
|
| if (iter.GetCurrentValue()->render_view_id() == render_view_id) {
|
| - OnDestroyCommandBuffer(iter.GetCurrentKey(), NULL);
|
| + OnDestroyCommandBuffer(iter.GetCurrentKey());
|
| return;
|
| }
|
| }
|
| @@ -276,17 +226,15 @@
|
| #endif
|
|
|
| bool GpuChannel::OnControlMessageReceived(const IPC::Message& msg) {
|
| - // Always use IPC_MESSAGE_HANDLER_DELAY_REPLY for synchronous message handlers
|
| - // here. This is so the reply can be delayed if the scheduler is unscheduled.
|
| bool handled = true;
|
| IPC_BEGIN_MESSAGE_MAP(GpuChannel, msg)
|
| IPC_MESSAGE_HANDLER(GpuChannelMsg_Initialize, OnInitialize)
|
| - IPC_MESSAGE_HANDLER_DELAY_REPLY(GpuChannelMsg_CreateOffscreenCommandBuffer,
|
| - OnCreateOffscreenCommandBuffer)
|
| - IPC_MESSAGE_HANDLER_DELAY_REPLY(GpuChannelMsg_DestroyCommandBuffer,
|
| - OnDestroyCommandBuffer)
|
| - IPC_MESSAGE_HANDLER_DELAY_REPLY(GpuChannelMsg_CreateOffscreenSurface,
|
| - OnCreateOffscreenSurface)
|
| + IPC_MESSAGE_HANDLER(GpuChannelMsg_CreateOffscreenCommandBuffer,
|
| + OnCreateOffscreenCommandBuffer)
|
| + IPC_MESSAGE_HANDLER(GpuChannelMsg_DestroyCommandBuffer,
|
| + OnDestroyCommandBuffer)
|
| + IPC_MESSAGE_HANDLER(GpuChannelMsg_CreateOffscreenSurface,
|
| + OnCreateOffscreenSurface)
|
| IPC_MESSAGE_HANDLER(GpuChannelMsg_DestroySurface, OnDestroySurface)
|
| IPC_MESSAGE_HANDLER(GpuChannelMsg_CreateTransportTexture,
|
| OnCreateTransportTexture)
|
| @@ -296,21 +244,6 @@
|
| return handled;
|
| }
|
|
|
| -void GpuChannel::HandleDeferredMessages() {
|
| - // Empty the deferred queue so OnMessageRecieved does not defer on that
|
| - // account and to prevent an infinite loop if the scheduler is unscheduled
|
| - // as a result of handling already deferred messages.
|
| - std::queue<IPC::Message*> deferred_messages_copy;
|
| - std::swap(deferred_messages_copy, deferred_messages_);
|
| -
|
| - while (!deferred_messages_copy.empty()) {
|
| - scoped_ptr<IPC::Message> message(deferred_messages_copy.front());
|
| - deferred_messages_copy.pop();
|
| -
|
| - OnMessageReceived(*message);
|
| - }
|
| -}
|
| -
|
| int GpuChannel::GenerateRouteID() {
|
| static int last_id = 0;
|
| return ++last_id;
|
| @@ -328,12 +261,10 @@
|
| void GpuChannel::OnCreateOffscreenCommandBuffer(
|
| const gfx::Size& size,
|
| const GPUCreateCommandBufferConfig& init_params,
|
| - IPC::Message* reply_message) {
|
| - int32 route_id = MSG_ROUTING_NONE;
|
| -
|
| + int32* route_id) {
|
| content::GetContentClient()->SetActiveURL(init_params.active_url);
|
| #if defined(ENABLE_GPU)
|
| - route_id = GenerateRouteID();
|
| + *route_id = GenerateRouteID();
|
|
|
| scoped_ptr<GpuCommandBufferStub> stub(new GpuCommandBufferStub(
|
| this,
|
| @@ -342,38 +273,36 @@
|
| disallowed_extensions_,
|
| init_params.allowed_extensions,
|
| init_params.attribs,
|
| - route_id,
|
| + *route_id,
|
| 0, 0, watchdog_));
|
| - router_.AddRoute(route_id, stub.get());
|
| - stubs_.AddWithID(stub.release(), route_id);
|
| + router_.AddRoute(*route_id, stub.get());
|
| + stubs_.AddWithID(stub.release(), *route_id);
|
| TRACE_EVENT1("gpu", "GpuChannel::OnCreateOffscreenCommandBuffer",
|
| "route_id", route_id);
|
| +#else
|
| + *route_id = MSG_ROUTING_NONE;
|
| #endif
|
| -
|
| - GpuChannelMsg_CreateOffscreenCommandBuffer::WriteReplyParams(
|
| - reply_message,
|
| - route_id);
|
| - Send(reply_message);
|
| }
|
|
|
| -void GpuChannel::OnDestroyCommandBuffer(int32 route_id,
|
| - IPC::Message* reply_message) {
|
| +void GpuChannel::OnDestroyCommandBuffer(int32 route_id) {
|
| #if defined(ENABLE_GPU)
|
| TRACE_EVENT1("gpu", "GpuChannel::OnDestroyCommandBuffer",
|
| "route_id", route_id);
|
| if (router_.ResolveRoute(route_id)) {
|
| + GpuCommandBufferStub* stub = stubs_.Lookup(route_id);
|
| + // In case the renderer is currently blocked waiting for a sync reply from
|
| + // the stub, allow the stub to clean up and unblock pending messages here:
|
| + if (stub != NULL)
|
| + stub->CommandBufferWasDestroyed();
|
| router_.RemoveRoute(route_id);
|
| stubs_.Remove(route_id);
|
| }
|
| #endif
|
| -
|
| - if (reply_message)
|
| - Send(reply_message);
|
| }
|
|
|
| void GpuChannel::OnCreateOffscreenSurface(const gfx::Size& size,
|
| - IPC::Message* reply_message) {
|
| - int route_id = MSG_ROUTING_NONE;
|
| + int* route_id) {
|
| + *route_id = MSG_ROUTING_NONE;
|
|
|
| #if defined(ENABLE_GPU)
|
| scoped_refptr<gfx::GLSurface> surface(
|
| @@ -381,19 +310,15 @@
|
| if (!surface.get())
|
| return;
|
|
|
| - route_id = GenerateRouteID();
|
| + *route_id = GenerateRouteID();
|
|
|
| scoped_ptr<GpuSurfaceStub> stub (new GpuSurfaceStub(this,
|
| - route_id,
|
| + *route_id,
|
| surface.release()));
|
|
|
| - router_.AddRoute(route_id, stub.get());
|
| - surfaces_.AddWithID(stub.release(), route_id);
|
| + router_.AddRoute(*route_id, stub.get());
|
| + surfaces_.AddWithID(stub.release(), *route_id);
|
| #endif
|
| -
|
| - GpuChannelMsg_CreateOffscreenSurface::WriteReplyParams(reply_message,
|
| - route_id);
|
| - Send(reply_message);
|
| }
|
|
|
| void GpuChannel::OnDestroySurface(int route_id) {
|
|
|