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" |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
141 overscroll_effect_(OverscrollGlow::Create(overscroll_effect_enabled_)), | 141 overscroll_effect_(OverscrollGlow::Create(overscroll_effect_enabled_)), |
142 flush_input_requested_(false), | 142 flush_input_requested_(false), |
143 accelerated_surface_route_id_(0), | 143 accelerated_surface_route_id_(0), |
144 using_synchronous_compositor_(SynchronousCompositorImpl::FromID( | 144 using_synchronous_compositor_(SynchronousCompositorImpl::FromID( |
145 widget_host->GetProcess()->GetID(), | 145 widget_host->GetProcess()->GetID(), |
146 widget_host->GetRoutingID()) != NULL), | 146 widget_host->GetRoutingID()) != NULL), |
147 frame_evictor_(new DelegatedFrameEvictor(this)), | 147 frame_evictor_(new DelegatedFrameEvictor(this)), |
148 using_delegated_renderer_(CommandLine::ForCurrentProcess()->HasSwitch( | 148 using_delegated_renderer_(CommandLine::ForCurrentProcess()->HasSwitch( |
149 switches::kEnableDelegatedRenderer) && | 149 switches::kEnableDelegatedRenderer) && |
150 !CommandLine::ForCurrentProcess()->HasSwitch( | 150 !CommandLine::ForCurrentProcess()->HasSwitch( |
151 switches::kDisableDelegatedRenderer)) { | 151 switches::kDisableDelegatedRenderer)), |
152 locks_on_frame_count_(0) { | |
152 if (!using_delegated_renderer_) { | 153 if (!using_delegated_renderer_) { |
153 texture_layer_ = cc::TextureLayer::Create(NULL); | 154 texture_layer_ = cc::TextureLayer::Create(NULL); |
154 layer_ = texture_layer_; | 155 layer_ = texture_layer_; |
155 } | 156 } |
156 | 157 |
157 host_->SetView(this); | 158 host_->SetView(this); |
158 SetContentViewCore(content_view_core); | 159 SetContentViewCore(content_view_core); |
159 ImageTransportFactoryAndroid::AddObserver(this); | 160 ImageTransportFactoryAndroid::AddObserver(this); |
160 } | 161 } |
161 | 162 |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
279 | 280 |
280 bool RenderWidgetHostViewAndroid::HasValidFrame() const { | 281 bool RenderWidgetHostViewAndroid::HasValidFrame() const { |
281 if (!content_view_core_) | 282 if (!content_view_core_) |
282 return false; | 283 return false; |
283 if (!layer_) | 284 if (!layer_) |
284 return false; | 285 return false; |
285 | 286 |
286 if (texture_size_in_layer_.IsEmpty()) | 287 if (texture_size_in_layer_.IsEmpty()) |
287 return false; | 288 return false; |
288 | 289 |
290 if (!frame_evictor_->HasFrame()) | |
291 return false; | |
292 | |
289 if (using_delegated_renderer_) { | 293 if (using_delegated_renderer_) { |
290 if (!delegated_renderer_layer_.get()) | 294 if (!delegated_renderer_layer_.get()) |
291 return false; | 295 return false; |
292 } else { | 296 } else { |
293 if (texture_id_in_layer_ == 0) | 297 if (texture_id_in_layer_ == 0) |
294 return false; | 298 return false; |
295 } | 299 } |
296 | 300 |
297 return true; | 301 return true; |
298 } | 302 } |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
369 WasHidden(); | 373 WasHidden(); |
370 } | 374 } |
371 | 375 |
372 bool RenderWidgetHostViewAndroid::IsShowing() { | 376 bool RenderWidgetHostViewAndroid::IsShowing() { |
373 // ContentViewCoreImpl represents the native side of the Java | 377 // ContentViewCoreImpl represents the native side of the Java |
374 // ContentViewCore. It being NULL means that it is not attached | 378 // ContentViewCore. It being NULL means that it is not attached |
375 // to the View system yet, so we treat this RWHVA as hidden. | 379 // to the View system yet, so we treat this RWHVA as hidden. |
376 return is_showing_ && content_view_core_; | 380 return is_showing_ && content_view_core_; |
377 } | 381 } |
378 | 382 |
379 void RenderWidgetHostViewAndroid::LockResources() { | 383 void RenderWidgetHostViewAndroid::LockSurface() { |
380 DCHECK(HasValidFrame()); | 384 DCHECK(HasValidFrame()); |
381 DCHECK(host_); | 385 DCHECK(host_); |
382 DCHECK(!host_->is_hidden()); | 386 DCHECK(frame_evictor_->HasFrame()); |
383 frame_evictor_->LockFrame(); | 387 frame_evictor_->LockFrame(); |
388 locks_on_frame_count_++; | |
384 } | 389 } |
385 | 390 |
386 void RenderWidgetHostViewAndroid::UnlockResources() { | 391 void RenderWidgetHostViewAndroid::UnlockSurface() { |
392 if (!frame_evictor_->HasFrame() || locks_on_frame_count_ == 0) | |
393 return; | |
394 | |
387 DCHECK(HasValidFrame()); | 395 DCHECK(HasValidFrame()); |
388 frame_evictor_->UnlockFrame(); | 396 frame_evictor_->UnlockFrame(); |
397 locks_on_frame_count_--; | |
398 | |
399 if (locks_on_frame_count_ == 0 && last_frame_info_) { | |
400 InternalSwapCompositorFrame(last_frame_info_->output_surface_id, | |
401 last_frame_info_->frame.Pass()); | |
402 last_frame_info_.reset(); | |
403 } | |
404 } | |
405 | |
406 void RenderWidgetHostViewAndroid::ReleaseLocksOnSurface() { | |
407 if (!frame_evictor_->HasFrame()) { | |
408 DCHECK_EQ(locks_on_frame_count_, 0u); | |
409 return; | |
410 } | |
411 while (locks_on_frame_count_ > 0) { | |
412 UnlockSurface(); | |
413 } | |
389 } | 414 } |
390 | 415 |
391 gfx::Rect RenderWidgetHostViewAndroid::GetViewBounds() const { | 416 gfx::Rect RenderWidgetHostViewAndroid::GetViewBounds() const { |
392 if (!content_view_core_) | 417 if (!content_view_core_) |
393 return gfx::Rect(default_size_); | 418 return gfx::Rect(default_size_); |
394 | 419 |
395 gfx::Size size = content_view_core_->GetViewportSizeDip(); | 420 gfx::Size size = content_view_core_->GetViewportSizeDip(); |
396 gfx::Size offset = content_view_core_->GetViewportSizeOffsetDip(); | 421 gfx::Size offset = content_view_core_->GetViewportSizeOffsetDip(); |
397 size.Enlarge(-offset.width(), -offset.height()); | 422 size.Enlarge(-offset.width(), -offset.height()); |
398 | 423 |
(...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
748 delegated_renderer_layer_->SetContentsOpaque(true); | 773 delegated_renderer_layer_->SetContentsOpaque(true); |
749 delegated_renderer_layer_->SetBounds(content_size_in_layer_); | 774 delegated_renderer_layer_->SetBounds(content_size_in_layer_); |
750 delegated_renderer_layer_->SetNeedsDisplay(); | 775 delegated_renderer_layer_->SetNeedsDisplay(); |
751 } | 776 } |
752 | 777 |
753 base::Closure ack_callback = | 778 base::Closure ack_callback = |
754 base::Bind(&RenderWidgetHostViewAndroid::SendDelegatedFrameAck, | 779 base::Bind(&RenderWidgetHostViewAndroid::SendDelegatedFrameAck, |
755 weak_ptr_factory_.GetWeakPtr(), | 780 weak_ptr_factory_.GetWeakPtr(), |
756 output_surface_id); | 781 output_surface_id); |
757 | 782 |
783 ack_callbacks_.push(ack_callback); | |
758 if (host_->is_hidden()) | 784 if (host_->is_hidden()) |
759 ack_callback.Run(); | 785 RunAckCallbacks(); |
760 else | |
761 ack_callbacks_.push(ack_callback); | |
762 } | 786 } |
763 | 787 |
764 void RenderWidgetHostViewAndroid::ComputeContentsSize( | 788 void RenderWidgetHostViewAndroid::ComputeContentsSize( |
765 const cc::CompositorFrameMetadata& frame_metadata) { | 789 const cc::CompositorFrameMetadata& frame_metadata) { |
766 // Calculate the content size. This should be 0 if the texture_size is 0. | 790 // Calculate the content size. This should be 0 if the texture_size is 0. |
767 gfx::Vector2dF offset; | 791 gfx::Vector2dF offset; |
768 if (texture_size_in_layer_.GetArea() > 0) | 792 if (texture_size_in_layer_.GetArea() > 0) |
769 offset = frame_metadata.location_bar_content_translation; | 793 offset = frame_metadata.location_bar_content_translation; |
770 offset.set_y(offset.y() + frame_metadata.overdraw_bottom_height); | 794 offset.set_y(offset.y() + frame_metadata.overdraw_bottom_height); |
771 offset.Scale(frame_metadata.device_scale_factor); | 795 offset.Scale(frame_metadata.device_scale_factor); |
772 content_size_in_layer_ = | 796 content_size_in_layer_ = |
773 gfx::Size(texture_size_in_layer_.width() - offset.x(), | 797 gfx::Size(texture_size_in_layer_.width() - offset.x(), |
774 texture_size_in_layer_.height() - offset.y()); | 798 texture_size_in_layer_.height() - offset.y()); |
775 // Content size changes should be reflected in associated animation effects. | 799 // Content size changes should be reflected in associated animation effects. |
776 UpdateAnimationSize(frame_metadata); | 800 UpdateAnimationSize(frame_metadata); |
777 } | 801 } |
778 | 802 |
779 void RenderWidgetHostViewAndroid::OnSwapCompositorFrame( | 803 void RenderWidgetHostViewAndroid::InternalSwapCompositorFrame( |
780 uint32 output_surface_id, | 804 uint32 output_surface_id, |
781 scoped_ptr<cc::CompositorFrame> frame) { | 805 scoped_ptr<cc::CompositorFrame> frame) { |
806 if (locks_on_frame_count_ > 0) { | |
807 DCHECK(HasValidFrame()); | |
808 RetainFrame(output_surface_id, frame.Pass()); | |
809 return; | |
810 } | |
811 | |
782 // Always let ContentViewCore know about the new frame first, so it can decide | 812 // Always let ContentViewCore know about the new frame first, so it can decide |
783 // to schedule a Draw immediately when it sees the texture layer invalidation. | 813 // to schedule a Draw immediately when it sees the texture layer invalidation. |
784 UpdateContentViewCoreFrameMetadata(frame->metadata); | 814 UpdateContentViewCoreFrameMetadata(frame->metadata); |
785 | 815 |
786 if (layer_ && layer_->layer_tree_host()) { | 816 if (layer_ && layer_->layer_tree_host()) { |
787 for (size_t i = 0; i < frame->metadata.latency_info.size(); i++) { | 817 for (size_t i = 0; i < frame->metadata.latency_info.size(); i++) { |
788 scoped_ptr<cc::SwapPromise> swap_promise( | 818 scoped_ptr<cc::SwapPromise> swap_promise( |
789 new cc::LatencyInfoSwapPromise(frame->metadata.latency_info[i])); | 819 new cc::LatencyInfoSwapPromise(frame->metadata.latency_info[i])); |
790 layer_->layer_tree_host()->QueueSwapPromise(swap_promise.Pass()); | 820 layer_->layer_tree_host()->QueueSwapPromise(swap_promise.Pass()); |
791 } | 821 } |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
826 ImageTransportFactoryAndroid::GetInstance()->WaitSyncPoint( | 856 ImageTransportFactoryAndroid::GetInstance()->WaitSyncPoint( |
827 frame->gl_frame_data->sync_point); | 857 frame->gl_frame_data->sync_point); |
828 | 858 |
829 texture_size_in_layer_ = frame->gl_frame_data->size; | 859 texture_size_in_layer_ = frame->gl_frame_data->size; |
830 ComputeContentsSize(frame->metadata); | 860 ComputeContentsSize(frame->metadata); |
831 | 861 |
832 BuffersSwapped(frame->gl_frame_data->mailbox, output_surface_id, callback); | 862 BuffersSwapped(frame->gl_frame_data->mailbox, output_surface_id, callback); |
833 frame_evictor_->SwappedFrame(!host_->is_hidden()); | 863 frame_evictor_->SwappedFrame(!host_->is_hidden()); |
834 } | 864 } |
835 | 865 |
866 void RenderWidgetHostViewAndroid::OnSwapCompositorFrame( | |
867 uint32 output_surface_id, | |
868 scoped_ptr<cc::CompositorFrame> frame) { | |
869 InternalSwapCompositorFrame(output_surface_id, frame.Pass()); | |
870 } | |
871 | |
872 void RenderWidgetHostViewAndroid::RetainFrame( | |
873 uint32 output_surface_id, | |
874 scoped_ptr<cc::CompositorFrame> frame) { | |
875 DCHECK(locks_on_frame_count_); | |
876 | |
877 // Store the incoming frame so that it can be swapped when all the locks have | |
878 // been released. If there is already a stored frame, then send | |
879 // acknowledgement and drop it. | |
no sievers
2014/03/19 19:22:26
nit: comment, 'If there is already a stored frame,
powei
2014/03/19 21:14:08
Done.
| |
880 if (last_frame_info_) { | |
881 base::Closure ack_callback = | |
882 base::Bind(&RenderWidgetHostViewAndroid::SendDelegatedFrameAck, | |
883 weak_ptr_factory_.GetWeakPtr(), | |
884 last_frame_info_->output_surface_id); | |
885 | |
886 ack_callbacks_.push(ack_callback); | |
887 } | |
888 | |
889 last_frame_info_.reset(new LastFrameInfo(output_surface_id, frame.Pass())); | |
890 } | |
891 | |
836 void RenderWidgetHostViewAndroid::SynchronousFrameMetadata( | 892 void RenderWidgetHostViewAndroid::SynchronousFrameMetadata( |
837 const cc::CompositorFrameMetadata& frame_metadata) { | 893 const cc::CompositorFrameMetadata& frame_metadata) { |
838 // This is a subset of OnSwapCompositorFrame() used in the synchronous | 894 // This is a subset of OnSwapCompositorFrame() used in the synchronous |
839 // compositor flow. | 895 // compositor flow. |
840 UpdateContentViewCoreFrameMetadata(frame_metadata); | 896 UpdateContentViewCoreFrameMetadata(frame_metadata); |
841 ComputeContentsSize(frame_metadata); | 897 ComputeContentsSize(frame_metadata); |
842 | 898 |
843 // DevTools ScreenCast support for Android WebView. | 899 // DevTools ScreenCast support for Android WebView. |
844 if (DevToolsAgentHost::HasFor(RenderViewHost::From(GetRenderWidgetHost()))) { | 900 if (DevToolsAgentHost::HasFor(RenderViewHost::From(GetRenderWidgetHost()))) { |
845 scoped_refptr<DevToolsAgentHost> dtah = | 901 scoped_refptr<DevToolsAgentHost> dtah = |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
925 texture_layer_->SetIsDrawable(true); | 981 texture_layer_->SetIsDrawable(true); |
926 texture_layer_->SetContentsOpaque(true); | 982 texture_layer_->SetContentsOpaque(true); |
927 } | 983 } |
928 | 984 |
929 ImageTransportFactoryAndroid::GetInstance()->AcquireTexture( | 985 ImageTransportFactoryAndroid::GetInstance()->AcquireTexture( |
930 texture_id_in_layer_, mailbox.name); | 986 texture_id_in_layer_, mailbox.name); |
931 | 987 |
932 current_mailbox_ = mailbox; | 988 current_mailbox_ = mailbox; |
933 last_output_surface_id_ = output_surface_id; | 989 last_output_surface_id_ = output_surface_id; |
934 | 990 |
991 ack_callbacks_.push(ack_callback); | |
935 if (host_->is_hidden()) | 992 if (host_->is_hidden()) |
936 ack_callback.Run(); | 993 RunAckCallbacks(); |
937 else | |
938 ack_callbacks_.push(ack_callback); | |
939 } | 994 } |
940 | 995 |
941 void RenderWidgetHostViewAndroid::AttachLayers() { | 996 void RenderWidgetHostViewAndroid::AttachLayers() { |
942 if (!content_view_core_) | 997 if (!content_view_core_) |
943 return; | 998 return; |
944 if (!layer_.get()) | 999 if (!layer_.get()) |
945 return; | 1000 return; |
946 | 1001 |
947 content_view_core_->AttachLayer(layer_); | 1002 content_view_core_->AttachLayer(layer_); |
948 if (overscroll_effect_enabled_) | 1003 if (overscroll_effect_enabled_) |
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1242 } | 1297 } |
1243 | 1298 |
1244 void RenderWidgetHostViewAndroid::SetContentViewCore( | 1299 void RenderWidgetHostViewAndroid::SetContentViewCore( |
1245 ContentViewCoreImpl* content_view_core) { | 1300 ContentViewCoreImpl* content_view_core) { |
1246 RunAckCallbacks(); | 1301 RunAckCallbacks(); |
1247 | 1302 |
1248 RemoveLayers(); | 1303 RemoveLayers(); |
1249 if (content_view_core_ && !using_synchronous_compositor_) | 1304 if (content_view_core_ && !using_synchronous_compositor_) |
1250 content_view_core_->GetWindowAndroid()->RemoveObserver(this); | 1305 content_view_core_->GetWindowAndroid()->RemoveObserver(this); |
1251 | 1306 |
1307 if (content_view_core != content_view_core_) | |
1308 ReleaseLocksOnSurface(); | |
1309 | |
1252 content_view_core_ = content_view_core; | 1310 content_view_core_ = content_view_core; |
1253 | 1311 |
1254 if (GetBrowserAccessibilityManager()) { | 1312 if (GetBrowserAccessibilityManager()) { |
1255 base::android::ScopedJavaLocalRef<jobject> obj; | 1313 base::android::ScopedJavaLocalRef<jobject> obj; |
1256 if (content_view_core_) | 1314 if (content_view_core_) |
1257 obj = content_view_core_->GetJavaObject(); | 1315 obj = content_view_core_->GetJavaObject(); |
1258 GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerAndroid()-> | 1316 GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerAndroid()-> |
1259 SetContentViewCore(obj); | 1317 SetContentViewCore(obj); |
1260 } | 1318 } |
1261 | 1319 |
(...skipping 13 matching lines...) Expand all Loading... | |
1275 RunAckCallbacks(); | 1333 RunAckCallbacks(); |
1276 } | 1334 } |
1277 | 1335 |
1278 void RenderWidgetHostViewAndroid::OnDetachCompositor() { | 1336 void RenderWidgetHostViewAndroid::OnDetachCompositor() { |
1279 DCHECK(content_view_core_); | 1337 DCHECK(content_view_core_); |
1280 DCHECK(!using_synchronous_compositor_); | 1338 DCHECK(!using_synchronous_compositor_); |
1281 RunAckCallbacks(); | 1339 RunAckCallbacks(); |
1282 } | 1340 } |
1283 | 1341 |
1284 void RenderWidgetHostViewAndroid::OnLostResources() { | 1342 void RenderWidgetHostViewAndroid::OnLostResources() { |
1343 ReleaseLocksOnSurface(); | |
1285 if (texture_layer_.get()) | 1344 if (texture_layer_.get()) |
1286 texture_layer_->SetIsDrawable(false); | 1345 texture_layer_->SetIsDrawable(false); |
1287 if (delegated_renderer_layer_.get()) | 1346 if (delegated_renderer_layer_.get()) |
1288 DestroyDelegatedContent(); | 1347 DestroyDelegatedContent(); |
1289 texture_id_in_layer_ = 0; | 1348 texture_id_in_layer_ = 0; |
1290 RunAckCallbacks(); | 1349 RunAckCallbacks(); |
1291 } | 1350 } |
1292 | 1351 |
1293 // static | 1352 // static |
1294 void RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult( | 1353 void RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult( |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1421 // RenderWidgetHostView, public: | 1480 // RenderWidgetHostView, public: |
1422 | 1481 |
1423 // static | 1482 // static |
1424 RenderWidgetHostView* | 1483 RenderWidgetHostView* |
1425 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { | 1484 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { |
1426 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); | 1485 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); |
1427 return new RenderWidgetHostViewAndroid(rwhi, NULL); | 1486 return new RenderWidgetHostViewAndroid(rwhi, NULL); |
1428 } | 1487 } |
1429 | 1488 |
1430 } // namespace content | 1489 } // namespace content |
OLD | NEW |