Index: gpu/command_buffer/service/gpu_scheduler.cc |
diff --git a/gpu/command_buffer/service/gpu_scheduler.cc b/gpu/command_buffer/service/gpu_scheduler.cc |
index eb1db7e3552d9dd9709c1c4b2bceb4de6cd70279..9282e730cbd563323e38e7e42a9d1b151b374387 100644 |
--- a/gpu/command_buffer/service/gpu_scheduler.cc |
+++ b/gpu/command_buffer/service/gpu_scheduler.cc |
@@ -24,21 +24,6 @@ GpuScheduler::GpuScheduler(CommandBuffer* command_buffer, |
decoder_(decoder), |
parser_(parser), |
unscheduled_count_(0) { |
- // Map the ring buffer and create the parser. |
- if (!parser) { |
- Buffer ring_buffer = command_buffer_->GetRingBuffer(); |
- if (ring_buffer.ptr) { |
- parser_.reset(new CommandParser(ring_buffer.ptr, |
- ring_buffer.size, |
- 0, |
- ring_buffer.size, |
- 0, |
- decoder_)); |
- } else { |
- parser_.reset(new CommandParser(NULL, 0, 0, 0, 0, |
- decoder_)); |
- } |
- } |
} |
GpuScheduler::~GpuScheduler() { |
@@ -48,6 +33,13 @@ void GpuScheduler::PutChanged() { |
TRACE_EVENT1("gpu", "GpuScheduler:PutChanged", "this", this); |
CommandBuffer::State state = command_buffer_->GetState(); |
+ |
+ // If there is no parser, exit. |
+ if (!parser_.get()) { |
+ DCHECK_EQ(state.get_offset, state.put_offset); |
+ return; |
+ } |
+ |
parser_->set_put(state.put_offset); |
if (state.error != error::kNoError) |
return; |
@@ -122,6 +114,26 @@ void GpuScheduler::set_token(int32 token) { |
command_buffer_->SetToken(token); |
} |
+bool GpuScheduler::SetGetBuffer(int32 transfer_buffer_id) { |
+ Buffer ring_buffer = command_buffer_->GetTransferBuffer(transfer_buffer_id); |
+ if (!ring_buffer.ptr) { |
+ return false; |
+ } |
+ |
+ if (!parser_.get()) { |
+ parser_.reset(new CommandParser(decoder_)); |
+ } |
+ |
+ parser_->SetBuffer( |
+ ring_buffer.ptr, |
+ ring_buffer.size, |
+ 0, |
+ ring_buffer.size); |
+ |
+ SetGetOffset(0); |
+ return true; |
+} |
+ |
bool GpuScheduler::SetGetOffset(int32 offset) { |
if (parser_->set_get(offset)) { |
command_buffer_->SetGetOffset(static_cast<int32>(parser_->get())); |