Index: gpu/command_buffer/client/cmd_buffer_helper.cc |
=================================================================== |
--- gpu/command_buffer/client/cmd_buffer_helper.cc (revision 48721) |
+++ gpu/command_buffer/client/cmd_buffer_helper.cc (working copy) |
@@ -12,7 +12,8 @@ |
CommandBufferHelper::CommandBufferHelper(CommandBuffer* command_buffer) |
: command_buffer_(command_buffer), |
entries_(NULL), |
- entry_count_(0), |
+ total_entry_count_(0), |
+ usable_entry_count_(0), |
token_(0), |
last_token_read_(-1), |
get_(0), |
@@ -30,7 +31,12 @@ |
if (num_ring_buffer_entries > state.num_entries) { |
return false; |
} |
- entry_count_ = num_ring_buffer_entries; |
+ |
+ 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; |
SynchronizeState(state); |
return true; |
@@ -99,16 +105,16 @@ |
// 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 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. |
+// around, adding a jump. 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) { |
- CHECK(count < entry_count_); |
- if (put_ + count > entry_count_) { |
+ CHECK(count < usable_entry_count_); |
+ if (put_ + count > usable_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 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). |
+ // 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). |
DCHECK_LE(1, put_); |
Flush(); |
while (get_ > put_ || get_ == 0) { |
@@ -117,14 +123,8 @@ |
if (!Flush()) |
return; |
} |
- // Insert Noops to fill out buffer. |
- int32 num_entries = 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; |
- } |
+ // Insert a jump back to the beginning. |
+ cmd::Jump::Set(&entries_[put_], 0); |
put_ = 0; |
} |
// If we have enough room, return immediatly. |
@@ -143,8 +143,9 @@ |
WaitForAvailableEntries(entries); |
CommandBufferEntry* space = &entries_[put_]; |
put_ += entries; |
- DCHECK_LE(put_, entry_count_); |
- if (put_ == entry_count_) { |
+ DCHECK_LE(put_, usable_entry_count_); |
+ if (put_ == usable_entry_count_) { |
+ cmd::Jump::Set(&entries_[put_], 0); |
put_ = 0; |
} |
return space; |