From 155db90f202842909abf14d5d9e08e3b96555395 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Fri, 18 Oct 2024 11:04:00 +0200 Subject: [PATCH 1/9] inspector: List all GL extensions Instead of checking availability of a few hardcoded extensions, print a full list of extensions. It's a bit awkward to find the ones the GTK cares about, but it allows quickly checking any extension that might be needed for new features or in applications or GStreamer. This overlaps somewhat with tools like eglinfo, but eglinfo prints all combinations of X11/Wayland and GL/GLES so it's easy to get confused, while this one prints the actual extensions of the device in use. --- gtk/inspector/general.c | 132 ++++++++++++++++++--------------------- gtk/inspector/general.ui | 89 ++++++++++++++++++++++++-- 2 files changed, 146 insertions(+), 75 deletions(-) diff --git a/gtk/inspector/general.c b/gtk/inspector/general.c index a979ad01ff..457612583e 100644 --- a/gtk/inspector/general.c +++ b/gtk/inspector/general.c @@ -92,7 +92,10 @@ struct _GtkInspectorGeneral GtkWidget *monitor_box; GtkWidget *gl_box; GtkWidget *gl_extensions_row; - GtkWidget *gl_extensions_box; + GtkStringList *gl_extensions_list; + GtkWidget *egl_extensions_row; + GtkWidget *egl_extensions_row_name; + GtkStringList *egl_extensions_list; GtkWidget *vulkan_box; GtkWidget *vulkan_extensions_row; GtkWidget *vulkan_extensions_box; @@ -302,43 +305,30 @@ add_label_row (GtkInspectorGeneral *gen, gtk_list_box_insert (GTK_LIST_BOX (list), row, -1); } -static void -append_gl_extension_row (GtkInspectorGeneral *gen, - const char *ext) +/* unused on some setup, like Mac */ +static void G_GNUC_UNUSED +append_extensions (GtkStringList *list, + const char *extensions) { - add_check_row (gen, GTK_LIST_BOX (gen->gl_extensions_box), ext, epoxy_has_gl_extension (ext), 0); -} - -#ifdef GDK_WINDOWING_X11 -static void -append_glx_extension_row (GtkInspectorGeneral *gen, - Display *dpy, - const char *ext) -{ - add_check_row (gen, GTK_LIST_BOX (gen->gl_extensions_box), ext, epoxy_has_glx_extension (dpy, 0, ext), 0); -} -#endif - -#ifdef GDK_WINDOWING_WIN32 -static void -append_wgl_extension_row (GtkInspectorGeneral *gen, - const char *ext) -{ - HDC hdc = wglGetCurrentDC (); - - add_check_row (gen, GTK_LIST_BOX (gen->gl_extensions_box), ext, epoxy_has_wgl_extension (hdc, ext), 0); -} -#endif - -#if defined(GDK_WINDOWING_WAYLAND) || defined (GDK_WINDOWING_X11) || (defined (GDK_WINDOWING_WIN32) && defined(GDK_WIN32_ENABLE_EGL)) -static void -append_egl_extension_row (GtkInspectorGeneral *gen, - EGLDisplay dpy, - const char *ext) -{ - add_check_row (gen, GTK_LIST_BOX (gen->gl_extensions_box), ext, epoxy_has_egl_extension (dpy, ext), 0); + char **items; + gsize i; + + if (extensions == NULL) + return; + + items = g_strsplit (extensions, " ", -1); + for (i = 0; items[i]; i++) + { + if (items[i] == NULL || items[i][0] == 0) + continue; + + gtk_string_list_append (list, items[i]); + } + + g_strfreev (items); } +#if defined(GDK_WINDOWING_X11) || defined(GDK_WINDOWING_WAYLAND) || (defined(GDK_WINDOWING_WIN32) && defined(GDK_WIN32_ENABLE_EGL)) static EGLDisplay get_egl_display (GdkDisplay *display) { @@ -367,6 +357,7 @@ init_gl (GtkInspectorGeneral *gen) GdkGLContext *context; GError *error = NULL; int major, minor; + int num_extensions, i; char *s; if (!gdk_display_prepare_gl (gen->display, &error)) @@ -380,23 +371,22 @@ init_gl (GtkInspectorGeneral *gen) gtk_widget_set_visible (gen->gl_full_version_row, FALSE); gtk_widget_set_visible (gen->glsl_version_row, FALSE); gtk_widget_set_visible (gen->gl_extensions_row, FALSE); + gtk_widget_set_visible (gen->egl_extensions_row, FALSE); gtk_label_set_text (GTK_LABEL (gen->gl_error), error->message); g_error_free (error); return; } - gdk_gl_context_make_current (gdk_display_get_gl_context (gen->display)); - append_gl_extension_row (gen, "GL_OES_rgb8_rgba8"); - append_gl_extension_row (gen, "GL_EXT_abgr"); - append_gl_extension_row (gen, "GL_EXT_texture_format_BGRA8888"); - append_gl_extension_row (gen, "GL_EXT_texture_norm16"); - append_gl_extension_row (gen, "GL_OES_texture_half_float"); - append_gl_extension_row (gen, "GL_EXT_color_buffer_half_float"); - append_gl_extension_row (gen, "GL_OES_texture_half_float_linear"); - append_gl_extension_row (gen, "GL_OES_vertex_half_float"); - append_gl_extension_row (gen, "GL_OES_texture_float"); - append_gl_extension_row (gen, "GL_EXT_color_buffer_float"); - append_gl_extension_row (gen, "GL_OES_texture_float_linear"); + gdk_gl_context_make_current (gdk_display_get_gl_context (gen->display)); + + glGetIntegerv(GL_NUM_EXTENSIONS, &num_extensions); + for (i = 0; i < num_extensions; i++) + { + const char *gl_ext = (const char *)glGetStringi(GL_EXTENSIONS, i); + if (!gl_ext) + break; + gtk_string_list_append (GTK_STRING_LIST (gen->gl_extensions_list), gl_ext); + } #if defined(GDK_WINDOWING_X11) || defined(GDK_WINDOWING_WAYLAND) || (defined(GDK_WINDOWING_WIN32) && defined(GDK_WIN32_ENABLE_EGL)) EGLDisplay egl_display = get_egl_display (gen->display); @@ -410,14 +400,8 @@ init_gl (GtkInspectorGeneral *gen) gtk_label_set_text (GTK_LABEL (gen->gl_backend_vendor), eglQueryString (egl_display, EGL_VENDOR)); - append_egl_extension_row (gen, egl_display, "EGL_KHR_create_context"); - append_egl_extension_row (gen, egl_display, "EGL_EXT_buffer_age"); - append_egl_extension_row (gen, egl_display, "EGL_EXT_swap_buffers_with_damage"); - append_egl_extension_row (gen, egl_display, "EGL_KHR_swap_buffers_with_damage"); - append_egl_extension_row (gen, egl_display, "EGL_KHR_surfaceless_context"); - append_egl_extension_row (gen, egl_display, "EGL_KHR_no_config_context"); - append_egl_extension_row (gen, egl_display, "EGL_EXT_image_dma_buf_import_modifiers"); - append_egl_extension_row (gen, egl_display, "EGL_MESA_image_dma_buf_export"); + gtk_label_set_text (GTK_LABEL (gen->egl_extensions_row_name), "EGL extensions"); + append_extensions (gen->egl_extensions_list, eglQueryString (egl_display, EGL_EXTENSIONS)); } else #endif @@ -425,7 +409,7 @@ init_gl (GtkInspectorGeneral *gen) if (GDK_IS_X11_DISPLAY (gen->display)) { Display *dpy = GDK_DISPLAY_XDISPLAY (gen->display); - int error_base, event_base; + int error_base, event_base, screen; char *version; if (!glXQueryExtension (dpy, &error_base, &event_base)) @@ -436,14 +420,9 @@ init_gl (GtkInspectorGeneral *gen) g_free (version); gtk_label_set_text (GTK_LABEL (gen->gl_backend_vendor), glXGetClientString (dpy, GLX_VENDOR)); - append_glx_extension_row (gen, dpy, "GLX_ARB_create_context_profile"); - append_glx_extension_row (gen, dpy, "GLX_SGI_swap_control"); - append_glx_extension_row (gen, dpy, "GLX_EXT_texture_from_pixmap"); - append_glx_extension_row (gen, dpy, "GLX_SGI_video_sync"); - append_glx_extension_row (gen, dpy, "GLX_EXT_buffer_age"); - append_glx_extension_row (gen, dpy, "GLX_OML_sync_control"); - append_glx_extension_row (gen, dpy, "GLX_ARB_multisample"); - append_glx_extension_row (gen, dpy, "GLX_EXT_visual_rating"); + screen = XScreenNumberOfScreen (gdk_x11_display_get_xscreen (gen->display)); + gtk_label_set_text (GTK_LABEL (gen->egl_extensions_row_name), "GLX extensions"); + append_extensions (gen->egl_extensions_list, glXQueryExtensionsString (dpy, screen)); } else #endif @@ -451,20 +430,28 @@ init_gl (GtkInspectorGeneral *gen) if (GDK_IS_WIN32_DISPLAY (gen->display) && gdk_gl_backend_can_be_used (GDK_GL_WGL, NULL)) { + PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetExtensionsStringARB; + gtk_label_set_text (GTK_LABEL (gen->gl_backend_vendor), "Microsoft WGL"); gtk_widget_set_visible (gen->gl_backend_version, FALSE); - append_gl_extension_row (gen, "GL_WIN_swap_hint"); - append_wgl_extension_row (gen, "WGL_ARB_pixel_format"); - append_wgl_extension_row (gen, "WGL_ARB_create_context"); - append_wgl_extension_row (gen, "WGL_EXT_swap_control"); - append_wgl_extension_row (gen, "WGL_OML_sync_control"); + wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC) wglGetProcAddress("wglGetExtensionsStringARB"); + + if (wglGetExtensionsStringARB) + { + gtk_label_set_text (GTK_LABEL (gen->egl_extensions_row_name), "WGL extensions"); + append_extensions (gen->egl_extensions_list, wglGetExtensionsStringARB (wglGetCurrentDC ())); + } + else + { + gtk_label_set_text (GTK_LABEL (gen->egl_extensions_row_name), "WGL extensions: none"); + } } else #endif { gtk_label_set_text (GTK_LABEL (gen->gl_backend_version), C_("GL version", "Unknown")); - gtk_widget_set_visible (gen->gl_backend_vendor_row, FALSE); + gtk_widget_set_visible (gen->egl_extensions_row, FALSE); } context = gdk_display_get_gl_context (gen->display); @@ -1332,7 +1319,10 @@ gtk_inspector_general_class_init (GtkInspectorGeneralClass *klass) gtk_widget_class_bind_template_child (widget_class, GtkInspectorGeneral, monitor_box); gtk_widget_class_bind_template_child (widget_class, GtkInspectorGeneral, gl_box); gtk_widget_class_bind_template_child (widget_class, GtkInspectorGeneral, gl_extensions_row); - gtk_widget_class_bind_template_child (widget_class, GtkInspectorGeneral, gl_extensions_box); + gtk_widget_class_bind_template_child (widget_class, GtkInspectorGeneral, gl_extensions_list); + gtk_widget_class_bind_template_child (widget_class, GtkInspectorGeneral, egl_extensions_row); + gtk_widget_class_bind_template_child (widget_class, GtkInspectorGeneral, egl_extensions_row_name); + gtk_widget_class_bind_template_child (widget_class, GtkInspectorGeneral, egl_extensions_list); gtk_widget_class_bind_template_child (widget_class, GtkInspectorGeneral, vulkan_box); gtk_widget_class_bind_template_child (widget_class, GtkInspectorGeneral, vulkan_extensions_row); gtk_widget_class_bind_template_child (widget_class, GtkInspectorGeneral, vulkan_extensions_box); diff --git a/gtk/inspector/general.ui b/gtk/inspector/general.ui index dc34f988f5..27e117ae9c 100644 --- a/gtk/inspector/general.ui +++ b/gtk/inspector/general.ui @@ -808,20 +808,101 @@ 0 + center - Extensions + GL Extensions 10 - + + 20 20 - none - center + + + + + + + + + + + + + + ]]> + + + + + + + + + + + 0 + + + center + + + EGL Extensions + 10 + + + + + 20 + 20 + + + + + + + + + + + + + + + ]]> + + From 9c564eb8938c20e941e2c29785be0336c0773661 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Fri, 18 Oct 2024 11:13:01 +0200 Subject: [PATCH 2/9] inspector: Sort extensions list Mesa sorts its extensions, but not every GL driver does. So now we do. --- gtk/inspector/general.ui | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/gtk/inspector/general.ui b/gtk/inspector/general.ui index 27e117ae9c..54fe6d93d2 100644 --- a/gtk/inspector/general.ui +++ b/gtk/inspector/general.ui @@ -825,7 +825,18 @@ - + + + + + + + + + + + + @@ -878,7 +889,18 @@ - + + + + + + + + + + + + From 6723fe0d5c22f058ac32e8f480135a5b38b44619 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Fri, 18 Oct 2024 11:41:54 +0200 Subject: [PATCH 3/9] inspector: Add search for extensions My Windows AMD driver has 295 GL extensions... --- gtk/inspector/general.ui | 134 ++++++++++++++++++++++++++------------- 1 file changed, 90 insertions(+), 44 deletions(-) diff --git a/gtk/inspector/general.ui b/gtk/inspector/general.ui index 54fe6d93d2..69da4fecca 100644 --- a/gtk/inspector/general.ui +++ b/gtk/inspector/general.ui @@ -816,33 +816,54 @@ - + 20 - 20 - - - + vertical + + + + + + - - - - - + + + + + + + + + + + gl_extensions_searchentry + + + + + + + + + + + + + + + + + - - - - - - - - + + - ]]> + ]]> + + - + @@ -880,33 +903,54 @@ - + 20 - 20 - - - + vertical + + + + + + - - - - - + + + + + + + + + + + egl_extensions_searchentry + + + + + + + + + + + + + + + + + - - - - - - - - + + - ]]> + ]]> + + - + From 78262ecd51cc1a52cb6a80cd5455843a679dede6 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Thu, 24 Oct 2024 21:57:48 -0400 Subject: [PATCH 4/9] inspector: Cosmetics --- gtk/inspector/general.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gtk/inspector/general.c b/gtk/inspector/general.c index 457612583e..7d36fdfc29 100644 --- a/gtk/inspector/general.c +++ b/gtk/inspector/general.c @@ -379,10 +379,10 @@ init_gl (GtkInspectorGeneral *gen) gdk_gl_context_make_current (gdk_display_get_gl_context (gen->display)); - glGetIntegerv(GL_NUM_EXTENSIONS, &num_extensions); + glGetIntegerv (GL_NUM_EXTENSIONS, &num_extensions); for (i = 0; i < num_extensions; i++) { - const char *gl_ext = (const char *)glGetStringi(GL_EXTENSIONS, i); + const char *gl_ext = (const char *) glGetStringi (GL_EXTENSIONS, i); if (!gl_ext) break; gtk_string_list_append (GTK_STRING_LIST (gen->gl_extensions_list), gl_ext); From 9adc09bc0bd6c6cc8052179e2071ad258b73774d Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Thu, 24 Oct 2024 21:55:59 -0400 Subject: [PATCH 5/9] inspector: Make extensions non-activatable There's nothing to activate here. --- gtk/inspector/general.ui | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gtk/inspector/general.ui b/gtk/inspector/general.ui index 69da4fecca..b84f1b0292 100644 --- a/gtk/inspector/general.ui +++ b/gtk/inspector/general.ui @@ -867,6 +867,7 @@