@flighthq/render-wgpu 0.2.1-next.841.373388f → 0.3.0-next.1032.e2b99fc
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 +22 -0
- package/dist/contract.d.ts.map +1 -0
- package/dist/contract.js +22 -0
- package/dist/contract.js.map +1 -0
- package/dist/index.d.ts +1 -18
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -18
- package/dist/index.js.map +1 -1
- package/dist/wgpuAdapterCapabilities.d.ts +1 -1
- package/dist/wgpuAdapterCapabilities.d.ts.map +1 -1
- package/dist/wgpuBackground.d.ts +1 -1
- package/dist/wgpuBackground.d.ts.map +1 -1
- package/dist/wgpuBackground.js +2 -2
- package/dist/wgpuBackground.js.map +1 -1
- package/dist/wgpuCompressedTexture.d.ts +1 -1
- package/dist/wgpuCompressedTexture.d.ts.map +1 -1
- package/dist/wgpuCompressedTexture.js +4 -7
- package/dist/wgpuCompressedTexture.js.map +1 -1
- package/dist/wgpuDraw.d.ts +7 -5
- package/dist/wgpuDraw.d.ts.map +1 -1
- package/dist/wgpuDraw.js +76 -56
- package/dist/wgpuDraw.js.map +1 -1
- package/dist/wgpuExternalTexture.d.ts +4 -0
- package/dist/wgpuExternalTexture.d.ts.map +1 -0
- package/dist/wgpuExternalTexture.js +58 -0
- package/dist/wgpuExternalTexture.js.map +1 -0
- package/dist/wgpuFullscreenPass.d.ts +1 -1
- package/dist/wgpuFullscreenPass.d.ts.map +1 -1
- package/dist/wgpuMaterialRegistry.d.ts +1 -1
- package/dist/wgpuMaterialRegistry.d.ts.map +1 -1
- package/dist/wgpuMaterialRegistry.js +3 -3
- package/dist/wgpuMaterialRegistry.js.map +1 -1
- package/dist/wgpuMipmap.d.ts +1 -1
- package/dist/wgpuMipmap.d.ts.map +1 -1
- package/dist/wgpuRenderState.d.ts +1 -1
- package/dist/wgpuRenderState.d.ts.map +1 -1
- package/dist/wgpuRenderState.js +22 -21
- package/dist/wgpuRenderState.js.map +1 -1
- package/dist/wgpuRenderTarget.d.ts +1 -1
- package/dist/wgpuRenderTarget.d.ts.map +1 -1
- package/dist/wgpuRenderTarget.js +4 -2
- package/dist/wgpuRenderTarget.js.map +1 -1
- package/dist/wgpuRenderTargetPool.d.ts +1 -1
- package/dist/wgpuRenderTargetPool.d.ts.map +1 -1
- package/dist/wgpuRenderTargetPool.js.map +1 -1
- package/dist/wgpuRenderTexture.d.ts +10 -0
- package/dist/wgpuRenderTexture.d.ts.map +1 -0
- package/dist/wgpuRenderTexture.js +73 -0
- package/dist/wgpuRenderTexture.js.map +1 -0
- package/dist/wgpuScissor.d.ts +1 -1
- package/dist/wgpuScissor.d.ts.map +1 -1
- package/dist/wgpuShader.d.ts +3 -3
- package/dist/wgpuShader.d.ts.map +1 -1
- package/dist/wgpuShader.js +28 -28
- package/dist/wgpuShader.js.map +1 -1
- package/dist/wgpuShaderBinding.d.ts +1 -1
- package/dist/wgpuShaderBinding.d.ts.map +1 -1
- package/dist/wgpuShaderBinding.js +1 -1
- package/dist/wgpuShaderBinding.js.map +1 -1
- package/dist/wgpuShaderRegistry.d.ts +1 -1
- package/dist/wgpuShaderRegistry.d.ts.map +1 -1
- package/dist/wgpuShaderRegistry.js +1 -1
- package/dist/wgpuShaderRegistry.js.map +1 -1
- package/dist/wgpuSurface.d.ts +2 -2
- package/dist/wgpuSurface.d.ts.map +1 -1
- package/dist/wgpuSurface.js +12 -12
- package/dist/wgpuSurface.js.map +1 -1
- package/dist/wgpuTestHelper.d.ts +1 -1
- package/dist/wgpuTestHelper.d.ts.map +1 -1
- package/dist/wgpuTextureResolver.d.ts +9 -0
- package/dist/wgpuTextureResolver.d.ts.map +1 -0
- package/dist/wgpuTextureResolver.js +61 -0
- package/dist/wgpuTextureResolver.js.map +1 -0
- package/dist/wgpuTextureUpload.d.ts +1 -1
- package/dist/wgpuTextureUpload.d.ts.map +1 -1
- package/dist/wgpuTextureUpload.js +3 -9
- package/dist/wgpuTextureUpload.js.map +1 -1
- package/package.json +12 -7
- package/src/wgpuCompressedTexture.test.ts +18 -35
- package/src/wgpuDraw.test.ts +111 -65
- package/src/wgpuExternalTexture.test.ts +35 -0
- package/src/wgpuMaterialRegistry.test.ts +4 -4
- package/src/wgpuMipmap.test.ts +1 -1
- package/src/wgpuRenderTarget.test.ts +15 -1
- package/src/wgpuRenderTexture.test.ts +99 -0
- package/src/wgpuShader.test.ts +8 -8
- package/src/wgpuShaderBinding.test.ts +8 -8
- package/src/wgpuShaderRegistry.test.ts +1 -1
- package/src/wgpuSurface.test.ts +3 -3
- package/src/wgpuTextureResolver.test.ts +156 -0
- package/src/wgpuTextureUpload.test.ts +2 -12
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { getOrCreateRenderProxy2D } from '@flighthq/render';
|
|
2
|
-
import {
|
|
3
|
-
import type { WgpuBitmapShader } from '@flighthq/types';
|
|
1
|
+
import { getOrCreateRenderProxy2D } from '@flighthq/render/contract';
|
|
2
|
+
import { createSprite } from '@flighthq/scene2d/contract';
|
|
3
|
+
import type { WgpuBitmapShader } from '@flighthq/types/contract';
|
|
4
4
|
|
|
5
5
|
import { getWgpuRenderStateRuntime } from './wgpuRenderState';
|
|
6
6
|
import { getWgpuShader, resolveWgpuShader, setWgpuShader } from './wgpuShaderBinding';
|
|
@@ -13,7 +13,7 @@ beforeAll(() => {
|
|
|
13
13
|
describe('getWgpuShader', () => {
|
|
14
14
|
it('returns undefined when no shader is bound', async () => {
|
|
15
15
|
const state = await createWgpuRenderStateForTest();
|
|
16
|
-
const bitmap =
|
|
16
|
+
const bitmap = createSprite();
|
|
17
17
|
const renderProxy = getOrCreateRenderProxy2D(state, bitmap);
|
|
18
18
|
expect(getWgpuShader(renderProxy)).toBeUndefined();
|
|
19
19
|
});
|
|
@@ -22,7 +22,7 @@ describe('getWgpuShader', () => {
|
|
|
22
22
|
describe('resolveWgpuShader', () => {
|
|
23
23
|
it('returns null when no shader feature is enabled', async () => {
|
|
24
24
|
const state = await createWgpuRenderStateForTest();
|
|
25
|
-
const bitmap =
|
|
25
|
+
const bitmap = createSprite();
|
|
26
26
|
const renderProxy = getOrCreateRenderProxy2D(state, bitmap);
|
|
27
27
|
expect(resolveWgpuShader(state, renderProxy)).toBeNull();
|
|
28
28
|
});
|
|
@@ -31,7 +31,7 @@ describe('resolveWgpuShader', () => {
|
|
|
31
31
|
describe('setWgpuShader', () => {
|
|
32
32
|
it('binds a shader to a display object', async () => {
|
|
33
33
|
const state = await createWgpuRenderStateForTest();
|
|
34
|
-
const bitmap =
|
|
34
|
+
const bitmap = createSprite();
|
|
35
35
|
const fakeShader: WgpuBitmapShader = { pipeline: {} as never, bind: () => {} };
|
|
36
36
|
|
|
37
37
|
setWgpuShader(state, bitmap, fakeShader);
|
|
@@ -43,7 +43,7 @@ describe('setWgpuShader', () => {
|
|
|
43
43
|
it('installs the per-node shader binding resolver', async () => {
|
|
44
44
|
const state = await createWgpuRenderStateForTest();
|
|
45
45
|
const runtime = getWgpuRenderStateRuntime(state);
|
|
46
|
-
const bitmap =
|
|
46
|
+
const bitmap = createSprite();
|
|
47
47
|
const fakeShader: WgpuBitmapShader = { pipeline: {} as never, bind: () => {} };
|
|
48
48
|
expect(runtime.webgpuShaderBindingResolver).toBeUndefined();
|
|
49
49
|
setWgpuShader(state, bitmap, fakeShader);
|
|
@@ -52,7 +52,7 @@ describe('setWgpuShader', () => {
|
|
|
52
52
|
|
|
53
53
|
it('removes the binding when shader is null', async () => {
|
|
54
54
|
const state = await createWgpuRenderStateForTest();
|
|
55
|
-
const bitmap =
|
|
55
|
+
const bitmap = createSprite();
|
|
56
56
|
const fakeShader: WgpuBitmapShader = { pipeline: {} as never, bind: () => {} };
|
|
57
57
|
setWgpuShader(state, bitmap, fakeShader);
|
|
58
58
|
setWgpuShader(state, bitmap, null);
|
package/src/wgpuSurface.test.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { beforeAll, describe, expect, it } from 'vitest';
|
|
|
3
3
|
import { getWgpuRenderStateRuntime } from './wgpuRenderState';
|
|
4
4
|
import {
|
|
5
5
|
acquireWgpuFrameCaptureTexture,
|
|
6
|
-
|
|
6
|
+
createBitmapFromWgpuRenderState,
|
|
7
7
|
enableWgpuFrameCapture,
|
|
8
8
|
encodeWgpuFrameCapture,
|
|
9
9
|
} from './wgpuSurface';
|
|
@@ -22,10 +22,10 @@ describe('acquireWgpuFrameCaptureTexture', () => {
|
|
|
22
22
|
});
|
|
23
23
|
});
|
|
24
24
|
|
|
25
|
-
describe('
|
|
25
|
+
describe('createBitmapFromWgpuRenderState', () => {
|
|
26
26
|
it('throws when frame capture was never enabled (no buffer to read)', async () => {
|
|
27
27
|
const state = await createWgpuRenderStateForTest();
|
|
28
|
-
await expect(
|
|
28
|
+
await expect(createBitmapFromWgpuRenderState(state)).rejects.toThrow(/enableWgpuFrameCapture/);
|
|
29
29
|
});
|
|
30
30
|
});
|
|
31
31
|
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import type { ImageResource, RenderTexture, Texture } from '@flighthq/types/contract';
|
|
2
|
+
import {
|
|
3
|
+
BitmapTextureBackingKind,
|
|
4
|
+
CompressedImageTextureBackingKind,
|
|
5
|
+
ImageTextureBackingKind,
|
|
6
|
+
RenderTextureBackingKind,
|
|
7
|
+
VideoTextureBackingKind,
|
|
8
|
+
} from '@flighthq/types/contract';
|
|
9
|
+
|
|
10
|
+
import { renderWgpuBackground, submitWgpuRenderPass } from './wgpuBackground';
|
|
11
|
+
import { getWgpuRenderStateRuntime } from './wgpuRenderState';
|
|
12
|
+
import { renderIntoWgpuRenderTexture } from './wgpuRenderTexture';
|
|
13
|
+
import { createWgpuRenderStateForTest, installWgpuMock } from './wgpuTestHelper';
|
|
14
|
+
import {
|
|
15
|
+
registerWgpuImageTextureResolver,
|
|
16
|
+
registerWgpuBitmapTextureResolver,
|
|
17
|
+
registerWgpuCompressedImageTextureResolver,
|
|
18
|
+
registerWgpuRenderTextureResolver,
|
|
19
|
+
registerWgpuTextureResolver,
|
|
20
|
+
registerWgpuVideoTextureResolver,
|
|
21
|
+
resolveWgpuTexture,
|
|
22
|
+
} from './wgpuTextureResolver';
|
|
23
|
+
|
|
24
|
+
beforeAll(() => {
|
|
25
|
+
installWgpuMock();
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
function imageResource(
|
|
29
|
+
kind = ImageTextureBackingKind,
|
|
30
|
+
source: CanvasImageSource = document.createElement('canvas'),
|
|
31
|
+
): ImageResource {
|
|
32
|
+
return {
|
|
33
|
+
height: 4,
|
|
34
|
+
kind,
|
|
35
|
+
source,
|
|
36
|
+
version: 0,
|
|
37
|
+
width: 4,
|
|
38
|
+
} as unknown as ImageResource;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function textureWithImage(image: ImageResource | null): Texture {
|
|
42
|
+
return {
|
|
43
|
+
colorSpace: 'srgb',
|
|
44
|
+
flipX: false,
|
|
45
|
+
flipY: false,
|
|
46
|
+
sampler: {
|
|
47
|
+
anisotropy: 1,
|
|
48
|
+
magFilter: 'linear',
|
|
49
|
+
minFilter: 'linear',
|
|
50
|
+
mipmaps: false,
|
|
51
|
+
wrapU: 'clamp-to-edge',
|
|
52
|
+
wrapV: 'clamp-to-edge',
|
|
53
|
+
},
|
|
54
|
+
storage: { dimension: '2d', image },
|
|
55
|
+
uvOffset: { x: 0, y: 0 },
|
|
56
|
+
uvRotation: 0,
|
|
57
|
+
uvScale: { x: 1, y: 1 },
|
|
58
|
+
version: 0,
|
|
59
|
+
} as Texture;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function renderTexture(): RenderTexture {
|
|
63
|
+
const texture = textureWithImage(null);
|
|
64
|
+
texture.colorSpace = 'linear';
|
|
65
|
+
texture.storage.target = { height: 8, kind: RenderTextureBackingKind, width: 8 };
|
|
66
|
+
return texture as RenderTexture;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
describe('registerWgpuBitmapTextureResolver', () => {
|
|
70
|
+
it('registers only the Bitmap backing key', async () => {
|
|
71
|
+
const state = await createWgpuRenderStateForTest();
|
|
72
|
+
registerWgpuBitmapTextureResolver(state);
|
|
73
|
+
expect([...getWgpuRenderStateRuntime(state).wgpuTextureResolverRegistry!.keys()]).toEqual([
|
|
74
|
+
BitmapTextureBackingKind,
|
|
75
|
+
]);
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
describe('registerWgpuCompressedImageTextureResolver', () => {
|
|
80
|
+
it('registers only the CompressedImage backing key', async () => {
|
|
81
|
+
const state = await createWgpuRenderStateForTest();
|
|
82
|
+
registerWgpuCompressedImageTextureResolver(state);
|
|
83
|
+
expect([...getWgpuRenderStateRuntime(state).wgpuTextureResolverRegistry!.keys()]).toEqual([
|
|
84
|
+
CompressedImageTextureBackingKind,
|
|
85
|
+
]);
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
describe('registerWgpuImageTextureResolver', () => {
|
|
90
|
+
it('resolves and caches a declared still-image backing', async () => {
|
|
91
|
+
const state = await createWgpuRenderStateForTest();
|
|
92
|
+
const texture = textureWithImage(imageResource());
|
|
93
|
+
registerWgpuImageTextureResolver(state);
|
|
94
|
+
|
|
95
|
+
const first = resolveWgpuTexture(state, texture);
|
|
96
|
+
expect(first).not.toBeNull();
|
|
97
|
+
expect(resolveWgpuTexture(state, texture)).toBe(first);
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
describe('registerWgpuRenderTextureResolver', () => {
|
|
102
|
+
it('returns a render target only after it has been rendered', async () => {
|
|
103
|
+
const state = await createWgpuRenderStateForTest();
|
|
104
|
+
const texture = renderTexture();
|
|
105
|
+
registerWgpuRenderTextureResolver(state);
|
|
106
|
+
expect(resolveWgpuTexture(state, texture)).toBeNull();
|
|
107
|
+
|
|
108
|
+
renderWgpuBackground(state);
|
|
109
|
+
renderIntoWgpuRenderTexture(state, texture, () => {});
|
|
110
|
+
expect(resolveWgpuTexture(state, texture)).not.toBeNull();
|
|
111
|
+
submitWgpuRenderPass(state);
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
describe('registerWgpuTextureResolver', () => {
|
|
116
|
+
it('is state-scoped, last-write-wins by string kind, and removable', async () => {
|
|
117
|
+
const a = await createWgpuRenderStateForTest();
|
|
118
|
+
const b = await createWgpuRenderStateForTest();
|
|
119
|
+
const image = imageResource();
|
|
120
|
+
image.kind = 'acme.generated';
|
|
121
|
+
const texture = textureWithImage(image);
|
|
122
|
+
const first = vi.fn(() => ({ first: true }) as never);
|
|
123
|
+
const second = vi.fn(() => ({ second: true }) as never);
|
|
124
|
+
|
|
125
|
+
registerWgpuTextureResolver(a, image.kind, first);
|
|
126
|
+
expect(resolveWgpuTexture(a, texture)).toEqual({ first: true });
|
|
127
|
+
expect(resolveWgpuTexture(b, texture)).toBeNull();
|
|
128
|
+
|
|
129
|
+
registerWgpuTextureResolver(a, image.kind, second);
|
|
130
|
+
expect(resolveWgpuTexture(a, texture)).toEqual({ second: true });
|
|
131
|
+
|
|
132
|
+
registerWgpuTextureResolver(a, image.kind, null);
|
|
133
|
+
expect(resolveWgpuTexture(a, texture)).toBeNull();
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
describe('registerWgpuVideoTextureResolver', () => {
|
|
138
|
+
it('resolves a ready declared video backing without structural dispatch', async () => {
|
|
139
|
+
const state = await createWgpuRenderStateForTest();
|
|
140
|
+
const image = imageResource(VideoTextureBackingKind, {
|
|
141
|
+
readyState: 4,
|
|
142
|
+
videoHeight: 8,
|
|
143
|
+
videoWidth: 8,
|
|
144
|
+
} as HTMLVideoElement);
|
|
145
|
+
const texture = textureWithImage(image);
|
|
146
|
+
registerWgpuVideoTextureResolver(state);
|
|
147
|
+
expect(resolveWgpuTexture(state, texture)).not.toBeNull();
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
describe('resolveWgpuTexture', () => {
|
|
152
|
+
it('returns null without an exact registered backing kind', async () => {
|
|
153
|
+
const state = await createWgpuRenderStateForTest();
|
|
154
|
+
expect(resolveWgpuTexture(state, textureWithImage(null))).toBeNull();
|
|
155
|
+
});
|
|
156
|
+
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ImageResource } from '@flighthq/types';
|
|
1
|
+
import type { ImageResource } from '@flighthq/types/contract';
|
|
2
2
|
|
|
3
3
|
import { uploadWgpuTextureData, uploadWgpuTextureElement, uploadWgpuTextureImageResource } from './wgpuTextureUpload';
|
|
4
4
|
|
|
@@ -42,19 +42,9 @@ describe('uploadWgpuTextureImageResource', () => {
|
|
|
42
42
|
it('takes the element path when the resource carries a source', () => {
|
|
43
43
|
const device = makeDevice();
|
|
44
44
|
const texture = {} as GPUTexture;
|
|
45
|
-
const image = { source: {} as CanvasImageSource,
|
|
45
|
+
const image = { source: {} as CanvasImageSource, width: 4, height: 4 } as unknown as ImageResource;
|
|
46
46
|
uploadWgpuTextureImageResource(device, texture, [0, 0, 0], image);
|
|
47
47
|
expect(device.queue.copyExternalImageToTexture).toHaveBeenCalledTimes(1);
|
|
48
48
|
expect(device.queue.writeTexture).not.toHaveBeenCalled();
|
|
49
49
|
});
|
|
50
|
-
|
|
51
|
-
it('takes the raw-pixel path when the resource is data-only', () => {
|
|
52
|
-
const device = makeDevice();
|
|
53
|
-
const texture = {} as GPUTexture;
|
|
54
|
-
const data = new Uint8ClampedArray(4 * 4 * 4);
|
|
55
|
-
const image = { source: null, data, width: 4, height: 4 } as ImageResource;
|
|
56
|
-
uploadWgpuTextureImageResource(device, texture, [0, 0, 0], image);
|
|
57
|
-
expect(device.queue.writeTexture).toHaveBeenCalledTimes(1);
|
|
58
|
-
expect(device.queue.copyExternalImageToTexture).not.toHaveBeenCalled();
|
|
59
|
-
});
|
|
60
50
|
});
|