Index: cc/surfaces/display.cc |
diff --git a/cc/surfaces/display.cc b/cc/surfaces/display.cc |
index 6866cedc9cf27654d5e0ebcee75cbda329dae739..76b019b7d1a0883096609f7764d657901a9ede1d 100644 |
--- a/cc/surfaces/display.cc |
+++ b/cc/surfaces/display.cc |
@@ -32,22 +32,27 @@ Display::Display(DisplayClient* client, |
gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, |
const RendererSettings& settings) |
: client_(client), |
- manager_(manager), |
+ surface_manager_(manager), |
bitmap_manager_(bitmap_manager), |
gpu_memory_buffer_manager_(gpu_memory_buffer_manager), |
settings_(settings), |
device_scale_factor_(1.f), |
swapped_since_resize_(false), |
- scheduler_(nullptr), |
+ vsync_begin_frame_source_(nullptr), |
+ scheduler_begin_frame_source_(nullptr), |
texture_mailbox_deleter_(new TextureMailboxDeleter(nullptr)) { |
- manager_->AddObserver(this); |
+ surface_manager_->AddObserver(this); |
} |
Display::~Display() { |
- manager_->RemoveObserver(this); |
+ if (scheduler_begin_frame_source_) { |
+ surface_manager_->RegisterBeginFrameSource( |
+ nullptr, current_surface_id_.id_namespace()); |
+ } |
+ surface_manager_->RemoveObserver(this); |
if (aggregator_) { |
for (const auto& id_entry : aggregator_->previous_contained_surfaces()) { |
- Surface* surface = manager_->GetSurfaceForId(id_entry.first); |
+ Surface* surface = surface_manager_->GetSurfaceForId(id_entry.first); |
if (surface) |
surface->RunDrawCallbacks(SurfaceDrawStatus::DRAW_SKIPPED); |
} |
@@ -55,11 +60,15 @@ Display::~Display() { |
} |
bool Display::Initialize(scoped_ptr<OutputSurface> output_surface, |
- DisplayScheduler* scheduler) { |
- // TODO(enne): register/unregister BeginFrameSource with SurfaceManager here. |
+ base::SingleThreadTaskRunner* task_runner) { |
output_surface_ = std::move(output_surface); |
- scheduler_ = scheduler; |
- return output_surface_->BindToClient(this); |
+ if (!output_surface_->BindToClient(this)) |
+ return false; |
+ DCHECK(vsync_begin_frame_source_); |
no sievers
2016/03/25 18:55:08
Then it looks like OutputSurfaceWithoutParent in c
|
+ scheduler_.reset( |
+ new DisplayScheduler(this, vsync_begin_frame_source_, task_runner, |
+ output_surface_->capabilities().max_frames_pending)); |
+ return true; |
} |
void Display::SetSurfaceId(SurfaceId id, float device_scale_factor) { |
@@ -67,13 +76,20 @@ void Display::SetSurfaceId(SurfaceId id, float device_scale_factor) { |
return; |
TRACE_EVENT0("cc", "Display::SetSurfaceId"); |
- |
+ SurfaceId previous_id = current_surface_id_; |
current_surface_id_ = id; |
device_scale_factor_ = device_scale_factor; |
UpdateRootSurfaceResourcesLocked(); |
if (scheduler_) |
scheduler_->SetNewRootSurface(id); |
+ |
+ if (scheduler_begin_frame_source_ && previous_id != current_surface_id_) { |
+ surface_manager_->RegisterBeginFrameSource(nullptr, |
+ previous_id.id_namespace()); |
+ surface_manager_->RegisterBeginFrameSource( |
+ scheduler_begin_frame_source_, current_surface_id_.id_namespace()); |
+ } |
} |
void Display::Resize(const gfx::Size& size) { |
@@ -135,8 +151,8 @@ void Display::InitializeRenderer() { |
// overlays. |
bool output_partial_list = renderer_->Capabilities().using_partial_swap && |
!output_surface_->GetOverlayCandidateValidator(); |
- aggregator_.reset(new SurfaceAggregator(manager_, resource_provider_.get(), |
- output_partial_list)); |
+ aggregator_.reset(new SurfaceAggregator( |
+ surface_manager_, resource_provider_.get(), output_partial_list)); |
} |
void Display::DidLoseOutputSurface() { |
@@ -148,7 +164,7 @@ void Display::DidLoseOutputSurface() { |
} |
void Display::UpdateRootSurfaceResourcesLocked() { |
- Surface* surface = manager_->GetSurfaceForId(current_surface_id_); |
+ Surface* surface = surface_manager_->GetSurfaceForId(current_surface_id_); |
bool root_surface_resources_locked = !surface || !surface->GetEligibleFrame(); |
if (scheduler_) |
scheduler_->SetRootSurfaceResourcesLocked(root_surface_resources_locked); |
@@ -178,7 +194,7 @@ bool Display::DrawAndSwap() { |
// Run callbacks early to allow pipelining. |
for (const auto& id_entry : aggregator_->previous_contained_surfaces()) { |
- Surface* surface = manager_->GetSurfaceForId(id_entry.first); |
+ Surface* surface = surface_manager_->GetSurfaceForId(id_entry.first); |
if (surface) |
surface->RunDrawCallbacks(SurfaceDrawStatus::DRAWN); |
} |
@@ -264,6 +280,21 @@ bool Display::DrawAndSwap() { |
return true; |
} |
+void Display::UpdateSchedulerBeginFrameSource(BeginFrameSource* source) { |
+ if (source == scheduler_begin_frame_source_) |
+ return; |
+ |
+ if (scheduler_begin_frame_source_) { |
+ surface_manager_->RegisterBeginFrameSource( |
+ nullptr, current_surface_id_.id_namespace()); |
+ } |
+ scheduler_begin_frame_source_ = source; |
+ if (scheduler_begin_frame_source_) { |
+ surface_manager_->RegisterBeginFrameSource( |
+ scheduler_begin_frame_source_, current_surface_id_.id_namespace()); |
+ } |
+} |
+ |
void Display::DidSwapBuffers() { |
if (scheduler_) |
scheduler_->DidSwapBuffers(); |
@@ -276,9 +307,15 @@ void Display::DidSwapBuffersComplete() { |
renderer_->SwapBuffersComplete(); |
} |
-void Display::CommitVSyncParameters(base::TimeTicks timebase, |
- base::TimeDelta interval) { |
- client_->CommitVSyncParameters(timebase, interval); |
+void Display::SetBeginFrameSource(BeginFrameSource* source) { |
+ // It's expected that there's only a single source from the |
enne (OOO)
2016/03/25 17:55:36
I feel like this comment explains what has to happ
|
+ // BrowserCompositorOutputSurface that corresponds to vsync. The BFS is |
+ // passed BrowserCompositorOutputSurface -> Display -> DisplayScheduler as an |
+ // input. DisplayScheduler makes a decision about which BFS to use and |
+ // calls back to Display as DisplaySchedulerClient to register for that |
+ // surface id. |
+ DCHECK(!vsync_begin_frame_source_); |
+ vsync_begin_frame_source_ = source; |
} |
void Display::SetMemoryPolicy(const ManagedMemoryPolicy& policy) { |
@@ -320,7 +357,7 @@ void Display::SetFullRootLayerDamage() { |
void Display::OnSurfaceDamaged(SurfaceId surface_id, bool* changed) { |
if (aggregator_ && |
aggregator_->previous_contained_surfaces().count(surface_id)) { |
- Surface* surface = manager_->GetSurfaceForId(surface_id); |
+ Surface* surface = surface_manager_->GetSurfaceForId(surface_id); |
if (surface) { |
const CompositorFrame* current_frame = surface->GetEligibleFrame(); |
if (!current_frame || !current_frame->delegated_frame_data || |