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

View File

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

View File

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

View File

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