Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(391)

Side by Side Diff: gpu/command_buffer/service/in_process_command_buffer.cc

Issue 1315713007: gpu: Reduce GL context switches used to check pending queries. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « gpu/command_buffer/service/in_process_command_buffer.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/in_process_command_buffer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698