[Mesa-dev] [PATCH 6/9] egl: Implement EGL_KHR_context_flush_control

Eric Engestrom eric.engestrom at imgtec.com
Fri Nov 3 15:18:08 UTC 2017


On Thursday, 2017-11-02 15:01:45 -0400, Adam Jackson wrote:
> Signed-off-by: Adam Jackson <ajax at redhat.com>

Reviewed-by: Eric Engestrom <eric.engestrom at imgtec.com>

> ---
>  src/egl/drivers/dri2/egl_dri2.c | 11 ++++++++++-
>  src/egl/drivers/dri2/egl_dri2.h |  1 +
>  src/egl/main/eglapi.c           |  1 +
>  src/egl/main/eglcontext.c       | 10 ++++++++++
>  src/egl/main/eglcontext.h       |  1 +
>  src/egl/main/egldisplay.h       |  1 +
>  6 files changed, 24 insertions(+), 1 deletion(-)
> 
> diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
> index 57226f60a7..15e6c9bb8b 100644
> --- a/src/egl/drivers/dri2/egl_dri2.c
> +++ b/src/egl/drivers/dri2/egl_dri2.c
> @@ -92,7 +92,7 @@
>  #define DRM_FORMAT_MOD_INVALID ((1ULL<<56) - 1)
>  #endif
>  
> -#define NUM_ATTRIBS 10
> +#define NUM_ATTRIBS 12
>  
>  static void
>  dri_set_background_context(void *loaderPrivate)
> @@ -457,6 +457,7 @@ static const struct dri2_extension_match optional_core_extensions[] = {
>     { __DRI2_RENDERER_QUERY, 1, offsetof(struct dri2_egl_display, rendererQuery) },
>     { __DRI2_INTEROP, 1, offsetof(struct dri2_egl_display, interop) },
>     { __DRI_IMAGE, 1, offsetof(struct dri2_egl_display, image) },
> +   { __DRI2_FLUSH_CONTROL, 1, offsetof(struct dri2_egl_display, flush_control) },
>     { NULL, 0, 0 }
>  };
>  
> @@ -766,6 +767,9 @@ dri2_setup_screen(_EGLDisplay *disp)
>        }
>  #endif
>     }
> +
> +   if (dri2_dpy->flush_control)
> +      disp->Extensions.KHR_context_flush_control = EGL_TRUE;
>  }
>  
>  void
> @@ -1227,6 +1231,11 @@ dri2_fill_context_attribs(struct dri2_egl_context *dri2_ctx,
>        ctx_attribs[pos++] = val;
>     }
>  
> +   if (dri2_ctx->base.ReleaseBehavior == EGL_CONTEXT_RELEASE_BEHAVIOR_NONE_KHR) {
> +      ctx_attribs[pos++] = __DRI_CTX_ATTRIB_RELEASE_BEHAVIOR;
> +      ctx_attribs[pos++] = __DRI_CTX_RELEASE_BEHAVIOR_NONE;
> +   }
> +
>     *num_attribs = pos;
>  
>     return true;
> diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h
> index cd2487ab22..0ec8f44dce 100644
> --- a/src/egl/drivers/dri2/egl_dri2.h
> +++ b/src/egl/drivers/dri2/egl_dri2.h
> @@ -164,6 +164,7 @@ struct dri2_egl_display
>     const __DRIdri2Extension       *dri2;
>     const __DRIswrastExtension     *swrast;
>     const __DRI2flushExtension     *flush;
> +   const __DRI2flushControlExtension *flush_control;
>     const __DRItexBufferExtension  *tex_buffer;
>     const __DRIimageExtension      *image;
>     const __DRIrobustnessExtension *robustness;
> diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c
> index 215332f99c..76dabba2eb 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_context_flush_control);
>     _EGL_CHECK_EXTENSION(KHR_create_context);
>     _EGL_CHECK_EXTENSION(KHR_create_context_no_error);
>     _EGL_CHECK_EXTENSION(KHR_fence_sync);
> diff --git a/src/egl/main/eglcontext.c b/src/egl/main/eglcontext.c
> index 8c64f9ab82..18c1bc59ac 100644
> --- a/src/egl/main/eglcontext.c
> +++ b/src/egl/main/eglcontext.c
> @@ -386,6 +386,15 @@ _eglParseContextAttribList(_EGLContext *ctx, _EGLDisplay *dpy,
>              break;
>           }
>  
> +      case EGL_CONTEXT_RELEASE_BEHAVIOR_KHR:
> +         if (val == EGL_CONTEXT_RELEASE_BEHAVIOR_NONE_KHR ||
> +             val == EGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR) {
> +            ctx->ReleaseBehavior = val;
> +         } else {
> +            err = EGL_BAD_ATTRIBUTE;
> +         }
> +         break;
> +
>        default:
>           err = EGL_BAD_ATTRIBUTE;
>           break;
> @@ -588,6 +597,7 @@ _eglInitContext(_EGLContext *ctx, _EGLDisplay *dpy, _EGLConfig *conf,
>     ctx->Profile = EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR;
>     ctx->ResetNotificationStrategy = EGL_NO_RESET_NOTIFICATION_KHR;
>     ctx->ContextPriority = EGL_CONTEXT_PRIORITY_MEDIUM_IMG;
> +   ctx->ReleaseBehavior = EGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR;
>  
>     err = _eglParseContextAttribList(ctx, dpy, attrib_list);
>     if (err == EGL_SUCCESS && ctx->Config) {
> diff --git a/src/egl/main/eglcontext.h b/src/egl/main/eglcontext.h
> index a752368313..8d97ef9eab 100644
> --- a/src/egl/main/eglcontext.h
> +++ b/src/egl/main/eglcontext.h
> @@ -64,6 +64,7 @@ struct _egl_context
>     EGLint ResetNotificationStrategy;
>     EGLint ContextPriority;
>     EGLBoolean NoError;
> +   EGLint ReleaseBehavior;
>  
>     /* 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 952bfe53f0..981cbf4ca0 100644
> --- a/src/egl/main/egldisplay.h
> +++ b/src/egl/main/egldisplay.h
> @@ -112,6 +112,7 @@ struct _egl_extensions
>  
>     EGLBoolean KHR_cl_event2;
>     EGLBoolean KHR_config_attribs;
> +   EGLBoolean KHR_context_flush_control;
>     EGLBoolean KHR_create_context;
>     EGLBoolean KHR_fence_sync;
>     EGLBoolean KHR_get_all_proc_addresses;
> -- 
> 2.14.3
> 


More information about the mesa-dev mailing list