[PATCH] glx: Remove swap barrier and hyperpipe support

Adam Jackson ajax at redhat.com
Fri Nov 19 10:52:49 PST 2010


Never implemented in any open source driver.  The implementation
assumed explicit DDX driver knowledge of how the client-side driver
worked, since at the time the server's GL renderer was not a DRI driver.
But now, it is, so any implementation of these should be done with
additional DRI driver API, like the swap control extension.

Signed-off-by: Adam Jackson <ajax at redhat.com>
---
 glx/Makefile.am          |    1 -
 glx/g_disptab.h          |   52 ----------
 glx/glxcmds.c            |  233 ----------------------------------------------
 glx/glxcmdsswap.c        |    1 -
 glx/glxdri.c             |    1 -
 glx/glxdri2.c            |    1 -
 glx/glxdriswrast.c       |    1 -
 glx/glxext.c             |   19 +----
 glx/glxscreens.c         |   27 ------
 glx/glxscreens.h         |   18 ----
 glx/indirect_table.c     |    1 -
 glx/xfont.c              |    1 -
 hw/xquartz/GL/indirect.c |    2 -
 hw/xwin/glx/indirect.c   |    2 -
 14 files changed, 1 insertions(+), 359 deletions(-)
 delete mode 100644 glx/g_disptab.h

diff --git a/glx/Makefile.am b/glx/Makefile.am
index 9d9fa3c..d708872 100644
--- a/glx/Makefile.am
+++ b/glx/Makefile.am
@@ -68,7 +68,6 @@ libglx_la_SOURCES = \
 	indirect_program.c \
 	indirect_table.h \
 	indirect_texture_compression.c \
-        g_disptab.h \
         glxbyteorder.h \
         glxcmds.c \
         glxcmdsswap.c \
diff --git a/glx/g_disptab.h b/glx/g_disptab.h
deleted file mode 100644
index 9b4308b..0000000
--- a/glx/g_disptab.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/* DO NOT EDIT - THIS FILE IS AUTOMATICALLY GENERATED */
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#ifndef _GLX_g_disptab_h_
-#define _GLX_g_disptab_h_
-/*
- * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
- * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice including the dates of first publication and
- * either this permission notice or a reference to
- * http://oss.sgi.com/projects/FreeB/
- * shall be included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
- * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- * Except as contained in this notice, the name of Silicon Graphics, Inc.
- * shall not be used in advertising or otherwise to promote the sale, use or
- * other dealings in this Software without prior written authorization from
- * Silicon Graphics, Inc.
- */
-
-extern int __glXDisp_BindSwapBarrierSGIX(__GLXclientState *cl, GLbyte *pc);
-extern int __glXDisp_QueryMaxSwapBarriersSGIX(__GLXclientState *cl, GLbyte *pc);
-extern int __glXDisp_QueryHyperpipeNetworkSGIX(__GLXclientState *cl, GLbyte *pc);
-extern int __glXDisp_DestroyHyperpipeConfigSGIX (__GLXclientState *cl, GLbyte *pc);
-extern int __glXDisp_QueryHyperpipeConfigSGIX(__GLXclientState *cl, GLbyte *pc);
-extern int __glXDisp_HyperpipeConfigSGIX(__GLXclientState *cl, GLbyte *pc);
-
-extern int __glXDispSwap_BindSwapBarrierSGIX(__GLXclientState *cl, GLbyte *pc);
-extern int __glXDispSwap_QueryMaxSwapBarriersSGIX(__GLXclientState *cl, GLbyte *pc);
-extern int __glXDispSwap_QueryHyperpipeNetworkSGIX(__GLXclientState *cl, GLbyte *pc);
-extern int __glXDispSwap_DestroyHyperpipeConfigSGIX (__GLXclientState *cl, GLbyte *pc);
-extern int __glXDispSwap_QueryHyperpipeConfigSGIX(__GLXclientState *cl, GLbyte *pc);
-extern int __glXDispSwap_HyperpipeConfigSGIX(__GLXclientState *cl, GLbyte *pc);
-
-#endif /* _GLX_g_disptab_h_ */
diff --git a/glx/glxcmds.c b/glx/glxcmds.c
index 8d13c15..de9c3f0 100644
--- a/glx/glxcmds.c
+++ b/glx/glxcmds.c
@@ -38,7 +38,6 @@
 #include "glxserver.h"
 #include <GL/glxtokens.h>
 #include <unpack.h>
-#include "g_disptab.h"
 #include <pixmapstr.h>
 #include <windowstr.h>
 #include "glxutil.h"
@@ -2061,238 +2060,6 @@ int __glXDisp_RenderLarge(__GLXclientState *cl, GLbyte *pc)
     }
 }
 
-extern RESTYPE __glXSwapBarrierRes;
-
-int __glXDisp_BindSwapBarrierSGIX(__GLXclientState *cl, GLbyte *pc)
-{
-    ClientPtr client = cl->client;
-    xGLXBindSwapBarrierSGIXReq *req = (xGLXBindSwapBarrierSGIXReq *) pc;
-    XID drawable = req->drawable;
-    int barrier = req->barrier;
-    DrawablePtr pDraw;
-    int screen, rc;
-    __GLXscreen *pGlxScreen;
-
-    rc = dixLookupDrawable(&pDraw, drawable, client, 0, DixGetAttrAccess);
-    pGlxScreen = glxGetScreen(pDraw->pScreen);
-    if (rc == Success && (pDraw->type == DRAWABLE_WINDOW)) {
-	screen = pDraw->pScreen->myNum;
-        if (pGlxScreen->swapBarrierFuncs) {
-            int ret = pGlxScreen->swapBarrierFuncs->bindSwapBarrierFunc(screen, drawable, barrier);
-            if (ret == Success) {
-                if (barrier)
-                    /* add source for cleanup when drawable is gone */
-                    AddResource(drawable, __glXSwapBarrierRes, (pointer)(intptr_t)screen);
-                else
-                    /* delete source */
-                    FreeResourceByType(drawable, __glXSwapBarrierRes, FALSE);
-            }
-            return ret;
-        }
-    }
-    client->errorValue = drawable;
-    return __glXError(GLXBadDrawable);
-}
-
-
-int __glXDisp_QueryMaxSwapBarriersSGIX(__GLXclientState *cl, GLbyte *pc)
-{
-    ClientPtr client = cl->client;
-    xGLXQueryMaxSwapBarriersSGIXReq *req =
-                                    (xGLXQueryMaxSwapBarriersSGIXReq *) pc;
-    xGLXQueryMaxSwapBarriersSGIXReply reply;
-    int screen = req->screen;
-    __GLXscreen *pGlxScreen;
-
-    pGlxScreen = glxGetScreen(screenInfo.screens[screen]);
-    if (pGlxScreen->swapBarrierFuncs)
-        reply.max = pGlxScreen->swapBarrierFuncs->queryMaxSwapBarriersFunc(screen);
-    else
-        reply.max = 0;
-
-
-    reply.length = 0;
-    reply.type = X_Reply;
-    reply.sequenceNumber = client->sequence;
-
-    if (client->swapped) {
-        __GLX_DECLARE_SWAP_VARIABLES;
-        __GLX_SWAP_SHORT(&reply.sequenceNumber);
-    }
-
-    WriteToClient(client, sz_xGLXQueryMaxSwapBarriersSGIXReply,
-                        (char *) &reply);
-    return Success;
-}
-
-#define GLX_BAD_HYPERPIPE_SGIX 92
-
-int __glXDisp_QueryHyperpipeNetworkSGIX(__GLXclientState *cl, GLbyte *pc)
-{
-    ClientPtr client = cl->client;
-    xGLXQueryHyperpipeNetworkSGIXReq * req = (xGLXQueryHyperpipeNetworkSGIXReq *) pc;
-    xGLXQueryHyperpipeNetworkSGIXReply reply;
-    int screen = req->screen;
-    void *rdata = NULL;
-
-    int length=0;
-    int npipes=0;
-
-    int n= 0;
-    __GLXscreen *pGlxScreen;
-
-    pGlxScreen = glxGetScreen(screenInfo.screens[screen]);
-    if (pGlxScreen->hyperpipeFuncs) {
-        rdata =
-            (pGlxScreen->hyperpipeFuncs->queryHyperpipeNetworkFunc(screen, &npipes, &n));
-    }
-    length = __GLX_PAD(n) >> 2;
-    reply.type = X_Reply;
-    reply.sequenceNumber = client->sequence;
-    reply.length = length;
-    reply.n = n;
-    reply.npipes = npipes;
-
-    if (client->swapped) {
-        __GLX_DECLARE_SWAP_VARIABLES;
-        __GLX_SWAP_SHORT(&reply.sequenceNumber);
-        __GLX_SWAP_INT(&reply.length);
-        __GLX_SWAP_INT(&reply.n);
-        __GLX_SWAP_INT(&reply.npipes);
-    }
-    WriteToClient(client, sz_xGLXQueryHyperpipeNetworkSGIXReply,
-                  (char *) &reply);
-
-    WriteToClient(client, length << 2, (char *)rdata);
-
-    return Success;
-}
-
-int __glXDisp_DestroyHyperpipeConfigSGIX (__GLXclientState *cl, GLbyte *pc)
-{
-    ClientPtr client = cl->client;
-    xGLXDestroyHyperpipeConfigSGIXReq * req =
-        (xGLXDestroyHyperpipeConfigSGIXReq *) pc;
-    xGLXDestroyHyperpipeConfigSGIXReply reply;
-    int screen = req->screen;
-    int  success = GLX_BAD_HYPERPIPE_SGIX;
-    int hpId ;
-    __GLXscreen *pGlxScreen;
-
-    hpId = req->hpId;
-
-    pGlxScreen = glxGetScreen(screenInfo.screens[screen]);
-    if (pGlxScreen->hyperpipeFuncs) {
-        success = pGlxScreen->hyperpipeFuncs->destroyHyperpipeConfigFunc(screen, hpId);
-    }
-
-    reply.type = X_Reply;
-    reply.sequenceNumber = client->sequence;
-    reply.length = __GLX_PAD(0) >> 2;
-    reply.n = 0;
-    reply.success = success;
-
-
-    if (client->swapped) {
-        __GLX_DECLARE_SWAP_VARIABLES;
-        __GLX_SWAP_SHORT(&reply.sequenceNumber);
-    }
-    WriteToClient(client,
-                  sz_xGLXDestroyHyperpipeConfigSGIXReply,
-                  (char *) &reply);
-    return Success;
-}
-
-int __glXDisp_QueryHyperpipeConfigSGIX(__GLXclientState *cl, GLbyte *pc)
-{
-    ClientPtr client = cl->client;
-    xGLXQueryHyperpipeConfigSGIXReq * req =
-        (xGLXQueryHyperpipeConfigSGIXReq *) pc;
-    xGLXQueryHyperpipeConfigSGIXReply reply;
-    int screen = req->screen;
-    void *rdata = NULL;
-    int length;
-    int npipes=0;
-    int n= 0;
-    int hpId;
-    __GLXscreen *pGlxScreen;
-
-    hpId = req->hpId;
-
-    pGlxScreen = glxGetScreen(screenInfo.screens[screen]);
-    if (pGlxScreen->hyperpipeFuncs) {
-        rdata = pGlxScreen->hyperpipeFuncs->queryHyperpipeConfigFunc(screen, hpId,&npipes, &n);
-    }
-
-    length = __GLX_PAD(n) >> 2;
-    reply.type = X_Reply;
-    reply.sequenceNumber = client->sequence;
-    reply.length = length;
-    reply.n = n;
-    reply.npipes = npipes;
-
-
-    if (client->swapped) {
-        __GLX_DECLARE_SWAP_VARIABLES;
-        __GLX_SWAP_SHORT(&reply.sequenceNumber);
-        __GLX_SWAP_INT(&reply.length);
-        __GLX_SWAP_INT(&reply.n);
-        __GLX_SWAP_INT(&reply.npipes);
-    }
-
-    WriteToClient(client, sz_xGLXQueryHyperpipeConfigSGIXReply,
-                  (char *) &reply);
-
-    WriteToClient(client, length << 2, (char *)rdata);
-
-    return Success;
-}
-
-int __glXDisp_HyperpipeConfigSGIX(__GLXclientState *cl, GLbyte *pc)
-{
-    ClientPtr client = cl->client;
-    xGLXHyperpipeConfigSGIXReq * req =
-        (xGLXHyperpipeConfigSGIXReq *) pc;
-    xGLXHyperpipeConfigSGIXReply reply;
-    int screen = req->screen;
-    void *rdata;
-
-    int npipes=0, networkId;
-    int hpId=-1;
-    __GLXscreen *pGlxScreen;
-
-    pGlxScreen = glxGetScreen(screenInfo.screens[screen]);
-    networkId = (int)req->networkId;
-    npipes = (int)req->npipes;
-    rdata = (void *)(req +1);
-
-    if (pGlxScreen->hyperpipeFuncs) {
-        pGlxScreen->hyperpipeFuncs->hyperpipeConfigFunc(screen,networkId,
-                                                        &hpId, &npipes,
-                                                        (void *) rdata);
-    }
-
-    reply.type = X_Reply;
-    reply.sequenceNumber = client->sequence;
-    reply.length = __GLX_PAD(0) >> 2;
-    reply.n = 0;
-    reply.npipes = npipes;
-    reply.hpId = hpId;
-
-    if (client->swapped) {
-        __GLX_DECLARE_SWAP_VARIABLES;
-        __GLX_SWAP_SHORT(&reply.sequenceNumber);
-        __GLX_SWAP_INT(&reply.npipes);
-        __GLX_SWAP_INT(&reply.hpId);
-    }
-
-    WriteToClient(client, sz_xGLXHyperpipeConfigSGIXReply,
-                  (char *) &reply);
-
-    return Success;
-}
-
-
 /************************************************************************/
 
 /*
diff --git a/glx/glxcmdsswap.c b/glx/glxcmdsswap.c
index c414dc8..ce4d69a 100644
--- a/glx/glxcmdsswap.c
+++ b/glx/glxcmdsswap.c
@@ -37,7 +37,6 @@
 #include "glxutil.h"
 #include <GL/glxtokens.h>
 #include <unpack.h>
-#include "g_disptab.h"
 #include <pixmapstr.h>
 #include <windowstr.h>
 #include "glxext.h"
diff --git a/glx/glxdri.c b/glx/glxdri.c
index 41482c9..64ebe0a 100644
--- a/glx/glxdri.c
+++ b/glx/glxdri.c
@@ -56,7 +56,6 @@
 #include "glxutil.h"
 #include "glxdricommon.h"
 
-#include "g_disptab.h"
 #include "glapitable.h"
 #include "glapi.h"
 #include "glthread.h"
diff --git a/glx/glxdri2.c b/glx/glxdri2.c
index c2305ad..ad1d31d 100644
--- a/glx/glxdri2.c
+++ b/glx/glxdri2.c
@@ -48,7 +48,6 @@
 #include "glxutil.h"
 #include "glxdricommon.h"
 
-#include "g_disptab.h"
 #include "glapitable.h"
 #include "glapi.h"
 #include "glthread.h"
diff --git a/glx/glxdriswrast.c b/glx/glxdriswrast.c
index dc12f57..08ea338 100644
--- a/glx/glxdriswrast.c
+++ b/glx/glxdriswrast.c
@@ -48,7 +48,6 @@
 #include "glxutil.h"
 #include "glxdricommon.h"
 
-#include "g_disptab.h"
 #include "glapitable.h"
 #include "glapi.h"
 #include "glthread.h"
diff --git a/glx/glxext.c b/glx/glxext.c
index f5ebe4f..4bd5d6b 100644
--- a/glx/glxext.c
+++ b/glx/glxext.c
@@ -39,7 +39,6 @@
 #include <registry.h>
 #include "privates.h"
 #include <os.h>
-#include "g_disptab.h"
 #include "unpack.h"
 #include "glxutil.h"
 #include "glxext.h"
@@ -58,7 +57,6 @@ __GLXcontext *__glXContextList;
 */
 RESTYPE __glXContextRes;
 RESTYPE __glXDrawableRes;
-RESTYPE __glXSwapBarrierRes;
 
 /*
 ** Reply for most singles.
@@ -228,19 +226,6 @@ GLboolean __glXFreeContext(__GLXcontext *cx)
     return GL_TRUE;
 }
 
-extern RESTYPE __glXSwapBarrierRes;
-
-static int SwapBarrierGone(int screen, XID drawable)
-{
-    __GLXscreen *pGlxScreen = glxGetScreen(screenInfo.screens[screen]);
-
-    if (pGlxScreen->swapBarrierFuncs) {
-        pGlxScreen->swapBarrierFuncs->bindSwapBarrierFunc(screen, drawable, 0);
-    }
-    FreeResourceByType(drawable, __glXSwapBarrierRes, FALSE);
-    return True;
-}
-
 /************************************************************************/
 
 /*
@@ -358,9 +343,7 @@ void GlxExtensionInit(void)
 					    "GLXContext");
     __glXDrawableRes = CreateNewResourceType((DeleteType)DrawableGone,
 					     "GLXDrawable");
-    __glXSwapBarrierRes = CreateNewResourceType((DeleteType)SwapBarrierGone,
-						"GLXSwapBarrier");
-    if (!__glXContextRes || !__glXDrawableRes || !__glXSwapBarrierRes)
+    if (!__glXContextRes || !__glXDrawableRes)
 	return;
 
     if (!dixRegisterPrivateKey(&glxClientPrivateKeyRec, PRIVATE_CLIENT, sizeof (__GLXclientState)))
diff --git a/glx/glxscreens.c b/glx/glxscreens.c
index 8515e14..496cf9e 100644
--- a/glx/glxscreens.c
+++ b/glx/glxscreens.c
@@ -175,8 +175,6 @@ static char GLXServerExtensions[] =
 			"GLX_SGI_make_current_read "
 #ifndef __APPLE__
 			"GLX_SGIS_multisample "
-                        "GLX_SGIX_hyperpipe "
-                        "GLX_SGIX_swap_barrier "
 #endif
 			"GLX_SGIX_fbconfig "
 			"GLX_SGIX_pbuffer "
@@ -184,31 +182,6 @@ static char GLXServerExtensions[] =
                         "GLX_INTEL_swap_event"
 			;
 
-/*
- * If your DDX driver wants to register support for swap barriers or hyperpipe
- * topology, it should call __glXHyperpipeInit() or __glXSwapBarrierInit()
- * with a dispatch table of functions to handle the requests.   In the XFree86
- * DDX, for example, you would call these near the bottom of the driver's
- * ScreenInit method, after DRI has been initialized.
- *
- * This should be replaced with a better method when we teach the server how
- * to load DRI drivers.
- */
-
-void __glXHyperpipeInit(int screen, __GLXHyperpipeExtensionFuncs *funcs)
-{
-    __GLXscreen *pGlxScreen = glxGetScreen(screenInfo.screens[screen]);
-
-    pGlxScreen->hyperpipeFuncs = funcs;
-}
-
-void __glXSwapBarrierInit(int screen, __GLXSwapBarrierExtensionFuncs *funcs)
-{
-    __GLXscreen *pGlxScreen = glxGetScreen(screenInfo.screens[screen]);
-
-    pGlxScreen->swapBarrierFuncs = funcs;
-}
-
 static Bool
 glxCloseScreen (int index, ScreenPtr pScreen)
 {
diff --git a/glx/glxscreens.h b/glx/glxscreens.h
index 861e03c..93b4109 100644
--- a/glx/glxscreens.h
+++ b/glx/glxscreens.h
@@ -35,21 +35,6 @@
  * Silicon Graphics, Inc.
  */
 
-typedef struct {
-    void * (* queryHyperpipeNetworkFunc)(int, int *, int *);
-    void * (* queryHyperpipeConfigFunc)(int, int, int *, int *);
-    int    (* destroyHyperpipeConfigFunc)(int, int);
-    void * (* hyperpipeConfigFunc)(int, int, int *, int *, void *);
-} __GLXHyperpipeExtensionFuncs;
-
-typedef struct {
-    int    (* bindSwapBarrierFunc)(int, XID, int);
-    int    (* queryMaxSwapBarriersFunc)(int);
-} __GLXSwapBarrierExtensionFuncs;
-
-void __glXHyperpipeInit(int screen, __GLXHyperpipeExtensionFuncs *funcs);
-void __glXSwapBarrierInit(int screen, __GLXSwapBarrierExtensionFuncs *funcs);
-
 typedef struct __GLXconfig __GLXconfig;
 struct __GLXconfig {
     __GLXconfig *next;
@@ -144,9 +129,6 @@ struct __GLXscreen {
     int            (*swapInterval)  (__GLXdrawable *drawable,
 				     int interval);
 
-    __GLXHyperpipeExtensionFuncs *hyperpipeFuncs;
-    __GLXSwapBarrierExtensionFuncs *swapBarrierFuncs;
-
     ScreenPtr pScreen;
 
     /* Linked list of valid fbconfigs for this screen. */
diff --git a/glx/indirect_table.c b/glx/indirect_table.c
index cb32026..01d1da3 100644
--- a/glx/indirect_table.c
+++ b/glx/indirect_table.c
@@ -30,7 +30,6 @@
 #include "glxext.h"
 #include "indirect_dispatch.h"
 #include "indirect_reqsize.h"
-#include "g_disptab.h"
 #include "indirect_table.h"
 
 /*****************************************************************/
diff --git a/glx/xfont.c b/glx/xfont.c
index b4081cf..9943784 100644
--- a/glx/xfont.c
+++ b/glx/xfont.c
@@ -35,7 +35,6 @@
 #include "glxserver.h"
 #include "glxutil.h"
 #include "unpack.h"
-#include "g_disptab.h"
 #include "glapitable.h"
 #include "glapi.h"
 #include "glthread.h"
diff --git a/hw/xquartz/GL/indirect.c b/hw/xquartz/GL/indirect.c
index 58f78fb..bdc7c3d 100644
--- a/hw/xquartz/GL/indirect.c
+++ b/hw/xquartz/GL/indirect.c
@@ -586,8 +586,6 @@ static __GLXscreen * __glXAquaScreenProbe(ScreenPtr pScreen) {
     screen->base.createContext  = __glXAquaScreenCreateContext;
     screen->base.createDrawable = __glXAquaScreenCreateDrawable;
     screen->base.swapInterval = /*FIXME*/ NULL;
-    screen->base.hyperpipeFuncs = NULL;
-    screen->base.swapBarrierFuncs = NULL;
     screen->base.pScreen       = pScreen;
     
     screen->base.fbconfigs = __glXAquaCreateVisualConfigs(&screen->base.numFBConfigs, pScreen->myNum);
diff --git a/hw/xwin/glx/indirect.c b/hw/xwin/glx/indirect.c
index 3891885..baefe04 100644
--- a/hw/xwin/glx/indirect.c
+++ b/hw/xwin/glx/indirect.c
@@ -649,8 +649,6 @@ glxWinScreenProbe(ScreenPtr pScreen)
       screen->base.createContext = glxWinCreateContext;
       screen->base.createDrawable = glxWinCreateDrawable;
       screen->base.swapInterval = glxWinScreenSwapInterval;
-      screen->base.hyperpipeFuncs = NULL;
-      screen->base.swapBarrierFuncs = NULL;
       screen->base.pScreen = pScreen;
 
       if (strstr(wgl_extensions, "WGL_ARB_pixel_format"))
-- 
1.7.3.1



More information about the xorg-devel mailing list