@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.
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/wgpuAdapterCapabilities.d.ts +3 -0
- package/dist/wgpuAdapterCapabilities.d.ts.map +1 -0
- package/dist/wgpuAdapterCapabilities.js +28 -0
- package/dist/wgpuAdapterCapabilities.js.map +1 -0
- package/dist/wgpuBackground.d.ts +4 -0
- package/dist/wgpuBackground.d.ts.map +1 -0
- package/dist/wgpuBackground.js +110 -0
- package/dist/wgpuBackground.js.map +1 -0
- package/dist/wgpuDraw.d.ts +21 -0
- package/dist/wgpuDraw.d.ts.map +1 -0
- package/dist/wgpuDraw.js +153 -0
- package/dist/wgpuDraw.js.map +1 -0
- package/dist/wgpuElement.d.ts +2 -0
- package/dist/wgpuElement.d.ts.map +1 -0
- package/dist/wgpuElement.js +9 -0
- package/dist/wgpuElement.js.map +1 -0
- package/dist/wgpuFullscreenPass.d.ts +5 -0
- package/dist/wgpuFullscreenPass.d.ts.map +1 -0
- package/dist/wgpuFullscreenPass.js +106 -0
- package/dist/wgpuFullscreenPass.js.map +1 -0
- package/dist/wgpuMaterialRegistry.d.ts +5 -0
- package/dist/wgpuMaterialRegistry.d.ts.map +1 -0
- package/dist/wgpuMaterialRegistry.js +27 -0
- package/dist/wgpuMaterialRegistry.js.map +1 -0
- package/dist/wgpuRenderState.d.ts +7 -0
- package/dist/wgpuRenderState.d.ts.map +1 -0
- package/dist/wgpuRenderState.js +153 -0
- package/dist/wgpuRenderState.js.map +1 -0
- package/dist/wgpuRenderTarget.d.ts +19 -0
- package/dist/wgpuRenderTarget.d.ts.map +1 -0
- package/dist/wgpuRenderTarget.js +142 -0
- package/dist/wgpuRenderTarget.js.map +1 -0
- package/dist/wgpuRenderTargetPool.d.ts +10 -0
- package/dist/wgpuRenderTargetPool.d.ts.map +1 -0
- package/dist/wgpuRenderTargetPool.js +32 -0
- package/dist/wgpuRenderTargetPool.js.map +1 -0
- package/dist/wgpuScissor.d.ts +5 -0
- package/dist/wgpuScissor.d.ts.map +1 -0
- package/dist/wgpuScissor.js +37 -0
- package/dist/wgpuScissor.js.map +1 -0
- package/dist/wgpuShader.d.ts +43 -0
- package/dist/wgpuShader.d.ts.map +1 -0
- package/dist/wgpuShader.js +304 -0
- package/dist/wgpuShader.js.map +1 -0
- package/dist/wgpuShaderBinding.d.ts +5 -0
- package/dist/wgpuShaderBinding.d.ts.map +1 -0
- package/dist/wgpuShaderBinding.js +28 -0
- package/dist/wgpuShaderBinding.js.map +1 -0
- package/dist/wgpuShaderRegistry.d.ts +3 -0
- package/dist/wgpuShaderRegistry.d.ts.map +1 -0
- package/dist/wgpuShaderRegistry.js +8 -0
- package/dist/wgpuShaderRegistry.js.map +1 -0
- package/dist/wgpuSurface.d.ts +6 -0
- package/dist/wgpuSurface.d.ts.map +1 -0
- package/dist/wgpuSurface.js +107 -0
- package/dist/wgpuSurface.js.map +1 -0
- package/dist/wgpuTestHelper.d.ts +4 -0
- package/dist/wgpuTestHelper.d.ts.map +1 -0
- package/dist/wgpuTestHelper.js +137 -0
- package/dist/wgpuTestHelper.js.map +1 -0
- package/package.json +42 -0
- package/src/wgpuAdapterCapabilities.test.ts +49 -0
- package/src/wgpuBackground.test.ts +52 -0
- package/src/wgpuDraw.test.ts +174 -0
- package/src/wgpuElement.test.ts +21 -0
- package/src/wgpuFullscreenPass.test.ts +64 -0
- package/src/wgpuMaterialRegistry.test.ts +56 -0
- package/src/wgpuRenderState.test.ts +88 -0
- package/src/wgpuRenderTarget.test.ts +120 -0
- package/src/wgpuRenderTargetPool.test.ts +58 -0
- package/src/wgpuScissor.test.ts +97 -0
- package/src/wgpuShader.test.ts +140 -0
- package/src/wgpuShaderBinding.test.ts +62 -0
- package/src/wgpuShaderRegistry.test.ts +30 -0
- 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":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAG9D,OAAO,EAAE,8BAA8B,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AACvF,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAE9D,SAAS,mBAAmB,CAC1B,KAAsB,EACtB,SAAyB,EACzB,gBAAgC,EAChC,KAAa,EACb,MAAc,EACd,MAAiB,EACjB,aAAuB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IAEjD,MAAM,OAAO,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,OAAO,CAAC,cAAe,CAAC,eAAe,CAAC;QACnD,gBAAgB,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;QACzF,sBAAsB,EAAE;YACtB,IAAI,EAAE,gBAAgB;YACtB,eAAe,EAAE,GAAG;YACpB,WAAW,EAAE,OAAO;YACpB,YAAY,EAAE,SAAS;YACvB,iBAAiB,EAAE,CAAC;YACpB,aAAa,EAAE,OAAO;YACtB,cAAc,EAAE,SAAS;SAC1B;KACF,CAAC,CAAC;IACH,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,KAAsB,EACtB,MAAwB,EACxB,eAAiC,EACjC,UAAqB;IAErB,MAAM,OAAO,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;IAEjD,2DAA2D;IAC3D,IAAI,OAAO,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;QAChC,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC;QACzB,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAC5B,CAAC;IAED,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC;QAC7B,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;QAC1C,oBAAoB,EAAE,OAAO,CAAC,oBAAoB;QAClD,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;QAC1C,WAAW,EAAE,OAAO,CAAC,kBAAkB;KACxC,CAAC,CAAC;IAEH,OAAO,CAAC,oBAAoB,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IAC9E,iGAAiG;IACjG,OAAO,CAAC,kBAAkB,GAAG,MAAM,CAAC,MAAM,CAAC;IAE3C,MAAM,YAAY,GAAG,YAAY,EAAE,CAAC;IACpC,UAAU,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IAC1C,KAAK,CAAC,iBAAiB,GAAG,YAAY,CAAC;IAEvC,yCAAyC;IACzC,OAAO,CAAC,gBAAgB,GAAG,CAAC,CAAC;IAC7B,OAAO,CAAC,aAAa,GAAG,KAAK,CAAC;IAC9B,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAClC,OAAO,CAAC,YAAY,GAAG,EAAE,CAAC;IAE1B,OAAO,CAAC,UAAU,GAAG,mBAAmB,CACtC,KAAK,EACL,MAAM,CAAC,IAAI,EACX,MAAM,CAAC,gBAAgB,EACvB,MAAM,CAAC,KAAK,EACZ,MAAM,CAAC,MAAM,EACb,OAAO,EACP,UAAU,CACX,CAAC;AACJ,CAAC;AAED,mGAAmG;AACnG,iGAAiG;AACjG,MAAM,UAAU,sBAAsB,CACpC,KAAsB,EACtB,KAAa,EACb,MAAc,EACd,SAA2B,KAAK,CAAC,MAAM;IAEvC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACxC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAEzC,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,CAAC;QACnC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACf,MAAM;QACN,KAAK,EAAE,eAAe,CAAC,iBAAiB,GAAG,eAAe,CAAC,eAAe,GAAG,eAAe,CAAC,QAAQ;KACtG,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAClC,MAAM,SAAS,GAAG,8BAA8B,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAE9D,MAAM,mBAAmB,GAAG,MAAM,CAAC,aAAa,CAAC;QAC/C,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACf,MAAM,EAAE,sBAAsB;QAC9B,KAAK,EAAE,eAAe,CAAC,iBAAiB;KACzC,CAAC,CAAC;IACH,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,UAAU,EAAE,CAAC;IAE1D,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AAC1G,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,MAAuB,EAAE,MAAwB;IACvF,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IACzB,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,KAAsB,EACtB,WAIC,EACD,MAAkC,EAClC,SAA2B;IAE3B,IAAI,MAAM,CAAC,KAAK,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO;IAEpD,MAAM,OAAO,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;IACjD,IAAI,OAAO,CAAC,UAAU,KAAK,IAAI;QAAE,OAAO;IAExC,sEAAsE;IACtE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,WAAW,CAAC,WAAW,CAAC;IACvD,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,SAAS,CAAC;IACnE,MAAM,iBAAiB,GAAG;QACxB,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE;QAClB,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE;QAClB,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE;QAClB,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE;QAClB,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE;QAC1B,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE;KAC3B,CAAC;IAEF,2FAA2F;IAC3F,yBAAyB,CACvB,KAAK,EACL,WAAoB,EACpB,iBAAiB,EACjB,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,EAC3E,CAAC,EACD,CAAC,EACD,MAAM,CAAC,KAAK,EACZ,MAAM,CAAC,MAAM,EACb,CAAC,EACD,CAAC,EACD,CAAC,EACD,CAAC,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAsB;IACxD,MAAM,OAAO,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;IAEjD,IAAI,OAAO,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;QAChC,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC;QACzB,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAC5B,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,iBAAiB,CAAC,GAAG,EAAE,CAAC;IAC9C,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO;IAEhC,OAAO,CAAC,iBAAiB,GAAG,KAAK,CAAC,iBAAiB,CAAC;IACpD,OAAO,CAAC,iBAAiB,GAAG,KAAK,CAAC,iBAAiB,CAAC;IACpD,OAAO,CAAC,oBAAoB,GAAG,KAAK,CAAC,oBAAoB,CAAC;IAC1D,OAAO,CAAC,kBAAkB,GAAG,KAAK,CAAC,WAAW,CAAC;IAC/C,KAAK,CAAC,iBAAiB,GAAG,KAAK,CAAC,iBAAiB,CAAC;IAElD,6DAA6D;IAC7D,OAAO,CAAC,gBAAgB,GAAG,CAAC,CAAC;IAC7B,OAAO,CAAC,aAAa,GAAG,KAAK,CAAC;IAC9B,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAClC,OAAO,CAAC,YAAY,GAAG,EAAE,CAAC;IAE1B,IAAI,KAAK,CAAC,iBAAiB,KAAK,IAAI,EAAE,CAAC;QACrC,OAAO,CAAC,UAAU,GAAG,mBAAmB,CACtC,KAAK,EACL,KAAK,CAAC,iBAAiB,EACvB,KAAK,CAAC,gBAAgB,IAAI,OAAO,CAAC,gBAAiB,EACnD,OAAO,CAAC,oBAAoB,EAAE,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,EACzD,OAAO,CAAC,oBAAoB,EAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,EAC3D,MAAM,CACP,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,KAAsB,EACtB,MAAwB,EACxB,KAAa,EACb,MAAc;IAEd,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACxC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACzC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;IACjB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IAElB,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IACzB,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC;IAErC,MAAM,UAAU,GAAG,MAAM,CAAC,aAAa,CAAC;QACtC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACf,MAAM;QACN,KAAK,EAAE,eAAe,CAAC,iBAAiB,GAAG,eAAe,CAAC,eAAe,GAAG,eAAe,CAAC,QAAQ;KACtG,CAAC,CAAC;IACH,MAAM,CAAC,OAAO,GAAG,UAAU,CAAC;IAC5B,MAAM,CAAC,IAAI,GAAG,UAAU,CAAC,UAAU,EAAE,CAAC;IACtC,MAAM,CAAC,SAAS,GAAG,8BAA8B,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAEtE,MAAM,QAAQ,GAAG,MAAM,CAAC,aAAa,CAAC;QACpC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACf,MAAM,EAAE,sBAAsB;QAC9B,KAAK,EAAE,eAAe,CAAC,iBAAiB;KACzC,CAAC,CAAC;IACH,MAAM,CAAC,mBAAmB,GAAG,QAAQ,CAAC;IACtC,MAAM,CAAC,gBAAgB,GAAG,QAAQ,CAAC,UAAU,EAAE,CAAC;AAClD,CAAC"}
|
|
@@ -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"}
|