| 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 |