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

Reply via email to