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

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: fix android clang bot try 2 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 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
116 0, 116 0,
117 0, 117 0,
118 base::TimeTicks() + base::TimeDelta::FromMicroseconds(time_micros), 118 base::TimeTicks() + base::TimeDelta::FromMicroseconds(time_micros),
119 1); 119 1);
120 } 120 }
121 return latency_info; 121 return latency_info;
122 } 122 }
123 123
124 } // anonymous namespace 124 } // anonymous namespace
125 125
126 RenderWidgetHostViewAndroid::LastFrameInfo::LastFrameInfo(
127 uint32 output_id,
128 scoped_ptr<cc::CompositorFrame> output_frame)
129 : output_surface_id(output_id), frame(output_frame.Pass()) {}
130
131 RenderWidgetHostViewAndroid::LastFrameInfo::~LastFrameInfo() {}
132
126 RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( 133 RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid(
127 RenderWidgetHostImpl* widget_host, 134 RenderWidgetHostImpl* widget_host,
128 ContentViewCoreImpl* content_view_core) 135 ContentViewCoreImpl* content_view_core)
129 : host_(widget_host), 136 : host_(widget_host),
130 needs_begin_frame_(false), 137 needs_begin_frame_(false),
131 is_showing_(!widget_host->is_hidden()), 138 is_showing_(!widget_host->is_hidden()),
132 content_view_core_(NULL), 139 content_view_core_(NULL),
133 ime_adapter_android_(this), 140 ime_adapter_android_(this),
134 cached_background_color_(SK_ColorWHITE), 141 cached_background_color_(SK_ColorWHITE),
135 texture_id_in_layer_(0), 142 texture_id_in_layer_(0),
136 last_output_surface_id_(kUndefinedOutputSurfaceId), 143 last_output_surface_id_(kUndefinedOutputSurfaceId),
137 weak_ptr_factory_(this), 144 weak_ptr_factory_(this),
138 overscroll_effect_enabled_( 145 overscroll_effect_enabled_(!CommandLine::ForCurrentProcess()->HasSwitch(
139 !CommandLine::ForCurrentProcess()-> 146 switches::kDisableOverscrollEdgeEffect)),
140 HasSwitch(switches::kDisableOverscrollEdgeEffect)),
141 overscroll_effect_(OverscrollGlow::Create(overscroll_effect_enabled_)), 147 overscroll_effect_(OverscrollGlow::Create(overscroll_effect_enabled_)),
142 flush_input_requested_(false), 148 flush_input_requested_(false),
143 accelerated_surface_route_id_(0), 149 accelerated_surface_route_id_(0),
144 using_synchronous_compositor_(SynchronousCompositorImpl::FromID( 150 using_synchronous_compositor_(SynchronousCompositorImpl::FromID(
145 widget_host->GetProcess()->GetID(), 151 widget_host->GetProcess()->GetID(),
146 widget_host->GetRoutingID()) != NULL), 152 widget_host->GetRoutingID()) != NULL),
147 frame_evictor_(new DelegatedFrameEvictor(this)), 153 frame_evictor_(new DelegatedFrameEvictor(this)),
148 using_delegated_renderer_(CommandLine::ForCurrentProcess()->HasSwitch( 154 using_delegated_renderer_(CommandLine::ForCurrentProcess()->HasSwitch(
149 switches::kEnableDelegatedRenderer) && 155 switches::kEnableDelegatedRenderer) &&
150 !CommandLine::ForCurrentProcess()->HasSwitch( 156 !CommandLine::ForCurrentProcess()->HasSwitch(
151 switches::kDisableDelegatedRenderer)) { 157 switches::kDisableDelegatedRenderer)),
158 locks_on_frame_count_(0) {
152 if (!using_delegated_renderer_) { 159 if (!using_delegated_renderer_) {
153 texture_layer_ = cc::TextureLayer::Create(NULL); 160 texture_layer_ = cc::TextureLayer::Create(NULL);
154 layer_ = texture_layer_; 161 layer_ = texture_layer_;
155 } 162 }
156 163
157 host_->SetView(this); 164 host_->SetView(this);
158 SetContentViewCore(content_view_core); 165 SetContentViewCore(content_view_core);
159 ImageTransportFactoryAndroid::AddObserver(this); 166 ImageTransportFactoryAndroid::AddObserver(this);
160 } 167 }
161 168
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
279 286
280 bool RenderWidgetHostViewAndroid::HasValidFrame() const { 287 bool RenderWidgetHostViewAndroid::HasValidFrame() const {
281 if (!content_view_core_) 288 if (!content_view_core_)
282 return false; 289 return false;
283 if (!layer_) 290 if (!layer_)
284 return false; 291 return false;
285 292
286 if (texture_size_in_layer_.IsEmpty()) 293 if (texture_size_in_layer_.IsEmpty())
287 return false; 294 return false;
288 295
296 if (!frame_evictor_->HasFrame())
297 return false;
298
289 if (using_delegated_renderer_) { 299 if (using_delegated_renderer_) {
290 if (!delegated_renderer_layer_.get()) 300 if (!delegated_renderer_layer_.get())
291 return false; 301 return false;
292 } else { 302 } else {
293 if (texture_id_in_layer_ == 0) 303 if (texture_id_in_layer_ == 0)
294 return false; 304 return false;
295 } 305 }
296 306
297 return true; 307 return true;
298 } 308 }
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
369 WasHidden(); 379 WasHidden();
370 } 380 }
371 381
372 bool RenderWidgetHostViewAndroid::IsShowing() { 382 bool RenderWidgetHostViewAndroid::IsShowing() {
373 // ContentViewCoreImpl represents the native side of the Java 383 // ContentViewCoreImpl represents the native side of the Java
374 // ContentViewCore. It being NULL means that it is not attached 384 // ContentViewCore. It being NULL means that it is not attached
375 // to the View system yet, so we treat this RWHVA as hidden. 385 // to the View system yet, so we treat this RWHVA as hidden.
376 return is_showing_ && content_view_core_; 386 return is_showing_ && content_view_core_;
377 } 387 }
378 388
379 void RenderWidgetHostViewAndroid::LockResources() { 389 void RenderWidgetHostViewAndroid::LockCompositingSurface() {
380 DCHECK(HasValidFrame()); 390 DCHECK(HasValidFrame());
381 DCHECK(host_); 391 DCHECK(host_);
382 DCHECK(!host_->is_hidden()); 392 DCHECK(frame_evictor_->HasFrame());
383 frame_evictor_->LockFrame(); 393 frame_evictor_->LockFrame();
394 locks_on_frame_count_++;
384 } 395 }
385 396
386 void RenderWidgetHostViewAndroid::UnlockResources() { 397 void RenderWidgetHostViewAndroid::UnlockCompositingSurface() {
398 if (!frame_evictor_->HasFrame() || locks_on_frame_count_ == 0)
399 return;
400
387 DCHECK(HasValidFrame()); 401 DCHECK(HasValidFrame());
388 frame_evictor_->UnlockFrame(); 402 frame_evictor_->UnlockFrame();
403 locks_on_frame_count_--;
404
405 if (locks_on_frame_count_ == 0 && last_frame_info_) {
406 InternalSwapCompositorFrame(last_frame_info_->output_surface_id,
407 last_frame_info_->frame.Pass());
408 last_frame_info_.reset();
409 }
410 }
411
412 void RenderWidgetHostViewAndroid::ReleaseLocksOnSurface() {
413 if (!frame_evictor_->HasFrame()) {
414 DCHECK_EQ(locks_on_frame_count_, 0u);
415 return;
416 }
417 while (locks_on_frame_count_ > 0) {
418 UnlockCompositingSurface();
419 }
389 } 420 }
390 421
391 gfx::Rect RenderWidgetHostViewAndroid::GetViewBounds() const { 422 gfx::Rect RenderWidgetHostViewAndroid::GetViewBounds() const {
392 if (!content_view_core_) 423 if (!content_view_core_)
393 return gfx::Rect(default_size_); 424 return gfx::Rect(default_size_);
394 425
395 gfx::Size size = content_view_core_->GetViewportSizeDip(); 426 gfx::Size size = content_view_core_->GetViewportSizeDip();
396 gfx::Size offset = content_view_core_->GetViewportSizeOffsetDip(); 427 gfx::Size offset = content_view_core_->GetViewportSizeOffsetDip();
397 size.Enlarge(-offset.width(), -offset.height()); 428 size.Enlarge(-offset.width(), -offset.height());
398 429
(...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after
748 delegated_renderer_layer_->SetContentsOpaque(true); 779 delegated_renderer_layer_->SetContentsOpaque(true);
749 delegated_renderer_layer_->SetBounds(content_size_in_layer_); 780 delegated_renderer_layer_->SetBounds(content_size_in_layer_);
750 delegated_renderer_layer_->SetNeedsDisplay(); 781 delegated_renderer_layer_->SetNeedsDisplay();
751 } 782 }
752 783
753 base::Closure ack_callback = 784 base::Closure ack_callback =
754 base::Bind(&RenderWidgetHostViewAndroid::SendDelegatedFrameAck, 785 base::Bind(&RenderWidgetHostViewAndroid::SendDelegatedFrameAck,
755 weak_ptr_factory_.GetWeakPtr(), 786 weak_ptr_factory_.GetWeakPtr(),
756 output_surface_id); 787 output_surface_id);
757 788
789 ack_callbacks_.push(ack_callback);
758 if (host_->is_hidden()) 790 if (host_->is_hidden())
759 ack_callback.Run(); 791 RunAckCallbacks();
760 else
761 ack_callbacks_.push(ack_callback);
762 } 792 }
763 793
764 void RenderWidgetHostViewAndroid::ComputeContentsSize( 794 void RenderWidgetHostViewAndroid::ComputeContentsSize(
765 const cc::CompositorFrameMetadata& frame_metadata) { 795 const cc::CompositorFrameMetadata& frame_metadata) {
766 // Calculate the content size. This should be 0 if the texture_size is 0. 796 // Calculate the content size. This should be 0 if the texture_size is 0.
767 gfx::Vector2dF offset; 797 gfx::Vector2dF offset;
768 if (texture_size_in_layer_.GetArea() > 0) 798 if (texture_size_in_layer_.GetArea() > 0)
769 offset = frame_metadata.location_bar_content_translation; 799 offset = frame_metadata.location_bar_content_translation;
770 offset.set_y(offset.y() + frame_metadata.overdraw_bottom_height); 800 offset.set_y(offset.y() + frame_metadata.overdraw_bottom_height);
771 offset.Scale(frame_metadata.device_scale_factor); 801 offset.Scale(frame_metadata.device_scale_factor);
772 content_size_in_layer_ = 802 content_size_in_layer_ =
773 gfx::Size(texture_size_in_layer_.width() - offset.x(), 803 gfx::Size(texture_size_in_layer_.width() - offset.x(),
774 texture_size_in_layer_.height() - offset.y()); 804 texture_size_in_layer_.height() - offset.y());
775 // Content size changes should be reflected in associated animation effects. 805 // Content size changes should be reflected in associated animation effects.
776 UpdateAnimationSize(frame_metadata); 806 UpdateAnimationSize(frame_metadata);
777 } 807 }
778 808
779 void RenderWidgetHostViewAndroid::OnSwapCompositorFrame( 809 void RenderWidgetHostViewAndroid::InternalSwapCompositorFrame(
780 uint32 output_surface_id, 810 uint32 output_surface_id,
781 scoped_ptr<cc::CompositorFrame> frame) { 811 scoped_ptr<cc::CompositorFrame> frame) {
812 if (locks_on_frame_count_ > 0) {
813 DCHECK(HasValidFrame());
814 RetainFrame(output_surface_id, frame.Pass());
815 return;
816 }
817
782 // Always let ContentViewCore know about the new frame first, so it can decide 818 // 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. 819 // to schedule a Draw immediately when it sees the texture layer invalidation.
784 UpdateContentViewCoreFrameMetadata(frame->metadata); 820 UpdateContentViewCoreFrameMetadata(frame->metadata);
785 821
786 if (layer_ && layer_->layer_tree_host()) { 822 if (layer_ && layer_->layer_tree_host()) {
787 for (size_t i = 0; i < frame->metadata.latency_info.size(); i++) { 823 for (size_t i = 0; i < frame->metadata.latency_info.size(); i++) {
788 scoped_ptr<cc::SwapPromise> swap_promise( 824 scoped_ptr<cc::SwapPromise> swap_promise(
789 new cc::LatencyInfoSwapPromise(frame->metadata.latency_info[i])); 825 new cc::LatencyInfoSwapPromise(frame->metadata.latency_info[i]));
790 layer_->layer_tree_host()->QueueSwapPromise(swap_promise.Pass()); 826 layer_->layer_tree_host()->QueueSwapPromise(swap_promise.Pass());
791 } 827 }
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
826 ImageTransportFactoryAndroid::GetInstance()->WaitSyncPoint( 862 ImageTransportFactoryAndroid::GetInstance()->WaitSyncPoint(
827 frame->gl_frame_data->sync_point); 863 frame->gl_frame_data->sync_point);
828 864
829 texture_size_in_layer_ = frame->gl_frame_data->size; 865 texture_size_in_layer_ = frame->gl_frame_data->size;
830 ComputeContentsSize(frame->metadata); 866 ComputeContentsSize(frame->metadata);
831 867
832 BuffersSwapped(frame->gl_frame_data->mailbox, output_surface_id, callback); 868 BuffersSwapped(frame->gl_frame_data->mailbox, output_surface_id, callback);
833 frame_evictor_->SwappedFrame(!host_->is_hidden()); 869 frame_evictor_->SwappedFrame(!host_->is_hidden());
834 } 870 }
835 871
872 void RenderWidgetHostViewAndroid::OnSwapCompositorFrame(
873 uint32 output_surface_id,
874 scoped_ptr<cc::CompositorFrame> frame) {
875 InternalSwapCompositorFrame(output_surface_id, frame.Pass());
876 }
877
878 void RenderWidgetHostViewAndroid::RetainFrame(
879 uint32 output_surface_id,
880 scoped_ptr<cc::CompositorFrame> frame) {
881 DCHECK(locks_on_frame_count_);
882
883 // Store the incoming frame so that it can be swapped when all the locks have
884 // been released. If there is already a stored frame, then replace and skip
885 // the previous one but make sure we still eventually send the ACK. Holding
886 // the ACK also blocks the renderer when its max_frames_pending is reached.
887 if (last_frame_info_) {
888 base::Closure ack_callback =
889 base::Bind(&RenderWidgetHostViewAndroid::SendDelegatedFrameAck,
890 weak_ptr_factory_.GetWeakPtr(),
891 last_frame_info_->output_surface_id);
892
893 ack_callbacks_.push(ack_callback);
894 }
895
896 last_frame_info_.reset(new LastFrameInfo(output_surface_id, frame.Pass()));
897 }
898
836 void RenderWidgetHostViewAndroid::SynchronousFrameMetadata( 899 void RenderWidgetHostViewAndroid::SynchronousFrameMetadata(
837 const cc::CompositorFrameMetadata& frame_metadata) { 900 const cc::CompositorFrameMetadata& frame_metadata) {
838 // This is a subset of OnSwapCompositorFrame() used in the synchronous 901 // This is a subset of OnSwapCompositorFrame() used in the synchronous
839 // compositor flow. 902 // compositor flow.
840 UpdateContentViewCoreFrameMetadata(frame_metadata); 903 UpdateContentViewCoreFrameMetadata(frame_metadata);
841 ComputeContentsSize(frame_metadata); 904 ComputeContentsSize(frame_metadata);
842 905
843 // DevTools ScreenCast support for Android WebView. 906 // DevTools ScreenCast support for Android WebView.
844 if (DevToolsAgentHost::HasFor(RenderViewHost::From(GetRenderWidgetHost()))) { 907 if (DevToolsAgentHost::HasFor(RenderViewHost::From(GetRenderWidgetHost()))) {
845 scoped_refptr<DevToolsAgentHost> dtah = 908 scoped_refptr<DevToolsAgentHost> dtah =
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
925 texture_layer_->SetIsDrawable(true); 988 texture_layer_->SetIsDrawable(true);
926 texture_layer_->SetContentsOpaque(true); 989 texture_layer_->SetContentsOpaque(true);
927 } 990 }
928 991
929 ImageTransportFactoryAndroid::GetInstance()->AcquireTexture( 992 ImageTransportFactoryAndroid::GetInstance()->AcquireTexture(
930 texture_id_in_layer_, mailbox.name); 993 texture_id_in_layer_, mailbox.name);
931 994
932 current_mailbox_ = mailbox; 995 current_mailbox_ = mailbox;
933 last_output_surface_id_ = output_surface_id; 996 last_output_surface_id_ = output_surface_id;
934 997
998 ack_callbacks_.push(ack_callback);
935 if (host_->is_hidden()) 999 if (host_->is_hidden())
936 ack_callback.Run(); 1000 RunAckCallbacks();
937 else
938 ack_callbacks_.push(ack_callback);
939 } 1001 }
940 1002
941 void RenderWidgetHostViewAndroid::AttachLayers() { 1003 void RenderWidgetHostViewAndroid::AttachLayers() {
942 if (!content_view_core_) 1004 if (!content_view_core_)
943 return; 1005 return;
944 if (!layer_.get()) 1006 if (!layer_.get())
945 return; 1007 return;
946 1008
947 content_view_core_->AttachLayer(layer_); 1009 content_view_core_->AttachLayer(layer_);
948 if (overscroll_effect_enabled_) 1010 if (overscroll_effect_enabled_)
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after
1242 } 1304 }
1243 1305
1244 void RenderWidgetHostViewAndroid::SetContentViewCore( 1306 void RenderWidgetHostViewAndroid::SetContentViewCore(
1245 ContentViewCoreImpl* content_view_core) { 1307 ContentViewCoreImpl* content_view_core) {
1246 RunAckCallbacks(); 1308 RunAckCallbacks();
1247 1309
1248 RemoveLayers(); 1310 RemoveLayers();
1249 if (content_view_core_ && !using_synchronous_compositor_) 1311 if (content_view_core_ && !using_synchronous_compositor_)
1250 content_view_core_->GetWindowAndroid()->RemoveObserver(this); 1312 content_view_core_->GetWindowAndroid()->RemoveObserver(this);
1251 1313
1314 if (content_view_core != content_view_core_)
1315 ReleaseLocksOnSurface();
1316
1252 content_view_core_ = content_view_core; 1317 content_view_core_ = content_view_core;
1253 1318
1254 if (GetBrowserAccessibilityManager()) { 1319 if (GetBrowserAccessibilityManager()) {
1255 base::android::ScopedJavaLocalRef<jobject> obj; 1320 base::android::ScopedJavaLocalRef<jobject> obj;
1256 if (content_view_core_) 1321 if (content_view_core_)
1257 obj = content_view_core_->GetJavaObject(); 1322 obj = content_view_core_->GetJavaObject();
1258 GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerAndroid()-> 1323 GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerAndroid()->
1259 SetContentViewCore(obj); 1324 SetContentViewCore(obj);
1260 } 1325 }
1261 1326
(...skipping 13 matching lines...) Expand all
1275 RunAckCallbacks(); 1340 RunAckCallbacks();
1276 } 1341 }
1277 1342
1278 void RenderWidgetHostViewAndroid::OnDetachCompositor() { 1343 void RenderWidgetHostViewAndroid::OnDetachCompositor() {
1279 DCHECK(content_view_core_); 1344 DCHECK(content_view_core_);
1280 DCHECK(!using_synchronous_compositor_); 1345 DCHECK(!using_synchronous_compositor_);
1281 RunAckCallbacks(); 1346 RunAckCallbacks();
1282 } 1347 }
1283 1348
1284 void RenderWidgetHostViewAndroid::OnLostResources() { 1349 void RenderWidgetHostViewAndroid::OnLostResources() {
1350 ReleaseLocksOnSurface();
1285 if (texture_layer_.get()) 1351 if (texture_layer_.get())
1286 texture_layer_->SetIsDrawable(false); 1352 texture_layer_->SetIsDrawable(false);
1287 if (delegated_renderer_layer_.get()) 1353 if (delegated_renderer_layer_.get())
1288 DestroyDelegatedContent(); 1354 DestroyDelegatedContent();
1289 texture_id_in_layer_ = 0; 1355 texture_id_in_layer_ = 0;
1290 RunAckCallbacks(); 1356 RunAckCallbacks();
1291 } 1357 }
1292 1358
1293 // static 1359 // static
1294 void RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult( 1360 void RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult(
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
1421 // RenderWidgetHostView, public: 1487 // RenderWidgetHostView, public:
1422 1488
1423 // static 1489 // static
1424 RenderWidgetHostView* 1490 RenderWidgetHostView*
1425 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { 1491 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) {
1426 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); 1492 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget);
1427 return new RenderWidgetHostViewAndroid(rwhi, NULL); 1493 return new RenderWidgetHostViewAndroid(rwhi, NULL);
1428 } 1494 }
1429 1495
1430 } // namespace content 1496 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698