mesa: fix problem freeing framebuffer/renderbuffer objects
authorBrian Paul <brian.paul@tungstengraphics.com>
Thu, 3 Jul 2008 21:41:45 +0000 (15:41 -0600)
committerBrian Paul <brian.paul@tungstengraphics.com>
Thu, 3 Jul 2008 23:21:22 +0000 (17:21 -0600)
Basically, set up no-op Delete() methods for the DummyFrame/Renderbuffer obj

src/mesa/main/context.c
src/mesa/main/fbobject.c
src/mesa/main/fbobject.h

index be93d844e0d6ccbadc2eec5b6c5f7c4cd3003d81..33f6d2c0d0cf68fc7dd20396ad0f599a3cb656bd 100644 (file)
@@ -691,6 +691,37 @@ delete_shader_cb(GLuint id, void *data, void *userData)
    }
 }
 
+/**
+ * Callback for deleting a framebuffer object.  Called by _mesa_HashDeleteAll()
+ */
+static void
+delete_framebuffer_cb(GLuint id, void *data, void *userData)
+{
+   struct gl_framebuffer *fb = (struct gl_framebuffer *) data;
+   /* The fact that the framebuffer is in the hashtable means its refcount
+    * is one, but we're removing from the hashtable now.  So clear refcount.
+    */
+   /*assert(fb->RefCount == 1);*/
+   fb->RefCount = 0;
+
+   /* NOTE: Delete should always be defined but there are two reports
+    * of it being NULL (bugs 13507, 14293).  Work-around for now.
+    */
+   if (fb->Delete)
+      fb->Delete(fb);
+}
+
+/**
+ * Callback for deleting a renderbuffer object. Called by _mesa_HashDeleteAll()
+ */
+static void
+delete_renderbuffer_cb(GLuint id, void *data, void *userData)
+{
+   struct gl_renderbuffer *rb = (struct gl_renderbuffer *) data;
+   rb->RefCount = 0;  /* see comment for FBOs above */
+   rb->Delete(rb);
+}
+
 
 /**
  * Deallocate a shared state object and all children structures.
@@ -744,7 +775,9 @@ free_shared_state( GLcontext *ctx, struct gl_shared_state *ss )
    _mesa_DeleteHashTable(ss->ArrayObjects);
 
 #if FEATURE_EXT_framebuffer_object
+   _mesa_HashDeleteAll(ss->FrameBuffers, delete_framebuffer_cb, ctx);
    _mesa_DeleteHashTable(ss->FrameBuffers);
+   _mesa_HashDeleteAll(ss->RenderBuffers, delete_renderbuffer_cb, ctx);
    _mesa_DeleteHashTable(ss->RenderBuffers);
 #endif
 
@@ -994,6 +1027,7 @@ init_attrib_groups(GLcontext *ctx)
 #if FEATURE_evaluators
    _mesa_init_eval( ctx );
 #endif
+   _mesa_init_fbobjects( ctx );
 #if FEATURE_feedback
    _mesa_init_feedback( ctx );
 #else
index 800f6ee9a31088ff9c12b721913c85a5baf23f2c..e4ff575e18ebbd4f37004363a0b29ca9e7f327cc 100644 (file)
@@ -1,8 +1,8 @@
 /*
  * Mesa 3-D graphics library
- * Version:  6.5.1
+ * Version:  7.1
  *
- * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
+ * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
@@ -66,6 +66,27 @@ static struct gl_renderbuffer DummyRenderbuffer;
     (TARGET) <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z)
 
 
+static void
+delete_dummy_renderbuffer(struct gl_renderbuffer *rb)
+{
+   /* no op */
+}
+
+static void
+delete_dummy_framebuffer(struct gl_framebuffer *fb)
+{
+   /* no op */
+}
+
+
+void
+_mesa_init_fbobjects(GLcontext *ctx)
+{
+   DummyFramebuffer.Delete = delete_dummy_framebuffer;
+   DummyRenderbuffer.Delete = delete_dummy_renderbuffer;
+}
+
+
 /**
  * Helper routine for getting a gl_renderbuffer.
  */
index 782ad8cb1808bcfd6d1faa10c8dff4c49e7c9d51..b6154719abc5d1a39127123ea3a72ac5a34dc58f 100644 (file)
@@ -1,8 +1,8 @@
 /*
  * Mesa 3-D graphics library
- * Version:  6.5
+ * Version:  7.1
  *
- * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
+ * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
@@ -27,6 +27,9 @@
 #define FBOBJECT_H
 
 
+extern void
+_mesa_init_fbobjects(GLcontext *ctx);
+
 extern struct gl_renderbuffer *
 _mesa_lookup_renderbuffer(GLcontext *ctx, GLuint id);