diff options
author | Campbell Barton <ideasman42@gmail.com> | 2012-06-25 22:01:01 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2012-06-25 22:01:01 +0400 |
commit | fa0c5a100da6afe58462709f2b3acf0f870112cb (patch) | |
tree | 498ceeac763d72dac8b39f86c823188f79c9cd4d /source | |
parent | 6badc77cb0de84286db9b0df365ff4e2c85ec7b9 (diff) |
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.
Diffstat (limited to 'source')
5 files changed, 37 insertions, 6 deletions
diff --git a/source/blender/compositor/operations/COM_GaussianAlphaXBlurOperation.cpp b/source/blender/compositor/operations/COM_GaussianAlphaXBlurOperation.cpp index 954aef7b916..2d78085e3b0 100644 --- a/source/blender/compositor/operations/COM_GaussianAlphaXBlurOperation.cpp +++ b/source/blender/compositor/operations/COM_GaussianAlphaXBlurOperation.cpp @@ -36,10 +36,12 @@ GaussianAlphaXBlurOperation::GaussianAlphaXBlurOperation() : BlurBaseOperation(C 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 @@ void GaussianAlphaXBlurOperation::initExecution() { /* 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 @@ void GaussianAlphaXBlurOperation::deinitExecution() this->gausstab = NULL; delete [] this->distbuf_inv; this->distbuf_inv = NULL; + + deinitMutex(); } bool GaussianAlphaXBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) diff --git a/source/blender/compositor/operations/COM_GaussianAlphaYBlurOperation.cpp b/source/blender/compositor/operations/COM_GaussianAlphaYBlurOperation.cpp index e1105cf94b1..ef5f9d5c31b 100644 --- a/source/blender/compositor/operations/COM_GaussianAlphaYBlurOperation.cpp +++ b/source/blender/compositor/operations/COM_GaussianAlphaYBlurOperation.cpp @@ -36,10 +36,12 @@ GaussianAlphaYBlurOperation::GaussianAlphaYBlurOperation() : BlurBaseOperation(C 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 @@ void GaussianAlphaYBlurOperation::initExecution() { /* 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 @@ void GaussianAlphaYBlurOperation::updateGauss(MemoryBuffer **memoryBuffers) float rad = size * this->data->sizey; if (rad < 1) rad = 1; - + this->rad = rad; this->gausstab = BlurBaseOperation::make_gausstab(rad); } @@ -154,6 +158,8 @@ void GaussianAlphaYBlurOperation::deinitExecution() this->gausstab = NULL; delete [] this->distbuf_inv; this->distbuf_inv = NULL; + + deinitMutex(); } bool GaussianAlphaYBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) diff --git a/source/blender/compositor/operations/COM_GaussianBokehBlurOperation.cpp b/source/blender/compositor/operations/COM_GaussianBokehBlurOperation.cpp index dc9e354b124..8d6a601b7dc 100644 --- a/source/blender/compositor/operations/COM_GaussianBokehBlurOperation.cpp +++ b/source/blender/compositor/operations/COM_GaussianBokehBlurOperation.cpp @@ -34,10 +34,12 @@ GaussianBokehBlurOperation::GaussianBokehBlurOperation() : BlurBaseOperation(COM 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 @@ void GaussianBokehBlurOperation::initExecution() { BlurBaseOperation::initExecution(); + initMutex(); + if (this->sizeavailable) { updateGauss(NULL); } @@ -154,6 +158,8 @@ void GaussianBokehBlurOperation::deinitExecution() BlurBaseOperation::deinitExecution(); delete [] this->gausstab; this->gausstab = NULL; + + deinitMutex(); } bool GaussianBokehBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) diff --git a/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp b/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp index 7a1964a4a63..51a71b90923 100644 --- a/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp +++ b/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp @@ -31,15 +31,16 @@ GaussianXBlurOperation::GaussianXBlurOperation() : BlurBaseOperation(COM_DT_COLO { 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 @@ void GaussianXBlurOperation::initExecution() { BlurBaseOperation::initExecution(); + initMutex(); + if (this->sizeavailable) { float rad = size * this->data->sizex; if (rad < 1) @@ -66,8 +69,8 @@ void GaussianXBlurOperation::updateGauss(MemoryBuffer **memoryBuffers) 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 @@ void GaussianXBlurOperation::deinitExecution() BlurBaseOperation::deinitExecution(); delete [] this->gausstab; this->gausstab = NULL; + + deinitMutex(); } bool GaussianXBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) diff --git a/source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp b/source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp index 06c1c78d85a..f69eeb913ad 100644 --- a/source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp +++ b/source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp @@ -35,15 +35,21 @@ GaussianYBlurOperation::GaussianYBlurOperation() : BlurBaseOperation(COM_DT_COLO 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 @@ void GaussianYBlurOperation::updateGauss(MemoryBuffer **memoryBuffers) float rad = size * this->data->sizey; if (rad < 1) rad = 1; - + this->rad = rad; this->gausstab = BlurBaseOperation::make_gausstab(rad); } @@ -86,8 +92,8 @@ void GaussianYBlurOperation::executePixel(float *color, int x, int y, MemoryBuff maxy = min(maxy, inputBuffer->getRect()->ymax); maxx = min(maxx, inputBuffer->getRect()->xmax); - int step = getStep(); int index; + int step = getStep(); 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 @@ void GaussianYBlurOperation::deinitExecution() BlurBaseOperation::deinitExecution(); delete [] this->gausstab; this->gausstab = NULL; + + deinitMutex(); } bool GaussianYBlurOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) |