xserver: Branch 'master' - 4 commits

Kristian Høgsberg krh at kemper.freedesktop.org
Tue Apr 7 13:30:17 PDT 2009


 glx/glxcmds.c     |  247 ++++++++++++++++++++++++++----------------------------
 glx/glxdrawable.h |    3 
 glx/glxscreens.c  |    7 +
 glx/xfont.c       |   15 ++-
 4 files changed, 139 insertions(+), 133 deletions(-)

New commits:
commit df27b870a8db7a5153b18a556fe77efa590f9eee
Author: Kristian Høgsberg <krh at redhat.com>
Date:   Tue Apr 7 16:28:08 2009 -0400

    Convert remaining GLX LookupIDByType() calls

diff --git a/glx/glxscreens.c b/glx/glxscreens.c
index 6f68b06..2b12049 100644
--- a/glx/glxscreens.c
+++ b/glx/glxscreens.c
@@ -254,6 +254,7 @@ AddScreenVisuals(ScreenPtr pScreen, int count, int d)
     VisualPtr	 visuals;
     ColormapPtr	 installedCmap;
     DepthPtr	 depth;
+    int		 rc;
 
     depth = NULL;
     for (i = 0; i < pScreen->numDepths; i++) {
@@ -294,8 +295,10 @@ AddScreenVisuals(ScreenPtr pScreen, int count, int d)
      * for all colormaps.
      */
     for (i = 0; i < numInstalledCmaps; i++) {
-	installedCmap = LookupIDByType (installedCmaps[i], RT_COLORMAP);
-	if (!installedCmap)
+	rc = dixLookupResourceByType((pointer *)&installedCmap,
+				     installedCmaps[i], RT_COLORMAP,
+				     serverClient, DixReadAccess);
+	if (rc != Success)
 	    continue;
 	j = installedCmap->pVisual - pScreen->visuals;
 	installedCmap->pVisual = &visuals[j];
diff --git a/glx/xfont.c b/glx/xfont.c
index 1f4ecbd..b8b466d 100644
--- a/glx/xfont.c
+++ b/glx/xfont.c
@@ -180,12 +180,17 @@ int __glXDisp_UseXFont(__GLXclientState *cl, GLbyte *pc)
     ** Font can actually be either the ID of a font or the ID of a GC
     ** containing a font.
     */
-    pFont = (FontPtr)LookupIDByType(req->font, RT_FONT);
-    if (!pFont) {
-        pGC = (GC *)LookupIDByType(req->font, RT_GC);
-        if (!pGC) {
+
+    error = dixLookupResourceByType((pointer *)&pFont,
+				    req->font, RT_FONT,
+				    client, DixReadAccess);
+    if (error != Success) {
+	error = dixLookupResourceByType((pointer *)&pGC,
+					req->font, RT_GC,
+					client, DixReadAccess);
+        if (error != Success) {
 	    client->errorValue = req->font;
-            return BadFont;
+            return error == BadGC ? BadFont : error;
 	}
 	pFont = pGC->font;
     }
commit 92562747a0fdbef1dbedf734cb55dd6a9e1d2994
Author: Kristian Høgsberg <krh at redhat.com>
Date:   Tue Apr 7 13:58:53 2009 -0400

    Add validGlxDrawable() and use dixLookupResourceByType().
    
    Fixes deprecation warnings, and fixes a couple of GLX error codes
    for failing drawable lookups.

diff --git a/glx/glxcmds.c b/glx/glxcmds.c
index ec12240..d2e7393 100644
--- a/glx/glxcmds.c
+++ b/glx/glxcmds.c
@@ -154,6 +154,42 @@ validGlxContext(ClientPtr client, XID id, int access_mode,
     return TRUE;
 }
 
+static int
+validGlxDrawable(ClientPtr client, XID id, int type, int access_mode,
+		 __GLXdrawable **drawable, int *err)
+{
+    int rc;
+
+    rc = dixLookupResourceByType((pointer *) drawable, id,
+				 __glXDrawableRes, client, access_mode);
+    if (rc != Success && rc != BadValue) {
+	*err = rc;
+	client->errorValue = id;
+	return FALSE;
+    }
+
+    if (rc == BadValue ||
+	(type != GLX_DRAWABLE_ANY && type != (*drawable)->type)) {
+	client->errorValue = id;
+	switch (type) {
+	case GLX_DRAWABLE_WINDOW:
+	    *err = __glXError(GLXBadWindow);
+	    return FALSE;
+	case GLX_DRAWABLE_PIXMAP:
+	    *err = __glXError(GLXBadPixmap);
+	    return FALSE;
+	case GLX_DRAWABLE_PBUFFER:
+	    *err = __glXError(GLXBadPbuffer);
+	    return FALSE;
+	case GLX_DRAWABLE_ANY:
+	    *err = __glXError(GLXBadDrawable);
+	    return FALSE;
+	}
+    }
+
+    return TRUE;
+}
+
 void
 __glXContextDestroy(__GLXcontext *context)
 {
@@ -441,20 +477,10 @@ static void StartUsingContext(__GLXclientState *cl, __GLXcontext *glxc)
 }
 
 /**
- * Given a drawable ID, get the associated drawable and / or pixmap.
- * 
- * If the specified drawable ID is not a pixmap, \c ppPixmap will be set
- * to \c NULL on return.  In either case, \c ppDraw will be set to a drawable.
- * In the case where the drawable ID is a pixmap, \c ppDraw will be set to
- * the drawable associated with that pixmap.
- *
- * \param glxc      Associated GLX context.
- * \param drawId    ID of the drawable.
- * \param client    Pointer to the client state.
- * \return  the __GLXdrawable is returned on success.  Otherwise NULL.
- * 
- * \notes This function will need some modification when support pbuffers
- *        is added.
+ * This is a helper function to handle the legacy (pre GLX 1.3) cases
+ * where passing an X window to glXMakeCurrent is valid.  Given a
+ * resource ID, look up the GLX drawable if available, otherwise, make
+ * sure it's an X window and create a GLX drawable one the fly.
  */
 static __GLXdrawable *
 __glXGetDrawable(__GLXcontext *glxc, GLXDrawable drawId, ClientPtr client,
@@ -464,10 +490,8 @@ __glXGetDrawable(__GLXcontext *glxc, GLXDrawable drawId, ClientPtr client,
     __GLXdrawable *pGlxDraw;
     int rc;
 
-    /* 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 (validGlxDrawable(client, drawId, GLX_DRAWABLE_ANY,
+			 DixWriteAccess, &pGlxDraw, &rc)) {
 	if (glxc != NULL && pGlxDraw->config != glxc->config) {
 	    client->errorValue = drawId;
 	    *error = BadMatch;
@@ -477,13 +501,10 @@ __glXGetDrawable(__GLXcontext *glxc, GLXDrawable drawId, ClientPtr client,
 	return pGlxDraw;
     }
 
-    /* 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. */
+    /* The drawId wasn't a GLX drawable.  Make sure it's a window and
+     * create a GLXWindow for it.  Check that the drawable screen
+     * matches the context screen and that the context fbconfig is
+     * compatible with the window visual. */
 
     rc = dixLookupDrawable(&pDraw, drawId, client, 0, DixGetAttrAccess);
     if (rc != Success || pDraw->type != DRAWABLE_WINDOW) {
@@ -492,18 +513,13 @@ __glXGetDrawable(__GLXcontext *glxc, GLXDrawable drawId, ClientPtr client,
 	return NULL;
     }
 
-    /* If we're not given a context, don't create the __GLXdrawable */
-    if (glxc == NULL) {
-	*error = __glXError(GLXBadDrawable);
+    if (pDraw->pScreen != glxc->pGlxScreen->pScreen) {
+	client->errorValue = pDraw->pScreen->myNum;
+	*error = BadMatch;
 	return NULL;
     }
 
-    /* We're binding an X Window for the first time and need to create
-     * a GLX drawable for it.  Check that the drawable screen matches
-     * the context screen and that the context fbconfig is compatible
-     * with the window visual. */
-    if (pDraw->pScreen != glxc->pGlxScreen->pScreen ||
-	!validGlxFBConfigForWindow(client, glxc->config, pDraw, error))
+    if (!validGlxFBConfigForWindow(client, glxc->config, pDraw, error))
 	return NULL;
 
     pGlxDraw = glxc->pGlxScreen->createDrawable(glxc->pGlxScreen,
@@ -1125,14 +1141,18 @@ DoCreateGLXPixmap(ClientPtr client, __GLXscreen *pGlxScreen, __GLXconfig *config
 }
 
 static void
-determineTextureTarget(XID glxDrawableID, CARD32 *attribs, CARD32 numAttribs)
+determineTextureTarget(ClientPtr client, XID glxDrawableID,
+		       CARD32 *attribs, CARD32 numAttribs)
 {
     GLenum target = 0;
     GLenum format = 0;
-    int i;
+    int i, err;
     __GLXdrawable *pGlxDraw;
 
-    pGlxDraw = LookupIDByType(glxDrawableID, __glXDrawableRes);
+    if (!validGlxDrawable(client, glxDrawableID, GLX_DRAWABLE_PIXMAP,
+			  DixWriteAccess, &pGlxDraw, &err))
+	/* We just added it in CreatePixmap, so we should never get here. */
+	return;
 
     for (i = 0; i < numAttribs; i++) {
 	if (attribs[2 * i] == GLX_TEXTURE_TARGET_EXT) {
@@ -1196,7 +1216,7 @@ int __glXDisp_CreatePixmap(__GLXclientState *cl, GLbyte *pc)
     if (err != Success)
 	return err;
 
-    determineTextureTarget(req->glxpixmap,
+    determineTextureTarget(cl->client, req->glxpixmap,
 			   (CARD32*) (req + 1), req->numAttribs);
 
     return Success;
@@ -1222,24 +1242,12 @@ int __glXDisp_CreateGLXPixmapWithConfigSGIX(__GLXclientState *cl, GLbyte *pc)
 
 static int DoDestroyDrawable(__GLXclientState *cl, XID glxdrawable, int type)
 {
-    ClientPtr client = cl->client;
     __GLXdrawable *pGlxDraw;
+    int err;
 
-    /*
-    ** Check it's the right type of drawable.
-    */
-    pGlxDraw = LookupIDByType(glxdrawable, __glXDrawableRes);
-    if (pGlxDraw == NULL || pGlxDraw->type != type) {
-	client->errorValue = glxdrawable;
-	switch (type) {
-	case GLX_DRAWABLE_WINDOW:
-	    return __glXError(GLXBadWindow);
-	case GLX_DRAWABLE_PIXMAP:
-	    return __glXError(GLXBadDrawable);
-	case GLX_DRAWABLE_PBUFFER:
-	    return __glXError(GLXBadPbuffer);
-	}
-    }
+    if (!validGlxDrawable(cl->client, glxdrawable, type,
+			  DixDestroyAccess, &pGlxDraw, &err))
+	return err;
 
     FreeResource(glxdrawable, FALSE);
 
@@ -1339,9 +1347,12 @@ DoChangeDrawableAttributes(ClientPtr client, XID glxdrawable,
 			   int numAttribs, CARD32 *attribs)
 {
     __GLXdrawable *pGlxDraw;
-    int i;
+    int i, err;
+
+    if (!validGlxDrawable(client, glxdrawable, GLX_DRAWABLE_ANY,
+			  DixSetAttrAccess, &pGlxDraw, &err))
+	return err;
 
-    pGlxDraw = LookupIDByType(glxdrawable, __glXDrawableRes);
     for (i = 0; i < numAttribs; i++) {
 	switch(attribs[i * 2]) {
 	case GLX_EVENT_MASK:
@@ -1540,11 +1551,9 @@ int __glXDisp_BindTexImageEXT(__GLXclientState *cl, GLbyte *pc)
     if (!context)
 	return error;
 
-    pGlxDraw = __glXGetDrawable(NULL, drawId, client, &error);
-    if (!pGlxDraw || pGlxDraw->type != GLX_DRAWABLE_PIXMAP) {
-	client->errorValue = drawId;
-	return __glXError(GLXBadPixmap);
-    }
+    if (!validGlxDrawable(client, drawId, GLX_DRAWABLE_PIXMAP,
+			  DixReadAccess, &pGlxDraw, &error))
+	return error;
 
     if (!context->textureFromPixmap)
 	return __glXError(GLXUnsupportedPrivateRequest);
@@ -1573,11 +1582,9 @@ int __glXDisp_ReleaseTexImageEXT(__GLXclientState *cl, GLbyte *pc)
     if (!context)
 	return error;
 
-    pGlxDraw = __glXGetDrawable(NULL, drawId, client, &error);
-    if (!pGlxDraw || pGlxDraw->type != GLX_DRAWABLE_PIXMAP) {
-	client->errorValue = drawId;
+    if (!validGlxDrawable(client, drawId, GLX_DRAWABLE_PIXMAP,
+			  DixReadAccess, &pGlxDraw, &error))
 	return error;
-    }
 
     if (!context->textureFromPixmap)
 	return __glXError(GLXUnsupportedPrivateRequest);
@@ -1657,11 +1664,9 @@ DoGetDrawableAttributes(__GLXclientState *cl, XID drawId)
     CARD32 attributes[6];
     int numAttribs, error;
 
-    pGlxDraw = __glXGetDrawable(NULL, drawId, client, &error);
-    if (!pGlxDraw) {
-	client->errorValue = drawId;
+    if (!validGlxDrawable(client, drawId, GLX_DRAWABLE_ANY,
+			  DixGetAttrAccess, &pGlxDraw, &error))
 	return error;
-    }
 
     numAttribs = 3;
     reply.length = numAttribs << 1;
diff --git a/glx/glxdrawable.h b/glx/glxdrawable.h
index 2d787ae..b64ff35 100644
--- a/glx/glxdrawable.h
+++ b/glx/glxdrawable.h
@@ -41,7 +41,8 @@
 enum {
     GLX_DRAWABLE_WINDOW,
     GLX_DRAWABLE_PIXMAP,
-    GLX_DRAWABLE_PBUFFER
+    GLX_DRAWABLE_PBUFFER,
+    GLX_DRAWABLE_ANY
 };
 
 struct __GLXdrawable {
commit f70cfc8f90091ef0f5ed0a5b2e023e7fd6369b36
Author: Kristian Høgsberg <krh at redhat.com>
Date:   Thu Apr 2 17:30:19 2009 -0400

    Don't stomp on dixLookupDrawable() return value in DoCreateGLXPixmap().

diff --git a/glx/glxcmds.c b/glx/glxcmds.c
index 7197204..ec12240 100644
--- a/glx/glxcmds.c
+++ b/glx/glxcmds.c
@@ -1106,7 +1106,11 @@ DoCreateGLXPixmap(ClientPtr client, __GLXscreen *pGlxScreen, __GLXconfig *config
     int err;
 
     err = dixLookupDrawable(&pDraw, drawableId, client, 0, DixAddAccess);
-    if (err != Success || pDraw->type != DRAWABLE_PIXMAP) {
+    if (err != Success) {
+	client->errorValue = drawableId;
+	return err;
+    }
+    if (pDraw->type != DRAWABLE_PIXMAP) {
 	client->errorValue = drawableId;
 	return BadPixmap;
     }
commit 30d81ad72e870cc37754bd8c8aadf605450ec16e
Author: Kristian Høgsberg <krh at redhat.com>
Date:   Thu Apr 2 17:24:12 2009 -0400

    Make GLX context lookup use dixLookupResourceByType()

diff --git a/glx/glxcmds.c b/glx/glxcmds.c
index 80f3a69..7197204 100644
--- a/glx/glxcmds.c
+++ b/glx/glxcmds.c
@@ -138,6 +138,22 @@ validGlxFBConfigForWindow(ClientPtr client, __GLXconfig *config,
     return TRUE;
 }
 
+static int
+validGlxContext(ClientPtr client, XID id, int access_mode,
+		__GLXcontext **context, int *err)
+{
+    *err = dixLookupResourceByType((pointer *) context, id,
+				   __glXContextRes, client, access_mode);
+    if (err != Success) {
+	client->errorValue = id;
+	if (*err == BadValue)
+	    *err = __glXError(GLXBadContext);
+	return FALSE;
+    }
+
+    return TRUE;
+}
+
 void
 __glXContextDestroy(__GLXcontext *context)
 {
@@ -189,7 +205,8 @@ DoCreateContext(__GLXclientState *cl, GLXContextID gcId,
 {
     ClientPtr client = cl->client;
     __GLXcontext *glxc, *shareglxc;
-
+    int err;
+    
     LEGAL_NEW_RESOURCE(gcId, client);
 
     /*
@@ -204,11 +221,10 @@ DoCreateContext(__GLXclientState *cl, GLXContextID gcId,
     if (shareList == None) {
 	shareglxc = 0;
     } else {
-	shareglxc = (__GLXcontext *) LookupIDByType(shareList, __glXContextRes);
-	if (!shareglxc) {
-	    client->errorValue = shareList;
-	    return __glXError(GLXBadContext);
-	}
+	if (!validGlxContext(client, shareList, DixReadAccess,
+			     &shareglxc, &err))
+	    return err;
+
 	if (shareglxc->isDirect) {
 	    /*
 	    ** NOTE: no support for sharing display lists between direct
@@ -321,25 +337,16 @@ int __glXDisp_CreateContextWithConfigSGIX(__GLXclientState *cl, GLbyte *pc)
 }
 int __glXDisp_DestroyContext(__GLXclientState *cl, GLbyte *pc)
 {
-    ClientPtr client = cl->client;
     xGLXDestroyContextReq *req = (xGLXDestroyContextReq *) pc;
-    GLXContextID gcId = req->context;
     __GLXcontext *glxc;
-    
-    glxc = (__GLXcontext *) LookupIDByType(gcId, __glXContextRes);
-    if (glxc) {
-	/*
-	** Just free the resource; don't actually destroy the context,
-	** because it might be in use.  The
-	** destroy method will be called by the resource destruction routine
-	** if necessary.
-	*/
-	FreeResourceByType(gcId, __glXContextRes, FALSE);
-	return Success;
-    } else {
-	client->errorValue = gcId;
-	return __glXError(GLXBadContext);
-    }
+    int err;
+
+    if (!validGlxContext(cl->client, req->context, DixDestroyAccess,
+			 &glxc, &err))
+	    return err;
+
+    FreeResourceByType(req->context, __glXContextRes, FALSE);
+    return Success;
 }
 
 /*****************************************************************************/
@@ -528,7 +535,7 @@ DoMakeCurrent(__GLXclientState *cl,
     __GLXcontext *glxc, *prevglxc;
     __GLXdrawable *drawPriv = NULL;
     __GLXdrawable *readPriv = NULL;
-    GLint error;
+    int error;
     GLuint  mask;
 
     /*
@@ -569,11 +576,8 @@ DoMakeCurrent(__GLXclientState *cl,
     if (contextId != None) {
 	int  status;
 
-	glxc = (__GLXcontext *) LookupIDByType(contextId, __glXContextRes);
-	if (!glxc) {
-	    client->errorValue = contextId;
-	    return __glXError(GLXBadContext);
-	}
+	if (!validGlxContext(client, contextId, DixUseAccess, &glxc, &error))
+	    return error;
 	if ((glxc != prevglxc) && glxc->isCurrent) {
 	    /* Context is current to somebody else */
 	    return BadAccess;
@@ -702,15 +706,10 @@ int __glXDisp_IsDirect(__GLXclientState *cl, GLbyte *pc)
     xGLXIsDirectReq *req = (xGLXIsDirectReq *) pc;
     xGLXIsDirectReply reply;
     __GLXcontext *glxc;
+    int err;
 
-    /*
-    ** Find the GL context.
-    */
-    glxc = (__GLXcontext *) LookupIDByType(req->context, __glXContextRes);
-    if (!glxc) {
-	client->errorValue = req->context;
-	return __glXError(GLXBadContext);
-    }
+    if (!validGlxContext(cl->client, req->context, DixReadAccess, &glxc, &err))
+	return err;
 
     reply.isDirect = glxc->isDirect;
     reply.length = 0;
@@ -814,19 +813,10 @@ int __glXDisp_CopyContext(__GLXclientState *cl, GLbyte *pc)
     __GLXcontext *src, *dst;
     int error;
 
-    /*
-    ** Check that each context exists.
-    */
-    src = (__GLXcontext *) LookupIDByType(source, __glXContextRes);
-    if (!src) {
-	client->errorValue = source;
-	return __glXError(GLXBadContext);
-    }
-    dst = (__GLXcontext *) LookupIDByType(dest, __glXContextRes);
-    if (!dst) {
-	client->errorValue = dest;
-	return __glXError(GLXBadContext);
-    }
+    if (!validGlxContext(cl->client, source, DixReadAccess, &src, &error))
+	return error;
+    if (!validGlxContext(cl->client, dest, DixWriteAccess, &dst, &error))
+	return error;
 
     /*
     ** They must be in the same address space, and same screen.
@@ -1475,12 +1465,10 @@ DoQueryContext(__GLXclientState *cl, GLXContextID gcId)
     int nProps;
     int *sendBuf, *pSendBuf;
     int nReplyBytes;
+    int err;
 
-    ctx = (__GLXcontext *) LookupIDByType(gcId, __glXContextRes);
-    if (!ctx) {
-	client->errorValue = gcId;
-	return __glXError(GLXBadContext);
-    }
+    if (!validGlxContext(cl->client, gcId, DixReadAccess, &ctx, &err))
+	return err;
 
     nProps = 3;
     reply.length = nProps << 1;


More information about the xorg-commit mailing list