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

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/basictypes.h" 9 #include "base/basictypes.h"
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after
278 278
279 bool RenderWidgetHostViewAndroid::HasValidFrame() const { 279 bool RenderWidgetHostViewAndroid::HasValidFrame() const {
280 if (!content_view_core_) 280 if (!content_view_core_)
281 return false; 281 return false;
282 if (!layer_) 282 if (!layer_)
283 return false; 283 return false;
284 284
285 if (texture_size_in_layer_.IsEmpty()) 285 if (texture_size_in_layer_.IsEmpty())
286 return false; 286 return false;
287 287
288 if (!frame_evictor_->HasFrame())
289 return false;
290
288 if (using_delegated_renderer_) { 291 if (using_delegated_renderer_) {
289 if (!delegated_renderer_layer_.get()) 292 if (!delegated_renderer_layer_.get())
290 return false; 293 return false;
291 } else { 294 } else {
292 if (texture_id_in_layer_ == 0) 295 if (texture_id_in_layer_ == 0)
293 return false; 296 return false;
294 } 297 }
295 298
296 return true; 299 return true;
297 } 300 }
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
368 WasHidden(); 371 WasHidden();
369 } 372 }
370 373
371 bool RenderWidgetHostViewAndroid::IsShowing() { 374 bool RenderWidgetHostViewAndroid::IsShowing() {
372 // ContentViewCoreImpl represents the native side of the Java 375 // ContentViewCoreImpl represents the native side of the Java
373 // ContentViewCore. It being NULL means that it is not attached 376 // ContentViewCore. It being NULL means that it is not attached
374 // to the View system yet, so we treat this RWHVA as hidden. 377 // to the View system yet, so we treat this RWHVA as hidden.
375 return is_showing_ && content_view_core_; 378 return is_showing_ && content_view_core_;
376 } 379 }
377 380
378 void RenderWidgetHostViewAndroid::LockResources() { 381 void RenderWidgetHostViewAndroid::LockSurfaceForCopy() {
379 DCHECK(HasValidFrame()); 382 DCHECK(HasValidFrame());
380 DCHECK(host_); 383 DCHECK(host_);
381 DCHECK(!host_->is_hidden()); 384 DCHECK(frame_evictor_->HasFrame());
382 frame_evictor_->LockFrame(); 385 frame_evictor_->LockFrame();
383 } 386 }
384 387
385 void RenderWidgetHostViewAndroid::UnlockResources() { 388 void RenderWidgetHostViewAndroid::UnlockSurfaceForCopy() {
389 if (!frame_evictor_->HasFrame())
390 return;
391
392 size_t target_lock_count = is_showing_ ? 1 : 0;
393 DCHECK_GE(frame_evictor_->FrameLockCount(), target_lock_count);
394 if (frame_evictor_->FrameLockCount() == target_lock_count)
piman 2014/03/04 19:09:55 This feels iffy. If some other code starts talkin
powei 2014/03/04 20:49:22 Done.
395 return;
396
386 DCHECK(HasValidFrame()); 397 DCHECK(HasValidFrame());
387 frame_evictor_->UnlockFrame(); 398 frame_evictor_->UnlockFrame();
388 } 399 }
389 400
401 void RenderWidgetHostViewAndroid::ReleaseLocksOnSurface() {
402 size_t target_lock_count = is_showing_ ? 1 : 0;
403 while (frame_evictor_->FrameLockCount() > target_lock_count ) {
404 UnlockSurfaceForCopy();
405 }
406 }
407
390 gfx::Rect RenderWidgetHostViewAndroid::GetViewBounds() const { 408 gfx::Rect RenderWidgetHostViewAndroid::GetViewBounds() const {
391 if (!content_view_core_) 409 if (!content_view_core_)
392 return gfx::Rect(default_size_); 410 return gfx::Rect(default_size_);
393 411
394 gfx::Size size = content_view_core_->GetViewportSizeDip(); 412 gfx::Size size = content_view_core_->GetViewportSizeDip();
395 gfx::Size offset = content_view_core_->GetViewportSizeOffsetDip(); 413 gfx::Size offset = content_view_core_->GetViewportSizeOffsetDip();
396 size.Enlarge(-offset.width(), -offset.height()); 414 size.Enlarge(-offset.width(), -offset.height());
397 415
398 return gfx::Rect(size); 416 return gfx::Rect(size);
399 } 417 }
(...skipping 401 matching lines...) Expand 10 before | Expand all | Expand 10 after
801 layer_->layer_tree_host()->QueueSwapPromise(swap_promise.Pass()); 819 layer_->layer_tree_host()->QueueSwapPromise(swap_promise.Pass());
802 } 820 }
803 } 821 }
804 822
805 if (frame->delegated_frame_data) { 823 if (frame->delegated_frame_data) {
806 DCHECK(using_delegated_renderer_); 824 DCHECK(using_delegated_renderer_);
807 825
808 DCHECK(frame->delegated_frame_data); 826 DCHECK(frame->delegated_frame_data);
809 DCHECK(!frame->delegated_frame_data->render_pass_list.empty()); 827 DCHECK(!frame->delegated_frame_data->render_pass_list.empty());
810 828
829 size_t target_lock_count = is_showing_ ? 1 : 0;
830 if (frame_evictor_->FrameLockCount() > target_lock_count) {
831 base::Closure ack_callback =
832 base::Bind(&RenderWidgetHostViewAndroid::SendDelegatedFrameAck,
833 weak_ptr_factory_.GetWeakPtr(),
834 output_surface_id);
835 if (host_->is_hidden())
836 ack_callback.Run();
837 else
838 ack_callbacks_.push(ack_callback);
839 return;
840 }
811 cc::RenderPass* root_pass = 841 cc::RenderPass* root_pass =
812 frame->delegated_frame_data->render_pass_list.back(); 842 frame->delegated_frame_data->render_pass_list.back();
813 texture_size_in_layer_ = root_pass->output_rect.size(); 843 texture_size_in_layer_ = root_pass->output_rect.size();
814 ComputeContentsSize(frame->metadata); 844 ComputeContentsSize(frame->metadata);
815 845
816 SwapDelegatedFrame(output_surface_id, frame->delegated_frame_data.Pass()); 846 SwapDelegatedFrame(output_surface_id, frame->delegated_frame_data.Pass());
817 frame_evictor_->SwappedFrame(!host_->is_hidden()); 847 frame_evictor_->SwappedFrame(!host_->is_hidden());
818 return; 848 return;
819 } 849 }
820 850
(...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after
1253 } 1283 }
1254 1284
1255 void RenderWidgetHostViewAndroid::SetContentViewCore( 1285 void RenderWidgetHostViewAndroid::SetContentViewCore(
1256 ContentViewCoreImpl* content_view_core) { 1286 ContentViewCoreImpl* content_view_core) {
1257 RunAckCallbacks(); 1287 RunAckCallbacks();
1258 1288
1259 RemoveLayers(); 1289 RemoveLayers();
1260 if (content_view_core_ && !using_synchronous_compositor_) 1290 if (content_view_core_ && !using_synchronous_compositor_)
1261 content_view_core_->GetWindowAndroid()->RemoveObserver(this); 1291 content_view_core_->GetWindowAndroid()->RemoveObserver(this);
1262 1292
1293 if (content_view_core != content_view_core_)
1294 ReleaseLocksOnSurface();
1295
1263 content_view_core_ = content_view_core; 1296 content_view_core_ = content_view_core;
1264 1297
1265 if (GetBrowserAccessibilityManager()) { 1298 if (GetBrowserAccessibilityManager()) {
1266 base::android::ScopedJavaLocalRef<jobject> obj; 1299 base::android::ScopedJavaLocalRef<jobject> obj;
1267 if (content_view_core_) 1300 if (content_view_core_)
1268 obj = content_view_core_->GetJavaObject(); 1301 obj = content_view_core_->GetJavaObject();
1269 GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerAndroid()-> 1302 GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerAndroid()->
1270 SetContentViewCore(obj); 1303 SetContentViewCore(obj);
1271 } 1304 }
1272 1305
(...skipping 13 matching lines...) Expand all
1286 RunAckCallbacks(); 1319 RunAckCallbacks();
1287 } 1320 }
1288 1321
1289 void RenderWidgetHostViewAndroid::OnDetachCompositor() { 1322 void RenderWidgetHostViewAndroid::OnDetachCompositor() {
1290 DCHECK(content_view_core_); 1323 DCHECK(content_view_core_);
1291 DCHECK(!using_synchronous_compositor_); 1324 DCHECK(!using_synchronous_compositor_);
1292 RunAckCallbacks(); 1325 RunAckCallbacks();
1293 } 1326 }
1294 1327
1295 void RenderWidgetHostViewAndroid::OnLostResources() { 1328 void RenderWidgetHostViewAndroid::OnLostResources() {
1329 ReleaseLocksOnSurface();
1296 if (texture_layer_.get()) 1330 if (texture_layer_.get())
1297 texture_layer_->SetIsDrawable(false); 1331 texture_layer_->SetIsDrawable(false);
1298 if (delegated_renderer_layer_.get()) 1332 if (delegated_renderer_layer_.get())
1299 DestroyDelegatedContent(); 1333 DestroyDelegatedContent();
1300 texture_id_in_layer_ = 0; 1334 texture_id_in_layer_ = 0;
1301 RunAckCallbacks(); 1335 RunAckCallbacks();
1302 } 1336 }
1303 1337
1304 // static 1338 // static
1305 void RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult( 1339 void RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult(
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
1410 // RenderWidgetHostView, public: 1444 // RenderWidgetHostView, public:
1411 1445
1412 // static 1446 // static
1413 RenderWidgetHostView* 1447 RenderWidgetHostView*
1414 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { 1448 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) {
1415 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); 1449 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget);
1416 return new RenderWidgetHostViewAndroid(rwhi, NULL); 1450 return new RenderWidgetHostViewAndroid(rwhi, NULL);
1417 } 1451 }
1418 1452
1419 } // namespace content 1453 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698