[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