Skip to content

Commit 133da7c

Browse files
authored
TSL: Introduces cache hierarchy (#28585)
* fix multi-flow * cleanup * NodeCache: Rename getNodeData() to getData(), and set*() * cleanup * UniformNode: global as default * BufferAttributeNode: Manage global as default * revision
1 parent db91e63 commit 133da7c

17 files changed

+96
-55
lines changed

examples/jsm/nodes/accessors/BatchNode.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ class BatchNode extends Node {
4646
textureLoad( matriceTexture, ivec2( x.add( 3 ), y ) )
4747
);
4848

49-
5049
const bm = mat3(
5150
batchingMatrix[ 0 ].xyz,
5251
batchingMatrix[ 1 ].xyz,

examples/jsm/nodes/accessors/BufferAttributeNode.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ class BufferAttributeNode extends InputNode {
2121

2222
this.attribute = null;
2323

24+
this.global = true;
25+
2426
if ( value && value.isBufferAttribute === true ) {
2527

2628
this.attribute = value;
@@ -31,6 +33,30 @@ class BufferAttributeNode extends InputNode {
3133

3234
}
3335

36+
getHash( builder ) {
37+
38+
if ( this.bufferStride === 0 && this.bufferOffset === 0) {
39+
40+
let bufferData = builder.globalCache.getData( this.value );
41+
42+
if ( bufferData === undefined ) {
43+
44+
bufferData = {
45+
node: this
46+
};
47+
48+
builder.globalCache.setData( this.value, bufferData );
49+
50+
}
51+
52+
return bufferData.node.uuid;
53+
54+
}
55+
56+
return this.uuid;
57+
58+
}
59+
3460
getNodeType( builder ) {
3561

3662
if ( this.bufferType === null ) {

examples/jsm/nodes/accessors/TextureNode.js

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -245,12 +245,8 @@ class TextureNode extends UniformNode {
245245

246246
builder.addLineFlowCode( `${propertyName} = ${snippet}` );
247247

248-
if ( builder.context.tempWrite !== false ) {
249-
250-
nodeData.snippet = snippet;
251-
nodeData.propertyName = propertyName;
252-
253-
}
248+
nodeData.snippet = snippet;
249+
nodeData.propertyName = propertyName;
254250

255251
}
256252

examples/jsm/nodes/core/AttributeNode.js

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,9 @@ class AttributeNode extends Node {
1010

1111
this.defaultNode = defaultNode;
1212

13-
this._attributeName = attributeName;
14-
15-
}
13+
this.global = true;
1614

17-
isGlobal() {
18-
19-
return true;
15+
this._attributeName = attributeName;
2016

2117
}
2218

examples/jsm/nodes/core/CacheNode.js

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
import Node, { addNodeClass } from './Node.js';
2-
import NodeCache from './NodeCache.js';
3-
import { addNodeElement, nodeProxy } from '../shadernode/ShaderNode.js';
2+
import { addNodeElement, nodeObject } from '../shadernode/ShaderNode.js';
43

54
class CacheNode extends Node {
65

7-
constructor( node, cache = new NodeCache() ) {
6+
constructor( node, parent = true ) {
87

98
super();
109

11-
this.isCacheNode = true;
12-
1310
this.node = node;
14-
this.cache = cache;
11+
this.parent = parent;
12+
13+
this.isCacheNode = true;
1514

1615
}
1716

@@ -24,7 +23,7 @@ class CacheNode extends Node {
2423
build( builder, ...params ) {
2524

2625
const previousCache = builder.getCache();
27-
const cache = this.cache || builder.globalCache;
26+
const cache = builder.getCacheFromNode( this, parent );
2827

2928
builder.setCache( cache );
3029

@@ -40,10 +39,8 @@ class CacheNode extends Node {
4039

4140
export default CacheNode;
4241

43-
export const cache = nodeProxy( CacheNode );
44-
export const globalCache = ( node ) => cache( node, null );
42+
export const cache = ( node, ...params ) => nodeObject( new CacheNode( nodeObject( node ), ...params ) );
4543

4644
addNodeElement( 'cache', cache );
47-
addNodeElement( 'globalCache', globalCache );
4845

4946
addNodeClass( 'CacheNode', CacheNode );

examples/jsm/nodes/core/Node.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,7 @@ class Node extends EventDispatcher {
320320

321321
const properties = builder.getNodeProperties( this );
322322

323-
if ( properties.initialized !== true || builder.context.tempRead === false ) {
323+
if ( properties.initialized !== true ) {
324324

325325
const stackNodesBeforeSetup = builder.stack.nodes.length;
326326

@@ -360,7 +360,7 @@ class Node extends EventDispatcher {
360360

361361
result = nodeData.snippet;
362362

363-
if ( result === undefined /*|| builder.context.tempRead === false*/ ) {
363+
if ( result === undefined ) {
364364

365365
result = this.generate( builder ) || '';
366366

examples/jsm/nodes/core/NodeBuilder.js

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,15 @@ class NodeBuilder {
316316

317317
}
318318

319+
getCacheFromNode( node, parent = true ) {
320+
321+
const data = this.getDataFromNode( node );
322+
if ( data.cache === undefined ) data.cache = new NodeCache( parent ? this.getCache() : null );
323+
324+
return data.cache;
325+
326+
}
327+
319328
isAvailable( /*name*/ ) {
320329

321330
return false;
@@ -639,13 +648,13 @@ class NodeBuilder {
639648

640649
cache = cache === null ? ( node.isGlobal( this ) ? this.globalCache : this.cache ) : cache;
641650

642-
let nodeData = cache.getNodeData( node );
651+
let nodeData = cache.getData( node );
643652

644653
if ( nodeData === undefined ) {
645654

646655
nodeData = {};
647656

648-
cache.setNodeData( node, nodeData );
657+
cache.setData( node, nodeData );
649658

650659
}
651660

examples/jsm/nodes/core/NodeCache.js

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,30 @@ let id = 0;
22

33
class NodeCache {
44

5-
constructor() {
5+
constructor( parent = null ) {
66

77
this.id = id ++;
88
this.nodesData = new WeakMap();
99

10+
this.parent = parent;
11+
1012
}
1113

12-
getNodeData( node ) {
14+
getData( node ) {
15+
16+
let data = this.nodesData.get( node );
17+
18+
if ( data === undefined && this.parent !== null ) {
19+
20+
data = this.parent.getData( node );
21+
22+
}
1323

14-
return this.nodesData.get( node );
24+
return data;
1525

1626
}
1727

18-
setNodeData( node, data ) {
28+
setData( node, data ) {
1929

2030
this.nodesData.set( node, data );
2131

examples/jsm/nodes/core/TempNode.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,11 @@ class TempNode extends Node {
2525
const type = builder.getVectorType( this.getNodeType( builder, output ) );
2626
const nodeData = builder.getDataFromNode( this );
2727

28-
if ( builder.context.tempRead !== false && nodeData.propertyName !== undefined ) {
28+
if ( nodeData.propertyName !== undefined ) {
2929

3030
return builder.format( nodeData.propertyName, type, output );
3131

32-
} else if ( builder.context.tempWrite !== false && type !== 'void' && output !== 'void' && this.hasDependencies( builder ) ) {
32+
} else if ( type !== 'void' && output !== 'void' && this.hasDependencies( builder ) ) {
3333

3434
const snippet = super.build( builder, type );
3535

examples/jsm/nodes/core/VarNode.js

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,9 @@ class VarNode extends Node {
1010
this.node = node;
1111
this.name = name;
1212

13-
this.isVarNode = true;
14-
15-
}
13+
this.global = true;
1614

17-
isGlobal() {
18-
19-
return true;
15+
this.isVarNode = true;
2016

2117
}
2218

0 commit comments

Comments
 (0)