glx: Pass NULL DRI drawables into the DRI driver for None GLX drawables
authorKristian Høgsberg <krh@bitplanet.net>
Wed, 5 Feb 2014 19:43:58 +0000 (11:43 -0800)
committerKristian Høgsberg <krh@bitplanet.net>
Thu, 6 Feb 2014 22:23:42 +0000 (14:23 -0800)
GLX_ARB_create_context allows making a GLX context current with None
drawable and readables, but this was never implemented correctly in GLX.
We would create a __DRIdrawable for the None GLX drawable and pass that
to the DRI driver and that would somehow work.  Now it's somehow broken.

The way this should have worked is that we pass a NULL DRI drawable
to the DRI driver when the GLX user calls glXMakeContextCurrent()
with None for drawable and readables.

https://bugs.freedesktop.org/show_bug.cgi?id=74143
Signed-off-by: Kristian Høgsberg <krh@bitplanet.net>
src/glx/dri2_glx.c
src/glx/dri_common.c

index 0a0dac9864617d1b210046660fd597c8b41261ea..67fe9c1d4f99941d8bf076d432c041565474a749 100644 (file)
@@ -141,6 +141,7 @@ dri2_bind_context(struct glx_context *context, struct glx_context *old,
    struct dri2_context *pcp = (struct dri2_context *) context;
    struct dri2_screen *psc = (struct dri2_screen *) pcp->base.psc;
    struct dri2_drawable *pdraw, *pread;
+   __DRIdrawable *dri_draw = NULL, *dri_read = NULL;
    struct dri2_display *pdp;
 
    pdraw = (struct dri2_drawable *) driFetchDrawable(context, draw);
@@ -148,20 +149,26 @@ dri2_bind_context(struct glx_context *context, struct glx_context *old,
 
    driReleaseDrawables(&pcp->base);
 
-   if (pdraw == NULL || pread == NULL)
+   if (pdraw)
+      dri_draw = pdraw->driDrawable;
+   else if (draw != None)
       return GLXBadDrawable;
 
-   if (!(*psc->core->bindContext) (pcp->driContext,
-                                  pdraw->driDrawable, pread->driDrawable))
+   if (pread)
+      dri_read = pread->driDrawable;
+   else if (read != None)
+      return GLXBadDrawable;
+
+   if (!(*psc->core->bindContext) (pcp->driContext, dri_draw, dri_read))
       return GLXBadContext;
 
    /* If the server doesn't send invalidate events, we may miss a
     * resize before the rendering starts.  Invalidate the buffers now
     * so the driver will recheck before rendering starts. */
    pdp = (struct dri2_display *) psc->base.display;
-   if (!pdp->invalidateAvailable) {
+   if (!pdp->invalidateAvailable && pdraw) {
       dri2InvalidateBuffers(psc->base.dpy, pdraw->base.xDrawable);
-      if (pread != pdraw)
+      if (pread != pdraw && pread)
         dri2InvalidateBuffers(psc->base.dpy, pread->base.xDrawable);
    }
 
index 0dd8982a18b39bf9fafa1937add12d1aeadc3d5e..012c8f4ec3209be9de1790c3bbf8ffd52bf2b122 100644 (file)
@@ -392,6 +392,9 @@ driFetchDrawable(struct glx_context *gc, GLXDrawable glxDrawable)
    if (priv == NULL)
       return NULL;
 
+   if (glxDrawable == None)
+      return NULL;
+
    psc = priv->screens[gc->screen];
    if (priv->drawHash == NULL)
       return NULL;