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

Chris Wilson chris at chris-wilson.co.uk
Thu Apr 6 19:12:36 UTC 2017


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?

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



More information about the mesa-dev mailing list