@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.
- package/dist/contract.d.ts +7 -1
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js +7 -1
- package/dist/contract.js.map +1 -1
- package/dist/enableWgpuTextureResolverGuards.d.ts +4 -0
- package/dist/enableWgpuTextureResolverGuards.d.ts.map +1 -0
- package/dist/enableWgpuTextureResolverGuards.js +8 -0
- package/dist/enableWgpuTextureResolverGuards.js.map +1 -0
- package/dist/explainWgpuTextureResolution.d.ts +3 -0
- package/dist/explainWgpuTextureResolution.d.ts.map +1 -0
- package/dist/explainWgpuTextureResolution.js +15 -0
- package/dist/explainWgpuTextureResolution.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/wgpuBackground.d.ts +2 -0
- package/dist/wgpuBackground.d.ts.map +1 -1
- package/dist/wgpuBackground.js +30 -2
- package/dist/wgpuBackground.js.map +1 -1
- package/dist/wgpuCompressedTexture.d.ts +2 -2
- package/dist/wgpuCompressedTexture.d.ts.map +1 -1
- package/dist/wgpuCompressedTexture.js +52 -13
- package/dist/wgpuCompressedTexture.js.map +1 -1
- package/dist/wgpuDraw.d.ts +6 -4
- package/dist/wgpuDraw.d.ts.map +1 -1
- package/dist/wgpuDraw.js +150 -69
- package/dist/wgpuDraw.js.map +1 -1
- package/dist/wgpuExternalImageSource.d.ts +3 -0
- package/dist/wgpuExternalImageSource.d.ts.map +1 -0
- package/dist/wgpuExternalImageSource.js +51 -0
- package/dist/wgpuExternalImageSource.js.map +1 -0
- package/dist/wgpuExternalTexture.d.ts +4 -0
- package/dist/wgpuExternalTexture.d.ts.map +1 -0
- package/dist/wgpuExternalTexture.js +62 -0
- package/dist/wgpuExternalTexture.js.map +1 -0
- package/dist/wgpuMaterialRegistry.d.ts.map +1 -1
- package/dist/wgpuMaterialRegistry.js +17 -12
- package/dist/wgpuMaterialRegistry.js.map +1 -1
- package/dist/wgpuMipmap.d.ts.map +1 -1
- package/dist/wgpuMipmap.js +11 -9
- package/dist/wgpuMipmap.js.map +1 -1
- package/dist/wgpuRenderState.d.ts +15 -3
- package/dist/wgpuRenderState.d.ts.map +1 -1
- package/dist/wgpuRenderState.js +253 -33
- package/dist/wgpuRenderState.js.map +1 -1
- package/dist/wgpuRenderTarget.d.ts.map +1 -1
- package/dist/wgpuRenderTarget.js +2 -0
- package/dist/wgpuRenderTarget.js.map +1 -1
- package/dist/wgpuRenderTexture.d.ts +15 -0
- package/dist/wgpuRenderTexture.d.ts.map +1 -0
- package/dist/wgpuRenderTexture.js +130 -0
- package/dist/wgpuRenderTexture.js.map +1 -0
- package/dist/wgpuRenderTexturePool.d.ts +7 -0
- package/dist/wgpuRenderTexturePool.d.ts.map +1 -0
- package/dist/wgpuRenderTexturePool.js +86 -0
- package/dist/wgpuRenderTexturePool.js.map +1 -0
- package/dist/wgpuShader.d.ts.map +1 -1
- package/dist/wgpuShader.js +5 -1
- package/dist/wgpuShader.js.map +1 -1
- package/dist/wgpuSurface.d.ts +2 -2
- package/dist/wgpuSurface.d.ts.map +1 -1
- package/dist/wgpuSurface.js +61 -13
- package/dist/wgpuSurface.js.map +1 -1
- package/dist/wgpuTestHelper.d.ts +1 -0
- package/dist/wgpuTestHelper.d.ts.map +1 -1
- package/dist/wgpuTestHelper.js +125 -8
- package/dist/wgpuTestHelper.js.map +1 -1
- package/dist/wgpuTextureResolver.d.ts +9 -0
- package/dist/wgpuTextureResolver.d.ts.map +1 -0
- package/dist/wgpuTextureResolver.js +68 -0
- package/dist/wgpuTextureResolver.js.map +1 -0
- package/dist/wgpuTextureUpload.d.ts +2 -2
- package/dist/wgpuTextureUpload.d.ts.map +1 -1
- package/dist/wgpuTextureUpload.js +5 -10
- package/dist/wgpuTextureUpload.js.map +1 -1
- package/package.json +17 -7
- package/src/enableWgpuTextureResolverGuards.test.ts +65 -0
- package/src/explainWgpuTextureResolution.test.ts +36 -0
- package/src/wgpuBackground.test.ts +34 -1
- package/src/wgpuCompressedTexture.test.ts +35 -40
- package/src/wgpuDraw.test.ts +180 -62
- package/src/wgpuExternalImageSource.test.ts +89 -0
- package/src/wgpuExternalTexture.test.ts +35 -0
- package/src/wgpuMaterialRegistry.test.ts +44 -3
- package/src/wgpuMipmap.test.ts +10 -2
- package/src/wgpuRenderState.test.ts +462 -12
- package/src/wgpuRenderTarget.test.ts +14 -0
- package/src/wgpuRenderTexture.test.ts +165 -0
- package/src/wgpuRenderTexturePool.test.ts +146 -0
- package/src/wgpuShaderBinding.test.ts +6 -6
- package/src/wgpuSurface.test.ts +95 -3
- package/src/wgpuTestHelper.test.ts +64 -0
- package/src/wgpuTextureResolver.test.ts +212 -0
- package/src/wgpuTextureUpload.test.ts +28 -13
package/dist/wgpuTestHelper.js
CHANGED
|
@@ -37,13 +37,26 @@ function makeBindGroup() {
|
|
|
37
37
|
function makeBindGroupLayout() {
|
|
38
38
|
return {};
|
|
39
39
|
}
|
|
40
|
-
function makeBuffer() {
|
|
41
|
-
return {
|
|
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":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,8FAA8F;AAC9F,SAAS,oBAAoB;IAC3B,MAAM,CAAC,GAAG,UAAqC,CAAC;IAEhD,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACzB,CAAC,CAAC,gBAAgB,CAAC,GAAG;YACpB,QAAQ,EAAE,CAAC;YACX,SAAS,EAAE,CAAC;YACZ,QAAQ,EAAE,CAAC;YACX,QAAQ,EAAE,CAAC;YACX,KAAK,EAAE,EAAE;YACT,MAAM,EAAE,EAAE;YACV,OAAO,EAAE,EAAE;YACX,OAAO,EAAE,GAAG;YACZ,QAAQ,EAAE,GAAG;YACb,aAAa,EAAE,GAAG;SACnB,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC1B,CAAC,CAAC,iBAAiB,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAC;IACrH,CAAC;IACD,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACzB,CAAC,CAAC,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IAC/D,CAAC;IACD,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC;QACxB,CAAC,CAAC,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;IACxE,CAAC;IACD,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC;QACrB,CAAC,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAC1C,CAAC;AACH,CAAC;AAED,iDAAiD;AACjD,iFAAiF;AAEjF,SAAS,aAAa;IACpB,OAAO,EAAkB,CAAC;AAC5B,CAAC;AAED,SAAS,mBAAmB;IAC1B,OAAO,EAAwB,CAAC;AAClC,CAAC;AAED,SAAS,UAAU;
|
|
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 {
|
|
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<
|
|
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,
|
|
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
|
|
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
|
|
14
|
+
tryCopyWgpuExternalImageToTexture(device.queue, { source }, { texture, origin }, width, height);
|
|
14
15
|
}
|
|
15
|
-
//
|
|
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
|
-
|
|
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,
|
|
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.
|
|
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.
|
|
40
|
-
"@flighthq/
|
|
41
|
-
"@flighthq/
|
|
42
|
-
"@flighthq/
|
|
43
|
-
"@flighthq/
|
|
44
|
-
"@flighthq/
|
|
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 {
|
|
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();
|