Chromium Code Reviews| Index: components/mus/gles2/command_buffer_local.cc |
| diff --git a/components/mus/gles2/command_buffer_local.cc b/components/mus/gles2/command_buffer_local.cc |
| index 27442cb3834f78d4e51ea8d1198a36339121a765..808985370e0566d46954e4f1fd448c087ed037e9 100644 |
| --- a/components/mus/gles2/command_buffer_local.cc |
| +++ b/components/mus/gles2/command_buffer_local.cc |
| @@ -32,6 +32,7 @@ CommandBufferLocal::CommandBufferLocal(CommandBufferLocalClient* client, |
| : widget_(widget), |
| gpu_state_(gpu_state), |
| client_(client), |
| + next_fence_sync_release_(1), |
| weak_factory_(this) {} |
| CommandBufferLocal::~CommandBufferLocal() { |
| @@ -92,6 +93,12 @@ bool CommandBufferLocal::Initialize() { |
| base::Bind(&CommandBufferLocal::OnResize, base::Unretained(this))); |
| decoder_->SetWaitSyncPointCallback( |
| base::Bind(&CommandBufferLocal::OnWaitSyncPoint, base::Unretained(this))); |
| + decoder_->SetFenceSyncReleaseCallback( |
| + base::Bind(&CommandBufferLocal::OnFenceSyncRelease, |
| + base::Unretained(this))); |
| + decoder_->SetWaitFenceSyncCallback( |
| + base::Bind(&CommandBufferLocal::OnWaitFenceSync, |
| + base::Unretained(this))); |
| gpu::gles2::DisallowedFeatures disallowed_features; |
| @@ -220,6 +227,18 @@ uint64_t CommandBufferLocal::GetCommandBufferID() const { |
| return 0; |
| } |
| +uint32_t CommandBufferLocal::GenerateFenceSyncRelease() { |
| + return next_fence_sync_release_++; |
| +} |
| + |
| +bool CommandBufferLocal::IsFenceSyncRelease(uint32_t release) { |
| + return release > 0 && release < next_fence_sync_release_; |
| +} |
| + |
| +bool CommandBufferLocal::IsFenceSyncFlushed(uint32_t release) { |
| + return IsFenceSyncRelease(release); |
| +} |
| + |
| void CommandBufferLocal::PumpCommands() { |
| if (!decoder_->MakeCurrent()) { |
| command_buffer_->SetContextLostReason(decoder_->GetContextLostReason()); |
| @@ -253,6 +272,44 @@ bool CommandBufferLocal::OnWaitSyncPoint(uint32_t sync_point) { |
| return scheduler_->scheduled(); |
| } |
| +void CommandBufferLocal::OnFenceSyncRelease(uint32_t release) { |
| + // TODO(dyen): Implement once CommandBufferID has been figured out and |
| + // we have a SyncPointClient. It would probably look like what is commented |
| + // out below: |
| + // if (!sync_point_client_->client_state()->IsFenceSyncReleased(release)) |
| + // sync_point_client_->ReleaseFenceSync(release); |
| + NOTIMPLEMENTED(); |
| +} |
| + |
| +bool CommandBufferLocal::OnWaitFenceSync( |
| + gpu::CommandBufferNamespace namespace_id, |
| + uint64_t command_buffer_id, |
| + uint32_t release) { |
| + gpu::SyncPointManager* sync_point_manager = gpu_state_->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.get()) |
|
dcheng
2015/09/28 07:39:33
No .get()
David Yen
2015/09/28 17:38:18
Done.
|
| + return true; |
| + |
| + if (release_state->IsFenceSyncReleased(release)) |
| + return true; |
| + |
| + // TODO(dyen): Implement once CommandBufferID has been figured out and |
| + // we have a SyncPointClient. It would probably look like what is commented |
| + // out below: |
| + // sync_point_client_->Wait( |
| + // release_state, |
| + // release, |
| + // base::Bind(&CommandBufferLocal::OnSyncPointRetired, |
| + // weak_factory_.GetWeakPtr())); |
| + NOTIMPLEMENTED(); |
| + return scheduler_->scheduled(); |
| +} |
| + |
| void CommandBufferLocal::OnParseError() { |
| gpu::CommandBuffer::State state = command_buffer_->GetLastState(); |
| OnContextLost(state.context_lost_reason); |