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

Ben Widawsky ben at bwidawsk.net
Tue Apr 11 18:01:13 UTC 2017


On 17-04-11 17:11:55, Chris Wilson 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 creator before
>passing it to the driver as a function parameter.
>
>In order to not require us to pass back the actual value of the context
>priority after creation, we impose that drivers should report the
>available set of priorities during screen setup (and then they may chose
>to fail if given an invalid value as that should have been checked at
>the user boundary.)
>
>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/gallium/state_trackers/dri/dri_context.c   |  1 +
> src/gallium/state_trackers/dri/dri_context.h   |  1 +
> 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 +
> 16 files changed, 77 insertions(+), 30 deletions(-)
>
>diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h
>index 9881ddcbb0..969d304a95 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
>+

Kind of annoying to redefine these yet again. I suppose you could try to reuse
the HAS_CTR_PRIORITY bits?

> /**
>  * \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 0c2fdc1cc2..7628a9d5b1 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)
> {
>@@ -1054,7 +1056,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;
>@@ -1090,6 +1092,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;
>@@ -1193,8 +1217,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))
>@@ -1213,8 +1237,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))
>@@ -1242,8 +1266,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/gallium/state_trackers/dri/dri_context.c b/src/gallium/state_trackers/dri/dri_context.c
>index 92d79849c4..e37643bcfa 100644
>--- a/src/gallium/state_trackers/dri/dri_context.c
>+++ b/src/gallium/state_trackers/dri/dri_context.c
>@@ -46,6 +46,7 @@ dri_create_context(gl_api api, const struct gl_config * visual,
> 		   unsigned minor_version,
> 		   uint32_t flags,
>                    bool notify_reset,
>+                   unsigned priority,
> 		   unsigned *error,
> 		   void *sharedContextPrivate)
> {
>diff --git a/src/gallium/state_trackers/dri/dri_context.h b/src/gallium/state_trackers/dri/dri_context.h
>index 96f06442fa..afa9c49ff3 100644
>--- a/src/gallium/state_trackers/dri/dri_context.h
>+++ b/src/gallium/state_trackers/dri/dri_context.h
>@@ -90,6 +90,7 @@ dri_create_context(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/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 7e17e95ee4..1dbb181c52 100644
>--- a/src/mesa/drivers/dri/i915/intel_screen.c
>+++ b/src/mesa/drivers/dri/i915/intel_screen.c
>@@ -956,13 +956,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 1247d0355f..f13c61b3e0 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 7b354c4f7e..2f752505a3 100644
>--- a/src/mesa/drivers/dri/i965/brw_context.h
>+++ b/src/mesa/drivers/dri/i965/brw_context.h
>@@ -1269,14 +1269,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 f43ac608cf..8416616388 100644
>--- a/src/mesa/drivers/dri/swrast/swrast.c
>+++ b/src/mesa/drivers/dri/swrast/swrast.c
>@@ -752,6 +752,7 @@ dri_create_context(gl_api api,
> 		   unsigned minor_version,
> 		   uint32_t flags,
> 		   bool notify_reset,
>+		   unsigned priority,
> 		   unsigned *error,
> 		   void *sharedContextPrivate)
> {

LGTM on i965 (i915) and dri bits.
Acked-by: Ben Widawsky <ben at bwidawsk.net>

-- 
Ben Widawsky, Intel Open Source Technology Center


More information about the mesa-dev mailing list