Rebased ref, commits from common ancestor:
commit cc648e609d472472bac4a2e568eb3598b3690ba3
Author: Michel Dänzer <[EMAIL PROTECTED]>
Date:   Tue May 22 10:51:56 2007 +0200

    EXA: Export ExaOffscreenMarkUsed.
    
    Can be used to inform EXA that an offscreen area is used outside of EXA.

diff --git a/exa/exa.h b/exa/exa.h
index cd90bbc..9ea5933 100644
--- a/exa/exa.h
+++ b/exa/exa.h
@@ -721,6 +721,9 @@ exaOffscreenAlloc(ScreenPtr pScreen, int size, int align,
 ExaOffscreenArea *
 exaOffscreenFree(ScreenPtr pScreen, ExaOffscreenArea *area);
 
+void
+ExaOffscreenMarkUsed (PixmapPtr pPixmap);
+
 unsigned long
 exaGetPixmapOffset(PixmapPtr pPix);
 
diff --git a/exa/exa_priv.h b/exa/exa_priv.h
index ece5898..a6d98cd 100644
--- a/exa/exa_priv.h
+++ b/exa/exa_priv.h
@@ -323,9 +323,6 @@ ExaCheckComposite (CARD8      op,
 
 /* exa_offscreen.c */
 void
-ExaOffscreenMarkUsed (PixmapPtr pPixmap);
-
-void
 ExaOffscreenSwapOut (ScreenPtr pScreen);
 
 void

commit e6a7198e7cd96f1fe0654cc6811a977821579258
Author: Adam Jackson <[EMAIL PROTECTED]>
Date:   Tue May 22 10:51:55 2007 +0200

    Bug #8991: Add glXGetDrawableAttributes dispatch; fix texture format 
therein.
    
    Adapted to master branch by Michel Dänzer <[EMAIL PROTECTED]>.

diff --git a/GL/glx/glxcmds.c b/GL/glx/glxcmds.c
index 932878f..ed5c138 100644
--- a/GL/glx/glxcmds.c
+++ b/GL/glx/glxcmds.c
@@ -1679,6 +1679,7 @@ DoGetDrawableAttributes(__GLXclientState *cl, XID drawId)
     xGLXGetDrawableAttributesReply reply;
     CARD32 attributes[4];
     int numAttribs;
+    PixmapPtr  pixmap;
 
     glxPixmap = (__GLXpixmap *)LookupIDByType(drawId, __glXPixmapRes);
     if (!glxPixmap) {
@@ -1693,10 +1694,19 @@ DoGetDrawableAttributes(__GLXclientState *cl, XID 
drawId)
     reply.numAttribs = numAttribs;
 
     attributes[0] = GLX_TEXTURE_TARGET_EXT;
-    attributes[1] = GLX_TEXTURE_RECTANGLE_EXT;
     attributes[2] = GLX_Y_INVERTED_EXT;
     attributes[3] = GL_FALSE;
 
+    /* XXX this is merely less wrong, see fdo bug #8991 */
+    pixmap = (PixmapPtr) glxPixmap->pDraw;
+    if ((pixmap->drawable.width & (pixmap->drawable.width - 1)) ||
+       (pixmap->drawable.height & (pixmap->drawable.height - 1))
+       /* || strstr(CALL_GetString(GL_EXTENSIONS,
+                    "GL_ARB_texture_non_power_of_two")) */)
+       attributes[1] = GLX_TEXTURE_RECTANGLE_EXT;
+    else
+       attributes[1] = GLX_TEXTURE_2D_EXT;
+
     if (client->swapped) {
        __glXSwapGetDrawableAttributesReply(client, &reply, attributes);
     } else {
diff --git a/GL/glx/indirect_dispatch.h b/GL/glx/indirect_dispatch.h
index 17a372f..24f4bed 100644
--- a/GL/glx/indirect_dispatch.h
+++ b/GL/glx/indirect_dispatch.h
@@ -211,8 +211,6 @@ extern HIDDEN int __glXDisp_ReadPixels(struct 
__GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDispSwap_ReadPixels(struct __GLXclientStateRec *, 
GLbyte *);
 extern HIDDEN void __glXDisp_EdgeFlagv(GLbyte * pc);
 extern HIDDEN void __glXDispSwap_EdgeFlagv(GLbyte * pc);
-extern HIDDEN void __glXDisp_Rotatef(GLbyte * pc);
-extern HIDDEN void __glXDispSwap_Rotatef(GLbyte * pc);
 extern HIDDEN void __glXDisp_TexParameterf(GLbyte * pc);
 extern HIDDEN void __glXDispSwap_TexParameterf(GLbyte * pc);
 extern HIDDEN void __glXDisp_TexParameteri(GLbyte * pc);
@@ -519,6 +517,8 @@ extern HIDDEN void __glXDisp_SecondaryColor3ivEXT(GLbyte * 
pc);
 extern HIDDEN void __glXDispSwap_SecondaryColor3ivEXT(GLbyte * pc);
 extern HIDDEN void __glXDisp_TexCoord4iv(GLbyte * pc);
 extern HIDDEN void __glXDispSwap_TexCoord4iv(GLbyte * pc);
+extern HIDDEN int __glXDisp_GetDrawableAttributesSGIX(struct 
__GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDispSwap_GetDrawableAttributesSGIX(struct 
__GLXclientStateRec *, GLbyte *);
 extern HIDDEN void __glXDisp_SampleMaskSGIS(GLbyte * pc);
 extern HIDDEN void __glXDispSwap_SampleMaskSGIS(GLbyte * pc);
 extern HIDDEN void __glXDisp_ColorTableParameteriv(GLbyte * pc);
@@ -849,10 +849,8 @@ extern HIDDEN int __glXDisp_GetHistogramParameteriv(struct 
__GLXclientStateRec *
 extern HIDDEN int __glXDispSwap_GetHistogramParameteriv(struct 
__GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDisp_GetHistogramParameterivEXT(struct 
__GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDispSwap_GetHistogramParameterivEXT(struct 
__GLXclientStateRec *, GLbyte *);
-extern HIDDEN int __glXDisp_GetConvolutionFilter(struct __GLXclientStateRec *, 
GLbyte *);
-extern HIDDEN int __glXDispSwap_GetConvolutionFilter(struct 
__GLXclientStateRec *, GLbyte *);
-extern HIDDEN int __glXDisp_GetConvolutionFilterEXT(struct __GLXclientStateRec 
*, GLbyte *);
-extern HIDDEN int __glXDispSwap_GetConvolutionFilterEXT(struct 
__GLXclientStateRec *, GLbyte *);
+extern HIDDEN void __glXDisp_Rotatef(GLbyte * pc);
+extern HIDDEN void __glXDispSwap_Rotatef(GLbyte * pc);
 extern HIDDEN int __glXDisp_GetProgramivARB(struct __GLXclientStateRec *, 
GLbyte *);
 extern HIDDEN int __glXDispSwap_GetProgramivARB(struct __GLXclientStateRec *, 
GLbyte *);
 extern HIDDEN void __glXDisp_BlendFuncSeparateEXT(GLbyte * pc);
@@ -877,6 +875,10 @@ extern HIDDEN void __glXDisp_Map2f(GLbyte * pc);
 extern HIDDEN void __glXDispSwap_Map2f(GLbyte * pc);
 extern HIDDEN void __glXDisp_ProgramStringARB(GLbyte * pc);
 extern HIDDEN void __glXDispSwap_ProgramStringARB(GLbyte * pc);
+extern HIDDEN int __glXDisp_GetConvolutionFilter(struct __GLXclientStateRec *, 
GLbyte *);
+extern HIDDEN int __glXDispSwap_GetConvolutionFilter(struct 
__GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDisp_GetConvolutionFilterEXT(struct __GLXclientStateRec 
*, GLbyte *);
+extern HIDDEN int __glXDispSwap_GetConvolutionFilterEXT(struct 
__GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDisp_GetCompressedTexImageARB(struct 
__GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDispSwap_GetCompressedTexImageARB(struct 
__GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDisp_GetTexGenfv(struct __GLXclientStateRec *, GLbyte 
*);
diff --git a/GL/glx/indirect_table.c b/GL/glx/indirect_table.c
index 60d6760..9d0383c 100644
--- a/GL/glx/indirect_table.c
+++ b/GL/glx/indirect_table.c
@@ -1231,8 +1231,8 @@ const struct __glXDispatchInfo Render_dispatch_info = {
 };
 
 /*****************************************************************/
-/* tree depth = 13 */
-static const int_fast16_t VendorPriv_dispatch_tree[155] = {
+/* tree depth = 12 */
+static const int_fast16_t VendorPriv_dispatch_tree[152] = {
     /* [0] -> opcode range [0, 131072], node depth 1 */
     2,
     5,
@@ -1474,17 +1474,12 @@ static const int_fast16_t VendorPriv_dispatch_tree[155] 
= {
 
     /* [149] -> opcode range [65536, 65568], node depth 12 */
     1,
-    152,
-    EMPTY_LEAF,
-
-    /* [152] -> opcode range [65536, 65552], node depth 13 */
-    1,
     LEAF(88),
     EMPTY_LEAF,
 
 };
 
-static const void *VendorPriv_function_table[96][2] = {
+static const void *VendorPriv_function_table[104][2] = {
     /* [  0] =     0 */ {NULL, NULL},
     /* [  1] =     1 */ {__glXDisp_GetConvolutionFilterEXT, 
__glXDispSwap_GetConvolutionFilterEXT},
     /* [  2] =     2 */ {__glXDisp_GetConvolutionParameterfvEXT, 
__glXDispSwap_GetConvolutionParameterfvEXT},
@@ -1581,6 +1576,14 @@ static const void *VendorPriv_function_table[96][2] = {
     /* [ 93] = 65541 */ {__glXDisp_CreateContextWithConfigSGIX, 
__glXDispSwap_CreateContextWithConfigSGIX},
     /* [ 94] = 65542 */ {__glXDisp_CreateGLXPixmapWithConfigSGIX, 
__glXDispSwap_CreateGLXPixmapWithConfigSGIX},
     /* [ 95] = 65543 */ {NULL, NULL},
+    /* [ 96] = 65544 */ {NULL, NULL},
+    /* [ 97] = 65545 */ {NULL, NULL},
+    /* [ 98] = 65546 */ {__glXDisp_GetDrawableAttributesSGIX, 
__glXDispSwap_GetDrawableAttributesSGIX},
+    /* [ 99] = 65547 */ {NULL, NULL},
+    /* [ 100] = 65548 */ {NULL, NULL},
+    /* [ 101] = 65549 */ {NULL, NULL},
+    /* [ 102] = 65550 */ {NULL, NULL},
+    /* [ 103] = 65551 */ {NULL, NULL},
 };
 
 const struct __glXDispatchInfo VendorPriv_dispatch_info = {

commit 6324bfc468f7a645d2fee59f1c921a4328a4639f
Author: Michel Dänzer <[EMAIL PROTECTED]>
Date:   Tue May 22 10:51:53 2007 +0200

    AIGLX: Zero-copy texture-from-pixmap.
    
    When available, use the 2D driver texOffsetStart hook and the 3D driver
    setTexOffset hook to save the overhead of passing the pixmap data to
    glTex(Sub)Image.
    
    The basic idea is to update the driver specific 'offset' for bound pixmaps
    before dispatching a GLX render request and to flush immediately afterwards
    if there are any pixmaps bound. This should ensure that the 3D driver can
    use pixmaps for texturing directly regardless of the X server moving them
    around.

diff --git a/GL/glx/glxdrawable.h b/GL/glx/glxdrawable.h
index 20e9b43..6500cc7 100644
--- a/GL/glx/glxdrawable.h
+++ b/GL/glx/glxdrawable.h
@@ -42,6 +42,10 @@
 
 #include <damage.h>
 
+#ifdef XF86DRI
+#include <GL/internal/dri_interface.h>
+#endif
+
 typedef struct {
 
     DrawablePtr pDraw;
@@ -50,7 +54,12 @@ typedef struct {
     ScreenPtr pScreen;
     Bool idExists;
     int refcnt;
+#ifdef XF86DRI
     DamagePtr pDamage;
+    __DRIcontext *pDRICtx;
+    GLint texname;
+    unsigned long offset;
+#endif
 } __GLXpixmap;
 
 struct __GLXdrawable {
diff --git a/GL/glx/glxdri.c b/GL/glx/glxdri.c
index c30f372..d93d460 100644
--- a/GL/glx/glxdri.c
+++ b/GL/glx/glxdri.c
@@ -76,6 +76,11 @@ struct __GLXDRIscreen {
     xf86EnterVTProc *enterVT;
     xf86LeaveVTProc *leaveVT;
 
+    DRITexOffsetStartProcPtr texOffsetStart;
+    DRITexOffsetFinishProcPtr texOffsetFinish;
+    __GLXpixmap* texOffsetOverride[16];
+    GLuint lastTexOffsetOverride;
+
     unsigned char glx_enable_bits[__GLX_EXT_BYTES];
 };
 
@@ -125,30 +130,75 @@ struct __GLXDRIdrawable {
 static const char CREATE_NEW_SCREEN_FUNC[] =
     "__driCreateNewScreen_" STRINGIFY (INTERNAL_VERSION);
 
-/* The DRI driver entry point version wasn't bumped when the
- * copySubBuffer functionality was added to the DRI drivers, but the
- * functionality is still conditional on the value of the
- * internal_api_version passed to __driCreateNewScreen.  However, the
- * screen constructor doesn't fail for a DRI driver that's older than
- * the passed in version number, so there's no way we can know for
- * sure that we can actually use the copySubBuffer functionality.  But
- * since the earliest (and at this point only) released mesa version
- * (6.5) that uses the 20050727 entry point does have copySubBuffer,
- * we'll just settle for that.  We still have to pass in a higher to
- * the screen constructor to enable the functionality.
- */
-#define COPY_SUB_BUFFER_INTERNAL_VERSION 20060314
 
 static void
-__glXDRIleaveServer(void)
+__glXDRIleaveServer(GLboolean rendering)
 {
-  DRIBlockHandler(NULL, NULL, NULL);
+    int i;
+
+    for (i = 0; rendering && i < screenInfo.numScreens; i++) {
+       __GLXDRIscreen * const screen =
+           (__GLXDRIscreen *) __glXgetActiveScreen(i);
+       GLuint lastOverride = screen->lastTexOffsetOverride;
+
+       if (lastOverride) {
+           __GLXpixmap **texOffsetOverride = screen->texOffsetOverride;
+           int j;
+
+           for (j = 0; j < lastOverride; j++) {
+               __GLXpixmap *pGlxPix = texOffsetOverride[j];
+
+               if (pGlxPix && pGlxPix->texname) {
+                   pGlxPix->offset =
+                       screen->texOffsetStart((PixmapPtr)pGlxPix->pDraw);
+               }
+           }
+       }
+    }
+
+    DRIBlockHandler(NULL, NULL, NULL);
+
+    for (i = 0; rendering && i < screenInfo.numScreens; i++) {
+       __GLXDRIscreen * const screen =
+           (__GLXDRIscreen *) __glXgetActiveScreen(i);
+       GLuint lastOverride = screen->lastTexOffsetOverride;
+
+       if (lastOverride) {
+           __GLXpixmap **texOffsetOverride = screen->texOffsetOverride;
+           int j;
+
+           for (j = 0; j < lastOverride; j++) {
+               __GLXpixmap *pGlxPix = texOffsetOverride[j];
+
+               if (pGlxPix && pGlxPix->texname) {
+                   screen->driScreen.setTexOffset(pGlxPix->pDRICtx,
+                                                  pGlxPix->texname,
+                                                  pGlxPix->offset,
+                                                  pGlxPix->pDraw->depth,
+                                                  ((PixmapPtr)pGlxPix->pDraw)->
+                                                  devKind);
+               }
+           }
+       }
+    }
 }
     
 static void
-__glXDRIenterServer(void)
+__glXDRIenterServer(GLboolean rendering)
 {
-  DRIWakeupHandler(NULL, 0, NULL);
+    int i;
+
+    for (i = 0; rendering && i < screenInfo.numScreens; i++) {
+       __GLXDRIscreen * const screen =
+           (__GLXDRIscreen *) __glXgetActiveScreen(i);
+
+       if (screen->lastTexOffsetOverride) {
+           CALL_Flush(GET_DISPATCH(), ());
+           break;
+       }
+    }
+
+    DRIWakeupHandler(NULL, 0, NULL);
 }
 
 /**
@@ -289,19 +339,6 @@ __glXDRIcontextForceCurrent(__GLXcontext *baseContext)
                                              &context->driContext);
 }
 
-static int
-glxCountBits(int word)
-{
-    int ret = 0;
-
-    while (word) {
-        ret += (word & 1);
-        word >>= 1;
-    }
-
-    return ret;
-}
-
 static void
 glxFillAlphaChannel (PixmapPtr pixmap, int x, int y, int width, int height)
 {
@@ -335,19 +372,75 @@ __glXDRIbindTexImage(__GLXcontext *baseContext,
                     int buffer,
                     __GLXpixmap *glxPixmap)
 {
-    RegionPtr  pRegion;
+    RegionPtr  pRegion = NULL;
     PixmapPtr  pixmap;
-    int                bpp;
+    int                w, h, bpp, override = 0;
     GLenum     target, format, type;
+    ScreenPtr pScreen = glxPixmap->pScreen;
+    __GLXDRIscreen * const screen =
+       (__GLXDRIscreen *) __glXgetActiveScreen(pScreen->myNum);
 
     pixmap = (PixmapPtr) glxPixmap->pDraw;
+    w = pixmap->drawable.width;
+    h = pixmap->drawable.height;
+
+    if (h & (h - 1) || w & (w - 1))
+       target = GL_TEXTURE_RECTANGLE_ARB;
+    else
+       target = GL_TEXTURE_2D;
+
+    if (screen->texOffsetStart && screen->driScreen.setTexOffset) {
+       __GLXpixmap **texOffsetOverride = screen->texOffsetOverride;
+       int i, firstEmpty = 16, texname;
+
+       for (i = 0; i < 16; i++) {
+           if (texOffsetOverride[i] == glxPixmap)
+               goto alreadyin; 
+
+           if (firstEmpty == 16 && !texOffsetOverride[i])
+               firstEmpty = i;
+       }
+
+       if (firstEmpty == 16) {
+           ErrorF("%s: Failed to register texture offset override\n", 
__func__);
+           goto nooverride;
+       }
+
+       if (firstEmpty >= screen->lastTexOffsetOverride)
+           screen->lastTexOffsetOverride = firstEmpty + 1;
+
+       texOffsetOverride[firstEmpty] = glxPixmap;
+
+alreadyin:
+       override = 1;
+
+       glxPixmap->pDRICtx = &((__GLXDRIcontext*)baseContext)->driContext;
+
+       CALL_GetIntegerv(GET_DISPATCH(), (target == GL_TEXTURE_2D ?
+                                         GL_TEXTURE_BINDING_2D :
+                                         GL_TEXTURE_BINDING_RECTANGLE_NV,
+                                         &texname));
+
+       if (texname == glxPixmap->texname)
+           return Success;
+
+       glxPixmap->texname = texname;
+
+       screen->driScreen.setTexOffset(glxPixmap->pDRICtx, texname, 0,
+                                      pixmap->drawable.depth, pixmap->devKind);
+    }
+nooverride:
+
     if (!glxPixmap->pDamage) {
-        glxPixmap->pDamage = DamageCreate(NULL, NULL, DamageReportNone,
-                                         TRUE, glxPixmap->pScreen, NULL);
-       if (!glxPixmap->pDamage)
-            return BadAlloc;
+       if (!override) {
+           glxPixmap->pDamage = DamageCreate(NULL, NULL, DamageReportNone,
+                                             TRUE, pScreen, NULL);
+           if (!glxPixmap->pDamage)
+               return BadAlloc;
+
+           DamageRegister ((DrawablePtr) pixmap, glxPixmap->pDamage);
+       }
 
-       DamageRegister ((DrawablePtr) pixmap, glxPixmap->pDamage);
        pRegion = NULL;
     } else {
        pRegion = DamageRegion(glxPixmap->pDamage);
@@ -360,30 +453,22 @@ __glXDRIbindTexImage(__GLXcontext *baseContext,
        bpp = 4;
        format = GL_BGRA;
        type =
-#if X_BYTE_ORDER == X_LITTLE_ENDIAN
-           GL_UNSIGNED_BYTE;
-#else
-           GL_UNSIGNED_INT_8_8_8_8_REV;
+#if X_BYTE_ORDER == X_BIG_ENDIAN
+           !override ? GL_UNSIGNED_INT_8_8_8_8_REV :
 #endif
+           GL_UNSIGNED_BYTE;
     } else {
        bpp = 2;
        format = GL_RGB;
        type = GL_UNSIGNED_SHORT_5_6_5;
     }
 
-    if (!(glxCountBits(pixmap->drawable.width) == 1 &&
-         glxCountBits(pixmap->drawable.height) == 1)
-       /* || strstr(CALL_GetString(GL_EXTENSIONS,
-                    "GL_ARB_texture_non_power_of_two")) */)
-       target = GL_TEXTURE_RECTANGLE_ARB;
-    else
-       target = GL_TEXTURE_2D;
-
     CALL_PixelStorei( GET_DISPATCH(), (GL_UNPACK_ROW_LENGTH,
                                       pixmap->devKind / bpp) );
+
     if (pRegion == NULL)
     {
-       if (pixmap->drawable.depth == 24)
+       if (!override && pixmap->drawable.depth == 24)
            glxFillAlphaChannel(pixmap,
                                pixmap->drawable.x,
                                pixmap->drawable.y,
@@ -404,8 +489,8 @@ __glXDRIbindTexImage(__GLXcontext *baseContext,
                          0,
                          format,
                          type,
-                         pixmap->devPrivate.ptr) );
-    } else {
+                         override ? NULL : pixmap->devPrivate.ptr) );
+    } else if (!override) {
         int i, numRects;
        BoxPtr p;
 
@@ -436,7 +521,8 @@ __glXDRIbindTexImage(__GLXcontext *baseContext,
        }
     }
 
-    DamageEmpty(glxPixmap->pDamage);
+    if (!override)
+       DamageEmpty(glxPixmap->pDamage);
 
     return Success;
 }
@@ -446,6 +532,40 @@ __glXDRIreleaseTexImage(__GLXcontext *baseContext,
                        int buffer,
                        __GLXpixmap *pixmap)
 {
+    ScreenPtr pScreen = pixmap->pScreen;
+    __GLXDRIscreen * const screen =
+       (__GLXDRIscreen *) __glXgetActiveScreen(pScreen->myNum);
+    GLuint lastOverride = screen->lastTexOffsetOverride;
+
+    if (lastOverride) {
+       __GLXpixmap **texOffsetOverride = screen->texOffsetOverride;
+       int i;
+
+       for (i = 0; i < lastOverride; i++) {
+           if (texOffsetOverride[i] == pixmap) {
+               if (screen->texOffsetFinish)
+                   screen->texOffsetFinish((PixmapPtr)pixmap->pDraw);
+
+               texOffsetOverride[i] = NULL;
+
+               if (i + 1 == lastOverride) {
+                   lastOverride = 0;
+
+                   while (i--) {
+                       if (texOffsetOverride[i]) {
+                           lastOverride = i + 1;
+                           break;
+                       }
+                   }
+
+                   screen->lastTexOffsetOverride = lastOverride;
+
+                   break;
+               }
+           }
+       }
+    }
+
     return Success;
 }
 
@@ -666,9 +786,9 @@ static GLboolean createContext(__DRInativeDisplay *dpy, int 
screen,
     fakeID = FakeClientID(0);
     *(XID *) contextID = fakeID;
 
-    __glXDRIenterServer();
+    __glXDRIenterServer(GL_FALSE);
     retval = DRICreateContext(pScreen, visual, fakeID, hw_context);
-    __glXDRIleaveServer();
+    __glXDRIleaveServer(GL_FALSE);
     return retval;
 }
 
@@ -677,9 +797,9 @@ static GLboolean destroyContext(__DRInativeDisplay *dpy, 
int screen,
 {
     GLboolean retval;
 
-    __glXDRIenterServer();
+    __glXDRIenterServer(GL_FALSE);
     retval = DRIDestroyContext(screenInfo.screens[screen], context);
-    __glXDRIleaveServer();
+    __glXDRIleaveServer(GL_FALSE);
     return retval;
 }
 
@@ -694,12 +814,12 @@ createDrawable(__DRInativeDisplay *dpy, int screen,
     if (!pDrawable)
        return GL_FALSE;
 
-    __glXDRIenterServer();
+    __glXDRIenterServer(GL_FALSE);
     retval = DRICreateDrawable(screenInfo.screens[screen],
                            drawable,
                            pDrawable,
                            hHWDrawable);
-    __glXDRIleaveServer();
+    __glXDRIleaveServer(GL_FALSE);
     return retval;
 }
 
@@ -713,11 +833,11 @@ destroyDrawable(__DRInativeDisplay *dpy, int screen, 
__DRIid drawable)
     if (!pDrawable)
        return GL_FALSE;
 
-    __glXDRIenterServer();
+    __glXDRIenterServer(GL_FALSE);
     retval = DRIDestroyDrawable(screenInfo.screens[screen],
                             drawable,
                             pDrawable);
-    __glXDRIleaveServer();
+    __glXDRIleaveServer(GL_FALSE);
     return retval;
 }
 
@@ -754,14 +874,14 @@ getDrawableInfo(__DRInativeDisplay *dpy, int screen,
        return GL_FALSE;
     }
 
-    __glXDRIenterServer();
+    __glXDRIenterServer(GL_FALSE);
     retval = DRIGetDrawableInfo(screenInfo.screens[screen],
                                pDrawable, index, stamp,
                                x, y, width, height,
                                numClipRects, &pClipRects,
                                backX, backY,
                                numBackClipRects, &pBackClipRects);
-    __glXDRIleaveServer();
+    __glXDRIleaveServer(GL_FALSE);
 
     if (*numClipRects > 0) {
        size = sizeof (drm_clip_rect_t) * *numClipRects;
@@ -866,7 +986,7 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
     __DRIframebuffer  framebuffer;
     int   fd = -1;
     int   status;
-    int api_ver = COPY_SUB_BUFFER_INTERNAL_VERSION;
+    int api_ver = 20070121;
     drm_magic_t magic;
     drmVersionPtr version;
     int newlyopened;
@@ -1048,6 +1168,9 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
        goto handle_error;
     }
 
+    DRIGetTexOffsetFuncs(pScreen, &screen->texOffsetStart,
+                        &screen->texOffsetFinish);
+
     __glXScreenInit(&screen->base, pScreen);
 
     buffer_size = __glXGetExtensionString(screen->glx_enable_bits, NULL);
diff --git a/GL/glx/glxext.c b/GL/glx/glxext.c
index ca874e3..c09120c 100644
--- a/GL/glx/glxext.c
+++ b/GL/glx/glxext.c
@@ -238,9 +238,9 @@ GLboolean __glXFreeContext(__GLXcontext *cx)
      * the latter case we need to lift the DRI lock manually. */
 
     if (!glxBlockClients) {
-       __glXleaveServer();
+       __glXleaveServer(GL_FALSE);
        cx->destroy(cx);
-       __glXenterServer();
+       __glXenterServer(GL_FALSE);
     } else {
        cx->next = glxPendingDestroyContexts;
        glxPendingDestroyContexts = cx;
@@ -439,49 +439,49 @@ void glxResumeClients(void)
        AttendClient(__glXClients[i]->client);
     }
 
-    __glXleaveServer();
+    __glXleaveServer(GL_FALSE);
     for (cx = glxPendingDestroyContexts; cx != NULL; cx = next) {
        next = cx->next;
 
        cx->destroy(cx);
     }
     glxPendingDestroyContexts = NULL;
-    __glXenterServer();
+    __glXenterServer(GL_FALSE);
 }
 
 static void
-__glXnopEnterServer(void)
+__glXnopEnterServer(GLboolean rendering)
 {
 }
     
 static void
-__glXnopLeaveServer(void)
+__glXnopLeaveServer(GLboolean rendering)
 {
 }
 
-static void (*__glXenterServerFunc)(void) = __glXnopEnterServer;
-static void (*__glXleaveServerFunc)(void)  = __glXnopLeaveServer;
+static void (*__glXenterServerFunc)(GLboolean) = __glXnopEnterServer;
+static void (*__glXleaveServerFunc)(GLboolean)  = __glXnopLeaveServer;
 
-void __glXsetEnterLeaveServerFuncs(void (*enter)(void),
-                                  void (*leave)(void))
+void __glXsetEnterLeaveServerFuncs(void (*enter)(GLboolean),
+                                  void (*leave)(GLboolean))
 {
   __glXenterServerFunc = enter;
   __glXleaveServerFunc = leave;
 }
 
 
-void __glXenterServer(void)
+void __glXenterServer(GLboolean rendering)
 {
   glxServerLeaveCount--;
 
   if (glxServerLeaveCount == 0)
-    (*__glXenterServerFunc)();
+    (*__glXenterServerFunc)(rendering);
 }
 
-void __glXleaveServer(void)
+void __glXleaveServer(GLboolean rendering)
 {
   if (glxServerLeaveCount == 0)
-    (*__glXleaveServerFunc)();
+    (*__glXleaveServerFunc)(rendering);
 
   glxServerLeaveCount++;
 }
@@ -546,11 +546,12 @@ static int __glXDispatch(ClientPtr client)
                                                                       opcode,
                                                                       
client->swapped);
     if (proc != NULL) {
-       __glXleaveServer();
+       GLboolean rendering = opcode <= X_GLXRenderLarge;
+       __glXleaveServer(rendering);
 
        retval = (*proc)(cl, (GLbyte *) stuff);
 
-       __glXenterServer();
+       __glXenterServer(rendering);
     }
     else {
        retval = BadRequest;
diff --git a/GL/glx/glxglcore.c b/GL/glx/glxglcore.c
index b50740c..df9be07 100644
--- a/GL/glx/glxglcore.c
+++ b/GL/glx/glxglcore.c
@@ -106,11 +106,11 @@ __glXMesaDrawableSwapBuffers(__GLXdrawable *base)
      * why we need to re-take the lock and swap in the server context
      * before calling XMesaSwapBuffers() here.  /me shakes head. */
 
-    __glXenterServer();
+    __glXenterServer(GL_FALSE);
 
     XMesaSwapBuffers(glxPriv->xm_buf);
 
-    __glXleaveServer();
+    __glXleaveServer(GL_FALSE);
 
     return GL_TRUE;
 }
diff --git a/GL/glx/glxserver.h b/GL/glx/glxserver.h
index 49cad73..fa09c15 100644
--- a/GL/glx/glxserver.h
+++ b/GL/glx/glxserver.h
@@ -131,10 +131,10 @@ struct __GLXprovider {
 
 void GlxPushProvider(__GLXprovider *provider);
 
-void __glXsetEnterLeaveServerFuncs(void (*enter)(void),
-                                  void (*leave)(void));
-void __glXenterServer(void);
-void __glXleaveServer(void);
+void __glXsetEnterLeaveServerFuncs(void (*enter)(GLboolean),
+                                  void (*leave)(GLboolean));
+void __glXenterServer(GLboolean rendering);
+void __glXleaveServer(GLboolean rendering);
 
 void glxSuspendClients(void);
 void glxResumeClients(void);

commit 5006d08d7fc56d3d380cc6b75297f94e8594eb54
Author: Michel Dänzer <[EMAIL PROTECTED]>
Date:   Tue May 22 10:51:52 2007 +0200

    DRI: Add TexOffset driver hooks.
    
    To be used by AIGLX for GLX_EXT_texture_from_pixmap without several data 
copies.
    
    The texOffsetStart hook must make sure that the given pixmap is accessible 
by
    the GPU for texturing and return an 'offset' that can be used by the 3D
    driver for that purpose.
    
    The texOffsetFinish hook is called when the pixmap is no longer being used 
for
    texturing.

diff --git a/hw/xfree86/dri/dri.c b/hw/xfree86/dri/dri.c
index 355d281..fae0b43 100644
--- a/hw/xfree86/dri/dri.c
+++ b/hw/xfree86/dri/dri.c
@@ -2210,6 +2210,19 @@ DRIGetContext(ScreenPtr pScreen)
     return pDRIPriv->myContext;
 }
 
+void
+DRIGetTexOffsetFuncs(ScreenPtr pScreen,
+                    DRITexOffsetStartProcPtr *texOffsetStartFunc,
+                    DRITexOffsetFinishProcPtr *texOffsetFinishFunc)
+{
+    DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+
+    if (!pDRIPriv) return;
+
+    *texOffsetStartFunc  = pDRIPriv->pDriverInfo->texOffsetStart;
+    *texOffsetFinishFunc = pDRIPriv->pDriverInfo->texOffsetFinish;
+}
+
 /* This lets get at the unwrapped functions so that they can correctly
  * call the lowerlevel functions, and choose whether they will be
  * called at every level of recursion (eg in validatetree).
diff --git a/hw/xfree86/dri/dri.h b/hw/xfree86/dri/dri.h
index a21338a..e49bb6f 100644
--- a/hw/xfree86/dri/dri.h
+++ b/hw/xfree86/dri/dri.h
@@ -107,9 +107,12 @@ typedef struct {
  */
 
 #define DRIINFO_MAJOR_VERSION   5
-#define DRIINFO_MINOR_VERSION   2
+#define DRIINFO_MINOR_VERSION   3
 #define DRIINFO_PATCH_VERSION   0
 
+typedef unsigned long long (*DRITexOffsetStartProcPtr)(PixmapPtr pPix);
+typedef void (*DRITexOffsetFinishProcPtr)(PixmapPtr pPix);
+
 typedef struct {
     /* driver call back functions
      *
@@ -180,6 +183,10 @@ typedef struct {
     /* New with DRI version 5.2.0 */
     Bool                allocSarea;
     Bool                keepFDOpen;
+
+    /* New with DRI version 5.3.0 */
+    DRITexOffsetStartProcPtr  texOffsetStart;
+    DRITexOffsetFinishProcPtr texOffsetFinish;
 } DRIInfoRec, *DRIInfoPtr;
 
 
@@ -358,7 +365,9 @@ extern void *DRIMasterSareaPointer(ScrnInfoPtr pScrn);
 
 extern drm_handle_t DRIMasterSareaHandle(ScrnInfoPtr pScrn);
 
-
+extern void DRIGetTexOffsetFuncs(ScreenPtr pScreen,
+                                DRITexOffsetStartProcPtr *texOffsetStartFunc,
+                                DRITexOffsetFinishProcPtr 
*texOffsetFinishFunc);
 
 #define _DRI_H_
 

commit ff2eae86b6a8760befbbc5d605debebe7b024c05
Author: David Nusinow <[EMAIL PROTECTED]>
Date:   Mon May 21 19:50:04 2007 -0400

    Fix boolean thinko that prevented working without a server layout

diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c
index 7f1105f..67e8af4 100644
--- a/hw/xfree86/common/xf86Config.c
+++ b/hw/xfree86/common/xf86Config.c
@@ -1809,7 +1809,7 @@ configImpliedLayout(serverLayoutPtr servlayoutp, 
XF86ConfScreenPtr conf_screen)
     indp = xnfalloc(sizeof(IDevRec));
     indp->identifier = NULL;
     servlayoutp->inputs = indp;
-    if (!xf86Info.allowEmptyInput && checkCoreInputDevices(servlayoutp, TRUE))
+    if (!xf86Info.allowEmptyInput && !checkCoreInputDevices(servlayoutp, TRUE))
        return FALSE;
     
     return TRUE;

commit 56fd92715567cd32e4b725b3791de9ac4e3879aa
Author: Soren Sandmann Pedersen <[EMAIL PROTECTED]>
Date:   Mon May 21 20:00:25 2007 -0400

    Remove fast path code from fbpict.c
    
    Remove the various fast path functions from fbpict, and instead use
    pixman_image_composite().

diff --git a/fb/fbpict.c b/fb/fbpict.c
index 84d19ac..eb78ced 100644
--- a/fb/fbpict.c
+++ b/fb/fbpict.c
@@ -39,898 +39,6 @@
 #include "fbpict.h"
 #include "fbmmx.h"
 
-CARD32
-fbOver (CARD32 x, CARD32 y)
-{
-    CARD16  a = ~x >> 24;
-    CARD16  t;
-    CARD32  m,n,o,p;
-
-    m = FbOverU(x,y,0,a,t);
-    n = FbOverU(x,y,8,a,t);
-    o = FbOverU(x,y,16,a,t);
-    p = FbOverU(x,y,24,a,t);
-    return m|n|o|p;
-}
-
-CARD32
-fbOver24 (CARD32 x, CARD32 y)
-{
-    CARD16  a = ~x >> 24;
-    CARD16  t;
-    CARD32  m,n,o;
-
-    m = FbOverU(x,y,0,a,t);
-    n = FbOverU(x,y,8,a,t);
-    o = FbOverU(x,y,16,a,t);
-    return m|n|o;
-}
-
-CARD32
-fbIn (CARD32 x, CARD8 y)
-{
-    CARD16  a = y;
-    CARD16  t;
-    CARD32  m,n,o,p;
-
-    m = FbInU(x,0,a,t);
-    n = FbInU(x,8,a,t);
-    o = FbInU(x,16,a,t);
-    p = FbInU(x,24,a,t);
-    return m|n|o|p;
-}
-
-/*
- * Naming convention:
- *
- *  opSRCxMASKxDST
- */
-
-void
-fbCompositeSolidMask_nx8x8888 (CARD8      op,
-                              PicturePtr pSrc,
-                              PicturePtr pMask,
-                              PicturePtr pDst,
-                              INT16      xSrc,
-                              INT16      ySrc,
-                              INT16      xMask,
-                              INT16      yMask,
-                              INT16      xDst,
-                              INT16      yDst,
-                              CARD16     width,
-                              CARD16     height)
-{
-    CARD32     src, srca;
-    CARD32     *dstLine, *dst, d, dstMask;
-    CARD8      *maskLine, *mask, m;
-    FbStride   dstStride, maskStride;
-    CARD16     w;
-
-    fbComposeGetSolid(pSrc, src, pDst->format);
-
-    dstMask = FbFullMask (pDst->pDrawable->depth);
-    srca = src >> 24;
-    if (src == 0)
-       return;
-
-    fbComposeGetStart (pDst, xDst, yDst, CARD32, dstStride, dstLine, 1);
-    fbComposeGetStart (pMask, xMask, yMask, CARD8, maskStride, maskLine, 1);
-
-    while (height--)
-    {
-       dst = dstLine;
-       dstLine += dstStride;
-       mask = maskLine;
-       maskLine += maskStride;
-       w = width;
-
-       while (w--)
-       {
-           m = READ(mask++);
-           if (m == 0xff)
-           {
-               if (srca == 0xff)
-                   WRITE(dst, src & dstMask);
-               else
-                   WRITE(dst, fbOver (src, READ(dst)) & dstMask);
-           }
-           else if (m)
-           {
-               d = fbIn (src, m);
-               WRITE(dst, fbOver (d, READ(dst)) & dstMask);
-           }
-           dst++;
-       }
-    }
-
-    fbFinishAccess (pMask->pDrawable);
-    fbFinishAccess (pDst->pDrawable);
-}
-
-void
-fbCompositeSolidMask_nx8888x8888C (CARD8      op,
-                                  PicturePtr pSrc,
-                                  PicturePtr pMask,
-                                  PicturePtr pDst,
-                                  INT16      xSrc,
-                                  INT16      ySrc,
-                                  INT16      xMask,
-                                  INT16      yMask,
-                                  INT16      xDst,
-                                  INT16      yDst,
-                                  CARD16     width,
-                                  CARD16     height)
-{
-    CARD32     src, srca;
-    CARD32     *dstLine, *dst, d, dstMask;
-    CARD32     *maskLine, *mask, ma;
-    FbStride   dstStride, maskStride;
-    CARD16     w;
-    CARD32     m, n, o, p;
-
-    fbComposeGetSolid(pSrc, src, pDst->format);
-
-    dstMask = FbFullMask (pDst->pDrawable->depth);
-    srca = src >> 24;
-    if (src == 0)


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to