Index: content/browser/android/in_process/synchronous_compositor_impl.cc |
diff --git a/content/browser/android/in_process/synchronous_compositor_impl.cc b/content/browser/android/in_process/synchronous_compositor_impl.cc |
deleted file mode 100644 |
index 652753ed911aa60d844195309ad60319835e165a..0000000000000000000000000000000000000000 |
--- a/content/browser/android/in_process/synchronous_compositor_impl.cc |
+++ /dev/null |
@@ -1,376 +0,0 @@ |
-// Copyright 2013 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "content/browser/android/in_process/synchronous_compositor_impl.h" |
- |
-#include <utility> |
- |
-#include "base/auto_reset.h" |
-#include "base/bind.h" |
-#include "base/lazy_instance.h" |
-#include "base/message_loop/message_loop.h" |
-#include "content/browser/android/in_process/synchronous_compositor_factory_impl.h" |
-#include "content/browser/android/in_process/synchronous_compositor_registry_in_proc.h" |
-#include "content/browser/android/in_process/synchronous_input_event_filter.h" |
-#include "content/browser/gpu/gpu_process_host.h" |
-#include "content/browser/renderer_host/render_widget_host_view_android.h" |
-#include "content/common/input/did_overscroll_params.h" |
-#include "content/common/input_messages.h" |
-#include "content/public/browser/android/synchronous_compositor_client.h" |
-#include "content/public/browser/browser_thread.h" |
-#include "content/public/browser/render_process_host.h" |
-#include "content/public/browser/render_view_host.h" |
-#include "content/public/browser/render_widget_host.h" |
-#include "content/public/common/child_process_host.h" |
-#include "ui/gfx/geometry/scroll_offset.h" |
-#include "ui/gl/gl_surface.h" |
- |
-namespace content { |
- |
-namespace { |
- |
-int g_process_id = ChildProcessHost::kInvalidUniqueID; |
- |
-base::LazyInstance<SynchronousCompositorFactoryImpl>::Leaky g_factory = |
- LAZY_INSTANCE_INITIALIZER; |
- |
-} // namespace |
- |
-SynchronousCompositorImpl* SynchronousCompositorImpl::FromRoutingID( |
- int routing_id) { |
- if (g_factory == nullptr) |
- return nullptr; |
- if (g_process_id == ChildProcessHost::kInvalidUniqueID) |
- return nullptr; |
- RenderViewHost* rvh = RenderViewHost::FromID(g_process_id, routing_id); |
- if (!rvh) |
- return nullptr; |
- RenderWidgetHostViewAndroid* rwhva = |
- static_cast<RenderWidgetHostViewAndroid*>(rvh->GetWidget()->GetView()); |
- if (!rwhva) |
- return nullptr; |
- return static_cast<SynchronousCompositorImpl*>( |
- rwhva->GetSynchronousCompositor()); |
-} |
- |
-SynchronousCompositorImpl::SynchronousCompositorImpl( |
- RenderWidgetHostViewAndroid* rwhva, |
- SynchronousCompositorClient* client) |
- : rwhva_(rwhva), |
- routing_id_(rwhva_->GetRenderWidgetHost()->GetRoutingID()), |
- compositor_client_(client), |
- output_surface_(nullptr), |
- begin_frame_source_(nullptr), |
- synchronous_input_handler_proxy_(nullptr), |
- registered_with_client_(false), |
- is_active_(true), |
- renderer_needs_begin_frames_(false), |
- need_animate_input_(false), |
- weak_ptr_factory_(this) { |
- DCHECK_NE(routing_id_, MSG_ROUTING_NONE); |
- g_factory.Get(); // Ensure it's initialized. |
- |
- int process_id = rwhva_->GetRenderWidgetHost()->GetProcess()->GetID(); |
- if (g_process_id == ChildProcessHost::kInvalidUniqueID) { |
- g_process_id = process_id; |
- } else { |
- DCHECK_EQ(g_process_id, process_id); // Not multiprocess compatible. |
- } |
- |
- SynchronousCompositorRegistryInProc::GetInstance()->RegisterCompositor( |
- routing_id_, this); |
-} |
- |
-SynchronousCompositorImpl::~SynchronousCompositorImpl() { |
- SynchronousCompositorRegistryInProc::GetInstance()->UnregisterCompositor( |
- routing_id_, this); |
-} |
- |
-void SynchronousCompositorImpl::RegisterWithClient() { |
- DCHECK(CalledOnValidThread()); |
- DCHECK(output_surface_); |
- DCHECK(synchronous_input_handler_proxy_); |
- DCHECK(!registered_with_client_); |
- registered_with_client_ = true; |
- |
- compositor_client_->DidInitializeCompositor(this); |
- compositor_client_->DidBecomeCurrent(this); |
- |
- output_surface_->SetTreeActivationCallback( |
- base::Bind(&SynchronousCompositorImpl::DidActivatePendingTree, |
- weak_ptr_factory_.GetWeakPtr())); |
- |
- // This disables the input system from animating inputs autonomously, instead |
- // routing all input animations through the SynchronousInputHandler, which is |
- // |this| class. Calling this causes an UpdateRootLayerState() immediately so, |
- // do it after setting the client. |
- synchronous_input_handler_proxy_->SetOnlySynchronouslyAnimateRootFlings(this); |
-} |
- |
-void SynchronousCompositorImpl::DidInitializeRendererObjects( |
- SynchronousCompositorOutputSurface* output_surface, |
- SynchronousCompositorExternalBeginFrameSource* begin_frame_source, |
- ui::SynchronousInputHandlerProxy* synchronous_input_handler_proxy) { |
- DCHECK(!output_surface_); |
- DCHECK(!begin_frame_source_); |
- DCHECK(output_surface); |
- DCHECK(begin_frame_source); |
- DCHECK(synchronous_input_handler_proxy); |
- |
- output_surface_ = output_surface; |
- begin_frame_source_ = begin_frame_source; |
- synchronous_input_handler_proxy_ = synchronous_input_handler_proxy; |
- |
- output_surface_->SetSyncClient(this); |
- begin_frame_source_->SetClient(this); |
- begin_frame_source_->SetBeginFrameSourcePaused(!is_active_); |
-} |
- |
-void SynchronousCompositorImpl::DidDestroyRendererObjects() { |
- DCHECK(output_surface_); |
- DCHECK(begin_frame_source_); |
- |
- if (registered_with_client_) { |
- output_surface_->SetTreeActivationCallback(base::Closure()); |
- compositor_client_->DidDestroyCompositor(this); |
- registered_with_client_ = false; |
- } |
- |
- // This object is being destroyed, so remove pointers to it. |
- begin_frame_source_->SetClient(nullptr); |
- output_surface_->SetSyncClient(nullptr); |
- synchronous_input_handler_proxy_->SetOnlySynchronouslyAnimateRootFlings( |
- nullptr); |
- |
- synchronous_input_handler_proxy_ = nullptr; |
- begin_frame_source_ = nullptr; |
- output_surface_ = nullptr; |
- // Don't propogate this signal from one renderer to the next. |
- need_animate_input_ = false; |
-} |
- |
-SynchronousCompositor::Frame SynchronousCompositorImpl::DemandDrawHw( |
- const gfx::Size& surface_size, |
- const gfx::Transform& transform, |
- const gfx::Rect& viewport, |
- const gfx::Rect& clip, |
- const gfx::Rect& viewport_rect_for_tile_priority, |
- const gfx::Transform& transform_for_tile_priority) { |
- DCHECK(CalledOnValidThread()); |
- DCHECK(output_surface_); |
- DCHECK(begin_frame_source_); |
- DCHECK(!frame_holder_.frame); |
- |
- output_surface_->DemandDrawHw(surface_size, transform, viewport, clip, |
- viewport_rect_for_tile_priority, |
- transform_for_tile_priority); |
- |
- if (frame_holder_.frame) |
- UpdateFrameMetaData(frame_holder_.frame->metadata); |
- |
- return std::move(frame_holder_); |
-} |
- |
-void SynchronousCompositorImpl::ReturnResources( |
- uint32_t output_surface_id, |
- const cc::CompositorFrameAck& frame_ack) { |
- DCHECK(CalledOnValidThread()); |
- output_surface_->ReturnResources(output_surface_id, frame_ack); |
-} |
- |
-bool SynchronousCompositorImpl::DemandDrawSw(SkCanvas* canvas) { |
- DCHECK(CalledOnValidThread()); |
- DCHECK(output_surface_); |
- DCHECK(begin_frame_source_); |
- DCHECK(!frame_holder_.frame); |
- |
- output_surface_->DemandDrawSw(canvas); |
- |
- bool success = !!frame_holder_.frame; |
- if (frame_holder_.frame) { |
- UpdateFrameMetaData(frame_holder_.frame->metadata); |
- frame_holder_.frame.reset(); |
- } |
- |
- return success; |
-} |
- |
-void SynchronousCompositorImpl::SwapBuffers(uint32_t output_surface_id, |
- cc::CompositorFrame* frame) { |
- DCHECK(!frame_holder_.frame); |
- frame_holder_.output_surface_id = output_surface_id; |
- frame_holder_.frame.reset(new cc::CompositorFrame); |
- frame->AssignTo(frame_holder_.frame.get()); |
-} |
- |
-void SynchronousCompositorImpl::UpdateFrameMetaData( |
- const cc::CompositorFrameMetadata& frame_metadata) { |
- rwhva_->SynchronousFrameMetadata(frame_metadata); |
- DeliverMessages(); |
-} |
- |
-void SynchronousCompositorImpl::SetMemoryPolicy(size_t bytes_limit) { |
- DCHECK(CalledOnValidThread()); |
- DCHECK(output_surface_); |
- output_surface_->SetMemoryPolicy(bytes_limit); |
-} |
- |
-void SynchronousCompositorImpl::Invalidate() { |
- DCHECK(CalledOnValidThread()); |
- if (registered_with_client_) |
- compositor_client_->PostInvalidate(); |
-} |
- |
-void SynchronousCompositorImpl::DidChangeRootLayerScrollOffset( |
- const gfx::ScrollOffset& root_offset) { |
- DCHECK(CalledOnValidThread()); |
- if (!synchronous_input_handler_proxy_) |
- return; |
- synchronous_input_handler_proxy_->SynchronouslySetRootScrollOffset( |
- root_offset); |
-} |
- |
-void SynchronousCompositorImpl::SynchronouslyZoomBy(float zoom_delta, |
- const gfx::Point& anchor) { |
- DCHECK(CalledOnValidThread()); |
- if (!synchronous_input_handler_proxy_) |
- return; |
- synchronous_input_handler_proxy_->SynchronouslyZoomBy(zoom_delta, anchor); |
-} |
- |
-void SynchronousCompositorImpl::SetIsActive(bool is_active) { |
- TRACE_EVENT1("cc", "SynchronousCompositorImpl::SetIsActive", "is_active", |
- is_active); |
- if (is_active_ == is_active) |
- return; |
- |
- is_active_ = is_active; |
- UpdateNeedsBeginFrames(); |
- if (begin_frame_source_) |
- begin_frame_source_->SetBeginFrameSourcePaused(!is_active_); |
-} |
- |
-void SynchronousCompositorImpl::OnComputeScroll( |
- base::TimeTicks animation_time) { |
- if (need_animate_input_) { |
- need_animate_input_ = false; |
- synchronous_input_handler_proxy_->SynchronouslyAnimate(animation_time); |
- } |
-} |
- |
-void SynchronousCompositorImpl::OnNeedsBeginFramesChange( |
- bool needs_begin_frames) { |
- renderer_needs_begin_frames_ = needs_begin_frames; |
- UpdateNeedsBeginFrames(); |
-} |
- |
-void SynchronousCompositorImpl::BeginFrame(const cc::BeginFrameArgs& args) { |
- if (!registered_with_client_ && is_active_ && renderer_needs_begin_frames_) { |
- // Make sure this is a BeginFrame that renderer side explicitly requested. |
- // Otherwise it is possible renderer objects not initialized. |
- RegisterWithClient(); |
- DCHECK(registered_with_client_); |
- } |
- if (begin_frame_source_) |
- begin_frame_source_->BeginFrame(args); |
-} |
- |
-void SynchronousCompositorImpl::UpdateNeedsBeginFrames() { |
- rwhva_->OnSetNeedsBeginFrames(is_active_ && renderer_needs_begin_frames_); |
-} |
- |
-void SynchronousCompositorImpl::DidOverscrollInProcess( |
- const DidOverscrollParams& params) { |
- if (registered_with_client_) { |
- compositor_client_->DidOverscroll(params.accumulated_overscroll, |
- params.latest_overscroll_delta, |
- params.current_fling_velocity); |
- } |
-} |
- |
-void SynchronousCompositorImpl::DidStopFlinging() { |
- // It's important that the fling-end notification follow the same path as it |
- // takes on other platforms (using an IPC). This ensures consistent |
- // bookkeeping at all stages of the input pipeline. |
- rwhva_->GetRenderWidgetHost()->GetProcess()->OnMessageReceived( |
- InputHostMsg_DidStopFlinging(routing_id_)); |
-} |
- |
-InputEventAckState SynchronousCompositorImpl::HandleInputEvent( |
- const blink::WebInputEvent& input_event) { |
- DCHECK(CalledOnValidThread()); |
- return g_factory.Get().synchronous_input_event_filter()->HandleInputEvent( |
- routing_id_, input_event); |
-} |
- |
-void SynchronousCompositorImpl::DidOverscroll( |
- const DidOverscrollParams& params) { |
- // SynchronousCompositorImpl uses synchronous DidOverscrollInProcess for |
- // overscroll instead of this async path. |
- NOTREACHED(); |
-} |
- |
-bool SynchronousCompositorImpl::OnMessageReceived(const IPC::Message& message) { |
- NOTREACHED(); |
- return false; |
-} |
- |
-void SynchronousCompositorImpl::DidBecomeCurrent() { |
- // This is single process synchronous compositor. There is only one |
- // RenderViewHost. DidBecomeCurrent could be called before the renderer |
- // objects are initialized. So hold off calling DidBecomeCurrent until |
- // RegisterWithClient. Intentional no-op here. |
-} |
- |
-void SynchronousCompositorImpl::DeliverMessages() { |
- std::vector<std::unique_ptr<IPC::Message>> messages; |
- output_surface_->GetMessagesToDeliver(&messages); |
- RenderProcessHost* rph = rwhva_->GetRenderWidgetHost()->GetProcess(); |
- for (const auto& msg : messages) { |
- rph->OnMessageReceived(*msg); |
- } |
-} |
- |
-void SynchronousCompositorImpl::DidActivatePendingTree() { |
- if (registered_with_client_) |
- compositor_client_->DidUpdateContent(); |
- DeliverMessages(); |
-} |
- |
-void SynchronousCompositorImpl::SetNeedsSynchronousAnimateInput() { |
- DCHECK(CalledOnValidThread()); |
- if (!registered_with_client_) |
- return; |
- need_animate_input_ = true; |
- compositor_client_->PostInvalidate(); |
-} |
- |
-void SynchronousCompositorImpl::UpdateRootLayerState( |
- const gfx::ScrollOffset& total_scroll_offset, |
- const gfx::ScrollOffset& max_scroll_offset, |
- const gfx::SizeF& scrollable_size, |
- float page_scale_factor, |
- float min_page_scale_factor, |
- float max_page_scale_factor) { |
- DCHECK(CalledOnValidThread()); |
- |
- if (registered_with_client_) { |
- // TODO(miletus): Pass in ScrollOffset. crbug.com/414283. |
- compositor_client_->UpdateRootLayerState( |
- gfx::ScrollOffsetToVector2dF(total_scroll_offset), |
- gfx::ScrollOffsetToVector2dF(max_scroll_offset), |
- scrollable_size, |
- page_scale_factor, |
- min_page_scale_factor, |
- max_page_scale_factor); |
- } |
-} |
- |
-// Not using base::NonThreadSafe as we want to enforce a more exacting threading |
-// requirement: SynchronousCompositorImpl() must only be used on the UI thread. |
-bool SynchronousCompositorImpl::CalledOnValidThread() const { |
- return BrowserThread::CurrentlyOn(BrowserThread::UI); |
-} |
- |
-} // namespace content |