[Mesa-dev] [PATCH 15/40] pipe-loader: rework the sw backend

Brian Paul brianp at vmware.com
Mon Oct 19 09:03:16 PDT 2015


On 10/17/2015 04:57 PM, Emil Velikov wrote:
> Move the winsys into the pipe-target, bla bla bla
>
> XXX: separate pipe-drivers are likely to be busted
>
> Signed-off-by: Emil Velikov <emil.l.velikov at gmail.com>
> ---
>   src/gallium/auxiliary/pipe-loader/pipe_loader_sw.c | 94 +++++++++++++++++-----
>   src/gallium/include/state_tracker/sw_driver.h      | 21 +++++
>   src/gallium/targets/d3dadapter9/Makefile.am        |  3 +-
>   src/gallium/targets/dri/Makefile.am                |  3 +-
>   src/gallium/targets/omx/Makefile.am                |  3 +-
>   src/gallium/targets/opencl/Makefile.am             |  1 -
>   src/gallium/targets/pipe-loader/Makefile.am        |  5 ++
>   src/gallium/targets/pipe-loader/pipe.sym           |  2 +-
>   src/gallium/targets/pipe-loader/pipe_swrast.c      | 34 +++++++-
>   src/gallium/targets/va/Makefile.am                 |  3 +-
>   src/gallium/targets/vdpau/Makefile.am              |  3 +-
>   src/gallium/targets/xa/Makefile.am                 |  3 +-
>   src/gallium/targets/xvmc/Makefile.am               |  3 +-
>   src/gallium/tests/trivial/Makefile.am              |  1 -
>   14 files changed, 140 insertions(+), 39 deletions(-)
>   create mode 100644 src/gallium/include/state_tracker/sw_driver.h
>
> diff --git a/src/gallium/auxiliary/pipe-loader/pipe_loader_sw.c b/src/gallium/auxiliary/pipe-loader/pipe_loader_sw.c
> index c61f2b8..0f28541 100644
> --- a/src/gallium/auxiliary/pipe-loader/pipe_loader_sw.c
> +++ b/src/gallium/auxiliary/pipe-loader/pipe_loader_sw.c
> @@ -35,9 +35,11 @@
>   #include "sw/wrapper/wrapper_sw_winsys.h"
>   #include "target-helpers/inline_sw_helper.h"
>   #include "state_tracker/drisw_api.h"
> +#include "state_tracker/sw_driver.h"
>
>   struct pipe_loader_sw_device {
>      struct pipe_loader_device base;
> +   const struct sw_driver_descriptor *dd;
>      struct util_dl_library *lib;
>      struct sw_winsys *ws;
>   };
> @@ -49,13 +51,23 @@ static struct pipe_loader_ops pipe_loader_sw_ops;
>   static bool
>   pipe_loader_sw_probe_init_common(struct pipe_loader_sw_device *sdev)
>   {
> -   if (!sdev->ws)
> -      return false;
> -
>      sdev->base.type = PIPE_LOADER_DEVICE_SOFTWARE;
>      sdev->base.driver_name = "swrast";
>      sdev->base.ops = &pipe_loader_sw_ops;
>
> +   sdev->lib = pipe_loader_find_module(&sdev->base, PIPE_SEARCH_DIR);
> +   if (!sdev->lib)
> +      return false;
> +
> +   sdev->dd = (const struct sw_driver_descriptor *)
> +      util_dl_get_proc_address(sdev->lib, "swrast_driver_descriptor");
> +
> +   if (!sdev->dd){
> +      util_dl_close(sdev->lib);
> +      sdev->lib = NULL;
> +      return false;
> +   }
> +
>      return true;
>   }
>
> @@ -68,11 +80,24 @@ pipe_loader_sw_probe_dri(struct pipe_loader_device **devs, struct drisw_loader_f
>      if (!sdev)
>         return false;
>
> -   sdev->ws = dri_create_sw_winsys(drisw_lf);
>      if (!pipe_loader_sw_probe_init_common(sdev)) {
>         FREE(sdev);
>         return false;
>      }
> +
> +   for (int i = 0; sdev->dd->winsys; i++) {

I'm not 100% sure, but I think some compiler environments might choke on 
declaring the variable inside the loop.

-Brian

> +      if (strcmp(sdev->dd->winsys[i].name, "dri") == 0) {
> +         sdev->ws = sdev->dd->winsys[i].create_winsys(drisw_lf);
> +         break;
> +      }
> +   }
> +   if (!sdev->ws) {
> +      if (sdev->lib)
> +         util_dl_close(sdev->lib);
> +
> +      FREE(sdev);
> +      return false;
> +   }
>      *devs = &sdev->base;
>
>      return true;
> @@ -88,11 +113,24 @@ pipe_loader_sw_probe_kms(struct pipe_loader_device **devs, int fd)
>      if (!sdev)
>         return false;
>
> -   sdev->ws = kms_dri_create_winsys(fd);
>      if (!pipe_loader_sw_probe_init_common(sdev)) {
>         FREE(sdev);
>         return false;
>      }
> +
> +   for (int i = 0; sdev->dd->winsys; i++) {
> +      if (strcmp(sdev->dd->winsys[i].name, "kms_dri") == 0) {
> +         sdev->ws = sdev->dd->winsys[i].create_winsys(fd);
> +         break;
> +      }
> +   }
> +   if (!sdev->ws) {
> +      if (sdev->lib)
> +         util_dl_close(sdev->lib);
> +
> +      FREE(sdev);
> +      return false;
> +   }
>      *devs = &sdev->base;
>
>      return true;
> @@ -107,11 +145,24 @@ pipe_loader_sw_probe_null(struct pipe_loader_device **devs)
>      if (!sdev)
>         return false;
>
> -   sdev->ws = null_sw_create();
>      if (!pipe_loader_sw_probe_init_common(sdev)) {
>         FREE(sdev);
>         return false;
>      }
> +
> +   for (int i = 0; sdev->dd->winsys; i++) {
> +      if (strcmp(sdev->dd->winsys[i].name, "null") == 0) {
> +         sdev->ws = sdev->dd->winsys[i].create_winsys();
> +         break;
> +      }
> +   }
> +   if (!sdev->ws) {
> +      if (sdev->lib)
> +         util_dl_close(sdev->lib);
> +
> +      FREE(sdev);
> +      return false;
> +   }
>      *devs = &sdev->base;
>
>      return true;
> @@ -140,12 +191,26 @@ pipe_loader_sw_probe_wrapped(struct pipe_loader_device **dev,
>      if (!sdev)
>         return false;
>
> -   sdev->ws = wrapper_sw_winsys_wrap_pipe_screen(screen);
>      if (!pipe_loader_sw_probe_init_common(sdev)) {
>         FREE(sdev);
>         return false;
>      }
> +
> +   for (int i = 0; sdev->dd->winsys; i++) {
> +      if (strcmp(sdev->dd->winsys[i].name, "wrapped") == 0) {
> +         sdev->ws = sdev->dd->winsys[i].create_winsys(screen);
> +         break;
> +      }
> +   }
> +   if (!sdev->ws) {
> +      if (sdev->lib)
> +         util_dl_close(sdev->lib);
> +
> +      FREE(sdev);
> +      return false;
> +   }
>      *dev = &sdev->base;
> +
>      return true;
>   }
>
> @@ -172,21 +237,8 @@ static struct pipe_screen *
>   pipe_loader_sw_create_screen(struct pipe_loader_device *dev)
>   {
>      struct pipe_loader_sw_device *sdev = pipe_loader_sw_device(dev);
> -   struct pipe_screen *(*init)(struct sw_winsys *);
> -
> -   if (!sdev->lib)
> -      sdev->lib = pipe_loader_find_module(&sdev->base, PIPE_SEARCH_DIR);
> -   if (!sdev->lib)
> -      return NULL;
> -
> -   init = (void *)util_dl_get_proc_address(sdev->lib, "swrast_create_screen");
> -   if (!init){
> -      util_dl_close(sdev->lib);
> -      sdev->lib = NULL;
> -      return NULL;
> -   }
>
> -   return init(sdev->ws);
> +   return sdev->dd->create_screen(sdev->ws);
>   }
>
>   static struct pipe_loader_ops pipe_loader_sw_ops = {
> diff --git a/src/gallium/include/state_tracker/sw_driver.h b/src/gallium/include/state_tracker/sw_driver.h
> new file mode 100644
> index 0000000..0eb2b44
> --- /dev/null
> +++ b/src/gallium/include/state_tracker/sw_driver.h
> @@ -0,0 +1,21 @@
> +
> +#ifndef _SW_DRIVER_H_
> +#define _SW_DRIVER_H_
> +
> +#include "pipe/p_compiler.h"
> +
> +struct pipe_screen;
> +struct sw_winsys;
> +
> +struct sw_driver_descriptor
> +{
> +   struct pipe_screen *(*create_screen)(struct sw_winsys *ws);
> +   struct {
> +       const char * const name;
> +       struct sw_winsys *(*create_winsys)();
> +   } winsys[];
> +};
> +
> +extern struct sw_driver_descriptor swrast_driver_descriptor;
> +
> +#endif
> diff --git a/src/gallium/targets/d3dadapter9/Makefile.am b/src/gallium/targets/d3dadapter9/Makefile.am
> index bd6d620..d125ba8 100644
> --- a/src/gallium/targets/d3dadapter9/Makefile.am
> +++ b/src/gallium/targets/d3dadapter9/Makefile.am
> @@ -110,8 +110,7 @@ d3dadapter9_la_LIBADD += $(TARGET_LIB_DEPS) \
>   else # HAVE_GALLIUM_STATIC_TARGETS
>
>   d3dadapter9_la_LIBADD += \
> -	$(top_builddir)/src/gallium/auxiliary/pipe-loader/libpipe_loader.la \
> -	$(GALLIUM_PIPE_LOADER_WINSYS_LIBS)
> +	$(top_builddir)/src/gallium/auxiliary/pipe-loader/libpipe_loader.la
>
>   endif # HAVE_GALLIUM_STATIC_TARGETS
>
> diff --git a/src/gallium/targets/dri/Makefile.am b/src/gallium/targets/dri/Makefile.am
> index 7f945d1..6f81635 100644
> --- a/src/gallium/targets/dri/Makefile.am
> +++ b/src/gallium/targets/dri/Makefile.am
> @@ -96,8 +96,7 @@ gallium_dri_la_LIBADD += $(TARGET_LIB_DEPS) \
>   else # HAVE_GALLIUM_STATIC_TARGETS
>
>   gallium_dri_la_LIBADD += \
> -	$(top_builddir)/src/gallium/auxiliary/pipe-loader/libpipe_loader.la \
> -	$(GALLIUM_PIPE_LOADER_WINSYS_LIBS)
> +	$(top_builddir)/src/gallium/auxiliary/pipe-loader/libpipe_loader.la
>
>   endif # HAVE_GALLIUM_STATIC_TARGETS
>
> diff --git a/src/gallium/targets/omx/Makefile.am b/src/gallium/targets/omx/Makefile.am
> index a4dff48..2454cbe 100644
> --- a/src/gallium/targets/omx/Makefile.am
> +++ b/src/gallium/targets/omx/Makefile.am
> @@ -56,8 +56,7 @@ libomx_mesa_la_LIBADD += $(TARGET_LIB_DEPS) \
>   else # HAVE_GALLIUM_STATIC_TARGETS
>
>   libomx_mesa_la_LIBADD += \
> -	$(top_builddir)/src/gallium/auxiliary/pipe-loader/libpipe_loader.la \
> -	$(GALLIUM_PIPE_LOADER_WINSYS_LIBS)
> +	$(top_builddir)/src/gallium/auxiliary/pipe-loader/libpipe_loader.la
>
>   endif # HAVE_GALLIUM_STATIC_TARGETS
>
> diff --git a/src/gallium/targets/opencl/Makefile.am b/src/gallium/targets/opencl/Makefile.am
> index c78b268..004d6d7 100644
> --- a/src/gallium/targets/opencl/Makefile.am
> +++ b/src/gallium/targets/opencl/Makefile.am
> @@ -19,7 +19,6 @@ lib at OPENCL_LIBNAME@_la_LIBADD = \
>   	$(top_builddir)/src/gallium/state_trackers/clover/libclover.la \
>   	$(top_builddir)/src/gallium/auxiliary/libgallium.la \
>   	$(top_builddir)/src/util/libmesautil.la \
> -	$(GALLIUM_PIPE_LOADER_WINSYS_LIBS) \
>   	$(ELF_LIB) \
>   	-ldl \
>   	-lclangCodeGen \
> diff --git a/src/gallium/targets/pipe-loader/Makefile.am b/src/gallium/targets/pipe-loader/Makefile.am
> index 4f25b4f..4bc3b55 100644
> --- a/src/gallium/targets/pipe-loader/Makefile.am
> +++ b/src/gallium/targets/pipe-loader/Makefile.am
> @@ -27,6 +27,7 @@ AM_CPPFLAGS = \
>   	-I$(top_srcdir)/include \
>   	-I$(top_srcdir)/src/gallium/drivers \
>   	-I$(top_srcdir)/src/gallium/winsys \
> +	$(GALLIUM_PIPE_LOADER_DEFINES) \
>   	$(LIBDRM_CFLAGS) \
>   	$(VISIBILITY_CFLAGS) \
>   	-DGALLIUM_RBUG \
> @@ -208,6 +209,10 @@ AM_CPPFLAGS += -DGALLIUM_LLVMPIPE
>   pipe_swrast_la_LIBADD += \
>   	$(top_builddir)/src/gallium/drivers/llvmpipe/libllvmpipe.la
>   endif
> +
> +pipe_swrast_la_LIBADD += \
> +	$(GALLIUM_PIPE_LOADER_WINSYS_LIBS)
> +
>   endif
>
>   EXTRA_DIST = pipe.sym
> diff --git a/src/gallium/targets/pipe-loader/pipe.sym b/src/gallium/targets/pipe-loader/pipe.sym
> index 19b1d77..b2fa619 100644
> --- a/src/gallium/targets/pipe-loader/pipe.sym
> +++ b/src/gallium/targets/pipe-loader/pipe.sym
> @@ -1,7 +1,7 @@
>   {
>   	global:
>   		driver_descriptor;
> -		swrast_create_screen;
> +		swrast_driver_descriptor;
>   	local:
>   		*;
>   };
> diff --git a/src/gallium/targets/pipe-loader/pipe_swrast.c b/src/gallium/targets/pipe-loader/pipe_swrast.c
> index f7f354a..cf617f3 100644
> --- a/src/gallium/targets/pipe-loader/pipe_swrast.c
> +++ b/src/gallium/targets/pipe-loader/pipe_swrast.c
> @@ -1,7 +1,11 @@
>
>   #include "target-helpers/inline_sw_helper.h"
>   #include "target-helpers/inline_debug_helper.h"
> -#include "state_tracker/drm_driver.h"
> +#include "state_tracker/sw_driver.h"
> +#include "sw/dri/dri_sw_winsys.h"
> +#include "sw/kms-dri/kms_dri_sw_winsys.h"
> +#include "sw/null/null_sw_winsys.h"
> +#include "sw/wrapper/wrapper_sw_winsys.h"
>
>   PUBLIC struct pipe_screen *
>   swrast_create_screen(struct sw_winsys *ws);
> @@ -17,3 +21,31 @@ swrast_create_screen(struct sw_winsys *ws)
>
>      return screen;
>   }
> +
> +PUBLIC
> +struct sw_driver_descriptor swrast_driver_descriptor = {
> +   .create_screen = swrast_create_screen,
> +   .winsys = {
> +#ifdef HAVE_PIPE_LOADER_DRI
> +      {
> +         .name = "dri",
> +         .create_winsys = dri_create_sw_winsys,
> +      },
> +#endif
> +#ifdef HAVE_PIPE_LOADER_KMS
> +      {
> +         .name = "kms_dri",
> +         .create_winsys = kms_dri_create_winsys,
> +      },
> +#endif
> +      {
> +         .name = "null",
> +         .create_winsys = null_sw_create,
> +      },
> +      {
> +         .name = "wrapped",
> +         .create_winsys = wrapper_sw_winsys_wrap_pipe_screen,
> +      },
> +      { 0 },
> +   }
> +};
> diff --git a/src/gallium/targets/va/Makefile.am b/src/gallium/targets/va/Makefile.am
> index 9613f04..2fd24a8 100644
> --- a/src/gallium/targets/va/Makefile.am
> +++ b/src/gallium/targets/va/Makefile.am
> @@ -53,8 +53,7 @@ gallium_drv_video_la_LIBADD += $(TARGET_LIB_DEPS) \
>   else # HAVE_GALLIUM_STATIC_TARGETS
>
>   gallium_drv_video_la_LIBADD += \
> -	$(top_builddir)/src/gallium/auxiliary/pipe-loader/libpipe_loader.la \
> -	$(GALLIUM_PIPE_LOADER_WINSYS_LIBS)
> +	$(top_builddir)/src/gallium/auxiliary/pipe-loader/libpipe_loader.la
>
>   endif # HAVE_GALLIUM_STATIC_TARGETS
>
> diff --git a/src/gallium/targets/vdpau/Makefile.am b/src/gallium/targets/vdpau/Makefile.am
> index 7eb62c1..34b7ef4 100644
> --- a/src/gallium/targets/vdpau/Makefile.am
> +++ b/src/gallium/targets/vdpau/Makefile.am
> @@ -65,8 +65,7 @@ libvdpau_gallium_la_LIBADD += $(TARGET_LIB_DEPS) \
>   else # HAVE_GALLIUM_STATIC_TARGETS
>
>   libvdpau_gallium_la_LIBADD += \
> -	$(top_builddir)/src/gallium/auxiliary/pipe-loader/libpipe_loader.la \
> -	$(GALLIUM_PIPE_LOADER_WINSYS_LIBS)
> +	$(top_builddir)/src/gallium/auxiliary/pipe-loader/libpipe_loader.la
>
>   endif # HAVE_GALLIUM_STATIC_TARGETS
>
> diff --git a/src/gallium/targets/xa/Makefile.am b/src/gallium/targets/xa/Makefile.am
> index 02c42c6..0fba3b2 100644
> --- a/src/gallium/targets/xa/Makefile.am
> +++ b/src/gallium/targets/xa/Makefile.am
> @@ -79,8 +79,7 @@ libxatracker_la_LIBADD += $(TARGET_LIB_DEPS)
>   else # HAVE_GALLIUM_STATIC_TARGETS
>
>   libxatracker_la_LIBADD += \
> -	$(top_builddir)/src/gallium/auxiliary/pipe-loader/libpipe_loader.la \
> -	$(GALLIUM_PIPE_LOADER_WINSYS_LIBS)
> +	$(top_builddir)/src/gallium/auxiliary/pipe-loader/libpipe_loader.la
>
>   endif # HAVE_GALLIUM_STATIC_TARGETS
>
> diff --git a/src/gallium/targets/xvmc/Makefile.am b/src/gallium/targets/xvmc/Makefile.am
> index b328589..f1045d4 100644
> --- a/src/gallium/targets/xvmc/Makefile.am
> +++ b/src/gallium/targets/xvmc/Makefile.am
> @@ -53,8 +53,7 @@ libXvMCgallium_la_LIBADD += $(TARGET_LIB_DEPS) \
>
>   else # HAVE_GALLIUM_STATIC_TARGETS
>   libXvMCgallium_la_LIBADD += \
> -	$(top_builddir)/src/gallium/auxiliary/pipe-loader/libpipe_loader.la \
> -	$(GALLIUM_PIPE_LOADER_WINSYS_LIBS)
> +	$(top_builddir)/src/gallium/auxiliary/pipe-loader/libpipe_loader.la
>
>   endif # HAVE_GALLIUM_STATIC_TARGETS
>
> diff --git a/src/gallium/tests/trivial/Makefile.am b/src/gallium/tests/trivial/Makefile.am
> index b30cb13..175bef2 100644
> --- a/src/gallium/tests/trivial/Makefile.am
> +++ b/src/gallium/tests/trivial/Makefile.am
> @@ -9,7 +9,6 @@ LDADD = \
>   	$(top_builddir)/src/gallium/auxiliary/pipe-loader/libpipe_loader.la \
>   	$(top_builddir)/src/gallium/auxiliary/libgallium.la \
>   	$(top_builddir)/src/util/libmesautil.la \
> -	$(GALLIUM_PIPE_LOADER_WINSYS_LIBS) \
>   	$(GALLIUM_COMMON_LIB_DEPS)
>
>   noinst_PROGRAMS = compute tri quad-tex
>



More information about the mesa-dev mailing list