oidn-webgpu 0.0.0-stage → 0.6.0

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.
Files changed (95) hide show
  1. package/CHANGELOG.md +182 -0
  2. package/LICENSE +21 -0
  3. package/README.md +89 -2
  4. package/dist/oidn.js +6140 -0
  5. package/dist/oidn.umd.cjs +1513 -0
  6. package/lib/UNet.d.ts +161 -0
  7. package/lib/UNet.js +536 -0
  8. package/lib/UNet.js.map +1 -0
  9. package/lib/WGPUComputePass.d.ts +62 -0
  10. package/lib/WGPUComputePass.js +278 -0
  11. package/lib/WGPUComputePass.js.map +1 -0
  12. package/lib/WGPUFullQuadPass.d.ts +50 -0
  13. package/lib/WGPUFullQuadPass.js +261 -0
  14. package/lib/WGPUFullQuadPass.js.map +1 -0
  15. package/lib/backend.d.ts +1 -0
  16. package/lib/backend.js +39 -0
  17. package/lib/backend.js.map +1 -0
  18. package/lib/finalRgbShader.d.ts +13 -0
  19. package/lib/finalRgbShader.js +160 -0
  20. package/lib/finalRgbShader.js.map +1 -0
  21. package/lib/gpuTypes.d.ts +158 -0
  22. package/lib/gpuTypes.js +27 -0
  23. package/lib/gpuTypes.js.map +1 -0
  24. package/lib/graphOptimizer.d.ts +54 -0
  25. package/lib/graphOptimizer.js +216 -0
  26. package/lib/graphOptimizer.js.map +1 -0
  27. package/lib/hdr.d.ts +31 -0
  28. package/lib/hdr.js +340 -0
  29. package/lib/hdr.js.map +1 -0
  30. package/lib/hdrTransfer.d.ts +22 -0
  31. package/lib/hdrTransfer.js +128 -0
  32. package/lib/hdrTransfer.js.map +1 -0
  33. package/lib/main.d.ts +57 -0
  34. package/lib/main.js +24 -0
  35. package/lib/main.js.map +1 -0
  36. package/lib/modelSpec.d.ts +80 -0
  37. package/lib/modelSpec.js +270 -0
  38. package/lib/modelSpec.js.map +1 -0
  39. package/lib/native/denoise.d.ts +25 -0
  40. package/lib/native/denoise.js +223 -0
  41. package/lib/native/denoise.js.map +1 -0
  42. package/lib/native/program.d.ts +53 -0
  43. package/lib/native/program.js +310 -0
  44. package/lib/native/program.js.map +1 -0
  45. package/lib/native/recordingDevice.d.ts +125 -0
  46. package/lib/native/recordingDevice.js +247 -0
  47. package/lib/native/recordingDevice.js.map +1 -0
  48. package/lib/nativeUNet.d.ts +25 -0
  49. package/lib/nativeUNet.js +184 -0
  50. package/lib/nativeUNet.js.map +1 -0
  51. package/lib/nativeUNetCore.d.ts +202 -0
  52. package/lib/nativeUNetCore.js +2945 -0
  53. package/lib/nativeUNetCore.js.map +1 -0
  54. package/lib/process.d.ts +37 -0
  55. package/lib/process.js +328 -0
  56. package/lib/process.js.map +1 -0
  57. package/lib/resourceTracker.d.ts +26 -0
  58. package/lib/resourceTracker.js +65 -0
  59. package/lib/resourceTracker.js.map +1 -0
  60. package/lib/sanitize.d.ts +15 -0
  61. package/lib/sanitize.js +28 -0
  62. package/lib/sanitize.js.map +1 -0
  63. package/lib/tileScheduler.d.ts +61 -0
  64. package/lib/tileScheduler.js +199 -0
  65. package/lib/tileScheduler.js.map +1 -0
  66. package/lib/tza.d.ts +15 -0
  67. package/lib/tza.js +114 -0
  68. package/lib/tza.js.map +1 -0
  69. package/lib/webnnUNet.d.ts +52 -0
  70. package/lib/webnnUNet.js +535 -0
  71. package/lib/webnnUNet.js.map +1 -0
  72. package/package.json +43 -4
  73. package/src/UNet.ts +861 -0
  74. package/src/WGPUComputePass.ts +382 -0
  75. package/src/WGPUFullQuadPass.ts +348 -0
  76. package/src/backend.ts +42 -0
  77. package/src/finalRgbShader.ts +186 -0
  78. package/src/gpuTypes.ts +179 -0
  79. package/src/graphOptimizer.ts +301 -0
  80. package/src/hdr.ts +398 -0
  81. package/src/hdrTransfer.ts +169 -0
  82. package/src/main.ts +126 -0
  83. package/src/modelSpec.ts +414 -0
  84. package/src/native/core-profile.json +40 -0
  85. package/src/native/denoise.ts +268 -0
  86. package/src/native/program.ts +326 -0
  87. package/src/native/recordingDevice.ts +341 -0
  88. package/src/nativeUNet.ts +269 -0
  89. package/src/nativeUNetCore.ts +3735 -0
  90. package/src/process.ts +368 -0
  91. package/src/resourceTracker.ts +94 -0
  92. package/src/sanitize.ts +29 -0
  93. package/src/tileScheduler.ts +330 -0
  94. package/src/tza.ts +136 -0
  95. package/src/webnnUNet.ts +812 -0
@@ -0,0 +1,261 @@
1
+ export const fullScreenQuadVertexShaderWGSL = /*wgsl */ `
2
+ @vertex
3
+ fn main(
4
+ @builtin(vertex_index) vertexIndex: u32
5
+ ) -> @builtin(position) vec4f {
6
+ const pos = array(
7
+ vec2(-1.0, -1.0), vec2(1.0, -1.0), vec2(-1.0, 1.0),
8
+ vec2(-1.0, 1.0), vec2(1.0, -1.0), vec2(1.0, 1.0),
9
+ );
10
+
11
+ return vec4<f32>(pos[vertexIndex], 0.0, 1.0);
12
+ }
13
+ `;
14
+ function isTextureParamsEqual(params, other) {
15
+ return params.format === other.format;
16
+ }
17
+ export class WGPUFullQuadPass {
18
+ _label;
19
+ _device;
20
+ _outputTextures = {};
21
+ _pipeline;
22
+ _bindGroups = [];
23
+ _needsUpdatePipeline = true;
24
+ /**
25
+ * When render to canvas
26
+ */
27
+ _renderToScreen;
28
+ _inputs = [];
29
+ _outputs = [];
30
+ _uniforms = [];
31
+ _uniformBuffers = {};
32
+ _width = 10;
33
+ _height = 10;
34
+ _fsCode = '';
35
+ _fsMain;
36
+ _fsDefine;
37
+ constructor(label, device, opts) {
38
+ this._label = label;
39
+ this._device = device;
40
+ this._fsMain = opts.fsMain;
41
+ this._fsDefine = opts.fsDefine;
42
+ this._inputs = opts.inputs;
43
+ this._outputs = opts.outputs;
44
+ this._uniforms = opts.uniforms;
45
+ opts.uniforms.forEach((uniform) => {
46
+ this._uniformBuffers[uniform.label] = device.createBuffer({
47
+ label: this._label,
48
+ size: uniform.data.byteLength,
49
+ usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST
50
+ });
51
+ this._device.queue.writeBuffer(this._uniformBuffers[uniform.label], 0, uniform.data);
52
+ });
53
+ }
54
+ setSize(width, height) {
55
+ width = Math.ceil(width);
56
+ height = Math.ceil(height);
57
+ const sizeChanged = width !== this._width || height !== this._height;
58
+ this._width = width;
59
+ this._height = height;
60
+ if (sizeChanged) {
61
+ this._resizeOutputTextures();
62
+ this._needsUpdatePipeline = true;
63
+ }
64
+ }
65
+ setOutputParams(outputParams) {
66
+ this._renderToScreen = undefined;
67
+ this._updateOutputTextures(outputParams);
68
+ this._needsUpdatePipeline = true;
69
+ }
70
+ setRenderToScreen(screenTexture, presentationFormat) {
71
+ this._renderToScreen = {
72
+ screenTexture,
73
+ presentationFormat
74
+ };
75
+ }
76
+ setUniform(label, data) {
77
+ const buffer = this._uniformBuffers[label];
78
+ this._device.queue.writeBuffer(buffer, 0, data);
79
+ }
80
+ getOutputTexture(name) {
81
+ return this._outputTextures[name].texture;
82
+ }
83
+ dispose() {
84
+ Object.keys(this._uniformBuffers).forEach((key) => {
85
+ this._uniformBuffers[key].destroy();
86
+ });
87
+ Object.keys(this._outputTextures).forEach((key) => {
88
+ this._outputTextures[key].texture.destroy();
89
+ });
90
+ }
91
+ _createTexture(params) {
92
+ return this._device.createTexture({
93
+ label: this._label,
94
+ size: {
95
+ width: this._width,
96
+ height: this._height,
97
+ depthOrArrayLayers: 1
98
+ },
99
+ format: params.format,
100
+ usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING
101
+ });
102
+ }
103
+ _resizeOutputTextures() {
104
+ const outputTextures = this._outputTextures;
105
+ for (const key in outputTextures) {
106
+ const { texture, params } = outputTextures[key];
107
+ texture.destroy();
108
+ outputTextures[key].texture = this._createTexture(params);
109
+ }
110
+ }
111
+ _updateOutputTextures(outputParams) {
112
+ const outputTextures = this._outputTextures;
113
+ for (const key in outputParams) {
114
+ const params = outputParams[key];
115
+ if (!isTextureParamsEqual(params, outputTextures[key]?.params || {})) {
116
+ outputTextures[key]?.texture.destroy();
117
+ const texture = this._createTexture(params);
118
+ outputTextures[key] = {
119
+ texture,
120
+ params
121
+ };
122
+ }
123
+ }
124
+ }
125
+ _updatePipeline() {
126
+ if (!this._needsUpdatePipeline) {
127
+ return;
128
+ }
129
+ this._needsUpdatePipeline = false;
130
+ const device = this._device;
131
+ const fsCode = this._getFullFs();
132
+ if (fsCode === this._fsCode) {
133
+ return;
134
+ }
135
+ const { screenTexture, presentationFormat } = this._renderToScreen || {};
136
+ this._fsCode = fsCode;
137
+ this._pipeline = device.createRenderPipeline({
138
+ label: this._label,
139
+ layout: 'auto',
140
+ vertex: {
141
+ module: device.createShaderModule({
142
+ label: this._label,
143
+ code: fullScreenQuadVertexShaderWGSL
144
+ }),
145
+ entryPoint: 'main'
146
+ },
147
+ fragment: {
148
+ module: device.createShaderModule({
149
+ label: this._label,
150
+ code: fsCode
151
+ }),
152
+ entryPoint: 'main',
153
+ targets: screenTexture
154
+ ? [
155
+ {
156
+ format: presentationFormat
157
+ }
158
+ ]
159
+ : this._outputs.map((key) => ({
160
+ format: this._outputTextures[key].params.format
161
+ }))
162
+ },
163
+ primitive: {
164
+ topology: 'triangle-list'
165
+ }
166
+ });
167
+ this._updateBindGroups();
168
+ }
169
+ _getFullFs() {
170
+ const inputs = this._inputs;
171
+ const hasInputs = inputs.length > 0;
172
+ const fs = `
173
+ ${inputs
174
+ .sort()
175
+ .map((textureName, idx) => `@group(0) @binding(${idx}) var ${textureName}: texture_2d<f32>;`)
176
+ .join('\n')}
177
+ ${this._uniforms
178
+ .map((uniform, idx) => `@group(${hasInputs ? 1 : 0}) @binding(${idx}) var<uniform> ${uniform.label}: ${uniform.type};`)
179
+ .join('\n')}
180
+
181
+ struct FSOutput {
182
+ ${this._outputs
183
+ .map((name, idx) => `@location(${idx}) ${name}: vec4f,`)
184
+ .join('\n')}
185
+ }
186
+ ${this._fsDefine ?? ''}
187
+ @fragment
188
+ fn main(
189
+ @builtin(position) coord: vec4f
190
+ ) -> FSOutput {
191
+ var uv = vec2i(floor(coord.xy));
192
+ var output: FSOutput;
193
+ ${this._fsMain}
194
+ return output;
195
+ }
196
+ `;
197
+ return fs;
198
+ }
199
+ _updateBindGroups() {
200
+ const bindGroups = [];
201
+ const device = this._device;
202
+ //TODO
203
+ const uniformBindGroupIndex = this._inputs.length > 0 ? 1 : 0;
204
+ if (this._uniforms.length > 0) {
205
+ bindGroups[uniformBindGroupIndex] = device.createBindGroup({
206
+ label: this._label,
207
+ layout: this._pipeline.getBindGroupLayout(uniformBindGroupIndex),
208
+ entries: this._uniforms.map((uniform, idx) => ({
209
+ binding: idx,
210
+ resource: {
211
+ buffer: this._uniformBuffers[uniform.label]
212
+ }
213
+ }))
214
+ });
215
+ }
216
+ this._bindGroups = bindGroups;
217
+ }
218
+ createPass(commandEncoder, inputTextures) {
219
+ this._updatePipeline();
220
+ // TODO createBindGrou every time?
221
+ if (this._inputs.length > 0) {
222
+ this._bindGroups[0] = this._device.createBindGroup({
223
+ label: this._label,
224
+ layout: this._pipeline.getBindGroupLayout(0),
225
+ entries: this._inputs.map((textureName, idx) => ({
226
+ binding: idx,
227
+ // TODO
228
+ resource: inputTextures[textureName].createView()
229
+ }))
230
+ });
231
+ }
232
+ // Begin the render pass
233
+ const renderPass = commandEncoder.beginRenderPass({
234
+ colorAttachments: this._renderToScreen
235
+ ? [
236
+ {
237
+ view: this._renderToScreen.screenTexture.createView(),
238
+ clearValue: { r: 0, g: 0, b: 0, a: 0 },
239
+ storeOp: 'store',
240
+ loadOp: 'clear'
241
+ }
242
+ ]
243
+ : this._outputs.map((textureName) => ({
244
+ view: this._outputTextures[textureName].texture.createView(),
245
+ clearValue: { r: 0, g: 0, b: 0, a: 0 },
246
+ loadOp: 'clear',
247
+ storeOp: 'store'
248
+ }))
249
+ });
250
+ // Draw a full quad
251
+ renderPass.setPipeline(this._pipeline);
252
+ // Bind groups
253
+ this._bindGroups.forEach((bindGroup, idx) => {
254
+ renderPass.setBindGroup(idx, bindGroup);
255
+ });
256
+ renderPass.draw(6, 1, 0, 0);
257
+ // End the render pass
258
+ renderPass.end();
259
+ }
260
+ }
261
+ //# sourceMappingURL=WGPUFullQuadPass.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WGPUFullQuadPass.js","sourceRoot":"","sources":["../src/WGPUFullQuadPass.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function initWebGPUBackend(): Promise<GPUDevice>;
package/lib/backend.js ADDED
@@ -0,0 +1,39 @@
1
+ export async function initWebGPUBackend() {
2
+ if (!navigator.gpu)
3
+ throw new Error('WebGPU is not available');
4
+ const gpuDescriptor = {
5
+ powerPreference: 'high-performance'
6
+ };
7
+ const adapter = await navigator.gpu.requestAdapter(gpuDescriptor);
8
+ if (!adapter)
9
+ throw new Error('No WebGPU adapter is available');
10
+ const deviceDescriptor = {};
11
+ const requiredFeatures = [];
12
+ if (adapter.features.has('timestamp-query')) {
13
+ requiredFeatures.push('timestamp-query');
14
+ }
15
+ if (adapter.features.has('bgra8unorm-storage')) {
16
+ requiredFeatures.push('bgra8unorm-storage');
17
+ }
18
+ if (adapter.features.has('shader-f16')) {
19
+ requiredFeatures.push('shader-f16');
20
+ }
21
+ // Experimental: only exposed by Chrome with unsafe WebGPU features enabled.
22
+ for (const feature of ['subgroups', 'chromium-experimental-subgroup-matrix']) {
23
+ if (adapter.features.has(feature)) {
24
+ requiredFeatures.push(feature);
25
+ }
26
+ }
27
+ deviceDescriptor.requiredFeatures = requiredFeatures;
28
+ const adapterLimits = adapter.limits;
29
+ deviceDescriptor.requiredLimits = {
30
+ maxComputeWorkgroupStorageSize: adapterLimits.maxComputeWorkgroupStorageSize,
31
+ maxComputeWorkgroupsPerDimension: adapterLimits.maxComputeWorkgroupsPerDimension,
32
+ maxStorageBufferBindingSize: adapterLimits.maxStorageBufferBindingSize,
33
+ maxBufferSize: adapterLimits.maxBufferSize,
34
+ maxComputeWorkgroupSizeX: adapterLimits.maxComputeWorkgroupSizeX,
35
+ maxComputeInvocationsPerWorkgroup: adapterLimits.maxComputeInvocationsPerWorkgroup
36
+ };
37
+ return adapter.requestDevice(deviceDescriptor);
38
+ }
39
+ //# sourceMappingURL=backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.js","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,IAAI,CAAC,SAAS,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC/D,MAAM,aAAa,GAA6B;QAC9C,eAAe,EAAE,kBAAkB;KACpC,CAAC;IAEF,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;IAClE,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAChE,MAAM,gBAAgB,GAAwB,EAAE,CAAC;IAEjD,MAAM,gBAAgB,GAAqB,EAAE,CAAC;IAC9C,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC5C,gBAAgB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC3C,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,CAAC;QAC/C,gBAAgB,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAC9C,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;QACvC,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACtC,CAAC;IACD,4EAA4E;IAC5E,KAAK,MAAM,OAAO,IAAI,CAAC,WAAW,EAAE,uCAAuC,CAAC,EAAE,CAAC;QAC7E,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAClC,gBAAgB,CAAC,IAAI,CAAC,OAAyB,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IACD,gBAAgB,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;IAErD,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IACrC,gBAAgB,CAAC,cAAc,GAAG;QAChC,8BAA8B,EAC5B,aAAa,CAAC,8BAA8B;QAC9C,gCAAgC,EAC9B,aAAa,CAAC,gCAAgC;QAChD,2BAA2B,EAAE,aAAa,CAAC,2BAA2B;QACtE,aAAa,EAAE,aAAa,CAAC,aAAa;QAC1C,wBAAwB,EAAE,aAAa,CAAC,wBAAwB;QAChE,iCAAiC,EAC/B,aAAa,CAAC,iCAAiC;KAClD,CAAC;IACF,OAAO,OAAO,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC;AACjD,CAAC"}
@@ -0,0 +1,13 @@
1
+ export type FinalRgbPrecision = 'fp16' | 'fp32';
2
+ export type FinalRgbActivation = 'relu' | 'identity';
3
+ /** Shared storage required by the 8x8 final-RGB workgroup. */
4
+ export declare function sharedMemoryBytes(precision: FinalRgbPrecision, inputBlocks: number, cacheWeights?: boolean): number;
5
+ /**
6
+ * Builds the final three-channel same-padded convolution shader.
7
+ *
8
+ * The bind-group layout and Params block intentionally match createConvShader:
9
+ * input, weights, bias, output, then uniform params. Weights retain the
10
+ * output-major packed ABI, with four vec4 values per (kernel position, input
11
+ * block), one for each input lane.
12
+ */
13
+ export declare function createFinalRgbShader(precision: FinalRgbPrecision, activation: FinalRgbActivation, inputBlocks: number, cacheWeights?: boolean): string;
@@ -0,0 +1,160 @@
1
+ const WORKGROUP_SIZE = 8;
2
+ const PATCH_SIZE = WORKGROUP_SIZE + 2;
3
+ const KERNEL_ELEMENTS = 3 * 3;
4
+ /** Shared storage required by the 8x8 final-RGB workgroup. */
5
+ export function sharedMemoryBytes(precision, inputBlocks, cacheWeights = false) {
6
+ const bytesPerScalar = precision === 'fp16' ? 2 : 4;
7
+ const inputVec4Count = PATCH_SIZE * PATCH_SIZE * inputBlocks;
8
+ const weightVec4Count = cacheWeights
9
+ ? KERNEL_ELEMENTS * inputBlocks * 4
10
+ : 0;
11
+ const vec4Count = inputVec4Count + weightVec4Count;
12
+ return vec4Count * 4 * bytesPerScalar;
13
+ }
14
+ function storageVecType(precision) {
15
+ return precision === 'fp16' ? 'vec4<f16>' : 'vec4<f32>';
16
+ }
17
+ function shaderPreamble(precision) {
18
+ return precision === 'fp16' ? 'enable f16;\n' : '';
19
+ }
20
+ function accumulationCode(precision, inputExpression, weightExpression) {
21
+ const weight = (lane) => `${weightExpression}[weightBase + ${lane}u]`;
22
+ if (precision === 'fp16') {
23
+ return /* wgsl */ `
24
+ let inputValue = vec4<f16>(${inputExpression});
25
+ var partial = vec4<f16>(0.0h);
26
+ partial = fma(${weight(0)}, vec4<f16>(inputValue.x), partial);
27
+ partial = fma(${weight(1)}, vec4<f16>(inputValue.y), partial);
28
+ partial = fma(${weight(2)}, vec4<f16>(inputValue.z), partial);
29
+ partial = fma(${weight(3)}, vec4<f16>(inputValue.w), partial);
30
+ acc += vec4<f32>(partial);
31
+ `;
32
+ }
33
+ return /* wgsl */ `
34
+ let inputValue = vec4<f32>(${inputExpression});
35
+ acc = fma(vec4<f32>(${weight(0)}), vec4<f32>(inputValue.x), acc);
36
+ acc = fma(vec4<f32>(${weight(1)}), vec4<f32>(inputValue.y), acc);
37
+ acc = fma(vec4<f32>(${weight(2)}), vec4<f32>(inputValue.z), acc);
38
+ acc = fma(vec4<f32>(${weight(3)}), vec4<f32>(inputValue.w), acc);
39
+ `;
40
+ }
41
+ /**
42
+ * Builds the final three-channel same-padded convolution shader.
43
+ *
44
+ * The bind-group layout and Params block intentionally match createConvShader:
45
+ * input, weights, bias, output, then uniform params. Weights retain the
46
+ * output-major packed ABI, with four vec4 values per (kernel position, input
47
+ * block), one for each input lane.
48
+ */
49
+ export function createFinalRgbShader(precision, activation, inputBlocks, cacheWeights = false) {
50
+ if (!Number.isInteger(inputBlocks) || inputBlocks < 1) {
51
+ throw new Error(`Final RGB shader requires positive input blocks, got ${inputBlocks}`);
52
+ }
53
+ const inputType = storageVecType(precision);
54
+ const outputType = 'vec4<f32>';
55
+ const inputTileValues = PATCH_SIZE * PATCH_SIZE * inputBlocks;
56
+ const weightTileValues = KERNEL_ELEMENTS * inputBlocks * 4;
57
+ const stored = activation === 'relu'
58
+ ? 'max(acc, vec4<f32>(0.0))'
59
+ : 'acc';
60
+ const accumulation = accumulationCode(precision, 'inputTile[patchBase + inputBlock]', cacheWeights ? 'weightTile' : 'weights');
61
+ return /* wgsl */ `${shaderPreamble(precision)}
62
+ struct Params {
63
+ inputWidth: u32,
64
+ inputHeight: u32,
65
+ outputWidth: u32,
66
+ outputHeight: u32,
67
+ inputBlocks: u32,
68
+ outputBlocks: u32,
69
+ }
70
+
71
+ @group(0) @binding(0) var<storage, read> inputData: array<${inputType}>;
72
+ @group(0) @binding(1) var<storage, read> weights: array<${inputType}>;
73
+ @group(0) @binding(2) var<storage, read> bias: array<vec4<f32>>;
74
+ @group(0) @binding(3) var<storage, read_write> outputData: array<${outputType}>;
75
+ @group(0) @binding(4) var<uniform> params: Params;
76
+
77
+ var<workgroup> inputTile: array<${inputType}, ${inputTileValues}>;
78
+ ${cacheWeights
79
+ ? `var<workgroup> weightTile: array<${inputType}, ${weightTileValues}>;`
80
+ : ''}
81
+
82
+ @compute @workgroup_size(${WORKGROUP_SIZE}, ${WORKGROUP_SIZE}, 1)
83
+ fn main(
84
+ @builtin(local_invocation_id) localId: vec3<u32>,
85
+ @builtin(global_invocation_id) gid: vec3<u32>,
86
+ @builtin(workgroup_id) workgroupId: vec3<u32>
87
+ ) {
88
+ let localLinear = localId.y * ${WORKGROUP_SIZE}u + localId.x;
89
+ for (
90
+ var loadIndex = localLinear;
91
+ loadIndex < ${inputTileValues}u;
92
+ loadIndex += ${WORKGROUP_SIZE * WORKGROUP_SIZE}u
93
+ ) {
94
+ let tilePixel = loadIndex / ${inputBlocks}u;
95
+ let inputBlock = loadIndex % ${inputBlocks}u;
96
+ let tileX = tilePixel % ${PATCH_SIZE}u;
97
+ let tileY = tilePixel / ${PATCH_SIZE}u;
98
+ let inputX = i32(workgroupId.x * ${WORKGROUP_SIZE}u + tileX) - 1;
99
+ let inputY = i32(workgroupId.y * ${WORKGROUP_SIZE}u + tileY) - 1;
100
+ var value = ${inputType}(0.0);
101
+ if (
102
+ inputX >= 0 && inputX < i32(params.inputWidth) &&
103
+ inputY >= 0 && inputY < i32(params.inputHeight)
104
+ ) {
105
+ let inputIndex =
106
+ (u32(inputY) * params.inputWidth + u32(inputX)) *
107
+ ${inputBlocks}u + inputBlock;
108
+ value = inputData[inputIndex];
109
+ }
110
+ inputTile[loadIndex] = value;
111
+ }
112
+
113
+ ${cacheWeights ? ` for (
114
+ var loadIndex = localLinear;
115
+ loadIndex < ${weightTileValues}u;
116
+ loadIndex += ${WORKGROUP_SIZE * WORKGROUP_SIZE}u
117
+ ) {
118
+ weightTile[loadIndex] = weights[loadIndex];
119
+ }
120
+
121
+ ` : ''} // Out-of-range invocations must reach this barrier before returning.
122
+ workgroupBarrier();
123
+
124
+ let outputInBounds =
125
+ gid.x < params.outputWidth &&
126
+ gid.y < params.outputHeight &&
127
+ gid.z < params.outputBlocks;
128
+ if (!outputInBounds) {
129
+ return;
130
+ }
131
+
132
+ var acc = bias[gid.z];
133
+ for (var ky = 0u; ky < 3u; ky++) {
134
+ let inputY = i32(gid.y) + i32(ky) - 1;
135
+ if (inputY < 0 || inputY >= i32(params.inputHeight)) {
136
+ continue;
137
+ }
138
+ for (var kx = 0u; kx < 3u; kx++) {
139
+ let inputX = i32(gid.x) + i32(kx) - 1;
140
+ if (inputX < 0 || inputX >= i32(params.inputWidth)) {
141
+ continue;
142
+ }
143
+ let patchBase =
144
+ ((localId.y + ky) * ${PATCH_SIZE}u + localId.x + kx) *
145
+ ${inputBlocks}u;
146
+ for (var inputBlock = 0u; inputBlock < ${inputBlocks}u; inputBlock++) {
147
+ let weightBase =
148
+ ((ky * 3u + kx) * ${inputBlocks}u + inputBlock) * 4u;
149
+ ${accumulation}
150
+ }
151
+ }
152
+ }
153
+
154
+ let outputIndex =
155
+ (gid.y * params.outputWidth + gid.x) * ${1}u + gid.z;
156
+ outputData[outputIndex] = ${stored};
157
+ }
158
+ `;
159
+ }
160
+ //# sourceMappingURL=finalRgbShader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finalRgbShader.js","sourceRoot":"","sources":["../src/finalRgbShader.ts"],"names":[],"mappings":"AAGA,MAAM,cAAc,GAAG,CAAC,CAAC;AACzB,MAAM,UAAU,GAAG,cAAc,GAAG,CAAC,CAAC;AACtC,MAAM,eAAe,GAAG,CAAC,GAAG,CAAC,CAAC;AAE9B,8DAA8D;AAC9D,MAAM,UAAU,iBAAiB,CAC/B,SAA4B,EAC5B,WAAmB,EACnB,YAAY,GAAG,KAAK;IAEpB,MAAM,cAAc,GAAG,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,MAAM,cAAc,GAAG,UAAU,GAAG,UAAU,GAAG,WAAW,CAAC;IAC7D,MAAM,eAAe,GAAG,YAAY;QAClC,CAAC,CAAC,eAAe,GAAG,WAAW,GAAG,CAAC;QACnC,CAAC,CAAC,CAAC,CAAC;IACN,MAAM,SAAS,GAAG,cAAc,GAAG,eAAe,CAAC;IACnD,OAAO,SAAS,GAAG,CAAC,GAAG,cAAc,CAAC;AACxC,CAAC;AAED,SAAS,cAAc,CAAC,SAA4B;IAClD,OAAO,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC;AAC1D,CAAC;AAED,SAAS,cAAc,CAAC,SAA4B;IAClD,OAAO,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;AACrD,CAAC;AAED,SAAS,gBAAgB,CACvB,SAA4B,EAC5B,eAAuB,EACvB,gBAAwB;IAExB,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE,CAC9B,GAAG,gBAAgB,iBAAiB,IAAI,IAAI,CAAC;IAC/C,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;QACzB,OAAO,UAAU,CAAC;qCACe,eAAe;;wBAE5B,MAAM,CAAC,CAAC,CAAC;wBACT,MAAM,CAAC,CAAC,CAAC;wBACT,MAAM,CAAC,CAAC,CAAC;wBACT,MAAM,CAAC,CAAC,CAAC;;CAEhC,CAAC;IACA,CAAC;IACD,OAAO,UAAU,CAAC;qCACiB,eAAe;8BACtB,MAAM,CAAC,CAAC,CAAC;8BACT,MAAM,CAAC,CAAC,CAAC;8BACT,MAAM,CAAC,CAAC,CAAC;8BACT,MAAM,CAAC,CAAC,CAAC;CACtC,CAAC;AACF,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAClC,SAA4B,EAC5B,UAA8B,EAC9B,WAAmB,EACnB,YAAY,GAAG,KAAK;IAEpB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,KAAK,CAAC,wDAAwD,WAAW,EAAE,CAAC,CAAC;IACzF,CAAC;IACD,MAAM,SAAS,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,WAAW,CAAC;IAC/B,MAAM,eAAe,GAAG,UAAU,GAAG,UAAU,GAAG,WAAW,CAAC;IAC9D,MAAM,gBAAgB,GAAG,eAAe,GAAG,WAAW,GAAG,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,UAAU,KAAK,MAAM;QAClC,CAAC,CAAC,0BAA0B;QAC5B,CAAC,CAAC,KAAK,CAAC;IACV,MAAM,YAAY,GAAG,gBAAgB,CACnC,SAAS,EACT,mCAAmC,EACnC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CACxC,CAAC;IAEF,OAAO,UAAU,CAAC,GAAG,cAAc,CAAC,SAAS,CAAC;;;;;;;;;;4DAUY,SAAS;0DACX,SAAS;;mEAEA,UAAU;;;kCAG3C,SAAS,KAAK,eAAe;EAC7D,YAAY;QACV,CAAC,CAAC,oCAAoC,SAAS,KAAK,gBAAgB,IAAI;QACxE,CAAC,CAAC,EAAE;;2BAEmB,cAAc,KAAK,cAAc;;;;;;kCAM1B,cAAc;;;kBAG9B,eAAe;mBACd,cAAc,GAAG,cAAc;;kCAEhB,WAAW;mCACV,WAAW;8BAChB,UAAU;8BACV,UAAU;uCACD,cAAc;uCACd,cAAc;kBACnC,SAAS;;;;;;;UAOjB,WAAW;;;;;;EAMnB,YAAY,CAAC,CAAC,CAAC;;kBAEC,gBAAgB;mBACf,cAAc,GAAG,cAAc;;;;;CAKjD,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;8BAuBwB,UAAU;UAC9B,WAAW;+CAC0B,WAAW;;8BAE5B,WAAW;UAC/B,YAAY;;;;;;6CAMuB,CAAC;8BAChB,MAAM;;CAEnC,CAAC;AACF,CAAC"}
@@ -0,0 +1,158 @@
1
+ /**
2
+ * The WebGPU subset used by the native WGSL runtime, as structural types and
3
+ * spec-defined flag values. A browser GPUDevice implements these operations,
4
+ * but its branded TypeScript types need the conversion in nativeUNet.ts;
5
+ * they also let an embedder supply its own device (for example one that
6
+ * records the work for replay in a native wgpu host) without lib.dom or
7
+ * WebGPU globals.
8
+ */
9
+ /** GPUBufferUsage flag values from the WebGPU specification. */
10
+ export declare const BufferUsage: {
11
+ readonly MAP_READ: 1;
12
+ readonly MAP_WRITE: 2;
13
+ readonly COPY_SRC: 4;
14
+ readonly COPY_DST: 8;
15
+ readonly INDEX: 16;
16
+ readonly VERTEX: 32;
17
+ readonly UNIFORM: 64;
18
+ readonly STORAGE: 128;
19
+ readonly INDIRECT: 256;
20
+ readonly QUERY_RESOLVE: 512;
21
+ };
22
+ /** GPUMapMode flag values from the WebGPU specification. */
23
+ export declare const MapMode: {
24
+ readonly READ: 1;
25
+ readonly WRITE: 2;
26
+ };
27
+ export interface OIDNGPUBuffer {
28
+ readonly size: number;
29
+ readonly mapState: string;
30
+ getMappedRange(offset?: number, size?: number): ArrayBuffer;
31
+ unmap(): void;
32
+ destroy(): void;
33
+ }
34
+ export interface OIDNGPUMappableBuffer extends OIDNGPUBuffer {
35
+ mapAsync(mode: number, offset?: number, size?: number): Promise<void>;
36
+ }
37
+ export interface OIDNGPUQuerySet {
38
+ destroy(): void;
39
+ }
40
+ export interface OIDNGPUShaderModule {
41
+ readonly label: string;
42
+ }
43
+ export interface OIDNGPUBindGroupLayout {
44
+ readonly label: string;
45
+ }
46
+ export interface OIDNGPUBindGroup {
47
+ readonly label: string;
48
+ }
49
+ export interface OIDNGPUComputePipeline {
50
+ getBindGroupLayout(index: number): OIDNGPUBindGroupLayout;
51
+ }
52
+ export interface OIDNGPUCommandBuffer {
53
+ readonly label: string;
54
+ }
55
+ export interface OIDNGPUBindGroupEntry {
56
+ binding: number;
57
+ resource: {
58
+ buffer: OIDNGPUBuffer;
59
+ offset?: number;
60
+ size?: number;
61
+ };
62
+ }
63
+ export interface OIDNGPUComputePassTimestampWrites {
64
+ querySet: OIDNGPUQuerySet;
65
+ beginningOfPassWriteIndex?: number;
66
+ endOfPassWriteIndex?: number;
67
+ }
68
+ export interface OIDNGPUComputePassEncoder {
69
+ setPipeline(pipeline: OIDNGPUComputePipeline): void;
70
+ setBindGroup(index: number, bindGroup: OIDNGPUBindGroup): void;
71
+ dispatchWorkgroups(x: number, y?: number, z?: number): void;
72
+ end(): void;
73
+ }
74
+ export interface OIDNGPUCommandEncoder {
75
+ beginComputePass(descriptor?: {
76
+ label?: string;
77
+ timestampWrites?: OIDNGPUComputePassTimestampWrites;
78
+ }): OIDNGPUComputePassEncoder;
79
+ copyBufferToBuffer(source: OIDNGPUBuffer, sourceOffset: number, destination: OIDNGPUBuffer, destinationOffset: number, size: number): void;
80
+ resolveQuerySet(querySet: OIDNGPUQuerySet, firstQuery: number, queryCount: number, destination: OIDNGPUBuffer, destinationOffset: number): void;
81
+ finish(): OIDNGPUCommandBuffer;
82
+ }
83
+ export interface OIDNGPUQueue {
84
+ submit(commandBuffers: OIDNGPUCommandBuffer[]): void;
85
+ writeBuffer(buffer: OIDNGPUBuffer, bufferOffset: number, data: Uint8Array): void;
86
+ }
87
+ export interface OIDNGPUAsyncQueue extends OIDNGPUQueue {
88
+ onSubmittedWorkDone(): Promise<void>;
89
+ }
90
+ export interface OIDNGPULimits {
91
+ readonly maxComputeWorkgroupStorageSize: number;
92
+ readonly maxComputeInvocationsPerWorkgroup: number;
93
+ readonly maxComputeWorkgroupSizeX: number;
94
+ readonly maxComputeWorkgroupSizeY: number;
95
+ readonly maxComputeWorkgroupsPerDimension: number;
96
+ }
97
+ export interface OIDNGPUFeatures {
98
+ has(name: string): boolean;
99
+ }
100
+ /** Subset of GPUAdapterInfo used to select subgroup-matrix configurations. */
101
+ export interface OIDNGPUAdapterInfo {
102
+ readonly subgroupMinSize?: number;
103
+ readonly subgroupMaxSize?: number;
104
+ readonly subgroupMatrixConfigs?: readonly {
105
+ componentType: string;
106
+ resultComponentType: string;
107
+ M: number;
108
+ N: number;
109
+ K: number;
110
+ }[];
111
+ }
112
+ export interface OIDNGPUDevice {
113
+ readonly features: OIDNGPUFeatures;
114
+ readonly limits: OIDNGPULimits;
115
+ readonly queue: OIDNGPUQueue;
116
+ createBuffer(descriptor: {
117
+ label?: string;
118
+ size: number;
119
+ usage: number;
120
+ mappedAtCreation?: boolean;
121
+ }): OIDNGPUBuffer;
122
+ createShaderModule(descriptor: {
123
+ label?: string;
124
+ code: string;
125
+ }): OIDNGPUShaderModule;
126
+ createComputePipeline(descriptor: {
127
+ label?: string;
128
+ layout: 'auto';
129
+ compute: {
130
+ module: OIDNGPUShaderModule;
131
+ entryPoint: string;
132
+ };
133
+ }): OIDNGPUComputePipeline;
134
+ createBindGroup(descriptor: {
135
+ label?: string;
136
+ layout: OIDNGPUBindGroupLayout;
137
+ entries: OIDNGPUBindGroupEntry[];
138
+ }): OIDNGPUBindGroup;
139
+ createCommandEncoder(descriptor?: {
140
+ label?: string;
141
+ }): OIDNGPUCommandEncoder;
142
+ createQuerySet(descriptor: {
143
+ label?: string;
144
+ type: 'timestamp';
145
+ count: number;
146
+ }): OIDNGPUQuerySet;
147
+ }
148
+ export interface OIDNGPUAsyncDevice extends OIDNGPUDevice {
149
+ readonly queue: OIDNGPUAsyncQueue;
150
+ createComputePipelineAsync(descriptor: {
151
+ label?: string;
152
+ layout: 'auto';
153
+ compute: {
154
+ module: OIDNGPUShaderModule;
155
+ entryPoint: string;
156
+ };
157
+ }): Promise<OIDNGPUComputePipeline>;
158
+ }