[Pixman] [PATCH] Disable implementations mentioned in the PIXMAN_DISABLE environment variable.

Matt Turner mattst88 at gmail.com
Sun Feb 26 14:09:25 PST 2012


On Sun, Feb 26, 2012 at 10:04 PM, Søren Sandmann <sandmann at cs.au.dk> wrote:
> From: Søren Sandmann Pedersen <ssp at redhat.com>
>
> 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-neon
>    mips-dspr2
>    vmx
>

And arm-iwmmxt.

Looks good otherwise.

Reviewed-by: Matt Turner <mattst88 at gmail.com>

> The general and noop implementations can't be disabled because pixman
> depends on those being available for correct operation.
> ---
>  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 fcf591a..bb97ae3 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;
>  }
>
> --
> 1.6.0.6
>


More information about the Pixman mailing list