fixed a potential tex obj reference count problem involving multi-texture
authorBrian Paul <brian.paul@tungstengraphics.com>
Wed, 25 Apr 2001 18:21:05 +0000 (18:21 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Wed, 25 Apr 2001 18:21:05 +0000 (18:21 +0000)
src/mesa/main/context.c
src/mesa/main/texobj.c

index 256257bd09f148ff186e1a874e54a070d935c203..2d39b526897653f048675229fa7748684cb3a430 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: context.c,v 1.132 2001/04/04 13:38:51 brianp Exp $ */
+/* $Id: context.c,v 1.133 2001/04/25 18:21:05 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -476,33 +476,21 @@ alloc_shared_state( void )
    if (!ss->Default1D) {
       outOfMemory = GL_TRUE;
    }
-   else {
-      ss->Default1D->RefCount++;
-   }
 
    ss->Default2D = _mesa_alloc_texture_object(ss, 0, 2);
    if (!ss->Default2D) {
       outOfMemory = GL_TRUE;
    }
-   else {
-      ss->Default2D->RefCount++;
-   }
 
    ss->Default3D = _mesa_alloc_texture_object(ss, 0, 3);
    if (!ss->Default3D) {
       outOfMemory = GL_TRUE;
    }
-   else {
-      ss->Default1D->RefCount++;
-   }
 
    ss->DefaultCubeMap = _mesa_alloc_texture_object(ss, 0, 6);
    if (!ss->DefaultCubeMap) {
       outOfMemory = GL_TRUE;
    }
-   else {
-      ss->DefaultCubeMap->RefCount++;
-   }
 
    if (!ss->DisplayList || !ss->TexObjects || outOfMemory) {
       /* Ran out of memory at some point.  Free everything and return NULL */
@@ -546,8 +534,7 @@ free_shared_state( GLcontext *ctx, struct gl_shared_state *ss )
    _mesa_DeleteHashTable(ss->DisplayList);
 
    /* Free texture objects */
-   while (ss->TexObjectList)
-   {
+   while (ss->TexObjectList) {
       if (ctx->Driver.DeleteTexture)
          (*ctx->Driver.DeleteTexture)( ctx, ss->TexObjectList );
       /* this function removes from linked list too! */
@@ -1367,11 +1354,11 @@ _mesa_initialize_context( GLcontext *ctx,
    ctx->ReadBuffer = NULL;
 
    if (share_list) {
-      /* share the group of display lists of another context */
+      /* share state with another context */
       ctx->Shared = share_list->Shared;
    }
    else {
-      /* allocate new group of display lists */
+      /* allocate new, unshared state */
       ctx->Shared = alloc_shared_state();
       if (!ctx->Shared) {
          return GL_FALSE;
@@ -1381,6 +1368,12 @@ _mesa_initialize_context( GLcontext *ctx,
    ctx->Shared->RefCount++;
    _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
 
+   /* Effectively bind the default textures to all texture units */
+   ctx->Shared->Default1D->RefCount += MAX_TEXTURE_UNITS;
+   ctx->Shared->Default2D->RefCount += MAX_TEXTURE_UNITS;
+   ctx->Shared->Default3D->RefCount += MAX_TEXTURE_UNITS;
+   ctx->Shared->DefaultCubeMap->RefCount += MAX_TEXTURE_UNITS;
+
    init_attrib_groups( ctx );
 
    if (visual->doubleBufferMode) {
index fc2915531b71e5fdd129179e0f126dd8b815c1cf..644d99a9e78b5083952d7e3dd404bcfbdd87c55d 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: texobj.c,v 1.47 2001/04/20 17:16:52 brianp Exp $ */
+/* $Id: texobj.c,v 1.48 2001/04/25 18:21:05 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -503,8 +503,10 @@ _mesa_DeleteTextures( GLsizei n, const GLuint *texName)
 
             /* Decrement reference count and delete if zero */
             delObj->RefCount--;
-            ASSERT( delObj->RefCount >= 0 );
+            ASSERT(delObj->RefCount >= 0);
+
             if (delObj->RefCount == 0) {
+               ASSERT(delObj->Name != 0);
                if (ctx->Driver.DeleteTexture)
                   (*ctx->Driver.DeleteTexture)( ctx, delObj );
                _mesa_free_texture_object(ctx->Shared, delObj);
@@ -592,7 +594,8 @@ _mesa_BindTexture( GLenum target, GLuint texName )
          /* error checking */
          if (newTexObj->Dimensions > 0 && newTexObj->Dimensions != targetDim) {
             /* the named texture object's dimensions don't match the target */
-            _mesa_error( ctx, GL_INVALID_OPERATION, "glBindTexture(wrong dimensionality)" );
+            _mesa_error( ctx, GL_INVALID_OPERATION,
+                         "glBindTexture(wrong dimensionality)" );
             return;
          }
       }
@@ -610,7 +613,6 @@ _mesa_BindTexture( GLenum target, GLuint texName )
 
    newTexObj->RefCount++;
 
-
    /* do the actual binding, but first flush outstanding vertices:
     */
    FLUSH_VERTICES(ctx, _NEW_TEXTURE);
@@ -636,15 +638,14 @@ _mesa_BindTexture( 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 );
-        }
-         _mesa_free_texture_object(ctx->Shared, oldTexObj);
+   oldTexObj->RefCount--;
+   assert(oldTexObj->RefCount >= 0);
+   if (oldTexObj->RefCount == 0) {
+      assert(oldTexObj->Name != 0);
+      if (ctx->Driver.DeleteTexture) {
+         (*ctx->Driver.DeleteTexture)( ctx, oldTexObj );
       }
+      _mesa_free_texture_object(ctx->Shared, oldTexObj);
    }
 }