On Wednesday, 2017-07-12 00:26:12 +0200, Grigori Goronzy wrote: > This only adds the EGL side, needs to be plumbed into Mesa frontend. > --- > src/egl/drivers/dri2/egl_dri2.c | 20 ++++++++++++++++++-- > src/egl/drivers/dri2/egl_dri2.h | 1 + > src/egl/main/eglapi.c | 1 + > src/egl/main/eglcontext.c | 30 ++++++++++++++++++++++++++++++ > src/egl/main/eglcontext.h | 1 + > src/egl/main/egldisplay.h | 1 + > 6 files changed, 52 insertions(+), 2 deletions(-) > > diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c > index cf26242..6bb94e4 100644 > --- a/src/egl/drivers/dri2/egl_dri2.c > +++ b/src/egl/drivers/dri2/egl_dri2.c > @@ -428,6 +428,7 @@ static const struct dri2_extension_match > swrast_core_extensions[] = { > > static const struct dri2_extension_match optional_core_extensions[] = { > { __DRI2_ROBUSTNESS, 1, offsetof(struct dri2_egl_display, robustness) }, > + { __DRI2_NO_ERROR, 1, offsetof(struct dri2_egl_display, no_error) }, > { __DRI2_CONFIG_QUERY, 1, offsetof(struct dri2_egl_display, config) }, > { __DRI2_FENCE, 1, offsetof(struct dri2_egl_display, fence) }, > { __DRI2_RENDERER_QUERY, 1, offsetof(struct dri2_egl_display, > rendererQuery) }, > @@ -665,6 +666,9 @@ dri2_setup_screen(_EGLDisplay *disp) > disp->Extensions.EXT_create_context_robustness = EGL_TRUE; > } > > + if (dri2_dpy->no_error) > + disp->Extensions.KHR_create_context_no_error = EGL_TRUE; > + > if (dri2_dpy->fence) { > disp->Extensions.KHR_fence_sync = EGL_TRUE; > disp->Extensions.KHR_wait_sync = EGL_TRUE; > @@ -1056,7 +1060,7 @@ dri2_fill_context_attribs(struct dri2_egl_context > *dri2_ctx, > ctx_attribs[pos++] = __DRI_CTX_ATTRIB_MINOR_VERSION; > ctx_attribs[pos++] = dri2_ctx->base.ClientMinorVersion; > > - if (dri2_ctx->base.Flags != 0) { > + if (dri2_ctx->base.Flags != 0 || dri2_ctx->base.NoError) { > /* If the implementation doesn't support the __DRI2_ROBUSTNESS > * extension, don't even try to send it the robust-access flag. > * It may explode. Instead, generate the required EGL error here. > @@ -1068,7 +1072,8 @@ dri2_fill_context_attribs(struct dri2_egl_context > *dri2_ctx, > } > > ctx_attribs[pos++] = __DRI_CTX_ATTRIB_FLAGS; > - ctx_attribs[pos++] = dri2_ctx->base.Flags; > + ctx_attribs[pos++] = dri2_ctx->base.Flags | > + dri2_ctx->base.NoError ? __DRI_CTX_FLAG_NO_ERROR : 0;
This won't compile: you're introducing this flag in the next commit. Can you please re-order your commits so that they at least all compile, but when possible they also all behave at runtime? Git makes it easy to test: $ git rebase --exec 'cd build; make -j8 && make check' master (assuming your code is on a branch based off master). You should add to that any deqp/piglit/etc. tests you have, of course. > } > > if (dri2_ctx->base.ResetNotificationStrategy != > EGL_NO_RESET_NOTIFICATION_KHR) { > @@ -1131,6 +1136,17 @@ dri2_create_context(_EGLDriver *drv, _EGLDisplay > *disp, _EGLConfig *conf, > goto cleanup; > } > > + /* The EGL_KHR_create_context_no_error spec says: > + * > + * "BAD_MATCH is generated if the value of > EGL_CONTEXT_OPENGL_NO_ERROR_KHR > + * used to create <share_context> does not match the value of > + * EGL_CONTEXT_OPENGL_NO_ERROR_KHR for the context being created." > + */ > + if (share_list && share_list->NoError != dri2_ctx->base.NoError) { > + _eglError(EGL_BAD_MATCH, "eglCreateContext"); > + goto cleanup; > + } > + > switch (dri2_ctx->base.ClientAPI) { > case EGL_OPENGL_ES_API: > switch (dri2_ctx->base.ClientMajorVersion) { > diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h > index 4a5cf8e..5b3e93a 100644 > --- a/src/egl/drivers/dri2/egl_dri2.h > +++ b/src/egl/drivers/dri2/egl_dri2.h > @@ -170,6 +170,7 @@ struct dri2_egl_display > const __DRItexBufferExtension *tex_buffer; > const __DRIimageExtension *image; > const __DRIrobustnessExtension *robustness; > + const __DRInoErrorExtension *no_error; > const __DRI2configQueryExtension *config; > const __DRI2fenceExtension *fence; > const __DRI2rendererQueryExtension *rendererQuery; > diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c > index 9b899d8..000368a 100644 > --- a/src/egl/main/eglapi.c > +++ b/src/egl/main/eglapi.c > @@ -494,6 +494,7 @@ _eglCreateExtensionsString(_EGLDisplay *dpy) > _EGL_CHECK_EXTENSION(KHR_cl_event2); > _EGL_CHECK_EXTENSION(KHR_config_attribs); > _EGL_CHECK_EXTENSION(KHR_create_context); > + _EGL_CHECK_EXTENSION(KHR_create_context_no_error); > _EGL_CHECK_EXTENSION(KHR_fence_sync); > _EGL_CHECK_EXTENSION(KHR_get_all_proc_addresses); > _EGL_CHECK_EXTENSION(KHR_gl_colorspace); > diff --git a/src/egl/main/eglcontext.c b/src/egl/main/eglcontext.c > index df8b45c..4244ca0 100644 > --- a/src/egl/main/eglcontext.c > +++ b/src/egl/main/eglcontext.c > @@ -312,6 +312,36 @@ _eglParseContextAttribList(_EGLContext *ctx, _EGLDisplay > *dpy, > ctx->Flags |= EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR; > break; > > + case EGL_CONTEXT_OPENGL_NO_ERROR_KHR: > + if (dpy->Version < 14) { > + err = EGL_BAD_ATTRIBUTE; > + break; > + } > + > + /* The KHR_no_error spec only applies against OpenGL 2.0+ and > + * OpenGL ES 2.0+ > + */ > + if ((api != EGL_OPENGL_API && api != EGL_OPENGL_ES_API) || > + ctx->ClientMajorVersion < 2) { > + err = EGL_BAD_ATTRIBUTE; > + break; > + } > + > + /* The EGL_KHR_create_context_no_error spec says: > + * > + * "BAD_MATCH is generated if the > EGL_CONTEXT_OPENGL_NO_ERROR_KHR is TRUE at > + * the same time as a debug or robustness context is specified." > + */ > + if (ctx->Flags & EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR || > + ctx->Flags & EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR) { > + err = EGL_BAD_MATCH; > + break; > + } > + > + /* Canonicalize value to EGL_TRUE/EGL_FALSE definitions */ > + ctx->NoError = !!val; Do we need NoError? Wouldn't adding __DRI_CTX_FLAG_NO_ERROR to Flags be enough? Cheers, Eric > + break; > + > default: > err = EGL_BAD_ATTRIBUTE; > break; > diff --git a/src/egl/main/eglcontext.h b/src/egl/main/eglcontext.h > index f2fe806..0667622 100644 > --- a/src/egl/main/eglcontext.h > +++ b/src/egl/main/eglcontext.h > @@ -62,6 +62,7 @@ struct _egl_context > EGLint Flags; > EGLint Profile; > EGLint ResetNotificationStrategy; > + EGLBoolean NoError; > > /* The real render buffer when a window surface is bound */ > EGLint WindowRenderBuffer; > diff --git a/src/egl/main/egldisplay.h b/src/egl/main/egldisplay.h > index a13ff5b..3d5a445 100644 > --- a/src/egl/main/egldisplay.h > +++ b/src/egl/main/egldisplay.h > @@ -122,6 +122,7 @@ struct _egl_extensions > EGLBoolean KHR_reusable_sync; > EGLBoolean KHR_surfaceless_context; > EGLBoolean KHR_wait_sync; > + EGLBoolean KHR_create_context_no_error; > > EGLBoolean MESA_drm_image; > EGLBoolean MESA_image_dma_buf_export; > -- > 2.7.4 > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev