@babylonjs/smart-filters 0.1.0-alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/IDisposable.d.ts +10 -0
- package/dist/IDisposable.d.ts.map +1 -0
- package/dist/IDisposable.js +2 -0
- package/dist/IDisposable.js.map +1 -0
- package/dist/blocks/aggregateBlock.d.ts +50 -0
- package/dist/blocks/aggregateBlock.d.ts.map +1 -0
- package/dist/blocks/aggregateBlock.js +103 -0
- package/dist/blocks/aggregateBlock.js.map +1 -0
- package/dist/blocks/baseBlock.d.ts +160 -0
- package/dist/blocks/baseBlock.d.ts.map +1 -0
- package/dist/blocks/baseBlock.js +256 -0
- package/dist/blocks/baseBlock.js.map +1 -0
- package/dist/blocks/copyBlock.d.ts +59 -0
- package/dist/blocks/copyBlock.d.ts.map +1 -0
- package/dist/blocks/copyBlock.js +84 -0
- package/dist/blocks/copyBlock.js.map +1 -0
- package/dist/blocks/disableableBlock.d.ts +30 -0
- package/dist/blocks/disableableBlock.d.ts.map +1 -0
- package/dist/blocks/disableableBlock.js +22 -0
- package/dist/blocks/disableableBlock.js.map +1 -0
- package/dist/blocks/inputBlock.d.ts +64 -0
- package/dist/blocks/inputBlock.d.ts.map +1 -0
- package/dist/blocks/inputBlock.js +74 -0
- package/dist/blocks/inputBlock.js.map +1 -0
- package/dist/blocks/outputBlock.d.ts +42 -0
- package/dist/blocks/outputBlock.d.ts.map +1 -0
- package/dist/blocks/outputBlock.js +74 -0
- package/dist/blocks/outputBlock.js.map +1 -0
- package/dist/blocks/shaderBlock.d.ts +68 -0
- package/dist/blocks/shaderBlock.d.ts.map +1 -0
- package/dist/blocks/shaderBlock.js +101 -0
- package/dist/blocks/shaderBlock.js.map +1 -0
- package/dist/command/command.d.ts +49 -0
- package/dist/command/command.d.ts.map +1 -0
- package/dist/command/command.js +15 -0
- package/dist/command/command.js.map +1 -0
- package/dist/command/commandBuffer.d.ts +40 -0
- package/dist/command/commandBuffer.d.ts.map +1 -0
- package/dist/command/commandBuffer.js +58 -0
- package/dist/command/commandBuffer.js.map +1 -0
- package/dist/command/commandBufferDebugger.d.ts +7 -0
- package/dist/command/commandBufferDebugger.d.ts.map +1 -0
- package/dist/command/commandBufferDebugger.js +12 -0
- package/dist/command/commandBufferDebugger.js.map +1 -0
- package/dist/connection/connectionPoint.d.ts +110 -0
- package/dist/connection/connectionPoint.d.ts.map +1 -0
- package/dist/connection/connectionPoint.js +153 -0
- package/dist/connection/connectionPoint.js.map +1 -0
- package/dist/connection/connectionPointCompatibilityState.d.ts +20 -0
- package/dist/connection/connectionPointCompatibilityState.d.ts.map +1 -0
- package/dist/connection/connectionPointCompatibilityState.js +32 -0
- package/dist/connection/connectionPointCompatibilityState.js.map +1 -0
- package/dist/connection/connectionPointDirection.d.ts +10 -0
- package/dist/connection/connectionPointDirection.d.ts.map +1 -0
- package/dist/connection/connectionPointDirection.js +11 -0
- package/dist/connection/connectionPointDirection.js.map +1 -0
- package/dist/connection/connectionPointType.d.ts +22 -0
- package/dist/connection/connectionPointType.d.ts.map +1 -0
- package/dist/connection/connectionPointType.js +17 -0
- package/dist/connection/connectionPointType.js.map +1 -0
- package/dist/connection/connectionPointWithDefault.d.ts +23 -0
- package/dist/connection/connectionPointWithDefault.d.ts.map +1 -0
- package/dist/connection/connectionPointWithDefault.js +19 -0
- package/dist/connection/connectionPointWithDefault.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/optimization/dependencyGraph.d.ts +31 -0
- package/dist/optimization/dependencyGraph.d.ts.map +1 -0
- package/dist/optimization/dependencyGraph.js +77 -0
- package/dist/optimization/dependencyGraph.js.map +1 -0
- package/dist/optimization/optimizedShaderBlock.d.ts +75 -0
- package/dist/optimization/optimizedShaderBlock.d.ts.map +1 -0
- package/dist/optimization/optimizedShaderBlock.js +105 -0
- package/dist/optimization/optimizedShaderBlock.js.map +1 -0
- package/dist/optimization/smartFilterOptimizer.d.ts +72 -0
- package/dist/optimization/smartFilterOptimizer.d.ts.map +1 -0
- package/dist/optimization/smartFilterOptimizer.js +482 -0
- package/dist/optimization/smartFilterOptimizer.js.map +1 -0
- package/dist/runtime/renderTargetGenerator.d.ts +35 -0
- package/dist/runtime/renderTargetGenerator.d.ts.map +1 -0
- package/dist/runtime/renderTargetGenerator.js +153 -0
- package/dist/runtime/renderTargetGenerator.js.map +1 -0
- package/dist/runtime/shaderRuntime.d.ts +95 -0
- package/dist/runtime/shaderRuntime.d.ts.map +1 -0
- package/dist/runtime/shaderRuntime.js +120 -0
- package/dist/runtime/shaderRuntime.js.map +1 -0
- package/dist/runtime/smartFilterRuntime.d.ts +69 -0
- package/dist/runtime/smartFilterRuntime.d.ts.map +1 -0
- package/dist/runtime/smartFilterRuntime.js +57 -0
- package/dist/runtime/smartFilterRuntime.js.map +1 -0
- package/dist/runtime/strongRef.d.ts +16 -0
- package/dist/runtime/strongRef.d.ts.map +1 -0
- package/dist/runtime/strongRef.js +9 -0
- package/dist/runtime/strongRef.js.map +1 -0
- package/dist/smartFilter.d.ts +100 -0
- package/dist/smartFilter.d.ts.map +1 -0
- package/dist/smartFilter.js +154 -0
- package/dist/smartFilter.js.map +1 -0
- package/dist/utils/shaderCodeUtils.d.ts +131 -0
- package/dist/utils/shaderCodeUtils.d.ts.map +1 -0
- package/dist/utils/shaderCodeUtils.js +115 -0
- package/dist/utils/shaderCodeUtils.js.map +1 -0
- package/dist/utils/textureLoaders.d.ts +14 -0
- package/dist/utils/textureLoaders.d.ts.map +1 -0
- package/dist/utils/textureLoaders.js +22 -0
- package/dist/utils/textureLoaders.js.map +1 -0
- package/license.md +21 -0
- package/package.json +47 -0
- package/readme.md +165 -0
- package/src/IDisposable.ts +9 -0
- package/src/blocks/aggregateBlock.ts +121 -0
- package/src/blocks/baseBlock.ts +341 -0
- package/src/blocks/copyBlock.ts +103 -0
- package/src/blocks/disableableBlock.ts +40 -0
- package/src/blocks/inputBlock.ts +114 -0
- package/src/blocks/outputBlock.ts +97 -0
- package/src/blocks/shaderBlock.ts +145 -0
- package/src/command/command.ts +60 -0
- package/src/command/commandBuffer.ts +71 -0
- package/src/command/commandBufferDebugger.ts +13 -0
- package/src/connection/connectionPoint.ts +212 -0
- package/src/connection/connectionPointCompatibilityState.ts +31 -0
- package/src/connection/connectionPointDirection.ts +9 -0
- package/src/connection/connectionPointType.ts +30 -0
- package/src/connection/connectionPointWithDefault.ts +35 -0
- package/src/index.ts +36 -0
- package/src/optimization/dependencyGraph.ts +94 -0
- package/src/optimization/optimizedShaderBlock.ts +133 -0
- package/src/optimization/smartFilterOptimizer.ts +706 -0
- package/src/runtime/renderTargetGenerator.ts +204 -0
- package/src/runtime/shaderRuntime.ts +155 -0
- package/src/runtime/smartFilterRuntime.ts +104 -0
- package/src/runtime/strongRef.ts +18 -0
- package/src/smartFilter.ts +227 -0
- package/src/utils/shaderCodeUtils.ts +242 -0
- package/src/utils/textureLoaders.ts +28 -0
|
@@ -0,0 +1,482 @@
|
|
|
1
|
+
import { SmartFilter } from "../smartFilter.js";
|
|
2
|
+
import { ConnectionPointType } from "../connection/connectionPointType.js";
|
|
3
|
+
import { ShaderBlock } from "../blocks/shaderBlock.js";
|
|
4
|
+
import { isTextureInputBlock } from "../blocks/inputBlock.js";
|
|
5
|
+
import { OptimizedShaderBlock } from "./optimizedShaderBlock.js";
|
|
6
|
+
import { decorateChar, decorateSymbol, getShaderFragmentCode, undecorateSymbol } from "../utils/shaderCodeUtils.js";
|
|
7
|
+
import { DependencyGraph } from "./dependencyGraph.js";
|
|
8
|
+
import { DisableableBlock } from "../blocks/disableableBlock.js";
|
|
9
|
+
const showDebugData = false;
|
|
10
|
+
/**
|
|
11
|
+
* Optimizes a smart filter by aggregating blocks whenever possible, to reduce the number of draw calls.
|
|
12
|
+
*/
|
|
13
|
+
export class SmartFilterOptimizer {
|
|
14
|
+
/**
|
|
15
|
+
* Creates a new smart filter optimizer
|
|
16
|
+
* @param smartFilter - The smart filter to optimize
|
|
17
|
+
* @param options - Options for the optimizer
|
|
18
|
+
*/
|
|
19
|
+
constructor(smartFilter, options) {
|
|
20
|
+
this._blockStack = [];
|
|
21
|
+
this._blockToStackItem = new Map();
|
|
22
|
+
this._savedBlockStack = [];
|
|
23
|
+
this._savedBlockToStackItem = new Map();
|
|
24
|
+
this._symbolOccurrences = {};
|
|
25
|
+
this._remappedSymbols = [];
|
|
26
|
+
this._blockToMainFunctionName = new Map();
|
|
27
|
+
this._mainFunctionNameToCode = new Map();
|
|
28
|
+
this._dependencyGraph = new DependencyGraph();
|
|
29
|
+
this._forceUnoptimized = false;
|
|
30
|
+
this._sourceSmartFilter = smartFilter;
|
|
31
|
+
this._options = {
|
|
32
|
+
maxSamplersInFragmentShader: 8,
|
|
33
|
+
...options,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Optimizes the smart filter by aggregating blocks whenever possible, to lower the number of rendering passes
|
|
38
|
+
* @returns The optimized smart filter, or null if the optimization failed
|
|
39
|
+
*/
|
|
40
|
+
optimize() {
|
|
41
|
+
this._blockStack = [];
|
|
42
|
+
this._blockToStackItem = new Map();
|
|
43
|
+
let newSmartFilter = null;
|
|
44
|
+
this._sourceSmartFilter._workWithAggregateFreeGraph(() => {
|
|
45
|
+
if (this._sourceSmartFilter.output.connectedTo &&
|
|
46
|
+
!isTextureInputBlock(this._sourceSmartFilter.output.connectedTo.ownerBlock)) {
|
|
47
|
+
const connectionsToReconnect = [];
|
|
48
|
+
if (this._options.removeDisabledBlocks) {
|
|
49
|
+
const alreadyVisitedBlocks = new Set();
|
|
50
|
+
this._disconnectDisabledBlocks(this._sourceSmartFilter.output.connectedTo.ownerBlock, alreadyVisitedBlocks, connectionsToReconnect);
|
|
51
|
+
}
|
|
52
|
+
newSmartFilter = new SmartFilter(this._sourceSmartFilter.name + " - optimized");
|
|
53
|
+
// We must recheck isTextureInputBlock because all shader blocks may have been disconnected by the previous code
|
|
54
|
+
if (!isTextureInputBlock(this._sourceSmartFilter.output.connectedTo.ownerBlock)) {
|
|
55
|
+
// Make sure all the connections in the graph have a runtimeData associated to them
|
|
56
|
+
// Note that the value of the runtimeData may not be set yet, we just need the objects to be created and propagated correctly
|
|
57
|
+
this._sourceSmartFilter.output.ownerBlock.prepareForRuntime();
|
|
58
|
+
this._sourceSmartFilter.output.ownerBlock.propagateRuntimeData();
|
|
59
|
+
const item = {
|
|
60
|
+
inputsToConnectTo: [newSmartFilter.output],
|
|
61
|
+
outputConnectionPoint: this._sourceSmartFilter.output.connectedTo,
|
|
62
|
+
};
|
|
63
|
+
this._blockStack.push(item);
|
|
64
|
+
this._blockToStackItem.set(item.outputConnectionPoint.ownerBlock, item);
|
|
65
|
+
while (this._blockStack.length > 0) {
|
|
66
|
+
const { inputsToConnectTo, outputConnectionPoint } = this._blockStack.pop();
|
|
67
|
+
const newBlock = this._processBlock(newSmartFilter, outputConnectionPoint);
|
|
68
|
+
if (newBlock) {
|
|
69
|
+
for (const inputToConnectTo of inputsToConnectTo) {
|
|
70
|
+
inputToConnectTo.connectTo(newBlock.output);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
newSmartFilter.output.connectTo(this._sourceSmartFilter.output.connectedTo);
|
|
77
|
+
}
|
|
78
|
+
if (this._options.removeDisabledBlocks) {
|
|
79
|
+
// We must reconnect the connections that were reconnected differently by the disconnect process, so that the original graph is left unmodified
|
|
80
|
+
for (const [input, connectedTo] of connectionsToReconnect) {
|
|
81
|
+
input.connectTo(connectedTo);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
return newSmartFilter;
|
|
87
|
+
}
|
|
88
|
+
_disconnectDisabledBlocks(block, alreadyVisitedBlocks, inputsToReconnect) {
|
|
89
|
+
if (alreadyVisitedBlocks.has(block)) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
alreadyVisitedBlocks.add(block);
|
|
93
|
+
for (const input of block.inputs) {
|
|
94
|
+
if (!input.connectedTo || input.type !== ConnectionPointType.Texture) {
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
this._disconnectDisabledBlocks(input.connectedTo.ownerBlock, alreadyVisitedBlocks, inputsToReconnect);
|
|
98
|
+
}
|
|
99
|
+
if (block instanceof DisableableBlock && block.disabled.runtimeData.value) {
|
|
100
|
+
block.disconnectFromGraph(inputsToReconnect);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
_initialize() {
|
|
104
|
+
this._symbolOccurrences = {};
|
|
105
|
+
this._remappedSymbols = [];
|
|
106
|
+
this._blockToMainFunctionName = new Map();
|
|
107
|
+
this._mainFunctionNameToCode = new Map();
|
|
108
|
+
this._dependencyGraph = new DependencyGraph();
|
|
109
|
+
this._vertexShaderCode = undefined;
|
|
110
|
+
this._textureRatio = undefined;
|
|
111
|
+
this._forceUnoptimized = false;
|
|
112
|
+
}
|
|
113
|
+
_makeSymbolUnique(symbolName) {
|
|
114
|
+
let newVarName = symbolName;
|
|
115
|
+
if (!this._symbolOccurrences[symbolName]) {
|
|
116
|
+
this._symbolOccurrences[symbolName] = 1;
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
this._symbolOccurrences[symbolName]++;
|
|
120
|
+
newVarName += "_" + this._symbolOccurrences[symbolName];
|
|
121
|
+
}
|
|
122
|
+
return newVarName;
|
|
123
|
+
}
|
|
124
|
+
_processHelperFunctions(block, code) {
|
|
125
|
+
var _a;
|
|
126
|
+
const functions = block.getShaderProgram().fragment.functions;
|
|
127
|
+
if (functions.length === 1) {
|
|
128
|
+
// There's only the main function, so we don't need to do anything
|
|
129
|
+
return code;
|
|
130
|
+
}
|
|
131
|
+
const replaceFuncNames = [];
|
|
132
|
+
for (const func of functions) {
|
|
133
|
+
let funcName = func.name;
|
|
134
|
+
if (funcName === block.getShaderProgram().fragment.mainFunctionName) {
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
funcName = undecorateSymbol(funcName);
|
|
138
|
+
const regexFindCurName = new RegExp(decorateSymbol(funcName), "g");
|
|
139
|
+
const existingRemapped = this._remappedSymbols.find((s) => s.type === "function" &&
|
|
140
|
+
s.name === funcName &&
|
|
141
|
+
s.owners[0] &&
|
|
142
|
+
s.owners[0].getClassName() === block.getClassName());
|
|
143
|
+
const newVarName = (_a = existingRemapped === null || existingRemapped === void 0 ? void 0 : existingRemapped.remappedName) !== null && _a !== void 0 ? _a : decorateSymbol(this._makeSymbolUnique(funcName));
|
|
144
|
+
if (!existingRemapped) {
|
|
145
|
+
replaceFuncNames.push([regexFindCurName, newVarName]);
|
|
146
|
+
let funcCode = func.code;
|
|
147
|
+
for (const [regex, replacement] of replaceFuncNames) {
|
|
148
|
+
funcCode = funcCode.replace(regex, replacement);
|
|
149
|
+
}
|
|
150
|
+
this._remappedSymbols.push({
|
|
151
|
+
type: "function",
|
|
152
|
+
name: funcName,
|
|
153
|
+
remappedName: newVarName,
|
|
154
|
+
declaration: funcCode,
|
|
155
|
+
owners: [block],
|
|
156
|
+
inputBlock: undefined,
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
code = code.replace(regexFindCurName, newVarName);
|
|
160
|
+
}
|
|
161
|
+
return code;
|
|
162
|
+
}
|
|
163
|
+
_processVariables(block, code, varDecl, declarations, hasValue = false, forceSingleInstance = false) {
|
|
164
|
+
if (!declarations) {
|
|
165
|
+
return [code, []];
|
|
166
|
+
}
|
|
167
|
+
let rex = `${varDecl}\\s+(\\S+)\\s+${decorateChar}(\\w+)${decorateChar}\\s*`;
|
|
168
|
+
if (hasValue) {
|
|
169
|
+
rex += "=\\s*(.+);";
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
rex += ";";
|
|
173
|
+
}
|
|
174
|
+
const samplerList = [];
|
|
175
|
+
const rx = new RegExp(rex, "g");
|
|
176
|
+
let match = rx.exec(declarations);
|
|
177
|
+
while (match !== null) {
|
|
178
|
+
const singleInstance = forceSingleInstance || varDecl === "const";
|
|
179
|
+
const varType = match[1];
|
|
180
|
+
const varName = match[2];
|
|
181
|
+
const varValue = hasValue ? match[3] : null;
|
|
182
|
+
let newVarName = null;
|
|
183
|
+
if (varType === "sampler2D") {
|
|
184
|
+
samplerList.push(decorateSymbol(varName));
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
const existingRemapped = this._remappedSymbols.find((s) => s.type === varDecl &&
|
|
188
|
+
s.name === varName &&
|
|
189
|
+
s.owners[0] &&
|
|
190
|
+
s.owners[0].getClassName() === block.getClassName());
|
|
191
|
+
if (existingRemapped && singleInstance) {
|
|
192
|
+
newVarName = existingRemapped.remappedName;
|
|
193
|
+
if (varDecl === "uniform") {
|
|
194
|
+
existingRemapped.owners.push(block);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
newVarName = decorateSymbol(this._makeSymbolUnique(varName));
|
|
199
|
+
this._remappedSymbols.push({
|
|
200
|
+
type: varDecl,
|
|
201
|
+
name: varName,
|
|
202
|
+
remappedName: newVarName,
|
|
203
|
+
declaration: `${varDecl} ${varType} ${newVarName}${hasValue ? " = " + varValue : ""};`,
|
|
204
|
+
owners: [block],
|
|
205
|
+
inputBlock: undefined,
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
if (newVarName) {
|
|
210
|
+
code = code.replace(new RegExp(decorateSymbol(varName), "g"), newVarName);
|
|
211
|
+
}
|
|
212
|
+
match = rx.exec(declarations);
|
|
213
|
+
}
|
|
214
|
+
return [code, samplerList];
|
|
215
|
+
}
|
|
216
|
+
_processSampleTexture(block, code, sampler, samplers, inputTextureBlock) {
|
|
217
|
+
const rx = new RegExp(`sampleTexture\\s*\\(\\s*${decorateChar}${sampler}${decorateChar}\\s*,\\s*(.*?)\\s*\\)`);
|
|
218
|
+
let newSamplerName = sampler;
|
|
219
|
+
const existingRemapped = this._remappedSymbols.find((s) => s.type === "sampler" && s.inputBlock && s.inputBlock === inputTextureBlock);
|
|
220
|
+
if (existingRemapped) {
|
|
221
|
+
// The texture is shared by multiple blocks. We must reuse the same sampler name
|
|
222
|
+
newSamplerName = existingRemapped.remappedName;
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
newSamplerName = decorateSymbol(this._makeSymbolUnique(newSamplerName));
|
|
226
|
+
this._remappedSymbols.push({
|
|
227
|
+
type: "sampler",
|
|
228
|
+
name: sampler,
|
|
229
|
+
remappedName: newSamplerName,
|
|
230
|
+
declaration: `uniform sampler2D ${newSamplerName};`,
|
|
231
|
+
owners: [block],
|
|
232
|
+
inputBlock: inputTextureBlock,
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
if (samplers.indexOf(newSamplerName) === -1) {
|
|
236
|
+
samplers.push(newSamplerName);
|
|
237
|
+
}
|
|
238
|
+
let match = rx.exec(code);
|
|
239
|
+
while (match !== null) {
|
|
240
|
+
const uv = match[1];
|
|
241
|
+
code =
|
|
242
|
+
code.substring(0, match.index) +
|
|
243
|
+
`texture2D(${newSamplerName}, ${uv})` +
|
|
244
|
+
code.substring(match.index + match[0].length);
|
|
245
|
+
match = rx.exec(code);
|
|
246
|
+
}
|
|
247
|
+
return code;
|
|
248
|
+
}
|
|
249
|
+
_canBeOptimized(block) {
|
|
250
|
+
if (block.disableOptimization) {
|
|
251
|
+
return false;
|
|
252
|
+
}
|
|
253
|
+
if (block instanceof ShaderBlock) {
|
|
254
|
+
if (block.getShaderProgram().vertex !== this._vertexShaderCode) {
|
|
255
|
+
return false;
|
|
256
|
+
}
|
|
257
|
+
if (block.textureRatio !== this._textureRatio) {
|
|
258
|
+
return false;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
return true;
|
|
262
|
+
}
|
|
263
|
+
// Processes a block given one of its output connection point
|
|
264
|
+
// Returns the name of the main function in the shader code
|
|
265
|
+
_optimizeBlock(optimizedBlock, outputConnectionPoint, samplers) {
|
|
266
|
+
var _a;
|
|
267
|
+
const block = outputConnectionPoint.ownerBlock;
|
|
268
|
+
if (block instanceof ShaderBlock) {
|
|
269
|
+
if (this._textureRatio === undefined) {
|
|
270
|
+
this._textureRatio = block.textureRatio;
|
|
271
|
+
}
|
|
272
|
+
const shaderProgram = block.getShaderProgram();
|
|
273
|
+
if (!shaderProgram) {
|
|
274
|
+
throw new Error(`Shader program not found for block "${block.name}"!`);
|
|
275
|
+
}
|
|
276
|
+
// We get the shader code of the main function only
|
|
277
|
+
let code = getShaderFragmentCode(shaderProgram, true);
|
|
278
|
+
this._vertexShaderCode = (_a = this._vertexShaderCode) !== null && _a !== void 0 ? _a : shaderProgram.vertex;
|
|
279
|
+
// Generates a unique name for the fragment main function (if not already generated)
|
|
280
|
+
const shaderFuncName = shaderProgram.fragment.mainFunctionName;
|
|
281
|
+
let newShaderFuncName = this._blockToMainFunctionName.get(block);
|
|
282
|
+
if (!newShaderFuncName) {
|
|
283
|
+
newShaderFuncName = undecorateSymbol(shaderFuncName);
|
|
284
|
+
newShaderFuncName = decorateSymbol(this._makeSymbolUnique(newShaderFuncName));
|
|
285
|
+
this._blockToMainFunctionName.set(block, newShaderFuncName);
|
|
286
|
+
this._dependencyGraph.addElement(newShaderFuncName);
|
|
287
|
+
}
|
|
288
|
+
// Replaces the main function name by the new one
|
|
289
|
+
code = code.replace(shaderFuncName, newShaderFuncName);
|
|
290
|
+
// Removes the vUV declaration if it exists
|
|
291
|
+
code = code.replace(/varying\s+vec2\s+vUV\s*;/g, "");
|
|
292
|
+
// Replaces the texture2D calls by sampleTexture for easier processing
|
|
293
|
+
code = code.replace(/texture2D/g, "sampleTexture");
|
|
294
|
+
// Processes the functions other than the main function
|
|
295
|
+
code = this._processHelperFunctions(block, code);
|
|
296
|
+
// Processes the constants to make them unique
|
|
297
|
+
code = this._processVariables(block, code, "const", shaderProgram.fragment.const, true)[0];
|
|
298
|
+
// Processes the uniform inputs to make them unique. Also extract the list of samplers
|
|
299
|
+
let samplerList = [];
|
|
300
|
+
[code, samplerList] = this._processVariables(block, code, "uniform", shaderProgram.fragment.uniform, false);
|
|
301
|
+
let additionalSamplers = [];
|
|
302
|
+
[code, additionalSamplers] = this._processVariables(block, code, "uniform", shaderProgram.fragment.uniformSingle, false, true);
|
|
303
|
+
samplerList.push(...additionalSamplers);
|
|
304
|
+
// Processes the texture inputs
|
|
305
|
+
for (const sampler of samplerList) {
|
|
306
|
+
const samplerName = undecorateSymbol(sampler);
|
|
307
|
+
const input = block.findInput(samplerName);
|
|
308
|
+
if (!input) {
|
|
309
|
+
// No connection point found corresponding to this texture: it must be a texture used internally by the filter (here we are assuming that the shader code is not bugged!)
|
|
310
|
+
code = this._processSampleTexture(block, code, samplerName, samplers);
|
|
311
|
+
continue;
|
|
312
|
+
}
|
|
313
|
+
// input found. Is it connected?
|
|
314
|
+
if (!input.connectedTo) {
|
|
315
|
+
throw `The connection point corresponding to the input named "${samplerName}" in block named "${block.name}" is not connected!`;
|
|
316
|
+
}
|
|
317
|
+
const parentBlock = input.connectedTo.ownerBlock;
|
|
318
|
+
if (isTextureInputBlock(parentBlock)) {
|
|
319
|
+
// input is connected to an InputBlock of type "Texture": we must directly sample a texture
|
|
320
|
+
code = this._processSampleTexture(block, code, samplerName, samplers, parentBlock);
|
|
321
|
+
}
|
|
322
|
+
else if (this._forceUnoptimized || !this._canBeOptimized(parentBlock)) {
|
|
323
|
+
// the block connected to this input cannot be optimized: we must directly sample its output texture
|
|
324
|
+
code = this._processSampleTexture(block, code, samplerName, samplers);
|
|
325
|
+
let stackItem = this._blockToStackItem.get(parentBlock);
|
|
326
|
+
if (!stackItem) {
|
|
327
|
+
stackItem = {
|
|
328
|
+
inputsToConnectTo: [],
|
|
329
|
+
outputConnectionPoint: input.connectedTo,
|
|
330
|
+
};
|
|
331
|
+
this._blockStack.push(stackItem);
|
|
332
|
+
this._blockToStackItem.set(parentBlock, stackItem);
|
|
333
|
+
}
|
|
334
|
+
// creates a new input connection point for the texture in the optimized block
|
|
335
|
+
const connectionPoint = optimizedBlock._registerInput(samplerName, ConnectionPointType.Texture);
|
|
336
|
+
stackItem.inputsToConnectTo.push(connectionPoint);
|
|
337
|
+
}
|
|
338
|
+
else {
|
|
339
|
+
let parentFuncName;
|
|
340
|
+
if (this._blockToMainFunctionName.has(parentBlock)) {
|
|
341
|
+
// The parent block has already been processed. We can directly use the main function name
|
|
342
|
+
parentFuncName = this._blockToMainFunctionName.get(parentBlock);
|
|
343
|
+
}
|
|
344
|
+
else {
|
|
345
|
+
// Recursively processes the block connected to this input to get the main function name of the parent block
|
|
346
|
+
parentFuncName = this._optimizeBlock(optimizedBlock, input.connectedTo, samplers);
|
|
347
|
+
this._dependencyGraph.addDependency(newShaderFuncName, parentFuncName);
|
|
348
|
+
}
|
|
349
|
+
// The texture samplerName is not used anymore by the block, as it is replaced by a call to the main function of the parent block
|
|
350
|
+
// We remap it to an non existent sampler name, because the code that binds the texture still exists in the ShaderBinding.bind function.
|
|
351
|
+
// We don't want this code to have any effect, as it could overwrite (and remove) the texture binding of another block using this same sampler name!
|
|
352
|
+
this._remappedSymbols.push({
|
|
353
|
+
type: "sampler",
|
|
354
|
+
name: samplerName,
|
|
355
|
+
remappedName: "L(° O °L)",
|
|
356
|
+
declaration: ``,
|
|
357
|
+
owners: [block],
|
|
358
|
+
inputBlock: undefined,
|
|
359
|
+
});
|
|
360
|
+
// We have to replace the call(s) to sampleTexture by a call to the main function of the parent block
|
|
361
|
+
const rx = new RegExp(`sampleTexture\\s*\\(\\s*${sampler}\\s*,\\s*(.*?)\\s*\\)`);
|
|
362
|
+
let match = rx.exec(code);
|
|
363
|
+
while (match !== null) {
|
|
364
|
+
const uv = match[1];
|
|
365
|
+
code =
|
|
366
|
+
code.substring(0, match.index) +
|
|
367
|
+
`${parentFuncName}(${uv})` +
|
|
368
|
+
code.substring(match.index + match[0].length);
|
|
369
|
+
match = rx.exec(code);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
this._mainFunctionNameToCode.set(newShaderFuncName, code);
|
|
374
|
+
return newShaderFuncName;
|
|
375
|
+
}
|
|
376
|
+
throw `Unhandled block type! className=${block.getClassName()}`;
|
|
377
|
+
}
|
|
378
|
+
_saveBlockStackState() {
|
|
379
|
+
this._savedBlockStack = this._blockStack.slice();
|
|
380
|
+
this._savedBlockToStackItem = new Map();
|
|
381
|
+
for (const [key, value] of this._blockToStackItem) {
|
|
382
|
+
value.inputsToConnectTo = value.inputsToConnectTo.slice();
|
|
383
|
+
this._savedBlockToStackItem.set(key, value);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
_restoreBlockStackState() {
|
|
387
|
+
this._blockStack.length = 0;
|
|
388
|
+
this._blockStack.push(...this._savedBlockStack);
|
|
389
|
+
this._blockToStackItem.clear();
|
|
390
|
+
for (const [key, value] of this._savedBlockToStackItem) {
|
|
391
|
+
this._blockToStackItem.set(key, value);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
_processBlock(newSmartFilter, outputConnectionPoint) {
|
|
395
|
+
this._saveBlockStackState();
|
|
396
|
+
this._initialize();
|
|
397
|
+
let optimizedBlock = new OptimizedShaderBlock(newSmartFilter, "optimized");
|
|
398
|
+
const samplers = [];
|
|
399
|
+
let mainFuncName = this._optimizeBlock(optimizedBlock, outputConnectionPoint, samplers);
|
|
400
|
+
if (samplers.length > this._options.maxSamplersInFragmentShader) {
|
|
401
|
+
// Too many samplers for the optimized block.
|
|
402
|
+
// We must force the unoptimized mode and regenerate the block, which will be unoptimized this time
|
|
403
|
+
newSmartFilter.removeBlock(optimizedBlock);
|
|
404
|
+
this._initialize();
|
|
405
|
+
optimizedBlock = new OptimizedShaderBlock(newSmartFilter, "unoptimized");
|
|
406
|
+
this._forceUnoptimized = true;
|
|
407
|
+
samplers.length = 0;
|
|
408
|
+
this._restoreBlockStackState();
|
|
409
|
+
mainFuncName = this._optimizeBlock(optimizedBlock, outputConnectionPoint, samplers);
|
|
410
|
+
}
|
|
411
|
+
// Collects all the shader code
|
|
412
|
+
let code = "";
|
|
413
|
+
this._dependencyGraph.walk((element) => {
|
|
414
|
+
code += this._mainFunctionNameToCode.get(element) + "\n";
|
|
415
|
+
});
|
|
416
|
+
// Sets the remapping of the shader variables
|
|
417
|
+
const blockOwnerToShaderBinding = new Map();
|
|
418
|
+
let codeUniforms = "";
|
|
419
|
+
let codeConsts = "";
|
|
420
|
+
let codeFunctions = "";
|
|
421
|
+
for (const s of this._remappedSymbols) {
|
|
422
|
+
switch (s.type) {
|
|
423
|
+
case "const":
|
|
424
|
+
codeConsts += s.declaration + "\n";
|
|
425
|
+
break;
|
|
426
|
+
case "uniform":
|
|
427
|
+
case "sampler":
|
|
428
|
+
codeUniforms += s.declaration + "\n";
|
|
429
|
+
break;
|
|
430
|
+
case "function":
|
|
431
|
+
codeFunctions += s.declaration + "\n";
|
|
432
|
+
break;
|
|
433
|
+
}
|
|
434
|
+
for (const block of s.owners) {
|
|
435
|
+
let shaderBinding = blockOwnerToShaderBinding.get(block);
|
|
436
|
+
if (!shaderBinding) {
|
|
437
|
+
shaderBinding = block.getShaderBinding();
|
|
438
|
+
blockOwnerToShaderBinding.set(block, shaderBinding);
|
|
439
|
+
}
|
|
440
|
+
switch (s.type) {
|
|
441
|
+
case "uniform":
|
|
442
|
+
case "sampler":
|
|
443
|
+
shaderBinding.addShaderVariableRemapping(decorateSymbol(s.name), s.remappedName);
|
|
444
|
+
break;
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
// Builds and sets the final shader code
|
|
449
|
+
code = codeFunctions + code;
|
|
450
|
+
if (showDebugData) {
|
|
451
|
+
code = code.replace(/^ {16}/gm, "");
|
|
452
|
+
code = code.replace(/\r/g, "");
|
|
453
|
+
code = code.replace(/\n(\n)*/g, "\n");
|
|
454
|
+
console.log(`=================== BLOCK (forceUnoptimized=${this._forceUnoptimized}) ===================`);
|
|
455
|
+
console.log(codeUniforms);
|
|
456
|
+
console.log(codeConsts);
|
|
457
|
+
console.log(code);
|
|
458
|
+
console.log("remappedSymbols=", this._remappedSymbols);
|
|
459
|
+
console.log("samplers=", samplers);
|
|
460
|
+
}
|
|
461
|
+
optimizedBlock.setShaderProgram({
|
|
462
|
+
vertex: this._vertexShaderCode,
|
|
463
|
+
fragment: {
|
|
464
|
+
const: codeConsts,
|
|
465
|
+
uniform: codeUniforms,
|
|
466
|
+
mainFunctionName: mainFuncName,
|
|
467
|
+
functions: [
|
|
468
|
+
{
|
|
469
|
+
name: mainFuncName,
|
|
470
|
+
code,
|
|
471
|
+
},
|
|
472
|
+
],
|
|
473
|
+
},
|
|
474
|
+
});
|
|
475
|
+
if (this._textureRatio !== undefined) {
|
|
476
|
+
optimizedBlock.textureRatio = this._textureRatio;
|
|
477
|
+
}
|
|
478
|
+
optimizedBlock.setShaderBindings(Array.from(blockOwnerToShaderBinding.values()));
|
|
479
|
+
return optimizedBlock;
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
//# sourceMappingURL=smartFilterOptimizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smartFilterOptimizer.js","sourceRoot":"","sources":["../../src/optimization/smartFilterOptimizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { InitializationData, SmartFilter } from "../smartFilter";
|
|
2
|
+
/**
|
|
3
|
+
* The render target generator is responsible for creating and assigning render targets to ShaderBlocks.
|
|
4
|
+
*/
|
|
5
|
+
export declare class RenderTargetGenerator {
|
|
6
|
+
private _optimize;
|
|
7
|
+
private _renderTargetPool;
|
|
8
|
+
private _numTargetsCreated;
|
|
9
|
+
/**
|
|
10
|
+
* Creates a new render target generator.
|
|
11
|
+
* @param optimize - If true, the render target generator will try to reuse render targets as much as possible.
|
|
12
|
+
*/
|
|
13
|
+
constructor(optimize?: boolean);
|
|
14
|
+
/**
|
|
15
|
+
* Returns the number of render targets created by the process
|
|
16
|
+
*/
|
|
17
|
+
get numTargetsCreated(): number;
|
|
18
|
+
/**
|
|
19
|
+
* Sets the output textures for the ShaderBlocks of the smart filter.
|
|
20
|
+
* @param smart - The smart filter to generate the render targets for.
|
|
21
|
+
* @param initializationData - The initialization data to use.
|
|
22
|
+
*/
|
|
23
|
+
setOutputTextures(smart: SmartFilter, initializationData: InitializationData): void;
|
|
24
|
+
private _findAvailableTexture;
|
|
25
|
+
private _getTexture;
|
|
26
|
+
private _releaseTexture;
|
|
27
|
+
/**
|
|
28
|
+
* Creates an offscreen texture to hold on the result of the block rendering.
|
|
29
|
+
* @param runtime - The current runtime we create the texture for
|
|
30
|
+
* @param ratio - The ratio of the texture to create compared to the final output
|
|
31
|
+
* @returns The render target texture
|
|
32
|
+
*/
|
|
33
|
+
private _createTexture;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=renderTargetGenerator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderTargetGenerator.d.ts","sourceRoot":"","sources":["../../src/runtime/renderTargetGenerator.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAqBtE;;GAEG;AACH,qBAAa,qBAAqB;IAC9B,OAAO,CAAC,SAAS,CAAU;IAC3B,OAAO,CAAC,iBAAiB,CAAsC;IAC/D,OAAO,CAAC,kBAAkB,CAAC;IAE3B;;;OAGG;gBACS,QAAQ,UAAO;IAM3B;;OAEG;IACH,IAAW,iBAAiB,WAE3B;IAED;;;;OAIG;IACI,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,kBAAkB;IAiDnF,OAAO,CAAC,qBAAqB;IAe7B,OAAO,CAAC,WAAW;IA4BnB,OAAO,CAAC,eAAe;IAoBvB;;;;;OAKG;IACH,OAAO,CAAC,cAAc;CA6BzB"}
|