Commit ed350c5a authored by Christopher Cameron's avatar Christopher Cameron Committed by Commit Bot

MacViews: Use surface sync for resize

BrowserCompositorMac has historically rolled its own surface sync
via the Suspend/Unsuspend functions, and compositor_suspended_lock_
in RecyclableCompositorMac. This no longer works in MacViews browser,
because we no longer use RecyclableCompositorMac.

Leave the Suspend/Unsuspend code in place for the non-MacViews case.

Split up UpdateSurfaceAndUnsuspend
- Make it just update the surface size
- Call it whenever the compositor is recycled or the surface resizes
- Move the AddRootLayer to TransitionToState

Add a GetDeadlinePolicy method
- When using surface sync, return a deadline of 8 frames (empirically
  works well for retina displays)
- Otherwise return an immediate deadline.

Bug: 840173
Change-Id: I6a1de5698e73d754ee03d9db8f4a97480c71dfb3
Reviewed-on: https://chromium-review.googlesource.com/1069834Reviewed-by: default avatarFady Samuel <fsamuel@chromium.org>
Commit-Queue: ccameron <ccameron@chromium.org>
Cr-Commit-Position: refs/heads/master@{#561393}
parent 6c960cc2
...@@ -149,6 +149,8 @@ class CONTENT_EXPORT BrowserCompositorMac : public DelegatedFrameHostClient, ...@@ -149,6 +149,8 @@ class CONTENT_EXPORT BrowserCompositorMac : public DelegatedFrameHostClient,
// ui::LayerObserver implementation: // ui::LayerObserver implementation:
void LayerDestroyed(ui::Layer* layer) override; void LayerDestroyed(ui::Layer* layer) override;
cc::DeadlinePolicy GetDeadlinePolicy() const;
// The state of |delegated_frame_host_| and |recyclable_compositor_| to // The state of |delegated_frame_host_| and |recyclable_compositor_| to
// manage being visible, occluded, hidden, or drawn via a ui::Layer. Note that // manage being visible, occluded, hidden, or drawn via a ui::Layer. Note that
// TransitionToState will transition through each intermediate state according // TransitionToState will transition through each intermediate state according
......
...@@ -83,11 +83,8 @@ class RecyclableCompositorMac : public ui::CompositorObserver { ...@@ -83,11 +83,8 @@ class RecyclableCompositorMac : public ui::CompositorObserver {
void Suspend(); void Suspend();
void Unsuspend(); void Unsuspend();
// Update the compositor's surface information, set |root_layer| to be the // Update the compositor's surface information, if needed.
// compositor root layer, and resize |root_layer|. void UpdateSurface(const gfx::Size& size_pixels, float scale_factor);
void UpdateSurfaceAndUnsuspend(const gfx::Size& size_pixels,
float scale_factor,
ui::Layer* root_layer);
// Invalidate the compositor's surface information. // Invalidate the compositor's surface information.
void InvalidateSurface(); void InvalidateSurface();
...@@ -144,20 +141,14 @@ void RecyclableCompositorMac::Unsuspend() { ...@@ -144,20 +141,14 @@ void RecyclableCompositorMac::Unsuspend() {
compositor_suspended_lock_ = nullptr; compositor_suspended_lock_ = nullptr;
} }
void RecyclableCompositorMac::UpdateSurfaceAndUnsuspend( void RecyclableCompositorMac::UpdateSurface(const gfx::Size& size_pixels,
const gfx::Size& size_pixels, float scale_factor) {
float scale_factor,
ui::Layer* root_layer) {
if (size_pixels != size_pixels_ || scale_factor != scale_factor_) { if (size_pixels != size_pixels_ || scale_factor != scale_factor_) {
size_pixels_ = size_pixels; size_pixels_ = size_pixels;
scale_factor_ = scale_factor; scale_factor_ = scale_factor;
compositor()->SetScaleAndSize(scale_factor_, size_pixels_, compositor()->SetScaleAndSize(scale_factor_, size_pixels_,
local_surface_id_allocator_.GenerateId()); local_surface_id_allocator_.GenerateId());
} }
compositor()->SetRootLayer(root_layer);
root_layer->SetBounds(
gfx::Rect(gfx::ConvertSizeToDIP(scale_factor, size_pixels)));
Unsuspend();
} }
void RecyclableCompositorMac::InvalidateSurface() { void RecyclableCompositorMac::InvalidateSurface() {
...@@ -167,7 +158,6 @@ void RecyclableCompositorMac::InvalidateSurface() { ...@@ -167,7 +158,6 @@ void RecyclableCompositorMac::InvalidateSurface() {
compositor()->SetScaleAndSize( compositor()->SetScaleAndSize(
scale_factor_, size_pixels_, scale_factor_, size_pixels_,
local_surface_id_allocator_.GetCurrentLocalSurfaceId()); local_surface_id_allocator_.GetCurrentLocalSurfaceId());
compositor()->SetRootLayer(nullptr);
} }
void RecyclableCompositorMac::OnCompositingDidCommit( void RecyclableCompositorMac::OnCompositingDidCommit(
...@@ -335,13 +325,16 @@ bool BrowserCompositorMac::UpdateNSViewAndDisplay( ...@@ -335,13 +325,16 @@ bool BrowserCompositorMac::UpdateNSViewAndDisplay(
recyclable_compositor_->Suspend(); recyclable_compositor_->Suspend();
GetDelegatedFrameHost()->SynchronizeVisualProperties( GetDelegatedFrameHost()->SynchronizeVisualProperties(
dfh_local_surface_id_allocator_.GenerateId(), dfh_size_dip_, dfh_local_surface_id_allocator_.GenerateId(), dfh_size_dip_,
cc::DeadlinePolicy::UseExistingDeadline()); GetDeadlinePolicy());
} }
if (recyclable_compositor_) { if (recyclable_compositor_) {
recyclable_compositor_->compositor()->SetDisplayColorSpace( recyclable_compositor_->compositor()->SetDisplayColorSpace(
dfh_display_.color_space()); dfh_display_.color_space());
recyclable_compositor_->UpdateSurface(dfh_size_pixels_,
dfh_display_.device_scale_factor());
} }
return true; return true;
} }
...@@ -359,7 +352,7 @@ void BrowserCompositorMac::UpdateForAutoResize( ...@@ -359,7 +352,7 @@ void BrowserCompositorMac::UpdateForAutoResize(
recyclable_compositor_->Suspend(); recyclable_compositor_->Suspend();
GetDelegatedFrameHost()->SynchronizeVisualProperties( GetDelegatedFrameHost()->SynchronizeVisualProperties(
dfh_local_surface_id_allocator_.GetCurrentLocalSurfaceId(), dfh_size_dip_, dfh_local_surface_id_allocator_.GetCurrentLocalSurfaceId(), dfh_size_dip_,
cc::DeadlinePolicy::UseExistingDeadline()); GetDeadlinePolicy());
client_->SynchronizeVisualProperties(); client_->SynchronizeVisualProperties();
} }
...@@ -424,6 +417,9 @@ void BrowserCompositorMac::TransitionToState(State new_state) { ...@@ -424,6 +417,9 @@ void BrowserCompositorMac::TransitionToState(State new_state) {
// Transition HasNoCompositor -> HasDetachedCompositor. // Transition HasNoCompositor -> HasDetachedCompositor.
if (state_ == HasNoCompositor && new_state < HasNoCompositor) { if (state_ == HasNoCompositor && new_state < HasNoCompositor) {
recyclable_compositor_ = RecyclableCompositorMac::Create(); recyclable_compositor_ = RecyclableCompositorMac::Create();
recyclable_compositor_->UpdateSurface(dfh_size_pixels_,
dfh_display_.device_scale_factor());
recyclable_compositor_->compositor()->SetRootLayer(root_layer_.get());
recyclable_compositor_->compositor()->SetBackgroundColor(background_color_); recyclable_compositor_->compositor()->SetBackgroundColor(background_color_);
recyclable_compositor_->compositor()->SetDisplayColorSpace( recyclable_compositor_->compositor()->SetDisplayColorSpace(
dfh_display_.color_space()); dfh_display_.color_space());
...@@ -441,11 +437,8 @@ void BrowserCompositorMac::TransitionToState(State new_state) { ...@@ -441,11 +437,8 @@ void BrowserCompositorMac::TransitionToState(State new_state) {
// If there exists a saved frame ready to display, unsuspend the compositor // If there exists a saved frame ready to display, unsuspend the compositor
// now (if one is not ready, the compositor will unsuspend on first surface // now (if one is not ready, the compositor will unsuspend on first surface
// activation). // activation).
if (delegated_frame_host_->HasSavedFrame()) { if (delegated_frame_host_->HasSavedFrame())
recyclable_compositor_->UpdateSurfaceAndUnsuspend( recyclable_compositor_->Unsuspend();
dfh_size_pixels_, dfh_display_.device_scale_factor(),
root_layer_.get());
}
state_ = HasAttachedCompositor; state_ = HasAttachedCompositor;
} }
...@@ -465,6 +458,7 @@ void BrowserCompositorMac::TransitionToState(State new_state) { ...@@ -465,6 +458,7 @@ void BrowserCompositorMac::TransitionToState(State new_state) {
// Transition HasDetachedCompositor -> HasNoCompositor. // Transition HasDetachedCompositor -> HasNoCompositor.
if (state_ == HasDetachedCompositor && new_state > HasDetachedCompositor) { if (state_ == HasDetachedCompositor && new_state > HasDetachedCompositor) {
recyclable_compositor_->accelerated_widget_mac()->ResetNSView(); recyclable_compositor_->accelerated_widget_mac()->ResetNSView();
recyclable_compositor_->compositor()->SetRootLayer(nullptr);
recyclable_compositor_->InvalidateSurface(); recyclable_compositor_->InvalidateSurface();
RecyclableCompositorMac::Recycle(std::move(recyclable_compositor_)); RecyclableCompositorMac::Recycle(std::move(recyclable_compositor_));
state_ = HasNoCompositor; state_ = HasNoCompositor;
...@@ -537,9 +531,7 @@ void BrowserCompositorMac::OnFirstSurfaceActivation( ...@@ -537,9 +531,7 @@ void BrowserCompositorMac::OnFirstSurfaceActivation(
if (!recyclable_compositor_) if (!recyclable_compositor_)
return; return;
recyclable_compositor_->UpdateSurfaceAndUnsuspend( recyclable_compositor_->Unsuspend();
surface_info.size_in_pixels(), surface_info.device_scale_factor(),
root_layer_.get());
// Disable screen updates until the frame of the new size appears (because the // Disable screen updates until the frame of the new size appears (because the
// content is drawn in the GPU process, it may change before we want it to). // content is drawn in the GPU process, it may change before we want it to).
...@@ -664,4 +656,16 @@ ui::Compositor* BrowserCompositorMac::GetCompositorForTesting() const { ...@@ -664,4 +656,16 @@ ui::Compositor* BrowserCompositorMac::GetCompositorForTesting() const {
return nullptr; return nullptr;
} }
cc::DeadlinePolicy BrowserCompositorMac::GetDeadlinePolicy() const {
// Determined empirically for smoothness.
uint32_t frames_to_wait = 8;
// When using the RecyclableCompositor, never wait for frames to arrive
// (surface sync is managed by the Suspend/Unsuspend lock).
if (recyclable_compositor_)
frames_to_wait = 0;
return cc::DeadlinePolicy::UseSpecifiedDeadline(frames_to_wait);
}
} // namespace content } // namespace content
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment