Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeroen Bakker <j.bakker@atmind.nl>2012-07-25 14:46:19 +0400
committerJeroen Bakker <j.bakker@atmind.nl>2012-07-25 14:46:19 +0400
commit8df10a4018b84d57ed4ff6e2bb09c05e4e607099 (patch)
tree24dfebf0641881e2cf0d516386ed67131e147f45 /source/blender
parentc3a8894f57fc7560e54a344a4a16ed5b3886a688 (diff)
Defocus node.
added some maxblur optimizations. Per tile the max blur is calcualted, will save some unneeded CPU/GPU loops GPU: 1:09 => 0:21 CPU: 1:50 => 0:35
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/compositor/intern/COM_MemoryBuffer.cpp27
-rw-r--r--source/blender/compositor/intern/COM_MemoryBuffer.h2
-rw-r--r--source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp50
3 files changed, 63 insertions, 16 deletions
diff --git a/source/blender/compositor/intern/COM_MemoryBuffer.cpp b/source/blender/compositor/intern/COM_MemoryBuffer.cpp
index 0aae8853795..f8c842d8e67 100644
--- a/source/blender/compositor/intern/COM_MemoryBuffer.cpp
+++ b/source/blender/compositor/intern/COM_MemoryBuffer.cpp
@@ -87,6 +87,33 @@ float *MemoryBuffer::convertToValueBuffer()
return result;
}
+float MemoryBuffer::getMaximumValue()
+{
+ float result = this->m_buffer[0];
+ const unsigned int size = this->determineBufferSize();
+ unsigned int i;
+
+ const float *fp_src = this->m_buffer;
+
+ for (i = 0; i < size; i++, fp_src += COM_NUMBER_OF_CHANNELS) {
+ float value = *fp_src;
+ if (value > result) {
+ result = value;
+ }
+ }
+
+ return result;
+}
+
+float MemoryBuffer::getMaximumValue(rcti* rect)
+{
+ MemoryBuffer *temp = new MemoryBuffer(NULL, rect);
+ temp->copyContentFrom(this);
+ float result = temp->getMaximumValue();
+ delete temp;
+ return result;
+}
+
MemoryBuffer::~MemoryBuffer()
{
if (this->m_buffer) {
diff --git a/source/blender/compositor/intern/COM_MemoryBuffer.h b/source/blender/compositor/intern/COM_MemoryBuffer.h
index 9abbfb163e2..411c5b9ad8a 100644
--- a/source/blender/compositor/intern/COM_MemoryBuffer.h
+++ b/source/blender/compositor/intern/COM_MemoryBuffer.h
@@ -228,6 +228,8 @@ public:
MemoryBuffer *duplicate();
float *convertToValueBuffer();
+ float getMaximumValue();
+ float getMaximumValue(rcti* rect);
private:
unsigned int determineBufferSize();
diff --git a/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp b/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp
index 8faa571dc38..66d7e9d4d99 100644
--- a/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp
+++ b/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp
@@ -61,28 +61,41 @@ void VariableSizeBokehBlurOperation::initExecution()
#endif
QualityStepHelper::initExecution(COM_QH_INCREASE);
}
+struct VariableSizeBokehBlurTileData
+{
+ MemoryBuffer* color;
+ MemoryBuffer* bokeh;
+ MemoryBuffer* size;
+ int maxBlur;
+};
void *VariableSizeBokehBlurOperation::initializeTileData(rcti *rect)
{
- MemoryBuffer** result = new MemoryBuffer*[3];
- result[0] = (MemoryBuffer*)this->m_inputProgram->initializeTileData(rect);
- result[1] = (MemoryBuffer*)this->m_inputBokehProgram->initializeTileData(rect);
- result[2] = (MemoryBuffer*)this->m_inputSizeProgram->initializeTileData(rect);
- return result;
+ VariableSizeBokehBlurTileData *data = new VariableSizeBokehBlurTileData();
+ data->color = (MemoryBuffer*)this->m_inputProgram->initializeTileData(rect);
+ data->bokeh = (MemoryBuffer*)this->m_inputBokehProgram->initializeTileData(rect);
+ data->size = (MemoryBuffer*)this->m_inputSizeProgram->initializeTileData(rect);
+
+
+ rcti rect2;
+ this->determineDependingAreaOfInterest(rect, (ReadBufferOperation*)this->m_inputSizeProgram, &rect2);
+ data->maxBlur = (int)data->size->getMaximumValue(&rect2);
+ CLAMP(data->maxBlur, 1.0f, this->m_maxBlur);
+ return data;
}
void VariableSizeBokehBlurOperation::deinitializeTileData(rcti *rect, void *data)
{
- MemoryBuffer** result = (MemoryBuffer**)data;
- delete[] result;
+ VariableSizeBokehBlurTileData* result = (VariableSizeBokehBlurTileData*)data;
+ delete result;
}
void VariableSizeBokehBlurOperation::executePixel(float *color, int x, int y, void *data)
{
- MemoryBuffer** buffers = (MemoryBuffer**)data;
- MemoryBuffer* inputProgramBuffer = buffers[0];
- MemoryBuffer* inputBokehBuffer = buffers[1];
- MemoryBuffer* inputSizeBuffer = buffers[2];
+ VariableSizeBokehBlurTileData* tileData = (VariableSizeBokehBlurTileData*)data;
+ MemoryBuffer* inputProgramBuffer = tileData->color;
+ MemoryBuffer* inputBokehBuffer = tileData->bokeh;
+ MemoryBuffer* inputSizeBuffer = tileData->size;
float* inputSizeFloatBuffer = inputSizeBuffer->getBuffer();
float* inputProgramFloatBuffer = inputProgramBuffer->getBuffer();
float readColor[4];
@@ -90,6 +103,7 @@ void VariableSizeBokehBlurOperation::executePixel(float *color, int x, int y, vo
float tempSize[4];
float multiplier_accum[4] = {0.0f, 0.0f, 0.0f, 0.0f};
float color_accum[4] = {0.0f, 0.0f, 0.0f, 0.0f};
+ int maxBlur = tileData->maxBlur;
#ifdef COM_DEFOCUS_SEARCH
float search[4];
@@ -99,10 +113,10 @@ void VariableSizeBokehBlurOperation::executePixel(float *color, int x, int y, vo
int maxx = search[2];
int maxy = search[3];
#else
- int minx = MAX2(x - this->m_maxBlur, 0.0f);
- int miny = MAX2(y - this->m_maxBlur, 0.0f);
- int maxx = MIN2(x + this->m_maxBlur, m_width);
- int maxy = MIN2(y + this->m_maxBlur, m_height);
+ int minx = MAX2(x - maxBlur, 0.0f);
+ int miny = MAX2(y - maxBlur, 0.0f);
+ int maxx = MIN2(x + maxBlur, m_width);
+ int maxy = MIN2(y + maxBlur, m_height);
#endif
{
inputSizeBuffer->readNoCheck(tempSize, x, y);
@@ -156,9 +170,13 @@ void VariableSizeBokehBlurOperation::executeOpenCL(OpenCLDevice* device,
cl_kernel defocusKernel = device->COM_clCreateKernel("defocusKernel", NULL);
cl_int step = this->getStep();
- cl_int maxBlur = this->m_maxBlur;
+ cl_int maxBlur;
cl_float threshold = this->m_threshold;
+ MemoryBuffer *sizeMemoryBuffer = (MemoryBuffer *)this->m_inputSizeProgram->getInputMemoryBuffer(inputMemoryBuffers);
+ maxBlur = (cl_int)sizeMemoryBuffer->getMaximumValue();
+ maxBlur = MIN2(maxBlur, this->m_maxBlur);
+
device->COM_clAttachMemoryBufferToKernelParameter(defocusKernel, 0, -1, clMemToCleanUp, inputMemoryBuffers, this->m_inputProgram);
device->COM_clAttachMemoryBufferToKernelParameter(defocusKernel, 1, -1, clMemToCleanUp, inputMemoryBuffers, this->m_inputBokehProgram);
device->COM_clAttachMemoryBufferToKernelParameter(defocusKernel, 2, 4, clMemToCleanUp, inputMemoryBuffers, this->m_inputSizeProgram);