webgl2 1.3.0 → 1.3.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/coverage.md CHANGED
@@ -4,50 +4,52 @@
4
4
 
5
5
  | File | Lines Covered | Lines Missed | Total Lines | Coverage |
6
6
  |---|---|---|---|---:|
7
- | src/coverage.rs | 12 | 5 | 17 | 70.59% 🟡 |
8
- | src/decompiler/ast.rs | 3 | 2 | 5 | 60.00% 🟡 |
9
- | src/decompiler/emitter.rs | 6 | 0 | 6 | 100.00% 🟢 |
10
- | src/decompiler/lifter.rs | 10 | 1 | 11 | 90.91% 🟢 |
11
- | src/decompiler/module.rs | 1 | 0 | 1 | 100.00% 🟢 |
12
- | src/decompiler/parser.rs | 15 | 5 | 20 | 75.00% 🟡 |
13
- | src/decompiler/simplifier.rs | 35 | 6 | 41 | 85.37% 🟢 |
14
- | src/error.rs | 34 | 7 | 41 | 82.93% 🟢 |
15
- | src/lib.rs | 183 | 310 | 493 | 37.12% 🟠 |
16
- | src/naga_wasm_backend/backend.rs | 161 | 29 | 190 | 84.74% 🟢 |
17
- | src/naga_wasm_backend/call_lowering.rs | 10 | 5 | 15 | 66.67% 🟡 |
18
- | src/naga_wasm_backend/control_flow.rs | 37 | 30 | 67 | 55.22% 🟡 |
19
- | src/naga_wasm_backend/debug/stub.rs | 11 | 15 | 26 | 42.31% 🟠 |
20
- | src/naga_wasm_backend/expressions.rs | 255 | 152 | 407 | 62.65% 🟡 |
21
- | src/naga_wasm_backend/function_abi.rs | 14 | 5 | 19 | 73.68% 🟡 |
22
- | src/naga_wasm_backend/functions/prep.rs | 8 | 0 | 8 | 100.00% 🟢 |
23
- | src/naga_wasm_backend/functions/registry.rs | 1 | 0 | 1 | 100.00% 🟢 |
24
- | src/naga_wasm_backend/memory_layout.rs | 12 | 0 | 12 | 100.00% 🟢 |
25
- | src/naga_wasm_backend/mod.rs | 9 | 1 | 10 | 90.00% 🟢 |
26
- | src/naga_wasm_backend/output_layout.rs | 7 | 2 | 9 | 77.78% 🟡 |
27
- | src/naga_wasm_backend/types.rs | 14 | 6 | 20 | 70.00% 🟡 |
7
+ | src/coverage.rs | 9 | 5 | 14 | 64.29% 🟡 |
8
+ | src/decompiler/ast.rs | 6 | 0 | 6 | 100.00% 🟢 |
9
+ | src/decompiler/emitter.rs | 24 | 3 | 27 | 88.89% 🟢 |
10
+ | src/decompiler/lifter.rs | 6 | 2 | 8 | 75.00% 🟡 |
11
+ | src/decompiler/parser.rs | 12 | 3 | 15 | 80.00% 🟢 |
12
+ | src/decompiler/simplifier.rs | 36 | 2 | 38 | 94.74% 🟢 |
13
+ | src/error.rs | 33 | 8 | 41 | 80.49% 🟢 |
14
+ | src/lib.rs | 155 | 298 | 453 | 34.22% 🟠 |
15
+ | src/naga_wasm_backend/backend.rs | 151 | 24 | 175 | 86.29% 🟢 |
16
+ | src/naga_wasm_backend/call_lowering.rs | 9 | 3 | 12 | 75.00% 🟡 |
17
+ | src/naga_wasm_backend/control_flow.rs | 38 | 30 | 68 | 55.88% 🟡 |
18
+ | src/naga_wasm_backend/debug/stub.rs | 11 | 16 | 27 | 40.74% 🟠 |
19
+ | src/naga_wasm_backend/expressions.rs | 270 | 155 | 425 | 63.53% 🟡 |
20
+ | src/naga_wasm_backend/function_abi.rs | 15 | 8 | 23 | 65.22% 🟡 |
21
+ | src/naga_wasm_backend/functions/prep.rs | 5 | 0 | 5 | 100.00% 🟢 |
22
+ | src/naga_wasm_backend/functions/registry.rs | 6 | 0 | 6 | 100.00% 🟢 |
23
+ | src/naga_wasm_backend/memory_layout.rs | 15 | 1 | 16 | 93.75% 🟢 |
24
+ | src/naga_wasm_backend/mod.rs | 6 | 0 | 6 | 100.00% 🟢 |
25
+ | src/naga_wasm_backend/output_layout.rs | 7 | 1 | 8 | 87.50% 🟢 |
26
+ | src/naga_wasm_backend/types.rs | 22 | 6 | 28 | 78.57% 🟡 |
27
+ | src/wasm_gl_emu/device.rs | 3 | 0 | 3 | 100.00% 🟢 |
28
28
  | src/wasm_gl_emu/framebuffer.rs | 1 | 0 | 1 | 100.00% 🟢 |
29
- | src/wasm_gl_emu/rasterizer.rs | 38 | 26 | 64 | 59.38% 🟡 |
30
- | src/wasm_gl_emu/transfer.rs | 1 | 0 | 1 | 100.00% 🟢 |
31
- | src/webgl2_context/blend.rs | 6 | 0 | 6 | 100.00% 🟢 |
32
- | src/webgl2_context/buffers.rs | 15 | 1 | 16 | 93.75% 🟢 |
33
- | src/webgl2_context/drawing.rs | 31 | 1 | 32 | 96.88% 🟢 |
34
- | src/webgl2_context/registry.rs | 13 | 1 | 14 | 92.86% 🟢 |
35
- | src/webgl2_context/shaders.rs | 147 | 21 | 168 | 87.50% 🟢 |
36
- | src/webgl2_context/state.rs | 15 | 16 | 31 | 48.39% 🟠 |
37
- | src/webgl2_context/textures.rs | 52 | 0 | 52 | 100.00% 🟢 |
38
- | src/webgl2_context/types.rs | 24 | 9 | 33 | 72.73% 🟡 |
39
- | src/webgpu/adapter.rs | 13 | 6 | 19 | 68.42% 🟡 |
40
- | src/webgpu/backend.rs | 72 | 9 | 81 | 88.89% 🟢 |
41
- | src/webgpu/buffer.rs | 0 | 3 | 3 | 0.00% 🟡 |
42
- | src/webgpu/command.rs | 23 | 4 | 27 | 85.19% 🟢 |
43
- | src/webgpu/pipeline.rs | 1 | 0 | 1 | 100.00% 🟢 |
44
- | **Total** | **1290** | **678** | **1968** | **65.55% 🟡** |
29
+ | src/wasm_gl_emu/rasterizer.rs | 16 | 41 | 57 | 28.07% 🟠 |
30
+ | src/wasm_gl_emu/transfer.rs | 3 | 0 | 3 | 100.00% 🟢 |
31
+ | src/webgl2_context/blend.rs | 14 | 1 | 15 | 93.33% 🟢 |
32
+ | src/webgl2_context/buffers.rs | 12 | 0 | 12 | 100.00% 🟢 |
33
+ | src/webgl2_context/drawing.rs | 33 | 0 | 33 | 100.00% 🟢 |
34
+ | src/webgl2_context/ephemeral.rs | 0 | 1 | 1 | 0.00% 🟡 |
35
+ | src/webgl2_context/framebuffers.rs | 8 | 6 | 14 | 57.14% 🟡 |
36
+ | src/webgl2_context/registry.rs | 11 | 0 | 11 | 100.00% 🟢 |
37
+ | src/webgl2_context/shaders.rs | 137 | 29 | 166 | 82.53% 🟢 |
38
+ | src/webgl2_context/state.rs | 33 | 9 | 42 | 78.57% 🟡 |
39
+ | src/webgl2_context/textures.rs | 60 | 0 | 60 | 100.00% 🟢 |
40
+ | src/webgl2_context/types.rs | 45 | 21 | 66 | 68.18% 🟡 |
41
+ | src/webgpu/adapter.rs | 3 | 0 | 3 | 100.00% 🟢 |
42
+ | src/webgpu/backend.rs | 52 | 17 | 69 | 75.36% 🟡 |
43
+ | src/webgpu/bind_group.rs | 6 | 1 | 7 | 85.71% 🟢 |
44
+ | src/webgpu/buffer.rs | 8 | 2 | 10 | 80.00% 🟢 |
45
+ | src/webgpu/command.rs | 12 | 5 | 17 | 70.59% 🟡 |
46
+ | **Total** | **1293** | **698** | **1991** | **64.94% 🟡** |
45
47
 
46
48
  ## Top Missed Files
47
49
 
48
50
  | File | Lines Missed | Illustrative Line | Coverage |
49
51
  |---|---|---|---:|
50
- | src/lib.rs | 310/493 | [1996] `}` | 37.12% 🟠 |
51
- | src/naga_wasm_backend/expressions.rs | 152/407 | [1845] `translate_expression_component(*arg, j, ctx)?;` | 62.65% 🟡 |
52
- | src/naga_wasm_backend/control_flow.rs | 30/67 | [488] `if let Some(ret) = &called_func.result {` | 55.22% 🟡 |
53
- | src/naga_wasm_backend/backend.rs | 29/190 | [469] `func.instruction(&Instruction::F32Div);` | 84.74% 🟢 |
52
+ | src/lib.rs | 298/453 | [1994] `vertex_module_handle: u32,` | 34.22% 🟠 |
53
+ | src/naga_wasm_backend/expressions.rs | 155/425 | [910] `if let Some(handle) = found_global {` | 63.53% 🟡 |
54
+ | src/wasm_gl_emu/rasterizer.rs | 41/57 | [370] `match eq {` | 28.07% 🟠 |
55
+ | src/naga_wasm_backend/control_flow.rs | 30/68 | [489] `let types = super::types::naga_to_wasm_types(` | 55.88% 🟡 |
package/index.js CHANGED
@@ -366,16 +366,23 @@ async function initWASM({ debug } = {}) {
366
366
  */
367
367
  function _readErrorMessage(instance) {
368
368
  const ex = instance.exports;
369
- if (!ex || typeof ex.wasm_last_error_ptr !== 'function' || typeof ex.wasm_last_error_len !== 'function') {
369
+ if (!ex || typeof ex.wasm_last_error !== 'function') {
370
+ if (typeof ex.wasm_last_error_ptr === 'function') {
371
+ const ptr = ex.wasm_last_error_ptr();
372
+ const len = ex.wasm_last_error_len();
373
+ if (ptr === 0 || len === 0) return '';
374
+ const mem = new Uint8Array(ex.memory.buffer);
375
+ const bytes = mem.subarray(ptr, ptr + len);
376
+ return new TextDecoder('utf-8').decode(bytes);
377
+ }
370
378
  return '(no error message available)';
371
379
  }
372
- const ptr = ex.wasm_last_error_ptr();
373
- const len = ex.wasm_last_error_len();
374
- if (ptr === 0 || len === 0) {
375
- return '';
376
- }
380
+ const ptr = ex.wasm_last_error();
381
+ if (ptr === 0) return '';
382
+ const dv = new DataView(ex.memory.buffer);
383
+ const len = dv.getUint32(ptr - 16, true);
377
384
  const mem = new Uint8Array(ex.memory.buffer);
378
- const bytes = mem.subarray(ptr, ptr + len);
385
+ const bytes = mem.slice(ptr, ptr + len);
379
386
  return new TextDecoder('utf-8').decode(bytes);
380
387
  }
381
388
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "webgl2",
3
- "version": "1.3.0",
3
+ "version": "1.3.1",
4
4
  "description": "WebGL2 tools to derisk large GPU projects on the web beyond toys and demos.",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -709,48 +709,31 @@ export class WasmWebGL2RenderingContext {
709
709
  throw new Error('wasm_ctx_read_pixels not found');
710
710
  }
711
711
 
712
- let bpp = 4;
713
- if (type_ === 0x1406) { // GL_FLOAT
714
- if (format === 0x1908) bpp = 16; // GL_RGBA
715
- else if (format === 0x8227) bpp = 8; // GL_RG
716
- else if (format === 0x1903) bpp = 4; // GL_RED
717
- } else if (type_ === 0x1405 || type_ === 0x1404) { // GL_UNSIGNED_INT or GL_INT
718
- if (format === 0x8D9E) bpp = 16; // GL_RGBA_INTEGER
719
- else if (format === 0x8228) bpp = 8; // GL_RG_INTEGER
720
- else if (format === 0x8D94) bpp = 4; // GL_RED_INTEGER
721
- } else if (type_ === 0x1401) { // GL_UNSIGNED_BYTE
722
- if (format === 0x1908) bpp = 4;
723
- }
724
-
725
- const len = width * height * bpp;
726
- if (!out || out.byteLength < len) {
727
- throw new Error(`output buffer too small (need ${len} bytes, have ${out ? out.byteLength : 0})`);
712
+ const ptr = ex.wasm_ctx_read_pixels(
713
+ this._ctxHandle,
714
+ x | 0,
715
+ y | 0,
716
+ width >>> 0,
717
+ height >>> 0,
718
+ format >>> 0,
719
+ type_ >>> 0
720
+ );
721
+
722
+ if (ptr === 0) {
723
+ const msg = readErrorMessage(this._instance);
724
+ throw new Error(`readPixels failed: ${msg}`);
728
725
  }
729
726
 
730
- const ptr = ex.wasm_alloc(len);
731
- if (ptr === 0) throw new Error('Failed to allocate memory for readPixels output');
727
+ const dv = new DataView(ex.memory.buffer);
728
+ const len = dv.getUint32(ptr - 16, true);
732
729
 
733
- try {
734
- const code = ex.wasm_ctx_read_pixels(
735
- this._ctxHandle,
736
- x | 0,
737
- y | 0,
738
- width >>> 0,
739
- height >>> 0,
740
- format >>> 0,
741
- type_ >>> 0,
742
- ptr >>> 0,
743
- len >>> 0
744
- );
745
- _checkErr(code, this._instance);
746
-
747
- const mem = new Uint8Array(ex.memory.buffer);
748
- const src = mem.subarray(ptr, ptr + len);
749
- const out_bytes = new Uint8Array(out.buffer, out.byteOffset, len);
750
- out_bytes.set(src);
751
- } finally {
752
- ex.wasm_free(ptr);
730
+ if (!out || out.byteLength < len) {
731
+ throw new Error(`output buffer too small (need ${len} bytes, have ${out ? out.byteLength : 0})`);
753
732
  }
733
+
734
+ const src = new Uint8Array(ex.memory.buffer, ptr, len);
735
+ const out_bytes = new Uint8Array(out.buffer, out.byteOffset, len);
736
+ out_bytes.set(src);
754
737
  }
755
738
 
756
739
  // --- Stubs for unimplemented WebGL2 methods (forwarding API surface) ---
@@ -856,43 +839,18 @@ export class WasmWebGL2RenderingContext {
856
839
  }
857
840
  const programHandle = program && typeof program === 'object' && typeof program._handle === 'number' ? program._handle : (program >>> 0);
858
841
 
859
- // Allocate buffers: size(4) + type(4) + name(256)
860
- const sizePtr = ex.wasm_alloc(4);
861
- const typePtr = ex.wasm_alloc(4);
862
- const nameMaxLen = 256;
863
- const namePtr = ex.wasm_alloc(nameMaxLen);
864
-
865
- try {
866
- const nameLen = ex.wasm_ctx_get_active_uniform(
867
- this._ctxHandle,
868
- programHandle,
869
- index >>> 0,
870
- sizePtr,
871
- typePtr,
872
- namePtr,
873
- nameMaxLen
874
- );
875
-
876
- if (nameLen === 0) {
877
- return null;
878
- }
879
-
880
- const mem32SizeIdx = sizePtr >>> 2;
881
- const mem32TypeIdx = typePtr >>> 2;
882
-
883
- const size = new Int32Array(ex.memory.buffer)[mem32SizeIdx];
884
- const type_ = new Uint32Array(ex.memory.buffer)[mem32TypeIdx];
885
-
886
- const nameBytes = new Uint8Array(ex.memory.buffer, namePtr, nameLen);
887
- const name = new TextDecoder().decode(nameBytes);
842
+ const ptr = ex.wasm_ctx_get_active_uniform(this._ctxHandle, programHandle, index >>> 0);
843
+ if (ptr === 0) return null;
888
844
 
889
- return { name, size, type: type_ };
845
+ const dv = new DataView(ex.memory.buffer);
846
+ const totalLen = dv.getUint32(ptr - 16, true);
847
+ const size = dv.getInt32(ptr, true);
848
+ const type_ = dv.getUint32(ptr + 4, true);
849
+ const nameLen = totalLen - 8;
850
+ const nameBytes = new Uint8Array(ex.memory.buffer, ptr + 8, nameLen);
851
+ const name = new TextDecoder('utf-8').decode(nameBytes);
890
852
 
891
- } finally {
892
- ex.wasm_free(sizePtr);
893
- ex.wasm_free(typePtr);
894
- ex.wasm_free(namePtr);
895
- }
853
+ return { name, size, type: type_ };
896
854
  }
897
855
 
898
856
  getActiveAttrib(program, index) {
@@ -903,43 +861,18 @@ export class WasmWebGL2RenderingContext {
903
861
  }
904
862
  const programHandle = program && typeof program === 'object' && typeof program._handle === 'number' ? program._handle : (program >>> 0);
905
863
 
906
- // Allocate buffers: size(4) + type(4) + name(256)
907
- const sizePtr = ex.wasm_alloc(4);
908
- const typePtr = ex.wasm_alloc(4);
909
- const nameMaxLen = 256;
910
- const namePtr = ex.wasm_alloc(nameMaxLen);
911
-
912
- try {
913
- const nameLen = ex.wasm_ctx_get_active_attrib(
914
- this._ctxHandle,
915
- programHandle,
916
- index >>> 0,
917
- sizePtr,
918
- typePtr,
919
- namePtr,
920
- nameMaxLen
921
- );
922
-
923
- if (nameLen === 0) {
924
- return null;
925
- }
926
-
927
- const mem32SizeIdx = sizePtr >>> 2;
928
- const mem32TypeIdx = typePtr >>> 2;
929
-
930
- const size = new Int32Array(ex.memory.buffer)[mem32SizeIdx];
931
- const type_ = new Uint32Array(ex.memory.buffer)[mem32TypeIdx];
932
-
933
- const nameBytes = new Uint8Array(ex.memory.buffer, namePtr, nameLen);
934
- const name = new TextDecoder().decode(nameBytes);
864
+ const ptr = ex.wasm_ctx_get_active_attrib(this._ctxHandle, programHandle, index >>> 0);
865
+ if (ptr === 0) return null;
935
866
 
936
- return { name, size, type: type_ };
867
+ const dv = new DataView(ex.memory.buffer);
868
+ const totalLen = dv.getUint32(ptr - 16, true);
869
+ const size = dv.getInt32(ptr, true);
870
+ const type_ = dv.getUint32(ptr + 4, true);
871
+ const nameLen = totalLen - 8;
872
+ const nameBytes = new Uint8Array(ex.memory.buffer, ptr + 8, nameLen);
873
+ const name = new TextDecoder('utf-8').decode(nameBytes);
937
874
 
938
- } finally {
939
- ex.wasm_free(sizePtr);
940
- ex.wasm_free(typePtr);
941
- ex.wasm_free(namePtr);
942
- }
875
+ return { name, size, type: type_ };
943
876
  }
944
877
 
945
878
  linkProgram(program) {
@@ -1216,18 +1149,14 @@ export class WasmWebGL2RenderingContext {
1216
1149
  }
1217
1150
  const shaderHandle = shader && typeof shader === 'object' && typeof shader._handle === 'number' ? shader._handle : (shader >>> 0);
1218
1151
 
1219
- const maxLen = 1024;
1220
- const ptr = ex.wasm_alloc(maxLen);
1221
- if (ptr === 0) throw new Error('Failed to allocate memory for getShaderInfoLog');
1152
+ const ptr = ex.wasm_ctx_get_shader_info_log(this._ctxHandle, shaderHandle);
1153
+ if (ptr === 0) return "";
1222
1154
 
1223
- try {
1224
- const len = ex.wasm_ctx_get_shader_info_log(this._ctxHandle, shaderHandle, ptr, maxLen);
1225
- const mem = new Uint8Array(ex.memory.buffer);
1226
- const bytes = mem.subarray(ptr, ptr + len);
1227
- return new TextDecoder().decode(bytes);
1228
- } finally {
1229
- ex.wasm_free(ptr);
1230
- }
1155
+ const dv = new DataView(ex.memory.buffer);
1156
+ const len = dv.getUint32(ptr - 16, true);
1157
+ const mem = new Uint8Array(ex.memory.buffer);
1158
+ const bytes = mem.slice(ptr, ptr + len);
1159
+ return new TextDecoder().decode(bytes);
1231
1160
  }
1232
1161
 
1233
1162
  getProgramInfoLog(program) {
@@ -1238,18 +1167,14 @@ export class WasmWebGL2RenderingContext {
1238
1167
  }
1239
1168
  const programHandle = program && typeof program === 'object' && typeof program._handle === 'number' ? program._handle : (program >>> 0);
1240
1169
 
1241
- const maxLen = 1024;
1242
- const ptr = ex.wasm_alloc(maxLen);
1243
- if (ptr === 0) throw new Error('Failed to allocate memory for getProgramInfoLog');
1170
+ const ptr = ex.wasm_ctx_get_program_info_log(this._ctxHandle, programHandle);
1171
+ if (ptr === 0) return "";
1244
1172
 
1245
- try {
1246
- const len = ex.wasm_ctx_get_program_info_log(this._ctxHandle, programHandle, ptr, maxLen);
1247
- const mem = new Uint8Array(ex.memory.buffer);
1248
- const bytes = mem.subarray(ptr, ptr + len);
1249
- return new TextDecoder().decode(bytes);
1250
- } finally {
1251
- ex.wasm_free(ptr);
1252
- }
1173
+ const dv = new DataView(ex.memory.buffer);
1174
+ const len = dv.getUint32(ptr - 16, true);
1175
+ const mem = new Uint8Array(ex.memory.buffer);
1176
+ const bytes = mem.slice(ptr, ptr + len);
1177
+ return new TextDecoder().decode(bytes);
1253
1178
  }
1254
1179
 
1255
1180
  getProgramWasm(program, shaderType) {
@@ -1918,45 +1843,18 @@ export class WasmWebGL2RenderingContext {
1918
1843
  }
1919
1844
  const programHandle = program && typeof program === "object" && typeof program._handle === "number" ? program._handle : (program >>> 0);
1920
1845
 
1921
- const sizePtr = ex.wasm_alloc(4);
1922
- const typePtr = ex.wasm_alloc(4);
1923
- const nameCapacity = 256;
1924
- const namePtr = ex.wasm_alloc(nameCapacity);
1925
-
1926
- if (sizePtr === 0 || typePtr === 0 || namePtr === 0) {
1927
- if (sizePtr) ex.wasm_free(sizePtr);
1928
- if (typePtr) ex.wasm_free(typePtr);
1929
- if (namePtr) ex.wasm_free(namePtr);
1930
- throw new Error("Failed to allocate memory for getTransformFeedbackVarying");
1931
- }
1932
-
1933
- try {
1934
- const code = ex.wasm_ctx_get_transform_feedback_varying(
1935
- this._ctxHandle,
1936
- programHandle,
1937
- index >>> 0,
1938
- sizePtr,
1939
- typePtr,
1940
- namePtr,
1941
- nameCapacity
1942
- );
1943
- _checkErr(code, this._instance);
1944
-
1945
- const mem = new DataView(ex.memory.buffer);
1946
- const size = mem.getInt32(sizePtr, true);
1947
- const type = mem.getUint32(typePtr, true);
1846
+ const ptr = ex.wasm_ctx_get_transform_feedback_varying(this._ctxHandle, programHandle, index >>> 0);
1847
+ if (ptr === 0) return null;
1948
1848
 
1949
- const nameBytes = new Uint8Array(ex.memory.buffer, namePtr, nameCapacity);
1950
- let nameLen = 0;
1951
- while (nameLen < nameCapacity && nameBytes[nameLen] !== 0) nameLen++;
1952
- const name = new TextDecoder().decode(nameBytes.subarray(0, nameLen));
1849
+ const dv = new DataView(ex.memory.buffer);
1850
+ const totalLen = dv.getUint32(ptr - 16, true);
1851
+ const size = dv.getInt32(ptr, true);
1852
+ const type = dv.getUint32(ptr + 4, true);
1853
+ const nameLen = totalLen - 8;
1854
+ const nameBytes = new Uint8Array(ex.memory.buffer, ptr + 8, nameLen);
1855
+ const name = new TextDecoder('utf-8').decode(nameBytes);
1953
1856
 
1954
- return { name, size, type };
1955
- } finally {
1956
- ex.wasm_free(sizePtr);
1957
- ex.wasm_free(typePtr);
1958
- ex.wasm_free(namePtr);
1959
- }
1857
+ return { name, size, type };
1960
1858
  }
1961
1859
 
1962
1860
  createQuery() { this._assertNotDestroyed(); throw new Error('not implemented'); }
@@ -2317,116 +2215,66 @@ export class WasmWebGL2RenderingContext {
2317
2215
  getParameter(pname) {
2318
2216
  this._assertNotDestroyed();
2319
2217
  const ex = this._instance.exports;
2320
- if (!ex || typeof ex.wasm_ctx_get_parameter_v !== 'function') {
2321
- throw new Error('wasm_ctx_get_parameter_v not found');
2218
+ if (!ex || typeof ex.wasm_ctx_get_parameter !== 'function') {
2219
+ throw new Error('wasm_ctx_get_parameter not found');
2220
+ }
2221
+
2222
+ if (pname === 0x8869 /* MAX_VERTEX_ATTRIBS */) {
2223
+ return 16;
2224
+ }
2225
+
2226
+ const ptr = ex.wasm_ctx_get_parameter(this._ctxHandle, pname);
2227
+ if (ptr === 0) {
2228
+ return null;
2229
+ }
2230
+
2231
+ const dv = new DataView(ex.memory.buffer);
2232
+
2233
+ if (pname === 0x1F00 || pname === 0x1F01 || pname === 0x1F02 || pname === 0x8B8C) {
2234
+ const len = dv.getUint32(ptr - 16, true);
2235
+ const bytes = new Uint8Array(ex.memory.buffer, ptr, len);
2236
+ return new TextDecoder().decode(bytes);
2322
2237
  }
2323
2238
 
2324
2239
  if (pname === 0x0BA2 /* VIEWPORT */) {
2325
- const ptr = ex.wasm_alloc(16);
2326
- try {
2327
- const code = ex.wasm_ctx_get_parameter_v(this._ctxHandle, pname, ptr, 16);
2328
- _checkErr(code, this._instance);
2329
- const mem = new Int32Array(ex.memory.buffer, ptr, 4);
2330
- return new Int32Array(mem);
2331
- } finally {
2332
- ex.wasm_free(ptr, 16);
2333
- }
2240
+ return new Int32Array(ex.memory.buffer.slice(ptr, ptr + 16));
2334
2241
  }
2335
2242
 
2336
2243
  if (pname === 0x0C22 /* COLOR_CLEAR_VALUE */) {
2337
- const ptr = ex.wasm_alloc(16);
2338
- try {
2339
- const code = ex.wasm_ctx_get_parameter_v(this._ctxHandle, pname, ptr, 16);
2340
- _checkErr(code, this._instance);
2341
- const mem = new Float32Array(ex.memory.buffer, ptr, 4);
2342
- return new Float32Array(mem);
2343
- } finally {
2344
- ex.wasm_free(ptr, 16);
2345
- }
2244
+ return new Float32Array(ex.memory.buffer.slice(ptr, ptr + 16));
2346
2245
  }
2347
2246
 
2348
2247
  if (pname === 0x0C23 /* COLOR_WRITEMASK */) {
2349
- const ptr = ex.wasm_alloc(4);
2350
- try {
2351
- const code = ex.wasm_ctx_get_parameter_v(this._ctxHandle, pname, ptr, 4);
2352
- _checkErr(code, this._instance);
2353
- const mem = new Uint8Array(ex.memory.buffer, ptr, 4);
2354
- return [mem[0] !== 0, mem[1] !== 0, mem[2] !== 0, mem[3] !== 0];
2355
- } finally {
2356
- ex.wasm_free(ptr, 4);
2357
- }
2248
+ const mem = new Uint8Array(ex.memory.buffer, ptr, 4);
2249
+ return [mem[0] !== 0, mem[1] !== 0, mem[2] !== 0, mem[3] !== 0];
2358
2250
  }
2359
2251
 
2360
2252
  if (pname === 0x8CA6 /* DRAW_FRAMEBUFFER_BINDING */ || pname === 0x8CAA /* READ_FRAMEBUFFER_BINDING */) {
2361
- const ptr = ex.wasm_alloc(4);
2362
- try {
2363
- const code = ex.wasm_ctx_get_parameter_v(this._ctxHandle, pname, ptr, 4);
2364
- _checkErr(code, this._instance);
2365
- const handle = new Int32Array(ex.memory.buffer, ptr, 1)[0];
2366
- if (handle === 0) return null;
2367
- return this._fbHandles.get(handle) || null;
2368
- } finally {
2369
- ex.wasm_free(ptr, 4);
2370
- }
2253
+ const handle = dv.getInt32(ptr, true);
2254
+ if (handle === 0) return null;
2255
+ return this._fbHandles.get(handle) || null;
2371
2256
  }
2372
2257
 
2373
2258
  if (pname === 0x8CA7 /* RENDERBUFFER_BINDING */) {
2374
- const ptr = ex.wasm_alloc(4);
2375
- try {
2376
- const code = ex.wasm_ctx_get_parameter_v(this._ctxHandle, pname, ptr, 4);
2377
- _checkErr(code, this._instance);
2378
- const handle = new Int32Array(ex.memory.buffer, ptr, 1)[0];
2379
- if (handle === 0) return null;
2380
- return this._rbHandles.get(handle) || null;
2381
- } finally {
2382
- ex.wasm_free(ptr, 4);
2383
- }
2259
+ const handle = dv.getInt32(ptr, true);
2260
+ if (handle === 0) return null;
2261
+ return this._rbHandles.get(handle) || null;
2384
2262
  }
2385
2263
 
2386
2264
  if (pname === 0x8824 /* MAX_DRAW_BUFFERS */ || pname === 0x8CDF /* MAX_COLOR_ATTACHMENTS */) {
2387
- const ptr = ex.wasm_alloc(4);
2388
- try {
2389
- const code = ex.wasm_ctx_get_parameter_v(this._ctxHandle, pname, ptr, 4);
2390
- _checkErr(code, this._instance);
2391
- return new Int32Array(ex.memory.buffer, ptr, 1)[0];
2392
- } finally {
2393
- ex.wasm_free(ptr, 4);
2394
- }
2265
+ return dv.getInt32(ptr, true);
2395
2266
  }
2396
2267
 
2397
2268
  if (pname >= 0x8825 /* DRAW_BUFFER0 */ && pname <= 0x882C /* DRAW_BUFFER7 */) {
2398
- const ptr = ex.wasm_alloc(4);
2399
- try {
2400
- const code = ex.wasm_ctx_get_parameter_v(this._ctxHandle, pname, ptr, 4);
2401
- _checkErr(code, this._instance);
2402
- return new Int32Array(ex.memory.buffer, ptr, 1)[0];
2403
- } finally {
2404
- ex.wasm_free(ptr, 4);
2405
- }
2269
+ return dv.getInt32(ptr, true);
2406
2270
  }
2407
2271
 
2408
2272
  if (pname === 0x0B72 /* DEPTH_WRITEMASK */) {
2409
- const ptr = ex.wasm_alloc(4);
2410
- try {
2411
- const code = ex.wasm_ctx_get_parameter_v(this._ctxHandle, pname, ptr, 4);
2412
- _checkErr(code, this._instance);
2413
- const mem = new Uint8Array(ex.memory.buffer, ptr, 1);
2414
- return mem[0] !== 0;
2415
- } finally {
2416
- ex.wasm_free(ptr, 4);
2417
- }
2273
+ return dv.getUint8(ptr) !== 0;
2418
2274
  }
2419
2275
 
2420
2276
  if (pname === 0x0B98 /* STENCIL_WRITEMASK */ || pname === 0x8CA5 /* STENCIL_BACK_WRITEMASK */) {
2421
- const ptr = ex.wasm_alloc(4);
2422
- try {
2423
- const code = ex.wasm_ctx_get_parameter_v(this._ctxHandle, pname, ptr, 4);
2424
- _checkErr(code, this._instance);
2425
- const mem = new Int32Array(ex.memory.buffer, ptr, 1);
2426
- return mem[0];
2427
- } finally {
2428
- ex.wasm_free(ptr, 4);
2429
- }
2277
+ return dv.getInt32(ptr, true);
2430
2278
  }
2431
2279
 
2432
2280
  const singleIntParams = [
@@ -2446,19 +2294,7 @@ export class WasmWebGL2RenderingContext {
2446
2294
  ];
2447
2295
 
2448
2296
  if (singleIntParams.includes(pname)) {
2449
- const ptr = ex.wasm_alloc(4);
2450
- try {
2451
- const code = ex.wasm_ctx_get_parameter_v(this._ctxHandle, pname, ptr, 4);
2452
- _checkErr(code, this._instance);
2453
- const mem = new Int32Array(ex.memory.buffer, ptr, 1);
2454
- return mem[0];
2455
- } finally {
2456
- ex.wasm_free(ptr, 4);
2457
- }
2458
- }
2459
-
2460
- if (pname === 0x8869 /* MAX_VERTEX_ATTRIBS */) {
2461
- return 16;
2297
+ return dv.getInt32(ptr, true);
2462
2298
  }
2463
2299
 
2464
2300
  throw new Error(`getParameter for ${pname} not implemented`);
@@ -2740,16 +2576,24 @@ export class WasmWebGL2RenderingContext {
2740
2576
  */
2741
2577
  export function readErrorMessage(instance) {
2742
2578
  const ex = instance.exports;
2743
- if (!ex || typeof ex.wasm_last_error_ptr !== 'function' || typeof ex.wasm_last_error_len !== 'function') {
2579
+ if (!ex || typeof ex.wasm_last_error !== 'function') {
2580
+ // Fallback to old ptr/len if exists, otherwise return unknown
2581
+ if (typeof ex.wasm_last_error_ptr === 'function') {
2582
+ const ptr = ex.wasm_last_error_ptr();
2583
+ const len = ex.wasm_last_error_len();
2584
+ if (ptr === 0 || len === 0) return '';
2585
+ const mem = new Uint8Array(ex.memory.buffer);
2586
+ const bytes = mem.subarray(ptr, ptr + len);
2587
+ return new TextDecoder('utf-8').decode(bytes);
2588
+ }
2744
2589
  return '(no error message available)';
2745
2590
  }
2746
- const ptr = ex.wasm_last_error_ptr();
2747
- const len = ex.wasm_last_error_len();
2748
- if (ptr === 0 || len === 0) {
2749
- return '';
2750
- }
2591
+ const ptr = ex.wasm_last_error();
2592
+ if (ptr === 0) return '';
2593
+ const dv = new DataView(ex.memory.buffer);
2594
+ const len = dv.getUint32(ptr - 16, true);
2751
2595
  const mem = new Uint8Array(ex.memory.buffer);
2752
- const bytes = mem.subarray(ptr, ptr + len);
2596
+ const bytes = mem.slice(ptr, ptr + len);
2753
2597
  return new TextDecoder('utf-8').decode(bytes);
2754
2598
  }
2755
2599
 
@@ -2897,24 +2741,18 @@ export function getShaderGlsl(ctxHandle, programHandle, shaderType) {
2897
2741
  mem.set(wasmBytes, wasmBytesPtr);
2898
2742
 
2899
2743
  // Call the decompiler
2900
- const resultLen = ex.wasm_decompile_to_glsl(wasmBytesPtr, wasmBytesLen);
2744
+ const glslPtr = ex.wasm_decompile_to_glsl(wasmBytesPtr, wasmBytesLen);
2901
2745
 
2902
- if (resultLen === 0) {
2746
+ if (glslPtr === 0) {
2903
2747
  return null;
2904
2748
  }
2905
2749
 
2906
- // Get the decompiled GLSL
2907
- const glslPtr = ex.wasm_get_decompiled_glsl_ptr();
2908
- const glslLen = ex.wasm_get_decompiled_glsl_len();
2909
-
2910
- if (glslPtr === 0 || glslLen === 0) {
2911
- return null;
2912
- }
2750
+ const dv = new DataView(ex.memory.buffer);
2751
+ const glslLen = dv.getUint32(glslPtr - 16, true);
2913
2752
 
2914
2753
  // Read the GLSL string
2915
- const glslBytes = new Uint8Array(ex.memory.buffer).subarray(glslPtr, glslPtr + glslLen);
2916
- const decoder = new TextDecoder('utf-8');
2917
- return decoder.decode(glslBytes);
2754
+ const glslBytes = new Uint8Array(ex.memory.buffer).slice(glslPtr, glslPtr + glslLen);
2755
+ return new TextDecoder('utf-8').decode(glslBytes);
2918
2756
  } finally {
2919
2757
  // Free the allocated memory
2920
2758
  ex.wasm_free(wasmBytesPtr);
@@ -2953,24 +2791,18 @@ export function decompileWasmToGlsl(gl, wasmBytes) {
2953
2791
  mem.set(wasmBytes, wasmBytesPtr);
2954
2792
 
2955
2793
  // Call the decompiler
2956
- const resultLen = ex.wasm_decompile_to_glsl(wasmBytesPtr, wasmBytesLen);
2794
+ const glslPtr = ex.wasm_decompile_to_glsl(wasmBytesPtr, wasmBytesLen);
2957
2795
 
2958
- if (resultLen === 0) {
2796
+ if (glslPtr === 0) {
2959
2797
  return null;
2960
2798
  }
2961
2799
 
2962
- // Get the decompiled GLSL
2963
- const glslPtr = ex.wasm_get_decompiled_glsl_ptr();
2964
- const glslLen = ex.wasm_get_decompiled_glsl_len();
2965
-
2966
- if (glslPtr === 0 || glslLen === 0) {
2967
- return null;
2968
- }
2800
+ const dv = new DataView(ex.memory.buffer);
2801
+ const glslLen = dv.getUint32(glslPtr - 16, true);
2969
2802
 
2970
2803
  // Read the GLSL string
2971
- const glslBytes = new Uint8Array(ex.memory.buffer).subarray(glslPtr, glslPtr + glslLen);
2972
- const decoder = new TextDecoder('utf-8');
2973
- return decoder.decode(glslBytes);
2804
+ const glslBytes = new Uint8Array(ex.memory.buffer).slice(glslPtr, glslPtr + glslLen);
2805
+ return new TextDecoder('utf-8').decode(glslBytes);
2974
2806
  } finally {
2975
2807
  // Free the allocated memory
2976
2808
  ex.wasm_free(wasmBytesPtr);
package/webgl2.debug.wasm CHANGED
Binary file
package/webgl2.wasm CHANGED
Binary file