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

Unified 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, 6 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 side-by-side diff with in-line comments
Download patch
Index: content/browser/renderer_host/render_widget_host_view_mac.mm
diff --git a/content/browser/renderer_host/render_widget_host_view_mac.mm b/content/browser/renderer_host/render_widget_host_view_mac.mm
index 2761280179240222e5640a2b0341a65e5fd182e3..e7f67902a230629f01f0e50c6926587b73015ee2 100644
--- a/content/browser/renderer_host/render_widget_host_view_mac.mm
+++ b/content/browser/renderer_host/render_widget_host_view_mac.mm
@@ -413,8 +413,20 @@ RenderWidgetHostImpl* RenderWidgetHostViewMac::GetHost() {
void RenderWidgetHostViewMac::SchedulePaintInRect(
const gfx::Rect& damage_rect_in_dip) {
+ // Do not paint immediately because this is being called from deep inside
+ // DelegatedFrameHost, and not all of its state is set up yet.
if (browser_compositor_view_)
- browser_compositor_view_->GetCompositor()->ScheduleFullRedraw();
+ browser_compositor_has_pending_paint_= true;
piman 2014/07/07 18:27:43 nit: space before =
ccameron 2014/07/07 18:45:23 Done.
+ 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
+ base::Bind(&RenderWidgetHostViewMac::DoBrowserCompositorPendingPaint,
+ weak_factory_.GetWeakPtr()));
+}
+
+void RenderWidgetHostViewMac::DoBrowserCompositorPendingPaint() {
+ if (browser_compositor_has_pending_paint_) {
+ 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
+ browser_compositor_has_pending_paint_ = false;
+ }
}
bool RenderWidgetHostViewMac::IsVisible() {
@@ -493,6 +505,10 @@ ui::Layer* RenderWidgetHostViewMac::BrowserCompositorRootLayer() {
return root_layer_.get();
}
+bool RenderWidgetHostViewMac::BrowserCompositorShouldDrawImmediately() {
+ return is_paused_for_resize_or_repaint_;
+}
+
///////////////////////////////////////////////////////////////////////////////
// RenderWidgetHostViewBase, public:
@@ -509,12 +525,14 @@ RenderWidgetHostViewMac::RenderWidgetHostViewMac(RenderWidgetHost* widget)
: render_widget_host_(RenderWidgetHostImpl::From(widget)),
text_input_type_(ui::TEXT_INPUT_TYPE_NONE),
can_compose_inline_(true),
+ browser_compositor_has_pending_paint_(false),
browser_compositor_view_placeholder_(
new BrowserCompositorViewPlaceholderMac),
pending_latency_info_delay_(0),
pending_latency_info_delay_weak_ptr_factory_(this),
backing_store_scale_factor_(1),
is_loading_(false),
+ is_paused_for_resize_or_repaint_(false),
weak_factory_(this),
fullscreen_parent_host_view_(NULL),
overlay_view_weak_factory_(this),
@@ -640,6 +658,10 @@ void RenderWidgetHostViewMac::EnsureBrowserCompositorView() {
browser_compositor_view_.reset(new BrowserCompositorViewMac(this));
delegated_frame_host_->AddedToWindow();
delegated_frame_host_->WasShown();
+ RenderWidgetHelper::SetRenderWidgetIDForWidget(
+ browser_compositor_view_->GetView(),
+ render_widget_host_->GetProcess()->GetID(),
+ render_widget_host_->GetRoutingID());
}
void RenderWidgetHostViewMac::DestroyBrowserCompositorView() {
@@ -650,7 +672,10 @@ void RenderWidgetHostViewMac::DestroyBrowserCompositorView() {
delegated_frame_host_->WasHidden();
delegated_frame_host_->RemovingFromWindow();
+ RenderWidgetHelper::ResetRenderWidgetIDForWidget(
+ browser_compositor_view_->GetView());
browser_compositor_view_.reset();
+ browser_compositor_has_pending_paint_ = false;
}
void RenderWidgetHostViewMac::EnsureSoftwareLayer() {
@@ -1831,6 +1856,8 @@ bool RenderWidgetHostViewMac::HasAcceleratedSurface(
software_frame_manager_->GetCurrentFrameSizeInDIP() ==
desired_size);
}
+ if (browser_compositor_view_)
+ return browser_compositor_view_->HasFrameWithSizeInDIP(desired_size);
return false;
}
@@ -1856,6 +1883,8 @@ void RenderWidgetHostViewMac::OnSwapCompositorFrame(
frame->delegated_frame_data.Pass(),
frame->metadata.device_scale_factor,
frame->metadata.latency_info);
+
+ DoBrowserCompositorPendingPaint();
} else if (frame->software_frame_data) {
if (!software_frame_manager_->SwapToNewFrame(
output_surface_id,
@@ -2269,11 +2298,6 @@ void RenderWidgetHostViewMac::PauseForPendingResizeOrRepaintsAndDraw() {
if (!render_widget_host_ || render_widget_host_->is_hidden())
return;
- // Synchronized resizing does not yet work with browser compositor.
- // http://crbug.com/388005
- if (delegated_frame_host_)
- return;
-
// Pausing for the overlay/underlay view prevents the other one from receiving
// frames. This may lead to large delays, causing overlaps.
// See crbug.com/352020.
@@ -2286,7 +2310,9 @@ void RenderWidgetHostViewMac::PauseForPendingResizeOrRepaintsAndDraw() {
SendPendingSwapAck();
// Wait for a frame of the right size to come in.
+ is_paused_for_resize_or_repaint_ = true;
render_widget_host_->PauseForPendingResizeOrRepaints();
+ is_paused_for_resize_or_repaint_ = false;
// Immediately draw any frames that haven't been drawn yet. This is necessary
// to keep the window and the window's contents in sync.

Powered by Google App Engine
This is Rietveld 408576698