glamor_init: clamp GLSL to 120 if platform doesn't have instanced arrays

Lukas F. Hartmann lukas at mntmn.com
Tue May 15 19:51:56 UTC 2018


Hi,

I upgraded Xwayland and the assorted libraries from git masters today,
and noticed that glamor wouldn't work anymore on i.MX6/etnaviv. The
error was:

No provider of glVertexAttribDivisor found.  Requires one of:
    Desktop OpenGL 3.3
    OpenGL ES 3.0
    GL extension "GL_ANGLE_instanced_arrays"
    GL extension "GL_ARB_instanced_arrays"
    GL extension "GL_EXT_instanced_arrays"
    GL extension "GL_NV_instanced_arrays"

The problem is that etnaviv offers GLSL 140 on GL 2.1 and glamor
rendering assumes that glVertexAttribDivisor() is always available on
GLSL>=130, which is not the case here. Forcing GLSL 120 makes glamor
work fine again on this platform. After chatting with ajax in
#xorg-devel, the following solution was proposed.

This is my first time of submitting a patch, so please excuse me and
advise if I'm doing it wrong ;)

Cheers
Lukas (mntmn)

---
 glamor/glamor.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/glamor/glamor.c b/glamor/glamor.c
index 86935ed..d984d20 100644
--- a/glamor/glamor.c
+++ b/glamor/glamor.c
@@ -563,6 +563,14 @@ glamor_init(ScreenPtr screen, unsigned int flags)
 
         if (!glamor_check_instruction_count(gl_version))
             goto fail;
+
+        /* Glamor rendering assumes that platforms with GLSL 130+
+         * have instanced arrays, but this is not always the case.
+         * etnaviv offers GLSL 140 with OpenGL 2.1.
+         */
+        if (glamor_priv->glsl_version >= 130 &&
+            !epoxy_has_gl_extension("GL_ARB_instanced_arrays"))
+                glamor_priv->glsl_version = 120;
     } else {
         if (gl_version < 20) {
             ErrorF("Require Open GLES2.0 or later.\n");
-- 
2.15.1




More information about the xorg-devel mailing list