Skip to content

Commit 9533e2e

Browse files
committed
refactor: rename MacroMap to ShaderProgramMap and remove generic abstraction
1 parent 0c0373d commit 9533e2e

File tree

4 files changed

+28
-29
lines changed

4 files changed

+28
-29
lines changed

packages/core/src/Engine.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ import { Shader } from "./shader/Shader";
3333
import { ShaderMacro } from "./shader/ShaderMacro";
3434
import { ShaderMacroCollection } from "./shader/ShaderMacroCollection";
3535
import { ShaderPool } from "./shader/ShaderPool";
36-
import { MacroMap } from "./shader/MacroMap";
36+
import { ShaderProgramMap } from "./shader/ShaderProgramMap";
3737
import { ShaderProgram } from "./shader/ShaderProgram";
3838
import { RenderState } from "./shader/state/RenderState";
3939
import { Texture2D, TextureFormat } from "./texture";
@@ -113,7 +113,7 @@ export class Engine extends EventDispatcher {
113113
/* @internal */
114114
_renderCount: number = 0;
115115
/* @internal */
116-
_shaderProgramMaps: MacroMap<ShaderProgram>[] = [];
116+
_shaderProgramMaps: ShaderProgramMap[] = [];
117117
/** @internal */
118118
_fontMap: Record<string, Font> = {};
119119
/** @internal */
@@ -542,15 +542,15 @@ export class Engine extends EventDispatcher {
542542
/**
543543
* @internal
544544
*/
545-
_getShaderProgramMap(index: number, trackMaps?: MacroMap<ShaderProgram>[]): MacroMap<ShaderProgram> {
545+
_getShaderProgramMap(index: number, trackMaps?: ShaderProgramMap[]): ShaderProgramMap {
546546
const shaderProgramMaps = this._shaderProgramMaps;
547547
let map = shaderProgramMaps[index];
548548
if (!map) {
549549
const length = index + 1;
550550
if (length > shaderProgramMaps.length) {
551551
shaderProgramMaps.length = length;
552552
}
553-
shaderProgramMaps[index] = map = new MacroMap<ShaderProgram>(this);
553+
shaderProgramMaps[index] = map = new ShaderProgramMap(this);
554554
trackMaps?.push(map);
555555
}
556556
return map;

packages/core/src/shader/Shader.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ export class Shader implements IReferable {
241241
for (let k = passShaderProgramMaps.length - 1; k >= 0; k--) {
242242
const map = passShaderProgramMaps[k];
243243
if (map.engine !== engine) continue;
244-
map.clear((program) => program.destroy());
244+
map.destroy();
245245
passShaderProgramMaps.splice(k, 1);
246246
}
247247
}

packages/core/src/shader/ShaderPass.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { ShaderFactory, InstanceLayout } from "../shaderlib/ShaderFactory";
77
import { ShaderMacro } from "./ShaderMacro";
88
import { ShaderMacroCollection } from "./ShaderMacroCollection";
99
import { ShaderPart } from "./ShaderPart";
10-
import { MacroMap } from "./MacroMap";
10+
import { ShaderProgramMap } from "./ShaderProgramMap";
1111
import { ShaderProgram } from "./ShaderProgram";
1212
import { ShaderProperty } from "./ShaderProperty";
1313
import { ShaderLanguage } from "./enums/ShaderLanguage";
@@ -54,7 +54,7 @@ export class ShaderPass extends ShaderPart {
5454
/** @internal */
5555
_renderStateDataMap: Record<number, ShaderProperty> = {};
5656
/** @internal */
57-
_shaderProgramMaps: MacroMap<ShaderProgram>[] = [];
57+
_shaderProgramMaps: ShaderProgramMap[] = [];
5858

5959
private _vertexSource?: string;
6060
private _fragmentSource?: string;
@@ -165,7 +165,7 @@ export class ShaderPass extends ShaderPart {
165165
const shaderProgramMaps = this._shaderProgramMaps;
166166
for (let i = 0, n = shaderProgramMaps.length; i < n; i++) {
167167
const map = shaderProgramMaps[i];
168-
map.clear((program) => program.destroy());
168+
map.destroy();
169169
delete map.engine._shaderProgramMaps[this._shaderPassId];
170170
}
171171
shaderProgramMaps.length = 0;

packages/core/src/shader/MacroMap.ts renamed to packages/core/src/shader/ShaderProgramMap.ts

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,28 @@
11
import { Engine } from "../Engine";
22
import { 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

Comments
 (0)