diff mbox series

[1/2] Use EGL device extension in display initialization.

Message ID 20210824222226.22528-1-eugeneh@nvidia.com
State New
Headers show
Series [1/2] Use EGL device extension in display initialization. | expand

Commit Message

Eugene Huang Aug. 24, 2021, 10:22 p.m. UTC
Signed-off-by: Eugene Huang <eugeneh@nvidia.com>
---
 ui/egl-helpers.c | 41 +++++++++++++++++++++++++++++++++++++----
 1 file changed, 37 insertions(+), 4 deletions(-)

Comments

Marc-André Lureau Aug. 30, 2021, 2:01 p.m. UTC | #1
On Wed, Aug 25, 2021 at 2:22 AM Eugene Huang <eugeneh@nvidia.com> wrote:

> Signed-off-by: Eugene Huang <eugeneh@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 <kraxel@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");
>

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
>
>
Eugene Huang Sept. 2, 2021, 3:22 a.m. UTC | #2
Thanks for the comment. I will submit another patch.

Best regards,
Eugene

From: Marc-André Lureau <marcandre.lureau@gmail.com>
Sent: Monday, August 30, 2021 7:01 AM
To: Eugene Huang <eugeneh@nvidia.com>; Gerd Hoffmann <kraxel@redhat.com>
Cc: QEMU <qemu-devel@nongnu.org>
Subject: Re: [PATCH 1/2] Use EGL device extension in display initialization.

External email: Use caution opening links or attachments



On Wed, Aug 25, 2021 at 2:22 AM Eugene Huang <eugeneh@nvidia.com<mailto:eugeneh@nvidia.com>> wrote:
Signed-off-by: Eugene Huang <eugeneh@nvidia.com<mailto:eugeneh@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 <kraxel@redhat.com<mailto:kraxel@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");

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
diff mbox series

Patch

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 <kraxel@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