Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3371)

Unified Diff: gpu/command_buffer/service/gpu_scheduler.cc

Issue 7253052: Execute all GL commands up to the put offset reported by a flush. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: gpu/command_buffer/service/gpu_scheduler.cc
===================================================================
--- gpu/command_buffer/service/gpu_scheduler.cc (revision 91774)
+++ gpu/command_buffer/service/gpu_scheduler.cc (working copy)
@@ -23,7 +23,6 @@
SurfaceManager* surface_manager,
gles2::ContextGroup* group)
: command_buffer_(command_buffer),
- commands_per_update_(100),
unscheduled_count_(0),
#if defined(OS_MACOSX) || defined(TOUCH_UI)
swap_buffers_count_(0),
@@ -41,10 +40,8 @@
GpuScheduler::GpuScheduler(CommandBuffer* command_buffer,
gles2::GLES2Decoder* decoder,
- CommandParser* parser,
- int commands_per_update)
+ CommandParser* parser)
: command_buffer_(command_buffer),
- commands_per_update_(commands_per_update),
unscheduled_count_(0),
#if defined(OS_MACOSX) || defined(TOUCH_UI)
swap_buffers_count_(0),
@@ -82,11 +79,6 @@
}
#endif
- // Do not limit to a certain number of commands before scheduling another
- // update when rendering onscreen.
- if (!surface->IsOffscreen())
- commands_per_update_ = INT_MAX;
-
// Map the ring buffer and create the parser.
Buffer ring_buffer = command_buffer_->GetRingBuffer();
if (ring_buffer.ptr) {
@@ -144,29 +136,16 @@
}
#endif
-void GpuScheduler::PutChanged(bool sync) {
+void GpuScheduler::PutChanged() {
TRACE_EVENT1("gpu", "GpuScheduler:PutChanged", "this", this);
- CommandBuffer::State state = command_buffer_->GetState();
- parser_->set_put(state.put_offset);
- if (sync)
- ProcessCommands();
- else
- ScheduleProcessCommands();
-}
+ DCHECK(IsScheduled());
-void GpuScheduler::ProcessCommands() {
- TRACE_EVENT1("gpu", "GpuScheduler:ProcessCommands", "this", this);
CommandBuffer::State state = command_buffer_->GetState();
+ parser_->set_put(state.put_offset);
if (state.error != error::kNoError)
return;
- if (unscheduled_count_ > 0) {
- TRACE_EVENT1("gpu", "EarlyOut_Unscheduled",
- "unscheduled_count_", unscheduled_count_);
- return;
- }
-
if (decoder_.get()) {
if (!decoder_->MakeCurrent()) {
LOG(ERROR) << "Context lost because MakeCurrent failed.";
@@ -183,59 +162,29 @@
#if defined(OS_MACOSX) || defined(TOUCH_UI)
// Don't swamp the browser process with SwapBuffers calls it can't handle.
- if (do_rate_limiting &&
- swap_buffers_count_ - acknowledged_swap_buffers_count_ >=
- kMaxOutstandingSwapBuffersCallsPerOnscreenContext) {
- TRACE_EVENT0("gpu", "EarlyOut_OSX_Throttle");
- // Stop doing work on this command buffer. In the GPU process,
- // receipt of the GpuMsg_AcceleratedSurfaceBuffersSwappedACK
- // message causes ProcessCommands to be scheduled again.
- return;
- }
+ DCHECK(!do_rate_limiting ||
+ swap_buffers_count_ - acknowledged_swap_buffers_count_ == 0);
#endif
- base::TimeTicks start_time = base::TimeTicks::Now();
- base::TimeDelta elapsed;
- bool is_break = false;
error::Error error = error::kNoError;
- do {
- int commands_processed = 0;
- while (commands_processed < commands_per_update_ &&
- !parser_->IsEmpty()) {
- error = parser_->ProcessCommand();
+ while (!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()));
+ // 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) {
- is_break = true;
- break;
- } else if (error::IsError(error)) {
- command_buffer_->SetParseError(error);
- return;
- }
-
- if (unscheduled_count_ > 0) {
- is_break = true;
- break;
- }
-
- ++commands_processed;
- if (command_processed_callback_.get()) {
- command_processed_callback_->Run();
- }
+ if (error::IsError(error)) {
+ command_buffer_->SetParseError(error);
+ return;
}
- elapsed = base::TimeTicks::Now() - start_time;
- } while(!is_break &&
- !parser_->IsEmpty() &&
- elapsed.InMicroseconds() < kMinimumSchedulerQuantumMicros);
- if (unscheduled_count_ == 0 &&
- error != error::kWaiting &&
- !parser_->IsEmpty()) {
- ScheduleProcessCommands();
+ if (command_processed_callback_.get())
+ command_processed_callback_->Run();
+
+ if (unscheduled_count_ > 0)
+ return;
}
}
@@ -247,12 +196,8 @@
--unscheduled_count_;
DCHECK_GE(unscheduled_count_, 0);
- if (unscheduled_count_ == 0) {
- if (scheduled_callback_.get())
- scheduled_callback_->Run();
-
- ScheduleProcessCommands();
- }
+ if (unscheduled_count_ == 0 && scheduled_callback_.get())
+ scheduled_callback_->Run();
} else {
++unscheduled_count_;
}
@@ -318,12 +263,6 @@
set_token_callback_ = callback;
}
-void GpuScheduler::ScheduleProcessCommands() {
- MessageLoop::current()->PostTask(
- FROM_HERE,
- method_factory_.NewRunnableMethod(&GpuScheduler::ProcessCommands));
-}
-
void GpuScheduler::WillResize(gfx::Size size) {
if (wrapped_resize_callback_.get()) {
wrapped_resize_callback_->Run(size);

Powered by Google App Engine
This is Rietveld 408576698