From 0a884d730455c3faf1ea48d4693c14f9f1e0c869 Mon Sep 17 00:00:00 2001 From: Emil Velikov Date: Wed, 8 Apr 2020 11:46:47 +0100 Subject: [PATCH] egl: simplify client/platform extension handling For GLVND reasons the client/platform extensions strings should be split. While in the non GLVND case they're one big string. Currently we handle this distinction at run-time for not obvious reason. Adding additional code and complexity. Swap those with a few well placed #if USE_LIBGLVND guards. As a side result this removes a minor memory leak due to the concatenation in the non GLVND case. Signed-off-by: Emil Velikov Part-of: --- src/egl/main/eglapi.c | 8 +++---- src/egl/main/eglglobals.c | 50 ++++++++++----------------------------- src/egl/main/eglglobals.h | 13 +++++----- src/egl/main/eglglvnd.c | 11 ++------- 4 files changed, 23 insertions(+), 59 deletions(-) diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c index 51557be0864..58cc9032925 100644 --- a/src/egl/main/eglapi.c +++ b/src/egl/main/eglapi.c @@ -692,13 +692,11 @@ eglQueryString(EGLDisplay dpy, EGLint name) _EGLDisplay *disp; _EGLDriver *drv; +#if !USE_LIBGLVND if (dpy == EGL_NO_DISPLAY && name == EGL_EXTENSIONS) { - const char *ret = _eglGetClientExtensionString(); - if (ret != NULL) - RETURN_EGL_SUCCESS(NULL, ret); - else - RETURN_EGL_ERROR(NULL, EGL_BAD_ALLOC, NULL); + RETURN_EGL_SUCCESS(NULL, _eglGlobal.ClientExtensionString); } +#endif disp = _eglLockDisplay(dpy); _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, NULL); diff --git a/src/egl/main/eglglobals.c b/src/egl/main/eglglobals.c index 8a8c03c924f..6811048bdf7 100644 --- a/src/egl/main/eglglobals.c +++ b/src/egl/main/eglglobals.c @@ -62,16 +62,27 @@ struct _egl_global _eglGlobal = _eglFiniDisplay, }, +#if USE_LIBGLVND .ClientOnlyExtensionString = +#else + .ClientExtensionString = +#endif "EGL_EXT_client_extensions" " EGL_EXT_device_base" " EGL_EXT_device_enumeration" " EGL_EXT_device_query" " EGL_EXT_platform_base" " EGL_KHR_client_get_all_proc_addresses" - " EGL_KHR_debug", + " EGL_KHR_debug" +#if USE_LIBGLVND + , .PlatformExtensionString = +#else + " " +#endif + + "EGL_EXT_platform_device" #ifdef HAVE_WAYLAND_PLATFORM " EGL_EXT_platform_wayland" #endif @@ -84,11 +95,8 @@ struct _egl_global _eglGlobal = #ifdef HAVE_SURFACELESS_PLATFORM " EGL_MESA_platform_surfaceless" #endif - " EGL_EXT_platform_device" "", - .ClientExtensionString = NULL, - .debugCallback = NULL, .debugTypesEnabled = _EGL_DEBUG_BIT_CRITICAL | _EGL_DEBUG_BIT_ERROR, }; @@ -123,40 +131,6 @@ _eglAddAtExitCall(void (*func)(void)) } } -const char * -_eglGetClientExtensionString(void) -{ - const char *ret; - - mtx_lock(_eglGlobal.Mutex); - - if (_eglGlobal.ClientExtensionString == NULL) { - size_t clientLen = strlen(_eglGlobal.ClientOnlyExtensionString); - size_t platformLen = strlen(_eglGlobal.PlatformExtensionString); - - _eglGlobal.ClientExtensionString = (char *) malloc(clientLen + platformLen + 1); - if (_eglGlobal.ClientExtensionString != NULL) { - char *ptr = _eglGlobal.ClientExtensionString; - - memcpy(ptr, _eglGlobal.ClientOnlyExtensionString, clientLen); - ptr += clientLen; - - if (platformLen > 0) { - // Note that if PlatformExtensionString is not empty, then it will - // already have a leading space. - assert(_eglGlobal.PlatformExtensionString[0] == ' '); - memcpy(ptr, _eglGlobal.PlatformExtensionString, platformLen); - ptr += platformLen; - } - *ptr = '\0'; - } - } - ret = _eglGlobal.ClientExtensionString; - - mtx_unlock(_eglGlobal.Mutex); - return ret; -} - EGLBoolean _eglPointerIsDereferencable(void *p) { diff --git a/src/egl/main/eglglobals.h b/src/egl/main/eglglobals.h index 63bea4ebc38..fc3b6bd62a7 100644 --- a/src/egl/main/eglglobals.h +++ b/src/egl/main/eglglobals.h @@ -61,13 +61,15 @@ struct _egl_global /* * Under libglvnd, the client extension string has to be split into two - * strings, one for platform extensions, and one for everything else. So, - * define separate strings for them. _eglGetClientExtensionString will - * concatenate them together for a non-libglvnd build. + * strings, one for platform extensions, and one for everything else. + * For a non-glvnd build create a concatenated one. */ +#if USE_LIBGLVND const char *ClientOnlyExtensionString; const char *PlatformExtensionString; - char *ClientExtensionString; +#else + const char *ClientExtensionString; +#endif EGLDEBUGPROCKHR debugCallback; unsigned int debugTypesEnabled; @@ -86,9 +88,6 @@ static inline unsigned int DebugBitFromType(EGLenum type) return (1 << (type - EGL_DEBUG_MSG_CRITICAL_KHR)); } -extern const char * -_eglGetClientExtensionString(void); - /** * Perform validity checks on a generic pointer. */ diff --git a/src/egl/main/eglglvnd.c b/src/egl/main/eglglvnd.c index 6b984ed6c28..81fdb4508cb 100644 --- a/src/egl/main/eglglvnd.c +++ b/src/egl/main/eglglvnd.c @@ -24,15 +24,8 @@ __eglGLVNDQueryString(EGLDisplay dpy, EGLenum name) static const char * __eglGLVNDGetVendorString(int name) { - if (name == __EGL_VENDOR_STRING_PLATFORM_EXTENSIONS) { - const char *str = _eglGlobal.PlatformExtensionString; - // The platform extension string may have a leading space. If it does, - // then skip over it. - while (*str == ' ') { - str++; - } - return str; - } + if (name == __EGL_VENDOR_STRING_PLATFORM_EXTENSIONS) + return _eglGlobal.PlatformExtensionString; return NULL; } -- 2.30.2