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 <ajax@redhat.com>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
Adam Jackson 2017-11-14 15:13:05 -05:00
parent 75d5d22fb7
commit a48a6b8a40
3 changed files with 30 additions and 8 deletions

View File

@ -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");

View File

@ -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
}

View File

@ -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