mirror of
https://bitbucket.org/chromiumembedded/cef
synced 2025-06-05 21:39:12 +02:00
macOS: Fix rendering with surface synchronization (issue #2447)
This commit is contained in:
@@ -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;
|
||||||
|
|
||||||
// Configure the VSync interval for the browser process.
|
if (GetCompositor()) {
|
||||||
GetCompositor()->vsync_manager()->SetAuthoritativeVSyncInterval(
|
// Configure the VSync interval for the browser process.
|
||||||
base::TimeDelta::FromMicroseconds(frame_rate_threshold_us_));
|
GetCompositor()->vsync_manager()->SetAuthoritativeVSyncInterval(
|
||||||
|
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
|
||||||
|
@@ -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_;
|
||||||
|
@@ -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_);
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user