From c0e2f9261ff4653ed8f530f38e71c62043f4c1d9 Mon Sep 17 00:00:00 2001 From: Alexandros Frantzis Date: Fri, 19 Oct 2018 12:14:11 +0300 Subject: [PATCH] libweston: Introduce an internal linux sync file API Introduce an internal API for dealing with linux sync files, and use it in the codebase to replace ad-hoc sync file management. The linux_sync_file_is_valid function is not currently used, but will be utilized in upcoming commits to implement the zwp_linux_explicit_synchronization_unstable_v1 protocol. Changes in v5: - Meson support. Changes in v3: - Use parameter name in function documentation. - Move kernel UAPI to separate header file. Changes in v2: - Add function documentation - Remove linux_sync_file_wait() Signed-off-by: Alexandros Frantzis --- Makefile.am | 4 +- libweston/gl-renderer.c | 34 +------- ...ton-sync-file.h => linux-sync-file-uapi.h} | 6 +- libweston/linux-sync-file.c | 82 +++++++++++++++++++ libweston/linux-sync-file.h | 38 +++++++++ libweston/meson.build | 1 + 6 files changed, 130 insertions(+), 35 deletions(-) rename libweston/{weston-sync-file.h => linux-sync-file-uapi.h} (78%) create mode 100644 libweston/linux-sync-file.c create mode 100644 libweston/linux-sync-file.h diff --git a/Makefile.am b/Makefile.am index 358dd7bb..00e298d6 100644 --- a/Makefile.am +++ b/Makefile.am @@ -340,7 +340,9 @@ gl_renderer_la_SOURCES = \ libweston/gl-renderer.c \ libweston/vertex-clipping.c \ libweston/vertex-clipping.h \ - libweston/weston-sync-file.h \ + libweston/linux-sync-file.c \ + libweston/linux-sync-file.h \ + libweston/linux-sync-file-uapi.h \ shared/helpers.h endif diff --git a/libweston/gl-renderer.c b/libweston/gl-renderer.c index c9e5a8fc..1a7577e3 100644 --- a/libweston/gl-renderer.c +++ b/libweston/gl-renderer.c @@ -40,13 +40,8 @@ #include #include #include -#include -#ifdef HAVE_LINUX_SYNC_FILE_H -#include -#else -#include "weston-sync-file.h" -#endif +#include "linux-sync-file.h" #include "timeline.h" @@ -315,25 +310,6 @@ get_renderer(struct weston_compositor *ec) return (struct gl_renderer *)ec->renderer; } -static int -linux_sync_file_read_timestamp(int fd, uint64_t *ts) -{ - struct sync_file_info file_info = { { 0 } }; - struct sync_fence_info fence_info = { { 0 } }; - - assert(ts != NULL); - - file_info.sync_fence_info = (uint64_t)(uintptr_t)&fence_info; - file_info.num_fences = 1; - - if (ioctl(fd, SYNC_IOC_FILE_INFO, &file_info) < 0) - return -1; - - *ts = fence_info.timestamp_ns; - - return 0; -} - static void timeline_render_point_destroy(struct timeline_render_point *trp) { @@ -351,13 +327,9 @@ timeline_render_point_handler(int fd, uint32_t mask, void *data) "renderer_gpu_begin" : "renderer_gpu_end"; if (mask & WL_EVENT_READABLE) { - uint64_t ts; - - if (linux_sync_file_read_timestamp(trp->fd, &ts) == 0) { - struct timespec tspec = { 0 }; - - timespec_add_nsec(&tspec, &tspec, ts); + struct timespec tspec = { 0 }; + if (linux_sync_file_read_timestamp(trp->fd, &tspec) == 0) { TL_POINT(tp_name, TLP_GPU(&tspec), TLP_OUTPUT(trp->output), TLP_END); } diff --git a/libweston/weston-sync-file.h b/libweston/linux-sync-file-uapi.h similarity index 78% rename from libweston/weston-sync-file.h rename to libweston/linux-sync-file-uapi.h index 114e0b6e..cd30665f 100644 --- a/libweston/weston-sync-file.h +++ b/libweston/linux-sync-file-uapi.h @@ -1,7 +1,7 @@ /* Sync file Linux kernel UAPI */ -#ifndef WESTON_SYNC_FILE_H -#define WESTON_SYNC_FILE_H +#ifndef WESTON_LINUX_SYNC_FILE_UAPI_H +#define WESTON_LINUX_SYNC_FILE_UAPI_H #include #include @@ -27,4 +27,4 @@ struct sync_file_info { #define SYNC_IOC_MAGIC '>' #define SYNC_IOC_FILE_INFO _IOWR(SYNC_IOC_MAGIC, 4, struct sync_file_info) -#endif +#endif /* WESTON_LINUX_SYNC_FILE_UAPI_H */ diff --git a/libweston/linux-sync-file.c b/libweston/linux-sync-file.c new file mode 100644 index 00000000..913fb8da --- /dev/null +++ b/libweston/linux-sync-file.c @@ -0,0 +1,82 @@ +/* + * Copyright © 2018 Collabora, Ltd + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "config.h" + +#include +#include +#include +#include +#include + +#ifdef HAVE_LINUX_SYNC_FILE_H +#include +#else +#include "linux-sync-file-uapi.h" +#endif + +#include "linux-sync-file.h" +#include "shared/timespec-util.h" + +/* Check that a file descriptor represents a valid sync file + * + * \param fd[in] a file descriptor + * \return true if fd is a valid sync file, false otherwise + */ +bool +linux_sync_file_is_valid(int fd) +{ + struct sync_file_info file_info = { { 0 } }; + + if (ioctl(fd, SYNC_IOC_FILE_INFO, &file_info) < 0) + return false; + + return file_info.num_fences > 0; +} + +/* Read the timestamp stored in a sync file + * + * \param fd[in] fd a file descriptor for a sync file + * \param ts[out] the timespec struct to fill with the timestamp + * \return 0 if a timestamp was read, -1 on error + */ +int +linux_sync_file_read_timestamp(int fd, struct timespec *ts) +{ + struct sync_file_info file_info = { { 0 } }; + struct sync_fence_info fence_info = { { 0 } }; + + assert(ts != NULL); + + file_info.sync_fence_info = (uint64_t)(uintptr_t)&fence_info; + file_info.num_fences = 1; + + if (ioctl(fd, SYNC_IOC_FILE_INFO, &file_info) < 0) + return -1; + + timespec_from_nsec(ts, fence_info.timestamp_ns); + + return 0; +} diff --git a/libweston/linux-sync-file.h b/libweston/linux-sync-file.h new file mode 100644 index 00000000..b831fa1e --- /dev/null +++ b/libweston/linux-sync-file.h @@ -0,0 +1,38 @@ +/* + * Copyright © 2018 Collabora, Ltd + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef WESTON_LINUX_SYNC_FILE_H +#define WESTON_LINUX_SYNC_FILE_H + +#include +#include + +bool +linux_sync_file_is_valid(int fd); + +int +linux_sync_file_read_timestamp(int fd, struct timespec *ts); + +#endif /* WESTON_LINUX_SYNC_FILE_H */ diff --git a/libweston/meson.build b/libweston/meson.build index 64efdd95..63e75ea6 100644 --- a/libweston/meson.build +++ b/libweston/meson.build @@ -433,6 +433,7 @@ if get_option('renderer-gl') srcs_renderer_gl = [ 'gl-renderer.c', + 'linux-sync-file.c', 'vertex-clipping.c', '../shared/matrix.c', linux_dmabuf_unstable_v1_protocol_c,