@gjsify/webgl 0.3.20 → 0.4.0
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/_virtual/_rolldown/runtime.js +1 -0
- package/lib/esm/conformance/attribs.spec.js +2 -2
- package/lib/esm/conformance/buffers.spec.js +1 -1
- package/lib/esm/conformance/context.spec.js +3 -3
- package/lib/esm/conformance/programs.spec.js +3 -3
- package/lib/esm/conformance/rendering-basic.spec.js +3 -3
- package/lib/esm/conformance/rendering.spec.js +6 -6
- package/lib/esm/conformance/setup.js +1 -1
- package/lib/esm/conformance/state.spec.js +1 -1
- package/lib/esm/conformance/textures.spec.js +3 -3
- package/lib/esm/conformance/uniforms.spec.js +1 -1
- package/lib/esm/conformance-test.js +1 -1
- package/lib/esm/context/buffer-binding.js +1 -0
- package/lib/esm/context/drawing.js +1 -0
- package/lib/esm/context/framebuffer.js +1 -0
- package/lib/esm/context/index.js +1 -0
- package/lib/esm/context/shader-program.js +8 -0
- package/lib/esm/context/state.js +1 -0
- package/lib/esm/context/texture-management.js +1 -0
- package/lib/esm/extensions/ext-blend-minmax.js +1 -1
- package/lib/esm/extensions/ext-color-buffer-float.js +1 -1
- package/lib/esm/extensions/ext-color-buffer-half-float.js +1 -1
- package/lib/esm/extensions/ext-texture-filter-anisotropic.js +1 -1
- package/lib/esm/extensions/oes-element-index-unit.js +1 -1
- package/lib/esm/extensions/oes-standard-derivatives.js +1 -1
- package/lib/esm/extensions/oes-texture-float-linear.js +1 -1
- package/lib/esm/extensions/oes-texture-float.js +1 -1
- package/lib/esm/extensions/oes-texture-half-float.js +1 -1
- package/lib/esm/extensions/stackgl-destroy-context.js +1 -1
- package/lib/esm/extensions/stackgl-resize-drawing-buffer.js +1 -1
- package/lib/esm/html-canvas-element.js +1 -1
- package/lib/esm/index.js +1 -1
- package/lib/esm/linkable.js +1 -1
- package/lib/esm/test-utils.js +4 -4
- package/lib/esm/test.js +1 -1
- package/lib/esm/utils.js +1 -1
- package/lib/esm/webgl-active-info.js +1 -1
- package/lib/esm/webgl-bridge.js +1 -1
- package/lib/esm/webgl-buffer.js +1 -1
- package/lib/esm/webgl-context-attributes.js +1 -1
- package/lib/esm/webgl-context-base.js +1 -8
- package/lib/esm/webgl-drawing-buffer-wrapper.js +1 -1
- package/lib/esm/webgl-framebuffer.js +1 -1
- package/lib/esm/webgl-program.js +1 -1
- package/lib/esm/webgl-query.js +1 -1
- package/lib/esm/webgl-renderbuffer.js +1 -1
- package/lib/esm/webgl-rendering-context.js +1 -1
- package/lib/esm/webgl-sampler.js +1 -1
- package/lib/esm/webgl-shader-precision-format.js +1 -1
- package/lib/esm/webgl-shader.js +1 -1
- package/lib/esm/webgl-sync.js +1 -1
- package/lib/esm/webgl-texture-unit.js +1 -1
- package/lib/esm/webgl-texture.js +1 -1
- package/lib/esm/webgl-transform-feedback.js +1 -1
- package/lib/esm/webgl-uniform-location.js +1 -1
- package/lib/esm/webgl-vertex-array-object.js +1 -1
- package/lib/esm/webgl-vertex-attribute.js +1 -1
- package/lib/esm/webgl1.spec.js +10 -10
- package/lib/esm/webgl2-rendering-context.js +1 -1
- package/lib/esm/webgl2.spec.js +22 -22
- package/lib/types/context/buffer-binding.d.ts +17 -0
- package/lib/types/context/drawing.d.ts +29 -0
- package/lib/types/context/framebuffer.d.ts +33 -0
- package/lib/types/context/index.d.ts +7 -0
- package/lib/types/context/shader-program.d.ts +67 -0
- package/lib/types/context/state.d.ts +60 -0
- package/lib/types/context/texture-management.d.ts +39 -0
- package/lib/types/index.d.ts +11 -0
- package/lib/types/webgl-context-base.d.ts +41 -198
- package/lib/types/webgl2-rendering-context.d.ts +1 -1
- package/package.json +8 -8
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e=Object.defineProperty,__name=(t,n)=>e(t,`name`,{value:n,configurable:!0});export{__name};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{destroyTestFBO as
|
|
1
|
+
import{__name as e}from"../_virtual/_rolldown/runtime.js";import{destroyTestFBO as t,makeProgram as n,makeTestFBO as r}from"../test-utils.js";import{createGLSetup as i}from"./setup.js";import{beforeEach as a,describe as o,expect as s,it as c,on as l}from"@gjsify/unit";var u=e(async()=>{await l(`Display`,async()=>{let e=i();if(!e){console.warn(`WebGL context not available — skipping conformance/attribs tests`);return}let{gl:l,glArea:u,win:d}=e;u.make_current(),await o(`conformance/attribs/gl-vertex-attrib: vertexAttrib round-trip`,async()=>{a(async()=>{u.make_current()}),await c(`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);s(e instanceof Float32Array).toBeTruthy(),s(e[0]).toBe(5),s(e[1]).toBe(0),s(e[2]).toBe(0),s(e[3]).toBe(1)}),await c(`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);s(e[0]).toBe(6),s(e[1]).toBe(7),s(e[2]).toBe(0),s(e[3]).toBe(1)}),await c(`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);s(e[0]).toBe(7),s(e[1]).toBe(8),s(e[2]).toBe(9),s(e[3]).toBe(1)}),await c(`vertexAttrib4f stores all four values`,async()=>{l.vertexAttrib4f(0,6,7,8,9);let e=l.getVertexAttrib(0,l.CURRENT_VERTEX_ATTRIB);s(e[0]).toBe(6),s(e[1]).toBe(7),s(e[2]).toBe(8),s(e[3]).toBe(9)}),await c(`vertexAttrib1fv with array round-trips correctly`,async()=>{l.vertexAttrib1fv(0,[1]);let e=l.getVertexAttrib(0,l.CURRENT_VERTEX_ATTRIB);s(e[0]).toBe(1),s(e[1]).toBe(0),s(e[2]).toBe(0),s(e[3]).toBe(1)}),await c(`vertexAttrib1fv with Float32Array round-trips correctly`,async()=>{l.vertexAttrib1fv(0,new Float32Array([-1]));let e=l.getVertexAttrib(0,l.CURRENT_VERTEX_ATTRIB);s(e[0]).toBe(-1),s(e[3]).toBe(1)}),await c(`vertexAttrib2fv with array round-trips correctly`,async()=>{l.vertexAttrib2fv(0,[1,2]);let e=l.getVertexAttrib(0,l.CURRENT_VERTEX_ATTRIB);s(e[0]).toBe(1),s(e[1]).toBe(2),s(e[2]).toBe(0),s(e[3]).toBe(1)}),await c(`vertexAttrib3fv with Float32Array round-trips correctly`,async()=>{l.vertexAttrib3fv(0,new Float32Array([1,-2,3]));let e=l.getVertexAttrib(0,l.CURRENT_VERTEX_ATTRIB);s(e[0]).toBe(1),s(e[1]).toBe(-2),s(e[2]).toBe(3),s(e[3]).toBe(1)}),await c(`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);s(e[0]).toBe(1),s(e[1]).toBe(2),s(e[2]).toBe(-3),s(e[3]).toBe(4)}),await c(`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);s(l.getError()).toBe(l.NO_ERROR)})}),await o(`conformance/attribs/gl-vertex-attrib: out-of-range index`,async()=>{a(async()=>{u.make_current()}),await c(`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),s(l.getError()).toBe(l.INVALID_VALUE)}),await c(`vertexAttrib1fv with out-of-range index generates INVALID_VALUE`,async()=>{let e=l.getParameter(l.MAX_VERTEX_ATTRIBS);l.vertexAttrib1fv(e,[1]),s(l.getError()).toBe(l.INVALID_VALUE)}),await c(`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])),s(l.getError()).toBe(l.INVALID_VALUE)}),await c(`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),s(l.getError()).toBe(l.INVALID_VALUE)})}),await o(`conformance/attribs/gl-enable-vertex-attrib`,async()=>{a(async()=>{u.make_current()}),await c(`drawArrays with enabled attrib that has no buffer bound generates INVALID_OPERATION`,async()=>{let e=n(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 t=l.createBuffer();l.bindBuffer(l.ARRAY_BUFFER,t),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),s(l.getError()).toBe(l.NO_ERROR),l.drawArrays(l.TRIANGLES,0,3),s(l.getError()).toBe(l.INVALID_OPERATION),l.disableVertexAttribArray(0),l.disableVertexAttribArray(3),l.deleteBuffer(t),l.deleteProgram(e)})}),await o(`conformance/attribs/gl-bindAttribLocation-repeated`,async()=>{a(async()=>{u.make_current()}),await c(`getAttribLocation returns the bound location after linkProgram`,async()=>{function setup(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),s(l.getProgramParameter(r,l.LINK_STATUS)).toBeTruthy(),s(l.getAttribLocation(r,`vPosition`)).toBe(e),l.deleteShader(t),l.deleteShader(n),r}let e=setup(0),t=setup(3),n=setup(1),r=setup(3);l.deleteProgram(e),l.deleteProgram(t),l.deleteProgram(n),l.deleteProgram(r)})}),await o(`conformance/attribs/attribute-weirdness`,async()=>{a(async()=>{u.make_current()});let e=new Int16Array([0,0,0,0,4,0,1,0,0,4,0,1,4,4,1,1]);function renderAttribWeirdness(i,a){let o=r(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
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=
|
|
3
|
+
`);l.clearColor(0,0,0,0),l.clear(l.COLOR_BUFFER_BIT);let d=n(l,c,u);l.useProgram(d);let f=l.createBuffer();l.bindBuffer(l.ARRAY_BUFFER,f),l.bufferData(l.ARRAY_BUFFER,e,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),t(l,o),h}await c(`normal order: all alpha values are 255 (quad covers canvas)`,async()=>{let e=renderAttribWeirdness(!1,!1),t=!0;for(let n=3;n<16;n+=4)if(e[n]!==255){t=!1;break}s(t).toBe(!0)}),await c(`flipped attribute declarations: all alpha values are still 255`,async()=>{let e=renderAttribWeirdness(!0,!1),t=!0;for(let n=3;n<16;n+=4)if(e[n]!==255){t=!1;break}s(t).toBe(!0)}),await c(`swapped location assignments: quad does not cover canvas (some alpha ≠ 255)`,async()=>{let e=renderAttribWeirdness(!1,!0),t=!1;for(let n=3;n<16;n+=4)if(e[n]!==255){t=!0;break}s(t).toBe(!0)})}),d.destroy()})},`default`);export{u as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{destroyTestFBO as
|
|
1
|
+
import{__name as e}from"../_virtual/_rolldown/runtime.js";import{destroyTestFBO as t,makeProgram as n,makeTestFBO as r,pixelClose as i,readPixel as a}from"../test-utils.js";import{createGLSetup as o}from"./setup.js";import{beforeEach as s,describe as c,expect as l,it as u,on as d}from"@gjsify/unit";var f=e(async()=>{await d(`Display`,async()=>{let e=o();if(!e){console.warn(`WebGL context not available — skipping conformance/buffers tests`);return}let{gl:d,glArea:f,win:p}=e;f.make_current(),await c(`conformance/buffers/buffer-bind-test`,async()=>{s(async()=>{f.make_current()}),await u(`should be able to bind and unbind an ARRAY_BUFFER`,async()=>{let e=d.createBuffer();d.bindBuffer(d.ARRAY_BUFFER,e),l(d.getError()).toBe(d.NO_ERROR),d.bindBuffer(d.ARRAY_BUFFER,null),l(d.getError()).toBe(d.NO_ERROR),d.deleteBuffer(e)}),await u(`should be able to bind and unbind an ELEMENT_ARRAY_BUFFER`,async()=>{let e=d.createBuffer();d.bindBuffer(d.ELEMENT_ARRAY_BUFFER,e),l(d.getError()).toBe(d.NO_ERROR),d.bindBuffer(d.ELEMENT_ARRAY_BUFFER,null),l(d.getError()).toBe(d.NO_ERROR),d.deleteBuffer(e)}),await u(`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),l(d.getError()).toBe(d.INVALID_OPERATION),d.deleteBuffer(e)}),await u(`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),l(d.getError()).toBe(d.INVALID_OPERATION),d.deleteBuffer(e)})}),await c(`conformance/buffers/buffer-data-and-buffer-sub-data`,async()=>{s(async()=>{f.make_current()}),await u(`bufferData with no buffer bound generates INVALID_OPERATION`,async()=>{d.bufferData(d.ARRAY_BUFFER,4,d.STATIC_DRAW),l(d.getError()).toBe(d.INVALID_OPERATION)}),await u(`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),l(d.getError()).toBe(d.INVALID_VALUE),d.bindBuffer(d.ARRAY_BUFFER,null),d.deleteBuffer(e)}),await u(`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),l(d.getError()).toBe(d.INVALID_VALUE),d.bindBuffer(d.ARRAY_BUFFER,null),d.deleteBuffer(e)}),await u(`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),l(d.getError()).toBe(d.NO_ERROR),l(d.getBufferParameter(d.ARRAY_BUFFER,d.BUFFER_SIZE)).toBe(0),d.bindBuffer(d.ARRAY_BUFFER,null),d.deleteBuffer(e)}),await u(`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),l(d.getError()).toBe(d.NO_ERROR),l(d.getBufferParameter(d.ARRAY_BUFFER,d.BUFFER_SIZE)).toBe(4),d.bindBuffer(d.ARRAY_BUFFER,null),d.deleteBuffer(e)}),await u(`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),l(d.getError()).toBe(d.NO_ERROR),l(d.getBufferParameter(d.ARRAY_BUFFER,d.BUFFER_SIZE)).toBe(4),d.bindBuffer(d.ARRAY_BUFFER,null),d.deleteBuffer(e)}),await u(`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)),l(d.getError()).toBe(d.INVALID_VALUE),d.bindBuffer(d.ARRAY_BUFFER,null),d.deleteBuffer(e)}),await u(`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)),l(d.getError()).toBe(d.INVALID_VALUE),d.bindBuffer(d.ARRAY_BUFFER,null),d.deleteBuffer(e)}),await u(`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)),l(d.getError()).toBe(d.INVALID_VALUE),d.bindBuffer(d.ARRAY_BUFFER,null),d.deleteBuffer(e)}),await u(`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)),l(d.getError()).toBe(d.NO_ERROR),d.bufferSubData(d.ARRAY_BUFFER,10,new Float32Array),l(d.getError()).toBe(d.NO_ERROR),d.bindBuffer(d.ARRAY_BUFFER,null),d.deleteBuffer(e)}),await u(`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(),l(()=>d.bufferSubData(d.ARRAY_BUFFER,0,42)).toThrow(),l(()=>d.bufferSubData(d.ARRAY_BUFFER,0,`5.5`)).toThrow(),l(()=>d.bufferSubData(d.ARRAY_BUFFER,10,null)).toThrow(),l(d.getError()).toBe(d.NO_ERROR),d.bindBuffer(d.ARRAY_BUFFER,null),d.deleteBuffer(e)})}),await c(`conformance/buffers/element-array-buffer-delete-recreate`,async()=>{s(async()=>{f.make_current()}),await u(`drawElements succeeds after deleting and recreating the element array buffer`,async()=>{let e=n(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(e);let o=r(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 c=d.createBuffer();d.bindBuffer(d.ELEMENT_ARRAY_BUFFER,c),d.bufferData(d.ELEMENT_ARRAY_BUFFER,new Uint8Array([0,1,2,3]),d.STATIC_DRAW),d.deleteBuffer(c),c=d.createBuffer(),d.bindBuffer(d.ELEMENT_ARRAY_BUFFER,c),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),l(d.getError()).toBe(d.NO_ERROR),l(i(a(d,1,1),[0,255,0,255])).toBeTruthy(),t(d,o),d.deleteBuffer(s),d.deleteBuffer(c),d.deleteProgram(e)})}),p.destroy()})},`default`);export{f as default};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{
|
|
2
|
-
`)}`)}),await
|
|
3
|
-
`)}`)})}),await
|
|
1
|
+
import{__name as e}from"../_virtual/_rolldown/runtime.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";import{WebGLRenderingContext as s}from"@gjsify/webgl";const c=`getContextAttributes.activeTexture.attachShader.bindAttribLocation.bindBuffer.bindFramebuffer.bindRenderbuffer.bindTexture.blendColor.blendEquation.blendEquationSeparate.blendFunc.blendFuncSeparate.bufferData.bufferSubData.checkFramebufferStatus.clear.clearColor.clearDepth.clearStencil.colorMask.compileShader.compressedTexImage2D.compressedTexSubImage2D.copyTexImage2D.copyTexSubImage2D.createBuffer.createFramebuffer.createProgram.createRenderbuffer.createShader.createTexture.cullFace.deleteBuffer.deleteFramebuffer.deleteProgram.deleteRenderbuffer.deleteShader.deleteTexture.depthFunc.depthMask.depthRange.detachShader.disable.disableVertexAttribArray.drawArrays.drawElements.enable.enableVertexAttribArray.finish.flush.framebufferRenderbuffer.framebufferTexture2D.frontFace.generateMipmap.getActiveAttrib.getActiveUniform.getAttachedShaders.getAttribLocation.getParameter.getBufferParameter.getError.getExtension.getFramebufferAttachmentParameter.getProgramParameter.getProgramInfoLog.getRenderbufferParameter.getShaderParameter.getShaderInfoLog.getShaderPrecisionFormat.getShaderSource.getSupportedExtensions.getTexParameter.getUniform.getUniformLocation.getVertexAttrib.getVertexAttribOffset.hint.isBuffer.isContextLost.isEnabled.isFramebuffer.isProgram.isRenderbuffer.isShader.isTexture.lineWidth.linkProgram.pixelStorei.polygonOffset.readPixels.renderbufferStorage.sampleCoverage.scissor.shaderSource.stencilFunc.stencilFuncSeparate.stencilMask.stencilMaskSeparate.stencilOp.stencilOpSeparate.texImage2D.texParameterf.texParameteri.texSubImage2D.uniform1f.uniform1fv.uniform1i.uniform1iv.uniform2f.uniform2fv.uniform2i.uniform2iv.uniform3f.uniform3fv.uniform3i.uniform3iv.uniform4f.uniform4fv.uniform4i.uniform4iv.uniformMatrix2fv.uniformMatrix3fv.uniformMatrix4fv.useProgram.validateProgram.vertexAttrib1f.vertexAttrib1fv.vertexAttrib2f.vertexAttrib2fv.vertexAttrib3f.vertexAttrib3fv.vertexAttrib4f.vertexAttrib4fv.vertexAttribPointer.viewport`.split(`.`),l=[[`DEPTH_BUFFER_BIT`,256],[`STENCIL_BUFFER_BIT`,1024],[`COLOR_BUFFER_BIT`,16384],[`POINTS`,0],[`LINES`,1],[`LINE_LOOP`,2],[`LINE_STRIP`,3],[`TRIANGLES`,4],[`TRIANGLE_STRIP`,5],[`TRIANGLE_FAN`,6],[`ZERO`,0],[`ONE`,1],[`SRC_COLOR`,768],[`SRC_ALPHA`,770],[`FUNC_ADD`,32774],[`ARRAY_BUFFER`,34962],[`ELEMENT_ARRAY_BUFFER`,34963],[`STREAM_DRAW`,35040],[`STATIC_DRAW`,35044],[`DYNAMIC_DRAW`,35048],[`FRAGMENT_SHADER`,35632],[`VERTEX_SHADER`,35633],[`COMPILE_STATUS`,35713],[`LINK_STATUS`,35714],[`VALIDATE_STATUS`,35715],[`FLOAT`,5126],[`FLOAT_VEC2`,35664],[`FLOAT_VEC3`,35665],[`FLOAT_VEC4`,35666],[`FLOAT_MAT2`,35674],[`FLOAT_MAT3`,35675],[`FLOAT_MAT4`,35676],[`INT`,5124],[`TEXTURE_2D`,3553],[`TEXTURE_CUBE_MAP`,34067],[`RGBA`,6408],[`RGB`,6407],[`UNSIGNED_BYTE`,5121],[`UNSIGNED_SHORT`,5123],[`UNSIGNED_INT`,5125],[`FRAMEBUFFER`,36160],[`RENDERBUFFER`,36161],[`DEPTH_COMPONENT16`,33189],[`DEPTH_ATTACHMENT`,36096],[`COLOR_ATTACHMENT0`,36064],[`FRAMEBUFFER_COMPLETE`,36053],[`NO_ERROR`,0],[`INVALID_ENUM`,1280],[`INVALID_VALUE`,1281],[`INVALID_OPERATION`,1282],[`OUT_OF_MEMORY`,1285]];var u=e(async()=>{await o(`Display`,async()=>{let e=t();if(!e){console.warn(`WebGL context not available — skipping conformance/context tests`);return}let{gl:o,glArea:u,win:d}=e;u.make_current(),await r(`conformance/context/methods: all WebGL methods present`,async()=>{n(async()=>{u.make_current()}),await a(`all standard WebGL methods are functions on the context`,async()=>{let e=[];for(let t of c)typeof o[t]!=`function`&&e.push(t);if(e.length>0)throw Error(`Missing WebGL methods: ${e.join(`, `)}`)})}),await r(`conformance/context/constants-and-properties: constant values`,async()=>{n(async()=>{u.make_current()}),await a(`all sampled WebGL constants have the correct numeric value`,async()=>{let e=[];for(let[t,n]of l){let r=o[t];r!==n&&e.push(`${t}: expected ${n}, got ${r}`)}if(e.length>0)throw Error(`Wrong constant values:\n${e.join(`
|
|
2
|
+
`)}`)}),await a(`WebGLRenderingContext class constant values match instance constants`,async()=>{let e=[];for(let[t,n]of l){let r=s[t];r!==void 0&&r!==n&&e.push(`${t}: expected ${n}, got ${r}`)}if(e.length>0)throw Error(`Wrong class constant values:\n${e.join(`
|
|
3
|
+
`)}`)})}),await r(`conformance/context/context-type-test`,async()=>{n(async()=>{u.make_current()}),await a(`WebGLRenderingContext should exist in globalThis`,async()=>{i(globalThis.WebGLRenderingContext!==void 0).toBeTruthy()}),await a(`gl should be an instance of WebGLRenderingContext`,async()=>{i(o instanceof s).toBeTruthy()}),await a(`getContextAttributes returns an object`,async()=>{let e=o.getContextAttributes();i(e).not.toBeNull(),i(typeof e).toBe(`object`)}),await a(`isContextLost returns false initially`,async()=>{i(o.isContextLost()).toBe(!1)}),await a(`canvas property points to the HTMLCanvasElement`,async()=>{i(o.canvas).not.toBeNull(),i(typeof o.canvas.getContext).toBe(`function`)}),await a(`drawingBufferWidth and drawingBufferHeight are positive integers`,async()=>{i(o.drawingBufferWidth).toBeGreaterThan(0),i(o.drawingBufferHeight).toBeGreaterThan(0),i(Number.isInteger(o.drawingBufferWidth)).toBeTruthy(),i(Number.isInteger(o.drawingBufferHeight)).toBeTruthy()}),await a(`getSupportedExtensions returns an array of strings`,async()=>{let e=o.getSupportedExtensions();i(Array.isArray(e)).toBeTruthy();for(let t of e)i(typeof t).toBe(`string`)}),await a(`getParameter(VENDOR) and getParameter(RENDERER) return strings`,async()=>{let e=o.getParameter(o.VENDOR),t=o.getParameter(o.RENDERER),n=o.getParameter(o.VERSION),r=o.getParameter(o.SHADING_LANGUAGE_VERSION);i(typeof e).toBe(`string`),i(typeof t).toBe(`string`),i(typeof n).toBe(`string`),i(typeof r).toBe(`string`)})}),d.destroy()})},`default`);export{u as default};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import{destroyTestFBO as
|
|
1
|
+
import{__name as e}from"../_virtual/_rolldown/runtime.js";import{destroyTestFBO 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";const d=`attribute vec4 a_position; void main() { gl_Position = a_position; }`,f=`attribute vec4 aVertex; attribute vec4 aColor; varying vec4 vColor; void main() { vColor = aColor; gl_Position = aVertex; }`,p=`precision mediump float; varying vec4 vColor; void main() { gl_FragColor = vColor; }`,m=`void main() { gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); }`,h=`void main() { gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0); }`,g=`
|
|
2
2
|
attribute vec4 a_vertex;
|
|
3
3
|
attribute vec3 a_normal;
|
|
4
4
|
uniform mat4 u_modelViewProjMatrix;
|
|
5
|
-
void main() { gl_Position = u_modelViewProjMatrix * (a_vertex + vec4(a_normal, 0.0)); }`,
|
|
5
|
+
void main() { gl_Position = u_modelViewProjMatrix * (a_vertex + vec4(a_normal, 0.0)); }`,_=`
|
|
6
6
|
precision mediump float;
|
|
7
|
-
void main() { gl_FragColor = vec4(1.0); }`;function _(e,t,n){let r=e.createShader(t);return e.shaderSource(r,n),e.compileShader(r),r}function v(e,t,n,r){let i=_(e,e.VERTEX_SHADER,t),a=_(e,e.FRAGMENT_SHADER,n),o=e.createProgram();if(e.attachShader(o,i),e.attachShader(o,a),r)for(let[t,n]of r)e.bindAttribLocation(o,n,t);return e.linkProgram(o),o}function y(e,t,n=`a_position`){let i=typeof n==`string`?e.getAttribLocation(t,n):n,a=e.createBuffer();return e.bindBuffer(e.ARRAY_BUFFER,a),e.bufferData(e.ARRAY_BUFFER,new Float32Array([-4,-4,4,-4,0,4]),e.STREAM_DRAW),e.enableVertexAttribArray(i),e.vertexAttribPointer(i,2,e.FLOAT,!1,0,0),e.drawArrays(e.TRIANGLES,0,3),e.disableVertexAttribArray(i),e.deleteBuffer(a),r(e,0,0)}var b=async()=>{await l(`Display`,async()=>{let r=i();if(!r){console.warn(`WebGL context not available — skipping conformance/programs tests`);return}let{gl:l,glArea:b,win:x}=r;b.make_current(),await o(`conformance/programs/program-test: compileShader`,async()=>{a(async()=>{b.make_current()}),await c(`good vertex shader should compile`,async()=>{let e=_(l,l.VERTEX_SHADER,`attribute vec4 aVertex; void main() { gl_Position = aVertex; }`);s(l.getShaderParameter(e,l.COMPILE_STATUS)).toBeTruthy(),l.deleteShader(e)}),await c(`good fragment shader should compile`,async()=>{let e=_(l,l.FRAGMENT_SHADER,`precision mediump float; void main() { gl_FragColor = vec4(1.0); }`);s(l.getShaderParameter(e,l.COMPILE_STATUS)).toBeTruthy(),l.deleteShader(e)}),await c(`getShaderParameter with desktop-only INFO_LOG_LENGTH returns null and INVALID_ENUM`,async()=>{let e=_(l,l.VERTEX_SHADER,`attribute vec4 v; void main() { gl_Position = v; }`);s(l.getShaderParameter(e,35716)).toBeNull(),s(l.getError()).toBe(l.INVALID_ENUM),l.deleteShader(e)})}),await o(`conformance/programs/program-test: attachShader / detachShader`,async()=>{a(async()=>{b.make_current()}),await c(`attaching a vertex shader succeeds`,async()=>{let e=_(l,l.VERTEX_SHADER,d),t=l.createProgram();l.attachShader(t,e),s(l.getError()).toBe(l.NO_ERROR),l.deleteProgram(t),l.deleteShader(e)}),await c(`attaching the same shader twice generates INVALID_OPERATION`,async()=>{let e=_(l,l.VERTEX_SHADER,d),t=l.createProgram();l.attachShader(t,e),l.getError(),l.attachShader(t,e),s(l.getError()).toBe(l.INVALID_OPERATION),l.deleteProgram(t),l.deleteShader(e)}),await c(`attaching two vertex shaders to same program generates INVALID_OPERATION`,async()=>{let e=_(l,l.VERTEX_SHADER,d),t=_(l,l.VERTEX_SHADER,`attribute vec4 v; void main() { gl_Position = v * 0.5; }`),n=l.createProgram();l.attachShader(n,e),l.getError(),l.attachShader(n,t),s(l.getError()).toBe(l.INVALID_OPERATION),l.deleteProgram(n),l.deleteShader(e),l.deleteShader(t)}),await c(`detaching an attached shader succeeds`,async()=>{let e=_(l,l.VERTEX_SHADER,d),t=l.createProgram();l.attachShader(t,e),l.detachShader(t,e),s(l.getError()).toBe(l.NO_ERROR),l.deleteProgram(t),l.deleteShader(e)}),await c(`detaching a non-attached shader generates INVALID_OPERATION`,async()=>{let e=_(l,l.VERTEX_SHADER,d),t=_(l,l.FRAGMENT_SHADER,f),n=l.createProgram();l.attachShader(n,t),l.getError(),l.detachShader(n,e),s(l.getError()).toBe(l.INVALID_OPERATION),l.deleteProgram(n),l.deleteShader(e),l.deleteShader(t)})}),await o(`conformance/programs/program-test: getAttachedShaders`,async()=>{a(async()=>{b.make_current()}),await c(`empty program returns empty list`,async()=>{let e=l.createProgram();s(l.getAttachedShaders(e)?.length).toBe(0),l.deleteProgram(e)}),await c(`attached shaders appear in getAttachedShaders`,async()=>{let e=_(l,l.VERTEX_SHADER,d),t=_(l,l.FRAGMENT_SHADER,f),n=l.createProgram();l.attachShader(n,e),l.attachShader(n,t);let r=l.getAttachedShaders(n);s(r.length).toBe(2),s(r.includes(e)).toBeTruthy(),s(r.includes(t)).toBeTruthy(),l.deleteProgram(n),l.deleteShader(e),l.deleteShader(t)}),await c(`detached shaders are removed from getAttachedShaders`,async()=>{let e=_(l,l.VERTEX_SHADER,d),t=_(l,l.FRAGMENT_SHADER,f),n=l.createProgram();l.attachShader(n,e),l.attachShader(n,t),l.detachShader(n,e);let r=l.getAttachedShaders(n);s(r.length).toBe(1),s(r.includes(t)).toBeTruthy(),l.deleteProgram(n),l.deleteShader(e),l.deleteShader(t)})}),await o(`conformance/programs/program-test: linkProgram / useProgram`,async()=>{a(async()=>{b.make_current()}),await c(`valid program should link`,async()=>{let e=v(l,d,f,[[`aVertex`,0],[`aColor`,1]]);s(l.getProgramParameter(e,l.LINK_STATUS)).toBeTruthy(),s(typeof l.getProgramInfoLog(e)).toBe(`string`),l.deleteProgram(e)}),await c(`program with no fragment shader should fail to link`,async()=>{let e=_(l,l.VERTEX_SHADER,d),t=l.createProgram();l.attachShader(t,e),l.linkProgram(t),s(l.getProgramParameter(t,l.LINK_STATUS)).toBeFalsy(),l.deleteProgram(t),l.deleteShader(e)}),await c(`program with no vertex shader should fail to link`,async()=>{let e=_(l,l.FRAGMENT_SHADER,f),t=l.createProgram();l.attachShader(t,e),l.linkProgram(t),s(l.getProgramParameter(t,l.LINK_STATUS)).toBeFalsy(),l.deleteProgram(t),l.deleteShader(e)}),await c(`using a valid program should succeed`,async()=>{let e=v(l,d,f,[[`aVertex`,0],[`aColor`,1]]);l.useProgram(e),s(l.getError()).toBe(l.NO_ERROR),l.useProgram(null),l.deleteProgram(e)}),await c(`using an invalid (unlinked) program should generate INVALID_OPERATION`,async()=>{let e=_(l,l.VERTEX_SHADER,d),t=l.createProgram();l.attachShader(t,e),l.linkProgram(t),l.useProgram(t),s(l.getError()).toBe(l.INVALID_OPERATION),l.deleteProgram(t),l.deleteShader(e)}),await c(`drawing with null program generates INVALID_OPERATION`,async()=>{let n=v(l,u,p,[[`a_position`,0]]),r=t(l,2,2),i=l.createBuffer();l.bindBuffer(l.ARRAY_BUFFER,i),l.bufferData(l.ARRAY_BUFFER,new Float32Array([0,0,1,0,0,1]),l.STATIC_DRAW),l.vertexAttribPointer(0,2,l.FLOAT,!1,0,0),l.enableVertexAttribArray(0),l.useProgram(null),l.drawArrays(l.TRIANGLES,0,3),s(l.getError()).toBe(l.INVALID_OPERATION),l.disableVertexAttribArray(0),l.deleteBuffer(i),e(l,r),l.deleteProgram(n)})}),await o(`conformance/programs/program-test: deleteProgram / deleteShader`,async()=>{a(async()=>{b.make_current()}),await c(`deleting the current program does not affect the current rendering state`,async()=>{let r=v(l,u,p,[[`a_position`,0]]);l.useProgram(r),l.deleteProgram(r);let i=t(l,2,2),a=y(l,r,0);s(l.getError()).toBe(l.NO_ERROR),s(n(a,[255,0,0,255])).toBeTruthy(),e(l,i),l.useProgram(null)}),await c(`unattached deleted shader is invalid immediately`,async()=>{let e=_(l,l.FRAGMENT_SHADER,p);l.deleteShader(e),l.compileShader(e),s(l.getError()).toBe(l.INVALID_VALUE)}),await c(`attached deleted shader is still valid while attached`,async()=>{let e=_(l,l.VERTEX_SHADER,u),t=_(l,l.FRAGMENT_SHADER,p),n=v(l,u,p,[[`a_position`,0]]);l.attachShader(n,e),l.getError();let r=_(l,l.FRAGMENT_SHADER,m),i=l.createProgram();l.attachShader(i,e),l.attachShader(i,r),l.deleteShader(r),l.compileShader(r),s(l.getShaderParameter(r,l.COMPILE_STATUS)).toBeTruthy(),l.deleteProgram(n),l.deleteProgram(i),l.deleteShader(e),l.deleteShader(t)})}),await o(`conformance/programs/program-test: relink updates rendering`,async()=>{a(async()=>{b.make_current()}),await c(`relinking with a new fragment shader updates the program output`,async()=>{let r=t(l,2,2),i=_(l,l.VERTEX_SHADER,u),a=_(l,l.FRAGMENT_SHADER,p),o=l.createProgram();l.attachShader(o,i),l.attachShader(o,a),l.bindAttribLocation(o,0,`a_position`),l.linkProgram(o),l.useProgram(o),s(l.getProgramParameter(o,l.LINK_STATUS)).toBeTruthy(),l.clear(l.COLOR_BUFFER_BIT);let c=y(l,o,0);s(n(c,[255,0,0,255])).toBeTruthy(),l.shaderSource(a,m),l.compileShader(a),l.linkProgram(o),s(l.getProgramParameter(o,l.LINK_STATUS)).toBeTruthy(),l.clear(l.COLOR_BUFFER_BIT),c=y(l,o,0),s(n(c,[0,255,0,255])).toBeTruthy(),e(l,r),l.deleteProgram(o),l.deleteShader(i),l.deleteShader(a)}),await c(`relinking clears uniforms — output should be transparent black`,async()=>{let r=t(l,2,2),i=_(l,l.VERTEX_SHADER,u),a=_(l,l.FRAGMENT_SHADER,`precision mediump float; uniform vec4 u_color; void main() { gl_FragColor = u_color; }`),o=l.createProgram();l.attachShader(o,i),l.attachShader(o,a),l.bindAttribLocation(o,0,`a_position`),l.linkProgram(o),l.useProgram(o);let c=l.getUniformLocation(o,`u_color`);l.uniform4f(c,1,0,0,1),l.clear(l.COLOR_BUFFER_BIT);let d=y(l,o,0);s(n(d,[255,0,0,255])).toBeTruthy(),l.linkProgram(o),l.clear(l.COLOR_BUFFER_BIT),d=y(l,o,0),s(n(d,[0,0,0,0])).toBeTruthy(),e(l,r),l.deleteProgram(o),l.deleteShader(i),l.deleteShader(a)})}),await o(`conformance/programs/gl-shader-test`,async()=>{a(async()=>{b.make_current()}),await c(`creating a GEOMETRY shader should return null`,async()=>{s(l.createShader(36313)).toBeNull()}),await c(`deferred compilation: shader linked with source set after first compile`,async()=>{let r=t(l,2,2),i=_(l,l.VERTEX_SHADER,`attribute vec4 vPosition; void main() { gl_Position = vPosition; }`),a=_(l,l.FRAGMENT_SHADER,m);l.shaderSource(a,p);let o=l.createProgram();l.attachShader(o,i),l.attachShader(o,a),l.bindAttribLocation(o,0,`vPosition`),l.linkProgram(o),l.useProgram(o),l.clear(l.COLOR_BUFFER_BIT),s(n(y(l,o,0),[255,0,0,255])).toBeTruthy(),e(l,r),l.deleteProgram(o),l.deleteShader(i),l.deleteShader(a)})}),await o(`conformance/programs/get-active-test: getActiveAttrib`,async()=>{a(async()=>{b.make_current()}),await c(`getActiveAttrib returns correct info for standard attribs`,async()=>{let e=v(l,h,g);s(l.getProgramParameter(e,l.LINK_STATUS)).toBeTruthy();let t=l.getProgramParameter(e,l.ACTIVE_ATTRIBUTES);s(t).toBe(2);let n=[];for(let r=0;r<t;r++){let t=l.getActiveAttrib(e,r);s(t).not.toBeNull(),n.push(t)}let r=n.map(e=>e.name).sort();s(r).toContain(`a_vertex`),s(r).toContain(`a_normal`);let i=n.find(e=>e.name===`a_vertex`);s(i.type).toBe(l.FLOAT_VEC4),s(i.size).toBe(1);let a=n.find(e=>e.name===`a_normal`);s(a.type).toBe(l.FLOAT_VEC3),s(a.size).toBe(1),l.deleteProgram(e)}),await c(`getActiveAttrib with out-of-range index returns null and INVALID_VALUE`,async()=>{let e=v(l,h,g),t=l.getProgramParameter(e,l.ACTIVE_ATTRIBUTES);s(l.getActiveAttrib(e,t)).toBeNull(),s(l.getError()).toBe(l.INVALID_VALUE),l.deleteProgram(e)}),await c(`getActiveAttrib with null program throws`,async()=>{s(()=>l.getActiveAttrib(null,0)).toThrow()})}),await o(`conformance/programs/get-active-test: getActiveUniform`,async()=>{a(async()=>{b.make_current()}),await c(`getActiveUniform returns correct info for u_modelViewProjMatrix`,async()=>{let e=v(l,h,g),t=l.getProgramParameter(e,l.ACTIVE_UNIFORMS);s(t).toBeGreaterThan(0);let n=null;for(let r=0;r<t;r++){let t=l.getActiveUniform(e,r);t?.name===`u_modelViewProjMatrix`&&(n=t)}s(n).not.toBeNull(),s(n.type).toBe(l.FLOAT_MAT4),s(n.size).toBe(1),l.deleteProgram(e)}),await c(`getActiveUniform with out-of-range index returns null and INVALID_VALUE`,async()=>{let e=v(l,h,g),t=l.getProgramParameter(e,l.ACTIVE_UNIFORMS);s(l.getActiveUniform(e,t)).toBeNull(),s(l.getError()).toBe(l.INVALID_VALUE),l.deleteProgram(e)}),await c(`getActiveUniform with null program throws`,async()=>{s(()=>l.getActiveUniform(null,0)).toThrow()})}),x.destroy()})};export{b as default};
|
|
7
|
+
void main() { gl_FragColor = vec4(1.0); }`;function compileShader(e,t,n){let r=e.createShader(t);return e.shaderSource(r,n),e.compileShader(r),r}function linkProgram(e,t,n,r){let i=compileShader(e,e.VERTEX_SHADER,t),a=compileShader(e,e.FRAGMENT_SHADER,n),o=e.createProgram();if(e.attachShader(o,i),e.attachShader(o,a),r)for(let[t,n]of r)e.bindAttribLocation(o,n,t);return e.linkProgram(o),o}function drawFullscreenAndRead(e,t,n=`a_position`){let r=typeof n==`string`?e.getAttribLocation(t,n):n,a=e.createBuffer();return e.bindBuffer(e.ARRAY_BUFFER,a),e.bufferData(e.ARRAY_BUFFER,new Float32Array([-4,-4,4,-4,0,4]),e.STREAM_DRAW),e.enableVertexAttribArray(r),e.vertexAttribPointer(r,2,e.FLOAT,!1,0,0),e.drawArrays(e.TRIANGLES,0,3),e.disableVertexAttribArray(r),e.deleteBuffer(a),i(e,0,0)}var v=e(async()=>{await u(`Display`,async()=>{let e=a();if(!e){console.warn(`WebGL context not available — skipping conformance/programs tests`);return}let{gl:i,glArea:u,win:v}=e;u.make_current(),await s(`conformance/programs/program-test: compileShader`,async()=>{o(async()=>{u.make_current()}),await l(`good vertex shader should compile`,async()=>{let e=compileShader(i,i.VERTEX_SHADER,`attribute vec4 aVertex; void main() { gl_Position = aVertex; }`);c(i.getShaderParameter(e,i.COMPILE_STATUS)).toBeTruthy(),i.deleteShader(e)}),await l(`good fragment shader should compile`,async()=>{let e=compileShader(i,i.FRAGMENT_SHADER,`precision mediump float; void main() { gl_FragColor = vec4(1.0); }`);c(i.getShaderParameter(e,i.COMPILE_STATUS)).toBeTruthy(),i.deleteShader(e)}),await l(`getShaderParameter with desktop-only INFO_LOG_LENGTH returns null and INVALID_ENUM`,async()=>{let e=compileShader(i,i.VERTEX_SHADER,`attribute vec4 v; void main() { gl_Position = v; }`);c(i.getShaderParameter(e,35716)).toBeNull(),c(i.getError()).toBe(i.INVALID_ENUM),i.deleteShader(e)})}),await s(`conformance/programs/program-test: attachShader / detachShader`,async()=>{o(async()=>{u.make_current()}),await l(`attaching a vertex shader succeeds`,async()=>{let e=compileShader(i,i.VERTEX_SHADER,f),t=i.createProgram();i.attachShader(t,e),c(i.getError()).toBe(i.NO_ERROR),i.deleteProgram(t),i.deleteShader(e)}),await l(`attaching the same shader twice generates INVALID_OPERATION`,async()=>{let e=compileShader(i,i.VERTEX_SHADER,f),t=i.createProgram();i.attachShader(t,e),i.getError(),i.attachShader(t,e),c(i.getError()).toBe(i.INVALID_OPERATION),i.deleteProgram(t),i.deleteShader(e)}),await l(`attaching two vertex shaders to same program generates INVALID_OPERATION`,async()=>{let e=compileShader(i,i.VERTEX_SHADER,f),t=compileShader(i,i.VERTEX_SHADER,`attribute vec4 v; void main() { gl_Position = v * 0.5; }`),n=i.createProgram();i.attachShader(n,e),i.getError(),i.attachShader(n,t),c(i.getError()).toBe(i.INVALID_OPERATION),i.deleteProgram(n),i.deleteShader(e),i.deleteShader(t)}),await l(`detaching an attached shader succeeds`,async()=>{let e=compileShader(i,i.VERTEX_SHADER,f),t=i.createProgram();i.attachShader(t,e),i.detachShader(t,e),c(i.getError()).toBe(i.NO_ERROR),i.deleteProgram(t),i.deleteShader(e)}),await l(`detaching a non-attached shader generates INVALID_OPERATION`,async()=>{let e=compileShader(i,i.VERTEX_SHADER,f),t=compileShader(i,i.FRAGMENT_SHADER,p),n=i.createProgram();i.attachShader(n,t),i.getError(),i.detachShader(n,e),c(i.getError()).toBe(i.INVALID_OPERATION),i.deleteProgram(n),i.deleteShader(e),i.deleteShader(t)})}),await s(`conformance/programs/program-test: getAttachedShaders`,async()=>{o(async()=>{u.make_current()}),await l(`empty program returns empty list`,async()=>{let e=i.createProgram();c(i.getAttachedShaders(e)?.length).toBe(0),i.deleteProgram(e)}),await l(`attached shaders appear in getAttachedShaders`,async()=>{let e=compileShader(i,i.VERTEX_SHADER,f),t=compileShader(i,i.FRAGMENT_SHADER,p),n=i.createProgram();i.attachShader(n,e),i.attachShader(n,t);let r=i.getAttachedShaders(n);c(r.length).toBe(2),c(r.includes(e)).toBeTruthy(),c(r.includes(t)).toBeTruthy(),i.deleteProgram(n),i.deleteShader(e),i.deleteShader(t)}),await l(`detached shaders are removed from getAttachedShaders`,async()=>{let e=compileShader(i,i.VERTEX_SHADER,f),t=compileShader(i,i.FRAGMENT_SHADER,p),n=i.createProgram();i.attachShader(n,e),i.attachShader(n,t),i.detachShader(n,e);let r=i.getAttachedShaders(n);c(r.length).toBe(1),c(r.includes(t)).toBeTruthy(),i.deleteProgram(n),i.deleteShader(e),i.deleteShader(t)})}),await s(`conformance/programs/program-test: linkProgram / useProgram`,async()=>{o(async()=>{u.make_current()}),await l(`valid program should link`,async()=>{let e=linkProgram(i,f,p,[[`aVertex`,0],[`aColor`,1]]);c(i.getProgramParameter(e,i.LINK_STATUS)).toBeTruthy(),c(typeof i.getProgramInfoLog(e)).toBe(`string`),i.deleteProgram(e)}),await l(`program with no fragment shader should fail to link`,async()=>{let e=compileShader(i,i.VERTEX_SHADER,f),t=i.createProgram();i.attachShader(t,e),i.linkProgram(t),c(i.getProgramParameter(t,i.LINK_STATUS)).toBeFalsy(),i.deleteProgram(t),i.deleteShader(e)}),await l(`program with no vertex shader should fail to link`,async()=>{let e=compileShader(i,i.FRAGMENT_SHADER,p),t=i.createProgram();i.attachShader(t,e),i.linkProgram(t),c(i.getProgramParameter(t,i.LINK_STATUS)).toBeFalsy(),i.deleteProgram(t),i.deleteShader(e)}),await l(`using a valid program should succeed`,async()=>{let e=linkProgram(i,f,p,[[`aVertex`,0],[`aColor`,1]]);i.useProgram(e),c(i.getError()).toBe(i.NO_ERROR),i.useProgram(null),i.deleteProgram(e)}),await l(`using an invalid (unlinked) program should generate INVALID_OPERATION`,async()=>{let e=compileShader(i,i.VERTEX_SHADER,f),t=i.createProgram();i.attachShader(t,e),i.linkProgram(t),i.useProgram(t),c(i.getError()).toBe(i.INVALID_OPERATION),i.deleteProgram(t),i.deleteShader(e)}),await l(`drawing with null program generates INVALID_OPERATION`,async()=>{let e=linkProgram(i,d,m,[[`a_position`,0]]),r=n(i,2,2),a=i.createBuffer();i.bindBuffer(i.ARRAY_BUFFER,a),i.bufferData(i.ARRAY_BUFFER,new Float32Array([0,0,1,0,0,1]),i.STATIC_DRAW),i.vertexAttribPointer(0,2,i.FLOAT,!1,0,0),i.enableVertexAttribArray(0),i.useProgram(null),i.drawArrays(i.TRIANGLES,0,3),c(i.getError()).toBe(i.INVALID_OPERATION),i.disableVertexAttribArray(0),i.deleteBuffer(a),t(i,r),i.deleteProgram(e)})}),await s(`conformance/programs/program-test: deleteProgram / deleteShader`,async()=>{o(async()=>{u.make_current()}),await l(`deleting the current program does not affect the current rendering state`,async()=>{let e=linkProgram(i,d,m,[[`a_position`,0]]);i.useProgram(e),i.deleteProgram(e);let a=n(i,2,2),o=drawFullscreenAndRead(i,e,0);c(i.getError()).toBe(i.NO_ERROR),c(r(o,[255,0,0,255])).toBeTruthy(),t(i,a),i.useProgram(null)}),await l(`unattached deleted shader is invalid immediately`,async()=>{let e=compileShader(i,i.FRAGMENT_SHADER,m);i.deleteShader(e),i.compileShader(e),c(i.getError()).toBe(i.INVALID_VALUE)}),await l(`attached deleted shader is still valid while attached`,async()=>{let e=compileShader(i,i.VERTEX_SHADER,d),t=compileShader(i,i.FRAGMENT_SHADER,m),n=linkProgram(i,d,m,[[`a_position`,0]]);i.attachShader(n,e),i.getError();let r=compileShader(i,i.FRAGMENT_SHADER,h),a=i.createProgram();i.attachShader(a,e),i.attachShader(a,r),i.deleteShader(r),i.compileShader(r),c(i.getShaderParameter(r,i.COMPILE_STATUS)).toBeTruthy(),i.deleteProgram(n),i.deleteProgram(a),i.deleteShader(e),i.deleteShader(t)})}),await s(`conformance/programs/program-test: relink updates rendering`,async()=>{o(async()=>{u.make_current()}),await l(`relinking with a new fragment shader updates the program output`,async()=>{let e=n(i,2,2),a=compileShader(i,i.VERTEX_SHADER,d),o=compileShader(i,i.FRAGMENT_SHADER,m),s=i.createProgram();i.attachShader(s,a),i.attachShader(s,o),i.bindAttribLocation(s,0,`a_position`),i.linkProgram(s),i.useProgram(s),c(i.getProgramParameter(s,i.LINK_STATUS)).toBeTruthy(),i.clear(i.COLOR_BUFFER_BIT);let l=drawFullscreenAndRead(i,s,0);c(r(l,[255,0,0,255])).toBeTruthy(),i.shaderSource(o,h),i.compileShader(o),i.linkProgram(s),c(i.getProgramParameter(s,i.LINK_STATUS)).toBeTruthy(),i.clear(i.COLOR_BUFFER_BIT),l=drawFullscreenAndRead(i,s,0),c(r(l,[0,255,0,255])).toBeTruthy(),t(i,e),i.deleteProgram(s),i.deleteShader(a),i.deleteShader(o)}),await l(`relinking clears uniforms — output should be transparent black`,async()=>{let e=n(i,2,2),a=compileShader(i,i.VERTEX_SHADER,d),o=compileShader(i,i.FRAGMENT_SHADER,`precision mediump float; uniform vec4 u_color; void main() { gl_FragColor = u_color; }`),s=i.createProgram();i.attachShader(s,a),i.attachShader(s,o),i.bindAttribLocation(s,0,`a_position`),i.linkProgram(s),i.useProgram(s);let l=i.getUniformLocation(s,`u_color`);i.uniform4f(l,1,0,0,1),i.clear(i.COLOR_BUFFER_BIT);let u=drawFullscreenAndRead(i,s,0);c(r(u,[255,0,0,255])).toBeTruthy(),i.linkProgram(s),i.clear(i.COLOR_BUFFER_BIT),u=drawFullscreenAndRead(i,s,0),c(r(u,[0,0,0,0])).toBeTruthy(),t(i,e),i.deleteProgram(s),i.deleteShader(a),i.deleteShader(o)})}),await s(`conformance/programs/gl-shader-test`,async()=>{o(async()=>{u.make_current()}),await l(`creating a GEOMETRY shader should return null`,async()=>{c(i.createShader(36313)).toBeNull()}),await l(`deferred compilation: shader linked with source set after first compile`,async()=>{let e=n(i,2,2),a=compileShader(i,i.VERTEX_SHADER,`attribute vec4 vPosition; void main() { gl_Position = vPosition; }`),o=compileShader(i,i.FRAGMENT_SHADER,h);i.shaderSource(o,m);let s=i.createProgram();i.attachShader(s,a),i.attachShader(s,o),i.bindAttribLocation(s,0,`vPosition`),i.linkProgram(s),i.useProgram(s),i.clear(i.COLOR_BUFFER_BIT),c(r(drawFullscreenAndRead(i,s,0),[255,0,0,255])).toBeTruthy(),t(i,e),i.deleteProgram(s),i.deleteShader(a),i.deleteShader(o)})}),await s(`conformance/programs/get-active-test: getActiveAttrib`,async()=>{o(async()=>{u.make_current()}),await l(`getActiveAttrib returns correct info for standard attribs`,async()=>{let e=linkProgram(i,g,_);c(i.getProgramParameter(e,i.LINK_STATUS)).toBeTruthy();let t=i.getProgramParameter(e,i.ACTIVE_ATTRIBUTES);c(t).toBe(2);let n=[];for(let r=0;r<t;r++){let t=i.getActiveAttrib(e,r);c(t).not.toBeNull(),n.push(t)}let r=n.map(e=>e.name).sort();c(r).toContain(`a_vertex`),c(r).toContain(`a_normal`);let a=n.find(e=>e.name===`a_vertex`);c(a.type).toBe(i.FLOAT_VEC4),c(a.size).toBe(1);let o=n.find(e=>e.name===`a_normal`);c(o.type).toBe(i.FLOAT_VEC3),c(o.size).toBe(1),i.deleteProgram(e)}),await l(`getActiveAttrib with out-of-range index returns null and INVALID_VALUE`,async()=>{let e=linkProgram(i,g,_),t=i.getProgramParameter(e,i.ACTIVE_ATTRIBUTES);c(i.getActiveAttrib(e,t)).toBeNull(),c(i.getError()).toBe(i.INVALID_VALUE),i.deleteProgram(e)}),await l(`getActiveAttrib with null program throws`,async()=>{c(()=>i.getActiveAttrib(null,0)).toThrow()})}),await s(`conformance/programs/get-active-test: getActiveUniform`,async()=>{o(async()=>{u.make_current()}),await l(`getActiveUniform returns correct info for u_modelViewProjMatrix`,async()=>{let e=linkProgram(i,g,_),t=i.getProgramParameter(e,i.ACTIVE_UNIFORMS);c(t).toBeGreaterThan(0);let n=null;for(let r=0;r<t;r++){let t=i.getActiveUniform(e,r);t?.name===`u_modelViewProjMatrix`&&(n=t)}c(n).not.toBeNull(),c(n.type).toBe(i.FLOAT_MAT4),c(n.size).toBe(1),i.deleteProgram(e)}),await l(`getActiveUniform with out-of-range index returns null and INVALID_VALUE`,async()=>{let e=linkProgram(i,g,_),t=i.getProgramParameter(e,i.ACTIVE_UNIFORMS);c(i.getActiveUniform(e,t)).toBeNull(),c(i.getError()).toBe(i.INVALID_VALUE),i.deleteProgram(e)}),await l(`getActiveUniform with null program throws`,async()=>{c(()=>i.getActiveUniform(null,0)).toThrow()})}),v.destroy()})},`default`);export{v as default};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{destroyTestFBO as
|
|
1
|
+
import{__name as e}from"../_virtual/_rolldown/runtime.js";import{destroyTestFBO as t,drawTriangle as n,makeProgram as r,makeTestFBO as i,pixelClose as a}from"../test-utils.js";import{createGLSetup as o}from"./setup.js";import{beforeEach as s,describe as c,expect as l,it as u,on as d}from"@gjsify/unit";const f=`
|
|
2
2
|
attribute vec2 position;
|
|
3
|
-
void main() { gl_Position = vec4(position, 0.0, 1.0); }`,
|
|
4
|
-
void main() { gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0); }`;var
|
|
3
|
+
void main() { gl_Position = vec4(position, 0.0, 1.0); }`,p=`
|
|
4
|
+
void main() { gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0); }`;var m=e(async()=>{await d(`Display`,async()=>{let e=o();if(!e){console.warn(`WebGL context not available — skipping conformance/rendering-basic tests`);return}let{gl:d,glArea:m}=e;m.make_current(),await c(`rendering-basic/clear-color`,async()=>{s(async()=>{m.make_current()});function testColor(e,n,r,a){let o=i(d,10,10);d.clearColor(e/255,n/255,r/255,a/255),d.clear(d.COLOR_BUFFER_BIT);let s=new Uint8Array(400);d.readPixels(0,0,10,10,d.RGBA,d.UNSIGNED_BYTE,s),t(d,o);for(let t=0;t<400;t+=4)if(s[t]!==e||s[t+1]!==n||s[t+2]!==r||s[t+3]!==a)return!1;return!0}await u(`clearColor black (0,0,0,0) fills all pixels`,async()=>{l(testColor(0,0,0,0)).toBe(!0)}),await u(`clearColor white (255,255,255,255) fills all pixels`,async()=>{l(testColor(255,255,255,255)).toBe(!0)}),await u(`clearColor green (0,255,0,255) fills all pixels`,async()=>{l(testColor(0,255,0,255)).toBe(!0)}),await u(`clearColor magenta (255,0,255,0) fills all pixels`,async()=>{l(testColor(255,0,255,0)).toBe(!0)})}),await c(`rendering-basic/simple-shader`,async()=>{s(async()=>{m.make_current()}),await u(`fullscreen green triangle covers every pixel`,async()=>{let e=i(d,50,50);d.clearColor(0,0,0,0),d.clear(d.COLOR_BUFFER_BIT);let o=r(d,f,p);d.useProgram(o),n(d);let s=new Uint8Array(2500*4);d.readPixels(0,0,50,50,d.RGBA,d.UNSIGNED_BYTE,s),t(d,e);let c=!0;for(let e=0;e<2500*4;e+=4)if(!a(s.subarray(e,e+4),[0,255,0,255])){c=!1;break}l(c).toBe(!0),l(d.getError()).toBe(d.NO_ERROR)})}),await c(`rendering-basic/draw-indexed`,async()=>{s(async()=>{m.make_current()}),await u(`drawElements covers every pixel with green`,async()=>{let e=i(d,50,50);d.clearColor(1,0,0,1),d.clear(d.COLOR_BUFFER_BIT);let n=r(d,f,p);d.useProgram(n);let o=d.createBuffer();d.bindBuffer(d.ARRAY_BUFFER,o),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 s=d.createBuffer();d.bindBuffer(d.ELEMENT_ARRAY_BUFFER,s),d.bufferData(d.ELEMENT_ARRAY_BUFFER,new Uint16Array([0,1,2,2,1,3]),d.STATIC_DRAW),d.drawElements(d.TRIANGLES,6,d.UNSIGNED_SHORT,0);let c=new Uint8Array(2500*4);d.readPixels(0,0,50,50,d.RGBA,d.UNSIGNED_BYTE,c),d.deleteBuffer(o),d.deleteBuffer(s),t(d,e);let u=!0;for(let e=0;e<2500*4;e+=4)if(!a(c.subarray(e,e+4),[0,255,0,255])){u=!1;break}l(u).toBe(!0),l(d.getError()).toBe(d.NO_ERROR)})})})},`default`);export{m as default};
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import{destroyTestFBO as
|
|
1
|
+
import{__name as e}from"../_virtual/_rolldown/runtime.js";import{destroyTestFBO as t,destroyTestFBOWithDepth as n,drawTriangle as r,makeProgram as i,makeTestFBO as a,makeTestFBOWithDepth as o,pixelClose as s}from"../test-utils.js";import{createGLSetup as c}from"./setup.js";import{beforeEach as l,describe as u,expect as d,it as f,on as p}from"@gjsify/unit";const m=`
|
|
2
2
|
precision mediump float;
|
|
3
3
|
attribute vec2 position;
|
|
4
|
-
void main() { gl_Position = vec4(position, 0.0, 1.0); }`,
|
|
4
|
+
void main() { gl_Position = vec4(position, 0.0, 1.0); }`,h=`
|
|
5
5
|
attribute vec2 position;
|
|
6
6
|
uniform float depth;
|
|
7
|
-
void main() { gl_Position = vec4(position, depth, 1.0); }`,
|
|
7
|
+
void main() { gl_Position = vec4(position, depth, 1.0); }`,g=`
|
|
8
8
|
precision mediump float;
|
|
9
9
|
uniform vec4 color;
|
|
10
|
-
void main() { gl_FragColor = color; }`;var
|
|
10
|
+
void main() { gl_FragColor = color; }`;var _=e(async()=>{await p(`Display`,async()=>{let e=c();if(!e){console.warn(`WebGL context not available — skipping conformance/rendering tests`);return}let{gl:p,glArea:_}=e;_.make_current(),await u(`rendering/blending`,async()=>{l(async()=>{_.make_current()});function runBlendTest(e){let n=a(p,2,2),o=`
|
|
11
11
|
precision mediump float;
|
|
12
|
-
void main() { gl_FragColor = vec4(${
|
|
12
|
+
void main() { gl_FragColor = vec4(${e.srcColor[0]},${e.srcColor[1]},${e.srcColor[2]},${e.srcColor[3]}); }`;p.clearColor(e.dstColor[0],e.dstColor[1],e.dstColor[2],e.dstColor[3]),p.clear(p.COLOR_BUFFER_BIT);let c=i(p,m,o);p.useProgram(c),p.enable(p.BLEND),p.blendEquation(e.equation),p.blendFunc(e.srcFactor,e.dstFactor),r(p),p.disable(p.BLEND);let l=new Uint8Array(16);p.readPixels(0,0,2,2,p.RGBA,p.UNSIGNED_BYTE,l),t(p,n);let u=e.expected.map(e=>Math.round(e*255));for(let e=0;e<16;e+=4)if(!s(l.subarray(e,e+4),u,4))return!1;return!0}await f(`FUNC_ADD ONE ONE: dst=[0.5,0.5,0.5,1] + src=[0.5,0.5,0.5,1] = [1,1,1,1]`,async()=>{d(runBlendTest({name:`ADD ONE ONE`,equation:p.FUNC_ADD,srcFactor:p.ONE,dstFactor:p.ONE,dstColor:[.5,.5,.5,1],srcColor:[.5,.5,.5,1],expected:[1,1,1,1]})).toBe(!0),d(p.getError()).toBe(p.NO_ERROR)}),await f(`FUNC_ADD ONE ZERO: dst=[0.5,0.5,0.5,0.5] + src=[0.2,0.2,0.2,1] = [0.2,0.2,0.2,1]`,async()=>{d(runBlendTest({name:`ADD ONE ZERO`,equation:p.FUNC_ADD,srcFactor:p.ONE,dstFactor:p.ZERO,dstColor:[.5,.5,.5,.5],srcColor:[.2,.2,.2,1],expected:[.2,.2,.2,1]})).toBe(!0),d(p.getError()).toBe(p.NO_ERROR)}),await f(`FUNC_ADD ZERO SRC_COLOR: dst=[0.8,0.8,0.8,1] * src=[0.5,0.5,0.5,0.5] = [0.4,0.4,0.4,0.5]`,async()=>{d(runBlendTest({name:`ADD ZERO SRC_COLOR`,equation:p.FUNC_ADD,srcFactor:p.ZERO,dstFactor:p.SRC_COLOR,dstColor:[.8,.8,.8,1],srcColor:[.5,.5,.5,.5],expected:[.4,.4,.4,.5]})).toBe(!0),d(p.getError()).toBe(p.NO_ERROR)}),await f(`FUNC_ADD DST_COLOR ZERO: dst=[0.8,0.8,0.8,1] src=[0.5,0.5,0.5,0.5] = [0.4,0.4,0.4,0.5]`,async()=>{d(runBlendTest({name:`ADD DST_COLOR ZERO`,equation:p.FUNC_ADD,srcFactor:p.DST_COLOR,dstFactor:p.ZERO,dstColor:[.8,.8,.8,1],srcColor:[.5,.5,.5,.5],expected:[.4,.4,.4,.5]})).toBe(!0),d(p.getError()).toBe(p.NO_ERROR)}),await f(`FUNC_ADD SRC_ALPHA ONE_MINUS_SRC_ALPHA: alpha=0.5 blend`,async()=>{d(runBlendTest({name:`ADD SRC_ALPHA ONE_MINUS_SRC_ALPHA`,equation:p.FUNC_ADD,srcFactor:p.SRC_ALPHA,dstFactor:p.ONE_MINUS_SRC_ALPHA,dstColor:[.5,0,.5,1],srcColor:[.5,1,0,.5],expected:[.5,.5,.25,.75]})).toBe(!0),d(p.getError()).toBe(p.NO_ERROR)})}),await u(`rendering/depth-buffer`,async()=>{l(async()=>{_.make_current()}),await f(`DEPTH_TEST NOTEQUAL: both passes render because depths differ`,async()=>{let e=o(p,50,50);p.clearColor(0,0,0,0),p.clearDepth(1),p.clear(p.COLOR_BUFFER_BIT|p.DEPTH_BUFFER_BIT),p.enable(p.DEPTH_TEST),p.depthFunc(p.NOTEQUAL);let t=i(p,h,g);p.useProgram(t),p.uniform1f(p.getUniformLocation(t,`depth`),0),p.uniform4f(p.getUniformLocation(t,`color`),1,0,0,1),r(p),p.uniform1f(p.getUniformLocation(t,`depth`),1),p.uniform4f(p.getUniformLocation(t,`color`),0,1,0,1),r(p),p.disable(p.DEPTH_TEST);let a=new Uint8Array(2500*4);p.readPixels(0,0,50,50,p.RGBA,p.UNSIGNED_BYTE,a),n(p,e);let c=!0;for(let e=0;e<2500*4;e+=4)if(!s(a.subarray(e,e+4),[0,255,0,255],3)){c=!1;break}d(c).toBe(!0),d(p.getError()).toBe(p.NO_ERROR)}),await f(`DEPTH_TEST LESS: closer triangle overwrites farther`,async()=>{let e=o(p,20,20);p.clearColor(0,0,0,0),p.clearDepth(1),p.clear(p.COLOR_BUFFER_BIT|p.DEPTH_BUFFER_BIT),p.enable(p.DEPTH_TEST),p.depthFunc(p.LESS);let t=i(p,h,g);p.useProgram(t),p.uniform1f(p.getUniformLocation(t,`depth`),.5),p.uniform4f(p.getUniformLocation(t,`color`),0,0,1,1),r(p),p.uniform1f(p.getUniformLocation(t,`depth`),.25),p.uniform4f(p.getUniformLocation(t,`color`),0,1,0,1),r(p),p.uniform1f(p.getUniformLocation(t,`depth`),.75),p.uniform4f(p.getUniformLocation(t,`color`),1,0,0,1),r(p),p.disable(p.DEPTH_TEST);let a=new Uint8Array(400*4);p.readPixels(0,0,20,20,p.RGBA,p.UNSIGNED_BYTE,a),n(p,e);let c=!0;for(let e=0;e<400*4;e+=4)if(!s(a.subarray(e,e+4),[0,255,0,255],3)){c=!1;break}d(c).toBe(!0),d(p.getError()).toBe(p.NO_ERROR)}),await f(`depthMask(false) prevents depth writes`,async()=>{let e=o(p,10,10);p.clearColor(0,0,0,0),p.clearDepth(1),p.clear(p.COLOR_BUFFER_BIT|p.DEPTH_BUFFER_BIT),p.enable(p.DEPTH_TEST),p.depthFunc(p.LESS);let t=i(p,h,g);p.useProgram(t),p.depthMask(!1),p.uniform1f(p.getUniformLocation(t,`depth`),.5),p.uniform4f(p.getUniformLocation(t,`color`),1,0,0,1),r(p),p.depthMask(!0),p.uniform1f(p.getUniformLocation(t,`depth`),.75),p.uniform4f(p.getUniformLocation(t,`color`),0,1,0,1),r(p),p.disable(p.DEPTH_TEST);let a=new Uint8Array(400);p.readPixels(0,0,10,10,p.RGBA,p.UNSIGNED_BYTE,a),n(p,e);let c=!0;for(let e=0;e<400;e+=4)if(!s(a.subarray(e,e+4),[0,255,0,255],3)){c=!1;break}d(c).toBe(!0),d(p.getError()).toBe(p.NO_ERROR)})}),await u(`rendering/scissor`,async()=>{l(async()=>{_.make_current()}),await f(`scissor test clips rendering to specified rectangle`,async()=>{let e=a(p,20,20);p.clearColor(1,0,0,1),p.clear(p.COLOR_BUFFER_BIT),p.enable(p.SCISSOR_TEST),p.scissor(0,0,20/2,20),p.clearColor(0,1,0,1),p.clear(p.COLOR_BUFFER_BIT),p.disable(p.SCISSOR_TEST);let n=new Uint8Array(400*4);p.readPixels(0,0,20,20,p.RGBA,p.UNSIGNED_BYTE,n),t(p,e);let r=!0;for(let e=0;e<20;e++){for(let t=0;t<20;t++){let i=(e*20+t)*4,a=n.subarray(i,i+4);if(t<20/2){if(!s(a,[0,255,0,255])){r=!1;break}}else if(!s(a,[255,0,0,255])){r=!1;break}}if(!r)break}d(r).toBe(!0),d(p.getError()).toBe(p.NO_ERROR)})}),await u(`rendering/mapbox-ansis`,async()=>{l(async()=>{_.make_current()}),await f(`depthRange: green at range(0,0.1) survives blue at range(0.9,1) with LEQUAL`,async()=>{let e=p.createFramebuffer(),t=p.createTexture();p.bindTexture(p.TEXTURE_2D,t),p.texImage2D(p.TEXTURE_2D,0,p.RGBA,4,4,0,p.RGBA,p.UNSIGNED_BYTE,null),p.texParameteri(p.TEXTURE_2D,p.TEXTURE_MIN_FILTER,p.NEAREST),p.texParameteri(p.TEXTURE_2D,p.TEXTURE_MAG_FILTER,p.NEAREST),p.bindTexture(p.TEXTURE_2D,null);let n=p.createRenderbuffer();p.bindRenderbuffer(p.RENDERBUFFER,n),p.renderbufferStorage(p.RENDERBUFFER,p.DEPTH_COMPONENT16,4,4),p.bindRenderbuffer(p.RENDERBUFFER,null),p.bindFramebuffer(p.FRAMEBUFFER,e),p.framebufferTexture2D(p.FRAMEBUFFER,p.COLOR_ATTACHMENT0,p.TEXTURE_2D,t,0),p.framebufferRenderbuffer(p.FRAMEBUFFER,p.DEPTH_ATTACHMENT,p.RENDERBUFFER,n),p.viewport(0,0,4,4),p.clearColor(1,0,0,1),p.clearDepth(1),p.clear(p.COLOR_BUFFER_BIT|p.DEPTH_BUFFER_BIT),p.enable(p.DEPTH_TEST),p.depthFunc(p.LEQUAL);let r=i(p,`
|
|
13
13
|
precision mediump float;
|
|
14
14
|
uniform float u_z;
|
|
15
15
|
attribute vec2 a_position;
|
|
16
16
|
void main() { gl_Position = vec4(a_position, u_z, 1.0); }`,`
|
|
17
17
|
precision mediump float;
|
|
18
18
|
uniform vec4 u_color;
|
|
19
|
-
void main() { gl_FragColor = u_color; }`);
|
|
19
|
+
void main() { gl_FragColor = u_color; }`);p.useProgram(r);let a=p.createBuffer();p.bindBuffer(p.ARRAY_BUFFER,a),p.bufferData(p.ARRAY_BUFFER,new Float32Array([-1,-1,1,-1,-1,1,-1,1,1,-1,1,1]),p.STATIC_DRAW);let o=p.getAttribLocation(r,`a_position`);p.enableVertexAttribArray(o),p.vertexAttribPointer(o,2,p.FLOAT,!1,0,0);let s=p.getUniformLocation(r,`u_color`),c=p.getUniformLocation(r,`u_z`);p.uniform1f(c,.5),p.uniform4fv(s,[0,1,0,1]),p.depthRange(0,.1),p.drawArrays(p.TRIANGLES,0,6),p.uniform1f(c,.5),p.uniform4fv(s,[0,0,1,1]),p.depthRange(.9,1),p.drawArrays(p.TRIANGLES,0,6),p.depthRange(0,1),p.disable(p.DEPTH_TEST);let l=new Uint8Array(64);p.readPixels(0,0,4,4,p.RGBA,p.UNSIGNED_BYTE,l),p.bindBuffer(p.ARRAY_BUFFER,null),p.deleteBuffer(a),p.bindFramebuffer(p.FRAMEBUFFER,e),p.framebufferTexture2D(p.FRAMEBUFFER,p.COLOR_ATTACHMENT0,p.TEXTURE_2D,null,0),p.framebufferRenderbuffer(p.FRAMEBUFFER,p.DEPTH_ATTACHMENT,p.RENDERBUFFER,null),p.bindFramebuffer(p.FRAMEBUFFER,null),p.deleteTexture(t),p.deleteRenderbuffer(n),p.deleteFramebuffer(e),d(p.getError()).toBe(p.NO_ERROR);let u=!0;for(let e=0;e<64;e+=4)if(l[e]!==0||l[e+1]!==255||l[e+2]!==0||l[e+3]!==255){u=!1;break}d(u).toBe(!0)})}),await u(`rendering/viewport`,async()=>{l(async()=>{_.make_current()}),await f(`viewport restricts rendering region`,async()=>{let e=a(p,20,20);p.clearColor(1,0,0,1),p.clear(p.COLOR_BUFFER_BIT),p.viewport(0,0,10,20/2);let n=i(p,m,`precision mediump float; void main() { gl_FragColor = vec4(0,1,0,1); }`);p.useProgram(n),r(p),p.viewport(0,0,20,20);let o=new Uint8Array(400*4);p.readPixels(0,0,20,20,p.RGBA,p.UNSIGNED_BYTE,o),t(p,e);let c=!0;for(let e=0;e<20;e++){for(let t=0;t<20;t++){let n=(e*20+t)*4,r=o.subarray(n,n+4);if(t<10&&e<20/2){if(!s(r,[0,255,0,255])){c=!1;break}}else if(!s(r,[255,0,0,255])){c=!1;break}}if(!c)break}d(c).toBe(!0),d(p.getError()).toBe(p.NO_ERROR)}),await f(`getParameter(VIEWPORT) returns current viewport`,async()=>{let e=a(p,16,16);p.viewport(2,3,10,12);let n=p.getParameter(p.VIEWPORT);d(n[0]).toBe(2),d(n[1]).toBe(3),d(n[2]).toBe(10),d(n[3]).toBe(12),p.viewport(0,0,16,16),t(p,e),d(p.getError()).toBe(p.NO_ERROR)})})})},`default`);export{_ as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{WebGLBridge as e}from"@gjsify/webgl";import t from"@girs/glib-2.0";import n from"@girs/gtk-4.0";function
|
|
1
|
+
import"../_virtual/_rolldown/runtime.js";import{WebGLBridge as e}from"@gjsify/webgl";import t from"@girs/glib-2.0";import n from"@girs/gtk-4.0";function createGLSetup(){n.init();let r=null,i=new t.MainLoop(null,!1),a=new n.Window({});a.set_default_size(200,200);let o=new e;o.onReady((e,t)=>{try{let n=t,i=null;try{i=e.getContext(`webgl2`)}catch{}r={gl:n,gl2:i,glArea:o,win:a}}finally{i.quit()}}),a.set_child(o),a.present();let s=t.timeout_add(t.PRIORITY_DEFAULT,1e4,()=>(i.quit(),t.SOURCE_REMOVE));return i.run(),t.source_remove(s),r}export{createGLSetup};
|
|
@@ -1 +1 @@
|
|
|
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};
|
|
1
|
+
import{__name as e}from"../_virtual/_rolldown/runtime.js";import{makeProgram as t}from"../test-utils.js";import{createGLSetup as n}from"./setup.js";import{beforeEach as r,describe as i,expect as a,it as o,on as s}from"@gjsify/unit";function arrClose(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=e(async()=>{await s(`Display`,async()=>{let e=n();if(!e){console.warn(`WebGL context not available — skipping conformance/state tests`);return}let{gl:s,glArea:c}=e;c.make_current(),await i(`conformance/state/gl-getstring`,async()=>{r(async()=>{c.make_current()}),await o(`VERSION starts with "WebGL 1.0"`,async()=>{let e=s.getParameter(s.VERSION);a(typeof e).toBe(`string`),a(e.startsWith(`WebGL 1.0`)).toBe(!0)}),await o(`SHADING_LANGUAGE_VERSION starts with "WebGL GLSL ES 1.0"`,async()=>{let e=s.getParameter(s.SHADING_LANGUAGE_VERSION);a(typeof e).toBe(`string`),a(e.startsWith(`WebGL GLSL ES 1.0`)).toBe(!0)}),await o(`VENDOR is a string (may be empty on some drivers)`,async()=>{a(typeof s.getParameter(s.VENDOR)).toBe(`string`)}),await o(`RENDERER is a non-empty string`,async()=>{let e=s.getParameter(s.RENDERER);a(typeof e).toBe(`string`),a(e.length>0).toBe(!0)})}),await i(`conformance/state/gl-initial-state — blend`,async()=>{r(async()=>{c.make_current()}),await o(`BLEND_SRC_RGB initial value is ONE`,async()=>{a(s.getParameter(s.BLEND_SRC_RGB)).toBe(s.ONE)}),await o(`BLEND_SRC_ALPHA initial value is ONE`,async()=>{a(s.getParameter(s.BLEND_SRC_ALPHA)).toBe(s.ONE)}),await o(`BLEND_DST_RGB initial value is ZERO`,async()=>{a(s.getParameter(s.BLEND_DST_RGB)).toBe(s.ZERO)}),await o(`BLEND_DST_ALPHA initial value is ZERO`,async()=>{a(s.getParameter(s.BLEND_DST_ALPHA)).toBe(s.ZERO)}),await o(`BLEND_EQUATION_RGB initial value is FUNC_ADD`,async()=>{a(s.getParameter(s.BLEND_EQUATION_RGB)).toBe(s.FUNC_ADD)}),await o(`BLEND_EQUATION_ALPHA initial value is FUNC_ADD`,async()=>{a(s.getParameter(s.BLEND_EQUATION_ALPHA)).toBe(s.FUNC_ADD)}),await o(`BLEND_COLOR initial value is [0,0,0,0]`,async()=>{a(arrClose(s.getParameter(s.BLEND_COLOR),[0,0,0,0])).toBe(!0)})}),await i(`conformance/state/gl-get-calls — initial state`,async()=>{r(async()=>{c.make_current()}),await o(`ACTIVE_TEXTURE initial value is TEXTURE0`,async()=>{a(s.getParameter(s.ACTIVE_TEXTURE)).toBe(s.TEXTURE0)}),await o(`ARRAY_BUFFER_BINDING initial value is null`,async()=>{a(s.getParameter(s.ARRAY_BUFFER_BINDING)).toBeNull()}),await o(`ELEMENT_ARRAY_BUFFER_BINDING initial value is null`,async()=>{a(s.getParameter(s.ELEMENT_ARRAY_BUFFER_BINDING)).toBeNull()}),await o(`BLEND initial value is false`,async()=>{a(s.getParameter(s.BLEND)).toBe(!1)}),await o(`COLOR_CLEAR_VALUE initial value is [0,0,0,0]`,async()=>{a(arrClose(s.getParameter(s.COLOR_CLEAR_VALUE),[0,0,0,0])).toBe(!0)}),await o(`COLOR_WRITEMASK initial value is [true,true,true,true]`,async()=>{let e=s.getParameter(s.COLOR_WRITEMASK);a(e[0]).toBe(!0),a(e[1]).toBe(!0),a(e[2]).toBe(!0),a(e[3]).toBe(!0)}),await o(`CULL_FACE initial value is false`,async()=>{a(s.getParameter(s.CULL_FACE)).toBe(!1)}),await o(`CULL_FACE_MODE initial value is BACK`,async()=>{a(s.getParameter(s.CULL_FACE_MODE)).toBe(s.BACK)}),await o(`CURRENT_PROGRAM initial value is null`,async()=>{a(s.getParameter(s.CURRENT_PROGRAM)).toBeNull()}),await o(`DEPTH_CLEAR_VALUE initial value is 1`,async()=>{a(s.getParameter(s.DEPTH_CLEAR_VALUE)).toBe(1)}),await o(`DEPTH_FUNC initial value is LESS`,async()=>{a(s.getParameter(s.DEPTH_FUNC)).toBe(s.LESS)}),await o(`DEPTH_RANGE initial value is [0, 1]`,async()=>{a(arrClose(s.getParameter(s.DEPTH_RANGE),[0,1])).toBe(!0)}),await o(`DEPTH_TEST initial value is false`,async()=>{a(s.getParameter(s.DEPTH_TEST)).toBe(!1)}),await o(`DEPTH_WRITEMASK initial value is true`,async()=>{a(s.getParameter(s.DEPTH_WRITEMASK)).toBe(!0)}),await o(`DITHER initial value is true`,async()=>{a(s.getParameter(s.DITHER)).toBe(!0)}),await o(`FRONT_FACE initial value is CCW`,async()=>{a(s.getParameter(s.FRONT_FACE)).toBe(s.CCW)}),await o(`GENERATE_MIPMAP_HINT initial value is DONT_CARE`,async()=>{a(s.getParameter(s.GENERATE_MIPMAP_HINT)).toBe(s.DONT_CARE)}),await o(`LINE_WIDTH initial value is 1`,async()=>{a(s.getParameter(s.LINE_WIDTH)).toBe(1)}),await o(`PACK_ALIGNMENT initial value is 4`,async()=>{a(s.getParameter(s.PACK_ALIGNMENT)).toBe(4)}),await o(`POLYGON_OFFSET_FACTOR initial value is 0`,async()=>{a(s.getParameter(s.POLYGON_OFFSET_FACTOR)).toBe(0)}),await o(`POLYGON_OFFSET_FILL initial value is false`,async()=>{a(s.getParameter(s.POLYGON_OFFSET_FILL)).toBe(!1)}),await o(`POLYGON_OFFSET_UNITS initial value is 0`,async()=>{a(s.getParameter(s.POLYGON_OFFSET_UNITS)).toBe(0)}),await o(`RENDERBUFFER_BINDING initial value is null`,async()=>{a(s.getParameter(s.RENDERBUFFER_BINDING)).toBeNull()}),await o(`SAMPLE_COVERAGE_INVERT initial value is false`,async()=>{a(s.getParameter(s.SAMPLE_COVERAGE_INVERT)).toBe(!1)}),await o(`SAMPLE_COVERAGE_VALUE initial value is 1`,async()=>{a(s.getParameter(s.SAMPLE_COVERAGE_VALUE)).toBe(1)}),await o(`SCISSOR_TEST initial value is false`,async()=>{a(s.getParameter(s.SCISSOR_TEST)).toBe(!1)}),await o(`STENCIL_CLEAR_VALUE initial value is 0`,async()=>{a(s.getParameter(s.STENCIL_CLEAR_VALUE)).toBe(0)}),await o(`STENCIL_FAIL initial value is KEEP`,async()=>{a(s.getParameter(s.STENCIL_FAIL)).toBe(s.KEEP)}),await o(`STENCIL_FUNC initial value is ALWAYS`,async()=>{a(s.getParameter(s.STENCIL_FUNC)).toBe(s.ALWAYS)}),await o(`STENCIL_BACK_FUNC initial value is ALWAYS`,async()=>{a(s.getParameter(s.STENCIL_BACK_FUNC)).toBe(s.ALWAYS)}),await o(`STENCIL_REF initial value is 0`,async()=>{a(s.getParameter(s.STENCIL_REF)).toBe(0)}),await o(`STENCIL_TEST initial value is false`,async()=>{a(s.getParameter(s.STENCIL_TEST)).toBe(!1)}),await o(`TEXTURE_BINDING_2D initial value is null`,async()=>{a(s.getParameter(s.TEXTURE_BINDING_2D)).toBeNull()}),await o(`TEXTURE_BINDING_CUBE_MAP initial value is null`,async()=>{a(s.getParameter(s.TEXTURE_BINDING_CUBE_MAP)).toBeNull()}),await o(`UNPACK_ALIGNMENT initial value is 4`,async()=>{a(s.getParameter(s.UNPACK_ALIGNMENT)).toBe(4)}),await o(`UNPACK_FLIP_Y_WEBGL initial value is false`,async()=>{a(s.getParameter(s.UNPACK_FLIP_Y_WEBGL)).toBe(!1)}),await o(`UNPACK_PREMULTIPLY_ALPHA_WEBGL initial value is false`,async()=>{a(s.getParameter(s.UNPACK_PREMULTIPLY_ALPHA_WEBGL)).toBe(!1)}),await o(`MAX_TEXTURE_SIZE is at least 64`,async()=>{a(s.getParameter(s.MAX_TEXTURE_SIZE)>=64).toBe(!0)}),await o(`MAX_VERTEX_ATTRIBS is at least 8`,async()=>{a(s.getParameter(s.MAX_VERTEX_ATTRIBS)>=8).toBe(!0)}),await o(`MAX_COMBINED_TEXTURE_IMAGE_UNITS is at least 8`,async()=>{a(s.getParameter(s.MAX_COMBINED_TEXTURE_IMAGE_UNITS)>=8).toBe(!0)}),await o(`MAX_FRAGMENT_UNIFORM_VECTORS is at least 16`,async()=>{a(s.getParameter(s.MAX_FRAGMENT_UNIFORM_VECTORS)>=16).toBe(!0)}),await o(`MAX_VERTEX_UNIFORM_VECTORS is at least 128`,async()=>{a(s.getParameter(s.MAX_VERTEX_UNIFORM_VECTORS)>=128).toBe(!0)}),await o(`ALIASED_POINT_SIZE_RANGE is [>0, >=1]`,async()=>{let e=s.getParameter(s.ALIASED_POINT_SIZE_RANGE);a(e[0]>0).toBe(!0),a(e[1]>=1).toBe(!0)}),await o(`ALIASED_LINE_WIDTH_RANGE is [>0, >=1]`,async()=>{let e=s.getParameter(s.ALIASED_LINE_WIDTH_RANGE);a(e[0]>0).toBe(!0),a(e[1]>=1).toBe(!0)})}),await i(`conformance/state/gl-get-calls — state changes`,async()=>{r(async()=>{c.make_current()}),await o(`clearColor updates COLOR_CLEAR_VALUE`,async()=>{s.clearColor(.1,.2,.3,.4),a(arrClose(s.getParameter(s.COLOR_CLEAR_VALUE),[.1,.2,.3,.4])).toBe(!0),s.clearColor(0,0,0,0)}),await o(`activeTexture updates ACTIVE_TEXTURE`,async()=>{s.activeTexture(s.TEXTURE2),a(s.getParameter(s.ACTIVE_TEXTURE)).toBe(s.TEXTURE2),s.activeTexture(s.TEXTURE0)}),await o(`blendFunc updates BLEND_SRC_RGB and BLEND_DST_RGB`,async()=>{s.blendFunc(s.SRC_ALPHA,s.ONE_MINUS_SRC_ALPHA),a(s.getParameter(s.BLEND_SRC_RGB)).toBe(s.SRC_ALPHA),a(s.getParameter(s.BLEND_DST_RGB)).toBe(s.ONE_MINUS_SRC_ALPHA),s.blendFunc(s.ONE,s.ZERO)}),await o(`depthFunc updates DEPTH_FUNC`,async()=>{s.depthFunc(s.EQUAL),a(s.getParameter(s.DEPTH_FUNC)).toBe(s.EQUAL),s.depthFunc(s.LESS)}),await o(`useProgram updates CURRENT_PROGRAM`,async()=>{let e=t(s,`attribute vec4 p; void main() { gl_Position = p; }`,`void main() { gl_FragColor = vec4(1); }`);s.useProgram(e),a(s.getParameter(s.CURRENT_PROGRAM)).toBe(e),s.useProgram(null),a(s.getParameter(s.CURRENT_PROGRAM)).toBeNull()})}),await i(`conformance/state/gl-enable-enum-test`,async()=>{r(async()=>{c.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 o(`enable/disable/isEnabled round-trip for ${e}`,async()=>{s.getError();let t=s[e],n=s.isEnabled(t);s.enable(t),a(s.isEnabled(t)).toBe(!0),a(s.getError()).toBe(s.NO_ERROR),s.disable(t),a(s.isEnabled(t)).toBe(!1),a(s.getError()).toBe(s.NO_ERROR),n?s.enable(t):s.disable(t)});await o(`enable with invalid enum generates INVALID_ENUM`,async()=>{s.enable(3008),a(s.getError()).toBe(s.INVALID_ENUM)})}),await i(`conformance/state/gl-geterror`,async()=>{r(async()=>{c.make_current()}),await o(`enable(ALPHA_TEST desktop enum) generates INVALID_ENUM`,async()=>{s.enable(3008),a(s.getError()).toBe(s.INVALID_ENUM)}),await o(`viewport with negative width/height generates INVALID_VALUE`,async()=>{s.viewport(0,0,-1,-1),a(s.getError()).toBe(s.INVALID_VALUE);let e=s.getParameter(s.VIEWPORT);s.viewport(0,0,e[2],e[3])})}),await i(`conformance/state/gl-object-get-calls — getBufferParameter`,async()=>{r(async()=>{c.make_current()}),await o(`getBufferParameter BUFFER_SIZE returns correct size after bufferData`,async()=>{s.getError();let e=s.createBuffer();s.bindBuffer(s.ARRAY_BUFFER,e),s.bufferData(s.ARRAY_BUFFER,16,s.DYNAMIC_DRAW),a(s.getBufferParameter(s.ARRAY_BUFFER,s.BUFFER_SIZE)).toBe(16),a(s.getError()).toBe(s.NO_ERROR),s.bindBuffer(s.ARRAY_BUFFER,null),s.deleteBuffer(e)}),await o(`getBufferParameter BUFFER_USAGE returns correct usage after bufferData`,async()=>{let e=s.createBuffer();s.bindBuffer(s.ARRAY_BUFFER,e),s.bufferData(s.ARRAY_BUFFER,16,s.DYNAMIC_DRAW),a(s.getBufferParameter(s.ARRAY_BUFFER,s.BUFFER_USAGE)).toBe(s.DYNAMIC_DRAW),s.bindBuffer(s.ARRAY_BUFFER,null),s.deleteBuffer(e)})}),await i(`conformance/state/gl-object-get-calls — getRenderbufferParameter`,async()=>{r(async()=>{c.make_current()}),await o(`getRenderbufferParameter returns correct width/height/format`,async()=>{let e=s.createRenderbuffer();s.bindRenderbuffer(s.RENDERBUFFER,e),s.renderbufferStorage(s.RENDERBUFFER,s.RGBA4,64,32),a(s.getRenderbufferParameter(s.RENDERBUFFER,s.RENDERBUFFER_WIDTH)).toBe(64),a(s.getRenderbufferParameter(s.RENDERBUFFER,s.RENDERBUFFER_HEIGHT)).toBe(32),a(s.getRenderbufferParameter(s.RENDERBUFFER,s.RENDERBUFFER_INTERNAL_FORMAT)).toBe(s.RGBA4),a(s.getError()).toBe(s.NO_ERROR),s.bindRenderbuffer(s.RENDERBUFFER,null),s.deleteRenderbuffer(e)})})})},`default`);export{c as default};
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import{destroyTestFBO as
|
|
1
|
+
import{__name as e}from"../_virtual/_rolldown/runtime.js";import{destroyTestFBO as t,drawTriangle as n,makeProgram as r,makeTestFBO 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";const d=`
|
|
2
2
|
precision mediump float;
|
|
3
3
|
attribute vec2 position;
|
|
4
4
|
varying vec2 vTexCoord;
|
|
5
5
|
void main() {
|
|
6
6
|
vTexCoord = 0.5 * (position + 1.0);
|
|
7
7
|
gl_Position = vec4(position, 0.0, 1.0);
|
|
8
|
-
}`,
|
|
8
|
+
}`,f=`
|
|
9
9
|
precision mediump float;
|
|
10
10
|
uniform sampler2D uTex;
|
|
11
11
|
varying vec2 vTexCoord;
|
|
12
|
-
void main() { gl_FragColor = texture2D(uTex, vTexCoord); }`;var
|
|
12
|
+
void main() { gl_FragColor = texture2D(uTex, vTexCoord); }`;var p=e(async()=>{await u(`Display`,async()=>{let e=a();if(!e){console.warn(`WebGL context not available — skipping conformance/textures tests`);return}let{gl:u,glArea:p}=e;p.make_current(),await s(`textures/texImage2D-rgba`,async()=>{o(async()=>{p.make_current()}),await l(`upload 2×2 RGBA Uint8Array and sample it back`,async()=>{let e=i(u,2,2),a=new Uint8Array([255,0,0,255,0,255,0,255,0,0,255,255,255,255,0,255]),o=u.createTexture();u.bindTexture(u.TEXTURE_2D,o),u.texParameteri(u.TEXTURE_2D,u.TEXTURE_WRAP_S,u.CLAMP_TO_EDGE),u.texParameteri(u.TEXTURE_2D,u.TEXTURE_WRAP_T,u.CLAMP_TO_EDGE),u.texParameteri(u.TEXTURE_2D,u.TEXTURE_MIN_FILTER,u.NEAREST),u.texParameteri(u.TEXTURE_2D,u.TEXTURE_MAG_FILTER,u.NEAREST),u.texImage2D(u.TEXTURE_2D,0,u.RGBA,2,2,0,u.RGBA,u.UNSIGNED_BYTE,a);let s=r(u,d,f);u.useProgram(s),u.uniform1i(u.getUniformLocation(s,`uTex`),0),n(u),c(u.getError()).toBe(u.NO_ERROR),u.deleteTexture(o),t(u,e)}),await l(`createTexture returns non-null; deleteTexture cleans up`,async()=>{let e=u.createTexture();c(e).toBeDefined(),u.bindTexture(u.TEXTURE_2D,e),u.texImage2D(u.TEXTURE_2D,0,u.RGBA,1,1,0,u.RGBA,u.UNSIGNED_BYTE,new Uint8Array([128,128,128,255])),c(u.getError()).toBe(u.NO_ERROR),u.bindTexture(u.TEXTURE_2D,null),u.deleteTexture(e),c(u.getError()).toBe(u.NO_ERROR)})}),await s(`textures/alpha-texture`,async()=>{o(async()=>{p.make_current()}),await l(`ALPHA format texImage2D: RGB channels zero, alpha matches upload data`,async()=>{let e=i(u,4,4),a=new Uint8Array(16);for(let e=0;e<4;e++)for(let t=0;t<4;t++)a[e*4+t]=(e+t)%255;let o=u.createTexture();u.bindTexture(u.TEXTURE_2D,o),u.texParameteri(u.TEXTURE_2D,u.TEXTURE_WRAP_S,u.CLAMP_TO_EDGE),u.texParameteri(u.TEXTURE_2D,u.TEXTURE_WRAP_T,u.CLAMP_TO_EDGE),u.texParameteri(u.TEXTURE_2D,u.TEXTURE_MIN_FILTER,u.NEAREST),u.texParameteri(u.TEXTURE_2D,u.TEXTURE_MAG_FILTER,u.NEAREST),u.texImage2D(u.TEXTURE_2D,0,u.ALPHA,4,4,0,u.ALPHA,u.UNSIGNED_BYTE,a),c(u.getError()).toBe(u.NO_ERROR),u.clearColor(0,0,0,0),u.clear(u.COLOR_BUFFER_BIT);let s=r(u,d,f);u.useProgram(s),u.uniform1i(u.getUniformLocation(s,`uTex`),0),n(u),c(u.getError()).toBe(u.NO_ERROR);let l=new Uint8Array(64);u.readPixels(0,0,4,4,u.RGBA,u.UNSIGNED_BYTE,l);let p=!0;for(let e=0;e<16;e++){let t=e*4;if(l[t]!==0||l[t+1]!==0||l[t+2]!==0){p=!1;break}if(Math.abs(l[t+3]-a[e])>3){p=!1;break}}c(p).toBe(!0),u.deleteTexture(o),t(u,e)})}),await s(`textures/texSubImage2D`,async()=>{o(async()=>{p.make_current()}),await l(`texSubImage2D overwrites a sub-region of an RGBA texture`,async()=>{let e=i(u,4,4),n=new Uint8Array(64).fill(0);for(let e=0;e<16;e++)n[e*4]=255,n[e*4+3]=255;let r=u.createTexture();u.bindTexture(u.TEXTURE_2D,r),u.texParameteri(u.TEXTURE_2D,u.TEXTURE_WRAP_S,u.CLAMP_TO_EDGE),u.texParameteri(u.TEXTURE_2D,u.TEXTURE_WRAP_T,u.CLAMP_TO_EDGE),u.texParameteri(u.TEXTURE_2D,u.TEXTURE_MIN_FILTER,u.NEAREST),u.texParameteri(u.TEXTURE_2D,u.TEXTURE_MAG_FILTER,u.NEAREST),u.texImage2D(u.TEXTURE_2D,0,u.RGBA,4,4,0,u.RGBA,u.UNSIGNED_BYTE,n);let a=new Uint8Array([0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255]);u.texSubImage2D(u.TEXTURE_2D,0,0,0,2,2,u.RGBA,u.UNSIGNED_BYTE,a),c(u.getError()).toBe(u.NO_ERROR),u.deleteTexture(r),t(u,e)})}),await s(`textures/parameters`,async()=>{o(async()=>{p.make_current()}),await l(`getTexParameter returns set WRAP and FILTER values`,async()=>{let e=u.createTexture();u.bindTexture(u.TEXTURE_2D,e),u.texParameteri(u.TEXTURE_2D,u.TEXTURE_WRAP_S,u.CLAMP_TO_EDGE),u.texParameteri(u.TEXTURE_2D,u.TEXTURE_WRAP_T,u.REPEAT),u.texParameteri(u.TEXTURE_2D,u.TEXTURE_MIN_FILTER,u.LINEAR),u.texParameteri(u.TEXTURE_2D,u.TEXTURE_MAG_FILTER,u.NEAREST),c(u.getTexParameter(u.TEXTURE_2D,u.TEXTURE_WRAP_S)).toBe(u.CLAMP_TO_EDGE),c(u.getTexParameter(u.TEXTURE_2D,u.TEXTURE_WRAP_T)).toBe(u.REPEAT),c(u.getTexParameter(u.TEXTURE_2D,u.TEXTURE_MIN_FILTER)).toBe(u.LINEAR),c(u.getTexParameter(u.TEXTURE_2D,u.TEXTURE_MAG_FILTER)).toBe(u.NEAREST),c(u.getError()).toBe(u.NO_ERROR),u.bindTexture(u.TEXTURE_2D,null),u.deleteTexture(e)}),await l(`MIRRORED_REPEAT wrap mode is accepted`,async()=>{let e=u.createTexture();u.bindTexture(u.TEXTURE_2D,e),u.texParameteri(u.TEXTURE_2D,u.TEXTURE_WRAP_S,u.MIRRORED_REPEAT),c(u.getError()).toBe(u.NO_ERROR),c(u.getTexParameter(u.TEXTURE_2D,u.TEXTURE_WRAP_S)).toBe(u.MIRRORED_REPEAT),u.bindTexture(u.TEXTURE_2D,null),u.deleteTexture(e)}),await l(`LINEAR_MIPMAP_LINEAR min filter is accepted`,async()=>{let e=u.createTexture();u.bindTexture(u.TEXTURE_2D,e),u.texParameteri(u.TEXTURE_2D,u.TEXTURE_MIN_FILTER,u.LINEAR_MIPMAP_LINEAR),c(u.getError()).toBe(u.NO_ERROR),c(u.getTexParameter(u.TEXTURE_2D,u.TEXTURE_MIN_FILTER)).toBe(u.LINEAR_MIPMAP_LINEAR),u.bindTexture(u.TEXTURE_2D,null),u.deleteTexture(e)})}),await s(`textures/active-texture`,async()=>{o(async()=>{p.make_current()}),await l(`activeTexture switches binding slot; each unit holds independent binding`,async()=>{let e=u.createTexture(),t=u.createTexture();u.activeTexture(u.TEXTURE0),u.bindTexture(u.TEXTURE_2D,e),u.activeTexture(u.TEXTURE1),u.bindTexture(u.TEXTURE_2D,t),u.activeTexture(u.TEXTURE0),c(u.getParameter(u.TEXTURE_BINDING_2D)).toBe(e),u.activeTexture(u.TEXTURE1),c(u.getParameter(u.TEXTURE_BINDING_2D)).toBe(t),c(u.getError()).toBe(u.NO_ERROR),u.activeTexture(u.TEXTURE0),u.bindTexture(u.TEXTURE_2D,null),u.activeTexture(u.TEXTURE1),u.bindTexture(u.TEXTURE_2D,null),u.deleteTexture(e),u.deleteTexture(t)}),await l(`getParameter ACTIVE_TEXTURE reflects activeTexture call`,async()=>{u.activeTexture(u.TEXTURE3),c(u.getParameter(u.ACTIVE_TEXTURE)).toBe(u.TEXTURE3),u.activeTexture(u.TEXTURE0),c(u.getParameter(u.ACTIVE_TEXTURE)).toBe(u.TEXTURE0),c(u.getError()).toBe(u.NO_ERROR)})}),await s(`textures/cubemap`,async()=>{o(async()=>{p.make_current()}),await l(`attach all 6 cubemap faces to FBO — no GL error`,async()=>{let e=u.createTexture(),t=u.createFramebuffer(),n=new Uint8Array([255,255,255,255]);u.activeTexture(u.TEXTURE1),u.bindTexture(u.TEXTURE_CUBE_MAP,e),u.texParameteri(u.TEXTURE_CUBE_MAP,u.TEXTURE_WRAP_S,u.CLAMP_TO_EDGE),u.texParameteri(u.TEXTURE_CUBE_MAP,u.TEXTURE_WRAP_T,u.CLAMP_TO_EDGE),u.texParameteri(u.TEXTURE_CUBE_MAP,u.TEXTURE_MAG_FILTER,u.NEAREST),u.texParameteri(u.TEXTURE_CUBE_MAP,u.TEXTURE_MIN_FILTER,u.NEAREST),u.bindFramebuffer(u.FRAMEBUFFER,t);for(let t=0;t<6;t++)u.texImage2D(u.TEXTURE_CUBE_MAP_POSITIVE_X+t,0,u.RGBA,1,1,0,u.RGBA,u.UNSIGNED_BYTE,n),u.framebufferTexture2D(u.FRAMEBUFFER,u.COLOR_ATTACHMENT0,u.TEXTURE_CUBE_MAP_POSITIVE_X+t,e,0);c(u.getError()).toBe(u.NO_ERROR),u.bindFramebuffer(u.FRAMEBUFFER,null),u.activeTexture(u.TEXTURE1),u.bindTexture(u.TEXTURE_CUBE_MAP,null),u.activeTexture(u.TEXTURE0),u.deleteTexture(e),u.deleteFramebuffer(t)}),await l(`createTexture with TEXTURE_CUBE_MAP binding — no error`,async()=>{let e=u.createTexture();u.bindTexture(u.TEXTURE_CUBE_MAP,e),u.texParameteri(u.TEXTURE_CUBE_MAP,u.TEXTURE_MIN_FILTER,u.LINEAR),u.texParameteri(u.TEXTURE_CUBE_MAP,u.TEXTURE_MAG_FILTER,u.LINEAR),u.texParameteri(u.TEXTURE_CUBE_MAP,u.TEXTURE_WRAP_S,u.CLAMP_TO_EDGE),u.texParameteri(u.TEXTURE_CUBE_MAP,u.TEXTURE_WRAP_T,u.CLAMP_TO_EDGE),c(u.getError()).toBe(u.NO_ERROR),u.bindTexture(u.TEXTURE_CUBE_MAP,null),u.deleteTexture(e)})}),await s(`textures/luminance`,async()=>{o(async()=>{p.make_current()}),await l(`LUMINANCE format texImage2D — no error`,async()=>{let e=u.createTexture();u.bindTexture(u.TEXTURE_2D,e),u.texParameteri(u.TEXTURE_2D,u.TEXTURE_MIN_FILTER,u.NEAREST),u.texParameteri(u.TEXTURE_2D,u.TEXTURE_MAG_FILTER,u.NEAREST);let t=new Uint8Array([128,64,192,32]);u.texImage2D(u.TEXTURE_2D,0,u.LUMINANCE,4,1,0,u.LUMINANCE,u.UNSIGNED_BYTE,t),c(u.getError()).toBe(u.NO_ERROR),u.bindTexture(u.TEXTURE_2D,null),u.deleteTexture(e)}),await l(`LUMINANCE_ALPHA format texImage2D — no error`,async()=>{let e=u.createTexture();u.bindTexture(u.TEXTURE_2D,e),u.texParameteri(u.TEXTURE_2D,u.TEXTURE_MIN_FILTER,u.NEAREST),u.texParameteri(u.TEXTURE_2D,u.TEXTURE_MAG_FILTER,u.NEAREST);let t=new Uint8Array([128,255,64,128]);u.texImage2D(u.TEXTURE_2D,0,u.LUMINANCE_ALPHA,2,1,0,u.LUMINANCE_ALPHA,u.UNSIGNED_BYTE,t),c(u.getError()).toBe(u.NO_ERROR),u.bindTexture(u.TEXTURE_2D,null),u.deleteTexture(e)})}),await s(`textures/generateMipmap`,async()=>{o(async()=>{p.make_current()}),await l(`generateMipmap on power-of-two RGBA texture — no error`,async()=>{let e=u.createTexture();u.bindTexture(u.TEXTURE_2D,e),u.texParameteri(u.TEXTURE_2D,u.TEXTURE_MIN_FILTER,u.LINEAR_MIPMAP_LINEAR),u.texParameteri(u.TEXTURE_2D,u.TEXTURE_MAG_FILTER,u.LINEAR);let t=new Uint8Array(64).fill(255);u.texImage2D(u.TEXTURE_2D,0,u.RGBA,4,4,0,u.RGBA,u.UNSIGNED_BYTE,t),u.generateMipmap(u.TEXTURE_2D),c(u.getError()).toBe(u.NO_ERROR),u.bindTexture(u.TEXTURE_2D,null),u.deleteTexture(e)})})})},`default`);export{p as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{__name as e}from"../_virtual/_rolldown/runtime.js";import{makeProgram as t}from"../test-utils.js";import{createGLSetup as n}from"./setup.js";import{beforeEach as r,describe as i,expect as a,it as o,on as s}from"@gjsify/unit";const c=`attribute vec4 a_position; void main() { gl_Position = a_position; }`;function makeFS(e){return`precision mediump float; ${e}`}const l=makeFS(`uniform float u_f; void main() { gl_FragColor = vec4(u_f,0,0,1); }`),u=makeFS(`uniform int u_i; void main() { gl_FragColor = vec4(float(u_i),0,0,1); }`),d=makeFS(`uniform bool u_b; void main() { gl_FragColor = vec4(u_b ? 1.0 : 0.0,0,0,1); }`),f=makeFS(`uniform vec2 u_v2; void main() { gl_FragColor = vec4(u_v2,0,1); }`),p=makeFS(`uniform vec3 u_v3; void main() { gl_FragColor = vec4(u_v3,1); }`),m=makeFS(`uniform vec4 u_v4; void main() { gl_FragColor = u_v4; }`),h=makeFS(`uniform mat2 u_m2; void main() { gl_FragColor = vec4(u_m2[0],u_m2[1]); }`),g=makeFS(`uniform mat3 u_m3; void main() { gl_FragColor = vec4(u_m3[0],1); }`),_=makeFS(`uniform mat4 u_m4; void main() { gl_FragColor = u_m4[0]; }`),v=makeFS(`uniform float u_arr[3]; void main() { gl_FragColor = vec4(u_arr[0]+u_arr[1]+u_arr[2],0,0,1); }`),y=makeFS(`uniform vec4 u_v4arr[3]; void main() { gl_FragColor = u_v4arr[0]+u_v4arr[1]+u_v4arr[2]; }`);function floatArrayClose(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 b=e(async()=>{await s(`Display`,async()=>{let e=n();if(!e){console.warn(`WebGL context not available — skipping conformance/uniforms tests`);return}let{gl:s,glArea:b}=e;b.make_current(),await i(`conformance/uniforms/null-uniform-location`,async()=>{r(async()=>{b.make_current()}),await o(`uniform* with null location generates NO_ERROR`,async()=>{let e=t(s,c,l);s.useProgram(e),s.uniform1f(null,1),s.getError(),s.uniform1fv(null,[1]),s.getError(),s.uniform1i(null,1),s.getError(),s.uniform1iv(null,[1]),s.getError(),s.uniform2f(null,1,2),s.getError(),s.uniform2fv(null,[1,2]),s.getError(),s.uniform2i(null,1,2),s.getError(),s.uniform2iv(null,[1,2]),s.getError(),s.uniform3f(null,1,2,3),s.getError(),s.uniform3fv(null,[1,2,3]),s.getError(),s.uniform3i(null,1,2,3),s.getError(),s.uniform3iv(null,[1,2,3]),s.getError(),s.uniform4f(null,1,2,3,4),s.getError(),s.uniform4fv(null,[1,2,3,4]),s.getError(),s.uniform4i(null,1,2,3,4),s.getError(),s.uniform4iv(null,[1,2,3,4]),s.getError(),s.uniformMatrix2fv(null,!1,[1,0,0,1]),s.getError(),s.uniformMatrix3fv(null,!1,[1,0,0,0,1,0,0,0,1]),s.getError(),s.uniformMatrix4fv(null,!1,[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),s.getError(),a(s.getError()).toBe(s.NO_ERROR)})}),await i(`conformance/uniforms/gl-unknown-uniform`,async()=>{r(async()=>{b.make_current()}),await o(`getUniformLocation for unknown uniform returns null`,async()=>{let e=t(s,c,l);s.useProgram(e),a(s.getUniformLocation(e,`someUnknownUniform`)).toBeNull(),a(s.getError()).toBe(s.NO_ERROR)}),await o(`uniform1f with null location (unknown) generates NO_ERROR`,async()=>{let e=t(s,c,l);s.useProgram(e),s.uniform1f(null,42),a(s.getError()).toBe(s.NO_ERROR)})}),await i(`conformance/uniforms/gl-uniform-bool`,async()=>{r(async()=>{b.make_current()}),await o(`setting a bool uniform via uniform1i succeeds`,async()=>{let e=t(s,c,d);s.useProgram(e);let n=s.getUniformLocation(e,`u_b`);a(n).not.toBeNull(),s.uniform1i(n,1),a(s.getError()).toBe(s.NO_ERROR)})}),await i(`conformance/uniforms/scalar-vector-round-trip`,async()=>{r(async()=>{b.make_current()}),await o(`uniform1f / getUniform round-trips a float`,async()=>{let e=t(s,c,l);s.useProgram(e);let n=s.getUniformLocation(e,`u_f`);s.uniform1f(n,.5),a(s.getError()).toBe(s.NO_ERROR);let r=s.getUniform(e,n);a(Math.abs(r-.5)<.001).toBe(!0)}),await o(`uniform1i / getUniform round-trips an int`,async()=>{let e=t(s,c,u);s.useProgram(e);let n=s.getUniformLocation(e,`u_i`);s.uniform1i(n,7),a(s.getError()).toBe(s.NO_ERROR),a(s.getUniform(e,n)).toBe(7)}),await o(`uniform2fv / getUniform round-trips a vec2`,async()=>{let e=t(s,c,f);s.useProgram(e);let n=s.getUniformLocation(e,`u_v2`);s.uniform2fv(n,[.25,.75]),a(s.getError()).toBe(s.NO_ERROR),a(floatArrayClose(s.getUniform(e,n),[.25,.75])).toBe(!0)}),await o(`uniform3fv / getUniform round-trips a vec3`,async()=>{let e=t(s,c,p);s.useProgram(e);let n=s.getUniformLocation(e,`u_v3`);s.uniform3fv(n,[.1,.2,.3]),a(s.getError()).toBe(s.NO_ERROR),a(floatArrayClose(s.getUniform(e,n),[.1,.2,.3])).toBe(!0)}),await o(`uniform4fv / getUniform round-trips a vec4`,async()=>{let e=t(s,c,m);s.useProgram(e);let n=s.getUniformLocation(e,`u_v4`);s.uniform4fv(n,[.1,.2,.3,.4]),a(s.getError()).toBe(s.NO_ERROR),a(floatArrayClose(s.getUniform(e,n),[.1,.2,.3,.4])).toBe(!0)})}),await i(`conformance/uniforms/gl-uniformmatrix4fv`,async()=>{r(async()=>{b.make_current()}),await o(`uniformMatrix2fv with correct size (4 elements) succeeds`,async()=>{let e=t(s,c,h);s.useProgram(e);let n=s.getUniformLocation(e,`u_m2`);s.uniformMatrix2fv(n,!1,[1,0,0,1]),a(s.getError()).toBe(s.NO_ERROR)}),await o(`uniformMatrix2fv with too few elements generates INVALID_VALUE`,async()=>{let e=t(s,c,h);s.useProgram(e);let n=s.getUniformLocation(e,`u_m2`);s.uniformMatrix2fv(n,!1,[1,0,0]),a(s.getError()).toBe(s.INVALID_VALUE)}),await o(`uniformMatrix3fv with correct size (9 elements) succeeds`,async()=>{let e=t(s,c,g);s.useProgram(e);let n=s.getUniformLocation(e,`u_m3`);s.uniformMatrix3fv(n,!1,[1,0,0,0,1,0,0,0,1]),a(s.getError()).toBe(s.NO_ERROR)}),await o(`uniformMatrix4fv with correct size (16 elements) succeeds`,async()=>{let e=t(s,c,_);s.useProgram(e);let n=s.getUniformLocation(e,`u_m4`);s.uniformMatrix4fv(n,!1,[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),a(s.getError()).toBe(s.NO_ERROR)}),await o(`uniformMatrix4fv with transpose=true generates INVALID_VALUE in WebGL1`,async()=>{let e=t(s,c,_);s.useProgram(e);let n=s.getUniformLocation(e,`u_m4`);s.uniformMatrix4fv(n,!0,[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),a(s.getError()).toBe(s.INVALID_VALUE)}),await o(`uniformMatrix4fv / getUniform round-trips a mat4`,async()=>{let e=t(s,c,_);s.useProgram(e);let n=s.getUniformLocation(e,`u_m4`),r=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];s.uniformMatrix4fv(n,!1,r),a(s.getError()).toBe(s.NO_ERROR),a(floatArrayClose(s.getUniform(e,n),r)).toBe(!0)})}),await i(`conformance/uniforms/gl-uniform-arrays`,async()=>{r(async()=>{b.make_current()}),await o(`uniform1fv sets a float array and getUniform retrieves element [0]`,async()=>{let e=t(s,c,v);s.useProgram(e);let n=s.getUniformLocation(e,`u_arr[0]`);a(n).not.toBeNull(),s.uniform1fv(n,[.1,.2,.3]),a(s.getError()).toBe(s.NO_ERROR);let r=s.getUniform(e,n);a(Math.abs(r-.1)<.001).toBe(!0)}),await o(`uniform1fv with fewer values than array size (partial update) succeeds`,async()=>{let e=t(s,c,v);s.useProgram(e);let n=s.getUniformLocation(e,`u_arr[0]`);s.uniform1fv(n,[.5,.6]),a(s.getError()).toBe(s.NO_ERROR)}),await o(`uniform4fv sets a vec4 array`,async()=>{let e=t(s,c,y);s.useProgram(e);let n=s.getUniformLocation(e,`u_v4arr[0]`);a(n).not.toBeNull(),s.uniform4fv(n,[.1,.2,.3,.4,.5,.6,.7,.8,.9,1,0,0]),a(s.getError()).toBe(s.NO_ERROR)}),await o(`getUniformLocation resolves bare array name (without [0] suffix)`,async()=>{let e=t(s,c,v);s.useProgram(e);let n=s.getUniformLocation(e,`u_arr`);a(n).not.toBeNull(),a(s.getError()).toBe(s.NO_ERROR),s.uniform1fv(n,[.7,.8,.9]),a(s.getError()).toBe(s.NO_ERROR);let r=s.getUniform(e,n);a(Math.abs(r-.7)<.001).toBe(!0)}),await o(`bare array name and indexed [0] name resolve to equivalent locations`,async()=>{let e=t(s,c,v);s.useProgram(e);let n=s.getUniformLocation(e,`u_arr`),r=s.getUniformLocation(e,`u_arr[0]`);a(n).not.toBeNull(),a(r).not.toBeNull(),s.uniform1fv(n,[.42,.43,.44]),a(s.getError()).toBe(s.NO_ERROR);let i=s.getUniform(e,r);a(Math.abs(i-.42)<.001).toBe(!0)}),await o(`calling uniform* before useProgram generates INVALID_OPERATION`,async()=>{let e=t(s,c,v);s.useProgram(null);let n=s.getUniformLocation(e,`u_arr[0]`);n===null?a(s.getError()).toBe(s.NO_ERROR):(s.uniform1fv(n,[1,2,3]),a(s.getError()).toBe(s.INVALID_OPERATION))})}),await i(`conformance/uniforms/uniform-location`,async()=>{r(async()=>{b.make_current()}),await o(`getUniformLocation returns non-null for known uniform`,async()=>{let e=t(s,c,l);s.useProgram(e),a(s.getUniformLocation(e,`u_f`)).not.toBeNull(),a(s.getError()).toBe(s.NO_ERROR)}),await o(`location from different program generates INVALID_OPERATION`,async()=>{let e=t(s,c,l),n=t(s,c,l),r=s.getUniformLocation(e,`u_f`);s.useProgram(n),s.uniform1f(r,1),a(s.getError()).toBe(s.INVALID_OPERATION)}),await o(`location becomes invalid after relinkProgram`,async()=>{let e=t(s,c,l);s.useProgram(e);let n=s.getUniformLocation(e,`u_f`);a(n).not.toBeNull(),s.linkProgram(e),s.uniform1f(n,1),a(s.getError()).toBe(s.INVALID_OPERATION);let r=s.getUniformLocation(e,`u_f`);a(r).not.toBeNull(),s.uniform1f(r,1),a(s.getError()).toBe(s.NO_ERROR)})})})},`default`);export{b as default};
|
|
@@ -1 +1 @@
|
|
|
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
|
+
import"./_virtual/_rolldown/runtime.js";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()}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"../_virtual/_rolldown/runtime.js";import{Uint8ArrayToVariant as e,arrayToUint8Array as t,checkObject as n,isTypedArray as r}from"../utils.js";import{WebGLBuffer as i}from"../webgl-buffer.js";const a={bindBuffer(e=0,t){if(!n(t))throw TypeError(`bindBuffer(GLenum, WebGLBuffer)`);if(e!==this.ARRAY_BUFFER&&e!==this.ELEMENT_ARRAY_BUFFER){this.setError(this.INVALID_ENUM);return}if(!t)t=null,this._gl.bindBuffer(e,0);else if(t._pendingDelete)return;else if(this._checkWrapper(t,i)){if(t._binding&&t._binding!==e){this.setError(this.INVALID_OPERATION);return}t._binding=e|0,this._gl.bindBuffer(e,t._|0)}else return;e===this.ARRAY_BUFFER?this._vertexGlobalState.setArrayBuffer(t):this._vertexObjectState.setElementArrayBuffer(t)},bufferData(n=0,i,a=0){let o=0,s=null;if(typeof i==`number`?o=i:typeof i==`object`&&(s=i),a!==this.STREAM_DRAW&&a!==this.STATIC_DRAW&&a!==this.DYNAMIC_DRAW){this.setError(this.INVALID_ENUM);return}if(n!==this.ARRAY_BUFFER&&n!==this.ELEMENT_ARRAY_BUFFER){this.setError(this.INVALID_ENUM);return}let c=this._getActiveBuffer(n);if(!c){this.setError(this.INVALID_OPERATION);return}if(s){let i=null;if(r(s)||s instanceof DataView||s instanceof ArrayBuffer)i=t(s);else{this.setError(this.INVALID_VALUE);return}this._saveError(),this._gl.bufferData(n,e(i),a);let o=this.getError();if(this._restoreError(o),o!==this.NO_ERROR)return;c._size=i.length,n===this.ELEMENT_ARRAY_BUFFER&&(c._elements=new Uint8Array(i))}else if(typeof i==`number`){if(o<0){this.setError(this.INVALID_VALUE);return}this._saveError(),this._gl.bufferDataSizeOnly(n,o,a);let e=this.getError();if(this._restoreError(e),e!==this.NO_ERROR)return;c._size=o,n===this.ELEMENT_ARRAY_BUFFER&&(c._elements=new Uint8Array(o))}else this.setError(this.INVALID_VALUE)},bufferSubData(n=0,i=0,a){if(n!==this.ARRAY_BUFFER&&n!==this.ELEMENT_ARRAY_BUFFER){this.setError(this.INVALID_ENUM);return}if(typeof a!=`object`||!a)throw TypeError(`bufferSubData: data must be a BufferSource`);let o=this._getActiveBuffer(n);if(!o){this.setError(this.INVALID_OPERATION);return}if(i<0||i>=o._size){this.setError(this.INVALID_VALUE);return}let s=null;if(r(a)||a instanceof DataView||a instanceof ArrayBuffer)s=t(a);else{this.setError(this.INVALID_VALUE);return}if(i+s.length>o._size){this.setError(this.INVALID_VALUE);return}n===this.ELEMENT_ARRAY_BUFFER&&o._elements.set(s,i),this._gl.bufferSubData(n,i,e(s))},createBuffer(){let e=this._gl.createBuffer();if(!e||e<=0)return null;let t=new i(e,this);return this._buffers[e]=t,t},deleteBuffer(e){if(!n(e)||e!==null&&!(e instanceof i))throw TypeError(`deleteBuffer(WebGLBuffer)`);if(!(e instanceof i&&this._checkOwns(e))){this.setError(this.INVALID_OPERATION);return}this._vertexGlobalState._arrayBufferBinding===e&&this.bindBuffer(this.ARRAY_BUFFER,null),this._vertexObjectState._elementArrayBufferBinding===e&&this.bindBuffer(this.ELEMENT_ARRAY_BUFFER,null),this._vertexObjectState===this._defaultVertexObjectState&&this._vertexObjectState.releaseArrayBuffer(e),e._pendingDelete=!0,e._checkDelete()},getBufferParameter(e=0,t=0){if(e!==this.ARRAY_BUFFER&&e!==this.ELEMENT_ARRAY_BUFFER)return this.setError(this.INVALID_ENUM),null;switch(t){case this.BUFFER_SIZE:case this.BUFFER_USAGE:return this._gl.getBufferParameteriv(e|0,t|0)[0];default:return this.setError(this.INVALID_ENUM),null}},_getActiveBuffer(e){return e===this.ARRAY_BUFFER?this._vertexGlobalState._arrayBufferBinding:e===this.ELEMENT_ARRAY_BUFFER?this._vertexObjectState._elementArrayBufferBinding:null}};function installBufferBindingMethods(e){Object.assign(e,a)}export{installBufferBindingMethods};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"../_virtual/_rolldown/runtime.js";import{Uint8ArrayToVariant as e,arrayToUint8Array as t,typeSize as n,vertexCount as r}from"../utils.js";const i={drawArrays(e=0,t=0,n=0){if(t<0||n<0){this.setError(this.INVALID_VALUE);return}if(!this._checkStencilState())return;let i=r(this,e,n);if(i<0){this.setError(this.INVALID_ENUM);return}if(!this._framebufferOk()||n===0)return;let a=t;n>0&&(a=n+t-1>>>0),this._checkVertexAttribState(a)&&this._gl.drawArrays(e,t,i)},drawElements(e=0,t=0,n=0,r=0){if(t<0||r<0){this.setError(this.INVALID_VALUE);return}if(!this._checkStencilState())return;let i=this._vertexObjectState._elementArrayBufferBinding;if(!i){this.setError(this.INVALID_OPERATION);return}let a=null,o=r;if(n===this.UNSIGNED_SHORT){if(o%2){this.setError(this.INVALID_OPERATION);return}o>>=1,a=new Uint16Array(i._elements.buffer)}else if(this._extensions.oes_element_index_uint&&n===this.UNSIGNED_INT){if(o%4){this.setError(this.INVALID_OPERATION);return}o>>=2,a=new Uint32Array(i._elements.buffer)}else if(n===this.UNSIGNED_BYTE)a=i._elements;else{this.setError(this.INVALID_ENUM);return}let s=t;switch(e){case this.TRIANGLES:t%3&&(s-=t%3);break;case this.LINES:t%2&&(s-=t%2);break;case this.POINTS:break;case this.LINE_LOOP:case this.LINE_STRIP:if(t<2){this.setError(this.INVALID_OPERATION);return}break;case this.TRIANGLE_FAN:case this.TRIANGLE_STRIP:if(t<3){this.setError(this.INVALID_OPERATION);return}break;default:this.setError(this.INVALID_ENUM);return}if(!this._framebufferOk())return;if(t===0){this._checkVertexAttribState(0);return}if(t+o>>>0>a.length){this.setError(this.INVALID_OPERATION);return}let c=-1;for(let e=o;e<o+t;++e)c=Math.max(c,a[e]);if(c<0){this._checkVertexAttribState(0);return}this._checkVertexAttribState(c)&&s>0&&this._gl.drawElements(e,s,n,r)},viewport(e,t,n,r){this._viewport[0]=e|0,this._viewport[1]=t|0,this._viewport[2]=n|0,this._viewport[3]=r|0,this._gl.viewport(e,t,n,r)},scissor(e,t,n,r){this._scissorBox[0]=e|0,this._scissorBox[1]=t|0,this._scissorBox[2]=n|0,this._scissorBox[3]=r|0,this._gl.scissor(e|0,t|0,n|0,r|0)},readPixels(n=0,r=0,i=0,a=0,o=0,s=0,c){if(!c)return;if(!(this._extensions.oes_texture_float&&s===this.FLOAT&&o===this.RGBA)){if(o===this.RGB||o===this.ALPHA||s!==this.UNSIGNED_BYTE){this.setError(this.INVALID_OPERATION);return}else if(o!==this.RGBA){this.setError(this.INVALID_ENUM);return}else if(i<0||a<0||!(c instanceof Uint8Array)){this.setError(this.INVALID_VALUE);return}}if(!this._framebufferOk()){console.error(`framebuffer is not okay!`);return}let l=i*4;l%this._packAlignment!==0&&(l+=this._packAlignment-l%this._packAlignment);let u=l*(a-1)+i*4;if(u<=0)return;if((c.length||c.byteLength||0)<u){this.setError(this.INVALID_VALUE);return}let d=this.drawingBufferWidth,f=this.drawingBufferHeight;this._activeFramebuffer&&(d=this._activeFramebuffer._width,f=this._activeFramebuffer._height);let p=t(c);if(n>=d||n+i<=0||r>=f||r+a<=0)for(let e=0;e<p.length;++e)p[e]=0;else if(n<0||n+i>d||r<0||r+a>f){for(let e=0;e<p.length;++e)p[e]=0;let t=n,c=i;n<0&&(c+=n,t=0),t+i>d&&(c=d-t);let u=r,m=a;r<0&&(m+=r,u=0),u+a>f&&(m=f-u);let h=c*4;if(h%this._packAlignment!==0&&(h+=this._packAlignment-h%this._packAlignment),c>0&&m>0){let i=new Uint8Array(h*m),a=this._gl.readPixels(t,u,c,m,o,s,e(i)),d=a&&a.length>0?a:i,f=4*(t-n)+(u-r)*l;for(let e=0;e<m;++e)for(let t=0;t<c;++t)for(let n=0;n<4;++n)p[f+e*l+4*t+n]=d[e*h+4*t+n]}}else{let t=this._gl.readPixels(n,r,i,a,o,s,e(p));t&&t.length>0&&p.set(t)}},enableVertexAttribArray(e){if(e<0||e>=this._vertexObjectState._attribs.length){this.setError(this.INVALID_VALUE);return}this._gl.enableVertexAttribArray(e),this._vertexObjectState._attribs[e]._isPointer=!0},disableVertexAttribArray(e=0){if(e<0||e>=this._vertexObjectState._attribs.length){this.setError(this.INVALID_VALUE);return}this._gl.disableVertexAttribArray(e),this._vertexObjectState._attribs[e]._isPointer=!1},vertexAttrib1f(e,t){if(e|=0,!this._checkVertexIndex(e))return;let n=this._vertexGlobalState._attribs[e]._data;n[3]=1,n[1]=n[2]=0,n[0]=t,this._gl.vertexAttrib1f(e|0,+t)},vertexAttrib1fv(e,t){if(e|=0,!this._checkVertexIndex(e))return;if(typeof t!=`object`||!t||t.length<1){this.setError(this.INVALID_OPERATION);return}let n=this._vertexGlobalState._attribs[e]._data;n[3]=1,n[2]=0,n[1]=0,n[0]=t[0],this._gl.vertexAttrib1f(e|0,+t[0])},vertexAttrib2f(e,t,n){if(e|=0,!this._checkVertexIndex(e))return;let r=this._vertexGlobalState._attribs[e]._data;r[3]=1,r[2]=0,r[1]=n,r[0]=t,this._gl.vertexAttrib2f(e|0,+t,+n)},vertexAttrib2fv(e,t){if(e|=0,!this._checkVertexIndex(e))return;if(typeof t!=`object`||!t||t.length<2){this.setError(this.INVALID_OPERATION);return}let n=this._vertexGlobalState._attribs[e]._data;n[3]=1,n[2]=0,n[1]=t[1],n[0]=t[0],this._gl.vertexAttrib2f(e|0,+t[0],+t[1])},vertexAttrib3f(e,t,n,r){if(e|=0,!this._checkVertexIndex(e))return;let i=this._vertexGlobalState._attribs[e]._data;i[3]=1,i[2]=r,i[1]=n,i[0]=t,this._gl.vertexAttrib3f(e|0,+t,+n,+r)},vertexAttrib3fv(e,t){if(e|=0,!this._checkVertexIndex(e))return;if(typeof t!=`object`||!t||t.length<3){this.setError(this.INVALID_OPERATION);return}let n=this._vertexGlobalState._attribs[e]._data;n[3]=1,n[2]=t[2],n[1]=t[1],n[0]=t[0],this._gl.vertexAttrib3f(e|0,+t[0],+t[1],+t[2])},vertexAttrib4f(e=0,t,n,r,i){if(!this._checkVertexIndex(e))return;let a=this._vertexGlobalState._attribs[e]._data;a[3]=i,a[2]=r,a[1]=n,a[0]=t,this._gl.vertexAttrib4f(e|0,+t,+n,+r,+i)},vertexAttrib4fv(e,t){if(e|=0,!this._checkVertexIndex(e))return;if(typeof t!=`object`||!t||t.length<4){this.setError(this.INVALID_OPERATION);return}let n=this._vertexGlobalState._attribs[e]._data;n[3]=t[3],n[2]=t[2],n[1]=t[1],n[0]=t[0],this._gl.vertexAttrib4f(e|0,+t[0],+t[1],+t[2],+t[3])},vertexAttribPointer(e=0,t=0,r=0,i=!1,a=0,o=0){if(a<0||o<0){this.setError(this.INVALID_VALUE);return}if(a<0||o<0||e<0||e>=this._vertexObjectState._attribs.length||!(t===1||t===2||t===3||t===4)){this.setError(this.INVALID_VALUE);return}if(this._vertexGlobalState._arrayBufferBinding===null){this.setError(this.INVALID_OPERATION);return}let s=n(this,r);if(s===0||r===this.INT||r===this.UNSIGNED_INT){this.setError(this.INVALID_ENUM);return}if(a>255||a<0){this.setError(this.INVALID_VALUE);return}if(a%s!==0||o%s!==0){this.setError(this.INVALID_OPERATION);return}this._gl.vertexAttribPointer(e,t,r,i,a,o),this._vertexObjectState.setVertexAttribPointer(this._vertexGlobalState._arrayBufferBinding,e,t*s,o,a||t*s,r,i,a,t)},getVertexAttrib(e=0,t=0){if(e<0||e>=this._vertexObjectState._attribs.length)return this.setError(this.INVALID_VALUE),null;let n=this._vertexObjectState._attribs[e],r=this._vertexGlobalState._attribs[e]._data,i=this._extensions.angle_instanced_arrays;if(i&&t===i.VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE)return n._divisor;switch(t){case this.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:return n._pointerBuffer;case this.VERTEX_ATTRIB_ARRAY_ENABLED:return n._isPointer;case this.VERTEX_ATTRIB_ARRAY_SIZE:return n._inputSize;case this.VERTEX_ATTRIB_ARRAY_STRIDE:return n._inputStride;case this.VERTEX_ATTRIB_ARRAY_TYPE:return n._pointerType;case this.VERTEX_ATTRIB_ARRAY_NORMALIZED:return n._pointerNormal;case this.CURRENT_VERTEX_ATTRIB:return new Float32Array(r);default:return this.setError(this.INVALID_ENUM),null}},getVertexAttribOffset(e=0,t=0){return e<0||e>=this._vertexObjectState._attribs.length?(this.setError(this.INVALID_VALUE),-1):t===this.VERTEX_ATTRIB_ARRAY_POINTER?this._vertexObjectState._attribs[e]._pointerOffset:(this.setError(this.INVALID_ENUM),-1)},_checkVertexAttribState(e){let t=this._activeProgram;if(!t)return this.setError(this.INVALID_OPERATION),!1;let n=this._vertexObjectState._attribs;for(let r=0;r<n.length;++r){let i=n[r];if(i._isPointer){let n=i._pointerBuffer;if(!n)return this.setError(this.INVALID_OPERATION),!1;if(t._attributes.indexOf(r)>=0){let t=0;if(t=i._divisor?i._pointerSize+i._pointerOffset:i._pointerStride*e+i._pointerSize+i._pointerOffset,t>n._size)return this.setError(this.INVALID_OPERATION),!1}}}return!0},_checkVertexIndex(e){return e<0||e>=this._vertexObjectState._attribs.length?(this.setError(this.INVALID_VALUE),!1):!0}};function installDrawingMethods(e){Object.assign(e,i)}export{installDrawingMethods};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"../_virtual/_rolldown/runtime.js";import{Uint8ArrayToVariant as e,checkObject as t}from"../utils.js";import{WebGLFramebuffer as n}from"../webgl-framebuffer.js";import{WebGLRenderbuffer as r}from"../webgl-renderbuffer.js";import{WebGLTexture as i}from"../webgl-texture.js";import{WebGLDrawingBufferWrapper as a}from"../webgl-drawing-buffer-wrapper.js";const o={bindFramebuffer(e,r){if(!t(r))throw TypeError(`bindFramebuffer(GLenum, WebGLFramebuffer)`);if(e!==this.FRAMEBUFFER){this.setError(this.INVALID_ENUM);return}if(!r)this._gl.bindFramebuffer(this.FRAMEBUFFER,this._gtkFboId);else if(r._pendingDelete)return;else if(this._checkWrapper(r,n))this._gl.bindFramebuffer(this.FRAMEBUFFER,r._|0);else return;let i=this._activeFramebuffer;i!==r&&(i&&(--i._refCount,i._checkDelete()),r&&(r._refCount+=1)),this._activeFramebuffer=r,r&&this._updateFramebufferAttachments(r)},bindRenderbuffer(e,n){if(!t(n))throw TypeError(`bindRenderbuffer(GLenum, WebGLRenderbuffer)`);if(e!==this.RENDERBUFFER){this.setError(this.INVALID_ENUM);return}if(!n)this._gl.bindRenderbuffer(e|0,0);else if(n._pendingDelete)return;else if(this._checkWrapper(n,r))this._gl.bindRenderbuffer(e|0,n._|0);else return;let i=this._activeRenderbuffer;i!==n&&(i&&(--i._refCount,i._checkDelete()),n&&(n._refCount+=1)),this._activeRenderbuffer=n},framebufferRenderbuffer(e,n,i,a){if(!t(a))throw TypeError(`framebufferRenderbuffer(GLenum, GLenum, GLenum, WebGLRenderbuffer)`);if(e!==this.FRAMEBUFFER||!this._validFramebufferAttachment(n)||i!==this.RENDERBUFFER){this.setError(this.INVALID_ENUM);return}let o=this._activeFramebuffer;if(!o){this.setError(this.INVALID_OPERATION);return}a&&!this._checkWrapper(a,r)||(o._setAttachment(a,n),this._updateFramebufferAttachments(o))},framebufferTexture2D(e,n,r,a,o=0){if(e|=0,n|=0,r|=0,o|=0,!t(a))throw TypeError(`framebufferTexture2D(GLenum, GLenum, GLenum, WebGLTexture, GLint)`);if(e!==this.FRAMEBUFFER||!this._validFramebufferAttachment(n)){this.setError(this.INVALID_ENUM);return}if(o!==0){this.setError(this.INVALID_VALUE);return}if(a&&!this._checkWrapper(a,i))return;if(r===this.TEXTURE_2D){if(a&&a._binding!==this.TEXTURE_2D){this.setError(this.INVALID_OPERATION);return}}else if(this._validCubeTarget(r)){if(a&&a._binding!==this.TEXTURE_CUBE_MAP){this.setError(this.INVALID_OPERATION);return}}else{this.setError(this.INVALID_ENUM);return}let s=this._activeFramebuffer;if(!s){this.setError(this.INVALID_OPERATION);return}s._attachmentLevel[n]=o,s._attachmentFace[n]=r,s._setAttachment(a,n),this._updateFramebufferAttachments(s)},createFramebuffer(){let e=this._gl.createFramebuffer();if(e<=0)return null;let t=new n(e,this);return this._framebuffers[e]=t,t},deleteFramebuffer(e){if(!t(e))throw TypeError(`deleteFramebuffer(WebGLFramebuffer)`);if(!(e instanceof n&&this._checkOwns(e))){this.setError(this.INVALID_OPERATION);return}this._activeFramebuffer===e&&this.bindFramebuffer(this.FRAMEBUFFER,null),e._pendingDelete=!0,e._checkDelete()},createRenderbuffer(){let e=this._gl.createRenderbuffer();if(e<=0)return null;let t=new r(e,this);return this._renderbuffers[e]=t,t},deleteRenderbuffer(e){if(!t(e))throw TypeError(`deleteRenderbuffer(WebGLRenderbuffer)`);if(!(e instanceof r&&this._checkOwns(e))){this.setError(this.INVALID_OPERATION);return}this._activeRenderbuffer===e&&this.bindRenderbuffer(this.RENDERBUFFER,null);let n=this._activeFramebuffer;this._tryDetachFramebuffer(n,e),e._pendingDelete=!0,e._checkDelete()},renderbufferStorage(e=0,t=0,n=0,r=0){if(e!==this.RENDERBUFFER){this.setError(this.INVALID_ENUM);return}let i=this._activeRenderbuffer;if(!i){this.setError(this.INVALID_OPERATION);return}if(t!==this.RGBA4&&t!==this.RGB565&&t!==this.RGB5_A1&&t!==this.DEPTH_COMPONENT16&&t!==this.STENCIL_INDEX&&t!==this.STENCIL_INDEX8&&t!==this.DEPTH_STENCIL){this.setError(this.INVALID_ENUM);return}this._saveError(),this._gl.renderbufferStorage(e,t,n,r);let a=this.getError();if(this._restoreError(a),a!==this.NO_ERROR)return;i._width=n,i._height=r,i._format=t;let o=this._activeFramebuffer;if(o){let e=!1,t=this._getAttachments();for(let n=0;n<t.length;++n)if(o._attachments[t[n]]===i){e=!0;break}e&&this._updateFramebufferAttachments(this._activeFramebuffer)}},getFramebufferAttachmentParameter(e=0,t=0,n=0){if(e!==this.FRAMEBUFFER||!this._validFramebufferAttachment(t))return this.setError(this.INVALID_ENUM),null;let a=this._activeFramebuffer;if(!a)return this.setError(this.INVALID_OPERATION),null;let o=a._attachments[t];if(o===null){if(n===this.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)return this.NONE}else if(o instanceof i)switch(n){case this.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:return o;case this.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:return this.TEXTURE;case this.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:return a._attachmentLevel[t];case this.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:{let e=a._attachmentFace[t];return e===this.TEXTURE_2D?0:e}}else if(o instanceof r)switch(n){case this.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:return o;case this.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:return this.RENDERBUFFER}return this.setError(this.INVALID_ENUM),null},getRenderbufferParameter(e=0,t=0){if(e!==this.RENDERBUFFER)return this.setError(this.INVALID_ENUM),null;let n=this._activeRenderbuffer;if(!n)return this.setError(this.INVALID_OPERATION),null;switch(t){case this.RENDERBUFFER_INTERNAL_FORMAT:return n._format;case this.RENDERBUFFER_WIDTH:return n._width;case this.RENDERBUFFER_HEIGHT:return n._height;case this.MAX_RENDERBUFFER_SIZE:case this.RENDERBUFFER_RED_SIZE:case this.RENDERBUFFER_GREEN_SIZE:case this.RENDERBUFFER_BLUE_SIZE:case this.RENDERBUFFER_ALPHA_SIZE:case this.RENDERBUFFER_DEPTH_SIZE:case this.RENDERBUFFER_STENCIL_SIZE:return this._gl.getRenderbufferParameter(e,t)}return this.setError(this.INVALID_ENUM),null},checkFramebufferStatus(e){if(e!==this.FRAMEBUFFER)return this.setError(this.INVALID_ENUM),0;let t=this._activeFramebuffer;return t?this._preCheckFramebufferStatus(t):this.FRAMEBUFFER_COMPLETE},_preCheckFramebufferStatus(e){let t=e._attachments,n=[],a=[],o=t[this.DEPTH_ATTACHMENT],s=t[this.DEPTH_STENCIL_ATTACHMENT],c=t[this.STENCIL_ATTACHMENT];if(s&&(c||o)||c&&o)return this.FRAMEBUFFER_UNSUPPORTED;let l=this._getColorAttachments(),u=0;for(let e in t)t[e]&&l.indexOf(Number(e))!==-1&&u++;if(u===0)return this.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT;if(s instanceof i)return this.FRAMEBUFFER_UNSUPPORTED;if(s instanceof r){if(s._format!==this.DEPTH_STENCIL)return this.FRAMEBUFFER_INCOMPLETE_ATTACHMENT;n.push(s._width),a.push(s._height)}if(o instanceof i)return this.FRAMEBUFFER_UNSUPPORTED;if(o instanceof r){if(o._format!==this.DEPTH_COMPONENT16)return this.FRAMEBUFFER_INCOMPLETE_ATTACHMENT;n.push(o._width),a.push(o._height)}if(c instanceof i)return this.FRAMEBUFFER_UNSUPPORTED;if(c instanceof r){if(c._format!==this.STENCIL_INDEX8)return this.FRAMEBUFFER_INCOMPLETE_ATTACHMENT;n.push(c._width),a.push(c._height)}let d=!1;for(let o=0;o<l.length;++o){let s=t[l[o]];if(s instanceof i){if(s._format!==this.RGBA||!(s._type===this.UNSIGNED_BYTE||s._type===this.FLOAT))return this.FRAMEBUFFER_INCOMPLETE_ATTACHMENT;d=!0;let t=e._attachmentLevel[this.COLOR_ATTACHMENT0];if(t===null)throw TypeError(`level is null!`);n.push(s._levelWidth[t]),a.push(s._levelHeight[t])}else if(s instanceof r){let e=s._format;if(e!==this.RGBA4&&e!==this.RGB565&&e!==this.RGB5_A1)return this.FRAMEBUFFER_INCOMPLETE_ATTACHMENT;d=!0,n.push(s._width),a.push(s._height)}}if(!d&&!c&&!o&&!s)return this.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT;if(n.length<=0||a.length<=0)return this.FRAMEBUFFER_INCOMPLETE_ATTACHMENT;for(let e=1;e<n.length;++e)if(n[e-1]!==n[e]||a[e-1]!==a[e])return this.FRAMEBUFFER_INCOMPLETE_DIMENSIONS;return n[0]===0||a[0]===0?this.FRAMEBUFFER_INCOMPLETE_ATTACHMENT:(e._width=n[0],e._height=a[0],this.FRAMEBUFFER_COMPLETE)},_framebufferOk(){let e=this._activeFramebuffer;return e&&this._preCheckFramebufferStatus(e)!==this.FRAMEBUFFER_COMPLETE?(this.setError(this.INVALID_FRAMEBUFFER_OPERATION),!1):!0},_validFramebufferAttachment(e){switch(e){case this.DEPTH_ATTACHMENT:case this.STENCIL_ATTACHMENT:case this.DEPTH_STENCIL_ATTACHMENT:case this.COLOR_ATTACHMENT0:return!0}if(this._extensions.webgl_draw_buffers){let{webgl_draw_buffers:t}=this._extensions;return e<t.COLOR_ATTACHMENT0_WEBGL+t._maxDrawBuffers}return!1},_updateFramebufferAttachments(e){if(!e)return;let t=e._status,n=this._getAttachments();if(e._status=this._preCheckFramebufferStatus(e),e._status!==this.FRAMEBUFFER_COMPLETE){if(t===this.FRAMEBUFFER_COMPLETE)for(let t=0;t<n.length;++t){let r=n[t];this._gl.framebufferTexture2D(this.FRAMEBUFFER,r,e._attachmentFace[r]||0,0,e._attachmentLevel[r]||0)}return}for(let t=0;t<n.length;++t){let r=n[t];this._gl.framebufferTexture2D(this.FRAMEBUFFER,r,e._attachmentFace[r]||0,0,e._attachmentLevel[r]||0)}for(let t=0;t<n.length;++t){let a=n[t],o=e._attachments[a];o instanceof i?this._gl.framebufferTexture2D(this.FRAMEBUFFER,a,e._attachmentFace[a]||0,o._|0,e._attachmentLevel[a]||0):o instanceof r&&this._gl.framebufferRenderbuffer(this.FRAMEBUFFER,a,this.RENDERBUFFER,o._|0)}},_tryDetachFramebuffer(e,t){if(e&&e._linked(t)){let n=this._getAttachments(),r=Object.keys(e._attachments);for(let i=0;i<r.length;++i)e._attachments[n[i]]===t&&this.framebufferTexture2D(this.FRAMEBUFFER,n[i]|0,this.TEXTURE_2D,null)}},_getAttachments(){return this._extensions.webgl_draw_buffers?this._extensions.webgl_draw_buffers._ALL_ATTACHMENTS:this.DEFAULT_ATTACHMENTS},_getColorAttachments(){return this._extensions.webgl_draw_buffers?this._extensions.webgl_draw_buffers._ALL_COLOR_ATTACHMENTS:this.DEFAULT_COLOR_ATTACHMENTS},_resizeDrawingBuffer(t,n){let r=this._activeFramebuffer,i=this._getActiveTexture(this.TEXTURE_2D),a=this._activeRenderbuffer,o=this._contextAttributes,s=this._drawingBuffer;s?._framebuffer&&this._gl.bindFramebuffer(this.FRAMEBUFFER,s?._framebuffer);let c=this._getAttachments();for(let e=0;e<c.length;++e)this._gl.framebufferTexture2D(this.FRAMEBUFFER,c[e],this.TEXTURE_2D,0,0);s?._color&&this._gl.bindTexture(this.TEXTURE_2D,s?._color);let l=o.alpha?this.RGBA:this.RGB;this._gl.texImage2D(this.TEXTURE_2D,0,l,t,n,0,l,this.UNSIGNED_BYTE,e(null)),this._gl.texParameteri(this.TEXTURE_2D,this.TEXTURE_MIN_FILTER,this.NEAREST),this._gl.texParameteri(this.TEXTURE_2D,this.TEXTURE_MAG_FILTER,this.NEAREST),s?._color&&this._gl.framebufferTexture2D(this.FRAMEBUFFER,this.COLOR_ATTACHMENT0,this.TEXTURE_2D,s?._color,0);let u=0,d=0;o.depth&&o.stencil?(u=this.DEPTH_STENCIL,d=this.DEPTH_STENCIL_ATTACHMENT):o.depth?(u=33191,d=this.DEPTH_ATTACHMENT):o.stencil&&(u=this.STENCIL_INDEX8,d=this.STENCIL_ATTACHMENT),u&&(s?._depthStencil&&this._gl.bindRenderbuffer(this.RENDERBUFFER,s?._depthStencil),this._gl.renderbufferStorage(this.RENDERBUFFER,u,t,n),s?._depthStencil&&this._gl.framebufferRenderbuffer(this.FRAMEBUFFER,d,this.RENDERBUFFER,s?._depthStencil)),this.bindFramebuffer(this.FRAMEBUFFER,r),this.bindTexture(this.TEXTURE_2D,i),this.bindRenderbuffer(this.RENDERBUFFER,a)},_allocateDrawingBuffer(e,t){this._drawingBuffer=new a(this._gl.createFramebuffer(),this._gl.createTexture(),this._gl.createRenderbuffer()),this._resizeDrawingBuffer(e,t)},resize(e=0,t=0){if(e|=0,t|=0,e>0&&t>0)(e!==this.drawingBufferWidth||t!==this.drawingBufferHeight)&&this._resizeDrawingBuffer(e,t);else throw Error(`Invalid surface dimensions`)}};function installFramebufferMethods(e){Object.assign(e,o)}export{installFramebufferMethods};
|