macOS: Fix rendering with surface synchronization (issue #2447)

This commit is contained in:
Marshall Greenblatt 2018-05-31 16:34:44 -04:00
parent 08ff72fa20
commit 21310e4374
4 changed files with 40 additions and 27 deletions

View File

@ -238,9 +238,9 @@ CefRenderWidgetHostViewOSR::CefRenderWidgetHostViewOSR(
content::RenderViewHost::From(render_widget_host_));
}
#if !defined(OS_MACOSX)
local_surface_id_ = local_surface_id_allocator_.GenerateId();
#if !defined(OS_MACOSX)
// Matching the attributes from BrowserCompositorMac.
delegated_frame_host_ = std::make_unique<content::DelegatedFrameHost>(
AllocateFrameSinkId(is_guest_view_hack), this,
@ -859,6 +859,16 @@ void CefRenderWidgetHostViewOSR::SelectionChanged(const base::string16& text,
}
}
#if !defined(OS_MACOSX)
viz::LocalSurfaceId CefRenderWidgetHostViewOSR::GetLocalSurfaceId() const {
return local_surface_id_;
}
#endif
viz::FrameSinkId CefRenderWidgetHostViewOSR::GetFrameSinkId() {
return GetDelegatedFrameHost()->frame_sink_id();
}
void CefRenderWidgetHostViewOSR::SetNeedsBeginFrames(bool enabled) {
SetFrameRate();
@ -914,12 +924,12 @@ bool CefRenderWidgetHostViewOSR::TransformPointToCoordSpaceForView(
}
void CefRenderWidgetHostViewOSR::DidNavigate() {
#if defined(OS_MACOSX)
browser_compositor_->DidNavigate();
#else
// With surface synchronization enabled we need to force synchronization on
// first navigation.
ResizeRootLayer(true);
#if defined(OS_MACOSX)
browser_compositor_->DidNavigate();
#else
if (delegated_frame_host_)
delegated_frame_host_->DidNavigate();
#endif
@ -959,10 +969,6 @@ SkColor CefRenderWidgetHostViewOSR::DelegatedFrameHostGetGutterColor() const {
return background_color_;
}
viz::LocalSurfaceId CefRenderWidgetHostViewOSR::GetLocalSurfaceId() const {
return local_surface_id_;
}
void CefRenderWidgetHostViewOSR::OnFirstSurfaceActivation(
const viz::SurfaceInfo& surface_info) {}
@ -1285,9 +1291,11 @@ void CefRenderWidgetHostViewOSR::SetFrameRate() {
osr_util::ClampFrameRate(browser->settings().windowless_frame_rate);
frame_rate_threshold_us_ = 1000000 / frame_rate;
// Configure the VSync interval for the browser process.
GetCompositor()->vsync_manager()->SetAuthoritativeVSyncInterval(
base::TimeDelta::FromMicroseconds(frame_rate_threshold_us_));
if (GetCompositor()) {
// Configure the VSync interval for the browser process.
GetCompositor()->vsync_manager()->SetAuthoritativeVSyncInterval(
base::TimeDelta::FromMicroseconds(frame_rate_threshold_us_));
}
if (copy_frame_generator_.get()) {
copy_frame_generator_->set_frame_rate_threshold_us(
@ -1349,23 +1357,26 @@ void CefRenderWidgetHostViewOSR::ResizeRootLayer(bool force) {
return;
}
GetRootLayer()->SetBounds(gfx::Rect(size));
#if defined(OS_MACOSX)
bool resized = UpdateNSViewAndDisplay();
#else
const gfx::Size& size_in_pixels =
gfx::ConvertSizeToPixel(current_device_scale_factor_, size);
local_surface_id_ = local_surface_id_allocator_.GenerateId();
GetRootLayer()->SetBounds(gfx::Rect(size));
GetCompositor()->SetScaleAndSize(current_device_scale_factor_, size_in_pixels,
local_surface_id_);
if (GetCompositor()) {
GetCompositor()->SetScaleAndSize(current_device_scale_factor_,
size_in_pixels, local_surface_id_);
}
PlatformResizeCompositorWidget(size_in_pixels);
#if defined(OS_MACOSX)
bool resized = UpdateNSViewAndDisplay();
#else
bool resized = true;
GetDelegatedFrameHost()->SynchronizeVisualProperties(
local_surface_id_, size, cc::DeadlinePolicy::UseDefaultDeadline());
#endif
#endif // !defined(OS_MACOSX)
// Note that |render_widget_host_| will retrieve resize parameters from the
// DelegatedFrameHost, so it must have SynchronizeVisualProperties called

View File

@ -187,6 +187,9 @@ class CefRenderWidgetHostViewOSR : public content::RenderWidgetHostViewBase,
size_t offset,
const gfx::Range& range) override;
viz::LocalSurfaceId GetLocalSurfaceId() const override;
viz::FrameSinkId GetFrameSinkId() override;
// ui::CompositorDelegate implementation.
std::unique_ptr<viz::SoftwareOutputDevice> CreateSoftwareOutputDevice(
ui::Compositor* compositor) override;
@ -196,7 +199,6 @@ class CefRenderWidgetHostViewOSR : public content::RenderWidgetHostViewBase,
ui::Layer* DelegatedFrameHostGetLayer() const override;
bool DelegatedFrameHostIsVisible() const override;
SkColor DelegatedFrameHostGetGutterColor() const override;
viz::LocalSurfaceId GetLocalSurfaceId() const override;
void OnFirstSurfaceActivation(const viz::SurfaceInfo& surface_info) override;
void OnBeginFrame(base::TimeTicks frame_time) override;
void OnFrameTokenChanged(uint32_t frame_token) override;
@ -252,8 +254,6 @@ class CefRenderWidgetHostViewOSR : public content::RenderWidgetHostViewBase,
}
ui::Layer* GetRootLayer() const;
viz::LocalSurfaceId local_surface_id() const { return local_surface_id_; }
private:
content::DelegatedFrameHost* GetDelegatedFrameHost() const;
@ -296,7 +296,9 @@ class CefRenderWidgetHostViewOSR : public content::RenderWidgetHostViewBase,
#endif // defined(OS_MACOSX)
void PlatformCreateCompositorWidget(bool is_guest_view_hack);
#if !defined(OS_MACOSX)
void PlatformResizeCompositorWidget(const gfx::Size& size);
#endif
void PlatformDestroyCompositorWidget();
#if defined(USE_AURA)
@ -313,10 +315,9 @@ class CefRenderWidgetHostViewOSR : public content::RenderWidgetHostViewBase,
gfx::AcceleratedWidget compositor_widget_;
std::unique_ptr<content::DelegatedFrameHost> delegated_frame_host_;
std::unique_ptr<ui::Layer> root_layer_;
#endif
viz::LocalSurfaceId local_surface_id_;
viz::ParentLocalSurfaceIdAllocator local_surface_id_allocator_;
#endif
#if defined(OS_WIN)
std::unique_ptr<gfx::WindowImpl> window_;

View File

@ -90,6 +90,10 @@ bool CefRenderWidgetHostViewOSR::ShouldContinueToPauseForFrame() {
return browser_compositor_->ShouldContinueToPauseForFrame();
}
viz::LocalSurfaceId CefRenderWidgetHostViewOSR::GetLocalSurfaceId() const {
return browser_compositor_->GetRendererLocalSurfaceId();
}
ui::Compositor* CefRenderWidgetHostViewOSR::GetCompositor() const {
return browser_compositor_->GetCompositor();
}
@ -129,9 +133,6 @@ void CefRenderWidgetHostViewOSR::PlatformCreateCompositorWidget(
GetDisplay(), AllocateFrameSinkId(is_guest_view_hack)));
}
void CefRenderWidgetHostViewOSR::PlatformResizeCompositorWidget(
const gfx::Size&) {}
void CefRenderWidgetHostViewOSR::PlatformDestroyCompositorWidget() {
DCHECK(window_);

View File

@ -467,7 +467,7 @@ class OSRTestHandler : public RoutingTestHandler,
EXPECT_TRUE(IsFullRepaint(dirtyRects[0], GetScaledInt(kOsrWidth),
GetScaledInt(kOsrHeight)));
#if defined(OS_MACOSX)
EXPECT_EQ(0x807e0308U, *(reinterpret_cast<const uint32*>(buffer)));
EXPECT_EQ(0x807F070EU, *(reinterpret_cast<const uint32*>(buffer)));
#else
EXPECT_EQ(0x80800000U, *(reinterpret_cast<const uint32*>(buffer)));
#endif