diff options
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 47cba24ee5..899558f4a7 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 0d2f5dd9f2..b95911613b 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); +      } +   }  }  | 
