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

Unified Diff: cc/surfaces/display.cc

Issue 1821863002: Hook up ui::Compositor to Display's BeginFrameSource (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase; refactor mus output surface Created 4 years, 9 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
Index: cc/surfaces/display.cc
diff --git a/cc/surfaces/display.cc b/cc/surfaces/display.cc
index 6866cedc9cf27654d5e0ebcee75cbda329dae739..cd4c9f8180d75a57d360f0ed63afc812b8297c23 100644
--- a/cc/surfaces/display.cc
+++ b/cc/surfaces/display.cc
@@ -30,44 +30,66 @@ Display::Display(DisplayClient* client,
SurfaceManager* manager,
SharedBitmapManager* bitmap_manager,
gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
- const RendererSettings& settings)
+ const RendererSettings& settings,
+ uint32_t compositor_surface_namespace)
: client_(client),
- manager_(manager),
+ surface_manager_(manager),
bitmap_manager_(bitmap_manager),
gpu_memory_buffer_manager_(gpu_memory_buffer_manager),
settings_(settings),
+ compositor_surface_namespace_(compositor_surface_namespace),
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_->UnregisterBeginFrameSource(scheduler_begin_frame_source_);
+ 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);
}
}
}
+void Display::CreateScheduler(base::SingleThreadTaskRunner* task_runner) {
+ DCHECK(!scheduler_);
+ DCHECK(vsync_begin_frame_source_);
+
+ BeginFrameSource* begin_frame_source = vsync_begin_frame_source_;
+ if (settings_.disable_display_vsync) {
+ unthrottled_begin_frame_source_.reset(
+ new BackToBackBeginFrameSource(task_runner));
+ begin_frame_source = unthrottled_begin_frame_source_.get();
+ }
+
+ scheduler_.reset(
+ new DisplayScheduler(this, begin_frame_source, task_runner,
+ output_surface_->capabilities().max_frames_pending));
+}
+
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;
+ CreateScheduler(task_runner);
+ return true;
}
void Display::SetSurfaceId(SurfaceId id, float device_scale_factor) {
+ DCHECK_EQ(id.id_namespace(), compositor_surface_namespace_);
if (current_surface_id_ == id && device_scale_factor_ == device_scale_factor)
return;
TRACE_EVENT0("cc", "Display::SetSurfaceId");
-
current_surface_id_ = id;
device_scale_factor_ = device_scale_factor;
@@ -135,8 +157,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 +170,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 +200,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 +286,20 @@ bool Display::DrawAndSwap() {
return true;
}
+void Display::UpdateSchedulerBeginFrameSource(BeginFrameSource* source) {
+ if (source == scheduler_begin_frame_source_)
+ return;
+
+ if (scheduler_begin_frame_source_) {
+ surface_manager_->UnregisterBeginFrameSource(scheduler_begin_frame_source_);
+ }
+ scheduler_begin_frame_source_ = source;
+ if (scheduler_begin_frame_source_) {
+ surface_manager_->RegisterBeginFrameSource(scheduler_begin_frame_source_,
+ compositor_surface_namespace_);
+ }
+}
+
void Display::DidSwapBuffers() {
if (scheduler_)
scheduler_->DidSwapBuffers();
@@ -276,9 +312,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
+ // 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 +362,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 ||

Powered by Google App Engine
This is Rietveld 408576698