summaryrefslogtreecommitdiffstats
path: root/gpu
diff options
context:
space:
mode:
authorapatrick@chromium.org <apatrick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-04-27 23:13:52 +0000
committerapatrick@chromium.org <apatrick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-04-27 23:13:52 +0000
commita41277237abfc70cb7d10758e69083fb00d74c67 (patch)
treed0c621ea5388430817520342d64754dbe23e6bcc /gpu
parenteca2e17113086ec1b0dbfdd2dfa053166baf8b1a (diff)
downloadchromium_src-a41277237abfc70cb7d10758e69083fb00d74c67.zip
chromium_src-a41277237abfc70cb7d10758e69083fb00d74c67.tar.gz
chromium_src-a41277237abfc70cb7d10758e69083fb00d74c67.tar.bz2
Removed "compositor" child window that was created by the GPU process.Removed the sync IPC that it used to ask the browser process to resize on Linux. Adapted windows to use the same mechanism.TEST=test webgl pages on windows (ANGLE and GL), linux and mac, run try job on windows, linux, mac. checkdeps failure look unrelated to patch.BUG=77536
Review URL: http://codereview.chromium.org/6880218 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@83248 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu')
-rw-r--r--gpu/command_buffer/service/gpu_scheduler.cc32
-rw-r--r--gpu/command_buffer/service/gpu_scheduler.h13
2 files changed, 38 insertions, 7 deletions
diff --git a/gpu/command_buffer/service/gpu_scheduler.cc b/gpu/command_buffer/service/gpu_scheduler.cc
index 408d56d..be47663 100644
--- a/gpu/command_buffer/service/gpu_scheduler.cc
+++ b/gpu/command_buffer/service/gpu_scheduler.cc
@@ -19,6 +19,7 @@ GpuScheduler::GpuScheduler(CommandBuffer* command_buffer,
gles2::ContextGroup* group)
: command_buffer_(command_buffer),
commands_per_update_(100),
+ unscheduled_count_(0),
#if defined(OS_MACOSX)
swap_buffers_count_(0),
acknowledged_swap_buffers_count_(0),
@@ -35,6 +36,7 @@ GpuScheduler::GpuScheduler(CommandBuffer* command_buffer,
int commands_per_update)
: command_buffer_(command_buffer),
commands_per_update_(commands_per_update),
+ unscheduled_count_(0),
#if defined(OS_MACOSX)
swap_buffers_count_(0),
acknowledged_swap_buffers_count_(0),
@@ -121,6 +123,9 @@ void GpuScheduler::ProcessCommands() {
if (state.error != error::kNoError)
return;
+ if (unscheduled_count_ > 0)
+ return;
+
if (decoder_.get()) {
if (!decoder_->MakeCurrent()) {
LOG(ERROR) << "Context lost because MakeCurrent failed.";
@@ -157,6 +162,9 @@ void GpuScheduler::ProcessCommands() {
return;
}
+ if (unscheduled_count_ > 0)
+ break;
+
++commands_processed;
if (command_processed_callback_.get()) {
command_processed_callback_->Run();
@@ -165,15 +173,23 @@ void GpuScheduler::ProcessCommands() {
command_buffer_->SetGetOffset(static_cast<int32>(parser_->get()));
- if (error != error::kWaiting && !parser_->IsEmpty()) {
+ if (unscheduled_count_ == 0 &&
+ error != error::kWaiting &&
+ !parser_->IsEmpty()) {
ScheduleProcessCommands();
}
}
-void GpuScheduler::ScheduleProcessCommands() {
- MessageLoop::current()->PostTask(
- FROM_HERE,
- method_factory_.NewRunnableMethod(&GpuScheduler::ProcessCommands));
+void GpuScheduler::SetScheduled(bool scheduled) {
+ if (scheduled) {
+ --unscheduled_count_;
+ DCHECK_GE(unscheduled_count_, 0);
+
+ if (unscheduled_count_ == 0)
+ ScheduleProcessCommands();
+ } else {
+ ++unscheduled_count_;
+ }
}
Buffer GpuScheduler::GetSharedMemoryBuffer(int32 shm_id) {
@@ -217,4 +233,10 @@ void GpuScheduler::SetCommandProcessedCallback(
command_processed_callback_.reset(callback);
}
+void GpuScheduler::ScheduleProcessCommands() {
+ MessageLoop::current()->PostTask(
+ FROM_HERE,
+ method_factory_.NewRunnableMethod(&GpuScheduler::ProcessCommands));
+}
+
} // namespace gpu
diff --git a/gpu/command_buffer/service/gpu_scheduler.h b/gpu/command_buffer/service/gpu_scheduler.h
index 173e953..04784a7 100644
--- a/gpu/command_buffer/service/gpu_scheduler.h
+++ b/gpu/command_buffer/service/gpu_scheduler.h
@@ -63,8 +63,11 @@ class GpuScheduler : public CommandBufferEngine {
virtual void ProcessCommands();
- // Helper which causes a call to ProcessCommands to be scheduled later.
- void ScheduleProcessCommands();
+ // Sets whether commands should be processed by this scheduler. Setting to
+ // false unschedules. Setting to true reschedules. Whether or not the
+ // scheduler is currently scheduled is "reference counted". Every call with
+ // false must eventually be paired by a call with true.
+ void SetScheduled(bool is_scheduled);
// Implementation of CommandBufferEngine.
virtual Buffer GetSharedMemoryBuffer(int32 shm_id);
@@ -137,6 +140,9 @@ class GpuScheduler : public CommandBufferEngine {
private:
+ // Helper which causes a call to ProcessCommands to be scheduled later.
+ void ScheduleProcessCommands();
+
// Called via a callback just before we are supposed to call the
// user's swap buffers callback.
virtual void WillSwapBuffers();
@@ -151,6 +157,9 @@ class GpuScheduler : public CommandBufferEngine {
scoped_ptr<gles2::GLES2Decoder> decoder_;
scoped_ptr<CommandParser> parser_;
+ // Greater than zero if this is waiting to be rescheduled before continuing.
+ int unscheduled_count_;
+
#if defined(OS_MACOSX)
scoped_ptr<AcceleratedSurface> surface_;
uint64 swap_buffers_count_;