Print an error message for the user if the requirement isn't met, or we're not thread safe.
v2: based on Nicolai feedbacks Check the DRI extension version v3: based on Emil feedbacks improve commit and error messages. use backgroundCallable variable to improve readability Signed-off-by: Gregory Hainaut <gregory.hain...@gmail.com> --- src/gallium/state_trackers/dri/dri_context.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/gallium/state_trackers/dri/dri_context.c b/src/gallium/state_trackers/dri/dri_context.c index 92d79849c4..8cbab5359f 100644 --- a/src/gallium/state_trackers/dri/dri_context.c +++ b/src/gallium/state_trackers/dri/dri_context.c @@ -51,20 +51,22 @@ dri_create_context(gl_api api, const struct gl_config * visual, { __DRIscreen *sPriv = cPriv->driScreenPriv; struct dri_screen *screen = dri_screen(sPriv); struct st_api *stapi = screen->st_api; struct dri_context *ctx = NULL; 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; + const __DRIbackgroundCallableExtension *backgroundCallable = + screen->sPriv->dri2.backgroundCallable; if (screen->has_reset_status_query) allowed_flags |= __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS; if (flags & ~allowed_flags) { *error = __DRI_CTX_ERROR_UNKNOWN_FLAG; goto fail; } if (!screen->has_reset_status_query && notify_reset) { @@ -151,24 +153,35 @@ dri_create_context(gl_api api, const struct gl_config * visual, ctx->st->st_manager_private = (void *) ctx; ctx->stapi = stapi; if (ctx->st->cso_context) { ctx->pp = pp_init(ctx->st->pipe, screen->pp_enabled, ctx->st->cso_context); ctx->hud = hud_create(ctx->st->pipe, ctx->st->cso_context); } /* Do this last. */ if (ctx->st->start_thread && - /* the driver loader must implement this */ - screen->sPriv->dri2.backgroundCallable && - driQueryOptionb(&screen->optionCache, "mesa_glthread")) - ctx->st->start_thread(ctx->st); + driQueryOptionb(&screen->optionCache, "mesa_glthread")) { + + if (backgroundCallable && backgroundCallable->base.version >= 2 && + driQueryOptionb(&screen->optionCache, "mesa_glthread")) { + + if (backgroundCallable->isThreadSafe(cPriv->loaderPrivate)) + ctx->st->start_thread(ctx->st); + else + fprintf(stderr, "dri_create_context: glthread isn't thread safe " + "- missing call XInitThreads\n"); + } else { + fprintf(stderr, "dri_create_context: requested glthread but driver " + "is missing backgroundCallable V2 extension\n"); + } + } *error = __DRI_CTX_ERROR_SUCCESS; return GL_TRUE; fail: if (ctx && ctx->st) ctx->st->destroy(ctx->st); free(ctx); return GL_FALSE; -- 2.11.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev