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> |
11 | 11 |
12 #include "base/callback_helpers.h" | 12 #include "base/callback_helpers.h" |
13 #include "base/command_line.h" | 13 #include "base/command_line.h" |
14 #include "base/memory/ptr_util.h" | 14 #include "base/memory/ptr_util.h" |
15 #include "base/time/default_tick_clock.h" | 15 #include "base/time/default_tick_clock.h" |
16 #include "cc/output/compositor_frame.h" | 16 #include "cc/output/compositor_frame.h" |
17 #include "cc/output/compositor_frame_ack.h" | 17 #include "cc/output/compositor_frame_ack.h" |
18 #include "cc/output/copy_output_request.h" | 18 #include "cc/output/copy_output_request.h" |
19 #include "cc/resources/single_release_callback.h" | 19 #include "cc/resources/single_release_callback.h" |
20 #include "cc/resources/texture_mailbox.h" | 20 #include "cc/resources/texture_mailbox.h" |
21 #include "cc/surfaces/surface.h" | 21 #include "cc/surfaces/surface.h" |
22 #include "cc/surfaces/surface_factory.h" | 22 #include "cc/surfaces/surface_factory.h" |
23 #include "cc/surfaces/surface_hittest.h" | 23 #include "cc/surfaces/surface_hittest.h" |
24 #include "cc/surfaces/surface_manager.h" | 24 #include "cc/surfaces/surface_manager.h" |
25 #include "components/display_compositor/gl_helper.h" | 25 #include "content/browser/compositor/gl_helper.h" |
26 #include "content/browser/compositor/surface_utils.h" | 26 #include "content/browser/compositor/surface_utils.h" |
27 #include "content/browser/gpu/compositor_util.h" | 27 #include "content/browser/gpu/compositor_util.h" |
28 #include "content/browser/renderer_host/resize_lock.h" | 28 #include "content/browser/renderer_host/resize_lock.h" |
29 #include "content/public/browser/render_widget_host_view_frame_subscriber.h" | 29 #include "content/public/browser/render_widget_host_view_frame_subscriber.h" |
30 #include "content/public/common/content_switches.h" | 30 #include "content/public/common/content_switches.h" |
31 #include "media/base/video_frame.h" | 31 #include "media/base/video_frame.h" |
32 #include "media/base/video_util.h" | 32 #include "media/base/video_util.h" |
33 #include "skia/ext/image_operations.h" | 33 #include "skia/ext/image_operations.h" |
34 #include "third_party/skia/include/core/SkCanvas.h" | 34 #include "third_party/skia/include/core/SkCanvas.h" |
35 #include "third_party/skia/include/core/SkPaint.h" | 35 #include "third_party/skia/include/core/SkPaint.h" |
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
329 RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback callback; | 329 RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback callback; |
330 if (!frame_subscriber()->ShouldCaptureFrame(damage_rect, present_time, &frame, | 330 if (!frame_subscriber()->ShouldCaptureFrame(damage_rect, present_time, &frame, |
331 &callback)) | 331 &callback)) |
332 return; | 332 return; |
333 | 333 |
334 // Get a texture to re-use; else, create a new one. | 334 // Get a texture to re-use; else, create a new one. |
335 scoped_refptr<OwnedMailbox> subscriber_texture; | 335 scoped_refptr<OwnedMailbox> subscriber_texture; |
336 if (!idle_frame_subscriber_textures_.empty()) { | 336 if (!idle_frame_subscriber_textures_.empty()) { |
337 subscriber_texture = idle_frame_subscriber_textures_.back(); | 337 subscriber_texture = idle_frame_subscriber_textures_.back(); |
338 idle_frame_subscriber_textures_.pop_back(); | 338 idle_frame_subscriber_textures_.pop_back(); |
339 } else if (display_compositor::GLHelper* helper = | 339 } else if (GLHelper* helper = |
340 ImageTransportFactory::GetInstance()->GetGLHelper()) { | 340 ImageTransportFactory::GetInstance()->GetGLHelper()) { |
341 subscriber_texture = new OwnedMailbox(helper); | 341 subscriber_texture = new OwnedMailbox(helper); |
342 } | 342 } |
343 | 343 |
344 std::unique_ptr<cc::CopyOutputRequest> request = | 344 std::unique_ptr<cc::CopyOutputRequest> request = |
345 cc::CopyOutputRequest::CreateRequest(base::Bind( | 345 cc::CopyOutputRequest::CreateRequest(base::Bind( |
346 &DelegatedFrameHost::CopyFromCompositingSurfaceHasResultForVideo, | 346 &DelegatedFrameHost::CopyFromCompositingSurfaceHasResultForVideo, |
347 AsWeakPtr(), subscriber_texture, frame, | 347 AsWeakPtr(), subscriber_texture, frame, |
348 base::Bind(callback, present_time))); | 348 base::Bind(callback, present_time))); |
349 // Setting the source in this copy request asks that the layer abort any prior | 349 // Setting the source in this copy request asks that the layer abort any prior |
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
589 scoped_refptr<media::VideoFrame> video_frame, | 589 scoped_refptr<media::VideoFrame> video_frame, |
590 base::WeakPtr<DelegatedFrameHost> dfh, | 590 base::WeakPtr<DelegatedFrameHost> dfh, |
591 const base::Callback<void(bool)>& callback, | 591 const base::Callback<void(bool)>& callback, |
592 scoped_refptr<OwnedMailbox> subscriber_texture, | 592 scoped_refptr<OwnedMailbox> subscriber_texture, |
593 std::unique_ptr<cc::SingleReleaseCallback> release_callback, | 593 std::unique_ptr<cc::SingleReleaseCallback> release_callback, |
594 bool result) { | 594 bool result) { |
595 callback.Run(result); | 595 callback.Run(result); |
596 | 596 |
597 gpu::SyncToken sync_token; | 597 gpu::SyncToken sync_token; |
598 if (result) { | 598 if (result) { |
599 display_compositor::GLHelper* gl_helper = | 599 GLHelper* gl_helper = ImageTransportFactory::GetInstance()->GetGLHelper(); |
600 ImageTransportFactory::GetInstance()->GetGLHelper(); | |
601 gl_helper->GenerateSyncToken(&sync_token); | 600 gl_helper->GenerateSyncToken(&sync_token); |
602 } | 601 } |
603 if (release_callback) { | 602 if (release_callback) { |
604 // A release callback means the texture came from the compositor, so there | 603 // A release callback means the texture came from the compositor, so there |
605 // should be no |subscriber_texture|. | 604 // should be no |subscriber_texture|. |
606 DCHECK(!subscriber_texture.get()); | 605 DCHECK(!subscriber_texture.get()); |
607 const bool lost_resource = !sync_token.HasData(); | 606 const bool lost_resource = !sync_token.HasData(); |
608 release_callback->Run(sync_token, lost_resource); | 607 release_callback->Run(sync_token, lost_resource); |
609 } | 608 } |
610 ReturnSubscriberTexture(dfh, subscriber_texture, sync_token); | 609 ReturnSubscriberTexture(dfh, subscriber_texture, sync_token); |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
664 media::CopyRGBToVideoFrame( | 663 media::CopyRGBToVideoFrame( |
665 reinterpret_cast<uint8_t*>(scaled_bitmap.getPixels()), | 664 reinterpret_cast<uint8_t*>(scaled_bitmap.getPixels()), |
666 scaled_bitmap.rowBytes(), region_in_frame, video_frame.get()); | 665 scaled_bitmap.rowBytes(), region_in_frame, video_frame.get()); |
667 } | 666 } |
668 ignore_result(scoped_callback_runner.Release()); | 667 ignore_result(scoped_callback_runner.Release()); |
669 callback.Run(region_in_frame, true); | 668 callback.Run(region_in_frame, true); |
670 return; | 669 return; |
671 } | 670 } |
672 | 671 |
673 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); | 672 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); |
674 display_compositor::GLHelper* gl_helper = factory->GetGLHelper(); | 673 GLHelper* gl_helper = factory->GetGLHelper(); |
675 if (!gl_helper) | 674 if (!gl_helper) |
676 return; | 675 return; |
677 if (subscriber_texture.get() && !subscriber_texture->texture_id()) | 676 if (subscriber_texture.get() && !subscriber_texture->texture_id()) |
678 return; | 677 return; |
679 | 678 |
680 cc::TextureMailbox texture_mailbox; | 679 cc::TextureMailbox texture_mailbox; |
681 std::unique_ptr<cc::SingleReleaseCallback> release_callback; | 680 std::unique_ptr<cc::SingleReleaseCallback> release_callback; |
682 result->TakeTexture(&texture_mailbox, &release_callback); | 681 result->TakeTexture(&texture_mailbox, &release_callback); |
683 DCHECK(texture_mailbox.IsTexture()); | 682 DCHECK(texture_mailbox.IsTexture()); |
684 | 683 |
685 gfx::Rect result_rect(result->size()); | 684 gfx::Rect result_rect(result->size()); |
686 | 685 |
687 display_compositor::ReadbackYUVInterface* yuv_readback_pipeline = | 686 content::ReadbackYUVInterface* yuv_readback_pipeline = |
688 dfh->yuv_readback_pipeline_.get(); | 687 dfh->yuv_readback_pipeline_.get(); |
689 if (yuv_readback_pipeline == NULL || | 688 if (yuv_readback_pipeline == NULL || |
690 yuv_readback_pipeline->scaler()->SrcSize() != result_rect.size() || | 689 yuv_readback_pipeline->scaler()->SrcSize() != result_rect.size() || |
691 yuv_readback_pipeline->scaler()->SrcSubrect() != result_rect || | 690 yuv_readback_pipeline->scaler()->SrcSubrect() != result_rect || |
692 yuv_readback_pipeline->scaler()->DstSize() != region_in_frame.size()) { | 691 yuv_readback_pipeline->scaler()->DstSize() != region_in_frame.size()) { |
693 // The scaler chosen here is based on performance measurements of full | 692 // The scaler chosen here is based on performance measurements of full |
694 // end-to-end systems. When down-scaling, always use the "fast" scaler | 693 // end-to-end systems. When down-scaling, always use the "fast" scaler |
695 // because it performs well on both low- and high- end machines, provides | 694 // because it performs well on both low- and high- end machines, provides |
696 // decent image quality, and doesn't overwhelm downstream video encoders | 695 // decent image quality, and doesn't overwhelm downstream video encoders |
697 // with too much entropy (which can drastically increase CPU utilization). | 696 // with too much entropy (which can drastically increase CPU utilization). |
698 // When up-scaling, always use "best" because the quality improvement is | 697 // When up-scaling, always use "best" because the quality improvement is |
699 // huge with insignificant performance penalty. Note that this strategy | 698 // huge with insignificant performance penalty. Note that this strategy |
700 // differs from single-frame snapshot capture. | 699 // differs from single-frame snapshot capture. |
701 display_compositor::GLHelper::ScalerQuality quality = | 700 GLHelper::ScalerQuality quality = |
702 ((result_rect.size().width() < region_in_frame.size().width()) && | 701 ((result_rect.size().width() < region_in_frame.size().width()) && |
703 (result_rect.size().height() < region_in_frame.size().height())) | 702 (result_rect.size().height() < region_in_frame.size().height())) |
704 ? display_compositor::GLHelper::SCALER_QUALITY_BEST | 703 ? GLHelper::SCALER_QUALITY_BEST |
705 : display_compositor::GLHelper::SCALER_QUALITY_FAST; | 704 : GLHelper::SCALER_QUALITY_FAST; |
706 | 705 |
707 dfh->yuv_readback_pipeline_.reset(gl_helper->CreateReadbackPipelineYUV( | 706 dfh->yuv_readback_pipeline_.reset(gl_helper->CreateReadbackPipelineYUV( |
708 quality, result_rect.size(), result_rect, region_in_frame.size(), true, | 707 quality, result_rect.size(), result_rect, region_in_frame.size(), true, |
709 true)); | 708 true)); |
710 yuv_readback_pipeline = dfh->yuv_readback_pipeline_.get(); | 709 yuv_readback_pipeline = dfh->yuv_readback_pipeline_.get(); |
711 } | 710 } |
712 | 711 |
713 ignore_result(scoped_callback_runner.Release()); | 712 ignore_result(scoped_callback_runner.Release()); |
714 ignore_result(scoped_return_subscriber_texture.Release()); | 713 ignore_result(scoped_return_subscriber_texture.Release()); |
715 | 714 |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
886 cc::SurfaceManager* manager = factory->GetSurfaceManager(); | 885 cc::SurfaceManager* manager = factory->GetSurfaceManager(); |
887 new_layer->SetShowSurface( | 886 new_layer->SetShowSurface( |
888 surface_id_, base::Bind(&SatisfyCallback, base::Unretained(manager)), | 887 surface_id_, base::Bind(&SatisfyCallback, base::Unretained(manager)), |
889 base::Bind(&RequireCallback, base::Unretained(manager)), | 888 base::Bind(&RequireCallback, base::Unretained(manager)), |
890 current_surface_size_, current_scale_factor_, | 889 current_surface_size_, current_scale_factor_, |
891 current_frame_size_in_dip_); | 890 current_frame_size_in_dip_); |
892 } | 891 } |
893 } | 892 } |
894 | 893 |
895 } // namespace content | 894 } // namespace content |
OLD | NEW |