@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 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
- connect_after(signal: string, callback: (...args: any[]) => any): number;
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
- connect_after(signal: string, callback: (...args: any[]) => any): number;
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
- connect_after(signal: string, callback: (...args: any[]) => any): number;
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
- connect_after(signal: string, callback: (...args: any[]) => any): number;
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
- connect_after(signal: string, callback: (...args: any[]) => any): number;
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
- connect_after(signal: string, callback: (...args: any[]) => any): number;
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.48.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.48.0",
65
- "@gjsify/unit": "^0.48.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": "4.6.0",
72
- "@girs/gjs": "4.6.0",
73
- "@girs/gtk-4.0": "4.6.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.48.0",
76
- "@gjsify/dom-events": "^0.48.0",
77
- "@gjsify/event-bridge": "^0.48.0",
78
- "@gjsify/utils": "^0.48.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.48.0",
94
- "@gjsify/webgl-darwin-x64": "0.48.0",
95
- "@gjsify/webgl-linux-arm64": "0.48.0",
96
- "@gjsify/webgl-linux-ppc64": "0.48.0",
97
- "@gjsify/webgl-linux-riscv64": "0.48.0",
98
- "@gjsify/webgl-linux-s390x": "0.48.0",
99
- "@gjsify/webgl-linux-x64": "0.48.0",
100
- "@gjsify/webgl-win32-x64": "0.48.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
  }