[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49196] trunk/blender/source/blender/ compositor: Defocus node.

Jeroen Bakker j.bakker at atmind.nl
Wed Jul 25 12:46:19 CEST 2012


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);




More information about the Bf-blender-cvs mailing list