X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=glws_glx.cpp;h=c151db1c07fb91914c070699cc79fec4bc49f076;hb=ad60fd108d331796173ad54356855d9a2d0d87ba;hp=db24b7f535f3b4bcef50bf0ba7c0508f78172650;hpb=1cfd89b2bb73c94340d61936a72bec346c3ca22d;p=apitrace diff --git a/glws_glx.cpp b/glws_glx.cpp index db24b7f..c151db1 100644 --- a/glws_glx.cpp +++ b/glws_glx.cpp @@ -240,7 +240,12 @@ cleanup(void) { } Visual * -createVisual(bool doubleBuffer) { +createVisual(bool doubleBuffer, Profile profile) { + if (profile != PROFILE_COMPAT && + profile != PROFILE_CORE) { + return NULL; + } + GlxVisual *visual = new GlxVisual; if (glxVersion >= 0x0103) { @@ -297,28 +302,49 @@ createContext(const Visual *_visual, Context *shareContext, Profile profile) GLXContext share_context = NULL; GLXContext context; - if (profile != PROFILE_COMPAT) { - return NULL; - } - if (shareContext) { share_context = static_cast(shareContext)->context; } if (glxVersion >= 0x0104 && has_GLX_ARB_create_context) { Attributes attribs; + attribs.add(GLX_RENDER_TYPE, GLX_RGBA_TYPE); if (debug) { attribs.add(GLX_CONTEXT_FLAGS_ARB, GLX_CONTEXT_DEBUG_BIT_ARB); } + + switch (profile) { + case PROFILE_COMPAT: + break; + case PROFILE_CORE: + // XXX: This will invariable return a 3.2 context, when supported. + // We probably should have a PROFILE_CORE_XX per version. + attribs.add(GLX_CONTEXT_MAJOR_VERSION_ARB, 3); + attribs.add(GLX_CONTEXT_MINOR_VERSION_ARB, 2); + attribs.add(GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_CORE_PROFILE_BIT_ARB); + break; + default: + return NULL; + } + attribs.end(); context = glXCreateContextAttribsARB(display, visual->fbconfig, share_context, True, attribs); - } else - if (glxVersion >= 0x103) { - context = glXCreateNewContext(display, visual->fbconfig, GLX_RGBA_TYPE, share_context, True); } else { - context = glXCreateContext(display, visual->visinfo, share_context, True); + if (profile != PROFILE_COMPAT) { + return NULL; + } + + if (glxVersion >= 0x103) { + context = glXCreateNewContext(display, visual->fbconfig, GLX_RGBA_TYPE, share_context, True); + } else { + context = glXCreateContext(display, visual->visinfo, share_context, True); + } + } + + if (!context) { + return NULL; } return new GlxContext(visual, profile, context);