diff options
-rw-r--r-- | include/GL/internal/dri_interface.h | 8 | ||||
-rw-r--r-- | src/egl/drivers/dri2/egl_dri2.c | 5 | ||||
-rw-r--r-- | src/egl/main/eglapi.c | 2 | ||||
-rw-r--r-- | src/egl/main/eglcontext.c | 58 | ||||
-rw-r--r-- | src/egl/main/eglcontext.h | 1 | ||||
-rw-r--r-- | src/egl/main/egldisplay.h | 5 |
6 files changed, 79 insertions, 0 deletions
diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h index aefba92c024..7ed0169a984 100644 --- a/include/GL/internal/dri_interface.h +++ b/include/GL/internal/dri_interface.h @@ -1782,6 +1782,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 d7a88b29844..e18e05e4a99 100644 --- a/src/egl/drivers/dri2/egl_dri2.c +++ b/src/egl/drivers/dri2/egl_dri2.c @@ -687,6 +687,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 38fc9311cb8..215332f99cb 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_modifiers); _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 1b03160439a..8c64f9ab82e 100644 --- a/src/egl/main/eglcontext.c +++ b/src/egl/main/eglcontext.c @@ -332,6 +332,60 @@ _eglParseContextAttribList(_EGLContext *ctx, _EGLDisplay *dpy, ctx->NoError = !!val; 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." + */ + { + 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; @@ -533,6 +587,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) { @@ -598,6 +653,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 0667622ba15..a7523683136 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; EGLBoolean NoError; /* The real render buffer when a window surface is bound */ diff --git a/src/egl/main/egldisplay.h b/src/egl/main/egldisplay.h index da5339b7bf9..952bfe53f00 100644 --- a/src/egl/main/egldisplay.h +++ b/src/egl/main/egldisplay.h @@ -105,6 +105,11 @@ struct _egl_extensions EGLBoolean EXT_image_dma_buf_import_modifiers; 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; |