[waffle] [PATCH] glx: Add glXCreateContextAttribs workaround for NVidia bug
Chad Versace
chad.versace at linux.intel.com
Wed Dec 19 12:21:25 PST 2012
With NVidia, calling glXCreateContextAttribsARB with MAJOR=1 and MINOR=0
returns an OpenGL 2.1 context. Calling it with MAJOR and MINOR unspecified
returns a context of the latest supported OpenGL version. However, according to
the GLX_ARB_create_context spec, the two calls should behave identically.
Calling with MAJOR and MINOR unspecified produces the expected behavior.
As a workaround, do not specify GLX_CONTEXT_MAJOR_VERSION_ARB and
GLX_CONTEXT_MINOR_VERSION_ARB in the call to glXCreateContextAttribsARB if the
user requested an OpenGL context of unspecified version or if the user
explicitly requested an OpenGL 1.0 context.
Reported-by: Paul Berry <stereotype441 at gmail.com>
Signed-off-by: Chad Versace <chad.versace at linux.intel.com>
---
src/waffle/glx/glx_context.c | 37 ++++++++++++++++++++++++++++++++-----
1 file changed, 32 insertions(+), 5 deletions(-)
diff --git a/src/waffle/glx/glx_context.c b/src/waffle/glx/glx_context.c
index bc218af..ffb79a4 100644
--- a/src/waffle/glx/glx_context.c
+++ b/src/waffle/glx/glx_context.c
@@ -72,11 +72,38 @@ glx_context_fill_attrib_list(struct glx_config *config,
struct wcore_config_attrs *attrs = &config->wcore.attrs;
int i = 0;
- attrib_list[i++] = GLX_CONTEXT_MAJOR_VERSION_ARB;
- attrib_list[i++] = attrs->context_major_version;
-
- attrib_list[i++] = GLX_CONTEXT_MINOR_VERSION_ARB;
- attrib_list[i++] = attrs->context_minor_version;
+ // As a workaround for NVidia, do not specify
+ // GLX_CONTEXT_MAJOR_VERSION_ARB and GLX_CONTEXT_MINOR_VERSION_ARB in the
+ // call to glXCreateContextAttribsARB if the user requested an OpenGL
+ // context of unspecified version or if the user explicitly requested an
+ // OpenGL 1.0 context.
+ //
+ // Calling glXCreateContextAttribARB with MAJOR=1 and MINOR=0, according
+ // to the spec, is equivalent to calling it with MAJOR and MINOR
+ // unspecified. From the GLX_ARB_create_context spec:
+ //
+ // If an attribute is not specified in <attrib_list>,
+ // then the default value specified below is used instead.
+ //
+ // The default values for GLX_CONTEXT_MAJOR_VERSION_ARB and
+ // GLX_CONTEXT_MINOR_VERSION_ARB are 1 and 0 respectively. In this
+ // case, implementations will typically return the most recent version
+ // of OpenGL they support which is backwards compatible with OpenGL 1.0
+ // (e.g. 3.0, 3.1 + GL_ARB_compatibility, or 3.2 compatibility profile)
+ //
+ // However, NVidia's libGL, circa 2012-12-19, is not compliant. Calling
+ // glXCreateContextAttribsARB with MAJOR=1 and MINOR=0 returns an OpenGL
+ // 2.1 context. Calling it with MAJOR and MINOR unspecified returns
+ // a context of the latest supported OpenGL version.
+ if (attrs->context_api == WAFFLE_CONTEXT_OPENGL &&
+ attrs->context_full_version != 10)
+ {
+ attrib_list[i++] = GLX_CONTEXT_MAJOR_VERSION_ARB;
+ attrib_list[i++] = attrs->context_major_version;
+
+ attrib_list[i++] = GLX_CONTEXT_MINOR_VERSION_ARB;
+ attrib_list[i++] = attrs->context_minor_version;
+ }
switch (attrs->context_api) {
case WAFFLE_CONTEXT_OPENGL:
--
1.7.11.7
More information about the waffle
mailing list