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

Unified Diff: cc/output/output_surface.cc

Issue 199523002: cc: Throttle swaps in Scheduler instead of OutputSurface (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Actually, unittests need CC_EXPORT. Created 6 years, 8 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 | « cc/output/output_surface.h ('k') | cc/output/output_surface_client.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/output/output_surface.cc
diff --git a/cc/output/output_surface.cc b/cc/output/output_surface.cc
index 3aaa1a1768637829e2f5fe5dfdb3b9c221a0563c..7818849cc55facef5e5eb226a6d1c9d0b86347bd 100644
--- a/cc/output/output_surface.cc
+++ b/cc/output/output_surface.cc
@@ -46,8 +46,8 @@ namespace cc {
OutputSurface::OutputSurface(scoped_refptr<ContextProvider> context_provider)
: context_provider_(context_provider),
device_scale_factor_(-1),
- max_frames_pending_(0),
- pending_swap_buffers_(0),
+ begin_frame_interval_(BeginFrameArgs::DefaultInterval()),
+ throttle_frame_production_(true),
needs_begin_frame_(false),
client_ready_for_begin_frame_(true),
client_(NULL),
@@ -59,8 +59,8 @@ OutputSurface::OutputSurface(scoped_refptr<ContextProvider> context_provider)
OutputSurface::OutputSurface(scoped_ptr<SoftwareOutputDevice> software_device)
: software_device_(software_device.Pass()),
device_scale_factor_(-1),
- max_frames_pending_(0),
- pending_swap_buffers_(0),
+ begin_frame_interval_(BeginFrameArgs::DefaultInterval()),
+ throttle_frame_production_(true),
needs_begin_frame_(false),
client_ready_for_begin_frame_(true),
client_(NULL),
@@ -74,8 +74,8 @@ OutputSurface::OutputSurface(scoped_refptr<ContextProvider> context_provider,
: context_provider_(context_provider),
software_device_(software_device.Pass()),
device_scale_factor_(-1),
- max_frames_pending_(0),
- pending_swap_buffers_(0),
+ begin_frame_interval_(BeginFrameArgs::DefaultInterval()),
+ throttle_frame_production_(true),
needs_begin_frame_(false),
client_ready_for_begin_frame_(true),
client_(NULL),
@@ -84,37 +84,26 @@ OutputSurface::OutputSurface(scoped_refptr<ContextProvider> context_provider,
weak_ptr_factory_(this),
gpu_latency_history_(kGpuLatencyHistorySize) {}
+void OutputSurface::SetThrottleFrameProduction(bool enable) {
+ DCHECK(!frame_rate_controller_);
+ throttle_frame_production_ = enable;
+}
+
void OutputSurface::InitializeBeginFrameEmulation(
base::SingleThreadTaskRunner* task_runner,
- bool throttle_frame_production,
base::TimeDelta interval) {
- if (throttle_frame_production) {
- scoped_refptr<DelayBasedTimeSource> time_source;
- if (gfx::FrameTime::TimestampsAreHighRes())
- time_source = DelayBasedTimeSourceHighRes::Create(interval, task_runner);
- else
- time_source = DelayBasedTimeSource::Create(interval, task_runner);
- frame_rate_controller_.reset(new FrameRateController(time_source));
- } else {
- frame_rate_controller_.reset(new FrameRateController(task_runner));
- }
+ DCHECK(throttle_frame_production_);
+ scoped_refptr<DelayBasedTimeSource> time_source;
+ if (gfx::FrameTime::TimestampsAreHighRes())
+ time_source = DelayBasedTimeSourceHighRes::Create(interval, task_runner);
+ else
+ time_source = DelayBasedTimeSource::Create(interval, task_runner);
+ frame_rate_controller_.reset(new FrameRateController(time_source));
frame_rate_controller_->SetClient(this);
- frame_rate_controller_->SetMaxSwapsPending(max_frames_pending_);
frame_rate_controller_->SetDeadlineAdjustment(
capabilities_.adjust_deadline_for_parent ?
BeginFrameArgs::DefaultDeadlineAdjustment() : base::TimeDelta());
-
- // The new frame rate controller will consume the swap acks of the old
- // frame rate controller, so we set that expectation up here.
- for (int i = 0; i < pending_swap_buffers_; i++)
- frame_rate_controller_->DidSwapBuffers();
-}
-
-void OutputSurface::SetMaxFramesPending(int max_frames_pending) {
- if (frame_rate_controller_)
- frame_rate_controller_->SetMaxSwapsPending(max_frames_pending);
- max_frames_pending_ = max_frames_pending;
}
void OutputSurface::CommitVSyncParameters(base::TimeTicks timebase,
@@ -125,17 +114,14 @@ void OutputSurface::CommitVSyncParameters(base::TimeTicks timebase,
(timebase - base::TimeTicks()).InSecondsF(),
"interval",
interval.InSecondsF());
+ begin_frame_interval_ = interval;
if (frame_rate_controller_)
frame_rate_controller_->SetTimebaseAndInterval(timebase, interval);
}
-void OutputSurface::FrameRateControllerTick(bool throttled,
- const BeginFrameArgs& args) {
+void OutputSurface::FrameRateControllerTick(const BeginFrameArgs& args) {
DCHECK(frame_rate_controller_);
- if (throttled)
- skipped_begin_frame_args_ = args;
- else
- BeginFrame(args);
+ BeginFrame(args);
}
// Forwarded to OutputSurfaceClient
@@ -148,25 +134,29 @@ void OutputSurface::SetNeedsBeginFrame(bool enable) {
TRACE_EVENT1("cc", "OutputSurface::SetNeedsBeginFrame", "enable", enable);
needs_begin_frame_ = enable;
client_ready_for_begin_frame_ = true;
- if (frame_rate_controller_) {
+ if (!throttle_frame_production_) {
+ if (enable) {
+ base::TimeTicks frame_time = gfx::FrameTime::Now();
+ base::TimeTicks deadline = frame_time + begin_frame_interval_;
+ skipped_begin_frame_args_ =
+ BeginFrameArgs::Create(frame_time, deadline, begin_frame_interval_);
+ }
+ } else if (frame_rate_controller_) {
BeginFrameArgs skipped = frame_rate_controller_->SetActive(enable);
if (skipped.IsValid())
skipped_begin_frame_args_ = skipped;
}
+
if (needs_begin_frame_)
PostCheckForRetroactiveBeginFrame();
}
void OutputSurface::BeginFrame(const BeginFrameArgs& args) {
- TRACE_EVENT2("cc",
+ TRACE_EVENT1("cc",
"OutputSurface::BeginFrame",
"client_ready_for_begin_frame_",
- client_ready_for_begin_frame_,
- "pending_swap_buffers_",
- pending_swap_buffers_);
- if (!needs_begin_frame_ || !client_ready_for_begin_frame_ ||
- (pending_swap_buffers_ >= max_frames_pending_ &&
- max_frames_pending_ > 0)) {
+ client_ready_for_begin_frame_);
+ if (!needs_begin_frame_ || !client_ready_for_begin_frame_) {
skipped_begin_frame_args_ = args;
} else {
client_ready_for_begin_frame_ = false;
@@ -201,28 +191,19 @@ void OutputSurface::PostCheckForRetroactiveBeginFrame() {
void OutputSurface::CheckForRetroactiveBeginFrame() {
TRACE_EVENT0("cc", "OutputSurface::CheckForRetroactiveBeginFrame");
check_for_retroactive_begin_frame_pending_ = false;
- if (gfx::FrameTime::Now() < RetroactiveBeginFrameDeadline())
+ if (!throttle_frame_production_ ||
+ gfx::FrameTime::Now() < RetroactiveBeginFrameDeadline())
BeginFrame(skipped_begin_frame_args_);
}
void OutputSurface::DidSwapBuffers() {
- pending_swap_buffers_++;
- TRACE_EVENT1("cc", "OutputSurface::DidSwapBuffers",
- "pending_swap_buffers_", pending_swap_buffers_);
+ TRACE_EVENT0("cc", "OutputSurface::DidSwapBuffers");
client_->DidSwapBuffers();
- if (frame_rate_controller_)
- frame_rate_controller_->DidSwapBuffers();
- PostCheckForRetroactiveBeginFrame();
}
void OutputSurface::OnSwapBuffersComplete() {
- pending_swap_buffers_--;
- TRACE_EVENT1("cc", "OutputSurface::OnSwapBuffersComplete",
- "pending_swap_buffers_", pending_swap_buffers_);
- client_->OnSwapBuffersComplete();
- if (frame_rate_controller_)
- frame_rate_controller_->DidSwapBuffersComplete();
- PostCheckForRetroactiveBeginFrame();
+ TRACE_EVENT0("cc", "OutputSurface::OnSwapBuffersComplete");
+ client_->DidSwapBuffersComplete();
}
void OutputSurface::ReclaimResources(const CompositorFrameAck* ack) {
@@ -232,7 +213,6 @@ void OutputSurface::ReclaimResources(const CompositorFrameAck* ack) {
void OutputSurface::DidLoseOutputSurface() {
TRACE_EVENT0("cc", "OutputSurface::DidLoseOutputSurface");
client_ready_for_begin_frame_ = true;
- pending_swap_buffers_ = 0;
skipped_begin_frame_args_ = BeginFrameArgs();
if (frame_rate_controller_)
frame_rate_controller_->SetActive(false);
« no previous file with comments | « cc/output/output_surface.h ('k') | cc/output/output_surface_client.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698