aboutsummaryrefslogtreecommitdiffstats
path: root/src/mesa
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa')
-rw-r--r--src/mesa/drivers/glide/fxtexman.c45
1 files changed, 27 insertions, 18 deletions
diff --git a/src/mesa/drivers/glide/fxtexman.c b/src/mesa/drivers/glide/fxtexman.c
index b43b40e3855..940c8fd0b97 100644
--- a/src/mesa/drivers/glide/fxtexman.c
+++ b/src/mesa/drivers/glide/fxtexman.c
@@ -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;
}
}