| 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 8836904ce9d6360344238f72a63b8d3cd23b5a4a..c6e54a5e66f70af96bfd8cf7662cb253b9d84665 100644
|
| --- a/gpu/command_buffer/service/in_process_command_buffer.cc
|
| +++ b/gpu/command_buffer/service/in_process_command_buffer.cc
|
| @@ -133,6 +133,7 @@ class SyncPointManager {
|
|
|
| bool IsSyncPointPassed(uint32 sync_point);
|
| void WaitSyncPoint(uint32 sync_point);
|
| + bool WasSyncPointGenerated(uint32 sync_point);
|
|
|
| private:
|
| // This lock protects access to pending_sync_points_ and next_sync_point_ and
|
| @@ -176,6 +177,11 @@ void SyncPointManager::WaitSyncPoint(uint32 sync_point) {
|
| }
|
| }
|
|
|
| +bool SyncPointManager::WasSyncPointGenerated(uint32 sync_point) {
|
| + base::AutoLock lock(lock_);
|
| + return next_sync_point_ - 1 - sync_point < 0x80000000;
|
| +}
|
| +
|
| base::LazyInstance<SyncPointManager> g_sync_point_manager =
|
| LAZY_INSTANCE_INITIALIZER;
|
|
|
| @@ -425,9 +431,6 @@ bool InProcessCommandBuffer::InitializeOnGpuThread(
|
| decoder_->SetResizeCallback(base::Bind(
|
| &InProcessCommandBuffer::OnResizeView, gpu_thread_weak_ptr_));
|
| }
|
| - decoder_->SetWaitSyncPointCallback(
|
| - base::Bind(&InProcessCommandBuffer::WaitSyncPointOnGpuThread,
|
| - base::Unretained(this)));
|
|
|
| image_factory_ = params.image_factory;
|
| params.capabilities->image = params.capabilities->image && image_factory_;
|
| @@ -501,11 +504,16 @@ int32 InProcessCommandBuffer::GetLastToken() {
|
| return last_state_.token;
|
| }
|
|
|
| -void InProcessCommandBuffer::FlushOnGpuThread(int32 put_offset) {
|
| +void InProcessCommandBuffer::FlushOnGpuThread(
|
| + int32 put_offset,
|
| + const std::vector<uint32>& sync_points) {
|
| CheckSequencedThread();
|
| + for (uint32 sync_point : sync_points) {
|
| + WaitSyncPointOnGpuThread(sync_point);
|
| + }
|
| ScopedEvent handle_flush(&flush_event_);
|
| base::AutoLock lock(command_buffer_lock_);
|
| - command_buffer_->Flush(put_offset);
|
| + command_buffer_->Flush(put_offset, sync_points);
|
| {
|
| // Update state before signaling the flush event.
|
| base::AutoLock lock(state_after_last_flush_lock_);
|
| @@ -542,7 +550,8 @@ void InProcessCommandBuffer::ScheduleIdleWorkOnGpuThread() {
|
| gpu_thread_weak_ptr_));
|
| }
|
|
|
| -void InProcessCommandBuffer::Flush(int32 put_offset) {
|
| +void InProcessCommandBuffer::Flush(int32 put_offset,
|
| + const std::vector<uint32>& sync_points) {
|
| CheckSequencedThread();
|
| if (last_state_.error != gpu::error::kNoError)
|
| return;
|
| @@ -551,9 +560,15 @@ void InProcessCommandBuffer::Flush(int32 put_offset) {
|
| return;
|
|
|
| last_put_offset_ = put_offset;
|
| - base::Closure task = base::Bind(&InProcessCommandBuffer::FlushOnGpuThread,
|
| - gpu_thread_weak_ptr_,
|
| - put_offset);
|
| + std::vector<uint32> sanitized_sync_points;
|
| + for (const int& sync_point : sync_points) {
|
| + if (g_sync_point_manager.Get().WasSyncPointGenerated(sync_point))
|
| + sanitized_sync_points.push_back(sync_point);
|
| + }
|
| +
|
| + base::Closure task =
|
| + base::Bind(&InProcessCommandBuffer::FlushOnGpuThread,
|
| + gpu_thread_weak_ptr_, put_offset, sanitized_sync_points);
|
| QueueTask(task);
|
| }
|
|
|
|
|