mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-23 17:40:11 +01:00
glx: initial plumbing to let users force-enable/disable extensions
This can be useful for debugging or working around bugs such as Mesa#106 where Wine is expecting to find a visual that isn't available. v2: - split the indirect GL extension override to its own commit - memset the bitfields to 0 in __glXExtensionsCtrScreen Reviewed-by: Adam Jackson <ajax@redhat.com> v3: - slight rework necessary after splitting the computation of usable extensions (Ian) 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>
This commit is contained in:
parent
74722c3ab9
commit
e19644967f
3 changed files with 90 additions and 1 deletions
|
|
@ -546,6 +546,9 @@ struct glx_screen
|
||||||
/*@{ */
|
/*@{ */
|
||||||
unsigned char direct_support[__GLX_EXT_BYTES];
|
unsigned char direct_support[__GLX_EXT_BYTES];
|
||||||
GLboolean ext_list_first_time;
|
GLboolean ext_list_first_time;
|
||||||
|
|
||||||
|
unsigned char glx_force_enabled[__GLX_EXT_BYTES];
|
||||||
|
unsigned char glx_force_disabled[__GLX_EXT_BYTES];
|
||||||
/*@} */
|
/*@} */
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,7 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "glxextensions.h"
|
#include "glxextensions.h"
|
||||||
|
|
||||||
|
#include "util/driconf.h"
|
||||||
|
|
||||||
#define SET_BIT(m,b) (m[ (b) / 8 ] |= (1U << ((b) % 8)))
|
#define SET_BIT(m,b) (m[ (b) / 8 ] |= (1U << ((b) % 8)))
|
||||||
#define CLR_BIT(m,b) (m[ (b) / 8 ] &= ~(1U << ((b) % 8)))
|
#define CLR_BIT(m,b) (m[ (b) / 8 ] &= ~(1U << ((b) % 8)))
|
||||||
|
|
@ -455,6 +456,74 @@ __glXEnableDirectExtension(struct glx_screen * psc, const char *name)
|
||||||
name, strlen(name), GL_TRUE, psc->direct_support);
|
name, strlen(name), GL_TRUE, psc->direct_support);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
__ParseExtensionOverride(struct glx_screen *psc,
|
||||||
|
const struct extension_info *ext_list,
|
||||||
|
unsigned char *force_enable,
|
||||||
|
unsigned char *force_disable,
|
||||||
|
const char *override)
|
||||||
|
{
|
||||||
|
const struct extension_info *ext;
|
||||||
|
char *env, *field;
|
||||||
|
|
||||||
|
if (override == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Copy env_const because strtok() is destructive. */
|
||||||
|
env = strdup(override);
|
||||||
|
if (env == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (field = strtok(env, " "); field!= NULL; field = strtok(NULL, " ")) {
|
||||||
|
GLboolean enable;
|
||||||
|
|
||||||
|
switch (field[0]) {
|
||||||
|
case '+':
|
||||||
|
enable = GL_TRUE;
|
||||||
|
++field;
|
||||||
|
break;
|
||||||
|
case '-':
|
||||||
|
enable = GL_FALSE;
|
||||||
|
++field;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
enable = GL_TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
ext = find_extension(ext_list, field, strlen(field));
|
||||||
|
if (ext) {
|
||||||
|
if (enable)
|
||||||
|
SET_BIT(force_enable, ext->bit);
|
||||||
|
else
|
||||||
|
SET_BIT(force_disable, ext->bit);
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "WARNING: Trying to %s the unknown extension '%s'\n",
|
||||||
|
enable ? "enable" : "disable", field);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Parse the list of GLX 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
|
||||||
|
__glXParseExtensionOverride(struct glx_screen *psc, const char *override)
|
||||||
|
{
|
||||||
|
__ParseExtensionOverride(psc, known_glx_extensions, psc->glx_force_enabled,
|
||||||
|
psc->glx_force_disabled, override);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize global extension support tables.
|
* Initialize global extension support tables.
|
||||||
*/
|
*/
|
||||||
|
|
@ -530,6 +599,10 @@ __glXExtensionsCtrScreen(struct glx_screen * psc)
|
||||||
psc->ext_list_first_time = GL_FALSE;
|
psc->ext_list_first_time = GL_FALSE;
|
||||||
(void) memcpy(psc->direct_support, direct_glx_support,
|
(void) memcpy(psc->direct_support, direct_glx_support,
|
||||||
sizeof(direct_glx_support));
|
sizeof(direct_glx_support));
|
||||||
|
(void) memset(psc->glx_force_enabled, 0,
|
||||||
|
sizeof(psc->glx_force_enabled));
|
||||||
|
(void) memset(psc->glx_force_disabled, 0,
|
||||||
|
sizeof(psc->glx_force_disabled));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -707,8 +780,13 @@ __glXCalculateUsableExtensions(struct glx_screen * psc,
|
||||||
u |= client_glx_support[i] & psc->direct_support[i] &
|
u |= client_glx_support[i] & psc->direct_support[i] &
|
||||||
(server_support[i] | direct_glx_only[i]);
|
(server_support[i] | direct_glx_only[i]);
|
||||||
|
|
||||||
usable[i] = u;
|
/* Finally, apply driconf options to force some extension bits either
|
||||||
|
* enabled or disabled.
|
||||||
|
*/
|
||||||
|
u |= psc->glx_force_enabled[i];
|
||||||
|
u &= ~psc->glx_force_disabled[i];
|
||||||
|
|
||||||
|
usable[i] = u;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
@ -721,6 +799,12 @@ __glXCalculateUsableExtensions(struct glx_screen * psc,
|
||||||
/* Enable extensions that the client and server both support */
|
/* Enable extensions that the client and server both support */
|
||||||
u |= client_glx_support[i] & server_support[i];
|
u |= client_glx_support[i] & server_support[i];
|
||||||
|
|
||||||
|
/* Finally, apply driconf options to force some extension bits either
|
||||||
|
* enabled or disabled.
|
||||||
|
*/
|
||||||
|
u |= psc->glx_force_enabled[i];
|
||||||
|
u &= ~psc->glx_force_disabled[i];
|
||||||
|
|
||||||
usable[i] = u;
|
usable[i] = u;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -265,6 +265,8 @@ extern void __glXCalculateUsableExtensions(struct glx_screen *psc,
|
||||||
display_is_direct_capable,
|
display_is_direct_capable,
|
||||||
int server_minor_version);
|
int server_minor_version);
|
||||||
|
|
||||||
|
extern void __glXParseExtensionOverride(struct glx_screen *psc,
|
||||||
|
const char *override);
|
||||||
extern void __glXCalculateUsableGLExtensions(struct glx_context *gc,
|
extern void __glXCalculateUsableGLExtensions(struct glx_context *gc,
|
||||||
const char *server_string,
|
const char *server_string,
|
||||||
int major_version,
|
int major_version,
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue