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

Unified Diff: gpu/command_buffer/service/in_process_command_buffer.cc

Issue 450793002: gpu: Avoid unbounded idle queue in in-process context (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 4 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 side-by-side diff with in-line comments
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 »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 4a3def924a8879812d6d571d17eb413decec70fc..6aa7cfbfc8b7e1475a7bc020049eda1a42268b2d 100644
--- a/gpu/command_buffer/service/in_process_command_buffer.cc
+++ b/gpu/command_buffer/service/in_process_command_buffer.cc
@@ -206,6 +206,7 @@ InProcessCommandBuffer::GetDefaultService() {
InProcessCommandBuffer::InProcessCommandBuffer(
const scoped_refptr<Service>& service)
: context_lost_(false),
+ idle_work_pending_(false),
last_put_offset_(-1),
flush_event_(false, false),
service_(service.get() ? service : GetDefaultService()),
@@ -505,23 +506,30 @@ void InProcessCommandBuffer::FlushOnGpuThread(int32 put_offset) {
// pump idle work until the query is passed.
if (put_offset == state_after_last_flush_.get_offset &&
gpu_scheduler_->HasMoreWork()) {
- service_->ScheduleIdleWork(
- base::Bind(&InProcessCommandBuffer::ScheduleMoreIdleWork,
- gpu_thread_weak_ptr_));
+ ScheduleIdleWorkOnGpuThread();
}
}
-void InProcessCommandBuffer::ScheduleMoreIdleWork() {
+void InProcessCommandBuffer::PerformIdleWork() {
CheckSequencedThread();
+ idle_work_pending_ = false;
base::AutoLock lock(command_buffer_lock_);
if (gpu_scheduler_->HasMoreWork()) {
gpu_scheduler_->PerformIdleWork();
- service_->ScheduleIdleWork(
- base::Bind(&InProcessCommandBuffer::ScheduleMoreIdleWork,
- gpu_thread_weak_ptr_));
+ ScheduleIdleWorkOnGpuThread();
}
}
+void InProcessCommandBuffer::ScheduleIdleWorkOnGpuThread() {
+ CheckSequencedThread();
+ if (idle_work_pending_)
+ return;
+ idle_work_pending_ = true;
+ service_->ScheduleIdleWork(
+ base::Bind(&InProcessCommandBuffer::PerformIdleWork,
+ gpu_thread_weak_ptr_));
+}
+
void InProcessCommandBuffer::Flush(int32 put_offset) {
CheckSequencedThread();
if (last_state_.error != gpu::error::kNoError)
« 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