egl/surfaceless: Only choose drivers that expose the graphics capability

This is to prevent applications to try to render to devices that have no
3D hardware (eg. NPUs).

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30096>
This commit is contained in:
Tomeu Vizoso 2025-02-10 13:25:35 +01:00 committed by Marge Bot
parent 45e771f4fb
commit cfad6fb037

View file

@ -29,6 +29,7 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "pipe/p_screen.h"
#include "util/libdrm.h"
#include <sys/stat.h>
#include <sys/types.h>
@ -39,6 +40,7 @@
#include "loader.h"
#include "loader_dri_helper.h"
#include "dri_util.h"
#include "dri_screen.h"
static struct dri_image *
surfaceless_alloc_image(struct dri2_egl_display *dri2_dpy,
@ -271,9 +273,35 @@ surfaceless_probe_device(_EGLDisplay *disp, bool swrast, bool zink)
dri2_dpy->loader_extensions = swrast_loader_extensions;
else
dri2_dpy->loader_extensions = image_loader_extensions;
dri2_dpy->fd_display_gpu = dri2_dpy->fd_render_gpu;
if (!dri2_create_screen(disp)) {
_eglLog(_EGL_WARNING, "DRI2: failed to create screen");
goto retry;
}
if (!dri2_dpy->dri_screen_render_gpu->base.screen->caps.graphics) {
_eglLog(_EGL_DEBUG, "DRI2: Driver %s doesn't support graphics, skipping.", dri2_dpy->driver_name);
if (dri2_dpy->dri_screen_display_gpu != dri2_dpy->dri_screen_render_gpu) {
driDestroyScreen(dri2_dpy->dri_screen_display_gpu);
dri2_dpy->dri_screen_display_gpu = NULL;
}
driDestroyScreen(dri2_dpy->dri_screen_render_gpu);
dri2_dpy->dri_screen_render_gpu = NULL;
dri2_dpy->own_dri_screen = false;
goto retry;
}
break;
}
retry:
free(dri2_dpy->driver_name);
dri2_dpy->driver_name = NULL;
close(dri2_dpy->fd_render_gpu);
@ -315,6 +343,16 @@ surfaceless_probe_device_sw(_EGLDisplay *disp)
}
dri2_dpy->loader_extensions = swrast_loader_extensions;
dri2_dpy->fd_display_gpu = dri2_dpy->fd_render_gpu;
if (!dri2_create_screen(disp)) {
_eglLog(_EGL_WARNING, "DRI2: failed to create screen");
free(dri2_dpy->driver_name);
dri2_dpy->driver_name = NULL;
return false;
}
return true;
}
@ -344,13 +382,6 @@ dri2_initialize_surfaceless(_EGLDisplay *disp)
goto cleanup;
}
dri2_dpy->fd_display_gpu = dri2_dpy->fd_render_gpu;
if (!dri2_create_screen(disp)) {
err = "DRI2: failed to create screen";
goto cleanup;
}
dri2_setup_screen(disp);
#ifdef HAVE_WAYLAND_PLATFORM
dri2_dpy->device_name =