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 b3b1b12efdc3650d0ccd1b88f4d25d5157cfb7d4..5e1921aa5d5e1be4bd72497ee9ed5b0b361b80fb 100644 |
--- a/gpu/command_buffer/service/in_process_command_buffer.cc |
+++ b/gpu/command_buffer/service/in_process_command_buffer.cc |
@@ -65,6 +65,21 @@ static void RunTaskWithResult(base::Callback<T(void)> task, |
completion->Signal(); |
} |
+struct ScopedOrderNumberProcessor { |
+ ScopedOrderNumberProcessor(SyncPointOrderData* order_data, uint32_t order_num) |
+ : order_data_(order_data), order_num_(order_num) { |
+ order_data_->BeginProcessingOrderNumber(order_num_); |
+ } |
+ |
+ ~ScopedOrderNumberProcessor() { |
+ order_data_->FinishProcessingOrderNumber(order_num_); |
+ } |
+ |
+ private: |
+ SyncPointOrderData* order_data_; |
+ uint32_t order_num_; |
+}; |
+ |
struct GpuInProcessThreadHolder { |
GpuInProcessThreadHolder() |
: sync_point_manager(new SyncPointManager(false)), |
@@ -497,22 +512,24 @@ void InProcessCommandBuffer::FlushOnGpuThread(int32 put_offset, |
ScopedEvent handle_flush(&flush_event_); |
base::AutoLock lock(command_buffer_lock_); |
- sync_point_order_data_->BeginProcessingOrderNumber(order_num); |
- command_buffer_->Flush(put_offset); |
{ |
- // Update state before signaling the flush event. |
- base::AutoLock lock(state_after_last_flush_lock_); |
- state_after_last_flush_ = command_buffer_->GetLastState(); |
+ ScopedOrderNumberProcessor scoped_order_num(sync_point_order_data_.get(), |
+ order_num); |
+ command_buffer_->Flush(put_offset); |
+ { |
+ // Update state before signaling the flush event. |
+ base::AutoLock lock(state_after_last_flush_lock_); |
+ state_after_last_flush_ = command_buffer_->GetLastState(); |
+ } |
+ DCHECK((!error::IsError(state_after_last_flush_.error) && !context_lost_) || |
+ (error::IsError(state_after_last_flush_.error) && context_lost_)); |
+ |
+ // Currently the in process command buffer does not support being |
+ // descheduled, if it does we would need to back off on calling the finish |
+ // processing number function until the message is rescheduled and finished |
+ // processing. This DCHECK is to enforce this. |
+ DCHECK(context_lost_ || put_offset == state_after_last_flush_.get_offset); |
} |
- DCHECK((!error::IsError(state_after_last_flush_.error) && !context_lost_) || |
- (error::IsError(state_after_last_flush_.error) && context_lost_)); |
- |
- // Currently the in process command buffer does not support being descheduled, |
- // if it does we would need to back off on calling the finish processing |
- // order number function until the message is rescheduled and finished |
- // processing. This DCHECK is to enforce this. |
- DCHECK(context_lost_ || put_offset == state_after_last_flush_.get_offset); |
- sync_point_order_data_->FinishProcessingOrderNumber(order_num); |
// If we've processed all pending commands but still have pending queries, |
// pump idle work until the query is passed. |
@@ -668,17 +685,29 @@ int32 InProcessCommandBuffer::CreateImage(ClientBuffer buffer, |
ShareGpuMemoryBufferToGpuThread(gpu_memory_buffer->GetHandle(), |
&requires_sync_point); |
- QueueTask(base::Bind(&InProcessCommandBuffer::CreateImageOnGpuThread, |
- base::Unretained(this), |
- new_id, |
- handle, |
- gfx::Size(width, height), |
- gpu_memory_buffer->GetFormat(), |
- internalformat)); |
+ SyncPointManager* sync_manager = service_->sync_point_manager(); |
+ const uint32_t order_num = |
+ sync_point_order_data_->GenerateUnprocessedOrderNumber(sync_manager); |
+ uint64_t fence_sync = 0; |
if (requires_sync_point) { |
- gpu_memory_buffer_manager_->SetDestructionSyncPoint(gpu_memory_buffer, |
- InsertSyncPoint()); |
+ fence_sync = GenerateFenceSyncRelease(); |
+ |
+ // Previous fence syncs should be flushed already. |
+ DCHECK_EQ(fence_sync - 1, flushed_fence_sync_release_); |
+ } |
+ |
+ QueueTask(base::Bind(&InProcessCommandBuffer::CreateImageOnGpuThread, |
+ base::Unretained(this), new_id, handle, |
+ gfx::Size(width, height), gpu_memory_buffer->GetFormat(), |
+ internalformat, order_num, fence_sync)); |
+ |
+ if (fence_sync) { |
+ flushed_fence_sync_release_ = fence_sync; |
+ SyncToken sync_token(GetNamespaceID(), GetCommandBufferID(), fence_sync); |
+ sync_token.SetVerifyFlush(); |
+ gpu_memory_buffer_manager_->SetDestructionSyncToken(gpu_memory_buffer, |
+ sync_token); |
} |
return new_id; |
@@ -689,7 +718,11 @@ void InProcessCommandBuffer::CreateImageOnGpuThread( |
const gfx::GpuMemoryBufferHandle& handle, |
const gfx::Size& size, |
gfx::BufferFormat format, |
- uint32 internalformat) { |
+ uint32 internalformat, |
+ uint32_t order_num, |
+ uint64_t fence_sync) { |
+ ScopedOrderNumberProcessor scoped_order_num(sync_point_order_data_.get(), |
+ order_num); |
if (!decoder_) |
return; |
@@ -733,6 +766,10 @@ void InProcessCommandBuffer::CreateImageOnGpuThread( |
break; |
} |
} |
+ |
+ if (fence_sync) { |
+ sync_point_client_->ReleaseFenceSync(fence_sync); |
+ } |
} |
void InProcessCommandBuffer::DestroyImage(int32 id) { |