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() { ...@@ -132,6 +132,14 @@ bool Display::Draw() {
return true; return true;
} }
void Display::DidSwapBuffers() {
client_->DidSwapBuffers();
}
void Display::DidSwapBuffersComplete() {
client_->DidSwapBuffersComplete();
}
void Display::OnSurfaceDamaged(SurfaceId surface) { void Display::OnSurfaceDamaged(SurfaceId surface) {
if (aggregator_ && aggregator_->previous_contained_surfaces().count(surface)) if (aggregator_ && aggregator_->previous_contained_surfaces().count(surface))
client_->DisplayDamaged(); client_->DisplayDamaged();
...@@ -141,4 +149,10 @@ SurfaceId Display::CurrentSurfaceId() { ...@@ -141,4 +149,10 @@ SurfaceId Display::CurrentSurfaceId() {
return current_surface_id_; 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 } // namespace cc
...@@ -47,6 +47,7 @@ class CC_SURFACES_EXPORT Display : public OutputSurfaceClient, ...@@ -47,6 +47,7 @@ class CC_SURFACES_EXPORT Display : public OutputSurfaceClient,
bool Draw(); bool Draw();
SurfaceId CurrentSurfaceId(); SurfaceId CurrentSurfaceId();
int GetMaxFramesPending();
// OutputSurfaceClient implementation. // OutputSurfaceClient implementation.
virtual void DeferredInitialize() OVERRIDE {} virtual void DeferredInitialize() OVERRIDE {}
...@@ -55,8 +56,8 @@ class CC_SURFACES_EXPORT Display : public OutputSurfaceClient, ...@@ -55,8 +56,8 @@ class CC_SURFACES_EXPORT Display : public OutputSurfaceClient,
base::TimeDelta interval) OVERRIDE {} base::TimeDelta interval) OVERRIDE {}
virtual void SetNeedsRedrawRect(const gfx::Rect& damage_rect) OVERRIDE {} virtual void SetNeedsRedrawRect(const gfx::Rect& damage_rect) OVERRIDE {}
virtual void BeginFrame(const BeginFrameArgs& args) OVERRIDE {} virtual void BeginFrame(const BeginFrameArgs& args) OVERRIDE {}
virtual void DidSwapBuffers() OVERRIDE {} virtual void DidSwapBuffers() OVERRIDE;
virtual void DidSwapBuffersComplete() OVERRIDE {} virtual void DidSwapBuffersComplete() OVERRIDE;
virtual void ReclaimResources(const CompositorFrameAck* ack) OVERRIDE {} virtual void ReclaimResources(const CompositorFrameAck* ack) OVERRIDE {}
virtual void DidLoseOutputSurface() OVERRIDE {} virtual void DidLoseOutputSurface() OVERRIDE {}
virtual void SetExternalDrawConstraints( virtual void SetExternalDrawConstraints(
......
...@@ -15,6 +15,8 @@ class DisplayClient { ...@@ -15,6 +15,8 @@ class DisplayClient {
public: public:
virtual scoped_ptr<OutputSurface> CreateOutputSurface() = 0; virtual scoped_ptr<OutputSurface> CreateOutputSurface() = 0;
virtual void DisplayDamaged() = 0; virtual void DisplayDamaged() = 0;
virtual void DidSwapBuffers() = 0;
virtual void DidSwapBuffersComplete() = 0;
protected: protected:
virtual ~DisplayClient() {} virtual ~DisplayClient() {}
......
...@@ -21,6 +21,8 @@ OnscreenDisplayClient::OnscreenDisplayClient( ...@@ -21,6 +21,8 @@ OnscreenDisplayClient::OnscreenDisplayClient(
new cc::Display(this, manager, HostSharedBitmapManager::current())), new cc::Display(this, manager, HostSharedBitmapManager::current())),
task_runner_(task_runner), task_runner_(task_runner),
scheduled_draw_(false), scheduled_draw_(false),
deferred_draw_(false),
pending_frames_(0),
weak_ptr_factory_(this) { weak_ptr_factory_(this) {
} }
...@@ -33,9 +35,19 @@ scoped_ptr<cc::OutputSurface> OnscreenDisplayClient::CreateOutputSurface() { ...@@ -33,9 +35,19 @@ scoped_ptr<cc::OutputSurface> OnscreenDisplayClient::CreateOutputSurface() {
} }
void OnscreenDisplayClient::DisplayDamaged() { void OnscreenDisplayClient::DisplayDamaged() {
if (scheduled_draw_) if (scheduled_draw_ || deferred_draw_)
return; return;
TRACE_EVENT0("content", "OnscreenDisplayClient::DisplayDamaged"); 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; scheduled_draw_ = true;
task_runner_->PostTask( task_runner_->PostTask(
FROM_HERE, FROM_HERE,
...@@ -48,4 +60,16 @@ void OnscreenDisplayClient::Draw() { ...@@ -48,4 +60,16 @@ void OnscreenDisplayClient::Draw() {
display_->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 } // namespace content
...@@ -34,14 +34,21 @@ class OnscreenDisplayClient : cc::DisplayClient { ...@@ -34,14 +34,21 @@ class OnscreenDisplayClient : cc::DisplayClient {
// cc::DisplayClient implementation. // cc::DisplayClient implementation.
virtual scoped_ptr<cc::OutputSurface> CreateOutputSurface() OVERRIDE; virtual scoped_ptr<cc::OutputSurface> CreateOutputSurface() OVERRIDE;
virtual void DisplayDamaged() OVERRIDE; virtual void DisplayDamaged() OVERRIDE;
virtual void DidSwapBuffers() OVERRIDE;
virtual void DidSwapBuffersComplete() OVERRIDE;
private: private:
void ScheduleDraw();
void Draw(); void Draw();
scoped_ptr<cc::OutputSurface> output_surface_; scoped_ptr<cc::OutputSurface> output_surface_;
scoped_ptr<cc::Display> display_; scoped_ptr<cc::Display> display_;
scoped_refptr<base::SingleThreadTaskRunner> task_runner_; scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
bool scheduled_draw_; 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_; base::WeakPtrFactory<OnscreenDisplayClient> weak_ptr_factory_;
......
...@@ -98,4 +98,10 @@ scoped_ptr<cc::OutputSurface> SurfacesImpl::CreateOutputSurface() { ...@@ -98,4 +98,10 @@ scoped_ptr<cc::OutputSurface> SurfacesImpl::CreateOutputSurface() {
void SurfacesImpl::DisplayDamaged() { void SurfacesImpl::DisplayDamaged() {
} }
void SurfacesImpl::DidSwapBuffers() {
}
void SurfacesImpl::DidSwapBuffersComplete() {
}
} // namespace mojo } // namespace mojo
...@@ -52,6 +52,8 @@ class SurfacesImpl : public InterfaceImpl<Surface>, ...@@ -52,6 +52,8 @@ class SurfacesImpl : public InterfaceImpl<Surface>,
// DisplayClient implementation. // DisplayClient implementation.
virtual scoped_ptr<cc::OutputSurface> CreateOutputSurface() OVERRIDE; virtual scoped_ptr<cc::OutputSurface> CreateOutputSurface() OVERRIDE;
virtual void DisplayDamaged() OVERRIDE; virtual void DisplayDamaged() OVERRIDE;
virtual void DidSwapBuffers() OVERRIDE;
virtual void DidSwapBuffersComplete() OVERRIDE;
cc::SurfaceFactory* factory() { return &factory_; } 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