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

Side by Side Diff: content/browser/renderer_host/render_widget_host_view_mac.mm

Issue 370513002: Mac ÜC: Make resize smooth (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@enable_uc_for_reals
Patch Set: Created 6 years, 5 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_mac.h" 5 #include "content/browser/renderer_host/render_widget_host_view_mac.h"
6 6
7 #import <objc/runtime.h> 7 #import <objc/runtime.h>
8 #include <OpenGL/gl.h> 8 #include <OpenGL/gl.h>
9 #include <QuartzCore/QuartzCore.h> 9 #include <QuartzCore/QuartzCore.h>
10 10
(...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after
406 ui::Layer* RenderWidgetHostViewMac::GetLayer() { 406 ui::Layer* RenderWidgetHostViewMac::GetLayer() {
407 return root_layer_.get(); 407 return root_layer_.get();
408 } 408 }
409 409
410 RenderWidgetHostImpl* RenderWidgetHostViewMac::GetHost() { 410 RenderWidgetHostImpl* RenderWidgetHostViewMac::GetHost() {
411 return render_widget_host_; 411 return render_widget_host_;
412 } 412 }
413 413
414 void RenderWidgetHostViewMac::SchedulePaintInRect( 414 void RenderWidgetHostViewMac::SchedulePaintInRect(
415 const gfx::Rect& damage_rect_in_dip) { 415 const gfx::Rect& damage_rect_in_dip) {
416 // Do not paint immediately because this is being called from deep inside
417 // DelegatedFrameHost, and not all of its state is set up yet.
416 if (browser_compositor_view_) 418 if (browser_compositor_view_)
417 browser_compositor_view_->GetCompositor()->ScheduleFullRedraw(); 419 browser_compositor_has_pending_paint_= true;
piman 2014/07/07 18:27:43 nit: space before =
ccameron 2014/07/07 18:45:23 Done.
420 base::MessageLoop::current()->PostTask(FROM_HERE,
piman 2014/07/07 18:27:43 It's better to avoid posting the task if: - browse
ccameron 2014/07/07 18:45:23 Ah -- good point -- removed the redundant post tas
421 base::Bind(&RenderWidgetHostViewMac::DoBrowserCompositorPendingPaint,
422 weak_factory_.GetWeakPtr()));
423 }
424
425 void RenderWidgetHostViewMac::DoBrowserCompositorPendingPaint() {
426 if (browser_compositor_has_pending_paint_) {
427 browser_compositor_view_->GetCompositor()->Draw();
piman 2014/07/07 18:27:43 You'll need to check with enne wrt the interaction
ccameron 2014/07/07 18:45:23 Yeah, we had an email thread about this ... adding
428 browser_compositor_has_pending_paint_ = false;
429 }
418 } 430 }
419 431
420 bool RenderWidgetHostViewMac::IsVisible() { 432 bool RenderWidgetHostViewMac::IsVisible() {
421 return !render_widget_host_->is_hidden(); 433 return !render_widget_host_->is_hidden();
422 } 434 }
423 435
424 gfx::Size RenderWidgetHostViewMac::DesiredFrameSize() { 436 gfx::Size RenderWidgetHostViewMac::DesiredFrameSize() {
425 return GetViewBounds().size(); 437 return GetViewBounds().size();
426 } 438 }
427 439
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
486 } 498 }
487 499
488 NSView* RenderWidgetHostViewMac::BrowserCompositorSuperview() { 500 NSView* RenderWidgetHostViewMac::BrowserCompositorSuperview() {
489 return cocoa_view_; 501 return cocoa_view_;
490 } 502 }
491 503
492 ui::Layer* RenderWidgetHostViewMac::BrowserCompositorRootLayer() { 504 ui::Layer* RenderWidgetHostViewMac::BrowserCompositorRootLayer() {
493 return root_layer_.get(); 505 return root_layer_.get();
494 } 506 }
495 507
508 bool RenderWidgetHostViewMac::BrowserCompositorShouldDrawImmediately() {
509 return is_paused_for_resize_or_repaint_;
510 }
511
496 /////////////////////////////////////////////////////////////////////////////// 512 ///////////////////////////////////////////////////////////////////////////////
497 // RenderWidgetHostViewBase, public: 513 // RenderWidgetHostViewBase, public:
498 514
499 // static 515 // static
500 void RenderWidgetHostViewBase::GetDefaultScreenInfo( 516 void RenderWidgetHostViewBase::GetDefaultScreenInfo(
501 blink::WebScreenInfo* results) { 517 blink::WebScreenInfo* results) {
502 *results = GetWebScreenInfo(NULL); 518 *results = GetWebScreenInfo(NULL);
503 } 519 }
504 520
505 /////////////////////////////////////////////////////////////////////////////// 521 ///////////////////////////////////////////////////////////////////////////////
506 // RenderWidgetHostViewMac, public: 522 // RenderWidgetHostViewMac, public:
507 523
508 RenderWidgetHostViewMac::RenderWidgetHostViewMac(RenderWidgetHost* widget) 524 RenderWidgetHostViewMac::RenderWidgetHostViewMac(RenderWidgetHost* widget)
509 : render_widget_host_(RenderWidgetHostImpl::From(widget)), 525 : render_widget_host_(RenderWidgetHostImpl::From(widget)),
510 text_input_type_(ui::TEXT_INPUT_TYPE_NONE), 526 text_input_type_(ui::TEXT_INPUT_TYPE_NONE),
511 can_compose_inline_(true), 527 can_compose_inline_(true),
528 browser_compositor_has_pending_paint_(false),
512 browser_compositor_view_placeholder_( 529 browser_compositor_view_placeholder_(
513 new BrowserCompositorViewPlaceholderMac), 530 new BrowserCompositorViewPlaceholderMac),
514 pending_latency_info_delay_(0), 531 pending_latency_info_delay_(0),
515 pending_latency_info_delay_weak_ptr_factory_(this), 532 pending_latency_info_delay_weak_ptr_factory_(this),
516 backing_store_scale_factor_(1), 533 backing_store_scale_factor_(1),
517 is_loading_(false), 534 is_loading_(false),
535 is_paused_for_resize_or_repaint_(false),
518 weak_factory_(this), 536 weak_factory_(this),
519 fullscreen_parent_host_view_(NULL), 537 fullscreen_parent_host_view_(NULL),
520 overlay_view_weak_factory_(this), 538 overlay_view_weak_factory_(this),
521 software_frame_weak_ptr_factory_(this) { 539 software_frame_weak_ptr_factory_(this) {
522 software_frame_manager_.reset(new SoftwareFrameManager( 540 software_frame_manager_.reset(new SoftwareFrameManager(
523 software_frame_weak_ptr_factory_.GetWeakPtr())); 541 software_frame_weak_ptr_factory_.GetWeakPtr()));
524 // |cocoa_view_| owns us and we will be deleted when |cocoa_view_| 542 // |cocoa_view_| owns us and we will be deleted when |cocoa_view_|
525 // goes away. Since we autorelease it, our caller must put 543 // goes away. Since we autorelease it, our caller must put
526 // |GetNativeView()| into the view hierarchy right after calling us. 544 // |GetNativeView()| into the view hierarchy right after calling us.
527 cocoa_view_ = [[[RenderWidgetHostViewCocoa alloc] 545 cocoa_view_ = [[[RenderWidgetHostViewCocoa alloc]
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
633 return; 651 return;
634 if (browser_compositor_view_) 652 if (browser_compositor_view_)
635 return; 653 return;
636 654
637 TRACE_EVENT0("browser", 655 TRACE_EVENT0("browser",
638 "RenderWidgetHostViewMac::EnsureBrowserCompositorView"); 656 "RenderWidgetHostViewMac::EnsureBrowserCompositorView");
639 657
640 browser_compositor_view_.reset(new BrowserCompositorViewMac(this)); 658 browser_compositor_view_.reset(new BrowserCompositorViewMac(this));
641 delegated_frame_host_->AddedToWindow(); 659 delegated_frame_host_->AddedToWindow();
642 delegated_frame_host_->WasShown(); 660 delegated_frame_host_->WasShown();
661 RenderWidgetHelper::SetRenderWidgetIDForWidget(
662 browser_compositor_view_->GetView(),
663 render_widget_host_->GetProcess()->GetID(),
664 render_widget_host_->GetRoutingID());
643 } 665 }
644 666
645 void RenderWidgetHostViewMac::DestroyBrowserCompositorView() { 667 void RenderWidgetHostViewMac::DestroyBrowserCompositorView() {
646 TRACE_EVENT0("browser", 668 TRACE_EVENT0("browser",
647 "RenderWidgetHostViewMac::DestroyBrowserCompositorView"); 669 "RenderWidgetHostViewMac::DestroyBrowserCompositorView");
648 if (!browser_compositor_view_) 670 if (!browser_compositor_view_)
649 return; 671 return;
650 672
651 delegated_frame_host_->WasHidden(); 673 delegated_frame_host_->WasHidden();
652 delegated_frame_host_->RemovingFromWindow(); 674 delegated_frame_host_->RemovingFromWindow();
675 RenderWidgetHelper::ResetRenderWidgetIDForWidget(
676 browser_compositor_view_->GetView());
653 browser_compositor_view_.reset(); 677 browser_compositor_view_.reset();
678 browser_compositor_has_pending_paint_ = false;
654 } 679 }
655 680
656 void RenderWidgetHostViewMac::EnsureSoftwareLayer() { 681 void RenderWidgetHostViewMac::EnsureSoftwareLayer() {
657 TRACE_EVENT0("browser", "RenderWidgetHostViewMac::EnsureSoftwareLayer"); 682 TRACE_EVENT0("browser", "RenderWidgetHostViewMac::EnsureSoftwareLayer");
658 if (software_layer_) 683 if (software_layer_)
659 return; 684 return;
660 685
661 software_layer_.reset([[SoftwareLayer alloc] init]); 686 software_layer_.reset([[SoftwareLayer alloc] init]);
662 DCHECK(software_layer_); 687 DCHECK(software_layer_);
663 688
(...skipping 1160 matching lines...) Expand 10 before | Expand all | Expand 10 after
1824 if (compositing_iosurface_) { 1849 if (compositing_iosurface_) {
1825 return compositing_iosurface_->HasIOSurface() && 1850 return compositing_iosurface_->HasIOSurface() &&
1826 (desired_size.IsEmpty() || 1851 (desired_size.IsEmpty() ||
1827 compositing_iosurface_->dip_io_surface_size() == desired_size); 1852 compositing_iosurface_->dip_io_surface_size() == desired_size);
1828 } 1853 }
1829 if (software_frame_manager_->HasCurrentFrame()) { 1854 if (software_frame_manager_->HasCurrentFrame()) {
1830 return (desired_size.IsEmpty() || 1855 return (desired_size.IsEmpty() ||
1831 software_frame_manager_->GetCurrentFrameSizeInDIP() == 1856 software_frame_manager_->GetCurrentFrameSizeInDIP() ==
1832 desired_size); 1857 desired_size);
1833 } 1858 }
1859 if (browser_compositor_view_)
1860 return browser_compositor_view_->HasFrameWithSizeInDIP(desired_size);
1834 return false; 1861 return false;
1835 } 1862 }
1836 1863
1837 void RenderWidgetHostViewMac::OnSwapCompositorFrame( 1864 void RenderWidgetHostViewMac::OnSwapCompositorFrame(
1838 uint32 output_surface_id, scoped_ptr<cc::CompositorFrame> frame) { 1865 uint32 output_surface_id, scoped_ptr<cc::CompositorFrame> frame) {
1839 TRACE_EVENT0("browser", "RenderWidgetHostViewMac::OnSwapCompositorFrame"); 1866 TRACE_EVENT0("browser", "RenderWidgetHostViewMac::OnSwapCompositorFrame");
1840 1867
1841 if (frame->delegated_frame_data) { 1868 if (frame->delegated_frame_data) {
1842 float scale_factor = frame->metadata.device_scale_factor; 1869 float scale_factor = frame->metadata.device_scale_factor;
1843 gfx::Size dip_size = ToCeiledSize(frame->metadata.viewport_size); 1870 gfx::Size dip_size = ToCeiledSize(frame->metadata.viewport_size);
1844 gfx::Size pixel_size = ConvertSizeToPixel( 1871 gfx::Size pixel_size = ConvertSizeToPixel(
1845 scale_factor, dip_size); 1872 scale_factor, dip_size);
1846 root_layer_->SetBounds(gfx::Rect(dip_size)); 1873 root_layer_->SetBounds(gfx::Rect(dip_size));
1847 1874
1848 if (!render_widget_host_->is_hidden()) { 1875 if (!render_widget_host_->is_hidden()) {
1849 EnsureBrowserCompositorView(); 1876 EnsureBrowserCompositorView();
1850 browser_compositor_view_->GetCompositor()->SetScaleAndSize( 1877 browser_compositor_view_->GetCompositor()->SetScaleAndSize(
1851 scale_factor, pixel_size); 1878 scale_factor, pixel_size);
1852 } 1879 }
1853 1880
1854 delegated_frame_host_->SwapDelegatedFrame( 1881 delegated_frame_host_->SwapDelegatedFrame(
1855 output_surface_id, 1882 output_surface_id,
1856 frame->delegated_frame_data.Pass(), 1883 frame->delegated_frame_data.Pass(),
1857 frame->metadata.device_scale_factor, 1884 frame->metadata.device_scale_factor,
1858 frame->metadata.latency_info); 1885 frame->metadata.latency_info);
1886
1887 DoBrowserCompositorPendingPaint();
1859 } else if (frame->software_frame_data) { 1888 } else if (frame->software_frame_data) {
1860 if (!software_frame_manager_->SwapToNewFrame( 1889 if (!software_frame_manager_->SwapToNewFrame(
1861 output_surface_id, 1890 output_surface_id,
1862 frame->software_frame_data.get(), 1891 frame->software_frame_data.get(),
1863 frame->metadata.device_scale_factor, 1892 frame->metadata.device_scale_factor,
1864 render_widget_host_->GetProcess()->GetHandle())) { 1893 render_widget_host_->GetProcess()->GetHandle())) {
1865 render_widget_host_->GetProcess()->ReceivedBadMessage(); 1894 render_widget_host_->GetProcess()->ReceivedBadMessage();
1866 return; 1895 return;
1867 } 1896 }
1868 1897
(...skipping 393 matching lines...) Expand 10 before | Expand all | Expand 10 after
2262 RenderWidgetHostImpl::AcknowledgeBufferPresent(pending_swap_ack_->route_id, 2291 RenderWidgetHostImpl::AcknowledgeBufferPresent(pending_swap_ack_->route_id,
2263 pending_swap_ack_->gpu_host_id, 2292 pending_swap_ack_->gpu_host_id,
2264 ack_params); 2293 ack_params);
2265 pending_swap_ack_.reset(); 2294 pending_swap_ack_.reset();
2266 } 2295 }
2267 2296
2268 void RenderWidgetHostViewMac::PauseForPendingResizeOrRepaintsAndDraw() { 2297 void RenderWidgetHostViewMac::PauseForPendingResizeOrRepaintsAndDraw() {
2269 if (!render_widget_host_ || render_widget_host_->is_hidden()) 2298 if (!render_widget_host_ || render_widget_host_->is_hidden())
2270 return; 2299 return;
2271 2300
2272 // Synchronized resizing does not yet work with browser compositor.
2273 // http://crbug.com/388005
2274 if (delegated_frame_host_)
2275 return;
2276
2277 // Pausing for the overlay/underlay view prevents the other one from receiving 2301 // Pausing for the overlay/underlay view prevents the other one from receiving
2278 // frames. This may lead to large delays, causing overlaps. 2302 // frames. This may lead to large delays, causing overlaps.
2279 // See crbug.com/352020. 2303 // See crbug.com/352020.
2280 if (underlay_view_ || overlay_view_) 2304 if (underlay_view_ || overlay_view_)
2281 return; 2305 return;
2282 2306
2283 // Ensure that all frames are acked before waiting for a frame to come in. 2307 // Ensure that all frames are acked before waiting for a frame to come in.
2284 // Note that we will draw a frame at the end of this function, so it is safe 2308 // Note that we will draw a frame at the end of this function, so it is safe
2285 // to ack a never-drawn frame here. 2309 // to ack a never-drawn frame here.
2286 SendPendingSwapAck(); 2310 SendPendingSwapAck();
2287 2311
2288 // Wait for a frame of the right size to come in. 2312 // Wait for a frame of the right size to come in.
2313 is_paused_for_resize_or_repaint_ = true;
2289 render_widget_host_->PauseForPendingResizeOrRepaints(); 2314 render_widget_host_->PauseForPendingResizeOrRepaints();
2315 is_paused_for_resize_or_repaint_ = false;
2290 2316
2291 // Immediately draw any frames that haven't been drawn yet. This is necessary 2317 // Immediately draw any frames that haven't been drawn yet. This is necessary
2292 // to keep the window and the window's contents in sync. 2318 // to keep the window and the window's contents in sync.
2293 [cocoa_view_ displayIfNeeded]; 2319 [cocoa_view_ displayIfNeeded];
2294 [software_layer_ displayIfNeeded]; 2320 [software_layer_ displayIfNeeded];
2295 [compositing_iosurface_layer_ displayIfNeeded]; 2321 [compositing_iosurface_layer_ displayIfNeeded];
2296 } 2322 }
2297 2323
2298 void RenderWidgetHostViewMac::LayoutLayers() { 2324 void RenderWidgetHostViewMac::LayoutLayers() {
2299 if (delegated_frame_host_) { 2325 if (delegated_frame_host_) {
(...skipping 1734 matching lines...) Expand 10 before | Expand all | Expand 10 after
4034 4060
4035 // "-webkit-app-region: drag | no-drag" is implemented on Mac by excluding 4061 // "-webkit-app-region: drag | no-drag" is implemented on Mac by excluding
4036 // regions that are not draggable. (See ControlRegionView in 4062 // regions that are not draggable. (See ControlRegionView in
4037 // native_app_window_cocoa.mm). This requires the render host view to be 4063 // native_app_window_cocoa.mm). This requires the render host view to be
4038 // draggable by default. 4064 // draggable by default.
4039 - (BOOL)mouseDownCanMoveWindow { 4065 - (BOOL)mouseDownCanMoveWindow {
4040 return YES; 4066 return YES;
4041 } 4067 }
4042 4068
4043 @end 4069 @end
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698