From a48a6b8a400e6e92961cf7b7b4c287e8e9875f39 Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Tue, 14 Nov 2017 15:13:05 -0500 Subject: [PATCH] glx: Prepare driFetchDrawable for no-config contexts When we look up the DRI drawable state we need to associate an fbconfig with the drawable. With GLX_EXT_no_config_context we can no longer infer that from the context and must instead query the server. Signed-off-by: Adam Jackson Reviewed-by: Ian Romanick --- src/glx/dri_common.c | 22 ++++++++++++++++++++-- src/glx/glx_pbuffer.c | 12 ++++++------ src/glx/glxclient.h | 4 ++++ 3 files changed, 30 insertions(+), 8 deletions(-) diff --git a/src/glx/dri_common.c b/src/glx/dri_common.c index 3b82309fa20..ab5d6c5bc03 100644 --- a/src/glx/dri_common.c +++ b/src/glx/dri_common.c @@ -396,12 +396,25 @@ driDestroyConfigs(const __DRIconfig **configs) free(configs); } +static struct glx_config * +driInferDrawableConfig(struct glx_screen *psc, GLXDrawable draw) +{ + unsigned int fbconfig = 0; + + if (__glXGetDrawableAttribute(psc->dpy, draw, GLX_FBCONFIG_ID, &fbconfig)) { + return glx_config_find_fbconfig(psc->configs, fbconfig); + } + + return NULL; +} + _X_HIDDEN __GLXDRIdrawable * driFetchDrawable(struct glx_context *gc, GLXDrawable glxDrawable) { struct glx_display *const priv = __glXInitialize(gc->psc->dpy); __GLXDRIdrawable *pdraw; struct glx_screen *psc; + struct glx_config *config = gc->config; if (priv == NULL) return NULL; @@ -418,8 +431,13 @@ driFetchDrawable(struct glx_context *gc, GLXDrawable glxDrawable) return pdraw; } - pdraw = psc->driScreen->createDrawable(psc, glxDrawable, - glxDrawable, gc->config); + if (config == NULL) + config = driInferDrawableConfig(gc->psc, glxDrawable); + if (config == NULL) + return NULL; + + pdraw = psc->driScreen->createDrawable(psc, glxDrawable, glxDrawable, + config); if (pdraw == NULL) { ErrorMessageF("failed to create drawable\n"); diff --git a/src/glx/glx_pbuffer.c b/src/glx/glx_pbuffer.c index 933b5d9ecd1..fd3327f1209 100644 --- a/src/glx/glx_pbuffer.c +++ b/src/glx/glx_pbuffer.c @@ -272,9 +272,9 @@ DestroyDRIDrawable(Display *dpy, GLXDrawable drawable, int destroy_xdrawable) * 10. Given that, this routine should try to use an array on the stack to * capture the reply rather than always calling Xmalloc. */ -static int -GetDrawableAttribute(Display * dpy, GLXDrawable drawable, - int attribute, unsigned int *value) +int +__glXGetDrawableAttribute(Display * dpy, GLXDrawable drawable, + int attribute, unsigned int *value) { struct glx_display *priv; xGLXGetDrawableAttributesReply reply; @@ -825,7 +825,7 @@ glXQueryDrawable(Display * dpy, GLXDrawable drawable, } } #else - GetDrawableAttribute(dpy, drawable, attribute, value); + __glXGetDrawableAttribute(dpy, drawable, attribute, value); #endif } @@ -838,7 +838,7 @@ _GLX_PUBLIC int glXQueryGLXPbufferSGIX(Display * dpy, GLXPbufferSGIX drawable, int attribute, unsigned int *value) { - return GetDrawableAttribute(dpy, drawable, attribute, value); + return __glXGetDrawableAttribute(dpy, drawable, attribute, value); } #endif @@ -909,7 +909,7 @@ glXGetSelectedEvent(Display * dpy, GLXDrawable drawable, unsigned long *mask) * we could just type-cast the pointer, but why? */ - GetDrawableAttribute(dpy, drawable, GLX_EVENT_MASK_SGIX, &value); + __glXGetDrawableAttribute(dpy, drawable, GLX_EVENT_MASK_SGIX, &value); *mask = value; #endif } diff --git a/src/glx/glxclient.h b/src/glx/glxclient.h index 0d29e5635e9..f3a36cf106b 100644 --- a/src/glx/glxclient.h +++ b/src/glx/glxclient.h @@ -841,6 +841,10 @@ indirect_create_context_attribs(struct glx_screen *base, const uint32_t *attribs, unsigned *error); + +extern int __glXGetDrawableAttribute(Display * dpy, GLXDrawable drawable, + int attribute, unsigned int *value); + #ifdef __cplusplus } #endif -- 2.30.2