Limit out of screen tiles to be scheduled.
authorJeroen Bakker <j.bakker@atmind.nl>
Mon, 2 Jul 2012 15:26:47 +0000 (15:26 +0000)
committerJeroen Bakker <j.bakker@atmind.nl>
Mon, 2 Jul 2012 15:26:47 +0000 (15:26 +0000)
source/blender/compositor/intern/COM_ExecutionGroup.cpp
source/blender/compositor/operations/COM_ProjectorLensDistortionOperation.cpp

index 1a0bd95b7d66b762540aa17f55faea80820ccc4d..2d3d24b296f6cb56b7448946ab02f8971bd717ff 100644 (file)
@@ -485,14 +485,18 @@ bool ExecutionGroup::scheduleAreaWhenPossible(ExecutionSystem *graph, rcti *area
        float chunkSizef = this->m_chunkSize;
 
        int indexx, indexy;
-       const int minxchunk = floor(area->xmin / chunkSizef);
-       const int maxxchunk = ceil((area->xmax - 1) / chunkSizef);
-       const int minychunk = floor(area->ymin / chunkSizef);
-       const int maxychunk = ceil((area->ymax - 1) / chunkSizef);
+       int minxchunk = floor(area->xmin / chunkSizef);
+       int maxxchunk = ceil((area->xmax - 1) / chunkSizef);
+       int minychunk = floor(area->ymin / chunkSizef);
+       int maxychunk = ceil((area->ymax - 1) / chunkSizef);
+       minxchunk = MAX2(minxchunk, 0);
+       minychunk = MAX2(minychunk, 0);
+       maxxchunk = MIN2(maxxchunk, this->m_numberOfXChunks);
+       maxychunk = MIN2(maxychunk, this->m_numberOfYChunks);
 
        bool result = true;
-       for (indexx = max(minxchunk, 0); indexx < maxxchunk; indexx++) {
-               for (indexy = max(minychunk, 0); indexy < maxychunk; indexy++) {
+       for (indexx = minxchunk; indexx < maxxchunk; indexx++) {
+               for (indexy = minychunk; indexy < maxychunk; indexy++) {
                        if (!scheduleChunkWhenPossible(graph, indexx, indexy)) {
                                result = false;
                        }
index 50bac63d6f2936cd83a8a420cc64bad7005cd85b..74145c52a5de13b695143e4410120c7e0c57f81c 100644 (file)
@@ -36,6 +36,7 @@ ProjectorLensDistortionOperation::ProjectorLensDistortionOperation() : NodeOpera
 }
 void ProjectorLensDistortionOperation::initExecution()
 {
+       this->initMutex();
        this->m_inputProgram = this->getInputSocketReader(0);
 }
 
@@ -65,6 +66,7 @@ void ProjectorLensDistortionOperation::executePixel(float *color, int x, int y,
 
 void ProjectorLensDistortionOperation::deinitExecution()
 {
+       this->deinitMutex();
        this->m_inputProgram = NULL;
 }
 
@@ -77,16 +79,18 @@ bool ProjectorLensDistortionOperation::determineDependingAreaOfInterest(rcti *in
                newInput.xmin = input->xmin - this->m_kr2 - 2;
                newInput.xmax = input->xmax + this->m_kr2 + 2;
        } else {
-               newInput.xmin = 0;
+               newInput.xmin = input->xmin-7; //(0.25f*20*1)+2 == worse case dispersion
                newInput.ymin = input->ymin;
                newInput.ymax = input->ymax;
-               newInput.xmax = this->m_inputProgram->getWidth();
+               newInput.xmax = input->xmax+7; //(0.25f*20*1)+2 == worse case dispersion
        }
        return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output);
 }
 
 void ProjectorLensDistortionOperation::updateDispersion(MemoryBuffer **inputBuffers) 
 {
+       if (this->m_dispersionAvailable) return;
+       this->lockMutex();
        if (!this->m_dispersionAvailable) {
                float result[4];
                this->getInputSocketReader(1)->read(result, 0, 0, COM_PS_NEAREST, inputBuffers);
@@ -95,4 +99,5 @@ void ProjectorLensDistortionOperation::updateDispersion(MemoryBuffer **inputBuff
                this->m_kr2 = this->m_kr * 20;
                this->m_dispersionAvailable = true;
        }
+       this->unlockMutex();
 }