[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [47309] trunk/blender/source/blender/ compositor: Replaced tile based memory manager with a single aligned buffer

Monique Dewanchand m.dewanchand at atmind.nl
Fri Jun 1 12:20:25 CEST 2012


Revision: 47309
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=47309
Author:   mdewanchand
Date:     2012-06-01 10:20:24 +0000 (Fri, 01 Jun 2012)
Log Message:
-----------
Replaced tile based memory manager with a single aligned buffer
 - should increase speed with large node setups
 - enables caching of buffers in the node editor (in the future)
 - OpenCL part still needs some work
 

Modified Paths:
--------------
    trunk/blender/source/blender/compositor/CMakeLists.txt
    trunk/blender/source/blender/compositor/intern/COM_CPUDevice.cpp
    trunk/blender/source/blender/compositor/intern/COM_ExecutionGroup.cpp
    trunk/blender/source/blender/compositor/intern/COM_ExecutionGroup.h
    trunk/blender/source/blender/compositor/intern/COM_ExecutionSystem.cpp
    trunk/blender/source/blender/compositor/intern/COM_ExecutionSystemHelper.cpp
    trunk/blender/source/blender/compositor/intern/COM_MemoryBuffer.cpp
    trunk/blender/source/blender/compositor/intern/COM_MemoryProxy.cpp
    trunk/blender/source/blender/compositor/intern/COM_MemoryProxy.h
    trunk/blender/source/blender/compositor/intern/COM_NodeOperation.h
    trunk/blender/source/blender/compositor/intern/COM_OpenCLDevice.cpp
    trunk/blender/source/blender/compositor/operations/COM_WriteBufferOperation.cpp

Removed Paths:
-------------
    trunk/blender/source/blender/compositor/intern/COM_MemoryManager.cpp
    trunk/blender/source/blender/compositor/intern/COM_MemoryManager.h
    trunk/blender/source/blender/compositor/intern/COM_MemoryManagerState.cpp
    trunk/blender/source/blender/compositor/intern/COM_MemoryManagerState.h

Modified: trunk/blender/source/blender/compositor/CMakeLists.txt
===================================================================
--- trunk/blender/source/blender/compositor/CMakeLists.txt	2012-06-01 08:01:04 UTC (rev 47308)
+++ trunk/blender/source/blender/compositor/CMakeLists.txt	2012-06-01 10:20:24 UTC (rev 47309)
@@ -79,10 +79,6 @@
 	intern/COM_MemoryProxy.h
 	intern/COM_MemoryBuffer.cpp
 	intern/COM_MemoryBuffer.h
-	intern/COM_MemoryManager.cpp
-	intern/COM_MemoryManager.h
-	intern/COM_MemoryManagerState.cpp
-	intern/COM_MemoryManagerState.h
 	intern/COM_WorkScheduler.cpp
 	intern/COM_WorkScheduler.h
 	intern/COM_WorkPackage.cpp

Modified: trunk/blender/source/blender/compositor/intern/COM_CPUDevice.cpp
===================================================================
--- trunk/blender/source/blender/compositor/intern/COM_CPUDevice.cpp	2012-06-01 08:01:04 UTC (rev 47308)
+++ trunk/blender/source/blender/compositor/intern/COM_CPUDevice.cpp	2012-06-01 10:20:24 UTC (rev 47309)
@@ -29,14 +29,10 @@
 	rcti rect;
 
 	executionGroup->determineChunkRect(&rect, chunkNumber);
-	MemoryBuffer ** inputBuffers = executionGroup->getInputBuffers(chunkNumber);
-	MemoryBuffer * outputBuffer = executionGroup->allocateOutputBuffer(chunkNumber, &rect);
+	MemoryBuffer ** inputBuffers = executionGroup->getInputBuffersCPU();
 
 	executionGroup->getOutputNodeOperation()->executeRegion(&rect, chunkNumber, inputBuffers);
 
 	executionGroup->finalizeChunkExecution(chunkNumber, inputBuffers);
-	if (outputBuffer != NULL) {
-		outputBuffer->setCreatedState();
-	}
 }
 

Modified: trunk/blender/source/blender/compositor/intern/COM_ExecutionGroup.cpp
===================================================================
--- trunk/blender/source/blender/compositor/intern/COM_ExecutionGroup.cpp	2012-06-01 08:01:04 UTC (rev 47308)
+++ trunk/blender/source/blender/compositor/intern/COM_ExecutionGroup.cpp	2012-06-01 10:20:24 UTC (rev 47309)
@@ -34,7 +34,6 @@
 #include "COM_ViewerOperation.h"
 #include <stdlib.h>
 #include "BLI_math.h"
-#include "COM_MemoryManager.h"
 #include "PIL_time.h"
 #include "COM_ChunkOrder.h"
 #include <algorithm>
@@ -362,8 +361,25 @@
 	delete[] chunkOrder;
 }
 
-MemoryBuffer** ExecutionGroup::getInputBuffers(int chunkNumber)
+MemoryBuffer** ExecutionGroup::getInputBuffersCPU()
 {
+	vector<MemoryProxy*> memoryproxies;
+	unsigned int index;
+
+	this->determineDependingMemoryProxies(&memoryproxies);
+	MemoryBuffer **memoryBuffers = new MemoryBuffer*[this->cachedMaxReadBufferOffset];
+	for (index = 0 ; index < this->cachedMaxReadBufferOffset ; index ++) {
+		memoryBuffers[index] = NULL;
+	}
+	for (index = 0 ; index < this->cachedReadOperations.size(); index ++) {
+		ReadBufferOperation *readOperation = (ReadBufferOperation*)this->cachedReadOperations[index];
+		memoryBuffers[readOperation->getOffset()] = readOperation->getMemoryProxy()->getBuffer();
+	}
+	return memoryBuffers;
+}
+
+MemoryBuffer** ExecutionGroup::getInputBuffersOpenCL(int chunkNumber)
+{
 	rcti rect;
 	vector<MemoryProxy*> memoryproxies;
 	unsigned int index;
@@ -385,6 +401,8 @@
 	return memoryBuffers;
 }
 
+// @todo: for opencl the memory buffers size needs to be same as the needed size
+// currently this method is not called, but will be when opencl nodes are created
 MemoryBuffer *ExecutionGroup::constructConsolidatedMemoryBuffer(MemoryProxy *memoryProxy, rcti *rect)
 {
 	// find all chunks inside the rect
@@ -399,8 +417,7 @@
 	const int maxychunk = ceil((rect->ymax-1)/chunkSizef);
 
 	if (maxxchunk== minxchunk+1 && maxychunk == minychunk+1) {
-		const int chunkNumber = minxchunk+minychunk*numberOfXChunks;
-		MemoryBuffer *result = MemoryManager::getMemoryBuffer(memoryProxy, chunkNumber);
+		MemoryBuffer *result =memoryProxy->getBuffer();
 		return result;
 	}
 
@@ -420,7 +437,7 @@
 	for (indexx = max(minxchunk, 0); indexx<min((int)this->numberOfXChunks, maxxchunk) ; indexx++) {
 		for (indexy = max(minychunk, 0); indexy<min((int)this->numberOfYChunks, maxychunk) ; indexy++) {
 			int chunkNumber = indexx+indexy*this->numberOfXChunks;
-			MemoryBuffer *chunkBuffer = MemoryManager::getMemoryBuffer(memoryProxy, chunkNumber);
+			MemoryBuffer *chunkBuffer = memoryProxy->getBuffer();
 			result->copyContentFrom(chunkBuffer);
 		}
 	}
@@ -432,8 +449,6 @@
 {
 	if (this->chunkExecutionStates[chunkNumber] == COM_ES_SCHEDULED)
 		this->chunkExecutionStates[chunkNumber] = COM_ES_EXECUTED;
-	else 
-		throw "Threading inconsistency";
 	
 	this->chunksFinished++;
 	if (memoryBuffers) {
@@ -477,7 +492,7 @@
 	NodeOperation * operation = this->getOutputNodeOperation();
 	if (operation->isWriteBufferOperation()) {
 		WriteBufferOperation *writeOperation = (WriteBufferOperation*)operation;
-		outputBuffer = MemoryManager::allocateMemoryBuffer(writeOperation->getMemoryProxy(), chunkNumber, rect);
+// @todo		outputBuffer = MemoryManager::allocateMemoryBuffer(writeOperation->getMemoryProxy(), chunkNumber, rect);
 	}
 	return outputBuffer;
 }

Modified: trunk/blender/source/blender/compositor/intern/COM_ExecutionGroup.h
===================================================================
--- trunk/blender/source/blender/compositor/intern/COM_ExecutionGroup.h	2012-06-01 08:01:04 UTC (rev 47308)
+++ trunk/blender/source/blender/compositor/intern/COM_ExecutionGroup.h	2012-06-01 10:20:24 UTC (rev 47309)
@@ -334,9 +334,17 @@
 	  * @param chunkNumber the chunk to be calculated
 	  * @return MemoryBuffer** the inputbuffers
 	  */
-	MemoryBuffer** getInputBuffers(int chunkNumber);
-	
+	MemoryBuffer** getInputBuffersCPU();
+
 	/**
+	  * @brief get all inputbuffers needed to calculate an chunk
+	  * @note all inputbuffers must be executed
+	  * @param chunkNumber the chunk to be calculated
+	  * @return MemoryBuffer** the inputbuffers
+	  */
+	MemoryBuffer** getInputBuffersOpenCL(int chunkNumber);
+
+	/**
 	  * @brief allocate the outputbuffer of a chunk
 	  * @param chunkNumber the number of the chunk in the ExecutionGroup
 	  * @param rect the rect of that chunk

Modified: trunk/blender/source/blender/compositor/intern/COM_ExecutionSystem.cpp
===================================================================
--- trunk/blender/source/blender/compositor/intern/COM_ExecutionSystem.cpp	2012-06-01 08:01:04 UTC (rev 47308)
+++ trunk/blender/source/blender/compositor/intern/COM_ExecutionSystem.cpp	2012-06-01 10:20:24 UTC (rev 47309)
@@ -31,7 +31,6 @@
 #include "COM_NodeBase.h"
 #include "COM_WorkScheduler.h"
 #include "COM_ReadBufferOperation.h"
-#include "COM_MemoryManager.h"
 #include "stdio.h"
 #include "COM_GroupNode.h"
 #include "COM_WriteBufferOperation.h"
@@ -114,8 +113,6 @@
 			order ++;
 		}
 	}
-
-	MemoryManager::initialize();
 	unsigned int index;
 
 	for (index = 0 ; index < this->operations.size() ; index ++) {
@@ -156,7 +153,6 @@
 		ExecutionGroup * executionGroup = this->groups[index];
 		executionGroup->deinitExecution();
 	}
-	MemoryManager::clear();
 }
 
 void ExecutionSystem::addOperation(NodeOperation *operation)

Modified: trunk/blender/source/blender/compositor/intern/COM_ExecutionSystemHelper.cpp
===================================================================
--- trunk/blender/source/blender/compositor/intern/COM_ExecutionSystemHelper.cpp	2012-06-01 08:01:04 UTC (rev 47308)
+++ trunk/blender/source/blender/compositor/intern/COM_ExecutionSystemHelper.cpp	2012-06-01 10:20:24 UTC (rev 47309)
@@ -31,7 +31,6 @@
 #include "COM_NodeBase.h"
 #include "COM_WorkScheduler.h"
 #include "COM_ReadBufferOperation.h"
-#include "COM_MemoryManager.h"
 #include "stdio.h"
 #include "COM_GroupNode.h"
 #include "COM_WriteBufferOperation.h"

Modified: trunk/blender/source/blender/compositor/intern/COM_MemoryBuffer.cpp
===================================================================
--- trunk/blender/source/blender/compositor/intern/COM_MemoryBuffer.cpp	2012-06-01 08:01:04 UTC (rev 47308)
+++ trunk/blender/source/blender/compositor/intern/COM_MemoryBuffer.cpp	2012-06-01 10:20:24 UTC (rev 47309)
@@ -44,7 +44,7 @@
 	BLI_init_rcti(&this->rect, rect->xmin, rect->xmax, rect->ymin, rect->ymax);
 	this->memoryProxy = memoryProxy;
 	this->chunkNumber = chunkNumber;
-	this->buffer = (float*)MEM_mallocN(sizeof(float)*determineBufferSize()*4, "COM_MemoryBuffer");
+	this->buffer = (float*)MEM_mallocN(sizeof(float)*determineBufferSize()*COM_NUMBER_OF_CHANNELS, "COM_MemoryBuffer");
 	this->state = COM_MB_ALLOCATED;
 	this->datatype = COM_DT_COLOR;
 	this->chunkWidth = this->rect.xmax - this->rect.xmin;
@@ -55,7 +55,7 @@
 	BLI_init_rcti(&this->rect, rect->xmin, rect->xmax, rect->ymin, rect->ymax);
 	this->memoryProxy = memoryProxy;
 	this->chunkNumber = -1;
-	this->buffer = (float*)MEM_mallocN(sizeof(float)*determineBufferSize()*4, "COM_MemoryBuffer");
+	this->buffer = (float*)MEM_mallocN(sizeof(float)*determineBufferSize()*COM_NUMBER_OF_CHANNELS, "COM_MemoryBuffer");
 	this->state = COM_MB_TEMPORARILY;
 	this->datatype = COM_DT_COLOR;
 	this->chunkWidth = this->rect.xmax - this->rect.xmin;
@@ -63,12 +63,12 @@
 MemoryBuffer *MemoryBuffer::duplicate()
 {
 	MemoryBuffer *result = new MemoryBuffer(this->memoryProxy, &this->rect);
-	memcpy(result->buffer, this->buffer, this->determineBufferSize()*4*sizeof(float));
+	memcpy(result->buffer, this->buffer, this->determineBufferSize()*COM_NUMBER_OF_CHANNELS*sizeof(float));
 	return result;
 }
 void MemoryBuffer::clear()
 {
-	memset(this->buffer, 0, this->determineBufferSize()*4*sizeof(float));
+	memset(this->buffer, 0, this->determineBufferSize()*COM_NUMBER_OF_CHANNELS*sizeof(float));
 }
 
 float *MemoryBuffer::convertToValueBuffer()
@@ -77,7 +77,7 @@
 	int i;
 	int offset4;
 	float *result = new float[size];
-	for (i = 0, offset4 = 0 ; i < size ; i ++, offset4 +=4) {
+	for (i = 0, offset4 = 0 ; i < size ; i ++, offset4 +=COM_NUMBER_OF_CHANNELS) {
 		result[i] = this->buffer[offset4];
 	}
 
@@ -107,9 +107,9 @@
 
 
 	for (otherY = minY ; otherY<maxY ; otherY ++) {
-		otherOffset = ((otherY-otherBuffer->rect.ymin) * otherBuffer->chunkWidth + minX-otherBuffer->rect.xmin)*4;
-		offset = ((otherY - this->rect.ymin) * this->chunkWidth + minX-this->rect.xmin)*4;
-		memcpy(&this->buffer[offset], &otherBuffer->buffer[otherOffset], (maxX-minX) * 4*sizeof(float));
+		otherOffset = ((otherY-otherBuffer->rect.ymin) * otherBuffer->chunkWidth + minX-otherBuffer->rect.xmin)*COM_NUMBER_OF_CHANNELS;
+		offset = ((otherY - this->rect.ymin) * this->chunkWidth + minX-this->rect.xmin)*COM_NUMBER_OF_CHANNELS;

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list