Part 2 of 2 (part 1 is autoconf changes, part 2 is C++ changes)

When only a single SWR architecture is being used, this allows that
architecture to be builtin rather than as a separate libswrARCH.so that
gets loaded via dlopen.  Since there are now several different code
paths for each detected CPU architecture, the log output is also
adjusted to convey where the backend is getting loaded from.

This allows SWR to be used for static mesa builds which are still
important for large HPC environments where shared libraries can impose
unacceptable application startup times as hundreds of thousands of copies
of the libs are loaded from a shared parallel filesystem.

Based on an initial implementation by Tim Rowley.

Signed-off-by: Chuck Atkins <chuck.atk...@kitware.com>
CC: Tim Rowley <timothy.o.row...@intel.com>
CC: Bruce Cherniak <bruce.chern...@intel.com>
---
 src/gallium/drivers/swr/swr_loader.cpp | 94 ++++++++++++++++++++++------------
 1 file changed, 60 insertions(+), 34 deletions(-)

diff --git a/src/gallium/drivers/swr/swr_loader.cpp 
b/src/gallium/drivers/swr/swr_loader.cpp
index 9d6f918e34..57f826fd59 100644
--- a/src/gallium/drivers/swr/swr_loader.cpp
+++ b/src/gallium/drivers/swr/swr_loader.cpp
@@ -31,78 +31,104 @@
 struct pipe_screen *
 swr_create_screen(struct sw_winsys *winsys)
 {
+   struct pipe_screen *screen = swr_create_screen_internal(winsys);
+
+   bool found = false;
+   bool is_knl = false;
+
+#ifndef HAVE_SWR_BUILTIN
    char filename[256] = { 0 };
-   fprintf(stderr, "SWR detected ");
+#endif
 
-   util_dl_library *pLibrary = nullptr;
 
    util_cpu_detect();
 
-   bool is_knl = false;
-
-   if (!strlen(filename) &&
-       util_cpu_caps.has_avx512f && util_cpu_caps.has_avx512er) {
-#if HAVE_SWR_KNL
-      fprintf(stderr, "KNL ");
+   if (!found && util_cpu_caps.has_avx512f && util_cpu_caps.has_avx512er) {
+      fprintf(stderr, "SWR detected KNL instruction support ");
+#ifndef HAVE_SWR_KNL
+      fprintf(stderr, "(skipping; not built).\n");
+#else
+   #ifdef HAVE_SWR_BUILTIN
+      swr_screen(screen)->pfnSwrGetInterface = SwrGetInterface;
+      fprintf(stderr, "(using; builtin).\n");
+   #else
       sprintf(filename, "%s%s%s", UTIL_DL_PREFIX, "swrKNL", UTIL_DL_EXT);
+      fprintf(stderr, "(using; %s).\n", filename);
+   #endif
+      found = true;
       is_knl = true;
-#else
-      fprintf(stderr, "KNL (not built) ");
 #endif
    }
 
-   if (!strlen(filename) &&
-       util_cpu_caps.has_avx512f && util_cpu_caps.has_avx512bw) {
-#if HAVE_SWR_SKX
-      fprintf(stderr, "SKX ");
-      sprintf(filename, "%s%s%s", UTIL_DL_PREFIX, "swrSKX", UTIL_DL_EXT);
+   if (!found && util_cpu_caps.has_avx512f && util_cpu_caps.has_avx512bw) {
+      fprintf(stderr, "SWR detected SKX instruction support ");
+#ifndef HAVE_SWR_SKX
+      fprintf(stderr, "(skipping; not built).\n");
 #else
-      fprintf(stderr, "SKX (not built) ");
+   #ifdef HAVE_SWR_BUILTIN
+      swr_screen(screen)->pfnSwrGetInterface = SwrGetInterface;
+      fprintf(stderr, "(using; builtin).\n");
+   #else
+      sprintf(filename, "%s%s%s", UTIL_DL_PREFIX, "swrSKX", UTIL_DL_EXT);
+      fprintf(stderr, "(using; %s).\n", filename);
+   #endif
+      found = true;
 #endif
    }
 
-   if (!strlen(filename) && util_cpu_caps.has_avx2) {
-#if HAVE_SWR_AVX2
-      fprintf(stderr, "AVX2 ");
-      sprintf(filename, "%s%s%s", UTIL_DL_PREFIX, "swrAVX2", UTIL_DL_EXT);
+   if (!found && util_cpu_caps.has_avx2) {
+      fprintf(stderr, "SWR detected AVX2 instruction support ");
+#ifndef HAVE_SWR_AVX2
+      fprintf(stderr, "(skipping; not built).\n");
 #else
-      fprintf(stderr, "AVX2 (not built) ");
+   #ifdef HAVE_SWR_BUILTIN
+      swr_screen(screen)->pfnSwrGetInterface = SwrGetInterface;
+      fprintf(stderr, "(using; builtin).\n");
+   #else
+      sprintf(filename, "%s%s%s", UTIL_DL_PREFIX, "swrAVX2", UTIL_DL_EXT);
+      fprintf(stderr, "(using; %s).\n", filename);
+   #endif
+      found = true;
 #endif
    }
 
-   if (!strlen(filename) && util_cpu_caps.has_avx) {
-#if HAVE_SWR_AVX
-      fprintf(stderr, "AVX ");
-      sprintf(filename, "%s%s%s", UTIL_DL_PREFIX, "swrAVX", UTIL_DL_EXT);
+   if (!found && util_cpu_caps.has_avx) {
+      fprintf(stderr, "SWR detected AVX instruction support ");
+#ifndef HAVE_SWR_AVX
+      fprintf(stderr, "(skipping; not built).\n");
 #else
-      fprintf(stderr, "AVX (not built) ");
+   #ifdef HAVE_SWR_BUILTIN
+      swr_screen(screen)->pfnSwrGetInterface = SwrGetInterface;
+      fprintf(stderr, "(using; builtin).\n");
+   #else
+      sprintf(filename, "%s%s%s", UTIL_DL_PREFIX, "swrAVX", UTIL_DL_EXT);
+      fprintf(stderr, "(using; %s).\n", filename);
+   #endif
+      found = true;
 #endif
    }
 
-   if (!strlen(filename)) {
-      fprintf(stderr, "- no appropriate swr architecture library.  
Aborting!\n");
+   if (!found) {
+      fprintf(stderr, "SWR could not detect a supported CPU architecture.\n");
       exit(-1);
-   } else {
-      fprintf(stderr, "\n");
    }
 
-   pLibrary = util_dl_open(filename);
-
+#ifndef HAVE_SWR_BUILTIN
+   util_dl_library *pLibrary = util_dl_open(filename);
    if (!pLibrary) {
       fprintf(stderr, "SWR library load failure: %s\n", util_dl_error());
       exit(-1);
    }
 
    util_dl_proc pApiProc = util_dl_get_proc_address(pLibrary, 
"SwrGetInterface");
-
    if (!pApiProc) {
       fprintf(stderr, "SWR library search failure: %s\n", util_dl_error());
       exit(-1);
    }
 
-   struct pipe_screen *screen = swr_create_screen_internal(winsys);
    swr_screen(screen)->pfnSwrGetInterface = (PFNSwrGetInterface)pApiProc;
    swr_screen(screen)->is_knl = is_knl;
+#endif
 
    return screen;
 }
-- 
2.14.3

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

Reply via email to