diff options
-rw-r--r-- | GL/glx/glxcmds.c | 373 | ||||
-rw-r--r-- | GL/glx/glxcontext.h | 18 | ||||
-rw-r--r-- | GL/glx/glxdrawable.h | 20 | ||||
-rw-r--r-- | GL/glx/glxdri.c | 83 | ||||
-rw-r--r-- | GL/glx/glxext.c | 53 | ||||
-rw-r--r-- | GL/glx/glxutil.c | 4 |
6 files changed, 187 insertions, 364 deletions
diff --git a/GL/glx/glxcmds.c b/GL/glx/glxcmds.c index 732b135d4..bf6d6e2de 100644 --- a/GL/glx/glxcmds.c +++ b/GL/glx/glxcmds.c @@ -425,108 +425,79 @@ int __glXDisp_MakeCurrentReadSGI(__GLXclientState *cl, GLbyte *pc) * * \param glxc Associated GLX context. * \param drawId ID of the drawable. - * \param ppDraw Location to store the pointer to the drawable. - * \param ppPixmap Location to store the pointer to the pixmap. * \param client Pointer to the client state. - * \return Zero is returned on success. Otherwise a GLX / X11 protocol error - * is returned. + * \return the __GLXdrawable is returned on success. Otherwise NULL. * * \notes This function will need some modification when support pbuffers * is added. */ -static int GetDrawableOrPixmap( __GLXcontext *glxc, GLXDrawable drawId, - __GLXdrawable **ppGlxDraw, - __GLXpixmap **ppPixmap, - ClientPtr client ) +static __GLXdrawable * +__glXGetDrawable(__GLXcontext *glxc, GLXDrawable drawId, ClientPtr client, + int *error) { DrawablePtr pDraw; __GLcontextModes *modes; __GLXdrawable *pGlxDraw; - __GLXpixmap *drawPixmap = NULL; + VisualID vid; int rc; - /* This is the GLX 1.3 case - the client passes in a GLXWindow and - * we just return the __GLXdrawable. The first time a GLXPixmap - * comes in, it doesn't have a corresponding __GLXdrawable, so it - * falls through to the else-case below, but after that it'll have - * a __GLXdrawable and we'll handle it here. */ + /* This is the GLX 1.3 case - the client passes in a GLXWindow or + * GLXPixmap and we just return the __GLXdrawable. */ pGlxDraw = (__GLXdrawable *) LookupIDByType(drawId, __glXDrawableRes); if (pGlxDraw != NULL) { if (glxc != NULL && pGlxDraw->modes != glxc->modes) { client->errorValue = drawId; - return BadMatch; + *error = BadMatch; + return NULL; } - *ppGlxDraw = pGlxDraw; - *ppPixmap = pGlxDraw->pGlxPixmap; - return Success; + return pGlxDraw; } - /* The drawId wasn't a GLXWindow, so presumably it's a regular X - * window. In that case, we create a shadow GLXWindow for it on + /* The drawId wasn't a GLX drawable, so presumably it's a regular + * X window. In that case, we create a shadow GLXWindow for it on * demand here for pre GLX 1.3 compatibility and use the X Window * XID as its GLXWindow XID. The client can't explicitly create a * GLXWindow with the same XID as an X Window, so we wont get any * resource ID clashes. Effectively, the X Window is now also a * GLXWindow. */ - rc = dixLookupDrawable(&pDraw, drawId, client, 0, DixUnknownAccess); - if (rc == Success) { - if (pDraw->type == DRAWABLE_WINDOW) { - VisualID vid = wVisual((WindowPtr)pDraw); - modes = _gl_context_modes_find_visual(glxc->pGlxScreen->modes, - vid); - } else { - /* - ** An X Pixmap is not allowed as a parameter (a GLX Pixmap - ** is, but it must first be created with glxCreateGLXPixmap). - */ - client->errorValue = drawId; - return __glXError(GLXBadDrawable); - } - } else { - drawPixmap = (__GLXpixmap *) LookupIDByType(drawId, __glXPixmapRes); - if (drawPixmap) { - pDraw = drawPixmap->pDraw; - modes = drawPixmap->modes; - } else { - /* - ** Drawable is neither a Window nor a GLXPixmap. - */ - client->errorValue = drawId; - return __glXError(GLXBadDrawable); - } + rc = dixLookupDrawable(&pDraw, drawId, client, 0, DixUnknownAccess); + if (rc != Success || pDraw->type != DRAWABLE_WINDOW) { + client->errorValue = drawId; + *error = __glXError(GLXBadDrawable); + return NULL; } /* If we're not given a context, don't create the __GLXdrawable */ if (glxc == NULL) { - *ppPixmap = NULL; - *ppGlxDraw = NULL; - return Success; + *error = __glXError(GLXBadDrawable); + return NULL; } - /* We're binding an X Window or a GLX Pixmap for the first time - * and need to create a GLX drawable for it. First check that the - * drawable screen and fbconfig matches the context ditto. */ + vid = wVisual((WindowPtr)pDraw); + modes = _gl_context_modes_find_visual(glxc->pGlxScreen->modes, vid); + + /* We're binding an X Window for the first time and need to create + * a GLX drawable for it. First check that the drawable screen + * and fbconfig matches the context ditto. */ if (pDraw->pScreen != glxc->pScreen || modes != glxc->modes) { client->errorValue = drawId; - return BadMatch; + *error = BadMatch; + return NULL; } - pGlxDraw = - glxc->pGlxScreen->createDrawable(glxc->pGlxScreen, - pDraw, drawId, modes); + pGlxDraw = glxc->pGlxScreen->createDrawable(glxc->pGlxScreen, + pDraw, drawId, modes); /* since we are creating the drawablePrivate, drawId should be new */ if (!AddResource(drawId, __glXDrawableRes, pGlxDraw)) { pGlxDraw->destroy (pGlxDraw); - return BadAlloc; + *error = BadAlloc; + return NULL; } - *ppPixmap = drawPixmap; - *ppGlxDraw = pGlxDraw; - - return 0; + return pGlxDraw; } @@ -536,8 +507,6 @@ int DoMakeCurrent( __GLXclientState *cl, { ClientPtr client = cl->client; xGLXMakeCurrentReply reply; - __GLXpixmap *drawPixmap = NULL; - __GLXpixmap *readPixmap = NULL; __GLXcontext *glxc, *prevglxc; __GLXdrawable *drawPriv = NULL; __GLXdrawable *readPriv = NULL; @@ -595,21 +564,13 @@ int DoMakeCurrent( __GLXclientState *cl, assert( drawId != None ); assert( readId != None ); - status = GetDrawableOrPixmap(glxc, drawId, &drawPriv, &drawPixmap, - client); - if ( status != 0 ) { + drawPriv = __glXGetDrawable(glxc, drawId, client, &status); + if (drawPriv == NULL) return status; - } - if ( readId != drawId ) { - status = GetDrawableOrPixmap(glxc, readId, &readPriv, &readPixmap, - client); - if ( status != 0 ) { - return status; - } - } else { - readPriv = drawPriv; - } + readPriv = __glXGetDrawable(glxc, readId, client, &status); + if (readPriv == NULL) + return status; } else { /* Switching to no context. Ignore new drawable. */ @@ -671,42 +632,6 @@ int DoMakeCurrent( __GLXclientState *cl, } if (prevglxc) { - if (prevglxc->drawPixmap) { - if (prevglxc->readPixmap && - prevglxc->drawPixmap != prevglxc->readPixmap) { - /* - ** The previous drawable was a glx pixmap, release it. - */ - prevglxc->readPixmap->refcnt--; - if (!prevglxc->readPixmap->idExists && - !prevglxc->readPixmap->refcnt) { - PixmapPtr pPixmap = (PixmapPtr) prevglxc->readPixmap->pDraw; - /* - ** The DestroyPixmap routine should decrement the - ** refcount of the X pixmap and free only if it's zero. - */ - (*prevglxc->readPixmap->pScreen->DestroyPixmap)(pPixmap); - xfree(prevglxc->readPixmap); - } - } - - /* - ** The previous drawable was a glx pixmap, release it. - */ - prevglxc->drawPixmap->refcnt--; - if (!prevglxc->drawPixmap->idExists && - !prevglxc->drawPixmap->refcnt) { - PixmapPtr pPixmap = (PixmapPtr) prevglxc->drawPixmap->pDraw; - /* - ** The DestroyPixmap routine should decrement the - ** refcount of the X pixmap and free only if it's zero. - */ - (*prevglxc->drawPixmap->pScreen->DestroyPixmap)(pPixmap); - xfree(prevglxc->drawPixmap); - } - - prevglxc->drawPixmap = NULL; - } ChangeCurrentContext(cl, glxc, tag); StopUsingContext(prevglxc); } else { @@ -714,16 +639,6 @@ int DoMakeCurrent( __GLXclientState *cl, } if (glxc) { - if (drawPixmap) { - drawPixmap->refcnt++; - glxc->drawPixmap = drawPixmap; - } - - if (readPixmap && (readPixmap != drawPixmap)) { - readPixmap->refcnt++; - glxc->readPixmap = readPixmap; - } - StartUsingContext(cl, glxc); reply.contextTag = tag; } else { @@ -1210,31 +1125,30 @@ int __glXDisp_GetFBConfigsSGIX(__GLXclientState *cl, GLbyte *pc) return DoGetFBConfigs( cl, req->screen, GL_FALSE ); } -static int ValidateCreateDrawable(ClientPtr client, - int screenNum, XID fbconfigId, - XID drawablId, XID glxDrawableId, - int type, __GLcontextModes **modes, - DrawablePtr *ppDraw) +static int +DoCreateGLXDrawable(ClientPtr client, int screenNum, XID fbconfigId, + XID drawableId, XID glxDrawableId, int type) { DrawablePtr pDraw; ScreenPtr pScreen; VisualPtr pVisual; __GLXscreen *pGlxScreen; + __GLXdrawable *pGlxDraw; + __GLcontextModes *modes; int i, rc; LEGAL_NEW_RESOURCE(glxDrawableId, client); - rc = dixLookupDrawable(&pDraw, drawablId, client, 0, DixUnknownAccess); + rc = dixLookupDrawable(&pDraw, drawableId, client, 0, DixUnknownAccess); if (rc != Success || pDraw->type != type) { - client->errorValue = drawablId; + client->errorValue = drawableId; return type == DRAWABLE_WINDOW ? BadWindow : BadPixmap; } /* Check if screen of the fbconfig matches screen of drawable. */ pScreen = pDraw->pScreen; - if (screenNum != pScreen->myNum) { + if (screenNum != pScreen->myNum) return BadMatch; - } /* If this fbconfig has a corresponding VisualRec the number of * planes must match the drawable depth. */ @@ -1246,55 +1160,39 @@ static int ValidateCreateDrawable(ClientPtr client, /* Get configuration of the visual. */ pGlxScreen = glxGetScreen(pScreen); - *modes = _gl_context_modes_find_visual(pGlxScreen->modes, fbconfigId); - if (*modes == NULL) { + modes = _gl_context_modes_find_visual(pGlxScreen->modes, fbconfigId); + if (modes == NULL) { /* Visual not support on this screen by this OpenGL implementation. */ client->errorValue = fbconfigId; return BadValue; } - *ppDraw = pDraw; + /* FIXME: We need to check that the window visual is compatible + * with the specified fbconfig. */ + pGlxDraw = pGlxScreen->createDrawable(pGlxScreen, pDraw, + glxDrawableId, modes); + if (pGlxDraw == NULL) + return BadAlloc; + + if (!AddResource(glxDrawableId, __glXDrawableRes, pGlxDraw)) { + pGlxDraw->destroy (pGlxDraw); + return BadAlloc; + } + + if (type == DRAWABLE_PIXMAP) + ((PixmapPtr) pDraw)->refcnt++; return Success; } -/* -** Create a GLX Pixmap from an X Pixmap. -*/ -int DoCreateGLXPixmap(__GLXclientState *cl, XID fbconfigId, - GLuint screenNum, XID pixmapId, XID glxPixmapId, - CARD32 *attribs, CARD32 numAttribs) +static void +determineTextureTarget(XID glxDrawableID, CARD32 *attribs, CARD32 numAttribs) { - ClientPtr client = cl->client; - DrawablePtr pDraw; - __GLXpixmap *pGlxPixmap; - __GLcontextModes *modes; GLenum target = 0; - int retval, i; - - retval = ValidateCreateDrawable (client, screenNum, fbconfigId, - pixmapId, glxPixmapId, - DRAWABLE_PIXMAP, &modes, &pDraw); - if (retval != Success) - return retval; - - pGlxPixmap = (__GLXpixmap *) xalloc(sizeof(__GLXpixmap)); - if (!pGlxPixmap) { - return BadAlloc; - } - if (!(AddResource(glxPixmapId, __glXPixmapRes, pGlxPixmap))) { - return BadAlloc; - } - pGlxPixmap->pDraw = pDraw; - pGlxPixmap->pGlxScreen = glxGetScreen(pDraw->pScreen); - pGlxPixmap->pScreen = pDraw->pScreen; - pGlxPixmap->idExists = True; -#ifdef XF86DRI - pGlxPixmap->pDamage = NULL; -#endif - pGlxPixmap->refcnt = 0; + int i; + __GLXdrawable *pGlxDraw; - pGlxPixmap->modes = modes; + pGlxDraw = LookupIDByType(glxDrawableID, __glXDrawableRes); for (i = 0; i < numAttribs; i++) { if (attribs[2 * i] == GLX_TEXTURE_TARGET_EXT) { @@ -1308,63 +1206,69 @@ int DoCreateGLXPixmap(__GLXclientState *cl, XID fbconfigId, } } } - + if (!target) { - int w = pDraw->width, h = pDraw->height; - + int w = pGlxDraw->pDraw->width, h = pGlxDraw->pDraw->height; + if (h & (h - 1) || w & (w - 1)) target = GL_TEXTURE_RECTANGLE_ARB; else target = GL_TEXTURE_2D; } - pGlxPixmap->target = target; - - /* - ** Bump the ref count on the X pixmap so it won't disappear. - */ - ((PixmapPtr) pDraw)->refcnt++; - - return Success; + pGlxDraw->target = target; } int __glXDisp_CreateGLXPixmap(__GLXclientState *cl, GLbyte *pc) { xGLXCreateGLXPixmapReq *req = (xGLXCreateGLXPixmapReq *) pc; - return DoCreateGLXPixmap( cl, req->visual, req->screen, - req->pixmap, req->glxpixmap, NULL, 0 ); + + return DoCreateGLXDrawable(cl->client, req->screen, req->visual, + req->pixmap, req->glxpixmap, DRAWABLE_PIXMAP); } int __glXDisp_CreatePixmap(__GLXclientState *cl, GLbyte *pc) { xGLXCreatePixmapReq *req = (xGLXCreatePixmapReq *) pc; - return DoCreateGLXPixmap( cl, req->fbconfig, req->screen, - req->pixmap, req->glxpixmap, - (CARD32*)(req + 1), - req->numAttribs ); + int err; + + err = DoCreateGLXDrawable(cl->client, req->screen, req->fbconfig, + req->pixmap, req->glxpixmap, DRAWABLE_PIXMAP); + if (err != Success) + return err; + + determineTextureTarget(req->glxpixmap, + (CARD32*) (req + 1), req->numAttribs); + + return Success; } int __glXDisp_CreateGLXPixmapWithConfigSGIX(__GLXclientState *cl, GLbyte *pc) { xGLXCreateGLXPixmapWithConfigSGIXReq *req = (xGLXCreateGLXPixmapWithConfigSGIXReq *) pc; - return DoCreateGLXPixmap( cl, req->fbconfig, req->screen, - req->pixmap, req->glxpixmap, NULL, 0 ); + + return DoCreateGLXDrawable(cl->client, req->screen, req->fbconfig, + req->pixmap, req->glxpixmap, DRAWABLE_PIXMAP); } -int DoDestroyPixmap(__GLXclientState *cl, XID glxpixmap) +static int DoDestroyDrawable(__GLXclientState *cl, XID glxdrawable, int type) { ClientPtr client = cl->client; + __GLXdrawable *pGlxDraw; + int error; /* - ** Check if it's a valid GLX pixmap. + ** Check it's the right type of drawable. */ - if (!LookupIDByType(glxpixmap, __glXPixmapRes)) { - client->errorValue = glxpixmap; - return __glXError(GLXBadPixmap); + pGlxDraw = LookupIDByType(glxdrawable, __glXDrawableRes); + if (pGlxDraw == NULL || pGlxDraw->type != type) { + client->errorValue = glxdrawable; + error = type == DRAWABLE_WINDOW ? GLXBadWindow : GLXBadDrawable; + return __glXError(error); } - FreeResource(glxpixmap, FALSE); + FreeResource(glxdrawable, FALSE); return Success; } @@ -1373,14 +1277,14 @@ int __glXDisp_DestroyGLXPixmap(__GLXclientState *cl, GLbyte *pc) { xGLXDestroyGLXPixmapReq *req = (xGLXDestroyGLXPixmapReq *) pc; - return DoDestroyPixmap(cl, req->glxpixmap); + return DoDestroyDrawable(cl, req->glxpixmap, DRAWABLE_PIXMAP); } int __glXDisp_DestroyPixmap(__GLXclientState *cl, GLbyte *pc) { xGLXDestroyPixmapReq *req = (xGLXDestroyPixmapReq *) pc; - return DoDestroyPixmap(cl, req->glxpixmap); + return DoDestroyDrawable(cl, req->glxpixmap, DRAWABLE_PIXMAP); } int __glXDisp_CreatePbuffer(__GLXclientState *cl, GLbyte *pc) @@ -1415,49 +1319,16 @@ int __glXDisp_CreateWindow(__GLXclientState *cl, GLbyte *pc) { xGLXCreateWindowReq *req = (xGLXCreateWindowReq *) pc; ClientPtr client = cl->client; - DrawablePtr pDraw; - __GLXdrawable *glxPriv; - __GLXscreen *screen; - __GLcontextModes *modes; - int retval; - - retval = ValidateCreateDrawable (client, req->screen, req->fbconfig, - req->window, req->glxwindow, - DRAWABLE_WINDOW, &modes, &pDraw); - if (retval != Success) - return retval; - - /* FIXME: We need to check that the window visual is compatible - * with the specified fbconfig. */ - - screen = glxGetScreen(screenInfo.screens[req->screen]); - glxPriv = screen->createDrawable(screen, pDraw, req->glxwindow, modes); - if (glxPriv == NULL) - return BadAlloc; - - if (!AddResource(req->glxwindow, __glXDrawableRes, glxPriv)) { - glxPriv->destroy (glxPriv); - return BadAlloc; - } - return Success; + return DoCreateGLXDrawable(client, req->screen, req->fbconfig, + req->window, req->glxwindow, DRAWABLE_WINDOW); } int __glXDisp_DestroyWindow(__GLXclientState *cl, GLbyte *pc) { xGLXDestroyWindowReq *req = (xGLXDestroyWindowReq *) pc; - ClientPtr client = cl->client; - /* - ** Check if it's a valid GLX window. - */ - if (!LookupIDByType(req->glxwindow, __glXDrawableRes)) { - client->errorValue = req->glxwindow; - return __glXError(GLXBadWindow); - } - FreeResource(req->glxwindow, FALSE); - - return Success; + return DoDestroyDrawable(cl, req->glxwindow, DRAWABLE_WINDOW); } @@ -1476,7 +1347,6 @@ int __glXDisp_SwapBuffers(__GLXclientState *cl, GLbyte *pc) XID drawId = req->drawable; __GLXcontext *glxc = NULL; __GLXdrawable *pGlxDraw; - __GLXpixmap *pPixmap; int error; if (tag) { @@ -1501,11 +1371,11 @@ int __glXDisp_SwapBuffers(__GLXclientState *cl, GLbyte *pc) } } - error = GetDrawableOrPixmap(glxc, drawId, &pGlxDraw, &pPixmap, client); - if (error != Success) + pGlxDraw = __glXGetDrawable(glxc, drawId, client, &error); + if (pGlxDraw == NULL) return error; - if (pGlxDraw != NULL && pGlxDraw->type == DRAWABLE_WINDOW && + if (pGlxDraw->type == DRAWABLE_WINDOW && (*pGlxDraw->swapBuffers)(pGlxDraw) == GL_FALSE) return __glXError(GLXBadDrawable); @@ -1576,8 +1446,8 @@ int __glXDisp_BindTexImageEXT(__GLXclientState *cl, GLbyte *pc) { xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc; ClientPtr client = cl->client; - __GLXpixmap *pGlxPixmap; __GLXcontext *context; + __GLXdrawable *pGlxDraw; GLXDrawable drawId; int buffer; int error; @@ -1594,8 +1464,8 @@ int __glXDisp_BindTexImageEXT(__GLXclientState *cl, GLbyte *pc) if (!context) return error; - pGlxPixmap = (__GLXpixmap *)LookupIDByType(drawId, __glXPixmapRes); - if (!pGlxPixmap) { + pGlxDraw = __glXGetDrawable(NULL, drawId, client, &error); + if (!pGlxDraw || pGlxDraw->type != DRAWABLE_PIXMAP) { client->errorValue = drawId; return __glXError(GLXBadPixmap); } @@ -1605,14 +1475,14 @@ int __glXDisp_BindTexImageEXT(__GLXclientState *cl, GLbyte *pc) return context->textureFromPixmap->bindTexImage(context, buffer, - pGlxPixmap); + pGlxDraw); } int __glXDisp_ReleaseTexImageEXT(__GLXclientState *cl, GLbyte *pc) { xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc; ClientPtr client = cl->client; - __GLXpixmap *pGlxPixmap; + __GLXdrawable *pGlxDraw; __GLXcontext *context; GLXDrawable drawId; int buffer; @@ -1627,10 +1497,10 @@ int __glXDisp_ReleaseTexImageEXT(__GLXclientState *cl, GLbyte *pc) if (!context) return error; - pGlxPixmap = (__GLXpixmap *)LookupIDByType(drawId, __glXPixmapRes); - if (!pGlxPixmap) { + pGlxDraw = __glXGetDrawable(NULL, drawId, client, &error); + if (error != Success || pGlxDraw->type != DRAWABLE_PIXMAP) { client->errorValue = drawId; - return __glXError(GLXBadDrawable); + return error; } if (!context->textureFromPixmap) @@ -1638,7 +1508,7 @@ int __glXDisp_ReleaseTexImageEXT(__GLXclientState *cl, GLbyte *pc) return context->textureFromPixmap->releaseTexImage(context, buffer, - pGlxPixmap); + pGlxDraw); } int __glXDisp_CopySubBufferMESA(__GLXclientState *cl, GLbyte *pc) @@ -1647,7 +1517,6 @@ int __glXDisp_CopySubBufferMESA(__GLXclientState *cl, GLbyte *pc) GLXContextTag tag = req->contextTag; __GLXcontext *glxc = NULL; __GLXdrawable *pGlxDraw; - __GLXpixmap *pPixmap; ClientPtr client = cl->client; GLXDrawable drawId; int error; @@ -1686,7 +1555,7 @@ int __glXDisp_CopySubBufferMESA(__GLXclientState *cl, GLbyte *pc) } } - error = GetDrawableOrPixmap(glxc, drawId, &pGlxDraw, &pPixmap, client); + pGlxDraw = __glXGetDrawable(glxc, drawId, client, &error); if (error != Success) return error; @@ -1707,15 +1576,15 @@ static int DoGetDrawableAttributes(__GLXclientState *cl, XID drawId) { ClientPtr client = cl->client; - __GLXpixmap *glxPixmap; xGLXGetDrawableAttributesReply reply; + __GLXdrawable *pGlxDraw; CARD32 attributes[4]; - int numAttribs; + int numAttribs, error; - glxPixmap = (__GLXpixmap *)LookupIDByType(drawId, __glXPixmapRes); - if (!glxPixmap) { + pGlxDraw = __glXGetDrawable(NULL, drawId, client, &error); + if (!pGlxDraw) { client->errorValue = drawId; - return __glXError(GLXBadPixmap); + return error; } numAttribs = 2; @@ -1725,7 +1594,7 @@ DoGetDrawableAttributes(__GLXclientState *cl, XID drawId) reply.numAttribs = numAttribs; attributes[0] = GLX_TEXTURE_TARGET_EXT; - attributes[1] = glxPixmap->target == GL_TEXTURE_2D ? GLX_TEXTURE_2D_EXT : + attributes[1] = pGlxDraw->target == GL_TEXTURE_2D ? GLX_TEXTURE_2D_EXT : GLX_TEXTURE_RECTANGLE_EXT; attributes[2] = GLX_Y_INVERTED_EXT; attributes[3] = GL_FALSE; diff --git a/GL/glx/glxcontext.h b/GL/glx/glxcontext.h index eb10ee2a8..712264729 100644 --- a/GL/glx/glxcontext.h +++ b/GL/glx/glxcontext.h @@ -44,12 +44,12 @@ typedef struct __GLXtextureFromPixmap __GLXtextureFromPixmap; struct __GLXtextureFromPixmap { - int (*bindTexImage) (__GLXcontext *baseContext, - int buffer, - __GLXpixmap *pixmap); - int (*releaseTexImage) (__GLXcontext *baseContext, - int buffer, - __GLXpixmap *pixmap); + int (*bindTexImage) (__GLXcontext *baseContext, + int buffer, + __GLXdrawable *pixmap); + int (*releaseTexImage) (__GLXcontext *baseContext, + int buffer, + __GLXdrawable *pixmap); }; @@ -152,12 +152,6 @@ struct __GLXcontext { GLint selectBufSize; /* number of elements allocated */ /* - ** Set only if current drawable is a glx pixmap. - */ - __GLXpixmap *drawPixmap; - __GLXpixmap *readPixmap; - - /* ** The drawable private this context is bound to */ __GLXdrawable *drawPriv; diff --git a/GL/glx/glxdrawable.h b/GL/glx/glxdrawable.h index b7ecad929..5fdcf9525 100644 --- a/GL/glx/glxdrawable.h +++ b/GL/glx/glxdrawable.h @@ -46,23 +46,6 @@ #include <GL/internal/dri_interface.h> #endif -typedef struct { - - DrawablePtr pDraw; - __GLcontextModes *modes; - __GLXscreen *pGlxScreen; - ScreenPtr pScreen; - Bool idExists; - int refcnt; - GLenum target; -#ifdef XF86DRI - DamagePtr pDamage; - __DRIcontext *pDRICtx; - GLint texname; - unsigned long offset; -#endif -} __GLXpixmap; - struct __GLXdrawable { void (*destroy)(__GLXdrawable *private); GLboolean (*resize)(__GLXdrawable *private); @@ -78,7 +61,6 @@ struct __GLXdrawable { DrawablePtr pDraw; XID drawId; - __GLXpixmap *pGlxPixmap; /* ** Either DRAWABLE_PIXMAP or DRAWABLE_WINDOW, copied from pDraw above. @@ -105,6 +87,8 @@ struct __GLXdrawable { ** reference count */ int refCount; + + GLenum target; }; #endif /* !__GLX_drawable_h__ */ diff --git a/GL/glx/glxdri.c b/GL/glx/glxdri.c index ae743113b..3394e5896 100644 --- a/GL/glx/glxdri.c +++ b/GL/glx/glxdri.c @@ -59,6 +59,9 @@ #include "dispatch.h" #include "extension_string.h" +#define containerOf(ptr, type, member) \ + (type *)( (char *)ptr - offsetof(type,member) ) + typedef struct __GLXDRIscreen __GLXDRIscreen; typedef struct __GLXDRIcontext __GLXDRIcontext; typedef struct __GLXDRIdrawable __GLXDRIdrawable; @@ -73,12 +76,14 @@ struct __GLXDRIscreen { __DRIcopySubBufferExtension *copySubBuffer; __DRIswapControlExtension *swapControl; - __DRItexOffsetExtension *texOffset; +#ifdef __DRI_TEX_OFFSET + __DRItexOffsetExtension *texOffset; DRITexOffsetStartProcPtr texOffsetStart; DRITexOffsetFinishProcPtr texOffsetFinish; - __GLXpixmap* texOffsetOverride[16]; + __GLXDRIdrawable *texOffsetOverride[16]; GLuint lastTexOffsetOverride; +#endif unsigned char glx_enable_bits[__GLX_EXT_BYTES]; }; @@ -92,6 +97,14 @@ struct __GLXDRIcontext { struct __GLXDRIdrawable { __GLXdrawable base; __DRIdrawable driDrawable; + + /* Pulled in from old __GLXpixmap */ +#ifdef __DRI_TEX_OFFSET + GLint texname; + __GLXDRIcontext *ctx; + unsigned long offset; + DamagePtr pDamage; +#endif }; static const char CREATE_NEW_SCREEN_FUNC[] = __DRI_CREATE_NEW_SCREEN_STRING; @@ -107,15 +120,15 @@ __glXDRIleaveServer(GLboolean rendering) GLuint lastOverride = screen->lastTexOffsetOverride; if (lastOverride) { - __GLXpixmap **texOffsetOverride = screen->texOffsetOverride; + __GLXDRIdrawable **texOffsetOverride = screen->texOffsetOverride; int j; for (j = 0; j < lastOverride; j++) { - __GLXpixmap *pGlxPix = texOffsetOverride[j]; + __GLXDRIdrawable *pGlxPix = texOffsetOverride[j]; if (pGlxPix && pGlxPix->texname) { pGlxPix->offset = - screen->texOffsetStart((PixmapPtr)pGlxPix->pDraw); + screen->texOffsetStart((PixmapPtr)pGlxPix->base.pDraw); } } } @@ -129,18 +142,18 @@ __glXDRIleaveServer(GLboolean rendering) GLuint lastOverride = screen->lastTexOffsetOverride; if (lastOverride) { - __GLXpixmap **texOffsetOverride = screen->texOffsetOverride; + __GLXDRIdrawable **texOffsetOverride = screen->texOffsetOverride; int j; for (j = 0; j < lastOverride; j++) { - __GLXpixmap *pGlxPix = texOffsetOverride[j]; + __GLXDRIdrawable *pGlxPix = texOffsetOverride[j]; if (pGlxPix && pGlxPix->texname) { - screen->texOffset->setTexOffset(pGlxPix->pDRICtx, + screen->texOffset->setTexOffset(&pGlxPix->ctx->driContext, pGlxPix->texname, pGlxPix->offset, - pGlxPix->pDraw->depth, - ((PixmapPtr)pGlxPix->pDraw)->devKind); + pGlxPix->base.pDraw->depth, + ((PixmapPtr)pGlxPix->base.pDraw)->devKind); } } } @@ -321,14 +334,17 @@ glxFillAlphaChannel (PixmapPtr pixmap, int x, int y, int width, int height) static int __glXDRIbindTexImage(__GLXcontext *baseContext, int buffer, - __GLXpixmap *glxPixmap) + __GLXdrawable *glxPixmap) { RegionPtr pRegion = NULL; PixmapPtr pixmap; int bpp, override = 0, texname; GLenum format, type; - ScreenPtr pScreen = glxPixmap->pScreen; - __GLXDRIscreen * const screen = (__GLXDRIscreen *) glxGetScreen(pScreen); + ScreenPtr pScreen = glxPixmap->pDraw->pScreen; + __GLXDRIdrawable *driDraw = + containerOf(glxPixmap, __GLXDRIdrawable, base); + __GLXDRIscreen * const screen = + (__GLXDRIscreen *) glxGetScreen(pScreen); CALL_GetIntegerv(GET_DISPATCH(), (glxPixmap->target == GL_TEXTURE_2D ? GL_TEXTURE_BINDING_2D : @@ -341,11 +357,11 @@ __glXDRIbindTexImage(__GLXcontext *baseContext, pixmap = (PixmapPtr) glxPixmap->pDraw; if (screen->texOffsetStart && screen->texOffset) { - __GLXpixmap **texOffsetOverride = screen->texOffsetOverride; + __GLXDRIdrawable **texOffsetOverride = screen->texOffsetOverride; int i, firstEmpty = 16; for (i = 0; i < 16; i++) { - if (texOffsetOverride[i] == glxPixmap) + if (texOffsetOverride[i] == driDraw) goto alreadyin; if (firstEmpty == 16 && !texOffsetOverride[i]) @@ -360,37 +376,37 @@ __glXDRIbindTexImage(__GLXcontext *baseContext, if (firstEmpty >= screen->lastTexOffsetOverride) screen->lastTexOffsetOverride = firstEmpty + 1; - texOffsetOverride[firstEmpty] = glxPixmap; + texOffsetOverride[firstEmpty] = driDraw; alreadyin: override = 1; - glxPixmap->pDRICtx = &((__GLXDRIcontext*)baseContext)->driContext; + driDraw->ctx = (__GLXDRIcontext*)baseContext; - if (texname == glxPixmap->texname) + if (texname == driDraw->texname) return Success; - glxPixmap->texname = texname; + driDraw->texname = texname; - screen->texOffset->setTexOffset(glxPixmap->pDRICtx, texname, 0, + screen->texOffset->setTexOffset(&driDraw->ctx->driContext, texname, 0, pixmap->drawable.depth, pixmap->devKind); } nooverride: - if (!glxPixmap->pDamage) { + if (!driDraw->pDamage) { if (!override) { - glxPixmap->pDamage = DamageCreate(NULL, NULL, DamageReportNone, - TRUE, pScreen, NULL); - if (!glxPixmap->pDamage) + driDraw->pDamage = DamageCreate(NULL, NULL, DamageReportNone, + TRUE, pScreen, NULL); + if (!driDraw->pDamage) return BadAlloc; - DamageRegister ((DrawablePtr) pixmap, glxPixmap->pDamage); + DamageRegister ((DrawablePtr) pixmap, driDraw->pDamage); } pRegion = NULL; } else { - pRegion = DamageRegion(glxPixmap->pDamage); + pRegion = DamageRegion(driDraw->pDamage); if (REGION_NIL(pRegion)) return Success; } @@ -469,7 +485,7 @@ nooverride: } if (!override) - DamageEmpty(glxPixmap->pDamage); + DamageEmpty(driDraw->pDamage); return Success; } @@ -477,19 +493,21 @@ nooverride: static int __glXDRIreleaseTexImage(__GLXcontext *baseContext, int buffer, - __GLXpixmap *pixmap) + __GLXdrawable *pixmap) { - ScreenPtr pScreen = pixmap->pScreen; + ScreenPtr pScreen = pixmap->pDraw->pScreen; + __GLXDRIdrawable *driDraw = + containerOf(pixmap, __GLXDRIdrawable, base); __GLXDRIscreen * const screen = (__GLXDRIscreen *) glxGetScreen(pScreen); GLuint lastOverride = screen->lastTexOffsetOverride; if (lastOverride) { - __GLXpixmap **texOffsetOverride = screen->texOffsetOverride; + __GLXDRIdrawable **texOffsetOverride = screen->texOffsetOverride; int i; for (i = 0; i < lastOverride; i++) { - if (texOffsetOverride[i] == pixmap) { + if (texOffsetOverride[i] == driDraw) { if (screen->texOffsetFinish) screen->texOffsetFinish((PixmapPtr)pixmap->pDraw); @@ -696,9 +714,6 @@ filter_modes(__GLcontextModes **server_modes, } -#define containerOf(ptr, type, member) \ - (type *)( (char *)ptr - offsetof(type,member) ) - static GLboolean getDrawableInfo(__DRIdrawable *driDrawable, unsigned int *index, unsigned int *stamp, diff --git a/GL/glx/glxext.c b/GL/glx/glxext.c index b5de8c3e9..94ec5cc7d 100644 --- a/GL/glx/glxext.c +++ b/GL/glx/glxext.c @@ -45,7 +45,6 @@ __GLXcontext *__glXLastContext; ** X resources. */ RESTYPE __glXContextRes; -RESTYPE __glXPixmapRes; RESTYPE __glXDrawableRes; RESTYPE __glXSwapBarrierRes; @@ -102,32 +101,6 @@ static int ContextGone(__GLXcontext* cx, XID id) } /* -** Free a GLX Pixmap. -*/ -static int PixmapGone(__GLXpixmap *pGlxPixmap, XID id) -{ - PixmapPtr pPixmap = (PixmapPtr) pGlxPixmap->pDraw; - - pGlxPixmap->idExists = False; - if (!pGlxPixmap->refcnt) { -#ifdef XF86DRI - if (pGlxPixmap->pDamage) { - DamageUnregister (pGlxPixmap->pDraw, pGlxPixmap->pDamage); - DamageDestroy(pGlxPixmap->pDamage); - } -#endif - /* - ** The DestroyPixmap routine should decrement the refcount and free - ** only if it's zero. - */ - (*pGlxPixmap->pScreen->DestroyPixmap)(pPixmap); - xfree(pGlxPixmap); - } - - return True; -} - -/* ** Destroy routine that gets called when a drawable is freed. A drawable ** contains the ancillary buffers needed for rendering. */ @@ -136,24 +109,17 @@ static Bool DrawableGone(__GLXdrawable *glxPriv, XID xid) __GLXcontext *cx, *cx1; /* - ** Use glxPriv->type to figure out what kind of drawable this is. Don't - ** use glxPriv->pDraw->type because by the time this routine is called, - ** the pDraw might already have been freed. + ** When a drawable is destroyed, notify all context bound to + ** it, that there are no longer bound to anything. */ - if (glxPriv->type == DRAWABLE_WINDOW) { - /* - ** When a window is destroyed, notify all context bound to - ** it, that there are no longer bound to anything. - */ - for (cx = glxPriv->drawGlxc; cx; cx = cx1) { - cx1 = cx->nextDrawPriv; - cx->pendingState |= __GLX_PENDING_DESTROY; - } + for (cx = glxPriv->drawGlxc; cx; cx = cx1) { + cx1 = cx->nextDrawPriv; + cx->pendingState |= __GLX_PENDING_DESTROY; + } - for (cx = glxPriv->readGlxc; cx; cx = cx1) { - cx1 = cx->nextReadPriv; - cx->pendingState |= __GLX_PENDING_DESTROY; - } + for (cx = glxPriv->readGlxc; cx; cx = cx1) { + cx1 = cx->nextReadPriv; + cx->pendingState |= __GLX_PENDING_DESTROY; } __glXUnrefDrawable(glxPriv); @@ -319,7 +285,6 @@ void GlxExtensionInit(void) __GLXprovider *p; __glXContextRes = CreateNewResourceType((DeleteType)ContextGone); - __glXPixmapRes = CreateNewResourceType((DeleteType)PixmapGone); __glXDrawableRes = CreateNewResourceType((DeleteType)DrawableGone); __glXSwapBarrierRes = CreateNewResourceType((DeleteType)SwapBarrierGone); diff --git a/GL/glx/glxutil.c b/GL/glx/glxutil.c index 1f172929f..df1cb2abc 100644 --- a/GL/glx/glxutil.c +++ b/GL/glx/glxutil.c @@ -148,9 +148,5 @@ __glXDrawableInit(__GLXdrawable *drawable, drawable->refCount = 1; drawable->modes = modes; - /* if not a pixmap, lookup will fail, so pGlxPixmap will be NULL */ - drawable->pGlxPixmap = (__GLXpixmap *) - LookupIDByType(drawId, __glXPixmapRes); - return GL_TRUE; } |