[Mesa-dev] [PATCH 6/9] egl: Implement EGL_KHR_context_flush_control
Adam Jackson
ajax at redhat.com
Thu Nov 2 19:01:45 UTC 2017
Signed-off-by: Adam Jackson <ajax at redhat.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