| 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/renderer_host/delegated_frame_host.h" | 5 #include "content/browser/renderer_host/delegated_frame_host.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <utility> | 9 #include <utility> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 30 matching lines...) Expand all Loading... |
| 41 | 41 |
| 42 //////////////////////////////////////////////////////////////////////////////// | 42 //////////////////////////////////////////////////////////////////////////////// |
| 43 // DelegatedFrameHost | 43 // DelegatedFrameHost |
| 44 | 44 |
| 45 DelegatedFrameHost::DelegatedFrameHost(const cc::FrameSinkId& frame_sink_id, | 45 DelegatedFrameHost::DelegatedFrameHost(const cc::FrameSinkId& frame_sink_id, |
| 46 DelegatedFrameHostClient* client) | 46 DelegatedFrameHostClient* client) |
| 47 : frame_sink_id_(frame_sink_id), | 47 : frame_sink_id_(frame_sink_id), |
| 48 client_(client), | 48 client_(client), |
| 49 compositor_(nullptr), | 49 compositor_(nullptr), |
| 50 tick_clock_(new base::DefaultTickClock()), | 50 tick_clock_(new base::DefaultTickClock()), |
| 51 last_compositor_frame_sink_id_(0), | |
| 52 skipped_frames_(false), | 51 skipped_frames_(false), |
| 53 background_color_(SK_ColorRED), | 52 background_color_(SK_ColorRED), |
| 54 current_scale_factor_(1.f), | 53 current_scale_factor_(1.f), |
| 55 can_lock_compositor_(YES_CAN_LOCK), | 54 can_lock_compositor_(YES_CAN_LOCK), |
| 56 delegated_frame_evictor_(new DelegatedFrameEvictor(this)) { | 55 delegated_frame_evictor_(new DelegatedFrameEvictor(this)) { |
| 57 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); | 56 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); |
| 58 factory->GetContextFactory()->AddObserver(this); | 57 factory->GetContextFactory()->AddObserver(this); |
| 59 factory->GetContextFactoryPrivate()->GetSurfaceManager()->RegisterFrameSinkId( | 58 factory->GetContextFactoryPrivate()->GetSurfaceManager()->RegisterFrameSinkId( |
| 60 frame_sink_id_); | 59 frame_sink_id_); |
| 61 CreateCompositorFrameSinkSupport(); | 60 CreateCompositorFrameSinkSupport(); |
| (...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 383 | 382 |
| 384 // To avoid unnecessary browser composites, try to go directly to the Surface | 383 // To avoid unnecessary browser composites, try to go directly to the Surface |
| 385 // rather than through the Layer (which goes through the browser compositor). | 384 // rather than through the Layer (which goes through the browser compositor). |
| 386 if (has_frame_ && request_copy_of_output_callback_for_testing_.is_null()) { | 385 if (has_frame_ && request_copy_of_output_callback_for_testing_.is_null()) { |
| 387 support_->RequestCopyOfSurface(std::move(request)); | 386 support_->RequestCopyOfSurface(std::move(request)); |
| 388 } else { | 387 } else { |
| 389 RequestCopyOfOutput(std::move(request)); | 388 RequestCopyOfOutput(std::move(request)); |
| 390 } | 389 } |
| 391 } | 390 } |
| 392 | 391 |
| 393 void DelegatedFrameHost::SwapDelegatedFrame( | 392 void DelegatedFrameHost::DidCreateNewRendererCompositorFrameSink() { |
| 394 uint32_t compositor_frame_sink_id, | 393 ResetCompositorFrameSinkSupport(); |
| 394 CreateCompositorFrameSinkSupport(); |
| 395 has_frame_ = false; |
| 396 } |
| 397 |
| 398 void DelegatedFrameHost::SubmitCompositorFrame( |
| 395 const cc::LocalSurfaceId& local_surface_id, | 399 const cc::LocalSurfaceId& local_surface_id, |
| 396 cc::CompositorFrame frame) { | 400 cc::CompositorFrame frame) { |
| 397 #if defined(OS_CHROMEOS) | 401 #if defined(OS_CHROMEOS) |
| 398 DCHECK(!resize_lock_ || !client_->IsAutoResizeEnabled()); | 402 DCHECK(!resize_lock_ || !client_->IsAutoResizeEnabled()); |
| 399 #endif | 403 #endif |
| 400 float frame_device_scale_factor = frame.metadata.device_scale_factor; | 404 float frame_device_scale_factor = frame.metadata.device_scale_factor; |
| 401 cc::BeginFrameAck ack(frame.metadata.begin_frame_ack); | 405 cc::BeginFrameAck ack(frame.metadata.begin_frame_ack); |
| 402 | 406 |
| 403 DCHECK(!frame.render_pass_list.empty()); | 407 DCHECK(!frame.render_pass_list.empty()); |
| 404 | 408 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 415 | 419 |
| 416 if (ShouldSkipFrame(frame_size_in_dip)) { | 420 if (ShouldSkipFrame(frame_size_in_dip)) { |
| 417 cc::ReturnedResourceArray resources; | 421 cc::ReturnedResourceArray resources; |
| 418 cc::TransferableResource::ReturnResources(frame.resource_list, &resources); | 422 cc::TransferableResource::ReturnResources(frame.resource_list, &resources); |
| 419 | 423 |
| 420 skipped_latency_info_list_.insert(skipped_latency_info_list_.end(), | 424 skipped_latency_info_list_.insert(skipped_latency_info_list_.end(), |
| 421 frame.metadata.latency_info.begin(), | 425 frame.metadata.latency_info.begin(), |
| 422 frame.metadata.latency_info.end()); | 426 frame.metadata.latency_info.end()); |
| 423 | 427 |
| 424 client_->DelegatedFrameHostSendReclaimCompositorResources( | 428 client_->DelegatedFrameHostSendReclaimCompositorResources( |
| 425 compositor_frame_sink_id, true /* is_swap_ack*/, resources); | 429 true /* is_swap_ack*/, resources); |
| 426 skipped_frames_ = true; | 430 skipped_frames_ = true; |
| 427 BeginFrameDidNotSwap(ack); | 431 BeginFrameDidNotSwap(ack); |
| 428 return; | 432 return; |
| 429 } | 433 } |
| 430 | 434 |
| 431 if (skipped_frames_) { | 435 if (skipped_frames_) { |
| 432 skipped_frames_ = false; | 436 skipped_frames_ = false; |
| 433 damage_rect = gfx::Rect(frame_size); | 437 damage_rect = gfx::Rect(frame_size); |
| 434 damage_rect_in_dip = gfx::Rect(frame_size_in_dip); | 438 damage_rect_in_dip = gfx::Rect(frame_size_in_dip); |
| 435 | 439 |
| 436 // Give the same damage rect to the compositor. | 440 // Give the same damage rect to the compositor. |
| 437 cc::RenderPass* root_pass = frame.render_pass_list.back().get(); | 441 cc::RenderPass* root_pass = frame.render_pass_list.back().get(); |
| 438 root_pass->damage_rect = damage_rect; | 442 root_pass->damage_rect = damage_rect; |
| 439 } | 443 } |
| 440 | 444 |
| 441 if (compositor_frame_sink_id != last_compositor_frame_sink_id_) { | |
| 442 // Resource ids are scoped by the output surface. | |
| 443 // If the originating output surface doesn't match the last one, it | |
| 444 // indicates the renderer's output surface may have been recreated, in which | |
| 445 // case we should recreate the DelegatedRendererLayer, to avoid matching | |
| 446 // resources from the old one with resources from the new one which would | |
| 447 // have the same id. Changing the layer to showing painted content destroys | |
| 448 // the DelegatedRendererLayer. | |
| 449 local_surface_id_ = cc::LocalSurfaceId(); | |
| 450 ResetCompositorFrameSinkSupport(); | |
| 451 CreateCompositorFrameSinkSupport(); | |
| 452 last_compositor_frame_sink_id_ = compositor_frame_sink_id; | |
| 453 } | |
| 454 | |
| 455 background_color_ = frame.metadata.root_background_color; | 445 background_color_ = frame.metadata.root_background_color; |
| 456 | 446 |
| 457 if (frame_size.IsEmpty()) { | 447 if (frame_size.IsEmpty()) { |
| 458 DCHECK(frame.resource_list.empty()); | 448 DCHECK(frame.resource_list.empty()); |
| 459 EvictDelegatedFrame(); | 449 EvictDelegatedFrame(); |
| 460 } else { | 450 } else { |
| 461 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); | 451 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); |
| 462 cc::SurfaceManager* manager = | 452 cc::SurfaceManager* manager = |
| 463 factory->GetContextFactoryPrivate()->GetSurfaceManager(); | 453 factory->GetContextFactoryPrivate()->GetSurfaceManager(); |
| 464 | 454 |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 506 | 496 |
| 507 DidFinishFrame(ack); | 497 DidFinishFrame(ack); |
| 508 } | 498 } |
| 509 | 499 |
| 510 void DelegatedFrameHost::ClearDelegatedFrame() { | 500 void DelegatedFrameHost::ClearDelegatedFrame() { |
| 511 EvictDelegatedFrame(); | 501 EvictDelegatedFrame(); |
| 512 } | 502 } |
| 513 | 503 |
| 514 void DelegatedFrameHost::DidReceiveCompositorFrameAck() { | 504 void DelegatedFrameHost::DidReceiveCompositorFrameAck() { |
| 515 client_->DelegatedFrameHostSendReclaimCompositorResources( | 505 client_->DelegatedFrameHostSendReclaimCompositorResources( |
| 516 last_compositor_frame_sink_id_, true /* is_swap_ack */, | 506 true /* is_swap_ack */, cc::ReturnedResourceArray()); |
| 517 cc::ReturnedResourceArray()); | |
| 518 } | 507 } |
| 519 | 508 |
| 520 void DelegatedFrameHost::ReclaimResources( | 509 void DelegatedFrameHost::ReclaimResources( |
| 521 const cc::ReturnedResourceArray& resources) { | 510 const cc::ReturnedResourceArray& resources) { |
| 522 client_->DelegatedFrameHostSendReclaimCompositorResources( | 511 client_->DelegatedFrameHostSendReclaimCompositorResources( |
| 523 last_compositor_frame_sink_id_, false /* is_swap_ack */, resources); | 512 false /* is_swap_ack */, resources); |
| 524 } | 513 } |
| 525 | 514 |
| 526 void DelegatedFrameHost::WillDrawSurface(const cc::LocalSurfaceId& id, | 515 void DelegatedFrameHost::WillDrawSurface(const cc::LocalSurfaceId& id, |
| 527 const gfx::Rect& damage_rect) { | 516 const gfx::Rect& damage_rect) { |
| 528 // Frame subscribers are only interested in changes to the target surface, so | 517 // Frame subscribers are only interested in changes to the target surface, so |
| 529 // do not attempt capture if |damage_rect| is empty. This prevents the draws | 518 // do not attempt capture if |damage_rect| is empty. This prevents the draws |
| 530 // of parent surfaces from triggering extra frame captures, which can affect | 519 // of parent surfaces from triggering extra frame captures, which can affect |
| 531 // smoothness. | 520 // smoothness. |
| 532 if (id != local_surface_id_ || damage_rect.IsEmpty()) | 521 if (id != local_surface_id_ || damage_rect.IsEmpty()) |
| 533 return; | 522 return; |
| (...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 874 } | 863 } |
| 875 | 864 |
| 876 if (!skipped_frames_) { | 865 if (!skipped_frames_) { |
| 877 latest_confirmed_begin_frame_source_id_ = ack.source_id; | 866 latest_confirmed_begin_frame_source_id_ = ack.source_id; |
| 878 latest_confirmed_begin_frame_sequence_number_ = | 867 latest_confirmed_begin_frame_sequence_number_ = |
| 879 ack.latest_confirmed_sequence_number; | 868 ack.latest_confirmed_sequence_number; |
| 880 } | 869 } |
| 881 } | 870 } |
| 882 | 871 |
| 883 } // namespace content | 872 } // namespace content |
| OLD | NEW |