Merge branch 'llvmpipe-be-gone' into 'main'

gsk: Don't use gpu renderers with llvmpipe

See merge request GNOME/gtk!6890
This commit is contained in:
Matthias Clasen
2024-02-12 21:16:48 +00:00
3 changed files with 44 additions and 5 deletions

View File

@@ -10,10 +10,6 @@
<attribute name="label" translatable="yes">_Help</attribute>
<attribute name="action">app.help</attribute>
</item>
<item>
<attribute name="label" translatable="yes">_Help</attribute>
<attribute name="action">app.help</attribute>
</item>
<item>
<attribute name="label" translatable="yes">_Inspector</attribute>
<attribute name="action">app.inspector</attribute>

View File

@@ -46,6 +46,8 @@
#include "gl/gskglrenderer.h"
#include "gpu/gskvulkanrenderer.h"
#include "gdk/gdkvulkancontextprivate.h"
#include "gdk/gdkdisplayprivate.h"
#include <graphene-gobject.h>
#include <cairo-gobject.h>
@@ -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;
}

View File

@@ -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),