diff options
author | jbauman <jbauman@chromium.org> | 2015-06-03 16:38:59 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-06-03 23:39:41 +0000 |
commit | dfb4996ac036faf3318090eef1bf48d02cd4fe07 (patch) | |
tree | f737ee88f3d5ee7f33f86e3814cdfa767aad67a1 /content/browser | |
parent | 0b08cdaeab9210611012014b9ba7ac93d7efb5c7 (diff) | |
download | chromium_src-dfb4996ac036faf3318090eef1bf48d02cd4fe07.zip chromium_src-dfb4996ac036faf3318090eef1bf48d02cd4fe07.tar.gz chromium_src-dfb4996ac036faf3318090eef1bf48d02cd4fe07.tar.bz2 |
Support out-of-process iframes with Surfaces on Android.
Create a surface_utils.h to abstract out the details of getting a SurfaceManager and SurfaceIdAllocator on android vs. other chrome.
Review URL: https://codereview.chromium.org/1148003006
Cr-Commit-Position: refs/heads/master@{#332725}
Diffstat (limited to 'content/browser')
8 files changed, 92 insertions, 25 deletions
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn index 59c64c5..71083b9 100644 --- a/content/browser/BUILD.gn +++ b/content/browser/BUILD.gn @@ -438,6 +438,13 @@ source_set("browser") { deps += [ "//ui/compositor" ] } + if (!is_ios) { + sources += [ + "compositor/surface_utils.cc", + "compositor/surface_utils.h", + ] + } + if (enable_web_speech) { deps += [ "//third_party/flac", diff --git a/content/browser/compositor/surface_utils.cc b/content/browser/compositor/surface_utils.cc new file mode 100644 index 0000000..78f63a0 --- /dev/null +++ b/content/browser/compositor/surface_utils.cc @@ -0,0 +1,36 @@ +// Copyright 2015 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/compositor/surface_utils.h" + +#include "cc/surfaces/surface_id_allocator.h" + +#if defined(OS_ANDROID) +#include "content/browser/renderer_host/compositor_impl_android.h" +#else +#include "content/browser/compositor/image_transport_factory.h" +#include "ui/compositor/compositor.h" +#endif + +namespace content { + +scoped_ptr<cc::SurfaceIdAllocator> CreateSurfaceIdAllocator() { +#if defined(OS_ANDROID) + return CompositorImpl::CreateSurfaceIdAllocator(); +#else + ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); + return factory->GetContextFactory()->CreateSurfaceIdAllocator(); +#endif +} + +cc::SurfaceManager* GetSurfaceManager() { +#if defined(OS_ANDROID) + return CompositorImpl::GetSurfaceManager(); +#else + ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); + return factory->GetSurfaceManager(); +#endif +} + +} // namespace content diff --git a/content/browser/compositor/surface_utils.h b/content/browser/compositor/surface_utils.h new file mode 100644 index 0000000..b56fef2 --- /dev/null +++ b/content/browser/compositor/surface_utils.h @@ -0,0 +1,23 @@ +// Copyright 2015 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. + +#ifndef CONTENT_BROWSER_COMPOSITOR_SURFACE_UTILS_H_ +#define CONTENT_BROWSER_COMPOSITOR_SURFACE_UTILS_H_ + +#include "base/memory/scoped_ptr.h" + +namespace cc { +class SurfaceIdAllocator; +class SurfaceManager; +} // namespace cc + +namespace content { + +scoped_ptr<cc::SurfaceIdAllocator> CreateSurfaceIdAllocator(); + +cc::SurfaceManager* GetSurfaceManager(); + +} // namespace content + +#endif // CONTENT_BROWSER_COMPOSITOR_SURFACE_UTILS_H_ diff --git a/content/browser/frame_host/cross_process_frame_connector.cc b/content/browser/frame_host/cross_process_frame_connector.cc index b116792..dbc4128 100644 --- a/content/browser/frame_host/cross_process_frame_connector.cc +++ b/content/browser/frame_host/cross_process_frame_connector.cc @@ -6,6 +6,7 @@ #include "cc/surfaces/surface.h" #include "cc/surfaces/surface_manager.h" +#include "content/browser/compositor/surface_utils.h" #include "content/browser/frame_host/render_frame_proxy_host.h" #include "content/browser/frame_host/render_widget_host_view_child_frame.h" #include "content/browser/renderer_host/render_view_host_impl.h" @@ -94,28 +95,22 @@ void CrossProcessFrameConnector::SetChildFrameSurface( void CrossProcessFrameConnector::OnSatisfySequence( const cc::SurfaceSequence& sequence) { -#if !defined(OS_ANDROID) std::vector<uint32_t> sequences; sequences.push_back(sequence.sequence); - cc::SurfaceManager* manager = - ImageTransportFactory::GetInstance()->GetSurfaceManager(); + cc::SurfaceManager* manager = GetSurfaceManager(); manager->DidSatisfySequences(sequence.id_namespace, &sequences); -#endif } void CrossProcessFrameConnector::OnRequireSequence( const cc::SurfaceId& id, const cc::SurfaceSequence& sequence) { -#if !defined(OS_ANDROID) - cc::SurfaceManager* manager = - ImageTransportFactory::GetInstance()->GetSurfaceManager(); + cc::SurfaceManager* manager = GetSurfaceManager(); cc::Surface* surface = manager->GetSurfaceForId(id); if (!surface) { LOG(ERROR) << "Attempting to require callback on nonexistent surface"; return; } surface->AddDestructionDependency(sequence); -#endif } void CrossProcessFrameConnector::OnCompositorFrameSwappedACK( diff --git a/content/browser/frame_host/render_widget_host_view_child_frame.cc b/content/browser/frame_host/render_widget_host_view_child_frame.cc index e4ced72..5b17009 100644 --- a/content/browser/frame_host/render_widget_host_view_child_frame.cc +++ b/content/browser/frame_host/render_widget_host_view_child_frame.cc @@ -9,6 +9,7 @@ #include "cc/surfaces/surface_manager.h" #include "cc/surfaces/surface_sequence.h" #include "content/browser/accessibility/browser_accessibility_manager.h" +#include "content/browser/compositor/surface_utils.h" #include "content/browser/frame_host/cross_process_frame_connector.h" #include "content/browser/gpu/compositor_util.h" #include "content/browser/renderer_host/render_widget_host_impl.h" @@ -28,12 +29,8 @@ RenderWidgetHostViewChildFrame::RenderWidgetHostViewChildFrame( ack_pending_count_(0), frame_connector_(NULL), weak_factory_(this) { -#if !defined(OS_ANDROID) - if (use_surfaces_) { - ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); - id_allocator_ = factory->GetContextFactory()->CreateSurfaceIdAllocator(); - } -#endif // !defined(OS_ANDROID) + if (use_surfaces_) + id_allocator_ = CreateSurfaceIdAllocator(); host_->SetView(this); } @@ -238,7 +235,6 @@ void RenderWidgetHostViewChildFrame::OnSwapCompositorFrame( return; } -#if !defined(OS_ANDROID) cc::RenderPass* root_pass = frame->delegated_frame_data->render_pass_list.back(); @@ -263,8 +259,7 @@ void RenderWidgetHostViewChildFrame::OnSwapCompositorFrame( } if (!surface_factory_) { - ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); - cc::SurfaceManager* manager = factory->GetSurfaceManager(); + cc::SurfaceManager* manager = GetSurfaceManager(); surface_factory_ = make_scoped_ptr(new cc::SurfaceFactory(manager, this)); } @@ -272,14 +267,12 @@ void RenderWidgetHostViewChildFrame::OnSwapCompositorFrame( surface_id_ = id_allocator_->GenerateId(); surface_factory_->Create(surface_id_); - ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); cc::SurfaceSequence sequence = cc::SurfaceSequence( id_allocator_->id_namespace(), next_surface_sequence_++); // The renderer process will satisfy this dependency when it creates a // SurfaceLayer. - factory->GetSurfaceManager() - ->GetSurfaceForId(surface_id_) - ->AddDestructionDependency(sequence); + cc::SurfaceManager* manager = GetSurfaceManager(); + manager->GetSurfaceForId(surface_id_)->AddDestructionDependency(sequence); frame_connector_->SetChildFrameSurface(surface_id_, frame_size, scale_factor, sequence); } @@ -291,7 +284,6 @@ void RenderWidgetHostViewChildFrame::OnSwapCompositorFrame( // If this value grows very large, something is going wrong. DCHECK(ack_pending_count_ < 1000); surface_factory_->SubmitFrame(surface_id_, frame.Pass(), ack_callback); -#endif // !defined(OS_ANDROID) } void RenderWidgetHostViewChildFrame::GetScreenInfo( diff --git a/content/browser/renderer_host/compositor_impl_android.cc b/content/browser/renderer_host/compositor_impl_android.cc index efc04f2..ce153f5 100644 --- a/content/browser/renderer_host/compositor_impl_android.cc +++ b/content/browser/renderer_host/compositor_impl_android.cc @@ -210,14 +210,20 @@ cc::SurfaceManager* CompositorImpl::GetSurfaceManager() { // static scoped_ptr<cc::SurfaceIdAllocator> CompositorImpl::CreateSurfaceIdAllocator() { - return make_scoped_ptr(new cc::SurfaceIdAllocator(++g_surface_id_namespace)); + scoped_ptr<cc::SurfaceIdAllocator> allocator( + new cc::SurfaceIdAllocator(++g_surface_id_namespace)); + cc::SurfaceManager* manager = GetSurfaceManager(); + DCHECK(manager); + allocator->RegisterSurfaceIdNamespace(manager); + return allocator.Pass(); } CompositorImpl::CompositorImpl(CompositorClient* client, gfx::NativeWindow root_window) : root_layer_(cc::Layer::Create(Compositor::LayerSettings())), resource_manager_(&ui_resource_provider_), - surface_id_allocator_(CreateSurfaceIdAllocator()), + surface_id_allocator_(GetSurfaceManager() ? CreateSurfaceIdAllocator() + : nullptr), has_transparent_background_(false), device_scale_factor_(1), window_(NULL), 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 7b1b23b..59f2b32 100644 --- a/content/browser/renderer_host/render_widget_host_view_android.cc +++ b/content/browser/renderer_host/render_widget_host_view_android.cc @@ -343,6 +343,8 @@ 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); } @@ -1037,7 +1039,6 @@ void RenderWidgetHostViewAndroid::SubmitFrame( cc::SurfaceManager* manager = CompositorImpl::GetSurfaceManager(); if (manager) { if (!surface_factory_) { - id_allocator_ = CompositorImpl::CreateSurfaceIdAllocator(); surface_factory_ = make_scoped_ptr(new cc::SurfaceFactory(manager, this)); } if (surface_id_.is_null() || @@ -1759,6 +1760,12 @@ void RenderWidgetHostViewAndroid::DidStopFlinging() { content_view_core_->DidStopFlinging(); } +uint32_t RenderWidgetHostViewAndroid::GetSurfaceIdNamespace() { + if (id_allocator_) + return id_allocator_->id_namespace(); + return 0; +} + void RenderWidgetHostViewAndroid::SetContentViewCore( ContentViewCoreImpl* content_view_core) { RemoveLayers(); diff --git a/content/browser/renderer_host/render_widget_host_view_android.h b/content/browser/renderer_host/render_widget_host_view_android.h index fc8decb..f1ac987 100644 --- a/content/browser/renderer_host/render_widget_host_view_android.h +++ b/content/browser/renderer_host/render_widget_host_view_android.h @@ -154,6 +154,7 @@ class CONTENT_EXPORT RenderWidgetHostViewAndroid scoped_ptr<cc::CompositorFrame> frame) override; void DidOverscroll(const DidOverscrollParams& params) override; void DidStopFlinging() override; + uint32_t GetSurfaceIdNamespace() override; void ShowDisambiguationPopup(const gfx::Rect& rect_pixels, const SkBitmap& zoomed_bitmap) override; scoped_ptr<SyntheticGestureTarget> CreateSyntheticGestureTarget() override; |