mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 18:18:06 +02:00
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:
parent
65848d445c
commit
6c268cdf05
15 changed files with 63 additions and 30 deletions
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue