diff --git a/clients/presentation-shm.c b/clients/presentation-shm.c index 828cb08d..2bb0aa1c 100644 --- a/clients/presentation-shm.c +++ b/clients/presentation-shm.c @@ -446,7 +446,7 @@ feedback_presented(void *data, struct feedback *feedback = data; struct window *window = feedback->window; struct feedback *prev_feedback = window->received_feedback; - uint64_t seq = ((uint64_t)seq_hi << 32) + seq_lo; + uint64_t seq = u64_from_u32s(seq_hi, seq_lo); const struct timespec *prevpresent; uint32_t commit, present; uint32_t f2c, c2p, f2p; diff --git a/clients/simple-dmabuf-egl.c b/clients/simple-dmabuf-egl.c index 16d47ba9..e63c320c 100644 --- a/clients/simple-dmabuf-egl.c +++ b/clients/simple-dmabuf-egl.c @@ -1010,7 +1010,7 @@ dmabuf_modifiers(void *data, struct zwp_linux_dmabuf_v1 *zwp_linux_dmabuf, uint32_t format, uint32_t modifier_hi, uint32_t modifier_lo) { struct display *d = data; - uint64_t modifier = ((uint64_t)modifier_hi << 32) | modifier_lo; + uint64_t modifier = u64_from_u32s(modifier_hi, modifier_lo); if (format != d->format) { return; diff --git a/clients/simple-dmabuf-v4l.c b/clients/simple-dmabuf-v4l.c index a19570f9..50144986 100644 --- a/clients/simple-dmabuf-v4l.c +++ b/clients/simple-dmabuf-v4l.c @@ -730,7 +730,7 @@ dmabuf_modifier(void *data, struct zwp_linux_dmabuf_v1 *zwp_linux_dmabuf, uint32_t format, uint32_t modifier_hi, uint32_t modifier_lo) { struct display *d = data; - uint64_t modifier = ((uint64_t) modifier_hi << 32 ) | modifier_lo; + uint64_t modifier = u64_from_u32s(modifier_hi, modifier_lo); if (format == d->drm_format && modifier == DRM_FORMAT_MOD_LINEAR) d->requested_format_found = true; diff --git a/clients/window.c b/clients/window.c index 3036bb42..0d9d6cec 100644 --- a/clients/window.c +++ b/clients/window.c @@ -4704,7 +4704,7 @@ relative_pointer_handle_motion(void *data, struct zwp_relative_pointer_v1 *point { struct input *input = data; struct window *window = input->pointer_focus; - uint32_t ms = (((uint64_t) utime_hi) << 32 | utime_lo) / 1000; + uint32_t ms = u64_from_u32s(utime_hi, utime_lo) / 1000; if (window->locked_pointer_motion_handler && window->pointer_locked) { diff --git a/libweston/backend-drm/kms.c b/libweston/backend-drm/kms.c index 0118efa1..6c6e7e59 100644 --- a/libweston/backend-drm/kms.c +++ b/libweston/backend-drm/kms.c @@ -1382,12 +1382,12 @@ drm_pending_state_apply_sync(struct drm_pending_state *pending_state) void drm_output_update_msc(struct drm_output *output, unsigned int seq) { - uint64_t msc_hi = output->base.msc >> 32; + uint32_t msc_hi = output->base.msc >> 32; if (seq < (output->base.msc & 0xffffffff)) msc_hi++; - output->base.msc = (msc_hi << 32) + seq; + output->base.msc = u64_from_u32s(msc_hi, seq); } static void diff --git a/libweston/linux-dmabuf.c b/libweston/linux-dmabuf.c index b73508e3..1a9e31d5 100644 --- a/libweston/linux-dmabuf.c +++ b/libweston/linux-dmabuf.c @@ -37,6 +37,7 @@ #include "linux-dmabuf.h" #include "linux-dmabuf-unstable-v1-server-protocol.h" #include "shared/os-compatibility.h" +#include "shared/helpers.h" #include "libweston-internal.h" #include "shared/weston-drm-fourcc.h" @@ -121,8 +122,7 @@ params_add(struct wl_client *client, if (wl_resource_get_version(params_resource) < ZWP_LINUX_DMABUF_V1_MODIFIER_SINCE_VERSION) buffer->attributes.modifier[plane_idx] = DRM_FORMAT_MOD_INVALID; else - buffer->attributes.modifier[plane_idx] = ((uint64_t)modifier_hi << 32) | - modifier_lo; + buffer->attributes.modifier[plane_idx] = u64_from_u32s(modifier_hi, modifier_lo); buffer->attributes.n_planes++; } diff --git a/shared/helpers.h b/shared/helpers.h index 7b722096..32938eca 100644 --- a/shared/helpers.h +++ b/shared/helpers.h @@ -22,6 +22,8 @@ #ifndef WESTON_HELPERS_H #define WESTON_HELPERS_H +#include + #ifdef __cplusplus extern "C" { #endif @@ -171,6 +173,12 @@ do { \ */ #define WESTON_EXPORT_FOR_TESTS __attribute__ ((visibility("default"))) +static inline uint64_t +u64_from_u32s(uint32_t hi, uint32_t lo) +{ + return ((uint64_t)hi << 32) + lo; +} + #ifdef __cplusplus } #endif diff --git a/shared/timespec-util.h b/shared/timespec-util.h index f79969bb..f76b9537 100644 --- a/shared/timespec-util.h +++ b/shared/timespec-util.h @@ -30,6 +30,7 @@ #include #include #include +#include #define NSEC_PER_SEC 1000000000 @@ -216,7 +217,7 @@ static inline void timespec_from_proto(struct timespec *a, uint32_t tv_sec_hi, uint32_t tv_sec_lo, uint32_t tv_nsec) { - a->tv_sec = ((uint64_t)tv_sec_hi << 32) + tv_sec_lo; + a->tv_sec = u64_from_u32s(tv_sec_hi, tv_sec_lo); a->tv_nsec = tv_nsec; } diff --git a/tests/presentation-test.c b/tests/presentation-test.c index f6e3a7bc..6e2112bd 100644 --- a/tests/presentation-test.c +++ b/tests/presentation-test.c @@ -123,7 +123,7 @@ feedback_presented(void *data, assert(fb->result == FB_PENDING); fb->result = FB_PRESENTED; - fb->seq = ((uint64_t)seq_hi << 32) + seq_lo; + fb->seq = u64_from_u32s(seq_hi, seq_lo); timespec_from_proto(&fb->time, tv_sec_hi, tv_sec_lo, tv_nsec); fb->refresh_nsec = refresh_nsec; fb->flags = flags;