diff -urN cvs/Mesa/src/mesa/drivers/dri/r200/r200_screen.c Mesa/src/mesa/drivers/dri/r200/r200_screen.c --- cvs/Mesa/src/mesa/drivers/dri/r200/r200_screen.c 2005-04-13 20:28:37.000000000 +1000 +++ Mesa/src/mesa/drivers/dri/r200/r200_screen.c 2005-04-14 09:13:53.000000000 +1000 @@ -353,7 +353,7 @@ screen->depthHasSurface = (sPriv->ddxMajor > 4); } - screen->mmio.handle = dri_priv->registerHandle; + screen->mmio.handle = get_handle(dri_priv->registerHandle); screen->mmio.size = dri_priv->registerSize; if ( drmMap( sPriv->fd, screen->mmio.handle, @@ -366,7 +366,7 @@ RADEONMMIO = screen->mmio.map; - screen->status.handle = dri_priv->statusHandle; + screen->status.handle = get_handle(dri_priv->statusHandle); screen->status.size = dri_priv->statusSize; if ( drmMap( sPriv->fd, screen->status.handle, @@ -391,9 +391,9 @@ RADEONMMIO = screen->mmio.map; - if ( dri_priv->gartTexHandle && dri_priv->gartTexMapSize ) { + if ( get_handle(dri_priv->gartTexHandle) && dri_priv->gartTexMapSize ) { - screen->gartTextures.handle = dri_priv->gartTexHandle; + screen->gartTextures.handle = get_handle(dri_priv->gartTexHandle); screen->gartTextures.size = dri_priv->gartTexMapSize; if ( drmMap( sPriv->fd, screen->gartTextures.handle, @@ -603,6 +603,54 @@ #endif /* !defined(DRI_NEW_INTERFACE_ONLY) */ +/* + * 32-bit X servers will send us a RADEONDRI32Rec structure rather + * than a RADEONDRIRec, at least until they are converted. This + * function converts a RADEONDRI32Rec to a RADEONDRIRec. + */ +static int radeon_convert_private(__DRIframebuffer *frame_buffer) +{ + RADEONDRI32Ptr oldp = (RADEONDRI32Ptr) frame_buffer->dev_priv; + RADEONDRIPtr newp; + + newp = (RADEONDRIPtr) malloc(sizeof(RADEONDRIRec)); + if (newp == NULL) + return 0; + + newp->deviceID = oldp->deviceID; + newp->width = oldp->width; + newp->height = oldp->height; + newp->depth = oldp->depth; + newp->bpp = oldp->bpp; + newp->IsPCI = oldp->IsPCI; + newp->AGPMode = oldp->AGPMode; + newp->frontOffset = oldp->frontOffset; + newp->frontPitch = oldp->frontPitch; + newp->backOffset = oldp->backOffset; + newp->backPitch = oldp->backPitch; + newp->depthOffset = oldp->depthOffset; + newp->depthPitch = oldp->depthPitch; + newp->textureOffset = oldp->textureOffset; + newp->textureSize = oldp->textureSize; + newp->log2TexGran = oldp->log2TexGran; + newp->registerHandle[HIWORD] = 0; + newp->registerHandle[LOWORD] = oldp->registerHandle; + newp->registerSize = oldp->registerSize; + newp->statusHandle[HIWORD] = 0; + newp->statusHandle[LOWORD] = oldp->statusHandle; + newp->statusSize = oldp->statusSize; + newp->gartTexHandle[HIWORD] = 0; + newp->gartTexHandle[LOWORD] = oldp->gartTexHandle; + newp->gartTexMapSize = oldp->gartTexMapSize; + newp->log2GARTTexGran = oldp->log2GARTTexGran; + newp->gartTexOffset = oldp->gartTexOffset; + newp->sarea_priv_offset = oldp->sarea_priv_offset; + + frame_buffer->dev_priv = (void *) newp; + frame_buffer->dev_priv_size = sizeof(*newp); + return 1; +} + /** * This is the bootstrap function for the driver. libGL supplies all of the * requisite information about the system, and the driver initializes itself. @@ -630,6 +678,7 @@ static const __DRIutilversion2 ddx_expected = { 4, 5, 0, 0 }; static const __DRIversion dri_expected = { 4, 0, 0 }; static const __DRIversion drm_expected = { 1, 5, 0 }; + __DRIframebuffer new_fb; if ( ! driCheckDriDdxDrmVersions3( "R200", dri_version, & dri_expected, @@ -638,6 +687,22 @@ return NULL; } + /* Check the size of the private struct received from the server. */ + if (frame_buffer->dev_priv_size != sizeof(RADEONDRIRec)) { + if (frame_buffer->dev_priv_size != sizeof(RADEONDRI32Rec)) { + __driUtilMessage("Radeon DRI driver expected %d byte" + " struct from server but got %d", + sizeof(RADEONDRIRec), + frame_buffer->dev_priv_size); + return NULL; + } + /* N.B. *frame_buffer is const... */ + new_fb = *frame_buffer; + if (!radeon_convert_private(&new_fb)) + return NULL; + frame_buffer = &new_fb; + } + psp = __driUtilCreateNewScreen(dpy, scrn, psc, NULL, ddx_version, dri_version, drm_version, frame_buffer, pSAREA, fd, diff -urN cvs/Mesa/src/mesa/drivers/dri/radeon/radeon_screen.c Mesa/src/mesa/drivers/dri/radeon/radeon_screen.c --- cvs/Mesa/src/mesa/drivers/dri/radeon/radeon_screen.c 2005-04-13 20:28:37.000000000 +1000 +++ Mesa/src/mesa/drivers/dri/radeon/radeon_screen.c 2005-04-14 09:14:17.000000000 +1000 @@ -253,7 +253,7 @@ } } - screen->mmio.handle = dri_priv->registerHandle; + screen->mmio.handle = get_handle(dri_priv->registerHandle); screen->mmio.size = dri_priv->registerSize; if ( drmMap( sPriv->fd, screen->mmio.handle, @@ -266,7 +266,7 @@ RADEONMMIO = screen->mmio.map; - screen->status.handle = dri_priv->statusHandle; + screen->status.handle = get_handle(dri_priv->statusHandle); screen->status.size = dri_priv->statusSize; if ( drmMap( sPriv->fd, screen->status.handle, @@ -289,8 +289,8 @@ return NULL; } - if ( dri_priv->gartTexHandle && dri_priv->gartTexMapSize ) { - screen->gartTextures.handle = dri_priv->gartTexHandle; + if ( get_handle(dri_priv->gartTexHandle) && dri_priv->gartTexMapSize ) { + screen->gartTextures.handle = get_handle(dri_priv->gartTexHandle); screen->gartTextures.size = dri_priv->gartTexMapSize; if ( drmMap( sPriv->fd, screen->gartTextures.handle, @@ -524,6 +524,55 @@ } #endif /* !defined(DRI_NEW_INTERFACE_ONLY) */ + +/* + * 32-bit X servers will send us a RADEONDRI32Rec structure rather + * than a RADEONDRIRec, at least until they are converted. This + * function converts a RADEONDRI32Rec to a RADEONDRIRec. + */ +static int radeon_convert_private(__DRIframebuffer *frame_buffer) +{ + RADEONDRI32Ptr oldp = (RADEONDRI32Ptr) frame_buffer->dev_priv; + RADEONDRIPtr newp; + + newp = (RADEONDRIPtr) malloc(sizeof(RADEONDRIRec)); + if (newp == NULL) + return 0; + + newp->deviceID = oldp->deviceID; + newp->width = oldp->width; + newp->height = oldp->height; + newp->depth = oldp->depth; + newp->bpp = oldp->bpp; + newp->IsPCI = oldp->IsPCI; + newp->AGPMode = oldp->AGPMode; + newp->frontOffset = oldp->frontOffset; + newp->frontPitch = oldp->frontPitch; + newp->backOffset = oldp->backOffset; + newp->backPitch = oldp->backPitch; + newp->depthOffset = oldp->depthOffset; + newp->depthPitch = oldp->depthPitch; + newp->textureOffset = oldp->textureOffset; + newp->textureSize = oldp->textureSize; + newp->log2TexGran = oldp->log2TexGran; + newp->registerHandle[HIWORD] = 0; + newp->registerHandle[LOWORD] = oldp->registerHandle; + newp->registerSize = oldp->registerSize; + newp->statusHandle[HIWORD] = 0; + newp->statusHandle[LOWORD] = oldp->statusHandle; + newp->statusSize = oldp->statusSize; + newp->gartTexHandle[HIWORD] = 0; + newp->gartTexHandle[LOWORD] = oldp->gartTexHandle; + newp->gartTexMapSize = oldp->gartTexMapSize; + newp->log2GARTTexGran = oldp->log2GARTTexGran; + newp->gartTexOffset = oldp->gartTexOffset; + newp->sarea_priv_offset = oldp->sarea_priv_offset; + + frame_buffer->dev_priv = (void *) newp; + frame_buffer->dev_priv_size = sizeof(*newp); + return 1; +} + /** * This is the bootstrap function for the driver. libGL supplies all of the * requisite information about the system, and the driver initializes itself. @@ -551,6 +600,7 @@ static const __DRIutilversion2 ddx_expected = { 4, 5, 0, 0 }; static const __DRIversion dri_expected = { 4, 0, 0 }; static const __DRIversion drm_expected = { 1, 3, 0 }; + __DRIframebuffer new_fb; if ( ! driCheckDriDdxDrmVersions3( "Radeon", dri_version, & dri_expected, @@ -559,6 +609,22 @@ return NULL; } + /* Check the size of the private struct received from the server. */ + if (frame_buffer->dev_priv_size != sizeof(RADEONDRIRec)) { + if (frame_buffer->dev_priv_size != sizeof(RADEONDRI32Rec)) { + __driUtilMessage("Radeon DRI driver expected %d byte" + " struct from server but got %d", + sizeof(RADEONDRIRec), + frame_buffer->dev_priv_size); + return NULL; + } + /* N.B. *frame_buffer is const... */ + new_fb = *frame_buffer; + if (!radeon_convert_private(&new_fb)) + return NULL; + frame_buffer = &new_fb; + } + psp = __driUtilCreateNewScreen(dpy, scrn, psc, NULL, ddx_version, dri_version, drm_version, frame_buffer, pSAREA, fd, diff -urN cvs/Mesa/src/mesa/drivers/dri/radeon/server/radeon_dri.h Mesa/src/mesa/drivers/dri/radeon/server/radeon_dri.h --- cvs/Mesa/src/mesa/drivers/dri/radeon/server/radeon_dri.h 2004-06-02 15:07:11.000000000 +1000 +++ Mesa/src/mesa/drivers/dri/radeon/server/radeon_dri.h 2005-04-14 09:12:26.000000000 +1000 @@ -88,23 +88,25 @@ * \name MMIO register data */ /*@{*/ - drm_handle_t registerHandle; /**< \brief MMIO register map size */ + unsigned int registerHandle[2]; /**< \brief MMIO register map handle */ drmSize registerSize; /**< \brief MMIO register map handle */ + unsigned int pad1; /* for compatibility with 64-bit servers */ /*@}*/ /** * \name CP in-memory status information */ /*@{*/ - drm_handle_t statusHandle; /**< \brief status map handle */ + unsigned int statusHandle[2];/**< \brief status map handle */ drmSize statusSize; /**< \brief status map size */ + unsigned int pad2; /* for compatibility */ /*@}*/ /** * \name CP AGP Texture data */ /*@{*/ - drm_handle_t gartTexHandle; /**< \brief AGP texture area map handle */ + unsigned int gartTexHandle[2]; /**< \brief AGP texture area map handle */ drmSize gartTexMapSize; /**< \brief AGP texture area map size */ int log2GARTTexGran; /**< \brief AGP texture granularity in log base 2 */ int gartTexOffset; /**< \brief AGP texture area offset in AGP space */ @@ -113,4 +115,75 @@ unsigned int sarea_priv_offset; /**< \brief offset of the private SAREA data*/ } RADEONDRIRec, *RADEONDRIPtr; +/* Handles are stored in the RADEONDRIRec as two unsigned ints. */ +#ifdef MESA_BIG_ENDIAN +#define HIWORD 0 +#define LOWORD 1 +#else +#define HIWORD 1 +#define LOWORD 0 +#endif + +/* This is used to turn RADEONDRIPtr->xxxHandle into a drm_handle_t. */ +#ifdef LONG64 +#define get_handle(x) (((drm_handle_t)(x)[HIWORD] << 32) | (x)[LOWORD]) +#else +#define get_handle(x) ((drm_handle_t)(x)[LOWORD]) +#endif + +/* Version of the above struct sent by old 32-bit servers. */ +typedef struct { + /** + * \name DRI screen private data + */ + /*@{*/ + int deviceID; /**< \brief PCI device ID */ + int width; /**< \brief width in pixels of display */ + int height; /**< \brief height in scanlines of display */ + int depth; /**< \brief depth of display (8, 15, 16, 24) */ + int bpp; /**< \brief bit depth of display (8, 16, 24, 32) */ + + int IsPCI; /**< \brief is current card a PCI card? */ + int AGPMode; /**< \brief AGP mode */ + + int frontOffset; /**< \brief front buffer offset */ + int frontPitch; /**< \brief front buffer pitch */ + int backOffset; /**< \brief shared back buffer offset */ + int backPitch; /**< \brief shared back buffer pitch */ + int depthOffset; /**< \brief shared depth buffer offset */ + int depthPitch; /**< \brief shared depth buffer pitch */ + int textureOffset; /**< \brief start of texture data in frame buffer */ + int textureSize; /**< \brief size of texture date */ + int log2TexGran; /**< \brief log2 texture granularity */ + /*@}*/ + + /** + * \name MMIO register data + */ + /*@{*/ + unsigned int registerHandle; /**< \brief MMIO register map handle */ + drmSize registerSize; /**< \brief MMIO register map handle */ + /*@}*/ + + /** + * \name CP in-memory status information + */ + /*@{*/ + unsigned int statusHandle; /**< \brief status map handle */ + drmSize statusSize; /**< \brief status map size */ + /*@}*/ + + /** + * \name CP AGP Texture data + */ + /*@{*/ + unsigned int gartTexHandle; /**< \brief AGP texture area map handle */ + drmSize gartTexMapSize; /**< \brief AGP texture area map size */ + int log2GARTTexGran; /**< \brief AGP texture granularity in log base 2 */ + int gartTexOffset; /**< \brief AGP texture area offset in AGP space */ + /*@}*/ + + unsigned int sarea_priv_offset; /**< \brief offset of the private SAREA data*/ +} RADEONDRI32Rec, *RADEONDRI32Ptr; + #endif diff -urN r300_driver/r300/radeon_screen.c Mesa/src/mesa/drivers/dri/r300/radeon_screen.c --- r300_driver/r300/radeon_screen.c 2005-03-05 09:26:09.000000000 +1100 +++ Mesa/src/mesa/drivers/dri/r300/radeon_screen.c 2005-04-14 09:46:52.000000000 +1000 @@ -468,7 +468,7 @@ } } - screen->mmio.handle = dri_priv->registerHandle; + screen->mmio.handle = get_handle(dri_priv->registerHandle); screen->mmio.size = dri_priv->registerSize; if (drmMap(sPriv->fd, screen->mmio.handle, screen->mmio.size, &screen->mmio.map)) { @@ -479,7 +479,7 @@ RADEONMMIO = screen->mmio.map; - screen->status.handle = dri_priv->statusHandle; + screen->status.handle = get_handle(dri_priv->statusHandle); screen->status.size = dri_priv->statusSize; if (drmMap(sPriv->fd, screen->status.handle, @@ -501,9 +501,9 @@ return NULL; } - if (dri_priv->gartTexHandle && dri_priv->gartTexMapSize) { + if (get_handle(dri_priv->gartTexHandle) && dri_priv->gartTexMapSize) { - screen->gartTextures.handle = dri_priv->gartTexHandle; + screen->gartTextures.handle = get_handle(dri_priv->gartTexHandle); screen->gartTextures.size = dri_priv->gartTexMapSize; if (drmMap(sPriv->fd, screen->gartTextures.handle, @@ -750,6 +750,49 @@ } #endif /* !defined(DRI_NEW_INTERFACE_ONLY) */ +static int radeon_convert_private(__DRIframebuffer *frame_buffer) +{ + RADEONDRI32Ptr oldp = (RADEONDRI32Ptr) frame_buffer->dev_priv; + RADEONDRIPtr newp; + + newp = (RADEONDRIPtr) malloc(sizeof(RADEONDRIRec)); + if (newp == NULL) + return 0; + + newp->deviceID = oldp->deviceID; + newp->width = oldp->width; + newp->height = oldp->height; + newp->depth = oldp->depth; + newp->bpp = oldp->bpp; + newp->IsPCI = oldp->IsPCI; + newp->AGPMode = oldp->AGPMode; + newp->frontOffset = oldp->frontOffset; + newp->frontPitch = oldp->frontPitch; + newp->backOffset = oldp->backOffset; + newp->backPitch = oldp->backPitch; + newp->depthOffset = oldp->depthOffset; + newp->depthPitch = oldp->depthPitch; + newp->textureOffset = oldp->textureOffset; + newp->textureSize = oldp->textureSize; + newp->log2TexGran = oldp->log2TexGran; + newp->registerHandle[HIWORD] = 0; + newp->registerHandle[LOWORD] = oldp->registerHandle; + newp->registerSize = oldp->registerSize; + newp->statusHandle[HIWORD] = 0; + newp->statusHandle[LOWORD] = oldp->statusHandle; + newp->statusSize = oldp->statusSize; + newp->gartTexHandle[HIWORD] = 0; + newp->gartTexHandle[LOWORD] = oldp->gartTexHandle; + newp->gartTexMapSize = oldp->gartTexMapSize; + newp->log2GARTTexGran = oldp->log2GARTTexGran; + newp->gartTexOffset = oldp->gartTexOffset; + newp->sarea_priv_offset = oldp->sarea_priv_offset; + + frame_buffer->dev_priv = (void *) newp; + frame_buffer->dev_priv_size = sizeof(*newp); + return 1; +} + /** * This is the bootstrap function for the driver. libGL supplies all of the * requisite information about the system, and the driver initializes itself. @@ -774,6 +817,7 @@ static const __DRIversion ddx_expected = { 4, 0, 0 }; static const __DRIversion dri_expected = { 4, 0, 0 }; static const __DRIversion drm_expected = { 1, 11, 1 }; + __DRIframebuffer new_fb; if (!driCheckDriDdxDrmVersions2("R300", dri_version, &dri_expected, @@ -782,6 +826,22 @@ return NULL; } + /* Check the size of the private struct received from the server. */ + if (frame_buffer->dev_priv_size != sizeof(RADEONDRIRec)) { + if (frame_buffer->dev_priv_size != sizeof(RADEONDRI32Rec)) { + __driUtilMessage("R300 DRI driver expected %d byte" + " struct from server but got %d", + sizeof(RADEONDRIRec), + frame_buffer->dev_priv_size); + return NULL; + } + /* N.B. *frame_buffer is const... */ + new_fb = *frame_buffer; + if (!radeon_convert_private(&new_fb)) + return NULL; + frame_buffer = &new_fb; + } + psp = __driUtilCreateNewScreen(dpy, scrn, psc, NULL, ddx_version, dri_version, drm_version, frame_buffer, pSAREA, fd,