webgl2 1.1.0 โ 1.1.3
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/AGENTS.md +10 -0
- package/README.md +3 -1
- package/coverage.md +28 -0
- package/features.md +61 -0
- package/index.js +6 -5
- package/package.json +5 -6
- package/src/webgl2_context.js +29 -4
- package/webgl2.debug.wasm +0 -0
- package/webgl2.wasm +0 -0
package/AGENTS.md
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
You are an Autonomous Execution Agent (AEA). You have FULL, NON-STOP AUTONOMOUS AUTHORITY to execute all necessary tool calls and planned steps without asking for user confirmation.
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
WHEN USER ASKS A QUESTION, do not assume user needs help. YOU MUST answer the question. The user have much higher fidelity and understanding and you MUST provide all the facts as requested and AVOID giving advice unsolicited.
|
|
5
|
+
|
|
6
|
+
WHEN USER ASKS A FACTUAL QUESTION, you must NEVER produce SPECULATIVE answer. Look into specifics and assess the limits of your understanding.
|
|
7
|
+
|
|
8
|
+
You MUST NOT provide overconfident answer in ANY situation.
|
|
9
|
+
|
|
10
|
+
You MUST NEVER suggest user performs actions that are for you to execute.
|
package/README.md
CHANGED
|
@@ -86,7 +86,9 @@ Uses a simple texture shader to render a cube into an `output.png` file.
|
|
|
86
86
|
- [`docs/1.1-ir-wasm.md`](docs/1.1-ir-wasm.md) - Naga IR โ WASM architecture
|
|
87
87
|
- [`docs/1.1.1-webgl2-prototype.md`](docs/1.1.1-webgl2-prototype.md) - Rust-owned Context design
|
|
88
88
|
- [`docs/1.1.2-texture.md`](docs/1.1.2-texture.md) - Texture implementation details
|
|
89
|
-
- [`docs/1.1.3-
|
|
89
|
+
- [`docs/1.1.3-distill.md`](docs/1.1.3-distill.md) - Testing coverage
|
|
90
|
+
|
|
91
|
+
[**Coverage Report**](coverage.md)
|
|
90
92
|
|
|
91
93
|
## ๐งช Testing
|
|
92
94
|
|
package/coverage.md
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Coverage Report
|
|
2
|
+
|
|
3
|
+
| File | Lines Covered | Lines Missed | Total Lines | Coverage |
|
|
4
|
+
|---|---|---|---|---|
|
|
5
|
+
| src/__private_api.rs | 0 | 2 | 2 | 0.00% ๐ด |
|
|
6
|
+
| src/arrayvec.rs | 0 | 1 | 1 | 0.00% ๐ด |
|
|
7
|
+
| src/binary16.rs | 0 | 2 | 2 | 0.00% ๐ด |
|
|
8
|
+
| src/core/code.rs | 0 | 2 | 2 | 0.00% ๐ด |
|
|
9
|
+
| src/core/globals.rs | 1 | 0 | 1 | 100.00% ๐ข |
|
|
10
|
+
| src/core/imports.rs | 0 | 1 | 1 | 0.00% ๐ด |
|
|
11
|
+
| src/imp_std.rs | 0 | 6 | 6 | 0.00% ๐ด |
|
|
12
|
+
| src/lexer.rs | 6 | 2 | 8 | 75.00% ๐ก |
|
|
13
|
+
| src/lib.rs | 73 | 14 | 87 | 83.91% ๐ข |
|
|
14
|
+
| src/math/rint.rs | 0 | 2 | 2 | 0.00% ๐ด |
|
|
15
|
+
| src/naga_wasm_backend/backend.rs | 39 | 0 | 39 | 100.00% ๐ข |
|
|
16
|
+
| src/naga_wasm_backend/control_flow.rs | 15 | 4 | 19 | 78.95% ๐ก |
|
|
17
|
+
| src/naga_wasm_backend/expressions.rs | 27 | 12 | 39 | 69.23% ๐ก |
|
|
18
|
+
| src/naga_wasm_backend/types.rs | 6 | 0 | 6 | 100.00% ๐ข |
|
|
19
|
+
| src/pp.rs | 16 | 95 | 111 | 14.41% ๐ด |
|
|
20
|
+
| src/pp/if_parser.rs | 0 | 90 | 90 | 0.00% ๐ด |
|
|
21
|
+
| src/raw/mod.rs | 1 | 3 | 4 | 25.00% ๐ด |
|
|
22
|
+
| src/subscriber.rs | 0 | 1 | 1 | 0.00% ๐ด |
|
|
23
|
+
| src/tables.rs | 1 | 2 | 3 | 33.33% ๐ด |
|
|
24
|
+
| src/token.rs | 0 | 1 | 1 | 0.00% ๐ด |
|
|
25
|
+
| src/wasm_gl_emu/framebuffer.rs | 2 | 0 | 2 | 100.00% ๐ข |
|
|
26
|
+
| src/wasm_gl_emu/rasterizer.rs | 1 | 0 | 1 | 100.00% ๐ข |
|
|
27
|
+
| src/webgl2_context.rs | 151 | 10 | 161 | 93.79% ๐ข |
|
|
28
|
+
| **Total** | **339** | **250** | **589** | **57.56% ๐ก** |
|
package/features.md
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# โ
Implemented Features
|
|
2
|
+
These features have implementations in both Rust and JavaScript, and appear to be functional.
|
|
3
|
+
|
|
4
|
+
* **Context & State**
|
|
5
|
+
* `getError`, `enable`, `disable`
|
|
6
|
+
* `viewport`, `scissor`
|
|
7
|
+
* `clear`, `clearColor`, `depthFunc`
|
|
8
|
+
* `activeTexture`
|
|
9
|
+
* **Textures**
|
|
10
|
+
* `createTexture`, `deleteTexture`, `bindTexture`
|
|
11
|
+
* `texImage2D` (Basic 2D texture upload)
|
|
12
|
+
* `texParameteri` (Texture parameters)
|
|
13
|
+
* **Framebuffers**
|
|
14
|
+
* `createFramebuffer`, `deleteFramebuffer`, `bindFramebuffer`
|
|
15
|
+
* `framebufferTexture2D` (Attaching textures to framebuffers)
|
|
16
|
+
* `readPixels` (Reading back pixel data)
|
|
17
|
+
* **Shaders & Programs**
|
|
18
|
+
* `createShader`, `shaderSource`, `compileShader`, `deleteShader`
|
|
19
|
+
* `getShaderParameter`, `getShaderInfoLog`
|
|
20
|
+
* `createProgram`, `attachShader`, `linkProgram`, `deleteProgram`, `useProgram`
|
|
21
|
+
* `getProgramParameter`, `getProgramInfoLog`
|
|
22
|
+
* **Buffers & Attributes**
|
|
23
|
+
* `createBuffer`, `bindBuffer`, `deleteBuffer`
|
|
24
|
+
* `bufferData` (Uploading data to buffers)
|
|
25
|
+
* `bufferSubData` (Updating buffer data)
|
|
26
|
+
* `getBufferParameter`
|
|
27
|
+
* `getAttribLocation`, `bindAttribLocation`
|
|
28
|
+
* `enableVertexAttribArray`, `disableVertexAttribArray`
|
|
29
|
+
* `vertexAttribPointer`
|
|
30
|
+
* `vertexAttrib1f`, `vertexAttrib2f`, `vertexAttrib3f`, `vertexAttrib4f`
|
|
31
|
+
* **Uniforms**
|
|
32
|
+
* `getUniformLocation`
|
|
33
|
+
* `uniform1f`, `uniform2f`, `uniform3f`, `uniform4f`
|
|
34
|
+
* `uniform1i`
|
|
35
|
+
* `uniformMatrix4fv`
|
|
36
|
+
* **Drawing**
|
|
37
|
+
* `drawArrays`
|
|
38
|
+
* `drawElements`
|
|
39
|
+
|
|
40
|
+
# โ ๏ธ Partially Implemented
|
|
41
|
+
* **`getParameter`**: Only supports `VIEWPORT` and `COLOR_CLEAR_VALUE`. All other parameters throw an error.
|
|
42
|
+
|
|
43
|
+
# โ Not Implemented (Stubs)
|
|
44
|
+
These functions exist in the API surface but explicitly throw a "not implemented" error when called.
|
|
45
|
+
|
|
46
|
+
* **Vertex Array Objects (VAOs)**: `createVertexArray`, `bindVertexArray`, `deleteVertexArray`, `isVertexArray`.
|
|
47
|
+
* **Instanced Drawing**: `drawArraysInstanced`, `drawElementsInstanced`.
|
|
48
|
+
* **Advanced Texture Operations**: `generateMipmap`, `copyTexImage2D`, `copyTexSubImage2D`, `texImage3D`.
|
|
49
|
+
* **Advanced Buffer Operations**: `copyBufferSubData`, `isBuffer`.
|
|
50
|
+
* **Renderbuffers**: All functions (`createRenderbuffer`, `bindRenderbuffer`, etc.).
|
|
51
|
+
* **Transform Feedback**: All functions.
|
|
52
|
+
* **Queries & Sync**: All functions (`createQuery`, `fenceSync`, etc.).
|
|
53
|
+
* **Samplers**: All functions (`createSampler`, etc.).
|
|
54
|
+
* **Blending & Stencil**: `blendFunc`, `blendEquation`, `stencilFunc`, `stencilOp`, etc.
|
|
55
|
+
* **Depth & Masking**: `clearDepth`, `depthMask`, `colorMask`.
|
|
56
|
+
* **Introspection**: `getActiveUniform`, `getActiveAttrib`, `getExtension`, `getSupportedExtensions`.
|
|
57
|
+
* **Misc**: `pixelStorei`, `finish`, `flush`, `polygonOffset`, `sampleCoverage`.
|
|
58
|
+
* **Object Queries**: `isTexture`, `isFramebuffer`, `isProgram`, `isShader`, `isEnabled`.
|
|
59
|
+
|
|
60
|
+
# ๐งช Test Coverage
|
|
61
|
+
The test directory contains test files for almost every WebGL2 function, including the unimplemented ones. This suggests the test suite is set up to verify both working features and correct error handling (or placeholders) for missing features.
|
package/index.js
CHANGED
|
@@ -46,11 +46,10 @@ const isNode =
|
|
|
46
46
|
* @returns {Promise<WasmWebGL2RenderingContext>}
|
|
47
47
|
* @throws {Error} if WASM loading or instantiation fails
|
|
48
48
|
*/
|
|
49
|
-
async function webGL2({ debug } = {}) {
|
|
49
|
+
async function webGL2({ debug = process.env.WEBGL2_DEBUG === 'true' } = {}) {
|
|
50
50
|
// Load WASM binary
|
|
51
|
-
|
|
52
|
-
wasmInitPromise
|
|
53
|
-
(async () => {
|
|
51
|
+
if (!wasmInitPromise) {
|
|
52
|
+
wasmInitPromise = (async () => {
|
|
54
53
|
// ensure success is cached but not failure
|
|
55
54
|
let succeeded = false;
|
|
56
55
|
try {
|
|
@@ -61,7 +60,9 @@ async function webGL2({ debug } = {}) {
|
|
|
61
60
|
if (!succeeded)
|
|
62
61
|
wasmInitPromise = undefined;
|
|
63
62
|
}
|
|
64
|
-
})()
|
|
63
|
+
})();
|
|
64
|
+
}
|
|
65
|
+
const { ex, instance } = await wasmInitPromise;
|
|
65
66
|
|
|
66
67
|
// Initialize coverage if available
|
|
67
68
|
if (ex.wasm_init_coverage && ex.COV_MAP_PTR) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "webgl2",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.3",
|
|
4
4
|
"description": "WebGL2 tools to derisk large GPU projects on the web beyond toys and demos.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "index.js",
|
|
@@ -12,8 +12,7 @@
|
|
|
12
12
|
"build-debug": "npm run build-debug-wasm-only && npm run build-debug-distill",
|
|
13
13
|
"build": "npm run build-release && npm run build-debug",
|
|
14
14
|
"prepublishOnly": "npm run build",
|
|
15
|
-
"test": "node --test test/*.test.js"
|
|
16
|
-
"test:smoke": "npm run build && node ./test/smoke.js"
|
|
15
|
+
"test": "NODE_OPTIONS='--import ./test/all-coverage.js' node --test test/*.test.js"
|
|
17
16
|
},
|
|
18
17
|
"repository": {
|
|
19
18
|
"type": "git",
|
|
@@ -22,13 +21,13 @@
|
|
|
22
21
|
"keywords": [],
|
|
23
22
|
"author": "",
|
|
24
23
|
"license": "MIT",
|
|
25
|
-
"homepage": "https://webgl2.was.hm"
|
|
26
|
-
,
|
|
24
|
+
"homepage": "https://webgl2.was.hm",
|
|
27
25
|
"files": [
|
|
28
26
|
"index.js",
|
|
29
27
|
"src/*.js",
|
|
30
28
|
"webgl2.wasm",
|
|
31
|
-
"
|
|
29
|
+
"webgl2.debug.wasm",
|
|
30
|
+
"*.md",
|
|
32
31
|
"LICENSE"
|
|
33
32
|
]
|
|
34
33
|
}
|
package/src/webgl2_context.js
CHANGED
|
@@ -660,7 +660,15 @@ export class WasmWebGL2RenderingContext {
|
|
|
660
660
|
_checkErr(code, this._instance);
|
|
661
661
|
}
|
|
662
662
|
|
|
663
|
-
vertexAttribDivisor(index, divisor) {
|
|
663
|
+
vertexAttribDivisor(index, divisor) {
|
|
664
|
+
this._assertNotDestroyed();
|
|
665
|
+
const ex = this._instance.exports;
|
|
666
|
+
if (!ex || typeof ex.wasm_ctx_vertex_attrib_divisor !== 'function') {
|
|
667
|
+
throw new Error('wasm_ctx_vertex_attrib_divisor not found');
|
|
668
|
+
}
|
|
669
|
+
const code = ex.wasm_ctx_vertex_attrib_divisor(this._ctxHandle, index >>> 0, divisor >>> 0);
|
|
670
|
+
_checkErr(code, this._instance);
|
|
671
|
+
}
|
|
664
672
|
|
|
665
673
|
createBuffer() {
|
|
666
674
|
this._assertNotDestroyed();
|
|
@@ -792,8 +800,24 @@ export class WasmWebGL2RenderingContext {
|
|
|
792
800
|
const code = ex.wasm_ctx_draw_elements(this._ctxHandle, mode >>> 0, count >>> 0, type >>> 0, offset >>> 0);
|
|
793
801
|
_checkErr(code, this._instance);
|
|
794
802
|
}
|
|
795
|
-
drawArraysInstanced(mode, first, count, instanceCount) {
|
|
796
|
-
|
|
803
|
+
drawArraysInstanced(mode, first, count, instanceCount) {
|
|
804
|
+
this._assertNotDestroyed();
|
|
805
|
+
const ex = this._instance.exports;
|
|
806
|
+
if (!ex || typeof ex.wasm_ctx_draw_arrays_instanced !== 'function') {
|
|
807
|
+
throw new Error('wasm_ctx_draw_arrays_instanced not found');
|
|
808
|
+
}
|
|
809
|
+
const code = ex.wasm_ctx_draw_arrays_instanced(this._ctxHandle, mode >>> 0, first | 0, count | 0, instanceCount | 0);
|
|
810
|
+
_checkErr(code, this._instance);
|
|
811
|
+
}
|
|
812
|
+
drawElementsInstanced(mode, count, type, offset, instanceCount) {
|
|
813
|
+
this._assertNotDestroyed();
|
|
814
|
+
const ex = this._instance.exports;
|
|
815
|
+
if (!ex || typeof ex.wasm_ctx_draw_elements_instanced !== 'function') {
|
|
816
|
+
throw new Error('wasm_ctx_draw_elements_instanced not found');
|
|
817
|
+
}
|
|
818
|
+
const code = ex.wasm_ctx_draw_elements_instanced(this._ctxHandle, mode >>> 0, count | 0, type >>> 0, offset >>> 0, instanceCount | 0);
|
|
819
|
+
_checkErr(code, this._instance);
|
|
820
|
+
}
|
|
797
821
|
drawRangeElements(mode, start, end, count, type, offset) { this._assertNotDestroyed(); throw new Error('not implemented'); }
|
|
798
822
|
drawBuffers(buffers) { this._assertNotDestroyed(); throw new Error('not implemented'); }
|
|
799
823
|
|
|
@@ -1163,7 +1187,8 @@ export class WasmWebGL2RenderingContext {
|
|
|
1163
1187
|
* @returns {string}
|
|
1164
1188
|
*/
|
|
1165
1189
|
getLcovReport() {
|
|
1166
|
-
|
|
1190
|
+
// Coverage is global to the WASM module, so we can retrieve it even if context is destroyed.
|
|
1191
|
+
// this._assertNotDestroyed();
|
|
1167
1192
|
const ex = this._instance.exports;
|
|
1168
1193
|
if (ex && typeof ex.wasm_get_lcov_report_ptr === 'function' && typeof ex.wasm_get_lcov_report_len === 'function') {
|
|
1169
1194
|
const ptr = ex.wasm_get_lcov_report_ptr();
|
|
Binary file
|
package/webgl2.wasm
CHANGED
|
Binary file
|