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,65 @@
1
+ /**
2
+ * Counts explicitly owned browser resources. Keeping the ownership registry in
3
+ * production makes cache eviction and failure cleanup testable without relying
4
+ * on JS heap measurements, which do not include WebGPU allocations.
5
+ */
6
+ export class OIDNResourceTracker {
7
+ _stats = new Map();
8
+ track(kind, resource) {
9
+ let stats = this._stats.get(kind);
10
+ if (!stats) {
11
+ stats = {
12
+ created: 0,
13
+ destroyed: 0,
14
+ live: 0,
15
+ peakLive: 0,
16
+ resources: new Set()
17
+ };
18
+ this._stats.set(kind, stats);
19
+ }
20
+ if (stats.resources.has(resource))
21
+ return resource;
22
+ stats.resources.add(resource);
23
+ stats.created++;
24
+ stats.live++;
25
+ stats.peakLive = Math.max(stats.peakLive, stats.live);
26
+ return resource;
27
+ }
28
+ release(kind, resource, destroy) {
29
+ if (!resource)
30
+ return false;
31
+ const stats = this._stats.get(kind);
32
+ if (!stats?.resources.delete(resource))
33
+ return false;
34
+ try {
35
+ destroy();
36
+ }
37
+ finally {
38
+ stats.destroyed++;
39
+ stats.live--;
40
+ }
41
+ return true;
42
+ }
43
+ snapshot(pending = 0) {
44
+ let live = 0;
45
+ let created = 0;
46
+ let destroyed = 0;
47
+ let peakLive = 0;
48
+ const byKind = {};
49
+ for (const [kind, stats] of this._stats) {
50
+ const entry = {
51
+ created: stats.created,
52
+ destroyed: stats.destroyed,
53
+ live: stats.live,
54
+ peakLive: stats.peakLive
55
+ };
56
+ byKind[kind] = entry;
57
+ live += entry.live;
58
+ created += entry.created;
59
+ destroyed += entry.destroyed;
60
+ peakLive += entry.peakLive;
61
+ }
62
+ return { live, created, destroyed, peakLive, pending, byKind };
63
+ }
64
+ }
65
+ //# sourceMappingURL=resourceTracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resourceTracker.js","sourceRoot":"","sources":["../src/resourceTracker.ts"],"names":[],"mappings":"AA2BA;;;;GAIG;AACH,MAAM,OAAO,mBAAmB;IACtB,MAAM,GAAG,IAAI,GAAG,EAA0C,CAAC;IAEnE,KAAK,CAAmB,IAAsB,EAAE,QAAW;QACzD,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG;gBACN,OAAO,EAAE,CAAC;gBACV,SAAS,EAAE,CAAC;gBACZ,IAAI,EAAE,CAAC;gBACP,QAAQ,EAAE,CAAC;gBACX,SAAS,EAAE,IAAI,GAAG,EAAE;aACrB,CAAC;YACF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC/B,CAAC;QACD,IAAI,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,OAAO,QAAQ,CAAC;QACnD,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9B,KAAK,CAAC,OAAO,EAAE,CAAC;QAChB,KAAK,CAAC,IAAI,EAAE,CAAC;QACb,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACtD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,CACL,IAAsB,EACtB,QAA4B,EAC5B,OAAmB;QAEnB,IAAI,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC;YAAE,OAAO,KAAK,CAAC;QACrD,IAAI,CAAC;YACH,OAAO,EAAE,CAAC;QACZ,CAAC;gBAAS,CAAC;YACT,KAAK,CAAC,SAAS,EAAE,CAAC;YAClB,KAAK,CAAC,IAAI,EAAE,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,QAAQ,CAAC,OAAO,GAAG,CAAC;QAClB,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,MAAM,MAAM,GAAmC,EAAE,CAAC;QAClD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACxC,MAAM,KAAK,GAAG;gBACZ,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;aACzB,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;YACrB,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC;YACnB,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC;YACzB,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC;YAC7B,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC;QAC7B,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IACjE,CAAC;CACF"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * OIDN's input and output sanitizing: NaN becomes 0, then values are clamped
3
+ * to their valid range. HDR values are bounded by FLT_MAX, so +inf becomes
4
+ * FLT_MAX. Used before the network, by auto-exposure, and on the network
5
+ * output before the inverse transfer.
6
+ */
7
+ export declare const FLT_MAX = 3.4028234663852886e+38;
8
+ export declare function sanitize(value: number, lo: number, hi: number): number;
9
+ /**
10
+ * WGSL declarations of `FLT_MAX` and `fn sanitize(v: vec3f, lo: f32, hi: f32)`.
11
+ * WGSL compilers may assume floats are finite, so NaN and infinity are
12
+ * detected from the bits rather than with comparisons. FLT_MAX is spelled out
13
+ * so the native core does not depend on scriptc's number formatting.
14
+ */
15
+ export declare const sanitizeWGSL = "\nconst FLT_MAX = 3.4028234663852886e38;\nfn sanitize(v: vec3f, lo: f32, hi: f32) -> vec3f {\n let bits = bitcast<vec3u>(v);\n let magnitude = bits & vec3u(0x7fffffffu);\n let negative = (bits & vec3u(0x80000000u)) != vec3u(0u);\n let infinite = select(vec3f(hi), vec3f(lo), negative);\n let clamped = select(clamp(v, vec3f(lo), vec3f(hi)), infinite, magnitude == vec3u(0x7f800000u));\n return select(clamped, vec3f(0.0), magnitude > vec3u(0x7f800000u));\n}\n";
@@ -0,0 +1,28 @@
1
+ /**
2
+ * OIDN's input and output sanitizing: NaN becomes 0, then values are clamped
3
+ * to their valid range. HDR values are bounded by FLT_MAX, so +inf becomes
4
+ * FLT_MAX. Used before the network, by auto-exposure, and on the network
5
+ * output before the inverse transfer.
6
+ */
7
+ export const FLT_MAX = 3.4028234663852886e38;
8
+ export function sanitize(value, lo, hi) {
9
+ return Number.isNaN(value) ? 0 : Math.min(Math.max(value, lo), hi);
10
+ }
11
+ /**
12
+ * WGSL declarations of `FLT_MAX` and `fn sanitize(v: vec3f, lo: f32, hi: f32)`.
13
+ * WGSL compilers may assume floats are finite, so NaN and infinity are
14
+ * detected from the bits rather than with comparisons. FLT_MAX is spelled out
15
+ * so the native core does not depend on scriptc's number formatting.
16
+ */
17
+ export const sanitizeWGSL = /* wgsl */ `
18
+ const FLT_MAX = 3.4028234663852886e38;
19
+ fn sanitize(v: vec3f, lo: f32, hi: f32) -> vec3f {
20
+ let bits = bitcast<vec3u>(v);
21
+ let magnitude = bits & vec3u(0x7fffffffu);
22
+ let negative = (bits & vec3u(0x80000000u)) != vec3u(0u);
23
+ let infinite = select(vec3f(hi), vec3f(lo), negative);
24
+ let clamped = select(clamp(v, vec3f(lo), vec3f(hi)), infinite, magnitude == vec3u(0x7f800000u));
25
+ return select(clamped, vec3f(0.0), magnitude > vec3u(0x7f800000u));
26
+ }
27
+ `;
28
+ //# sourceMappingURL=sanitize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../src/sanitize.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,qBAAqB,CAAC;AAE7C,MAAM,UAAU,QAAQ,CAAC,KAAa,EAAE,EAAU,EAAE,EAAU;IAC5D,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AACrE,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CAAC;;;;;;;;;;CAUtC,CAAC"}
@@ -0,0 +1,61 @@
1
+ export interface DynamicTileOptions {
2
+ /** Smallest output tile edge. Defaults to 256. */
3
+ minTileSize?: number;
4
+ /** Initial maximum output tile edge. Defaults to 432. */
5
+ initialTileSize?: number;
6
+ /** Desired upper bound for one tile's GPU latency. Defaults to 16 ms. */
7
+ targetTileTimeMs?: number;
8
+ /** Amount added or removed after each completed execution. Defaults to 16. */
9
+ adjustmentStep?: number;
10
+ }
11
+ export type DynamicTileSetting = boolean | DynamicTileOptions;
12
+ export declare const OIDN_TILE_ALIGNMENT = 16;
13
+ export interface TileRect {
14
+ x: number;
15
+ y: number;
16
+ width: number;
17
+ height: number;
18
+ }
19
+ export interface PlannedTile {
20
+ column: number;
21
+ row: number;
22
+ input: TileRect;
23
+ output: TileRect;
24
+ }
25
+ export interface TilePlan {
26
+ columns: number;
27
+ rows: number;
28
+ overlap: number;
29
+ maxOutputWidth: number;
30
+ maxOutputHeight: number;
31
+ inputPixelCount: number;
32
+ inputShapeCount: number;
33
+ tiles: PlannedTile[];
34
+ }
35
+ /**
36
+ * Splits an image into balanced rectangular output regions. Only sides that
37
+ * touch another tile receive a halo; image edges rely on the model's normal
38
+ * boundary behavior instead of doing redundant off-edge work.
39
+ */
40
+ export declare function planTileGrid(width: number, height: number, maxTileSize: number, overlap: number): TilePlan;
41
+ /** Fits one output dimension without exceeding the configured tile cap. */
42
+ export declare function fitTileDimension(imageSize: number, maxTileSize: number): number;
43
+ /**
44
+ * Chooses an output tile size from completed GPU timings. A size change is
45
+ * applied to the next execution so one in-flight tiled pass keeps a stable
46
+ * overlap, allocation plan, and pipeline set.
47
+ */
48
+ export declare class DynamicTileController {
49
+ readonly enabled: boolean;
50
+ readonly maxTileSize: number;
51
+ readonly minTileSize: number;
52
+ readonly targetTileTimeMs: number;
53
+ private _tileSize;
54
+ private _adjustmentStep;
55
+ private _smoothedTileTimeMs?;
56
+ private _completeExecutionsSinceChange;
57
+ constructor(maxTileSize: number, setting?: DynamicTileSetting);
58
+ get tileSize(): number;
59
+ /** Returns true when the next execution should use a different tile size. */
60
+ observe(tileTimesMs: number[]): boolean;
61
+ }
@@ -0,0 +1,199 @@
1
+ const defaultMinTileSize = 256;
2
+ const defaultInitialTileSize = 432;
3
+ const defaultTargetTileTimeMs = 16;
4
+ const defaultAdjustmentStep = 16;
5
+ export const OIDN_TILE_ALIGNMENT = 16;
6
+ function alignUp(value, alignment) {
7
+ return Math.ceil(value / alignment) * alignment;
8
+ }
9
+ function alignDown(value, alignment) {
10
+ return Math.floor(value / alignment) * alignment;
11
+ }
12
+ function partitionRange(length, parts, index) {
13
+ const start = Math.round(index * length / parts);
14
+ const end = Math.round((index + 1) * length / parts);
15
+ return { start, end };
16
+ }
17
+ function alignRangeWithinImage(start, end, imageSize, minimumSize = 0) {
18
+ const currentSize = end - start;
19
+ const alignedSize = Math.max(minimumSize, alignUp(currentSize, OIDN_TILE_ALIGNMENT));
20
+ let alignedStart = start - Math.floor((alignedSize - currentSize) / 2);
21
+ // At an image edge, keep the padded portion on the right/bottom. Input
22
+ // readers replicate the nearest image edge into that portion, while output
23
+ // tiles remain strictly inside the original image.
24
+ alignedStart = clamp(alignedStart, 0, Math.max(0, imageSize - alignedSize));
25
+ return { start: alignedStart, end: alignedStart + alignedSize };
26
+ }
27
+ /**
28
+ * Splits an image into balanced rectangular output regions. Only sides that
29
+ * touch another tile receive a halo; image edges rely on the model's normal
30
+ * boundary behavior instead of doing redundant off-edge work.
31
+ */
32
+ export function planTileGrid(width, height, maxTileSize, overlap) {
33
+ if (!Number.isInteger(width) || width <= 0 ||
34
+ !Number.isInteger(height) || height <= 0) {
35
+ throw new Error('Tile grid dimensions must be positive integers');
36
+ }
37
+ if (!Number.isFinite(maxTileSize) || maxTileSize <= 0) {
38
+ throw new Error('Maximum tile size must be positive');
39
+ }
40
+ if (!Number.isFinite(overlap) || overlap < 0) {
41
+ throw new Error('Tile overlap must be non-negative');
42
+ }
43
+ const alignedMaximum = Math.max(OIDN_TILE_ALIGNMENT, alignDown(maxTileSize, OIDN_TILE_ALIGNMENT));
44
+ const alignedOverlap = alignUp(overlap, OIDN_TILE_ALIGNMENT);
45
+ const columns = Math.max(1, Math.ceil(width / alignedMaximum));
46
+ const rows = Math.max(1, Math.ceil(height / alignedMaximum));
47
+ const tiles = [];
48
+ let maxOutputWidth = 0;
49
+ let maxOutputHeight = 0;
50
+ for (let row = 0; row < rows; row++) {
51
+ const outputY = partitionRange(height, rows, row);
52
+ for (let column = 0; column < columns; column++) {
53
+ const outputX = partitionRange(width, columns, column);
54
+ const desiredInputX = {
55
+ start: column === 0
56
+ ? outputX.start
57
+ : Math.max(0, outputX.start - alignedOverlap),
58
+ end: column === columns - 1
59
+ ? outputX.end
60
+ : Math.min(width, outputX.end + alignedOverlap)
61
+ };
62
+ const desiredInputY = {
63
+ start: row === 0
64
+ ? outputY.start
65
+ : Math.max(0, outputY.start - alignedOverlap),
66
+ end: row === rows - 1
67
+ ? outputY.end
68
+ : Math.min(height, outputY.end + alignedOverlap)
69
+ };
70
+ const inputX = alignRangeWithinImage(desiredInputX.start, desiredInputX.end, width);
71
+ const inputY = alignRangeWithinImage(desiredInputY.start, desiredInputY.end, height);
72
+ const output = {
73
+ x: outputX.start,
74
+ y: outputY.start,
75
+ width: outputX.end - outputX.start,
76
+ height: outputY.end - outputY.start
77
+ };
78
+ const input = {
79
+ x: inputX.start,
80
+ y: inputY.start,
81
+ width: inputX.end - inputX.start,
82
+ height: inputY.end - inputY.start
83
+ };
84
+ maxOutputWidth = Math.max(maxOutputWidth, output.width);
85
+ maxOutputHeight = Math.max(maxOutputHeight, output.height);
86
+ tiles.push({ column, row, input, output });
87
+ }
88
+ }
89
+ const inputShapes = () => new Set(tiles.map(({ input }) => `${input.width}x${input.height}`));
90
+ if (inputShapes().size > 2) {
91
+ const maximumInputWidth = Math.max(...tiles.map(({ input }) => input.width));
92
+ const maximumInputHeight = Math.max(...tiles.map(({ input }) => input.height));
93
+ const uniformWidthPixelCount = tiles.reduce((sum, { input }) => sum + maximumInputWidth * input.height, 0);
94
+ const uniformHeightPixelCount = tiles.reduce((sum, { input }) => sum + input.width * maximumInputHeight, 0);
95
+ if (uniformWidthPixelCount <= uniformHeightPixelCount) {
96
+ for (const tile of tiles) {
97
+ const range = alignRangeWithinImage(tile.input.x, tile.input.x + tile.input.width, width, maximumInputWidth);
98
+ tile.input.x = range.start;
99
+ tile.input.width = range.end - range.start;
100
+ }
101
+ }
102
+ else {
103
+ for (const tile of tiles) {
104
+ const range = alignRangeWithinImage(tile.input.y, tile.input.y + tile.input.height, height, maximumInputHeight);
105
+ tile.input.y = range.start;
106
+ tile.input.height = range.end - range.start;
107
+ }
108
+ }
109
+ }
110
+ const finalInputShapes = inputShapes();
111
+ const inputPixelCount = tiles.reduce((sum, { input }) => sum + input.width * input.height, 0);
112
+ return {
113
+ columns,
114
+ rows,
115
+ overlap: alignedOverlap,
116
+ maxOutputWidth,
117
+ maxOutputHeight,
118
+ inputPixelCount,
119
+ inputShapeCount: finalInputShapes.size,
120
+ tiles
121
+ };
122
+ }
123
+ function clamp(value, min, max) {
124
+ return Math.min(Math.max(value, min), max);
125
+ }
126
+ function percentile(values, fraction) {
127
+ const sorted = [...values].sort((a, b) => a - b);
128
+ return sorted[Math.ceil(sorted.length * fraction) - 1];
129
+ }
130
+ /** Fits one output dimension without exceeding the configured tile cap. */
131
+ export function fitTileDimension(imageSize, maxTileSize) {
132
+ return imageSize <= maxTileSize
133
+ ? Math.min(alignUp(imageSize, OIDN_TILE_ALIGNMENT), maxTileSize)
134
+ : maxTileSize;
135
+ }
136
+ /**
137
+ * Chooses an output tile size from completed GPU timings. A size change is
138
+ * applied to the next execution so one in-flight tiled pass keeps a stable
139
+ * overlap, allocation plan, and pipeline set.
140
+ */
141
+ export class DynamicTileController {
142
+ enabled;
143
+ maxTileSize;
144
+ minTileSize;
145
+ targetTileTimeMs;
146
+ _tileSize;
147
+ _adjustmentStep;
148
+ _smoothedTileTimeMs;
149
+ _completeExecutionsSinceChange = 0;
150
+ constructor(maxTileSize, setting = true) {
151
+ const options = typeof setting === 'object' ? setting : {};
152
+ this.enabled = setting !== false;
153
+ this.maxTileSize = Math.max(OIDN_TILE_ALIGNMENT, alignDown(maxTileSize, OIDN_TILE_ALIGNMENT));
154
+ this.minTileSize = clamp(alignUp(options.minTileSize ?? defaultMinTileSize, OIDN_TILE_ALIGNMENT), OIDN_TILE_ALIGNMENT, this.maxTileSize);
155
+ this.targetTileTimeMs = Math.max(1, options.targetTileTimeMs ?? defaultTargetTileTimeMs);
156
+ this._adjustmentStep = Math.max(OIDN_TILE_ALIGNMENT, alignUp(options.adjustmentStep ?? defaultAdjustmentStep, OIDN_TILE_ALIGNMENT));
157
+ this._tileSize = this.enabled
158
+ ? clamp(alignUp(options.initialTileSize ?? defaultInitialTileSize, OIDN_TILE_ALIGNMENT), this.minTileSize, this.maxTileSize)
159
+ : this.maxTileSize;
160
+ }
161
+ get tileSize() {
162
+ return this._tileSize;
163
+ }
164
+ /** Returns true when the next execution should use a different tile size. */
165
+ observe(tileTimesMs) {
166
+ if (!this.enabled || tileTimesMs.length === 0)
167
+ return false;
168
+ const validTimes = tileTimesMs.filter((duration) => Number.isFinite(duration) && duration >= 0);
169
+ if (validTimes.length === 0)
170
+ return false;
171
+ // The first tile may still pay one-time GPU residency costs even after
172
+ // shape preparation. It should not make a stable layout look too slow.
173
+ const representativeTimes = validTimes.length >= 3
174
+ ? validTimes.slice(1)
175
+ : validTimes;
176
+ const observedTime = percentile(representativeTimes, 0.75);
177
+ this._smoothedTileTimeMs = this._smoothedTileTimeMs === undefined
178
+ ? observedTime
179
+ : this._smoothedTileTimeMs * 0.65 + observedTime * 0.35;
180
+ this._completeExecutionsSinceChange++;
181
+ if (this._completeExecutionsSinceChange < 2)
182
+ return false;
183
+ let nextTileSize = this._tileSize;
184
+ if (this._smoothedTileTimeMs > this.targetTileTimeMs * 1.25) {
185
+ nextTileSize -= this._adjustmentStep;
186
+ }
187
+ else if (this._smoothedTileTimeMs < this.targetTileTimeMs * 0.65) {
188
+ nextTileSize += this._adjustmentStep;
189
+ }
190
+ nextTileSize = clamp(alignUp(nextTileSize, OIDN_TILE_ALIGNMENT), this.minTileSize, this.maxTileSize);
191
+ if (nextTileSize === this._tileSize)
192
+ return false;
193
+ this._tileSize = nextTileSize;
194
+ this._smoothedTileTimeMs = undefined;
195
+ this._completeExecutionsSinceChange = 0;
196
+ return true;
197
+ }
198
+ }
199
+ //# sourceMappingURL=tileScheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tileScheduler.js","sourceRoot":"","sources":["../src/tileScheduler.ts"],"names":[],"mappings":"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"}
package/lib/tza.d.ts ADDED
@@ -0,0 +1,15 @@
1
+ export type TensorLayout = 'x' | 'oihw';
2
+ export type DataType = 'Float32' | 'Float16';
3
+ export declare class TensorDesc {
4
+ dims: number[];
5
+ paddedDims: number[];
6
+ layout: TensorLayout;
7
+ dataType: DataType;
8
+ getByteSize(): number;
9
+ }
10
+ export declare class HostTensor {
11
+ desc: TensorDesc;
12
+ data: Uint8Array;
13
+ constructor(desc: TensorDesc, data: Uint8Array);
14
+ }
15
+ export declare function parseTZA(buffer: ArrayBuffer): Map<string, HostTensor>;
package/lib/tza.js ADDED
@@ -0,0 +1,114 @@
1
+ // Copyright 2018 Intel Corporation
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ export class TensorDesc {
4
+ dims = [];
5
+ paddedDims = [];
6
+ layout = 'x';
7
+ dataType = 'Float32';
8
+ getByteSize() {
9
+ let size = 1;
10
+ for (const dim of this.paddedDims) {
11
+ size *= dim;
12
+ }
13
+ if (this.dataType === 'Float32') {
14
+ size *= 4;
15
+ }
16
+ else if (this.dataType === 'Float16') {
17
+ size *= 2;
18
+ }
19
+ return size;
20
+ }
21
+ }
22
+ export class HostTensor {
23
+ desc;
24
+ data;
25
+ constructor(desc, data) {
26
+ this.desc = desc;
27
+ this.data = data;
28
+ }
29
+ }
30
+ class DataViewReader {
31
+ _view;
32
+ offset = 0;
33
+ constructor(_view) {
34
+ this._view = _view;
35
+ }
36
+ read(size) {
37
+ const view = this._view;
38
+ const offset = this.offset;
39
+ this.offset += size;
40
+ switch (size) {
41
+ case 1:
42
+ return view.getUint8(offset);
43
+ case 2:
44
+ return view.getUint16(offset, true);
45
+ case 4:
46
+ return view.getUint32(offset, true);
47
+ case 8:
48
+ // TODO
49
+ return Number(view.getBigUint64(offset, true));
50
+ default:
51
+ throw new Error('unsupported read size');
52
+ }
53
+ }
54
+ }
55
+ export function parseTZA(buffer) {
56
+ const input = new Uint8Array(buffer);
57
+ const viewReader = new DataViewReader(new DataView(buffer));
58
+ // Parse the magic value
59
+ const magic = viewReader.read(2);
60
+ if (magic !== 0x41d7) {
61
+ throw new Error('invalid or corrupted weights blob');
62
+ }
63
+ // Parse the version
64
+ const majorVersion = viewReader.read(1);
65
+ const minorVersion = viewReader.read(1);
66
+ if (majorVersion !== 2) {
67
+ throw new Error('unsupported weights blob version');
68
+ }
69
+ // Parse the table offset and jump to the table
70
+ const tableOffset = viewReader.read(8);
71
+ viewReader.offset = tableOffset;
72
+ // Parse the number of tensors
73
+ const numTensors = viewReader.read(4);
74
+ // Parse the tensors
75
+ const tensorMap = new Map();
76
+ for (let i = 0; i < numTensors; ++i) {
77
+ const tensorDesc = new TensorDesc();
78
+ // Parse the name
79
+ const nameLen = viewReader.read(2);
80
+ const name = new TextDecoder().decode(input.subarray(viewReader.offset, viewReader.offset + nameLen));
81
+ viewReader.offset += nameLen;
82
+ // Parse the number of dimensions
83
+ const ndims = viewReader.read(1);
84
+ // Parse the shape of the tensor
85
+ for (let j = 0; j < ndims; ++j) {
86
+ tensorDesc.dims.push(viewReader.read(4));
87
+ }
88
+ tensorDesc.paddedDims = [...tensorDesc.dims];
89
+ // Parse the layout of the tensor
90
+ const layoutStr = new TextDecoder().decode(input.subarray(viewReader.offset, viewReader.offset + ndims));
91
+ if (layoutStr === 'oihw') {
92
+ tensorDesc.layout = 'oihw';
93
+ }
94
+ viewReader.offset += ndims;
95
+ // Parse the data type of the tensor
96
+ const dataType = String.fromCharCode(viewReader.read(1));
97
+ if (dataType === 'f') {
98
+ tensorDesc.dataType = 'Float32';
99
+ }
100
+ else if (dataType === 'h') {
101
+ tensorDesc.dataType = 'Float16';
102
+ }
103
+ else {
104
+ throw new Error('invalid tensor data type');
105
+ }
106
+ // Parse the offset to the tensor data
107
+ const tensorOffset = viewReader.read(8);
108
+ const tensorData = input.slice(tensorOffset, tensorOffset + tensorDesc.getByteSize());
109
+ // Add the tensor to the map
110
+ tensorMap.set(name, new HostTensor(tensorDesc, tensorData));
111
+ }
112
+ return tensorMap;
113
+ }
114
+ //# sourceMappingURL=tza.js.map
package/lib/tza.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tza.js","sourceRoot":"","sources":["../src/tza.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import type { ValidatedUNetModel } from './modelSpec';
2
+ import type { NativeUNetPrecision, NativeUNetPrecisionSetting } from './nativeUNet';
3
+ import { type OIDNResourceSnapshot } from './resourceTracker.js';
4
+ export interface WebNNUNetOptions {
5
+ precision?: NativeUNetPrecisionSetting;
6
+ shapeCacheSize?: number;
7
+ }
8
+ export interface WebNNRuntimeSupport {
9
+ available: boolean;
10
+ reason?: string;
11
+ fp16Conv: boolean;
12
+ gpuInterop: boolean;
13
+ }
14
+ /** Experimental model-driven WebNN executor with FP16 WebGPU interop. */
15
+ export declare class WebNNUNetExecutor {
16
+ private _device;
17
+ private _model;
18
+ readonly precision: NativeUNetPrecision;
19
+ readonly support: WebNNRuntimeSupport;
20
+ private _context;
21
+ private _builderConstructor;
22
+ private _shapeCache;
23
+ private _shapePromises;
24
+ private _retiredExecutions;
25
+ private _pendingCreationCount;
26
+ private _shapeCacheSize;
27
+ private _clock;
28
+ private _inputPipeline;
29
+ private _outputPipeline;
30
+ private _resources;
31
+ private _disposed;
32
+ constructor(_device: GPUDevice, _model: ValidatedUNetModel, options?: WebNNUNetOptions);
33
+ prepare(): Promise<void>;
34
+ private _constant;
35
+ private _createExecution;
36
+ private _execution;
37
+ /** Compiles common tile shapes while the host still reports model loading. */
38
+ prewarm(shapes: readonly {
39
+ width: number;
40
+ height: number;
41
+ }[]): Promise<void>;
42
+ execute(inputBuffers: readonly GPUBuffer[], width: number, height: number): Promise<GPUBuffer>;
43
+ executeCPU(input: Float32Array, width: number, height: number): Promise<Float32Array<ArrayBuffer>>;
44
+ private _destroyExecution;
45
+ private _retireExecution;
46
+ private _releaseBuffer;
47
+ private _releaseTensor;
48
+ private _releaseGraph;
49
+ private _releaseContext;
50
+ getResourceInfo(): OIDNResourceSnapshot;
51
+ dispose(): void;
52
+ }