pipe-loader: allow to load multiple zink devices

Rusticl needs to be able to create a zink_screen on all renderer nodes.
This adds the infrastructure of doing so.

Signed-off-by: Karol Herbst <kherbst@redhat.com>
Acked-by: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24839>
This commit is contained in:
Karol Herbst 2023-09-19 14:44:26 +02:00 committed by Marge Bot
parent 65848d445c
commit 6c268cdf05
15 changed files with 63 additions and 30 deletions

View file

@ -56,13 +56,18 @@ const driOptionDescription gallium_driconf[] = {
};
int
pipe_loader_probe(struct pipe_loader_device **devs, int ndev)
pipe_loader_probe(struct pipe_loader_device **devs, int ndev, bool with_zink)
{
int i, n = 0;
for (i = 0; i < ARRAY_SIZE(backends); i++)
n += backends[i](&devs[n], MAX2(0, ndev - n));
#if defined(HAVE_ZINK) && defined(HAVE_LIBDRM)
if (with_zink)
n += pipe_loader_drm_zink_probe(&devs[n], MAX2(0, ndev - n));
#endif
return n;
}

View file

@ -74,13 +74,14 @@ struct pipe_loader_device {
/**
* Get a list of known devices.
*
* \param devs Array that will be filled with pointers to the devices
* available in the system.
* \param ndev Maximum number of devices to return.
* \param devs Array that will be filled with pointers to the devices
* available in the system.
* \param ndev Maximum number of devices to return.
* \param with_zink If devices should also be loaded with zink.
* \return Number of devices available in the system.
*/
int
pipe_loader_probe(struct pipe_loader_device **devs, int ndev);
pipe_loader_probe(struct pipe_loader_device **devs, int ndev, bool with_zink);
/**
* Create a pipe_screen for the specified device.
@ -213,6 +214,18 @@ pipe_loader_sw_probe_wrapped(struct pipe_loader_device **dev,
int
pipe_loader_drm_probe(struct pipe_loader_device **devs, int ndev);
#ifdef HAVE_ZINK
/**
* Get a list of known DRM devices compatible with zink.
*
* This function is platform-specific.
*
* \sa pipe_loader_probe
*/
int
pipe_loader_drm_zink_probe(struct pipe_loader_device **devs, int ndev);
#endif
/**
* Initialize a DRM device in an already opened fd.
*
@ -221,7 +234,7 @@ pipe_loader_drm_probe(struct pipe_loader_device **devs, int ndev);
* \sa pipe_loader_probe
*/
bool
pipe_loader_drm_probe_fd(struct pipe_loader_device **dev, int fd);
pipe_loader_drm_probe_fd(struct pipe_loader_device **dev, int fd, bool zink);
/**
* Get the dri options used for the DRM driver of the given name, if any.

View file

@ -121,7 +121,7 @@ get_driver_descriptor(const char *driver_name, struct util_dl_library **plib)
}
static bool
pipe_loader_drm_probe_fd_nodup(struct pipe_loader_device **dev, int fd)
pipe_loader_drm_probe_fd_nodup(struct pipe_loader_device **dev, int fd, bool zink)
{
struct pipe_loader_drm_device *ddev = CALLOC_STRUCT(pipe_loader_drm_device);
int vendor_id, chip_id;
@ -139,7 +139,10 @@ pipe_loader_drm_probe_fd_nodup(struct pipe_loader_device **dev, int fd)
ddev->base.ops = &pipe_loader_drm_ops;
ddev->fd = fd;
ddev->base.driver_name = loader_get_driver_for_fd(fd);
if (zink)
ddev->base.driver_name = strdup("zink");
else
ddev->base.driver_name = loader_get_driver_for_fd(fd);
if (!ddev->base.driver_name)
goto fail;
@ -163,7 +166,7 @@ pipe_loader_drm_probe_fd_nodup(struct pipe_loader_device **dev, int fd)
goto fail;
/* kmsro supports lots of drivers, try as a fallback */
if (!ddev->dd)
if (!ddev->dd && !zink)
ddev->dd = get_driver_descriptor("kmsro", plib);
if (!ddev->dd)
@ -183,7 +186,7 @@ pipe_loader_drm_probe_fd_nodup(struct pipe_loader_device **dev, int fd)
}
bool
pipe_loader_drm_probe_fd(struct pipe_loader_device **dev, int fd)
pipe_loader_drm_probe_fd(struct pipe_loader_device **dev, int fd, bool zink)
{
bool ret;
int new_fd;
@ -191,7 +194,7 @@ pipe_loader_drm_probe_fd(struct pipe_loader_device **dev, int fd)
if (fd < 0 || (new_fd = os_dupfd_cloexec(fd)) < 0)
return false;
ret = pipe_loader_drm_probe_fd_nodup(dev, new_fd);
ret = pipe_loader_drm_probe_fd_nodup(dev, new_fd, zink);
if (!ret)
close(new_fd);
@ -207,8 +210,8 @@ open_drm_render_node_minor(int minor)
return loader_open_device(path);
}
int
pipe_loader_drm_probe(struct pipe_loader_device **devs, int ndev)
static int
pipe_loader_drm_probe_internal(struct pipe_loader_device **devs, int ndev, bool zink)
{
int i, j, fd;
@ -220,7 +223,7 @@ pipe_loader_drm_probe(struct pipe_loader_device **devs, int ndev)
if (fd < 0)
continue;
if (!pipe_loader_drm_probe_fd_nodup(&dev, fd)) {
if (!pipe_loader_drm_probe_fd_nodup(&dev, fd, zink)) {
close(fd);
continue;
}
@ -237,6 +240,20 @@ pipe_loader_drm_probe(struct pipe_loader_device **devs, int ndev)
return j;
}
int
pipe_loader_drm_probe(struct pipe_loader_device **devs, int ndev)
{
return pipe_loader_drm_probe_internal(devs, ndev, false);
}
#ifdef HAVE_ZINK
int
pipe_loader_drm_zink_probe(struct pipe_loader_device **devs, int ndev)
{
return pipe_loader_drm_probe_internal(devs, ndev, true);
}
#endif
static void
pipe_loader_drm_release(struct pipe_loader_device **dev)
{

View file

@ -458,7 +458,7 @@ vl_dri2_screen_create(Display *display, int screen)
if (authenticate == NULL || !authenticate->authenticated)
goto free_authenticate;
if (pipe_loader_drm_probe_fd(&scrn->base.dev, fd))
if (pipe_loader_drm_probe_fd(&scrn->base.dev, fd, false))
scrn->base.pscreen = pipe_loader_create_screen(scrn->base.dev);
if (!scrn->base.pscreen)

View file

@ -842,7 +842,7 @@ vl_dri3_screen_create(Display *display, int screen)
scrn->base.color_depth = geom_reply->depth;
free(geom_reply);
if (pipe_loader_drm_probe_fd(&scrn->base.dev, fd))
if (pipe_loader_drm_probe_fd(&scrn->base.dev, fd, false))
scrn->base.pscreen = pipe_loader_create_screen(scrn->base.dev);
if (!scrn->base.pscreen)

View file

@ -46,7 +46,7 @@ vl_drm_screen_create(int fd)
if (!vscreen)
return NULL;
if (pipe_loader_drm_probe_fd(&vscreen->dev, fd))
if (pipe_loader_drm_probe_fd(&vscreen->dev, fd, false))
vscreen->pscreen = pipe_loader_create_screen(vscreen->dev);
if (!vscreen->pscreen)

View file

@ -1557,9 +1557,7 @@ zink_get_display_device(const struct zink_screen *screen, uint32_t pdev_count,
return i;
}
mesa_loge("ZINK: could not find the Display GPU, choosing default device!");
return 0;
return -1;
}
static int

View file

@ -26,14 +26,14 @@
using namespace clover;
platform::platform() : adaptor_range(evals(), devs) {
int n = pipe_loader_probe(NULL, 0);
int n = pipe_loader_probe(NULL, 0, false);
std::vector<pipe_loader_device *> ldevs(n);
unsigned major = 1, minor = 1;
debug_get_version_option("CLOVER_PLATFORM_VERSION_OVERRIDE", &major, &minor);
version = CL_MAKE_VERSION(major, minor, 0);
pipe_loader_probe(&ldevs.front(), n);
pipe_loader_probe(&ldevs.front(), n, false);
for (pipe_loader_device *ldev : ldevs) {
try {

View file

@ -2381,7 +2381,7 @@ dri2_init_screen(struct dri_screen *screen)
(void) mtx_init(&screen->opencl_func_mutex, mtx_plain);
if (pipe_loader_drm_probe_fd(&screen->dev, screen->fd))
if (pipe_loader_drm_probe_fd(&screen->dev, screen->fd, false))
pscreen = pipe_loader_create_screen(screen->dev);
if (!pscreen)

View file

@ -126,7 +126,7 @@ kopper_init_screen(struct dri_screen *screen)
bool success;
if (screen->fd != -1)
success = pipe_loader_drm_probe_fd(&screen->dev, screen->fd);
success = pipe_loader_drm_probe_fd(&screen->dev, screen->fd, false);
else
success = pipe_loader_vk_probe_dri(&screen->dev, NULL);

View file

@ -39,10 +39,10 @@ impl Drop for PipeLoaderDevice {
}
fn load_devs() -> Vec<PipeLoaderDevice> {
let n = unsafe { pipe_loader_probe(ptr::null_mut(), 0) };
let n = unsafe { pipe_loader_probe(ptr::null_mut(), 0, true) };
let mut devices: Vec<*mut pipe_loader_device> = vec![ptr::null_mut(); n as usize];
unsafe {
pipe_loader_probe(devices.as_mut_ptr(), n);
pipe_loader_probe(devices.as_mut_ptr(), n, true);
}
devices

View file

@ -171,7 +171,7 @@ xa_tracker_create(int drm_fd)
if (!xa)
return NULL;
if (pipe_loader_drm_probe_fd(&xa->dev, drm_fd))
if (pipe_loader_drm_probe_fd(&xa->dev, drm_fd, false))
xa->screen = pipe_loader_create_screen(xa->dev);
if (!xa->screen)

View file

@ -235,7 +235,7 @@ drm_create_adapter( int fd,
ctx->fd = fd;
ctx->base.linear_framebuffer = different_device;
if (!pipe_loader_drm_probe_fd(&ctx->dev, fd)) {
if (!pipe_loader_drm_probe_fd(&ctx->dev, fd, false)) {
ERR("Failed to probe drm fd %d.\n", fd);
FREE(ctx);
close(fd);

View file

@ -93,7 +93,7 @@ static void init_prog(struct program *p)
ASSERTED int ret;
/* find a hardware device */
ret = pipe_loader_probe(&p->dev, 1);
ret = pipe_loader_probe(&p->dev, 1, false);
assert(ret);
/* init a pipe screen */

View file

@ -87,7 +87,7 @@ static void init_prog(struct program *p)
ASSERTED int ret;
/* find a hardware device */
ret = pipe_loader_probe(&p->dev, 1);
ret = pipe_loader_probe(&p->dev, 1, false);
assert(ret);
/* init a pipe screen */