thanks for trying it out.
i fixed a typo (again)..
--
ralf willenbacher ([EMAIL PROTECTED])
diff -u -r ./xc/lib/GL/mesa/src/drv/mga/mga_xmesa.c
./xc2/lib/GL/mesa/src/drv/mga/mga_xmesa.c
--- ./xc/lib/GL/mesa/src/drv/mga/mga_xmesa.c Mon May 14 18:55:02 2001
+++ ./xc2/lib/GL/mesa/src/drv/mga/mga_xmesa.c Mon May 14 18:56:34 2001
@@ -221,6 +221,17 @@
mgaScreen->texVirtual[MGA_CARD_HEAP] = (char *)(mgaScreen->sPriv->pFB +
serverInfo->textureOffset);
+ if (drmMap(sPriv->fd,
+ serverInfo->agpTextureOffset,
+ serverInfo->agpTextureSize,
+ (drmAddress *)&mgaScreen->texVirtual[MGA_AGP_HEAP]) != 0)
+ {
+ Xfree(mgaScreen);
+ sPriv->private = NULL;
+ __driMesaMessage("Couldn't map agptexture region");
+ return GL_FALSE;
+ }
+
#if 0
mgaScreen->texVirtual[MGA_AGP_HEAP] = (mgaScreen->agp.map +
serverInfo->agpTextureOffset);
diff -u -r ./xc/lib/GL/mesa/src/drv/mga/mgatexmem.c
./xc2/lib/GL/mesa/src/drv/mga/mgatexmem.c
--- ./xc/lib/GL/mesa/src/drv/mga/mgatexmem.c Tue May 1 21:39:10 2001
+++ ./xc2/lib/GL/mesa/src/drv/mga/mgatexmem.c Mon May 14 19:03:02 2001
@@ -377,7 +377,8 @@
/* Fill in the secondary buffer with properly converted texels
* from the mesa buffer. */
- if(t->heap == MGA_CARD_HEAP) {
+ /* no idea how to sync the one below */
+ if(t->heap == MGA_CARD_HEAP || t->heap == MGA_AGP_HEAP) {
mgaGetILoadBufferLocked( mmesa );
mgaConvertTexture( (GLuint *)mmesa->iload_buffer->address,
texelBytes, image, x, y, width, height );
@@ -434,7 +435,45 @@
static int mgaChooseTexHeap( mgaContextPtr mmesa, mgaTextureObjectPtr t )
{
- return 0;
+ int freeagp, freecard;
+ int fitincard, fitinagp;
+ int totalcard, totalagp;
+ TMemBlock *b;
+
+ totalcard = totalagp = fitincard = fitinagp = freeagp = freecard = 0;
+
+ b = mmesa->texHeap[0];
+ while(b)
+ {
+ totalcard += b->size;
+ if(b->free)
+ {
+/* freecard += b->size; */
+ if(t->totalSize <= b->size)fitincard = 1;
+ }
+ b = b->next;
+ }
+
+ b = mmesa->texHeap[1];
+ while(b)
+ {
+ totalagp += b->size;
+ if(b->free)
+ {
+/* freeagp += b->size; */
+ if(t->totalSize <= b->size)fitinagp = 1;
+ }
+ b = b->next;
+ }
+/* fprintf(stderr,"%d, %d\n",freecard/1024, freeagp/1024); */
+/* mgaPrintLocalLRU(mmesa, t->heap); */
+
+ if(fitincard)return 0;
+ if(fitinagp)return 1;
+ if(totalcard >= t->totalSize)return 0;
+ if(totalagp >= t->totalSize)return 1;
+
+ return 0;
}
diff -u -r ./xc/programs/Xserver/hw/xfree86/drivers/mga/mga.h
./xc2/programs/Xserver/hw/xfree86/drivers/mga/mga.h
--- ./xc/programs/Xserver/hw/xfree86/drivers/mga/mga.h Mon May 14 19:16:43 2001
+++ ./xc2/programs/Xserver/hw/xfree86/drivers/mga/mga.h Mon May 14 19:19:36 2001
@@ -348,6 +348,7 @@
void (*GetQuiescence)(ScrnInfoPtr pScrn);
int agpMode;
+ int agpSize;
#endif
XF86VideoAdaptorPtr adaptor;
diff -u -r ./xc/programs/Xserver/hw/xfree86/drivers/mga/mga_dri.c
./xc2/programs/Xserver/hw/xfree86/drivers/mga/mga_dri.c
--- ./xc/programs/Xserver/hw/xfree86/drivers/mga/mga_dri.c Mon May 14 19:30:57
2001
+++ ./xc2/programs/Xserver/hw/xfree86/drivers/mga/mga_dri.c Mon May 14 21:04:37
+2001
@@ -571,11 +571,14 @@
MGADRIServerPrivatePtr pMGADRIServer = pMga->DRIServerInfo;
unsigned long mode;
unsigned int vendor, device;
- int ret, count;
+ int ret, count, i;
+
+ if(pMga->agpSize < 12)pMga->agpSize = 12;
+ if(pMga->agpSize > 64)pMga->agpSize = 64; /* cap */
/* FIXME: Make these configurable...
*/
- pMGADRIServer->agp.size = 12 * 1024 * 1024;
+ pMGADRIServer->agp.size = pMga->agpSize * 1024 * 1024;
pMGADRIServer->warp.offset = 0;
pMGADRIServer->warp.size = MGA_WARP_UCODE_SIZE;
@@ -588,6 +591,13 @@
pMGADRIServer->primary.size);
pMGADRIServer->buffers.size = MGA_NUM_BUFFERS * MGA_BUFFER_SIZE;
+
+ pMGADRIServer->agpTextures.offset = (pMGADRIServer->buffers.offset +
+ pMGADRIServer->buffers.size);
+
+ pMGADRIServer->agpTextures.size = pMGADRIServer->agp.size -
+ pMGADRIServer->agpTextures.offset;
+
if ( drmAgpAcquire( pMga->drmFD ) < 0 ) {
xf86DrvMsg( pScreen->myNum, X_ERROR, "[agp] AGP not available\n" );
return FALSE;
@@ -750,6 +760,28 @@
"[drm] Added %d %d byte DMA buffers\n",
count, MGA_BUFFER_SIZE );
+ i = mylog2(pMGADRIServer->agpTextures.size / MGA_NR_TEX_REGIONS);
+ if(i < MGA_LOG_MIN_TEX_REGION_SIZE)
+ i = MGA_LOG_MIN_TEX_REGION_SIZE;
+ pMGADRIServer->agpTextures.size = (pMGADRIServer->agpTextures.size >> i) << i;
+
+ if ( drmAddMap( pMga->drmFD,
+ pMGADRIServer->agpTextures.offset,
+ pMGADRIServer->agpTextures.size,
+ DRM_AGP, 0,
+ &pMGADRIServer->agpTextures.handle ) < 0 ) {
+ xf86DrvMsg( pScreen->myNum, X_ERROR,
+ "[agp] Could not add agpTexture mapping\n" );
+ return FALSE;
+ }
+/* should i map it ? */
+ xf86DrvMsg( pScreen->myNum, X_INFO,
+ "[agp] agpTexture handle = 0x%08lx\n",
+ pMGADRIServer->agpTextures.handle );
+ xf86DrvMsg( pScreen->myNum, X_INFO,
+ "[agp] agpTexture size: %d kb\n", pMGADRIServer->agpTextures.size/1024
+);
+
+
xf86EnablePciBusMaster( pMga->PciInfo, TRUE );
return TRUE;
@@ -852,6 +884,9 @@
init.primary_offset = pMGADRIServer->primary.handle;
init.buffers_offset = pMGADRIServer->buffers.handle;
+ init.texture_offset[1] = pMGADRIServer->agpTextures.handle;
+ init.texture_size[1] = pMGADRIServer->agpTextures.size;
+
ret = drmMGAInitDMA( pMga->drmFD, &init );
if ( ret < 0 ) {
xf86DrvMsg( pScrn->scrnIndex, X_ERROR,
@@ -1190,6 +1225,14 @@
pMGADRI->logTextureGranularity = i;
pMGADRI->textureSize = (pMGADRI->textureSize >> i) << i; /* truncate */
+ i = mylog2( pMGADRIServer->agpTextures.size / MGA_NR_TEX_REGIONS );
+ if ( i < MGA_LOG_MIN_TEX_REGION_SIZE )
+ i = MGA_LOG_MIN_TEX_REGION_SIZE;
+
+ pMGADRI->logAgpTextureGranularity = i;
+ pMGADRI->agpTextureOffset = (unsigned int)pMGADRIServer->agpTextures.handle;
+ pMGADRI->agpTextureSize = (unsigned int)pMGADRIServer->agpTextures.size;
+
pMGADRI->registers.handle = pMGADRIServer->registers.handle;
pMGADRI->registers.size = pMGADRIServer->registers.size;
pMGADRI->status.handle = pMGADRIServer->status.handle;
@@ -1231,6 +1274,11 @@
if ( pMGADRIServer->warp.map ) {
drmUnmap( pMGADRIServer->warp.map, pMGADRIServer->warp.size );
pMGADRIServer->warp.map = NULL;
+ }
+
+ if ( pMGADRIServer->agpTextures.map ) {
+ drmUnmap( pMGADRIServer->agpTextures.map, pMGADRIServer->agpTextures.size );
+ pMGADRIServer->agpTextures.map = NULL;
}
if ( pMGADRIServer->agp.handle ) {
diff -u -r ./xc/programs/Xserver/hw/xfree86/drivers/mga/mga_driver.c
./xc2/programs/Xserver/hw/xfree86/drivers/mga/mga_driver.c
--- ./xc/programs/Xserver/hw/xfree86/drivers/mga/mga_driver.c Mon May 14 19:20:16
2001
+++ ./xc2/programs/Xserver/hw/xfree86/drivers/mga/mga_driver.c Mon May 14 19:30:07
+2001
@@ -211,6 +211,7 @@
OPTION_CRTC2RAM,
OPTION_INT10,
OPTION_AGP_MODE,
+ OPTION_AGP_SIZE,
OPTION_DIGITAL,
OPTION_TV,
OPTION_TVSTANDARD,
@@ -242,6 +243,7 @@
{ OPTION_CRTC2RAM, "Crtc2Ram", OPTV_INTEGER, {0}, FALSE },
{ OPTION_INT10, "Int10", OPTV_BOOLEAN, {0}, FALSE },
{ OPTION_AGP_MODE, "AGPMode", OPTV_INTEGER, {0}, FALSE },
+ { OPTION_AGP_SIZE, "AGPSize", OPTV_INTEGER, {0}, FALSE },
{ OPTION_DIGITAL, "DigitalScreen",OPTV_BOOLEAN, {0}, FALSE },
{ OPTION_TV, "TV", OPTV_BOOLEAN, {0}, FALSE },
{ OPTION_TVSTANDARD, "TVStandard", OPTV_ANYSTR, {0}, FALSE },
@@ -1476,6 +1478,10 @@
pMga->agpMode = MGA_MAX_AGP_MODE;
}
from = X_CONFIG;
+ }
+ if (xf86GetOptValInteger(MGAOptions,
+ OPTION_AGP_SIZE, &(pMga->agpSize))) {
+ /* check later .. */
}
xf86DrvMsg(pScrn->scrnIndex, from, "Using AGP %dx mode\n",
diff -u -r ./xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/mga_dma.c
./xc2/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/mga_dma.c
--- ./xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/mga_dma.c Mon
May 14 19:44:56 2001
+++ ./xc2/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/mga_dma.c Mon
+May 14 19:47:10 2001
@@ -488,6 +488,8 @@
dev_priv->texture_offset = init->texture_offset[0];
dev_priv->texture_size = init->texture_size[0];
+ DRM_FIND_MAP(dev_priv->agp_textures, init->texture_offset[1]);
+
list_for_each( list, &dev->maplist->head ) {
drm_map_list_t *entry = (drm_map_list_t *)list;
if ( entry->map &&
diff -u -r ./xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/mga_state.c
./xc2/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/mga_state.c
--- ./xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/mga_state.c Mon
May 14 19:47:31 2001
+++ ./xc2/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/mga_state.c Mon
+May 14 19:51:56 2001
@@ -470,9 +470,12 @@
static int mga_verify_iload( drm_mga_private_t *dev_priv,
unsigned int dstorg, unsigned int length )
{
- if ( dstorg < dev_priv->texture_offset ||
+ if ( (dstorg < dev_priv->texture_offset ||
dstorg + length > (dev_priv->texture_offset +
- dev_priv->texture_size) ) {
+ dev_priv->texture_size) ) &&
+ (dstorg < dev_priv->agp_textures->offset ||
+ dstorg + length > (dev_priv->agp_textures->offset +
+ dev_priv->agp_textures->size))) {
DRM_ERROR( "*** bad iload DSTORG: 0x%x\n", dstorg );
return -EINVAL;
}