[Mesa-dev] [PATCH v3] egl: Support IMG_context_priority

Kenneth Graunke kenneth at whitecape.org
Fri Sep 29 06:49:04 UTC 2017


On Wednesday, April 12, 2017 3:11:53 AM PDT 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>
> ---
>  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 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..de3e0c3381 100644
> --- a/src/egl/main/eglcontext.c
> +++ b/src/egl/main/eglcontext.c
> @@ -312,6 +312,60 @@ _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."
> +          */
> +         {

Mesa coding style is a bit weird here, you'd actually do:

      case EGL_CONTEXT_PRIORITY_LEVEL_IMG:
      {
         /* The EGL_IMG_context_priority spec says: ...
          */
         int bit;
         break;
      }

i.e. everything here should be unindented one level.

This patch looks good to me.  It seems like a reasonable way for drivers
to report what priorities they accept, choose a priority, and report
what was chosen...

Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>

> +            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;
> @@ -505,6 +559,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 +625,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;
> 

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: This is a digitally signed message part.
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170928/0b4746df/attachment-0001.sig>


More information about the mesa-dev mailing list