Hi On Fri, Aug 6, 2021 at 2:28 AM Eugene Huang <euge...@nvidia.com> wrote:
> This patch enables running generic EGL devices such as Nvidia’s in > headless mode. It assumes single device. More work is needed to support > multiple devices. > > > > Signed-off-by: Eugene Huang <euge...@nvidia.com> > Thanks for the patch. It isn't correctly formatted and git apply fails ( https://patchew.org/QEMU/byapr12mb319275649a1403c254a9ea43d9...@byapr12mb3192.namprd12.prod.outlook.com/). Please use git send-email. --- > > 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 7c530c2825..c11610c083 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 > > @@ -349,11 +351,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); > Given that the function has a lengthy comment to explain it, and this is quite archaic stuff, I think you should update the comments with your additions. > + } else { > > + dpy = getPlatformDisplayEXT(platform, native, NULL); > > + } > > } > > } > > @@ -386,6 +403,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; > > @@ -411,8 +439,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"); > > @@ -434,6 +462,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 > > > thanks -- Marc-André Lureau