diff options
author | Brian Paul <[email protected]> | 1999-10-09 20:17:07 +0000 |
---|---|---|
committer | Brian Paul <[email protected]> | 1999-10-09 20:17:07 +0000 |
commit | 6e6d4c66bd7fd64162ee453b143d7388bb051444 (patch) | |
tree | 09917c373880e01bfb784558296f449a5e1f7989 /src | |
parent | 7ec8d588abf67934edc78843dee28b9be509f4ca (diff) |
texture units now share default texture objects
Diffstat (limited to 'src')
-rw-r--r-- | src/mesa/main/context.c | 39 | ||||
-rw-r--r-- | src/mesa/main/texobj.c | 22 |
2 files changed, 34 insertions, 27 deletions
diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c index 47cba24ee5f..899558f4a77 100644 --- a/src/mesa/main/context.c +++ b/src/mesa/main/context.c @@ -1,4 +1,4 @@ -/* $Id: context.c,v 1.10 1999/10/08 09:27:10 keithw Exp $ */ +/* $Id: context.c,v 1.11 1999/10/09 20:17:07 brianp Exp $ */ /* * Mesa 3-D graphics library @@ -327,7 +327,7 @@ static void one_time_init( void ) */ static struct gl_shared_state *alloc_shared_state( void ) { - GLuint i; + GLuint d; struct gl_shared_state *ss; GLboolean outOfMemory; @@ -341,16 +341,13 @@ static struct gl_shared_state *alloc_shared_state( void ) /* Default Texture objects */ outOfMemory = GL_FALSE; - for (i=0;i<MAX_TEXTURE_UNITS;i++) { - GLuint d; - for (d = 1 ; d <= 3 ; d++) { - ss->DefaultD[d][i] = gl_alloc_texture_object(ss, 0, d); - if (!ss->DefaultD[d][i]) { - outOfMemory = GL_TRUE; - break; - } - ss->DefaultD[d][i]->RefCount++; /* don't free if not in use */ + for (d = 1 ; d <= 3 ; d++) { + ss->DefaultD[d] = gl_alloc_texture_object(ss, 0, d); + if (!ss->DefaultD[d]) { + outOfMemory = GL_TRUE; + break; } + ss->DefaultD[d]->RefCount++; /* don't free if not in use */ } if (!ss->DisplayList || !ss->TexObjects || outOfMemory) { @@ -359,14 +356,12 @@ static struct gl_shared_state *alloc_shared_state( void ) DeleteHashTable(ss->DisplayList); if (ss->TexObjects) DeleteHashTable(ss->TexObjects); - for (i=0;i<MAX_TEXTURE_UNITS;i++) { - if (ss->DefaultD[1][i]) - gl_free_texture_object(ss, ss->DefaultD[1][i]); - if (ss->DefaultD[2][i]) - gl_free_texture_object(ss, ss->DefaultD[2][i]); - if (ss->DefaultD[3][i]) - gl_free_texture_object(ss, ss->DefaultD[3][i]); - } + if (ss->DefaultD[1]) + gl_free_texture_object(ss, ss->DefaultD[1]); + if (ss->DefaultD[2]) + gl_free_texture_object(ss, ss->DefaultD[2]); + if (ss->DefaultD[3]) + gl_free_texture_object(ss, ss->DefaultD[3]); free(ss); return NULL; } @@ -486,9 +481,9 @@ static void init_texture_unit( GLcontext *ctx, GLuint unit ) ASSIGN_4V( texUnit->EyePlaneR, 0.0, 0.0, 0.0, 0.0 ); ASSIGN_4V( texUnit->EyePlaneQ, 0.0, 0.0, 0.0, 0.0 ); - texUnit->CurrentD[1] = ctx->Shared->DefaultD[1][unit]; - texUnit->CurrentD[2] = ctx->Shared->DefaultD[2][unit]; - texUnit->CurrentD[3] = ctx->Shared->DefaultD[3][unit]; + texUnit->CurrentD[1] = ctx->Shared->DefaultD[1]; + texUnit->CurrentD[2] = ctx->Shared->DefaultD[2]; + texUnit->CurrentD[3] = ctx->Shared->DefaultD[3]; } diff --git a/src/mesa/main/texobj.c b/src/mesa/main/texobj.c index 0d2f5dd9f21..b95911613b4 100644 --- a/src/mesa/main/texobj.c +++ b/src/mesa/main/texobj.c @@ -1,4 +1,4 @@ -/* $Id: texobj.c,v 1.3 1999/10/08 09:27:11 keithw Exp $ */ +/* $Id: texobj.c,v 1.4 1999/10/09 20:17:07 brianp Exp $ */ /* * Mesa 3-D graphics library @@ -71,6 +71,7 @@ gl_alloc_texture_object( struct gl_shared_state *shared, GLuint name, calloc(1,sizeof(struct gl_texture_object)); if (obj) { /* init the non-zero fields */ + obj->RefCount = 1; obj->Name = name; obj->Dimensions = dimensions; obj->WrapS = GL_REPEAT; @@ -382,8 +383,8 @@ void gl_DeleteTextures( GLcontext *ctx, GLsizei n, const GLuint *texName) GLuint d; for (d = 1 ; d <= 3 ; d++) { if (unit->CurrentD[d]==t) { - unit->CurrentD[d] = ctx->Shared->DefaultD[d][u]; - ctx->Shared->DefaultD[d][u]->RefCount++; + unit->CurrentD[d] = ctx->Shared->DefaultD[d]; + ctx->Shared->DefaultD[d]->RefCount++; t->RefCount--; assert( t->RefCount >= 0 ); } @@ -436,7 +437,7 @@ void gl_BindTexture( GLcontext *ctx, GLenum target, GLuint texName ) return; if (texName == 0) - newTexObj = ctx->Shared->DefaultD[unit][dim]; + newTexObj = ctx->Shared->DefaultD[dim]; else { struct HashTable *hash = ctx->Shared->TexObjects; newTexObj = (struct gl_texture_object *) HashLookup(hash, texName); @@ -453,8 +454,8 @@ void gl_BindTexture( GLcontext *ctx, GLenum target, GLuint texName ) } } - oldTexObj->RefCount--; newTexObj->RefCount++; + texUnit->CurrentD[dim] = newTexObj; /* If we've changed the CurrentD[123] texture object then update the @@ -482,6 +483,17 @@ void gl_BindTexture( GLcontext *ctx, GLenum target, GLuint texName ) if (ctx->Driver.BindTexture) { (*ctx->Driver.BindTexture)( ctx, target, newTexObj ); } + + if (oldTexObj->Name > 0) { + /* never delete default (id=0) texture objects */ + oldTexObj->RefCount--; + if (oldTexObj->RefCount <= 0) { + if (ctx->Driver.DeleteTexture) { + (*ctx->Driver.DeleteTexture)( ctx, oldTexObj ); + } + gl_free_texture_object(ctx->Shared, oldTexObj); + } + } } |