diff options
author | Søren Sandmann Pedersen <ssp@redhat.com> | 2011-01-26 13:16:09 -0500 |
---|---|---|
committer | Søren Sandmann Pedersen <ssp@redhat.com> | 2012-02-28 15:46:13 -0500 |
commit | fcea053561893d116a79f41a113993f1f61b58cf (patch) | |
tree | f4dbdd3b3040882814b7dcc70c7a858ede0bd136 | |
parent | e7574d336b7c812a888fac22f99f1b0e9a3518b0 (diff) |
Disable implementations mentioned in the PIXMAN_DISABLE environment variable.
With this, it becomes possible to do
PIXMAN_DISABLE="sse2 mmx" some_app
which will run some_app without SSE2 and MMX enabled. This is useful
for benchmarking, testing and narrowing down bugs.
The current list of implementations that can be disabled:
fast
mmx
sse2
arm-simd
arm-iwmmxt
arm-neon
mips-dspr2
vmx
The general and noop implementations can't be disabled because pixman
depends on those being available for correct operation.
Reviewed-by: Matt Turner <mattst88@gmail.com>
-rw-r--r-- | pixman/pixman-cpu.c | 55 |
1 files changed, 44 insertions, 11 deletions
diff --git a/pixman/pixman-cpu.c b/pixman/pixman-cpu.c index fcf591a9..bb97ae3e 100644 --- a/pixman/pixman-cpu.c +++ b/pixman/pixman-cpu.c @@ -24,6 +24,7 @@ #endif #include <string.h> +#include <stdlib.h> #if defined(USE_ARM_SIMD) && defined(_MSC_VER) /* Needed for EXCEPTION_ILLEGAL_INSTRUCTION */ @@ -328,7 +329,6 @@ pixman_arm_read_auxv_or_cpu_features () #elif defined (__linux__) /* linux ELF */ -#include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> @@ -711,51 +711,84 @@ pixman_have_sse2 (void) #endif /* __amd64__ */ #endif +static pixman_bool_t +disabled (const char *name) +{ + const char *env; + + if ((env = getenv ("PIXMAN_DISABLE"))) + { + do + { + const char *end; + int len; + + if ((end = strchr (env, ' '))) + len = end - env; + else + len = strlen (env); + + if (strlen (name) == len && strncmp (name, env, len) == 0) + { + printf ("pixman: Disabled %s implementation\n", name); + return TRUE; + } + + env += len; + } + while (*env++); + } + + return FALSE; +} + pixman_implementation_t * _pixman_choose_implementation (void) { pixman_implementation_t *imp; imp = _pixman_implementation_create_general(); - imp = _pixman_implementation_create_fast_path (imp); - + + if (!disabled ("fast")) + imp = _pixman_implementation_create_fast_path (imp); + #ifdef USE_X86_MMX - if (pixman_have_mmx ()) + if (!disabled ("mmx") && pixman_have_mmx ()) imp = _pixman_implementation_create_mmx (imp); #endif #ifdef USE_SSE2 - if (pixman_have_sse2 ()) + if (!disabled ("sse2") && pixman_have_sse2 ()) imp = _pixman_implementation_create_sse2 (imp); #endif #ifdef USE_ARM_SIMD - if (pixman_have_arm_simd ()) + if (!disabled ("arm-simd") && pixman_have_arm_simd ()) imp = _pixman_implementation_create_arm_simd (imp); #endif #ifdef USE_ARM_IWMMXT - if (pixman_have_arm_iwmmxt ()) + if (!disabled ("arm-iwmmxt") && pixman_have_arm_iwmmxt ()) imp = _pixman_implementation_create_mmx (imp); #endif #ifdef USE_ARM_NEON - if (pixman_have_arm_neon ()) + if (!disabled ("arm-neon") && pixman_have_arm_neon ()) imp = _pixman_implementation_create_arm_neon (imp); #endif #ifdef USE_MIPS_DSPR2 - if (pixman_have_mips_dspr2 ()) + if (!disabled ("mips-dspr2") && pixman_have_mips_dspr2 ()) imp = _pixman_implementation_create_mips_dspr2 (imp); #endif #ifdef USE_VMX - if (pixman_have_vmx ()) + if (!disabled ("vmx") && pixman_have_vmx ()) imp = _pixman_implementation_create_vmx (imp); #endif imp = _pixman_implementation_create_noop (imp); - + return imp; } |