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, ¶ms); |
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)); |