From 8ac1d8a4eafe4988ae6c6049bb0ebd40381e46ae Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Mon, 24 Dec 2012 13:33:47 +0000 Subject: 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. --- source/blender/compositor/intern/COM_NodeOperation.cpp | 1 + source/blender/compositor/intern/COM_NodeOperation.h | 8 +++++--- 2 files changed, 6 insertions(+), 3 deletions(-) (limited to 'source/blender/compositor') diff --git a/source/blender/compositor/intern/COM_NodeOperation.cpp b/source/blender/compositor/intern/COM_NodeOperation.cpp index a05c37e1b09..d33b8085022 100644 --- a/source/blender/compositor/intern/COM_NodeOperation.cpp +++ b/source/blender/compositor/intern/COM_NodeOperation.cpp @@ -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; } diff --git a/source/blender/compositor/intern/COM_NodeOperation.h b/source/blender/compositor/intern/COM_NodeOperation.h index f856d8e6a11..60ffadf60f7 100644 --- a/source/blender/compositor/intern/COM_NodeOperation.h +++ b/source/blender/compositor/intern/COM_NodeOperation.h @@ -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); -- cgit v1.2.3