diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2017-01-25 17:27:42 +0100 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2017-03-01 12:06:28 +0000 |
commit | 70d3a577aeefb298df97028acc7018b745116e98 (patch) | |
tree | 68897c54efb15bc7ebcd96486e2224080b3226e8 /src/core | |
parent | 8fcb5e2e0da39588de5f2318e0a62a265f30c6bd (diff) |
Add beginFrameProvider
We now need to tick/sync frames ourselves. This provides a quick way
to do that without touching too much code.
Change-Id: I3820d7ef8dbc8e3a224a48ee28c489bb830bb1da
Reviewed-by: Michal Klocek <michal.klocek@qt.io>
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/render_widget_host_view_qt.cpp | 52 | ||||
-rw-r--r-- | src/core/render_widget_host_view_qt.h | 12 |
2 files changed, 59 insertions, 5 deletions
diff --git a/src/core/render_widget_host_view_qt.cpp b/src/core/render_widget_host_view_qt.cpp index 2b0539ac9..46057c3e4 100644 --- a/src/core/render_widget_host_view_qt.cpp +++ b/src/core/render_widget_host_view_qt.cpp @@ -52,7 +52,7 @@ #include "web_event_factory.h" #include "base/command_line.h" -#include "cc/output/compositor_frame_ack.h" +#include "cc/output/direct_renderer.h" #include "content/browser/accessibility/browser_accessibility_state_impl.h" #include "content/browser/renderer_host/render_view_host_impl.h" #include "content/browser/renderer_host/text_input_manager.h" @@ -241,6 +241,9 @@ RenderWidgetHostViewQt::RenderWidgetHostViewQt(content::RenderWidgetHost* widget , m_imeInProgress(false) , m_receivedEmptyImeText(false) , m_initPending(false) + , m_beginFrameSource(nullptr) + , m_needsBeginFrames(false) + , m_addedFrameObserver(false) { m_host->SetView(this); #ifndef QT_NO_ACCESSIBILITY @@ -248,6 +251,9 @@ RenderWidgetHostViewQt::RenderWidgetHostViewQt(content::RenderWidgetHost* widget if (QAccessible::isActive()) content::BrowserAccessibilityStateImpl::GetInstance()->EnableAccessibility(); #endif // QT_NO_ACCESSIBILITY + auto* task_runner = base::ThreadTaskRunnerHandle::Get().get(); + m_beginFrameSource.reset(new cc::DelayBasedBeginFrameSource( + base::MakeUnique<cc::DelayBasedTimeSource>(task_runner))); } RenderWidgetHostViewQt::~RenderWidgetHostViewQt() @@ -846,11 +852,12 @@ void RenderWidgetHostViewQt::ProcessAckedTouchEvent(const content::TouchEventWit void RenderWidgetHostViewQt::sendDelegatedFrameAck() { - cc::CompositorFrameAck ack; - m_resourcesToRelease.swap(ack.resources); - content::RenderWidgetHostImpl::SendSwapCompositorFrameAck( + m_beginFrameSource->DidFinishFrame(this, 0); + cc::ReturnedResourceArray resources; + m_resourcesToRelease.swap(resources); + content::RenderWidgetHostImpl::SendReclaimCompositorResources( m_host->GetRoutingID(), m_pendingOutputSurfaceId, - m_host->GetProcess()->GetID(), ack); + m_host->GetProcess()->GetID(), true, resources); } void RenderWidgetHostViewQt::processMotionEvent(const ui::MotionEvent &motionEvent) @@ -1251,4 +1258,39 @@ void RenderWidgetHostViewQt::handleFocusEvent(QFocusEvent *ev) } } +void RenderWidgetHostViewQt::SetNeedsBeginFrames(bool needs_begin_frames) +{ + m_needsBeginFrames = needs_begin_frames; + updateNeedsBeginFramesInternal(); +} + +void RenderWidgetHostViewQt::updateNeedsBeginFramesInternal() +{ + if (!m_beginFrameSource) + return; + + if (m_addedFrameObserver == m_needsBeginFrames) + return; + + if (m_needsBeginFrames) + m_beginFrameSource->AddObserver(this); + else + m_beginFrameSource->RemoveObserver(this); + m_addedFrameObserver = m_needsBeginFrames; +} + +bool RenderWidgetHostViewQt::OnBeginFrameDerivedImpl(const cc::BeginFrameArgs& args) +{ + m_beginFrameSource->OnUpdateVSyncParameters(args.frame_time, args.interval); + m_host->Send(new ViewMsg_BeginFrame(m_host->GetRoutingID(), args)); + return true; +} + +void RenderWidgetHostViewQt::OnBeginFrameSourcePausedChanged(bool paused) +{ + // Ignored for now. If the begin frame source is paused, the renderer + // doesn't need to be informed about it and will just not receive more + // begin frames. +} + } // namespace QtWebEngineCore diff --git a/src/core/render_widget_host_view_qt.h b/src/core/render_widget_host_view_qt.h index 6fc655f09..8871d88ce 100644 --- a/src/core/render_widget_host_view_qt.h +++ b/src/core/render_widget_host_view_qt.h @@ -43,6 +43,7 @@ #include "render_widget_host_view_qt_delegate.h" #include "base/memory/weak_ptr.h" +#include "cc/scheduler/begin_frame_source.h" #include "cc/resources/transferable_resource.h" #include "content/browser/accessibility/browser_accessibility_manager.h" #include "content/browser/renderer_host/render_widget_host_view_base.h" @@ -99,6 +100,7 @@ class RenderWidgetHostViewQt , public ui::GestureProviderClient , public RenderWidgetHostViewQtDelegateClient , public base::SupportsWeakPtr<RenderWidgetHostViewQt> + , public cc::BeginFrameObserverBase #ifndef QT_NO_ACCESSIBILITY , public QAccessible::ActivationObserver #endif // QT_NO_ACCESSIBILITY @@ -157,6 +159,7 @@ public: virtual void ClearCompositorFrame() Q_DECL_OVERRIDE; virtual void LockCompositingSurface() Q_DECL_OVERRIDE; virtual void UnlockCompositingSurface() Q_DECL_OVERRIDE; + virtual void SetNeedsBeginFrames(bool needs_begin_frames) Q_DECL_OVERRIDE; // Overridden from RenderWidgetHostViewBase. virtual void SelectionChanged(const base::string16 &text, size_t offset, const gfx::Range &range) Q_DECL_OVERRIDE; @@ -174,6 +177,10 @@ public: virtual bool forwardEvent(QEvent *) Q_DECL_OVERRIDE; virtual QVariant inputMethodQuery(Qt::InputMethodQuery query) Q_DECL_OVERRIDE; + // cc::BeginFrameObserverBase implementation. + bool OnBeginFrameDerivedImpl(const cc::BeginFrameArgs& args) override; + void OnBeginFrameSourcePausedChanged(bool paused) override; + void handleMouseEvent(QMouseEvent*); void handleKeyEvent(QKeyEvent*); void handleWheelEvent(QWheelEvent*); @@ -209,6 +216,7 @@ private: void clearPreviousTouchMotionState(); QList<QTouchEvent::TouchPoint> mapTouchPointIds(const QList<QTouchEvent::TouchPoint> &inputPoints); float dpiScale() const; + void updateNeedsBeginFramesInternal(); bool IsPopup() const; @@ -238,6 +246,10 @@ private: bool m_initPending; + std::unique_ptr<cc::SyntheticBeginFrameSource> m_beginFrameSource; + bool m_needsBeginFrames; + bool m_addedFrameObserver; + gfx::Vector2dF m_lastScrollOffset; gfx::SizeF m_lastContentsSize; |