Signed-off-by: Eugene Huang <euge...@nvidia.com> --- 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 <kra...@redhat.com> * + * 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"); + eglQueryDevicesEXT(MAX_DEVICES, eglDevs, &numDevices); + 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