@geometra/renderer-webgpu 1.0.1

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/README.md ADDED
@@ -0,0 +1,34 @@
1
+ # @geometra/renderer-webgpu
2
+
3
+ WebGPU renderer scaffold for Geometra.
4
+
5
+ This package provides:
6
+
7
+ - Capability detection via `WebGPURenderer.isSupported()`
8
+ - Async `init()` for adapter/device bootstrap (stub in first milestone)
9
+ - Stable renderer interface integration (`render()`/`destroy()`)
10
+
11
+ Current status:
12
+
13
+ - API scaffold is implemented
14
+ - Full paint parity with `@geometra/renderer-canvas` is not implemented yet
15
+
16
+ ## Usage
17
+
18
+ ```ts
19
+ import { createApp, box, text } from '@geometra/core'
20
+ import { WebGPURenderer } from '@geometra/renderer-webgpu'
21
+
22
+ const renderer = new WebGPURenderer({ canvas })
23
+ if (WebGPURenderer.isSupported()) {
24
+ await renderer.init()
25
+ }
26
+
27
+ await createApp(
28
+ () => box({ padding: 16 }, [
29
+ text({ text: 'WebGPU scaffold', font: '16px Inter', lineHeight: 22, color: '#fff' }),
30
+ ]),
31
+ renderer,
32
+ { width: 400, height: 200 },
33
+ )
34
+ ```
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=renderer-smoke.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer-smoke.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/renderer-smoke.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,27 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { box } from '@geometra/core';
3
+ import { WebGPURenderer } from '../index.js';
4
+ class Fake2DContext {
5
+ fillStyle = '';
6
+ calls = [];
7
+ fillRect(x, y, w, h) {
8
+ this.calls.push({ x, y, w, h, color: this.fillStyle });
9
+ }
10
+ }
11
+ describe('webgpu renderer smoke', () => {
12
+ it('falls back to 2d clear pass before init', () => {
13
+ const ctx = new Fake2DContext();
14
+ const canvas = {
15
+ width: 0,
16
+ height: 0,
17
+ getContext: (kind) => (kind === '2d' ? ctx : null),
18
+ };
19
+ const renderer = new WebGPURenderer({ canvas, background: '#112233' });
20
+ const tree = box({ width: 100, height: 40 }, []);
21
+ const layout = { x: 0, y: 0, width: 100, height: 40, children: [] };
22
+ renderer.render(layout, tree);
23
+ expect(ctx.calls).toHaveLength(1);
24
+ expect(ctx.calls[0]).toEqual({ x: 0, y: 0, w: 100, h: 40, color: '#112233' });
25
+ });
26
+ });
27
+ //# sourceMappingURL=renderer-smoke.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer-smoke.test.js","sourceRoot":"","sources":["../../src/__tests__/renderer-smoke.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAA;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE5C,MAAM,aAAa;IACjB,SAAS,GAAG,EAAE,CAAA;IACd,KAAK,GAAyE,EAAE,CAAA;IAChF,QAAQ,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS;QACjD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAA;IACxD,CAAC;CACF;AAED,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,GAAG,GAAG,IAAI,aAAa,EAAE,CAAA;QAC/B,MAAM,MAAM,GAAG;YACb,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,CAAC;YACT,UAAU,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;SAC3B,CAAA;QAEjC,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAA;QACtE,MAAM,IAAI,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;QAChD,MAAM,MAAM,GAAmB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA;QACnF,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;QAE7B,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QACjC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAA;IAC/E,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,39 @@
1
+ import type { ComputedLayout } from 'textura';
2
+ import type { Renderer, UIElement } from '@geometra/core';
3
+ export interface WebGPURendererOptions {
4
+ canvas: HTMLCanvasElement;
5
+ background?: string;
6
+ powerPreference?: GPUPowerPreference;
7
+ /** Optional callback to surface unsupported nodes that need fallback rendering. */
8
+ onFallbackNeeded?: (count: number) => void;
9
+ }
10
+ /**
11
+ * Early WebGPU renderer scaffold.
12
+ *
13
+ * This package establishes a stable API surface so apps can start integrating
14
+ * WebGPU capability checks and fallback paths. Full paint parity with
15
+ * renderer-canvas is tracked as follow-up work.
16
+ */
17
+ export declare class WebGPURenderer implements Renderer {
18
+ private canvas;
19
+ private background;
20
+ private powerPreference;
21
+ private onFallbackNeeded?;
22
+ private _initialized;
23
+ private adapter;
24
+ private device;
25
+ private context;
26
+ private format;
27
+ private pipeline;
28
+ private vertexBuffer;
29
+ private vertexCapacity;
30
+ constructor(options: WebGPURendererOptions);
31
+ static isSupported(): boolean;
32
+ init(): Promise<void>;
33
+ render(layout: ComputedLayout, tree: UIElement): void;
34
+ destroy(): void;
35
+ private createPipeline;
36
+ private ensureVertexBuffer;
37
+ private collectSolidBoxes;
38
+ }
39
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAC7C,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAEzD,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,iBAAiB,CAAA;IACzB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,eAAe,CAAC,EAAE,kBAAkB,CAAA;IACpC,mFAAmF;IACnF,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CAC3C;AAED;;;;;;GAMG;AACH,qBAAa,cAAe,YAAW,QAAQ;IAC7C,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,eAAe,CAAoB;IAC3C,OAAO,CAAC,gBAAgB,CAAC,CAAyB;IAClD,OAAO,CAAC,YAAY,CAAQ;IAC5B,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,OAAO,CAAgC;IAC/C,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,QAAQ,CAAiC;IACjD,OAAO,CAAC,YAAY,CAAyB;IAC7C,OAAO,CAAC,cAAc,CAAI;gBAEd,OAAO,EAAE,qBAAqB;IAO1C,MAAM,CAAC,WAAW,IAAI,OAAO;IAIvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB3B,MAAM,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI;IA4CrD,OAAO,IAAI,IAAI;IAaf,OAAO,CAAC,cAAc;IAiDtB,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,iBAAiB;CAiC1B"}
package/dist/index.js ADDED
@@ -0,0 +1,230 @@
1
+ /**
2
+ * Early WebGPU renderer scaffold.
3
+ *
4
+ * This package establishes a stable API surface so apps can start integrating
5
+ * WebGPU capability checks and fallback paths. Full paint parity with
6
+ * renderer-canvas is tracked as follow-up work.
7
+ */
8
+ export class WebGPURenderer {
9
+ canvas;
10
+ background;
11
+ powerPreference;
12
+ onFallbackNeeded;
13
+ _initialized = false;
14
+ adapter = null;
15
+ device = null;
16
+ context = null;
17
+ format = null;
18
+ pipeline = null;
19
+ vertexBuffer = null;
20
+ vertexCapacity = 0;
21
+ constructor(options) {
22
+ this.canvas = options.canvas;
23
+ this.background = options.background ?? '#000000';
24
+ this.powerPreference = options.powerPreference ?? 'high-performance';
25
+ this.onFallbackNeeded = options.onFallbackNeeded;
26
+ }
27
+ static isSupported() {
28
+ return typeof navigator !== 'undefined' && !!navigator.gpu;
29
+ }
30
+ async init() {
31
+ if (!WebGPURenderer.isSupported()) {
32
+ throw new Error('WebGPU is not supported in this environment');
33
+ }
34
+ this.adapter = await navigator.gpu.requestAdapter({ powerPreference: this.powerPreference });
35
+ if (!this.adapter)
36
+ throw new Error('Could not acquire WebGPU adapter');
37
+ this.device = await this.adapter.requestDevice();
38
+ const context = this.canvas.getContext('webgpu');
39
+ if (!context)
40
+ throw new Error('Could not get WebGPU canvas context');
41
+ this.context = context;
42
+ this.format = navigator.gpu.getPreferredCanvasFormat();
43
+ context.configure({
44
+ device: this.device,
45
+ format: this.format,
46
+ alphaMode: 'premultiplied',
47
+ });
48
+ this.pipeline = this.createPipeline(this.device, this.format);
49
+ this._initialized = true;
50
+ }
51
+ render(layout, tree) {
52
+ if (!this._initialized) {
53
+ // Keep first milestone predictable: fallback clear pass until full GPU pipeline lands.
54
+ const ctx = this.canvas.getContext('2d');
55
+ if (!ctx) {
56
+ throw new Error('WebGPURenderer is not initialized. Call init() first.');
57
+ }
58
+ ctx.fillStyle = this.background;
59
+ ctx.fillRect(0, 0, layout.width, layout.height);
60
+ return;
61
+ }
62
+ const device = this.device;
63
+ const context = this.context;
64
+ const pipeline = this.pipeline;
65
+ this.canvas.width = Math.max(1, Math.round(layout.width));
66
+ this.canvas.height = Math.max(1, Math.round(layout.height));
67
+ const rects = [];
68
+ const unsupported = { count: 0 };
69
+ this.collectSolidBoxes(tree, layout, 0, 0, rects, unsupported);
70
+ if (unsupported.count > 0)
71
+ this.onFallbackNeeded?.(unsupported.count);
72
+ const color = parseColor(this.background);
73
+ const encoder = device.createCommandEncoder();
74
+ const pass = encoder.beginRenderPass({
75
+ colorAttachments: [{
76
+ view: context.getCurrentTexture().createView(),
77
+ clearValue: { r: color[0], g: color[1], b: color[2], a: color[3] },
78
+ loadOp: 'clear',
79
+ storeOp: 'store',
80
+ }],
81
+ });
82
+ if (rects.length > 0) {
83
+ const vb = this.ensureVertexBuffer(rects.length * 4);
84
+ device.queue.writeBuffer(vb, 0, new Float32Array(rects));
85
+ pass.setPipeline(pipeline);
86
+ pass.setVertexBuffer(0, vb);
87
+ pass.draw(rects.length / 4);
88
+ }
89
+ pass.end();
90
+ device.queue.submit([encoder.finish()]);
91
+ }
92
+ destroy() {
93
+ if (this.vertexBuffer) {
94
+ this.vertexBuffer.destroy();
95
+ this.vertexBuffer = null;
96
+ }
97
+ this.pipeline = null;
98
+ this.context = null;
99
+ this.device = null;
100
+ this.adapter = null;
101
+ this.format = null;
102
+ this._initialized = false;
103
+ }
104
+ createPipeline(device, format) {
105
+ const shader = device.createShaderModule({
106
+ code: `
107
+ struct VSOut {
108
+ @builtin(position) position: vec4f,
109
+ @location(0) color: vec4f,
110
+ }
111
+
112
+ @vertex
113
+ fn vs_main(
114
+ @location(0) pos: vec2f,
115
+ @location(1) color: vec4f,
116
+ ) -> VSOut {
117
+ var out: VSOut;
118
+ out.position = vec4f(pos.x, pos.y, 0.0, 1.0);
119
+ out.color = color;
120
+ return out;
121
+ }
122
+
123
+ @fragment
124
+ fn fs_main(@location(0) color: vec4f) -> @location(0) vec4f {
125
+ return color;
126
+ }
127
+ `,
128
+ });
129
+ return device.createRenderPipeline({
130
+ layout: 'auto',
131
+ vertex: {
132
+ module: shader,
133
+ entryPoint: 'vs_main',
134
+ buffers: [{
135
+ arrayStride: 6 * 4,
136
+ attributes: [
137
+ { shaderLocation: 0, offset: 0, format: 'float32x2' },
138
+ { shaderLocation: 1, offset: 2 * 4, format: 'float32x4' },
139
+ ],
140
+ }],
141
+ },
142
+ fragment: {
143
+ module: shader,
144
+ entryPoint: 'fs_main',
145
+ targets: [{ format }],
146
+ },
147
+ primitive: {
148
+ topology: 'triangle-list',
149
+ },
150
+ });
151
+ }
152
+ ensureVertexBuffer(requiredBytes) {
153
+ const device = this.device;
154
+ if (this.vertexBuffer && this.vertexCapacity >= requiredBytes) {
155
+ return this.vertexBuffer;
156
+ }
157
+ if (this.vertexBuffer)
158
+ this.vertexBuffer.destroy();
159
+ this.vertexCapacity = Math.max(requiredBytes, 1024 * 16);
160
+ this.vertexBuffer = device.createBuffer({
161
+ size: this.vertexCapacity,
162
+ usage: 0x0020 | 0x0008, // VERTEX | COPY_DST
163
+ });
164
+ return this.vertexBuffer;
165
+ }
166
+ collectSolidBoxes(element, layout, offsetX, offsetY, out, unsupported) {
167
+ const x = offsetX + layout.x;
168
+ const y = offsetY + layout.y;
169
+ const w = layout.width;
170
+ const h = layout.height;
171
+ if (element.kind === 'box') {
172
+ const { backgroundColor, borderRadius, gradient, boxShadow, opacity } = element.props;
173
+ if (backgroundColor && !borderRadius && !gradient && !boxShadow) {
174
+ const [r, g, b, a] = parseColor(backgroundColor);
175
+ const alpha = opacity === undefined ? a : a * opacity;
176
+ pushRectVertices(out, x, y, w, h, this.canvas.width, this.canvas.height, r, g, b, alpha);
177
+ }
178
+ else if (gradient || borderRadius || boxShadow) {
179
+ unsupported.count++;
180
+ }
181
+ const childOffsetX = x - (element.props.scrollX ?? 0);
182
+ const childOffsetY = y - (element.props.scrollY ?? 0);
183
+ for (let i = 0; i < element.children.length; i++) {
184
+ const childLayout = layout.children[i];
185
+ if (childLayout) {
186
+ this.collectSolidBoxes(element.children[i], childLayout, childOffsetX, childOffsetY, out, unsupported);
187
+ }
188
+ }
189
+ return;
190
+ }
191
+ unsupported.count++;
192
+ }
193
+ }
194
+ function pushRectVertices(out, x, y, w, h, canvasW, canvasH, r, g, b, a) {
195
+ const x0 = (x / canvasW) * 2 - 1;
196
+ const y0 = 1 - (y / canvasH) * 2;
197
+ const x1 = ((x + w) / canvasW) * 2 - 1;
198
+ const y1 = 1 - ((y + h) / canvasH) * 2;
199
+ // Triangle 1
200
+ out.push(x0, y0, r, g, b, a);
201
+ out.push(x1, y0, r, g, b, a);
202
+ out.push(x0, y1, r, g, b, a);
203
+ // Triangle 2
204
+ out.push(x1, y0, r, g, b, a);
205
+ out.push(x1, y1, r, g, b, a);
206
+ out.push(x0, y1, r, g, b, a);
207
+ }
208
+ function parseColor(color) {
209
+ if (color.startsWith('#')) {
210
+ const hex = color.slice(1);
211
+ const full = hex.length === 3
212
+ ? hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2]
213
+ : hex;
214
+ const r = parseInt(full.slice(0, 2), 16) / 255;
215
+ const g = parseInt(full.slice(2, 4), 16) / 255;
216
+ const b = parseInt(full.slice(4, 6), 16) / 255;
217
+ return [r, g, b, 1];
218
+ }
219
+ const m = color.match(/rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)(?:\s*,\s*([0-9.]+))?\s*\)/);
220
+ if (m) {
221
+ return [
222
+ Number(m[1]) / 255,
223
+ Number(m[2]) / 255,
224
+ Number(m[3]) / 255,
225
+ m[4] === undefined ? 1 : Number(m[4]),
226
+ ];
227
+ }
228
+ return [0, 0, 0, 1];
229
+ }
230
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@geometra/renderer-webgpu",
3
+ "version": "1.0.1",
4
+ "description": "WebGPU renderer scaffold for Geometra",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/razroo/geometra",
10
+ "directory": "packages/renderer-webgpu"
11
+ },
12
+ "homepage": "https://razroo.github.io/geometra",
13
+ "keywords": [
14
+ "geometra",
15
+ "renderer",
16
+ "webgpu",
17
+ "dom-free",
18
+ "gpu"
19
+ ],
20
+ "main": "./dist/index.js",
21
+ "types": "./dist/index.d.ts",
22
+ "exports": {
23
+ ".": {
24
+ "types": "./dist/index.d.ts",
25
+ "import": "./dist/index.js"
26
+ }
27
+ },
28
+ "files": [
29
+ "dist"
30
+ ],
31
+ "scripts": {
32
+ "build": "rm -rf dist && tsc -p tsconfig.build.json",
33
+ "check": "tsc --noEmit"
34
+ },
35
+ "dependencies": {
36
+ "@geometra/core": "^1.0.1"
37
+ }
38
+ }