mirror of
https://github.com/hyprwm/wlroots-hyprland.git
synced 2024-11-25 22:25:58 +01:00
backend/wayland: report parent presentation clock
There's no guarantee that the parent Wayland compositor uses CLOCK_MONOTONIC for reporting presentation timestamps, they could be using e.g. CLOCK_MONOTONIC_RAW or another system-specific clock. Forward the value via wlr_backend_impl.get_presentation_clock. References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3254#note_1143061
This commit is contained in:
parent
3d73b899ff
commit
3b93da70a0
2 changed files with 20 additions and 0 deletions
|
@ -75,6 +75,16 @@ static const struct xdg_wm_base_listener xdg_wm_base_listener = {
|
||||||
xdg_wm_base_handle_ping,
|
xdg_wm_base_handle_ping,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void presentation_handle_clock_id(void *data,
|
||||||
|
struct wp_presentation *presentation, uint32_t clock) {
|
||||||
|
struct wlr_wl_backend *wl = data;
|
||||||
|
wl->presentation_clock = clock;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct wp_presentation_listener presentation_listener = {
|
||||||
|
.clock_id = presentation_handle_clock_id,
|
||||||
|
};
|
||||||
|
|
||||||
static void linux_dmabuf_v1_handle_format(void *data,
|
static void linux_dmabuf_v1_handle_format(void *data,
|
||||||
struct zwp_linux_dmabuf_v1 *linux_dmabuf_v1, uint32_t format) {
|
struct zwp_linux_dmabuf_v1 *linux_dmabuf_v1, uint32_t format) {
|
||||||
// Note, this event is deprecated
|
// Note, this event is deprecated
|
||||||
|
@ -227,6 +237,8 @@ static void registry_global(void *data, struct wl_registry *registry,
|
||||||
} else if (strcmp(iface, wp_presentation_interface.name) == 0) {
|
} else if (strcmp(iface, wp_presentation_interface.name) == 0) {
|
||||||
wl->presentation = wl_registry_bind(registry, name,
|
wl->presentation = wl_registry_bind(registry, name,
|
||||||
&wp_presentation_interface, 1);
|
&wp_presentation_interface, 1);
|
||||||
|
wp_presentation_add_listener(wl->presentation,
|
||||||
|
&presentation_listener, wl);
|
||||||
} else if (strcmp(iface, zwp_tablet_manager_v2_interface.name) == 0) {
|
} else if (strcmp(iface, zwp_tablet_manager_v2_interface.name) == 0) {
|
||||||
wl->tablet_manager = wl_registry_bind(registry, name,
|
wl->tablet_manager = wl_registry_bind(registry, name,
|
||||||
&zwp_tablet_manager_v2_interface, 1);
|
&zwp_tablet_manager_v2_interface, 1);
|
||||||
|
@ -352,6 +364,11 @@ static void backend_destroy(struct wlr_backend *backend) {
|
||||||
free(wl);
|
free(wl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static clockid_t backend_get_presentation_clock(struct wlr_backend *backend) {
|
||||||
|
struct wlr_wl_backend *wl = get_wl_backend_from_backend(backend);
|
||||||
|
return wl->presentation_clock;
|
||||||
|
}
|
||||||
|
|
||||||
static int backend_get_drm_fd(struct wlr_backend *backend) {
|
static int backend_get_drm_fd(struct wlr_backend *backend) {
|
||||||
struct wlr_wl_backend *wl = get_wl_backend_from_backend(backend);
|
struct wlr_wl_backend *wl = get_wl_backend_from_backend(backend);
|
||||||
return wl->drm_fd;
|
return wl->drm_fd;
|
||||||
|
@ -366,6 +383,7 @@ static uint32_t get_buffer_caps(struct wlr_backend *backend) {
|
||||||
static const struct wlr_backend_impl backend_impl = {
|
static const struct wlr_backend_impl backend_impl = {
|
||||||
.start = backend_start,
|
.start = backend_start,
|
||||||
.destroy = backend_destroy,
|
.destroy = backend_destroy,
|
||||||
|
.get_presentation_clock = backend_get_presentation_clock,
|
||||||
.get_drm_fd = backend_get_drm_fd,
|
.get_drm_fd = backend_get_drm_fd,
|
||||||
.get_buffer_caps = get_buffer_caps,
|
.get_buffer_caps = get_buffer_caps,
|
||||||
};
|
};
|
||||||
|
@ -397,6 +415,7 @@ struct wlr_backend *wlr_wl_backend_create(struct wl_display *display,
|
||||||
wl_list_init(&wl->outputs);
|
wl_list_init(&wl->outputs);
|
||||||
wl_list_init(&wl->seats);
|
wl_list_init(&wl->seats);
|
||||||
wl_list_init(&wl->buffers);
|
wl_list_init(&wl->buffers);
|
||||||
|
wl->presentation_clock = CLOCK_MONOTONIC;
|
||||||
|
|
||||||
wl->remote_display = wl_display_connect(remote);
|
wl->remote_display = wl_display_connect(remote);
|
||||||
if (!wl->remote_display) {
|
if (!wl->remote_display) {
|
||||||
|
|
|
@ -40,6 +40,7 @@ struct wlr_wl_backend {
|
||||||
struct zwp_relative_pointer_manager_v1 *zwp_relative_pointer_manager_v1;
|
struct zwp_relative_pointer_manager_v1 *zwp_relative_pointer_manager_v1;
|
||||||
struct wl_list seats; // wlr_wl_seat.link
|
struct wl_list seats; // wlr_wl_seat.link
|
||||||
struct zwp_tablet_manager_v2 *tablet_manager;
|
struct zwp_tablet_manager_v2 *tablet_manager;
|
||||||
|
clockid_t presentation_clock;
|
||||||
struct wlr_drm_format_set shm_formats;
|
struct wlr_drm_format_set shm_formats;
|
||||||
struct wlr_drm_format_set linux_dmabuf_v1_formats;
|
struct wlr_drm_format_set linux_dmabuf_v1_formats;
|
||||||
struct wl_drm *legacy_drm;
|
struct wl_drm *legacy_drm;
|
||||||
|
|
Loading…
Reference in a new issue