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 <algorithm> | 7 #include <algorithm> |
8 #include <utility> | 8 #include <utility> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
51 RenderWidgetHost* widget_host) | 51 RenderWidgetHost* widget_host) |
52 : host_(RenderWidgetHostImpl::From(widget_host)), | 52 : host_(RenderWidgetHostImpl::From(widget_host)), |
53 frame_sink_id_( | 53 frame_sink_id_( |
54 base::checked_cast<uint32_t>(widget_host->GetProcess()->GetID()), | 54 base::checked_cast<uint32_t>(widget_host->GetProcess()->GetID()), |
55 base::checked_cast<uint32_t>(widget_host->GetRoutingID())), | 55 base::checked_cast<uint32_t>(widget_host->GetRoutingID())), |
56 next_surface_sequence_(1u), | 56 next_surface_sequence_(1u), |
57 last_compositor_frame_sink_id_(0), | 57 last_compositor_frame_sink_id_(0), |
58 current_surface_scale_factor_(1.f), | 58 current_surface_scale_factor_(1.f), |
59 frame_connector_(nullptr), | 59 frame_connector_(nullptr), |
60 weak_factory_(this) { | 60 weak_factory_(this) { |
61 id_allocator_.reset(new cc::LocalSurfaceIdAllocator()); | |
62 GetSurfaceManager()->RegisterFrameSinkId(frame_sink_id_); | 61 GetSurfaceManager()->RegisterFrameSinkId(frame_sink_id_); |
63 CreateCompositorFrameSinkSupport(); | 62 CreateCompositorFrameSinkSupport(); |
64 } | 63 } |
65 | 64 |
66 RenderWidgetHostViewChildFrame::~RenderWidgetHostViewChildFrame() { | 65 RenderWidgetHostViewChildFrame::~RenderWidgetHostViewChildFrame() { |
67 ResetCompositorFrameSinkSupport(); | 66 ResetCompositorFrameSinkSupport(); |
68 if (GetSurfaceManager()) | 67 if (GetSurfaceManager()) |
69 GetSurfaceManager()->InvalidateFrameSinkId(frame_sink_id_); | 68 GetSurfaceManager()->InvalidateFrameSinkId(frame_sink_id_); |
70 } | 69 } |
71 | 70 |
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
344 void RenderWidgetHostViewChildFrame::DidReceiveCompositorFrameAck() { | 343 void RenderWidgetHostViewChildFrame::DidReceiveCompositorFrameAck() { |
345 if (!host_) | 344 if (!host_) |
346 return; | 345 return; |
347 host_->Send(new ViewMsg_ReclaimCompositorResources( | 346 host_->Send(new ViewMsg_ReclaimCompositorResources( |
348 host_->GetRoutingID(), last_compositor_frame_sink_id_, | 347 host_->GetRoutingID(), last_compositor_frame_sink_id_, |
349 true /* is_swap_ack */, cc::ReturnedResourceArray())); | 348 true /* is_swap_ack */, cc::ReturnedResourceArray())); |
350 } | 349 } |
351 | 350 |
352 void RenderWidgetHostViewChildFrame::ProcessCompositorFrame( | 351 void RenderWidgetHostViewChildFrame::ProcessCompositorFrame( |
353 uint32_t compositor_frame_sink_id, | 352 uint32_t compositor_frame_sink_id, |
353 cc::LocalSurfaceId local_surface_id, | |
Fady Samuel
2017/03/15 12:05:47
const cc::LocalSurfaceId&
Saman Sami
2017/03/16 18:33:06
Done.
| |
354 cc::CompositorFrame frame) { | 354 cc::CompositorFrame frame) { |
355 // If the renderer changed its frame sink, reset the | 355 // If the renderer changed its frame sink, reset the |
356 // CompositorFrameSinkSupport to avoid returning stale resources. | 356 // CompositorFrameSinkSupport to avoid returning stale resources. |
357 if (compositor_frame_sink_id != last_compositor_frame_sink_id_) { | 357 if (compositor_frame_sink_id != last_compositor_frame_sink_id_) { |
358 ResetCompositorFrameSinkSupport(); | 358 ResetCompositorFrameSinkSupport(); |
359 CreateCompositorFrameSinkSupport(); | 359 CreateCompositorFrameSinkSupport(); |
360 last_compositor_frame_sink_id_ = compositor_frame_sink_id; | 360 last_compositor_frame_sink_id_ = compositor_frame_sink_id; |
361 local_surface_id_ = cc::LocalSurfaceId(); | |
362 } | 361 } |
363 | 362 |
364 gfx::Size new_frame_size = frame.render_pass_list.back()->output_rect.size(); | 363 current_surface_size_ = frame.render_pass_list.back()->output_rect.size(); |
365 float new_scale_factor = frame.metadata.device_scale_factor; | 364 current_surface_scale_factor_ = frame.metadata.device_scale_factor; |
366 bool allocated_new_local_surface_id = false; | 365 |
367 if (!local_surface_id_.is_valid() || | 366 support_->SubmitCompositorFrame(local_surface_id, std::move(frame)); |
368 new_frame_size != current_surface_size_ || | 367 has_frame_ = true; |
369 new_scale_factor != current_surface_scale_factor_) { | 368 |
370 local_surface_id_ = id_allocator_->GenerateId(); | 369 if (local_surface_id_ != local_surface_id || HasEmbedderChanged()) { |
371 current_surface_size_ = frame.render_pass_list.back()->output_rect.size(); | 370 local_surface_id_ = local_surface_id; |
372 current_surface_scale_factor_ = frame.metadata.device_scale_factor; | 371 SendSurfaceInfoToEmbedder(); |
373 allocated_new_local_surface_id = true; | |
374 } | 372 } |
375 | 373 |
376 support_->SubmitCompositorFrame(local_surface_id_, std::move(frame)); | |
377 has_frame_ = true; | |
378 | |
379 if (allocated_new_local_surface_id || HasEmbedderChanged()) | |
380 SendSurfaceInfoToEmbedder(); | |
381 ProcessFrameSwappedCallbacks(); | 374 ProcessFrameSwappedCallbacks(); |
382 } | 375 } |
383 | 376 |
384 void RenderWidgetHostViewChildFrame::SendSurfaceInfoToEmbedder() { | 377 void RenderWidgetHostViewChildFrame::SendSurfaceInfoToEmbedder() { |
385 cc::SurfaceSequence sequence = | 378 cc::SurfaceSequence sequence = |
386 cc::SurfaceSequence(frame_sink_id_, next_surface_sequence_++); | 379 cc::SurfaceSequence(frame_sink_id_, next_surface_sequence_++); |
387 cc::SurfaceManager* manager = GetSurfaceManager(); | 380 cc::SurfaceManager* manager = GetSurfaceManager(); |
388 cc::SurfaceId surface_id(frame_sink_id_, local_surface_id_); | 381 cc::SurfaceId surface_id(frame_sink_id_, local_surface_id_); |
389 // The renderer process will satisfy this dependency when it creates a | 382 // The renderer process will satisfy this dependency when it creates a |
390 // SurfaceLayer. | 383 // SurfaceLayer. |
391 manager->RequireSequence(surface_id, sequence); | 384 manager->RequireSequence(surface_id, sequence); |
392 cc::SurfaceInfo surface_info(surface_id, current_surface_scale_factor_, | 385 cc::SurfaceInfo surface_info(surface_id, current_surface_scale_factor_, |
393 current_surface_size_); | 386 current_surface_size_); |
394 SendSurfaceInfoToEmbedderImpl(surface_info, sequence); | 387 SendSurfaceInfoToEmbedderImpl(surface_info, sequence); |
395 } | 388 } |
396 | 389 |
397 void RenderWidgetHostViewChildFrame::SendSurfaceInfoToEmbedderImpl( | 390 void RenderWidgetHostViewChildFrame::SendSurfaceInfoToEmbedderImpl( |
398 const cc::SurfaceInfo& surface_info, | 391 const cc::SurfaceInfo& surface_info, |
399 const cc::SurfaceSequence& sequence) { | 392 const cc::SurfaceSequence& sequence) { |
400 frame_connector_->SetChildFrameSurface(surface_info, sequence); | 393 frame_connector_->SetChildFrameSurface(surface_info, sequence); |
401 } | 394 } |
402 | 395 |
403 void RenderWidgetHostViewChildFrame::OnSwapCompositorFrame( | 396 void RenderWidgetHostViewChildFrame::OnSwapCompositorFrame( |
404 uint32_t compositor_frame_sink_id, | 397 uint32_t compositor_frame_sink_id, |
398 cc::LocalSurfaceId local_surface_id, | |
Fady Samuel
2017/03/15 12:05:47
const cc::LocalSurfaceId&
Saman Sami
2017/03/16 18:33:06
Done.
| |
405 cc::CompositorFrame frame) { | 399 cc::CompositorFrame frame) { |
406 TRACE_EVENT0("content", | 400 TRACE_EVENT0("content", |
407 "RenderWidgetHostViewChildFrame::OnSwapCompositorFrame"); | 401 "RenderWidgetHostViewChildFrame::OnSwapCompositorFrame"); |
408 last_scroll_offset_ = frame.metadata.root_scroll_offset; | 402 last_scroll_offset_ = frame.metadata.root_scroll_offset; |
409 if (!frame_connector_) | 403 if (!frame_connector_) |
410 return; | 404 return; |
411 ProcessCompositorFrame(compositor_frame_sink_id, std::move(frame)); | 405 ProcessCompositorFrame(compositor_frame_sink_id, local_surface_id, |
406 std::move(frame)); | |
412 } | 407 } |
413 | 408 |
414 void RenderWidgetHostViewChildFrame::ProcessFrameSwappedCallbacks() { | 409 void RenderWidgetHostViewChildFrame::ProcessFrameSwappedCallbacks() { |
415 // We only use callbacks once, therefore we make a new list for registration | 410 // We only use callbacks once, therefore we make a new list for registration |
416 // before we start, and discard the old list entries when we are done. | 411 // before we start, and discard the old list entries when we are done. |
417 FrameSwappedCallbackList process_callbacks; | 412 FrameSwappedCallbackList process_callbacks; |
418 process_callbacks.swap(frame_swapped_callbacks_); | 413 process_callbacks.swap(frame_swapped_callbacks_); |
419 for (std::unique_ptr<base::Closure>& callback : process_callbacks) | 414 for (std::unique_ptr<base::Closure>& callback : process_callbacks) |
420 callback->Run(); | 415 callback->Run(); |
421 } | 416 } |
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
704 frame_sink_id_); | 699 frame_sink_id_); |
705 } | 700 } |
706 support_.reset(); | 701 support_.reset(); |
707 } | 702 } |
708 | 703 |
709 bool RenderWidgetHostViewChildFrame::HasEmbedderChanged() { | 704 bool RenderWidgetHostViewChildFrame::HasEmbedderChanged() { |
710 return false; | 705 return false; |
711 } | 706 } |
712 | 707 |
713 } // namespace content | 708 } // namespace content |
OLD | NEW |