[Mesa-dev] [PATCH 2/2] egl, dri: Propagate context priority hint to driver->CreateContext

Rob Clark robdclark at gmail.com
Fri Apr 7 00:29:55 UTC 2017


On Thu, Apr 6, 2017 at 3:12 PM, Chris Wilson <chris at chris-wilson.co.uk> wrote:
> Jump through the layers of abstraction between egl and dri in order to
> feed the context priority attribute through to the backend. This
> requires us to read the value from the base _egl_context, convert it to
> a DRI attribute, parse it again in the generic context creater before
> passing it to the driver as a function parameter.
>
> Issues:
>
>  * How to pass back the priority of the create context (as it may be
> modified by the driver) back to EGL?

Maybe driver provides a bitmask of supportable priority levels, and
then EGL clamps?  Or a NumPriorityLevels param?  That avoids needing
to get the value back from the driver and at least works for the
situations I can think of.  (Ie. either kernel+hw support multiple
priority levels or it doesn't.)  Maybe with an additional system level
limit, ie. maybe only compositor can be highest priority.. but that
seems like a system level thing rather than driver level thing, so
should be in EGL?

BR,
-R

> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> ---
>  include/GL/internal/dri_interface.h            |  6 ++++
>  src/egl/drivers/dri2/egl_dri2.c                | 38 +++++++++++++++++++++-----
>  src/mesa/drivers/dri/common/dri_util.c         |  7 ++++-
>  src/mesa/drivers/dri/common/dri_util.h         |  9 +++---
>  src/mesa/drivers/dri/i915/intel_screen.c       | 11 ++++----
>  src/mesa/drivers/dri/i965/brw_context.c        |  7 +++--
>  src/mesa/drivers/dri/i965/brw_context.h        | 17 ++++++------
>  src/mesa/drivers/dri/nouveau/nouveau_context.c |  1 +
>  src/mesa/drivers/dri/nouveau/nouveau_context.h |  4 +--
>  src/mesa/drivers/dri/r200/r200_context.c       |  1 +
>  src/mesa/drivers/dri/r200/r200_context.h       |  1 +
>  src/mesa/drivers/dri/radeon/radeon_context.c   |  1 +
>  src/mesa/drivers/dri/radeon/radeon_context.h   |  1 +
>  src/mesa/drivers/dri/swrast/swrast.c           |  1 +
>  14 files changed, 75 insertions(+), 30 deletions(-)
>
> diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h
> index 86efd1bdc9..ec36aec9f4 100644
> --- a/include/GL/internal/dri_interface.h
> +++ b/include/GL/internal/dri_interface.h
> @@ -1056,6 +1056,12 @@ struct __DRIdri2LoaderExtensionRec {
>  #define __DRI_CTX_RESET_LOSE_CONTEXT           1
>  /*@}*/
>
> +#define __DRI_CTX_ATTRIB_PRIORITY              4
> +
> +#define __DRI_CTX_PRIORITY_LOW                 0
> +#define __DRI_CTX_PRIORITY_MEDIUM              1
> +#define __DRI_CTX_PRIORITY_HIGH                        2
> +
>  /**
>   * \name Reasons that __DRIdri2Extension::createContextAttribs might fail
>   */
> diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
> index 60e1472ac1..ce58917267 100644
> --- a/src/egl/drivers/dri2/egl_dri2.c
> +++ b/src/egl/drivers/dri2/egl_dri2.c
> @@ -83,6 +83,8 @@
>  #define DRM_FORMAT_GR1616        fourcc_code('G', 'R', '3', '2') /* [31:0] R:G 16:16 little endian */
>  #endif
>
> +#define NUM_ATTRIBS 10
> +
>  static void
>  dri_set_background_context(void *loaderPrivate)
>  {
> @@ -1050,7 +1052,7 @@ dri2_fill_context_attribs(struct dri2_egl_context *dri2_ctx,
>  {
>     int pos = 0;
>
> -   assert(*num_attribs >= 8);
> +   assert(*num_attribs >= NUM_ATTRIBS);
>
>     ctx_attribs[pos++] = __DRI_CTX_ATTRIB_MAJOR_VERSION;
>     ctx_attribs[pos++] = dri2_ctx->base.ClientMajorVersion;
> @@ -1086,6 +1088,28 @@ dri2_fill_context_attribs(struct dri2_egl_context *dri2_ctx,
>        ctx_attribs[pos++] = __DRI_CTX_RESET_LOSE_CONTEXT;
>     }
>
> +   if (dri2_ctx->base.ContextPriority != EGL_CONTEXT_PRIORITY_MEDIUM_IMG) {
> +      unsigned val;
> +
> +      switch (dri2_ctx->base.ContextPriority) {
> +      case EGL_CONTEXT_PRIORITY_HIGH_IMG:
> +         val = __DRI_CTX_PRIORITY_HIGH;
> +         break;
> +      case EGL_CONTEXT_PRIORITY_MEDIUM_IMG:
> +         val = __DRI_CTX_PRIORITY_MEDIUM;
> +         break;
> +      case EGL_CONTEXT_PRIORITY_LOW_IMG:
> +         val = __DRI_CTX_PRIORITY_LOW;
> +         break;
> +      default:
> +         _eglError(EGL_BAD_CONFIG, "eglCreateContext");
> +         return false;
> +      }
> +
> +      ctx_attribs[pos++] = __DRI_CTX_ATTRIB_PRIORITY;
> +      ctx_attribs[pos++] = val;
> +   }
> +
>     *num_attribs = pos;
>
>     return true;
> @@ -1189,8 +1213,8 @@ dri2_create_context(_EGLDriver *drv, _EGLDisplay *disp, _EGLConfig *conf,
>
>     if (dri2_dpy->image_driver) {
>        unsigned error;
> -      unsigned num_attribs = 8;
> -      uint32_t ctx_attribs[8];
> +      unsigned num_attribs = NUM_ATTRIBS;
> +      uint32_t ctx_attribs[NUM_ATTRIBS];
>
>        if (!dri2_fill_context_attribs(dri2_ctx, dri2_dpy, ctx_attribs,
>                                          &num_attribs))
> @@ -1209,8 +1233,8 @@ dri2_create_context(_EGLDriver *drv, _EGLDisplay *disp, _EGLConfig *conf,
>     } else if (dri2_dpy->dri2) {
>        if (dri2_dpy->dri2->base.version >= 3) {
>           unsigned error;
> -         unsigned num_attribs = 8;
> -         uint32_t ctx_attribs[8];
> +         unsigned num_attribs = NUM_ATTRIBS;
> +         uint32_t ctx_attribs[NUM_ATTRIBS];
>
>           if (!dri2_fill_context_attribs(dri2_ctx, dri2_dpy, ctx_attribs,
>                                          &num_attribs))
> @@ -1238,8 +1262,8 @@ dri2_create_context(_EGLDriver *drv, _EGLDisplay *disp, _EGLConfig *conf,
>        assert(dri2_dpy->swrast);
>        if (dri2_dpy->swrast->base.version >= 3) {
>           unsigned error;
> -         unsigned num_attribs = 8;
> -         uint32_t ctx_attribs[8];
> +         unsigned num_attribs = NUM_ATTRIBS;
> +         uint32_t ctx_attribs[NUM_ATTRIBS];
>
>           if (!dri2_fill_context_attribs(dri2_ctx, dri2_dpy, ctx_attribs,
>                                          &num_attribs))
> diff --git a/src/mesa/drivers/dri/common/dri_util.c b/src/mesa/drivers/dri/common/dri_util.c
> index f6df48802f..af9f1e2a5f 100644
> --- a/src/mesa/drivers/dri/common/dri_util.c
> +++ b/src/mesa/drivers/dri/common/dri_util.c
> @@ -306,6 +306,7 @@ driCreateContextAttribs(__DRIscreen *screen, int api,
>      unsigned minor_version = 0;
>      uint32_t flags = 0;
>      bool notify_reset = false;
> +    unsigned priority = __DRI_CTX_PRIORITY_MEDIUM;
>
>      assert((num_attribs == 0) || (attribs != NULL));
>
> @@ -348,6 +349,9 @@ driCreateContextAttribs(__DRIscreen *screen, int api,
>              notify_reset = (attribs[i * 2 + 1]
>                              != __DRI_CTX_RESET_NO_NOTIFICATION);
>              break;
> +       case __DRI_CTX_ATTRIB_PRIORITY:
> +           priority = attribs[i * 2 + 1];
> +           break;
>         default:
>             /* We can't create a context that satisfies the requirements of an
>              * attribute that we don't understand.  Return failure.
> @@ -449,7 +453,8 @@ driCreateContextAttribs(__DRIscreen *screen, int api,
>
>      if (!screen->driver->CreateContext(mesa_api, modes, context,
>                                         major_version, minor_version,
> -                                       flags, notify_reset, error, shareCtx)) {
> +                                       flags, notify_reset, priority,
> +                                       error, shareCtx)) {
>          free(context);
>          return NULL;
>      }
> diff --git a/src/mesa/drivers/dri/common/dri_util.h b/src/mesa/drivers/dri/common/dri_util.h
> index 8fcd6322d0..4e8924b84e 100644
> --- a/src/mesa/drivers/dri/common/dri_util.h
> +++ b/src/mesa/drivers/dri/common/dri_util.h
> @@ -85,11 +85,12 @@ struct __DriverAPIRec {
>      GLboolean (*CreateContext)(gl_api api,
>                                 const struct gl_config *glVis,
>                                 __DRIcontext *driContextPriv,
> -                              unsigned major_version,
> -                              unsigned minor_version,
> -                              uint32_t flags,
> +                               unsigned major_version,
> +                               unsigned minor_version,
> +                               uint32_t flags,
>                                 bool notify_reset,
> -                              unsigned *error,
> +                               unsigned priority,
> +                               unsigned *error,
>                                 void *sharedContextPrivate);
>
>      void (*DestroyContext)(__DRIcontext *driContextPriv);
> diff --git a/src/mesa/drivers/dri/i915/intel_screen.c b/src/mesa/drivers/dri/i915/intel_screen.c
> index fe86179007..bb382ffac2 100644
> --- a/src/mesa/drivers/dri/i915/intel_screen.c
> +++ b/src/mesa/drivers/dri/i915/intel_screen.c
> @@ -955,13 +955,14 @@ i915CreateContext(int api,
>
>  static GLboolean
>  intelCreateContext(gl_api api,
> -                  const struct gl_config * mesaVis,
> +                   const struct gl_config * mesaVis,
>                     __DRIcontext * driContextPriv,
> -                  unsigned major_version,
> -                  unsigned minor_version,
> -                  uint32_t flags,
> +                   unsigned major_version,
> +                   unsigned minor_version,
> +                   uint32_t flags,
>                     bool notify_reset,
> -                  unsigned *error,
> +                   unsigned priority,
> +                   unsigned *error,
>                     void *sharedContextPrivate)
>  {
>     bool success = false;
> diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c
> index 81c0544652..afb0922e9f 100644
> --- a/src/mesa/drivers/dri/i965/brw_context.c
> +++ b/src/mesa/drivers/dri/i965/brw_context.c
> @@ -948,14 +948,15 @@ brw_process_driconf_options(struct brw_context *brw)
>
>  GLboolean
>  brwCreateContext(gl_api api,
> -                const struct gl_config *mesaVis,
> -                __DRIcontext *driContextPriv,
> +                 const struct gl_config *mesaVis,
> +                 __DRIcontext *driContextPriv,
>                   unsigned major_version,
>                   unsigned minor_version,
>                   uint32_t flags,
>                   bool notify_reset,
> +                 unsigned priority,
>                   unsigned *dri_ctx_error,
> -                void *sharedContextPrivate)
> +                 void *sharedContextPrivate)
>  {
>     struct gl_context *shareCtx = (struct gl_context *) sharedContextPrivate;
>     struct intel_screen *screen = driContextPriv->driScreenPriv->driverPrivate;
> diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h
> index 1d571107fa..d08b5fd375 100644
> --- a/src/mesa/drivers/dri/i965/brw_context.h
> +++ b/src/mesa/drivers/dri/i965/brw_context.h
> @@ -1257,14 +1257,15 @@ void intel_resolve_for_dri2_flush(struct brw_context *brw,
>                                    __DRIdrawable *drawable);
>
>  GLboolean brwCreateContext(gl_api api,
> -                     const struct gl_config *mesaVis,
> -                     __DRIcontext *driContextPriv,
> -                      unsigned major_version,
> -                      unsigned minor_version,
> -                      uint32_t flags,
> -                      bool notify_reset,
> -                      unsigned *error,
> -                     void *sharedContextPrivate);
> +                           const struct gl_config *mesaVis,
> +                           __DRIcontext *driContextPriv,
> +                           unsigned major_version,
> +                           unsigned minor_version,
> +                           uint32_t flags,
> +                           bool notify_reset,
> +                           unsigned priority,
> +                           unsigned *error,
> +                           void *sharedContextPrivate);
>
>  /*======================================================================
>   * brw_misc_state.c
> diff --git a/src/mesa/drivers/dri/nouveau/nouveau_context.c b/src/mesa/drivers/dri/nouveau/nouveau_context.c
> index 6ddcadce1f..4c73fcb6c5 100644
> --- a/src/mesa/drivers/dri/nouveau/nouveau_context.c
> +++ b/src/mesa/drivers/dri/nouveau/nouveau_context.c
> @@ -55,6 +55,7 @@ nouveau_context_create(gl_api api,
>                        unsigned minor_version,
>                        uint32_t flags,
>                        bool notify_reset,
> +                       unsigned priority,
>                        unsigned *error,
>                        void *share_ctx)
>  {
> diff --git a/src/mesa/drivers/dri/nouveau/nouveau_context.h b/src/mesa/drivers/dri/nouveau/nouveau_context.h
> index b6cbde44ac..6ab865c7bd 100644
> --- a/src/mesa/drivers/dri/nouveau/nouveau_context.h
> +++ b/src/mesa/drivers/dri/nouveau/nouveau_context.h
> @@ -111,8 +111,8 @@ GLboolean
>  nouveau_context_create(gl_api api,
>                        const struct gl_config *visual, __DRIcontext *dri_ctx,
>                        unsigned major_version, unsigned minor_version,
> -                      uint32_t flags, bool notify_reset, unsigned *error,
> -                      void *share_ctx);
> +                      uint32_t flags, bool notify_reset, unsigned priority,
> +                      unsigned *error, void *share_ctx);
>
>  GLboolean
>  nouveau_context_init(struct gl_context *ctx, gl_api api,
> diff --git a/src/mesa/drivers/dri/r200/r200_context.c b/src/mesa/drivers/dri/r200/r200_context.c
> index 8f354c15b3..1f428d820a 100644
> --- a/src/mesa/drivers/dri/r200/r200_context.c
> +++ b/src/mesa/drivers/dri/r200/r200_context.c
> @@ -178,6 +178,7 @@ GLboolean r200CreateContext( gl_api api,
>                              unsigned minor_version,
>                              uint32_t flags,
>                               bool notify_reset,
> +                             unsigned priority,
>                              unsigned *error,
>                              void *sharedContextPrivate)
>  {
> diff --git a/src/mesa/drivers/dri/r200/r200_context.h b/src/mesa/drivers/dri/r200/r200_context.h
> index 07eae232c3..01b040cf4e 100644
> --- a/src/mesa/drivers/dri/r200/r200_context.h
> +++ b/src/mesa/drivers/dri/r200/r200_context.h
> @@ -633,6 +633,7 @@ extern GLboolean r200CreateContext( gl_api api,
>                                     unsigned minor_version,
>                                     uint32_t flags,
>                                      bool notify_reset,
> +                                    unsigned priority,
>                                     unsigned *error,
>                                     void *sharedContextPrivate);
>  extern GLboolean r200MakeCurrent( __DRIcontext *driContextPriv,
> diff --git a/src/mesa/drivers/dri/radeon/radeon_context.c b/src/mesa/drivers/dri/radeon/radeon_context.c
> index 5e15b46fb3..885510f213 100644
> --- a/src/mesa/drivers/dri/radeon/radeon_context.c
> +++ b/src/mesa/drivers/dri/radeon/radeon_context.c
> @@ -144,6 +144,7 @@ r100CreateContext( gl_api api,
>                    unsigned minor_version,
>                    uint32_t flags,
>                     bool notify_reset,
> +                  unsigned priority,
>                    unsigned *error,
>                    void *sharedContextPrivate)
>  {
> diff --git a/src/mesa/drivers/dri/radeon/radeon_context.h b/src/mesa/drivers/dri/radeon/radeon_context.h
> index 88a295386c..4124f50db5 100644
> --- a/src/mesa/drivers/dri/radeon/radeon_context.h
> +++ b/src/mesa/drivers/dri/radeon/radeon_context.h
> @@ -456,6 +456,7 @@ extern GLboolean r100CreateContext( gl_api api,
>                                     unsigned minor_version,
>                                     uint32_t flags,
>                                      bool notify_reset,
> +                                    unsigned priority,
>                                     unsigned *error,
>                                     void *sharedContextPrivate);
>
> diff --git a/src/mesa/drivers/dri/swrast/swrast.c b/src/mesa/drivers/dri/swrast/swrast.c
> index 0402232deb..b418132fc9 100644
> --- a/src/mesa/drivers/dri/swrast/swrast.c
> +++ b/src/mesa/drivers/dri/swrast/swrast.c
> @@ -750,6 +750,7 @@ dri_create_context(gl_api api,
>                    unsigned minor_version,
>                    uint32_t flags,
>                    bool notify_reset,
> +                  unsigned priority,
>                    unsigned *error,
>                    void *sharedContextPrivate)
>  {
> --
> 2.11.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list