summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--GL/glx/glxcmds.c373
-rw-r--r--GL/glx/glxcontext.h18
-rw-r--r--GL/glx/glxdrawable.h20
-rw-r--r--GL/glx/glxdri.c83
-rw-r--r--GL/glx/glxext.c53
-rw-r--r--GL/glx/glxutil.c4
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;
}