OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/frame_host/render_widget_host_view_child_frame.h" | 5 #include "content/browser/frame_host/render_widget_host_view_child_frame.h" |
6 | 6 |
7 #include "cc/surfaces/surface.h" | |
8 #include "cc/surfaces/surface_factory.h" | |
9 #include "cc/surfaces/surface_manager.h" | |
10 #include "cc/surfaces/surface_sequence.h" | |
7 #include "content/browser/accessibility/browser_accessibility_manager.h" | 11 #include "content/browser/accessibility/browser_accessibility_manager.h" |
8 #include "content/browser/frame_host/cross_process_frame_connector.h" | 12 #include "content/browser/frame_host/cross_process_frame_connector.h" |
13 #include "content/browser/gpu/compositor_util.h" | |
9 #include "content/browser/renderer_host/render_widget_host_impl.h" | 14 #include "content/browser/renderer_host/render_widget_host_impl.h" |
10 #include "content/common/gpu/gpu_messages.h" | 15 #include "content/common/gpu/gpu_messages.h" |
11 #include "content/common/view_messages.h" | 16 #include "content/common/view_messages.h" |
12 #include "content/public/browser/render_process_host.h" | 17 #include "content/public/browser/render_process_host.h" |
13 | 18 |
14 namespace content { | 19 namespace content { |
15 | 20 |
16 RenderWidgetHostViewChildFrame::RenderWidgetHostViewChildFrame( | 21 RenderWidgetHostViewChildFrame::RenderWidgetHostViewChildFrame( |
17 RenderWidgetHost* widget_host) | 22 RenderWidgetHost* widget_host) |
18 : host_(RenderWidgetHostImpl::From(widget_host)), | 23 : host_(RenderWidgetHostImpl::From(widget_host)), |
24 use_surfaces_(UseSurfacesEnabled()), | |
25 next_surface_sequence_(1u), | |
26 last_output_surface_id_(0), | |
27 current_surface_scale_factor_(1.f), | |
28 ack_pending_count_(0), | |
19 frame_connector_(NULL) { | 29 frame_connector_(NULL) { |
20 host_->SetView(this); | 30 host_->SetView(this); |
31 | |
32 if (use_surfaces_) { | |
33 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); | |
34 id_allocator_ = factory->GetContextFactory()->CreateSurfaceIdAllocator(); | |
35 } | |
21 } | 36 } |
22 | 37 |
23 RenderWidgetHostViewChildFrame::~RenderWidgetHostViewChildFrame() { | 38 RenderWidgetHostViewChildFrame::~RenderWidgetHostViewChildFrame() { |
39 if (!surface_id_.is_null()) | |
40 surface_factory_->Destroy(surface_id_); | |
24 } | 41 } |
25 | 42 |
26 void RenderWidgetHostViewChildFrame::InitAsChild( | 43 void RenderWidgetHostViewChildFrame::InitAsChild( |
27 gfx::NativeView parent_view) { | 44 gfx::NativeView parent_view) { |
28 NOTREACHED(); | 45 NOTREACHED(); |
29 } | 46 } |
30 | 47 |
31 RenderWidgetHost* RenderWidgetHostViewChildFrame::GetRenderWidgetHost() const { | 48 RenderWidgetHost* RenderWidgetHostViewChildFrame::GetRenderWidgetHost() const { |
32 return host_; | 49 return host_; |
33 } | 50 } |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
179 } | 196 } |
180 | 197 |
181 #if defined(OS_ANDROID) | 198 #if defined(OS_ANDROID) |
182 void RenderWidgetHostViewChildFrame::LockCompositingSurface() { | 199 void RenderWidgetHostViewChildFrame::LockCompositingSurface() { |
183 } | 200 } |
184 | 201 |
185 void RenderWidgetHostViewChildFrame::UnlockCompositingSurface() { | 202 void RenderWidgetHostViewChildFrame::UnlockCompositingSurface() { |
186 } | 203 } |
187 #endif | 204 #endif |
188 | 205 |
206 void RenderWidgetHostViewChildFrame::SurfaceDrawn(uint32 output_surface_id, | |
207 cc::SurfaceDrawStatus drawn) { | |
208 cc::CompositorFrameAck ack; | |
209 DCHECK(ack_pending_count_ > 0); | |
210 if (!surface_returned_resources_.empty()) | |
211 ack.resources.swap(surface_returned_resources_); | |
212 host_->Send(new ViewMsg_SwapCompositorFrameAck(host_->GetRoutingID(), | |
213 output_surface_id, ack)); | |
214 ack_pending_count_--; | |
215 } | |
216 | |
189 void RenderWidgetHostViewChildFrame::OnSwapCompositorFrame( | 217 void RenderWidgetHostViewChildFrame::OnSwapCompositorFrame( |
190 uint32 output_surface_id, | 218 uint32 output_surface_id, |
191 scoped_ptr<cc::CompositorFrame> frame) { | 219 scoped_ptr<cc::CompositorFrame> frame) { |
192 last_scroll_offset_ = frame->metadata.root_scroll_offset; | 220 last_scroll_offset_ = frame->metadata.root_scroll_offset; |
193 if (frame_connector_) { | 221 |
222 if (!frame_connector_) | |
223 return; | |
224 | |
225 // When not using surfaces, the frame just gets proxied to | |
226 // the embedder's renderer to be composited. | |
227 if (!frame->delegated_frame_data || !use_surfaces_) { | |
194 frame_connector_->ChildFrameCompositorFrameSwapped( | 228 frame_connector_->ChildFrameCompositorFrameSwapped( |
195 output_surface_id, | 229 output_surface_id, |
196 host_->GetProcess()->GetID(), | 230 host_->GetProcess()->GetID(), |
197 host_->GetRoutingID(), | 231 host_->GetRoutingID(), |
198 frame.Pass()); | 232 frame.Pass()); |
233 return; | |
199 } | 234 } |
235 | |
236 #if !defined(OS_ANDROID) | |
237 cc::RenderPass* root_pass = | |
238 frame->delegated_frame_data->render_pass_list.back(); | |
239 | |
240 gfx::Size frame_size = root_pass->output_rect.size(); | |
241 float scale_factor = frame->metadata.device_scale_factor; | |
242 | |
243 if (!surface_factory_) { | |
244 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); | |
245 cc::SurfaceManager* manager = factory->GetSurfaceManager(); | |
246 surface_factory_ = make_scoped_ptr(new cc::SurfaceFactory(manager, this)); | |
247 } | |
248 | |
249 // Check whether we need to recreate the cc::Surface, which means the child | |
250 // frame renderer has changed its output surface, or size, or scale factor. | |
251 if (output_surface_id != last_output_surface_id_ || | |
252 frame_size != current_surface_size_ || | |
253 scale_factor != current_surface_scale_factor_) { | |
254 if (!surface_id_.is_null()) { | |
255 surface_factory_->Destroy(surface_id_); | |
256 surface_id_ = cc::SurfaceId(); | |
257 surface_factory_.reset(); | |
jbauman
2015/05/23 01:14:34
I think you should only reset the surface_factory_
kenrb
2015/05/28 19:21:46
Done.
| |
258 } | |
259 last_output_surface_id_ = output_surface_id; | |
260 current_surface_size_ = frame_size; | |
261 current_surface_scale_factor_ = scale_factor; | |
262 } | |
263 | |
264 if (surface_id_.is_null()) { | |
265 surface_id_ = id_allocator_->GenerateId(); | |
266 surface_factory_->Create(surface_id_); | |
267 | |
268 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); | |
269 cc::SurfaceSequence sequence = cc::SurfaceSequence( | |
270 id_allocator_->id_namespace(), next_surface_sequence_++); | |
271 // The renderer will satisfy this dependency when it creates a | |
272 // SurfaceLayer. | |
273 factory->GetSurfaceManager() | |
274 ->GetSurfaceForId(surface_id_) | |
275 ->AddDestructionDependency(sequence); | |
276 frame_connector_->SetChildFrameSurface(surface_id_, frame_size, | |
277 scale_factor, sequence); | |
278 } | |
279 | |
280 cc::SurfaceFactory::DrawCallback ack_callback = | |
281 base::Bind(&RenderWidgetHostViewChildFrame::SurfaceDrawn, AsWeakPtr(), | |
282 output_surface_id); | |
283 ack_pending_count_++; | |
284 surface_factory_->SubmitFrame(surface_id_, frame.Pass(), ack_callback); | |
285 #endif // !defined(OS_ANDROID) | |
200 } | 286 } |
201 | 287 |
202 void RenderWidgetHostViewChildFrame::GetScreenInfo( | 288 void RenderWidgetHostViewChildFrame::GetScreenInfo( |
203 blink::WebScreenInfo* results) { | 289 blink::WebScreenInfo* results) { |
204 } | 290 } |
205 | 291 |
206 gfx::Rect RenderWidgetHostViewChildFrame::GetBoundsInRootWindow() { | 292 gfx::Rect RenderWidgetHostViewChildFrame::GetBoundsInRootWindow() { |
207 // We do not have any root window specific parts in this view. | 293 // We do not have any root window specific parts in this view. |
208 return GetViewBounds(); | 294 return GetViewBounds(); |
209 } | 295 } |
210 | 296 |
211 #if defined(USE_AURA) | 297 #if defined(USE_AURA) |
212 void RenderWidgetHostViewChildFrame::ProcessAckedTouchEvent( | 298 void RenderWidgetHostViewChildFrame::ProcessAckedTouchEvent( |
213 const TouchEventWithLatencyInfo& touch, | 299 const TouchEventWithLatencyInfo& touch, |
214 InputEventAckState ack_result) { | 300 InputEventAckState ack_result) { |
215 } | 301 } |
216 #endif // defined(USE_AURA) | 302 #endif // defined(USE_AURA) |
217 | 303 |
218 bool RenderWidgetHostViewChildFrame::LockMouse() { | 304 bool RenderWidgetHostViewChildFrame::LockMouse() { |
219 return false; | 305 return false; |
220 } | 306 } |
221 | 307 |
222 void RenderWidgetHostViewChildFrame::UnlockMouse() { | 308 void RenderWidgetHostViewChildFrame::UnlockMouse() { |
223 } | 309 } |
224 | 310 |
225 uint32_t RenderWidgetHostViewChildFrame::GetSurfaceIdNamespace() { | 311 uint32_t RenderWidgetHostViewChildFrame::GetSurfaceIdNamespace() { |
226 // TODO(kenrb): Create SurfaceFactory here when RWHVChildFrame | 312 if (!use_surfaces_) |
227 // gets compositor surface support. | 313 return 0; |
228 return 0; | 314 |
315 return id_allocator_->id_namespace(); | |
229 } | 316 } |
230 | 317 |
231 #if defined(OS_MACOSX) | 318 #if defined(OS_MACOSX) |
232 void RenderWidgetHostViewChildFrame::SetActive(bool active) { | 319 void RenderWidgetHostViewChildFrame::SetActive(bool active) { |
233 } | 320 } |
234 | 321 |
235 void RenderWidgetHostViewChildFrame::SetWindowVisibility(bool visible) { | 322 void RenderWidgetHostViewChildFrame::SetWindowVisibility(bool visible) { |
236 } | 323 } |
237 | 324 |
238 void RenderWidgetHostViewChildFrame::WindowFrameChanged() { | 325 void RenderWidgetHostViewChildFrame::WindowFrameChanged() { |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
294 void RenderWidgetHostViewChildFrame::SetParentNativeViewAccessible( | 381 void RenderWidgetHostViewChildFrame::SetParentNativeViewAccessible( |
295 gfx::NativeViewAccessible accessible_parent) { | 382 gfx::NativeViewAccessible accessible_parent) { |
296 } | 383 } |
297 | 384 |
298 gfx::NativeViewId RenderWidgetHostViewChildFrame::GetParentForWindowlessPlugin() | 385 gfx::NativeViewId RenderWidgetHostViewChildFrame::GetParentForWindowlessPlugin() |
299 const { | 386 const { |
300 return NULL; | 387 return NULL; |
301 } | 388 } |
302 #endif // defined(OS_WIN) | 389 #endif // defined(OS_WIN) |
303 | 390 |
391 // cc::SurfaceFactoryClient implementation. | |
392 void RenderWidgetHostViewChildFrame::ReturnResources( | |
393 const cc::ReturnedResourceArray& resources) { | |
394 if (resources.empty()) | |
395 return; | |
396 | |
397 if (!ack_pending_count_) { | |
398 cc::CompositorFrameAck ack; | |
399 std::copy(resources.begin(), resources.end(), | |
400 std::back_inserter(ack.resources)); | |
401 host_->Send(new ViewMsg_ReclaimCompositorResources( | |
402 host_->GetRoutingID(), last_output_surface_id_, ack)); | |
403 return; | |
404 } | |
405 | |
406 std::copy(resources.begin(), resources.end(), | |
407 std::back_inserter(surface_returned_resources_)); | |
408 } | |
409 | |
304 BrowserAccessibilityManager* | 410 BrowserAccessibilityManager* |
305 RenderWidgetHostViewChildFrame::CreateBrowserAccessibilityManager( | 411 RenderWidgetHostViewChildFrame::CreateBrowserAccessibilityManager( |
306 BrowserAccessibilityDelegate* delegate) { | 412 BrowserAccessibilityDelegate* delegate) { |
307 return BrowserAccessibilityManager::Create( | 413 return BrowserAccessibilityManager::Create( |
308 BrowserAccessibilityManager::GetEmptyDocument(), delegate); | 414 BrowserAccessibilityManager::GetEmptyDocument(), delegate); |
309 } | 415 } |
310 | 416 |
311 } // namespace content | 417 } // namespace content |
OLD | NEW |