Index: content/common/gpu/gpu_command_buffer_stub.cc |
diff --git a/content/common/gpu/gpu_command_buffer_stub.cc b/content/common/gpu/gpu_command_buffer_stub.cc |
index de5e48a6d51363ad76dc08ceccee56aef4d791a1..d78f4bc5f3da70dd9fa68a94c2e391dc47b411be 100644 |
--- a/content/common/gpu/gpu_command_buffer_stub.cc |
+++ b/content/common/gpu/gpu_command_buffer_stub.cc |
@@ -54,7 +54,8 @@ GpuCommandBufferStub::GpuCommandBufferStub( |
route_id_(route_id), |
renderer_id_(renderer_id), |
render_view_id_(render_view_id), |
- watchdog_(watchdog) { |
+ watchdog_(watchdog), |
+ task_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { |
} |
GpuCommandBufferStub::~GpuCommandBufferStub() { |
@@ -72,7 +73,6 @@ bool GpuCommandBufferStub::OnMessageReceived(const IPC::Message& message) { |
IPC_BEGIN_MESSAGE_MAP(GpuCommandBufferStub, message) |
IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_Initialize, OnInitialize); |
IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_GetState, OnGetState); |
- IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_AsyncGetState, OnAsyncGetState); |
IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_Flush, OnFlush); |
IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_AsyncFlush, OnAsyncFlush); |
IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_CreateTransferBuffer, |
@@ -135,7 +135,7 @@ void GpuCommandBufferStub::OnInitialize( |
parent_texture_id_)) { |
command_buffer_->SetPutOffsetChangeCallback( |
NewCallback(scheduler_.get(), |
- &gpu::GpuScheduler::ProcessCommands)); |
+ &gpu::GpuScheduler::PutChanged)); |
scheduler_->SetSwapBuffersCallback( |
NewCallback(this, &GpuCommandBufferStub::OnSwapBuffers)); |
scheduler_->SetLatchCallback(base::Bind( |
@@ -176,17 +176,16 @@ void GpuCommandBufferStub::OnCommandProcessed() { |
void GpuCommandBufferStub::OnGetState(gpu::CommandBuffer::State* state) { |
*state = command_buffer_->GetState(); |
-} |
- |
-void GpuCommandBufferStub::OnAsyncGetState() { |
- gpu::CommandBuffer::State state = command_buffer_->GetState(); |
- Send(new GpuCommandBufferMsg_UpdateState(route_id_, state)); |
+ if (state->error == gpu::error::kLostContext && |
+ gfx::GLContext::LosesAllContextsOnContextLost()) |
+ channel_->LoseAllContexts(); |
} |
void GpuCommandBufferStub::OnFlush(int32 put_offset, |
+ int32 last_known_get, |
gpu::CommandBuffer::State* state) { |
GPU_TRACE_EVENT0("gpu", "GpuCommandBufferStub::OnFlush"); |
- *state = command_buffer_->FlushSync(put_offset); |
+ *state = command_buffer_->FlushSync(put_offset, last_known_get); |
if (state->error == gpu::error::kLostContext && |
gfx::GLContext::LosesAllContextsOnContextLost()) |
channel_->LoseAllContexts(); |
@@ -194,12 +193,11 @@ void GpuCommandBufferStub::OnFlush(int32 put_offset, |
void GpuCommandBufferStub::OnAsyncFlush(int32 put_offset) { |
GPU_TRACE_EVENT0("gpu", "GpuCommandBufferStub::OnAsyncFlush"); |
- gpu::CommandBuffer::State state = command_buffer_->FlushSync(put_offset); |
- if (state.error == gpu::error::kLostContext && |
- gfx::GLContext::LosesAllContextsOnContextLost()) |
- channel_->LoseAllContexts(); |
- else |
- Send(new GpuCommandBufferMsg_UpdateState(route_id_, state)); |
+ command_buffer_->Flush(put_offset); |
+ // TODO(piman): Do this everytime the scheduler finishes processing a batch of |
+ // commands. |
+ MessageLoop::current()->PostTask(FROM_HERE, |
+ task_factory_.NewRunnableMethod(&GpuCommandBufferStub::ReportState)); |
} |
void GpuCommandBufferStub::OnCreateTransferBuffer(int32 size, |
@@ -346,4 +344,16 @@ void GpuCommandBufferStub::ViewResized() { |
#endif |
} |
+void GpuCommandBufferStub::ReportState() { |
+ gpu::CommandBuffer::State state = command_buffer_->GetState(); |
+ if (state.error == gpu::error::kLostContext && |
+ gfx::GLContext::LosesAllContextsOnContextLost()) { |
+ channel_->LoseAllContexts(); |
+ } else { |
+ IPC::Message* msg = new GpuCommandBufferMsg_UpdateState(route_id_, state); |
+ msg->set_unblock(true); |
+ Send(msg); |
+ } |
+} |
+ |
#endif // defined(ENABLE_GPU) |