On Wednesday, April 12, 2017 3:11:53 AM PDT Chris Wilson wrote: > IMG_context_priority > https://www.khronos.org/registry/egl/extensions/IMG/EGL_IMG_context_priority.txt > > "This extension allows an EGLContext to be created with a priority > hint. It is possible that an implementation will not honour the > hint, especially if there are constraints on the number of high > priority contexts available in the system, or system policy limits > access to high priority contexts to appropriate system privilege > level. A query is provided to find the real priority level assigned > to the context after creation." > > The extension adds a new eglCreateContext attribute for choosing a > priority hint. This stub parses the attribute and copies into the base > struct _egl_context, and hooks up the query similarly. > > Since the attribute is purely a hint, I have no qualms about the lack of > implementation before reporting back the value the user gave! > > v2: Remember to set the default ContextPriority value to medium. > v3: Use the driRendererQuery interface to probe the backend for > supported priority values and use those to mask the EGL interface. > v4: Treat the priority attrib as a hint and gracefully mask any requests > not supported by the driver, the EGLContext will remain at medium > priority. > > Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> > Cc: Rob Clark <robdcl...@gmail.com> > Reviewed-by: Ben Widawsky <b...@bwidawsk.net> > --- > include/GL/internal/dri_interface.h | 8 +++++ > src/egl/drivers/dri2/egl_dri2.c | 5 ++++ > src/egl/main/eglapi.c | 2 ++ > src/egl/main/eglcontext.c | 58 > +++++++++++++++++++++++++++++++++++++ > src/egl/main/eglcontext.h | 1 + > src/egl/main/egldisplay.h | 5 ++++ > 6 files changed, 79 insertions(+) > > diff --git a/include/GL/internal/dri_interface.h > b/include/GL/internal/dri_interface.h > index 86efd1bdc9..9881ddcbb0 100644 > --- a/include/GL/internal/dri_interface.h > +++ b/include/GL/internal/dri_interface.h > @@ -1604,6 +1604,14 @@ typedef struct __DRIDriverVtableExtensionRec { > */ > #define __DRI2_RENDERER_HAS_FRAMEBUFFER_SRGB 0x000c > > +/* Bitmaks of supported/available context priorities - must match > + * __EGL_CONTEXT_PRIORITY_LOW_BIT et al > + */ > +#define __DRI2_RENDERER_HAS_CONTEXT_PRIORITY 0x000d > +#define __DRI2_RENDERER_HAS_CONTEXT_PRIORITY_LOW (1 << 0) > +#define __DRI2_RENDERER_HAS_CONTEXT_PRIORITY_MEDIUM (1 << 1) > +#define __DRI2_RENDERER_HAS_CONTEXT_PRIORITY_HIGH (1 << 2) > + > typedef struct __DRI2rendererQueryExtensionRec __DRI2rendererQueryExtension; > struct __DRI2rendererQueryExtensionRec { > __DRIextension base; > diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c > index 2cab7d00c1..0c2fdc1cc2 100644 > --- a/src/egl/drivers/dri2/egl_dri2.c > +++ b/src/egl/drivers/dri2/egl_dri2.c > @@ -663,6 +663,11 @@ dri2_setup_screen(_EGLDisplay *disp) > disp->Extensions.KHR_no_config_context = EGL_TRUE; > disp->Extensions.KHR_surfaceless_context = EGL_TRUE; > > + /* Report back to EGL the bitmask of priorities supported */ > + disp->Extensions.IMG_context_priority = > + dri2_renderer_query_integer(dri2_dpy, > + __DRI2_RENDERER_HAS_CONTEXT_PRIORITY); > + > if (dri2_renderer_query_integer(dri2_dpy, > __DRI2_RENDERER_HAS_FRAMEBUFFER_SRGB)) > disp->Extensions.KHR_gl_colorspace = EGL_TRUE; > diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c > index 5694b5a4ca..9ed65b1bba 100644 > --- a/src/egl/main/eglapi.c > +++ b/src/egl/main/eglapi.c > @@ -490,6 +490,8 @@ _eglCreateExtensionsString(_EGLDisplay *dpy) > _EGL_CHECK_EXTENSION(EXT_image_dma_buf_import); > _EGL_CHECK_EXTENSION(EXT_swap_buffers_with_damage); > > + _EGL_CHECK_EXTENSION(IMG_context_priority); > + > _EGL_CHECK_EXTENSION(KHR_cl_event2); > _EGL_CHECK_EXTENSION(KHR_config_attribs); > _EGL_CHECK_EXTENSION(KHR_create_context); > diff --git a/src/egl/main/eglcontext.c b/src/egl/main/eglcontext.c > index 05cc523c8d..de3e0c3381 100644 > --- a/src/egl/main/eglcontext.c > +++ b/src/egl/main/eglcontext.c > @@ -312,6 +312,60 @@ _eglParseContextAttribList(_EGLContext *ctx, _EGLDisplay > *dpy, > ctx->Flags |= EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR; > break; > > + case EGL_CONTEXT_PRIORITY_LEVEL_IMG: > + /* The EGL_IMG_context_priority spec says: > + * > + * "EGL_CONTEXT_PRIORITY_LEVEL_IMG determines the priority level of > + * the context to be created. This attribute is a hint, as an > + * implementation may not support multiple contexts at some > + * priority levels and system policy may limit access to high > + * priority contexts to appropriate system privilege level. The > + * default value for EGL_CONTEXT_PRIORITY_LEVEL_IMG is > + * EGL_CONTEXT_PRIORITY_MEDIUM_IMG." > + */ > + {
Mesa coding style is a bit weird here, you'd actually do: case EGL_CONTEXT_PRIORITY_LEVEL_IMG: { /* The EGL_IMG_context_priority spec says: ... */ int bit; break; } i.e. everything here should be unindented one level. This patch looks good to me. It seems like a reasonable way for drivers to report what priorities they accept, choose a priority, and report what was chosen... Reviewed-by: Kenneth Graunke <kenn...@whitecape.org> > + int bit; > + > + switch (val) { > + case EGL_CONTEXT_PRIORITY_HIGH_IMG: > + bit = __EGL_CONTEXT_PRIORITY_HIGH_BIT; > + break; > + case EGL_CONTEXT_PRIORITY_MEDIUM_IMG: > + bit = __EGL_CONTEXT_PRIORITY_MEDIUM_BIT; > + break; > + case EGL_CONTEXT_PRIORITY_LOW_IMG: > + bit = __EGL_CONTEXT_PRIORITY_LOW_BIT; > + break; > + default: > + bit = -1; > + break; > + } > + > + if (bit < 0) { > + err = EGL_BAD_ATTRIBUTE; > + break; > + } > + > + /* "This extension allows an EGLContext to be created with a > + * priority hint. It is possible that an implementation will not > + * honour the hint, especially if there are constraints on the > + * number of high priority contexts available in the system, or > + * system policy limits access to high priority contexts to > + * appropriate system privilege level. A query is provided to > find > + * the real priority level assigned to the context after > creation." > + * > + * We currently assume that the driver applies the priority hint > + * and filters out any it cannot handle during the screen setup, > + * e.g. dri2_setup_screen(). As such we can mask any change that > + * the driver would fail, and ctx->ContextPriority matches the > + * hint applied to the driver/hardware backend. > + */ > + if (dpy->Extensions.IMG_context_priority & (1 << bit)) > + ctx->ContextPriority = val; > + > + break; > + } > + > default: > err = EGL_BAD_ATTRIBUTE; > break; > @@ -505,6 +559,7 @@ _eglInitContext(_EGLContext *ctx, _EGLDisplay *dpy, > _EGLConfig *conf, > ctx->Flags = 0; > ctx->Profile = EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR; > ctx->ResetNotificationStrategy = EGL_NO_RESET_NOTIFICATION_KHR; > + ctx->ContextPriority = EGL_CONTEXT_PRIORITY_MEDIUM_IMG; > > err = _eglParseContextAttribList(ctx, dpy, attrib_list); > if (err == EGL_SUCCESS && ctx->Config) { > @@ -570,6 +625,9 @@ _eglQueryContext(_EGLDriver *drv, _EGLDisplay *dpy, > _EGLContext *c, > case EGL_RENDER_BUFFER: > *value = _eglQueryContextRenderBuffer(c); > break; > + case EGL_CONTEXT_PRIORITY_LEVEL_IMG: > + *value = c->ContextPriority; > + break; > default: > return _eglError(EGL_BAD_ATTRIBUTE, "eglQueryContext"); > } > diff --git a/src/egl/main/eglcontext.h b/src/egl/main/eglcontext.h > index f2fe806626..e8c2d7d4f3 100644 > --- a/src/egl/main/eglcontext.h > +++ b/src/egl/main/eglcontext.h > @@ -62,6 +62,7 @@ struct _egl_context > EGLint Flags; > EGLint Profile; > EGLint ResetNotificationStrategy; > + EGLint ContextPriority; > > /* The real render buffer when a window surface is bound */ > EGLint WindowRenderBuffer; > diff --git a/src/egl/main/egldisplay.h b/src/egl/main/egldisplay.h > index 6c1049d23c..449ddb7b48 100644 > --- a/src/egl/main/egldisplay.h > +++ b/src/egl/main/egldisplay.h > @@ -104,6 +104,11 @@ struct _egl_extensions > EGLBoolean EXT_image_dma_buf_import; > EGLBoolean EXT_swap_buffers_with_damage; > > + unsigned int IMG_context_priority; > +#define __EGL_CONTEXT_PRIORITY_LOW_BIT 0 > +#define __EGL_CONTEXT_PRIORITY_MEDIUM_BIT 1 > +#define __EGL_CONTEXT_PRIORITY_HIGH_BIT 2 > + > EGLBoolean KHR_cl_event2; > EGLBoolean KHR_config_attribs; > EGLBoolean KHR_create_context; >
signature.asc
Description: This is a digitally signed message part.
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev