@gjsify/webgl 0.3.15 → 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,315 +1,3 @@
1
- import { destroyTestFBO, makeProgram, makeTestFBO } 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/attribs.spec.ts
6
- var attribs_spec_default = async () => {
7
- await on("Display", async () => {
8
- const setup = createGLSetup();
9
- if (!setup) {
10
- console.warn("WebGL context not available — skipping conformance/attribs tests");
11
- return;
12
- }
13
- const { gl, glArea, win } = setup;
14
- glArea.make_current();
15
- await describe("conformance/attribs/gl-vertex-attrib: vertexAttrib round-trip", async () => {
16
- beforeEach(async () => {
17
- glArea.make_current();
18
- });
19
- await it("vertexAttrib1f stores value in slot 0 and defaults to [x,0,0,1]", async () => {
20
- gl.vertexAttrib1f(0, 5);
21
- const v = gl.getVertexAttrib(0, gl.CURRENT_VERTEX_ATTRIB);
22
- expect(v instanceof Float32Array).toBeTruthy();
23
- expect(v[0]).toBe(5);
24
- expect(v[1]).toBe(0);
25
- expect(v[2]).toBe(0);
26
- expect(v[3]).toBe(1);
27
- });
28
- await it("vertexAttrib2f stores two values and defaults the rest to [_,_,0,1]", async () => {
29
- gl.vertexAttrib2f(0, 6, 7);
30
- const v = gl.getVertexAttrib(0, gl.CURRENT_VERTEX_ATTRIB);
31
- expect(v[0]).toBe(6);
32
- expect(v[1]).toBe(7);
33
- expect(v[2]).toBe(0);
34
- expect(v[3]).toBe(1);
35
- });
36
- await it("vertexAttrib3f stores three values and defaults last to 1", async () => {
37
- gl.vertexAttrib3f(0, 7, 8, 9);
38
- const v = gl.getVertexAttrib(0, gl.CURRENT_VERTEX_ATTRIB);
39
- expect(v[0]).toBe(7);
40
- expect(v[1]).toBe(8);
41
- expect(v[2]).toBe(9);
42
- expect(v[3]).toBe(1);
43
- });
44
- await it("vertexAttrib4f stores all four values", async () => {
45
- gl.vertexAttrib4f(0, 6, 7, 8, 9);
46
- const v = gl.getVertexAttrib(0, gl.CURRENT_VERTEX_ATTRIB);
47
- expect(v[0]).toBe(6);
48
- expect(v[1]).toBe(7);
49
- expect(v[2]).toBe(8);
50
- expect(v[3]).toBe(9);
51
- });
52
- await it("vertexAttrib1fv with array round-trips correctly", async () => {
53
- gl.vertexAttrib1fv(0, [1]);
54
- const v = gl.getVertexAttrib(0, gl.CURRENT_VERTEX_ATTRIB);
55
- expect(v[0]).toBe(1);
56
- expect(v[1]).toBe(0);
57
- expect(v[2]).toBe(0);
58
- expect(v[3]).toBe(1);
59
- });
60
- await it("vertexAttrib1fv with Float32Array round-trips correctly", async () => {
61
- gl.vertexAttrib1fv(0, new Float32Array([-1]));
62
- const v = gl.getVertexAttrib(0, gl.CURRENT_VERTEX_ATTRIB);
63
- expect(v[0]).toBe(-1);
64
- expect(v[3]).toBe(1);
65
- });
66
- await it("vertexAttrib2fv with array round-trips correctly", async () => {
67
- gl.vertexAttrib2fv(0, [1, 2]);
68
- const v = gl.getVertexAttrib(0, gl.CURRENT_VERTEX_ATTRIB);
69
- expect(v[0]).toBe(1);
70
- expect(v[1]).toBe(2);
71
- expect(v[2]).toBe(0);
72
- expect(v[3]).toBe(1);
73
- });
74
- await it("vertexAttrib3fv with Float32Array round-trips correctly", async () => {
75
- gl.vertexAttrib3fv(0, new Float32Array([
76
- 1,
77
- -2,
78
- 3
79
- ]));
80
- const v = gl.getVertexAttrib(0, gl.CURRENT_VERTEX_ATTRIB);
81
- expect(v[0]).toBe(1);
82
- expect(v[1]).toBe(-2);
83
- expect(v[2]).toBe(3);
84
- expect(v[3]).toBe(1);
85
- });
86
- await it("vertexAttrib4fv with Float32Array round-trips correctly", async () => {
87
- gl.vertexAttrib4fv(0, new Float32Array([
88
- 1,
89
- 2,
90
- -3,
91
- 4
92
- ]));
93
- const v = gl.getVertexAttrib(0, gl.CURRENT_VERTEX_ATTRIB);
94
- expect(v[0]).toBe(1);
95
- expect(v[1]).toBe(2);
96
- expect(v[2]).toBe(-3);
97
- expect(v[3]).toBe(4);
98
- });
99
- await it("setting attrib values generates no GL error", async () => {
100
- const numAttribs = gl.getParameter(gl.MAX_VERTEX_ATTRIBS);
101
- for (let i = 0; i < numAttribs; i++) {
102
- gl.vertexAttrib4f(i, i * .1, i * .2, i * .3, i * .4);
103
- }
104
- expect(gl.getError()).toBe(gl.NO_ERROR);
105
- });
106
- });
107
- await describe("conformance/attribs/gl-vertex-attrib: out-of-range index", async () => {
108
- beforeEach(async () => {
109
- glArea.make_current();
110
- });
111
- await it("getVertexAttrib with out-of-range index generates INVALID_VALUE", async () => {
112
- const numAttribs = gl.getParameter(gl.MAX_VERTEX_ATTRIBS);
113
- gl.getVertexAttrib(numAttribs, gl.CURRENT_VERTEX_ATTRIB);
114
- expect(gl.getError()).toBe(gl.INVALID_VALUE);
115
- });
116
- await it("vertexAttrib1fv with out-of-range index generates INVALID_VALUE", async () => {
117
- const numAttribs = gl.getParameter(gl.MAX_VERTEX_ATTRIBS);
118
- gl.vertexAttrib1fv(numAttribs, [1]);
119
- expect(gl.getError()).toBe(gl.INVALID_VALUE);
120
- });
121
- await it("vertexAttrib4fv with out-of-range index generates INVALID_VALUE", async () => {
122
- const numAttribs = gl.getParameter(gl.MAX_VERTEX_ATTRIBS);
123
- gl.vertexAttrib4fv(numAttribs, new Float32Array([
124
- 1,
125
- 2,
126
- 3,
127
- 4
128
- ]));
129
- expect(gl.getError()).toBe(gl.INVALID_VALUE);
130
- });
131
- await it("vertexAttrib4f with out-of-range index generates INVALID_VALUE", async () => {
132
- const numAttribs = gl.getParameter(gl.MAX_VERTEX_ATTRIBS);
133
- gl.vertexAttrib4f(numAttribs, 1, 2, 3, 4);
134
- expect(gl.getError()).toBe(gl.INVALID_VALUE);
135
- });
136
- });
137
- await describe("conformance/attribs/gl-enable-vertex-attrib", async () => {
138
- beforeEach(async () => {
139
- glArea.make_current();
140
- });
141
- await it("drawArrays with enabled attrib that has no buffer bound generates INVALID_OPERATION", async () => {
142
- const vsSrc = `attribute vec4 vPosition; void main() { gl_Position = vPosition; }`;
143
- const fsSrc = `void main() { gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); }`;
144
- const prog = makeProgram(gl, vsSrc, fsSrc);
145
- gl.useProgram(prog);
146
- const vertexObject = gl.createBuffer();
147
- gl.bindBuffer(gl.ARRAY_BUFFER, vertexObject);
148
- gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
149
- 0,
150
- .5,
151
- 0,
152
- -.5,
153
- -.5,
154
- 0,
155
- .5,
156
- -.5,
157
- 0
158
- ]), gl.STATIC_DRAW);
159
- gl.enableVertexAttribArray(0);
160
- gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);
161
- gl.enableVertexAttribArray(3);
162
- expect(gl.getError()).toBe(gl.NO_ERROR);
163
- gl.drawArrays(gl.TRIANGLES, 0, 3);
164
- expect(gl.getError()).toBe(gl.INVALID_OPERATION);
165
- gl.disableVertexAttribArray(0);
166
- gl.disableVertexAttribArray(3);
167
- gl.deleteBuffer(vertexObject);
168
- gl.deleteProgram(prog);
169
- });
170
- });
171
- await describe("conformance/attribs/gl-bindAttribLocation-repeated", async () => {
172
- beforeEach(async () => {
173
- glArea.make_current();
174
- });
175
- await it("getAttribLocation returns the bound location after linkProgram", async () => {
176
- const vsSrc = `attribute vec4 vPosition; void main() { gl_Position = vPosition; }`;
177
- const fsSrc = `void main() { gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); }`;
178
- function setup(attribIndex) {
179
- const vs = gl.createShader(gl.VERTEX_SHADER);
180
- gl.shaderSource(vs, vsSrc);
181
- gl.compileShader(vs);
182
- const fs = gl.createShader(gl.FRAGMENT_SHADER);
183
- gl.shaderSource(fs, fsSrc);
184
- gl.compileShader(fs);
185
- const prog = gl.createProgram();
186
- gl.attachShader(prog, vs);
187
- gl.attachShader(prog, fs);
188
- gl.bindAttribLocation(prog, attribIndex, "vPosition");
189
- gl.linkProgram(prog);
190
- expect(gl.getProgramParameter(prog, gl.LINK_STATUS)).toBeTruthy();
191
- expect(gl.getAttribLocation(prog, "vPosition")).toBe(attribIndex);
192
- gl.deleteShader(vs);
193
- gl.deleteShader(fs);
194
- return prog;
195
- }
196
- const p0 = setup(0);
197
- const p3 = setup(3);
198
- const p1 = setup(1);
199
- const p3b = setup(3);
200
- gl.deleteProgram(p0);
201
- gl.deleteProgram(p3);
202
- gl.deleteProgram(p1);
203
- gl.deleteProgram(p3b);
204
- });
205
- });
206
- await describe("conformance/attribs/attribute-weirdness", async () => {
207
- beforeEach(async () => {
208
- glArea.make_current();
209
- });
210
- const W = 2, H = 2;
211
- const VDATA = new Int16Array([
212
- 0,
213
- 0,
214
- 0,
215
- 0,
216
- 4,
217
- 0,
218
- 1,
219
- 0,
220
- 0,
221
- 4,
222
- 0,
223
- 1,
224
- 4,
225
- 4,
226
- 1,
227
- 1
228
- ]);
229
- function renderAttribWeirdness(flipAttributes, flipLocations) {
230
- const fbo = makeTestFBO(gl, W, H);
231
- const attrs = ["attribute vec2 a_pos;", "attribute vec2 a_texture_pos;"];
232
- if (flipAttributes) attrs.reverse();
233
- const vsSrc = [
234
- "precision mediump float;",
235
- attrs[0],
236
- attrs[1],
237
- "varying vec2 v_pos0;",
238
- "void main() {",
239
- " v_pos0 = a_texture_pos;",
240
- " gl_Position = vec4(a_pos - 1.0, 0.0, 1.0);",
241
- "}"
242
- ].join("\n");
243
- const fsSrc = [
244
- "precision mediump float;",
245
- "varying vec2 v_pos0;",
246
- "void main() {",
247
- " gl_FragColor = vec4(v_pos0.x, 0.0, 0.0, 1.0);",
248
- "}"
249
- ].join("\n");
250
- gl.clearColor(0, 0, 0, 0);
251
- gl.clear(gl.COLOR_BUFFER_BIT);
252
- const prog = makeProgram(gl, vsSrc, fsSrc);
253
- gl.useProgram(prog);
254
- const buf = gl.createBuffer();
255
- gl.bindBuffer(gl.ARRAY_BUFFER, buf);
256
- gl.bufferData(gl.ARRAY_BUFFER, VDATA, gl.STATIC_DRAW);
257
- let aPos = gl.getAttribLocation(prog, "a_pos");
258
- let aTexPos = gl.getAttribLocation(prog, "a_texture_pos");
259
- gl.enableVertexAttribArray(aPos);
260
- gl.enableVertexAttribArray(aTexPos);
261
- if (flipLocations) {
262
- const tmp = aPos;
263
- aPos = aTexPos;
264
- aTexPos = tmp;
265
- }
266
- gl.vertexAttribPointer(aPos, 2, gl.SHORT, false, 8, 0);
267
- gl.vertexAttribPointer(aTexPos, 2, gl.SHORT, false, 8, 4);
268
- gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
269
- gl.bindBuffer(gl.ARRAY_BUFFER, null);
270
- gl.deleteBuffer(buf);
271
- const pixels = new Uint8Array(W * H * 4);
272
- gl.readPixels(0, 0, W, H, gl.RGBA, gl.UNSIGNED_BYTE, pixels);
273
- destroyTestFBO(gl, fbo);
274
- return pixels;
275
- }
276
- await it("normal order: all alpha values are 255 (quad covers canvas)", async () => {
277
- const pixels = renderAttribWeirdness(false, false);
278
- let ok = true;
279
- for (let i = 3; i < W * H * 4; i += 4) {
280
- if (pixels[i] !== 255) {
281
- ok = false;
282
- break;
283
- }
284
- }
285
- expect(ok).toBe(true);
286
- });
287
- await it("flipped attribute declarations: all alpha values are still 255", async () => {
288
- const pixels = renderAttribWeirdness(true, false);
289
- let ok = true;
290
- for (let i = 3; i < W * H * 4; i += 4) {
291
- if (pixels[i] !== 255) {
292
- ok = false;
293
- break;
294
- }
295
- }
296
- expect(ok).toBe(true);
297
- });
298
- await it("swapped location assignments: quad does not cover canvas (some alpha ≠ 255)", async () => {
299
- const pixels = renderAttribWeirdness(false, true);
300
- let hasNonAlpha = false;
301
- for (let i = 3; i < W * H * 4; i += 4) {
302
- if (pixels[i] !== 255) {
303
- hasNonAlpha = true;
304
- break;
305
- }
306
- }
307
- expect(hasNonAlpha).toBe(true);
308
- });
309
- });
310
- win.destroy();
311
- });
312
- };
313
-
314
- //#endregion
315
- export { attribs_spec_default as default };
1
+ import{destroyTestFBO as e,makeProgram as t,makeTestFBO as n}from"../test-utils.js";import{createGLSetup as r}from"./setup.js";import{beforeEach as i,describe as a,expect as o,it as s,on as c}from"@gjsify/unit";var l=async()=>{await c(`Display`,async()=>{let c=r();if(!c){console.warn(`WebGL context not available — skipping conformance/attribs tests`);return}let{gl:l,glArea:u,win:d}=c;u.make_current(),await a(`conformance/attribs/gl-vertex-attrib: vertexAttrib round-trip`,async()=>{i(async()=>{u.make_current()}),await s(`vertexAttrib1f stores value in slot 0 and defaults to [x,0,0,1]`,async()=>{l.vertexAttrib1f(0,5);let e=l.getVertexAttrib(0,l.CURRENT_VERTEX_ATTRIB);o(e instanceof Float32Array).toBeTruthy(),o(e[0]).toBe(5),o(e[1]).toBe(0),o(e[2]).toBe(0),o(e[3]).toBe(1)}),await s(`vertexAttrib2f stores two values and defaults the rest to [_,_,0,1]`,async()=>{l.vertexAttrib2f(0,6,7);let e=l.getVertexAttrib(0,l.CURRENT_VERTEX_ATTRIB);o(e[0]).toBe(6),o(e[1]).toBe(7),o(e[2]).toBe(0),o(e[3]).toBe(1)}),await s(`vertexAttrib3f stores three values and defaults last to 1`,async()=>{l.vertexAttrib3f(0,7,8,9);let e=l.getVertexAttrib(0,l.CURRENT_VERTEX_ATTRIB);o(e[0]).toBe(7),o(e[1]).toBe(8),o(e[2]).toBe(9),o(e[3]).toBe(1)}),await s(`vertexAttrib4f stores all four values`,async()=>{l.vertexAttrib4f(0,6,7,8,9);let e=l.getVertexAttrib(0,l.CURRENT_VERTEX_ATTRIB);o(e[0]).toBe(6),o(e[1]).toBe(7),o(e[2]).toBe(8),o(e[3]).toBe(9)}),await s(`vertexAttrib1fv with array round-trips correctly`,async()=>{l.vertexAttrib1fv(0,[1]);let e=l.getVertexAttrib(0,l.CURRENT_VERTEX_ATTRIB);o(e[0]).toBe(1),o(e[1]).toBe(0),o(e[2]).toBe(0),o(e[3]).toBe(1)}),await s(`vertexAttrib1fv with Float32Array round-trips correctly`,async()=>{l.vertexAttrib1fv(0,new Float32Array([-1]));let e=l.getVertexAttrib(0,l.CURRENT_VERTEX_ATTRIB);o(e[0]).toBe(-1),o(e[3]).toBe(1)}),await s(`vertexAttrib2fv with array round-trips correctly`,async()=>{l.vertexAttrib2fv(0,[1,2]);let e=l.getVertexAttrib(0,l.CURRENT_VERTEX_ATTRIB);o(e[0]).toBe(1),o(e[1]).toBe(2),o(e[2]).toBe(0),o(e[3]).toBe(1)}),await s(`vertexAttrib3fv with Float32Array round-trips correctly`,async()=>{l.vertexAttrib3fv(0,new Float32Array([1,-2,3]));let e=l.getVertexAttrib(0,l.CURRENT_VERTEX_ATTRIB);o(e[0]).toBe(1),o(e[1]).toBe(-2),o(e[2]).toBe(3),o(e[3]).toBe(1)}),await s(`vertexAttrib4fv with Float32Array round-trips correctly`,async()=>{l.vertexAttrib4fv(0,new Float32Array([1,2,-3,4]));let e=l.getVertexAttrib(0,l.CURRENT_VERTEX_ATTRIB);o(e[0]).toBe(1),o(e[1]).toBe(2),o(e[2]).toBe(-3),o(e[3]).toBe(4)}),await s(`setting attrib values generates no GL error`,async()=>{let e=l.getParameter(l.MAX_VERTEX_ATTRIBS);for(let t=0;t<e;t++)l.vertexAttrib4f(t,t*.1,t*.2,t*.3,t*.4);o(l.getError()).toBe(l.NO_ERROR)})}),await a(`conformance/attribs/gl-vertex-attrib: out-of-range index`,async()=>{i(async()=>{u.make_current()}),await s(`getVertexAttrib with out-of-range index generates INVALID_VALUE`,async()=>{let e=l.getParameter(l.MAX_VERTEX_ATTRIBS);l.getVertexAttrib(e,l.CURRENT_VERTEX_ATTRIB),o(l.getError()).toBe(l.INVALID_VALUE)}),await s(`vertexAttrib1fv with out-of-range index generates INVALID_VALUE`,async()=>{let e=l.getParameter(l.MAX_VERTEX_ATTRIBS);l.vertexAttrib1fv(e,[1]),o(l.getError()).toBe(l.INVALID_VALUE)}),await s(`vertexAttrib4fv with out-of-range index generates INVALID_VALUE`,async()=>{let e=l.getParameter(l.MAX_VERTEX_ATTRIBS);l.vertexAttrib4fv(e,new Float32Array([1,2,3,4])),o(l.getError()).toBe(l.INVALID_VALUE)}),await s(`vertexAttrib4f with out-of-range index generates INVALID_VALUE`,async()=>{let e=l.getParameter(l.MAX_VERTEX_ATTRIBS);l.vertexAttrib4f(e,1,2,3,4),o(l.getError()).toBe(l.INVALID_VALUE)})}),await a(`conformance/attribs/gl-enable-vertex-attrib`,async()=>{i(async()=>{u.make_current()}),await s(`drawArrays with enabled attrib that has no buffer bound generates INVALID_OPERATION`,async()=>{let e=t(l,`attribute vec4 vPosition; void main() { gl_Position = vPosition; }`,`void main() { gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); }`);l.useProgram(e);let n=l.createBuffer();l.bindBuffer(l.ARRAY_BUFFER,n),l.bufferData(l.ARRAY_BUFFER,new Float32Array([0,.5,0,-.5,-.5,0,.5,-.5,0]),l.STATIC_DRAW),l.enableVertexAttribArray(0),l.vertexAttribPointer(0,3,l.FLOAT,!1,0,0),l.enableVertexAttribArray(3),o(l.getError()).toBe(l.NO_ERROR),l.drawArrays(l.TRIANGLES,0,3),o(l.getError()).toBe(l.INVALID_OPERATION),l.disableVertexAttribArray(0),l.disableVertexAttribArray(3),l.deleteBuffer(n),l.deleteProgram(e)})}),await a(`conformance/attribs/gl-bindAttribLocation-repeated`,async()=>{i(async()=>{u.make_current()}),await s(`getAttribLocation returns the bound location after linkProgram`,async()=>{function e(e){let t=l.createShader(l.VERTEX_SHADER);l.shaderSource(t,`attribute vec4 vPosition; void main() { gl_Position = vPosition; }`),l.compileShader(t);let n=l.createShader(l.FRAGMENT_SHADER);l.shaderSource(n,`void main() { gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); }`),l.compileShader(n);let r=l.createProgram();return l.attachShader(r,t),l.attachShader(r,n),l.bindAttribLocation(r,e,`vPosition`),l.linkProgram(r),o(l.getProgramParameter(r,l.LINK_STATUS)).toBeTruthy(),o(l.getAttribLocation(r,`vPosition`)).toBe(e),l.deleteShader(t),l.deleteShader(n),r}let t=e(0),n=e(3),r=e(1),i=e(3);l.deleteProgram(t),l.deleteProgram(n),l.deleteProgram(r),l.deleteProgram(i)})}),await a(`conformance/attribs/attribute-weirdness`,async()=>{i(async()=>{u.make_current()});let r=new Int16Array([0,0,0,0,4,0,1,0,0,4,0,1,4,4,1,1]);function a(i,a){let o=n(l,2,2),s=[`attribute vec2 a_pos;`,`attribute vec2 a_texture_pos;`];i&&s.reverse();let c=[`precision mediump float;`,s[0],s[1],`varying vec2 v_pos0;`,`void main() {`,` v_pos0 = a_texture_pos;`,` gl_Position = vec4(a_pos - 1.0, 0.0, 1.0);`,`}`].join(`
2
+ `),u=[`precision mediump float;`,`varying vec2 v_pos0;`,`void main() {`,` gl_FragColor = vec4(v_pos0.x, 0.0, 0.0, 1.0);`,`}`].join(`
3
+ `);l.clearColor(0,0,0,0),l.clear(l.COLOR_BUFFER_BIT);let d=t(l,c,u);l.useProgram(d);let f=l.createBuffer();l.bindBuffer(l.ARRAY_BUFFER,f),l.bufferData(l.ARRAY_BUFFER,r,l.STATIC_DRAW);let p=l.getAttribLocation(d,`a_pos`),m=l.getAttribLocation(d,`a_texture_pos`);if(l.enableVertexAttribArray(p),l.enableVertexAttribArray(m),a){let e=p;p=m,m=e}l.vertexAttribPointer(p,2,l.SHORT,!1,8,0),l.vertexAttribPointer(m,2,l.SHORT,!1,8,4),l.drawArrays(l.TRIANGLE_STRIP,0,4),l.bindBuffer(l.ARRAY_BUFFER,null),l.deleteBuffer(f);let h=new Uint8Array(16);return l.readPixels(0,0,2,2,l.RGBA,l.UNSIGNED_BYTE,h),e(l,o),h}await s(`normal order: all alpha values are 255 (quad covers canvas)`,async()=>{let e=a(!1,!1),t=!0;for(let n=3;n<16;n+=4)if(e[n]!==255){t=!1;break}o(t).toBe(!0)}),await s(`flipped attribute declarations: all alpha values are still 255`,async()=>{let e=a(!0,!1),t=!0;for(let n=3;n<16;n+=4)if(e[n]!==255){t=!1;break}o(t).toBe(!0)}),await s(`swapped location assignments: quad does not cover canvas (some alpha ≠ 255)`,async()=>{let e=a(!1,!0),t=!1;for(let n=3;n<16;n+=4)if(e[n]!==255){t=!0;break}o(t).toBe(!0)})}),d.destroy()})};export{l as default};
@@ -1,220 +1 @@
1
- import { destroyTestFBO, makeProgram, makeTestFBO, pixelClose, readPixel } 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/buffers.spec.ts
6
- var buffers_spec_default = async () => {
7
- await on("Display", async () => {
8
- const setup = createGLSetup();
9
- if (!setup) {
10
- console.warn("WebGL context not available — skipping conformance/buffers tests");
11
- return;
12
- }
13
- const { gl, glArea, win } = setup;
14
- glArea.make_current();
15
- await describe("conformance/buffers/buffer-bind-test", async () => {
16
- beforeEach(async () => {
17
- glArea.make_current();
18
- });
19
- await it("should be able to bind and unbind an ARRAY_BUFFER", async () => {
20
- const buf = gl.createBuffer();
21
- gl.bindBuffer(gl.ARRAY_BUFFER, buf);
22
- expect(gl.getError()).toBe(gl.NO_ERROR);
23
- gl.bindBuffer(gl.ARRAY_BUFFER, null);
24
- expect(gl.getError()).toBe(gl.NO_ERROR);
25
- gl.deleteBuffer(buf);
26
- });
27
- await it("should be able to bind and unbind an ELEMENT_ARRAY_BUFFER", async () => {
28
- const buf = gl.createBuffer();
29
- gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, buf);
30
- expect(gl.getError()).toBe(gl.NO_ERROR);
31
- gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);
32
- expect(gl.getError()).toBe(gl.NO_ERROR);
33
- gl.deleteBuffer(buf);
34
- });
35
- await it("binding ARRAY_BUFFER to ELEMENT_ARRAY_BUFFER target should generate INVALID_OPERATION", async () => {
36
- const buf = gl.createBuffer();
37
- gl.bindBuffer(gl.ARRAY_BUFFER, buf);
38
- gl.bindBuffer(gl.ARRAY_BUFFER, null);
39
- gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, buf);
40
- expect(gl.getError()).toBe(gl.INVALID_OPERATION);
41
- gl.deleteBuffer(buf);
42
- });
43
- await it("binding ELEMENT_ARRAY_BUFFER to ARRAY_BUFFER target should generate INVALID_OPERATION", async () => {
44
- const buf = gl.createBuffer();
45
- gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, buf);
46
- gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);
47
- gl.bindBuffer(gl.ARRAY_BUFFER, buf);
48
- expect(gl.getError()).toBe(gl.INVALID_OPERATION);
49
- gl.deleteBuffer(buf);
50
- });
51
- });
52
- await describe("conformance/buffers/buffer-data-and-buffer-sub-data", async () => {
53
- beforeEach(async () => {
54
- glArea.make_current();
55
- });
56
- await it("bufferData with no buffer bound generates INVALID_OPERATION", async () => {
57
- gl.bufferData(gl.ARRAY_BUFFER, 4, gl.STATIC_DRAW);
58
- expect(gl.getError()).toBe(gl.INVALID_OPERATION);
59
- });
60
- await it("bufferData with negative size generates INVALID_VALUE", async () => {
61
- const buf = gl.createBuffer();
62
- gl.bindBuffer(gl.ARRAY_BUFFER, buf);
63
- gl.getError();
64
- gl.bufferData(gl.ARRAY_BUFFER, -4, gl.STATIC_DRAW);
65
- expect(gl.getError()).toBe(gl.INVALID_VALUE);
66
- gl.bindBuffer(gl.ARRAY_BUFFER, null);
67
- gl.deleteBuffer(buf);
68
- });
69
- await it("bufferData with null data generates INVALID_VALUE", async () => {
70
- const buf = gl.createBuffer();
71
- gl.bindBuffer(gl.ARRAY_BUFFER, buf);
72
- gl.getError();
73
- gl.bufferData(gl.ARRAY_BUFFER, null, gl.STATIC_DRAW);
74
- expect(gl.getError()).toBe(gl.INVALID_VALUE);
75
- gl.bindBuffer(gl.ARRAY_BUFFER, null);
76
- gl.deleteBuffer(buf);
77
- });
78
- await it("bufferData with size 0 succeeds and sets buffer size to 0", async () => {
79
- const buf = gl.createBuffer();
80
- gl.bindBuffer(gl.ARRAY_BUFFER, buf);
81
- gl.bufferData(gl.ARRAY_BUFFER, 0, gl.STATIC_DRAW);
82
- expect(gl.getError()).toBe(gl.NO_ERROR);
83
- expect(gl.getBufferParameter(gl.ARRAY_BUFFER, gl.BUFFER_SIZE)).toBe(0);
84
- gl.bindBuffer(gl.ARRAY_BUFFER, null);
85
- gl.deleteBuffer(buf);
86
- });
87
- await it("bufferData with ArrayBuffer sets correct buffer size", async () => {
88
- const buf = gl.createBuffer();
89
- gl.bindBuffer(gl.ARRAY_BUFFER, buf);
90
- gl.bufferData(gl.ARRAY_BUFFER, new ArrayBuffer(4), gl.STATIC_DRAW);
91
- expect(gl.getError()).toBe(gl.NO_ERROR);
92
- expect(gl.getBufferParameter(gl.ARRAY_BUFFER, gl.BUFFER_SIZE)).toBe(4);
93
- gl.bindBuffer(gl.ARRAY_BUFFER, null);
94
- gl.deleteBuffer(buf);
95
- });
96
- await it("bufferData with numeric size 4 sets buffer size to 4", async () => {
97
- const buf = gl.createBuffer();
98
- gl.bindBuffer(gl.ARRAY_BUFFER, buf);
99
- gl.bufferData(gl.ARRAY_BUFFER, 4, gl.STATIC_DRAW);
100
- expect(gl.getError()).toBe(gl.NO_ERROR);
101
- expect(gl.getBufferParameter(gl.ARRAY_BUFFER, gl.BUFFER_SIZE)).toBe(4);
102
- gl.bindBuffer(gl.ARRAY_BUFFER, null);
103
- gl.deleteBuffer(buf);
104
- });
105
- await it("bufferSubData before bufferData generates INVALID_VALUE", async () => {
106
- const buf = gl.createBuffer();
107
- gl.bindBuffer(gl.ARRAY_BUFFER, buf);
108
- gl.bufferSubData(gl.ARRAY_BUFFER, 0, new ArrayBuffer(1));
109
- expect(gl.getError()).toBe(gl.INVALID_VALUE);
110
- gl.bindBuffer(gl.ARRAY_BUFFER, null);
111
- gl.deleteBuffer(buf);
112
- });
113
- await it("bufferSubData with negative offset generates INVALID_VALUE", async () => {
114
- const buf = gl.createBuffer();
115
- gl.bindBuffer(gl.ARRAY_BUFFER, buf);
116
- gl.bufferData(gl.ARRAY_BUFFER, 128, gl.STATIC_DRAW);
117
- gl.getError();
118
- gl.bufferSubData(gl.ARRAY_BUFFER, -10, new ArrayBuffer(64));
119
- expect(gl.getError()).toBe(gl.INVALID_VALUE);
120
- gl.bindBuffer(gl.ARRAY_BUFFER, null);
121
- gl.deleteBuffer(buf);
122
- });
123
- await it("bufferSubData that overflows buffer generates INVALID_VALUE", async () => {
124
- const buf = gl.createBuffer();
125
- gl.bindBuffer(gl.ARRAY_BUFFER, buf);
126
- gl.bufferData(gl.ARRAY_BUFFER, 128, gl.STATIC_DRAW);
127
- gl.getError();
128
- gl.bufferSubData(gl.ARRAY_BUFFER, 65, new ArrayBuffer(64));
129
- expect(gl.getError()).toBe(gl.INVALID_VALUE);
130
- gl.bindBuffer(gl.ARRAY_BUFFER, null);
131
- gl.deleteBuffer(buf);
132
- });
133
- await it("bufferSubData within bounds succeeds", async () => {
134
- const buf = gl.createBuffer();
135
- gl.bindBuffer(gl.ARRAY_BUFFER, buf);
136
- gl.bufferData(gl.ARRAY_BUFFER, 128, gl.STATIC_DRAW);
137
- gl.getError();
138
- gl.bufferSubData(gl.ARRAY_BUFFER, 10, new ArrayBuffer(64));
139
- expect(gl.getError()).toBe(gl.NO_ERROR);
140
- gl.bufferSubData(gl.ARRAY_BUFFER, 10, new Float32Array(0));
141
- expect(gl.getError()).toBe(gl.NO_ERROR);
142
- gl.bindBuffer(gl.ARRAY_BUFFER, null);
143
- gl.deleteBuffer(buf);
144
- });
145
- await it("bufferSubData with non-ArrayBuffer throws TypeError", async () => {
146
- const buf = gl.createBuffer();
147
- gl.bindBuffer(gl.ARRAY_BUFFER, buf);
148
- gl.bufferData(gl.ARRAY_BUFFER, 128, gl.STATIC_DRAW);
149
- gl.getError();
150
- expect(() => gl.bufferSubData(gl.ARRAY_BUFFER, 0, 42)).toThrow();
151
- expect(() => gl.bufferSubData(gl.ARRAY_BUFFER, 0, "5.5")).toThrow();
152
- expect(() => gl.bufferSubData(gl.ARRAY_BUFFER, 10, null)).toThrow();
153
- expect(gl.getError()).toBe(gl.NO_ERROR);
154
- gl.bindBuffer(gl.ARRAY_BUFFER, null);
155
- gl.deleteBuffer(buf);
156
- });
157
- });
158
- await describe("conformance/buffers/element-array-buffer-delete-recreate", async () => {
159
- beforeEach(async () => {
160
- glArea.make_current();
161
- });
162
- await it("drawElements succeeds after deleting and recreating the element array buffer", async () => {
163
- const vsSrc = `attribute vec2 position; void main() { gl_Position = vec4(position, 0.0, 1.0); }`;
164
- const fsSrc = `precision mediump float; void main() { gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0); }`;
165
- const prog = makeProgram(gl, vsSrc, fsSrc);
166
- gl.useProgram(prog);
167
- const fbo = makeTestFBO(gl, 2, 2);
168
- const vertexBuffer = gl.createBuffer();
169
- gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
170
- gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
171
- -1,
172
- -1,
173
- 1,
174
- -1,
175
- -1,
176
- 1,
177
- 1,
178
- 1
179
- ]), gl.STATIC_DRAW);
180
- gl.enableVertexAttribArray(0);
181
- gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);
182
- let indexBuffer = gl.createBuffer();
183
- gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);
184
- gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint8Array([
185
- 0,
186
- 1,
187
- 2,
188
- 3
189
- ]), gl.STATIC_DRAW);
190
- gl.deleteBuffer(indexBuffer);
191
- indexBuffer = gl.createBuffer();
192
- gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);
193
- gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint8Array([
194
- 0,
195
- 1,
196
- 2,
197
- 3
198
- ]), gl.STATIC_DRAW);
199
- gl.clear(gl.COLOR_BUFFER_BIT);
200
- gl.drawElements(gl.TRIANGLE_STRIP, 4, gl.UNSIGNED_BYTE, 0);
201
- expect(gl.getError()).toBe(gl.NO_ERROR);
202
- const pixel = readPixel(gl, 1, 1);
203
- expect(pixelClose(pixel, [
204
- 0,
205
- 255,
206
- 0,
207
- 255
208
- ])).toBeTruthy();
209
- destroyTestFBO(gl, fbo);
210
- gl.deleteBuffer(vertexBuffer);
211
- gl.deleteBuffer(indexBuffer);
212
- gl.deleteProgram(prog);
213
- });
214
- });
215
- win.destroy();
216
- });
217
- };
218
-
219
- //#endregion
220
- export { buffers_spec_default as default };
1
+ import{destroyTestFBO as e,makeProgram as t,makeTestFBO as n,pixelClose as r,readPixel as i}from"../test-utils.js";import{createGLSetup as a}from"./setup.js";import{beforeEach as o,describe as s,expect as c,it as l,on as u}from"@gjsify/unit";var d=async()=>{await u(`Display`,async()=>{let u=a();if(!u){console.warn(`WebGL context not available — skipping conformance/buffers tests`);return}let{gl:d,glArea:f,win:p}=u;f.make_current(),await s(`conformance/buffers/buffer-bind-test`,async()=>{o(async()=>{f.make_current()}),await l(`should be able to bind and unbind an ARRAY_BUFFER`,async()=>{let e=d.createBuffer();d.bindBuffer(d.ARRAY_BUFFER,e),c(d.getError()).toBe(d.NO_ERROR),d.bindBuffer(d.ARRAY_BUFFER,null),c(d.getError()).toBe(d.NO_ERROR),d.deleteBuffer(e)}),await l(`should be able to bind and unbind an ELEMENT_ARRAY_BUFFER`,async()=>{let e=d.createBuffer();d.bindBuffer(d.ELEMENT_ARRAY_BUFFER,e),c(d.getError()).toBe(d.NO_ERROR),d.bindBuffer(d.ELEMENT_ARRAY_BUFFER,null),c(d.getError()).toBe(d.NO_ERROR),d.deleteBuffer(e)}),await l(`binding ARRAY_BUFFER to ELEMENT_ARRAY_BUFFER target should generate INVALID_OPERATION`,async()=>{let e=d.createBuffer();d.bindBuffer(d.ARRAY_BUFFER,e),d.bindBuffer(d.ARRAY_BUFFER,null),d.bindBuffer(d.ELEMENT_ARRAY_BUFFER,e),c(d.getError()).toBe(d.INVALID_OPERATION),d.deleteBuffer(e)}),await l(`binding ELEMENT_ARRAY_BUFFER to ARRAY_BUFFER target should generate INVALID_OPERATION`,async()=>{let e=d.createBuffer();d.bindBuffer(d.ELEMENT_ARRAY_BUFFER,e),d.bindBuffer(d.ELEMENT_ARRAY_BUFFER,null),d.bindBuffer(d.ARRAY_BUFFER,e),c(d.getError()).toBe(d.INVALID_OPERATION),d.deleteBuffer(e)})}),await s(`conformance/buffers/buffer-data-and-buffer-sub-data`,async()=>{o(async()=>{f.make_current()}),await l(`bufferData with no buffer bound generates INVALID_OPERATION`,async()=>{d.bufferData(d.ARRAY_BUFFER,4,d.STATIC_DRAW),c(d.getError()).toBe(d.INVALID_OPERATION)}),await l(`bufferData with negative size generates INVALID_VALUE`,async()=>{let e=d.createBuffer();d.bindBuffer(d.ARRAY_BUFFER,e),d.getError(),d.bufferData(d.ARRAY_BUFFER,-4,d.STATIC_DRAW),c(d.getError()).toBe(d.INVALID_VALUE),d.bindBuffer(d.ARRAY_BUFFER,null),d.deleteBuffer(e)}),await l(`bufferData with null data generates INVALID_VALUE`,async()=>{let e=d.createBuffer();d.bindBuffer(d.ARRAY_BUFFER,e),d.getError(),d.bufferData(d.ARRAY_BUFFER,null,d.STATIC_DRAW),c(d.getError()).toBe(d.INVALID_VALUE),d.bindBuffer(d.ARRAY_BUFFER,null),d.deleteBuffer(e)}),await l(`bufferData with size 0 succeeds and sets buffer size to 0`,async()=>{let e=d.createBuffer();d.bindBuffer(d.ARRAY_BUFFER,e),d.bufferData(d.ARRAY_BUFFER,0,d.STATIC_DRAW),c(d.getError()).toBe(d.NO_ERROR),c(d.getBufferParameter(d.ARRAY_BUFFER,d.BUFFER_SIZE)).toBe(0),d.bindBuffer(d.ARRAY_BUFFER,null),d.deleteBuffer(e)}),await l(`bufferData with ArrayBuffer sets correct buffer size`,async()=>{let e=d.createBuffer();d.bindBuffer(d.ARRAY_BUFFER,e),d.bufferData(d.ARRAY_BUFFER,new ArrayBuffer(4),d.STATIC_DRAW),c(d.getError()).toBe(d.NO_ERROR),c(d.getBufferParameter(d.ARRAY_BUFFER,d.BUFFER_SIZE)).toBe(4),d.bindBuffer(d.ARRAY_BUFFER,null),d.deleteBuffer(e)}),await l(`bufferData with numeric size 4 sets buffer size to 4`,async()=>{let e=d.createBuffer();d.bindBuffer(d.ARRAY_BUFFER,e),d.bufferData(d.ARRAY_BUFFER,4,d.STATIC_DRAW),c(d.getError()).toBe(d.NO_ERROR),c(d.getBufferParameter(d.ARRAY_BUFFER,d.BUFFER_SIZE)).toBe(4),d.bindBuffer(d.ARRAY_BUFFER,null),d.deleteBuffer(e)}),await l(`bufferSubData before bufferData generates INVALID_VALUE`,async()=>{let e=d.createBuffer();d.bindBuffer(d.ARRAY_BUFFER,e),d.bufferSubData(d.ARRAY_BUFFER,0,new ArrayBuffer(1)),c(d.getError()).toBe(d.INVALID_VALUE),d.bindBuffer(d.ARRAY_BUFFER,null),d.deleteBuffer(e)}),await l(`bufferSubData with negative offset generates INVALID_VALUE`,async()=>{let e=d.createBuffer();d.bindBuffer(d.ARRAY_BUFFER,e),d.bufferData(d.ARRAY_BUFFER,128,d.STATIC_DRAW),d.getError(),d.bufferSubData(d.ARRAY_BUFFER,-10,new ArrayBuffer(64)),c(d.getError()).toBe(d.INVALID_VALUE),d.bindBuffer(d.ARRAY_BUFFER,null),d.deleteBuffer(e)}),await l(`bufferSubData that overflows buffer generates INVALID_VALUE`,async()=>{let e=d.createBuffer();d.bindBuffer(d.ARRAY_BUFFER,e),d.bufferData(d.ARRAY_BUFFER,128,d.STATIC_DRAW),d.getError(),d.bufferSubData(d.ARRAY_BUFFER,65,new ArrayBuffer(64)),c(d.getError()).toBe(d.INVALID_VALUE),d.bindBuffer(d.ARRAY_BUFFER,null),d.deleteBuffer(e)}),await l(`bufferSubData within bounds succeeds`,async()=>{let e=d.createBuffer();d.bindBuffer(d.ARRAY_BUFFER,e),d.bufferData(d.ARRAY_BUFFER,128,d.STATIC_DRAW),d.getError(),d.bufferSubData(d.ARRAY_BUFFER,10,new ArrayBuffer(64)),c(d.getError()).toBe(d.NO_ERROR),d.bufferSubData(d.ARRAY_BUFFER,10,new Float32Array),c(d.getError()).toBe(d.NO_ERROR),d.bindBuffer(d.ARRAY_BUFFER,null),d.deleteBuffer(e)}),await l(`bufferSubData with non-ArrayBuffer throws TypeError`,async()=>{let e=d.createBuffer();d.bindBuffer(d.ARRAY_BUFFER,e),d.bufferData(d.ARRAY_BUFFER,128,d.STATIC_DRAW),d.getError(),c(()=>d.bufferSubData(d.ARRAY_BUFFER,0,42)).toThrow(),c(()=>d.bufferSubData(d.ARRAY_BUFFER,0,`5.5`)).toThrow(),c(()=>d.bufferSubData(d.ARRAY_BUFFER,10,null)).toThrow(),c(d.getError()).toBe(d.NO_ERROR),d.bindBuffer(d.ARRAY_BUFFER,null),d.deleteBuffer(e)})}),await s(`conformance/buffers/element-array-buffer-delete-recreate`,async()=>{o(async()=>{f.make_current()}),await l(`drawElements succeeds after deleting and recreating the element array buffer`,async()=>{let a=t(d,`attribute vec2 position; void main() { gl_Position = vec4(position, 0.0, 1.0); }`,`precision mediump float; void main() { gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0); }`);d.useProgram(a);let o=n(d,2,2),s=d.createBuffer();d.bindBuffer(d.ARRAY_BUFFER,s),d.bufferData(d.ARRAY_BUFFER,new Float32Array([-1,-1,1,-1,-1,1,1,1]),d.STATIC_DRAW),d.enableVertexAttribArray(0),d.vertexAttribPointer(0,2,d.FLOAT,!1,0,0);let l=d.createBuffer();d.bindBuffer(d.ELEMENT_ARRAY_BUFFER,l),d.bufferData(d.ELEMENT_ARRAY_BUFFER,new Uint8Array([0,1,2,3]),d.STATIC_DRAW),d.deleteBuffer(l),l=d.createBuffer(),d.bindBuffer(d.ELEMENT_ARRAY_BUFFER,l),d.bufferData(d.ELEMENT_ARRAY_BUFFER,new Uint8Array([0,1,2,3]),d.STATIC_DRAW),d.clear(d.COLOR_BUFFER_BIT),d.drawElements(d.TRIANGLE_STRIP,4,d.UNSIGNED_BYTE,0),c(d.getError()).toBe(d.NO_ERROR),c(r(i(d,1,1),[0,255,0,255])).toBeTruthy(),e(d,o),d.deleteBuffer(s),d.deleteBuffer(l),d.deleteProgram(a)})}),p.destroy()})};export{d as default};