egl,dri: Propagate context priority hint to driver->CreateContext

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@chris-wilson.co.uk>
Acked-by: Ben Widawsky <ben@bwidawsk.net> # i915/i965
Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
Reviewed-by: Eric Engestrom <eric.engestrom@imgtec.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
Chris Wilson 2016-10-27 19:54:49 +01:00
parent 95ecf3df62
commit 5c5618338a
16 changed files with 77 additions and 30 deletions

View file

@ -1100,6 +1100,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
*/

View file

@ -92,6 +92,8 @@
#define DRM_FORMAT_MOD_INVALID ((1ULL<<56) - 1)
#endif
#define NUM_ATTRIBS 10
static void
dri_set_background_context(void *loaderPrivate)
{
@ -1166,7 +1168,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;
@ -1203,6 +1205,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;
@ -1317,8 +1341,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))
@ -1337,8 +1361,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))
@ -1366,8 +1390,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))

View file

@ -47,6 +47,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)
{

View file

@ -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);

View file

@ -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.
@ -451,7 +455,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;
}

View file

@ -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);

View file

@ -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;

View file

@ -820,14 +820,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;

View file

@ -1240,14 +1240,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

View file

@ -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)
{

View file

@ -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,

View file

@ -178,6 +178,7 @@ GLboolean r200CreateContext( gl_api api,
unsigned minor_version,
uint32_t flags,
bool notify_reset,
unsigned priority,
unsigned *error,
void *sharedContextPrivate)
{

View file

@ -632,6 +632,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,

View file

@ -144,6 +144,7 @@ r100CreateContext( gl_api api,
unsigned minor_version,
uint32_t flags,
bool notify_reset,
unsigned priority,
unsigned *error,
void *sharedContextPrivate)
{

View file

@ -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);

View file

@ -756,6 +756,7 @@ dri_create_context(gl_api api,
unsigned minor_version,
uint32_t flags,
bool notify_reset,
unsigned priority,
unsigned *error,
void *sharedContextPrivate)
{