xserver would like not to expose (say) ARB_robustness_isolation if the driver doesn't actually support it, as it's pretty cruel to claim a feature works but always throw BadFBConfig if you try to use it. Add a hook to the dri2 and swrast extensions to query the supported context flags, initialize the set in InitScreen, and check that set in the driver CreateContextAttribs hook instead of open-coding.
Signed-off-by: Adam Jackson <a...@redhat.com> --- include/GL/internal/dri_interface.h | 20 ++++++++++++++++++-- src/gallium/state_trackers/dri/dri2.c | 6 ++++++ src/gallium/state_trackers/dri/dri_context.c | 7 +------ src/gallium/state_trackers/dri/drisw.c | 3 +++ src/mesa/drivers/dri/common/dri_util.c | 12 ++++++++++-- src/mesa/drivers/dri/common/dri_util.h | 1 + src/mesa/drivers/dri/i915/intel_screen.c | 3 ++- src/mesa/drivers/dri/i965/brw_context.c | 11 +---------- src/mesa/drivers/dri/i965/intel_screen.c | 5 +++++ 9 files changed, 47 insertions(+), 21 deletions(-) diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h index c827bb6..2b360e6 100644 --- a/include/GL/internal/dri_interface.h +++ b/include/GL/internal/dri_interface.h @@ -785,13 +785,16 @@ struct __DRIlegacyExtensionRec { void *loaderPrivate); }; +typedef uint32_t +(*__DRIcontextFlagsFunc)(__DRIscreen *screen); + /** * This extension provides alternative screen, drawable and context * constructors for swrast DRI functionality. This is used in * conjunction with the core extension. */ #define __DRI_SWRAST "DRI_SWRast" -#define __DRI_SWRAST_VERSION 4 +#define __DRI_SWRAST_VERSION 5 struct __DRIswrastExtensionRec { __DRIextension base; @@ -839,6 +842,12 @@ struct __DRIswrastExtensionRec { const __DRIconfig ***driver_configs, void *loaderPrivate); + /** + * Union of context flags accepted by createContextAttribs + * + * \since version 5 + */ + __DRIcontextFlagsFunc contextFlags; }; /** Common DRI function definitions, shared among DRI2 and Image extensions @@ -953,7 +962,7 @@ struct __DRIdri2LoaderExtensionRec { * constructors for DRI2. */ #define __DRI_DRI2 "DRI_DRI2" -#define __DRI_DRI2_VERSION 4 +#define __DRI_DRI2_VERSION 5 #define __DRI_API_OPENGL 0 /**< OpenGL compatibility profile */ #define __DRI_API_GLES 1 /**< OpenGL ES 1.x */ @@ -1058,6 +1067,13 @@ struct __DRIdri2ExtensionRec { * \since version 4 */ __DRIcreateNewScreen2Func createNewScreen2; + + /** + * Union of context flags accepted by createContextAttribs + * + * \since version 5 + */ + __DRIcontextFlagsFunc contextFlags; }; diff --git a/src/gallium/state_trackers/dri/dri2.c b/src/gallium/state_trackers/dri/dri2.c index 792d565..7c277d7 100644 --- a/src/gallium/state_trackers/dri/dri2.c +++ b/src/gallium/state_trackers/dri/dri2.c @@ -1490,6 +1490,12 @@ dri2_init_screen(__DRIscreen * sPriv) else sPriv->extensions = dri_screen_extensions; + sPriv->context_flags = __DRI_CTX_FLAG_DEBUG | + __DRI_CTX_FLAG_FORWARD_COMPATIBLE; + + if (screen->has_reset_status_query) + sPriv->context_flags |= __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS; + /* dri_init_screen_helper checks pscreen for us */ #if GALLIUM_STATIC_TARGETS diff --git a/src/gallium/state_trackers/dri/dri_context.c b/src/gallium/state_trackers/dri/dri_context.c index 9f11b15..62ab603 100644 --- a/src/gallium/state_trackers/dri/dri_context.c +++ b/src/gallium/state_trackers/dri/dri_context.c @@ -56,13 +56,8 @@ dri_create_context(gl_api api, const struct gl_config * visual, struct st_context_iface *st_share = NULL; struct st_context_attribs attribs; enum st_context_error ctx_err = 0; - unsigned allowed_flags = __DRI_CTX_FLAG_DEBUG | - __DRI_CTX_FLAG_FORWARD_COMPATIBLE; - if (screen->has_reset_status_query) - allowed_flags |= __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS; - - if (flags & ~allowed_flags) { + if (flags & ~sPriv->context_flags) { *error = __DRI_CTX_ERROR_UNKNOWN_FLAG; goto fail; } diff --git a/src/gallium/state_trackers/dri/drisw.c b/src/gallium/state_trackers/dri/drisw.c index 4a2c1bb..7b2daa9 100644 --- a/src/gallium/state_trackers/dri/drisw.c +++ b/src/gallium/state_trackers/dri/drisw.c @@ -361,6 +361,9 @@ drisw_init_screen(__DRIscreen * sPriv) sPriv->driverPrivate = (void *)screen; sPriv->extensions = drisw_screen_extensions; + sPriv->context_flags = __DRI_CTX_FLAG_DEBUG | + __DRI_CTX_FLAG_FORWARD_COMPATIBLE; + pscreen = drisw_create_screen(&drisw_lf); /* dri_init_screen_helper checks pscreen for us */ diff --git a/src/mesa/drivers/dri/common/dri_util.c b/src/mesa/drivers/dri/common/dri_util.c index d6e875f..90b2d6d 100644 --- a/src/mesa/drivers/dri/common/dri_util.c +++ b/src/mesa/drivers/dri/common/dri_util.c @@ -471,6 +471,12 @@ driCreateNewContext(__DRIscreen *screen, const __DRIconfig *config, config, shared, data); } +static uint32_t +driContextFlags(__DRIscreen *screen) +{ + return screen->context_flags; +} + /** * Destroy the per-context private information. * @@ -753,7 +759,7 @@ const __DRIcoreExtension driCoreExtension = { /** DRI2 interface */ const __DRIdri2Extension driDRI2Extension = { - .base = { __DRI_DRI2, 4 }, + .base = { __DRI_DRI2, 5 }, .createNewScreen = dri2CreateNewScreen, .createNewDrawable = driCreateNewDrawable, @@ -764,16 +770,18 @@ const __DRIdri2Extension driDRI2Extension = { .releaseBuffer = dri2ReleaseBuffer, .createContextAttribs = driCreateContextAttribs, .createNewScreen2 = driCreateNewScreen2, + .contextFlags = driContextFlags, }; const __DRIswrastExtension driSWRastExtension = { - .base = { __DRI_SWRAST, 4 }, + .base = { __DRI_SWRAST, 5 }, .createNewScreen = driSWRastCreateNewScreen, .createNewDrawable = driCreateNewDrawable, .createNewContextForAPI = driCreateNewContextForAPI, .createContextAttribs = driCreateContextAttribs, .createNewScreen2 = driSWRastCreateNewScreen2, + .contextFlags = driContextFlags, }; const __DRI2configQueryExtension dri2ConfigQueryExtension = { diff --git a/src/mesa/drivers/dri/common/dri_util.h b/src/mesa/drivers/dri/common/dri_util.h index 1138bf1..3baa949 100644 --- a/src/mesa/drivers/dri/common/dri_util.h +++ b/src/mesa/drivers/dri/common/dri_util.h @@ -187,6 +187,7 @@ struct __DRIscreenRec { driOptionCache optionCache; unsigned int api_mask; + uint32_t context_flags; }; /** diff --git a/src/mesa/drivers/dri/i915/intel_screen.c b/src/mesa/drivers/dri/i915/intel_screen.c index 77af328..19c5cd3 100644 --- a/src/mesa/drivers/dri/i915/intel_screen.c +++ b/src/mesa/drivers/dri/i915/intel_screen.c @@ -959,7 +959,7 @@ intelCreateContext(gl_api api, __DRIscreen *sPriv = driContextPriv->driScreenPriv; struct intel_screen *intelScreen = sPriv->driverPrivate; - if (flags & ~__DRI_CTX_FLAG_DEBUG) { + if (flags & ~sPriv->context_flags) { *error = __DRI_CTX_ERROR_UNKNOWN_FLAG; return false; } @@ -1188,6 +1188,7 @@ __DRIconfig **intelInitScreen2(__DRIscreen *psp) set_max_gl_versions(intelScreen); psp->extensions = intelScreenExtensions; + psp->context_flags = __DRI_CTX_FLAG_DEBUG; return (const __DRIconfig**) intel_screen_make_configs(psp); } diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c index ea56859..36e5b4c 100644 --- a/src/mesa/drivers/dri/i965/brw_context.c +++ b/src/mesa/drivers/dri/i965/brw_context.c @@ -713,16 +713,7 @@ brwCreateContext(gl_api api, const struct brw_device_info *devinfo = screen->devinfo; struct dd_function_table functions; - /* Only allow the __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS flag if the kernel - * provides us with context reset notifications. - */ - uint32_t allowed_flags = __DRI_CTX_FLAG_DEBUG - | __DRI_CTX_FLAG_FORWARD_COMPATIBLE; - - if (screen->has_context_reset_notification) - allowed_flags |= __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS; - - if (flags & ~allowed_flags) { + if (flags & ~sPriv->context_flags) { *dri_ctx_error = __DRI_CTX_ERROR_UNKNOWN_FLAG; return false; } diff --git a/src/mesa/drivers/dri/i965/intel_screen.c b/src/mesa/drivers/dri/i965/intel_screen.c index 896a125..92dd9d0 100644 --- a/src/mesa/drivers/dri/i965/intel_screen.c +++ b/src/mesa/drivers/dri/i965/intel_screen.c @@ -1417,6 +1417,11 @@ __DRIconfig **intelInitScreen2(__DRIscreen *psp) psp->extensions = !intelScreen->has_context_reset_notification ? intelScreenExtensions : intelRobustScreenExtensions; + psp->context_flags =__DRI_CTX_FLAG_DEBUG + | __DRI_CTX_FLAG_FORWARD_COMPATIBLE; + if (intelScreen->has_context_reset_notification) + psp->context_flags |= __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS; + intelScreen->compiler = brw_compiler_create(intelScreen, intelScreen->devinfo); -- 2.4.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev