Revision: 49196
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49196
Author:   jbakker
Date:     2012-07-25 10:46:19 +0000 (Wed, 25 Jul 2012)
Log Message:
-----------
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

Modified Paths:
--------------
    trunk/blender/source/blender/compositor/intern/COM_MemoryBuffer.cpp
    trunk/blender/source/blender/compositor/intern/COM_MemoryBuffer.h
    
trunk/blender/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp

Modified: trunk/blender/source/blender/compositor/intern/COM_MemoryBuffer.cpp
===================================================================
--- trunk/blender/source/blender/compositor/intern/COM_MemoryBuffer.cpp 
2012-07-25 10:39:54 UTC (rev 49195)
+++ trunk/blender/source/blender/compositor/intern/COM_MemoryBuffer.cpp 
2012-07-25 10:46:19 UTC (rev 49196)
@@ -87,6 +87,33 @@
        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) {

Modified: trunk/blender/source/blender/compositor/intern/COM_MemoryBuffer.h
===================================================================
--- trunk/blender/source/blender/compositor/intern/COM_MemoryBuffer.h   
2012-07-25 10:39:54 UTC (rev 49195)
+++ trunk/blender/source/blender/compositor/intern/COM_MemoryBuffer.h   
2012-07-25 10:46:19 UTC (rev 49196)
@@ -228,6 +228,8 @@
        MemoryBuffer *duplicate();
        
        float *convertToValueBuffer();
+       float getMaximumValue();
+       float getMaximumValue(rcti* rect);
 private:
        unsigned int determineBufferSize();
 

Modified: 
trunk/blender/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp
===================================================================
--- 
trunk/blender/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp
   2012-07-25 10:39:54 UTC (rev 49195)
+++ 
trunk/blender/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp
   2012-07-25 10:46:19 UTC (rev 49196)
@@ -61,28 +61,41 @@
 #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 @@
        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 @@
        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 @@
        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);

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to