From f69e4c22f915dd9e1186655a936313faef2f458a Mon Sep 17 00:00:00 2001 From: JGamache-autodesk <56274617+JGamache-autodesk@users.noreply.github.com> Date: Fri, 8 Sep 2023 15:16:13 -0400 Subject: [PATCH] Refine dot node elision and remove unused code (#1522) Dot nodes were elided in #1152 to prevent creating extra samplers in rasterized shadergen. This preserves the change written by @kwokcb while keeping the distinction between a topological constant node and a non-topological dot node. In scenarios where you want to feed a single color to multiple shader nodes in a complex material, using a constant node will force recompilation every time the color is tweaked, we want users to be able to use a dot node to feed the graph, which should allow tweaking the color without having to recompile the shader. Also allows re-using the shader code for material instances differing on this input color. --- .../stdlib/organization/organization.mtlx | 10 +++++ source/MaterialXGenShader/ShaderGraph.cpp | 40 ++----------------- source/MaterialXGenShader/ShaderNode.cpp | 10 ----- source/MaterialXGenShader/ShaderNode.h | 13 ++---- 4 files changed, 18 insertions(+), 55 deletions(-) diff --git a/resources/Materials/TestSuite/stdlib/organization/organization.mtlx b/resources/Materials/TestSuite/stdlib/organization/organization.mtlx index 21154aecdd..0f4c024848 100644 --- a/resources/Materials/TestSuite/stdlib/organization/organization.mtlx +++ b/resources/Materials/TestSuite/stdlib/organization/organization.mtlx @@ -90,4 +90,14 @@ + + + + + + + + + + diff --git a/source/MaterialXGenShader/ShaderGraph.cpp b/source/MaterialXGenShader/ShaderGraph.cpp index 8a424f8bf5..8482659b34 100644 --- a/source/MaterialXGenShader/ShaderGraph.cpp +++ b/source/MaterialXGenShader/ShaderGraph.cpp @@ -1027,48 +1027,16 @@ void ShaderGraph::optimize(GenContext& context) } else if (node->hasClassification(ShaderNode::Classification::DOT)) { - // Dot nodes without modifiers can be elided by moving their connection downstream. + // Filename dot nodes must be elided so they do not create extra samplers. ShaderInput* in = node->getInput("in"); - if (in->getChannels().empty()) + if (in->getChannels().empty() && in->getType() == Type::FILENAME) { bypass(context, node, 0); ++numEdits; } } - else if (node->hasClassification(ShaderNode::Classification::IFELSE)) - { - // Check if we have a constant conditional expression - ShaderInput* intest = node->getInput("intest"); - if (!intest->getConnection()) - { - // Find which branch should be taken - ShaderInput* cutoff = node->getInput("cutoff"); - ValuePtr value = intest->getValue(); - const float intestValue = value ? value->asA() : 0.0f; - const int branch = (intestValue <= cutoff->getValue()->asA() ? 2 : 3); - - // Bypass the conditional using the taken branch - bypass(context, node, branch); - - ++numEdits; - } - } - else if (node->hasClassification(ShaderNode::Classification::SWITCH)) - { - // Check if we have a constant conditional expression - const ShaderInput* which = node->getInput("which"); - if (!which->getConnection()) - { - // Find which branch should be taken - ValuePtr value = which->getValue(); - const int branch = int(value == nullptr ? 0 : (which->getType() == Type::FLOAT ? value->asA() : value->asA())); - - // Bypass the conditional using the taken branch - bypass(context, node, branch); - - ++numEdits; - } - } + // Adding more nodes here requires them to have an input that is tagged + // "uniform" in the NodeDef or to handle very specific cases, like FILENAME. } if (numEdits > 0) diff --git a/source/MaterialXGenShader/ShaderNode.cpp b/source/MaterialXGenShader/ShaderNode.cpp index 3eb750f1ff..04551cb6d2 100644 --- a/source/MaterialXGenShader/ShaderNode.cpp +++ b/source/MaterialXGenShader/ShaderNode.cpp @@ -135,8 +135,6 @@ const ShaderNodePtr ShaderNode::NONE = createEmptyNode(); const string ShaderNode::CONSTANT = "constant"; const string ShaderNode::DOT = "dot"; const string ShaderNode::IMAGE = "image"; -const string ShaderNode::COMPARE = "compare"; -const string ShaderNode::SWITCH = "switch"; const string ShaderNode::SURFACESHADER = "surfaceshader"; const string ShaderNode::SCATTER_MODE = "scatter_mode"; const string ShaderNode::BSDF_R = "R"; @@ -292,14 +290,6 @@ ShaderNodePtr ShaderNode::create(const ShaderGraph* parent, const string& name, { newNode->_classification = Classification::TEXTURE | Classification::DOT; } - else if (nodeDef.getNodeString() == COMPARE) - { - newNode->_classification = Classification::TEXTURE | Classification::CONDITIONAL | Classification::IFELSE; - } - else if (nodeDef.getNodeString() == SWITCH) - { - newNode->_classification = Classification::TEXTURE | Classification::CONDITIONAL | Classification::SWITCH; - } // Third, check for file texture classification by group name else if (groupName == TEXTURE2D_GROUPNAME || groupName == TEXTURE3D_GROUPNAME) { diff --git a/source/MaterialXGenShader/ShaderNode.h b/source/MaterialXGenShader/ShaderNode.h index 30e3ab6d59..536e0adc1e 100644 --- a/source/MaterialXGenShader/ShaderNode.h +++ b/source/MaterialXGenShader/ShaderNode.h @@ -350,14 +350,11 @@ class MX_GENSHADER_API ShaderNode static const uint32_t VOLUME = 1 << 15; /// A volume shader node static const uint32_t LIGHT = 1 << 16; /// A light shader node static const uint32_t UNLIT = 1 << 17; /// An unlit surface shader node - // Specific conditional types - static const uint32_t IFELSE = 1 << 18; /// An if-else statement - static const uint32_t SWITCH = 1 << 19; /// A switch statement // Types based on nodegroup - static const uint32_t SAMPLE2D = 1 << 20; /// Can be sampled in 2D (uv space) - static const uint32_t SAMPLE3D = 1 << 21; /// Can be sampled in 3D (position) - static const uint32_t GEOMETRIC = 1 << 22; /// Geometric input - static const uint32_t DOT = 1 << 23; /// A dot node + static const uint32_t SAMPLE2D = 1 << 18; /// Can be sampled in 2D (uv space) + static const uint32_t SAMPLE3D = 1 << 19; /// Can be sampled in 3D (position) + static const uint32_t GEOMETRIC = 1 << 20; /// Geometric input + static const uint32_t DOT = 1 << 21; /// A dot node }; static const ShaderNodePtr NONE; @@ -365,8 +362,6 @@ class MX_GENSHADER_API ShaderNode static const string CONSTANT; static const string DOT; static const string IMAGE; - static const string COMPARE; - static const string SWITCH; static const string SURFACESHADER; static const string SCATTER_MODE; static const string BSDF_R;