Module: Mesa
Branch: master
Commit: 97f6d5e3a99d7093ec732dbdc319159bb1a1b0d4
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=97f6d5e3a99d7093ec732dbdc319159bb1a1b0d4

Author: Martin Peres <[email protected]>
Date:   Tue Oct 20 16:05:24 2020 +0300

glx: let users force-enable/disable indirect GL extensions

This can be useful for debugging or working around bugs involving
indirect GL.

Reviewed-by: Adam Jackson <[email protected]>
Reviewed-by: Ian Romanick <[email protected]>
Signed-off-by: Martin Peres <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7212>

---

 src/glx/glxclient.h     |  3 +++
 src/glx/glxextensions.c | 29 +++++++++++++++++++++++++++--
 src/glx/glxextensions.h |  2 ++
 3 files changed, 32 insertions(+), 2 deletions(-)

diff --git a/src/glx/glxclient.h b/src/glx/glxclient.h
index 42285b9f18f..6028d5ed861 100644
--- a/src/glx/glxclient.h
+++ b/src/glx/glxclient.h
@@ -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];
    /*@} */
 
 };
diff --git a/src/glx/glxextensions.c b/src/glx/glxextensions.c
index 2b5280f762d..c049073ced1 100644
--- a/src/glx/glxextensions.c
+++ b/src/glx/glxextensions.c
@@ -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 *)
diff --git a/src/glx/glxextensions.h b/src/glx/glxextensions.h
index abcac95adf3..ec84341bad2 100644
--- a/src/glx/glxextensions.h
+++ b/src/glx/glxextensions.h
@@ -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,

_______________________________________________
mesa-commit mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to