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

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: Fix Display member destruction order Created 4 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/surfaces/display.h ('k') | cc/surfaces/display_client.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/surfaces/display.cc
diff --git a/cc/surfaces/display.cc b/cc/surfaces/display.cc
index 2632827cd200e7b4a4295002138239a5f1127072..7c1941d0e0cb9c5af8fe3a496156f412c31401e6 100644
--- a/cc/surfaces/display.cc
+++ b/cc/surfaces/display.cc
@@ -24,50 +24,94 @@
#include "gpu/command_buffer/client/gles2_interface.h"
#include "ui/gfx/buffer_types.h"
+namespace {
+
+class EmptyBeginFrameSource : public cc::BeginFrameSource {
+ public:
+ void DidFinishFrame(size_t remaining_frames) override{};
+ void AddObserver(cc::BeginFrameObserver* obs) override{};
+ void RemoveObserver(cc::BeginFrameObserver* obs) override{};
+ void AsValueInto(base::trace_event::TracedValue* dict) const override{};
+};
+
+} // namespace
+
namespace cc {
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),
+ observed_begin_frame_source_(nullptr),
texture_mailbox_deleter_(new TextureMailboxDeleter(nullptr)) {
- manager_->AddObserver(this);
+ surface_manager_->AddObserver(this);
}
Display::~Display() {
- manager_->RemoveObserver(this);
+ if (observed_begin_frame_source_)
+ surface_manager_->UnregisterBeginFrameSource(observed_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_);
+ if (!task_runner) {
+ // WebView doesn't have a task runner or a real begin frame source,
+ // so just create something fake here.
+ internal_begin_frame_source_.reset(new EmptyBeginFrameSource());
+ vsync_begin_frame_source_ = internal_begin_frame_source_.get();
+ observed_begin_frame_source_ = vsync_begin_frame_source_;
+ } else {
+ DCHECK(vsync_begin_frame_source_);
+
+ observed_begin_frame_source_ = vsync_begin_frame_source_;
+ if (settings_.disable_display_vsync) {
+ internal_begin_frame_source_.reset(
+ new BackToBackBeginFrameSource(task_runner));
+ observed_begin_frame_source_ = internal_begin_frame_source_.get();
+ }
+ }
+
+ scheduler_.reset(
+ new DisplayScheduler(this, observed_begin_frame_source_, task_runner,
+ output_surface_->capabilities().max_frames_pending));
+ surface_manager_->RegisterBeginFrameSource(observed_begin_frame_source_,
+ compositor_surface_namespace_);
+}
+
bool Display::Initialize(std::unique_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;
@@ -136,8 +180,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() {
@@ -149,7 +193,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);
@@ -179,7 +223,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);
}
@@ -277,9 +321,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) {
@@ -321,7 +371,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 ||
« no previous file with comments | « cc/surfaces/display.h ('k') | cc/surfaces/display_client.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698