[Mesa-dev] [PATCH] dri3_glx.c: Pass NULL DRI drawables into driver for None GLX drawables

Zhang, Xiong Y xiong.y.zhang at intel.com
Mon Mar 23 22:50:21 PDT 2015


> You seem to miss the case when one is None and not the other.
> It should return BadDrawable too.
> 
> This particular case seems not handled by the dri2 code either, and the gallium
> state tracker seems to handle it in bindContext, but not the intel code for
> example.

[Zhang, Xiong Y] For this particular case, are you mean this case: 
(draw == None && read != None) || (draw != None && read == None)
If it is yes, it's better to add this judgement into MakeContextCurrent() in src/glx/glxcurrent.c, so that both dri2_glx and dri3_glx could use it.
 
thanks
> 
> Axel Davy
> 
> On 23/03/2015 08:07, Xiong Zhang wrote :
> > GLX_ARB_create_context spec says:
> > If either <draw> or <read> are not a valid GLX drawable, a
> > GLXBadDrawable error is generated, unless <draw> and <read> are both
> > None and the OpenGL version supported by <ctx> is 3.0 or greater.
> >
> > So when both <draw> and <read> are None, it could pass NULL drawable
> > into driver instead of returing GLXBadDrawable.
> >
> > v2: Fix spacing issue (Axel Davy)
> >
> > https://bugs.freedesktop.org/show_bug.cgi?id=79629
> > Signed-off-by: Xiong Zhang <xiong.y.zhang at intel.com>
> > ---
> >   src/glx/dri3_glx.c | 12 +++++++++---
> >   1 file changed, 9 insertions(+), 3 deletions(-)
> >
> > diff --git a/src/glx/dri3_glx.c b/src/glx/dri3_glx.c index
> > e3fc4de..a07e8d4 100644
> > --- a/src/glx/dri3_glx.c
> > +++ b/src/glx/dri3_glx.c
> > @@ -133,17 +133,23 @@ dri3_bind_context(struct glx_context *context,
> struct glx_context *old,
> >      struct dri3_context *pcp = (struct dri3_context *) context;
> >      struct dri3_screen *psc = (struct dri3_screen *) pcp->base.psc;
> >      struct dri3_drawable *pdraw, *pread;
> > +   __DRIdrawable *dri_draw = NULL, *dri_read = NULL;
> >
> >      pdraw = (struct dri3_drawable *) driFetchDrawable(context, draw);
> >      pread = (struct dri3_drawable *) driFetchDrawable(context, read);
> >
> >      driReleaseDrawables(&pcp->base);
> >
> > -   if (pdraw == NULL || pread == NULL)
> > +   if ((pdraw == NULL && draw != None) || (pread == NULL && read !=
> > + None))
> >         return GLXBadDrawable;
> >
> > -   if (!(*psc->core->bindContext) (pcp->driContext,
> > -                                   pdraw->driDrawable,
> pread->driDrawable))
> > +   if (pdraw)
> > +      dri_draw = pdraw->driDrawable;
> > +
> > +   if (pread)
> > +      dri_read = pread->driDrawable;
> > +
> > +   if (!(*psc->core->bindContext)(pcp->driContext, dri_draw,
> > + dri_read))
> >         return GLXBadContext;
> >
> >      return Success;



More information about the mesa-dev mailing list