| Index: gpu/ipc/in_process_command_buffer.cc
|
| diff --git a/gpu/ipc/in_process_command_buffer.cc b/gpu/ipc/in_process_command_buffer.cc
|
| index 4ae663a9b1d3a1b8853b9f625e1a9cce9070f9eb..ec3464e2a55d76915271dcd705ac123e2df8a3a0 100644
|
| --- a/gpu/ipc/in_process_command_buffer.cc
|
| +++ b/gpu/ipc/in_process_command_buffer.cc
|
| @@ -77,8 +77,7 @@ static void RunTaskWithResult(base::Callback<T(void)> task,
|
| class GpuInProcessThreadHolder : public base::Thread {
|
| public:
|
| GpuInProcessThreadHolder()
|
| - : base::Thread("GpuThread"),
|
| - sync_point_manager_(new SyncPointManager(false)) {
|
| + : base::Thread("GpuThread"), sync_point_manager_(new SyncPointManager()) {
|
| Start();
|
| }
|
|
|
| @@ -349,8 +348,9 @@ bool InProcessCommandBuffer::InitializeOnGpuThread(
|
| }
|
|
|
| sync_point_order_data_ = SyncPointOrderData::Create();
|
| - sync_point_client_ = service_->sync_point_manager()->CreateSyncPointClient(
|
| - sync_point_order_data_, GetNamespaceID(), GetCommandBufferID());
|
| + sync_point_client_ = base::MakeUnique<SyncPointClient>(
|
| + service_->sync_point_manager(), sync_point_order_data_, GetNamespaceID(),
|
| + GetCommandBufferID());
|
|
|
| if (service_->UseVirtualizedGLContexts() ||
|
| decoder_->GetContextGroup()
|
| @@ -417,8 +417,8 @@ bool InProcessCommandBuffer::InitializeOnGpuThread(
|
| decoder_->SetFenceSyncReleaseCallback(
|
| base::Bind(&InProcessCommandBuffer::FenceSyncReleaseOnGpuThread,
|
| base::Unretained(this)));
|
| - decoder_->SetWaitFenceSyncCallback(
|
| - base::Bind(&InProcessCommandBuffer::WaitFenceSyncOnGpuThread,
|
| + decoder_->SetWaitSyncTokenCallback(
|
| + base::Bind(&InProcessCommandBuffer::WaitSyncTokenOnGpuThread,
|
| base::Unretained(this)));
|
| decoder_->SetDescheduleUntilFinishedCallback(
|
| base::Bind(&InProcessCommandBuffer::DescheduleUntilFinishedOnGpuThread,
|
| @@ -801,9 +801,8 @@ void InProcessCommandBuffer::CreateImageOnGpuThread(
|
| }
|
| }
|
|
|
| - if (fence_sync) {
|
| + if (fence_sync)
|
| sync_point_client_->ReleaseFenceSync(fence_sync);
|
| - }
|
| }
|
|
|
| void InProcessCommandBuffer::DestroyImage(int32_t id) {
|
| @@ -828,81 +827,57 @@ void InProcessCommandBuffer::DestroyImageOnGpuThread(int32_t id) {
|
| }
|
|
|
| void InProcessCommandBuffer::FenceSyncReleaseOnGpuThread(uint64_t release) {
|
| - DCHECK(!sync_point_client_->client_state()->IsFenceSyncReleased(release));
|
| + SyncToken sync_token(GetNamespaceID(), GetExtraCommandBufferData(),
|
| + GetCommandBufferID(), release);
|
| +
|
| gles2::MailboxManager* mailbox_manager =
|
| decoder_->GetContextGroup()->mailbox_manager();
|
| - if (mailbox_manager->UsesSync()) {
|
| - SyncToken sync_token(GetNamespaceID(), GetExtraCommandBufferData(),
|
| - GetCommandBufferID(), release);
|
| - mailbox_manager->PushTextureUpdates(sync_token);
|
| - }
|
| + mailbox_manager->PushTextureUpdates(sync_token);
|
|
|
| sync_point_client_->ReleaseFenceSync(release);
|
| }
|
|
|
| -bool InProcessCommandBuffer::WaitFenceSyncOnGpuThread(
|
| - gpu::CommandBufferNamespace namespace_id,
|
| - gpu::CommandBufferId command_buffer_id,
|
| - uint64_t release) {
|
| +bool InProcessCommandBuffer::WaitSyncTokenOnGpuThread(
|
| + const SyncToken& sync_token) {
|
| DCHECK(!waiting_for_sync_point_);
|
| gpu::SyncPointManager* sync_point_manager = service_->sync_point_manager();
|
| DCHECK(sync_point_manager);
|
|
|
| - scoped_refptr<gpu::SyncPointClientState> release_state =
|
| - sync_point_manager->GetSyncPointClientState(namespace_id,
|
| - command_buffer_id);
|
| -
|
| - if (!release_state)
|
| - return true;
|
| + gles2::MailboxManager* mailbox_manager =
|
| + decoder_->GetContextGroup()->mailbox_manager();
|
| + DCHECK(mailbox_manager);
|
|
|
| if (service_->BlockThreadOnWaitSyncToken()) {
|
| - if (!release_state->IsFenceSyncReleased(release)) {
|
| - // Use waitable event which is signalled when the release fence is
|
| - // released.
|
| - sync_point_client_->Wait(
|
| - release_state.get(), release,
|
| - base::Bind(&base::WaitableEvent::Signal,
|
| - base::Unretained(&fence_sync_wait_event_)));
|
| + // Wait if sync point wait is valid.
|
| + if (sync_point_client_->Wait(
|
| + sync_token,
|
| + base::Bind(&base::WaitableEvent::Signal,
|
| + base::Unretained(&fence_sync_wait_event_)))) {
|
| fence_sync_wait_event_.Wait();
|
| }
|
|
|
| - gles2::MailboxManager* mailbox_manager =
|
| - decoder_->GetContextGroup()->mailbox_manager();
|
| - SyncToken sync_token(namespace_id, 0, command_buffer_id, release);
|
| mailbox_manager->PullTextureUpdates(sync_token);
|
| - return true;
|
| + return false;
|
| }
|
|
|
| - if (release_state->IsFenceSyncReleased(release)) {
|
| - gles2::MailboxManager* mailbox_manager =
|
| - decoder_->GetContextGroup()->mailbox_manager();
|
| - SyncToken sync_token(namespace_id, 0, command_buffer_id, release);
|
| + waiting_for_sync_point_ = sync_point_client_->Wait(
|
| + sync_token,
|
| + base::Bind(&InProcessCommandBuffer::OnWaitSyncTokenCompleted,
|
| + gpu_thread_weak_ptr_factory_.GetWeakPtr(), sync_token));
|
| + if (!waiting_for_sync_point_) {
|
| mailbox_manager->PullTextureUpdates(sync_token);
|
| - return true;
|
| + return false;
|
| }
|
|
|
| - waiting_for_sync_point_ = true;
|
| - sync_point_client_->Wait(
|
| - release_state.get(), release,
|
| - base::Bind(&InProcessCommandBuffer::OnWaitFenceSyncCompleted,
|
| - gpu_thread_weak_ptr_factory_.GetWeakPtr(), namespace_id,
|
| - command_buffer_id, release));
|
| -
|
| - if (!waiting_for_sync_point_)
|
| - return true;
|
| -
|
| executor_->SetScheduled(false);
|
| - return false;
|
| + return true;
|
| }
|
|
|
| -void InProcessCommandBuffer::OnWaitFenceSyncCompleted(
|
| - CommandBufferNamespace namespace_id,
|
| - CommandBufferId command_buffer_id,
|
| - uint64_t release) {
|
| +void InProcessCommandBuffer::OnWaitSyncTokenCompleted(
|
| + const SyncToken& sync_token) {
|
| DCHECK(waiting_for_sync_point_);
|
| gles2::MailboxManager* mailbox_manager =
|
| decoder_->GetContextGroup()->mailbox_manager();
|
| - SyncToken sync_token(namespace_id, 0, command_buffer_id, release);
|
| mailbox_manager->PullTextureUpdates(sync_token);
|
| waiting_for_sync_point_ = false;
|
| executor_->SetScheduled(true);
|
| @@ -931,20 +906,8 @@ void InProcessCommandBuffer::RescheduleAfterFinishedOnGpuThread() {
|
| void InProcessCommandBuffer::SignalSyncTokenOnGpuThread(
|
| const SyncToken& sync_token,
|
| const base::Closure& callback) {
|
| - gpu::SyncPointManager* sync_point_manager = service_->sync_point_manager();
|
| - DCHECK(sync_point_manager);
|
| -
|
| - scoped_refptr<gpu::SyncPointClientState> release_state =
|
| - sync_point_manager->GetSyncPointClientState(
|
| - sync_token.namespace_id(), sync_token.command_buffer_id());
|
| -
|
| - if (!release_state) {
|
| + if (!sync_point_client_->Wait(sync_token, WrapCallback(callback)))
|
| callback.Run();
|
| - return;
|
| - }
|
| -
|
| - sync_point_client_->WaitOutOfOrder(
|
| - release_state.get(), sync_token.release_count(), WrapCallback(callback));
|
| }
|
|
|
| void InProcessCommandBuffer::SignalQuery(unsigned query_id,
|
| @@ -1013,7 +976,7 @@ void InProcessCommandBuffer::SignalSyncToken(const SyncToken& sync_token,
|
| const base::Closure& callback) {
|
| CheckSequencedThread();
|
| QueueTask(
|
| - true,
|
| + false,
|
| base::Bind(&InProcessCommandBuffer::SignalSyncTokenOnGpuThread,
|
| base::Unretained(this), sync_token, WrapCallback(callback)));
|
| }
|
|
|