[Mesa-dev] [PATCH 2/2] st/glx: add support for GLX_ARB_create_context_no_error
Grigori Goronzy
greg at chown.ath.cx
Thu Aug 3 18:07:59 UTC 2017
---
src/gallium/state_trackers/glx/xlib/glx_api.c | 55 ++++++++++++++++++++++++---
src/gallium/state_trackers/glx/xlib/xm_api.c | 6 ++-
src/gallium/state_trackers/glx/xlib/xm_api.h | 4 +-
3 files changed, 57 insertions(+), 8 deletions(-)
diff --git a/src/gallium/state_trackers/glx/xlib/glx_api.c b/src/gallium/state_trackers/glx/xlib/glx_api.c
index c473a0f..ac50dc6 100644
--- a/src/gallium/state_trackers/glx/xlib/glx_api.c
+++ b/src/gallium/state_trackers/glx/xlib/glx_api.c
@@ -66,6 +66,7 @@
"GLX_MESA_pixmap_colormap " \
"GLX_MESA_release_buffers " \
"GLX_ARB_create_context " \
+ "GLX_ARB_create_context_no_error " \
"GLX_ARB_create_context_profile " \
"GLX_ARB_get_proc_address " \
"GLX_EXT_create_context_es_profile " \
@@ -1108,7 +1109,8 @@ static GLXContext
create_context(Display *dpy, XMesaVisual xmvis,
XMesaContext shareCtx, Bool direct,
unsigned major, unsigned minor,
- unsigned profileMask, unsigned contextFlags)
+ unsigned profileMask, unsigned contextFlags,
+ Bool noError)
{
GLXContext glxCtx;
@@ -1125,7 +1127,8 @@ create_context(Display *dpy, XMesaVisual xmvis,
#endif
glxCtx->xmesaContext = XMesaCreateContext(xmvis, shareCtx, major, minor,
- profileMask, contextFlags);
+ profileMask, contextFlags,
+ (GLboolean)noError);
if (!glxCtx->xmesaContext) {
free(glxCtx);
return NULL;
@@ -1158,7 +1161,8 @@ glXCreateContext( Display *dpy, XVisualInfo *visinfo,
return create_context(dpy, xmvis,
shareCtx ? shareCtx->xmesaContext : NULL,
direct,
- 1, 0, GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB, 0x0);
+ 1, 0, GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB, 0x0,
+ False);
}
@@ -2194,7 +2198,8 @@ glXCreateNewContext( Display *dpy, GLXFBConfig config,
return create_context(dpy, xmvis,
shareCtx ? shareCtx->xmesaContext : NULL,
direct,
- 1, 0, GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB, 0x0);
+ 1, 0, GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB, 0x0,
+ False);
}
@@ -2409,7 +2414,8 @@ glXCreateContextWithConfigSGIX(Display *dpy, GLXFBConfigSGIX config,
return create_context(dpy, xmvis,
shareCtx ? shareCtx->xmesaContext : NULL,
direct,
- 1, 0, GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB, 0x0);
+ 1, 0, GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB, 0x0,
+ False);
}
@@ -2741,6 +2747,7 @@ glXCreateContextAttribsARB(Display *dpy, GLXFBConfig config,
int renderType = GLX_RGBA_TYPE;
unsigned i;
Bool done = False;
+ Bool noError = False;
const int contextFlagsAll = (GLX_CONTEXT_DEBUG_BIT_ARB |
GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB);
GLXContext ctx;
@@ -2757,6 +2764,9 @@ glXCreateContextAttribsARB(Display *dpy, GLXFBConfig config,
case GLX_CONTEXT_FLAGS_ARB:
contextFlags = attrib_list[++i];
break;
+ case GLX_CONTEXT_OPENGL_NO_ERROR_ARB:
+ noError = attrib_list[++i];
+ break;
case GLX_CONTEXT_PROFILE_MASK_ARB:
profileMask = attrib_list[++i];
break;
@@ -2826,16 +2836,49 @@ glXCreateContextAttribsARB(Display *dpy, GLXFBConfig config,
return NULL;
}
+ /* The KHR_no_error specs say:
+ *
+ * Requires OpenGL ES 2.0 or OpenGL 2.0.
+ */
+ if (noError && majorVersion < 2) {
+ generate_error(dpy, BadMatch, 0, X_GLXCreateContextAttribsARB, True);
+ return NULL;
+ }
+
if (renderType == GLX_COLOR_INDEX_TYPE && majorVersion >= 3) {
generate_error(dpy, BadMatch, 0, X_GLXCreateContextAttribsARB, True);
return NULL;
}
+ /* The GLX_ARB_create_context_no_error specs say:
+ *
+ * BadMatch is generated if the value of GLX_CONTEXT_OPENGL_NO_ERROR_ARB
+ * used to create <share_context> does not match the value of
+ * GLX_CONTEXT_OPENGL_NO_ERROR_ARB for the context being created.
+ */
+ if (shareCtx && shareCtx->xmesaContext->no_error != noError) {
+ generate_error(dpy, BadMatch, 0, X_GLXCreateContextAttribsARB, True);
+ return NULL;
+ }
+
+ /* The GLX_ARB_create_context_no_error specs say:
+ *
+ * BadMatch is generated if the GLX_CONTEXT_OPENGL_NO_ERROR_ARB is TRUE at
+ * the same time as a debug or robustness context is specified.
+ *
+ * Robustness isn't supported by this GLX implementation yet, so doesn't
+ * apply.
+ */
+ if (noError && (contextFlags & GLX_CONTEXT_DEBUG_BIT_ARB)) {
+ generate_error(dpy, BadMatch, 0, X_GLXCreateContextAttribsARB, True);
+ return NULL;
+ }
+
ctx = create_context(dpy, xmvis,
shareCtx ? shareCtx->xmesaContext : NULL,
direct,
majorVersion, minorVersion,
- profileMask, contextFlags);
+ profileMask, contextFlags, noError);
if (!ctx) {
generate_error(dpy, GLXBadFBConfig, 0, X_GLXCreateContextAttribsARB, False);
}
diff --git a/src/gallium/state_trackers/glx/xlib/xm_api.c b/src/gallium/state_trackers/glx/xlib/xm_api.c
index 828253b..508db5c 100644
--- a/src/gallium/state_trackers/glx/xlib/xm_api.c
+++ b/src/gallium/state_trackers/glx/xlib/xm_api.c
@@ -952,7 +952,8 @@ xmesa_init( Display *display )
PUBLIC
XMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list,
GLuint major, GLuint minor,
- GLuint profileMask, GLuint contextFlags)
+ GLuint profileMask, GLuint contextFlags,
+ GLboolean noError)
{
XMesaDisplay xmdpy = xmesa_init_display(v->display);
struct st_context_attribs attribs;
@@ -970,6 +971,7 @@ XMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list,
c->xm_visual = v;
c->xm_buffer = NULL; /* set later by XMesaMakeCurrent */
c->xm_read_buffer = NULL;
+ c->no_error = noError;
memset(&attribs, 0, sizeof(attribs));
attribs.visual = v->stvis;
@@ -981,6 +983,8 @@ 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 (noError)
+ attribs.flags |= ST_CONTEXT_FLAG_NO_ERROR;
switch (profileMask) {
case GLX_CONTEXT_CORE_PROFILE_BIT_ARB:
diff --git a/src/gallium/state_trackers/glx/xlib/xm_api.h b/src/gallium/state_trackers/glx/xlib/xm_api.h
index 06bf839..6da6b58 100644
--- a/src/gallium/state_trackers/glx/xlib/xm_api.h
+++ b/src/gallium/state_trackers/glx/xlib/xm_api.h
@@ -145,7 +145,8 @@ extern XMesaContext XMesaCreateContext( XMesaVisual v,
XMesaContext share_list,
GLuint major, GLuint minor,
GLuint profileMask,
- GLuint contextFlags);
+ GLuint contextFlags,
+ GLboolean noError);
/*
@@ -308,6 +309,7 @@ struct xmesa_context {
XMesaBuffer xm_buffer; /** current drawbuffer */
XMesaBuffer xm_read_buffer; /** current readbuffer */
struct hud_context *hud;
+ GLboolean no_error;
};
--
2.7.4
More information about the mesa-dev
mailing list