[gtk/wip/otte/gleanup: 181/182] gl: Require EGL_KHR_surfaceless_context with egl




commit 7e6818e0326e43161a270d91acf5295203a3b073
Author: Benjamin Otte <otte redhat com>
Date:   Wed Jul 7 03:00:09 2021 +0200

    gl: Require EGL_KHR_surfaceless_context with egl
    
    The code to create and manage a fake egl surface to bind to is
    complex and completely untested because everyone seems to support this
    extension.
    
    nvidia and Mesa do support it and according to Mesa devs, adding support
    in a new driver is rather simple and Mesa drivers gain that feature
    automatically, so all future drivers shoould have it.

 gdk/wayland/gdkdisplay-wayland.h   |  1 -
 gdk/wayland/gdkglcontext-wayland.c | 20 ++++++++++----------
 gdk/wayland/gdkprivate-wayland.h   |  3 ---
 gdk/wayland/gdksurface-wayland.c   | 37 -------------------------------------
 gdk/x11/gdkdisplay-x11.h           |  1 -
 gdk/x11/gdkglcontext-egl.c         | 24 ++++++++++++------------
 6 files changed, 22 insertions(+), 64 deletions(-)
---
diff --git a/gdk/wayland/gdkdisplay-wayland.h b/gdk/wayland/gdkdisplay-wayland.h
index d431405570..66e8020b28 100644
--- a/gdk/wayland/gdkdisplay-wayland.h
+++ b/gdk/wayland/gdkdisplay-wayland.h
@@ -159,7 +159,6 @@ struct _GdkWaylandDisplay
 
   guint have_egl_buffer_age : 1;
   guint have_egl_swap_buffers_with_damage : 1;
-  guint have_egl_surfaceless_context : 1;
 };
 
 struct _GdkWaylandDisplayClass
diff --git a/gdk/wayland/gdkglcontext-wayland.c b/gdk/wayland/gdkglcontext-wayland.c
index 4904948a30..ba8c1305ad 100644
--- a/gdk/wayland/gdkglcontext-wayland.c
+++ b/gdk/wayland/gdkglcontext-wayland.c
@@ -467,6 +467,15 @@ gdk_wayland_display_init_gl (GdkDisplay  *display,
       return NULL;
     }
 
+  if (!epoxy_has_egl_extension (dpy, "EGL_KHR_surfaceless_context"))
+    {
+      eglTerminate (dpy);
+      g_set_error_literal (error, GDK_GL_ERROR,
+                           GDK_GL_ERROR_UNSUPPORTED_PROFILE,
+                           _("Surfaceless contexts are not supported on this EGL implementation"));
+      return NULL;
+    }
+
   display_wayland->egl_config = get_eglconfig (dpy);
   if (!display_wayland->egl_config)
     {
@@ -487,9 +496,6 @@ gdk_wayland_display_init_gl (GdkDisplay  *display,
   display_wayland->have_egl_swap_buffers_with_damage =
     epoxy_has_egl_extension (dpy, "EGL_EXT_swap_buffers_with_damage");
 
-  display_wayland->have_egl_surfaceless_context =
-    epoxy_has_egl_extension (dpy, "EGL_KHR_surfaceless_context");
-
   GDK_DISPLAY_NOTE (display, OPENGL,
             g_message ("EGL API version %d.%d found\n"
                        " - Vendor: %s\n"
@@ -570,13 +576,7 @@ gdk_wayland_display_make_gl_context_current (GdkDisplay   *display,
   if (gdk_draw_context_is_in_frame (GDK_DRAW_CONTEXT (context)))
     egl_surface = gdk_wayland_surface_get_egl_surface (surface);
   else
-    {
-      if (display_wayland->have_egl_surfaceless_context)
-        egl_surface = EGL_NO_SURFACE;
-      else
-        egl_surface = gdk_wayland_surface_get_dummy_egl_surface (surface,
-                                                                 display_wayland->egl_config);
-    }
+    egl_surface = EGL_NO_SURFACE;
 
   if (!eglMakeCurrent (display_wayland->egl_display, egl_surface,
                        egl_surface, context_wayland->egl_context))
diff --git a/gdk/wayland/gdkprivate-wayland.h b/gdk/wayland/gdkprivate-wayland.h
index 2177cef90d..09f41606f3 100644
--- a/gdk/wayland/gdkprivate-wayland.h
+++ b/gdk/wayland/gdkprivate-wayland.h
@@ -182,9 +182,6 @@ cairo_surface_t * _gdk_wayland_display_create_shm_surface (GdkWaylandDisplay *di
 struct wl_buffer *_gdk_wayland_shm_surface_get_wl_buffer (cairo_surface_t *surface);
 gboolean _gdk_wayland_is_shm_surface (cairo_surface_t *surface);
 
-EGLSurface gdk_wayland_surface_get_dummy_egl_surface (GdkSurface *surface,
-                                                     EGLConfig config);
-
 struct gtk_surface1 * gdk_wayland_surface_get_gtk_surface (GdkSurface *surface);
 
 void gdk_wayland_seat_set_global_cursor (GdkSeat   *seat,
diff --git a/gdk/wayland/gdksurface-wayland.c b/gdk/wayland/gdksurface-wayland.c
index 124b810394..404b10b226 100644
--- a/gdk/wayland/gdksurface-wayland.c
+++ b/gdk/wayland/gdksurface-wayland.c
@@ -103,7 +103,6 @@ struct _GdkWaylandSurface
 
     struct gtk_surface1  *gtk_surface;
     struct wl_egl_window *egl_window;
-    struct wl_egl_window *dummy_egl_window;
     struct zxdg_exported_v1 *xdg_exported;
     struct org_kde_kwin_server_decoration *server_decoration;
   } display_server;
@@ -111,7 +110,6 @@ struct _GdkWaylandSurface
   struct wl_event_queue *event_queue;
 
   EGLSurface egl_surface;
-  EGLSurface dummy_egl_surface;
 
   uint32_t reposition_token;
   uint32_t received_reposition_token;
@@ -2901,18 +2899,6 @@ gdk_wayland_surface_hide_surface (GdkSurface *surface)
 
   if (impl->display_server.wl_surface)
     {
-      if (impl->dummy_egl_surface)
-        {
-          eglDestroySurface (display_wayland->egl_display, impl->dummy_egl_surface);
-          impl->dummy_egl_surface = NULL;
-        }
-
-      if (impl->display_server.dummy_egl_window)
-        {
-          wl_egl_window_destroy (impl->display_server.dummy_egl_window);
-          impl->display_server.dummy_egl_window = NULL;
-        }
-
       if (impl->egl_surface)
         {
           eglDestroySurface (display_wayland->egl_display, impl->egl_surface);
@@ -4325,29 +4311,6 @@ gdk_wayland_surface_get_egl_surface (GdkSurface *surface)
   return impl->egl_surface;
 }
 
-EGLSurface
-gdk_wayland_surface_get_dummy_egl_surface (GdkSurface *surface,
-                                           EGLConfig   config)
-{
-  GdkWaylandDisplay *display = GDK_WAYLAND_DISPLAY (gdk_surface_get_display (surface));
-  GdkWaylandSurface *impl;
-
-  g_return_val_if_fail (GDK_IS_WAYLAND_SURFACE (surface), NULL);
-
-  impl = GDK_WAYLAND_SURFACE (surface);
-
-  if (impl->dummy_egl_surface == NULL)
-    {
-      impl->display_server.dummy_egl_window =
-        wl_egl_window_create (impl->display_server.wl_surface, 1, 1);
-
-      impl->dummy_egl_surface =
-        eglCreateWindowSurface (display->egl_display, config, impl->display_server.dummy_egl_window, NULL);
-    }
-
-  return impl->dummy_egl_surface;
-}
-
 struct gtk_surface1 *
 gdk_wayland_surface_get_gtk_surface (GdkSurface *surface)
 {
diff --git a/gdk/x11/gdkdisplay-x11.h b/gdk/x11/gdkdisplay-x11.h
index bf84950654..1669d5fa19 100644
--- a/gdk/x11/gdkdisplay-x11.h
+++ b/gdk/x11/gdkdisplay-x11.h
@@ -166,7 +166,6 @@ struct _GdkX11Display
   guint has_egl_khr_create_context : 1;
   guint has_egl_buffer_age : 1;
   guint has_egl_swap_buffers_with_damage : 1;
-  guint has_egl_surfaceless_context : 1;
 };
 
 struct _GdkX11DisplayClass
diff --git a/gdk/x11/gdkglcontext-egl.c b/gdk/x11/gdkglcontext-egl.c
index 1c8b650b7f..931e10d1f1 100644
--- a/gdk/x11/gdkglcontext-egl.c
+++ b/gdk/x11/gdkglcontext-egl.c
@@ -630,6 +630,15 @@ gdk_x11_display_init_egl (GdkX11Display  *self,
       return FALSE;
     }
 
+  if (!epoxy_has_egl_extension (dpy, "EGL_KHR_surfaceless_context"))
+    {
+      eglTerminate (dpy);
+      g_set_error_literal (error, GDK_GL_ERROR,
+                           GDK_GL_ERROR_UNSUPPORTED_PROFILE,
+                           _("Surfaceless contexts are not supported on this EGL implementation"));
+      return FALSE;
+    }
+
   if (!gdk_x11_display_create_egl_config (self, force, out_visual, out_depth, error))
     {
       eglTerminate (self->egl_display);
@@ -645,8 +654,6 @@ gdk_x11_display_init_egl (GdkX11Display  *self,
     epoxy_has_egl_extension (self->egl_display, "EGL_EXT_buffer_age");
   self->has_egl_swap_buffers_with_damage =
     epoxy_has_egl_extension (self->egl_display, "EGL_EXT_swap_buffers_with_damage");
-  self->has_egl_surfaceless_context =
-    epoxy_has_egl_extension (self->egl_display, "EGL_KHR_surfaceless_context");
 
   GDK_DISPLAY_NOTE (display, OPENGL,
                     g_message ("EGL found\n"
@@ -656,15 +663,13 @@ gdk_x11_display_init_egl (GdkX11Display  *self,
                                " - Checked extensions:\n"
                                "\t* EGL_KHR_create_context: %s\n"
                                "\t* EGL_EXT_buffer_age: %s\n"
-                               "\t* EGL_EXT_swap_buffers_with_damage: %s\n"
-                               "\t* EGL_KHR_surfaceless_context: %s\n",
+                               "\t* EGL_EXT_swap_buffers_with_damage: %s\n",
                                eglQueryString (self->egl_display, EGL_VERSION),
                                eglQueryString (self->egl_display, EGL_VENDOR),
                                eglQueryString (self->egl_display, EGL_CLIENT_APIS),
                                self->has_egl_khr_create_context ? "yes" : "no",
                                self->has_egl_buffer_age ? "yes" : "no",
-                               self->has_egl_swap_buffers_with_damage ? "yes" : "no",
-                               self->has_egl_surfaceless_context ? "yes" : "no"));
+                               self->has_egl_swap_buffers_with_damage ? "yes" : "no"));
 
   return TRUE;
 }
@@ -710,12 +715,7 @@ gdk_x11_gl_context_egl_make_current (GdkDisplay   *display,
   if (gdk_draw_context_is_in_frame (GDK_DRAW_CONTEXT (context)))
     egl_surface = gdk_x11_surface_get_egl_surface (surface);
   else
-    {
-      if (display_x11->has_egl_surfaceless_context)
-        egl_surface = EGL_NO_SURFACE;
-      else
-        egl_surface = gdk_x11_surface_get_egl_surface (display_x11->leader_gdk_surface);
-    }
+    egl_surface = EGL_NO_SURFACE;
 
   GDK_DISPLAY_NOTE (display, OPENGL,
                     g_message ("Making EGL context %p current to surface %p",


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]