Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(362)

Side by Side Diff: content/browser/renderer_host/render_widget_host_view_android.cc

Issue 174323003: Expose locks for CopyFromCompositingSurface/CopyFromBackingStore API (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: addressed comments Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698