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..7e390b2b8ab0cc4d7dde444a70da738505bab4ae 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,11 @@ bool InProcessCommandBuffer::DestroyOnGpuThread() { |
} |
context_ = NULL; |
surface_ = NULL; |
+ |
+ if (sync_point_client_) { |
+ service_->sync_point_manager()->DestroySyncPointClient(sync_point_client_); |
+ sync_point_client_ = NULL; |
+ } |
gl_share_group_ = NULL; |
#if defined(OS_ANDROID) |
stream_texture_manager_.reset(); |
@@ -478,10 +490,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 +505,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 +544,12 @@ void InProcessCommandBuffer::Flush(int32 put_offset) { |
if (last_put_offset_ == put_offset) |
return; |
+ uint32_t order_num = sync_point_client_->GenerateUnprocessedOrderNumber(); |
last_put_offset_ = put_offset; |
base::Closure task = base::Bind(&InProcessCommandBuffer::FlushOnGpuThread, |
gpu_thread_weak_ptr_, |
- put_offset); |
+ put_offset, |
+ order_num); |
QueueTask(task); |
} |