11import { Engine } from "../Engine" ;
22import { ShaderMacroCollection } from "./ShaderMacroCollection" ;
3+ import { ShaderProgram } from "./ShaderProgram" ;
34
4- type Tree < T > = {
5- [ key : number ] : Tree < T > | T ;
5+ type Tree = {
6+ [ key : number ] : Tree | ShaderProgram ;
67} ;
78
89/**
9- * Map keyed by ShaderMacroCollection bitmask.
10+ * Map keyed by ShaderMacroCollection bitmask, caching ShaderProgram instances .
1011 * @internal
1112 */
12- export class MacroMap < T > {
13+ export class ShaderProgramMap {
1314 engine : Engine ;
1415
1516 private _cacheHierarchyDepth : number = 1 ;
16- private _cacheMap : Tree < T > = Object . create ( null ) ;
17- private _lastQueryMap : Record < number , T > ;
17+ private _cacheMap : Tree = Object . create ( null ) ;
18+ private _lastQueryMap : Record < number , ShaderProgram > ;
1819 private _lastQueryKey : number ;
1920
2021 constructor ( engine ?: Engine ) {
2122 this . engine = engine ;
2223 }
2324
24- get ( macros : ShaderMacroCollection ) : T | null {
25+ get ( macros : ShaderMacroCollection ) : ShaderProgram | null {
2526 let cacheMap = this . _cacheMap ;
2627 const maskLength = macros . _length ;
2728 const cacheHierarchyDepth = this . _cacheHierarchyDepth ;
@@ -35,54 +36,52 @@ export class MacroMap<T> {
3536 const maxEndIndex = this . _cacheHierarchyDepth - 1 ;
3637 for ( let i = 0 ; i < maxEndIndex ; i ++ ) {
3738 const subMask = endIndex < i ? 0 : mask [ i ] ;
38- let subCache = < Tree < T > > cacheMap [ subMask ] ;
39+ let subCache = < Tree > cacheMap [ subMask ] ;
3940 subCache || ( cacheMap [ subMask ] = subCache = Object . create ( null ) ) ;
4041 cacheMap = subCache ;
4142 }
4243
4344 const cacheKey = endIndex < maxEndIndex ? 0 : mask [ maxEndIndex ] ;
44- const value = ( < Record < number , T > > cacheMap ) [ cacheKey ] ;
45+ const value = ( < Record < number , ShaderProgram > > cacheMap ) [ cacheKey ] ;
4546 if ( ! value ) {
4647 this . _lastQueryKey = cacheKey ;
47- this . _lastQueryMap = < Record < number , T > > cacheMap ;
48+ this . _lastQueryMap = < Record < number , ShaderProgram > > cacheMap ;
4849 }
4950 return value ;
5051 }
5152
52- cache ( value : T ) : void {
53+ cache ( value : ShaderProgram ) : void {
5354 this . _lastQueryMap [ this . _lastQueryKey ] = value ;
5455 }
5556
56- clear ( callback ?: ( value : T ) => void ) : void {
57- if ( callback ) {
58- this . _recursiveForEach ( 0 , this . _cacheMap , callback ) ;
59- }
57+ destroy ( ) : void {
58+ this . _recursiveForEach ( 0 , this . _cacheMap ) ;
6059 this . _cacheMap = Object . create ( null ) ;
6160 this . _cacheHierarchyDepth = 1 ;
6261 }
6362
64- private _recursiveForEach ( hierarchy : number , cacheMap : Tree < T > , callback : ( value : T ) => void ) : void {
63+ private _recursiveForEach ( hierarchy : number , cacheMap : Tree ) : void {
6564 if ( hierarchy === this . _cacheHierarchyDepth - 1 ) {
6665 for ( let k in cacheMap ) {
67- callback ( < T > cacheMap [ k ] ) ;
66+ ( < ShaderProgram > cacheMap [ k ] ) . destroy ( ) ;
6867 }
6968 return ;
7069 }
7170 ++ hierarchy ;
7271 for ( let k in cacheMap ) {
73- this . _recursiveForEach ( hierarchy , < Tree < T > > cacheMap [ k ] , callback ) ;
72+ this . _recursiveForEach ( hierarchy , < Tree > cacheMap [ k ] ) ;
7473 }
7574 }
7675
7776 private _resizeCacheMapHierarchy (
78- cacheMap : Tree < T > ,
77+ cacheMap : Tree ,
7978 hierarchy : number ,
8079 currentHierarchy : number ,
8180 increaseHierarchy : number
8281 ) : void {
8382 if ( hierarchy == currentHierarchy - 1 ) {
8483 for ( let k in cacheMap ) {
85- const value = < T > cacheMap [ k ] ;
84+ const value = < ShaderProgram > cacheMap [ k ] ;
8685 let subCacheMap = cacheMap ;
8786 for ( let i = 0 ; i < increaseHierarchy ; i ++ ) {
8887 subCacheMap [ i == 0 ? k : 0 ] = subCacheMap = Object . create ( null ) ;
@@ -92,7 +91,7 @@ export class MacroMap<T> {
9291 } else {
9392 hierarchy ++ ;
9493 for ( let k in cacheMap ) {
95- this . _resizeCacheMapHierarchy ( < Tree < T > > cacheMap [ k ] , hierarchy , currentHierarchy , increaseHierarchy ) ;
94+ this . _resizeCacheMapHierarchy ( < Tree > cacheMap [ k ] , hierarchy , currentHierarchy , increaseHierarchy ) ;
9695 }
9796 }
9897 }
0 commit comments