Limit out of screen tiles to be scheduled.

This commit is contained in:
Jeroen Bakker 2012-07-02 15:26:47 +00:00
parent a0c6371b7f
commit ea5e0d0212
2 changed files with 17 additions and 8 deletions

@ -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;
}

@ -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();
}