Commit 39a9c9c4 authored by Christopher Cameron's avatar Christopher Cameron Committed by Commit Bot

viz/mac: Prepare RenderWidgetHostViewMac for viz

Query the --enable-viz flag and plumb it to the DelegatedFrameHost.

Resize the ui::Compositor along with the NSView when under viz, because
otherwise it will never be resized (in non-viz, we resize it when we
get compositor frames, which we no longer get).

Consolidate the places that we query NSView/display properties (size,
scale factor, and color space) in BrowserCompositorMac.

Bug: 794839
Change-Id: I3d62f340a8c318c963f24f3732cdde4bb9328126
Reviewed-on: https://chromium-review.googlesource.com/794840
Commit-Queue: ccameron <ccameron@chromium.org>
Reviewed-by: default avatardanakj <danakj@chromium.org>
Cr-Commit-Position: refs/heads/master@{#521061}
parent 53b449d1
......@@ -25,7 +25,6 @@ class RecyclableCompositorMac;
class BrowserCompositorMacClient {
public:
virtual NSView* BrowserCompositorMacGetNSView() const = 0;
virtual SkColor BrowserCompositorMacGetGutterColor(SkColor color) const = 0;
virtual void BrowserCompositorMacOnBeginFrame() = 0;
virtual viz::LocalSurfaceId GetLocalSurfaceId() const = 0;
......@@ -69,6 +68,7 @@ class CONTENT_EXPORT BrowserCompositorMac : public DelegatedFrameHostClient {
void OnDidNotProduceFrame(const viz::BeginFrameAck& ack);
void SetBackgroundColor(SkColor background_color);
void SetDisplayColorSpace(const gfx::ColorSpace& color_space);
void WasResized();
void UpdateVSyncParameters(const base::TimeTicks& timebase,
const base::TimeDelta& interval);
void SetNeedsBeginFrames(bool needs_begin_frames);
......@@ -151,6 +151,9 @@ class CONTENT_EXPORT BrowserCompositorMac : public DelegatedFrameHostClient {
State state_ = HasNoCompositor;
void UpdateState();
void TransitionToState(State new_state);
void GetViewProperties(gfx::Size* bounds_in_dip,
float* scale_factor,
gfx::ColorSpace* color_space) const;
static void CopyCompleted(
base::WeakPtr<BrowserCompositorMac> browser_compositor,
......@@ -175,6 +178,7 @@ class CONTENT_EXPORT BrowserCompositorMac : public DelegatedFrameHostClient {
std::unique_ptr<ui::Layer> root_layer_;
SkColor background_color_ = SK_ColorWHITE;
const bool enable_viz_ = false;
viz::mojom::CompositorFrameSinkClient* renderer_compositor_frame_sink_ =
nullptr;
......
......@@ -8,9 +8,11 @@
#include <utility>
#include "base/command_line.h"
#include "base/containers/circular_deque.h"
#include "base/lazy_instance.h"
#include "base/trace_event/trace_event.h"
#include "components/viz/common/switches.h"
#include "content/browser/compositor/image_transport_factory.h"
#include "content/browser/renderer_host/compositor_resize_lock.h"
#include "content/public/browser/browser_thread.h"
......@@ -180,6 +182,8 @@ BrowserCompositorMac::BrowserCompositorMac(
const viz::FrameSinkId& frame_sink_id)
: client_(client),
accelerated_widget_mac_ns_view_(accelerated_widget_mac_ns_view),
enable_viz_(base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kEnableViz)),
weak_factory_(this) {
g_browser_compositor_count += 1;
......@@ -187,7 +191,7 @@ BrowserCompositorMac::BrowserCompositorMac(
// TODO(fsamuel): Plumb surface synchronization settings.
delegated_frame_host_.reset(new DelegatedFrameHost(
frame_sink_id, this, false /* enable_surface_synchronization */,
false /* enable_viz */));
enable_viz_));
SetRenderWidgetHostIsHidden(render_widget_host_is_hidden);
SetNSViewAttachedToWindow(ns_view_attached_to_window);
......@@ -330,6 +334,22 @@ void BrowserCompositorMac::SetDisplayColorSpace(
recyclable_compositor_->compositor()->SetDisplayColorSpace(color_space);
}
void BrowserCompositorMac::WasResized() {
GetDelegatedFrameHost()->WasResized();
// In non-viz, the ui::Compositor is resized in sync with frames coming from
// the renderer. In viz, the ui::Compositor can only resize in sync with the
// NSView.
if (enable_viz_ && recyclable_compositor_) {
gfx::Size dip_size;
float scale_factor = 1.f;
GetViewProperties(&dip_size, &scale_factor, nullptr);
gfx::Size pixel_size = gfx::ConvertSizeToPixel(scale_factor, dip_size);
recyclable_compositor_->compositor()->SetScaleAndSize(scale_factor,
pixel_size);
}
}
void BrowserCompositorMac::UpdateVSyncParameters(
const base::TimeTicks& timebase,
const base::TimeDelta& interval) {
......@@ -371,23 +391,20 @@ void BrowserCompositorMac::TransitionToState(State new_state) {
// Transition HasDetachedCompositor -> HasAttachedCompositor.
if (state_ == HasDetachedCompositor && new_state == HasAttachedCompositor) {
NSView* ns_view =
accelerated_widget_mac_ns_view_->AcceleratedWidgetGetNSView();
display::Display display =
display::Screen::GetScreen()->GetDisplayNearestView(ns_view);
NSSize dip_ns_size = [ns_view bounds].size;
gfx::Size pixel_size(dip_ns_size.width * display.device_scale_factor(),
dip_ns_size.height * display.device_scale_factor());
gfx::Size dip_size;
float scale_factor = 1.f;
gfx::ColorSpace color_space;
GetViewProperties(&dip_size, &scale_factor, &color_space);
gfx::Size pixel_size = gfx::ConvertSizeToPixel(scale_factor, dip_size);
delegated_frame_host_->SetCompositor(recyclable_compositor_->compositor());
delegated_frame_host_->WasShown(ui::LatencyInfo());
// Unsuspend the browser compositor after showing the delegated frame host.
// If there is not a saved delegated frame, then the delegated frame host
// will keep the compositor locked until a delegated frame is swapped.
recyclable_compositor_->compositor()->SetDisplayColorSpace(
display.color_space());
recyclable_compositor_->compositor()->SetScaleAndSize(
display.device_scale_factor(), pixel_size);
recyclable_compositor_->compositor()->SetDisplayColorSpace(color_space);
recyclable_compositor_->compositor()->SetScaleAndSize(scale_factor,
pixel_size);
recyclable_compositor_->Unsuspend();
state_ = HasAttachedCompositor;
}
......@@ -414,6 +431,26 @@ void BrowserCompositorMac::TransitionToState(State new_state) {
}
}
void BrowserCompositorMac::GetViewProperties(
gfx::Size* bounds_in_dip,
float* scale_factor,
gfx::ColorSpace* color_space) const {
NSView* ns_view =
accelerated_widget_mac_ns_view_->AcceleratedWidgetGetNSView();
if (bounds_in_dip) {
NSSize dip_ns_size = [ns_view bounds].size;
*bounds_in_dip = gfx::Size(dip_ns_size.width, dip_ns_size.height);
}
if (scale_factor || color_space) {
display::Display display =
display::Screen::GetScreen()->GetDisplayNearestView(ns_view);
if (scale_factor)
*scale_factor = display.device_scale_factor();
if (color_space)
*color_space = display.color_space();
}
}
// static
void BrowserCompositorMac::DisableRecyclingForShutdown() {
g_has_shut_down = true;
......@@ -441,8 +478,9 @@ SkColor BrowserCompositorMac::DelegatedFrameHostGetGutterColor(
}
gfx::Size BrowserCompositorMac::DelegatedFrameHostDesiredSizeInDIP() const {
NSRect bounds = [client_->BrowserCompositorMacGetNSView() bounds];
return gfx::Size(bounds.size.width, bounds.size.height);
gfx::Size dip_size;
GetViewProperties(&dip_size, nullptr, nullptr);
return dip_size;
}
bool BrowserCompositorMac::DelegatedFrameCanCreateResizeLock() const {
......
......@@ -494,7 +494,6 @@ class CONTENT_EXPORT RenderWidgetHostViewMac
void PauseForPendingResizeOrRepaintsAndDraw();
// BrowserCompositorMacClient implementation.
NSView* BrowserCompositorMacGetNSView() const override;
SkColor BrowserCompositorMacGetGutterColor(SkColor color) const override;
void BrowserCompositorMacOnBeginFrame() override;
viz::LocalSurfaceId GetLocalSurfaceId() const override;
......
......@@ -381,10 +381,6 @@ namespace content {
////////////////////////////////////////////////////////////////////////////////
// BrowserCompositorMacClient, public:
NSView* RenderWidgetHostViewMac::BrowserCompositorMacGetNSView() const {
return cocoa_view_;
}
SkColor RenderWidgetHostViewMac::BrowserCompositorMacGetGutterColor(
SkColor color) const {
// When making an element on the page fullscreen the element's background
......@@ -1114,7 +1110,7 @@ void RenderWidgetHostViewMac::UpdateScreenInfo(gfx::NativeView view) {
local_surface_id_ = local_surface_id_allocator_.GenerateId();
render_widget_host_->DidAllocateLocalSurfaceIdForAutoResize(
render_widget_host_->last_auto_resize_request_number());
browser_compositor_->GetDelegatedFrameHost()->WasResized();
browser_compositor_->WasResized();
}
bool RenderWidgetHostViewMac::SupportsSpeech() const {
......@@ -2895,8 +2891,7 @@ void RenderWidgetHostViewMac::OnDisplayMetricsChanged(
else
renderWidgetHostView_->render_widget_host_->SendScreenRects();
renderWidgetHostView_->render_widget_host_->WasResized();
renderWidgetHostView_->browser_compositor_->GetDelegatedFrameHost()
->WasResized();
renderWidgetHostView_->browser_compositor_->WasResized();
// Wait for the frame that WasResize might have requested. If the view is
// being made visible at a new size, then this call will have no effect
......
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