diff options
-rw-r--r-- | src/gallium/include/state_tracker/st_api.h | 19 | ||||
-rw-r--r-- | src/gallium/state_trackers/glx/xlib/xm_api.c | 22 | ||||
-rw-r--r-- | src/gallium/state_trackers/wgl/stw_context.c | 22 |
3 files changed, 44 insertions, 19 deletions
diff --git a/src/gallium/include/state_tracker/st_api.h b/src/gallium/include/state_tracker/st_api.h index f7cc2437747..3267cb25ef0 100644 --- a/src/gallium/include/state_tracker/st_api.h +++ b/src/gallium/include/state_tracker/st_api.h @@ -57,10 +57,10 @@ enum st_api_type { */ enum st_profile_type { - ST_PROFILE_DEFAULT, - ST_PROFILE_OPENGL_CORE, - ST_PROFILE_OPENGL_ES1, - ST_PROFILE_OPENGL_ES2 + ST_PROFILE_DEFAULT, /**< OpenGL compatibility profile */ + ST_PROFILE_OPENGL_CORE, /**< OpenGL 3.2+ core profile */ + ST_PROFILE_OPENGL_ES1, /**< OpenGL ES 1.x */ + ST_PROFILE_OPENGL_ES2 /**< OpenGL ES 2.0 */ }; /* for profile_mask in st_api */ @@ -71,12 +71,13 @@ enum st_profile_type /** * New context flags for GL 3.0 and beyond. + * + * Profile information (core vs. compatibilty for OpenGL 3.2+) is communicated + * through the \c st_profile_type, not through flags. */ -#define ST_CONTEXT_FLAG_CORE_PROFILE (1 << 0) -#define ST_CONTEXT_FLAG_COMPATIBLE_PROFILE (1 << 1) -#define ST_CONTEXT_FLAG_FORWARD_COMPATIBLE (1 << 2) -#define ST_CONTEXT_FLAG_DEBUG (1 << 3) -#define ST_CONTEXT_FLAG_ROBUST_ACCESS (1 << 4) +#define ST_CONTEXT_FLAG_DEBUG (1 << 0) +#define ST_CONTEXT_FLAG_FORWARD_COMPATIBLE (1 << 1) +#define ST_CONTEXT_FLAG_ROBUST_ACCESS (1 << 2) /** * Used in st_context_iface->teximage. diff --git a/src/gallium/state_trackers/glx/xlib/xm_api.c b/src/gallium/state_trackers/glx/xlib/xm_api.c index 75e9e11e05d..5d99e5f7a4e 100644 --- a/src/gallium/state_trackers/glx/xlib/xm_api.c +++ b/src/gallium/state_trackers/glx/xlib/xm_api.c @@ -878,7 +878,6 @@ XMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list, c->xm_read_buffer = NULL; memset(&attribs, 0, sizeof(attribs)); - attribs.profile = ST_PROFILE_DEFAULT; attribs.visual = v->stvis; attribs.major = major; attribs.minor = minor; @@ -888,10 +887,23 @@ XMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list, attribs.flags |= ST_CONTEXT_FLAG_DEBUG; if (contextFlags & GLX_CONTEXT_ROBUST_ACCESS_BIT_ARB) attribs.flags |= ST_CONTEXT_FLAG_ROBUST_ACCESS; - if (profileMask & GLX_CONTEXT_CORE_PROFILE_BIT_ARB) - attribs.flags |= ST_CONTEXT_FLAG_CORE_PROFILE; - if (profileMask & GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB) - attribs.flags |= ST_CONTEXT_FLAG_COMPATIBLE_PROFILE; + + /* There are no profiles before OpenGL 3.2. The + * GLX_ARB_create_context_profile spec says: + * + * "If the requested OpenGL version is less than 3.2, + * GLX_CONTEXT_PROFILE_MASK_ARB is ignored and the functionality of the + * context is determined solely by the requested version." + * + * The spec also says: + * + * "The default value for GLX_CONTEXT_PROFILE_MASK_ARB is + * GLX_CONTEXT_CORE_PROFILE_BIT_ARB." + */ + attribs.profile = ST_PROFILE_DEFAULT; + if ((major > 3 || (major == 3 && minor >= 2)) + && ((profileMask & GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB) == 0)) + attribs.profile = ST_PROFILE_OPENGL_CORE; c->st = stapi->create_context(stapi, xmdpy->smapi, &attribs, (share_list) ? share_list->st : NULL); diff --git a/src/gallium/state_trackers/wgl/stw_context.c b/src/gallium/state_trackers/wgl/stw_context.c index 6cc8a83150c..2c4fb0ef084 100644 --- a/src/gallium/state_trackers/wgl/stw_context.c +++ b/src/gallium/state_trackers/wgl/stw_context.c @@ -169,7 +169,6 @@ stw_create_context_attribs( ctx->iPixelFormat = iPixelFormat; memset(&attribs, 0, sizeof(attribs)); - attribs.profile = ST_PROFILE_DEFAULT; attribs.visual = pfi->stvis; attribs.major = majorVersion; attribs.minor = minorVersion; @@ -177,10 +176,23 @@ stw_create_context_attribs( attribs.flags |= ST_CONTEXT_FLAG_FORWARD_COMPATIBLE; if (contextFlags & WGL_CONTEXT_DEBUG_BIT_ARB) attribs.flags |= ST_CONTEXT_FLAG_DEBUG; - if (profileMask & WGL_CONTEXT_CORE_PROFILE_BIT_ARB) - attribs.flags |= ST_CONTEXT_FLAG_CORE_PROFILE; - if (profileMask & WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB) - attribs.flags |= ST_CONTEXT_FLAG_COMPATIBLE_PROFILE; + + /* There are no profiles before OpenGL 3.2. The + * WGL_ARB_create_context_profile spec says: + * + * "If the requested OpenGL version is less than 3.2, + * WGL_CONTEXT_PROFILE_MASK_ARB is ignored and the functionality of the + * context is determined solely by the requested version." + * + * The spec also says: + * + * "The default value for WGL_CONTEXT_PROFILE_MASK_ARB is + * WGL_CONTEXT_CORE_PROFILE_BIT_ARB." + */ + attribs.profile = ST_PROFILE_DEFAULT; + if ((major > 3 || (major == 3 && minor >= 2)) + && ((profileMask & WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB) == 0)) + attribs.profile = ST_PROFILE_OPENGL_CORE; ctx->st = stw_dev->stapi->create_context(stw_dev->stapi, stw_dev->smapi, &attribs, shareCtx ? shareCtx->st : NULL); |