From 839710201c389b7f4ed248cb3818e755a37ce977 Mon Sep 17 00:00:00 2001 From: Vlad Zahorodnii Date: Fri, 10 Sep 2021 13:36:04 +0300 Subject: [PATCH] x11: Fix build with EGL_NO_PLATFORM_SPECIFIC_TYPES eglCreateWindowSurface() wants a Window (unsigned long), but with EGL_NO_PLATFORM_SPECIFIC_TYPES, EGLNativeWindowType is defined as an opaque pointer, i.e. void*. BUG: 440372 * asturm 2021-09-21: Merged with upstream commits: 38e24ecd6416a975db0989c21b70d6a4cc242f35 "Fix build with 32-bit" e26ea6bf2313c021db7e5ca5454cd8b1e2e2037f "Fix build on 32bit platforms" * asturm 2021-10-04: Merged with upstream commit: From df11acd46778e1e43183c2660bc9dcb1a8ad3282 Mon Sep 17 00:00:00 2001 From: Vlad Zahorodnii Date: Tue, 21 Sep 2021 17:34:59 +0300 Subject: [PATCH] x11: Cast Window to EGLNativeWindowType using a C cast reinterpret_cast<>() will fail if the types we cast from and to have mismatching sizes. Unfortunately, there are platforms that have Window and EGLNativeWindowType of different size. This results in compilation errors. In order to work around those problematic platforms, this change replaces reinterpret_cast cast with a c style cast. --- src/plugins/platforms/x11/common/eglonxbackend.cpp | 16 +++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff -u a/src/plugins/platforms/x11/common/eglonxbackend.cpp b/src/plugins/platforms/x11/common/eglonxbackend.cpp --- a/src/plugins/platforms/x11/common/eglonxbackend.cpp +++ b/src/plugins/platforms/x11/common/eglonxbackend.cpp @@ -213,15 +213,19 @@ return EGL_NO_SURFACE; } + // Window is 64 bits on a 64-bit architecture whereas xcb_window_t is always 32 bits. + Window nativeWindow = window; + EGLSurface surface = EGL_NO_SURFACE; if (havePlatformBase()) { - // Note: Window is 64 bits on a 64-bit architecture whereas xcb_window_t is - // always 32 bits. eglCreatePlatformWindowSurfaceEXT() expects the - // native_window parameter to be pointer to a Window, so this variable - // cannot be an xcb_window_t. - surface = eglCreatePlatformWindowSurfaceEXT(eglDisplay(), config(), (void *) &window, nullptr); + // eglCreatePlatformWindowSurfaceEXT() expects a pointer to the Window. + surface = eglCreatePlatformWindowSurfaceEXT(eglDisplay(), config(), (void *) &nativeWindow, nullptr); } else { - surface = eglCreateWindowSurface(eglDisplay(), config(), window, nullptr); + // eglCreateWindowSurface() expects a Window, not a pointer to the Window. Use + // a c style cast as there are (buggy) platforms where the size of the Window + // type is not the same as the size of EGLNativeWindowType, reinterpret_cast<>() + // may not compile. + surface = eglCreateWindowSurface(eglDisplay(), config(), (EGLNativeWindowType) nativeWindow, nullptr); } return surface;