@gjsify/webgl 0.48.0 → 0.50.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/README.md +30 -0
- package/lib/types/webgl-bridge.d.ts +6 -24
- package/package.json +18 -18
package/README.md
CHANGED
|
@@ -227,6 +227,36 @@ predicted wrongly once — see [Platform coverage](#platform-coverage) above. Ho
|
|
|
227
227
|
`gjsify run packages/framework/webgl/scripts/probe-gl-host.js`, which also draws a
|
|
228
228
|
shader-free pattern so a blank window cannot be mistaken for a failed shader.
|
|
229
229
|
|
|
230
|
+
## HiDPI: the two canvas bridges are NOT symmetric
|
|
231
|
+
|
|
232
|
+
**This asymmetry is a whole bug class, and it is invisible on every machine you are likely to develop on.**
|
|
233
|
+
|
|
234
|
+
GTK silently pre-scales a `Gtk.DrawingArea`'s Cairo context, so Canvas2D code written in logical pixels renders sharp with nothing to do. `Gtk.GLArea` does **not**: its framebuffer is `allocation x scale-factor` and `gl.viewport` is in raw device pixels.
|
|
235
|
+
|
|
236
|
+
So the GL side reports the DRAWING BUFFER in device pixels (`canvas.width` / `canvas.height`, hence `gl.drawingBufferWidth`) while CSS layout size stays logical (`clientWidth` / `offsetWidth`), and `installGlobals()` publishes `devicePixelRatio` as an ACCESSOR over the widget's live `get_scale_factor()`. The identity
|
|
237
|
+
|
|
238
|
+
```
|
|
239
|
+
clientWidth * devicePixelRatio === canvas.width
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
is what lets an unmodified Three.js or Excalibur viewport cover the whole framebuffer.
|
|
243
|
+
|
|
244
|
+
Reporting the allocation as `canvas.width` — as this bridge did until 2026-08 — is invisible at scale-factor 1, which is every desktop, every CI runner and every test VM. On the first scale-factor-3 host it drew each scene into the bottom-left NINTH of its widget: measured on a OnePlus 6T running postmarketOS / GNOME Mobile, where the teapot, the pixel-postprocessing and the Excalibur showcases all rendered a 120x218 corner of a 360x655-logical widget.
|
|
245
|
+
|
|
246
|
+
`@gjsify/dom-elements`' register seeds `devicePixelRatio: 1` as the widget-less default only. A real `Gtk.GLArea` cannot regression-test this, because its host reports 1 — `html-canvas-element.spec.ts` varies the scale factor through a stub, which is the entire point of that stub.
|
|
247
|
+
|
|
248
|
+
## Naming the GL you actually got
|
|
249
|
+
|
|
250
|
+
`WEBGL_debug_renderer_info` is implemented (the spec'd `VENDOR` / `RENDERER` stay masked) and `bridge.rendererInfo` reads it, so a CPU rasteriser (`isSoftwareRenderer`) costs ONE stderr line. A GPU-less host is otherwise invisible: every draw call succeeds, and only the frame budget tells.
|
|
251
|
+
|
|
252
|
+
**It is DIAGNOSTIC ONLY.** The same driver carries a demand-driven three.js scene and needs 1.1 s for a single textured full-screen draw in a game, so a renderer swap keys on a MEASURED frame budget, never on this string.
|
|
253
|
+
|
|
254
|
+
## Resize, clone and the WebGL2 overrides
|
|
255
|
+
|
|
256
|
+
- On resize `WebGLBridge` dispatches a DOM `resize` and re-invokes the last rAF callback — demand-driven re-render, no animation loop.
|
|
257
|
+
- A canvas clones PLAIN (`_createCloneTarget`): there is one GLArea and it stays with the original.
|
|
258
|
+
- `WebGL2RenderingContext` overrides `texImage2D`, `texSubImage2D` and `drawElements` from the WebGL1 base, bypassing WebGL1 format/type validation — the native Vala side handles all GLES 3.2 formats.
|
|
259
|
+
|
|
230
260
|
## Diagnosing a host
|
|
231
261
|
|
|
232
262
|
```bash
|
|
@@ -128,11 +128,8 @@ export declare const WebGLBridge: {
|
|
|
128
128
|
$signals: Gtk.GLArea.SignalSignatures;
|
|
129
129
|
_init(...args: any[]): void;
|
|
130
130
|
connect<K extends keyof Gtk.GLArea.SignalSignatures>(signal: K, callback: GObject.SignalCallback</*elided*/ any, Gtk.GLArea.SignalSignatures[K]>): number;
|
|
131
|
-
connect(signal: string, callback: (...args: any[]) => any): number;
|
|
132
131
|
connect_after<K extends keyof Gtk.GLArea.SignalSignatures>(signal: K, callback: GObject.SignalCallback</*elided*/ any, Gtk.GLArea.SignalSignatures[K]>): number;
|
|
133
|
-
|
|
134
|
-
emit<K extends keyof Gtk.GLArea.SignalSignatures>(signal: K, ...args: GObject.GjsParameters<Gtk.GLArea.SignalSignatures[K]> extends [any, ...infer Q] ? Q : never): void;
|
|
135
|
-
emit(signal: string, ...args: any[]): void;
|
|
132
|
+
emit<K extends keyof Gtk.GLArea.SignalSignatures>(signal: K, ...args: GObject.GjsParameters<Gtk.GLArea.SignalSignatures[K]>): void;
|
|
136
133
|
vfunc_render(context: Gdk.GLContext): boolean;
|
|
137
134
|
vfunc_resize(width: number, height: number): void;
|
|
138
135
|
attach_buffers(): void;
|
|
@@ -632,11 +629,8 @@ export declare const WebGLBridge: {
|
|
|
632
629
|
$signals: Gtk.GLArea.SignalSignatures;
|
|
633
630
|
_init(...args: any[]): void;
|
|
634
631
|
connect<K extends keyof Gtk.GLArea.SignalSignatures>(signal: K, callback: GObject.SignalCallback</*elided*/ any, Gtk.GLArea.SignalSignatures[K]>): number;
|
|
635
|
-
connect(signal: string, callback: (...args: any[]) => any): number;
|
|
636
632
|
connect_after<K extends keyof Gtk.GLArea.SignalSignatures>(signal: K, callback: GObject.SignalCallback</*elided*/ any, Gtk.GLArea.SignalSignatures[K]>): number;
|
|
637
|
-
|
|
638
|
-
emit<K extends keyof Gtk.GLArea.SignalSignatures>(signal: K, ...args: GObject.GjsParameters<Gtk.GLArea.SignalSignatures[K]> extends [any, ...infer Q] ? Q : never): void;
|
|
639
|
-
emit(signal: string, ...args: any[]): void;
|
|
633
|
+
emit<K extends keyof Gtk.GLArea.SignalSignatures>(signal: K, ...args: GObject.GjsParameters<Gtk.GLArea.SignalSignatures[K]>): void;
|
|
640
634
|
vfunc_render(context: Gdk.GLContext): boolean;
|
|
641
635
|
vfunc_resize(width: number, height: number): void;
|
|
642
636
|
attach_buffers(): void;
|
|
@@ -1136,11 +1130,8 @@ export declare const WebGLBridge: {
|
|
|
1136
1130
|
$signals: Gtk.GLArea.SignalSignatures;
|
|
1137
1131
|
_init(...args: any[]): void;
|
|
1138
1132
|
connect<K extends keyof Gtk.GLArea.SignalSignatures>(signal: K, callback: GObject.SignalCallback</*elided*/ any, Gtk.GLArea.SignalSignatures[K]>): number;
|
|
1139
|
-
connect(signal: string, callback: (...args: any[]) => any): number;
|
|
1140
1133
|
connect_after<K extends keyof Gtk.GLArea.SignalSignatures>(signal: K, callback: GObject.SignalCallback</*elided*/ any, Gtk.GLArea.SignalSignatures[K]>): number;
|
|
1141
|
-
|
|
1142
|
-
emit<K extends keyof Gtk.GLArea.SignalSignatures>(signal: K, ...args: GObject.GjsParameters<Gtk.GLArea.SignalSignatures[K]> extends [any, ...infer Q] ? Q : never): void;
|
|
1143
|
-
emit(signal: string, ...args: any[]): void;
|
|
1134
|
+
emit<K extends keyof Gtk.GLArea.SignalSignatures>(signal: K, ...args: GObject.GjsParameters<Gtk.GLArea.SignalSignatures[K]>): void;
|
|
1144
1135
|
vfunc_render(context: Gdk.GLContext): boolean;
|
|
1145
1136
|
vfunc_resize(width: number, height: number): void;
|
|
1146
1137
|
attach_buffers(): void;
|
|
@@ -1640,11 +1631,8 @@ export declare const WebGLBridge: {
|
|
|
1640
1631
|
$signals: Gtk.GLArea.SignalSignatures;
|
|
1641
1632
|
_init(...args: any[]): void;
|
|
1642
1633
|
connect<K extends keyof Gtk.GLArea.SignalSignatures>(signal: K, callback: GObject.SignalCallback</*elided*/ any, Gtk.GLArea.SignalSignatures[K]>): number;
|
|
1643
|
-
connect(signal: string, callback: (...args: any[]) => any): number;
|
|
1644
1634
|
connect_after<K extends keyof Gtk.GLArea.SignalSignatures>(signal: K, callback: GObject.SignalCallback</*elided*/ any, Gtk.GLArea.SignalSignatures[K]>): number;
|
|
1645
|
-
|
|
1646
|
-
emit<K extends keyof Gtk.GLArea.SignalSignatures>(signal: K, ...args: GObject.GjsParameters<Gtk.GLArea.SignalSignatures[K]> extends [any, ...infer Q] ? Q : never): void;
|
|
1647
|
-
emit(signal: string, ...args: any[]): void;
|
|
1635
|
+
emit<K extends keyof Gtk.GLArea.SignalSignatures>(signal: K, ...args: GObject.GjsParameters<Gtk.GLArea.SignalSignatures[K]>): void;
|
|
1648
1636
|
vfunc_render(context: Gdk.GLContext): boolean;
|
|
1649
1637
|
vfunc_resize(width: number, height: number): void;
|
|
1650
1638
|
attach_buffers(): void;
|
|
@@ -2144,11 +2132,8 @@ export declare const WebGLBridge: {
|
|
|
2144
2132
|
$signals: Gtk.GLArea.SignalSignatures;
|
|
2145
2133
|
_init(...args: any[]): void;
|
|
2146
2134
|
connect<K extends keyof Gtk.GLArea.SignalSignatures>(signal: K, callback: GObject.SignalCallback</*elided*/ any, Gtk.GLArea.SignalSignatures[K]>): number;
|
|
2147
|
-
connect(signal: string, callback: (...args: any[]) => any): number;
|
|
2148
2135
|
connect_after<K extends keyof Gtk.GLArea.SignalSignatures>(signal: K, callback: GObject.SignalCallback</*elided*/ any, Gtk.GLArea.SignalSignatures[K]>): number;
|
|
2149
|
-
|
|
2150
|
-
emit<K extends keyof Gtk.GLArea.SignalSignatures>(signal: K, ...args: GObject.GjsParameters<Gtk.GLArea.SignalSignatures[K]> extends [any, ...infer Q] ? Q : never): void;
|
|
2151
|
-
emit(signal: string, ...args: any[]): void;
|
|
2136
|
+
emit<K extends keyof Gtk.GLArea.SignalSignatures>(signal: K, ...args: GObject.GjsParameters<Gtk.GLArea.SignalSignatures[K]>): void;
|
|
2152
2137
|
vfunc_render(context: Gdk.GLContext): boolean;
|
|
2153
2138
|
vfunc_resize(width: number, height: number): void;
|
|
2154
2139
|
attach_buffers(): void;
|
|
@@ -2648,11 +2633,8 @@ export declare const WebGLBridge: {
|
|
|
2648
2633
|
$signals: Gtk.GLArea.SignalSignatures;
|
|
2649
2634
|
_init(...args: any[]): void;
|
|
2650
2635
|
connect<K extends keyof Gtk.GLArea.SignalSignatures>(signal: K, callback: GObject.SignalCallback</*elided*/ any, Gtk.GLArea.SignalSignatures[K]>): number;
|
|
2651
|
-
connect(signal: string, callback: (...args: any[]) => any): number;
|
|
2652
2636
|
connect_after<K extends keyof Gtk.GLArea.SignalSignatures>(signal: K, callback: GObject.SignalCallback</*elided*/ any, Gtk.GLArea.SignalSignatures[K]>): number;
|
|
2653
|
-
|
|
2654
|
-
emit<K extends keyof Gtk.GLArea.SignalSignatures>(signal: K, ...args: GObject.GjsParameters<Gtk.GLArea.SignalSignatures[K]> extends [any, ...infer Q] ? Q : never): void;
|
|
2655
|
-
emit(signal: string, ...args: any[]): void;
|
|
2637
|
+
emit<K extends keyof Gtk.GLArea.SignalSignatures>(signal: K, ...args: GObject.GjsParameters<Gtk.GLArea.SignalSignatures[K]>): void;
|
|
2656
2638
|
vfunc_render(context: Gdk.GLContext): boolean;
|
|
2657
2639
|
vfunc_resize(width: number, height: number): void;
|
|
2658
2640
|
attach_buffers(): void;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gjsify/webgl",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.50.0",
|
|
4
4
|
"description": "WebGL module for Gjs",
|
|
5
5
|
"module": "lib/esm/index.js",
|
|
6
6
|
"types": "lib/types/index.d.ts",
|
|
@@ -61,21 +61,21 @@
|
|
|
61
61
|
"WebGL"
|
|
62
62
|
],
|
|
63
63
|
"devDependencies": {
|
|
64
|
-
"@gjsify/cli": "^0.
|
|
65
|
-
"@gjsify/unit": "^0.
|
|
64
|
+
"@gjsify/cli": "^0.50.0",
|
|
65
|
+
"@gjsify/unit": "^0.50.0",
|
|
66
66
|
"@types/bit-twiddle": "^1.0.3",
|
|
67
67
|
"@types/node": "^25.9.2",
|
|
68
68
|
"typescript": "^6.0.3"
|
|
69
69
|
},
|
|
70
70
|
"dependencies": {
|
|
71
|
-
"@girs/gdkpixbuf-2.0": "
|
|
72
|
-
"@girs/gjs": "
|
|
73
|
-
"@girs/gtk-4.0": "
|
|
71
|
+
"@girs/gdkpixbuf-2.0": "5.0.0",
|
|
72
|
+
"@girs/gjs": "5.0.0",
|
|
73
|
+
"@girs/gtk-4.0": "5.0.0",
|
|
74
74
|
"@girs/gwebgl-0.1": "0.1.0-4.0.0-rc.5",
|
|
75
|
-
"@gjsify/dom-elements": "^0.
|
|
76
|
-
"@gjsify/dom-events": "^0.
|
|
77
|
-
"@gjsify/event-bridge": "^0.
|
|
78
|
-
"@gjsify/utils": "^0.
|
|
75
|
+
"@gjsify/dom-elements": "^0.50.0",
|
|
76
|
+
"@gjsify/dom-events": "^0.50.0",
|
|
77
|
+
"@gjsify/event-bridge": "^0.50.0",
|
|
78
|
+
"@gjsify/utils": "^0.50.0",
|
|
79
79
|
"bit-twiddle": "^1.0.2",
|
|
80
80
|
"glsl-tokenizer": "^2.1.5"
|
|
81
81
|
},
|
|
@@ -90,13 +90,13 @@
|
|
|
90
90
|
},
|
|
91
91
|
"homepage": "https://github.com/gjsify/gjsify/tree/main/packages/framework/webgl#readme",
|
|
92
92
|
"optionalDependencies": {
|
|
93
|
-
"@gjsify/webgl-darwin-arm64": "0.
|
|
94
|
-
"@gjsify/webgl-darwin-x64": "0.
|
|
95
|
-
"@gjsify/webgl-linux-arm64": "0.
|
|
96
|
-
"@gjsify/webgl-linux-ppc64": "0.
|
|
97
|
-
"@gjsify/webgl-linux-riscv64": "0.
|
|
98
|
-
"@gjsify/webgl-linux-s390x": "0.
|
|
99
|
-
"@gjsify/webgl-linux-x64": "0.
|
|
100
|
-
"@gjsify/webgl-win32-x64": "0.
|
|
93
|
+
"@gjsify/webgl-darwin-arm64": "0.50.0",
|
|
94
|
+
"@gjsify/webgl-darwin-x64": "0.50.0",
|
|
95
|
+
"@gjsify/webgl-linux-arm64": "0.50.0",
|
|
96
|
+
"@gjsify/webgl-linux-ppc64": "0.50.0",
|
|
97
|
+
"@gjsify/webgl-linux-riscv64": "0.50.0",
|
|
98
|
+
"@gjsify/webgl-linux-s390x": "0.50.0",
|
|
99
|
+
"@gjsify/webgl-linux-x64": "0.50.0",
|
|
100
|
+
"@gjsify/webgl-win32-x64": "0.50.0"
|
|
101
101
|
}
|
|
102
102
|
}
|