[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [48283] trunk/blender/source/blender/ compositor/operations: fix for crash with blur - happened most when there was a size input, need to mutex lock before allocating the gauss array.

Campbell Barton ideasman42 at gmail.com
Mon Jun 25 20:01:09 CEST 2012


Revision: 48283
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=48283
Author:   campbellbarton
Date:     2012-06-25 18:01:01 +0000 (Mon, 25 Jun 2012)
Log Message:
-----------
fix for crash with blur - happened most when there was a size input, need to mutex lock before allocating the gauss array.

also add suspiciously missing call to BlurBaseOperation::initExecution, X had but Y was missing.

Modified Paths:
--------------
    trunk/blender/source/blender/compositor/operations/COM_GaussianAlphaXBlurOperation.cpp
    trunk/blender/source/blender/compositor/operations/COM_GaussianAlphaYBlurOperation.cpp
    trunk/blender/source/blender/compositor/operations/COM_GaussianBokehBlurOperation.cpp
    trunk/blender/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp
    trunk/blender/source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp

Modified: trunk/blender/source/blender/compositor/operations/COM_GaussianAlphaXBlurOperation.cpp
===================================================================
--- trunk/blender/source/blender/compositor/operations/COM_GaussianAlphaXBlurOperation.cpp	2012-06-25 17:29:23 UTC (rev 48282)
+++ trunk/blender/source/blender/compositor/operations/COM_GaussianAlphaXBlurOperation.cpp	2012-06-25 18:01:01 UTC (rev 48283)
@@ -36,10 +36,12 @@
 
 void *GaussianAlphaXBlurOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers)
 {
+	lockMutex();
 	if (!this->sizeavailable) {
 		updateGauss(memoryBuffers);
 	}
 	void *buffer = getInputOperation(0)->initializeTileData(NULL, memoryBuffers);
+	unlockMutex();
 	return buffer;
 }
 
@@ -47,6 +49,8 @@
 {
 	/* BlurBaseOperation::initExecution(); */ /* until we suppoer size input - comment this */
 
+	initMutex();
+
 	if (this->sizeavailable) {
 		float rad = size * this->data->sizex;
 		if (rad < 1)
@@ -154,6 +158,8 @@
 	this->gausstab = NULL;
 	delete [] this->distbuf_inv;
 	this->distbuf_inv = NULL;
+
+	deinitMutex();
 }
 
 bool GaussianAlphaXBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output)

Modified: trunk/blender/source/blender/compositor/operations/COM_GaussianAlphaYBlurOperation.cpp
===================================================================
--- trunk/blender/source/blender/compositor/operations/COM_GaussianAlphaYBlurOperation.cpp	2012-06-25 17:29:23 UTC (rev 48282)
+++ trunk/blender/source/blender/compositor/operations/COM_GaussianAlphaYBlurOperation.cpp	2012-06-25 18:01:01 UTC (rev 48283)
@@ -36,10 +36,12 @@
 
 void *GaussianAlphaYBlurOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers)
 {
+	lockMutex();
 	if (!this->sizeavailable) {
 		updateGauss(memoryBuffers);
 	}
 	void *buffer = getInputOperation(0)->initializeTileData(NULL, memoryBuffers);
+	unlockMutex();
 	return buffer;
 }
 
@@ -47,6 +49,8 @@
 {
 	/* BlurBaseOperation::initExecution(); */ /* until we suppoer size input - comment this */
 
+	initMutex();
+
 	if (this->sizeavailable) {
 		float rad = size * this->data->sizey;
 		if (rad < 1)
@@ -65,7 +69,7 @@
 		float rad = size * this->data->sizey;
 		if (rad < 1)
 			rad = 1;
-		
+
 		this->rad = rad;
 		this->gausstab = BlurBaseOperation::make_gausstab(rad);
 	}
@@ -154,6 +158,8 @@
 	this->gausstab = NULL;
 	delete [] this->distbuf_inv;
 	this->distbuf_inv = NULL;
+
+	deinitMutex();
 }
 
 bool GaussianAlphaYBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output)

Modified: trunk/blender/source/blender/compositor/operations/COM_GaussianBokehBlurOperation.cpp
===================================================================
--- trunk/blender/source/blender/compositor/operations/COM_GaussianBokehBlurOperation.cpp	2012-06-25 17:29:23 UTC (rev 48282)
+++ trunk/blender/source/blender/compositor/operations/COM_GaussianBokehBlurOperation.cpp	2012-06-25 18:01:01 UTC (rev 48283)
@@ -34,10 +34,12 @@
 
 void *GaussianBokehBlurOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers)
 {
+	lockMutex();
 	if (!sizeavailable) {
 		updateGauss(memoryBuffers);
 	}
 	void *buffer = getInputOperation(0)->initializeTileData(NULL, memoryBuffers);
+	unlockMutex();
 	return buffer;
 }
 
@@ -45,6 +47,8 @@
 {
 	BlurBaseOperation::initExecution();
 
+	initMutex();
+
 	if (this->sizeavailable) {
 		updateGauss(NULL);
 	}
@@ -154,6 +158,8 @@
 	BlurBaseOperation::deinitExecution();
 	delete [] this->gausstab;
 	this->gausstab = NULL;
+
+	deinitMutex();
 }
 
 bool GaussianBokehBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output)

Modified: trunk/blender/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp
===================================================================
--- trunk/blender/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp	2012-06-25 17:29:23 UTC (rev 48282)
+++ trunk/blender/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp	2012-06-25 18:01:01 UTC (rev 48283)
@@ -31,15 +31,16 @@
 {
 	this->gausstab = NULL;
 	this->rad = 0;
-
 }
 
 void *GaussianXBlurOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers)
 {
+	lockMutex();
 	if (!this->sizeavailable) {
 		updateGauss(memoryBuffers);
 	}
 	void *buffer = getInputOperation(0)->initializeTileData(NULL, memoryBuffers);
+	unlockMutex();
 	return buffer;
 }
 
@@ -47,6 +48,8 @@
 {
 	BlurBaseOperation::initExecution();
 
+	initMutex();
+
 	if (this->sizeavailable) {
 		float rad = size * this->data->sizex;
 		if (rad < 1)
@@ -66,8 +69,8 @@
 			rad = 1;
 
 		this->rad = rad;
-		this->gausstab = BlurBaseOperation::make_gausstab(rad);	
-	}	
+		this->gausstab = BlurBaseOperation::make_gausstab(rad);
+	}
 }
 
 void GaussianXBlurOperation::executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data)
@@ -108,6 +111,8 @@
 	BlurBaseOperation::deinitExecution();
 	delete [] this->gausstab;
 	this->gausstab = NULL;
+
+	deinitMutex();
 }
 
 bool GaussianXBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output)

Modified: trunk/blender/source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp
===================================================================
--- trunk/blender/source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp	2012-06-25 17:29:23 UTC (rev 48282)
+++ trunk/blender/source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp	2012-06-25 18:01:01 UTC (rev 48283)
@@ -35,15 +35,21 @@
 
 void *GaussianYBlurOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers)
 {
+	lockMutex();
 	if (!this->sizeavailable) {
 		updateGauss(memoryBuffers);
 	}
 	void *buffer = getInputOperation(0)->initializeTileData(NULL, memoryBuffers);
+	unlockMutex();
 	return buffer;
 }
 
 void GaussianYBlurOperation::initExecution()
 {
+	BlurBaseOperation::initExecution();
+
+	initMutex();
+
 	if (this->sizeavailable) {
 		float rad = size * this->data->sizey;
 		if (rad < 1)
@@ -61,7 +67,7 @@
 		float rad = size * this->data->sizey;
 		if (rad < 1)
 			rad = 1;
-		
+
 		this->rad = rad;
 		this->gausstab = BlurBaseOperation::make_gausstab(rad);
 	}
@@ -86,8 +92,8 @@
 	maxy = min(maxy, inputBuffer->getRect()->ymax);
 	maxx = min(maxx, inputBuffer->getRect()->xmax);
 
+	int index;
 	int step = getStep();
-	int index;
 	for (int ny = miny; ny < maxy; ny += step) {
 		index = (ny - y) + this->rad;
 		int bufferindex = ((minx - bufferstartx) * 4) + ((ny - bufferstarty) * 4 * bufferwidth);
@@ -103,6 +109,8 @@
 	BlurBaseOperation::deinitExecution();
 	delete [] this->gausstab;
 	this->gausstab = NULL;
+
+	deinitMutex();
 }
 
 bool GaussianYBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output)




More information about the Bf-blender-cvs mailing list