Chromium Code Reviews| 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..171282db1d888c76e2f0cbdddda8fd03d797be3e 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 { |
|
brettw
2011/04/28 21:21:05
Need {} for the top arm since you use them for the
piman
2011/04/28 21:31:13
Done.
|
| + IPC::Message* msg = new GpuCommandBufferMsg_UpdateState(route_id_, state); |
| + msg->set_unblock(true); |
| + Send(msg); |
| + } |
| +} |
| + |
| #endif // defined(ENABLE_GPU) |