OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/render_widget_host_view_android.h" | 5 #include "content/browser/renderer_host/render_widget_host_view_android.h" |
6 | 6 |
7 #include <android/bitmap.h> | 7 #include <android/bitmap.h> |
8 | 8 |
9 #include "base/android/sys_utils.h" | 9 #include "base/android/sys_utils.h" |
10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
11 #include "base/bind.h" | 11 #include "base/bind.h" |
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/logging.h" | 14 #include "base/logging.h" |
15 #include "base/message_loop/message_loop.h" | 15 #include "base/message_loop/message_loop.h" |
16 #include "base/metrics/histogram.h" | 16 #include "base/metrics/histogram.h" |
17 #include "base/strings/utf_string_conversions.h" | 17 #include "base/strings/utf_string_conversions.h" |
18 #include "base/threading/worker_pool.h" | 18 #include "base/threading/worker_pool.h" |
19 #include "cc/base/latency_info_swap_promise.h" | 19 #include "cc/base/latency_info_swap_promise.h" |
20 #include "cc/layers/delegated_frame_provider.h" | 20 #include "cc/layers/delegated_frame_provider.h" |
21 #include "cc/layers/delegated_renderer_layer.h" | 21 #include "cc/layers/delegated_renderer_layer.h" |
22 #include "cc/layers/layer.h" | 22 #include "cc/layers/layer.h" |
23 #include "cc/layers/texture_layer.h" | |
24 #include "cc/output/compositor_frame.h" | 23 #include "cc/output/compositor_frame.h" |
25 #include "cc/output/compositor_frame_ack.h" | 24 #include "cc/output/compositor_frame_ack.h" |
26 #include "cc/output/copy_output_request.h" | 25 #include "cc/output/copy_output_request.h" |
27 #include "cc/output/copy_output_result.h" | 26 #include "cc/output/copy_output_result.h" |
28 #include "cc/resources/single_release_callback.h" | 27 #include "cc/resources/single_release_callback.h" |
29 #include "cc/trees/layer_tree_host.h" | 28 #include "cc/trees/layer_tree_host.h" |
30 #include "content/browser/accessibility/browser_accessibility_manager_android.h" | 29 #include "content/browser/accessibility/browser_accessibility_manager_android.h" |
31 #include "content/browser/android/content_view_core_impl.h" | 30 #include "content/browser/android/content_view_core_impl.h" |
32 #include "content/browser/android/in_process/synchronous_compositor_impl.h" | 31 #include "content/browser/android/in_process/synchronous_compositor_impl.h" |
33 #include "content/browser/android/overscroll_glow.h" | 32 #include "content/browser/android/overscroll_glow.h" |
(...skipping 29 matching lines...) Expand all Loading... |
63 #include "ui/gfx/screen.h" | 62 #include "ui/gfx/screen.h" |
64 #include "ui/gfx/size_conversions.h" | 63 #include "ui/gfx/size_conversions.h" |
65 | 64 |
66 namespace content { | 65 namespace content { |
67 | 66 |
68 namespace { | 67 namespace { |
69 | 68 |
70 const int kUndefinedOutputSurfaceId = -1; | 69 const int kUndefinedOutputSurfaceId = -1; |
71 static const char kAsyncReadBackString[] = "Compositing.CopyFromSurfaceTime"; | 70 static const char kAsyncReadBackString[] = "Compositing.CopyFromSurfaceTime"; |
72 | 71 |
73 void InsertSyncPointAndAckForCompositor( | |
74 int renderer_host_id, | |
75 uint32 output_surface_id, | |
76 int route_id, | |
77 const gpu::Mailbox& return_mailbox, | |
78 const gfx::Size return_size) { | |
79 cc::CompositorFrameAck ack; | |
80 ack.gl_frame_data.reset(new cc::GLFrameData()); | |
81 if (!return_mailbox.IsZero()) { | |
82 ack.gl_frame_data->mailbox = return_mailbox; | |
83 ack.gl_frame_data->size = return_size; | |
84 ack.gl_frame_data->sync_point = | |
85 ImageTransportFactoryAndroid::GetInstance()->InsertSyncPoint(); | |
86 } | |
87 RenderWidgetHostImpl::SendSwapCompositorFrameAck( | |
88 route_id, output_surface_id, renderer_host_id, ack); | |
89 } | |
90 | |
91 // Sends an acknowledgement to the renderer of a processed IME event. | 72 // Sends an acknowledgement to the renderer of a processed IME event. |
92 void SendImeEventAck(RenderWidgetHostImpl* host) { | 73 void SendImeEventAck(RenderWidgetHostImpl* host) { |
93 host->Send(new ViewMsg_ImeEventAck(host->GetRoutingID())); | 74 host->Send(new ViewMsg_ImeEventAck(host->GetRoutingID())); |
94 } | 75 } |
95 | 76 |
96 void CopyFromCompositingSurfaceFinished( | 77 void CopyFromCompositingSurfaceFinished( |
97 const base::Callback<void(bool, const SkBitmap&)>& callback, | 78 const base::Callback<void(bool, const SkBitmap&)>& callback, |
98 scoped_ptr<cc::SingleReleaseCallback> release_callback, | 79 scoped_ptr<cc::SingleReleaseCallback> release_callback, |
99 scoped_ptr<SkBitmap> bitmap, | 80 scoped_ptr<SkBitmap> bitmap, |
100 const base::TimeTicks& start_time, | 81 const base::TimeTicks& start_time, |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
134 | 115 |
135 RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( | 116 RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( |
136 RenderWidgetHostImpl* widget_host, | 117 RenderWidgetHostImpl* widget_host, |
137 ContentViewCoreImpl* content_view_core) | 118 ContentViewCoreImpl* content_view_core) |
138 : host_(widget_host), | 119 : host_(widget_host), |
139 needs_begin_frame_(false), | 120 needs_begin_frame_(false), |
140 is_showing_(!widget_host->is_hidden()), | 121 is_showing_(!widget_host->is_hidden()), |
141 content_view_core_(NULL), | 122 content_view_core_(NULL), |
142 ime_adapter_android_(this), | 123 ime_adapter_android_(this), |
143 cached_background_color_(SK_ColorWHITE), | 124 cached_background_color_(SK_ColorWHITE), |
144 texture_id_in_layer_(0), | |
145 last_output_surface_id_(kUndefinedOutputSurfaceId), | 125 last_output_surface_id_(kUndefinedOutputSurfaceId), |
146 weak_ptr_factory_(this), | 126 weak_ptr_factory_(this), |
147 overscroll_effect_enabled_(!CommandLine::ForCurrentProcess()->HasSwitch( | 127 overscroll_effect_enabled_(!CommandLine::ForCurrentProcess()->HasSwitch( |
148 switches::kDisableOverscrollEdgeEffect)), | 128 switches::kDisableOverscrollEdgeEffect)), |
149 overscroll_effect_(OverscrollGlow::Create(overscroll_effect_enabled_)), | 129 overscroll_effect_(OverscrollGlow::Create(overscroll_effect_enabled_)), |
150 flush_input_requested_(false), | 130 flush_input_requested_(false), |
151 accelerated_surface_route_id_(0), | 131 accelerated_surface_route_id_(0), |
152 using_synchronous_compositor_(SynchronousCompositorImpl::FromID( | 132 using_synchronous_compositor_(SynchronousCompositorImpl::FromID( |
153 widget_host->GetProcess()->GetID(), | 133 widget_host->GetProcess()->GetID(), |
154 widget_host->GetRoutingID()) != NULL), | 134 widget_host->GetRoutingID()) != NULL), |
155 frame_evictor_(new DelegatedFrameEvictor(this)), | 135 frame_evictor_(new DelegatedFrameEvictor(this)), |
156 using_delegated_renderer_(IsDelegatedRendererEnabled()), | |
157 locks_on_frame_count_(0), | 136 locks_on_frame_count_(0), |
158 root_window_destroyed_(false) { | 137 root_window_destroyed_(false) { |
159 if (!using_delegated_renderer_) { | |
160 texture_layer_ = cc::TextureLayer::Create(NULL); | |
161 layer_ = texture_layer_; | |
162 } | |
163 | |
164 host_->SetView(this); | 138 host_->SetView(this); |
165 SetContentViewCore(content_view_core); | 139 SetContentViewCore(content_view_core); |
166 ImageTransportFactoryAndroid::AddObserver(this); | 140 ImageTransportFactoryAndroid::AddObserver(this); |
167 } | 141 } |
168 | 142 |
169 RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() { | 143 RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() { |
170 ImageTransportFactoryAndroid::RemoveObserver(this); | 144 ImageTransportFactoryAndroid::RemoveObserver(this); |
171 SetContentViewCore(NULL); | 145 SetContentViewCore(NULL); |
172 DCHECK(ack_callbacks_.empty()); | 146 DCHECK(ack_callbacks_.empty()); |
173 if (texture_id_in_layer_) { | |
174 ImageTransportFactoryAndroid::GetInstance()->DeleteTexture( | |
175 texture_id_in_layer_); | |
176 } | |
177 | |
178 if (texture_layer_.get()) | |
179 texture_layer_->ClearClient(); | |
180 | |
181 if (resource_collection_.get()) | 147 if (resource_collection_.get()) |
182 resource_collection_->SetClient(NULL); | 148 resource_collection_->SetClient(NULL); |
183 } | 149 } |
184 | 150 |
185 | 151 |
186 bool RenderWidgetHostViewAndroid::OnMessageReceived( | 152 bool RenderWidgetHostViewAndroid::OnMessageReceived( |
187 const IPC::Message& message) { | 153 const IPC::Message& message) { |
188 bool handled = true; | 154 bool handled = true; |
189 IPC_BEGIN_MESSAGE_MAP(RenderWidgetHostViewAndroid, message) | 155 IPC_BEGIN_MESSAGE_MAP(RenderWidgetHostViewAndroid, message) |
190 IPC_MESSAGE_HANDLER(ViewHostMsg_StartContentIntent, OnStartContentIntent) | 156 IPC_MESSAGE_HANDLER(ViewHostMsg_StartContentIntent, OnStartContentIntent) |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
289 return false; | 255 return false; |
290 if (!layer_) | 256 if (!layer_) |
291 return false; | 257 return false; |
292 | 258 |
293 if (texture_size_in_layer_.IsEmpty()) | 259 if (texture_size_in_layer_.IsEmpty()) |
294 return false; | 260 return false; |
295 | 261 |
296 if (!frame_evictor_->HasFrame()) | 262 if (!frame_evictor_->HasFrame()) |
297 return false; | 263 return false; |
298 | 264 |
299 if (using_delegated_renderer_) { | |
300 if (!delegated_renderer_layer_.get()) | |
301 return false; | |
302 } else { | |
303 if (texture_id_in_layer_ == 0) | |
304 return false; | |
305 } | |
306 | |
307 return true; | 265 return true; |
308 } | 266 } |
309 | 267 |
310 gfx::NativeView RenderWidgetHostViewAndroid::GetNativeView() const { | 268 gfx::NativeView RenderWidgetHostViewAndroid::GetNativeView() const { |
311 return content_view_core_->GetViewAndroid(); | 269 return content_view_core_->GetViewAndroid(); |
312 } | 270 } |
313 | 271 |
314 gfx::NativeViewId RenderWidgetHostViewAndroid::GetNativeViewId() const { | 272 gfx::NativeViewId RenderWidgetHostViewAndroid::GetNativeViewId() const { |
315 return reinterpret_cast<gfx::NativeViewId>( | 273 return reinterpret_cast<gfx::NativeViewId>( |
316 const_cast<RenderWidgetHostViewAndroid*>(this)); | 274 const_cast<RenderWidgetHostViewAndroid*>(this)); |
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
653 if (using_synchronous_compositor_) { | 611 if (using_synchronous_compositor_) { |
654 SynchronousCopyContents(src_subrect_in_pixel, dst_size_in_pixel, callback, | 612 SynchronousCopyContents(src_subrect_in_pixel, dst_size_in_pixel, callback, |
655 bitmap_config); | 613 bitmap_config); |
656 UMA_HISTOGRAM_TIMES("Compositing.CopyFromSurfaceTimeSynchronous", | 614 UMA_HISTOGRAM_TIMES("Compositing.CopyFromSurfaceTimeSynchronous", |
657 base::TimeTicks::Now() - start_time); | 615 base::TimeTicks::Now() - start_time); |
658 return; | 616 return; |
659 } | 617 } |
660 | 618 |
661 scoped_ptr<cc::CopyOutputRequest> request; | 619 scoped_ptr<cc::CopyOutputRequest> request; |
662 scoped_refptr<cc::Layer> readback_layer; | 620 scoped_refptr<cc::Layer> readback_layer; |
663 if (using_delegated_renderer_) { | 621 DCHECK(content_view_core_); |
664 DCHECK(content_view_core_); | 622 DCHECK(content_view_core_->GetWindowAndroid()); |
665 DCHECK(content_view_core_->GetWindowAndroid()); | 623 ui::WindowAndroidCompositor* compositor = |
666 ui::WindowAndroidCompositor* compositor = | 624 content_view_core_->GetWindowAndroid()->GetCompositor(); |
667 content_view_core_->GetWindowAndroid()->GetCompositor(); | 625 DCHECK(compositor); |
668 DCHECK(compositor); | 626 DCHECK(frame_provider_); |
669 DCHECK(frame_provider_); | 627 scoped_refptr<cc::DelegatedRendererLayer> delegated_layer = |
670 scoped_refptr<cc::DelegatedRendererLayer> delegated_layer = | 628 cc::DelegatedRendererLayer::Create(frame_provider_); |
671 cc::DelegatedRendererLayer::Create(frame_provider_); | 629 delegated_layer->SetDisplaySize(texture_size_in_layer_); |
672 delegated_layer->SetDisplaySize(texture_size_in_layer_); | 630 delegated_layer->SetBounds(content_size_in_layer_); |
673 delegated_layer->SetBounds(content_size_in_layer_); | 631 delegated_layer->SetHideLayerAndSubtree(true); |
674 delegated_layer->SetHideLayerAndSubtree(true); | 632 delegated_layer->SetIsDrawable(true); |
675 delegated_layer->SetIsDrawable(true); | 633 delegated_layer->SetContentsOpaque(true); |
676 delegated_layer->SetContentsOpaque(true); | 634 compositor->AttachLayerForReadback(delegated_layer); |
677 compositor->AttachLayerForReadback(delegated_layer); | |
678 | 635 |
679 readback_layer = delegated_layer; | 636 readback_layer = delegated_layer; |
680 request = cc::CopyOutputRequest::CreateRequest( | 637 request = cc::CopyOutputRequest::CreateRequest( |
681 base::Bind(&RenderWidgetHostViewAndroid:: | 638 base::Bind(&RenderWidgetHostViewAndroid:: |
682 PrepareTextureCopyOutputResultForDelegatedReadback, | 639 PrepareTextureCopyOutputResultForDelegatedReadback, |
683 dst_size_in_pixel, | 640 dst_size_in_pixel, |
684 bitmap_config, | 641 bitmap_config, |
685 start_time, | 642 start_time, |
686 readback_layer, | 643 readback_layer, |
687 callback)); | 644 callback)); |
688 } else { | |
689 readback_layer = layer_; | |
690 request = cc::CopyOutputRequest::CreateRequest( | |
691 base::Bind(&RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult, | |
692 dst_size_in_pixel, | |
693 bitmap_config, | |
694 start_time, | |
695 callback)); | |
696 } | |
697 request->set_area(src_subrect_in_pixel); | 645 request->set_area(src_subrect_in_pixel); |
698 readback_layer->RequestCopyOfOutput(request.Pass()); | 646 readback_layer->RequestCopyOfOutput(request.Pass()); |
699 } | 647 } |
700 | 648 |
701 void RenderWidgetHostViewAndroid::CopyFromCompositingSurfaceToVideoFrame( | 649 void RenderWidgetHostViewAndroid::CopyFromCompositingSurfaceToVideoFrame( |
702 const gfx::Rect& src_subrect, | 650 const gfx::Rect& src_subrect, |
703 const scoped_refptr<media::VideoFrame>& target, | 651 const scoped_refptr<media::VideoFrame>& target, |
704 const base::Callback<void(bool)>& callback) { | 652 const base::Callback<void(bool)>& callback) { |
705 NOTIMPLEMENTED(); | 653 NOTIMPLEMENTED(); |
706 callback.Run(false); | 654 callback.Run(false); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
756 | 704 |
757 void RenderWidgetHostViewAndroid::UnusedResourcesAreAvailable() { | 705 void RenderWidgetHostViewAndroid::UnusedResourcesAreAvailable() { |
758 if (ack_callbacks_.size()) | 706 if (ack_callbacks_.size()) |
759 return; | 707 return; |
760 SendReturnedDelegatedResources(last_output_surface_id_); | 708 SendReturnedDelegatedResources(last_output_surface_id_); |
761 } | 709 } |
762 | 710 |
763 void RenderWidgetHostViewAndroid::DestroyDelegatedContent() { | 711 void RenderWidgetHostViewAndroid::DestroyDelegatedContent() { |
764 RemoveLayers(); | 712 RemoveLayers(); |
765 frame_provider_ = NULL; | 713 frame_provider_ = NULL; |
766 delegated_renderer_layer_ = NULL; | |
767 layer_ = NULL; | 714 layer_ = NULL; |
768 } | 715 } |
769 | 716 |
770 void RenderWidgetHostViewAndroid::SwapDelegatedFrame( | 717 void RenderWidgetHostViewAndroid::SwapDelegatedFrame( |
771 uint32 output_surface_id, | 718 uint32 output_surface_id, |
772 scoped_ptr<cc::DelegatedFrameData> frame_data) { | 719 scoped_ptr<cc::DelegatedFrameData> frame_data) { |
773 bool has_content = !texture_size_in_layer_.IsEmpty(); | 720 bool has_content = !texture_size_in_layer_.IsEmpty(); |
774 | 721 |
775 if (output_surface_id != last_output_surface_id_) { | 722 if (output_surface_id != last_output_surface_id_) { |
776 // Drop the cc::DelegatedFrameResourceCollection so that we will not return | 723 // Drop the cc::DelegatedFrameResourceCollection so that we will not return |
(...skipping 15 matching lines...) Expand all Loading... |
792 } else { | 739 } else { |
793 if (!resource_collection_.get()) { | 740 if (!resource_collection_.get()) { |
794 resource_collection_ = new cc::DelegatedFrameResourceCollection; | 741 resource_collection_ = new cc::DelegatedFrameResourceCollection; |
795 resource_collection_->SetClient(this); | 742 resource_collection_->SetClient(this); |
796 } | 743 } |
797 if (!frame_provider_ || | 744 if (!frame_provider_ || |
798 texture_size_in_layer_ != frame_provider_->frame_size()) { | 745 texture_size_in_layer_ != frame_provider_->frame_size()) { |
799 RemoveLayers(); | 746 RemoveLayers(); |
800 frame_provider_ = new cc::DelegatedFrameProvider( | 747 frame_provider_ = new cc::DelegatedFrameProvider( |
801 resource_collection_.get(), frame_data.Pass()); | 748 resource_collection_.get(), frame_data.Pass()); |
802 delegated_renderer_layer_ = | 749 layer_ = cc::DelegatedRendererLayer::Create(frame_provider_); |
803 cc::DelegatedRendererLayer::Create(frame_provider_); | |
804 layer_ = delegated_renderer_layer_; | |
805 AttachLayers(); | 750 AttachLayers(); |
806 } else { | 751 } else { |
807 frame_provider_->SetFrameData(frame_data.Pass()); | 752 frame_provider_->SetFrameData(frame_data.Pass()); |
808 } | 753 } |
809 } | 754 } |
810 | 755 |
811 if (delegated_renderer_layer_.get()) { | 756 if (layer_.get()) { |
812 delegated_renderer_layer_->SetDisplaySize(texture_size_in_layer_); | 757 layer_->SetDisplaySize(texture_size_in_layer_); |
813 delegated_renderer_layer_->SetIsDrawable(true); | 758 layer_->SetIsDrawable(true); |
814 delegated_renderer_layer_->SetContentsOpaque(true); | 759 layer_->SetContentsOpaque(true); |
815 delegated_renderer_layer_->SetBounds(content_size_in_layer_); | 760 layer_->SetBounds(content_size_in_layer_); |
816 delegated_renderer_layer_->SetNeedsDisplay(); | 761 layer_->SetNeedsDisplay(); |
817 } | 762 } |
818 | 763 |
819 base::Closure ack_callback = | 764 base::Closure ack_callback = |
820 base::Bind(&RenderWidgetHostViewAndroid::SendDelegatedFrameAck, | 765 base::Bind(&RenderWidgetHostViewAndroid::SendDelegatedFrameAck, |
821 weak_ptr_factory_.GetWeakPtr(), | 766 weak_ptr_factory_.GetWeakPtr(), |
822 output_surface_id); | 767 output_surface_id); |
823 | 768 |
824 ack_callbacks_.push(ack_callback); | 769 ack_callbacks_.push(ack_callback); |
825 if (host_->is_hidden()) | 770 if (host_->is_hidden()) |
826 RunAckCallbacks(); | 771 RunAckCallbacks(); |
(...skipping 10 matching lines...) Expand all Loading... |
837 content_size_in_layer_ = | 782 content_size_in_layer_ = |
838 gfx::Size(texture_size_in_layer_.width() - offset.x(), | 783 gfx::Size(texture_size_in_layer_.width() - offset.x(), |
839 texture_size_in_layer_.height() - offset.y()); | 784 texture_size_in_layer_.height() - offset.y()); |
840 // Content size changes should be reflected in associated animation effects. | 785 // Content size changes should be reflected in associated animation effects. |
841 UpdateAnimationSize(frame_metadata); | 786 UpdateAnimationSize(frame_metadata); |
842 } | 787 } |
843 | 788 |
844 void RenderWidgetHostViewAndroid::InternalSwapCompositorFrame( | 789 void RenderWidgetHostViewAndroid::InternalSwapCompositorFrame( |
845 uint32 output_surface_id, | 790 uint32 output_surface_id, |
846 scoped_ptr<cc::CompositorFrame> frame) { | 791 scoped_ptr<cc::CompositorFrame> frame) { |
| 792 if (!frame->delegated_frame_data) { |
| 793 LOG(ERROR) << "Non-delegated renderer path no longer supported"; |
| 794 return; |
| 795 } |
| 796 |
847 if (locks_on_frame_count_ > 0) { | 797 if (locks_on_frame_count_ > 0) { |
848 DCHECK(HasValidFrame()); | 798 DCHECK(HasValidFrame()); |
849 RetainFrame(output_surface_id, frame.Pass()); | 799 RetainFrame(output_surface_id, frame.Pass()); |
850 return; | 800 return; |
851 } | 801 } |
852 | 802 |
853 // Always let ContentViewCore know about the new frame first, so it can decide | 803 // Always let ContentViewCore know about the new frame first, so it can decide |
854 // to schedule a Draw immediately when it sees the texture layer invalidation. | 804 // to schedule a Draw immediately when it sees the texture layer invalidation. |
855 UpdateContentViewCoreFrameMetadata(frame->metadata); | 805 UpdateContentViewCoreFrameMetadata(frame->metadata); |
856 | 806 |
857 if (layer_ && layer_->layer_tree_host()) { | 807 if (layer_ && layer_->layer_tree_host()) { |
858 for (size_t i = 0; i < frame->metadata.latency_info.size(); i++) { | 808 for (size_t i = 0; i < frame->metadata.latency_info.size(); i++) { |
859 scoped_ptr<cc::SwapPromise> swap_promise( | 809 scoped_ptr<cc::SwapPromise> swap_promise( |
860 new cc::LatencyInfoSwapPromise(frame->metadata.latency_info[i])); | 810 new cc::LatencyInfoSwapPromise(frame->metadata.latency_info[i])); |
861 layer_->layer_tree_host()->QueueSwapPromise(swap_promise.Pass()); | 811 layer_->layer_tree_host()->QueueSwapPromise(swap_promise.Pass()); |
862 } | 812 } |
863 } | 813 } |
864 | 814 |
865 if (frame->delegated_frame_data) { | 815 DCHECK(!frame->delegated_frame_data->render_pass_list.empty()); |
866 DCHECK(using_delegated_renderer_); | |
867 | 816 |
868 DCHECK(frame->delegated_frame_data); | 817 cc::RenderPass* root_pass = |
869 DCHECK(!frame->delegated_frame_data->render_pass_list.empty()); | 818 frame->delegated_frame_data->render_pass_list.back(); |
870 | 819 texture_size_in_layer_ = root_pass->output_rect.size(); |
871 cc::RenderPass* root_pass = | |
872 frame->delegated_frame_data->render_pass_list.back(); | |
873 texture_size_in_layer_ = root_pass->output_rect.size(); | |
874 ComputeContentsSize(frame->metadata); | |
875 | |
876 SwapDelegatedFrame(output_surface_id, frame->delegated_frame_data.Pass()); | |
877 frame_evictor_->SwappedFrame(!host_->is_hidden()); | |
878 return; | |
879 } | |
880 | |
881 DCHECK(!using_delegated_renderer_); | |
882 | |
883 if (!frame->gl_frame_data || frame->gl_frame_data->mailbox.IsZero()) | |
884 return; | |
885 | |
886 if (output_surface_id != last_output_surface_id_) { | |
887 current_mailbox_ = gpu::Mailbox(); | |
888 last_output_surface_id_ = kUndefinedOutputSurfaceId; | |
889 } | |
890 | |
891 base::Closure callback = base::Bind(&InsertSyncPointAndAckForCompositor, | |
892 host_->GetProcess()->GetID(), | |
893 output_surface_id, | |
894 host_->GetRoutingID(), | |
895 current_mailbox_, | |
896 texture_size_in_layer_); | |
897 ImageTransportFactoryAndroid::GetInstance()->WaitSyncPoint( | |
898 frame->gl_frame_data->sync_point); | |
899 | |
900 texture_size_in_layer_ = frame->gl_frame_data->size; | |
901 ComputeContentsSize(frame->metadata); | 820 ComputeContentsSize(frame->metadata); |
902 | 821 |
903 BuffersSwapped(frame->gl_frame_data->mailbox, output_surface_id, callback); | 822 SwapDelegatedFrame(output_surface_id, frame->delegated_frame_data.Pass()); |
904 frame_evictor_->SwappedFrame(!host_->is_hidden()); | 823 frame_evictor_->SwappedFrame(!host_->is_hidden()); |
905 } | 824 } |
906 | 825 |
907 void RenderWidgetHostViewAndroid::OnSwapCompositorFrame( | 826 void RenderWidgetHostViewAndroid::OnSwapCompositorFrame( |
908 uint32 output_surface_id, | 827 uint32 output_surface_id, |
909 scoped_ptr<cc::CompositorFrame> frame) { | 828 scoped_ptr<cc::CompositorFrame> frame) { |
910 InternalSwapCompositorFrame(output_surface_id, frame.Pass()); | 829 InternalSwapCompositorFrame(output_surface_id, frame.Pass()); |
911 } | 830 } |
912 | 831 |
913 void RenderWidgetHostViewAndroid::RetainFrame( | 832 void RenderWidgetHostViewAndroid::RetainFrame( |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1003 int route_id) { | 922 int route_id) { |
1004 accelerated_surface_route_id_ = route_id; | 923 accelerated_surface_route_id_ = route_id; |
1005 } | 924 } |
1006 | 925 |
1007 void RenderWidgetHostViewAndroid::AcceleratedSurfaceBuffersSwapped( | 926 void RenderWidgetHostViewAndroid::AcceleratedSurfaceBuffersSwapped( |
1008 const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params, | 927 const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params, |
1009 int gpu_host_id) { | 928 int gpu_host_id) { |
1010 NOTREACHED() << "Need --composite-to-mailbox or --enable-delegated-renderer"; | 929 NOTREACHED() << "Need --composite-to-mailbox or --enable-delegated-renderer"; |
1011 } | 930 } |
1012 | 931 |
1013 void RenderWidgetHostViewAndroid::BuffersSwapped( | |
1014 const gpu::Mailbox& mailbox, | |
1015 uint32_t output_surface_id, | |
1016 const base::Closure& ack_callback) { | |
1017 ImageTransportFactoryAndroid* factory = | |
1018 ImageTransportFactoryAndroid::GetInstance(); | |
1019 | |
1020 if (!texture_id_in_layer_) { | |
1021 texture_id_in_layer_ = factory->CreateTexture(); | |
1022 texture_layer_->SetTextureId(texture_id_in_layer_); | |
1023 texture_layer_->SetIsDrawable(true); | |
1024 texture_layer_->SetContentsOpaque(true); | |
1025 } | |
1026 | |
1027 ImageTransportFactoryAndroid::GetInstance()->AcquireTexture( | |
1028 texture_id_in_layer_, mailbox.name); | |
1029 | |
1030 current_mailbox_ = mailbox; | |
1031 last_output_surface_id_ = output_surface_id; | |
1032 | |
1033 ack_callbacks_.push(ack_callback); | |
1034 if (host_->is_hidden()) | |
1035 RunAckCallbacks(); | |
1036 } | |
1037 | |
1038 void RenderWidgetHostViewAndroid::AttachLayers() { | 932 void RenderWidgetHostViewAndroid::AttachLayers() { |
1039 if (!content_view_core_) | 933 if (!content_view_core_) |
1040 return; | 934 return; |
1041 if (!layer_.get()) | 935 if (!layer_.get()) |
1042 return; | 936 return; |
1043 | 937 |
1044 content_view_core_->AttachLayer(layer_); | 938 content_view_core_->AttachLayer(layer_); |
1045 if (overscroll_effect_enabled_) | 939 if (overscroll_effect_enabled_) |
1046 overscroll_effect_->Enable(); | 940 overscroll_effect_->Enable(); |
1047 layer_->SetHideLayerAndSubtree(!is_showing_); | 941 layer_->SetHideLayerAndSubtree(!is_showing_); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1081 | 975 |
1082 void RenderWidgetHostViewAndroid::AcceleratedSurfaceSuspend() { | 976 void RenderWidgetHostViewAndroid::AcceleratedSurfaceSuspend() { |
1083 NOTREACHED(); | 977 NOTREACHED(); |
1084 } | 978 } |
1085 | 979 |
1086 void RenderWidgetHostViewAndroid::AcceleratedSurfaceRelease() { | 980 void RenderWidgetHostViewAndroid::AcceleratedSurfaceRelease() { |
1087 NOTREACHED(); | 981 NOTREACHED(); |
1088 } | 982 } |
1089 | 983 |
1090 void RenderWidgetHostViewAndroid::EvictDelegatedFrame() { | 984 void RenderWidgetHostViewAndroid::EvictDelegatedFrame() { |
1091 if (texture_id_in_layer_) { | 985 if (layer_.get()) |
1092 texture_layer_->SetTextureId(0); | |
1093 texture_layer_->SetIsDrawable(false); | |
1094 ImageTransportFactoryAndroid::GetInstance()->DeleteTexture( | |
1095 texture_id_in_layer_); | |
1096 texture_id_in_layer_ = 0; | |
1097 current_mailbox_ = gpu::Mailbox(); | |
1098 last_output_surface_id_ = kUndefinedOutputSurfaceId; | |
1099 } | |
1100 if (delegated_renderer_layer_.get()) | |
1101 DestroyDelegatedContent(); | 986 DestroyDelegatedContent(); |
1102 frame_evictor_->DiscardedFrame(); | 987 frame_evictor_->DiscardedFrame(); |
1103 } | 988 } |
1104 | 989 |
1105 bool RenderWidgetHostViewAndroid::HasAcceleratedSurface( | 990 bool RenderWidgetHostViewAndroid::HasAcceleratedSurface( |
1106 const gfx::Size& desired_size) { | 991 const gfx::Size& desired_size) { |
1107 NOTREACHED(); | 992 NOTREACHED(); |
1108 return false; | 993 return false; |
1109 } | 994 } |
1110 | 995 |
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1377 | 1262 |
1378 void RenderWidgetHostViewAndroid::OnDetachCompositor() { | 1263 void RenderWidgetHostViewAndroid::OnDetachCompositor() { |
1379 DCHECK(content_view_core_); | 1264 DCHECK(content_view_core_); |
1380 DCHECK(!using_synchronous_compositor_); | 1265 DCHECK(!using_synchronous_compositor_); |
1381 root_window_destroyed_ = true; | 1266 root_window_destroyed_ = true; |
1382 RunAckCallbacks(); | 1267 RunAckCallbacks(); |
1383 } | 1268 } |
1384 | 1269 |
1385 void RenderWidgetHostViewAndroid::OnLostResources() { | 1270 void RenderWidgetHostViewAndroid::OnLostResources() { |
1386 ReleaseLocksOnSurface(); | 1271 ReleaseLocksOnSurface(); |
1387 if (texture_layer_.get()) | 1272 if (layer_.get()) |
1388 texture_layer_->SetIsDrawable(false); | |
1389 if (delegated_renderer_layer_.get()) | |
1390 DestroyDelegatedContent(); | 1273 DestroyDelegatedContent(); |
1391 texture_id_in_layer_ = 0; | |
1392 DCHECK(ack_callbacks_.empty()); | 1274 DCHECK(ack_callbacks_.empty()); |
1393 } | 1275 } |
1394 | 1276 |
1395 // static | 1277 // static |
1396 void | 1278 void |
1397 RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResultForDelegatedReadback( | 1279 RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResultForDelegatedReadback( |
1398 const gfx::Size& dst_size_in_pixel, | 1280 const gfx::Size& dst_size_in_pixel, |
1399 const SkBitmap::Config config, | 1281 const SkBitmap::Config config, |
1400 const base::TimeTicks& start_time, | 1282 const base::TimeTicks& start_time, |
1401 scoped_refptr<cc::Layer> readback_layer, | 1283 scoped_refptr<cc::Layer> readback_layer, |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1503 // RenderWidgetHostView, public: | 1385 // RenderWidgetHostView, public: |
1504 | 1386 |
1505 // static | 1387 // static |
1506 RenderWidgetHostView* | 1388 RenderWidgetHostView* |
1507 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { | 1389 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { |
1508 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); | 1390 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); |
1509 return new RenderWidgetHostViewAndroid(rwhi, NULL); | 1391 return new RenderWidgetHostViewAndroid(rwhi, NULL); |
1510 } | 1392 } |
1511 | 1393 |
1512 } // namespace content | 1394 } // namespace content |
OLD | NEW |