| OLD | NEW | 
|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "gpu/command_buffer/service/in_process_command_buffer.h" | 5 #include "gpu/command_buffer/service/in_process_command_buffer.h" | 
| 6 | 6 | 
| 7 #include <queue> | 7 #include <queue> | 
| 8 #include <set> | 8 #include <set> | 
| 9 #include <utility> | 9 #include <utility> | 
| 10 | 10 | 
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 168       !base::CommandLine::ForCurrentProcess()->HasSwitch( | 168       !base::CommandLine::ForCurrentProcess()->HasSwitch( | 
| 169           switches::kDisableGpuProgramCache)) { | 169           switches::kDisableGpuProgramCache)) { | 
| 170     program_cache_.reset(new gpu::gles2::MemoryProgramCache()); | 170     program_cache_.reset(new gpu::gles2::MemoryProgramCache()); | 
| 171   } | 171   } | 
| 172   return program_cache_.get(); | 172   return program_cache_.get(); | 
| 173 } | 173 } | 
| 174 | 174 | 
| 175 InProcessCommandBuffer::InProcessCommandBuffer( | 175 InProcessCommandBuffer::InProcessCommandBuffer( | 
| 176     const scoped_refptr<Service>& service) | 176     const scoped_refptr<Service>& service) | 
| 177     : context_lost_(false), | 177     : context_lost_(false), | 
| 178       idle_work_pending_(false), | 178       delayed_work_pending_(false), | 
| 179       image_factory_(nullptr), | 179       image_factory_(nullptr), | 
| 180       last_put_offset_(-1), | 180       last_put_offset_(-1), | 
| 181       gpu_memory_buffer_manager_(nullptr), | 181       gpu_memory_buffer_manager_(nullptr), | 
| 182       flush_event_(false, false), | 182       flush_event_(false, false), | 
| 183       service_(GetInitialService(service)), | 183       service_(GetInitialService(service)), | 
| 184       gpu_thread_weak_ptr_factory_(this) { | 184       gpu_thread_weak_ptr_factory_(this) { | 
| 185   DCHECK(service_.get()); | 185   DCHECK(service_.get()); | 
| 186   next_image_id_.GetNext(); | 186   next_image_id_.GetNext(); | 
| 187 } | 187 } | 
| 188 | 188 | 
| (...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 487     // Update state before signaling the flush event. | 487     // Update state before signaling the flush event. | 
| 488     base::AutoLock lock(state_after_last_flush_lock_); | 488     base::AutoLock lock(state_after_last_flush_lock_); | 
| 489     state_after_last_flush_ = command_buffer_->GetLastState(); | 489     state_after_last_flush_ = command_buffer_->GetLastState(); | 
| 490   } | 490   } | 
| 491   DCHECK((!error::IsError(state_after_last_flush_.error) && !context_lost_) || | 491   DCHECK((!error::IsError(state_after_last_flush_.error) && !context_lost_) || | 
| 492          (error::IsError(state_after_last_flush_.error) && context_lost_)); | 492          (error::IsError(state_after_last_flush_.error) && context_lost_)); | 
| 493 | 493 | 
| 494   // If we've processed all pending commands but still have pending queries, | 494   // If we've processed all pending commands but still have pending queries, | 
| 495   // pump idle work until the query is passed. | 495   // pump idle work until the query is passed. | 
| 496   if (put_offset == state_after_last_flush_.get_offset && | 496   if (put_offset == state_after_last_flush_.get_offset && | 
| 497       gpu_scheduler_->HasMoreWork()) { | 497       (gpu_scheduler_->HasMoreIdleWork() || | 
| 498     ScheduleIdleWorkOnGpuThread(); | 498        gpu_scheduler_->HasPendingQueries())) { | 
|  | 499     ScheduleDelayedWorkOnGpuThread(); | 
| 499   } | 500   } | 
| 500 } | 501 } | 
| 501 | 502 | 
| 502 void InProcessCommandBuffer::PerformIdleWork() { | 503 void InProcessCommandBuffer::PerformDelayedWork() { | 
| 503   CheckSequencedThread(); | 504   CheckSequencedThread(); | 
| 504   idle_work_pending_ = false; | 505   delayed_work_pending_ = false; | 
| 505   base::AutoLock lock(command_buffer_lock_); | 506   base::AutoLock lock(command_buffer_lock_); | 
| 506   if (MakeCurrent() && gpu_scheduler_->HasMoreWork()) { | 507   if (MakeCurrent()) { | 
| 507     gpu_scheduler_->PerformIdleWork(); | 508     gpu_scheduler_->PerformIdleWork(); | 
| 508     ScheduleIdleWorkOnGpuThread(); | 509     gpu_scheduler_->ProcessPendingQueries(); | 
|  | 510     if (gpu_scheduler_->HasMoreIdleWork() || | 
|  | 511         gpu_scheduler_->HasPendingQueries()) { | 
|  | 512       ScheduleDelayedWorkOnGpuThread(); | 
|  | 513     } | 
| 509   } | 514   } | 
| 510 } | 515 } | 
| 511 | 516 | 
| 512 void InProcessCommandBuffer::ScheduleIdleWorkOnGpuThread() { | 517 void InProcessCommandBuffer::ScheduleDelayedWorkOnGpuThread() { | 
| 513   CheckSequencedThread(); | 518   CheckSequencedThread(); | 
| 514   if (idle_work_pending_) | 519   if (delayed_work_pending_) | 
| 515     return; | 520     return; | 
| 516   idle_work_pending_ = true; | 521   delayed_work_pending_ = true; | 
| 517   service_->ScheduleIdleWork( | 522   service_->ScheduleDelayedWork(base::Bind( | 
| 518       base::Bind(&InProcessCommandBuffer::PerformIdleWork, | 523       &InProcessCommandBuffer::PerformDelayedWork, gpu_thread_weak_ptr_)); | 
| 519                  gpu_thread_weak_ptr_)); |  | 
| 520 } | 524 } | 
| 521 | 525 | 
| 522 void InProcessCommandBuffer::Flush(int32 put_offset) { | 526 void InProcessCommandBuffer::Flush(int32 put_offset) { | 
| 523   CheckSequencedThread(); | 527   CheckSequencedThread(); | 
| 524   if (last_state_.error != gpu::error::kNoError) | 528   if (last_state_.error != gpu::error::kNoError) | 
| 525     return; | 529     return; | 
| 526 | 530 | 
| 527   if (last_put_offset_ == put_offset) | 531   if (last_put_offset_ == put_offset) | 
| 528     return; | 532     return; | 
| 529 | 533 | 
| (...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 922   base::RefCountedThreadSafe<GpuInProcessThread>::AddRef(); | 926   base::RefCountedThreadSafe<GpuInProcessThread>::AddRef(); | 
| 923 } | 927 } | 
| 924 void GpuInProcessThread::Release() const { | 928 void GpuInProcessThread::Release() const { | 
| 925   base::RefCountedThreadSafe<GpuInProcessThread>::Release(); | 929   base::RefCountedThreadSafe<GpuInProcessThread>::Release(); | 
| 926 } | 930 } | 
| 927 | 931 | 
| 928 void GpuInProcessThread::ScheduleTask(const base::Closure& task) { | 932 void GpuInProcessThread::ScheduleTask(const base::Closure& task) { | 
| 929   task_runner()->PostTask(FROM_HERE, task); | 933   task_runner()->PostTask(FROM_HERE, task); | 
| 930 } | 934 } | 
| 931 | 935 | 
| 932 void GpuInProcessThread::ScheduleIdleWork(const base::Closure& callback) { | 936 void GpuInProcessThread::ScheduleDelayedWork(const base::Closure& callback) { | 
| 933   // Match delay with GpuCommandBufferStub. | 937   // Match delay with GpuCommandBufferStub. | 
| 934   task_runner()->PostDelayedTask(FROM_HERE, callback, | 938   task_runner()->PostDelayedTask(FROM_HERE, callback, | 
| 935                                  base::TimeDelta::FromMilliseconds(2)); | 939                                  base::TimeDelta::FromMilliseconds(2)); | 
| 936 } | 940 } | 
| 937 | 941 | 
| 938 bool GpuInProcessThread::UseVirtualizedGLContexts() { | 942 bool GpuInProcessThread::UseVirtualizedGLContexts() { | 
| 939   return false; | 943   return false; | 
| 940 } | 944 } | 
| 941 | 945 | 
| 942 scoped_refptr<gles2::ShaderTranslatorCache> | 946 scoped_refptr<gles2::ShaderTranslatorCache> | 
| 943 GpuInProcessThread::shader_translator_cache() { | 947 GpuInProcessThread::shader_translator_cache() { | 
| 944   if (!shader_translator_cache_.get()) | 948   if (!shader_translator_cache_.get()) | 
| 945     shader_translator_cache_ = new gpu::gles2::ShaderTranslatorCache; | 949     shader_translator_cache_ = new gpu::gles2::ShaderTranslatorCache; | 
| 946   return shader_translator_cache_; | 950   return shader_translator_cache_; | 
| 947 } | 951 } | 
| 948 | 952 | 
| 949 scoped_refptr<gles2::FramebufferCompletenessCache> | 953 scoped_refptr<gles2::FramebufferCompletenessCache> | 
| 950 GpuInProcessThread::framebuffer_completeness_cache() { | 954 GpuInProcessThread::framebuffer_completeness_cache() { | 
| 951   if (!framebuffer_completeness_cache_.get()) | 955   if (!framebuffer_completeness_cache_.get()) | 
| 952     framebuffer_completeness_cache_ = | 956     framebuffer_completeness_cache_ = | 
| 953         new gpu::gles2::FramebufferCompletenessCache; | 957         new gpu::gles2::FramebufferCompletenessCache; | 
| 954   return framebuffer_completeness_cache_; | 958   return framebuffer_completeness_cache_; | 
| 955 } | 959 } | 
| 956 | 960 | 
| 957 SyncPointManager* GpuInProcessThread::sync_point_manager() { | 961 SyncPointManager* GpuInProcessThread::sync_point_manager() { | 
| 958   return sync_point_manager_; | 962   return sync_point_manager_; | 
| 959 } | 963 } | 
| 960 | 964 | 
| 961 }  // namespace gpu | 965 }  // namespace gpu | 
| OLD | NEW | 
|---|