From: Adam Jackson Date: Thu, 22 Sep 2016 07:47:55 +0000 (-0400) Subject: egl: Implement EGL_KHR_context_flush_control X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=c0be3aae6cfe1e8a51ed21e6fa10c5a51a216c36;p=mesa.git egl: Implement EGL_KHR_context_flush_control Reviewed-by: Nicolai Hähnle Reviewed-by: Emil Velikov Signed-off-by: Adam Jackson --- 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;