X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fegl%2Fmain%2Fegldisplay.c;h=d882a8f617c20097594d0ae818ca8c095ea78e1e;hb=f49805c441aa787c8efb281d311d2d54c69ca84f;hp=f09b2e96403bb2f945676ec2a5ac92dcd1818ada;hpb=773ff93bc4b51c051f49c1c5198f56f5cea6665b;p=mesa.git diff --git a/src/egl/main/egldisplay.c b/src/egl/main/egldisplay.c index f09b2e96403..d882a8f617c 100644 --- a/src/egl/main/egldisplay.c +++ b/src/egl/main/egldisplay.c @@ -35,8 +35,11 @@ #include #include #include +#include #include #include "c11/threads.h" +#include "util/macros.h" +#include "util/os_file.h" #include "util/u_atomic.h" #include "eglcontext.h" @@ -65,13 +68,14 @@ static const struct { _EGLPlatformType platform; const char *name; -} egl_platforms[_EGL_NUM_PLATFORMS] = { +} egl_platforms[] = { { _EGL_PLATFORM_X11, "x11" }, { _EGL_PLATFORM_WAYLAND, "wayland" }, { _EGL_PLATFORM_DRM, "drm" }, { _EGL_PLATFORM_ANDROID, "android" }, { _EGL_PLATFORM_HAIKU, "haiku" }, { _EGL_PLATFORM_SURFACELESS, "surfaceless" }, + { _EGL_PLATFORM_DEVICE, "device" }, }; @@ -85,6 +89,9 @@ _eglGetNativePlatformFromEnv(void) const char *plat_name; EGLint i; + static_assert(ARRAY_SIZE(egl_platforms) == _EGL_NUM_PLATFORMS, + "Missing platform"); + plat_name = getenv("EGL_PLATFORM"); /* try deprecated env variable */ if (!plat_name || !plat_name[0]) @@ -92,13 +99,16 @@ _eglGetNativePlatformFromEnv(void) if (!plat_name || !plat_name[0]) return _EGL_INVALID_PLATFORM; - for (i = 0; i < _EGL_NUM_PLATFORMS; i++) { + for (i = 0; i < ARRAY_SIZE(egl_platforms); i++) { if (strcmp(egl_platforms[i].name, plat_name) == 0) { plat = egl_platforms[i].platform; break; } } + if (plat == _EGL_INVALID_PLATFORM) + _eglLog(_EGL_WARNING, "invalid EGL_PLATFORM given"); + return plat; } @@ -129,15 +139,6 @@ _eglNativePlatformDetectNativeDisplay(void *nativeDisplay) if (first_pointer == gbm_create_device) return _EGL_PLATFORM_DRM; #endif - -#ifdef HAVE_X11_PLATFORM - /* If not matched to any other platform, fallback to x11. */ - return _EGL_PLATFORM_X11; -#endif - -#ifdef HAVE_HAIKU_PLATFORM - return _EGL_PLATFORM_HAIKU; -#endif } return _EGL_INVALID_PLATFORM; @@ -150,33 +151,23 @@ _eglNativePlatformDetectNativeDisplay(void *nativeDisplay) _EGLPlatformType _eglGetNativePlatform(void *nativeDisplay) { - static _EGLPlatformType native_platform = _EGL_INVALID_PLATFORM; - _EGLPlatformType detected_platform = native_platform; + _EGLPlatformType detected_platform = _eglGetNativePlatformFromEnv(); + const char *detection_method = "environment"; if (detected_platform == _EGL_INVALID_PLATFORM) { - const char *detection_method; - - detected_platform = _eglGetNativePlatformFromEnv(); - detection_method = "environment overwrite"; - - if (detected_platform == _EGL_INVALID_PLATFORM) { - detected_platform = _eglNativePlatformDetectNativeDisplay(nativeDisplay); - detection_method = "autodetected"; - } - - if (detected_platform == _EGL_INVALID_PLATFORM) { - detected_platform = _EGL_NATIVE_PLATFORM; - detection_method = "build-time configuration"; - } - - _eglLog(_EGL_DEBUG, "Native platform type: %s (%s)", - egl_platforms[detected_platform].name, detection_method); + detected_platform = _eglNativePlatformDetectNativeDisplay(nativeDisplay); + detection_method = "autodetected"; + } - p_atomic_cmpxchg(&native_platform, _EGL_INVALID_PLATFORM, - detected_platform); + if (detected_platform == _EGL_INVALID_PLATFORM) { + detected_platform = _EGL_NATIVE_PLATFORM; + detection_method = "build-time configuration"; } - return native_platform; + _eglLog(_EGL_DEBUG, "Native platform type: %s (%s)", + egl_platforms[detected_platform].name, detection_method); + + return detected_platform; } @@ -261,12 +252,10 @@ _eglFindDisplay(_EGLPlatformType plat, void *plat_dpy, mtx_lock(_eglGlobal.Mutex); /* search the display list first */ - disp = _eglGlobal.DisplayList; - while (disp) { + for (disp = _eglGlobal.DisplayList; disp; disp = disp->Next) { if (disp->Platform == plat && disp->PlatformDisplay == plat_dpy && _eglSameAttribs(disp->Options.Attribs, attrib_list)) break; - disp = disp->Next; } /* create a new display */ @@ -304,9 +293,10 @@ out: * Destroy the contexts and surfaces that are linked to the display. */ void -_eglReleaseDisplayResources(_EGLDriver *drv, _EGLDisplay *display) +_eglReleaseDisplayResources(_EGLDisplay *display) { _EGLResource *list; + const _EGLDriver *drv = display->Driver; list = display->ResourceLists[_EGL_RESOURCE_CONTEXT]; while (list) { @@ -314,7 +304,7 @@ _eglReleaseDisplayResources(_EGLDriver *drv, _EGLDisplay *display) list = list->Next; _eglUnlinkContext(ctx); - drv->API.DestroyContext(drv, display, ctx); + drv->DestroyContext(display, ctx); } assert(!display->ResourceLists[_EGL_RESOURCE_CONTEXT]); @@ -324,7 +314,7 @@ _eglReleaseDisplayResources(_EGLDriver *drv, _EGLDisplay *display) list = list->Next; _eglUnlinkSurface(surf); - drv->API.DestroySurface(drv, display, surf); + drv->DestroySurface(display, surf); } assert(!display->ResourceLists[_EGL_RESOURCE_SURFACE]); @@ -334,7 +324,7 @@ _eglReleaseDisplayResources(_EGLDriver *drv, _EGLDisplay *display) list = list->Next; _eglUnlinkImage(image); - drv->API.DestroyImageKHR(drv, display, image); + drv->DestroyImageKHR(display, image); } assert(!display->ResourceLists[_EGL_RESOURCE_IMAGE]); @@ -344,7 +334,7 @@ _eglReleaseDisplayResources(_EGLDriver *drv, _EGLDisplay *display) list = list->Next; _eglUnlinkSync(sync); - drv->API.DestroySyncKHR(drv, display, sync); + drv->DestroySyncKHR(display, sync); } assert(!display->ResourceLists[_EGL_RESOURCE_SYNC]); } @@ -545,7 +535,6 @@ _eglGetWaylandDisplay(struct wl_display *native_display, } #endif /* HAVE_WAYLAND_PLATFORM */ -#ifdef HAVE_SURFACELESS_PLATFORM _EGLDisplay* _eglGetSurfacelessDisplay(void *native_display, const EGLAttrib *attrib_list) @@ -565,8 +554,23 @@ _eglGetSurfacelessDisplay(void *native_display, return _eglFindDisplay(_EGL_PLATFORM_SURFACELESS, native_display, attrib_list); } -#endif /* HAVE_SURFACELESS_PLATFORM */ +#ifdef HAVE_ANDROID_PLATFORM +_EGLDisplay* +_eglGetAndroidDisplay(void *native_display, + const EGLAttrib *attrib_list) +{ + + /* This platform recognizes no display attributes. */ + if (attrib_list != NULL && attrib_list[0] != EGL_NONE) { + _eglError(EGL_BAD_ATTRIBUTE, "eglGetPlatformDisplay"); + return NULL; + } + + return _eglFindDisplay(_EGL_PLATFORM_ANDROID, native_display, + attrib_list); +} +#endif /* HAVE_ANDROID_PLATFORM */ _EGLDisplay* _eglGetDeviceDisplay(void *native_display, @@ -614,7 +618,7 @@ _eglGetDeviceDisplay(void *native_display, * The new fd is guaranteed to be 3 or greater. */ if (fd != -1 && display->Options.fd == 0) { - display->Options.fd = fcntl(fd, F_DUPFD_CLOEXEC, 3); + display->Options.fd = os_dupfd_cloexec(fd); if (display->Options.fd == -1) { /* Do not (really) need to teardown the display */ _eglError(EGL_BAD_ALLOC, "eglGetPlatformDisplay");