[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [28411] trunk/blender/source/blender: Fix #22123 and #22124: some problems with mutex locks, also tweak to

Brecht Van Lommel brecht at blender.org
Sun Apr 25 12:49:17 CEST 2010


Revision: 28411
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28411
Author:   blendix
Date:     2010-04-25 12:49:13 +0200 (Sun, 25 Apr 2010)

Log Message:
-----------
Fix #22123 and #22124: some problems with mutex locks, also tweak to
how removing opengl textures from outside main thread is done so it
happens as part of the main loop.

Modified Paths:
--------------
    trunk/blender/source/blender/blenlib/BLI_threads.h
    trunk/blender/source/blender/blenlib/intern/threads.c
    trunk/blender/source/blender/gpu/GPU_draw.h
    trunk/blender/source/blender/gpu/intern/gpu_draw.c
    trunk/blender/source/blender/windowmanager/intern/wm_draw.c
    trunk/blender/source/blender/windowmanager/intern/wm_init_exit.c

Modified: trunk/blender/source/blender/blenlib/BLI_threads.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_threads.h	2010-04-25 10:27:45 UTC (rev 28410)
+++ trunk/blender/source/blender/blenlib/BLI_threads.h	2010-04-25 10:49:13 UTC (rev 28411)
@@ -65,7 +65,8 @@
 #define LOCK_PREVIEW	1
 #define LOCK_VIEWER		2
 #define LOCK_CUSTOM1	3
-#define LOCK_RCACHE		2
+#define LOCK_RCACHE		4
+#define LOCK_OPENGL		5
 
 void	BLI_lock_thread(int type);
 void	BLI_unlock_thread(int type);
@@ -73,7 +74,7 @@
 /* Mutex Lock */
 
 typedef pthread_mutex_t ThreadMutex;
-#define BLI_MUTEX_INITIALIZER	PTHREAD_MUTEX_INITIALIZER;
+#define BLI_MUTEX_INITIALIZER	PTHREAD_MUTEX_INITIALIZER
 
 void BLI_mutex_init(ThreadMutex *mutex);
 void BLI_mutex_lock(ThreadMutex *mutex);

Modified: trunk/blender/source/blender/blenlib/intern/threads.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/threads.c	2010-04-25 10:27:45 UTC (rev 28410)
+++ trunk/blender/source/blender/blenlib/intern/threads.c	2010-04-25 10:49:13 UTC (rev 28411)
@@ -108,6 +108,7 @@
 static pthread_mutex_t _viewer_lock = PTHREAD_MUTEX_INITIALIZER;
 static pthread_mutex_t _custom1_lock = PTHREAD_MUTEX_INITIALIZER;
 static pthread_mutex_t _rcache_lock = PTHREAD_MUTEX_INITIALIZER;
+static pthread_mutex_t _opengl_lock = PTHREAD_MUTEX_INITIALIZER;
 static pthread_t mainid;
 static int thread_levels= 0;	/* threads can be invoked inside threads */
 
@@ -344,6 +345,8 @@
 		pthread_mutex_lock(&_custom1_lock);
 	else if (type==LOCK_RCACHE)
 		pthread_mutex_lock(&_rcache_lock);
+	else if (type==LOCK_OPENGL)
+		pthread_mutex_lock(&_opengl_lock);
 }
 
 void BLI_unlock_thread(int type)
@@ -356,8 +359,8 @@
 		pthread_mutex_unlock(&_viewer_lock);
 	else if(type==LOCK_CUSTOM1)
 		pthread_mutex_unlock(&_custom1_lock);
-	else if(type==LOCK_RCACHE)
-		pthread_mutex_unlock(&_rcache_lock);
+	else if(type==LOCK_OPENGL)
+		pthread_mutex_unlock(&_opengl_lock);
 }
 
 /* Mutex Locks */

Modified: trunk/blender/source/blender/gpu/GPU_draw.h
===================================================================
--- trunk/blender/source/blender/gpu/GPU_draw.h	2010-04-25 10:27:45 UTC (rev 28410)
+++ trunk/blender/source/blender/gpu/GPU_draw.h	2010-04-25 10:49:13 UTC (rev 28411)
@@ -122,6 +122,9 @@
 void GPU_free_smoke(struct SmokeModifierData *smd);
 void GPU_create_smoke(struct SmokeModifierData *smd, int highres);
 
+/* Delayed free of OpenGL buffers by main thread */
+void GPU_free_unused_buffers(void);
+
 #ifdef __cplusplus
 }
 #endif

Modified: trunk/blender/source/blender/gpu/intern/gpu_draw.c
===================================================================
--- trunk/blender/source/blender/gpu/intern/gpu_draw.c	2010-04-25 10:27:45 UTC (rev 28410)
+++ trunk/blender/source/blender/gpu/intern/gpu_draw.c	2010-04-25 10:49:13 UTC (rev 28411)
@@ -784,42 +784,36 @@
 	smd->domain->tex_shadow = GPU_texture_create_3D(smd->domain->res[0], smd->domain->res[1], smd->domain->res[2], smd->domain->shadow);
 }
 
-ListBase image_free_queue = {NULL, NULL};
-static ThreadMutex queuelock = BLI_MUTEX_INITIALIZER;
+static ListBase image_free_queue = {NULL, NULL};
 
-static void flush_queued_free(void)
+static void gpu_queue_image_for_free(Image *ima)
 {
-	Image *ima, *imanext;
+    Image *cpy = MEM_dupallocN(ima);
 
-	BLI_mutex_lock(&queuelock);
-
-	ima = image_free_queue.first;
-	image_free_queue.first = image_free_queue.last = NULL;
-	for (; ima; ima=imanext) {
-		imanext = (Image*)ima->id.next;
-		GPU_free_image(ima);
-		MEM_freeN(ima);
-	}
-
-	BLI_mutex_unlock(&queuelock);
+	BLI_lock_thread(LOCK_OPENGL);
+	BLI_addtail(&image_free_queue, cpy);
+	BLI_unlock_thread(LOCK_OPENGL);
 }
 
-static void queue_image_for_free(Image *ima)
+void GPU_free_unused_buffers(void)
 {
-    Image *cpy = MEM_dupallocN(ima);
+	Image *ima;
 
-	BLI_mutex_lock(&queuelock);
-	BLI_addtail(&image_free_queue, cpy);
-	BLI_mutex_unlock(&queuelock);
+	BLI_lock_thread(LOCK_OPENGL);
+
+	for(ima=image_free_queue.first; ima; ima=ima->id.next)
+		GPU_free_image(ima);
+
+	BLI_freelistN(&image_free_queue);
+
+	BLI_unlock_thread(LOCK_OPENGL);
 }
 
 void GPU_free_image(Image *ima)
 {
-	if (!BLI_thread_is_main()) {
-		queue_image_for_free(ima);
+	if(!BLI_thread_is_main()) {
+		gpu_queue_image_for_free(ima);
 		return;
-	} else if (image_free_queue.first) {
-		flush_queued_free();
 	}
 
 	/* free regular image binding */

Modified: trunk/blender/source/blender/windowmanager/intern/wm_draw.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_draw.c	2010-04-25 10:27:45 UTC (rev 28410)
+++ trunk/blender/source/blender/windowmanager/intern/wm_draw.c	2010-04-25 10:49:13 UTC (rev 28411)
@@ -48,6 +48,7 @@
 
 #include "ED_screen.h"
 
+#include "GPU_draw.h"
 #include "GPU_extensions.h"
 
 #include "WM_api.h"
@@ -695,6 +696,8 @@
 	wmWindowManager *wm= CTX_wm_manager(C);
 	wmWindow *win;
 	int drawmethod;
+
+	GPU_free_unused_buffers();
 	
 	for(win= wm->windows.first; win; win= win->next) {
 		if(win->drawmethod != U.wmdrawmethod) {

Modified: trunk/blender/source/blender/windowmanager/intern/wm_init_exit.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_init_exit.c	2010-04-25 10:27:45 UTC (rev 28410)
+++ trunk/blender/source/blender/windowmanager/intern/wm_init_exit.c	2010-04-25 10:49:13 UTC (rev 28411)
@@ -312,6 +312,7 @@
 	}
 	
 	GPU_buffer_pool_free(0);
+	GPU_free_unused_buffers();
 	GPU_extensions_exit();
 	
 //	if (copybuf) MEM_freeN(copybuf);





More information about the Bf-blender-cvs mailing list