Chromium Code Reviews| 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 b666e83dc5dc18134cbe8acfdd677ae5fdde7df6..74fb0561040e90af7cd5ba53339fcea35ffb0d9a 100644 |
| --- a/gpu/command_buffer/client/cmd_buffer_helper.cc |
| +++ b/gpu/command_buffer/client/cmd_buffer_helper.cc |
| @@ -17,7 +17,8 @@ CommandBufferHelper::CommandBufferHelper(CommandBuffer* command_buffer) |
| token_(0), |
| last_token_read_(-1), |
| get_(0), |
| - put_(0) { |
| + put_(0), |
| + last_put_sent_(0) { |
| } |
| bool CommandBufferHelper::Initialize(int32 ring_buffer_size) { |
| @@ -45,19 +46,25 @@ bool CommandBufferHelper::Initialize(int32 ring_buffer_size) { |
| CommandBufferHelper::~CommandBufferHelper() { |
| } |
| -bool CommandBufferHelper::Flush() { |
| - CommandBuffer::State state = command_buffer_->Flush(put_); |
| +bool CommandBufferHelper::FlushSync() { |
| + last_put_sent_ = put_; |
| + CommandBuffer::State state = command_buffer_->FlushSync(put_); |
| SynchronizeState(state); |
| return state.error == error::kNoError; |
| } |
| +void CommandBufferHelper::Flush() { |
| + last_put_sent_ = put_; |
| + command_buffer_->Flush(put_); |
| +} |
| + |
| // Calls Flush() and then waits until the buffer is empty. Break early if the |
| // error is set. |
| bool CommandBufferHelper::Finish() { |
| do { |
| // Do not loop forever if the flush fails, meaning the command buffer reader |
| // has shutdown. |
| - if (!Flush()) |
| + if (!FlushSync()) |
| return false; |
| } while (put_ != get_); |
| @@ -88,9 +95,7 @@ void CommandBufferHelper::WaitForToken(int32 token) { |
| // Return immediately if corresponding InsertToken failed. |
| if (token < 0) |
| return; |
| - if (last_token_read_ >= token) return; // fast path. |
| if (token > token_) return; // we wrapped |
| - Flush(); |
| while (last_token_read_ < token) { |
| if (get_ == put_) { |
| GPU_LOG(FATAL) << "Empty command buffer while waiting on a token."; |
| @@ -98,7 +103,7 @@ void CommandBufferHelper::WaitForToken(int32 token) { |
| } |
| // Do not loop forever if the flush fails, meaning the command buffer reader |
| // has shutdown. |
| - if (!Flush()) |
| + if (!FlushSync()) |
| return; |
| } |
| } |
| @@ -116,27 +121,30 @@ void CommandBufferHelper::WaitForAvailableEntries(int32 count) { |
| // 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). |
| GPU_DCHECK_LE(1, put_); |
| - Flush(); |
| while (get_ > put_ || get_ == 0) { |
| // Do not loop forever if the flush fails, meaning the command buffer |
| // reader has shutdown. |
| - if (!Flush()) |
| + if (!FlushSync()) |
| return; |
| } |
| // Insert a jump back to the beginning. |
| cmd::Jump::Set(&entries_[put_], 0); |
| put_ = 0; |
| } |
| - // If we have enough room, return immediatly. |
| - if (count <= AvailableEntries()) return; |
| - // Otherwise flush, and wait until we do have enough room. |
| - Flush(); |
| while (AvailableEntries() < count) { |
| // Do not loop forever if the flush fails, meaning the command buffer reader |
| // has shutdown. |
| - if (!Flush()) |
| + if (!FlushSync()) |
| return; |
| } |
| + // Force a flush if the buffer is getting half full, or even earlier if the |
| + // reader is know to be idle. |
| + int32 pending = |
| + (put_ + usable_entry_count_ - last_put_sent_) % usable_entry_count_; |
| + int32 limit = usable_entry_count_ / ((get_ == last_put_sent_) ? 2 : 16); |
| + if (pending > limit) { |
|
Antoine Labour
2011/01/14 21:35:35
Note: we only get here if we haven't synced above.
|
| + Flush(); |
| + } |
| } |
| CommandBufferEntry* CommandBufferHelper::GetSpace(uint32 entries) { |