X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fglx%2Fdri3_glx.c;h=796fc26d9ddceec1c1cad18609a4ce9476991728;hb=c96407f37ef8325db11ae5fdb16e372cbc663bf4;hp=f280a8cef77798dc78430bce86c7c243f9e1cec8;hpb=d5559292394f0e9b1c682baca05f81366fb389af;p=mesa.git diff --git a/src/glx/dri3_glx.c b/src/glx/dri3_glx.c index f280a8cef77..796fc26d9dd 100644 --- a/src/glx/dri3_glx.c +++ b/src/glx/dri3_glx.c @@ -116,6 +116,16 @@ glx_dri3_get_dri_context(struct loader_dri3_drawable *draw) return (gc != &dummyContext) ? dri3Ctx->driContext : NULL; } +static __DRIscreen * +glx_dri3_get_dri_screen(void) +{ + struct glx_context *gc = __glXGetCurrentContext(); + struct dri3_context *pcp = (struct dri3_context *) gc; + struct dri3_screen *psc = (struct dri3_screen *) pcp->base.psc; + + return (gc != &dummyContext && psc) ? psc->driScreen : NULL; +} + static void glx_dri3_flush_drawable(struct loader_dri3_drawable *draw, unsigned flags) { @@ -150,6 +160,7 @@ static const struct loader_dri3_vtable glx_dri3_vtable = { .set_drawable_size = glx_dri3_set_drawable_size, .in_current_context = glx_dri3_in_current_context, .get_dri_context = glx_dri3_get_dri_context, + .get_dri_screen = glx_dri3_get_dri_screen, .flush_drawable = glx_dri3_flush_drawable, .show_fps = glx_dri3_show_fps, }; @@ -248,6 +259,10 @@ dri3_create_context_attribs(struct glx_screen *base, &reset, &release, error)) goto error_exit; + if (!dri2_check_no_error(flags, shareList, major_ver, error)) { + goto error_exit; + } + /* Check the renderType value */ if (!validate_renderType_against_config(config_base, render_type)) goto error_exit; @@ -292,6 +307,9 @@ dri3_create_context_attribs(struct glx_screen *base, * GLX_CONTEXT_*_BIT values. */ ctx_attribs[num_ctx_attribs++] = flags; + + if (flags & __DRI_CTX_FLAG_NO_ERROR) + pcp->base.noError = GL_TRUE; } pcp->driContext = @@ -347,6 +365,11 @@ dri3_create_drawable(struct glx_screen *base, XID xDrawable, struct dri3_drawable *pdraw; struct dri3_screen *psc = (struct dri3_screen *) base; __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) config_base; + bool has_multibuffer = false; +#ifdef HAVE_DRI3_MODIFIERS + const struct dri3_display *const pdp = (struct dri3_display *) + base->display->dri3Display; +#endif pdraw = calloc(1, sizeof(*pdraw)); if (!pdraw) @@ -357,11 +380,20 @@ dri3_create_drawable(struct glx_screen *base, XID xDrawable, pdraw->base.drawable = drawable; pdraw->base.psc = &psc->base; +#ifdef HAVE_DRI3_MODIFIERS + if ((psc->image && psc->image->base.version >= 15) && + (pdp->dri3Major > 1 || (pdp->dri3Major == 1 && pdp->dri3Minor >= 2)) && + (pdp->presentMajor > 1 || + (pdp->presentMajor == 1 && pdp->presentMinor >= 2))) + has_multibuffer = true; +#endif + (void) __glXInitialize(psc->base.dpy); if (loader_dri3_drawable_init(XGetXCBConnection(base->dpy), xDrawable, psc->driScreen, - psc->is_different_gpu, config->driConfig, + psc->is_different_gpu, has_multibuffer, + config->driConfig, &psc->loader_dri3_ext, &glx_dri3_vtable, &pdraw->loader_drawable)) { free(pdraw); @@ -617,7 +649,6 @@ dri3_set_swap_interval(__GLXDRIdrawable *pdraw, int interval) break; } - priv->swap_interval = interval; loader_dri3_set_swap_interval(&priv->loader_drawable, interval); return 0; @@ -634,7 +665,7 @@ dri3_get_swap_interval(__GLXDRIdrawable *pdraw) struct dri3_drawable *priv = (struct dri3_drawable *) pdraw; - return priv->swap_interval; + return priv->loader_drawable.swap_interval; } static void @@ -710,7 +741,6 @@ dri3_bind_extensions(struct dri3_screen *psc, struct glx_display * priv, extensions = psc->core->getExtensions(psc->driScreen); - __glXEnableDirectExtension(&psc->base, "GLX_SGI_video_sync"); __glXEnableDirectExtension(&psc->base, "GLX_SGI_swap_control"); __glXEnableDirectExtension(&psc->base, "GLX_MESA_swap_control"); __glXEnableDirectExtension(&psc->base, "GLX_SGI_make_current_read"); @@ -756,6 +786,10 @@ dri3_bind_extensions(struct dri3_screen *psc, struct glx_display * priv, __glXEnableDirectExtension(&psc->base, "GLX_ARB_create_context_robustness"); + if (strcmp(extensions[i]->name, __DRI2_NO_ERROR) == 0) + __glXEnableDirectExtension(&psc->base, + "GLX_ARB_create_context_no_error"); + if (strcmp(extensions[i]->name, __DRI2_RENDERER_QUERY) == 0) { psc->rendererQuery = (__DRI2rendererQueryExtension *) extensions[i]; __glXEnableDirectExtension(&psc->base, "GLX_MESA_query_renderer"); @@ -837,13 +871,7 @@ dri3_create_screen(int screen, struct glx_display * priv) goto handle_error; } - psc->driver = driOpenDriver(driverName); - if (psc->driver == NULL) { - ErrorMessageF("driver pointer missing\n"); - goto handle_error; - } - - extensions = driGetDriverExtensions(psc->driver, driverName); + extensions = driOpenDriver(driverName, &psc->driver); if (extensions == NULL) goto handle_error; @@ -945,6 +973,11 @@ dri3_create_screen(int screen, struct glx_display * priv) &disable) || !disable) __glXEnableDirectExtension(&psc->base, "GLX_OML_sync_control"); + if (psc->config->configQueryb(psc->driScreen, + "glx_disable_sgi_video_sync", + &disable) || !disable) + __glXEnableDirectExtension(&psc->base, "GLX_SGI_video_sync"); + psp->copySubBuffer = dri3_copy_sub_buffer; __glXEnableDirectExtension(&psc->base, "GLX_MESA_copy_sub_buffer"); @@ -966,7 +999,7 @@ dri3_create_screen(int screen, struct glx_display * priv) return &psc->base; handle_error: - CriticalErrorMessageF("failed to load driver: %s\n", driverName); + CriticalErrorMessageF("failed to load driver: %s\n", driverName ? driverName : "(null)"); if (configs) glx_config_destroy_list(configs); @@ -997,6 +1030,18 @@ dri3_destroy_display(__GLXDRIdisplay * dpy) free(dpy); } +/* Only request versions of these protocols which we actually support. */ +#define DRI3_SUPPORTED_MAJOR 1 +#define PRESENT_SUPPORTED_MAJOR 1 + +#ifdef HAVE_DRI3_MODIFIERS +#define DRI3_SUPPORTED_MINOR 2 +#define PRESENT_SUPPORTED_MINOR 2 +#else +#define PRESENT_SUPPORTED_MINOR 0 +#define DRI3_SUPPORTED_MINOR 0 +#endif + /** dri3_create_display * * Allocate, initialize and return a __DRIdisplayPrivate object. @@ -1028,13 +1073,11 @@ dri3_create_display(Display * dpy) return NULL; dri3_cookie = xcb_dri3_query_version(c, - XCB_DRI3_MAJOR_VERSION, - XCB_DRI3_MINOR_VERSION); - - + DRI3_SUPPORTED_MAJOR, + DRI3_SUPPORTED_MINOR); present_cookie = xcb_present_query_version(c, - XCB_PRESENT_MAJOR_VERSION, - XCB_PRESENT_MINOR_VERSION); + PRESENT_SUPPORTED_MAJOR, + PRESENT_SUPPORTED_MINOR); pdp = malloc(sizeof *pdp); if (pdp == NULL)