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

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 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
140 overscroll_effect_(OverscrollGlow::Create(overscroll_effect_enabled_)), 140 overscroll_effect_(OverscrollGlow::Create(overscroll_effect_enabled_)),
141 flush_input_requested_(false), 141 flush_input_requested_(false),
142 accelerated_surface_route_id_(0), 142 accelerated_surface_route_id_(0),
143 using_synchronous_compositor_(SynchronousCompositorImpl::FromID( 143 using_synchronous_compositor_(SynchronousCompositorImpl::FromID(
144 widget_host->GetProcess()->GetID(), 144 widget_host->GetProcess()->GetID(),
145 widget_host->GetRoutingID()) != NULL), 145 widget_host->GetRoutingID()) != NULL),
146 frame_evictor_(new DelegatedFrameEvictor(this)), 146 frame_evictor_(new DelegatedFrameEvictor(this)),
147 using_delegated_renderer_(CommandLine::ForCurrentProcess()->HasSwitch( 147 using_delegated_renderer_(CommandLine::ForCurrentProcess()->HasSwitch(
148 switches::kEnableDelegatedRenderer) && 148 switches::kEnableDelegatedRenderer) &&
149 !CommandLine::ForCurrentProcess()->HasSwitch( 149 !CommandLine::ForCurrentProcess()->HasSwitch(
150 switches::kDisableDelegatedRenderer)) { 150 switches::kDisableDelegatedRenderer)),
151 locks_on_frame_count_(0) {
151 if (!using_delegated_renderer_) { 152 if (!using_delegated_renderer_) {
152 texture_layer_ = cc::TextureLayer::Create(NULL); 153 texture_layer_ = cc::TextureLayer::Create(NULL);
153 layer_ = texture_layer_; 154 layer_ = texture_layer_;
154 } 155 }
155 156
156 host_->SetView(this); 157 host_->SetView(this);
157 SetContentViewCore(content_view_core); 158 SetContentViewCore(content_view_core);
158 ImageTransportFactoryAndroid::AddObserver(this); 159 ImageTransportFactoryAndroid::AddObserver(this);
159 } 160 }
160 161
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
278 279
279 bool RenderWidgetHostViewAndroid::HasValidFrame() const { 280 bool RenderWidgetHostViewAndroid::HasValidFrame() const {
280 if (!content_view_core_) 281 if (!content_view_core_)
281 return false; 282 return false;
282 if (!layer_) 283 if (!layer_)
283 return false; 284 return false;
284 285
285 if (texture_size_in_layer_.IsEmpty()) 286 if (texture_size_in_layer_.IsEmpty())
286 return false; 287 return false;
287 288
289 if (!frame_evictor_->HasFrame())
290 return false;
291
288 if (using_delegated_renderer_) { 292 if (using_delegated_renderer_) {
289 if (!delegated_renderer_layer_.get()) 293 if (!delegated_renderer_layer_.get())
290 return false; 294 return false;
291 } else { 295 } else {
292 if (texture_id_in_layer_ == 0) 296 if (texture_id_in_layer_ == 0)
293 return false; 297 return false;
294 } 298 }
295 299
296 return true; 300 return true;
297 } 301 }
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
368 WasHidden(); 372 WasHidden();
369 } 373 }
370 374
371 bool RenderWidgetHostViewAndroid::IsShowing() { 375 bool RenderWidgetHostViewAndroid::IsShowing() {
372 // ContentViewCoreImpl represents the native side of the Java 376 // ContentViewCoreImpl represents the native side of the Java
373 // ContentViewCore. It being NULL means that it is not attached 377 // ContentViewCore. It being NULL means that it is not attached
374 // to the View system yet, so we treat this RWHVA as hidden. 378 // to the View system yet, so we treat this RWHVA as hidden.
375 return is_showing_ && content_view_core_; 379 return is_showing_ && content_view_core_;
376 } 380 }
377 381
378 void RenderWidgetHostViewAndroid::LockResources() { 382 void RenderWidgetHostViewAndroid::LockSurfaceForCopy() {
379 DCHECK(HasValidFrame()); 383 DCHECK(HasValidFrame());
380 DCHECK(host_); 384 DCHECK(host_);
381 DCHECK(!host_->is_hidden()); 385 DCHECK(frame_evictor_->HasFrame());
382 frame_evictor_->LockFrame(); 386 frame_evictor_->LockFrame();
387 locks_on_frame_count_++;
383 } 388 }
384 389
385 void RenderWidgetHostViewAndroid::UnlockResources() { 390 void RenderWidgetHostViewAndroid::UnlockSurfaceForCopy() {
391 if (!frame_evictor_->HasFrame() || locks_on_frame_count_ == 0)
392 return;
393
386 DCHECK(HasValidFrame()); 394 DCHECK(HasValidFrame());
387 frame_evictor_->UnlockFrame(); 395 frame_evictor_->UnlockFrame();
396 locks_on_frame_count_--;
397 }
398
399 void RenderWidgetHostViewAndroid::ReleaseLocksOnSurface() {
400 if (!frame_evictor_->HasFrame()) {
401 DCHECK_EQ(locks_on_frame_count_, 0u);
402 return;
403 }
404 while (locks_on_frame_count_ > 0) {
405 UnlockSurfaceForCopy();
406 }
388 } 407 }
389 408
390 gfx::Rect RenderWidgetHostViewAndroid::GetViewBounds() const { 409 gfx::Rect RenderWidgetHostViewAndroid::GetViewBounds() const {
391 if (!content_view_core_) 410 if (!content_view_core_)
392 return gfx::Rect(default_size_); 411 return gfx::Rect(default_size_);
393 412
394 gfx::Size size = content_view_core_->GetViewportSizeDip(); 413 gfx::Size size = content_view_core_->GetViewportSizeDip();
395 gfx::Size offset = content_view_core_->GetViewportSizeOffsetDip(); 414 gfx::Size offset = content_view_core_->GetViewportSizeOffsetDip();
396 size.Enlarge(-offset.width(), -offset.height()); 415 size.Enlarge(-offset.width(), -offset.height());
397 416
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after
801 layer_->layer_tree_host()->QueueSwapPromise(swap_promise.Pass()); 820 layer_->layer_tree_host()->QueueSwapPromise(swap_promise.Pass());
802 } 821 }
803 } 822 }
804 823
805 if (frame->delegated_frame_data) { 824 if (frame->delegated_frame_data) {
806 DCHECK(using_delegated_renderer_); 825 DCHECK(using_delegated_renderer_);
807 826
808 DCHECK(frame->delegated_frame_data); 827 DCHECK(frame->delegated_frame_data);
809 DCHECK(!frame->delegated_frame_data->render_pass_list.empty()); 828 DCHECK(!frame->delegated_frame_data->render_pass_list.empty());
810 829
830 if (locks_on_frame_count_ > 0) {
831 DCHECK(HasValidFrame());
832 base::Closure ack_callback =
833 base::Bind(&RenderWidgetHostViewAndroid::SendDelegatedFrameAck,
834 weak_ptr_factory_.GetWeakPtr(),
835 output_surface_id);
836 if (host_->is_hidden())
837 ack_callback.Run();
838 else
839 ack_callbacks_.push(ack_callback);
840 return;
piman 2014/03/05 20:14:36 So, if my understanding is correct, while there is
powei 2014/03/06 07:41:40 Yes
841 }
811 cc::RenderPass* root_pass = 842 cc::RenderPass* root_pass =
812 frame->delegated_frame_data->render_pass_list.back(); 843 frame->delegated_frame_data->render_pass_list.back();
813 texture_size_in_layer_ = root_pass->output_rect.size(); 844 texture_size_in_layer_ = root_pass->output_rect.size();
814 ComputeContentsSize(frame->metadata); 845 ComputeContentsSize(frame->metadata);
815 846
816 SwapDelegatedFrame(output_surface_id, frame->delegated_frame_data.Pass()); 847 SwapDelegatedFrame(output_surface_id, frame->delegated_frame_data.Pass());
817 frame_evictor_->SwappedFrame(!host_->is_hidden()); 848 frame_evictor_->SwappedFrame(!host_->is_hidden());
818 return; 849 return;
819 } 850 }
820 851
(...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after
1253 } 1284 }
1254 1285
1255 void RenderWidgetHostViewAndroid::SetContentViewCore( 1286 void RenderWidgetHostViewAndroid::SetContentViewCore(
1256 ContentViewCoreImpl* content_view_core) { 1287 ContentViewCoreImpl* content_view_core) {
1257 RunAckCallbacks(); 1288 RunAckCallbacks();
1258 1289
1259 RemoveLayers(); 1290 RemoveLayers();
1260 if (content_view_core_ && !using_synchronous_compositor_) 1291 if (content_view_core_ && !using_synchronous_compositor_)
1261 content_view_core_->GetWindowAndroid()->RemoveObserver(this); 1292 content_view_core_->GetWindowAndroid()->RemoveObserver(this);
1262 1293
1294 if (content_view_core != content_view_core_)
1295 ReleaseLocksOnSurface();
1296
1263 content_view_core_ = content_view_core; 1297 content_view_core_ = content_view_core;
1264 1298
1265 if (GetBrowserAccessibilityManager()) { 1299 if (GetBrowserAccessibilityManager()) {
1266 base::android::ScopedJavaLocalRef<jobject> obj; 1300 base::android::ScopedJavaLocalRef<jobject> obj;
1267 if (content_view_core_) 1301 if (content_view_core_)
1268 obj = content_view_core_->GetJavaObject(); 1302 obj = content_view_core_->GetJavaObject();
1269 GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerAndroid()-> 1303 GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerAndroid()->
1270 SetContentViewCore(obj); 1304 SetContentViewCore(obj);
1271 } 1305 }
1272 1306
(...skipping 13 matching lines...) Expand all
1286 RunAckCallbacks(); 1320 RunAckCallbacks();
1287 } 1321 }
1288 1322
1289 void RenderWidgetHostViewAndroid::OnDetachCompositor() { 1323 void RenderWidgetHostViewAndroid::OnDetachCompositor() {
1290 DCHECK(content_view_core_); 1324 DCHECK(content_view_core_);
1291 DCHECK(!using_synchronous_compositor_); 1325 DCHECK(!using_synchronous_compositor_);
1292 RunAckCallbacks(); 1326 RunAckCallbacks();
1293 } 1327 }
1294 1328
1295 void RenderWidgetHostViewAndroid::OnLostResources() { 1329 void RenderWidgetHostViewAndroid::OnLostResources() {
1330 ReleaseLocksOnSurface();
1296 if (texture_layer_.get()) 1331 if (texture_layer_.get())
1297 texture_layer_->SetIsDrawable(false); 1332 texture_layer_->SetIsDrawable(false);
1298 if (delegated_renderer_layer_.get()) 1333 if (delegated_renderer_layer_.get())
1299 DestroyDelegatedContent(); 1334 DestroyDelegatedContent();
1300 texture_id_in_layer_ = 0; 1335 texture_id_in_layer_ = 0;
1301 RunAckCallbacks(); 1336 RunAckCallbacks();
1302 } 1337 }
1303 1338
1304 // static 1339 // static
1305 void RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult( 1340 void RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult(
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
1410 // RenderWidgetHostView, public: 1445 // RenderWidgetHostView, public:
1411 1446
1412 // static 1447 // static
1413 RenderWidgetHostView* 1448 RenderWidgetHostView*
1414 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { 1449 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) {
1415 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); 1450 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget);
1416 return new RenderWidgetHostViewAndroid(rwhi, NULL); 1451 return new RenderWidgetHostViewAndroid(rwhi, NULL);
1417 } 1452 }
1418 1453
1419 } // namespace content 1454 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698