[Mesa-dev] [PATCH v2 1/4] egl: Support IMG_context_priority

Ben Widawsky ben at bwidawsk.net
Tue Apr 11 17:35:57 UTC 2017


On 17-04-11 17:11:54, 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.
>
>Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
>Cc: Rob Clark <robdclark at gmail.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           | 43 +++++++++++++++++++++++++++++++++++++
> src/egl/main/eglcontext.h           |  1 +
> src/egl/main/egldisplay.h           |  5 +++++
> 6 files changed, 64 insertions(+)
>
>diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h
>index 86efd1bdc9..9881ddcbb0 100644
>--- a/include/GL/internal/dri_interface.h
>+++ b/include/GL/internal/dri_interface.h
>@@ -1604,6 +1604,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 2cab7d00c1..0c2fdc1cc2 100644
>--- a/src/egl/drivers/dri2/egl_dri2.c
>+++ b/src/egl/drivers/dri2/egl_dri2.c
>@@ -663,6 +663,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 5694b5a4ca..9ed65b1bba 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);
>    _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 05cc523c8d..efe63f3ae4 100644
>--- a/src/egl/main/eglcontext.c
>+++ b/src/egl/main/eglcontext.c
>@@ -312,6 +312,45 @@ _eglParseContextAttribList(_EGLContext *ctx, _EGLDisplay *dpy,
>             ctx->Flags |= EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR;
>          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;
>+            }

unreachable()?

Either way:
Reviewed-by: Ben Widawsky <ben at bwidawsk.net>

>+
>+            if (bit < 0 ||
>+                !(dpy->Extensions.IMG_context_priority & (1 << bit)) ){
>+               err = EGL_BAD_ATTRIBUTE;
>+               break;
>+            }
>+
>+            ctx->ContextPriority = val;
>+         }
>+         break;
>+
>       default:
>          err = EGL_BAD_ATTRIBUTE;
>          break;
>@@ -505,6 +544,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) {
>@@ -570,6 +610,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 f2fe806626..e8c2d7d4f3 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;
>
>    /* 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 6c1049d23c..449ddb7b48 100644
>--- a/src/egl/main/egldisplay.h
>+++ b/src/egl/main/egldisplay.h
>@@ -104,6 +104,11 @@ struct _egl_extensions
>    EGLBoolean EXT_image_dma_buf_import;
>    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;
>-- 
>2.11.0
>

-- 
Ben Widawsky, Intel Open Source Technology Center


More information about the mesa-dev mailing list