[Mesa-dev] [PATCH 1/2] configure/swr: configurable swr architectures

Emil Velikov emil.l.velikov at gmail.com
Mon Jul 17 16:42:31 UTC 2017


On 17 July 2017 at 15:08, Tim Rowley <timothy.o.rowley at intel.com> wrote:
> Allow configuration of the SWR architecture depend libraries
> we build for with --with-swr-archs.  Maintains current behavior
> by defaulting to avx,avx2.
>
> Scons changes made to make it still build and work, but
> without the changes for configuring which architectures.
> ---
>  configure.ac                           | 39 ++++++++++++++++++++++++++++++----
>  src/gallium/drivers/swr/Makefile.am    | 17 ++++++++++++++-
>  src/gallium/drivers/swr/SConscript     |  1 +
>  src/gallium/drivers/swr/swr_loader.cpp | 22 +++++++++++++++----
>  4 files changed, 70 insertions(+), 9 deletions(-)
>
> diff --git a/configure.ac b/configure.ac
> index 46fcd8f3fe..3a8fa4d7ea 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -2349,6 +2349,15 @@ AC_ARG_WITH([d3d-libdir],
>      [D3D_DRIVER_INSTALL_DIR="${libdir}/d3d"])
>  AC_SUBST([D3D_DRIVER_INSTALL_DIR])
>
> +dnl Architectures to build SWR library for
> +
> +AC_ARG_WITH([swr-archs],
> +    [AS_HELP_STRING([--with-swr-archs@<:@=DIRS...@:>@],
> +        [comma delimited swr architectures list, e.g.
> +        "avx,avx2" @<:@default="avx,avx2"@:>@])],
> +    [with_swr_archs="$withval"],
> +    [with_swr_archs="avx avx2"])
Add the missing comma - "avx,avx2"

> +
>  dnl
>  dnl r300 doesn't strictly require LLVM, but for performance reasons we
>  dnl highly recommend LLVM usage. So require it at least on x86 and x86_64
> @@ -2496,10 +2505,24 @@ if test -n "$with_gallium_drivers"; then
>                  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])
> +            swr_archs=`IFS=', '; echo $with_swr_archs`
> +            for arch in $swr_archs; do
> +                case "x$arch" in
> +                xavx)
You want to move the AVX flag detection here, right?

> +                    HAVE_SWR_AVX=yes
> +                    ;;
> +                xavx2)
> +                    swr_require_cxx_feature_flags "AVX2" "defined(__AVX2__)" \
> +                        ",-mavx2 -mfma -mbmi2 -mf16c,-march=core-avx2" \
> +                        SWR_AVX2_CXXFLAGS
> +                    AC_SUBST([SWR_AVX2_CXXFLAGS])
> +                    HAVE_SWR_AVX2=yes
> +                    ;;
> +                *)
> +                    AC_MSG_ERROR([unknown SWR build architecture '$arch'])
> +                    ;;
> +                esac
> +            done
>
And error out if building without any arch?

>              HAVE_GALLIUM_SWR=yes
>              ;;
> @@ -2538,6 +2561,9 @@ if test "x$enable_llvm" = "xyes" -a "$with_gallium_drivers"; then
>      llvm_add_default_components "gallium"
>  fi
>
> +AM_CONDITIONAL(HAVE_SWR_AVX, test "x$HAVE_SWR_AVX" = xyes)
> +AM_CONDITIONAL(HAVE_SWR_AVX2, test "x$HAVE_SWR_AVX2" = xyes)
> +
>  dnl We need to validate some needed dependencies for renderonly drivers.
>
>  if test "x$HAVE_GALLIUM_ETNAVIV" != xyes -a "x$HAVE_GALLIUM_IMX" = xyes  ; then
> @@ -2977,6 +3003,11 @@ else
>      echo "        HUD lmsensors:   yes"
>  fi
>
> +echo ""
> +if test "x$HAVE_GALLIUM_SWR" != x; then
> +    echo "        SWR archs:       $swr_archs"
> +fi
> +
>  dnl Libraries
>  echo ""
>  echo "        Shared libs:     $enable_shared"
> diff --git a/src/gallium/drivers/swr/Makefile.am b/src/gallium/drivers/swr/Makefile.am
> index 74612280fe..f38ce7b1d9 100644
> --- a/src/gallium/drivers/swr/Makefile.am
> +++ b/src/gallium/drivers/swr/Makefile.am
> @@ -55,6 +55,14 @@ libmesaswr_la_CXXFLAGS = \
>         $(SWR_AVX_CXXFLAGS) \
>         $(COMMON_CXXFLAGS)
>
> +if HAVE_SWR_AVX
> +libmesaswr_la_CXXFLAGS += -DHAVE_SWR_AVX
> +endif
> +
> +if HAVE_SWR_AVX2
> +libmesaswr_la_CXXFLAGS += -DHAVE_SWR_AVX2
> +endif
> +
>  COMMON_SOURCES = \
>         $(ARCHRAST_CXX_SOURCES) \
>         $(COMMON_CXX_SOURCES) \
> @@ -224,7 +232,10 @@ COMMON_LDFLAGS = \
>         $(GC_SECTIONS) \
>         $(NO_UNDEFINED)
>
> -lib_LTLIBRARIES = libswrAVX.la libswrAVX2.la
> +lib_LTLIBRARIES =
> +
> +if HAVE_SWR_AVX
> +lib_LTLIBRARIES += libswrAVX.la
>
>  libswrAVX_la_CXXFLAGS = \
>         $(SWR_AVX_CXXFLAGS) \
> @@ -236,7 +247,10 @@ libswrAVX_la_SOURCES = \
>
>  libswrAVX_la_LDFLAGS = \
>         $(COMMON_LDFLAGS)
> +endif
>
> +if HAVE_SWR_AVX2
> +lib_LTLIBRARIES += libswrAVX2.la
>  libswrAVX2_la_CXXFLAGS = \
>         $(SWR_AVX2_CXXFLAGS) \
>         -DKNOB_ARCH=KNOB_ARCH_AVX2 \
> @@ -247,6 +261,7 @@ libswrAVX2_la_SOURCES = \
>
>  libswrAVX2_la_LDFLAGS = \
>         $(COMMON_LDFLAGS)
> +endif
>
>  include $(top_srcdir)/install-gallium-links.mk
>
> diff --git a/src/gallium/drivers/swr/SConscript b/src/gallium/drivers/swr/SConscript
> index cdfb91a5bb..a32807d36b 100644
> --- a/src/gallium/drivers/swr/SConscript
> +++ b/src/gallium/drivers/swr/SConscript
> @@ -245,6 +245,7 @@ source += [
>
>  # main SWR lib
>  envSWR = envavx.Clone() # pick up the arch flag for intrinsic usage
> +envSWR.Append(CPPDEFINES = ['HAVE_SWR_AVX', 'HAVE_SWR_AVX2'])
>  swr = envSWR.ConvenienceLibrary(
>      target = 'swr',
>      source = source,
> diff --git a/src/gallium/drivers/swr/swr_loader.cpp b/src/gallium/drivers/swr/swr_loader.cpp
> index d56fb0e59f..57ab4e4f66 100644
> --- a/src/gallium/drivers/swr/swr_loader.cpp
> +++ b/src/gallium/drivers/swr/swr_loader.cpp
> @@ -31,22 +31,36 @@
>  struct pipe_screen *
>  swr_create_screen(struct sw_winsys *winsys)
>  {
> -   char filename[256];
> +   char filename[256] = { 0 };
>     fprintf(stderr, "SWR detected ");
>
>     util_dl_library *pLibrary = nullptr;
>
>     util_cpu_detect();
>     if (util_cpu_caps.has_avx2) {
> -      fprintf(stderr, "AVX2\n");
> +      fprintf(stderr, "AVX2");
> +#if HAVE_SWR_AVX2
>        sprintf(filename, "%s%s%s", UTIL_DL_PREFIX, "swrAVX2", UTIL_DL_EXT);
> +#elif HAVE_SWR_AVX
> +      sprintf(filename, "%s%s%s", UTIL_DL_PREFIX, "swrAVX", UTIL_DL_EXT);
> +#endif
>     } else if (util_cpu_caps.has_avx) {
> -      fprintf(stderr, "AVX\n");
> +      fprintf(stderr, "AVX");
> +#if HAVE_SWR_AVX
>        sprintf(filename, "%s%s%s", UTIL_DL_PREFIX, "swrAVX", UTIL_DL_EXT);
> +#endif
> +   } else {
> +      fprintf(stderr, "- no AVX/AVX2 support.  Aborting!\n");
> +      exit(-1);
> +   }
> +
> +   if (strlen(filename)) {
> +      fprintf(stderr, " (%s)\n", filename);
>     } else {
> -      fprintf(stderr, "no AVX/AVX2 support.  Aborting!\n");
> +      fprintf(stderr, " - no appropriate swr architecture library.  Aborting!\n");
>        exit(-1);
>     }
> +
A couple of suggestions, which seem easier on the eyes, IMHO.
Feel free to use them.


   util_cpu_detect();
#if HAVE_SWR_AVX2
   if (!filename && util_cpu_caps.has_avx2) {
      fprintf(stderr, "AVX2\n");
      sprintf(filename, "%s%s%s", UTIL_DL_PREFIX, "swrAVX2", UTIL_DL_EXT);
   }
#endif
#if HAVE_SWR_AVX
   if (!filename && util_cpu_caps.has_avx) {
      fprintf(stderr, "AVX\n");
      sprintf(filename, "%s%s%s", UTIL_DL_PREFIX, "swrAVX", UTIL_DL_EXT);
   }
#endif

   if (!filename)) {
      fprintf(stderr, " - forgot to add your arch to the build? Aborting!\n");
      exit(-1);
   }

Alternatively:

   util_cpu_detect();
   if (!filename && util_cpu_caps.has_avx2) {
#if HAVE_SWR_AVX2
      fprintf(stderr, "AVX2\n");
      sprintf(filename, "%s%s%s", UTIL_DL_PREFIX, "swrAVX2", UTIL_DL_EXT);
#else
      fprintf(stderr, "AVX2, yet built without support\n");
#endif
    }
   if (!filename && util_cpu_caps.has_avx) {
#if HAVE_SWR_AVX
      fprintf(stderr, "AVX\n");
      sprintf(filename, "%s%s%s", UTIL_DL_PREFIX, "swrAVX", UTIL_DL_EXT);
#else
      fprintf(stderr, "AVX, yet built without support\n");
#endif
   }

   if (!filename)) {
      fprintf(stderr, "Did you forget to build for your arch? Aborting!\n");
      exit(-1);
   }


-Emil


More information about the mesa-dev mailing list