The Mesa patch below helps to make the data passed between 
the Xserver and an DRI client in the GetDeviceInfo request of
the DRI extension independ of the machine size - a prerequisite 
to support mixing of 32 and 64bit DRI clients.

The patch eliminates the need to use of drmAddress in these 
structures.
drmAddress is unsigned long and therefore machine size dependent.

Furthermore it fixes a bug in the MGA DRI module which makes the
assumption that a 'handle' is a base address of a mapped area.
Appearantly the affected code is not used any more with the latest
versions of DRM.

Like the patches to libdrm none of these fixes should raise any
compatibility issues.
I suggest to postpone the changes which eliminate drmAddress from
these structures and make drm_handle_t unsigned int until all 
other things are in place and do them all at once as they will 
change the ABI between the Xserver and DRI clients.

Egbert.

Index: src/mesa/drivers/dri/ffb/ffb_xmesa.c
===================================================================
RCS file: /cvs/mesa/Mesa/src/mesa/drivers/dri/ffb/ffb_xmesa.c,v
retrieving revision 1.8
diff -u -r1.8 ffb_xmesa.c
--- src/mesa/drivers/dri/ffb/ffb_xmesa.c        4 May 2005 20:11:36 -0000       
1.8
+++ src/mesa/drivers/dri/ffb/ffb_xmesa.c        15 Jul 2005 09:48:05 -0000
@@ -61,6 +61,7 @@
 {
        ffbScreenPrivate *ffbScreen;
        FFBDRIPtr gDRIPriv = (FFBDRIPtr) sPriv->pDevPriv;
+       drmAddress map;
 
        if (getenv("LIBGL_FORCE_XSERVER"))
                return GL_FALSE;
@@ -74,59 +75,59 @@
        if (drmMap(sPriv->fd,
                   gDRIPriv->hFbcRegs,
                   gDRIPriv->sFbcRegs,
-                  &gDRIPriv->mFbcRegs)) {
+                  &map)) {
                FREE(ffbScreen);
                return GL_FALSE;
        }
-       ffbScreen->regs = (ffb_fbcPtr) gDRIPriv->mFbcRegs;
+       ffbScreen->regs = (ffb_fbcPtr) map;
 
        /* Map ramdac registers. */
        if (drmMap(sPriv->fd,
                   gDRIPriv->hDacRegs,
                   gDRIPriv->sDacRegs,
-                  &gDRIPriv->mDacRegs)) {
-               drmUnmap(gDRIPriv->mFbcRegs, gDRIPriv->sFbcRegs);
+                  &map)) {
+               drmUnmap((drmAddress)ffbScreen->regs, gDRIPriv->sFbcRegs);
                FREE(ffbScreen);
                return GL_FALSE;
        }
-       ffbScreen->dac = (ffb_dacPtr) gDRIPriv->mDacRegs;
+       ffbScreen->dac = (ffb_dacPtr) map;
 
        /* Map "Smart" framebuffer views. */
        if (drmMap(sPriv->fd,
                   gDRIPriv->hSfb8r,
                   gDRIPriv->sSfb8r,
-                  &gDRIPriv->mSfb8r)) {
-               drmUnmap(gDRIPriv->mFbcRegs, gDRIPriv->sFbcRegs);
-               drmUnmap(gDRIPriv->mDacRegs, gDRIPriv->sDacRegs);
+                  &map)) {
+               drmUnmap((drmAddress)ffbScreen->regs, gDRIPriv->sFbcRegs);
+               drmUnmap((drmAddress)ffbScreen->dac, gDRIPriv->sDacRegs);
                FREE(ffbScreen);
                return GL_FALSE;
        }
-       ffbScreen->sfb8r = (volatile char *) gDRIPriv->mSfb8r;
+       ffbScreen->sfb8r = (volatile char *) map;
 
        if (drmMap(sPriv->fd,
                   gDRIPriv->hSfb32,
                   gDRIPriv->sSfb32,
-                  &gDRIPriv->mSfb32)) {
-               drmUnmap(gDRIPriv->mFbcRegs, gDRIPriv->sFbcRegs);
-               drmUnmap(gDRIPriv->mDacRegs, gDRIPriv->sDacRegs);
-               drmUnmap(gDRIPriv->mSfb8r, gDRIPriv->sSfb8r);
+                  &map)) {
+               drmUnmap((drmAddress)ffbScreen->regs, gDRIPriv->sFbcRegs);
+               drmUnmap((drmAddress)ffbScreen->dac, gDRIPriv->sDacRegs);
+               drmUnmap((drmAddress)ffbScreen->sfb8r, gDRIPriv->sSfb8r);
                FREE(ffbScreen);
                return GL_FALSE;
        }
-       ffbScreen->sfb32 = (volatile char *) gDRIPriv->mSfb32;
+       ffbScreen->sfb32 = (volatile char *) map;
 
        if (drmMap(sPriv->fd,
                   gDRIPriv->hSfb64,
                   gDRIPriv->sSfb64,
-                  &gDRIPriv->mSfb64)) {
-               drmUnmap(gDRIPriv->mFbcRegs, gDRIPriv->sFbcRegs);
-               drmUnmap(gDRIPriv->mDacRegs, gDRIPriv->sDacRegs);
-               drmUnmap(gDRIPriv->mSfb8r, gDRIPriv->sSfb8r);
-               drmUnmap(gDRIPriv->mSfb32, gDRIPriv->sSfb32);
+                  &map)) {
+               drmUnmap((drmAddress)ffbScreen->regs, gDRIPriv->sFbcRegs);
+               drmUnmap((drmAddress)ffbScreen->dac, gDRIPriv->sDacRegs);
+               drmUnmap((drmAddress)ffbScreen->sfb8r, gDRIPriv->sSfb8r);
+               drmUnmap((drmAddress)ffbScreen->sfb32, gDRIPriv->sSfb32);
                FREE(ffbScreen);
                return GL_FALSE;
        }
-       ffbScreen->sfb64 = (volatile char *) gDRIPriv->mSfb64;
+       ffbScreen->sfb64 = (volatile char *) map;
 
        ffbScreen->fifo_cache = 0;
        ffbScreen->rp_active = 0;
@@ -147,11 +148,11 @@
        ffbScreenPrivate *ffbScreen = sPriv->private;
        FFBDRIPtr gDRIPriv = (FFBDRIPtr) sPriv->pDevPriv;
 
-       drmUnmap(gDRIPriv->mFbcRegs, gDRIPriv->sFbcRegs);
-       drmUnmap(gDRIPriv->mDacRegs, gDRIPriv->sDacRegs);
-       drmUnmap(gDRIPriv->mSfb8r, gDRIPriv->sSfb8r);
-       drmUnmap(gDRIPriv->mSfb32, gDRIPriv->sSfb32);
-       drmUnmap(gDRIPriv->mSfb64, gDRIPriv->sSfb64);
+       drmUnmap((drmAddress)ffbScreen->regs, gDRIPriv->sFbcRegs);
+       drmUnmap((drmAddress)ffbScreen->dac, gDRIPriv->sDacRegs);
+       drmUnmap((drmAddress)ffbScreen->sfb8r, gDRIPriv->sSfb8r);
+       drmUnmap((drmAddress)ffbScreen->sfb32, gDRIPriv->sSfb32);
+       drmUnmap((drmAddress)ffbScreen->sfb64, gDRIPriv->sSfb64);
 
        FREE(ffbScreen);
 }
Index: src/mesa/drivers/dri/mga/mga_xmesa.c
===================================================================
RCS file: /cvs/mesa/Mesa/src/mesa/drivers/dri/mga/mga_xmesa.c,v
retrieving revision 1.43
diff -u -r1.43 mga_xmesa.c
--- src/mesa/drivers/dri/mga/mga_xmesa.c        30 Jun 2005 16:00:48 -0000      
1.43
+++ src/mesa/drivers/dri/mga/mga_xmesa.c        15 Jul 2005 09:48:05 -0000
@@ -625,8 +625,7 @@
    _tnl_allow_pixel_fog( ctx, GL_FALSE );
    _tnl_allow_vertex_fog( ctx, GL_TRUE );
 
-   mmesa->primary_offset = mmesa->mgaScreen->primary.handle;
-
+   mmesa->primary_offset = drmAgpBase(sPriv->fd);
    ctx->DriverCtx = (void *) mmesa;
    mmesa->glCtx = ctx;
 


-------------------------------------------------------
SF.Net email is sponsored by: Discover Easy Linux Migration Strategies
from IBM. Find simple to follow Roadmaps, straightforward articles,
informative Webcasts and more! Get everything you need to get up to
speed, fast. http://ads.osdn.com/?ad_id=7477&alloc_id=16492&op=click
--
_______________________________________________
Dri-devel mailing list
Dri-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to