KWin
Loading...
Searching...
No Matches
presentationtime.cpp
Go to the documentation of this file.
1/*
2 SPDX-FileCopyrightText: 2023 Xaver Hugl <xaver.hugl@gmail.com>
3
4 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
5*/
6#include "presentationtime.h"
7#include "display.h"
8#include "output.h"
9#include "surface.h"
10#include "surface_p.h"
11
12namespace KWin
13{
14
16 : QObject(parent)
17 , QtWaylandServer::wp_presentation(*display, 1)
18{
19}
20
21void PresentationTime::wp_presentation_bind_resource(Resource *resource)
22{
23 send_clock_id(resource->handle, CLOCK_MONOTONIC);
24}
25
26void PresentationTime::wp_presentation_destroy(Resource *resource)
27{
28 wl_resource_destroy(resource->handle);
29}
30
31void PresentationTime::wp_presentation_feedback(Resource *resource, wl_resource *surface, uint32_t callback)
32{
33 SurfaceInterface *surf = SurfaceInterface::get(surface);
34 SurfaceInterfacePrivate *surfPriv = SurfaceInterfacePrivate::get(surf);
35
36 auto &feedback = surfPriv->pending->presentationFeedback;
37 if (!feedback) {
38 feedback = std::make_unique<PresentationTimeFeedback>();
39 }
40
41 wl_resource *feedbackResource = wl_resource_create(resource->client(), &wp_presentation_feedback_interface, resource->version(), callback);
42 wl_resource_set_implementation(feedbackResource, nullptr, nullptr, [](wl_resource *resource) {
43 wl_list_remove(wl_resource_get_link(resource));
44 });
45
46 wl_list_insert(feedback->resources.prev, wl_resource_get_link(feedbackResource));
47}
48
53
55{
56 wl_resource *resource;
57 wl_resource *tmp;
58 wl_resource_for_each_safe (resource, tmp, &resources) {
59 wp_presentation_feedback_send_discarded(resource);
60 wl_resource_destroy(resource);
61 }
62}
63
64void PresentationTimeFeedback::presented(std::chrono::nanoseconds refreshCycleDuration, std::chrono::nanoseconds timestamp, PresentationMode mode)
65{
66 const auto secs = std::chrono::duration_cast<std::chrono::seconds>(timestamp);
67 const uint32_t tvSecHi = secs.count() >> 32;
68 const uint32_t tvSecLo = secs.count() & 0xffffffff;
69 const uint32_t tvNsec = (timestamp - secs).count();
70
71 const bool adaptiveSync = mode == PresentationMode::AdaptiveSync || mode == PresentationMode::AdaptiveAsync;
72 const uint32_t refreshDuration = adaptiveSync ? 0 : refreshCycleDuration.count();
73 uint32_t flags = WP_PRESENTATION_FEEDBACK_KIND_HW_CLOCK | WP_PRESENTATION_FEEDBACK_KIND_HW_COMPLETION;
75 flags |= WP_PRESENTATION_FEEDBACK_KIND_VSYNC;
76 }
77
78 wl_resource *resource;
79 wl_resource *tmp;
80 wl_resource_for_each_safe (resource, tmp, &resources) {
81 wp_presentation_feedback_send_presented(resource, tvSecHi, tvSecLo, tvNsec, refreshDuration, 0, 0, flags);
82 wl_resource_destroy(resource);
83 }
84}
85}
Class holding the Wayland server display loop.
Definition display.h:34
void presented(std::chrono::nanoseconds refreshCycleDuration, std::chrono::nanoseconds timestamp, PresentationMode mode) override
PresentationTime(Display *display, QObject *parent)
static SurfaceInterface * get(wl_resource *native)
Definition surface.cpp:819
static SurfaceInterfacePrivate * get(SurfaceInterface *surface)
Definition surface_p.h:99
PresentationMode
Definition globals.h:276