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>
};
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;
}
/**
* 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.
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.
*
* \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.
}
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;
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;
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)
}
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;
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);
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;
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;
}
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)
{
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)
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)
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)
return i;
}
- mesa_loge("ZINK: could not find the Display GPU, choosing default device!");
-
- return 0;
+ return -1;
}
static int
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 {
(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)
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);
}
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
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)
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);
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 */
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 */