9#include <QtWaylandCompositor/QWaylandView>
10#include <QtWaylandCompositor/QWaylandQuickItem>
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
47
48
49
50
51
52
53
54
55
56
57
58
62
63
64QWaylandPresentationTime::QWaylandPresentationTime(QWaylandCompositor *compositor)
65 : QWaylandCompositorExtensionTemplate(compositor, *
new QWaylandPresentationTimePrivate)
71
72
73QWaylandPresentationTime::QWaylandPresentationTime()
74 : QWaylandCompositorExtensionTemplate(*
new QWaylandPresentationTimePrivate)
79
80
81void QWaylandPresentationTime::initialize()
83 Q_D(QWaylandPresentationTime);
85 if (isInitialized()) {
86 qWarning() <<
"QWaylandPresentationTime is already initialized";
90 QWaylandCompositor *compositor =
this->compositor();
91 if (compositor ==
nullptr) {
92 qWarning() <<
"Failed to find QWaylandCompositor when initializing QWaylandPresentationTime";
96 QWaylandCompositorExtensionTemplate::initialize();
98 d->init(compositor->display(), 1);
101QWaylandCompositor *QWaylandPresentationTime::compositor()
const
103 return qobject_cast<QWaylandCompositor *>(extensionContainer());
107
108
109
110
111
112
113
116
117
118
119
120
121void QWaylandPresentationTime::sendFeedback(QQuickWindow *window, quint64 sequence, quint64 tv_sec, quint32 tv_nsec)
126 quint32 refresh_nsec = window->screen()->refreshRate() != 0 ? 1000000000 / window->screen()->refreshRate() : 0;
128 emit presented(sequence, tv_sec, tv_nsec, refresh_nsec);
132
133
134const struct wl_interface *QWaylandPresentationTime::interface()
136 return QWaylandPresentationTimePrivate::interface();
140
141
142QByteArray QWaylandPresentationTime::interfaceName()
144 return QWaylandPresentationTimePrivate::interfaceName();
147PresentationFeedback::PresentationFeedback(QWaylandPresentationTime *pTime, QWaylandSurface *surface,
struct ::wl_client *client, uint32_t id,
int version)
148 : wp_presentation_feedback(client, id, version)
149 , m_presentationTime(pTime)
163 connect(qwls, &QWaylandSurface::damaged,
this, &PresentationFeedback::onSurfaceCommit);
164 connect(qwls, &QWaylandSurface::destroyed,
this, &PresentationFeedback::discard);
166 QWaylandView *view = qwls ? qwls->primaryView() :
nullptr;
169 connect(qwls, &QWaylandSurface::hasContentChanged,
this, &PresentationFeedback::onSurfaceMapped);
173 maybeConnectToWindow(view);
188 QWaylandView *view =
m_surface->primaryView();
190 qWarning() <<
"The mapped surface has no view";
195 maybeConnectToWindow(view);
200 QWaylandQuickItem *item = view ? qobject_cast<QWaylandQuickItem *>(view->renderObject()) :
nullptr;
202 qWarning() <<
"QWaylandPresentationTime only works with QtQuick compositors" << view;
207 connect(item, &QQuickItem::windowChanged,
this, &PresentationFeedback::onWindowChanged);
209 if (!item->window()) {
213 connectToWindow(item->window());
218 QWaylandQuickItem *item = qobject_cast<QWaylandQuickItem *>(sender());
219 QQuickWindow *window = item ? item->window() :
nullptr;
222 qWarning() <<
"QWaylandPresentationTime only works with QtQuick compositors" << item;
225
226
234 connectToWindow(window);
246 connect(window, &QQuickWindow::beforeSynchronizing,
this, &PresentationFeedback::onSync);
247 connect(window, &QQuickWindow::afterFrameEnd,
this, &PresentationFeedback::onSwapped);
252 QQuickWindow *window = qobject_cast<QQuickWindow *>(sender());
255 disconnect(m_surface, &QWaylandSurface::damaged,
this, &PresentationFeedback::onSurfaceCommit);
256 disconnect(window, &QQuickWindow::beforeSynchronizing,
this, &PresentationFeedback::onSync);
263 QQuickWindow *window = qobject_cast<QQuickWindow *>(sender());
266 disconnect(window, &QQuickWindow::afterFrameEnd,
this, &PresentationFeedback::onSwapped);
267 connect(m_presentationTime, &QWaylandPresentationTime::presented,
this, &PresentationFeedback::sendPresented);
279 QWaylandCompositor *compositor = presentationTime()->compositor();
281 qWarning() <<
"No compositor container to send sync_output";
285 QWaylandView *view =
surface()->primaryView();
286 QWaylandOutput *output = view ? view->output() :
nullptr;
287 struct ::wl_resource *r = output ? output->resourceForClient(QWaylandClient::fromWlClient(compositor, resource()->client())) :
nullptr;
293void PresentationFeedback::sendPresented(quint64 sequence, quint64 tv_sec, quint32 tv_nsec, quint32 refresh_nsec)
297 send_presented(tv_sec >> 32, tv_sec, tv_nsec, refresh_nsec, sequence >> 32, sequence,
298 QtWaylandServer::wp_presentation_feedback::kind_vsync
299 | QtWaylandServer::wp_presentation_feedback::kind_hw_clock
300 | QtWaylandServer::wp_presentation_feedback::kind_hw_completion);
307 wl_resource_destroy(resource()->handle);
322 send_clock_id(resource->handle, CLOCK_MONOTONIC);
327 Q_Q(QWaylandPresentationTime);
329 QWaylandSurface *qwls = QWaylandSurface::fromResource(surface);
333 new PresentationFeedback(q, qwls, resource->client(), callback, 1);
338#include "moc_qwaylandpresentationtime_p_p.cpp"
340#include "moc_qwaylandpresentationtime_p.cpp"
void setSurface(QWaylandSurface *)
void wp_presentation_feedback_destroy_resource(Resource *resource) override
QWaylandSurface * surface()
QWaylandSurface * m_surface
QQuickWindow * m_connectedWindow
void wp_presentation_bind_resource(Resource *resource) override