diff options
author | Grigori Goronzy <greg@chown.ath.cx> | 2017-07-15 02:08:00 +0200 |
---|---|---|
committer | Grigori Goronzy <greg@chown.ath.cx> | 2017-07-15 02:08:00 +0200 |
commit | 98d052c1d075c213a43ff7f191ad0681cbdaf839 (patch) | |
tree | a18cc532ce71054f671ac0257f6577c16866dec4 | |
parent | c1c3aa3c49fa7168deffeca0fb57993abc4da5fb (diff) |
WIPglx-no-error
-rw-r--r-- | src/gallium/state_trackers/glx/xlib/glx_api.c | 46 | ||||
-rw-r--r-- | src/gallium/state_trackers/glx/xlib/xm_api.c | 6 | ||||
-rw-r--r-- | src/gallium/state_trackers/glx/xlib/xm_api.h | 4 | ||||
-rw-r--r-- | src/glx/dri2_glx.c | 5 | ||||
-rw-r--r-- | src/glx/dri3_glx.c | 5 | ||||
-rw-r--r-- | src/glx/dri_common.c | 38 | ||||
-rw-r--r-- | src/glx/dri_common.h | 4 | ||||
-rw-r--r-- | src/glx/drisw_glx.c | 3 | ||||
-rw-r--r-- | src/glx/glxclient.h | 6 | ||||
-rw-r--r-- | src/glx/glxextensions.c | 1 | ||||
-rw-r--r-- | src/glx/glxextensions.h | 1 | ||||
-rw-r--r-- | src/mesa/main/context.c | 4 |
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); |