Skip to content

Commit 2fd400b

Browse files
committed
Making UsdShadeConnectionSourceInfo hashable, and keeping a cache of seen connections in the recursive _IsConnectionDirty to minimise rechecking branches.
1 parent 99749e2 commit 2fd400b

File tree

2 files changed

+28
-5
lines changed

2 files changed

+28
-5
lines changed

pxr/usd/usdShade/connectableAPI.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -806,6 +806,14 @@ struct UsdShadeConnectionSourceInfo {
806806
bool operator!=(const UsdShadeConnectionSourceInfo &other) const {
807807
return !(*this == other);
808808
}
809+
810+
template <typename HashState>
811+
friend void TfHashAppend(HashState& h, const UsdShadeConnectionSourceInfo& info) {
812+
// Using the same criteria as operator==(...)
813+
h.Append(info.sourceName);
814+
h.Append(info.sourceType);
815+
h.Append(info.source.GetPrim());
816+
}
809817
};
810818

811819
PXR_NAMESPACE_CLOSE_SCOPE

pxr/usdImaging/usdImaging/materialAdapter.cpp

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -123,10 +123,17 @@ _IsConnectionDirty(
123123
const UsdPrim& dirtyPrim,
124124
const TfTokenVector& dirtyProperties,
125125
const UsdShadeMaterial& material,
126-
const UsdShadeConnectionSourceInfo& connection)
126+
const UsdShadeConnectionSourceInfo& connection,
127+
TfHashMap<UsdShadeConnectionSourceInfo, bool, TfHash>& seenConnections)
127128
{
129+
if (bool seen; TfMapLookup(seenConnections, connection, &seen))
130+
return seen;
131+
128132
if (!connection.IsValid())
133+
{
134+
seenConnections.insert({connection, false});
129135
return false;
136+
}
130137

131138
// If we reach the root material only dirty if we are connected to the
132139
// specific property which is dirty and don't recurse further.
@@ -141,15 +148,18 @@ _IsConnectionDirty(
141148
&& dirtyProperty
142149
== connection.source.GetInput(connection.sourceName)
143150
.GetFullName())) {
151+
seenConnections.insert({connection, true});
144152
return true;
145153
}
146154
}
147155
}
156+
seenConnections.insert({connection, false});
148157
return false;
149158
}
150159

151160
// We are connected to the dirty prim
152161
if (connection.source.GetPrim() == dirtyPrim) {
162+
seenConnections.insert({connection, true});
153163
return true;
154164
}
155165

@@ -162,7 +172,8 @@ _IsConnectionDirty(
162172
output.GetConnectedSources()) {
163173
if (_IsConnectionDirty(
164174
dirtyPrim, dirtyProperties, material,
165-
outputConnection)) {
175+
outputConnection, seenConnections)) {
176+
seenConnections.insert({connection, true});
166177
return true;
167178
}
168179
}
@@ -174,12 +185,14 @@ _IsConnectionDirty(
174185
for (UsdShadeConnectionSourceInfo& inputConnection :
175186
input.GetConnectedSources()) {
176187
if (_IsConnectionDirty(
177-
dirtyPrim, dirtyProperties, material, inputConnection)) {
188+
dirtyPrim, dirtyProperties, material, inputConnection, seenConnections)) {
189+
seenConnections.insert({connection, true});
178190
return true;
179191
}
180192
}
181193
}
182194

195+
seenConnections.insert({connection, false});
183196
return false;
184197
}
185198

@@ -201,7 +214,8 @@ UsdImagingMaterialAdapter::InvalidateImagingSubprim(
201214
for (UsdShadeOutput& output : material.GetOutputs()) {
202215
for (UsdShadeConnectionSourceInfo& connection :
203216
output.GetConnectedSources()) {
204-
if (_IsConnectionDirty(prim, properties, material, connection)) {
217+
TfHashMap<UsdShadeConnectionSourceInfo, bool, TfHash> seenConnections;
218+
if (_IsConnectionDirty(prim, properties, material, connection, seenConnections)) {
205219
result.insert(_CreateTerminalLocator(output.GetBaseName()));
206220
}
207221
}
@@ -235,8 +249,9 @@ UsdImagingMaterialAdapter::InvalidateImagingSubprimFromDescendent(
235249
for (UsdShadeOutput& output : material.GetOutputs()) {
236250
for (UsdShadeConnectionSourceInfo& connection :
237251
output.GetConnectedSources()) {
252+
TfHashMap<UsdShadeConnectionSourceInfo, bool, TfHash> seenConnections;
238253
if (_IsConnectionDirty(
239-
descendentPrim, properties, material, connection)) {
254+
descendentPrim, properties, material, connection, seenConnections)) {
240255
result.insert(_CreateTerminalLocator(output.GetBaseName()));
241256
}
242257
}

0 commit comments

Comments
 (0)