swr: Refactor checks for compiler feature flags
Encapsulate the test for which flags are needed to get a compiler to support certain features. Along with this, give various options to try for AVX and AVX2 support. Ideally we want to use specific instruction set feature flags, like -mavx2 for instance instead of -march=haswell, but the flags required for certain compilers are different. This allows, for AVX2 for instance, GCC to use -mavx2 -mfma -mbmi2 -mf16c while the Intel compiler which doesn't support those flags can fall back to using -march=core-avx2. This addresses a bug where the Intel compiler will silently ignore the AVX2 instruction feature flags and then potentially fail to build. v2: Pass preprocessor-check argument as true-state instead of false-state for clarity. v3: Reduce AVX2 define test to just __AVX2__. Additional defines suchas __FMA__, __BMI2__, and __F16C__ appear to be inconsistently defined w.r.t thier availability. v4: Fix C++11 flags being added globally and add more logic to swr_require_cxx_feature_flags Cc: <mesa-stable@lists.freedesktop.org> Reviewed-by: Tim Rowley <timothy.o.rowley@intel.com> Tested-by: Tim Rowley <timothy.o.rowley@Intel.com> Signed-off-by: Chuck Atkins <chuck.atkins@kitware.com>
This commit is contained in:
parent
eb79b2b331
commit
c1bf6692be
73
configure.ac
73
configure.ac
|
@ -2330,6 +2330,45 @@ swr_llvm_check() {
|
|||
fi
|
||||
}
|
||||
|
||||
swr_require_cxx_feature_flags() {
|
||||
feature_name="$1"
|
||||
preprocessor_test="$2"
|
||||
option_list="$3"
|
||||
output_var="$4"
|
||||
|
||||
AC_MSG_CHECKING([whether $CXX supports $feature_name])
|
||||
AC_LANG_PUSH([C++])
|
||||
save_CXXFLAGS="$CXXFLAGS"
|
||||
save_IFS="$IFS"
|
||||
IFS=","
|
||||
found=0
|
||||
for opts in $option_list
|
||||
do
|
||||
unset IFS
|
||||
CXXFLAGS="$opts $save_CXXFLAGS"
|
||||
AC_COMPILE_IFELSE(
|
||||
[AC_LANG_PROGRAM(
|
||||
[ #if !($preprocessor_test)
|
||||
#error
|
||||
#endif
|
||||
])],
|
||||
[found=1; break],
|
||||
[])
|
||||
IFS=","
|
||||
done
|
||||
IFS="$save_IFS"
|
||||
CXXFLAGS="$save_CXXFLAGS"
|
||||
AC_LANG_POP([C++])
|
||||
if test $found -eq 1; then
|
||||
AC_MSG_RESULT([$opts])
|
||||
eval "$output_var=\$opts"
|
||||
return 0
|
||||
fi
|
||||
AC_MSG_RESULT([no])
|
||||
AC_MSG_ERROR([swr requires $feature_name support])
|
||||
return 1
|
||||
}
|
||||
|
||||
dnl Duplicates in GALLIUM_DRIVERS_DIRS are removed by sorting it after this block
|
||||
if test -n "$with_gallium_drivers"; then
|
||||
gallium_drivers=`IFS=', '; echo $with_gallium_drivers`
|
||||
|
@ -2399,31 +2438,19 @@ if test -n "$with_gallium_drivers"; then
|
|||
xswr)
|
||||
swr_llvm_check "swr"
|
||||
|
||||
AC_MSG_CHECKING([whether $CXX supports c++11/AVX/AVX2])
|
||||
SWR_AVX_CXXFLAGS="-mavx"
|
||||
SWR_AVX2_CXXFLAGS="-mavx2 -mfma -mbmi2 -mf16c"
|
||||
|
||||
AC_LANG_PUSH([C++])
|
||||
save_CXXFLAGS="$CXXFLAGS"
|
||||
CXXFLAGS="-std=c++11 $CXXFLAGS"
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM()],[],
|
||||
[AC_MSG_ERROR([c++11 compiler support not detected])])
|
||||
CXXFLAGS="$save_CXXFLAGS"
|
||||
|
||||
save_CXXFLAGS="$CXXFLAGS"
|
||||
CXXFLAGS="$SWR_AVX_CXXFLAGS $CXXFLAGS"
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM()],[],
|
||||
[AC_MSG_ERROR([AVX compiler support not detected])])
|
||||
CXXFLAGS="$save_CXXFLAGS"
|
||||
|
||||
save_CFLAGS="$CXXFLAGS"
|
||||
CXXFLAGS="$SWR_AVX2_CXXFLAGS $CXXFLAGS"
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM()],[],
|
||||
[AC_MSG_ERROR([AVX2 compiler support not detected])])
|
||||
CXXFLAGS="$save_CXXFLAGS"
|
||||
AC_LANG_POP([C++])
|
||||
swr_require_cxx_feature_flags "C++11" "__cplusplus >= 201103L" \
|
||||
",-std=c++11" \
|
||||
SWR_CXX11_CXXFLAGS
|
||||
AC_SUBST([SWR_CXX11_CXXFLAGS])
|
||||
|
||||
swr_require_cxx_feature_flags "AVX" "defined(__AVX__)" \
|
||||
",-mavx,-march=core-avx" \
|
||||
SWR_AVX_CXXFLAGS
|
||||
AC_SUBST([SWR_AVX_CXXFLAGS])
|
||||
|
||||
swr_require_cxx_feature_flags "AVX2" "defined(__AVX2__)" \
|
||||
",-mavx2 -mfma -mbmi2 -mf16c,-march=core-avx2" \
|
||||
SWR_AVX2_CXXFLAGS
|
||||
AC_SUBST([SWR_AVX2_CXXFLAGS])
|
||||
|
||||
HAVE_GALLIUM_SWR=yes
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
include Makefile.sources
|
||||
include $(top_srcdir)/src/gallium/Automake.inc
|
||||
|
||||
AM_CXXFLAGS = $(GALLIUM_DRIVER_CFLAGS) -std=c++11
|
||||
AM_CXXFLAGS = $(GALLIUM_DRIVER_CFLAGS) $(SWR_CXX11_CXXFLAGS)
|
||||
|
||||
noinst_LTLIBRARIES = libmesaswr.la
|
||||
|
||||
|
@ -31,7 +31,7 @@ libmesaswr_la_SOURCES = $(LOADER_SOURCES)
|
|||
COMMON_CXXFLAGS = \
|
||||
$(GALLIUM_DRIVER_CFLAGS) \
|
||||
$(LLVM_CXXFLAGS) \
|
||||
-std=c++11 \
|
||||
$(SWR_CXX11_CXXFLAGS) \
|
||||
-I$(builddir)/rasterizer/scripts \
|
||||
-I$(builddir)/rasterizer/jitter \
|
||||
-I$(srcdir)/rasterizer \
|
||||
|
|
Loading…
Reference in New Issue