Index: gpu/command_buffer/client/cmd_buffer_helper.cc |
diff --git a/gpu/command_buffer/client/cmd_buffer_helper.cc b/gpu/command_buffer/client/cmd_buffer_helper.cc |
index 756abd5caed3e34e0e80ccf9a8015760c52398df..17b8ba0888c003e489eb1f231924157ad7964935 100644 |
--- a/gpu/command_buffer/client/cmd_buffer_helper.cc |
+++ b/gpu/command_buffer/client/cmd_buffer_helper.cc |
@@ -21,7 +21,6 @@ CommandBufferHelper::CommandBufferHelper(CommandBuffer* command_buffer) |
ring_buffer_size_(0), |
entries_(NULL), |
total_entry_count_(0), |
- usable_entry_count_(0), |
token_(0), |
put_(0), |
last_put_sent_(0), |
@@ -74,11 +73,7 @@ bool CommandBufferHelper::AllocateRingBuffer() { |
return false; |
} |
- const int32 kJumpEntries = |
- sizeof(cmd::Jump) / sizeof(*entries_); // NOLINT |
- |
total_entry_count_ = num_ring_buffer_entries; |
- usable_entry_count_ = total_entry_count_ - kJumpEntries; |
put_ = state.put_offset; |
return true; |
} |
@@ -195,7 +190,7 @@ void CommandBufferHelper::WaitForToken(int32 token) { |
// Waits for available entries, basically waiting until get >= put + count + 1. |
// It actually waits for contiguous entries, so it may need to wrap the buffer |
-// around, adding a jump. Thus this function may change the value of put_. The |
+// around, adding a noops. Thus this function may change the value of put_. The |
// function will return early if an error occurs, in which case the available |
// space may not be available. |
void CommandBufferHelper::WaitForAvailableEntries(int32 count) { |
@@ -204,12 +199,12 @@ void CommandBufferHelper::WaitForAvailableEntries(int32 count) { |
return; |
} |
GPU_DCHECK(HaveRingBuffer()); |
- GPU_DCHECK(count < usable_entry_count_); |
- if (put_ + count > usable_entry_count_) { |
+ GPU_DCHECK(count < total_entry_count_); |
+ if (put_ + count > total_entry_count_) { |
// There's not enough room between the current put and the end of the |
- // buffer, so we need to wrap. We will add a jump back to the start, but we |
- // need to make sure get wraps first, actually that get is 1 or more (since |
- // put will wrap to 0 after we add the jump). |
+ // buffer, so we need to wrap. We will add noops all the way to the end, |
+ // but we need to make sure get wraps first, actually that get is 1 or |
+ // more (since put will wrap to 0 after we add the noops). |
GPU_DCHECK_LE(1, put_); |
if (get_offset() > put_ || get_offset() == 0) { |
TRACE_EVENT0("gpu", "CommandBufferHelper::WaitForAvailableEntries"); |
@@ -220,8 +215,14 @@ void CommandBufferHelper::WaitForAvailableEntries(int32 count) { |
return; |
} |
} |
- // Insert a jump back to the beginning. |
- cmd::Jump::Set(&entries_[put_], 0); |
+ // Insert Noops to fill out the buffer. |
+ int32 num_entries = total_entry_count_ - put_; |
+ while (num_entries > 0) { |
+ int32 num_to_skip = std::min(CommandHeader::kMaxSize, num_entries); |
+ cmd::Noop::Set(&entries_[put_], num_to_skip); |
+ put_ += num_to_skip; |
+ num_entries -= num_to_skip; |
+ } |
put_ = 0; |
} |
if (AvailableEntries() < count) { |
@@ -236,8 +237,8 @@ void CommandBufferHelper::WaitForAvailableEntries(int32 count) { |
// Force a flush if the buffer is getting half full, or even earlier if the |
// reader is known to be idle. |
int32 pending = |
- (put_ + usable_entry_count_ - last_put_sent_) % usable_entry_count_; |
- int32 limit = usable_entry_count_ / |
+ (put_ + total_entry_count_ - last_put_sent_) % total_entry_count_; |
+ int32 limit = total_entry_count_ / |
((get_offset() == last_put_sent_) ? 16 : 2); |
if (pending > limit) { |
Flush(); |
@@ -265,9 +266,8 @@ CommandBufferEntry* CommandBufferHelper::GetSpace(uint32 entries) { |
WaitForAvailableEntries(entries); |
CommandBufferEntry* space = &entries_[put_]; |
put_ += entries; |
- GPU_DCHECK_LE(put_, usable_entry_count_); |
- if (put_ == usable_entry_count_) { |
- cmd::Jump::Set(&entries_[put_], 0); |
+ GPU_DCHECK_LE(put_, total_entry_count_); |
+ if (put_ == total_entry_count_) { |
put_ = 0; |
} |
return space; |