diff options
-rw-r--r-- | content/common/gpu/gpu_command_buffer_stub.cc | 1 | ||||
-rw-r--r-- | gpu/command_buffer/client/gles2_implementation.cc | 19 | ||||
-rw-r--r-- | gpu/command_buffer/service/gpu_scheduler.cc | 7 | ||||
-rw-r--r-- | gpu/command_buffer/service/gpu_scheduler_unittest.cc | 9 |
4 files changed, 23 insertions, 13 deletions
diff --git a/content/common/gpu/gpu_command_buffer_stub.cc b/content/common/gpu/gpu_command_buffer_stub.cc index d78f4bc..b9d8450 100644 --- a/content/common/gpu/gpu_command_buffer_stub.cc +++ b/content/common/gpu/gpu_command_buffer_stub.cc @@ -258,6 +258,7 @@ void GpuCommandBufferStub::OnResizeOffscreenFrameBuffer(const gfx::Size& size) { void GpuCommandBufferStub::OnSwapBuffers() { GPU_TRACE_EVENT0("gpu", "GpuCommandBufferStub::OnSwapBuffers"); + ReportState(); Send(new GpuCommandBufferMsg_SwapBuffers(route_id_)); } diff --git a/gpu/command_buffer/client/gles2_implementation.cc b/gpu/command_buffer/client/gles2_implementation.cc index aa94fbb..6b85a55 100644 --- a/gpu/command_buffer/client/gles2_implementation.cc +++ b/gpu/command_buffer/client/gles2_implementation.cc @@ -684,15 +684,22 @@ void GLES2Implementation::Finish() { } void GLES2Implementation::SwapBuffers() { - // Wait if this would add too many swap buffers. - if (swap_buffers_tokens_.size() == kMaxSwapBuffers) { + // TODO(piman): Strictly speaking we'd want to insert the token after the + // swap, but the state update with the updated token might not have happened + // by the time the SwapBuffer callback gets called, forcing us to synchronize + // with the GPU process more than needed. So instead, make it happen before. + // All it means is that we could be slightly looser on the kMaxSwapBuffers + // semantics if the client doesn't use the callback mechanism, and by chance + // the scheduler yields between the InsertToken and the SwapBuffers. + swap_buffers_tokens_.push(helper_->InsertToken()); + helper_->SwapBuffers(); + helper_->YieldScheduler(); + helper_->CommandBufferHelper::Flush(); + // Wait if we added too many swap buffers. + if (swap_buffers_tokens_.size() > kMaxSwapBuffers) { helper_->WaitForToken(swap_buffers_tokens_.front()); swap_buffers_tokens_.pop(); } - helper_->SwapBuffers(); - swap_buffers_tokens_.push(helper_->InsertToken()); - helper_->YieldScheduler(); - Flush(); } void GLES2Implementation::CopyTextureToParentTextureCHROMIUM( diff --git a/gpu/command_buffer/service/gpu_scheduler.cc b/gpu/command_buffer/service/gpu_scheduler.cc index c1b7aaa..09a24fd 100644 --- a/gpu/command_buffer/service/gpu_scheduler.cc +++ b/gpu/command_buffer/service/gpu_scheduler.cc @@ -163,6 +163,11 @@ void GpuScheduler::ProcessCommands() { !parser_->IsEmpty()) { error = parser_->ProcessCommand(); + // TODO(piman): various classes duplicate various pieces of state, leading + // to needlessly complex update logic. It should be possible to simply share + // the state across all of them. + command_buffer_->SetGetOffset(static_cast<int32>(parser_->get())); + if (error == error::kWaiting || error == error::kYield) { break; } else if (error::IsError(error)) { @@ -179,8 +184,6 @@ void GpuScheduler::ProcessCommands() { } } - command_buffer_->SetGetOffset(static_cast<int32>(parser_->get())); - if (unscheduled_count_ == 0 && error != error::kWaiting && !parser_->IsEmpty()) { diff --git a/gpu/command_buffer/service/gpu_scheduler_unittest.cc b/gpu/command_buffer/service/gpu_scheduler_unittest.cc index a7f17b9..965353c 100644 --- a/gpu/command_buffer/service/gpu_scheduler_unittest.cc +++ b/gpu/command_buffer/service/gpu_scheduler_unittest.cc @@ -93,7 +93,6 @@ TEST_F(GpuSchedulerTest, SchedulerDoesNothingIfRingBufferIsEmpty) { state.put_offset = 0; EXPECT_CALL(*command_buffer_, GetState()) .WillRepeatedly(Return(state)); - EXPECT_CALL(*command_buffer_, SetGetOffset(0)); EXPECT_CALL(*command_buffer_, SetParseError(_)) .Times(0); @@ -136,13 +135,14 @@ TEST_F(GpuSchedulerTest, ProcessesTwoCommands) { state.put_offset = 3; EXPECT_CALL(*command_buffer_, GetState()) .WillRepeatedly(Return(state)); - EXPECT_CALL(*command_buffer_, SetGetOffset(3)); EXPECT_CALL(*async_api_, DoCommand(7, 1, &buffer_[0])) .WillOnce(Return(error::kNoError)); + EXPECT_CALL(*command_buffer_, SetGetOffset(2)); EXPECT_CALL(*async_api_, DoCommand(8, 0, &buffer_[2])) .WillOnce(Return(error::kNoError)); + EXPECT_CALL(*command_buffer_, SetGetOffset(3)); scheduler_->PutChanged(true); } @@ -157,8 +157,6 @@ TEST_F(GpuSchedulerTest, SchedulerSetsTheGLContext) { EXPECT_CALL(*command_buffer_, GetState()) .WillRepeatedly(Return(state)); - EXPECT_CALL(*command_buffer_, SetGetOffset(0)); - scheduler_->PutChanged(true); } @@ -180,10 +178,10 @@ TEST_F(GpuSchedulerTest, PostsTaskToFinishRemainingCommands) { EXPECT_CALL(*async_api_, DoCommand(7, 1, &buffer_[0])) .WillOnce(Return(error::kNoError)); + EXPECT_CALL(*command_buffer_, SetGetOffset(2)); EXPECT_CALL(*async_api_, DoCommand(8, 0, &buffer_[2])) .WillOnce(Return(error::kNoError)); - EXPECT_CALL(*command_buffer_, SetGetOffset(3)); scheduler_->PutChanged(true); @@ -216,6 +214,7 @@ TEST_F(GpuSchedulerTest, SetsErrorCodeOnCommandBuffer) { EXPECT_CALL(*async_api_, DoCommand(7, 0, &buffer_[0])) .WillOnce(Return( error::kUnknownCommand)); + EXPECT_CALL(*command_buffer_, SetGetOffset(1)); EXPECT_CALL(*command_buffer_, SetParseError(error::kUnknownCommand)); |