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.
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -808,20 +808,101 @@
|
||||
<property name="activatable">0</property>
|
||||
<child>
|
||||
<object class="GtkExpander">
|
||||
<property name="valign">center</property>
|
||||
<property name="label-widget">
|
||||
<object class="GtkLabel">
|
||||
<property name="label" translatable="yes">Extensions</property>
|
||||
<property name="label" translatable="yes">GL Extensions</property>
|
||||
<property name="margin-start">10</property>
|
||||
</object>
|
||||
</property>
|
||||
<child>
|
||||
<object class="GtkListBox" id="gl_extensions_box">
|
||||
<object class="GtkListView">
|
||||
<property name="margin-top">20</property>
|
||||
<property name="margin-top">20</property>
|
||||
<property name="selection-mode">none</property>
|
||||
<property name="halign">center</property>
|
||||
<style>
|
||||
<class name="rich-list"/>
|
||||
</style>
|
||||
<property name="model">
|
||||
<object class="GtkNoSelection">
|
||||
<property name="model">
|
||||
<object class="GtkStringList" id="gl_extensions_list" />
|
||||
</property>
|
||||
</object>
|
||||
</property>
|
||||
<property name="factory">
|
||||
<object class="GtkBuilderListItemFactory">
|
||||
<property name="bytes"><![CDATA[
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<interface>
|
||||
<template class='GtkListItem'>
|
||||
<property name='child'>
|
||||
<object class='GtkInscription'>
|
||||
<property name='xalign'>0</property>
|
||||
<binding name='text'>
|
||||
<lookup name='string' type='GtkStringObject'>
|
||||
<lookup name='item'>GtkListItem</lookup>
|
||||
</lookup>
|
||||
</binding>
|
||||
</object>
|
||||
</property>
|
||||
</template>
|
||||
</interface>
|
||||
]]></property>
|
||||
</object>
|
||||
</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkListBoxRow" id="egl_extensions_row">
|
||||
<property name="activatable">0</property>
|
||||
<child>
|
||||
<object class="GtkExpander">
|
||||
<property name="valign">center</property>
|
||||
<property name="label-widget">
|
||||
<object class="GtkLabel" id="egl_extensions_row_name">
|
||||
<property name="label" translatable="yes">EGL Extensions</property>
|
||||
<property name="margin-start">10</property>
|
||||
</object>
|
||||
</property>
|
||||
<child>
|
||||
<object class="GtkListView">
|
||||
<property name="margin-top">20</property>
|
||||
<property name="margin-top">20</property>
|
||||
<style>
|
||||
<class name="rich-list"/>
|
||||
</style>
|
||||
<property name="model">
|
||||
<object class="GtkNoSelection">
|
||||
<property name="model">
|
||||
<object class="GtkStringList" id="egl_extensions_list" />
|
||||
</property>
|
||||
</object>
|
||||
</property>
|
||||
<property name="factory">
|
||||
<object class="GtkBuilderListItemFactory">
|
||||
<property name="bytes"><![CDATA[
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<interface>
|
||||
<template class='GtkListItem'>
|
||||
<property name='child'>
|
||||
<object class='GtkInscription'>
|
||||
<property name='xalign'>0</property>
|
||||
<binding name='text'>
|
||||
<lookup name='string' type='GtkStringObject'>
|
||||
<lookup name='item'>GtkListItem</lookup>
|
||||
</lookup>
|
||||
</binding>
|
||||
</object>
|
||||
</property>
|
||||
</template>
|
||||
</interface>
|
||||
]]></property>
|
||||
</object>
|
||||
</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
|
||||
Reference in New Issue
Block a user