On Mon, Feb 8, 2010 at 1:25 PM, Francisco Jerez <curroje...@riseup.net> wrote: > The spec says (regarding glXCreateWindow): "If there is already a > GLXFBConfig associated with win (as a result of a previous > glXCreateWindow call), then a BadAlloc error is generated.". It will > also come useful to implement DRI2InvalidateBuffers for the indirect > case.
(from elsewhere in the thread:) >> Can you just use the existing __glXDrawableRes for tracking this? >> > I don't think so. To implement DRI2InvalidateBuffers we need a way to > map an X11 window to its GLX window: In the GLX1.3 world the client > decides the IDs of its GLX drawables so in general GLX and X11 drawable > IDs aren't going to be the same. Ah yes, you're right. A few comments below. > Signed-off-by: Francisco Jerez <curroje...@riseup.net> > --- > glx/glxcmds.c | 51 +++++++++++++++++++++++++++++++++++++++++++++------ > glx/glxserver.h | 1 + > 2 files changed, 46 insertions(+), 6 deletions(-) > > diff --git a/glx/glxcmds.c b/glx/glxcmds.c > index 77afbf4..0e1c89c 100644 > --- a/glx/glxcmds.c > +++ b/glx/glxcmds.c > @@ -51,6 +51,15 @@ > #include "indirect_table.h" > #include "indirect_util.h" > > +static int glxWindowPrivateKeyIndex; > +static DevPrivateKey glxWindowPrivateKey = &glxWindowPrivateKeyIndex; > + > +__GLXdrawable * > +glxGetDrawableFromWindow(WindowPtr pWin) > +{ > + return dixLookupPrivate(&pWin->devPrivates, glxWindowPrivateKey); > +} > + > static int > validGlxScreen(ClientPtr client, int screen, __GLXscreen **pGlxScreen, int > *err) > { > @@ -473,6 +482,7 @@ __glXGetDrawable(__GLXcontext *glxc, GLXDrawable drawId, > ClientPtr client, > int *error) > { > DrawablePtr pDraw; > + WindowPtr pWin; > __GLXdrawable *pGlxDraw; > int rc; > > @@ -499,6 +509,12 @@ __glXGetDrawable(__GLXcontext *glxc, GLXDrawable drawId, > ClientPtr client, > return NULL; > } > > + pWin = (WindowPtr)pDraw; > + > + pGlxDraw = glxGetDrawableFromWindow(pWin); > + if (pGlxDraw) > + return pGlxDraw; If there already is a GLXWindow for the window, the validGlxDrawable() call above should return the __GLXdrawable for it, so this hunk shouldn't be necessary. > if (pDraw->pScreen != glxc->pGlxScreen->pScreen) { > client->errorValue = pDraw->pScreen->myNum; > *error = BadMatch; > @@ -519,6 +535,8 @@ __glXGetDrawable(__GLXcontext *glxc, GLXDrawable drawId, > ClientPtr client, > return NULL; > } > > + dixSetPrivate(&pWin->devPrivates, glxWindowPrivateKey, pGlxDraw); > + > return pGlxDraw; > } > > @@ -1107,9 +1125,10 @@ __glXDrawableRelease(__GLXdrawable *drawable) > } > } > > -static int > +static int > DoCreateGLXDrawable(ClientPtr client, __GLXscreen *pGlxScreen, __GLXconfig > *config, > - DrawablePtr pDraw, XID glxDrawableId, int type) > + DrawablePtr pDraw, XID glxDrawableId, int type, > + __GLXdrawable **ret) > { > __GLXdrawable *pGlxDraw; > > @@ -1128,6 +1147,9 @@ DoCreateGLXDrawable(ClientPtr client, __GLXscreen > *pGlxScreen, __GLXconfig *conf > return BadAlloc; > } > > + if (ret) > + *ret = pGlxDraw; > + I would just see if type is GLX_DRAWABLE_WINDOW and set the window private in DoCreateGLXDrawable() if it is. Less code churn. The rest looks good. Kristian ------------------------------------------------------------------------------ The Planet: dedicated and managed hosting, cloud storage, colocation Stay online with enterprise data centers and the best network in the business Choose flexible plans and management services without long-term contracts Personal 24x7 support from experience hosting pros just a phone call away. http://p.sf.net/sfu/theplanet-com _______________________________________________ Mesa3d-dev mailing list Mesa3d-dev@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mesa3d-dev