| 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 a99201e4b36164ef01ef218d7651f6fe55e851b9..da458c19c8020486e3498501c3527873c21b9ed8 100644
|
| --- a/gpu/command_buffer/client/cmd_buffer_helper.cc
|
| +++ b/gpu/command_buffer/client/cmd_buffer_helper.cc
|
| @@ -23,6 +23,7 @@ CommandBufferHelper::CommandBufferHelper(CommandBuffer* command_buffer)
|
| token_(0),
|
| put_(0),
|
| last_put_sent_(0),
|
| + safe_put_point_(0),
|
| #if defined(CMD_HELPER_PERIODIC_FLUSH_CHECK)
|
| commands_issued_(0),
|
| #endif
|
| @@ -64,12 +65,14 @@ void CommandBufferHelper::CalcImmediateEntries(int waiting_count) {
|
|
|
| // Limit entry count to force early flushing.
|
| if (flush_automatically_) {
|
| + // Cache last_put_sent, as it may change via SafeFlush().
|
| + int32 last_put_sent = last_put_sent_;
|
| int32 limit =
|
| total_entry_count_ /
|
| - ((curr_get == last_put_sent_) ? kAutoFlushSmall : kAutoFlushBig);
|
| + ((curr_get == last_put_sent) ? kAutoFlushSmall : kAutoFlushBig);
|
|
|
| int32 pending =
|
| - (put_ + total_entry_count_ - last_put_sent_) % total_entry_count_;
|
| + (put_ + total_entry_count_ - last_put_sent) % total_entry_count_;
|
|
|
| if (pending > 0 && pending >= limit) {
|
| // Time to force flush.
|
| @@ -146,6 +149,7 @@ bool CommandBufferHelper::WaitForGetOffsetInRange(int32 start, int32 end) {
|
| }
|
|
|
| void CommandBufferHelper::Flush() {
|
| + base::AutoLock scoped_lock(flush_lock_);
|
| // Wrap put_ before flush.
|
| if (put_ == total_entry_count_)
|
| put_ = 0;
|
| @@ -153,12 +157,30 @@ void CommandBufferHelper::Flush() {
|
| if (usable() && last_put_sent_ != put_) {
|
| last_flush_time_ = base::TimeTicks::Now();
|
| last_put_sent_ = put_;
|
| + safe_put_point_ = put_;
|
| command_buffer_->Flush(put_);
|
| ++flush_generation_;
|
| CalcImmediateEntries(0);
|
| }
|
| }
|
|
|
| +void CommandBufferHelper::SetSafeFlushPoint() {
|
| + base::AutoLock scoped_lock(flush_lock_);
|
| + safe_put_point_ = put_;
|
| + if (safe_put_point_ == total_entry_count_)
|
| + safe_put_point_ = 0;
|
| +}
|
| +
|
| +void CommandBufferHelper::SafeFlush() {
|
| + base::AutoLock scoped_lock(flush_lock_);
|
| + if (usable() && last_put_sent_ != safe_put_point_) {
|
| + last_flush_time_ = base::TimeTicks::Now();
|
| + last_put_sent_ = safe_put_point_;
|
| + command_buffer_->Flush(safe_put_point_);
|
| + //++flush_generation_;
|
| + }
|
| +}
|
| +
|
| #if defined(CMD_HELPER_PERIODIC_FLUSH_CHECK)
|
| void CommandBufferHelper::PeriodicFlushCheck() {
|
| base::TimeTicks current_time = base::TimeTicks::Now();
|
|
|