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:
parent
75d5d22fb7
commit
a48a6b8a40
|
@ -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");
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue