cogl/cpu-caps: Build cpuid and xgetbv only for x86_64
This also adds the cpuid functionality inline and checks for GCC ASM
flag output support.
Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/3226
Fixes: 3bf6de60b
("cogl: Add CPU capability detection helper")
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3488>
This commit is contained in:
parent
7f1b890df1
commit
985e93f9fa
1 changed files with 28 additions and 5 deletions
|
@ -39,10 +39,11 @@
|
||||||
|
|
||||||
CoglCpuCaps cogl_cpu_caps;
|
CoglCpuCaps cogl_cpu_caps;
|
||||||
|
|
||||||
|
#ifdef __x86_64
|
||||||
static inline uint64_t
|
static inline uint64_t
|
||||||
xgetbv (void)
|
xgetbv (void)
|
||||||
{
|
{
|
||||||
#if defined(__GNUC__)
|
#ifdef __GCC_ASM_FLAG_OUTPUTS__
|
||||||
uint32_t eax, edx;
|
uint32_t eax, edx;
|
||||||
|
|
||||||
__asm __volatile (
|
__asm __volatile (
|
||||||
|
@ -58,13 +59,35 @@ xgetbv (void)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
cpuid (uint32_t ax,
|
||||||
|
uint32_t *p)
|
||||||
|
{
|
||||||
|
#ifdef __GCC_ASM_FLAG_OUTPUTS__
|
||||||
|
__asm __volatile (
|
||||||
|
"cpuid\n\t"
|
||||||
|
: "=a" (p[0]),
|
||||||
|
"=b" (p[1]),
|
||||||
|
"=c" (p[2]),
|
||||||
|
"=d" (p[3])
|
||||||
|
: "0" (ax)
|
||||||
|
);
|
||||||
|
#else
|
||||||
|
p[0] = 0;
|
||||||
|
p[1] = 0;
|
||||||
|
p[2] = 0;
|
||||||
|
p[3] = 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void
|
void
|
||||||
cogl_init_cpu_caps (void)
|
cogl_init_cpu_caps (void)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_CPUID
|
#ifdef __x86_64
|
||||||
uint32_t regs[4];
|
uint32_t regs[4];
|
||||||
|
|
||||||
cpuid(0x00000000, regs);
|
cpuid (0x00000000, regs);
|
||||||
|
|
||||||
if (regs[0] >= 0x00000001)
|
if (regs[0] >= 0x00000001)
|
||||||
{
|
{
|
||||||
|
@ -75,9 +98,9 @@ cogl_init_cpu_caps (void)
|
||||||
|
|
||||||
has_avx = (((regs2[2] >> 28) & 1) && /* AVX */
|
has_avx = (((regs2[2] >> 28) & 1) && /* AVX */
|
||||||
((regs2[2] >> 27) & 1) && /* OSXSAVE */
|
((regs2[2] >> 27) & 1) && /* OSXSAVE */
|
||||||
((xgetbv() & 6) == 6)); /* XMM & YMM */
|
((xgetbv () & 6) == 6)); /* XMM & YMM */
|
||||||
if (((regs2[2] >> 29) & 1) && has_avx)
|
if (((regs2[2] >> 29) & 1) && has_avx)
|
||||||
cpu_caps |= COGL_CPU_CAP_F16C;
|
cogl_cpu_caps |= COGL_CPU_CAP_F16C;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue