On Wed, Aug 25, 2021 at 2:22 AM Eugene Huang wrote: > Signed-off-by: Eugene Huang > --- > ui/egl-helpers.c | 41 +++++++++++++++++++++++++++++++++++++---- > 1 file changed, 37 insertions(+), 4 deletions(-) > > diff --git a/ui/egl-helpers.c b/ui/egl-helpers.c > index 6d0cb2b5cb..ce0971422b 100644 > --- a/ui/egl-helpers.c > +++ b/ui/egl-helpers.c > @@ -1,6 +1,8 @@ > /* > * Copyright (C) 2015-2016 Gerd Hoffmann > * > + * Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights > reserved. > + * > * This library is free software; you can redistribute it and/or > * modify it under the terms of the GNU Lesser General Public > * License as published by the Free Software Foundation; either > @@ -351,11 +353,26 @@ static EGLDisplay > qemu_egl_get_display(EGLNativeDisplayType native, > EGLDisplay dpy = EGL_NO_DISPLAY; > > /* In practise any EGL 1.5 implementation would support the EXT > extension */ > - if (epoxy_has_egl_extension(NULL, "EGL_EXT_platform_base")) { > + if (epoxy_has_egl_extension(NULL, "EGL_EXT_platform_base") > + && epoxy_has_egl_extension(NULL, "EGL_EXT_platform_device") > + && (epoxy_has_egl_extension(NULL, "EGL_EXT_device_base") > + || epoxy_has_egl_extension(NULL, "EGL_EXT_device_enumeration"))) { > PFNEGLGETPLATFORMDISPLAYEXTPROC getPlatformDisplayEXT = > (void *) eglGetProcAddress("eglGetPlatformDisplayEXT"); > if (getPlatformDisplayEXT && platform != 0) { > - dpy = getPlatformDisplayEXT(platform, native, NULL); > + if (platform == EGL_PLATFORM_DEVICE_EXT) { > + static const int MAX_DEVICES = 4; > + EGLDeviceEXT eglDevs[MAX_DEVICES]; > + EGLint numDevices; > + > + PFNEGLQUERYDEVICESEXTPROC eglQueryDevicesEXT = > + (PFNEGLQUERYDEVICESEXTPROC) > + eglGetProcAddress("eglQueryDevicesEXT"); > It should handle the case where returned eglQueryDevicesEXT is NULL. + eglQueryDevicesEXT(MAX_DEVICES, eglDevs, &numDevices); > You need to handle the success return value, as well as the case where numDevices == 0. (surprisingly, we don't need to care about memory of eglDevs?) > + dpy = getPlatformDisplayEXT(platform, eglDevs[0], 0); > + } else { > + dpy = getPlatformDisplayEXT(platform, native, NULL); > + } > } > } > > @@ -388,6 +405,17 @@ static int qemu_egl_init_dpy(EGLNativeDisplayType dpy, > EGL_ALPHA_SIZE, 0, > EGL_NONE, > }; > + > + static const EGLint conf_att_pbuffer[] = { > + EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, > + EGL_RED_SIZE, 8, > + EGL_GREEN_SIZE, 8, > + EGL_BLUE_SIZE, 8, > + EGL_DEPTH_SIZE, 1, > + EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT, > + EGL_NONE > + }; > + > EGLint major, minor; > EGLBoolean b; > EGLint n; > @@ -413,8 +441,8 @@ static int qemu_egl_init_dpy(EGLNativeDisplayType dpy, > } > > b = eglChooseConfig(qemu_egl_display, > - gles ? conf_att_gles : conf_att_core, > - &qemu_egl_config, 1, &n); > + gles ? conf_att_gles : (platform == EGL_PLATFORM_DEVICE_EXT ? > conf_att_pbuffer : conf_att_core), > + &qemu_egl_config, 1, &n); > if (b == EGL_FALSE || n != 1) { > error_report("egl: eglChooseConfig failed (%s mode)", > gles ? "gles" : "core"); > @@ -436,6 +464,11 @@ int qemu_egl_init_dpy_x11(EGLNativeDisplayType dpy, > DisplayGLMode mode) > > int qemu_egl_init_dpy_mesa(EGLNativeDisplayType dpy, DisplayGLMode mode) > { > + // Try EGL Device Extension > + if (qemu_egl_init_dpy(dpy, EGL_PLATFORM_DEVICE_EXT, mode) == 0) { > + return 0; > + } > + > #ifdef EGL_MESA_platform_gbm > return qemu_egl_init_dpy(dpy, EGL_PLATFORM_GBM_MESA, mode); > #else > -- > 2.17.1 > > -- Marc-André Lureau