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. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs