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

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: Add comments 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 if (browser_compositor_view_) 416 // Do not paint immediately because this is being called from deep inside
417 browser_compositor_view_->GetCompositor()->ScheduleFullRedraw(); 417 // DelegatedFrameHost, and not all of its state is set up yet.
418 if (browser_compositor_view_ && !browser_compositor_has_pending_paint_) {
419 browser_compositor_has_pending_paint_ = true;
420 base::MessageLoop::current()->PostTask(FROM_HERE,
421 base::Bind(&RenderWidgetHostViewMac::DoBrowserCompositorPendingPaint,
422 weak_factory_.GetWeakPtr()));
423 }
424 }
425
426 void RenderWidgetHostViewMac::DoBrowserCompositorPendingPaint() {
427 if (browser_compositor_has_pending_paint_) {
428 browser_compositor_view_->GetCompositor()->Draw();
429 browser_compositor_has_pending_paint_ = false;
430 }
418 } 431 }
419 432
420 bool RenderWidgetHostViewMac::IsVisible() { 433 bool RenderWidgetHostViewMac::IsVisible() {
421 return !render_widget_host_->is_hidden(); 434 return !render_widget_host_->is_hidden();
422 } 435 }
423 436
424 gfx::Size RenderWidgetHostViewMac::DesiredFrameSize() { 437 gfx::Size RenderWidgetHostViewMac::DesiredFrameSize() {
425 return GetViewBounds().size(); 438 return GetViewBounds().size();
426 } 439 }
427 440
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
461 } 474 }
462 475
463 NSView* RenderWidgetHostViewMac::BrowserCompositorSuperview() { 476 NSView* RenderWidgetHostViewMac::BrowserCompositorSuperview() {
464 return cocoa_view_; 477 return cocoa_view_;
465 } 478 }
466 479
467 ui::Layer* RenderWidgetHostViewMac::BrowserCompositorRootLayer() { 480 ui::Layer* RenderWidgetHostViewMac::BrowserCompositorRootLayer() {
468 return root_layer_.get(); 481 return root_layer_.get();
469 } 482 }
470 483
484 bool RenderWidgetHostViewMac::BrowserCompositorShouldDrawImmediately() {
485 return is_paused_for_resize_or_repaint_;
486 }
487
471 /////////////////////////////////////////////////////////////////////////////// 488 ///////////////////////////////////////////////////////////////////////////////
472 // RenderWidgetHostViewBase, public: 489 // RenderWidgetHostViewBase, public:
473 490
474 // static 491 // static
475 void RenderWidgetHostViewBase::GetDefaultScreenInfo( 492 void RenderWidgetHostViewBase::GetDefaultScreenInfo(
476 blink::WebScreenInfo* results) { 493 blink::WebScreenInfo* results) {
477 *results = GetWebScreenInfo(NULL); 494 *results = GetWebScreenInfo(NULL);
478 } 495 }
479 496
480 /////////////////////////////////////////////////////////////////////////////// 497 ///////////////////////////////////////////////////////////////////////////////
481 // RenderWidgetHostViewMac, public: 498 // RenderWidgetHostViewMac, public:
482 499
483 RenderWidgetHostViewMac::RenderWidgetHostViewMac(RenderWidgetHost* widget) 500 RenderWidgetHostViewMac::RenderWidgetHostViewMac(RenderWidgetHost* widget)
484 : render_widget_host_(RenderWidgetHostImpl::From(widget)), 501 : render_widget_host_(RenderWidgetHostImpl::From(widget)),
485 text_input_type_(ui::TEXT_INPUT_TYPE_NONE), 502 text_input_type_(ui::TEXT_INPUT_TYPE_NONE),
486 can_compose_inline_(true), 503 can_compose_inline_(true),
504 browser_compositor_has_pending_paint_(false),
487 browser_compositor_view_placeholder_( 505 browser_compositor_view_placeholder_(
488 new BrowserCompositorViewPlaceholderMac), 506 new BrowserCompositorViewPlaceholderMac),
489 backing_store_scale_factor_(1), 507 backing_store_scale_factor_(1),
490 is_loading_(false), 508 is_loading_(false),
509 is_paused_for_resize_or_repaint_(false),
491 weak_factory_(this), 510 weak_factory_(this),
492 fullscreen_parent_host_view_(NULL), 511 fullscreen_parent_host_view_(NULL),
493 overlay_view_weak_factory_(this), 512 overlay_view_weak_factory_(this),
494 software_frame_weak_ptr_factory_(this) { 513 software_frame_weak_ptr_factory_(this) {
495 software_frame_manager_.reset(new SoftwareFrameManager( 514 software_frame_manager_.reset(new SoftwareFrameManager(
496 software_frame_weak_ptr_factory_.GetWeakPtr())); 515 software_frame_weak_ptr_factory_.GetWeakPtr()));
497 // |cocoa_view_| owns us and we will be deleted when |cocoa_view_| 516 // |cocoa_view_| owns us and we will be deleted when |cocoa_view_|
498 // goes away. Since we autorelease it, our caller must put 517 // goes away. Since we autorelease it, our caller must put
499 // |GetNativeView()| into the view hierarchy right after calling us. 518 // |GetNativeView()| into the view hierarchy right after calling us.
500 cocoa_view_ = [[[RenderWidgetHostViewCocoa alloc] 519 cocoa_view_ = [[[RenderWidgetHostViewCocoa alloc]
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
606 return; 625 return;
607 if (browser_compositor_view_) 626 if (browser_compositor_view_)
608 return; 627 return;
609 628
610 TRACE_EVENT0("browser", 629 TRACE_EVENT0("browser",
611 "RenderWidgetHostViewMac::EnsureBrowserCompositorView"); 630 "RenderWidgetHostViewMac::EnsureBrowserCompositorView");
612 631
613 browser_compositor_view_.reset(new BrowserCompositorViewMac(this)); 632 browser_compositor_view_.reset(new BrowserCompositorViewMac(this));
614 delegated_frame_host_->AddedToWindow(); 633 delegated_frame_host_->AddedToWindow();
615 delegated_frame_host_->WasShown(); 634 delegated_frame_host_->WasShown();
635 RenderWidgetHelper::SetRenderWidgetIDForWidget(
636 browser_compositor_view_->GetView(),
637 render_widget_host_->GetProcess()->GetID(),
638 render_widget_host_->GetRoutingID());
616 } 639 }
617 640
618 void RenderWidgetHostViewMac::DestroyBrowserCompositorView() { 641 void RenderWidgetHostViewMac::DestroyBrowserCompositorView() {
619 TRACE_EVENT0("browser", 642 TRACE_EVENT0("browser",
620 "RenderWidgetHostViewMac::DestroyBrowserCompositorView"); 643 "RenderWidgetHostViewMac::DestroyBrowserCompositorView");
621 if (!browser_compositor_view_) 644 if (!browser_compositor_view_)
622 return; 645 return;
623 646
624 delegated_frame_host_->WasHidden(); 647 delegated_frame_host_->WasHidden();
625 delegated_frame_host_->RemovingFromWindow(); 648 delegated_frame_host_->RemovingFromWindow();
649 RenderWidgetHelper::ResetRenderWidgetIDForWidget(
650 browser_compositor_view_->GetView());
626 browser_compositor_view_.reset(); 651 browser_compositor_view_.reset();
652 browser_compositor_has_pending_paint_ = false;
627 } 653 }
628 654
629 void RenderWidgetHostViewMac::EnsureSoftwareLayer() { 655 void RenderWidgetHostViewMac::EnsureSoftwareLayer() {
630 TRACE_EVENT0("browser", "RenderWidgetHostViewMac::EnsureSoftwareLayer"); 656 TRACE_EVENT0("browser", "RenderWidgetHostViewMac::EnsureSoftwareLayer");
631 if (software_layer_) 657 if (software_layer_)
632 return; 658 return;
633 659
634 software_layer_.reset([[SoftwareLayer alloc] init]); 660 software_layer_.reset([[SoftwareLayer alloc] init]);
635 DCHECK(software_layer_); 661 DCHECK(software_layer_);
636 662
(...skipping 1160 matching lines...) Expand 10 before | Expand all | Expand 10 after
1797 if (compositing_iosurface_) { 1823 if (compositing_iosurface_) {
1798 return compositing_iosurface_->HasIOSurface() && 1824 return compositing_iosurface_->HasIOSurface() &&
1799 (desired_size.IsEmpty() || 1825 (desired_size.IsEmpty() ||
1800 compositing_iosurface_->dip_io_surface_size() == desired_size); 1826 compositing_iosurface_->dip_io_surface_size() == desired_size);
1801 } 1827 }
1802 if (software_frame_manager_->HasCurrentFrame()) { 1828 if (software_frame_manager_->HasCurrentFrame()) {
1803 return (desired_size.IsEmpty() || 1829 return (desired_size.IsEmpty() ||
1804 software_frame_manager_->GetCurrentFrameSizeInDIP() == 1830 software_frame_manager_->GetCurrentFrameSizeInDIP() ==
1805 desired_size); 1831 desired_size);
1806 } 1832 }
1833 if (browser_compositor_view_)
1834 return browser_compositor_view_->HasFrameWithSizeInDIP(desired_size);
1807 return false; 1835 return false;
1808 } 1836 }
1809 1837
1810 void RenderWidgetHostViewMac::OnSwapCompositorFrame( 1838 void RenderWidgetHostViewMac::OnSwapCompositorFrame(
1811 uint32 output_surface_id, scoped_ptr<cc::CompositorFrame> frame) { 1839 uint32 output_surface_id, scoped_ptr<cc::CompositorFrame> frame) {
1812 TRACE_EVENT0("browser", "RenderWidgetHostViewMac::OnSwapCompositorFrame"); 1840 TRACE_EVENT0("browser", "RenderWidgetHostViewMac::OnSwapCompositorFrame");
1813 1841
1814 if (frame->delegated_frame_data) { 1842 if (frame->delegated_frame_data) {
1815 float scale_factor = frame->metadata.device_scale_factor; 1843 float scale_factor = frame->metadata.device_scale_factor;
1816 gfx::Size dip_size = ToCeiledSize(frame->metadata.viewport_size); 1844 gfx::Size dip_size = ToCeiledSize(frame->metadata.viewport_size);
1817 gfx::Size pixel_size = ConvertSizeToPixel( 1845 gfx::Size pixel_size = ConvertSizeToPixel(
1818 scale_factor, dip_size); 1846 scale_factor, dip_size);
1819 root_layer_->SetBounds(gfx::Rect(dip_size)); 1847 root_layer_->SetBounds(gfx::Rect(dip_size));
1820 1848
1821 if (!render_widget_host_->is_hidden()) { 1849 if (!render_widget_host_->is_hidden()) {
1822 EnsureBrowserCompositorView(); 1850 EnsureBrowserCompositorView();
1823 browser_compositor_view_->GetCompositor()->SetScaleAndSize( 1851 browser_compositor_view_->GetCompositor()->SetScaleAndSize(
1824 scale_factor, pixel_size); 1852 scale_factor, pixel_size);
1825 } 1853 }
1826 1854
1827 SendVSyncParametersToRenderer(); 1855 SendVSyncParametersToRenderer();
1828 1856
1829 delegated_frame_host_->SwapDelegatedFrame( 1857 delegated_frame_host_->SwapDelegatedFrame(
1830 output_surface_id, 1858 output_surface_id,
1831 frame->delegated_frame_data.Pass(), 1859 frame->delegated_frame_data.Pass(),
1832 frame->metadata.device_scale_factor, 1860 frame->metadata.device_scale_factor,
1833 frame->metadata.latency_info); 1861 frame->metadata.latency_info);
1862
1863 DoBrowserCompositorPendingPaint();
1834 } else if (frame->software_frame_data) { 1864 } else if (frame->software_frame_data) {
1835 if (!software_frame_manager_->SwapToNewFrame( 1865 if (!software_frame_manager_->SwapToNewFrame(
1836 output_surface_id, 1866 output_surface_id,
1837 frame->software_frame_data.get(), 1867 frame->software_frame_data.get(),
1838 frame->metadata.device_scale_factor, 1868 frame->metadata.device_scale_factor,
1839 render_widget_host_->GetProcess()->GetHandle())) { 1869 render_widget_host_->GetProcess()->GetHandle())) {
1840 render_widget_host_->GetProcess()->ReceivedBadMessage(); 1870 render_widget_host_->GetProcess()->ReceivedBadMessage();
1841 return; 1871 return;
1842 } 1872 }
1843 1873
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after
2178 RenderWidgetHostImpl::AcknowledgeBufferPresent(pending_swap_ack_->route_id, 2208 RenderWidgetHostImpl::AcknowledgeBufferPresent(pending_swap_ack_->route_id,
2179 pending_swap_ack_->gpu_host_id, 2209 pending_swap_ack_->gpu_host_id,
2180 ack_params); 2210 ack_params);
2181 pending_swap_ack_.reset(); 2211 pending_swap_ack_.reset();
2182 } 2212 }
2183 2213
2184 void RenderWidgetHostViewMac::PauseForPendingResizeOrRepaintsAndDraw() { 2214 void RenderWidgetHostViewMac::PauseForPendingResizeOrRepaintsAndDraw() {
2185 if (!render_widget_host_ || render_widget_host_->is_hidden()) 2215 if (!render_widget_host_ || render_widget_host_->is_hidden())
2186 return; 2216 return;
2187 2217
2188 // Synchronized resizing does not yet work with browser compositor.
2189 // http://crbug.com/388005
2190 if (delegated_frame_host_)
2191 return;
2192
2193 // Pausing for the overlay/underlay view prevents the other one from receiving 2218 // Pausing for the overlay/underlay view prevents the other one from receiving
2194 // frames. This may lead to large delays, causing overlaps. 2219 // frames. This may lead to large delays, causing overlaps.
2195 // See crbug.com/352020. 2220 // See crbug.com/352020.
2196 if (underlay_view_ || overlay_view_) 2221 if (underlay_view_ || overlay_view_)
2197 return; 2222 return;
2198 2223
2199 // Ensure that all frames are acked before waiting for a frame to come in. 2224 // Ensure that all frames are acked before waiting for a frame to come in.
2200 // Note that we will draw a frame at the end of this function, so it is safe 2225 // Note that we will draw a frame at the end of this function, so it is safe
2201 // to ack a never-drawn frame here. 2226 // to ack a never-drawn frame here.
2202 SendPendingSwapAck(); 2227 SendPendingSwapAck();
2203 2228
2204 // Wait for a frame of the right size to come in. 2229 // Wait for a frame of the right size to come in.
2230 is_paused_for_resize_or_repaint_ = true;
2205 render_widget_host_->PauseForPendingResizeOrRepaints(); 2231 render_widget_host_->PauseForPendingResizeOrRepaints();
2232 is_paused_for_resize_or_repaint_ = false;
2206 2233
2207 // Immediately draw any frames that haven't been drawn yet. This is necessary 2234 // Immediately draw any frames that haven't been drawn yet. This is necessary
2208 // to keep the window and the window's contents in sync. 2235 // to keep the window and the window's contents in sync.
2209 [cocoa_view_ displayIfNeeded]; 2236 [cocoa_view_ displayIfNeeded];
2210 [software_layer_ displayIfNeeded]; 2237 [software_layer_ displayIfNeeded];
2211 [compositing_iosurface_layer_ displayIfNeeded]; 2238 [compositing_iosurface_layer_ displayIfNeeded];
2212 } 2239 }
2213 2240
2214 void RenderWidgetHostViewMac::LayoutLayers() { 2241 void RenderWidgetHostViewMac::LayoutLayers() {
2215 if (delegated_frame_host_) { 2242 if (delegated_frame_host_) {
(...skipping 1734 matching lines...) Expand 10 before | Expand all | Expand 10 after
3950 3977
3951 // "-webkit-app-region: drag | no-drag" is implemented on Mac by excluding 3978 // "-webkit-app-region: drag | no-drag" is implemented on Mac by excluding
3952 // regions that are not draggable. (See ControlRegionView in 3979 // regions that are not draggable. (See ControlRegionView in
3953 // native_app_window_cocoa.mm). This requires the render host view to be 3980 // native_app_window_cocoa.mm). This requires the render host view to be
3954 // draggable by default. 3981 // draggable by default.
3955 - (BOOL)mouseDownCanMoveWindow { 3982 - (BOOL)mouseDownCanMoveWindow {
3956 return YES; 3983 return YES;
3957 } 3984 }
3958 3985
3959 @end 3986 @end
OLDNEW
« no previous file with comments | « content/browser/renderer_host/render_widget_host_view_mac.h ('k') | content/common/view_messages.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698