swr/rast: SIMD16 Fetch - Fully widen 32-bit float vertex components
[mesa.git] / src / gallium / drivers / swr / swr_loader.cpp
index 2113c371c5fb438fce3f30070a2a1a4813c48e38..9d6f918e3491bb55621d885f12573c54dca0777f 100644 (file)
 #include "util/u_cpu_detect.h"
 #include "util/u_dl.h"
 #include "swr_public.h"
+#include "swr_screen.h"
 
 #include <stdio.h>
-#include <dlfcn.h>
-
-typedef pipe_screen *(*screen_create_proc)(struct sw_winsys *winsys);
 
 struct pipe_screen *
 swr_create_screen(struct sw_winsys *winsys)
 {
+   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");
-      pLibrary = util_dl_open("libswrAVX2.so");
-   } else if (util_cpu_caps.has_avx) {
-      fprintf(stderr, "AVX\n");
-      pLibrary = util_dl_open("libswrAVX.so");
-   } else {
-      fprintf(stderr, "no AVX/AVX2 support.  Aborting!\n");
+
+   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;
+#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);
+#else
+      fprintf(stderr, "SKX (not built) ");
+#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);
+#else
+      fprintf(stderr, "AVX2 (not built) ");
+#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);
+#else
+      fprintf(stderr, "AVX (not built) ");
+#endif
+   }
+
+   if (!strlen(filename)) {
+      fprintf(stderr, "- no appropriate swr architecture library.  Aborting!\n");
       exit(-1);
+   } else {
+      fprintf(stderr, "\n");
    }
 
+   pLibrary = util_dl_open(filename);
+
    if (!pLibrary) {
       fprintf(stderr, "SWR library load failure: %s\n", util_dl_error());
       exit(-1);
    }
 
-   util_dl_proc pScreenProc = util_dl_get_proc_address(pLibrary, "swr_create_screen");
+   util_dl_proc pApiProc = util_dl_get_proc_address(pLibrary, "SwrGetInterface");
 
-   if (!pScreenProc) {
+   if (!pApiProc) {
       fprintf(stderr, "SWR library search failure: %s\n", util_dl_error());
       exit(-1);
    }
 
-   screen_create_proc pScreenCreate = (screen_create_proc)pScreenProc;
+   struct pipe_screen *screen = swr_create_screen_internal(winsys);
+   swr_screen(screen)->pfnSwrGetInterface = (PFNSwrGetInterface)pApiProc;
+   swr_screen(screen)->is_knl = is_knl;
+
+   return screen;
+}
+
+
+#ifdef _WIN32
+// swap function called from libl_gdi.c
 
-   return pScreenCreate(winsys);
+void
+swr_gdi_swap(struct pipe_screen *screen,
+             struct pipe_resource *res,
+             void *hDC)
+{
+   screen->flush_frontbuffer(screen,
+                             res,
+                             0, 0,
+                             hDC,
+                             NULL);
 }
+
+#endif /* _WIN32 */