summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--content/common/gpu/gpu_command_buffer_stub.cc1
-rw-r--r--gpu/command_buffer/client/gles2_implementation.cc19
-rw-r--r--gpu/command_buffer/service/gpu_scheduler.cc7
-rw-r--r--gpu/command_buffer/service/gpu_scheduler_unittest.cc9
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));