From 97f6d5e3a99d7093ec732dbdc319159bb1a1b0d4 Mon Sep 17 00:00:00 2001 From: Martin Peres Date: Tue, 20 Oct 2020 16:05:24 +0300 Subject: [PATCH] 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 Reviewed-by: Ian Romanick Signed-off-by: Martin Peres Part-of: --- 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 42285b9..6028d5e 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 2b5280f..c049073 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 abcac95..ec84341 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, -- 2.7.4