Chromium Code Reviews| Index: content/browser/renderer_host/render_widget_host_view_android.cc |
| diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc |
| index efe0d820a15ad79b7389aafb41649ac4f1cdd445..0b420a11185a908f0956bbeb7f6b05151b8d4672 100644 |
| --- a/content/browser/renderer_host/render_widget_host_view_android.cc |
| +++ b/content/browser/renderer_host/render_widget_host_view_android.cc |
| @@ -30,10 +30,8 @@ |
| #include "cc/output/copy_output_result.h" |
| #include "cc/output/latency_info_swap_promise.h" |
| #include "cc/resources/single_release_callback.h" |
| -#include "cc/surfaces/surface.h" |
| #include "cc/surfaces/surface_factory.h" |
| #include "cc/surfaces/surface_id_allocator.h" |
| -#include "cc/surfaces/surface_manager.h" |
| #include "cc/trees/layer_tree_host.h" |
| #include "components/display_compositor/gl_helper.h" |
| #include "content/browser/accessibility/browser_accessibility_manager_android.h" |
| @@ -95,24 +93,6 @@ namespace content { |
| namespace { |
| -void SatisfyCallback(cc::SurfaceManager* manager, |
| - const cc::SurfaceSequence& sequence) { |
| - std::vector<uint32_t> sequences; |
| - sequences.push_back(sequence.sequence); |
| - manager->DidSatisfySequences(sequence.id_namespace, &sequences); |
| -} |
| - |
| -void RequireCallback(cc::SurfaceManager* manager, |
| - const cc::SurfaceId& id, |
| - const cc::SurfaceSequence& sequence) { |
| - cc::Surface* surface = manager->GetSurfaceForId(id); |
| - if (!surface) { |
| - LOG(ERROR) << "Attempting to require callback on nonexistent surface"; |
| - return; |
| - } |
| - surface->AddDestructionDependency(sequence); |
| -} |
| - |
| const int kUndefinedOutputSurfaceId = -1; |
| static const char kAsyncReadBackString[] = "Compositing.CopyFromSurfaceTime"; |
| @@ -284,24 +264,6 @@ gfx::RectF GetSelectionRect(const ui::TouchSelectionController& controller) { |
| return rect; |
| } |
| -scoped_refptr<cc::SurfaceLayer> CreateSurfaceLayer( |
| - const cc::SurfaceId& surface_id, |
| - const gfx::Size& size) { |
| - DCHECK(!surface_id.is_null()); |
| - cc::SurfaceManager* manager = CompositorImpl::GetSurfaceManager(); |
| - DCHECK(manager); |
| - // manager must outlive compositors using it. |
| - scoped_refptr<cc::SurfaceLayer> surface_layer = cc::SurfaceLayer::Create( |
| - base::Bind(&SatisfyCallback, base::Unretained(manager)), |
| - base::Bind(&RequireCallback, base::Unretained(manager))); |
| - surface_layer->SetSurfaceId(surface_id, 1.f, size); |
| - surface_layer->SetBounds(size); |
| - surface_layer->SetIsDrawable(true); |
| - surface_layer->SetContentsOpaque(true); |
| - |
| - return surface_layer; |
| -} |
| - |
| } // anonymous namespace |
| RenderWidgetHostViewAndroid::LastFrameInfo::LastFrameInfo( |
| @@ -343,8 +305,6 @@ RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( |
| locks_on_frame_count_(0), |
| observing_root_window_(false), |
| weak_ptr_factory_(this) { |
| - if (CompositorImpl::GetSurfaceManager()) |
| - id_allocator_ = CompositorImpl::CreateSurfaceIdAllocator(); |
| host_->SetView(this); |
| SetContentViewCore(content_view_core); |
| } |
| @@ -354,8 +314,7 @@ RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() { |
| content_view_core_->RemoveObserver(this); |
| SetContentViewCore(NULL); |
| DCHECK(ack_callbacks_.empty()); |
| - DCHECK(!surface_factory_); |
| - DCHECK(surface_id_.is_null()); |
| + DCHECK(!delegated_frame_host_); |
| } |
| void RenderWidgetHostViewAndroid::Blur() { |
| @@ -804,12 +763,7 @@ void RenderWidgetHostViewAndroid::Destroy() { |
| RemoveLayers(); |
| SetContentViewCore(NULL); |
| - if (!surface_id_.is_null()) { |
| - DCHECK(surface_factory_.get()); |
| - surface_factory_->Destroy(surface_id_); |
| - surface_id_ = cc::SurfaceId(); |
| - } |
| - surface_factory_.reset(); |
| + delegated_frame_host_.reset(); |
| // The RenderWidgetHost's destruction led here, so don't call it. |
| host_ = NULL; |
| @@ -895,7 +849,7 @@ void RenderWidgetHostViewAndroid::CopyFromCompositingSurface( |
| ui::WindowAndroidCompositor* compositor = |
| content_view_core_->GetWindowAndroid()->GetCompositor(); |
| DCHECK(compositor); |
| - DCHECK(!surface_id_.is_null()); |
| + DCHECK(delegated_frame_host_->HasDelegatedContent()); |
| std::unique_ptr<cc::CopyOutputRequest> request = |
| cc::CopyOutputRequest::CreateRequest(base::Bind( |
| &PrepareTextureCopyOutputResult, weak_ptr_factory_.GetWeakPtr(), |
| @@ -955,7 +909,7 @@ void RenderWidgetHostViewAndroid::SendReturnedDelegatedResources( |
| output_surface_id, ack)); |
| } |
| -void RenderWidgetHostViewAndroid::ReturnResources( |
| +void RenderWidgetHostViewAndroid::ReturnCompositorFrameResources( |
| const cc::ReturnedResourceArray& resources) { |
| if (resources.empty()) |
| return; |
| @@ -965,65 +919,27 @@ void RenderWidgetHostViewAndroid::ReturnResources( |
| SendReturnedDelegatedResources(last_output_surface_id_); |
| } |
| -void RenderWidgetHostViewAndroid::SetBeginFrameSource( |
| - cc::BeginFrameSource* begin_frame_source) { |
| - // TODO(tansell): Hook this up. |
| -} |
| - |
| void RenderWidgetHostViewAndroid::DestroyDelegatedContent() { |
| - RemoveLayers(); |
| - if (!surface_id_.is_null()) { |
| - DCHECK(surface_factory_.get()); |
| - surface_factory_->Destroy(surface_id_); |
| - surface_id_ = cc::SurfaceId(); |
| - } |
| - layer_ = NULL; |
| + if (!delegated_frame_host_) |
| + return; |
| + |
| + delegated_frame_host_->DestroyDelegatedContent(); |
| } |
| void RenderWidgetHostViewAndroid::CheckOutputSurfaceChanged( |
| uint32_t output_surface_id) { |
| if (output_surface_id == last_output_surface_id_) |
| return; |
| - DestroyDelegatedContent(); |
| - surface_factory_.reset(); |
| + |
| + delegated_frame_host_.reset(); |
| if (!surface_returned_resources_.empty()) |
| SendReturnedDelegatedResources(last_output_surface_id_); |
| - last_output_surface_id_ = output_surface_id; |
| -} |
| - |
| -void RenderWidgetHostViewAndroid::SubmitCompositorFrame( |
| - cc::CompositorFrame frame) { |
| - cc::SurfaceManager* manager = CompositorImpl::GetSurfaceManager(); |
| - if (!surface_factory_) { |
| - surface_factory_ = base::WrapUnique(new cc::SurfaceFactory(manager, this)); |
| - } |
| - if (surface_id_.is_null() || |
| - texture_size_in_layer_ != current_surface_size_ || |
| - location_bar_content_translation_ != |
| - frame.metadata.location_bar_content_translation || |
| - current_viewport_selection_ != frame.metadata.selection) { |
| - RemoveLayers(); |
| - if (!surface_id_.is_null()) |
| - surface_factory_->Destroy(surface_id_); |
| - surface_id_ = id_allocator_->GenerateId(); |
| - surface_factory_->Create(surface_id_); |
| - layer_ = CreateSurfaceLayer(surface_id_, texture_size_in_layer_); |
| - |
| - DCHECK(layer_); |
| - |
| - current_surface_size_ = texture_size_in_layer_; |
| - location_bar_content_translation_ = |
| - frame.metadata.location_bar_content_translation; |
| - current_viewport_selection_ = frame.metadata.selection; |
| - AttachLayers(); |
| - } |
| + delegated_frame_host_.reset(new DelegatedFrameHostAndroid( |
| + CompositorImpl::GetSurfaceManager(), |
| + CompositorImpl::CreateSurfaceIdAllocator(), this)); |
| - cc::SurfaceFactory::DrawCallback ack_callback = |
| - base::Bind(&RenderWidgetHostViewAndroid::RunAckCallbacks, |
| - weak_ptr_factory_.GetWeakPtr()); |
| - surface_factory_->SubmitCompositorFrame(surface_id_, std::move(frame), |
| - ack_callback); |
| + last_output_surface_id_ = output_surface_id; |
| } |
| void RenderWidgetHostViewAndroid::InternalSwapCompositorFrame( |
| @@ -1048,6 +964,8 @@ void RenderWidgetHostViewAndroid::InternalSwapCompositorFrame( |
| cc::CompositorFrameMetadata metadata = frame.metadata.Clone(); |
| CheckOutputSurfaceChanged(output_surface_id); |
| + DCHECK(delegated_frame_host_); |
| + |
| bool has_content = !texture_size_in_layer_.IsEmpty(); |
| base::Closure ack_callback = |
| @@ -1060,7 +978,12 @@ void RenderWidgetHostViewAndroid::InternalSwapCompositorFrame( |
| if (!has_content) { |
| DestroyDelegatedContent(); |
| } else { |
| - SubmitCompositorFrame(std::move(frame)); |
| + delegated_frame_host_->SubmitCompositorFrame( |
| + std::move(frame), |
| + base::Bind(&RenderWidgetHostViewAndroid::RunAckCallbacks, |
| + weak_ptr_factory_.GetWeakPtr())); |
| + DCHECK(layer_); |
| + |
| layer_->SetIsDrawable(true); |
| layer_->SetContentsOpaque(true); |
| layer_->SetBounds(texture_size_in_layer_); |
| @@ -1194,6 +1117,17 @@ RenderWidgetHostViewAndroid::CreateDrawable() { |
| content_view_core_->GetContext().obj())); |
| } |
| +void RenderWidgetHostViewAndroid::AttachSurfaceLayer( |
|
Khushal
2016/07/12 02:02:25
I was looking at removing the Attach and Detach Su
|
| + scoped_refptr<cc::SurfaceLayer> layer) { |
| + layer_ = std::move(layer); |
| + AttachLayers(); |
| +} |
| + |
| +void RenderWidgetHostViewAndroid::DetachSurfaceLayer() { |
| + RemoveLayers(); |
| + layer_ = nullptr; |
| +} |
| + |
| void RenderWidgetHostViewAndroid::SynchronousCopyContents( |
| const gfx::Rect& src_subrect_in_pixel, |
| const gfx::Size& dst_size_in_pixel, |
| @@ -1455,8 +1389,7 @@ void RenderWidgetHostViewAndroid::RequestDisallowInterceptTouchEvent() { |
| void RenderWidgetHostViewAndroid::EvictDelegatedFrame() { |
| DCHECK_EQ(locks_on_frame_count_, 0u); |
| frame_evictor_->DiscardedFrame(); |
| - if (layer_.get()) |
| - DestroyDelegatedContent(); |
| + DestroyDelegatedContent(); |
| } |
| bool RenderWidgetHostViewAndroid::HasAcceleratedSurface( |
| @@ -1679,9 +1612,10 @@ void RenderWidgetHostViewAndroid::DidStopFlinging() { |
| } |
| uint32_t RenderWidgetHostViewAndroid::GetSurfaceIdNamespace() { |
| - if (id_allocator_) |
| - return id_allocator_->id_namespace(); |
| - return 0; |
| + if (!delegated_frame_host_) |
| + return 0; |
| + |
| + return delegated_frame_host_->GetSurfaceIdNamespace(); |
| } |
| void RenderWidgetHostViewAndroid::SetContentViewCore( |
| @@ -1859,8 +1793,7 @@ void RenderWidgetHostViewAndroid::OnActivityStarted() { |
| void RenderWidgetHostViewAndroid::OnLostResources() { |
| ReleaseLocksOnSurface(); |
| - if (layer_.get()) |
| - DestroyDelegatedContent(); |
| + DestroyDelegatedContent(); |
| DCHECK(ack_callbacks_.empty()); |
| } |