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;
        }

Reply via email to