diff --git a/demos/node-editor/node-editor-window.ui b/demos/node-editor/node-editor-window.ui index f768e9435b..68d43ba27e 100644 --- a/demos/node-editor/node-editor-window.ui +++ b/demos/node-editor/node-editor-window.ui @@ -10,10 +10,6 @@ _Help app.help - - _Help - app.help - _Inspector app.inspector diff --git a/gsk/gskrenderer.c b/gsk/gskrenderer.c index 31477b84c7..0d4519a989 100644 --- a/gsk/gskrenderer.c +++ b/gsk/gskrenderer.c @@ -46,6 +46,8 @@ #include "gl/gskglrenderer.h" #include "gpu/gskvulkanrenderer.h" +#include "gdk/gdkvulkancontextprivate.h" +#include "gdk/gdkdisplayprivate.h" #include #include @@ -630,16 +632,53 @@ get_renderer_for_backend (GdkSurface *surface) return G_TYPE_INVALID; } +static gboolean +gl_software_rendering (GdkSurface *surface) +{ + GdkDisplay *display = gdk_surface_get_display (surface); + GdkGLContext *context; + + if (!gdk_display_prepare_gl (display, NULL)) + return G_TYPE_INVALID; + + context = gdk_display_get_gl_context (display); + gdk_gl_context_make_current (context); + + return strstr ((const char *) glGetString (GL_RENDERER), "llvmpipe") != NULL; +} + static GType get_renderer_for_gl (GdkSurface *surface) { + if (gl_software_rendering (surface)) + return G_TYPE_INVALID; + return gsk_ngl_renderer_get_type (); } +#ifdef GDK_RENDERING_VULKAN +static gboolean +vulkan_software_rendering (GdkSurface *surface) +{ + GdkDisplay *display = gdk_surface_get_display (surface); + VkPhysicalDeviceProperties props; + + if (!gdk_display_init_vulkan (display, NULL)) + return G_TYPE_INVALID; + + vkGetPhysicalDeviceProperties (display->vk_physical_device, &props); + + return props.deviceType == VK_PHYSICAL_DEVICE_TYPE_CPU; +} +#endif + static GType get_renderer_for_vulkan (GdkSurface *surface) { #ifdef GDK_RENDERING_VULKAN + if (vulkan_software_rendering (surface)) + return G_TYPE_INVALID; + return GSK_TYPE_VULKAN_RENDERER; #else return G_TYPE_INVALID; @@ -649,6 +688,9 @@ get_renderer_for_vulkan (GdkSurface *surface) static GType get_renderer_for_gles2 (GdkSurface *surface) { + if (gl_software_rendering (surface)) + return G_TYPE_INVALID; + return GSK_TYPE_GL_RENDERER; } diff --git a/gtk/inspector/general.c b/gtk/inspector/general.c index c5b218c4c9..6621514a39 100644 --- a/gtk/inspector/general.c +++ b/gtk/inspector/general.c @@ -513,11 +513,12 @@ init_vulkan (GtkInspectorGeneral *gen) char *device_name; char *api_version; char *driver_version; + const char *types[] = { "other", "integrated GPU", "discrete GPU", "virtual GPU", "CPU" }; vk_device = gen->display->vk_physical_device; vkGetPhysicalDeviceProperties (vk_device, &props); - device_name = g_strdup_printf ("%s (%d)", props.deviceName, props.deviceType); + device_name = g_strdup_printf ("%s (%s)", props.deviceName, types[props.deviceType]); api_version = g_strdup_printf ("%d.%d.%d", VK_VERSION_MAJOR (props.apiVersion), VK_VERSION_MINOR (props.apiVersion),