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

Unified Diff: content/browser/renderer_host/compositor_impl_android.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
Index: content/browser/renderer_host/compositor_impl_android.cc
diff --git a/content/browser/renderer_host/compositor_impl_android.cc b/content/browser/renderer_host/compositor_impl_android.cc
index 4569a64b742588391a8034152317760385567c6b..6a91f326edca17c223bbac3c36825830ea0525f5 100644
--- a/content/browser/renderer_host/compositor_impl_android.cc
+++ b/content/browser/renderer_host/compositor_impl_android.cc
@@ -76,6 +76,33 @@ namespace {
const unsigned int kMaxDisplaySwapBuffers = 1U;
+class ExternalBeginFrameSource : public cc::BeginFrameSourceBase,
+ public CompositorImpl::VSyncObserver {
+ public:
+ ExternalBeginFrameSource(CompositorImpl* compositor)
+ : compositor_(compositor) {
+ compositor_->AddObserver(this);
+ }
+
+ ~ExternalBeginFrameSource() override { compositor_->RemoveObserver(this); }
+
+ // cc::BeginFrameSourceBase implementation:
+ void OnNeedsBeginFramesChanged(bool needs_begin_frames) override {
+ compositor_->OnNeedsBeginFramesChange(needs_begin_frames);
+ }
+
+ // CompositorImpl::VSyncObserver implementation:
+ void OnVSync(base::TimeTicks frame_time,
+ base::TimeDelta vsync_period) override {
+ CallOnBeginFrame(cc::BeginFrameArgs::Create(
+ BEGINFRAME_FROM_HERE, frame_time, base::TimeTicks::Now(), vsync_period,
+ cc::BeginFrameArgs::NORMAL));
+ }
+
+ private:
+ CompositorImpl* compositor_;
+};
+
// Used to override capabilities_.adjust_deadline_for_parent to false
class OutputSurfaceWithoutParent : public cc::OutputSurface,
public CompositorImpl::VSyncObserver {
@@ -84,7 +111,8 @@ class OutputSurfaceWithoutParent : public cc::OutputSurface,
CompositorImpl* compositor,
const scoped_refptr<ContextProviderCommandBuffer>& context_provider,
const base::Callback<void(gpu::Capabilities)>&
- populate_gpu_capabilities_callback)
+ populate_gpu_capabilities_callback,
+ std::unique_ptr<ExternalBeginFrameSource> begin_frame_source)
: cc::OutputSurface(context_provider),
compositor_(compositor),
populate_gpu_capabilities_callback_(populate_gpu_capabilities_callback),
@@ -92,7 +120,8 @@ class OutputSurfaceWithoutParent : public cc::OutputSurface,
base::Bind(&OutputSurfaceWithoutParent::OnSwapBuffersCompleted,
base::Unretained(this))),
overlay_candidate_validator_(
- new BrowserCompositorOverlayCandidateValidatorAndroid()) {
+ new BrowserCompositorOverlayCandidateValidatorAndroid()),
+ begin_frame_source_(std::move(begin_frame_source)) {
capabilities_.adjust_deadline_for_parent = false;
capabilities_.max_frames_pending = kMaxDisplaySwapBuffers;
}
@@ -122,9 +151,16 @@ class OutputSurfaceWithoutParent : public cc::OutputSurface,
context_provider_->ContextCapabilities().gpu);
compositor_->AddObserver(this);
+ client->SetBeginFrameSource(begin_frame_source_.get());
+
return true;
}
+ void DetachFromClient() override {
+ client_->SetBeginFrameSource(nullptr);
+ OutputSurface::DetachFromClient();
+ }
+
cc::OverlayCandidateValidator* GetOverlayCandidateValidator() const override {
return overlay_candidate_validator_.get();
}
@@ -147,44 +183,17 @@ class OutputSurfaceWithoutParent : public cc::OutputSurface,
}
void OnVSync(base::TimeTicks timebase, base::TimeDelta interval) override {
- CommitVSyncParameters(timebase, interval);
+ client_->CommitVSyncParameters(timebase, interval);
}
+ private:
CompositorImpl* compositor_;
base::Callback<void(gpu::Capabilities)> populate_gpu_capabilities_callback_;
base::CancelableCallback<void(const std::vector<ui::LatencyInfo>&,
gfx::SwapResult)>
swap_buffers_completion_callback_;
std::unique_ptr<cc::OverlayCandidateValidator> overlay_candidate_validator_;
-};
-
-class ExternalBeginFrameSource : public cc::BeginFrameSourceBase,
- public CompositorImpl::VSyncObserver {
- public:
- ExternalBeginFrameSource(CompositorImpl* compositor)
- : compositor_(compositor) {
- compositor_->AddObserver(this);
- }
-
- ~ExternalBeginFrameSource() override {
- compositor_->RemoveObserver(this);
- }
-
- // cc::BeginFrameSourceBase implementation:
- void OnNeedsBeginFramesChanged(bool needs_begin_frames) override {
- compositor_->OnNeedsBeginFramesChange(needs_begin_frames);
- }
-
- // CompositorImpl::VSyncObserver implementation:
- void OnVSync(base::TimeTicks frame_time,
- base::TimeDelta vsync_period) override {
- CallOnBeginFrame(cc::BeginFrameArgs::Create(
- BEGINFRAME_FROM_HERE, frame_time, base::TimeTicks::Now(), vsync_period,
- cc::BeginFrameArgs::NORMAL));
- }
-
- private:
- CompositorImpl* compositor_;
+ std::unique_ptr<ExternalBeginFrameSource> begin_frame_source_;
};
static bool g_initialized = false;
@@ -336,7 +345,6 @@ void CompositorImpl::CreateLayerTreeHost() {
settings.renderer_settings.allow_antialiasing = false;
settings.renderer_settings.highp_threshold_min = 2048;
settings.use_zero_copy = true;
- settings.use_external_begin_frame_source = true;
base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
settings.initial_debug_state.SetRecordRenderingStats(
@@ -352,7 +360,6 @@ void CompositorImpl::CreateLayerTreeHost() {
params.task_graph_runner = g_task_graph_runner.Pointer();
params.main_task_runner = base::ThreadTaskRunnerHandle::Get();
params.settings = &settings;
- params.external_begin_frame_source.reset(new ExternalBeginFrameSource(this));
host_ = cc::LayerTreeHost::CreateSingleThreaded(this, &params);
DCHECK(!host_->visible());
host_->SetRootLayer(root_layer_);
@@ -554,15 +561,16 @@ void CompositorImpl::CreateOutputSurface() {
new OutputSurfaceWithoutParent(
this, context_provider,
base::Bind(&CompositorImpl::PopulateGpuCapabilities,
- base::Unretained(this))));
+ base::Unretained(this)),
+ base::WrapUnique(new ExternalBeginFrameSource(this))));
cc::SurfaceManager* manager = GetSurfaceManager();
- display_client_.reset(
- new cc::OnscreenDisplayClient(std::move(real_output_surface), manager,
- HostSharedBitmapManager::current(),
- BrowserGpuMemoryBufferManager::current(),
- host_->settings().renderer_settings,
- base::ThreadTaskRunnerHandle::Get()));
+ display_client_.reset(new cc::OnscreenDisplayClient(
+ std::move(real_output_surface), manager,
+ HostSharedBitmapManager::current(),
+ BrowserGpuMemoryBufferManager::current(),
+ host_->settings().renderer_settings, base::ThreadTaskRunnerHandle::Get(),
+ surface_id_allocator_->id_namespace()));
std::unique_ptr<cc::SurfaceDisplayOutputSurface> surface_output_surface(
new cc::SurfaceDisplayOutputSurface(manager, surface_id_allocator_.get(),
context_provider, nullptr));

Powered by Google App Engine
This is Rietveld 408576698