[Mesa-dev] [PATCH] gallium: introduce load_pipe_screen()

Rob Herring robh at kernel.org
Wed Feb 10 22:56:56 UTC 2016


Introduce load_pipe_screen() public entry point for other code which
dlopen()'s gralloc_dri.so for purposes of loading a pipe_screen. This way
drm_gralloc can avoid static linking of each gallium winsys and driver,
and avoid duplicated logic to figure out which pipe driver to load.

This is based on Rob Clark's work. I moved it into pipe_loader which seems
to be a better spot.

Signed-off-by: Rob Herring <robh at kernel.org>
---
 src/gallium/auxiliary/pipe-loader/pipe_loader.h     | 3 +++
 src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c | 9 +++++++++
 src/gallium/state_trackers/dri/dri2.c               | 4 +---
 src/gallium/targets/dri/dri.sym                     | 1 +
 4 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/src/gallium/auxiliary/pipe-loader/pipe_loader.h b/src/gallium/auxiliary/pipe-loader/pipe_loader.h
index 690d088..19d269f 100644
--- a/src/gallium/auxiliary/pipe-loader/pipe_loader.h
+++ b/src/gallium/auxiliary/pipe-loader/pipe_loader.h
@@ -180,6 +180,9 @@ pipe_loader_drm_probe(struct pipe_loader_device **devs, int ndev);
 bool
 pipe_loader_drm_probe_fd(struct pipe_loader_device **dev, int fd);
 
+struct pipe_screen *
+load_pipe_screen(struct pipe_loader_device **dev, int fd);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c b/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c
index 994a284..b7e0ac7 100644
--- a/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c
+++ b/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c
@@ -306,3 +306,12 @@ static const struct pipe_loader_ops pipe_loader_drm_ops = {
    .configuration = pipe_loader_drm_configuration,
    .release = pipe_loader_drm_release
 };
+
+PUBLIC struct pipe_screen *load_pipe_screen(struct pipe_loader_device **dev, int fd)
+{
+   struct pipe_screen *pscreen = NULL;
+   if (pipe_loader_drm_probe_fd(dev, fd)) {
+      pscreen = pipe_loader_create_screen(*dev);
+   }
+   return pscreen;
+}
diff --git a/src/gallium/state_trackers/dri/dri2.c b/src/gallium/state_trackers/dri/dri2.c
index a11a6cb..29aaa96 100644
--- a/src/gallium/state_trackers/dri/dri2.c
+++ b/src/gallium/state_trackers/dri/dri2.c
@@ -1461,9 +1461,7 @@ dri2_init_screen(__DRIscreen * sPriv)
    if (screen->fd < 0 || (fd = dup(screen->fd)) < 0)
       goto fail;
 
-   if (pipe_loader_drm_probe_fd(&screen->dev, fd))
-      pscreen = pipe_loader_create_screen(screen->dev);
-
+   pscreen = load_pipe_screen(&screen->dev, screen->fd);
    if (!pscreen)
        goto fail;
 
diff --git a/src/gallium/targets/dri/dri.sym b/src/gallium/targets/dri/dri.sym
index 1fdf18b..1d86c88 100644
--- a/src/gallium/targets/dri/dri.sym
+++ b/src/gallium/targets/dri/dri.sym
@@ -2,6 +2,7 @@
 	global:
 		__driDriverExtensions;
 		__driDriverGetExtensions*;
+		load_pipe_screen;
 		nouveau_drm_screen_create;
 		radeon_drm_winsys_create;
 		amdgpu_winsys_create;
-- 
2.5.0



More information about the mesa-dev mailing list