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.veli...@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@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


_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to