[PATCH] glamor: check max native ALU instructions

Ian Romanick idr at freedesktop.org
Wed Jan 28 12:17:24 PST 2015


On 01/28/2015 07:17 AM, Olivier Fourdan wrote:
> When using glamor (either in Xephyr or Xwayland) on hardware with too
> low instructions limit, glamor fallbacks to sw due to large shaders.
> 
> This makes glamor unbearably slow on such hardware.
> 
> Check reported value for GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB
> and fail in glamor_init() if the limit is lower than 128.
> 
> Can be overridden with the environment variable
> GLAMOR_MIN_ALU_INSTRUCTIONS for testing and debugging purpose.
> 
> Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=88316
> Signed-off-by: Olivier Fourdan <ofourdan at redhat.com>
> ---
>  glamor/glamor.c      | 47 +++++++++++++++++++++++++++++++++++++++++++++++
>  glamor/glamor_priv.h |  2 ++
>  2 files changed, 49 insertions(+)
> 
> diff --git a/glamor/glamor.c b/glamor/glamor.c
> index 017266a..eecba59 100644
> --- a/glamor/glamor.c
> +++ b/glamor/glamor.c
> @@ -305,6 +305,50 @@ glamor_create_screen_resources(ScreenPtr screen)
>      return ret;
>  }
>  
> +static int
> +glamor_get_min_instructions(void)
> +{
> +    char *min_instructions_string;
> +    int min_instructions;
> +
> +    min_instructions_string = getenv("GLAMOR_MIN_ALU_INSTRUCTIONS");
> +    if (min_instructions_string
> +        && sscanf(min_instructions_string, "%d", &min_instructions) == 1)
> +        return min_instructions;
> +
> +    return GLAMOR_MIN_ALU_INSTRUCTIONS;
> +}
> +
> +static Bool
> +glamor_check_limits(int gl_version)
> +{
> +    GLint max_native_alu_instructions;
> +    int min_instructions;
> +
> +    /* Avoid using glamor if the reported instructions limit is too low,
> +     * as this would cause glamor to fallback on sw due to large shaders
> +     * which ends up being unbearably slow.
> +     */
> +    min_instructions = glamor_get_min_instructions();
> +    if (gl_version == 21 && min_instructions > 0) {
                      ^^^^^
It seems like this should be < 30.  That will allow the check to keep
working if glamor ever grows support for OpenGL 2.0 (however unlikely
that may be).

Do we know which GPUs cannot meet this limit and also do not have "true"
integer support?  I wonder if we should go ahead and do the
GL_MESA_shading_language_130 or GL_MESA_gpu_shader_int32 extensions that
we had previously discussed, and remove support for desktop OpenGL
drivers that cannot do those.

> +        if (!epoxy_has_gl_extension("GL_ARB_fragment_program")) {
> +            ErrorF("GL_ARB_fragment_program required\n");
> +            return FALSE;
> +        }
> +
> +        glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB,
> +                          GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB,
> +                          &max_native_alu_instructions);
> +        if (max_native_alu_instructions < min_instructions) {
> +            ErrorF("Require at least %d instructions (%d reported)\n",
> +                   min_instructions, max_native_alu_instructions);
> +            return FALSE;
> +        }
> +    }
> +
> +    return TRUE;
> +}
> +
>  /** Set up glamor for an already-configured GL context. */
>  Bool
>  glamor_init(ScreenPtr screen, unsigned int flags)
> @@ -384,6 +428,9 @@ glamor_init(ScreenPtr screen, unsigned int flags)
>              ErrorF("Require OpenGL version 2.1 or later.\n");
>              goto fail;
>          }
> +
> +        if (!glamor_check_limits(gl_version))
> +            goto fail;
>      } else {
>          if (gl_version < 20) {
>              ErrorF("Require Open GLES2.0 or later.\n");
> diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h
> index ed6e2d1..3d13a27 100644
> --- a/glamor/glamor_priv.h
> +++ b/glamor/glamor_priv.h
> @@ -1095,4 +1095,6 @@ void glamor_xv_render(glamor_port_private *port_priv);
>  
>  #include "glamor_font.h"
>  
> +#define GLAMOR_MIN_ALU_INSTRUCTIONS 128 /* Minimum required number of native ALU instructions */
> +
>  #endif                          /* GLAMOR_PRIV_H */
> 



More information about the xorg-devel mailing list