[Mesa-dev] [PATCH 1/7] egl: Support IMG_context_priority
Tapani Pälli
tapani.palli at intel.com
Wed Oct 4 04:56:29 UTC 2017
FYI I've tested this series using your 'preemption' branch on KBL and
'egl-context-priority' test passes. The other Piglit test I sent
('egl-context-priority-runtime') does not always pass but I think the
problem is actually in the test itself, it's making assumptions that are
not true. I will eventually try to get that working as well, it seems
likely that it would require GL_TIMESTAMP query support though and for
that I'd need to enable 'GL_EXT_disjoint_timer_query' first.
On 09/29/2017 01:25 PM, Chris Wilson wrote:
> IMG_context_priority
> https://www.khronos.org/registry/egl/extensions/IMG/EGL_IMG_context_priority.txt
>
> "This extension allows an EGLContext to be created with a priority
> hint. It is possible that an implementation will not honour the
> hint, especially if there are constraints on the number of high
> priority contexts available in the system, or system policy limits
> access to high priority contexts to appropriate system privilege
> level. A query is provided to find the real priority level assigned
> to the context after creation."
>
> The extension adds a new eglCreateContext attribute for choosing a
> priority hint. This stub parses the attribute and copies into the base
> struct _egl_context, and hooks up the query similarly.
>
> Since the attribute is purely a hint, I have no qualms about the lack of
> implementation before reporting back the value the user gave!
>
> v2: Remember to set the default ContextPriority value to medium.
> v3: Use the driRendererQuery interface to probe the backend for
> supported priority values and use those to mask the EGL interface.
> v4: Treat the priority attrib as a hint and gracefully mask any requests
> not supported by the driver, the EGLContext will remain at medium
> priority.
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Rob Clark <robdclark at gmail.com>
> Reviewed-by: Ben Widawsky <ben at bwidawsk.net>
> Reviewed-by: Emil Velikov <emli.velikov at collabora.com>
> Reviewed-by: Eric Engestrom <eric.engestrom at imgtec.com>
> ---
> include/GL/internal/dri_interface.h | 8 +++++
> src/egl/drivers/dri2/egl_dri2.c | 5 ++++
> src/egl/main/eglapi.c | 2 ++
> src/egl/main/eglcontext.c | 58 +++++++++++++++++++++++++++++++++++++
> src/egl/main/eglcontext.h | 1 +
> src/egl/main/egldisplay.h | 5 ++++
> 6 files changed, 79 insertions(+)
>
> diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h
> index 783ff1c70d..bcc6a2e423 100644
> --- a/include/GL/internal/dri_interface.h
> +++ b/include/GL/internal/dri_interface.h
> @@ -1765,6 +1765,14 @@ typedef struct __DRIDriverVtableExtensionRec {
> */
> #define __DRI2_RENDERER_HAS_FRAMEBUFFER_SRGB 0x000c
>
> +/* Bitmaks of supported/available context priorities - must match
> + * __EGL_CONTEXT_PRIORITY_LOW_BIT et al
> + */
> +#define __DRI2_RENDERER_HAS_CONTEXT_PRIORITY 0x000d
> +#define __DRI2_RENDERER_HAS_CONTEXT_PRIORITY_LOW (1 << 0)
> +#define __DRI2_RENDERER_HAS_CONTEXT_PRIORITY_MEDIUM (1 << 1)
> +#define __DRI2_RENDERER_HAS_CONTEXT_PRIORITY_HIGH (1 << 2)
> +
> typedef struct __DRI2rendererQueryExtensionRec __DRI2rendererQueryExtension;
> struct __DRI2rendererQueryExtensionRec {
> __DRIextension base;
> diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
> index adcaae0bab..e87144892e 100644
> --- a/src/egl/drivers/dri2/egl_dri2.c
> +++ b/src/egl/drivers/dri2/egl_dri2.c
> @@ -666,6 +666,11 @@ dri2_setup_screen(_EGLDisplay *disp)
> disp->Extensions.KHR_no_config_context = EGL_TRUE;
> disp->Extensions.KHR_surfaceless_context = EGL_TRUE;
>
> + /* Report back to EGL the bitmask of priorities supported */
> + disp->Extensions.IMG_context_priority =
> + dri2_renderer_query_integer(dri2_dpy,
> + __DRI2_RENDERER_HAS_CONTEXT_PRIORITY);
> +
> if (dri2_renderer_query_integer(dri2_dpy,
> __DRI2_RENDERER_HAS_FRAMEBUFFER_SRGB))
> disp->Extensions.KHR_gl_colorspace = EGL_TRUE;
> diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c
> index 4a9b3fe392..6d35ba5d7a 100644
> --- a/src/egl/main/eglapi.c
> +++ b/src/egl/main/eglapi.c
> @@ -490,6 +490,8 @@ _eglCreateExtensionsString(_EGLDisplay *dpy)
> _EGL_CHECK_EXTENSION(EXT_image_dma_buf_import_modifiers);
> _EGL_CHECK_EXTENSION(EXT_swap_buffers_with_damage);
>
> + _EGL_CHECK_EXTENSION(IMG_context_priority);
> +
> _EGL_CHECK_EXTENSION(KHR_cl_event2);
> _EGL_CHECK_EXTENSION(KHR_config_attribs);
> _EGL_CHECK_EXTENSION(KHR_create_context);
> diff --git a/src/egl/main/eglcontext.c b/src/egl/main/eglcontext.c
> index 1b03160439..8c64f9ab82 100644
> --- a/src/egl/main/eglcontext.c
> +++ b/src/egl/main/eglcontext.c
> @@ -332,6 +332,60 @@ _eglParseContextAttribList(_EGLContext *ctx, _EGLDisplay *dpy,
> ctx->NoError = !!val;
> break;
>
> + case EGL_CONTEXT_PRIORITY_LEVEL_IMG:
> + /* The EGL_IMG_context_priority spec says:
> + *
> + * "EGL_CONTEXT_PRIORITY_LEVEL_IMG determines the priority level of
> + * the context to be created. This attribute is a hint, as an
> + * implementation may not support multiple contexts at some
> + * priority levels and system policy may limit access to high
> + * priority contexts to appropriate system privilege level. The
> + * default value for EGL_CONTEXT_PRIORITY_LEVEL_IMG is
> + * EGL_CONTEXT_PRIORITY_MEDIUM_IMG."
> + */
> + {
> + int bit;
> +
> + switch (val) {
> + case EGL_CONTEXT_PRIORITY_HIGH_IMG:
> + bit = __EGL_CONTEXT_PRIORITY_HIGH_BIT;
> + break;
> + case EGL_CONTEXT_PRIORITY_MEDIUM_IMG:
> + bit = __EGL_CONTEXT_PRIORITY_MEDIUM_BIT;
> + break;
> + case EGL_CONTEXT_PRIORITY_LOW_IMG:
> + bit = __EGL_CONTEXT_PRIORITY_LOW_BIT;
> + break;
> + default:
> + bit = -1;
> + break;
> + }
> +
> + if (bit < 0) {
> + err = EGL_BAD_ATTRIBUTE;
> + break;
> + }
> +
> + /* "This extension allows an EGLContext to be created with a
> + * priority hint. It is possible that an implementation will not
> + * honour the hint, especially if there are constraints on the
> + * number of high priority contexts available in the system, or
> + * system policy limits access to high priority contexts to
> + * appropriate system privilege level. A query is provided to find
> + * the real priority level assigned to the context after creation."
> + *
> + * We currently assume that the driver applies the priority hint
> + * and filters out any it cannot handle during the screen setup,
> + * e.g. dri2_setup_screen(). As such we can mask any change that
> + * the driver would fail, and ctx->ContextPriority matches the
> + * hint applied to the driver/hardware backend.
> + */
> + if (dpy->Extensions.IMG_context_priority & (1 << bit))
> + ctx->ContextPriority = val;
> +
> + break;
> + }
> +
> default:
> err = EGL_BAD_ATTRIBUTE;
> break;
> @@ -533,6 +587,7 @@ _eglInitContext(_EGLContext *ctx, _EGLDisplay *dpy, _EGLConfig *conf,
> ctx->Flags = 0;
> ctx->Profile = EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR;
> ctx->ResetNotificationStrategy = EGL_NO_RESET_NOTIFICATION_KHR;
> + ctx->ContextPriority = EGL_CONTEXT_PRIORITY_MEDIUM_IMG;
>
> err = _eglParseContextAttribList(ctx, dpy, attrib_list);
> if (err == EGL_SUCCESS && ctx->Config) {
> @@ -598,6 +653,9 @@ _eglQueryContext(_EGLDriver *drv, _EGLDisplay *dpy, _EGLContext *c,
> case EGL_RENDER_BUFFER:
> *value = _eglQueryContextRenderBuffer(c);
> break;
> + case EGL_CONTEXT_PRIORITY_LEVEL_IMG:
> + *value = c->ContextPriority;
> + break;
> default:
> return _eglError(EGL_BAD_ATTRIBUTE, "eglQueryContext");
> }
> diff --git a/src/egl/main/eglcontext.h b/src/egl/main/eglcontext.h
> index 0667622ba1..a752368313 100644
> --- a/src/egl/main/eglcontext.h
> +++ b/src/egl/main/eglcontext.h
> @@ -62,6 +62,7 @@ struct _egl_context
> EGLint Flags;
> EGLint Profile;
> EGLint ResetNotificationStrategy;
> + EGLint ContextPriority;
> EGLBoolean NoError;
>
> /* The real render buffer when a window surface is bound */
> diff --git a/src/egl/main/egldisplay.h b/src/egl/main/egldisplay.h
> index 9a0b9b672a..5e5939fc6a 100644
> --- a/src/egl/main/egldisplay.h
> +++ b/src/egl/main/egldisplay.h
> @@ -105,6 +105,11 @@ struct _egl_extensions
> EGLBoolean EXT_image_dma_buf_import_modifiers;
> EGLBoolean EXT_swap_buffers_with_damage;
>
> + unsigned int IMG_context_priority;
> +#define __EGL_CONTEXT_PRIORITY_LOW_BIT 0
> +#define __EGL_CONTEXT_PRIORITY_MEDIUM_BIT 1
> +#define __EGL_CONTEXT_PRIORITY_HIGH_BIT 2
> +
> EGLBoolean KHR_cl_event2;
> EGLBoolean KHR_config_attribs;
> EGLBoolean KHR_create_context;
>
More information about the mesa-dev
mailing list