From c0be3aae6cfe1e8a51ed21e6fa10c5a51a216c36 Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Thu, 22 Sep 2016 03:47:55 -0400 Subject: [PATCH] egl: Implement EGL_KHR_context_flush_control MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Reviewed-by: Nicolai Hähnle Reviewed-by: Emil Velikov Signed-off-by: Adam Jackson --- 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 44cddfd0ed5..b486be74873 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 cd2487ab226..0ec8f44dce2 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 215332f99cb..76dabba2eb5 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 8c64f9ab82e..18c1bc59acc 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 a7523683136..8d97ef9eab9 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 952bfe53f00..981cbf4ca06 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.30.2