Commit 03217458 authored by jbauman's avatar jbauman Committed by Commit bot

Limit outstanding surface draw swaps to max_frames_pending.

Avoid queueing up too many swaps on the GPU.

BUG=

Review URL: https://codereview.chromium.org/578383004

Cr-Commit-Position: refs/heads/master@{#296111}
parent 0fb0a60d
......@@ -132,6 +132,14 @@ bool Display::Draw() {
return true;
}
void Display::DidSwapBuffers() {
client_->DidSwapBuffers();
}
void Display::DidSwapBuffersComplete() {
client_->DidSwapBuffersComplete();
}
void Display::OnSurfaceDamaged(SurfaceId surface) {
if (aggregator_ && aggregator_->previous_contained_surfaces().count(surface))
client_->DisplayDamaged();
......@@ -141,4 +149,10 @@ SurfaceId Display::CurrentSurfaceId() {
return current_surface_id_;
}
int Display::GetMaxFramesPending() {
if (!output_surface_)
return OutputSurface::DEFAULT_MAX_FRAMES_PENDING;
return output_surface_->capabilities().max_frames_pending;
}
} // namespace cc
......@@ -47,6 +47,7 @@ class CC_SURFACES_EXPORT Display : public OutputSurfaceClient,
bool Draw();
SurfaceId CurrentSurfaceId();
int GetMaxFramesPending();
// OutputSurfaceClient implementation.
virtual void DeferredInitialize() OVERRIDE {}
......@@ -55,8 +56,8 @@ class CC_SURFACES_EXPORT Display : public OutputSurfaceClient,
base::TimeDelta interval) OVERRIDE {}
virtual void SetNeedsRedrawRect(const gfx::Rect& damage_rect) OVERRIDE {}
virtual void BeginFrame(const BeginFrameArgs& args) OVERRIDE {}
virtual void DidSwapBuffers() OVERRIDE {}
virtual void DidSwapBuffersComplete() OVERRIDE {}
virtual void DidSwapBuffers() OVERRIDE;
virtual void DidSwapBuffersComplete() OVERRIDE;
virtual void ReclaimResources(const CompositorFrameAck* ack) OVERRIDE {}
virtual void DidLoseOutputSurface() OVERRIDE {}
virtual void SetExternalDrawConstraints(
......
......@@ -15,6 +15,8 @@ class DisplayClient {
public:
virtual scoped_ptr<OutputSurface> CreateOutputSurface() = 0;
virtual void DisplayDamaged() = 0;
virtual void DidSwapBuffers() = 0;
virtual void DidSwapBuffersComplete() = 0;
protected:
virtual ~DisplayClient() {}
......
......@@ -21,6 +21,8 @@ OnscreenDisplayClient::OnscreenDisplayClient(
new cc::Display(this, manager, HostSharedBitmapManager::current())),
task_runner_(task_runner),
scheduled_draw_(false),
deferred_draw_(false),
pending_frames_(0),
weak_ptr_factory_(this) {
}
......@@ -33,9 +35,19 @@ scoped_ptr<cc::OutputSurface> OnscreenDisplayClient::CreateOutputSurface() {
}
void OnscreenDisplayClient::DisplayDamaged() {
if (scheduled_draw_)
if (scheduled_draw_ || deferred_draw_)
return;
TRACE_EVENT0("content", "OnscreenDisplayClient::DisplayDamaged");
if (pending_frames_ >= display_->GetMaxFramesPending()) {
deferred_draw_ = true;
} else {
ScheduleDraw();
}
}
void OnscreenDisplayClient::ScheduleDraw() {
DCHECK(!deferred_draw_);
DCHECK(!scheduled_draw_);
scheduled_draw_ = true;
task_runner_->PostTask(
FROM_HERE,
......@@ -48,4 +60,16 @@ void OnscreenDisplayClient::Draw() {
display_->Draw();
}
void OnscreenDisplayClient::DidSwapBuffers() {
pending_frames_++;
}
void OnscreenDisplayClient::DidSwapBuffersComplete() {
pending_frames_--;
if ((pending_frames_ < display_->GetMaxFramesPending()) && deferred_draw_) {
deferred_draw_ = false;
ScheduleDraw();
}
}
} // namespace content
......@@ -34,14 +34,21 @@ class OnscreenDisplayClient : cc::DisplayClient {
// cc::DisplayClient implementation.
virtual scoped_ptr<cc::OutputSurface> CreateOutputSurface() OVERRIDE;
virtual void DisplayDamaged() OVERRIDE;
virtual void DidSwapBuffers() OVERRIDE;
virtual void DidSwapBuffersComplete() OVERRIDE;
private:
void ScheduleDraw();
void Draw();
scoped_ptr<cc::OutputSurface> output_surface_;
scoped_ptr<cc::Display> display_;
scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
bool scheduled_draw_;
// True if a draw should be scheduled, but it's hit the limit on max frames
// pending.
bool deferred_draw_;
int pending_frames_;
base::WeakPtrFactory<OnscreenDisplayClient> weak_ptr_factory_;
......
......@@ -98,4 +98,10 @@ scoped_ptr<cc::OutputSurface> SurfacesImpl::CreateOutputSurface() {
void SurfacesImpl::DisplayDamaged() {
}
void SurfacesImpl::DidSwapBuffers() {
}
void SurfacesImpl::DidSwapBuffersComplete() {
}
} // namespace mojo
......@@ -52,6 +52,8 @@ class SurfacesImpl : public InterfaceImpl<Surface>,
// DisplayClient implementation.
virtual scoped_ptr<cc::OutputSurface> CreateOutputSurface() OVERRIDE;
virtual void DisplayDamaged() OVERRIDE;
virtual void DidSwapBuffers() OVERRIDE;
virtual void DidSwapBuffersComplete() OVERRIDE;
cc::SurfaceFactory* factory() { return &factory_; }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment