summaryrefslogtreecommitdiffstats
path: root/src/core
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2017-01-25 17:27:42 +0100
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2017-03-01 12:06:28 +0000
commit70d3a577aeefb298df97028acc7018b745116e98 (patch)
tree68897c54efb15bc7ebcd96486e2224080b3226e8 /src/core
parent8fcb5e2e0da39588de5f2318e0a62a265f30c6bd (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.cpp52
-rw-r--r--src/core/render_widget_host_view_qt.h12
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;