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

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

Issue 1103233002: Remove maintaing ReadbackRequests for copyFromCompositingSurface. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove abortpendingreadbacks. Created 5 years, 7 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
« no previous file with comments | « content/browser/renderer_host/render_widget_host_view_android.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/build_info.h" 9 #include "base/android/build_info.h"
10 #include "base/basictypes.h" 10 #include "base/basictypes.h"
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after
321 if (rect.IsEmpty()) 321 if (rect.IsEmpty())
322 return rect; 322 return rect;
323 323
324 rect.Union(controller.GetStartHandleRect()); 324 rect.Union(controller.GetStartHandleRect());
325 rect.Union(controller.GetEndHandleRect()); 325 rect.Union(controller.GetEndHandleRect());
326 return rect; 326 return rect;
327 } 327 }
328 328
329 } // anonymous namespace 329 } // anonymous namespace
330 330
331 ReadbackRequest::ReadbackRequest(float scale,
332 SkColorType color_type,
333 gfx::Rect src_subrect,
334 ReadbackRequestCallback& result_callback)
335 : scale_(scale),
336 color_type_(color_type),
337 src_subrect_(src_subrect),
338 result_callback_(result_callback) {
339 }
340
341 ReadbackRequest::ReadbackRequest() {
342 }
343
344 ReadbackRequest::~ReadbackRequest() {
345 }
346
347 RenderWidgetHostViewAndroid::LastFrameInfo::LastFrameInfo( 331 RenderWidgetHostViewAndroid::LastFrameInfo::LastFrameInfo(
348 uint32 output_id, 332 uint32 output_id,
349 scoped_ptr<cc::CompositorFrame> output_frame) 333 scoped_ptr<cc::CompositorFrame> output_frame)
350 : output_surface_id(output_id), frame(output_frame.Pass()) {} 334 : output_surface_id(output_id), frame(output_frame.Pass()) {}
351 335
352 RenderWidgetHostViewAndroid::LastFrameInfo::~LastFrameInfo() {} 336 RenderWidgetHostViewAndroid::LastFrameInfo::~LastFrameInfo() {}
353 337
354 void RenderWidgetHostViewAndroid::OnContextLost() { 338 void RenderWidgetHostViewAndroid::OnContextLost() {
355 scoped_ptr<RenderWidgetHostIterator> widgets( 339 scoped_ptr<RenderWidgetHostIterator> widgets(
356 RenderWidgetHostImpl::GetAllRenderWidgetHosts()); 340 RenderWidgetHostImpl::GetAllRenderWidgetHosts());
(...skipping 23 matching lines...) Expand all
380 locks_on_frame_count_(0), 364 locks_on_frame_count_(0),
381 observing_root_window_(false), 365 observing_root_window_(false),
382 weak_ptr_factory_(this) { 366 weak_ptr_factory_(this) {
383 host_->SetView(this); 367 host_->SetView(this);
384 SetContentViewCore(content_view_core); 368 SetContentViewCore(content_view_core);
385 } 369 }
386 370
387 RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() { 371 RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() {
388 SetContentViewCore(NULL); 372 SetContentViewCore(NULL);
389 DCHECK(ack_callbacks_.empty()); 373 DCHECK(ack_callbacks_.empty());
390 DCHECK(readbacks_waiting_for_frame_.empty());
391 if (resource_collection_.get()) 374 if (resource_collection_.get())
392 resource_collection_->SetClient(NULL); 375 resource_collection_->SetClient(NULL);
393 DCHECK(!surface_factory_); 376 DCHECK(!surface_factory_);
394 DCHECK(surface_id_.is_null()); 377 DCHECK(surface_id_.is_null());
395 } 378 }
396 379
397 380
398 bool RenderWidgetHostViewAndroid::OnMessageReceived( 381 bool RenderWidgetHostViewAndroid::OnMessageReceived(
399 const IPC::Message& message) { 382 const IPC::Message& message) {
400 bool handled = true; 383 bool handled = true;
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
441 void RenderWidgetHostViewAndroid::SetSize(const gfx::Size& size) { 424 void RenderWidgetHostViewAndroid::SetSize(const gfx::Size& size) {
442 // Ignore the given size as only the Java code has the power to 425 // Ignore the given size as only the Java code has the power to
443 // resize the view on Android. 426 // resize the view on Android.
444 default_size_ = size; 427 default_size_ = size;
445 } 428 }
446 429
447 void RenderWidgetHostViewAndroid::SetBounds(const gfx::Rect& rect) { 430 void RenderWidgetHostViewAndroid::SetBounds(const gfx::Rect& rect) {
448 SetSize(rect.size()); 431 SetSize(rect.size());
449 } 432 }
450 433
451 void RenderWidgetHostViewAndroid::AbortPendingReadbackRequests() {
452 while (!readbacks_waiting_for_frame_.empty()) {
453 ReadbackRequest& readback_request = readbacks_waiting_for_frame_.front();
454 readback_request.GetResultCallback().Run(SkBitmap(), READBACK_FAILED);
455 readbacks_waiting_for_frame_.pop();
456 }
457 }
458
459 void RenderWidgetHostViewAndroid::GetScaledContentBitmap( 434 void RenderWidgetHostViewAndroid::GetScaledContentBitmap(
460 float scale, 435 float scale,
461 SkColorType color_type, 436 SkColorType color_type,
462 gfx::Rect src_subrect, 437 gfx::Rect src_subrect,
463 ReadbackRequestCallback& result_callback) { 438 ReadbackRequestCallback& result_callback) {
464 if (!host_ || host_->is_hidden()) { 439 if (!host_ || host_->is_hidden() || !IsSurfaceAvailableForCopy()) {
465 result_callback.Run(SkBitmap(), READBACK_NOT_SUPPORTED); 440 result_callback.Run(SkBitmap(), READBACK_NOT_SUPPORTED);
466 return; 441 return;
467 } 442 }
468 if (!IsSurfaceAvailableForCopy()) {
469 // The view is visible, probably the frame has not yet arrived.
470 // Just add the ReadbackRequest to queue and wait for frame arrival
471 // to get this request processed.
472 readbacks_waiting_for_frame_.push(
473 ReadbackRequest(scale, color_type, src_subrect, result_callback));
474 return;
475 }
476
477 gfx::Size bounds = layer_->bounds(); 443 gfx::Size bounds = layer_->bounds();
478 if (src_subrect.IsEmpty()) 444 if (src_subrect.IsEmpty())
479 src_subrect = gfx::Rect(bounds); 445 src_subrect = gfx::Rect(bounds);
480 DCHECK_LE(src_subrect.width() + src_subrect.x(), bounds.width()); 446 DCHECK_LE(src_subrect.width() + src_subrect.x(), bounds.width());
481 DCHECK_LE(src_subrect.height() + src_subrect.y(), bounds.height()); 447 DCHECK_LE(src_subrect.height() + src_subrect.y(), bounds.height());
482 const gfx::Display& display = 448 const gfx::Display& display =
483 gfx::Screen::GetNativeScreen()->GetPrimaryDisplay(); 449 gfx::Screen::GetNativeScreen()->GetPrimaryDisplay();
484 float device_scale_factor = display.device_scale_factor(); 450 float device_scale_factor = display.device_scale_factor();
485 DCHECK_GT(device_scale_factor, 0); 451 DCHECK_GT(device_scale_factor, 0);
486 gfx::Size dst_size( 452 gfx::Size dst_size(
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
607 return; 573 return;
608 574
609 is_showing_ = false; 575 is_showing_ = false;
610 if (layer_.get() && locks_on_frame_count_ == 0) 576 if (layer_.get() && locks_on_frame_count_ == 0)
611 layer_->SetHideLayerAndSubtree(true); 577 layer_->SetHideLayerAndSubtree(true);
612 578
613 if (overscroll_controller_) 579 if (overscroll_controller_)
614 overscroll_controller_->Disable(); 580 overscroll_controller_->Disable();
615 581
616 frame_evictor_->SetVisible(false); 582 frame_evictor_->SetVisible(false);
617 // We don't know if we will ever get a frame if we are hiding the renderer, so
618 // we need to cancel all requests
619 AbortPendingReadbackRequests();
620 583
621 RunAckCallbacks(cc::SurfaceDrawStatus::DRAW_SKIPPED); 584 RunAckCallbacks(cc::SurfaceDrawStatus::DRAW_SKIPPED);
622 585
623 if (!host_ || host_->is_hidden()) 586 if (!host_ || host_->is_hidden())
624 return; 587 return;
625 588
626 // Inform the renderer that we are being hidden so it can reduce its resource 589 // Inform the renderer that we are being hidden so it can reduce its resource
627 // utilization. 590 // utilization.
628 host_->WasHidden(); 591 host_->WasHidden();
629 592
(...skipping 450 matching lines...) Expand 10 before | Expand all | Expand 10 after
1080 1043
1081 void RenderWidgetHostViewAndroid::DestroyDelegatedContent() { 1044 void RenderWidgetHostViewAndroid::DestroyDelegatedContent() {
1082 RemoveLayers(); 1045 RemoveLayers();
1083 frame_provider_ = NULL; 1046 frame_provider_ = NULL;
1084 if (!surface_id_.is_null()) { 1047 if (!surface_id_.is_null()) {
1085 DCHECK(surface_factory_.get()); 1048 DCHECK(surface_factory_.get());
1086 surface_factory_->Destroy(surface_id_); 1049 surface_factory_->Destroy(surface_id_);
1087 surface_id_ = cc::SurfaceId(); 1050 surface_id_ = cc::SurfaceId();
1088 } 1051 }
1089 layer_ = NULL; 1052 layer_ = NULL;
1090 // This gets called when ever any eviction, loosing resources, swapping
1091 // problems are encountered and so we abort any pending readbacks here.
1092 AbortPendingReadbackRequests();
1093 } 1053 }
1094 1054
1095 void RenderWidgetHostViewAndroid::CheckOutputSurfaceChanged( 1055 void RenderWidgetHostViewAndroid::CheckOutputSurfaceChanged(
1096 uint32 output_surface_id) { 1056 uint32 output_surface_id) {
1097 if (output_surface_id == last_output_surface_id_) 1057 if (output_surface_id == last_output_surface_id_)
1098 return; 1058 return;
1099 // Drop the cc::DelegatedFrameResourceCollection so that we will not return 1059 // Drop the cc::DelegatedFrameResourceCollection so that we will not return
1100 // any resources from the old output surface with the new output surface id. 1060 // any resources from the old output surface with the new output surface id.
1101 if (resource_collection_.get()) { 1061 if (resource_collection_.get()) {
1102 resource_collection_->SetClient(NULL); 1062 resource_collection_->SetClient(NULL);
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
1238 frame->delegated_frame_data->render_pass_list.back(); 1198 frame->delegated_frame_data->render_pass_list.back();
1239 texture_size_in_layer_ = root_pass->output_rect.size(); 1199 texture_size_in_layer_ = root_pass->output_rect.size();
1240 ComputeContentsSize(frame->metadata); 1200 ComputeContentsSize(frame->metadata);
1241 1201
1242 SwapDelegatedFrame(output_surface_id, frame->delegated_frame_data.Pass()); 1202 SwapDelegatedFrame(output_surface_id, frame->delegated_frame_data.Pass());
1243 frame_evictor_->SwappedFrame(!host_->is_hidden()); 1203 frame_evictor_->SwappedFrame(!host_->is_hidden());
1244 1204
1245 // As the metadata update may trigger view invalidation, always call it after 1205 // As the metadata update may trigger view invalidation, always call it after
1246 // any potential compositor scheduling. 1206 // any potential compositor scheduling.
1247 OnFrameMetadataUpdated(frame->metadata); 1207 OnFrameMetadataUpdated(frame->metadata);
1248 // Check if we have any pending readbacks, see if we have a frame available
1249 // and process them here.
1250 if (!readbacks_waiting_for_frame_.empty()) {
1251 while (!readbacks_waiting_for_frame_.empty()) {
1252 ReadbackRequest& readback_request = readbacks_waiting_for_frame_.front();
1253 GetScaledContentBitmap(readback_request.GetScale(),
1254 readback_request.GetColorFormat(),
1255 readback_request.GetCaptureRect(),
1256 readback_request.GetResultCallback());
1257 readbacks_waiting_for_frame_.pop();
1258 }
1259 }
1260 } 1208 }
1261 1209
1262 void RenderWidgetHostViewAndroid::OnSwapCompositorFrame( 1210 void RenderWidgetHostViewAndroid::OnSwapCompositorFrame(
1263 uint32 output_surface_id, 1211 uint32 output_surface_id,
1264 scoped_ptr<cc::CompositorFrame> frame) { 1212 scoped_ptr<cc::CompositorFrame> frame) {
1265 InternalSwapCompositorFrame(output_surface_id, frame.Pass()); 1213 InternalSwapCompositorFrame(output_surface_id, frame.Pass());
1266 } 1214 }
1267 1215
1268 void RenderWidgetHostViewAndroid::RetainFrame( 1216 void RenderWidgetHostViewAndroid::RetainFrame(
1269 uint32 output_surface_id, 1217 uint32 output_surface_id,
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after
1560 } 1508 }
1561 if (selection_controller_) 1509 if (selection_controller_)
1562 needs_animate |= selection_controller_->Animate(frame_time); 1510 needs_animate |= selection_controller_->Animate(frame_time);
1563 return needs_animate; 1511 return needs_animate;
1564 } 1512 }
1565 1513
1566 void RenderWidgetHostViewAndroid::EvictDelegatedFrame() { 1514 void RenderWidgetHostViewAndroid::EvictDelegatedFrame() {
1567 if (layer_.get()) 1515 if (layer_.get())
1568 DestroyDelegatedContent(); 1516 DestroyDelegatedContent();
1569 frame_evictor_->DiscardedFrame(); 1517 frame_evictor_->DiscardedFrame();
1570 // We are evicting the delegated frame,
1571 // so there should be no pending readback requests
1572 DCHECK(readbacks_waiting_for_frame_.empty());
1573 } 1518 }
1574 1519
1575 bool RenderWidgetHostViewAndroid::HasAcceleratedSurface( 1520 bool RenderWidgetHostViewAndroid::HasAcceleratedSurface(
1576 const gfx::Size& desired_size) { 1521 const gfx::Size& desired_size) {
1577 NOTREACHED(); 1522 NOTREACHED();
1578 return false; 1523 return false;
1579 } 1524 }
1580 1525
1581 void RenderWidgetHostViewAndroid::GetScreenInfo(blink::WebScreenInfo* result) { 1526 void RenderWidgetHostViewAndroid::GetScreenInfo(blink::WebScreenInfo* result) {
1582 // ScreenInfo isn't tied to the widget on Android. Always return the default. 1527 // ScreenInfo isn't tied to the widget on Android. Always return the default.
(...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after
1896 void RenderWidgetHostViewAndroid::OnAnimate(base::TimeTicks begin_frame_time) { 1841 void RenderWidgetHostViewAndroid::OnAnimate(base::TimeTicks begin_frame_time) {
1897 if (Animate(begin_frame_time)) 1842 if (Animate(begin_frame_time))
1898 SetNeedsAnimate(); 1843 SetNeedsAnimate();
1899 } 1844 }
1900 1845
1901 void RenderWidgetHostViewAndroid::OnLostResources() { 1846 void RenderWidgetHostViewAndroid::OnLostResources() {
1902 ReleaseLocksOnSurface(); 1847 ReleaseLocksOnSurface();
1903 if (layer_.get()) 1848 if (layer_.get())
1904 DestroyDelegatedContent(); 1849 DestroyDelegatedContent();
1905 DCHECK(ack_callbacks_.empty()); 1850 DCHECK(ack_callbacks_.empty());
1906 // We should not loose a frame if we have readback requests pending.
1907 DCHECK(readbacks_waiting_for_frame_.empty());
1908 } 1851 }
1909 1852
1910 // static 1853 // static
1911 void RenderWidgetHostViewAndroid:: 1854 void RenderWidgetHostViewAndroid::
1912 PrepareTextureCopyOutputResultForDelegatedReadback( 1855 PrepareTextureCopyOutputResultForDelegatedReadback(
1913 const gfx::Size& dst_size_in_pixel, 1856 const gfx::Size& dst_size_in_pixel,
1914 SkColorType color_type, 1857 SkColorType color_type,
1915 const base::TimeTicks& start_time, 1858 const base::TimeTicks& start_time,
1916 scoped_refptr<cc::Layer> readback_layer, 1859 scoped_refptr<cc::Layer> readback_layer,
1917 ReadbackRequestCallback& callback, 1860 ReadbackRequestCallback& callback,
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
2025 results->orientationAngle = display.RotationAsDegree(); 1968 results->orientationAngle = display.RotationAsDegree();
2026 results->orientationType = 1969 results->orientationType =
2027 RenderWidgetHostViewBase::GetOrientationTypeForMobile(display); 1970 RenderWidgetHostViewBase::GetOrientationTypeForMobile(display);
2028 gfx::DeviceDisplayInfo info; 1971 gfx::DeviceDisplayInfo info;
2029 results->depth = info.GetBitsPerPixel(); 1972 results->depth = info.GetBitsPerPixel();
2030 results->depthPerComponent = info.GetBitsPerComponent(); 1973 results->depthPerComponent = info.GetBitsPerComponent();
2031 results->isMonochrome = (results->depthPerComponent == 0); 1974 results->isMonochrome = (results->depthPerComponent == 0);
2032 } 1975 }
2033 1976
2034 } // namespace content 1977 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/renderer_host/render_widget_host_view_android.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698