[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