@@ -277,15 +277,15 @@ func (p *Programmer) writeShaders(w io.Writer, nodes []Shader) (n int, objs []Sh
277
277
newObjects := p .objsScratch [prevIdx :]
278
278
for i := range newObjects {
279
279
if newObjects [i ].Binding != - 1 {
280
- return n , nil , fmt .Errorf ("shader buffer object binding should be set to -1 until shader generated for %T, %q" , node , newObjects [i ].NamePtr )
280
+ return n , nil , fmt .Errorf ("shader buffer object binding should be set to -1 until shader generated for %T, %q" , unwraproot ( node ) , newObjects [i ].NamePtr )
281
281
}
282
282
newObjects [i ].Binding = currentBase
283
283
currentBase ++
284
284
obj := newObjects [i ]
285
285
nameHash := hash (obj .NamePtr , 0 )
286
286
_ , nameConflict := p .names [nameHash ]
287
287
if nameConflict {
288
- return n , nil , fmt .Errorf ("shader buffer object name conflict resolution not implemented: %T has buffer conflicting name %q of type %s" , node , obj .NamePtr , obj .Element .String ())
288
+ return n , nil , fmt .Errorf ("shader buffer object name conflict resolution not implemented: %T has buffer conflicting name %q of type %s" , unwraproot ( node ) , obj .NamePtr , obj .Element .String ())
289
289
}
290
290
p .names [nameHash ] = nameHash
291
291
blockName := unsafe .String (& obj .NamePtr [0 ], len (obj .NamePtr )) + "Buffer"
@@ -316,7 +316,17 @@ func (p *Programmer) writeShaders(w io.Writer, nodes []Shader) (n int, objs []Sh
316
316
if bodyHash == gotBodyHash {
317
317
continue // Shader already written and is identical, skip.
318
318
}
319
- return n , nil , fmt .Errorf ("duplicate %T shader name %q w/ body:\n %s" , node , name , body )
319
+ // Look for identical shader
320
+ var conflictBody []byte
321
+ for j := i + 1 ; j < len (nodes ); j ++ {
322
+ conflictBody = nodes [j ].AppendShaderName (conflictBody [:0 ])
323
+ if bytes .Equal (conflictBody , name ) {
324
+ conflictBody = nodes [j ].AppendShaderBody (conflictBody [:0 ])
325
+ break
326
+ }
327
+ conflictBody = conflictBody [:0 ]
328
+ }
329
+ return n , nil , fmt .Errorf ("duplicate %T shader name %q w/ body:\n %s\n \n conflict with distinct shader with same name:\n %s" , unwraproot (node ), name , body , conflictBody )
320
330
} else {
321
331
p .names [nameHash ] = bodyHash // Not found, add it.
322
332
}
@@ -368,6 +378,9 @@ func ShortenNames2D(root *Shader2D, maxRewriteLen int) error {
368
378
369
379
func rewriteName3 (s3 * Shader3D , scratch []byte , rewritelen int ) []byte {
370
380
sd3 := * s3
381
+ if _ , ok := sd3 .(* nameOverloadShader3D ); ok {
382
+ return scratch // Already overloaded.
383
+ }
371
384
name , scratch := makeShortname (sd3 , scratch , rewritelen )
372
385
if name == nil {
373
386
return scratch
@@ -378,6 +391,9 @@ func rewriteName3(s3 *Shader3D, scratch []byte, rewritelen int) []byte {
378
391
379
392
func rewriteName2 (s2 * Shader2D , scratch []byte , rewritelen int ) []byte {
380
393
sd2 := * s2
394
+ if _ , ok := sd2 .(* nameOverloadShader2D ); ok {
395
+ return scratch // Already overloaded.
396
+ }
381
397
name , scratch := makeShortname (sd2 , scratch , rewritelen )
382
398
if name == nil {
383
399
return scratch
@@ -960,6 +976,7 @@ func (ob3 *overloadBounds3) Evaluate(pos []ms3.Vec, dist []float32, userData any
960
976
}
961
977
return sdf .Evaluate (pos , dist , userData )
962
978
}
979
+ func (ob3 * overloadBounds3 ) unwrap () Shader { return ob3 .Shader3D }
963
980
964
981
// OverloadShader2DBounds overloads a [Shader2D] Bounds method with the argument bounding box.
965
982
func OverloadShader2DBounds (s Shader2D , bb ms2.Box ) Shader2D {
@@ -985,6 +1002,8 @@ func (ob3 *overloadBounds2) Evaluate(pos []ms2.Vec, dist []float32, userData any
985
1002
return sdf .Evaluate (pos , dist , userData )
986
1003
}
987
1004
1005
+ func (ob2 * overloadBounds2 ) unwrap () Shader { return ob2 .Shader2D }
1006
+
988
1007
var _ Shader3D = (* CachedShader3D )(nil ) // Interface implementation compile-time check.
989
1008
990
1009
// CachedShader3D implements the Shader3D interface with results it caches for another Shader3D on a call to RefreshCache.
@@ -1045,6 +1064,8 @@ func (c3 *CachedShader3D) Evaluate(pos []ms3.Vec, dist []float32, userData any)
1045
1064
return sdf .Evaluate (pos , dist , userData )
1046
1065
}
1047
1066
1067
+ func (c3 * CachedShader3D ) unwrap () Shader { return c3 .Shader }
1068
+
1048
1069
var _ Shader2D = (* CachedShader2D )(nil ) // Interface implementation compile-time check.
1049
1070
1050
1071
// CachedShader2D implements the Shader2D interface with results it caches for another Shader2D on a call to RefreshCache.
@@ -1095,6 +1116,8 @@ func (c2 *CachedShader2D) AppendShaderObjects(objs []ShaderObject) []ShaderObjec
1095
1116
return c2 .Shader .AppendShaderObjects (objs )
1096
1117
}
1097
1118
1119
+ func (c2 * CachedShader2D ) unwrap () Shader { return c2 .Shader }
1120
+
1098
1121
type nameOverloadShader3D struct {
1099
1122
Shader Shader3D
1100
1123
name []byte
@@ -1150,6 +1173,8 @@ func (nos3 *nameOverloadShader3D) AppendShaderName(b []byte) []byte {
1150
1173
return append (b , nos3 .name ... )
1151
1174
}
1152
1175
1176
+ func (nos3 * nameOverloadShader3D ) unwrap () Shader { return nos3 .Shader }
1177
+
1153
1178
type nameOverloadShader2D struct {
1154
1179
Shader Shader2D
1155
1180
name []byte
@@ -1182,6 +1207,8 @@ func (nos2 *nameOverloadShader2D) AppendShaderObjects(objs []ShaderObject) []Sha
1182
1207
return nos2 .Shader .AppendShaderObjects (objs )
1183
1208
}
1184
1209
1210
+ func (nos2 * nameOverloadShader2D ) unwrap () Shader { return nos2 .Shader }
1211
+
1185
1212
func hash (b []byte , in uint64 ) uint64 {
1186
1213
// Leaving md5 here since we may need to revert to
1187
1214
// a more entropic hash to avoid collisions...
@@ -1200,9 +1227,33 @@ func hash(b []byte, in uint64) uint64 {
1200
1227
x = (x ^ (x >> 27 )) * 0x94d049bb133111eb
1201
1228
x ^= x >> 31
1202
1229
b = b [8 :]
1230
+
1203
1231
}
1204
- for i := range b {
1205
- x ^= uint64 (b [i ]) << i * 8
1232
+ if len (b ) > 0 {
1233
+ var buf [8 ]byte
1234
+ copy (buf [:], b )
1235
+ x ^= binary .LittleEndian .Uint64 (buf [:])
1236
+ x = (x ^ (x >> 30 )) * 0xbf58476d1ce4e5b9
1237
+ x = (x ^ (x >> 27 )) * 0x94d049bb133111eb
1238
+ x ^= x >> 31
1206
1239
}
1207
1240
return x
1208
1241
}
1242
+
1243
+ func unwraproot (s Shader ) Shader {
1244
+ i := 0
1245
+ var sbase Shader
1246
+ for s != nil && i < 6 {
1247
+ sbase = s
1248
+ s = unwrap (s )
1249
+ i ++
1250
+ }
1251
+ return sbase
1252
+ }
1253
+
1254
+ func unwrap (s Shader ) Shader {
1255
+ if unwrapper , ok := s .(interface { unwrap () Shader }); ok {
1256
+ return unwrapper .unwrap ()
1257
+ }
1258
+ return nil
1259
+ }
0 commit comments