gdk: use EGL_KHR_swap_buffers_with_damage
authorChristian Hergert <chergert@redhat.com>
Thu, 3 Mar 2022 06:59:23 +0000 (22:59 -0800)
committerMatthias Clasen <mclasen@redhat.com>
Wed, 16 Mar 2022 02:04:30 +0000 (22:04 -0400)
It appears that NVIDIA does not implement EGL_EXT_swap_buffers_with_damage
on their EGL implementation, but does implement the KHR variant of it.
This checks for a suitable implementation and stores a pointer to the
compatible implementation within the GdkGLContextPrivate struct.

gdk/gdkdisplay.c
gdk/gdkdisplayprivate.h
gdk/gdkglcontext.c

index 0e935d81760e47eb775a71f99a41702a4243174c..31f039d7490fbc57cf051596fcca3c510e664c62 100644 (file)
@@ -1721,8 +1721,6 @@ gdk_display_init_egl (GdkDisplay  *self,
 
   self->have_egl_buffer_age =
     epoxy_has_egl_extension (priv->egl_display, "EGL_EXT_buffer_age");
-  self->have_egl_swap_buffers_with_damage =
-    epoxy_has_egl_extension (priv->egl_display, "EGL_EXT_swap_buffers_with_damage");
   self->have_egl_no_config_context =
     epoxy_has_egl_extension (priv->egl_display, "EGL_KHR_no_config_context");
   self->have_egl_pixel_format_float =
index 4eb3625d88e51c49c71c6cbd902ac138b93a3b72..62061cc564621f374890e279d457a87fa503481a 100644 (file)
@@ -107,7 +107,6 @@ struct _GdkDisplay
 
   /* egl info */
   guint have_egl_buffer_age : 1;
-  guint have_egl_swap_buffers_with_damage : 1;
   guint have_egl_no_config_context : 1;
   guint have_egl_pixel_format_float : 1;
   guint have_egl_win32_libangle : 1;
index be514c0ac66a9a2be5165c8e9913882ec24c5ecf..1678f3d85c24c3cfd08e651f1540d499480c6931 100644 (file)
@@ -117,6 +117,7 @@ typedef struct {
 
 #ifdef HAVE_EGL
   EGLContext egl_context;
+  EGLBoolean (*eglSwapBuffersWithDamage) (EGLDisplay, EGLSurface, const EGLint *, EGLint);
 #endif
 } GdkGLContextPrivate;
 
@@ -420,6 +421,11 @@ gdk_gl_context_real_realize (GdkGLContext  *context,
 
       gdk_gl_context_set_is_legacy (context, legacy_bit);
 
+      if (epoxy_has_egl_extension (egl_display, "EGL_KHR_swap_buffers_with_damage"))
+        priv->eglSwapBuffersWithDamage = (gpointer)epoxy_eglGetProcAddress ("eglSwapBuffersWithDamageKHR");
+      else if (epoxy_has_egl_extension (egl_display, "EGL_EXT_swap_buffers_with_damage"))
+        priv->eglSwapBuffersWithDamage = (gpointer)epoxy_eglGetProcAddress ("eglSwapBuffersWithDamageEXT");
+
       gdk_profiler_end_mark (start_time, "realize GdkWaylandGLContext", NULL);
 
       return api;
@@ -608,7 +614,7 @@ gdk_gl_context_real_end_frame (GdkDrawContext *draw_context,
 
   gdk_profiler_add_mark (GDK_PROFILER_CURRENT_TIME, 0, "EGL", "swap buffers");
 
-  if (display->have_egl_swap_buffers_with_damage)
+  if (priv->eglSwapBuffersWithDamage)
     {
       EGLint stack_rects[4 * 4]; /* 4 rects */
       EGLint *heap_rects = NULL;
@@ -632,7 +638,7 @@ gdk_gl_context_real_end_frame (GdkDrawContext *draw_context,
           rects[j++] = rect.width * scale;
           rects[j++] = rect.height * scale;
         }
-      eglSwapBuffersWithDamageEXT (gdk_display_get_egl_display (display), egl_surface, rects, n_rects);
+      priv->eglSwapBuffersWithDamage (gdk_display_get_egl_display (display), egl_surface, rects, n_rects);
       g_free (heap_rects);
     }
   else