@gjsify/webgl 0.3.16 → 0.3.17

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.
Files changed (55) hide show
  1. package/lib/esm/conformance/attribs.spec.js +3 -315
  2. package/lib/esm/conformance/buffers.spec.js +1 -220
  3. package/lib/esm/conformance/context.spec.js +3 -302
  4. package/lib/esm/conformance/programs.spec.js +3 -477
  5. package/lib/esm/conformance/rendering-basic.spec.js +3 -141
  6. package/lib/esm/conformance/rendering.spec.js +7 -514
  7. package/lib/esm/conformance/setup.js +1 -47
  8. package/lib/esm/conformance/state.spec.js +1 -365
  9. package/lib/esm/conformance/textures.spec.js +3 -337
  10. package/lib/esm/conformance/uniforms.spec.js +1 -484
  11. package/lib/esm/conformance-test.js +1 -25
  12. package/lib/esm/extensions/ext-blend-minmax.js +1 -18
  13. package/lib/esm/extensions/ext-color-buffer-float.js +1 -12
  14. package/lib/esm/extensions/ext-color-buffer-half-float.js +1 -12
  15. package/lib/esm/extensions/ext-texture-filter-anisotropic.js +1 -18
  16. package/lib/esm/extensions/oes-element-index-unit.js +1 -13
  17. package/lib/esm/extensions/oes-standard-derivatives.js +1 -17
  18. package/lib/esm/extensions/oes-texture-float-linear.js +1 -13
  19. package/lib/esm/extensions/oes-texture-float.js +1 -13
  20. package/lib/esm/extensions/oes-texture-half-float.js +1 -19
  21. package/lib/esm/extensions/stackgl-destroy-context.js +1 -12
  22. package/lib/esm/extensions/stackgl-resize-drawing-buffer.js +1 -12
  23. package/lib/esm/html-canvas-element.js +1 -65
  24. package/lib/esm/index.js +1 -33
  25. package/lib/esm/linkable.js +1 -50
  26. package/lib/esm/test-utils.js +4 -186
  27. package/lib/esm/test.js +1 -11
  28. package/lib/esm/types/index.js +1 -5
  29. package/lib/esm/utils.js +1 -201
  30. package/lib/esm/webgl-active-info.js +1 -11
  31. package/lib/esm/webgl-bridge.js +1 -167
  32. package/lib/esm/webgl-buffer.js +1 -19
  33. package/lib/esm/webgl-context-attributes.js +1 -24
  34. package/lib/esm/webgl-context-base.js +8 -3069
  35. package/lib/esm/webgl-drawing-buffer-wrapper.js +1 -11
  36. package/lib/esm/webgl-framebuffer.js +1 -110
  37. package/lib/esm/webgl-program.js +1 -27
  38. package/lib/esm/webgl-query.js +1 -17
  39. package/lib/esm/webgl-renderbuffer.js +1 -25
  40. package/lib/esm/webgl-rendering-context.js +1 -175
  41. package/lib/esm/webgl-sampler.js +1 -17
  42. package/lib/esm/webgl-shader-precision-format.js +1 -11
  43. package/lib/esm/webgl-shader.js +1 -25
  44. package/lib/esm/webgl-sync.js +1 -17
  45. package/lib/esm/webgl-texture-unit.js +1 -13
  46. package/lib/esm/webgl-texture.js +1 -23
  47. package/lib/esm/webgl-transform-feedback.js +1 -17
  48. package/lib/esm/webgl-uniform-location.js +1 -15
  49. package/lib/esm/webgl-vertex-array-object.js +1 -23
  50. package/lib/esm/webgl-vertex-attribute.js +1 -151
  51. package/lib/esm/webgl1.spec.js +10 -1044
  52. package/lib/esm/webgl2-rendering-context.js +1 -1218
  53. package/lib/esm/webgl2.spec.js +45 -1288
  54. package/lib/types/webgl-bridge.d.ts +9 -9
  55. package/package.json +9 -9
@@ -1,484 +1 @@
1
- import { makeProgram } from "../test-utils.js";
2
- import { createGLSetup } from "./setup.js";
3
- import { beforeEach, describe, expect, it, on } from "@gjsify/unit";
4
-
5
- //#region src/ts/conformance/uniforms.spec.ts
6
- const VS = `attribute vec4 a_position; void main() { gl_Position = a_position; }`;
7
- function makeFS(body) {
8
- return `precision mediump float; ${body}`;
9
- }
10
- const FS_FLOAT = makeFS("uniform float u_f; void main() { gl_FragColor = vec4(u_f,0,0,1); }");
11
- const FS_INT = makeFS("uniform int u_i; void main() { gl_FragColor = vec4(float(u_i),0,0,1); }");
12
- const FS_BOOL = makeFS("uniform bool u_b; void main() { gl_FragColor = vec4(u_b ? 1.0 : 0.0,0,0,1); }");
13
- const FS_VEC2 = makeFS("uniform vec2 u_v2; void main() { gl_FragColor = vec4(u_v2,0,1); }");
14
- const FS_VEC3 = makeFS("uniform vec3 u_v3; void main() { gl_FragColor = vec4(u_v3,1); }");
15
- const FS_VEC4 = makeFS("uniform vec4 u_v4; void main() { gl_FragColor = u_v4; }");
16
- const FS_MAT2 = makeFS("uniform mat2 u_m2; void main() { gl_FragColor = vec4(u_m2[0],u_m2[1]); }");
17
- const FS_MAT3 = makeFS("uniform mat3 u_m3; void main() { gl_FragColor = vec4(u_m3[0],1); }");
18
- const FS_MAT4 = makeFS("uniform mat4 u_m4; void main() { gl_FragColor = u_m4[0]; }");
19
- const FS_ARR = makeFS("uniform float u_arr[3]; void main() { gl_FragColor = vec4(u_arr[0]+u_arr[1]+u_arr[2],0,0,1); }");
20
- const FS_VEC4ARR = makeFS("uniform vec4 u_v4arr[3]; void main() { gl_FragColor = u_v4arr[0]+u_v4arr[1]+u_v4arr[2]; }");
21
- function floatArrayClose(a, b, tol = .001) {
22
- if (a.length !== b.length) return false;
23
- for (let i = 0; i < b.length; i++) {
24
- if (Math.abs(a[i] - b[i]) > tol) return false;
25
- }
26
- return true;
27
- }
28
- var uniforms_spec_default = async () => {
29
- await on("Display", async () => {
30
- const setup = createGLSetup();
31
- if (!setup) {
32
- console.warn("WebGL context not available — skipping conformance/uniforms tests");
33
- return;
34
- }
35
- const { gl, glArea } = setup;
36
- glArea.make_current();
37
- await describe("conformance/uniforms/null-uniform-location", async () => {
38
- beforeEach(async () => {
39
- glArea.make_current();
40
- });
41
- await it("uniform* with null location generates NO_ERROR", async () => {
42
- const prog = makeProgram(gl, VS, FS_FLOAT);
43
- gl.useProgram(prog);
44
- gl.uniform1f(null, 1);
45
- gl.getError();
46
- gl.uniform1fv(null, [1]);
47
- gl.getError();
48
- gl.uniform1i(null, 1);
49
- gl.getError();
50
- gl.uniform1iv(null, [1]);
51
- gl.getError();
52
- gl.uniform2f(null, 1, 2);
53
- gl.getError();
54
- gl.uniform2fv(null, [1, 2]);
55
- gl.getError();
56
- gl.uniform2i(null, 1, 2);
57
- gl.getError();
58
- gl.uniform2iv(null, [1, 2]);
59
- gl.getError();
60
- gl.uniform3f(null, 1, 2, 3);
61
- gl.getError();
62
- gl.uniform3fv(null, [
63
- 1,
64
- 2,
65
- 3
66
- ]);
67
- gl.getError();
68
- gl.uniform3i(null, 1, 2, 3);
69
- gl.getError();
70
- gl.uniform3iv(null, [
71
- 1,
72
- 2,
73
- 3
74
- ]);
75
- gl.getError();
76
- gl.uniform4f(null, 1, 2, 3, 4);
77
- gl.getError();
78
- gl.uniform4fv(null, [
79
- 1,
80
- 2,
81
- 3,
82
- 4
83
- ]);
84
- gl.getError();
85
- gl.uniform4i(null, 1, 2, 3, 4);
86
- gl.getError();
87
- gl.uniform4iv(null, [
88
- 1,
89
- 2,
90
- 3,
91
- 4
92
- ]);
93
- gl.getError();
94
- gl.uniformMatrix2fv(null, false, [
95
- 1,
96
- 0,
97
- 0,
98
- 1
99
- ]);
100
- gl.getError();
101
- gl.uniformMatrix3fv(null, false, [
102
- 1,
103
- 0,
104
- 0,
105
- 0,
106
- 1,
107
- 0,
108
- 0,
109
- 0,
110
- 1
111
- ]);
112
- gl.getError();
113
- gl.uniformMatrix4fv(null, false, [
114
- 1,
115
- 0,
116
- 0,
117
- 0,
118
- 0,
119
- 1,
120
- 0,
121
- 0,
122
- 0,
123
- 0,
124
- 1,
125
- 0,
126
- 0,
127
- 0,
128
- 0,
129
- 1
130
- ]);
131
- gl.getError();
132
- expect(gl.getError()).toBe(gl.NO_ERROR);
133
- });
134
- });
135
- await describe("conformance/uniforms/gl-unknown-uniform", async () => {
136
- beforeEach(async () => {
137
- glArea.make_current();
138
- });
139
- await it("getUniformLocation for unknown uniform returns null", async () => {
140
- const prog = makeProgram(gl, VS, FS_FLOAT);
141
- gl.useProgram(prog);
142
- const loc = gl.getUniformLocation(prog, "someUnknownUniform");
143
- expect(loc).toBeNull();
144
- expect(gl.getError()).toBe(gl.NO_ERROR);
145
- });
146
- await it("uniform1f with null location (unknown) generates NO_ERROR", async () => {
147
- const prog = makeProgram(gl, VS, FS_FLOAT);
148
- gl.useProgram(prog);
149
- gl.uniform1f(null, 42);
150
- expect(gl.getError()).toBe(gl.NO_ERROR);
151
- });
152
- });
153
- await describe("conformance/uniforms/gl-uniform-bool", async () => {
154
- beforeEach(async () => {
155
- glArea.make_current();
156
- });
157
- await it("setting a bool uniform via uniform1i succeeds", async () => {
158
- const prog = makeProgram(gl, VS, FS_BOOL);
159
- gl.useProgram(prog);
160
- const loc = gl.getUniformLocation(prog, "u_b");
161
- expect(loc).not.toBeNull();
162
- gl.uniform1i(loc, 1);
163
- expect(gl.getError()).toBe(gl.NO_ERROR);
164
- });
165
- });
166
- await describe("conformance/uniforms/scalar-vector-round-trip", async () => {
167
- beforeEach(async () => {
168
- glArea.make_current();
169
- });
170
- await it("uniform1f / getUniform round-trips a float", async () => {
171
- const prog = makeProgram(gl, VS, FS_FLOAT);
172
- gl.useProgram(prog);
173
- const loc = gl.getUniformLocation(prog, "u_f");
174
- gl.uniform1f(loc, .5);
175
- expect(gl.getError()).toBe(gl.NO_ERROR);
176
- const val = gl.getUniform(prog, loc);
177
- expect(Math.abs(val - .5) < .001).toBe(true);
178
- });
179
- await it("uniform1i / getUniform round-trips an int", async () => {
180
- const prog = makeProgram(gl, VS, FS_INT);
181
- gl.useProgram(prog);
182
- const loc = gl.getUniformLocation(prog, "u_i");
183
- gl.uniform1i(loc, 7);
184
- expect(gl.getError()).toBe(gl.NO_ERROR);
185
- const val = gl.getUniform(prog, loc);
186
- expect(val).toBe(7);
187
- });
188
- await it("uniform2fv / getUniform round-trips a vec2", async () => {
189
- const prog = makeProgram(gl, VS, FS_VEC2);
190
- gl.useProgram(prog);
191
- const loc = gl.getUniformLocation(prog, "u_v2");
192
- gl.uniform2fv(loc, [.25, .75]);
193
- expect(gl.getError()).toBe(gl.NO_ERROR);
194
- const val = gl.getUniform(prog, loc);
195
- expect(floatArrayClose(val, [.25, .75])).toBe(true);
196
- });
197
- await it("uniform3fv / getUniform round-trips a vec3", async () => {
198
- const prog = makeProgram(gl, VS, FS_VEC3);
199
- gl.useProgram(prog);
200
- const loc = gl.getUniformLocation(prog, "u_v3");
201
- gl.uniform3fv(loc, [
202
- .1,
203
- .2,
204
- .3
205
- ]);
206
- expect(gl.getError()).toBe(gl.NO_ERROR);
207
- const val = gl.getUniform(prog, loc);
208
- expect(floatArrayClose(val, [
209
- .1,
210
- .2,
211
- .3
212
- ])).toBe(true);
213
- });
214
- await it("uniform4fv / getUniform round-trips a vec4", async () => {
215
- const prog = makeProgram(gl, VS, FS_VEC4);
216
- gl.useProgram(prog);
217
- const loc = gl.getUniformLocation(prog, "u_v4");
218
- gl.uniform4fv(loc, [
219
- .1,
220
- .2,
221
- .3,
222
- .4
223
- ]);
224
- expect(gl.getError()).toBe(gl.NO_ERROR);
225
- const val = gl.getUniform(prog, loc);
226
- expect(floatArrayClose(val, [
227
- .1,
228
- .2,
229
- .3,
230
- .4
231
- ])).toBe(true);
232
- });
233
- });
234
- await describe("conformance/uniforms/gl-uniformmatrix4fv", async () => {
235
- beforeEach(async () => {
236
- glArea.make_current();
237
- });
238
- await it("uniformMatrix2fv with correct size (4 elements) succeeds", async () => {
239
- const prog = makeProgram(gl, VS, FS_MAT2);
240
- gl.useProgram(prog);
241
- const loc = gl.getUniformLocation(prog, "u_m2");
242
- gl.uniformMatrix2fv(loc, false, [
243
- 1,
244
- 0,
245
- 0,
246
- 1
247
- ]);
248
- expect(gl.getError()).toBe(gl.NO_ERROR);
249
- });
250
- await it("uniformMatrix2fv with too few elements generates INVALID_VALUE", async () => {
251
- const prog = makeProgram(gl, VS, FS_MAT2);
252
- gl.useProgram(prog);
253
- const loc = gl.getUniformLocation(prog, "u_m2");
254
- gl.uniformMatrix2fv(loc, false, [
255
- 1,
256
- 0,
257
- 0
258
- ]);
259
- expect(gl.getError()).toBe(gl.INVALID_VALUE);
260
- });
261
- await it("uniformMatrix3fv with correct size (9 elements) succeeds", async () => {
262
- const prog = makeProgram(gl, VS, FS_MAT3);
263
- gl.useProgram(prog);
264
- const loc = gl.getUniformLocation(prog, "u_m3");
265
- gl.uniformMatrix3fv(loc, false, [
266
- 1,
267
- 0,
268
- 0,
269
- 0,
270
- 1,
271
- 0,
272
- 0,
273
- 0,
274
- 1
275
- ]);
276
- expect(gl.getError()).toBe(gl.NO_ERROR);
277
- });
278
- await it("uniformMatrix4fv with correct size (16 elements) succeeds", async () => {
279
- const prog = makeProgram(gl, VS, FS_MAT4);
280
- gl.useProgram(prog);
281
- const loc = gl.getUniformLocation(prog, "u_m4");
282
- gl.uniformMatrix4fv(loc, false, [
283
- 1,
284
- 0,
285
- 0,
286
- 0,
287
- 0,
288
- 1,
289
- 0,
290
- 0,
291
- 0,
292
- 0,
293
- 1,
294
- 0,
295
- 0,
296
- 0,
297
- 0,
298
- 1
299
- ]);
300
- expect(gl.getError()).toBe(gl.NO_ERROR);
301
- });
302
- await it("uniformMatrix4fv with transpose=true generates INVALID_VALUE in WebGL1", async () => {
303
- const prog = makeProgram(gl, VS, FS_MAT4);
304
- gl.useProgram(prog);
305
- const loc = gl.getUniformLocation(prog, "u_m4");
306
- gl.uniformMatrix4fv(loc, true, [
307
- 1,
308
- 0,
309
- 0,
310
- 0,
311
- 0,
312
- 1,
313
- 0,
314
- 0,
315
- 0,
316
- 0,
317
- 1,
318
- 0,
319
- 0,
320
- 0,
321
- 0,
322
- 1
323
- ]);
324
- expect(gl.getError()).toBe(gl.INVALID_VALUE);
325
- });
326
- await it("uniformMatrix4fv / getUniform round-trips a mat4", async () => {
327
- const prog = makeProgram(gl, VS, FS_MAT4);
328
- gl.useProgram(prog);
329
- const loc = gl.getUniformLocation(prog, "u_m4");
330
- const identity = [
331
- 1,
332
- 0,
333
- 0,
334
- 0,
335
- 0,
336
- 1,
337
- 0,
338
- 0,
339
- 0,
340
- 0,
341
- 1,
342
- 0,
343
- 0,
344
- 0,
345
- 0,
346
- 1
347
- ];
348
- gl.uniformMatrix4fv(loc, false, identity);
349
- expect(gl.getError()).toBe(gl.NO_ERROR);
350
- const val = gl.getUniform(prog, loc);
351
- expect(floatArrayClose(val, identity)).toBe(true);
352
- });
353
- });
354
- await describe("conformance/uniforms/gl-uniform-arrays", async () => {
355
- beforeEach(async () => {
356
- glArea.make_current();
357
- });
358
- await it("uniform1fv sets a float array and getUniform retrieves element [0]", async () => {
359
- const prog = makeProgram(gl, VS, FS_ARR);
360
- gl.useProgram(prog);
361
- const loc = gl.getUniformLocation(prog, "u_arr[0]");
362
- expect(loc).not.toBeNull();
363
- gl.uniform1fv(loc, [
364
- .1,
365
- .2,
366
- .3
367
- ]);
368
- expect(gl.getError()).toBe(gl.NO_ERROR);
369
- const val = gl.getUniform(prog, loc);
370
- expect(Math.abs(val - .1) < .001).toBe(true);
371
- });
372
- await it("uniform1fv with fewer values than array size (partial update) succeeds", async () => {
373
- const prog = makeProgram(gl, VS, FS_ARR);
374
- gl.useProgram(prog);
375
- const loc = gl.getUniformLocation(prog, "u_arr[0]");
376
- gl.uniform1fv(loc, [.5, .6]);
377
- expect(gl.getError()).toBe(gl.NO_ERROR);
378
- });
379
- await it("uniform4fv sets a vec4 array", async () => {
380
- const prog = makeProgram(gl, VS, FS_VEC4ARR);
381
- gl.useProgram(prog);
382
- const loc = gl.getUniformLocation(prog, "u_v4arr[0]");
383
- expect(loc).not.toBeNull();
384
- gl.uniform4fv(loc, [
385
- .1,
386
- .2,
387
- .3,
388
- .4,
389
- .5,
390
- .6,
391
- .7,
392
- .8,
393
- .9,
394
- 1,
395
- 0,
396
- 0
397
- ]);
398
- expect(gl.getError()).toBe(gl.NO_ERROR);
399
- });
400
- await it("getUniformLocation resolves bare array name (without [0] suffix)", async () => {
401
- const prog = makeProgram(gl, VS, FS_ARR);
402
- gl.useProgram(prog);
403
- const locBare = gl.getUniformLocation(prog, "u_arr");
404
- expect(locBare).not.toBeNull();
405
- expect(gl.getError()).toBe(gl.NO_ERROR);
406
- gl.uniform1fv(locBare, [
407
- .7,
408
- .8,
409
- .9
410
- ]);
411
- expect(gl.getError()).toBe(gl.NO_ERROR);
412
- const val = gl.getUniform(prog, locBare);
413
- expect(Math.abs(val - .7) < .001).toBe(true);
414
- });
415
- await it("bare array name and indexed [0] name resolve to equivalent locations", async () => {
416
- const prog = makeProgram(gl, VS, FS_ARR);
417
- gl.useProgram(prog);
418
- const locBare = gl.getUniformLocation(prog, "u_arr");
419
- const locIndexed = gl.getUniformLocation(prog, "u_arr[0]");
420
- expect(locBare).not.toBeNull();
421
- expect(locIndexed).not.toBeNull();
422
- gl.uniform1fv(locBare, [
423
- .42,
424
- .43,
425
- .44
426
- ]);
427
- expect(gl.getError()).toBe(gl.NO_ERROR);
428
- const val = gl.getUniform(prog, locIndexed);
429
- expect(Math.abs(val - .42) < .001).toBe(true);
430
- });
431
- await it("calling uniform* before useProgram generates INVALID_OPERATION", async () => {
432
- const prog = makeProgram(gl, VS, FS_ARR);
433
- gl.useProgram(null);
434
- const loc = gl.getUniformLocation(prog, "u_arr[0]");
435
- if (loc !== null) {
436
- gl.uniform1fv(loc, [
437
- 1,
438
- 2,
439
- 3
440
- ]);
441
- expect(gl.getError()).toBe(gl.INVALID_OPERATION);
442
- } else {
443
- expect(gl.getError()).toBe(gl.NO_ERROR);
444
- }
445
- });
446
- });
447
- await describe("conformance/uniforms/uniform-location", async () => {
448
- beforeEach(async () => {
449
- glArea.make_current();
450
- });
451
- await it("getUniformLocation returns non-null for known uniform", async () => {
452
- const prog = makeProgram(gl, VS, FS_FLOAT);
453
- gl.useProgram(prog);
454
- const loc = gl.getUniformLocation(prog, "u_f");
455
- expect(loc).not.toBeNull();
456
- expect(gl.getError()).toBe(gl.NO_ERROR);
457
- });
458
- await it("location from different program generates INVALID_OPERATION", async () => {
459
- const prog1 = makeProgram(gl, VS, FS_FLOAT);
460
- const prog2 = makeProgram(gl, VS, FS_FLOAT);
461
- const loc = gl.getUniformLocation(prog1, "u_f");
462
- gl.useProgram(prog2);
463
- gl.uniform1f(loc, 1);
464
- expect(gl.getError()).toBe(gl.INVALID_OPERATION);
465
- });
466
- await it("location becomes invalid after relinkProgram", async () => {
467
- const prog = makeProgram(gl, VS, FS_FLOAT);
468
- gl.useProgram(prog);
469
- const locBefore = gl.getUniformLocation(prog, "u_f");
470
- expect(locBefore).not.toBeNull();
471
- gl.linkProgram(prog);
472
- gl.uniform1f(locBefore, 1);
473
- expect(gl.getError()).toBe(gl.INVALID_OPERATION);
474
- const locAfter = gl.getUniformLocation(prog, "u_f");
475
- expect(locAfter).not.toBeNull();
476
- gl.uniform1f(locAfter, 1);
477
- expect(gl.getError()).toBe(gl.NO_ERROR);
478
- });
479
- });
480
- });
481
- };
482
-
483
- //#endregion
484
- export { uniforms_spec_default as default };
1
+ import{makeProgram as e}from"../test-utils.js";import{createGLSetup as t}from"./setup.js";import{beforeEach as n,describe as r,expect as i,it as a,on as o}from"@gjsify/unit";const s=`attribute vec4 a_position; void main() { gl_Position = a_position; }`;function c(e){return`precision mediump float; ${e}`}const l=c(`uniform float u_f; void main() { gl_FragColor = vec4(u_f,0,0,1); }`),u=c(`uniform int u_i; void main() { gl_FragColor = vec4(float(u_i),0,0,1); }`),d=c(`uniform bool u_b; void main() { gl_FragColor = vec4(u_b ? 1.0 : 0.0,0,0,1); }`),f=c(`uniform vec2 u_v2; void main() { gl_FragColor = vec4(u_v2,0,1); }`),p=c(`uniform vec3 u_v3; void main() { gl_FragColor = vec4(u_v3,1); }`),m=c(`uniform vec4 u_v4; void main() { gl_FragColor = u_v4; }`),h=c(`uniform mat2 u_m2; void main() { gl_FragColor = vec4(u_m2[0],u_m2[1]); }`),g=c(`uniform mat3 u_m3; void main() { gl_FragColor = vec4(u_m3[0],1); }`),_=c(`uniform mat4 u_m4; void main() { gl_FragColor = u_m4[0]; }`),v=c(`uniform float u_arr[3]; void main() { gl_FragColor = vec4(u_arr[0]+u_arr[1]+u_arr[2],0,0,1); }`),y=c(`uniform vec4 u_v4arr[3]; void main() { gl_FragColor = u_v4arr[0]+u_v4arr[1]+u_v4arr[2]; }`);function b(e,t,n=.001){if(e.length!==t.length)return!1;for(let r=0;r<t.length;r++)if(Math.abs(e[r]-t[r])>n)return!1;return!0}var x=async()=>{await o(`Display`,async()=>{let o=t();if(!o){console.warn(`WebGL context not available — skipping conformance/uniforms tests`);return}let{gl:c,glArea:x}=o;x.make_current(),await r(`conformance/uniforms/null-uniform-location`,async()=>{n(async()=>{x.make_current()}),await a(`uniform* with null location generates NO_ERROR`,async()=>{let t=e(c,s,l);c.useProgram(t),c.uniform1f(null,1),c.getError(),c.uniform1fv(null,[1]),c.getError(),c.uniform1i(null,1),c.getError(),c.uniform1iv(null,[1]),c.getError(),c.uniform2f(null,1,2),c.getError(),c.uniform2fv(null,[1,2]),c.getError(),c.uniform2i(null,1,2),c.getError(),c.uniform2iv(null,[1,2]),c.getError(),c.uniform3f(null,1,2,3),c.getError(),c.uniform3fv(null,[1,2,3]),c.getError(),c.uniform3i(null,1,2,3),c.getError(),c.uniform3iv(null,[1,2,3]),c.getError(),c.uniform4f(null,1,2,3,4),c.getError(),c.uniform4fv(null,[1,2,3,4]),c.getError(),c.uniform4i(null,1,2,3,4),c.getError(),c.uniform4iv(null,[1,2,3,4]),c.getError(),c.uniformMatrix2fv(null,!1,[1,0,0,1]),c.getError(),c.uniformMatrix3fv(null,!1,[1,0,0,0,1,0,0,0,1]),c.getError(),c.uniformMatrix4fv(null,!1,[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),c.getError(),i(c.getError()).toBe(c.NO_ERROR)})}),await r(`conformance/uniforms/gl-unknown-uniform`,async()=>{n(async()=>{x.make_current()}),await a(`getUniformLocation for unknown uniform returns null`,async()=>{let t=e(c,s,l);c.useProgram(t),i(c.getUniformLocation(t,`someUnknownUniform`)).toBeNull(),i(c.getError()).toBe(c.NO_ERROR)}),await a(`uniform1f with null location (unknown) generates NO_ERROR`,async()=>{let t=e(c,s,l);c.useProgram(t),c.uniform1f(null,42),i(c.getError()).toBe(c.NO_ERROR)})}),await r(`conformance/uniforms/gl-uniform-bool`,async()=>{n(async()=>{x.make_current()}),await a(`setting a bool uniform via uniform1i succeeds`,async()=>{let t=e(c,s,d);c.useProgram(t);let n=c.getUniformLocation(t,`u_b`);i(n).not.toBeNull(),c.uniform1i(n,1),i(c.getError()).toBe(c.NO_ERROR)})}),await r(`conformance/uniforms/scalar-vector-round-trip`,async()=>{n(async()=>{x.make_current()}),await a(`uniform1f / getUniform round-trips a float`,async()=>{let t=e(c,s,l);c.useProgram(t);let n=c.getUniformLocation(t,`u_f`);c.uniform1f(n,.5),i(c.getError()).toBe(c.NO_ERROR);let r=c.getUniform(t,n);i(Math.abs(r-.5)<.001).toBe(!0)}),await a(`uniform1i / getUniform round-trips an int`,async()=>{let t=e(c,s,u);c.useProgram(t);let n=c.getUniformLocation(t,`u_i`);c.uniform1i(n,7),i(c.getError()).toBe(c.NO_ERROR),i(c.getUniform(t,n)).toBe(7)}),await a(`uniform2fv / getUniform round-trips a vec2`,async()=>{let t=e(c,s,f);c.useProgram(t);let n=c.getUniformLocation(t,`u_v2`);c.uniform2fv(n,[.25,.75]),i(c.getError()).toBe(c.NO_ERROR),i(b(c.getUniform(t,n),[.25,.75])).toBe(!0)}),await a(`uniform3fv / getUniform round-trips a vec3`,async()=>{let t=e(c,s,p);c.useProgram(t);let n=c.getUniformLocation(t,`u_v3`);c.uniform3fv(n,[.1,.2,.3]),i(c.getError()).toBe(c.NO_ERROR),i(b(c.getUniform(t,n),[.1,.2,.3])).toBe(!0)}),await a(`uniform4fv / getUniform round-trips a vec4`,async()=>{let t=e(c,s,m);c.useProgram(t);let n=c.getUniformLocation(t,`u_v4`);c.uniform4fv(n,[.1,.2,.3,.4]),i(c.getError()).toBe(c.NO_ERROR),i(b(c.getUniform(t,n),[.1,.2,.3,.4])).toBe(!0)})}),await r(`conformance/uniforms/gl-uniformmatrix4fv`,async()=>{n(async()=>{x.make_current()}),await a(`uniformMatrix2fv with correct size (4 elements) succeeds`,async()=>{let t=e(c,s,h);c.useProgram(t);let n=c.getUniformLocation(t,`u_m2`);c.uniformMatrix2fv(n,!1,[1,0,0,1]),i(c.getError()).toBe(c.NO_ERROR)}),await a(`uniformMatrix2fv with too few elements generates INVALID_VALUE`,async()=>{let t=e(c,s,h);c.useProgram(t);let n=c.getUniformLocation(t,`u_m2`);c.uniformMatrix2fv(n,!1,[1,0,0]),i(c.getError()).toBe(c.INVALID_VALUE)}),await a(`uniformMatrix3fv with correct size (9 elements) succeeds`,async()=>{let t=e(c,s,g);c.useProgram(t);let n=c.getUniformLocation(t,`u_m3`);c.uniformMatrix3fv(n,!1,[1,0,0,0,1,0,0,0,1]),i(c.getError()).toBe(c.NO_ERROR)}),await a(`uniformMatrix4fv with correct size (16 elements) succeeds`,async()=>{let t=e(c,s,_);c.useProgram(t);let n=c.getUniformLocation(t,`u_m4`);c.uniformMatrix4fv(n,!1,[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),i(c.getError()).toBe(c.NO_ERROR)}),await a(`uniformMatrix4fv with transpose=true generates INVALID_VALUE in WebGL1`,async()=>{let t=e(c,s,_);c.useProgram(t);let n=c.getUniformLocation(t,`u_m4`);c.uniformMatrix4fv(n,!0,[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),i(c.getError()).toBe(c.INVALID_VALUE)}),await a(`uniformMatrix4fv / getUniform round-trips a mat4`,async()=>{let t=e(c,s,_);c.useProgram(t);let n=c.getUniformLocation(t,`u_m4`),r=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];c.uniformMatrix4fv(n,!1,r),i(c.getError()).toBe(c.NO_ERROR),i(b(c.getUniform(t,n),r)).toBe(!0)})}),await r(`conformance/uniforms/gl-uniform-arrays`,async()=>{n(async()=>{x.make_current()}),await a(`uniform1fv sets a float array and getUniform retrieves element [0]`,async()=>{let t=e(c,s,v);c.useProgram(t);let n=c.getUniformLocation(t,`u_arr[0]`);i(n).not.toBeNull(),c.uniform1fv(n,[.1,.2,.3]),i(c.getError()).toBe(c.NO_ERROR);let r=c.getUniform(t,n);i(Math.abs(r-.1)<.001).toBe(!0)}),await a(`uniform1fv with fewer values than array size (partial update) succeeds`,async()=>{let t=e(c,s,v);c.useProgram(t);let n=c.getUniformLocation(t,`u_arr[0]`);c.uniform1fv(n,[.5,.6]),i(c.getError()).toBe(c.NO_ERROR)}),await a(`uniform4fv sets a vec4 array`,async()=>{let t=e(c,s,y);c.useProgram(t);let n=c.getUniformLocation(t,`u_v4arr[0]`);i(n).not.toBeNull(),c.uniform4fv(n,[.1,.2,.3,.4,.5,.6,.7,.8,.9,1,0,0]),i(c.getError()).toBe(c.NO_ERROR)}),await a(`getUniformLocation resolves bare array name (without [0] suffix)`,async()=>{let t=e(c,s,v);c.useProgram(t);let n=c.getUniformLocation(t,`u_arr`);i(n).not.toBeNull(),i(c.getError()).toBe(c.NO_ERROR),c.uniform1fv(n,[.7,.8,.9]),i(c.getError()).toBe(c.NO_ERROR);let r=c.getUniform(t,n);i(Math.abs(r-.7)<.001).toBe(!0)}),await a(`bare array name and indexed [0] name resolve to equivalent locations`,async()=>{let t=e(c,s,v);c.useProgram(t);let n=c.getUniformLocation(t,`u_arr`),r=c.getUniformLocation(t,`u_arr[0]`);i(n).not.toBeNull(),i(r).not.toBeNull(),c.uniform1fv(n,[.42,.43,.44]),i(c.getError()).toBe(c.NO_ERROR);let a=c.getUniform(t,r);i(Math.abs(a-.42)<.001).toBe(!0)}),await a(`calling uniform* before useProgram generates INVALID_OPERATION`,async()=>{let t=e(c,s,v);c.useProgram(null);let n=c.getUniformLocation(t,`u_arr[0]`);n===null?i(c.getError()).toBe(c.NO_ERROR):(c.uniform1fv(n,[1,2,3]),i(c.getError()).toBe(c.INVALID_OPERATION))})}),await r(`conformance/uniforms/uniform-location`,async()=>{n(async()=>{x.make_current()}),await a(`getUniformLocation returns non-null for known uniform`,async()=>{let t=e(c,s,l);c.useProgram(t),i(c.getUniformLocation(t,`u_f`)).not.toBeNull(),i(c.getError()).toBe(c.NO_ERROR)}),await a(`location from different program generates INVALID_OPERATION`,async()=>{let t=e(c,s,l),n=e(c,s,l),r=c.getUniformLocation(t,`u_f`);c.useProgram(n),c.uniform1f(r,1),i(c.getError()).toBe(c.INVALID_OPERATION)}),await a(`location becomes invalid after relinkProgram`,async()=>{let t=e(c,s,l);c.useProgram(t);let n=c.getUniformLocation(t,`u_f`);i(n).not.toBeNull(),c.linkProgram(t),c.uniform1f(n,1),i(c.getError()).toBe(c.INVALID_OPERATION);let r=c.getUniformLocation(t,`u_f`);i(r).not.toBeNull(),c.uniform1f(r,1),i(c.getError()).toBe(c.NO_ERROR)})})})};export{x as default};
@@ -1,25 +1 @@
1
- import buffers_spec_default from "./conformance/buffers.spec.js";
2
- import programs_spec_default from "./conformance/programs.spec.js";
3
- import attribs_spec_default from "./conformance/attribs.spec.js";
4
- import context_spec_default from "./conformance/context.spec.js";
5
- import rendering_basic_spec_default from "./conformance/rendering-basic.spec.js";
6
- import uniforms_spec_default from "./conformance/uniforms.spec.js";
7
- import state_spec_default from "./conformance/state.spec.js";
8
- import rendering_spec_default from "./conformance/rendering.spec.js";
9
- import textures_spec_default from "./conformance/textures.spec.js";
10
- import { run } from "@gjsify/unit";
11
-
12
- //#region src/ts/conformance-test.ts
13
- run({ testSuite: async () => {
14
- await buffers_spec_default();
15
- await programs_spec_default();
16
- await attribs_spec_default();
17
- await context_spec_default();
18
- await rendering_basic_spec_default();
19
- await uniforms_spec_default();
20
- await state_spec_default();
21
- await rendering_spec_default();
22
- await textures_spec_default();
23
- } });
24
-
25
- //#endregion
1
+ import e from"./conformance/buffers.spec.js";import t from"./conformance/programs.spec.js";import n from"./conformance/attribs.spec.js";import r from"./conformance/context.spec.js";import i from"./conformance/rendering-basic.spec.js";import a from"./conformance/uniforms.spec.js";import o from"./conformance/state.spec.js";import s from"./conformance/rendering.spec.js";import c from"./conformance/textures.spec.js";import{run as l}from"@gjsify/unit";l({testSuite:async()=>{await e(),await t(),await n(),await r(),await i(),await a(),await o(),await s(),await c()}});
@@ -1,18 +1 @@
1
- //#region src/ts/extensions/ext-blend-minmax.ts
2
- var EXTBlendMinMax = class {
3
- constructor() {
4
- this.MIN_EXT = 32775;
5
- this.MAX_EXT = 32776;
6
- }
7
- };
8
- function getEXTBlendMinMax(context) {
9
- let result = null;
10
- const exts = context.getSupportedExtensions();
11
- if (exts && exts.indexOf("EXT_blend_minmax") >= 0) {
12
- result = new EXTBlendMinMax();
13
- }
14
- return result;
15
- }
16
-
17
- //#endregion
18
- export { EXTBlendMinMax, getEXTBlendMinMax };
1
+ var e=class{constructor(){this.MIN_EXT=32775,this.MAX_EXT=32776}};function t(t){let n=null,r=t.getSupportedExtensions();return r&&r.indexOf(`EXT_blend_minmax`)>=0&&(n=new e),n}export{e as EXTBlendMinMax,t as getEXTBlendMinMax};
@@ -1,12 +1 @@
1
- //#region src/ts/extensions/ext-color-buffer-float.ts
2
- var EXTColorBufferFloat = class {};
3
- function getEXTColorBufferFloat(context) {
4
- const exts = context.getSupportedExtensions();
5
- if (exts && exts.indexOf("EXT_color_buffer_float") >= 0) {
6
- return new EXTColorBufferFloat();
7
- }
8
- return null;
9
- }
10
-
11
- //#endregion
12
- export { EXTColorBufferFloat, getEXTColorBufferFloat };
1
+ var e=class{};function t(t){let n=t.getSupportedExtensions();return n&&n.indexOf(`EXT_color_buffer_float`)>=0?new e:null}export{e as EXTColorBufferFloat,t as getEXTColorBufferFloat};
@@ -1,12 +1 @@
1
- //#region src/ts/extensions/ext-color-buffer-half-float.ts
2
- var EXTColorBufferHalfFloat = class {};
3
- function getEXTColorBufferHalfFloat(context) {
4
- const exts = context.getSupportedExtensions();
5
- if (exts && exts.indexOf("EXT_color_buffer_half_float") >= 0) {
6
- return new EXTColorBufferHalfFloat();
7
- }
8
- return null;
9
- }
10
-
11
- //#endregion
12
- export { EXTColorBufferHalfFloat, getEXTColorBufferHalfFloat };
1
+ var e=class{};function t(t){let n=t.getSupportedExtensions();return n&&n.indexOf(`EXT_color_buffer_half_float`)>=0?new e:null}export{e as EXTColorBufferHalfFloat,t as getEXTColorBufferHalfFloat};
@@ -1,18 +1 @@
1
- //#region src/ts/extensions/ext-texture-filter-anisotropic.ts
2
- var EXTTextureFilterAnisotropic = class {
3
- constructor() {
4
- this.TEXTURE_MAX_ANISOTROPY_EXT = 34046;
5
- this.MAX_TEXTURE_MAX_ANISOTROPY_EXT = 34047;
6
- }
7
- };
8
- function getEXTTextureFilterAnisotropic(context) {
9
- let result = null;
10
- const exts = context.getSupportedExtensions();
11
- if (exts && exts.indexOf("EXT_texture_filter_anisotropic") >= 0) {
12
- result = new EXTTextureFilterAnisotropic();
13
- }
14
- return result;
15
- }
16
-
17
- //#endregion
18
- export { EXTTextureFilterAnisotropic, getEXTTextureFilterAnisotropic };
1
+ var e=class{constructor(){this.TEXTURE_MAX_ANISOTROPY_EXT=34046,this.MAX_TEXTURE_MAX_ANISOTROPY_EXT=34047}};function t(t){let n=null,r=t.getSupportedExtensions();return r&&r.indexOf(`EXT_texture_filter_anisotropic`)>=0&&(n=new e),n}export{e as EXTTextureFilterAnisotropic,t as getEXTTextureFilterAnisotropic};
@@ -1,13 +1 @@
1
- //#region src/ts/extensions/oes-element-index-unit.ts
2
- var OESElementIndexUint = class {};
3
- function getOESElementIndexUint(context) {
4
- let result = null;
5
- const exts = context.getSupportedExtensions();
6
- if (exts && exts.indexOf("OES_element_index_uint") >= 0) {
7
- result = new OESElementIndexUint();
8
- }
9
- return result;
10
- }
11
-
12
- //#endregion
13
- export { OESElementIndexUint, getOESElementIndexUint };
1
+ var e=class{};function t(t){let n=null,r=t.getSupportedExtensions();return r&&r.indexOf(`OES_element_index_uint`)>=0&&(n=new e),n}export{e as OESElementIndexUint,t as getOESElementIndexUint};
@@ -1,17 +1 @@
1
- //#region src/ts/extensions/oes-standard-derivatives.ts
2
- var OESStandardDerivatives = class {
3
- constructor() {
4
- this.FRAGMENT_SHADER_DERIVATIVE_HINT_OES = 35723;
5
- }
6
- };
7
- function getOESStandardDerivatives(context) {
8
- let result = null;
9
- const exts = context.getSupportedExtensions();
10
- if (exts && exts.indexOf("OES_standard_derivatives") >= 0) {
11
- result = new OESStandardDerivatives();
12
- }
13
- return result;
14
- }
15
-
16
- //#endregion
17
- export { OESStandardDerivatives, getOESStandardDerivatives };
1
+ var e=class{constructor(){this.FRAGMENT_SHADER_DERIVATIVE_HINT_OES=35723}};function t(t){let n=null,r=t.getSupportedExtensions();return r&&r.indexOf(`OES_standard_derivatives`)>=0&&(n=new e),n}export{e as OESStandardDerivatives,t as getOESStandardDerivatives};
@@ -1,13 +1 @@
1
- //#region src/ts/extensions/oes-texture-float-linear.ts
2
- var OESTextureFloatLinear = class {};
3
- function getOESTextureFloatLinear(context) {
4
- let result = null;
5
- const exts = context.getSupportedExtensions();
6
- if (exts && exts.indexOf("OES_texture_float_linear") >= 0) {
7
- result = new OESTextureFloatLinear();
8
- }
9
- return result;
10
- }
11
-
12
- //#endregion
13
- export { OESTextureFloatLinear, getOESTextureFloatLinear };
1
+ var e=class{};function t(t){let n=null,r=t.getSupportedExtensions();return r&&r.indexOf(`OES_texture_float_linear`)>=0&&(n=new e),n}export{e as OESTextureFloatLinear,t as getOESTextureFloatLinear};
@@ -1,13 +1 @@
1
- //#region src/ts/extensions/oes-texture-float.ts
2
- var OESTextureFloat = class {};
3
- function getOESTextureFloat(context) {
4
- let result = null;
5
- const exts = context.getSupportedExtensions();
6
- if (exts && exts.indexOf("OES_texture_float") >= 0) {
7
- result = new OESTextureFloat();
8
- }
9
- return result;
10
- }
11
-
12
- //#endregion
13
- export { OESTextureFloat, getOESTextureFloat };
1
+ var e=class{};function t(t){let n=null,r=t.getSupportedExtensions();return r&&r.indexOf(`OES_texture_float`)>=0&&(n=new e),n}export{e as OESTextureFloat,t as getOESTextureFloat};
@@ -1,19 +1 @@
1
- //#region src/ts/extensions/oes-texture-half-float.ts
2
- var OESTextureHalfFloat = class {
3
- constructor() {
4
- this.HALF_FLOAT_OES = 36193;
5
- }
6
- };
7
- function getOESTextureHalfFloat(context) {
8
- const exts = context.getSupportedExtensions();
9
- if (exts && exts.indexOf("OES_texture_half_float") >= 0) {
10
- return new OESTextureHalfFloat();
11
- }
12
- if (context._native2) {
13
- return new OESTextureHalfFloat();
14
- }
15
- return null;
16
- }
17
-
18
- //#endregion
19
- export { OESTextureHalfFloat, getOESTextureHalfFloat };
1
+ var e=class{constructor(){this.HALF_FLOAT_OES=36193}};function t(t){let n=t.getSupportedExtensions();return n&&n.indexOf(`OES_texture_half_float`)>=0||t._native2?new e:null}export{e as OESTextureHalfFloat,t as getOESTextureHalfFloat};