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;