| Index: gpu/command_buffer/service/in_process_command_buffer.cc
|
| diff --git a/gpu/command_buffer/service/in_process_command_buffer.cc b/gpu/command_buffer/service/in_process_command_buffer.cc
|
| index 6997cecdbf2de82fd668b4f7155050e5790e0727..b5eecf9639fd9f2e6c74926d73cec74db8b32450 100644
|
| --- a/gpu/command_buffer/service/in_process_command_buffer.cc
|
| +++ b/gpu/command_buffer/service/in_process_command_buffer.cc
|
| @@ -54,6 +54,8 @@ namespace gpu {
|
|
|
| namespace {
|
|
|
| +base::StaticAtomicSequenceNumber g_next_command_buffer_id;
|
| +
|
| template <typename T>
|
| static void RunTaskWithResult(base::Callback<T(void)> task,
|
| T* result,
|
| @@ -341,6 +343,11 @@ bool InProcessCommandBuffer::InitializeOnGpuThread(
|
| return false;
|
| }
|
|
|
| + const int command_buffer_id = g_next_command_buffer_id.GetNext();
|
| + sync_point_client_ = service_->sync_point_manager()->CreateSyncPointClient(
|
| + kSyncPointNamespace_GpuIO,
|
| + static_cast<uint64_t>(command_buffer_id));
|
| +
|
| if (service_->UseVirtualizedGLContexts() ||
|
| decoder_->GetContextGroup()
|
| ->feature_info()
|
| @@ -436,6 +443,7 @@ bool InProcessCommandBuffer::DestroyOnGpuThread() {
|
| }
|
| context_ = NULL;
|
| surface_ = NULL;
|
| + sync_point_client_ = NULL;
|
| gl_share_group_ = NULL;
|
| #if defined(OS_ANDROID)
|
| stream_texture_manager_.reset();
|
| @@ -478,10 +486,13 @@ int32 InProcessCommandBuffer::GetLastToken() {
|
| return last_state_.token;
|
| }
|
|
|
| -void InProcessCommandBuffer::FlushOnGpuThread(int32 put_offset) {
|
| +void InProcessCommandBuffer::FlushOnGpuThread(int32 put_offset,
|
| + uint32_t order_num) {
|
| CheckSequencedThread();
|
| ScopedEvent handle_flush(&flush_event_);
|
| base::AutoLock lock(command_buffer_lock_);
|
| +
|
| + sync_point_client_->BeginProcessingOrderNumber(order_num);
|
| command_buffer_->Flush(put_offset);
|
| {
|
| // Update state before signaling the flush event.
|
| @@ -490,6 +501,8 @@ void InProcessCommandBuffer::FlushOnGpuThread(int32 put_offset) {
|
| }
|
| DCHECK((!error::IsError(state_after_last_flush_.error) && !context_lost_) ||
|
| (error::IsError(state_after_last_flush_.error) && context_lost_));
|
| + DCHECK(context_lost_ || put_offset == state_after_last_flush_.get_offset);
|
| + sync_point_client_->FinishProcessingOrderNumber(order_num);
|
|
|
| // If we've processed all pending commands but still have pending queries,
|
| // pump idle work until the query is passed.
|
| @@ -527,10 +540,12 @@ void InProcessCommandBuffer::Flush(int32 put_offset) {
|
| if (last_put_offset_ == put_offset)
|
| return;
|
|
|
| + uint32_t order_num = service_->sync_point_manager()->GenerateOrderNumber();
|
| last_put_offset_ = put_offset;
|
| base::Closure task = base::Bind(&InProcessCommandBuffer::FlushOnGpuThread,
|
| gpu_thread_weak_ptr_,
|
| - put_offset);
|
| + put_offset,
|
| + order_num);
|
| QueueTask(task);
|
| }
|
|
|
|
|