diff options
author | kenrb <kenrb@chromium.org> | 2015-05-14 08:05:05 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-05-14 15:06:17 +0000 |
commit | b4e2a3bbaabf98abf089396e7ce375b58fa8dfcd (patch) | |
tree | be62ebc4e771d4554735527d36b914dc84d38e08 | |
parent | 14defc6866693aa3dfceed796cd94d788e9f3122 (diff) | |
download | chromium_src-b4e2a3bbaabf98abf089396e7ce375b58fa8dfcd.zip chromium_src-b4e2a3bbaabf98abf089396e7ce375b58fa8dfcd.tar.gz chromium_src-b4e2a3bbaabf98abf089396e7ce375b58fa8dfcd.tar.bz2 |
Pass Surface ID namespace to renderer compositors.
In order to enable renderer processes to create SurfaceSequences, they
have to receive Surface ID namespaces from the browser process so that
they can avoid collisions.
BUG=478802
Committed: https://crrev.com/c7a5afd66499fc8442e1b3146f55b227638934d8
Cr-Commit-Position: refs/heads/master@{#329708}
Review URL: https://codereview.chromium.org/1129883003
Cr-Commit-Position: refs/heads/master@{#329852}
18 files changed, 98 insertions, 4 deletions
diff --git a/content/browser/compositor/delegated_frame_host.cc b/content/browser/compositor/delegated_frame_host.cc index 9c653bd..2faa1a7 100644 --- a/content/browser/compositor/delegated_frame_host.cc +++ b/content/browser/compositor/delegated_frame_host.cc @@ -65,7 +65,9 @@ DelegatedFrameHost::DelegatedFrameHost(DelegatedFrameHostClient* client) current_scale_factor_(1.f), can_lock_compositor_(YES_CAN_LOCK), delegated_frame_evictor_(new DelegatedFrameEvictor(this)) { - ImageTransportFactory::GetInstance()->AddObserver(this); + ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); + factory->AddObserver(this); + id_allocator_ = factory->GetContextFactory()->CreateSurfaceIdAllocator(); } void DelegatedFrameHost::WasShown(const ui::LatencyInfo& latency_info) { @@ -193,6 +195,13 @@ void DelegatedFrameHost::EndFrameSubscription() { frame_subscriber_.reset(); } +uint32_t DelegatedFrameHost::GetSurfaceIdNamespace() { + if (!use_surfaces_) + return 0; + + return id_allocator_->id_namespace(); +} + bool DelegatedFrameHost::ShouldSkipFrame(gfx::Size size_in_dip) const { // Should skip a frame only when another frame from the renderer is guaranteed // to replace it. Otherwise may cause hangs when the renderer is waiting for @@ -363,8 +372,6 @@ void DelegatedFrameHost::SwapDelegatedFrame( ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); cc::SurfaceManager* manager = factory->GetSurfaceManager(); if (!surface_factory_) { - id_allocator_ = - factory->GetContextFactory()->CreateSurfaceIdAllocator(); surface_factory_ = make_scoped_ptr(new cc::SurfaceFactory(manager, this)); } diff --git a/content/browser/compositor/delegated_frame_host.h b/content/browser/compositor/delegated_frame_host.h index 8fac67f..abb9b08 100644 --- a/content/browser/compositor/delegated_frame_host.h +++ b/content/browser/compositor/delegated_frame_host.h @@ -143,6 +143,7 @@ class CONTENT_EXPORT DelegatedFrameHost scoped_ptr<RenderWidgetHostViewFrameSubscriber> subscriber); void EndFrameSubscription(); bool HasFrameSubscriber() const { return frame_subscriber_; } + uint32_t GetSurfaceIdNamespace(); // Exposed for tests. cc::DelegatedFrameProvider* FrameProviderForTesting() const { 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 c42a3f2..b8fdb01 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 @@ -222,6 +222,12 @@ bool RenderWidgetHostViewChildFrame::LockMouse() { void RenderWidgetHostViewChildFrame::UnlockMouse() { } +uint32_t RenderWidgetHostViewChildFrame::GetSurfaceIdNamespace() { + // TODO(kenrb): Create SurfaceFactory here when RWHVChildFrame + // gets compositor surface support. + return 0; +} + #if defined(OS_MACOSX) void RenderWidgetHostViewChildFrame::SetActive(bool active) { } diff --git a/content/browser/frame_host/render_widget_host_view_child_frame.h b/content/browser/frame_host/render_widget_host_view_child_frame.h index c91d3d9..6513033 100644 --- a/content/browser/frame_host/render_widget_host_view_child_frame.h +++ b/content/browser/frame_host/render_widget_host_view_child_frame.h @@ -101,6 +101,7 @@ class CONTENT_EXPORT RenderWidgetHostViewChildFrame #endif // defined(USE_AURA) bool LockMouse() override; void UnlockMouse() override; + uint32_t GetSurfaceIdNamespace() override; #if defined(OS_MACOSX) // RenderWidgetHostView implementation. diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc index b0ddbde..a6f7a45 100644 --- a/content/browser/renderer_host/render_view_host_impl.cc +++ b/content/browser/renderer_host/render_view_host_impl.cc @@ -336,6 +336,13 @@ bool RenderViewHostImpl::CreateRenderView( return false; SetInitialRenderSizeParams(params.initial_size); + // If the RWHV has not yet been set, the surface ID namespace will get + // passed down by the call to SetView(). + if (view_) { + Send(new ViewMsg_SetSurfaceIdNamespace(GetRoutingID(), + view_->GetSurfaceIdNamespace())); + } + // If it's enabled, tell the renderer to set up the Javascript bindings for // sending messages back to the browser. if (GetProcess()->IsIsolatedGuest()) diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc index 812a1d7..41245f2 100644 --- a/content/browser/renderer_host/render_widget_host_impl.cc +++ b/content/browser/renderer_host/render_widget_host_impl.cc @@ -321,6 +321,13 @@ void RenderWidgetHostImpl::SetView(RenderWidgetHostViewBase* view) { view_weak_.reset(); view_ = view; + // If the renderer has not yet been initialized, then the surface ID + // namespace will be sent during initialization. + if (view_ && renderer_initialized_) { + Send(new ViewMsg_SetSurfaceIdNamespace(routing_id_, + view_->GetSurfaceIdNamespace())); + } + GpuSurfaceTracker::Get()->SetSurfaceHandle( surface_id_, GetCompositingSurface()); @@ -415,6 +422,13 @@ void RenderWidgetHostImpl::Init() { Send(new ViewMsg_CreatingNew_ACK(routing_id_)); GetProcess()->ResumeRequestsForView(routing_id_); + // If the RWHV has not yet been set, the surface ID namespace will get + // passed down by the call to SetView(). + if (view_) { + Send(new ViewMsg_SetSurfaceIdNamespace(routing_id_, + view_->GetSurfaceIdNamespace())); + } + WasResized(); } diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc index 1457ae4..f7b2729 100644 --- a/content/browser/renderer_host/render_widget_host_view_aura.cc +++ b/content/browser/renderer_host/render_widget_host_view_aura.cc @@ -2779,6 +2779,10 @@ void RenderWidgetHostViewAura::OnDidNavigateMainFrameToNewPage() { ui::GestureRecognizer::Get()->CancelActiveTouches(window_); } +uint32_t RenderWidgetHostViewAura::GetSurfaceIdNamespace() { + return delegated_frame_host_->GetSurfaceIdNamespace(); +} + //////////////////////////////////////////////////////////////////////////////// // RenderWidgetHostViewBase, public: diff --git a/content/browser/renderer_host/render_widget_host_view_aura.h b/content/browser/renderer_host/render_widget_host_view_aura.h index d805751..462cf87 100644 --- a/content/browser/renderer_host/render_widget_host_view_aura.h +++ b/content/browser/renderer_host/render_widget_host_view_aura.h @@ -224,6 +224,7 @@ class CONTENT_EXPORT RenderWidgetHostViewAura scoped_ptr<cc::CompositorFrame> frame) override; void DidStopFlinging() override; void OnDidNavigateMainFrameToNewPage() override; + uint32_t GetSurfaceIdNamespace() override; #if defined(OS_WIN) void SetParentNativeViewAccessible( diff --git a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc index 69cc3ad..c4f8429 100644 --- a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc +++ b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc @@ -3453,4 +3453,22 @@ TEST_F(RenderWidgetHostViewAuraOverscrollTest, ScrollDeltasResetOnEnd) { EXPECT_EQ(0.f, overscroll_delta_y()); } +// Tests the RenderWidgetHostImpl sends the correct surface ID namespace to +// the renderer process. +TEST_F(RenderWidgetHostViewAuraTest, SurfaceIdNamespaceInitialized) { + gfx::Size size(5, 5); + + const IPC::Message* msg = + sink_->GetUniqueMessageMatching(ViewMsg_SetSurfaceIdNamespace::ID); + EXPECT_TRUE(msg); + ViewMsg_SetSurfaceIdNamespace::Param params; + ViewMsg_SetSurfaceIdNamespace::Read(msg, ¶ms); + view_->InitAsChild(NULL); + view_->Show(); + view_->SetSize(size); + view_->OnSwapCompositorFrame(0, + MakeDelegatedFrame(1.f, size, gfx::Rect(size))); + EXPECT_EQ(view_->GetSurfaceIdNamespace(), get<0>(params)); +} + } // namespace content diff --git a/content/browser/renderer_host/render_widget_host_view_base.cc b/content/browser/renderer_host/render_widget_host_view_base.cc index 034e029..83f29aa 100644 --- a/content/browser/renderer_host/render_widget_host_view_base.cc +++ b/content/browser/renderer_host/render_widget_host_view_base.cc @@ -695,4 +695,8 @@ RenderWidgetHostViewBase::GetOrientationTypeForDesktop( void RenderWidgetHostViewBase::OnDidNavigateMainFrameToNewPage() { } +uint32_t RenderWidgetHostViewBase::GetSurfaceIdNamespace() { + return 0; +} + } // namespace content diff --git a/content/browser/renderer_host/render_widget_host_view_base.h b/content/browser/renderer_host/render_widget_host_view_base.h index 643f494..ba64be7 100644 --- a/content/browser/renderer_host/render_widget_host_view_base.h +++ b/content/browser/renderer_host/render_widget_host_view_base.h @@ -177,6 +177,10 @@ class CONTENT_EXPORT RenderWidgetHostViewBase : public RenderWidgetHostView, virtual void DidStopFlinging() {} + // Returns the compositing surface ID namespace, or 0 if Surfaces are not + // enabled. + virtual uint32_t GetSurfaceIdNamespace(); + //---------------------------------------------------------------------------- // The following static methods are implemented by each platform. diff --git a/content/browser/renderer_host/render_widget_host_view_mac.h b/content/browser/renderer_host/render_widget_host_view_mac.h index 2b93d0d9..0c8ba4b 100644 --- a/content/browser/renderer_host/render_widget_host_view_mac.h +++ b/content/browser/renderer_host/render_widget_host_view_mac.h @@ -345,6 +345,8 @@ class CONTENT_EXPORT RenderWidgetHostViewMac void WheelEventAck(const blink::WebMouseWheelEvent& event, InputEventAckState ack_result) override; + uint32_t GetSurfaceIdNamespace() override; + // IPC::Sender implementation. bool Send(IPC::Message* message) override; @@ -438,7 +440,7 @@ class CONTENT_EXPORT RenderWidgetHostViewMac }; BrowserCompositorViewState browser_compositor_state_; - // Delegated frame management and compositior. + // Delegated frame management and compositor. scoped_ptr<DelegatedFrameHost> delegated_frame_host_; scoped_ptr<ui::Layer> root_layer_; diff --git a/content/browser/renderer_host/render_widget_host_view_mac.mm b/content/browser/renderer_host/render_widget_host_view_mac.mm index 984c66b..c173466 100644 --- a/content/browser/renderer_host/render_widget_host_view_mac.mm +++ b/content/browser/renderer_host/render_widget_host_view_mac.mm @@ -1566,6 +1566,13 @@ void RenderWidgetHostViewMac::WheelEventAck( [cocoa_view_ processedWheelEvent:event consumed:consumed]; } +uint32_t RenderWidgetHostViewMac::GetSurfaceIdNamespace() { + if (delegated_frame_host_) + return delegated_frame_host_->GetSurfaceIdNamespace(); + + return 0; +} + bool RenderWidgetHostViewMac::Send(IPC::Message* message) { if (render_widget_host_) return render_widget_host_->Send(message); diff --git a/content/common/view_messages.h b/content/common/view_messages.h index 1a9377c..c1d4a58 100644 --- a/content/common/view_messages.h +++ b/content/common/view_messages.h @@ -986,6 +986,11 @@ IPC_MESSAGE_ROUTED2(ViewMsg_ReclaimCompositorResources, uint32 /* output_surface_id */, cc::CompositorFrameAck /* ack */) +// Sent by browser to give renderer compositor a new namespace ID for any +// SurfaceSequences it has to create. +IPC_MESSAGE_ROUTED1(ViewMsg_SetSurfaceIdNamespace, + uint32_t /* surface_id_namespace */) + IPC_MESSAGE_ROUTED0(ViewMsg_SelectWordAroundCaret) // Sent by the browser to ask the renderer to redraw. diff --git a/content/renderer/gpu/render_widget_compositor.cc b/content/renderer/gpu/render_widget_compositor.cc index 8c9d418..9a9ec56 100644 --- a/content/renderer/gpu/render_widget_compositor.cc +++ b/content/renderer/gpu/render_widget_compositor.cc @@ -977,4 +977,9 @@ void RenderWidgetCompositor::RateLimitSharedMainThreadContext() { provider->ContextGL()->RateLimitOffscreenContextCHROMIUM(); } +void RenderWidgetCompositor::SetSurfaceIdNamespace( + uint32_t surface_id_namespace) { + layer_tree_host_->set_surface_id_namespace(surface_id_namespace); +} + } // namespace content diff --git a/content/renderer/gpu/render_widget_compositor.h b/content/renderer/gpu/render_widget_compositor.h index 08f4252..a6d1981 100644 --- a/content/renderer/gpu/render_widget_compositor.h +++ b/content/renderer/gpu/render_widget_compositor.h @@ -77,6 +77,7 @@ class CONTENT_EXPORT RenderWidgetCompositor const base::Callback<void(scoped_ptr<base::Value>)>& callback); bool SendMessageToMicroBenchmark(int id, scoped_ptr<base::Value> value); void StartCompositor(); + void SetSurfaceIdNamespace(uint32_t surface_id_namespace); // WebLayerTreeView implementation. virtual void setRootLayer(const blink::WebLayer& layer); diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc index 0b8d2ff..9b66dad 100644 --- a/content/renderer/render_widget.cc +++ b/content/renderer/render_widget.cc @@ -748,6 +748,7 @@ bool RenderWidget::OnMessageReceived(const IPC::Message& message) { IPC_MESSAGE_HANDLER(ViewMsg_SetTextDirection, OnSetTextDirection) IPC_MESSAGE_HANDLER(ViewMsg_Move_ACK, OnRequestMoveAck) IPC_MESSAGE_HANDLER(ViewMsg_UpdateScreenRects, OnUpdateScreenRects) + IPC_MESSAGE_HANDLER(ViewMsg_SetSurfaceIdNamespace, OnSetSurfaceIdNamespace) #if defined(OS_ANDROID) IPC_MESSAGE_HANDLER(ViewMsg_ShowImeIfNeeded, OnShowImeIfNeeded) IPC_MESSAGE_HANDLER(ViewMsg_ImeEventAck, OnImeEventAck) @@ -1748,6 +1749,11 @@ void RenderWidget::OnUpdateScreenRects(const gfx::Rect& view_screen_rect, Send(new ViewHostMsg_UpdateScreenRects_ACK(routing_id())); } +void RenderWidget::OnSetSurfaceIdNamespace(uint32_t surface_id_namespace) { + if (compositor_) + compositor_->SetSurfaceIdNamespace(surface_id_namespace); +} + void RenderWidget::showImeIfNeeded() { OnShowImeIfNeeded(); } diff --git a/content/renderer/render_widget.h b/content/renderer/render_widget.h index df4f62f..95cd8c2 100644 --- a/content/renderer/render_widget.h +++ b/content/renderer/render_widget.h @@ -444,6 +444,7 @@ class CONTENT_EXPORT RenderWidget void OnUpdateScreenRects(const gfx::Rect& view_screen_rect, const gfx::Rect& window_screen_rect); void OnShowImeIfNeeded(); + void OnSetSurfaceIdNamespace(uint32_t surface_id_namespace); #if defined(OS_ANDROID) // Whenever an IME event that needs an acknowledgement is sent to the browser, |