Fix #33650: Compositor locks up when input is an unrendered render layer.

Issue was caused by resolution detecting which assumed zero resolution is
undefined one and should be re-evaluated. It doesn't work in cases when
there's a missing input, causing lots of unneeded resolution re-calculation.

It wasn't so much issue in average sized node trees, but it was a real
problem in generated tree from the report.

Currently used pretty simple solution which added a boolean flag to the
node operation which signal whether resolution was ever set or not.

There're probably smarter solutions here but can not think about them.
This commit is contained in:
Sergey Sharybin 2012-12-24 13:33:47 +00:00
parent a1c9241797
commit 8ac1d8a4ea
2 changed files with 6 additions and 3 deletions

@ -34,6 +34,7 @@ NodeOperation::NodeOperation() : NodeBase()
this->m_complex = false;
this->m_width = 0;
this->m_height = 0;
this->m_isResolutionSet = false;
this->m_openCL = false;
this->m_btree = NULL;
}

@ -81,6 +81,7 @@ private:
*/
const bNodeTree *m_btree;
bool m_isResolutionSet;
public:
/**
* @brief is this node an operation?
@ -170,7 +171,7 @@ public:
virtual void deinitExecution();
bool isResolutionSet() {
return this->m_width != 0 && this->m_height != 0;
return this->m_isResolutionSet;
}
/**
@ -181,6 +182,7 @@ public:
if (!isResolutionSet()) {
this->m_width = resolution[0];
this->m_height = resolution[1];
this->m_isResolutionSet = true;
}
}
@ -254,8 +256,8 @@ public:
protected:
NodeOperation();
void setWidth(unsigned int width) { this->m_width = width; }
void setHeight(unsigned int height) { this->m_height = height; }
void setWidth(unsigned int width) { this->m_width = width; this->m_isResolutionSet = true; }
void setHeight(unsigned int height) { this->m_height = height; this->m_isResolutionSet = true; }
SocketReader *getInputSocketReader(unsigned int inputSocketindex);
NodeOperation *getInputOperation(unsigned int inputSocketindex);