Fix T70615: Cycles ignores BSDF inputs when nodes are optimized
When compiling BSDF nodes, we only assing stack space to the normal and tangent inputs if they are linked. However, it could be that the ConstantFolder removed the link, so checking if there is a link fails to take this into account. To fix this, added a flag to ShaderInput to keep track of whether a constant was folded into the input, and use it as well to verify that the socket is linked when assigning stack space. Reviewed By: brecht Maniphest Tasks: T70615 Differential Revision: https://developer.blender.org/D11731
This commit is contained in:
parent
d1e0059eac
commit
e7fc15e2ef
Notes:
blender-bot
2023-02-14 09:02:40 +01:00
Referenced by issue #70615, Cycles ignores normal inputs when fed by nodes without inputs from other nodes
|
@ -48,6 +48,7 @@ void ConstantFolder::make_constant(float value) const
|
|||
|
||||
foreach (ShaderInput *sock, output->links) {
|
||||
sock->set(value);
|
||||
sock->constant_folded_in = true;
|
||||
}
|
||||
|
||||
graph->disconnect(output);
|
||||
|
@ -59,6 +60,7 @@ void ConstantFolder::make_constant(float3 value) const
|
|||
|
||||
foreach (ShaderInput *sock, output->links) {
|
||||
sock->set(value);
|
||||
sock->constant_folded_in = true;
|
||||
}
|
||||
|
||||
graph->disconnect(output);
|
||||
|
|
|
@ -79,7 +79,11 @@ enum ShaderNodeSpecialType {
|
|||
class ShaderInput {
|
||||
public:
|
||||
ShaderInput(const SocketType &socket_type_, ShaderNode *parent_)
|
||||
: socket_type(socket_type_), parent(parent_), link(NULL), stack_offset(SVM_STACK_INVALID)
|
||||
: socket_type(socket_type_),
|
||||
parent(parent_),
|
||||
link(NULL),
|
||||
stack_offset(SVM_STACK_INVALID),
|
||||
constant_folded_in(false)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -111,6 +115,10 @@ class ShaderInput {
|
|||
ShaderNode *parent;
|
||||
ShaderOutput *link;
|
||||
int stack_offset; /* for SVM compiler */
|
||||
|
||||
/* Keeps track of whether a constant was folded in this socket, to avoid over-optimizing when the
|
||||
* link is null. */
|
||||
bool constant_folded_in;
|
||||
};
|
||||
|
||||
/* Output
|
||||
|
|
|
@ -304,7 +304,7 @@ int SVMCompiler::stack_assign(ShaderOutput *output)
|
|||
|
||||
int SVMCompiler::stack_assign_if_linked(ShaderInput *input)
|
||||
{
|
||||
if (input->link)
|
||||
if (input->link || input->constant_folded_in)
|
||||
return stack_assign(input);
|
||||
|
||||
return SVM_STACK_INVALID;
|
||||
|
|
Loading…
Reference in New Issue