egl: add helper to combine two u32 into one u64
authorEric Engestrom <eric.engestrom@intel.com>
Thu, 16 Aug 2018 14:22:46 +0000 (15:22 +0100)
committerEric Engestrom <eric.engestrom@intel.com>
Tue, 21 Aug 2018 14:50:02 +0000 (15:50 +0100)
Use a helper to avoid the common issues of upcasting after the right shift
(losing the upper bits) and shifting signed values (sign gets shifted too).

Signed-off-by: Eric Engestrom <eric.engestrom@intel.com>
Reviewed-by: Daniel Stone <daniels@collabora.com>
Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
src/egl/drivers/dri2/egl_dri2.c
src/egl/drivers/dri2/egl_dri2.h
src/egl/drivers/dri2/platform_wayland.c
src/egl/drivers/dri2/platform_x11.c

index 1208ebb31568991e532de638f24aa140ee70e140..ab4f134b7de71295ef9c06c7a6c94548d684c02c 100644 (file)
@@ -2424,8 +2424,8 @@ dri2_create_image_dma_buf(_EGLDisplay *disp, _EGLContext *ctx,
     * will be present in attrs.DMABufPlaneModifiersLo[0] and
     * attrs.DMABufPlaneModifiersHi[0] */
    if (attrs.DMABufPlaneModifiersLo[0].IsPresent) {
-      modifier = (uint64_t) attrs.DMABufPlaneModifiersHi[0].Value << 32;
-      modifier |= (uint64_t) (attrs.DMABufPlaneModifiersLo[0].Value & 0xffffffff);
+      modifier = combine_u32_into_u64(attrs.DMABufPlaneModifiersHi[0].Value,
+                                      attrs.DMABufPlaneModifiersLo[0].Value);
       has_modifier = true;
    }
 
index a6588632f776de58df480a3a823d98664be544ec..955725658239e99d8ebe4d41264edd77fccb1ee2 100644 (file)
@@ -528,4 +528,10 @@ dri2_init_surface(_EGLSurface *surf, _EGLDisplay *dpy, EGLint type,
 void
 dri2_fini_surface(_EGLSurface *surf);
 
+static inline uint64_t
+combine_u32_into_u64(uint32_t hi, uint32_t lo)
+{
+   return (((uint64_t) hi) << 32) | (((uint64_t) lo) & 0xffffffff);
+}
+
 #endif /* EGL_DRI2_INCLUDED */
index 43cf00b8ac05aaefb2ec8b20de5c02ec0996e354..11c57de0f8906455cc413b51a5c6653fdb421e5b 100644 (file)
@@ -818,8 +818,7 @@ create_wl_buffer(struct dri2_egl_display *dri2_dpy,
                                            __DRI_IMAGE_ATTRIB_MODIFIER_LOWER,
                                            &mod_lo);
       if (query) {
-         modifier = (uint64_t) mod_hi << 32;
-         modifier |= (uint64_t) (mod_lo & 0xffffffff);
+         modifier = combine_u32_into_u64(mod_hi, mod_lo);
       }
    }
 
@@ -1192,8 +1191,7 @@ dmabuf_handle_modifier(void *data, struct zwp_linux_dmabuf_v1 *dmabuf,
    dri2_dpy->formats |= (1u << visual_idx);
 
    mod = u_vector_add(&dri2_dpy->wl_modifiers[visual_idx]);
-   *mod = (uint64_t) modifier_hi << 32;
-   *mod |= (uint64_t) (modifier_lo & 0xffffffff);
+   *mod = combine_u32_into_u64(modifier_hi, modifier_lo);
 }
 
 static const struct zwp_linux_dmabuf_v1_listener dmabuf_listener = {
index cc912d2b71f58558f4543feb2c4bb71bfd6cf33c..c525b58341159ae4e480992b6ccb95c4ff6d1098 100644 (file)
@@ -915,7 +915,7 @@ dri2_x11_swap_buffers_msc(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *draw,
       reply = xcb_dri2_swap_buffers_reply(dri2_dpy->conn, cookie, NULL);
 
       if (reply) {
-         swap_count = (((int64_t)reply->swap_hi) << 32) | reply->swap_lo;
+         swap_count = combine_u32_into_u64(reply->swap_hi, reply->swap_lo);
          free(reply);
       }
    }