summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGrigori Goronzy <greg@chown.ath.cx>2017-07-15 02:08:00 +0200
committerGrigori Goronzy <greg@chown.ath.cx>2017-07-15 02:08:00 +0200
commit98d052c1d075c213a43ff7f191ad0681cbdaf839 (patch)
treea18cc532ce71054f671ac0257f6577c16866dec4
parentc1c3aa3c49fa7168deffeca0fb57993abc4da5fb (diff)
-rw-r--r--src/gallium/state_trackers/glx/xlib/glx_api.c46
-rw-r--r--src/gallium/state_trackers/glx/xlib/xm_api.c6
-rw-r--r--src/gallium/state_trackers/glx/xlib/xm_api.h4
-rw-r--r--src/glx/dri2_glx.c5
-rw-r--r--src/glx/dri3_glx.c5
-rw-r--r--src/glx/dri_common.c38
-rw-r--r--src/glx/dri_common.h4
-rw-r--r--src/glx/drisw_glx.c3
-rw-r--r--src/glx/glxclient.h6
-rw-r--r--src/glx/glxextensions.c1
-rw-r--r--src/glx/glxextensions.h1
-rw-r--r--src/mesa/main/context.c4
12 files changed, 114 insertions, 9 deletions
diff --git a/src/gallium/state_trackers/glx/xlib/glx_api.c b/src/gallium/state_trackers/glx/xlib/glx_api.c
index c473a0fe54..699c064c4f 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;
@@ -2831,11 +2841,35 @@ glXCreateContextAttribsARB(Display *dpy, GLXFBConfig config,
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 881dd44323..fab2345da3 100644
--- a/src/gallium/state_trackers/glx/xlib/xm_api.c
+++ b/src/gallium/state_trackers/glx/xlib/xm_api.c
@@ -944,7 +944,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;
@@ -962,6 +963,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;
@@ -973,6 +975,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 06bf839c96..6da6b588fa 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;
};
diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c
index ae8cb11ef8..d285b492c4 100644
--- a/src/glx/dri2_glx.c
+++ b/src/glx/dri2_glx.c
@@ -262,6 +262,11 @@ dri2_create_context_attribs(struct glx_screen *base,
&api, &reset, error))
goto error_exit;
+ if (!dri2_check_no_error(flags, shareList)) {
+ *error = __DRI_CTX_ERROR_BAD_FLAG;
+ goto error_exit;
+ }
+
/* Check the renderType value */
if (!validate_renderType_against_config(config_base, renderType))
goto error_exit;
diff --git a/src/glx/dri3_glx.c b/src/glx/dri3_glx.c
index 509160697f..b9076c12e1 100644
--- a/src/glx/dri3_glx.c
+++ b/src/glx/dri3_glx.c
@@ -283,6 +283,11 @@ dri3_create_context_attribs(struct glx_screen *base,
&reset, error))
goto error_exit;
+ if (!dri2_check_no_error(flags, shareList)) {
+ *error = __DRI_CTX_ERROR_BAD_FLAG;
+ goto error_exit;
+ }
+
/* Check the renderType value */
if (!validate_renderType_against_config(config_base, render_type))
goto error_exit;
diff --git a/src/glx/dri_common.c b/src/glx/dri_common.c
index 854733a5be..6307d65411 100644
--- a/src/glx/dri_common.c
+++ b/src/glx/dri_common.c
@@ -499,6 +499,12 @@ dri2_convert_glx_attribs(unsigned num_attribs, const uint32_t *attribs,
case GLX_CONTEXT_FLAGS_ARB:
*flags = attribs[i * 2 + 1];
break;
+ case GLX_CONTEXT_OPENGL_NO_ERROR_ARB:
+ if (attribs[i * 2 + 1]) {
+ *flags |= __DRI_CTX_FLAG_NO_ERROR;
+ printf("no_error enabled\n");
+ }
+ break;
case GLX_CONTEXT_PROFILE_MASK_ARB:
profile = attribs[i * 2 + 1];
got_profile = true;
@@ -567,7 +573,8 @@ dri2_convert_glx_attribs(unsigned num_attribs, const uint32_t *attribs,
/* Unknown flag value.
*/
if (*flags & ~(__DRI_CTX_FLAG_DEBUG | __DRI_CTX_FLAG_FORWARD_COMPATIBLE
- | __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS)) {
+ | __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS
+ | __DRI_CTX_FLAG_NO_ERROR)) {
*error = __DRI_CTX_ERROR_UNKNOWN_FLAG;
return false;
}
@@ -592,4 +599,33 @@ dri2_convert_glx_attribs(unsigned num_attribs, const uint32_t *attribs,
return true;
}
+_X_HIDDEN bool
+dri2_check_no_error(uint32_t flags, struct glx_context *share_context)
+{
+ Bool noError = flags & __DRI_CTX_FLAG_NO_ERROR;
+
+ /* 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 (share_context && share_context->noError && !noError) {
+ return false;
+ }
+
+ /* 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.
+ *
+ */
+ if (noError && ((flags & __DRI_CTX_FLAG_DEBUG) ||
+ (flags & __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS))) {
+ return false;
+ }
+
+ return true;
+}
+
#endif /* GLX_DIRECT_RENDERING */
diff --git a/src/glx/dri_common.h b/src/glx/dri_common.h
index 947d331772..8fba5410fc 100644
--- a/src/glx/dri_common.h
+++ b/src/glx/dri_common.h
@@ -80,4 +80,8 @@ dri2_convert_glx_attribs(unsigned num_attribs, const uint32_t *attribs,
uint32_t *render_type, uint32_t *flags, unsigned *api,
int *reset, unsigned *error);
+extern bool
+dri2_check_no_error(uint32_t flags, struct glx_context *share_context);
+
+
#endif /* _DRI_COMMON_H */
diff --git a/src/glx/drisw_glx.c b/src/glx/drisw_glx.c
index 110b7f8d92..711c01c50f 100644
--- a/src/glx/drisw_glx.c
+++ b/src/glx/drisw_glx.c
@@ -433,6 +433,9 @@ drisw_create_context_attribs(struct glx_screen *base,
&api, &reset, error))
return NULL;
+ if (!dri2_check_no_error(flags, shareList))
+ return NULL;
+
/* Check the renderType value */
if (!validate_renderType_against_config(config_base, renderType)) {
return NULL;
diff --git a/src/glx/glxclient.h b/src/glx/glxclient.h
index 0d29e5635e..38647b21d5 100644
--- a/src/glx/glxclient.h
+++ b/src/glx/glxclient.h
@@ -437,6 +437,12 @@ struct glx_context
*/
unsigned long thread_refcount;
+ /**
+ * GLX_ARB_create_context_no_error setting for this context.
+ * This needs to be kept here to enforce shared context rules.
+ */
+ Bool noError;
+
char gl_extension_bits[__GL_EXT_BYTES];
};
diff --git a/src/glx/glxextensions.c b/src/glx/glxextensions.c
index 22b078ce48..cda206aa38 100644
--- a/src/glx/glxextensions.c
+++ b/src/glx/glxextensions.c
@@ -133,6 +133,7 @@ struct extension_info
/* *INDENT-OFF* */
static const struct extension_info known_glx_extensions[] = {
{ GLX(ARB_create_context), VER(0,0), Y, N, N, N },
+ { GLX(ARB_create_context_no_error), VER(0,0), Y, N, N, N },
{ GLX(ARB_create_context_profile), VER(0,0), Y, N, N, N },
{ GLX(ARB_create_context_robustness), VER(0,0), Y, N, N, N },
{ GLX(ARB_fbconfig_float), VER(0,0), Y, Y, N, N },
diff --git a/src/glx/glxextensions.h b/src/glx/glxextensions.h
index 21ad02a44b..79ce07d93b 100644
--- a/src/glx/glxextensions.h
+++ b/src/glx/glxextensions.h
@@ -38,6 +38,7 @@ extern "C" {
enum
{
ARB_create_context_bit = 0,
+ ARB_create_context_no_error_bit,
ARB_create_context_profile_bit,
ARB_create_context_robustness_bit,
ARB_fbconfig_float_bit,
diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c
index fe527a0ae2..3ed26778b6 100644
--- a/src/mesa/main/context.c
+++ b/src/mesa/main/context.c
@@ -1117,9 +1117,13 @@ create_beginend_table(const struct gl_context *ctx)
return table;
}
+#include <stdio.h>
void
_mesa_initialize_dispatch_tables(struct gl_context *ctx)
{
+
+ printf("%s: NO_ERROR=%d\n", __func__, _mesa_is_no_error_enabled(ctx));
+
/* Do the code-generated setup of the exec table in api_exec.c. */
_mesa_initialize_exec_table(ctx);