[PATCH v3] glamor: check max native ALU instructions

Olivier Fourdan ofourdan at redhat.com
Thu Feb 5 02:59:22 PST 2015


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.

Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=88316
Signed-off-by: Olivier Fourdan <ofourdan at redhat.com>
---
v2: * Check for GL version < 30 
v3: * Remove use of GLAMOR_MIN_ALU_INSTRUCTIONS environment variable,
    * Use LogMessage() in place of ErrorF() for warning when required
      limit is not met,
    * Rephrase the warning message in proper English,
    * Rename function as glamor_check_instruction_count() instead of
      glamor_check_limits()


 glamor/glamor.c      | 32 ++++++++++++++++++++++++++++++++
 glamor/glamor_priv.h |  2 ++
 2 files changed, 34 insertions(+)

diff --git a/glamor/glamor.c b/glamor/glamor.c
index 017266a..c63c1e8 100644
--- a/glamor/glamor.c
+++ b/glamor/glamor.c
@@ -305,6 +305,35 @@ glamor_create_screen_resources(ScreenPtr screen)
     return ret;
 }
 
+static Bool
+glamor_check_instruction_count(int gl_version)
+{
+    GLint max_native_alu_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.
+     */
+    if (gl_version < 30) {
+        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 < GLAMOR_MIN_ALU_INSTRUCTIONS) {
+            LogMessage(X_WARNING,
+                       "glamor requires at least %d instructions (%d reported)\n",
+                       GLAMOR_MIN_ALU_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 +413,9 @@ glamor_init(ScreenPtr screen, unsigned int flags)
             ErrorF("Require OpenGL version 2.1 or later.\n");
             goto fail;
         }
+
+        if (!glamor_check_instruction_count(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 */
-- 
2.1.0



More information about the xorg-devel mailing list