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