Use the _mesa_HashNextEntry() function to walk over all textures in the
authorBrian Paul <brian.paul@tungstengraphics.com>
Tue, 25 Jan 2005 15:16:02 +0000 (15:16 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Tue, 25 Jan 2005 15:16:02 +0000 (15:16 +0000)
hash table.
Moving toward removing the gl_texture_object's Next pointer (only used by
glide and tdfx drivers).

src/mesa/drivers/glide/fxtexman.c

index b43b40e3855ad25107e889dcbcdbe68538da36b0..940c8fd0b97d92c9d065b6b8753ae2a61a0193aa 100644 (file)
@@ -40,6 +40,7 @@
 
 #if defined(FX)
 
+#include "hash.h"
 #include "fxdrv.h"
 
 int texSwaps = 0;
@@ -150,7 +151,7 @@ fxTMUInit(fxMesaContext fxMesa, int tmu)
    end = grTexMaxAddress(tmu);
 
    chunk = (fxMesa->type >= GR_SSTTYPE_Banshee) ? (end - start) : FX_2MB_SPLIT;
-       
+
    if (fxMesa->verbose) {
       fprintf(stderr, "Voodoo TMU%d configuration:\n", tmu);
    }
@@ -311,12 +312,13 @@ fxTMFindOldestObject(fxMesaContext fxMesa, int tmu)
 {
    GLuint age, old, lasttime, bindnumber;
    GLfloat lowestPriority;
-   tfxTexInfo *info;
-   struct gl_texture_object *obj, *tmp, *lowestPriorityObj;
+   struct gl_texture_object *obj, *lowestPriorityObj;
+   struct _mesa_HashTable *textures = fxMesa->glCtx->Shared->TexObjects;
+   GLuint id;
 
-   tmp = fxMesa->glCtx->Shared->TexObjectList;
-   if (!tmp)
+   if (!_mesa_HashFirstEntry(textures))
       return 0;
+
    obj = NULL;
    old = 0;
 
@@ -324,8 +326,13 @@ fxTMFindOldestObject(fxMesaContext fxMesa, int tmu)
    lowestPriority = 1.0F;
 
    bindnumber = fxMesa->texBindNumber;
-   while (tmp) {
-      info = fxTMGetTexInfo(tmp);
+
+   for (id = _mesa_HashFirstEntry(textures);
+        id;
+        id = _mesa_HashNextEntry(textures, id)) {
+      struct gl_texture_object *tmp
+         = (struct gl_texture_object *) _mesa_HashLookup(textures, id);
+      tfxTexInfo *info = fxTMGetTexInfo(tmp);
 
       if (info && info->isInTM &&
          ((info->whichTMU == tmu) ||
@@ -352,7 +359,6 @@ fxTMFindOldestObject(fxMesaContext fxMesa, int tmu)
             lowestPriorityObj = tmp;
          }
       }
-      tmp = tmp->Next;
    }
 
    if (lowestPriorityObj != NULL) {
@@ -825,26 +831,29 @@ fxTMClose(fxMesaContext fxMesa)
 void
 fxTMRestoreTextures_NoLock(fxMesaContext ctx)
 {
-   tfxTexInfo *ti;
-   struct gl_texture_object *tObj;
-   int i, where;
-
-   tObj = ctx->glCtx->Shared->TexObjectList;
-   while (tObj) {
-      ti = fxTMGetTexInfo(tObj);
+   struct _mesa_HashTable *textures = ctx->glCtx->Shared->TexObjects;
+   GLuint id;
+
+   for (id = _mesa_HashFirstEntry(textures);
+        id;
+        id = _mesa_HashNextEntry(textures, id)) {
+      struct gl_texture_object *tObj
+         = (struct gl_texture_object *) _mesa_HashLookup(textures, id);
+      tfxTexInfo *ti = fxTMGetTexInfo(tObj);
       if (ti && ti->isInTM) {
-        for (i = 0; i < MAX_TEXTURE_UNITS; i++)
+         int i;
+        for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
            if (ctx->glCtx->Texture.Unit[i]._Current == tObj) {
               /* Force the texture onto the board, as it could be in use */
-              where = ti->whichTMU;
+              int where = ti->whichTMU;
               fxTMMoveOutTM_NoLock(ctx, tObj);
               fxTMMoveInTM_NoLock(ctx, tObj, where);
               break;
            }
+         }
         if (i == MAX_TEXTURE_UNITS)    /* Mark the texture as off the board */
            fxTMMoveOutTM_NoLock(ctx, tObj);
       }
-      tObj = tObj->Next;
    }
 }