GDK: Force GLES 3.0+ on libANGLE
authorChun-wei Fan <fanchunwei@src.gnome.org>
Tue, 18 Jan 2022 16:16:11 +0000 (00:16 +0800)
committerChun-wei Fan <fanchunwei@src.gnome.org>
Wed, 19 Jan 2022 03:56:32 +0000 (11:56 +0800)
...when libANGLE is being used on Windows, by checking for a
Windows-specific an ANGLE-specific extension.

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

index dddc8b206025d9219592af412a4b6c1973b5cf1e..0e935d81760e47eb775a71f99a41702a4243174c 100644 (file)
@@ -1727,6 +1727,8 @@ gdk_display_init_egl (GdkDisplay  *self,
     epoxy_has_egl_extension (priv->egl_display, "EGL_KHR_no_config_context");
   self->have_egl_pixel_format_float =
     epoxy_has_egl_extension (priv->egl_display, "EGL_EXT_pixel_format_float");
+  self->have_egl_win32_libangle =
+    epoxy_has_egl_extension (priv->egl_display, "EGL_ANGLE_d3d_share_handle_client_buffer");
 
   if (self->have_egl_no_config_context)
     priv->egl_config_high_depth = gdk_display_create_egl_config (self,
index cb80ad3f88a4b110e104ed394b20bbc791ba1fff..4eb3625d88e51c49c71c6cbd902ac138b93a3b72 100644 (file)
@@ -110,6 +110,7 @@ struct _GdkDisplay
   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;
 };
 
 struct _GdkDisplayClass
index 531344b72e5e57bf05a71057bff17097ac97be9f..d1bc7c57c226f097bfe32e525d0ec62ccba7c60b 100644 (file)
@@ -1056,26 +1056,29 @@ gdk_gl_context_get_required_version (GdkGLContext *context,
 {
   GdkGLContextPrivate *priv = gdk_gl_context_get_instance_private (context);
   gboolean force_gles = FALSE;
-#ifdef G_ENABLE_DEBUG
   GdkDisplay *display;
-#endif
   int default_major, default_minor;
   int maj, min;
 
   g_return_if_fail (GDK_IS_GL_CONTEXT (context));
 
-#ifdef G_ENABLE_DEBUG
   display = gdk_draw_context_get_display (GDK_DRAW_CONTEXT (context));
+
+#ifdef G_ENABLE_DEBUG
   force_gles = GDK_DISPLAY_DEBUG_CHECK (display, GL_GLES);
 #endif
 
+  /* libANGLE on Windows at least requires GLES 3.0+ */
+  if (display->have_egl_win32_libangle)
+    force_gles = TRUE;
+
   /* Default fallback values for uninitialised contexts; we
    * enforce a context version number of 3.2 for desktop GL,
    * and 2.0 for GLES
    */
   if (gdk_gl_context_get_use_es (context) || force_gles)
     {
-      default_major = 2;
+      default_major = display->have_egl_win32_libangle ? 3 : 2;
       default_minor = 0;
     }
   else