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 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
> ---