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

Matt Turner mattst88 at gmail.com
Sun Feb 26 07:12:47 PST 2012


On Sat, Feb 25, 2012 at 9:39 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.
> ---
>  pixman/pixman-cpu.c |   44 ++++++++++++++++++++++++++++++++------------
>  1 files changed, 32 insertions(+), 12 deletions(-)
>
> diff --git a/pixman/pixman-cpu.c b/pixman/pixman-cpu.c
> index fcf591a..ba89df5 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,71 @@ pixman_have_sse2 (void)
>  #endif /* __amd64__ */
>  #endif
>
> +static pixman_bool_t
> +disabled (const char *name)
> +{
> +    const char *e;
> +
> +    if ((e = getenv ("PIXMAN_DISABLE")))
> +    {
> +       if (strstr (e, name))
> +       {
> +           printf ("pixman: disabled %s implementation\n", name);
> +           return TRUE;
> +       }
> +    }
> +
> +    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 (pixman_have_mmx () && !disabled ("mmx"))
>        imp = _pixman_implementation_create_mmx (imp);
>  #endif
>
>  #ifdef USE_SSE2
> -    if (pixman_have_sse2 ())
> +    if (pixman_have_sse2 () && !disabled ("sse2"))
>        imp = _pixman_implementation_create_sse2 (imp);
>  #endif
>
>  #ifdef USE_ARM_SIMD
> -    if (pixman_have_arm_simd ())
> +    if (pixman_have_arm_simd () && !disabled ("arm-simd"))
>        imp = _pixman_implementation_create_arm_simd (imp);
>  #endif
>
>  #ifdef USE_ARM_IWMMXT
> -    if (pixman_have_arm_iwmmxt ())
> +    if (pixman_have_arm_iwmmxt () && !disabled ("arm-iwmmxt"))
>        imp = _pixman_implementation_create_mmx (imp);
>  #endif
>
>  #ifdef USE_ARM_NEON
> -    if (pixman_have_arm_neon ())
> +    if (pixman_have_arm_neon () && !disabled ("arm-neon"))
>        imp = _pixman_implementation_create_arm_neon (imp);
>  #endif
>
>  #ifdef USE_MIPS_DSPR2
> -    if (pixman_have_mips_dspr2 ())
> +    if (pixman_have_mips_dspr2 () && !disabled ("mips-dspr2"))
>        imp = _pixman_implementation_create_mips_dspr2 (imp);
>  #endif
>
>  #ifdef USE_VMX
> -    if (pixman_have_vmx ())
> +    if (pixman_have_vmx () && !disabled ("vmx"))
>        imp = _pixman_implementation_create_vmx (imp);
>  #endif
>
> -    imp = _pixman_implementation_create_noop (imp);
> -
> +    if (!disabled ("noop"))
> +       imp = _pixman_implementation_create_noop (imp);
> +
>     return imp;
>  }
>
> --
> 1.6.0.6

Indeed, this is very useful.

I often seen if (!disabled(envvar) && supported()) where the disabling
check is first in the if-statement. That's the only suggestion I have.
Otherwise, this looks like a good change.

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


More information about the Pixman mailing list