util: Use environment variable GALLIUM_OVERRIDE_CPU_CAPS to remove usage of util_cpu_...
authorYonggang Luo <luoyonggang@gmail.com>
Thu, 25 Aug 2022 01:49:21 +0000 (09:49 +0800)
committerMarge Bot <emma+marge@anholt.net>
Mon, 29 Aug 2022 18:06:07 +0000 (18:06 +0000)
It's use extern struct util_cpu_caps_t util_cpu_caps that's violate the
restriction that we can not directly access util_cpu_caps

Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17803>

src/gallium/tests/unit/meson.build
src/gallium/tests/unit/translate_test.c
src/util/u_cpu_detect.c

index f94e105..1e0e6d4 100644 (file)
@@ -28,8 +28,16 @@ foreach t : ['pipe_barrier_test', 'u_cache_test', 'u_half_test',
     dependencies : idep_mesautil,
     install : false,
   )
-  # u_cache_test is slow, and translate_test fails.
-  if not ['u_cache_test', 'translate_test'].contains(t)
+  if (t == 'translate_test') # translate_test have parameters.
+    # FIXME: translate_test default|generic are failing
+    # test('translate_test default', exe, args : [ 'default' ])
+    # test('translate_test generic', exe, args : [ 'generic' ])
+    if ['x86', 'x86_64'].contains(host_machine.cpu_family())
+      foreach arg : ['x86', 'nosse', 'sse', 'sse2', 'sse3', 'sse4.1']
+        test('translate_test ' + arg, exe, args : [ arg ])
+      endforeach
+    endif
+  elif t != 'u_cache_test' # u_cache_test is slow
     test(t, exe, suite: 'gallium',
          should_fail : meson.get_cross_property('xfail', '').contains(t),
     )
index f4be841..823aa68 100644 (file)
@@ -45,11 +45,12 @@ static double rand_double()
    return v;
 }
 
+char cpu_caps_override_env[128];
+
 int main(int argc, char** argv)
 {
    struct translate *(*create_fn)(const struct translate_key *key) = 0;
 
-   extern struct util_cpu_caps_t util_cpu_caps;
    struct translate_key key;
    unsigned output_format;
    unsigned input_format;
@@ -75,55 +76,25 @@ int main(int argc, char** argv)
       create_fn = translate_generic_create;
    else if (!strcmp(argv[1], "x86"))
       create_fn = translate_sse2_create;
-   else if (!strcmp(argv[1], "nosse"))
-   {
-      util_cpu_caps.has_sse = 0;
-      util_cpu_caps.has_sse2 = 0;
-      util_cpu_caps.has_sse3 = 0;
-      util_cpu_caps.has_sse4_1 = 0;
-      create_fn = translate_sse2_create;
-   }
-   else if (!strcmp(argv[1], "sse"))
+   else
    {
-      if(!util_get_cpu_caps()->has_sse)
+      const char *translate_options[] = {
+         "nosse", "sse", "sse2", "sse3", "sse4.1",
+         NULL
+      };
+      const char **option;
+      for (option = translate_options; *option; ++option)
       {
-         printf("Error: CPU doesn't support SSE (test with qemu)\n");
-         return 2;
-      }
-      util_cpu_caps.has_sse2 = 0;
-      util_cpu_caps.has_sse3 = 0;
-      util_cpu_caps.has_sse4_1 = 0;
-      create_fn = translate_sse2_create;
-   }
-   else if (!strcmp(argv[1], "sse2"))
-   {
-      if(!util_get_cpu_caps()->has_sse2)
-      {
-         printf("Error: CPU doesn't support SSE2 (test with qemu)\n");
-         return 2;
-      }
-      util_cpu_caps.has_sse3 = 0;
-      util_cpu_caps.has_sse4_1 = 0;
-      create_fn = translate_sse2_create;
-   }
-   else if (!strcmp(argv[1], "sse3"))
-   {
-      if(!util_get_cpu_caps()->has_sse3)
-      {
-         printf("Error: CPU doesn't support SSE3 (test with qemu)\n");
-         return 2;
+         if (!strcmp(argv[1], *option))
+         {
+            create_fn = translate_sse2_create;
+            break;
+         }
       }
-      util_cpu_caps.has_sse4_1 = 0;
-      create_fn = translate_sse2_create;
-   }
-   else if (!strcmp(argv[1], "sse4.1"))
-   {
-      if(!util_get_cpu_caps()->has_sse4_1)
-      {
-         printf("Error: CPU doesn't support SSE4.1 (test with qemu)\n");
-         return 2;
+      if (create_fn) {
+         snprintf(cpu_caps_override_env, sizeof(cpu_caps_override_env), "GALLIUM_OVERRIDE_CPU_CAPS=%s", argv[1]);
+         putenv(cpu_caps_override_env);
       }
-      create_fn = translate_sse2_create;
    }
 
    if (!create_fn)
index e89dc15..13405a6 100644 (file)
@@ -589,6 +589,7 @@ util_cpu_detect_once(void)
 {
    int available_cpus = 0;
    int total_cpus = 0;
+   const char *override_cpu_caps = debug_get_option("GALLIUM_OVERRIDE_CPU_CAPS", NULL);
 
    memset(&util_cpu_caps, 0, sizeof util_cpu_caps);
 
@@ -805,6 +806,22 @@ util_cpu_detect_once(void)
 #endif
 #endif /* PIPE_ARCH_X86 || PIPE_ARCH_X86_64 */
 
+   if (override_cpu_caps != NULL) {
+#if defined(PIPE_ARCH_X86) || defined(PIPE_ARCH_X86_64)
+      if (!strcmp(override_cpu_caps, "nosse")) {
+         util_cpu_caps.has_sse = 0;
+      } else if (!strcmp(override_cpu_caps, "sse")) {
+         util_cpu_caps.has_sse2 = 0;
+      } else if (!strcmp(override_cpu_caps, "sse2")) {
+         util_cpu_caps.has_sse3 = 0;
+      } else if (!strcmp(override_cpu_caps, "sse3")) {
+         util_cpu_caps.has_sse4_1 = 0;
+      } else if (!strcmp(override_cpu_caps, "sse4.1")) {
+         util_cpu_caps.has_avx = 0;
+      }
+#endif /* PIPE_ARCH_X86 || PIPE_ARCH_X86_64 */
+   }
+
 #if defined(PIPE_ARCH_X86) || defined(PIPE_ARCH_X86_64)
    if (!util_cpu_caps.has_sse) {
       util_cpu_caps.has_sse2 = 0;