On Thu, Apr 6, 2017 at 3:12 PM, Chris Wilson <ch...@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 <ch...@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@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev