glx: let users force-enable/disable indirect GL extensions
authorMartin Peres <martin.peres@mupuf.org>
Tue, 20 Oct 2020 13:05:24 +0000 (16:05 +0300)
committerMartin Peres <martin.peres@mupuf.org>
Thu, 22 Oct 2020 04:47:28 +0000 (07:47 +0300)
This can be useful for debugging or working around bugs involving
indirect GL.

Reviewed-by: Adam Jackson <ajax@redhat.com>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Signed-off-by: Martin Peres <martin.peres@mupuf.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7212>

src/glx/glxclient.h
src/glx/glxextensions.c
src/glx/glxextensions.h

index 42285b9..6028d5e 100644 (file)
@@ -549,6 +549,9 @@ struct glx_screen
 
    unsigned char glx_force_enabled[__GLX_EXT_BYTES];
    unsigned char glx_force_disabled[__GLX_EXT_BYTES];
+
+   unsigned char gl_force_enabled[__GL_EXT_BYTES];
+   unsigned char gl_force_disabled[__GL_EXT_BYTES];
    /*@} */
 
 };
index 2b5280f..c049073 100644 (file)
@@ -523,6 +523,25 @@ __glXParseExtensionOverride(struct glx_screen *psc, const char *override)
                              psc->glx_force_disabled, override);
 }
 
+/**
+ * \brief Parse the list of GL extensions that the user wants to
+ * force-enable/disable by using \c override, and write the results to the
+ * screen's context.
+ *
+ * \param psc        Pointer to GLX per-screen record.
+ * \param override   A space-separated list of extensions to enable or disable.
+ * The list is processed thus:
+ *    - Enable recognized extension names that are prefixed with '+'.
+ *    - Disable recognized extension names that are prefixed with '-'.
+ *    - Enable recognized extension names that are not prefixed.
+ */
+void
+__IndirectGlParseExtensionOverride(struct glx_screen *psc, const char *override)
+{
+    __ParseExtensionOverride(psc, known_gl_extensions, psc->gl_force_enabled,
+                             psc->gl_force_disabled, override);
+}
+
 
 /**
  * Initialize global extension support tables.
@@ -603,6 +622,10 @@ __glXExtensionsCtrScreen(struct glx_screen * psc)
                     sizeof(psc->glx_force_enabled));
       (void) memset(psc->glx_force_disabled, 0,
                     sizeof(psc->glx_force_disabled));
+      (void) memset(psc->gl_force_enabled, 0,
+                    sizeof(psc->gl_force_enabled));
+      (void) memset(psc->gl_force_disabled, 0,
+                    sizeof(psc->gl_force_disabled));
    }
 }
 
@@ -829,6 +852,7 @@ __glXCalculateUsableGLExtensions(struct glx_context * gc,
                                  const char *server_string,
                                  int major_version, int minor_version)
 {
+   struct glx_screen *psc = gc->psc;
    unsigned char server_support[__GL_EXT_BYTES];
    unsigned char usable[__GL_EXT_BYTES];
    unsigned i;
@@ -862,8 +886,9 @@ __glXCalculateUsableGLExtensions(struct glx_context * gc,
     */
 
    for (i = 0; i < __GL_EXT_BYTES; i++) {
-      usable[i] = (client_gl_support[i] & client_gl_only[i])
-         | (client_gl_support[i] & server_support[i]);
+      usable[i] = ((client_gl_support[i] & client_gl_only[i])
+         | (client_gl_support[i] & server_support[i])
+         | psc->gl_force_enabled[i]) & ~psc->gl_force_disabled[i];
    }
 
    gc->extensions = (unsigned char *)
index abcac95..ec84341 100644 (file)
@@ -267,6 +267,8 @@ extern void __glXCalculateUsableExtensions(struct glx_screen *psc,
 
 extern void __glXParseExtensionOverride(struct glx_screen *psc,
                                         const char *override);
+extern void __IndirectGlParseExtensionOverride(struct glx_screen *psc,
+                                               const char *override);
 extern void __glXCalculateUsableGLExtensions(struct glx_context *gc,
                                              const char *server_string,
                                              int major_version,