@flighthq/render-wgpu 0.3.0-next.906.07cea63 → 0.3.1-next.1041.35b950c

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/dist/contract.d.ts +7 -1
  2. package/dist/contract.d.ts.map +1 -1
  3. package/dist/contract.js +7 -1
  4. package/dist/contract.js.map +1 -1
  5. package/dist/enableWgpuTextureResolverGuards.d.ts +4 -0
  6. package/dist/enableWgpuTextureResolverGuards.d.ts.map +1 -0
  7. package/dist/enableWgpuTextureResolverGuards.js +8 -0
  8. package/dist/enableWgpuTextureResolverGuards.js.map +1 -0
  9. package/dist/explainWgpuTextureResolution.d.ts +3 -0
  10. package/dist/explainWgpuTextureResolution.d.ts.map +1 -0
  11. package/dist/explainWgpuTextureResolution.js +15 -0
  12. package/dist/explainWgpuTextureResolution.js.map +1 -0
  13. package/dist/index.d.ts +1 -1
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +1 -1
  16. package/dist/index.js.map +1 -1
  17. package/dist/wgpuBackground.d.ts +2 -0
  18. package/dist/wgpuBackground.d.ts.map +1 -1
  19. package/dist/wgpuBackground.js +30 -2
  20. package/dist/wgpuBackground.js.map +1 -1
  21. package/dist/wgpuCompressedTexture.d.ts +2 -2
  22. package/dist/wgpuCompressedTexture.d.ts.map +1 -1
  23. package/dist/wgpuCompressedTexture.js +52 -13
  24. package/dist/wgpuCompressedTexture.js.map +1 -1
  25. package/dist/wgpuDraw.d.ts +6 -4
  26. package/dist/wgpuDraw.d.ts.map +1 -1
  27. package/dist/wgpuDraw.js +150 -69
  28. package/dist/wgpuDraw.js.map +1 -1
  29. package/dist/wgpuExternalImageSource.d.ts +3 -0
  30. package/dist/wgpuExternalImageSource.d.ts.map +1 -0
  31. package/dist/wgpuExternalImageSource.js +51 -0
  32. package/dist/wgpuExternalImageSource.js.map +1 -0
  33. package/dist/wgpuExternalTexture.d.ts +4 -0
  34. package/dist/wgpuExternalTexture.d.ts.map +1 -0
  35. package/dist/wgpuExternalTexture.js +62 -0
  36. package/dist/wgpuExternalTexture.js.map +1 -0
  37. package/dist/wgpuMaterialRegistry.d.ts.map +1 -1
  38. package/dist/wgpuMaterialRegistry.js +17 -12
  39. package/dist/wgpuMaterialRegistry.js.map +1 -1
  40. package/dist/wgpuMipmap.d.ts.map +1 -1
  41. package/dist/wgpuMipmap.js +11 -9
  42. package/dist/wgpuMipmap.js.map +1 -1
  43. package/dist/wgpuRenderState.d.ts +15 -3
  44. package/dist/wgpuRenderState.d.ts.map +1 -1
  45. package/dist/wgpuRenderState.js +253 -33
  46. package/dist/wgpuRenderState.js.map +1 -1
  47. package/dist/wgpuRenderTarget.d.ts.map +1 -1
  48. package/dist/wgpuRenderTarget.js +2 -0
  49. package/dist/wgpuRenderTarget.js.map +1 -1
  50. package/dist/wgpuRenderTexture.d.ts +15 -0
  51. package/dist/wgpuRenderTexture.d.ts.map +1 -0
  52. package/dist/wgpuRenderTexture.js +130 -0
  53. package/dist/wgpuRenderTexture.js.map +1 -0
  54. package/dist/wgpuRenderTexturePool.d.ts +7 -0
  55. package/dist/wgpuRenderTexturePool.d.ts.map +1 -0
  56. package/dist/wgpuRenderTexturePool.js +86 -0
  57. package/dist/wgpuRenderTexturePool.js.map +1 -0
  58. package/dist/wgpuShader.d.ts.map +1 -1
  59. package/dist/wgpuShader.js +5 -1
  60. package/dist/wgpuShader.js.map +1 -1
  61. package/dist/wgpuSurface.d.ts +2 -2
  62. package/dist/wgpuSurface.d.ts.map +1 -1
  63. package/dist/wgpuSurface.js +61 -13
  64. package/dist/wgpuSurface.js.map +1 -1
  65. package/dist/wgpuTestHelper.d.ts +1 -0
  66. package/dist/wgpuTestHelper.d.ts.map +1 -1
  67. package/dist/wgpuTestHelper.js +125 -8
  68. package/dist/wgpuTestHelper.js.map +1 -1
  69. package/dist/wgpuTextureResolver.d.ts +9 -0
  70. package/dist/wgpuTextureResolver.d.ts.map +1 -0
  71. package/dist/wgpuTextureResolver.js +68 -0
  72. package/dist/wgpuTextureResolver.js.map +1 -0
  73. package/dist/wgpuTextureUpload.d.ts +2 -2
  74. package/dist/wgpuTextureUpload.d.ts.map +1 -1
  75. package/dist/wgpuTextureUpload.js +5 -10
  76. package/dist/wgpuTextureUpload.js.map +1 -1
  77. package/package.json +17 -7
  78. package/src/enableWgpuTextureResolverGuards.test.ts +65 -0
  79. package/src/explainWgpuTextureResolution.test.ts +36 -0
  80. package/src/wgpuBackground.test.ts +34 -1
  81. package/src/wgpuCompressedTexture.test.ts +35 -40
  82. package/src/wgpuDraw.test.ts +180 -62
  83. package/src/wgpuExternalImageSource.test.ts +89 -0
  84. package/src/wgpuExternalTexture.test.ts +35 -0
  85. package/src/wgpuMaterialRegistry.test.ts +44 -3
  86. package/src/wgpuMipmap.test.ts +10 -2
  87. package/src/wgpuRenderState.test.ts +462 -12
  88. package/src/wgpuRenderTarget.test.ts +14 -0
  89. package/src/wgpuRenderTexture.test.ts +165 -0
  90. package/src/wgpuRenderTexturePool.test.ts +146 -0
  91. package/src/wgpuShaderBinding.test.ts +6 -6
  92. package/src/wgpuSurface.test.ts +95 -3
  93. package/src/wgpuTestHelper.test.ts +64 -0
  94. package/src/wgpuTextureResolver.test.ts +212 -0
  95. package/src/wgpuTextureUpload.test.ts +28 -13
@@ -37,13 +37,26 @@ function makeBindGroup() {
37
37
  function makeBindGroupLayout() {
38
38
  return {};
39
39
  }
40
- function makeBuffer() {
41
- return { destroy: () => { } };
40
+ function makeBuffer(descriptor) {
41
+ return {
42
+ destroy: () => { },
43
+ size: descriptor.size,
44
+ usage: descriptor.usage,
45
+ };
42
46
  }
43
- function makeTexture() {
47
+ function makeTexture(descriptor) {
48
+ const [width, height, depthOrArrayLayers] = normalizeGpuExtent3D(descriptor?.size ?? [1, 1, 1]);
44
49
  return {
45
50
  createView: () => ({}),
51
+ depthOrArrayLayers,
52
+ dimension: descriptor?.dimension ?? '2d',
46
53
  destroy: () => { },
54
+ format: descriptor?.format ?? 'bgra8unorm',
55
+ height,
56
+ mipLevelCount: descriptor?.mipLevelCount ?? 1,
57
+ sampleCount: descriptor?.sampleCount ?? 1,
58
+ usage: descriptor?.usage ?? GPUTextureUsage.RENDER_ATTACHMENT,
59
+ width,
47
60
  };
48
61
  }
49
62
  function makeRenderPassEncoder() {
@@ -78,26 +91,116 @@ function makePipelineLayout() {
78
91
  return {};
79
92
  }
80
93
  function makeDevice() {
94
+ const writeBuffer = (buffer, bufferOffset, data, dataOffset, size) => {
95
+ validateWriteBufferDestination(buffer, bufferOffset, data, dataOffset, size);
96
+ };
97
+ const writeTexture = (destination, data, dataLayout, size) => {
98
+ validateWriteTextureSourceAllocation(destination, data, dataLayout, size);
99
+ };
81
100
  return {
82
101
  features: new Set(),
83
- limits: { minUniformBufferOffsetAlignment: 256 },
102
+ limits: { maxTextureDimension2D: 8192, minUniformBufferOffsetAlignment: 256 },
84
103
  createBindGroup: () => makeBindGroup(),
85
104
  createBindGroupLayout: () => makeBindGroupLayout(),
86
- createBuffer: () => makeBuffer(),
105
+ createBuffer: (descriptor) => makeBuffer(descriptor),
87
106
  createCommandEncoder: () => makeCommandEncoder(),
88
107
  createPipelineLayout: () => makePipelineLayout(),
89
108
  createRenderPipeline: (descriptor) => makePipeline(descriptor),
90
109
  createSampler: () => makeSampler(),
91
110
  createShaderModule: () => makeShaderModule(),
92
- createTexture: () => makeTexture(),
111
+ createTexture: (descriptor) => makeTexture(descriptor),
93
112
  queue: {
94
113
  copyExternalImageToTexture: () => { },
95
114
  submit: () => { },
96
- writeBuffer: () => { },
97
- writeTexture: () => { },
115
+ writeBuffer,
116
+ writeTexture,
98
117
  },
99
118
  };
100
119
  }
120
+ // Mirror writeBuffer's synchronous BufferSource checks and the destination constraints that a real
121
+ // device reports through GPU validation. This mock backs unit paths in three WGPU packages, so the
122
+ // validation belongs at their shared fake-device boundary rather than in individual interaction tests.
123
+ function validateWriteBufferDestination(buffer, bufferOffset, data, dataOffset = 0, size) {
124
+ const isArrayBuffer = data instanceof ArrayBuffer;
125
+ const isSharedArrayBuffer = typeof SharedArrayBuffer !== 'undefined' && data instanceof SharedArrayBuffer;
126
+ const isView = ArrayBuffer.isView(data);
127
+ if (!isArrayBuffer && !isSharedArrayBuffer && !isView) {
128
+ throw new TypeError('GPUQueue.writeBuffer: data must be a BufferSource');
129
+ }
130
+ if (!Number.isSafeInteger(bufferOffset) || bufferOffset < 0 || bufferOffset % 4 !== 0) {
131
+ throw new DOMException('GPUQueue.writeBuffer: bufferOffset must be a non-negative multiple of 4', 'OperationError');
132
+ }
133
+ if (!Number.isSafeInteger(dataOffset) ||
134
+ dataOffset < 0 ||
135
+ (size !== undefined && (!Number.isSafeInteger(size) || size < 0))) {
136
+ throw new DOMException('GPUQueue.writeBuffer: data range is invalid', 'OperationError');
137
+ }
138
+ const elementByteLength = isView && !(data instanceof DataView) ? getTypedArrayElementByteLength(data) : 1;
139
+ const dataElementLength = data.byteLength / elementByteLength;
140
+ const contentElementLength = size ?? dataElementLength - dataOffset;
141
+ if (contentElementLength < 0 || dataOffset + contentElementLength > dataElementLength) {
142
+ throw new DOMException('GPUQueue.writeBuffer: data range is out of bounds', 'OperationError');
143
+ }
144
+ const contentByteLength = contentElementLength * elementByteLength;
145
+ if (contentByteLength % 4 !== 0) {
146
+ throw new DOMException('GPUQueue.writeBuffer: content byte length must be a multiple of 4', 'OperationError');
147
+ }
148
+ if ((buffer.usage & GPUBufferUsage.COPY_DST) === 0) {
149
+ throw new Error('Fake GPU validation: GPUQueue.writeBuffer destination buffer must have COPY_DST usage');
150
+ }
151
+ if (bufferOffset + contentByteLength > buffer.size) {
152
+ throw new Error('Fake GPU validation: GPUQueue.writeBuffer destination range exceeds the buffer size');
153
+ }
154
+ }
155
+ function getTypedArrayElementByteLength(data) {
156
+ return data.BYTES_PER_ELEMENT;
157
+ }
158
+ function getWriteTextureBytesPerTexel(format) {
159
+ if (format === 'rgba8unorm' ||
160
+ format === 'rgba8unorm-srgb' ||
161
+ format === 'bgra8unorm' ||
162
+ format === 'bgra8unorm-srgb') {
163
+ return 4;
164
+ }
165
+ if (format === 'rgba32float')
166
+ return 16;
167
+ return null;
168
+ }
169
+ function normalizeGpuExtent3D(size) {
170
+ if (Symbol.iterator in Object(size)) {
171
+ const values = Array.from(size);
172
+ return [values[0] ?? 1, values[1] ?? 1, values[2] ?? 1];
173
+ }
174
+ const dictionary = size;
175
+ return [dictionary.width, dictionary.height ?? 1, dictionary.depthOrArrayLayers ?? 1];
176
+ }
177
+ // writeTexture imports the caller's BufferSource synchronously. Model the exact source-allocation
178
+ // requirement for the uncompressed formats exercised through this reusable fake; block-compressed
179
+ // formats remain record-only until their block geometry is modeled deliberately.
180
+ function validateWriteTextureSourceAllocation(destination, data, dataLayout, size) {
181
+ const isArrayBuffer = data instanceof ArrayBuffer;
182
+ const isSharedArrayBuffer = typeof SharedArrayBuffer !== 'undefined' && data instanceof SharedArrayBuffer;
183
+ const isView = ArrayBuffer.isView(data);
184
+ if (!isArrayBuffer && !isSharedArrayBuffer && !isView) {
185
+ throw new TypeError('GPUQueue.writeTexture: data must be a BufferSource');
186
+ }
187
+ const bytesPerTexel = getWriteTextureBytesPerTexel(destination.texture.format);
188
+ if (bytesPerTexel === null)
189
+ return;
190
+ const [width, height, depthOrArrayLayers] = normalizeGpuExtent3D(size);
191
+ if (width === 0 || height === 0 || depthOrArrayLayers === 0)
192
+ return;
193
+ const bytesInLastRow = width * bytesPerTexel;
194
+ const bytesPerRow = Math.max(bytesInLastRow, dataLayout.bytesPerRow ?? bytesInLastRow);
195
+ const rowsPerImage = Math.max(height, dataLayout.rowsPerImage ?? height);
196
+ const requiredByteLength = (dataLayout.offset ?? 0) +
197
+ bytesPerRow * rowsPerImage * (depthOrArrayLayers - 1) +
198
+ bytesPerRow * (height - 1) +
199
+ bytesInLastRow;
200
+ if (requiredByteLength > data.byteLength) {
201
+ throw new DOMException(`GPUQueue.writeTexture: data byte length ${data.byteLength} is smaller than the ${requiredByteLength} bytes required by the copy`, 'OperationError');
202
+ }
203
+ }
101
204
  function makeAdapter() {
102
205
  return {
103
206
  // A real GPUAdapter always exposes `.limits`; the forward-lit pipeline's device request reads
@@ -107,6 +210,20 @@ function makeAdapter() {
107
210
  requestDevice: () => Promise.resolve(makeDevice()),
108
211
  };
109
212
  }
213
+ // JSDOM does not decode image elements, so a bare <img> remains incomplete even when its layout
214
+ // width and height are assigned. Use this fixture when a test needs to exercise a successful external
215
+ // image upload; readiness-failure tests should keep constructing the incomplete element directly.
216
+ export function createReadyImageElementForTest(width = 1, height = 1) {
217
+ const image = document.createElement('img');
218
+ image.width = width;
219
+ image.height = height;
220
+ Object.defineProperties(image, {
221
+ complete: { configurable: true, value: true },
222
+ naturalHeight: { configurable: true, value: height },
223
+ naturalWidth: { configurable: true, value: width },
224
+ });
225
+ return image;
226
+ }
110
227
  export async function createWgpuRenderStateForTest() {
111
228
  const canvas = document.createElement('canvas');
112
229
  canvas.width = 800;
@@ -1 +1 @@
1
- {"version":3,"file":"wgpuTestHelper.js","sourceRoot":"","sources":["../src/wgpuTestHelper.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wgpuTestHelper.js","sourceRoot":"","sources":["../src/wgpuTestHelper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { RenderTargetColorSpace, TextureSourceKind, TextureLike, WgpuRenderState, WgpuTextureEntry, WgpuTextureResolver } from '@flighthq/types/contract';
2
+ export declare function registerStandardWgpuTextureResolvers(state: WgpuRenderState): void;
3
+ export declare function registerWgpuBitmapTextureResolver(state: WgpuRenderState): void;
4
+ export declare function registerWgpuCompressedImageTextureResolver(state: WgpuRenderState): void;
5
+ export declare function registerWgpuImageTextureResolver(state: WgpuRenderState): void;
6
+ export declare function registerWgpuRenderTextureResolver(state: WgpuRenderState): void;
7
+ export declare function registerWgpuTextureResolver(state: WgpuRenderState, sourceKind: TextureSourceKind, resolver: WgpuTextureResolver | null): void;
8
+ export declare function resolveWgpuTexture(state: WgpuRenderState, texture: Readonly<TextureLike>, premultiply?: boolean, workingColorSpace?: RenderTargetColorSpace): WgpuTextureEntry | null;
9
+ //# sourceMappingURL=wgpuTextureResolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuTextureResolver.d.ts","sourceRoot":"","sources":["../src/wgpuTextureResolver.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,sBAAsB,EAMtB,iBAAiB,EACjB,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACpB,MAAM,0BAA0B,CAAC;AAclC,wBAAgB,oCAAoC,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAIjF;AAED,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAE9E;AAED,wBAAgB,0CAA0C,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAEvF;AAED,wBAAgB,gCAAgC,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAE7E;AAED,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAE9E;AAID,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,eAAe,EACtB,UAAU,EAAE,iBAAiB,EAC7B,QAAQ,EAAE,mBAAmB,GAAG,IAAI,GACnC,IAAI,CAON;AAKD,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,eAAe,EACtB,OAAO,EAAE,QAAQ,CAAC,WAAW,CAAC,EAC9B,WAAW,UAAQ,EACnB,iBAAiB,GAAE,sBAAiC,GACnD,gBAAgB,GAAG,IAAI,CAUzB"}
@@ -0,0 +1,68 @@
1
+ import { withoutRegistryTableEntry, withRegistryTableEntry } from '@flighthq/registry/contract';
2
+ import { getTextureSampleColorSpace, getTextureSource, getTextureSourceKind } from '@flighthq/texture/contract';
3
+ import { BitmapTextureSourceKind, CompressedImageTextureSourceKind, ImageTextureSourceKind, RenderRegistry, RegistryEntryState, RenderTargetTextureSourceKind, } from '@flighthq/types/contract';
4
+ import { bindWgpuBitmapTexture, bindWgpuCompressedImageTexture, bindWgpuImageResourceTexture } from './wgpuDraw';
5
+ import { getWgpuRenderStateRuntime } from './wgpuRenderState';
6
+ import { bindWgpuRenderTexture } from './wgpuRenderTexture';
7
+ export function registerStandardWgpuTextureResolvers(state) {
8
+ registerWgpuBitmapTextureResolver(state);
9
+ registerWgpuImageTextureResolver(state);
10
+ registerWgpuRenderTextureResolver(state);
11
+ }
12
+ export function registerWgpuBitmapTextureResolver(state) {
13
+ registerWgpuTextureResolver(state, BitmapTextureSourceKind, resolveWgpuBitmapTexture);
14
+ }
15
+ export function registerWgpuCompressedImageTextureResolver(state) {
16
+ registerWgpuTextureResolver(state, CompressedImageTextureSourceKind, resolveWgpuCompressedImageTexture);
17
+ }
18
+ export function registerWgpuImageTextureResolver(state) {
19
+ registerWgpuTextureResolver(state, ImageTextureSourceKind, resolveWgpuImageTexture);
20
+ }
21
+ export function registerWgpuRenderTextureResolver(state) {
22
+ registerWgpuTextureResolver(state, RenderTargetTextureSourceKind, resolveWgpuRenderTexture);
23
+ }
24
+ // Registers or replaces one declared source-kind resolver on this render state. The persistent table
25
+ // replacement is last-write-wins; passing null removes the key.
26
+ export function registerWgpuTextureResolver(state, sourceKind, resolver) {
27
+ const runtime = getWgpuRenderStateRuntime(state);
28
+ const table = runtime.registries.textureResolvers;
29
+ runtime.registries.textureResolvers =
30
+ resolver === null
31
+ ? withoutRegistryTableEntry(table, sourceKind)
32
+ : withRegistryTableEntry(table, sourceKind, resolver);
33
+ }
34
+ // Resolves through one keyed lookup using the source's declared kind. Resolution may realize, upload,
35
+ // and cache the GPU entry, but unlike the GL twin it does not bind command-pass state; the draw caller
36
+ // binds the returned entry's group explicitly.
37
+ export function resolveWgpuTexture(state, texture, premultiply = false, workingColorSpace = 'linear') {
38
+ const sourceKind = getTextureSourceKind(texture);
39
+ if (sourceKind === null)
40
+ return null;
41
+ const runtime = getWgpuRenderStateRuntime(state);
42
+ const entry = runtime.registries.textureResolvers.entries.get(sourceKind);
43
+ if (entry?.state !== RegistryEntryState.Bound) {
44
+ runtime.registryMiss?.(RenderRegistry.TextureResolver, sourceKind);
45
+ return null;
46
+ }
47
+ return entry.value(state, texture, premultiply, getTextureSampleColorSpace(texture.colorSpace, workingColorSpace));
48
+ }
49
+ function resolveWgpuBitmapTexture(state, texture, premultiply, colorSpace) {
50
+ const bitmap = getTextureSource(texture);
51
+ return bitmap === null
52
+ ? null
53
+ : bindWgpuBitmapTexture(state, bitmap, texture.sampler.mipmaps, premultiply, colorSpace);
54
+ }
55
+ function resolveWgpuCompressedImageTexture(state, texture, _premultiply, colorSpace) {
56
+ const image = getTextureSource(texture);
57
+ return image === null ? null : bindWgpuCompressedImageTexture(state, image, colorSpace);
58
+ }
59
+ function resolveWgpuImageTexture(state, texture, premultiply, colorSpace) {
60
+ const image = getTextureSource(texture);
61
+ return image === null
62
+ ? null
63
+ : bindWgpuImageResourceTexture(state, image, texture.sampler.mipmaps, premultiply, colorSpace);
64
+ }
65
+ function resolveWgpuRenderTexture(state, texture) {
66
+ return bindWgpuRenderTexture(state, texture);
67
+ }
68
+ //# sourceMappingURL=wgpuTextureResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuTextureResolver.js","sourceRoot":"","sources":["../src/wgpuTextureResolver.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import type { ImageResource } from '@flighthq/types/contract';
1
+ import type { Image } from '@flighthq/types/contract';
2
2
  export declare function uploadWgpuTextureData(device: GPUDevice, texture: GPUTexture, origin: GPUOrigin3D, width: number, height: number, data: Readonly<Uint8ClampedArray<ArrayBuffer>>): void;
3
3
  export declare function uploadWgpuTextureElement(device: GPUDevice, texture: GPUTexture, origin: GPUOrigin3D, width: number, height: number, source: GPUCopyExternalImageSource): void;
4
- export declare function uploadWgpuTextureImageResource(device: GPUDevice, texture: GPUTexture, origin: GPUOrigin3D, image: Readonly<ImageResource>): void;
4
+ export declare function uploadWgpuTextureImageResource(device: GPUDevice, texture: GPUTexture, origin: GPUOrigin3D, image: Readonly<Image>): void;
5
5
  //# sourceMappingURL=wgpuTextureUpload.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"wgpuTextureUpload.d.ts","sourceRoot":"","sources":["../src/wgpuTextureUpload.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAS9D,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,UAAU,EACnB,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,QAAQ,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,GAC7C,IAAI,CAON;AAID,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,UAAU,EACnB,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,0BAA0B,GACjC,IAAI,CAEN;AAID,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,UAAU,EACnB,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,QAAQ,CAAC,aAAa,CAAC,GAC7B,IAAI,CAaN"}
1
+ {"version":3,"file":"wgpuTextureUpload.d.ts","sourceRoot":"","sources":["../src/wgpuTextureUpload.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAWtD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,UAAU,EACnB,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,QAAQ,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,GAC7C,IAAI,CAON;AAID,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,UAAU,EACnB,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,0BAA0B,GACjC,IAAI,CAEN;AAGD,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,UAAU,EACnB,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,GACrB,IAAI,CASN"}
@@ -1,25 +1,20 @@
1
+ import { tryCopyWgpuExternalImageToTexture } from './wgpuExternalImageSource';
1
2
  // Texel-upload primitives for one texture region. Each writes into `texture` at `origin` (the [x, y, z]
2
3
  // where z selects a cube-array layer / cube face). The wgpu mirror of render-gl's glTextureUpload; the
3
4
  // caller owns texture creation and format.
4
5
  // Uploads rgba8 CPU pixels through queue.writeTexture — the portable bedrock upload, reimplemented 1:1 by
5
6
  // a native backend. `bytesPerRow` is width*4: a tightly-packed rgba8unorm (4 bytes/texel) region, which is
6
- // exactly what a Surface's `data` holds.
7
+ // exactly what a Bitmap's `data` holds.
7
8
  export function uploadWgpuTextureData(device, texture, origin, width, height, data) {
8
9
  device.queue.writeTexture({ texture, origin }, data, { bytesPerRow: width * 4, rowsPerImage: height }, [width, height, 1]);
9
10
  }
10
11
  // Uploads a decoded DOM element through queue.copyExternalImageToTexture — the web fast-path (GPU-side
11
12
  // copy, no CPU staging). Absent on non-web hosts.
12
13
  export function uploadWgpuTextureElement(device, texture, origin, width, height, source) {
13
- device.queue.copyExternalImageToTexture({ source }, { texture, origin }, [width, height, 1]);
14
+ tryCopyWgpuExternalImageToTexture(device.queue, { source }, { texture, origin }, width, height);
14
15
  }
15
- // Dispatches an ImageResource to the element fast-path when a decoded `source` is present, else the
16
- // portable `data` path (a generated Surface). Assumes the resource has pixels in at least one form.
16
+ // Uploads a host-backed Image through the decoded-element fast path.
17
17
  export function uploadWgpuTextureImageResource(device, texture, origin, image) {
18
- if (image.source !== null) {
19
- uploadWgpuTextureElement(device, texture, origin, image.width, image.height, image.source);
20
- }
21
- else {
22
- uploadWgpuTextureData(device, texture, origin, image.width, image.height, image.data);
23
- }
18
+ uploadWgpuTextureElement(device, texture, origin, image.width, image.height, image.source);
24
19
  }
25
20
  //# sourceMappingURL=wgpuTextureUpload.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"wgpuTextureUpload.js","sourceRoot":"","sources":["../src/wgpuTextureUpload.ts"],"names":[],"mappings":"AAEA,wGAAwG;AACxG,uGAAuG;AACvG,2CAA2C;AAE3C,0GAA0G;AAC1G,2GAA2G;AAC3G,yCAAyC;AACzC,MAAM,UAAU,qBAAqB,CACnC,MAAiB,EACjB,OAAmB,EACnB,MAAmB,EACnB,KAAa,EACb,MAAc,EACd,IAA8C;IAE9C,MAAM,CAAC,KAAK,CAAC,YAAY,CACvB,EAAE,OAAO,EAAE,MAAM,EAAE,EACnB,IAAsC,EACtC,EAAE,WAAW,EAAE,KAAK,GAAG,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,EAChD,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CACnB,CAAC;AACJ,CAAC;AAED,uGAAuG;AACvG,kDAAkD;AAClD,MAAM,UAAU,wBAAwB,CACtC,MAAiB,EACjB,OAAmB,EACnB,MAAmB,EACnB,KAAa,EACb,MAAc,EACd,MAAkC;IAElC,MAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/F,CAAC;AAED,oGAAoG;AACpG,oGAAoG;AACpG,MAAM,UAAU,8BAA8B,CAC5C,MAAiB,EACjB,OAAmB,EACnB,MAAmB,EACnB,KAA8B;IAE9B,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QAC1B,wBAAwB,CACtB,MAAM,EACN,OAAO,EACP,MAAM,EACN,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,MAAM,EACZ,KAAK,CAAC,MAAoC,CAC3C,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,qBAAqB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAK,CAAC,CAAC;IACzF,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"wgpuTextureUpload.js","sourceRoot":"","sources":["../src/wgpuTextureUpload.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iCAAiC,EAAE,MAAM,2BAA2B,CAAC;AAE9E,wGAAwG;AACxG,uGAAuG;AACvG,2CAA2C;AAE3C,0GAA0G;AAC1G,2GAA2G;AAC3G,wCAAwC;AACxC,MAAM,UAAU,qBAAqB,CACnC,MAAiB,EACjB,OAAmB,EACnB,MAAmB,EACnB,KAAa,EACb,MAAc,EACd,IAA8C;IAE9C,MAAM,CAAC,KAAK,CAAC,YAAY,CACvB,EAAE,OAAO,EAAE,MAAM,EAAE,EACnB,IAAsC,EACtC,EAAE,WAAW,EAAE,KAAK,GAAG,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,EAChD,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CACnB,CAAC;AACJ,CAAC;AAED,uGAAuG;AACvG,kDAAkD;AAClD,MAAM,UAAU,wBAAwB,CACtC,MAAiB,EACjB,OAAmB,EACnB,MAAmB,EACnB,KAAa,EACb,MAAc,EACd,MAAkC;IAElC,iCAAiC,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AAClG,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,8BAA8B,CAC5C,MAAiB,EACjB,OAAmB,EACnB,MAAmB,EACnB,KAAsB;IAEtB,wBAAwB,CACtB,MAAM,EACN,OAAO,EACP,MAAM,EACN,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,MAAM,EACZ,KAAK,CAAC,MAAoC,CAC3C,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "name": "@flighthq/render-wgpu",
3
- "version": "0.3.0-next.906.07cea63",
3
+ "version": "0.3.1-next.1041.35b950c",
4
+ "author": "Joshua Granick and other contributors",
5
+ "license": "MIT",
4
6
  "repository": {
5
7
  "type": "git",
6
8
  "url": "https://github.com/flighthq/flight.git",
@@ -36,12 +38,20 @@
36
38
  "clean:dist": "tsx ../../scripts/clean-package-dist.ts"
37
39
  },
38
40
  "dependencies": {
39
- "@flighthq/color": "0.3.0-next.906.07cea63",
40
- "@flighthq/scene2d": "0.3.0-next.906.07cea63",
41
- "@flighthq/geometry": "0.3.0-next.906.07cea63",
42
- "@flighthq/render": "0.3.0-next.906.07cea63",
43
- "@flighthq/surface": "0.3.0-next.906.07cea63",
44
- "@flighthq/types": "0.3.0-next.906.07cea63"
41
+ "@flighthq/color": "0.3.1-next.1041.35b950c",
42
+ "@flighthq/entity": "0.3.1-next.1041.35b950c",
43
+ "@flighthq/scene2d": "0.3.1-next.1041.35b950c",
44
+ "@flighthq/geometry": "0.3.1-next.1041.35b950c",
45
+ "@flighthq/log": "0.3.1-next.1041.35b950c",
46
+ "@flighthq/render": "0.3.1-next.1041.35b950c",
47
+ "@flighthq/registry": "0.3.1-next.1041.35b950c",
48
+ "@flighthq/signals": "0.3.1-next.1041.35b950c",
49
+ "@flighthq/bitmap": "0.3.1-next.1041.35b950c",
50
+ "@flighthq/texture": "0.3.1-next.1041.35b950c",
51
+ "@flighthq/types": "0.3.1-next.1041.35b950c"
52
+ },
53
+ "peerDependencies": {
54
+ "@webgpu/types": "^0.1.70"
45
55
  },
46
56
  "devDependencies": {
47
57
  "@webgpu/types": "*",
@@ -0,0 +1,65 @@
1
+ import { addLogSink, createMemoryLogSink, getMemoryLogSinkEntries, removeLogSink } from '@flighthq/log/contract';
2
+ import { createTexture } from '@flighthq/texture/contract';
3
+ import type { Image } from '@flighthq/types/contract';
4
+
5
+ import {
6
+ areWgpuTextureResolverGuardsEnabled,
7
+ enableWgpuTextureResolverGuards,
8
+ } from './enableWgpuTextureResolverGuards';
9
+ import { createWgpuRenderStateForTest, installWgpuMock } from './wgpuTestHelper';
10
+ import { registerWgpuTextureResolver, resolveWgpuTexture } from './wgpuTextureResolver';
11
+
12
+ beforeAll(() => {
13
+ installWgpuMock();
14
+ });
15
+
16
+ describe('areWgpuTextureResolverGuardsEnabled', () => {
17
+ it('reports whether diagnostics were installed for the state', async () => {
18
+ const state = await createWgpuRenderStateForTest();
19
+ expect(areWgpuTextureResolverGuardsEnabled(state)).toBe(false);
20
+
21
+ enableWgpuTextureResolverGuards(state);
22
+ expect(areWgpuTextureResolverGuardsEnabled(state)).toBe(true);
23
+ });
24
+ });
25
+
26
+ describe('enableWgpuTextureResolverGuards', () => {
27
+ it('is idempotent', async () => {
28
+ const state = await createWgpuRenderStateForTest();
29
+ enableWgpuTextureResolverGuards(state);
30
+ enableWgpuTextureResolverGuards(state);
31
+ expect(areWgpuTextureResolverGuardsEnabled(state)).toBe(true);
32
+ });
33
+
34
+ it('warns once for a missing resolver and stays silent for a registered resolver returning null', async () => {
35
+ const state = await createWgpuRenderStateForTest();
36
+ const missing = textureWithKind('acme.missing.wgpu');
37
+ const registered = textureWithKind('acme.registered.wgpu');
38
+ const sink = createMemoryLogSink(4);
39
+ addLogSink(sink.sink);
40
+ enableWgpuTextureResolverGuards(state);
41
+ registerWgpuTextureResolver(state, 'acme.registered.wgpu', () => null);
42
+ try {
43
+ expect(resolveWgpuTexture(state, missing)).toBeNull();
44
+ expect(resolveWgpuTexture(state, missing)).toBeNull();
45
+ expect(resolveWgpuTexture(state, registered)).toBeNull();
46
+
47
+ const entries = getMemoryLogSinkEntries(sink);
48
+ expect(entries).toHaveLength(1);
49
+ expect(entries[0]?.data).toMatchObject({
50
+ kind: 'acme.missing.wgpu',
51
+ message:
52
+ 'resolveWgpuTexture: texture source kind has no registered resolver — call registerWgpuTextureResolver(state, sourceKind, resolver)',
53
+ });
54
+ } finally {
55
+ removeLogSink(sink.sink);
56
+ }
57
+ });
58
+ });
59
+
60
+ function textureWithKind(kind: string) {
61
+ return createTexture({
62
+ dimension: '2d',
63
+ source: { kind } as Image,
64
+ });
65
+ }
@@ -0,0 +1,36 @@
1
+ import { createEntity } from '@flighthq/entity/contract';
2
+ import { createTexture } from '@flighthq/texture/contract';
3
+ import type { TextureSource } from '@flighthq/types/contract';
4
+
5
+ import { explainWgpuTextureResolution } from './explainWgpuTextureResolution';
6
+ import { createWgpuRenderStateForTest, installWgpuMock } from './wgpuTestHelper';
7
+ import { registerWgpuTextureResolver } from './wgpuTextureResolver';
8
+
9
+ beforeAll(() => {
10
+ installWgpuMock();
11
+ });
12
+
13
+ describe('explainWgpuTextureResolution', () => {
14
+ it('distinguishes missing kinds, missing resolvers, and registered resolvers', async () => {
15
+ const state = await createWgpuRenderStateForTest();
16
+ const texture = createTexture({
17
+ dimension: '2d',
18
+ source: createEntity({ height: 1, kind: 'acme.test', version: 0, width: 1 }) as TextureSource,
19
+ });
20
+
21
+ expect(explainWgpuTextureResolution(state, createTexture())).toEqual({
22
+ kind: null,
23
+ status: 'missing-kind',
24
+ });
25
+ expect(explainWgpuTextureResolution(state, texture)).toEqual({
26
+ kind: 'acme.test',
27
+ status: 'missing-resolver',
28
+ });
29
+
30
+ registerWgpuTextureResolver(state, 'acme.test', () => null);
31
+ expect(explainWgpuTextureResolution(state, texture)).toEqual({
32
+ kind: 'acme.test',
33
+ status: 'registered',
34
+ });
35
+ });
36
+ });
@@ -1,4 +1,10 @@
1
- import { beginWgpuFrame, renderWgpuBackground, submitWgpuRenderPass } from './wgpuBackground';
1
+ import {
2
+ beginWgpuFrame,
3
+ renderWgpuBackground,
4
+ retireWgpuBuffer,
5
+ retireWgpuTexture,
6
+ submitWgpuRenderPass,
7
+ } from './wgpuBackground';
2
8
  import { getWgpuRenderStateRuntime } from './wgpuRenderState';
3
9
  import { createWgpuRenderStateForTest, installWgpuMock } from './wgpuTestHelper';
4
10
 
@@ -63,6 +69,33 @@ describe('renderWgpuBackground', () => {
63
69
  });
64
70
  });
65
71
 
72
+ describe('retireWgpuBuffer', () => {
73
+ it('queues the buffer for post-submit destruction instead of destroying it now', async () => {
74
+ const state = await createWgpuRenderStateForTest();
75
+ const destroy = vi.fn();
76
+ const buffer = { destroy } as unknown as GPUBuffer;
77
+
78
+ retireWgpuBuffer(state, buffer);
79
+
80
+ expect(destroy).not.toHaveBeenCalled();
81
+ expect(getWgpuRenderStateRuntime(state).retiredBuffers).toContain(buffer);
82
+ });
83
+ });
84
+
85
+ describe('retireWgpuTexture', () => {
86
+ it('queues the texture for post-submit destruction instead of destroying it now', async () => {
87
+ const state = await createWgpuRenderStateForTest();
88
+ const destroy = vi.fn();
89
+ const texture = { destroy } as unknown as GPUTexture;
90
+
91
+ retireWgpuTexture(state, texture);
92
+
93
+ // Nothing is freed while the frame is still recording — that is the whole reason this seam exists.
94
+ expect(destroy).not.toHaveBeenCalled();
95
+ expect(getWgpuRenderStateRuntime(state).retiredTextures).toContain(texture);
96
+ });
97
+ });
98
+
66
99
  describe('submitWgpuRenderPass', () => {
67
100
  it('clears commandEncoder after submit', async () => {
68
101
  const state = await createWgpuRenderStateForTest();