[Mesa-dev] [PATCH 5/6] glx: Prepare driFetchDrawable for no-config contexts
Adam Jackson
ajax at redhat.com
Tue Nov 14 20:13:05 UTC 2017
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 at redhat.com>
---
src/glx/dri_common.c | 22 ++++++++++++++++++++--
src/glx/glx_pbuffer.c | 2 +-
src/glx/glxclient.h | 4 ++++
3 files changed, 25 insertions(+), 3 deletions(-)
diff --git a/src/glx/dri_common.c b/src/glx/dri_common.c
index 3b82309fa2..0d0b2d997b 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 (GetDrawableAttribute(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 933b5d9ecd..42e7996e37 100644
--- a/src/glx/glx_pbuffer.c
+++ b/src/glx/glx_pbuffer.c
@@ -272,7 +272,7 @@ 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
+int
GetDrawableAttribute(Display * dpy, GLXDrawable drawable,
int attribute, unsigned int *value)
{
diff --git a/src/glx/glxclient.h b/src/glx/glxclient.h
index 0d29e5635e..a448c4c000 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 GetDrawableAttribute(Display * dpy, GLXDrawable drawable,
+ int attribute, unsigned int *value);
+
#ifdef __cplusplus
}
#endif
--
2.14.3
More information about the mesa-dev
mailing list