diff --git a/cogl/cogl/cogl-cpu-caps.c b/cogl/cogl/cogl-cpu-caps.c new file mode 100644 index 000000000..97102f33c --- /dev/null +++ b/cogl/cogl/cogl-cpu-caps.c @@ -0,0 +1,83 @@ +/* + * Cogl + * + * A Low Level GPU Graphics and Utilities API + * + * Copyright (C) 2022 Red Hat Inc + * Copyright 2008 Dennis Smit + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * + */ + +/* CPU capability discovery code comes from lp_cpu_detect.c in mesa. */ + +#include "config.h" + +#include "cogl/cogl-cpu-caps.h" + +#include + +CoglCpuCaps cogl_cpu_caps; + +static inline uint64_t +xgetbv (void) +{ +#if defined(__GNUC__) + uint32_t eax, edx; + + __asm __volatile ( + ".byte 0x0f, 0x01, 0xd0" /* xgetbv isn't supported on gcc < 4.4 */ + : "=a"(eax), + "=d"(edx) + : "c"(0) + ); + + return ((uint64_t) edx << 32) | eax; +#else + return 0; +#endif +} + +void +cogl_init_cpu_caps (void) +{ +#ifdef HAVE_CPUID + uint32_t regs[4]; + + cpuid(0x00000000, regs); + + if (regs[0] >= 0x00000001) + { + uint32_t regs2[4]; + gboolean has_avx; + + cpuid (0x00000001, regs2); + + has_avx = (((regs2[2] >> 28) & 1) && /* AVX */ + ((regs2[2] >> 27) & 1) && /* OSXSAVE */ + ((xgetbv() & 6) == 6)); /* XMM & YMM */ + if (((regs2[2] >> 29) & 1) && has_avx) + cpu_caps |= COGL_CPU_CAP_F16C; + } +#endif +} diff --git a/cogl/cogl/cogl-cpu-caps.h b/cogl/cogl/cogl-cpu-caps.h new file mode 100644 index 000000000..162e5b889 --- /dev/null +++ b/cogl/cogl/cogl-cpu-caps.h @@ -0,0 +1,54 @@ +/* + * Cogl + * + * A Low Level GPU Graphics and Utilities API + * + * Copyright (C) 2022 Red Hat Inc + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * + */ + +#ifndef COGL_CPU_CAPS_H +#define COGL_CPU_CAPS_H + +#include "cogl/cogl-types.h" + +#include + +typedef enum _CoglCpuCaps +{ + COGL_CPU_CAP_F16C = 1 << 0, +} CoglCpuCaps; + +COGL_EXPORT +CoglCpuCaps cogl_cpu_caps; + +void cogl_init_cpu_caps (void); + +static inline gboolean +cogl_cpu_has_cap (CoglCpuCaps cap) +{ + return !!(cogl_cpu_caps & cap); +} + +#endif /* COGL_CPU_CAPS_H */ diff --git a/cogl/cogl/cogl.c b/cogl/cogl/cogl.c index 8a9b4c5fe..8ae5a754c 100644 --- a/cogl/cogl/cogl.c +++ b/cogl/cogl/cogl.c @@ -35,6 +35,7 @@ #include #include "cogl/cogl-i18n-private.h" +#include "cogl/cogl-cpu-caps.h" #include "cogl/cogl-debug.h" #include "cogl/cogl-graphene.h" #include "cogl/cogl-util.h" @@ -176,6 +177,7 @@ _cogl_init (void) if (initialized == FALSE) { _cogl_debug_check_environment (); + cogl_init_cpu_caps (); initialized = TRUE; } } diff --git a/cogl/cogl/meson.build b/cogl/cogl/meson.build index 63aed1f53..cd4be09e2 100644 --- a/cogl/cogl/meson.build +++ b/cogl/cogl/meson.build @@ -172,6 +172,8 @@ cogl_sources = [ 'cogl-color.c', 'cogl-context-private.h', 'cogl-context.c', + 'cogl-cpu-caps.c', + 'cogl-cpu-caps.h', 'cogl-debug-options.h', 'cogl-debug.c', 'cogl-debug.h',