@flighthq/render-wgpu 0.1.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 (79) hide show
  1. package/dist/index.d.ts +17 -0
  2. package/dist/index.d.ts.map +1 -0
  3. package/dist/index.js +16 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/wgpuAdapterCapabilities.d.ts +3 -0
  6. package/dist/wgpuAdapterCapabilities.d.ts.map +1 -0
  7. package/dist/wgpuAdapterCapabilities.js +28 -0
  8. package/dist/wgpuAdapterCapabilities.js.map +1 -0
  9. package/dist/wgpuBackground.d.ts +4 -0
  10. package/dist/wgpuBackground.d.ts.map +1 -0
  11. package/dist/wgpuBackground.js +110 -0
  12. package/dist/wgpuBackground.js.map +1 -0
  13. package/dist/wgpuDraw.d.ts +21 -0
  14. package/dist/wgpuDraw.d.ts.map +1 -0
  15. package/dist/wgpuDraw.js +153 -0
  16. package/dist/wgpuDraw.js.map +1 -0
  17. package/dist/wgpuElement.d.ts +2 -0
  18. package/dist/wgpuElement.d.ts.map +1 -0
  19. package/dist/wgpuElement.js +9 -0
  20. package/dist/wgpuElement.js.map +1 -0
  21. package/dist/wgpuFullscreenPass.d.ts +5 -0
  22. package/dist/wgpuFullscreenPass.d.ts.map +1 -0
  23. package/dist/wgpuFullscreenPass.js +106 -0
  24. package/dist/wgpuFullscreenPass.js.map +1 -0
  25. package/dist/wgpuMaterialRegistry.d.ts +5 -0
  26. package/dist/wgpuMaterialRegistry.d.ts.map +1 -0
  27. package/dist/wgpuMaterialRegistry.js +27 -0
  28. package/dist/wgpuMaterialRegistry.js.map +1 -0
  29. package/dist/wgpuRenderState.d.ts +7 -0
  30. package/dist/wgpuRenderState.d.ts.map +1 -0
  31. package/dist/wgpuRenderState.js +153 -0
  32. package/dist/wgpuRenderState.js.map +1 -0
  33. package/dist/wgpuRenderTarget.d.ts +19 -0
  34. package/dist/wgpuRenderTarget.d.ts.map +1 -0
  35. package/dist/wgpuRenderTarget.js +142 -0
  36. package/dist/wgpuRenderTarget.js.map +1 -0
  37. package/dist/wgpuRenderTargetPool.d.ts +10 -0
  38. package/dist/wgpuRenderTargetPool.d.ts.map +1 -0
  39. package/dist/wgpuRenderTargetPool.js +32 -0
  40. package/dist/wgpuRenderTargetPool.js.map +1 -0
  41. package/dist/wgpuScissor.d.ts +5 -0
  42. package/dist/wgpuScissor.d.ts.map +1 -0
  43. package/dist/wgpuScissor.js +37 -0
  44. package/dist/wgpuScissor.js.map +1 -0
  45. package/dist/wgpuShader.d.ts +43 -0
  46. package/dist/wgpuShader.d.ts.map +1 -0
  47. package/dist/wgpuShader.js +304 -0
  48. package/dist/wgpuShader.js.map +1 -0
  49. package/dist/wgpuShaderBinding.d.ts +5 -0
  50. package/dist/wgpuShaderBinding.d.ts.map +1 -0
  51. package/dist/wgpuShaderBinding.js +28 -0
  52. package/dist/wgpuShaderBinding.js.map +1 -0
  53. package/dist/wgpuShaderRegistry.d.ts +3 -0
  54. package/dist/wgpuShaderRegistry.d.ts.map +1 -0
  55. package/dist/wgpuShaderRegistry.js +8 -0
  56. package/dist/wgpuShaderRegistry.js.map +1 -0
  57. package/dist/wgpuSurface.d.ts +6 -0
  58. package/dist/wgpuSurface.d.ts.map +1 -0
  59. package/dist/wgpuSurface.js +107 -0
  60. package/dist/wgpuSurface.js.map +1 -0
  61. package/dist/wgpuTestHelper.d.ts +4 -0
  62. package/dist/wgpuTestHelper.d.ts.map +1 -0
  63. package/dist/wgpuTestHelper.js +137 -0
  64. package/dist/wgpuTestHelper.js.map +1 -0
  65. package/package.json +42 -0
  66. package/src/wgpuAdapterCapabilities.test.ts +49 -0
  67. package/src/wgpuBackground.test.ts +52 -0
  68. package/src/wgpuDraw.test.ts +174 -0
  69. package/src/wgpuElement.test.ts +21 -0
  70. package/src/wgpuFullscreenPass.test.ts +64 -0
  71. package/src/wgpuMaterialRegistry.test.ts +56 -0
  72. package/src/wgpuRenderState.test.ts +88 -0
  73. package/src/wgpuRenderTarget.test.ts +120 -0
  74. package/src/wgpuRenderTargetPool.test.ts +58 -0
  75. package/src/wgpuScissor.test.ts +97 -0
  76. package/src/wgpuShader.test.ts +140 -0
  77. package/src/wgpuShaderBinding.test.ts +62 -0
  78. package/src/wgpuShaderRegistry.test.ts +30 -0
  79. package/src/wgpuSurface.test.ts +49 -0
@@ -0,0 +1,153 @@
1
+ import { createMatrix } from '@flighthq/geometry';
2
+ import { createRenderState as _createRenderState, createRenderStateRuntime, setRenderStateBackgroundColor, } from '@flighthq/render';
3
+ import { EntityRuntimeKey } from '@flighthq/types';
4
+ import { warmWgpuPipelines } from './wgpuDraw';
5
+ import { createWgpuBindGroupLayouts, UNIFORM_BYTE_SIZE } from './wgpuShader';
6
+ // Ring buffer: 4096 draw slots per frame. Stride is clamped to at least 256 by the spec.
7
+ const RING_SLOT_COUNT = 4096;
8
+ export async function createWgpuRenderState(canvas, options = {}) {
9
+ if (!navigator.gpu)
10
+ throw new Error('WebGPU is not supported in this browser.');
11
+ const adapter = await navigator.gpu.requestAdapter(options.powerPreference != null ? { powerPreference: options.powerPreference } : undefined);
12
+ if (!adapter)
13
+ throw new Error('Failed to get WebGPU adapter.');
14
+ const device = await adapter.requestDevice();
15
+ const format = options.format ?? navigator.gpu.getPreferredCanvasFormat();
16
+ const context = canvas.getContext('webgpu');
17
+ if (!context)
18
+ throw new Error('Failed to get WebGPU canvas context.');
19
+ // COPY_SRC lets the canvas texture be read back via copyTextureToBuffer (createSurfaceFromWgpuRenderState).
20
+ // It is the only reliable way to read a Wgpu frame in headless/software contexts, where canvas
21
+ // presentation does not surface the swapchain; it also backs user-facing screenshot/save-pixels needs.
22
+ context.configure({
23
+ device,
24
+ format,
25
+ alphaMode: 'premultiplied',
26
+ usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC,
27
+ });
28
+ // Align uniform ring buffer slots to device limits
29
+ const uniformStride = Math.max(256, device.limits.minUniformBufferOffsetAlignment, UNIFORM_BYTE_SIZE);
30
+ const ringByteSize = uniformStride * RING_SLOT_COUNT;
31
+ const uniformBuffer = device.createBuffer({
32
+ size: ringByteSize,
33
+ usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
34
+ });
35
+ const uniformData = new Float32Array(ringByteSize / 4);
36
+ const uniformDataU32 = new Uint32Array(uniformData.buffer);
37
+ const { uniformBindGroupLayout, textureBindGroupLayout } = createWgpuBindGroupLayouts(device);
38
+ const uniformBindGroup = device.createBindGroup({
39
+ layout: uniformBindGroupLayout,
40
+ entries: [{ binding: 0, resource: { buffer: uniformBuffer, size: UNIFORM_BYTE_SIZE } }],
41
+ });
42
+ const linearSampler = device.createSampler({
43
+ minFilter: 'linear',
44
+ magFilter: 'linear',
45
+ addressModeU: 'clamp-to-edge',
46
+ addressModeV: 'clamp-to-edge',
47
+ });
48
+ const nearestSampler = device.createSampler({
49
+ minFilter: 'nearest',
50
+ magFilter: 'nearest',
51
+ addressModeU: 'clamp-to-edge',
52
+ addressModeV: 'clamp-to-edge',
53
+ });
54
+ const state = _createRenderState({
55
+ allowSmoothing: options.imageSmoothingEnabled ?? true,
56
+ pixelRatio: options.pixelRatio ?? 1,
57
+ renderTransform2D: createMatrix(),
58
+ roundPixels: options.roundPixels ?? false,
59
+ sceneGraphSyncPolicy: options.sceneGraphSyncPolicy,
60
+ });
61
+ if (options.backgroundColor != null)
62
+ setRenderStateBackgroundColor(state, options.backgroundColor);
63
+ state.applyBlendMode = null;
64
+ state.canvas = canvas;
65
+ state.context = context;
66
+ state.device = device;
67
+ state.format = format;
68
+ const runtime = createWgpuRenderStateRuntime();
69
+ state[EntityRuntimeKey] = runtime;
70
+ runtime.currentBlendMode = null;
71
+ runtime.uniformBindGroupLayout = uniformBindGroupLayout;
72
+ runtime.textureBindGroupLayout = textureBindGroupLayout;
73
+ runtime.uniformBuffer = uniformBuffer;
74
+ runtime.uniformData = uniformData;
75
+ runtime.uniformDataU32 = uniformDataU32;
76
+ runtime.uniformOffset = 0;
77
+ runtime.uniformStride = uniformStride;
78
+ runtime.uniformBindGroup = uniformBindGroup;
79
+ runtime.matrixArray = new Float32Array(9);
80
+ runtime.pipelineCache = new Map();
81
+ runtime.linearSampler = linearSampler;
82
+ runtime.nearestSampler = nearestSampler;
83
+ runtime.textureCache = new WeakMap();
84
+ runtime.defaultBitmapShader = null;
85
+ runtime.particleInstanceBuffer = null;
86
+ runtime.particleInstanceData = null;
87
+ runtime.particleInstanceCapacity = 0;
88
+ runtime.spriteBatchBlendMode = null;
89
+ runtime.spriteBatchMaterial = null;
90
+ runtime.spriteBatchMaterialRenderer = null;
91
+ runtime.spriteBatchMaterialFloats = 0;
92
+ runtime.spriteBatchCount = 0;
93
+ runtime.spriteBatchInstanceData = new Float32Array(13 * 256);
94
+ runtime.spriteBatchMaterialData = new Float32Array(8 * 256);
95
+ runtime.spriteBatchTexture = null;
96
+ runtime.spriteBatchBufferPool = [];
97
+ runtime.spriteBatchBufferCursor = 0;
98
+ runtime.commandEncoder = null;
99
+ runtime.renderPass = null;
100
+ runtime.canvasTextureView = null;
101
+ runtime.canvasViewCleared = false;
102
+ runtime.depthStencilTexture = null;
103
+ runtime.depthStencilView = null;
104
+ runtime.depthStencilWidth = 0;
105
+ runtime.depthStencilHeight = 0;
106
+ runtime.currentMaskDepth = 0;
107
+ runtime.maskWriteMode = false;
108
+ runtime.clipContourPipelines = undefined;
109
+ runtime.clipContourStack = [];
110
+ runtime.shapeMeshPipelines = undefined;
111
+ runtime.clipForms = [];
112
+ runtime.scissorStack = [];
113
+ runtime.currentScissorRect = null;
114
+ runtime.renderTargetViewport = null;
115
+ runtime.renderTargetStack = [];
116
+ warmWgpuPipelines(state);
117
+ return state;
118
+ }
119
+ // Allocates the package-private GPU runtime for a WgpuRenderState. createWgpuRenderState attaches
120
+ // one to each state under EntityRuntimeKey and populates its fields; getWgpuRenderStateRuntime reads
121
+ // it back. The render path writes the returned object every frame, so the return is intentionally
122
+ // mutable (not Readonly).
123
+ export function createWgpuRenderStateRuntime() {
124
+ return createRenderStateRuntime();
125
+ }
126
+ // Destroys the GPU buffers and textures createWgpuRenderState (and the lazy sprite-batch/particle
127
+ // paths) allocated on `state`: the uniform buffer, particle instance buffer, depth-stencil texture,
128
+ // and every sprite-batch pool slot's instance/material buffers. Call when the render state is no
129
+ // longer needed.
130
+ //
131
+ // Intentionally NOT touched: the GPUDevice (app-owned and shared — destroying it would tear down
132
+ // every state on it), and GC-managed Wgpu objects with no destroy() (pipelines, bind groups,
133
+ // layouts, samplers, shader modules, texture views). textureCache is a WeakMap and cannot be
134
+ // enumerated; its entries' textures are freed per-node by the dispose* paths.
135
+ export function destroyWgpuRenderState(state) {
136
+ const runtime = getWgpuRenderStateRuntime(state);
137
+ runtime.uniformBuffer?.destroy();
138
+ runtime.particleInstanceBuffer?.destroy();
139
+ runtime.depthStencilTexture?.destroy();
140
+ for (const slot of runtime.spriteBatchBufferPool) {
141
+ slot.instanceBuffer?.destroy();
142
+ slot.materialBuffer?.destroy();
143
+ }
144
+ }
145
+ // Resolves the package-private GPU runtime attached to a WgpuRenderState. Mutable by design: the
146
+ // render path writes its fields every frame.
147
+ export function getWgpuRenderStateRuntime(state) {
148
+ return state[EntityRuntimeKey];
149
+ }
150
+ export function isWgpuSupported() {
151
+ return typeof navigator !== 'undefined' && 'gpu' in navigator && navigator.gpu !== null;
152
+ }
153
+ //# sourceMappingURL=wgpuRenderState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuRenderState.js","sourceRoot":"","sources":["../src/wgpuRenderState.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { Material, Matrix, WgpuRenderState, WgpuRenderTarget } from '@flighthq/types';
2
+ export declare function beginWgpuRenderTarget(state: WgpuRenderState, target: WgpuRenderTarget, renderTransform: Readonly<Matrix>, clearColor?: GPUColor): void;
3
+ export declare function createWgpuRenderTarget(state: WgpuRenderState, width: number, height: number, format?: GPUTextureFormat): WgpuRenderTarget;
4
+ export declare function destroyWgpuRenderTarget(_state: WgpuRenderState, target: WgpuRenderTarget): void;
5
+ export declare function drawWgpuRenderTargetResult(state: WgpuRenderState, renderProxy: {
6
+ alpha: number;
7
+ material: Material | null;
8
+ transform2D: {
9
+ a: number;
10
+ b: number;
11
+ c: number;
12
+ d: number;
13
+ tx: number;
14
+ ty: number;
15
+ };
16
+ }, target: Readonly<WgpuRenderTarget>, transform: Readonly<Matrix>): void;
17
+ export declare function endWgpuRenderTarget(state: WgpuRenderState): void;
18
+ export declare function resizeWgpuRenderTarget(state: WgpuRenderState, target: WgpuRenderTarget, width: number, height: number): void;
19
+ //# sourceMappingURL=wgpuRenderTarget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuRenderTarget.d.ts","sourceRoot":"","sources":["../src/wgpuRenderTarget.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AA+B3F,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,gBAAgB,EACxB,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,EACjC,UAAU,CAAC,EAAE,QAAQ,GACpB,IAAI,CAyCN;AAID,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,gBAA+B,GACtC,gBAAgB,CAqBlB;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAG/F;AAED,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,eAAe,EACtB,WAAW,EAAE;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;CACrF,EACD,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,GAC1B,IAAI,CAiCN;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAiChE;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,gBAAgB,EACxB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,IAAI,CA2BN"}
@@ -0,0 +1,142 @@
1
+ import { copyMatrix, createMatrix } from '@flighthq/geometry';
2
+ import { buildWgpuRenderTargetBindGroup, drawWgpuQuadWithTransform } from './wgpuDraw';
3
+ import { getWgpuRenderStateRuntime } from './wgpuRenderState';
4
+ function beginWgpuRenderPass(state, colorView, depthStencilView, width, height, loadOp, clearColor = { r: 0, g: 0, b: 0, a: 0 }) {
5
+ const runtime = getWgpuRenderStateRuntime(state);
6
+ const pass = runtime.commandEncoder.beginRenderPass({
7
+ colorAttachments: [{ view: colorView, loadOp, storeOp: 'store', clearValue: clearColor }],
8
+ depthStencilAttachment: {
9
+ view: depthStencilView,
10
+ depthClearValue: 1.0,
11
+ depthLoadOp: 'clear',
12
+ depthStoreOp: 'discard',
13
+ stencilClearValue: 0,
14
+ stencilLoadOp: 'clear',
15
+ stencilStoreOp: 'discard',
16
+ },
17
+ });
18
+ pass.setViewport(0, 0, width, height, 0, 1);
19
+ return pass;
20
+ }
21
+ export function beginWgpuRenderTarget(state, target, renderTransform, clearColor) {
22
+ const runtime = getWgpuRenderStateRuntime(state);
23
+ // End the current render pass before beginning the new one
24
+ if (runtime.renderPass !== null) {
25
+ runtime.renderPass.end();
26
+ runtime.renderPass = null;
27
+ }
28
+ runtime.renderTargetStack.push({
29
+ canvasTextureView: runtime.canvasTextureView,
30
+ canvasViewCleared: runtime.canvasViewCleared,
31
+ depthStencilView: runtime.depthStencilView,
32
+ renderTargetViewport: runtime.renderTargetViewport,
33
+ renderTransform2D: state.renderTransform2D,
34
+ colorFormat: runtime.currentColorFormat,
35
+ });
36
+ runtime.renderTargetViewport = { width: target.width, height: target.height };
37
+ // Scene pipelines drawn into this target must match its color format (e.g. rgba16float for HDR).
38
+ runtime.currentColorFormat = target.format;
39
+ const newTransform = createMatrix();
40
+ copyMatrix(newTransform, renderTransform);
41
+ state.renderTransform2D = newTransform;
42
+ // Reset mask/clip state for the new pass
43
+ runtime.currentMaskDepth = 0;
44
+ runtime.maskWriteMode = false;
45
+ runtime.currentScissorRect = null;
46
+ runtime.scissorStack = [];
47
+ runtime.renderPass = beginWgpuRenderPass(state, target.view, target.depthStencilView, target.width, target.height, 'clear', clearColor);
48
+ }
49
+ // `format` defaults to the canvas format. Pass 'rgba16float' for an HDR effect target (bloom, tone
50
+ // mapping). The chosen format is recorded on the target so the effect-target pool matches on it.
51
+ export function createWgpuRenderTarget(state, width, height, format = state.format) {
52
+ const device = state.device;
53
+ const w = Math.max(1, Math.ceil(width));
54
+ const h = Math.max(1, Math.ceil(height));
55
+ const texture = device.createTexture({
56
+ size: [w, h, 1],
57
+ format,
58
+ usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC,
59
+ });
60
+ const view = texture.createView();
61
+ const bindGroup = buildWgpuRenderTargetBindGroup(state, view);
62
+ const depthStencilTexture = device.createTexture({
63
+ size: [w, h, 1],
64
+ format: 'depth24plus-stencil8',
65
+ usage: GPUTextureUsage.RENDER_ATTACHMENT,
66
+ });
67
+ const depthStencilView = depthStencilTexture.createView();
68
+ return { bindGroup, texture, view, depthStencilTexture, depthStencilView, format, width: w, height: h };
69
+ }
70
+ export function destroyWgpuRenderTarget(_state, target) {
71
+ target.texture.destroy();
72
+ target.depthStencilTexture.destroy();
73
+ }
74
+ export function drawWgpuRenderTargetResult(state, renderProxy, target, transform) {
75
+ if (target.width <= 0 || target.height <= 0)
76
+ return;
77
+ const runtime = getWgpuRenderStateRuntime(state);
78
+ if (runtime.renderPass === null)
79
+ return;
80
+ // Compose the render node's transform with the cache offset transform
81
+ const { a, b, c, d, tx, ty } = renderProxy.transform2D;
82
+ const { a: ta, b: tb, c: tc, d: td, tx: ttx, ty: tty } = transform;
83
+ const composedTransform = {
84
+ a: a * ta + c * tb,
85
+ b: b * ta + d * tb,
86
+ c: a * tc + c * td,
87
+ d: b * tc + d * td,
88
+ tx: a * ttx + c * tty + tx,
89
+ ty: b * ttx + d * tty + ty,
90
+ };
91
+ // Render target textures are stored with Y flipped relative to canvas (bottom-left origin)
92
+ drawWgpuQuadWithTransform(state, renderProxy, composedTransform, { texture: target.texture, view: target.view, bindGroup: target.bindGroup }, 0, 0, target.width, target.height, 0, 1, 1, 0);
93
+ }
94
+ export function endWgpuRenderTarget(state) {
95
+ const runtime = getWgpuRenderStateRuntime(state);
96
+ if (runtime.renderPass !== null) {
97
+ runtime.renderPass.end();
98
+ runtime.renderPass = null;
99
+ }
100
+ const saved = runtime.renderTargetStack.pop();
101
+ if (saved === undefined)
102
+ return;
103
+ runtime.canvasTextureView = saved.canvasTextureView;
104
+ runtime.canvasViewCleared = saved.canvasViewCleared;
105
+ runtime.renderTargetViewport = saved.renderTargetViewport;
106
+ runtime.currentColorFormat = saved.colorFormat;
107
+ state.renderTransform2D = saved.renderTransform2D;
108
+ // Reset mask/clip state when returning to the enclosing pass
109
+ runtime.currentMaskDepth = 0;
110
+ runtime.maskWriteMode = false;
111
+ runtime.currentScissorRect = null;
112
+ runtime.scissorStack = [];
113
+ if (saved.canvasTextureView !== null) {
114
+ runtime.renderPass = beginWgpuRenderPass(state, saved.canvasTextureView, saved.depthStencilView ?? runtime.depthStencilView, runtime.renderTargetViewport?.width ?? state.canvas.width, runtime.renderTargetViewport?.height ?? state.canvas.height, 'load');
115
+ }
116
+ }
117
+ export function resizeWgpuRenderTarget(state, target, width, height) {
118
+ const device = state.device;
119
+ const format = target.format;
120
+ const w = Math.max(1, Math.ceil(width));
121
+ const h = Math.max(1, Math.ceil(height));
122
+ target.width = w;
123
+ target.height = h;
124
+ target.texture.destroy();
125
+ target.depthStencilTexture.destroy();
126
+ const newTexture = device.createTexture({
127
+ size: [w, h, 1],
128
+ format,
129
+ usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC,
130
+ });
131
+ target.texture = newTexture;
132
+ target.view = newTexture.createView();
133
+ target.bindGroup = buildWgpuRenderTargetBindGroup(state, target.view);
134
+ const newDepth = device.createTexture({
135
+ size: [w, h, 1],
136
+ format: 'depth24plus-stencil8',
137
+ usage: GPUTextureUsage.RENDER_ATTACHMENT,
138
+ });
139
+ target.depthStencilTexture = newDepth;
140
+ target.depthStencilView = newDepth.createView();
141
+ }
142
+ //# sourceMappingURL=wgpuRenderTarget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuRenderTarget.js","sourceRoot":"","sources":["../src/wgpuRenderTarget.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { WgpuRenderState, WgpuRenderTarget, WgpuRenderTargetPool } from '@flighthq/types';
2
+ export declare function acquireWgpuRenderTarget(state: WgpuRenderState, pool: WgpuRenderTargetPool, descriptor: Readonly<{
3
+ width: number;
4
+ height: number;
5
+ format?: GPUTextureFormat;
6
+ }>): WgpuRenderTarget;
7
+ export declare function createWgpuRenderTargetPool(): WgpuRenderTargetPool;
8
+ export declare function destroyWgpuRenderTargetPool(state: WgpuRenderState, pool: WgpuRenderTargetPool): void;
9
+ export declare function releaseWgpuRenderTarget(pool: WgpuRenderTargetPool, target: WgpuRenderTarget): void;
10
+ //# sourceMappingURL=wgpuRenderTargetPool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuRenderTargetPool.d.ts","sourceRoot":"","sources":["../src/wgpuRenderTargetPool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAW/F,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,eAAe,EACtB,IAAI,EAAE,oBAAoB,EAC1B,UAAU,EAAE,QAAQ,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,gBAAgB,CAAA;CAAE,CAAC,GACjF,gBAAgB,CAalB;AAED,wBAAgB,0BAA0B,IAAI,oBAAoB,CAEjE;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,oBAAoB,GAAG,IAAI,CAGpG;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,oBAAoB,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAElG"}
@@ -0,0 +1,32 @@
1
+ import { createWgpuRenderTarget, destroyWgpuRenderTarget } from './wgpuRenderTarget';
2
+ // Lends reusable intermediate targets to multi-pass effect recipes. acquire/release are paired
3
+ // brackets: every acquireWgpuRenderTarget must have a matching releaseWgpuRenderTarget. A released
4
+ // target returns to the free list (its GPU storage is kept) rather than being destroyed.
5
+ //
6
+ // MSAA is intentionally out of scope: Wgpu MSAA needs multisample-capable pipelines, so pooled
7
+ // targets stay sampleCount 1 — a follow-up once the effect pipelines grow multisample variants.
8
+ export function acquireWgpuRenderTarget(state, pool, descriptor) {
9
+ const w = Math.max(1, Math.ceil(descriptor.width));
10
+ const h = Math.max(1, Math.ceil(descriptor.height));
11
+ const format = descriptor.format ?? state.format;
12
+ for (let i = 0; i < pool.free.length; i++) {
13
+ const candidate = pool.free[i];
14
+ if (candidate.width === w && candidate.height === h && candidate.format === format) {
15
+ pool.free.splice(i, 1);
16
+ return candidate;
17
+ }
18
+ }
19
+ return createWgpuRenderTarget(state, w, h, format);
20
+ }
21
+ export function createWgpuRenderTargetPool() {
22
+ return { free: [] };
23
+ }
24
+ export function destroyWgpuRenderTargetPool(state, pool) {
25
+ for (const target of pool.free)
26
+ destroyWgpuRenderTarget(state, target);
27
+ pool.free.length = 0;
28
+ }
29
+ export function releaseWgpuRenderTarget(pool, target) {
30
+ pool.free.push(target);
31
+ }
32
+ //# sourceMappingURL=wgpuRenderTargetPool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuRenderTargetPool.js","sourceRoot":"","sources":["../src/wgpuRenderTargetPool.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAErF,+FAA+F;AAC/F,mGAAmG;AACnG,yFAAyF;AACzF,EAAE;AACF,+FAA+F;AAC/F,gGAAgG;AAEhG,MAAM,UAAU,uBAAuB,CACrC,KAAsB,EACtB,IAA0B,EAC1B,UAAkF;IAElF,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IACnD,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC;IAEjD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,SAAS,CAAC,KAAK,KAAK,CAAC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YACnF,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACvB,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,sBAAsB,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,0BAA0B;IACxC,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,KAAsB,EAAE,IAA0B;IAC5F,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,IAAI;QAAE,uBAAuB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACvE,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,IAA0B,EAAE,MAAwB;IAC1F,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACzB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { WgpuRenderState, WgpuScissorRect } from '@flighthq/types';
2
+ export declare function applyWgpuScissorRect(state: WgpuRenderState, pass: GPURenderPassEncoder): void;
3
+ export declare function popWgpuScissorRect(state: WgpuRenderState): void;
4
+ export declare function pushWgpuScissorRect(state: WgpuRenderState, rect: Readonly<WgpuScissorRect>): void;
5
+ //# sourceMappingURL=wgpuScissor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuScissor.d.ts","sourceRoot":"","sources":["../src/wgpuScissor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAOxE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,oBAAoB,GAAG,IAAI,CAW7F;AAKD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAI/D;AAMD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,CAAC,eAAe,CAAC,GAAG,IAAI,CAMjG"}
@@ -0,0 +1,37 @@
1
+ import { getWgpuRenderStateRuntime } from './wgpuRenderState';
2
+ // Applies the current scissor rectangle to the active render pass. No-op when there is no active
3
+ // scissor or no open render pass. Call after each draw call or once per pass when the active
4
+ // scissor changes.
5
+ export function applyWgpuScissorRect(state, pass) {
6
+ const runtime = getWgpuRenderStateRuntime(state);
7
+ const rect = runtime.currentScissorRect;
8
+ if (rect === null)
9
+ return;
10
+ // GPURenderPassEncoder.setScissorRect requires non-zero dimensions and integer coordinates. Clamp
11
+ // to at least 1×1 so the call is always valid even for degenerate clips.
12
+ const x = Math.max(0, Math.floor(rect.x));
13
+ const y = Math.max(0, Math.floor(rect.y));
14
+ const w = Math.max(1, Math.ceil(rect.width));
15
+ const h = Math.max(1, Math.ceil(rect.height));
16
+ pass.setScissorRect(x, y, w, h);
17
+ }
18
+ // Pops the topmost scissor rectangle from the stack and restores the previous one (or clears
19
+ // currentScissorRect if the stack is empty). Call after finishing the draw calls that the pushed
20
+ // scissor was scoped to. No-op when the stack is empty.
21
+ export function popWgpuScissorRect(state) {
22
+ const runtime = getWgpuRenderStateRuntime(state);
23
+ const prev = runtime.scissorStack.pop();
24
+ runtime.currentScissorRect = prev ?? null;
25
+ }
26
+ // Pushes a pixel-space scissor rectangle onto the stack and sets it as the active scissor.
27
+ // Call applyWgpuScissorRect with the active render pass to apply it to draw calls; the scissor is
28
+ // tracked here but not pushed to the GPU pass until applyWgpuScissorRect is called — this keeps
29
+ // the function pass-agnostic and lets callers batch the application.
30
+ export function pushWgpuScissorRect(state, rect) {
31
+ const runtime = getWgpuRenderStateRuntime(state);
32
+ if (runtime.currentScissorRect !== null) {
33
+ runtime.scissorStack.push(runtime.currentScissorRect);
34
+ }
35
+ runtime.currentScissorRect = { x: rect.x, y: rect.y, width: rect.width, height: rect.height };
36
+ }
37
+ //# sourceMappingURL=wgpuScissor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuScissor.js","sourceRoot":"","sources":["../src/wgpuScissor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAE9D,iGAAiG;AACjG,6FAA6F;AAC7F,mBAAmB;AACnB,MAAM,UAAU,oBAAoB,CAAC,KAAsB,EAAE,IAA0B;IACrF,MAAM,OAAO,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,OAAO,CAAC,kBAAkB,CAAC;IACxC,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO;IAC1B,kGAAkG;IAClG,yEAAyE;IACzE,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7C,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9C,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAClC,CAAC;AAED,6FAA6F;AAC7F,iGAAiG;AACjG,wDAAwD;AACxD,MAAM,UAAU,kBAAkB,CAAC,KAAsB;IACvD,MAAM,OAAO,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC;IACxC,OAAO,CAAC,kBAAkB,GAAG,IAAI,IAAI,IAAI,CAAC;AAC5C,CAAC;AAED,2FAA2F;AAC3F,kGAAkG;AAClG,gGAAgG;AAChG,qEAAqE;AACrE,MAAM,UAAU,mBAAmB,CAAC,KAAsB,EAAE,IAA+B;IACzF,MAAM,OAAO,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;IACjD,IAAI,OAAO,CAAC,kBAAkB,KAAK,IAAI,EAAE,CAAC;QACxC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,CAAC,kBAAkB,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;AAChG,CAAC"}
@@ -0,0 +1,43 @@
1
+ import type { ColorTransform, RenderProxy, WgpuRenderState } from '@flighthq/types';
2
+ import { BlendMode } from '@flighthq/types';
3
+ export type { WgpuBitmapShader } from '@flighthq/types';
4
+ export declare const UNIFORM_BYTE_SIZE = 128;
5
+ type StencilMode = 'normal' | 'masked' | 'maskwrite';
6
+ export declare function createWgpuBindGroupLayouts(device: GPUDevice): {
7
+ uniformBindGroupLayout: GPUBindGroupLayout;
8
+ textureBindGroupLayout: GPUBindGroupLayout;
9
+ };
10
+ export declare function createWgpuPipelineLayout(device: GPUDevice, uniformBindGroupLayout: GPUBindGroupLayout, textureBindGroupLayout: GPUBindGroupLayout): GPUPipelineLayout;
11
+ export declare function getActiveWgpuPipeline(state: WgpuRenderState): GPURenderPipeline;
12
+ export declare function getWgpuPipeline(state: WgpuRenderState, blendMode: BlendMode | null, stencilMode: StencilMode): GPURenderPipeline;
13
+ export declare function setWgpuMatrixFromTransform(matrixArray: Float32Array, t: {
14
+ a: number;
15
+ b: number;
16
+ c: number;
17
+ d: number;
18
+ tx: number;
19
+ ty: number;
20
+ }, viewport: {
21
+ width: number;
22
+ height: number;
23
+ }): void;
24
+ export declare function writeWgpuMatrixOnlyUniforms(state: WgpuRenderState, renderProxy: RenderProxy, transform: {
25
+ a: number;
26
+ b: number;
27
+ c: number;
28
+ d: number;
29
+ tx: number;
30
+ ty: number;
31
+ }, x0: number, y0: number, x1: number, y1: number, u0: number, v0: number, u1: number, v1: number): number;
32
+ export declare function writeWgpuQuadUniforms(state: WgpuRenderState, renderProxy: {
33
+ alpha: number;
34
+ transform2D: {
35
+ a: number;
36
+ b: number;
37
+ c: number;
38
+ d: number;
39
+ tx: number;
40
+ ty: number;
41
+ };
42
+ }, colorTransform: ColorTransform | null, x0: number, y0: number, x1: number, y1: number, u0: number, v0: number, u1: number, v1: number): number;
43
+ //# sourceMappingURL=wgpuShader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuShader.d.ts","sourceRoot":"","sources":["../src/wgpuShader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACpF,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5C,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAcxD,eAAO,MAAM,iBAAiB,MAAM,CAAC;AA8GrC,KAAK,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;AA8BrD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,GAAG;IAC7D,sBAAsB,EAAE,kBAAkB,CAAC;IAC3C,sBAAsB,EAAE,kBAAkB,CAAC;CAC5C,CAmBA;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS,EACjB,sBAAsB,EAAE,kBAAkB,EAC1C,sBAAsB,EAAE,kBAAkB,GACzC,iBAAiB,CAInB;AAYD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,eAAe,GAAG,iBAAiB,CAQ/E;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,eAAe,EACtB,SAAS,EAAE,SAAS,GAAG,IAAI,EAC3B,WAAW,EAAE,WAAW,GACvB,iBAAiB,CA8CnB;AAID,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,YAAY,EACzB,CAAC,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,EACzE,QAAQ,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC1C,IAAI,CAgBN;AAID,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,eAAe,EACtB,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,EACjF,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,GACT,MAAM,CAcR;AAKD,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,eAAe,EACtB,WAAW,EAAE;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;CACrF,EACD,cAAc,EAAE,cAAc,GAAG,IAAI,EACrC,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,GACT,MAAM,CAoDR"}