[Mesa-dev] [PATCH 1/2] swr: allow a single architecture to be builtin
Chuck Atkins
chuck.atkins at kitware.com
Tue Jan 16 15:36:49 UTC 2018
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 also 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.atkins at kitware.com>
CC: Tim Rowley <timothy.o.rowley at intel.com>
CC: Bruce Cherniak <bruce.cherniak at intel.com>
---
configure.ac | 12 ++++-
src/gallium/drivers/swr/Makefile.am | 48 +++++++++++++----
src/gallium/drivers/swr/swr_loader.cpp | 95 ++++++++++++++++++++++------------
3 files changed, 110 insertions(+), 45 deletions(-)
diff --git a/configure.ac b/configure.ac
index e236a3c54f..7c1fbe0ed1 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2640,6 +2640,11 @@ if test -n "$with_gallium_drivers"; then
AC_MSG_ERROR([swr enabled but no swr architectures selected])
fi
+ # test if more than one swr arch configured
+ if test `echo $swr_archs | wc -w` -eq 1; then
+ HAVE_SWR_BUILTIN=yes
+ fi
+
HAVE_GALLIUM_SWR=yes
;;
xvc4)
@@ -2689,6 +2694,7 @@ AM_CONDITIONAL(HAVE_SWR_AVX, test "x$HAVE_SWR_AVX" = xyes)
AM_CONDITIONAL(HAVE_SWR_AVX2, test "x$HAVE_SWR_AVX2" = xyes)
AM_CONDITIONAL(HAVE_SWR_KNL, test "x$HAVE_SWR_KNL" = xyes)
AM_CONDITIONAL(HAVE_SWR_SKX, test "x$HAVE_SWR_SKX" = xyes)
+AM_CONDITIONAL(HAVE_SWR_BUILTIN, test "x$HAVE_SWR_BUILTIN" = xyes)
dnl We need to validate some needed dependencies for renderonly drivers.
@@ -3153,7 +3159,11 @@ fi
echo ""
if test "x$HAVE_GALLIUM_SWR" != x; then
- echo " SWR archs: $swr_archs"
+ if test "x$HAVE_SWR_BUILTIN" = xyes; then
+ echo " SWR archs: $swr_archs (builtin)"
+ else
+ echo " SWR archs: $swr_archs"
+ fi
fi
dnl Libraries
diff --git a/src/gallium/drivers/swr/Makefile.am b/src/gallium/drivers/swr/Makefile.am
index c995f1b84a..69cd52d18f 100644
--- a/src/gallium/drivers/swr/Makefile.am
+++ b/src/gallium/drivers/swr/Makefile.am
@@ -29,10 +29,7 @@ noinst_LTLIBRARIES = libmesaswr.la
# gen_knobs.* included here to provide driver access to swr configuration
libmesaswr_la_SOURCES = \
$(CXX_SOURCES) \
- $(COMMON_CXX_SOURCES) \
$(JITTER_CXX_SOURCES) \
- rasterizer/codegen/gen_knobs.cpp \
- rasterizer/codegen/gen_knobs.h \
$(LOADER_SOURCES)
COMMON_CXXFLAGS = \
@@ -243,8 +240,6 @@ COMMON_LDFLAGS = \
lib_LTLIBRARIES =
if HAVE_SWR_AVX
-lib_LTLIBRARIES += libswrAVX.la
-
libswrAVX_la_CXXFLAGS = \
$(PTHREAD_CFLAGS) \
$(SWR_AVX_CXXFLAGS) \
@@ -262,7 +257,6 @@ libswrAVX_la_LDFLAGS = \
endif
if HAVE_SWR_AVX2
-lib_LTLIBRARIES += libswrAVX2.la
libswrAVX2_la_CXXFLAGS = \
$(PTHREAD_CFLAGS) \
$(SWR_AVX2_CXXFLAGS) \
@@ -280,8 +274,6 @@ libswrAVX2_la_LDFLAGS = \
endif
if HAVE_SWR_KNL
-lib_LTLIBRARIES += libswrKNL.la
-
libswrKNL_la_CXXFLAGS = \
$(PTHREAD_CFLAGS) \
$(SWR_KNL_CXXFLAGS) \
@@ -299,8 +291,6 @@ libswrKNL_la_LDFLAGS = \
endif
if HAVE_SWR_SKX
-lib_LTLIBRARIES += libswrSKX.la
-
libswrSKX_la_CXXFLAGS = \
$(PTHREAD_CFLAGS) \
$(SWR_SKX_CXXFLAGS) \
@@ -317,6 +307,44 @@ libswrSKX_la_LDFLAGS = \
$(COMMON_LDFLAGS)
endif
+if HAVE_SWR_BUILTIN
+libmesaswr_la_CXXFLAGS += -DHAVE_SWR_BUILTIN
+libmesaswr_la_LIBADD =
+if HAVE_SWR_AVX
+noinst_LTLIBRARIES += libswrAVX.la
+libmesaswr_la_LIBADD += libswrAVX.la
+endif
+if HAVE_SWR_AVX2
+noinst_LTLIBRARIES += libswrAVX2.la
+libmesaswr_la_LIBADD += libswrAVX2.la
+endif
+if HAVE_SWR_KNL
+noinst_LTLIBRARIES += libswrKNL.la
+libmesaswr_la_LIBADD += libswrKNL.la
+endif
+if HAVE_SWR_SKX
+noinst_LTLIBRARIES += libswrSKX.la
+libmesaswr_la_LIBADD += libswrSKX.la
+endif
+else # !HAVE_SWR_BUILTIN
+libmesaswr_la_SOURCES += \
+ $(COMMON_CXX_SOURCES) \
+ rasterizer/codegen/gen_knobs.cpp \
+ rasterizer/codegen/gen_knobs.h
+if HAVE_SWR_AVX
+lib_LTLIBRARIES += libswrAVX.la
+endif
+if HAVE_SWR_AVX2
+lib_LTLIBRARIES += libswrAVX2.la
+endif
+if HAVE_SWR_KNL
+lib_LTLIBRARIES += libswrKNL.la
+endif
+if HAVE_SWR_SKX
+lib_LTLIBRARIES += libswrSKX.la
+endif
+endif
+
include $(top_srcdir)/install-gallium-links.mk
# Generated gen_builder.hpp is not backwards compatible. So ship only one
diff --git a/src/gallium/drivers/swr/swr_loader.cpp b/src/gallium/drivers/swr/swr_loader.cpp
index 9d6f918e34..40324904d9 100644
--- a/src/gallium/drivers/swr/swr_loader.cpp
+++ b/src/gallium/drivers/swr/swr_loader.cpp
@@ -31,78 +31,105 @@
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 ");
- sprintf(filename, "%s%s%s", UTIL_DL_PREFIX, "swrKNL", UTIL_DL_EXT);
- is_knl = true;
+ 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
- fprintf(stderr, "KNL (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, "swrKNL", UTIL_DL_EXT);
+ fprintf(stderr, "(using; %s).\n", filename);
+ #endif
+ found = true;
+ is_knl = true;
#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
More information about the mesa-dev
mailing list