@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.
- package/lib/esm/conformance/attribs.spec.js +3 -315
- package/lib/esm/conformance/buffers.spec.js +1 -220
- package/lib/esm/conformance/context.spec.js +3 -302
- package/lib/esm/conformance/programs.spec.js +3 -477
- package/lib/esm/conformance/rendering-basic.spec.js +3 -141
- package/lib/esm/conformance/rendering.spec.js +7 -514
- package/lib/esm/conformance/setup.js +1 -47
- package/lib/esm/conformance/state.spec.js +1 -365
- package/lib/esm/conformance/textures.spec.js +3 -337
- package/lib/esm/conformance/uniforms.spec.js +1 -484
- package/lib/esm/conformance-test.js +1 -25
- package/lib/esm/extensions/ext-blend-minmax.js +1 -18
- package/lib/esm/extensions/ext-color-buffer-float.js +1 -12
- package/lib/esm/extensions/ext-color-buffer-half-float.js +1 -12
- package/lib/esm/extensions/ext-texture-filter-anisotropic.js +1 -18
- package/lib/esm/extensions/oes-element-index-unit.js +1 -13
- package/lib/esm/extensions/oes-standard-derivatives.js +1 -17
- package/lib/esm/extensions/oes-texture-float-linear.js +1 -13
- package/lib/esm/extensions/oes-texture-float.js +1 -13
- package/lib/esm/extensions/oes-texture-half-float.js +1 -19
- package/lib/esm/extensions/stackgl-destroy-context.js +1 -12
- package/lib/esm/extensions/stackgl-resize-drawing-buffer.js +1 -12
- package/lib/esm/html-canvas-element.js +1 -65
- package/lib/esm/index.js +1 -33
- package/lib/esm/linkable.js +1 -50
- package/lib/esm/test-utils.js +4 -186
- package/lib/esm/test.js +1 -11
- package/lib/esm/types/index.js +1 -5
- package/lib/esm/utils.js +1 -201
- package/lib/esm/webgl-active-info.js +1 -11
- package/lib/esm/webgl-bridge.js +1 -167
- package/lib/esm/webgl-buffer.js +1 -19
- package/lib/esm/webgl-context-attributes.js +1 -24
- package/lib/esm/webgl-context-base.js +8 -3069
- package/lib/esm/webgl-drawing-buffer-wrapper.js +1 -11
- package/lib/esm/webgl-framebuffer.js +1 -110
- package/lib/esm/webgl-program.js +1 -27
- package/lib/esm/webgl-query.js +1 -17
- package/lib/esm/webgl-renderbuffer.js +1 -25
- package/lib/esm/webgl-rendering-context.js +1 -175
- package/lib/esm/webgl-sampler.js +1 -17
- package/lib/esm/webgl-shader-precision-format.js +1 -11
- package/lib/esm/webgl-shader.js +1 -25
- package/lib/esm/webgl-sync.js +1 -17
- package/lib/esm/webgl-texture-unit.js +1 -13
- package/lib/esm/webgl-texture.js +1 -23
- package/lib/esm/webgl-transform-feedback.js +1 -17
- package/lib/esm/webgl-uniform-location.js +1 -15
- package/lib/esm/webgl-vertex-array-object.js +1 -23
- package/lib/esm/webgl-vertex-attribute.js +1 -151
- package/lib/esm/webgl1.spec.js +10 -1044
- package/lib/esm/webgl2-rendering-context.js +1 -1218
- package/lib/esm/webgl2.spec.js +45 -1288
- package/lib/types/webgl-bridge.d.ts +9 -9
- package/package.json +9 -9
|
@@ -1,365 +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/state.spec.ts
|
|
6
|
-
function arrClose(a, b, tol = .001) {
|
|
7
|
-
if (a.length !== b.length) return false;
|
|
8
|
-
for (let i = 0; i < b.length; i++) {
|
|
9
|
-
if (Math.abs(a[i] - b[i]) > tol) return false;
|
|
10
|
-
}
|
|
11
|
-
return true;
|
|
12
|
-
}
|
|
13
|
-
var state_spec_default = async () => {
|
|
14
|
-
await on("Display", async () => {
|
|
15
|
-
const setup = createGLSetup();
|
|
16
|
-
if (!setup) {
|
|
17
|
-
console.warn("WebGL context not available — skipping conformance/state tests");
|
|
18
|
-
return;
|
|
19
|
-
}
|
|
20
|
-
const { gl, glArea } = setup;
|
|
21
|
-
glArea.make_current();
|
|
22
|
-
await describe("conformance/state/gl-getstring", async () => {
|
|
23
|
-
beforeEach(async () => {
|
|
24
|
-
glArea.make_current();
|
|
25
|
-
});
|
|
26
|
-
await it("VERSION starts with \"WebGL 1.0\"", async () => {
|
|
27
|
-
const v = gl.getParameter(gl.VERSION);
|
|
28
|
-
expect(typeof v).toBe("string");
|
|
29
|
-
expect(v.startsWith("WebGL 1.0")).toBe(true);
|
|
30
|
-
});
|
|
31
|
-
await it("SHADING_LANGUAGE_VERSION starts with \"WebGL GLSL ES 1.0\"", async () => {
|
|
32
|
-
const v = gl.getParameter(gl.SHADING_LANGUAGE_VERSION);
|
|
33
|
-
expect(typeof v).toBe("string");
|
|
34
|
-
expect(v.startsWith("WebGL GLSL ES 1.0")).toBe(true);
|
|
35
|
-
});
|
|
36
|
-
await it("VENDOR is a string (may be empty on some drivers)", async () => {
|
|
37
|
-
const v = gl.getParameter(gl.VENDOR);
|
|
38
|
-
expect(typeof v).toBe("string");
|
|
39
|
-
});
|
|
40
|
-
await it("RENDERER is a non-empty string", async () => {
|
|
41
|
-
const v = gl.getParameter(gl.RENDERER);
|
|
42
|
-
expect(typeof v).toBe("string");
|
|
43
|
-
expect(v.length > 0).toBe(true);
|
|
44
|
-
});
|
|
45
|
-
});
|
|
46
|
-
await describe("conformance/state/gl-initial-state — blend", async () => {
|
|
47
|
-
beforeEach(async () => {
|
|
48
|
-
glArea.make_current();
|
|
49
|
-
});
|
|
50
|
-
await it("BLEND_SRC_RGB initial value is ONE", async () => {
|
|
51
|
-
expect(gl.getParameter(gl.BLEND_SRC_RGB)).toBe(gl.ONE);
|
|
52
|
-
});
|
|
53
|
-
await it("BLEND_SRC_ALPHA initial value is ONE", async () => {
|
|
54
|
-
expect(gl.getParameter(gl.BLEND_SRC_ALPHA)).toBe(gl.ONE);
|
|
55
|
-
});
|
|
56
|
-
await it("BLEND_DST_RGB initial value is ZERO", async () => {
|
|
57
|
-
expect(gl.getParameter(gl.BLEND_DST_RGB)).toBe(gl.ZERO);
|
|
58
|
-
});
|
|
59
|
-
await it("BLEND_DST_ALPHA initial value is ZERO", async () => {
|
|
60
|
-
expect(gl.getParameter(gl.BLEND_DST_ALPHA)).toBe(gl.ZERO);
|
|
61
|
-
});
|
|
62
|
-
await it("BLEND_EQUATION_RGB initial value is FUNC_ADD", async () => {
|
|
63
|
-
expect(gl.getParameter(gl.BLEND_EQUATION_RGB)).toBe(gl.FUNC_ADD);
|
|
64
|
-
});
|
|
65
|
-
await it("BLEND_EQUATION_ALPHA initial value is FUNC_ADD", async () => {
|
|
66
|
-
expect(gl.getParameter(gl.BLEND_EQUATION_ALPHA)).toBe(gl.FUNC_ADD);
|
|
67
|
-
});
|
|
68
|
-
await it("BLEND_COLOR initial value is [0,0,0,0]", async () => {
|
|
69
|
-
const v = gl.getParameter(gl.BLEND_COLOR);
|
|
70
|
-
expect(arrClose(v, [
|
|
71
|
-
0,
|
|
72
|
-
0,
|
|
73
|
-
0,
|
|
74
|
-
0
|
|
75
|
-
])).toBe(true);
|
|
76
|
-
});
|
|
77
|
-
});
|
|
78
|
-
await describe("conformance/state/gl-get-calls — initial state", async () => {
|
|
79
|
-
beforeEach(async () => {
|
|
80
|
-
glArea.make_current();
|
|
81
|
-
});
|
|
82
|
-
await it("ACTIVE_TEXTURE initial value is TEXTURE0", async () => {
|
|
83
|
-
expect(gl.getParameter(gl.ACTIVE_TEXTURE)).toBe(gl.TEXTURE0);
|
|
84
|
-
});
|
|
85
|
-
await it("ARRAY_BUFFER_BINDING initial value is null", async () => {
|
|
86
|
-
expect(gl.getParameter(gl.ARRAY_BUFFER_BINDING)).toBeNull();
|
|
87
|
-
});
|
|
88
|
-
await it("ELEMENT_ARRAY_BUFFER_BINDING initial value is null", async () => {
|
|
89
|
-
expect(gl.getParameter(gl.ELEMENT_ARRAY_BUFFER_BINDING)).toBeNull();
|
|
90
|
-
});
|
|
91
|
-
await it("BLEND initial value is false", async () => {
|
|
92
|
-
expect(gl.getParameter(gl.BLEND)).toBe(false);
|
|
93
|
-
});
|
|
94
|
-
await it("COLOR_CLEAR_VALUE initial value is [0,0,0,0]", async () => {
|
|
95
|
-
const v = gl.getParameter(gl.COLOR_CLEAR_VALUE);
|
|
96
|
-
expect(arrClose(v, [
|
|
97
|
-
0,
|
|
98
|
-
0,
|
|
99
|
-
0,
|
|
100
|
-
0
|
|
101
|
-
])).toBe(true);
|
|
102
|
-
});
|
|
103
|
-
await it("COLOR_WRITEMASK initial value is [true,true,true,true]", async () => {
|
|
104
|
-
const v = gl.getParameter(gl.COLOR_WRITEMASK);
|
|
105
|
-
expect(v[0]).toBe(true);
|
|
106
|
-
expect(v[1]).toBe(true);
|
|
107
|
-
expect(v[2]).toBe(true);
|
|
108
|
-
expect(v[3]).toBe(true);
|
|
109
|
-
});
|
|
110
|
-
await it("CULL_FACE initial value is false", async () => {
|
|
111
|
-
expect(gl.getParameter(gl.CULL_FACE)).toBe(false);
|
|
112
|
-
});
|
|
113
|
-
await it("CULL_FACE_MODE initial value is BACK", async () => {
|
|
114
|
-
expect(gl.getParameter(gl.CULL_FACE_MODE)).toBe(gl.BACK);
|
|
115
|
-
});
|
|
116
|
-
await it("CURRENT_PROGRAM initial value is null", async () => {
|
|
117
|
-
const prog = gl.getParameter(gl.CURRENT_PROGRAM);
|
|
118
|
-
expect(prog).toBeNull();
|
|
119
|
-
});
|
|
120
|
-
await it("DEPTH_CLEAR_VALUE initial value is 1", async () => {
|
|
121
|
-
expect(gl.getParameter(gl.DEPTH_CLEAR_VALUE)).toBe(1);
|
|
122
|
-
});
|
|
123
|
-
await it("DEPTH_FUNC initial value is LESS", async () => {
|
|
124
|
-
expect(gl.getParameter(gl.DEPTH_FUNC)).toBe(gl.LESS);
|
|
125
|
-
});
|
|
126
|
-
await it("DEPTH_RANGE initial value is [0, 1]", async () => {
|
|
127
|
-
const v = gl.getParameter(gl.DEPTH_RANGE);
|
|
128
|
-
expect(arrClose(v, [0, 1])).toBe(true);
|
|
129
|
-
});
|
|
130
|
-
await it("DEPTH_TEST initial value is false", async () => {
|
|
131
|
-
expect(gl.getParameter(gl.DEPTH_TEST)).toBe(false);
|
|
132
|
-
});
|
|
133
|
-
await it("DEPTH_WRITEMASK initial value is true", async () => {
|
|
134
|
-
expect(gl.getParameter(gl.DEPTH_WRITEMASK)).toBe(true);
|
|
135
|
-
});
|
|
136
|
-
await it("DITHER initial value is true", async () => {
|
|
137
|
-
expect(gl.getParameter(gl.DITHER)).toBe(true);
|
|
138
|
-
});
|
|
139
|
-
await it("FRONT_FACE initial value is CCW", async () => {
|
|
140
|
-
expect(gl.getParameter(gl.FRONT_FACE)).toBe(gl.CCW);
|
|
141
|
-
});
|
|
142
|
-
await it("GENERATE_MIPMAP_HINT initial value is DONT_CARE", async () => {
|
|
143
|
-
expect(gl.getParameter(gl.GENERATE_MIPMAP_HINT)).toBe(gl.DONT_CARE);
|
|
144
|
-
});
|
|
145
|
-
await it("LINE_WIDTH initial value is 1", async () => {
|
|
146
|
-
expect(gl.getParameter(gl.LINE_WIDTH)).toBe(1);
|
|
147
|
-
});
|
|
148
|
-
await it("PACK_ALIGNMENT initial value is 4", async () => {
|
|
149
|
-
expect(gl.getParameter(gl.PACK_ALIGNMENT)).toBe(4);
|
|
150
|
-
});
|
|
151
|
-
await it("POLYGON_OFFSET_FACTOR initial value is 0", async () => {
|
|
152
|
-
expect(gl.getParameter(gl.POLYGON_OFFSET_FACTOR)).toBe(0);
|
|
153
|
-
});
|
|
154
|
-
await it("POLYGON_OFFSET_FILL initial value is false", async () => {
|
|
155
|
-
expect(gl.getParameter(gl.POLYGON_OFFSET_FILL)).toBe(false);
|
|
156
|
-
});
|
|
157
|
-
await it("POLYGON_OFFSET_UNITS initial value is 0", async () => {
|
|
158
|
-
expect(gl.getParameter(gl.POLYGON_OFFSET_UNITS)).toBe(0);
|
|
159
|
-
});
|
|
160
|
-
await it("RENDERBUFFER_BINDING initial value is null", async () => {
|
|
161
|
-
expect(gl.getParameter(gl.RENDERBUFFER_BINDING)).toBeNull();
|
|
162
|
-
});
|
|
163
|
-
await it("SAMPLE_COVERAGE_INVERT initial value is false", async () => {
|
|
164
|
-
expect(gl.getParameter(gl.SAMPLE_COVERAGE_INVERT)).toBe(false);
|
|
165
|
-
});
|
|
166
|
-
await it("SAMPLE_COVERAGE_VALUE initial value is 1", async () => {
|
|
167
|
-
expect(gl.getParameter(gl.SAMPLE_COVERAGE_VALUE)).toBe(1);
|
|
168
|
-
});
|
|
169
|
-
await it("SCISSOR_TEST initial value is false", async () => {
|
|
170
|
-
expect(gl.getParameter(gl.SCISSOR_TEST)).toBe(false);
|
|
171
|
-
});
|
|
172
|
-
await it("STENCIL_CLEAR_VALUE initial value is 0", async () => {
|
|
173
|
-
expect(gl.getParameter(gl.STENCIL_CLEAR_VALUE)).toBe(0);
|
|
174
|
-
});
|
|
175
|
-
await it("STENCIL_FAIL initial value is KEEP", async () => {
|
|
176
|
-
expect(gl.getParameter(gl.STENCIL_FAIL)).toBe(gl.KEEP);
|
|
177
|
-
});
|
|
178
|
-
await it("STENCIL_FUNC initial value is ALWAYS", async () => {
|
|
179
|
-
expect(gl.getParameter(gl.STENCIL_FUNC)).toBe(gl.ALWAYS);
|
|
180
|
-
});
|
|
181
|
-
await it("STENCIL_BACK_FUNC initial value is ALWAYS", async () => {
|
|
182
|
-
expect(gl.getParameter(gl.STENCIL_BACK_FUNC)).toBe(gl.ALWAYS);
|
|
183
|
-
});
|
|
184
|
-
await it("STENCIL_REF initial value is 0", async () => {
|
|
185
|
-
expect(gl.getParameter(gl.STENCIL_REF)).toBe(0);
|
|
186
|
-
});
|
|
187
|
-
await it("STENCIL_TEST initial value is false", async () => {
|
|
188
|
-
expect(gl.getParameter(gl.STENCIL_TEST)).toBe(false);
|
|
189
|
-
});
|
|
190
|
-
await it("TEXTURE_BINDING_2D initial value is null", async () => {
|
|
191
|
-
expect(gl.getParameter(gl.TEXTURE_BINDING_2D)).toBeNull();
|
|
192
|
-
});
|
|
193
|
-
await it("TEXTURE_BINDING_CUBE_MAP initial value is null", async () => {
|
|
194
|
-
expect(gl.getParameter(gl.TEXTURE_BINDING_CUBE_MAP)).toBeNull();
|
|
195
|
-
});
|
|
196
|
-
await it("UNPACK_ALIGNMENT initial value is 4", async () => {
|
|
197
|
-
expect(gl.getParameter(gl.UNPACK_ALIGNMENT)).toBe(4);
|
|
198
|
-
});
|
|
199
|
-
await it("UNPACK_FLIP_Y_WEBGL initial value is false", async () => {
|
|
200
|
-
expect(gl.getParameter(gl.UNPACK_FLIP_Y_WEBGL)).toBe(false);
|
|
201
|
-
});
|
|
202
|
-
await it("UNPACK_PREMULTIPLY_ALPHA_WEBGL initial value is false", async () => {
|
|
203
|
-
expect(gl.getParameter(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL)).toBe(false);
|
|
204
|
-
});
|
|
205
|
-
await it("MAX_TEXTURE_SIZE is at least 64", async () => {
|
|
206
|
-
expect(gl.getParameter(gl.MAX_TEXTURE_SIZE) >= 64).toBe(true);
|
|
207
|
-
});
|
|
208
|
-
await it("MAX_VERTEX_ATTRIBS is at least 8", async () => {
|
|
209
|
-
expect(gl.getParameter(gl.MAX_VERTEX_ATTRIBS) >= 8).toBe(true);
|
|
210
|
-
});
|
|
211
|
-
await it("MAX_COMBINED_TEXTURE_IMAGE_UNITS is at least 8", async () => {
|
|
212
|
-
expect(gl.getParameter(gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS) >= 8).toBe(true);
|
|
213
|
-
});
|
|
214
|
-
await it("MAX_FRAGMENT_UNIFORM_VECTORS is at least 16", async () => {
|
|
215
|
-
expect(gl.getParameter(gl.MAX_FRAGMENT_UNIFORM_VECTORS) >= 16).toBe(true);
|
|
216
|
-
});
|
|
217
|
-
await it("MAX_VERTEX_UNIFORM_VECTORS is at least 128", async () => {
|
|
218
|
-
expect(gl.getParameter(gl.MAX_VERTEX_UNIFORM_VECTORS) >= 128).toBe(true);
|
|
219
|
-
});
|
|
220
|
-
await it("ALIASED_POINT_SIZE_RANGE is [>0, >=1]", async () => {
|
|
221
|
-
const v = gl.getParameter(gl.ALIASED_POINT_SIZE_RANGE);
|
|
222
|
-
expect(v[0] > 0).toBe(true);
|
|
223
|
-
expect(v[1] >= 1).toBe(true);
|
|
224
|
-
});
|
|
225
|
-
await it("ALIASED_LINE_WIDTH_RANGE is [>0, >=1]", async () => {
|
|
226
|
-
const v = gl.getParameter(gl.ALIASED_LINE_WIDTH_RANGE);
|
|
227
|
-
expect(v[0] > 0).toBe(true);
|
|
228
|
-
expect(v[1] >= 1).toBe(true);
|
|
229
|
-
});
|
|
230
|
-
});
|
|
231
|
-
await describe("conformance/state/gl-get-calls — state changes", async () => {
|
|
232
|
-
beforeEach(async () => {
|
|
233
|
-
glArea.make_current();
|
|
234
|
-
});
|
|
235
|
-
await it("clearColor updates COLOR_CLEAR_VALUE", async () => {
|
|
236
|
-
gl.clearColor(.1, .2, .3, .4);
|
|
237
|
-
const v = gl.getParameter(gl.COLOR_CLEAR_VALUE);
|
|
238
|
-
expect(arrClose(v, [
|
|
239
|
-
.1,
|
|
240
|
-
.2,
|
|
241
|
-
.3,
|
|
242
|
-
.4
|
|
243
|
-
])).toBe(true);
|
|
244
|
-
gl.clearColor(0, 0, 0, 0);
|
|
245
|
-
});
|
|
246
|
-
await it("activeTexture updates ACTIVE_TEXTURE", async () => {
|
|
247
|
-
gl.activeTexture(gl.TEXTURE2);
|
|
248
|
-
expect(gl.getParameter(gl.ACTIVE_TEXTURE)).toBe(gl.TEXTURE2);
|
|
249
|
-
gl.activeTexture(gl.TEXTURE0);
|
|
250
|
-
});
|
|
251
|
-
await it("blendFunc updates BLEND_SRC_RGB and BLEND_DST_RGB", async () => {
|
|
252
|
-
gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
|
|
253
|
-
expect(gl.getParameter(gl.BLEND_SRC_RGB)).toBe(gl.SRC_ALPHA);
|
|
254
|
-
expect(gl.getParameter(gl.BLEND_DST_RGB)).toBe(gl.ONE_MINUS_SRC_ALPHA);
|
|
255
|
-
gl.blendFunc(gl.ONE, gl.ZERO);
|
|
256
|
-
});
|
|
257
|
-
await it("depthFunc updates DEPTH_FUNC", async () => {
|
|
258
|
-
gl.depthFunc(gl.EQUAL);
|
|
259
|
-
expect(gl.getParameter(gl.DEPTH_FUNC)).toBe(gl.EQUAL);
|
|
260
|
-
gl.depthFunc(gl.LESS);
|
|
261
|
-
});
|
|
262
|
-
await it("useProgram updates CURRENT_PROGRAM", async () => {
|
|
263
|
-
const VS = "attribute vec4 p; void main() { gl_Position = p; }";
|
|
264
|
-
const FS = "void main() { gl_FragColor = vec4(1); }";
|
|
265
|
-
const prog = makeProgram(gl, VS, FS);
|
|
266
|
-
gl.useProgram(prog);
|
|
267
|
-
expect(gl.getParameter(gl.CURRENT_PROGRAM)).toBe(prog);
|
|
268
|
-
gl.useProgram(null);
|
|
269
|
-
expect(gl.getParameter(gl.CURRENT_PROGRAM)).toBeNull();
|
|
270
|
-
});
|
|
271
|
-
});
|
|
272
|
-
await describe("conformance/state/gl-enable-enum-test", async () => {
|
|
273
|
-
beforeEach(async () => {
|
|
274
|
-
glArea.make_current();
|
|
275
|
-
});
|
|
276
|
-
const validCaps = [
|
|
277
|
-
"BLEND",
|
|
278
|
-
"CULL_FACE",
|
|
279
|
-
"DEPTH_TEST",
|
|
280
|
-
"DITHER",
|
|
281
|
-
"POLYGON_OFFSET_FILL",
|
|
282
|
-
"SAMPLE_ALPHA_TO_COVERAGE",
|
|
283
|
-
"SAMPLE_COVERAGE",
|
|
284
|
-
"SCISSOR_TEST",
|
|
285
|
-
"STENCIL_TEST"
|
|
286
|
-
];
|
|
287
|
-
for (const cap of validCaps) {
|
|
288
|
-
await it(`enable/disable/isEnabled round-trip for ${cap}`, async () => {
|
|
289
|
-
gl.getError();
|
|
290
|
-
const val = gl[cap];
|
|
291
|
-
const was = gl.isEnabled(val);
|
|
292
|
-
gl.enable(val);
|
|
293
|
-
expect(gl.isEnabled(val)).toBe(true);
|
|
294
|
-
expect(gl.getError()).toBe(gl.NO_ERROR);
|
|
295
|
-
gl.disable(val);
|
|
296
|
-
expect(gl.isEnabled(val)).toBe(false);
|
|
297
|
-
expect(gl.getError()).toBe(gl.NO_ERROR);
|
|
298
|
-
if (was) gl.enable(val);
|
|
299
|
-
else gl.disable(val);
|
|
300
|
-
});
|
|
301
|
-
}
|
|
302
|
-
await it("enable with invalid enum generates INVALID_ENUM", async () => {
|
|
303
|
-
gl.enable(3008);
|
|
304
|
-
expect(gl.getError()).toBe(gl.INVALID_ENUM);
|
|
305
|
-
});
|
|
306
|
-
});
|
|
307
|
-
await describe("conformance/state/gl-geterror", async () => {
|
|
308
|
-
beforeEach(async () => {
|
|
309
|
-
glArea.make_current();
|
|
310
|
-
});
|
|
311
|
-
await it("enable(ALPHA_TEST desktop enum) generates INVALID_ENUM", async () => {
|
|
312
|
-
gl.enable(3008);
|
|
313
|
-
expect(gl.getError()).toBe(gl.INVALID_ENUM);
|
|
314
|
-
});
|
|
315
|
-
await it("viewport with negative width/height generates INVALID_VALUE", async () => {
|
|
316
|
-
gl.viewport(0, 0, -1, -1);
|
|
317
|
-
expect(gl.getError()).toBe(gl.INVALID_VALUE);
|
|
318
|
-
const vp = gl.getParameter(gl.VIEWPORT);
|
|
319
|
-
gl.viewport(0, 0, vp[2], vp[3]);
|
|
320
|
-
});
|
|
321
|
-
});
|
|
322
|
-
await describe("conformance/state/gl-object-get-calls — getBufferParameter", async () => {
|
|
323
|
-
beforeEach(async () => {
|
|
324
|
-
glArea.make_current();
|
|
325
|
-
});
|
|
326
|
-
await it("getBufferParameter BUFFER_SIZE returns correct size after bufferData", async () => {
|
|
327
|
-
gl.getError();
|
|
328
|
-
const buf = gl.createBuffer();
|
|
329
|
-
gl.bindBuffer(gl.ARRAY_BUFFER, buf);
|
|
330
|
-
gl.bufferData(gl.ARRAY_BUFFER, 16, gl.DYNAMIC_DRAW);
|
|
331
|
-
expect(gl.getBufferParameter(gl.ARRAY_BUFFER, gl.BUFFER_SIZE)).toBe(16);
|
|
332
|
-
expect(gl.getError()).toBe(gl.NO_ERROR);
|
|
333
|
-
gl.bindBuffer(gl.ARRAY_BUFFER, null);
|
|
334
|
-
gl.deleteBuffer(buf);
|
|
335
|
-
});
|
|
336
|
-
await it("getBufferParameter BUFFER_USAGE returns correct usage after bufferData", async () => {
|
|
337
|
-
const buf = gl.createBuffer();
|
|
338
|
-
gl.bindBuffer(gl.ARRAY_BUFFER, buf);
|
|
339
|
-
gl.bufferData(gl.ARRAY_BUFFER, 16, gl.DYNAMIC_DRAW);
|
|
340
|
-
expect(gl.getBufferParameter(gl.ARRAY_BUFFER, gl.BUFFER_USAGE)).toBe(gl.DYNAMIC_DRAW);
|
|
341
|
-
gl.bindBuffer(gl.ARRAY_BUFFER, null);
|
|
342
|
-
gl.deleteBuffer(buf);
|
|
343
|
-
});
|
|
344
|
-
});
|
|
345
|
-
await describe("conformance/state/gl-object-get-calls — getRenderbufferParameter", async () => {
|
|
346
|
-
beforeEach(async () => {
|
|
347
|
-
glArea.make_current();
|
|
348
|
-
});
|
|
349
|
-
await it("getRenderbufferParameter returns correct width/height/format", async () => {
|
|
350
|
-
const rb = gl.createRenderbuffer();
|
|
351
|
-
gl.bindRenderbuffer(gl.RENDERBUFFER, rb);
|
|
352
|
-
gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, 64, 32);
|
|
353
|
-
expect(gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_WIDTH)).toBe(64);
|
|
354
|
-
expect(gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_HEIGHT)).toBe(32);
|
|
355
|
-
expect(gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_INTERNAL_FORMAT)).toBe(gl.RGBA4);
|
|
356
|
-
expect(gl.getError()).toBe(gl.NO_ERROR);
|
|
357
|
-
gl.bindRenderbuffer(gl.RENDERBUFFER, null);
|
|
358
|
-
gl.deleteRenderbuffer(rb);
|
|
359
|
-
});
|
|
360
|
-
});
|
|
361
|
-
});
|
|
362
|
-
};
|
|
363
|
-
|
|
364
|
-
//#endregion
|
|
365
|
-
export { state_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";function s(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 c=async()=>{await o(`Display`,async()=>{let o=t();if(!o){console.warn(`WebGL context not available — skipping conformance/state tests`);return}let{gl:c,glArea:l}=o;l.make_current(),await r(`conformance/state/gl-getstring`,async()=>{n(async()=>{l.make_current()}),await a(`VERSION starts with "WebGL 1.0"`,async()=>{let e=c.getParameter(c.VERSION);i(typeof e).toBe(`string`),i(e.startsWith(`WebGL 1.0`)).toBe(!0)}),await a(`SHADING_LANGUAGE_VERSION starts with "WebGL GLSL ES 1.0"`,async()=>{let e=c.getParameter(c.SHADING_LANGUAGE_VERSION);i(typeof e).toBe(`string`),i(e.startsWith(`WebGL GLSL ES 1.0`)).toBe(!0)}),await a(`VENDOR is a string (may be empty on some drivers)`,async()=>{i(typeof c.getParameter(c.VENDOR)).toBe(`string`)}),await a(`RENDERER is a non-empty string`,async()=>{let e=c.getParameter(c.RENDERER);i(typeof e).toBe(`string`),i(e.length>0).toBe(!0)})}),await r(`conformance/state/gl-initial-state — blend`,async()=>{n(async()=>{l.make_current()}),await a(`BLEND_SRC_RGB initial value is ONE`,async()=>{i(c.getParameter(c.BLEND_SRC_RGB)).toBe(c.ONE)}),await a(`BLEND_SRC_ALPHA initial value is ONE`,async()=>{i(c.getParameter(c.BLEND_SRC_ALPHA)).toBe(c.ONE)}),await a(`BLEND_DST_RGB initial value is ZERO`,async()=>{i(c.getParameter(c.BLEND_DST_RGB)).toBe(c.ZERO)}),await a(`BLEND_DST_ALPHA initial value is ZERO`,async()=>{i(c.getParameter(c.BLEND_DST_ALPHA)).toBe(c.ZERO)}),await a(`BLEND_EQUATION_RGB initial value is FUNC_ADD`,async()=>{i(c.getParameter(c.BLEND_EQUATION_RGB)).toBe(c.FUNC_ADD)}),await a(`BLEND_EQUATION_ALPHA initial value is FUNC_ADD`,async()=>{i(c.getParameter(c.BLEND_EQUATION_ALPHA)).toBe(c.FUNC_ADD)}),await a(`BLEND_COLOR initial value is [0,0,0,0]`,async()=>{i(s(c.getParameter(c.BLEND_COLOR),[0,0,0,0])).toBe(!0)})}),await r(`conformance/state/gl-get-calls — initial state`,async()=>{n(async()=>{l.make_current()}),await a(`ACTIVE_TEXTURE initial value is TEXTURE0`,async()=>{i(c.getParameter(c.ACTIVE_TEXTURE)).toBe(c.TEXTURE0)}),await a(`ARRAY_BUFFER_BINDING initial value is null`,async()=>{i(c.getParameter(c.ARRAY_BUFFER_BINDING)).toBeNull()}),await a(`ELEMENT_ARRAY_BUFFER_BINDING initial value is null`,async()=>{i(c.getParameter(c.ELEMENT_ARRAY_BUFFER_BINDING)).toBeNull()}),await a(`BLEND initial value is false`,async()=>{i(c.getParameter(c.BLEND)).toBe(!1)}),await a(`COLOR_CLEAR_VALUE initial value is [0,0,0,0]`,async()=>{i(s(c.getParameter(c.COLOR_CLEAR_VALUE),[0,0,0,0])).toBe(!0)}),await a(`COLOR_WRITEMASK initial value is [true,true,true,true]`,async()=>{let e=c.getParameter(c.COLOR_WRITEMASK);i(e[0]).toBe(!0),i(e[1]).toBe(!0),i(e[2]).toBe(!0),i(e[3]).toBe(!0)}),await a(`CULL_FACE initial value is false`,async()=>{i(c.getParameter(c.CULL_FACE)).toBe(!1)}),await a(`CULL_FACE_MODE initial value is BACK`,async()=>{i(c.getParameter(c.CULL_FACE_MODE)).toBe(c.BACK)}),await a(`CURRENT_PROGRAM initial value is null`,async()=>{i(c.getParameter(c.CURRENT_PROGRAM)).toBeNull()}),await a(`DEPTH_CLEAR_VALUE initial value is 1`,async()=>{i(c.getParameter(c.DEPTH_CLEAR_VALUE)).toBe(1)}),await a(`DEPTH_FUNC initial value is LESS`,async()=>{i(c.getParameter(c.DEPTH_FUNC)).toBe(c.LESS)}),await a(`DEPTH_RANGE initial value is [0, 1]`,async()=>{i(s(c.getParameter(c.DEPTH_RANGE),[0,1])).toBe(!0)}),await a(`DEPTH_TEST initial value is false`,async()=>{i(c.getParameter(c.DEPTH_TEST)).toBe(!1)}),await a(`DEPTH_WRITEMASK initial value is true`,async()=>{i(c.getParameter(c.DEPTH_WRITEMASK)).toBe(!0)}),await a(`DITHER initial value is true`,async()=>{i(c.getParameter(c.DITHER)).toBe(!0)}),await a(`FRONT_FACE initial value is CCW`,async()=>{i(c.getParameter(c.FRONT_FACE)).toBe(c.CCW)}),await a(`GENERATE_MIPMAP_HINT initial value is DONT_CARE`,async()=>{i(c.getParameter(c.GENERATE_MIPMAP_HINT)).toBe(c.DONT_CARE)}),await a(`LINE_WIDTH initial value is 1`,async()=>{i(c.getParameter(c.LINE_WIDTH)).toBe(1)}),await a(`PACK_ALIGNMENT initial value is 4`,async()=>{i(c.getParameter(c.PACK_ALIGNMENT)).toBe(4)}),await a(`POLYGON_OFFSET_FACTOR initial value is 0`,async()=>{i(c.getParameter(c.POLYGON_OFFSET_FACTOR)).toBe(0)}),await a(`POLYGON_OFFSET_FILL initial value is false`,async()=>{i(c.getParameter(c.POLYGON_OFFSET_FILL)).toBe(!1)}),await a(`POLYGON_OFFSET_UNITS initial value is 0`,async()=>{i(c.getParameter(c.POLYGON_OFFSET_UNITS)).toBe(0)}),await a(`RENDERBUFFER_BINDING initial value is null`,async()=>{i(c.getParameter(c.RENDERBUFFER_BINDING)).toBeNull()}),await a(`SAMPLE_COVERAGE_INVERT initial value is false`,async()=>{i(c.getParameter(c.SAMPLE_COVERAGE_INVERT)).toBe(!1)}),await a(`SAMPLE_COVERAGE_VALUE initial value is 1`,async()=>{i(c.getParameter(c.SAMPLE_COVERAGE_VALUE)).toBe(1)}),await a(`SCISSOR_TEST initial value is false`,async()=>{i(c.getParameter(c.SCISSOR_TEST)).toBe(!1)}),await a(`STENCIL_CLEAR_VALUE initial value is 0`,async()=>{i(c.getParameter(c.STENCIL_CLEAR_VALUE)).toBe(0)}),await a(`STENCIL_FAIL initial value is KEEP`,async()=>{i(c.getParameter(c.STENCIL_FAIL)).toBe(c.KEEP)}),await a(`STENCIL_FUNC initial value is ALWAYS`,async()=>{i(c.getParameter(c.STENCIL_FUNC)).toBe(c.ALWAYS)}),await a(`STENCIL_BACK_FUNC initial value is ALWAYS`,async()=>{i(c.getParameter(c.STENCIL_BACK_FUNC)).toBe(c.ALWAYS)}),await a(`STENCIL_REF initial value is 0`,async()=>{i(c.getParameter(c.STENCIL_REF)).toBe(0)}),await a(`STENCIL_TEST initial value is false`,async()=>{i(c.getParameter(c.STENCIL_TEST)).toBe(!1)}),await a(`TEXTURE_BINDING_2D initial value is null`,async()=>{i(c.getParameter(c.TEXTURE_BINDING_2D)).toBeNull()}),await a(`TEXTURE_BINDING_CUBE_MAP initial value is null`,async()=>{i(c.getParameter(c.TEXTURE_BINDING_CUBE_MAP)).toBeNull()}),await a(`UNPACK_ALIGNMENT initial value is 4`,async()=>{i(c.getParameter(c.UNPACK_ALIGNMENT)).toBe(4)}),await a(`UNPACK_FLIP_Y_WEBGL initial value is false`,async()=>{i(c.getParameter(c.UNPACK_FLIP_Y_WEBGL)).toBe(!1)}),await a(`UNPACK_PREMULTIPLY_ALPHA_WEBGL initial value is false`,async()=>{i(c.getParameter(c.UNPACK_PREMULTIPLY_ALPHA_WEBGL)).toBe(!1)}),await a(`MAX_TEXTURE_SIZE is at least 64`,async()=>{i(c.getParameter(c.MAX_TEXTURE_SIZE)>=64).toBe(!0)}),await a(`MAX_VERTEX_ATTRIBS is at least 8`,async()=>{i(c.getParameter(c.MAX_VERTEX_ATTRIBS)>=8).toBe(!0)}),await a(`MAX_COMBINED_TEXTURE_IMAGE_UNITS is at least 8`,async()=>{i(c.getParameter(c.MAX_COMBINED_TEXTURE_IMAGE_UNITS)>=8).toBe(!0)}),await a(`MAX_FRAGMENT_UNIFORM_VECTORS is at least 16`,async()=>{i(c.getParameter(c.MAX_FRAGMENT_UNIFORM_VECTORS)>=16).toBe(!0)}),await a(`MAX_VERTEX_UNIFORM_VECTORS is at least 128`,async()=>{i(c.getParameter(c.MAX_VERTEX_UNIFORM_VECTORS)>=128).toBe(!0)}),await a(`ALIASED_POINT_SIZE_RANGE is [>0, >=1]`,async()=>{let e=c.getParameter(c.ALIASED_POINT_SIZE_RANGE);i(e[0]>0).toBe(!0),i(e[1]>=1).toBe(!0)}),await a(`ALIASED_LINE_WIDTH_RANGE is [>0, >=1]`,async()=>{let e=c.getParameter(c.ALIASED_LINE_WIDTH_RANGE);i(e[0]>0).toBe(!0),i(e[1]>=1).toBe(!0)})}),await r(`conformance/state/gl-get-calls — state changes`,async()=>{n(async()=>{l.make_current()}),await a(`clearColor updates COLOR_CLEAR_VALUE`,async()=>{c.clearColor(.1,.2,.3,.4),i(s(c.getParameter(c.COLOR_CLEAR_VALUE),[.1,.2,.3,.4])).toBe(!0),c.clearColor(0,0,0,0)}),await a(`activeTexture updates ACTIVE_TEXTURE`,async()=>{c.activeTexture(c.TEXTURE2),i(c.getParameter(c.ACTIVE_TEXTURE)).toBe(c.TEXTURE2),c.activeTexture(c.TEXTURE0)}),await a(`blendFunc updates BLEND_SRC_RGB and BLEND_DST_RGB`,async()=>{c.blendFunc(c.SRC_ALPHA,c.ONE_MINUS_SRC_ALPHA),i(c.getParameter(c.BLEND_SRC_RGB)).toBe(c.SRC_ALPHA),i(c.getParameter(c.BLEND_DST_RGB)).toBe(c.ONE_MINUS_SRC_ALPHA),c.blendFunc(c.ONE,c.ZERO)}),await a(`depthFunc updates DEPTH_FUNC`,async()=>{c.depthFunc(c.EQUAL),i(c.getParameter(c.DEPTH_FUNC)).toBe(c.EQUAL),c.depthFunc(c.LESS)}),await a(`useProgram updates CURRENT_PROGRAM`,async()=>{let t=e(c,`attribute vec4 p; void main() { gl_Position = p; }`,`void main() { gl_FragColor = vec4(1); }`);c.useProgram(t),i(c.getParameter(c.CURRENT_PROGRAM)).toBe(t),c.useProgram(null),i(c.getParameter(c.CURRENT_PROGRAM)).toBeNull()})}),await r(`conformance/state/gl-enable-enum-test`,async()=>{n(async()=>{l.make_current()});for(let e of[`BLEND`,`CULL_FACE`,`DEPTH_TEST`,`DITHER`,`POLYGON_OFFSET_FILL`,`SAMPLE_ALPHA_TO_COVERAGE`,`SAMPLE_COVERAGE`,`SCISSOR_TEST`,`STENCIL_TEST`])await a(`enable/disable/isEnabled round-trip for ${e}`,async()=>{c.getError();let t=c[e],n=c.isEnabled(t);c.enable(t),i(c.isEnabled(t)).toBe(!0),i(c.getError()).toBe(c.NO_ERROR),c.disable(t),i(c.isEnabled(t)).toBe(!1),i(c.getError()).toBe(c.NO_ERROR),n?c.enable(t):c.disable(t)});await a(`enable with invalid enum generates INVALID_ENUM`,async()=>{c.enable(3008),i(c.getError()).toBe(c.INVALID_ENUM)})}),await r(`conformance/state/gl-geterror`,async()=>{n(async()=>{l.make_current()}),await a(`enable(ALPHA_TEST desktop enum) generates INVALID_ENUM`,async()=>{c.enable(3008),i(c.getError()).toBe(c.INVALID_ENUM)}),await a(`viewport with negative width/height generates INVALID_VALUE`,async()=>{c.viewport(0,0,-1,-1),i(c.getError()).toBe(c.INVALID_VALUE);let e=c.getParameter(c.VIEWPORT);c.viewport(0,0,e[2],e[3])})}),await r(`conformance/state/gl-object-get-calls — getBufferParameter`,async()=>{n(async()=>{l.make_current()}),await a(`getBufferParameter BUFFER_SIZE returns correct size after bufferData`,async()=>{c.getError();let e=c.createBuffer();c.bindBuffer(c.ARRAY_BUFFER,e),c.bufferData(c.ARRAY_BUFFER,16,c.DYNAMIC_DRAW),i(c.getBufferParameter(c.ARRAY_BUFFER,c.BUFFER_SIZE)).toBe(16),i(c.getError()).toBe(c.NO_ERROR),c.bindBuffer(c.ARRAY_BUFFER,null),c.deleteBuffer(e)}),await a(`getBufferParameter BUFFER_USAGE returns correct usage after bufferData`,async()=>{let e=c.createBuffer();c.bindBuffer(c.ARRAY_BUFFER,e),c.bufferData(c.ARRAY_BUFFER,16,c.DYNAMIC_DRAW),i(c.getBufferParameter(c.ARRAY_BUFFER,c.BUFFER_USAGE)).toBe(c.DYNAMIC_DRAW),c.bindBuffer(c.ARRAY_BUFFER,null),c.deleteBuffer(e)})}),await r(`conformance/state/gl-object-get-calls — getRenderbufferParameter`,async()=>{n(async()=>{l.make_current()}),await a(`getRenderbufferParameter returns correct width/height/format`,async()=>{let e=c.createRenderbuffer();c.bindRenderbuffer(c.RENDERBUFFER,e),c.renderbufferStorage(c.RENDERBUFFER,c.RGBA4,64,32),i(c.getRenderbufferParameter(c.RENDERBUFFER,c.RENDERBUFFER_WIDTH)).toBe(64),i(c.getRenderbufferParameter(c.RENDERBUFFER,c.RENDERBUFFER_HEIGHT)).toBe(32),i(c.getRenderbufferParameter(c.RENDERBUFFER,c.RENDERBUFFER_INTERNAL_FORMAT)).toBe(c.RGBA4),i(c.getError()).toBe(c.NO_ERROR),c.bindRenderbuffer(c.RENDERBUFFER,null),c.deleteRenderbuffer(e)})})})};export{c as default};
|