@gjsify/webgl 0.37.0 → 0.38.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/conformance/attribs.spec.js +1 -1
- package/lib/esm/conformance/buffers.spec.js +1 -1
- package/lib/esm/conformance/context.spec.js +1 -1
- package/lib/esm/conformance/programs.spec.js +1 -1
- package/lib/esm/conformance/rendering-basic.spec.js +1 -1
- package/lib/esm/conformance/rendering.spec.js +1 -1
- package/lib/esm/conformance/state.spec.js +1 -1
- package/lib/esm/conformance/textures.spec.js +1 -1
- package/lib/esm/conformance/uniforms.spec.js +1 -1
- package/lib/esm/webgl1.spec.js +1 -1
- package/lib/esm/webgl2.spec.js +1 -1
- package/package.json +15 -15
|
@@ -1,3 +1,3 @@
|
|
|
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(`
|
|
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(`Gl`,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
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{__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(`
|
|
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(`Gl`,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{__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(`
|
|
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(`Gl`,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=[],t=o;for(let n of c)typeof t[n]!=`function`&&e.push(n);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=[],t=o;for(let[n,r]of l){let i=t[n];i!==r&&e.push(`${n}: expected ${r}, got ${i}`)}if(e.length>0)throw Error(`Wrong constant values:\n${e.join(`
|
|
2
2
|
`)}`)}),await a(`WebGLRenderingContext class constant values match instance constants`,async()=>{let e=[],t=s;for(let[n,r]of l){let i=t[n];i!==void 0&&i!==r&&e.push(`${n}: expected ${r}, got ${i}`)}if(e.length>0)throw Error(`Wrong class constant values:\n${e.join(`
|
|
3
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};
|
|
@@ -4,4 +4,4 @@ import{__name as e}from"../_virtual/_rolldown/runtime.js";import{destroyTestFBO
|
|
|
4
4
|
uniform mat4 u_modelViewProjMatrix;
|
|
5
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 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};
|
|
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(`Gl`,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
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
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(`
|
|
4
|
+
void main() { gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0); }`;var m=e(async()=>{await d(`Gl`,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};
|
|
@@ -7,7 +7,7 @@ import{__name as e}from"../_virtual/_rolldown/runtime.js";import{destroyTestFBO
|
|
|
7
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 _=e(async()=>{await p(`
|
|
10
|
+
void main() { gl_FragColor = color; }`;var _=e(async()=>{await p(`Gl`,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
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;
|
|
@@ -1 +1 @@
|
|
|
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
|
+
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(`Gl`,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};
|
|
@@ -9,4 +9,4 @@ import{__name as e}from"../_virtual/_rolldown/runtime.js";import{destroyTestFBO
|
|
|
9
9
|
precision mediump float;
|
|
10
10
|
uniform sampler2D uTex;
|
|
11
11
|
varying vec2 vTexCoord;
|
|
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)})}),await s(`textures/deleteTexture-multiFBO`,async()=>{o(async()=>{p.make_current()}),await l(`detaches deleted texture from every framebuffer that referenced it`,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),u.texImage2D(u.TEXTURE_2D,0,u.RGBA,1,1,0,u.RGBA,u.UNSIGNED_BYTE,new Uint8Array([255,255,255,255]));let t=u.createFramebuffer();u.bindFramebuffer(u.FRAMEBUFFER,t),u.framebufferTexture2D(u.FRAMEBUFFER,u.COLOR_ATTACHMENT0,u.TEXTURE_2D,e,0);let n=u.createFramebuffer();u.bindFramebuffer(u.FRAMEBUFFER,n),u.framebufferTexture2D(u.FRAMEBUFFER,u.COLOR_ATTACHMENT0,u.TEXTURE_2D,e,0),c(u.getError()).toBe(u.NO_ERROR),c(u.getFramebufferAttachmentParameter(u.FRAMEBUFFER,u.COLOR_ATTACHMENT0,u.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)).toBe(u.TEXTURE),u.bindFramebuffer(u.FRAMEBUFFER,t),c(u.getFramebufferAttachmentParameter(u.FRAMEBUFFER,u.COLOR_ATTACHMENT0,u.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)).toBe(u.TEXTURE),u.bindFramebuffer(u.FRAMEBUFFER,n),u.bindTexture(u.TEXTURE_2D,null),u.deleteTexture(e),c(u.getFramebufferAttachmentParameter(u.FRAMEBUFFER,u.COLOR_ATTACHMENT0,u.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)).toBe(u.NONE),u.bindFramebuffer(u.FRAMEBUFFER,t),c(u.getFramebufferAttachmentParameter(u.FRAMEBUFFER,u.COLOR_ATTACHMENT0,u.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)).toBe(u.NONE),c(u.getError()).toBe(u.NO_ERROR),u.bindFramebuffer(u.FRAMEBUFFER,null),u.deleteFramebuffer(t),u.deleteFramebuffer(n)}),await l(`detaches deleted renderbuffer from every framebuffer that referenced it`,async()=>{let e=u.createRenderbuffer();u.bindRenderbuffer(u.RENDERBUFFER,e),u.renderbufferStorage(u.RENDERBUFFER,u.DEPTH_COMPONENT16,1,1);let t=u.createFramebuffer();u.bindFramebuffer(u.FRAMEBUFFER,t),u.framebufferRenderbuffer(u.FRAMEBUFFER,u.DEPTH_ATTACHMENT,u.RENDERBUFFER,e);let n=u.createFramebuffer();u.bindFramebuffer(u.FRAMEBUFFER,n),u.framebufferRenderbuffer(u.FRAMEBUFFER,u.DEPTH_ATTACHMENT,u.RENDERBUFFER,e),c(u.getError()).toBe(u.NO_ERROR),u.bindRenderbuffer(u.RENDERBUFFER,null),u.deleteRenderbuffer(e),c(u.getFramebufferAttachmentParameter(u.FRAMEBUFFER,u.DEPTH_ATTACHMENT,u.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)).toBe(u.NONE),u.bindFramebuffer(u.FRAMEBUFFER,t),c(u.getFramebufferAttachmentParameter(u.FRAMEBUFFER,u.DEPTH_ATTACHMENT,u.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)).toBe(u.NONE),c(u.getError()).toBe(u.NO_ERROR),u.bindFramebuffer(u.FRAMEBUFFER,null),u.deleteFramebuffer(t),u.deleteFramebuffer(n)})})})},`default`);export{p as default};
|
|
12
|
+
void main() { gl_FragColor = texture2D(uTex, vTexCoord); }`;var p=e(async()=>{await u(`Gl`,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)})}),await s(`textures/deleteTexture-multiFBO`,async()=>{o(async()=>{p.make_current()}),await l(`detaches deleted texture from every framebuffer that referenced it`,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),u.texImage2D(u.TEXTURE_2D,0,u.RGBA,1,1,0,u.RGBA,u.UNSIGNED_BYTE,new Uint8Array([255,255,255,255]));let t=u.createFramebuffer();u.bindFramebuffer(u.FRAMEBUFFER,t),u.framebufferTexture2D(u.FRAMEBUFFER,u.COLOR_ATTACHMENT0,u.TEXTURE_2D,e,0);let n=u.createFramebuffer();u.bindFramebuffer(u.FRAMEBUFFER,n),u.framebufferTexture2D(u.FRAMEBUFFER,u.COLOR_ATTACHMENT0,u.TEXTURE_2D,e,0),c(u.getError()).toBe(u.NO_ERROR),c(u.getFramebufferAttachmentParameter(u.FRAMEBUFFER,u.COLOR_ATTACHMENT0,u.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)).toBe(u.TEXTURE),u.bindFramebuffer(u.FRAMEBUFFER,t),c(u.getFramebufferAttachmentParameter(u.FRAMEBUFFER,u.COLOR_ATTACHMENT0,u.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)).toBe(u.TEXTURE),u.bindFramebuffer(u.FRAMEBUFFER,n),u.bindTexture(u.TEXTURE_2D,null),u.deleteTexture(e),c(u.getFramebufferAttachmentParameter(u.FRAMEBUFFER,u.COLOR_ATTACHMENT0,u.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)).toBe(u.NONE),u.bindFramebuffer(u.FRAMEBUFFER,t),c(u.getFramebufferAttachmentParameter(u.FRAMEBUFFER,u.COLOR_ATTACHMENT0,u.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)).toBe(u.NONE),c(u.getError()).toBe(u.NO_ERROR),u.bindFramebuffer(u.FRAMEBUFFER,null),u.deleteFramebuffer(t),u.deleteFramebuffer(n)}),await l(`detaches deleted renderbuffer from every framebuffer that referenced it`,async()=>{let e=u.createRenderbuffer();u.bindRenderbuffer(u.RENDERBUFFER,e),u.renderbufferStorage(u.RENDERBUFFER,u.DEPTH_COMPONENT16,1,1);let t=u.createFramebuffer();u.bindFramebuffer(u.FRAMEBUFFER,t),u.framebufferRenderbuffer(u.FRAMEBUFFER,u.DEPTH_ATTACHMENT,u.RENDERBUFFER,e);let n=u.createFramebuffer();u.bindFramebuffer(u.FRAMEBUFFER,n),u.framebufferRenderbuffer(u.FRAMEBUFFER,u.DEPTH_ATTACHMENT,u.RENDERBUFFER,e),c(u.getError()).toBe(u.NO_ERROR),u.bindRenderbuffer(u.RENDERBUFFER,null),u.deleteRenderbuffer(e),c(u.getFramebufferAttachmentParameter(u.FRAMEBUFFER,u.DEPTH_ATTACHMENT,u.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)).toBe(u.NONE),u.bindFramebuffer(u.FRAMEBUFFER,t),c(u.getFramebufferAttachmentParameter(u.FRAMEBUFFER,u.DEPTH_ATTACHMENT,u.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)).toBe(u.NONE),c(u.getError()).toBe(u.NO_ERROR),u.bindFramebuffer(u.FRAMEBUFFER,null),u.deleteFramebuffer(t),u.deleteFramebuffer(n)})})})},`default`);export{p as default};
|
|
@@ -1 +1 @@
|
|
|
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(`
|
|
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(`Gl`,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};
|
package/lib/esm/webgl1.spec.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
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,readPixel as c}from"./test-utils.js";import{beforeEach as l,describe as u,expect as d,it as f,on as p}from"@gjsify/unit";import{WebGLBridge as m}from"@gjsify/webgl";import h from"@girs/glib-2.0";import g from"@girs/gtk-4.0";const _=`ACTIVE_ATTRIBUTES.ACTIVE_TEXTURE.ACTIVE_UNIFORMS.ALIASED_LINE_WIDTH_RANGE.ALIASED_POINT_SIZE_RANGE.ALPHA.ALPHA_BITS.ALWAYS.ARRAY_BUFFER.ARRAY_BUFFER_BINDING.ATTACHED_SHADERS.BACK.BLEND.BLEND_COLOR.BLEND_DST_ALPHA.BLEND_DST_RGB.BLEND_EQUATION.BLEND_EQUATION_ALPHA.BLEND_EQUATION_RGB.BLEND_SRC_ALPHA.BLEND_SRC_RGB.BLUE_BITS.BOOL.BOOL_VEC2.BOOL_VEC3.BOOL_VEC4.BROWSER_DEFAULT_WEBGL.BUFFER_SIZE.BUFFER_USAGE.BYTE.CCW.CLAMP_TO_EDGE.COLOR_ATTACHMENT0.COLOR_BUFFER_BIT.COLOR_CLEAR_VALUE.COLOR_WRITEMASK.COMPILE_STATUS.COMPRESSED_TEXTURE_FORMATS.CONSTANT_ALPHA.CONSTANT_COLOR.CONTEXT_LOST_WEBGL.CULL_FACE.CULL_FACE_MODE.CURRENT_PROGRAM.CURRENT_VERTEX_ATTRIB.CW.DECR.DECR_WRAP.DELETE_STATUS.DEPTH_ATTACHMENT.DEPTH_BITS.DEPTH_BUFFER_BIT.DEPTH_CLEAR_VALUE.DEPTH_COMPONENT.DEPTH_COMPONENT16.DEPTH_FUNC.DEPTH_RANGE.DEPTH_STENCIL.DEPTH_STENCIL_ATTACHMENT.DEPTH_TEST.DEPTH_WRITEMASK.DITHER.DONT_CARE.DST_ALPHA.DST_COLOR.DYNAMIC_DRAW.ELEMENT_ARRAY_BUFFER.ELEMENT_ARRAY_BUFFER_BINDING.EQUAL.FASTEST.FLOAT.FLOAT_MAT2.FLOAT_MAT3.FLOAT_MAT4.FLOAT_VEC2.FLOAT_VEC3.FLOAT_VEC4.FRAGMENT_SHADER.FRAMEBUFFER.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL.FRAMEBUFFER_BINDING.FRAMEBUFFER_COMPLETE.FRAMEBUFFER_INCOMPLETE_ATTACHMENT.FRAMEBUFFER_INCOMPLETE_DIMENSIONS.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT.FRAMEBUFFER_UNSUPPORTED.FRONT.FRONT_AND_BACK.FRONT_FACE.FUNC_ADD.FUNC_REVERSE_SUBTRACT.FUNC_SUBTRACT.GENERATE_MIPMAP_HINT.GEQUAL.GREATER.GREEN_BITS.HIGH_FLOAT.HIGH_INT.IMPLEMENTATION_COLOR_READ_FORMAT.IMPLEMENTATION_COLOR_READ_TYPE.INCR.INCR_WRAP.INT.INT_VEC2.INT_VEC3.INT_VEC4.INVALID_ENUM.INVALID_FRAMEBUFFER_OPERATION.INVALID_OPERATION.INVALID_VALUE.INVERT.KEEP.LEQUAL.LESS.LINEAR.LINEAR_MIPMAP_LINEAR.LINEAR_MIPMAP_NEAREST.LINES.LINE_LOOP.LINE_STRIP.LINE_WIDTH.LINK_STATUS.LOW_FLOAT.LOW_INT.LUMINANCE.LUMINANCE_ALPHA.MAX_COMBINED_TEXTURE_IMAGE_UNITS.MAX_CUBE_MAP_TEXTURE_SIZE.MAX_FRAGMENT_UNIFORM_VECTORS.MAX_RENDERBUFFER_SIZE.MAX_TEXTURE_IMAGE_UNITS.MAX_TEXTURE_SIZE.MAX_VARYING_VECTORS.MAX_VERTEX_ATTRIBS.MAX_VERTEX_TEXTURE_IMAGE_UNITS.MAX_VERTEX_UNIFORM_VECTORS.MAX_VIEWPORT_DIMS.MEDIUM_FLOAT.MEDIUM_INT.MIRRORED_REPEAT.NEAREST.NEAREST_MIPMAP_LINEAR.NEAREST_MIPMAP_NEAREST.NEVER.NICEST.NONE.NOTEQUAL.NO_ERROR.ONE.ONE_MINUS_CONSTANT_ALPHA.ONE_MINUS_CONSTANT_COLOR.ONE_MINUS_DST_ALPHA.ONE_MINUS_DST_COLOR.ONE_MINUS_SRC_ALPHA.ONE_MINUS_SRC_COLOR.OUT_OF_MEMORY.PACK_ALIGNMENT.POINTS.POLYGON_OFFSET_FACTOR.POLYGON_OFFSET_FILL.POLYGON_OFFSET_UNITS.RED_BITS.RENDERBUFFER.RENDERBUFFER_ALPHA_SIZE.RENDERBUFFER_BINDING.RENDERBUFFER_BLUE_SIZE.RENDERBUFFER_DEPTH_SIZE.RENDERBUFFER_GREEN_SIZE.RENDERBUFFER_HEIGHT.RENDERBUFFER_INTERNAL_FORMAT.RENDERBUFFER_RED_SIZE.RENDERBUFFER_STENCIL_SIZE.RENDERBUFFER_WIDTH.RENDERER.REPEAT.REPLACE.RGB.RGB565.RGB5_A1.RGBA.RGBA4.SAMPLER_2D.SAMPLER_CUBE.SAMPLES.SAMPLE_ALPHA_TO_COVERAGE.SAMPLE_BUFFERS.SAMPLE_COVERAGE.SAMPLE_COVERAGE_INVERT.SAMPLE_COVERAGE_VALUE.SCISSOR_BOX.SCISSOR_TEST.SHADER_TYPE.SHADING_LANGUAGE_VERSION.SHORT.SRC_ALPHA.SRC_ALPHA_SATURATE.SRC_COLOR.STATIC_DRAW.STENCIL_ATTACHMENT.STENCIL_BACK_FAIL.STENCIL_BACK_FUNC.STENCIL_BACK_PASS_DEPTH_FAIL.STENCIL_BACK_PASS_DEPTH_PASS.STENCIL_BACK_REF.STENCIL_BACK_VALUE_MASK.STENCIL_BACK_WRITEMASK.STENCIL_BITS.STENCIL_BUFFER_BIT.STENCIL_CLEAR_VALUE.STENCIL_FAIL.STENCIL_FUNC.STENCIL_INDEX8.STENCIL_PASS_DEPTH_FAIL.STENCIL_PASS_DEPTH_PASS.STENCIL_REF.STENCIL_TEST.STENCIL_VALUE_MASK.STENCIL_WRITEMASK.STREAM_DRAW.SUBPIXEL_BITS.TEXTURE.TEXTURE0.TEXTURE1.TEXTURE10.TEXTURE11.TEXTURE12.TEXTURE13.TEXTURE14.TEXTURE15.TEXTURE16.TEXTURE17.TEXTURE18.TEXTURE19.TEXTURE2.TEXTURE20.TEXTURE21.TEXTURE22.TEXTURE23.TEXTURE24.TEXTURE25.TEXTURE26.TEXTURE27.TEXTURE28.TEXTURE29.TEXTURE3.TEXTURE30.TEXTURE31.TEXTURE4.TEXTURE5.TEXTURE6.TEXTURE7.TEXTURE8.TEXTURE9.TEXTURE_2D.TEXTURE_BINDING_2D.TEXTURE_BINDING_CUBE_MAP.TEXTURE_CUBE_MAP.TEXTURE_CUBE_MAP_NEGATIVE_X.TEXTURE_CUBE_MAP_NEGATIVE_Y.TEXTURE_CUBE_MAP_NEGATIVE_Z.TEXTURE_CUBE_MAP_POSITIVE_X.TEXTURE_CUBE_MAP_POSITIVE_Y.TEXTURE_CUBE_MAP_POSITIVE_Z.TEXTURE_MAG_FILTER.TEXTURE_MIN_FILTER.TEXTURE_WRAP_S.TEXTURE_WRAP_T.TRIANGLES.TRIANGLE_FAN.TRIANGLE_STRIP.UNPACK_ALIGNMENT.UNPACK_COLORSPACE_CONVERSION_WEBGL.UNPACK_FLIP_Y_WEBGL.UNPACK_PREMULTIPLY_ALPHA_WEBGL.UNSIGNED_BYTE.UNSIGNED_INT.UNSIGNED_SHORT.UNSIGNED_SHORT_4_4_4_4.UNSIGNED_SHORT_5_5_5_1.UNSIGNED_SHORT_5_6_5.VALIDATE_STATUS.VENDOR.VERSION.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING.VERTEX_ATTRIB_ARRAY_ENABLED.VERTEX_ATTRIB_ARRAY_NORMALIZED.VERTEX_ATTRIB_ARRAY_POINTER.VERTEX_ATTRIB_ARRAY_SIZE.VERTEX_ATTRIB_ARRAY_STRIDE.VERTEX_ATTRIB_ARRAY_TYPE.VERTEX_SHADER.VIEWPORT.ZERO`.split(`.`);var v=e(async()=>{await p(`Display`,async()=>{g.init();let e,p,v=new h.MainLoop(null,!1),y=new g.Window({});y.set_default_size(200,200),e=new m,e.onReady((e,t)=>{p=t,v.quit()}),y.set_child(e),y.present();let b=h.timeout_add(h.PRIORITY_DEFAULT,1e4,()=>(v.quit(),h.SOURCE_REMOVE));if(v.run(),h.source_remove(b),!p){console.warn(`WebGL context not available after 10s — skipping tests`),y.destroy();return}e.make_current(),await u(`WebGLRenderingContext constants`,async()=>{l(async()=>{e.make_current()}),await f(`should have all standard WebGL constants as numbers`,async()=>{for(let e of _){let t=p?.[e];d(typeof t).toBe(`number`),e===`NONE`||e===`ZERO`||e===`NO_ERROR`||e===`POINTS`?d(t===0).toBeTruthy():d(t>0).toBeTruthy()}})}),await u(`Buffers`,async()=>{l(async()=>{e.make_current()}),await f(`createBuffer returns a WebGLBuffer`,async()=>{let e=p.createBuffer();d(e).toBeDefined(),d(e).not.toBeNull()}),await f(`bindBuffer + bufferData with Float32Array`,async()=>{let e=p.createBuffer();p.bindBuffer(p.ARRAY_BUFFER,e);let t=new Float32Array([1,2,3,4]);d(()=>p.bufferData(p.ARRAY_BUFFER,t,p.STATIC_DRAW)).not.toThrow()}),await f(`getBufferParameter returns buffer size`,async()=>{let e=p.createBuffer();p.bindBuffer(p.ARRAY_BUFFER,e);let t=new Float32Array([1,2,3,4]);p.bufferData(p.ARRAY_BUFFER,t,p.STATIC_DRAW),d(p.getBufferParameter(p.ARRAY_BUFFER,p.BUFFER_SIZE)).toBe(t.byteLength)}),await f(`bufferSubData updates buffer data`,async()=>{let e=p.createBuffer();p.bindBuffer(p.ARRAY_BUFFER,e);let t=new Float32Array([1,2,3,4]);p.bufferData(p.ARRAY_BUFFER,t,p.DYNAMIC_DRAW),d(()=>p.bufferSubData(p.ARRAY_BUFFER,0,new Float32Array([9,9]))).not.toThrow()}),await f(`deleteBuffer cleans up`,async()=>{let e=p.createBuffer();d(()=>p.deleteBuffer(e)).not.toThrow()})}),await u(`Shaders`,async()=>{l(async()=>{e.make_current()});let t=`attribute vec2 position; void main() { gl_Position = vec4(position, 0.0, 1.0); }`,n=`void main() { gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0); }`;await f(`createShader returns a WebGLShader`,async()=>{let e=p.createShader(p.VERTEX_SHADER);d(e).toBeDefined(),d(e).not.toBeNull()}),await f(`vertex shader compiles successfully`,async()=>{let e=p.createShader(p.VERTEX_SHADER);p.shaderSource(e,t),p.compileShader(e);let n=p.getShaderParameter(e,p.COMPILE_STATUS);n||console.error(`Vertex shader log:`,p.getShaderInfoLog(e)),d(n).toBeTruthy()}),await f(`fragment shader compiles successfully`,async()=>{let e=p.createShader(p.FRAGMENT_SHADER);p.shaderSource(e,n),p.compileShader(e);let t=p.getShaderParameter(e,p.COMPILE_STATUS);t||console.error(`Fragment shader log:`,p.getShaderInfoLog(e)),d(t).toBeTruthy()}),await f(`program links successfully`,async()=>{let e=p.createShader(p.VERTEX_SHADER);p.shaderSource(e,t),p.compileShader(e);let r=p.createShader(p.FRAGMENT_SHADER);p.shaderSource(r,n),p.compileShader(r);let i=p.createProgram();p.attachShader(i,e),p.attachShader(i,r),p.linkProgram(i);let a=p.getProgramParameter(i,p.LINK_STATUS);a||console.error(`Program log:`,p.getProgramInfoLog(i)),d(a).toBeTruthy()})}),await u(`Textures`,async()=>{l(async()=>{e.make_current()}),await f(`createTexture returns a WebGLTexture`,async()=>{let e=p.createTexture();d(e).toBeDefined(),d(e).not.toBeNull()}),await f(`bindTexture + texImage2D with Uint8Array`,async()=>{let e=p.createTexture();p.bindTexture(p.TEXTURE_2D,e);let t=new Uint8Array([255,0,0,255]);d(()=>p.texImage2D(p.TEXTURE_2D,0,p.RGBA,1,1,0,p.RGBA,p.UNSIGNED_BYTE,t)).not.toThrow()}),await f(`texParameteri sets filter params without error`,async()=>{let e=p.createTexture();p.bindTexture(p.TEXTURE_2D,e),d(()=>{p.texParameteri(p.TEXTURE_2D,p.TEXTURE_MIN_FILTER,p.NEAREST),p.texParameteri(p.TEXTURE_2D,p.TEXTURE_MAG_FILTER,p.NEAREST),p.texParameteri(p.TEXTURE_2D,p.TEXTURE_WRAP_S,p.CLAMP_TO_EDGE),p.texParameteri(p.TEXTURE_2D,p.TEXTURE_WRAP_T,p.CLAMP_TO_EDGE)}).not.toThrow()}),await f(`deleteTexture cleans up`,async()=>{let e=p.createTexture();d(()=>p.deleteTexture(e)).not.toThrow()})}),await u(`Draw`,async()=>{l(async()=>{e.make_current()}),await f(`clearColor + clear does not throw`,async()=>{d(()=>{p.clearColor(0,0,0,1),p.clear(p.COLOR_BUFFER_BIT)}).not.toThrow(),d(p.getError()).toBe(p.NO_ERROR)}),await f(`viewport does not throw`,async()=>{d(()=>p.viewport(0,0,200,200)).not.toThrow()}),await f(`drawArrays (triangle) produces no GL error`,async()=>{let e=p.createShader(p.VERTEX_SHADER);p.shaderSource(e,`attribute vec2 position; void main() { gl_Position = vec4(position, 0.0, 1.0); }`),p.compileShader(e);let t=p.createShader(p.FRAGMENT_SHADER);p.shaderSource(t,`void main() { gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0); }`),p.compileShader(t);let n=p.createProgram();p.attachShader(n,e),p.attachShader(n,t),p.linkProgram(n),p.useProgram(n);let r=p.createBuffer();p.bindBuffer(p.ARRAY_BUFFER,r),p.bufferData(p.ARRAY_BUFFER,new Float32Array([-1,0,0,-1,1,1]),p.STATIC_DRAW);let i=p.getAttribLocation(n,`position`);p.enableVertexAttribArray(i),p.vertexAttribPointer(i,2,p.FLOAT,!1,0,0),p.clearColor(0,0,0,1),p.clear(p.COLOR_BUFFER_BIT),d(()=>p.drawArrays(p.TRIANGLES,0,3)).not.toThrow(),d(p.getError()).toBe(p.NO_ERROR)})}),await u(`Extensions`,async()=>{l(async()=>{e.make_current()}),await f(`OES_texture_float is supported`,async()=>{d(p.getExtension(`OES_texture_float`)).not.toBeNull()}),await f(`OES_standard_derivatives is supported`,async()=>{d(p.getExtension(`OES_standard_derivatives`)).not.toBeNull()}),await f(`OES_element_index_uint is supported`,async()=>{d(p.getExtension(`OES_element_index_uint`)).not.toBeNull()}),await f(`getSupportedExtensions returns an array`,async()=>{let e=p.getSupportedExtensions();d(Array.isArray(e)).toBeTruthy(),d((e?.length??0)>0).toBeTruthy()}),await f(`WEBGL_debug_renderer_info reports the real driver`,async()=>{d(p.getSupportedExtensions()?.includes(`WEBGL_debug_renderer_info`)).toBeTruthy();let e=p.getExtension(`WEBGL_debug_renderer_info`);d(e).not.toBeNull(),d(e.UNMASKED_VENDOR_WEBGL).toBe(37445),d(e.UNMASKED_RENDERER_WEBGL).toBe(37446);let t=p.getParameter(e.UNMASKED_VENDOR_WEBGL),n=p.getParameter(e.UNMASKED_RENDERER_WEBGL);d(typeof t).toBe(`string`),d(typeof n).toBe(`string`),d(n.length>0).toBeTruthy(),d(n).not.toBe(`ANGLE`)})}),await u(`Gwebgl.WebGLRenderingContext native bindings`,async()=>{l(async()=>{e.make_current()}),await f(`getParameterb returns a boolean`,async()=>{let e=p?._native.getParameterb(p?.BLEND);d(typeof e).toBe(`boolean`)}),await f(`getParameterbv returns an array of booleans`,async()=>{let e=p?._native.getParameterbv(p?.COLOR_WRITEMASK,16);if(d(Array.isArray(e)).toBeTruthy(),Array.isArray(e))for(let t of e)d(typeof t).toBe(`boolean`)}),await f(`getParameterf returns a float`,async()=>{let e=p?._native.getParameterf(p?.SAMPLE_COVERAGE_VALUE);d(typeof e).toBe(`number`)}),await f(`getParameterfv returns an array of floats`,async()=>{let e=p?._native.getParameterfv(p?.DEPTH_RANGE,8);if(d(Array.isArray(e)).toBeTruthy(),Array.isArray(e))for(let t of e)d(typeof t).toBe(`number`)}),await f(`getParameteri returns an integer`,async()=>{let e=p?._native.getParameteri(p?.ARRAY_BUFFER_BINDING);d(typeof e).toBe(`number`)}),await f(`getParameteriv returns an array of integers`,async()=>{let e=p?._native.getParameteriv(p?.MAX_VIEWPORT_DIMS,8);if(d(Array.isArray(e)).toBeTruthy(),Array.isArray(e))for(let t of e)d(typeof t).toBe(`number`)})}),await u(`simple-shader rendering`,async()=>{l(async()=>{e.make_current()}),await f(`renders a green triangle — all pixels (0,255,0,255)`,async()=>{let e=a(p,8,8);p.clearColor(0,0,0,1),p.clear(p.COLOR_BUFFER_BIT);let n=i(p,`attribute vec2 position; void main() { gl_Position = vec4(position, 0.0, 1.0); }`,`void main() { gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0); }`);d(p.getProgramParameter(n,p.LINK_STATUS)).toBeTruthy(),p.useProgram(n),r(p),d(p.getError()).toBe(p.NO_ERROR);let o=new Uint8Array(e.width*e.height*4);p.readPixels(0,0,e.width,e.height,p.RGBA,p.UNSIGNED_BYTE,o);let s=!0;for(let e=0;e<o.length;e+=4)if(o[e]!==0||o[e+1]!==255||o[e+2]!==0||o[e+3]!==255){s=!1;break}d(s).toBeTruthy(),p.deleteProgram(n),t(p,e)})}),await u(`clearColor`,async()=>{l(async()=>{e.make_current()}),await f(`clears to black (0,0,0,0)`,async()=>{let e=a(p);p.clearColor(0,0,0,0),p.clear(p.COLOR_BUFFER_BIT);let n=c(p,0,0);t(p,e),d(n[0]).toBe(0),d(n[1]).toBe(0),d(n[2]).toBe(0),d(n[3]).toBe(0)}),await f(`clears to white (255,255,255,255)`,async()=>{let e=a(p);p.clearColor(1,1,1,1),p.clear(p.COLOR_BUFFER_BIT);let n=c(p,0,0);t(p,e),d(n[0]).toBe(255),d(n[1]).toBe(255),d(n[2]).toBe(255),d(n[3]).toBe(255)}),await f(`clears to green (0,255,0,255)`,async()=>{let e=a(p);p.clearColor(0,1,0,1),p.clear(p.COLOR_BUFFER_BIT);let n=c(p,0,0);t(p,e),d(n[0]).toBe(0),d(n[1]).toBe(255),d(n[2]).toBe(0),d(n[3]).toBe(255)}),await f(`clears to magenta (255,0,255,255)`,async()=>{let e=a(p);p.clearColor(1,0,1,1),p.clear(p.COLOR_BUFFER_BIT);let n=c(p,0,0);t(p,e),d(n[0]).toBe(255),d(n[1]).toBe(0),d(n[2]).toBe(255),d(n[3]).toBe(255)})}),await u(`blending`,async()=>{l(async()=>{e.make_current()});let n=[`precision mediump float;`,`attribute vec2 position;`,`void main() { gl_Position = vec4(position, 0.0, 1.0); }`].join(`
|
|
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,readPixel as c}from"./test-utils.js";import{beforeEach as l,describe as u,expect as d,it as f,on as p}from"@gjsify/unit";import{WebGLBridge as m}from"@gjsify/webgl";import h from"@girs/glib-2.0";import g from"@girs/gtk-4.0";const _=`ACTIVE_ATTRIBUTES.ACTIVE_TEXTURE.ACTIVE_UNIFORMS.ALIASED_LINE_WIDTH_RANGE.ALIASED_POINT_SIZE_RANGE.ALPHA.ALPHA_BITS.ALWAYS.ARRAY_BUFFER.ARRAY_BUFFER_BINDING.ATTACHED_SHADERS.BACK.BLEND.BLEND_COLOR.BLEND_DST_ALPHA.BLEND_DST_RGB.BLEND_EQUATION.BLEND_EQUATION_ALPHA.BLEND_EQUATION_RGB.BLEND_SRC_ALPHA.BLEND_SRC_RGB.BLUE_BITS.BOOL.BOOL_VEC2.BOOL_VEC3.BOOL_VEC4.BROWSER_DEFAULT_WEBGL.BUFFER_SIZE.BUFFER_USAGE.BYTE.CCW.CLAMP_TO_EDGE.COLOR_ATTACHMENT0.COLOR_BUFFER_BIT.COLOR_CLEAR_VALUE.COLOR_WRITEMASK.COMPILE_STATUS.COMPRESSED_TEXTURE_FORMATS.CONSTANT_ALPHA.CONSTANT_COLOR.CONTEXT_LOST_WEBGL.CULL_FACE.CULL_FACE_MODE.CURRENT_PROGRAM.CURRENT_VERTEX_ATTRIB.CW.DECR.DECR_WRAP.DELETE_STATUS.DEPTH_ATTACHMENT.DEPTH_BITS.DEPTH_BUFFER_BIT.DEPTH_CLEAR_VALUE.DEPTH_COMPONENT.DEPTH_COMPONENT16.DEPTH_FUNC.DEPTH_RANGE.DEPTH_STENCIL.DEPTH_STENCIL_ATTACHMENT.DEPTH_TEST.DEPTH_WRITEMASK.DITHER.DONT_CARE.DST_ALPHA.DST_COLOR.DYNAMIC_DRAW.ELEMENT_ARRAY_BUFFER.ELEMENT_ARRAY_BUFFER_BINDING.EQUAL.FASTEST.FLOAT.FLOAT_MAT2.FLOAT_MAT3.FLOAT_MAT4.FLOAT_VEC2.FLOAT_VEC3.FLOAT_VEC4.FRAGMENT_SHADER.FRAMEBUFFER.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL.FRAMEBUFFER_BINDING.FRAMEBUFFER_COMPLETE.FRAMEBUFFER_INCOMPLETE_ATTACHMENT.FRAMEBUFFER_INCOMPLETE_DIMENSIONS.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT.FRAMEBUFFER_UNSUPPORTED.FRONT.FRONT_AND_BACK.FRONT_FACE.FUNC_ADD.FUNC_REVERSE_SUBTRACT.FUNC_SUBTRACT.GENERATE_MIPMAP_HINT.GEQUAL.GREATER.GREEN_BITS.HIGH_FLOAT.HIGH_INT.IMPLEMENTATION_COLOR_READ_FORMAT.IMPLEMENTATION_COLOR_READ_TYPE.INCR.INCR_WRAP.INT.INT_VEC2.INT_VEC3.INT_VEC4.INVALID_ENUM.INVALID_FRAMEBUFFER_OPERATION.INVALID_OPERATION.INVALID_VALUE.INVERT.KEEP.LEQUAL.LESS.LINEAR.LINEAR_MIPMAP_LINEAR.LINEAR_MIPMAP_NEAREST.LINES.LINE_LOOP.LINE_STRIP.LINE_WIDTH.LINK_STATUS.LOW_FLOAT.LOW_INT.LUMINANCE.LUMINANCE_ALPHA.MAX_COMBINED_TEXTURE_IMAGE_UNITS.MAX_CUBE_MAP_TEXTURE_SIZE.MAX_FRAGMENT_UNIFORM_VECTORS.MAX_RENDERBUFFER_SIZE.MAX_TEXTURE_IMAGE_UNITS.MAX_TEXTURE_SIZE.MAX_VARYING_VECTORS.MAX_VERTEX_ATTRIBS.MAX_VERTEX_TEXTURE_IMAGE_UNITS.MAX_VERTEX_UNIFORM_VECTORS.MAX_VIEWPORT_DIMS.MEDIUM_FLOAT.MEDIUM_INT.MIRRORED_REPEAT.NEAREST.NEAREST_MIPMAP_LINEAR.NEAREST_MIPMAP_NEAREST.NEVER.NICEST.NONE.NOTEQUAL.NO_ERROR.ONE.ONE_MINUS_CONSTANT_ALPHA.ONE_MINUS_CONSTANT_COLOR.ONE_MINUS_DST_ALPHA.ONE_MINUS_DST_COLOR.ONE_MINUS_SRC_ALPHA.ONE_MINUS_SRC_COLOR.OUT_OF_MEMORY.PACK_ALIGNMENT.POINTS.POLYGON_OFFSET_FACTOR.POLYGON_OFFSET_FILL.POLYGON_OFFSET_UNITS.RED_BITS.RENDERBUFFER.RENDERBUFFER_ALPHA_SIZE.RENDERBUFFER_BINDING.RENDERBUFFER_BLUE_SIZE.RENDERBUFFER_DEPTH_SIZE.RENDERBUFFER_GREEN_SIZE.RENDERBUFFER_HEIGHT.RENDERBUFFER_INTERNAL_FORMAT.RENDERBUFFER_RED_SIZE.RENDERBUFFER_STENCIL_SIZE.RENDERBUFFER_WIDTH.RENDERER.REPEAT.REPLACE.RGB.RGB565.RGB5_A1.RGBA.RGBA4.SAMPLER_2D.SAMPLER_CUBE.SAMPLES.SAMPLE_ALPHA_TO_COVERAGE.SAMPLE_BUFFERS.SAMPLE_COVERAGE.SAMPLE_COVERAGE_INVERT.SAMPLE_COVERAGE_VALUE.SCISSOR_BOX.SCISSOR_TEST.SHADER_TYPE.SHADING_LANGUAGE_VERSION.SHORT.SRC_ALPHA.SRC_ALPHA_SATURATE.SRC_COLOR.STATIC_DRAW.STENCIL_ATTACHMENT.STENCIL_BACK_FAIL.STENCIL_BACK_FUNC.STENCIL_BACK_PASS_DEPTH_FAIL.STENCIL_BACK_PASS_DEPTH_PASS.STENCIL_BACK_REF.STENCIL_BACK_VALUE_MASK.STENCIL_BACK_WRITEMASK.STENCIL_BITS.STENCIL_BUFFER_BIT.STENCIL_CLEAR_VALUE.STENCIL_FAIL.STENCIL_FUNC.STENCIL_INDEX8.STENCIL_PASS_DEPTH_FAIL.STENCIL_PASS_DEPTH_PASS.STENCIL_REF.STENCIL_TEST.STENCIL_VALUE_MASK.STENCIL_WRITEMASK.STREAM_DRAW.SUBPIXEL_BITS.TEXTURE.TEXTURE0.TEXTURE1.TEXTURE10.TEXTURE11.TEXTURE12.TEXTURE13.TEXTURE14.TEXTURE15.TEXTURE16.TEXTURE17.TEXTURE18.TEXTURE19.TEXTURE2.TEXTURE20.TEXTURE21.TEXTURE22.TEXTURE23.TEXTURE24.TEXTURE25.TEXTURE26.TEXTURE27.TEXTURE28.TEXTURE29.TEXTURE3.TEXTURE30.TEXTURE31.TEXTURE4.TEXTURE5.TEXTURE6.TEXTURE7.TEXTURE8.TEXTURE9.TEXTURE_2D.TEXTURE_BINDING_2D.TEXTURE_BINDING_CUBE_MAP.TEXTURE_CUBE_MAP.TEXTURE_CUBE_MAP_NEGATIVE_X.TEXTURE_CUBE_MAP_NEGATIVE_Y.TEXTURE_CUBE_MAP_NEGATIVE_Z.TEXTURE_CUBE_MAP_POSITIVE_X.TEXTURE_CUBE_MAP_POSITIVE_Y.TEXTURE_CUBE_MAP_POSITIVE_Z.TEXTURE_MAG_FILTER.TEXTURE_MIN_FILTER.TEXTURE_WRAP_S.TEXTURE_WRAP_T.TRIANGLES.TRIANGLE_FAN.TRIANGLE_STRIP.UNPACK_ALIGNMENT.UNPACK_COLORSPACE_CONVERSION_WEBGL.UNPACK_FLIP_Y_WEBGL.UNPACK_PREMULTIPLY_ALPHA_WEBGL.UNSIGNED_BYTE.UNSIGNED_INT.UNSIGNED_SHORT.UNSIGNED_SHORT_4_4_4_4.UNSIGNED_SHORT_5_5_5_1.UNSIGNED_SHORT_5_6_5.VALIDATE_STATUS.VENDOR.VERSION.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING.VERTEX_ATTRIB_ARRAY_ENABLED.VERTEX_ATTRIB_ARRAY_NORMALIZED.VERTEX_ATTRIB_ARRAY_POINTER.VERTEX_ATTRIB_ARRAY_SIZE.VERTEX_ATTRIB_ARRAY_STRIDE.VERTEX_ATTRIB_ARRAY_TYPE.VERTEX_SHADER.VIEWPORT.ZERO`.split(`.`);var v=e(async()=>{await p(`Gl`,async()=>{g.init();let e,p,v=new h.MainLoop(null,!1),y=new g.Window({});y.set_default_size(200,200),e=new m,e.onReady((e,t)=>{p=t,v.quit()}),y.set_child(e),y.present();let b=h.timeout_add(h.PRIORITY_DEFAULT,1e4,()=>(v.quit(),h.SOURCE_REMOVE));if(v.run(),h.source_remove(b),!p){console.warn(`WebGL context not available after 10s — skipping tests`),y.destroy();return}e.make_current(),await u(`WebGLRenderingContext constants`,async()=>{l(async()=>{e.make_current()}),await f(`should have all standard WebGL constants as numbers`,async()=>{for(let e of _){let t=p?.[e];d(typeof t).toBe(`number`),e===`NONE`||e===`ZERO`||e===`NO_ERROR`||e===`POINTS`?d(t===0).toBeTruthy():d(t>0).toBeTruthy()}})}),await u(`Buffers`,async()=>{l(async()=>{e.make_current()}),await f(`createBuffer returns a WebGLBuffer`,async()=>{let e=p.createBuffer();d(e).toBeDefined(),d(e).not.toBeNull()}),await f(`bindBuffer + bufferData with Float32Array`,async()=>{let e=p.createBuffer();p.bindBuffer(p.ARRAY_BUFFER,e);let t=new Float32Array([1,2,3,4]);d(()=>p.bufferData(p.ARRAY_BUFFER,t,p.STATIC_DRAW)).not.toThrow()}),await f(`getBufferParameter returns buffer size`,async()=>{let e=p.createBuffer();p.bindBuffer(p.ARRAY_BUFFER,e);let t=new Float32Array([1,2,3,4]);p.bufferData(p.ARRAY_BUFFER,t,p.STATIC_DRAW),d(p.getBufferParameter(p.ARRAY_BUFFER,p.BUFFER_SIZE)).toBe(t.byteLength)}),await f(`bufferSubData updates buffer data`,async()=>{let e=p.createBuffer();p.bindBuffer(p.ARRAY_BUFFER,e);let t=new Float32Array([1,2,3,4]);p.bufferData(p.ARRAY_BUFFER,t,p.DYNAMIC_DRAW),d(()=>p.bufferSubData(p.ARRAY_BUFFER,0,new Float32Array([9,9]))).not.toThrow()}),await f(`deleteBuffer cleans up`,async()=>{let e=p.createBuffer();d(()=>p.deleteBuffer(e)).not.toThrow()})}),await u(`Shaders`,async()=>{l(async()=>{e.make_current()});let t=`attribute vec2 position; void main() { gl_Position = vec4(position, 0.0, 1.0); }`,n=`void main() { gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0); }`;await f(`createShader returns a WebGLShader`,async()=>{let e=p.createShader(p.VERTEX_SHADER);d(e).toBeDefined(),d(e).not.toBeNull()}),await f(`vertex shader compiles successfully`,async()=>{let e=p.createShader(p.VERTEX_SHADER);p.shaderSource(e,t),p.compileShader(e);let n=p.getShaderParameter(e,p.COMPILE_STATUS);n||console.error(`Vertex shader log:`,p.getShaderInfoLog(e)),d(n).toBeTruthy()}),await f(`fragment shader compiles successfully`,async()=>{let e=p.createShader(p.FRAGMENT_SHADER);p.shaderSource(e,n),p.compileShader(e);let t=p.getShaderParameter(e,p.COMPILE_STATUS);t||console.error(`Fragment shader log:`,p.getShaderInfoLog(e)),d(t).toBeTruthy()}),await f(`program links successfully`,async()=>{let e=p.createShader(p.VERTEX_SHADER);p.shaderSource(e,t),p.compileShader(e);let r=p.createShader(p.FRAGMENT_SHADER);p.shaderSource(r,n),p.compileShader(r);let i=p.createProgram();p.attachShader(i,e),p.attachShader(i,r),p.linkProgram(i);let a=p.getProgramParameter(i,p.LINK_STATUS);a||console.error(`Program log:`,p.getProgramInfoLog(i)),d(a).toBeTruthy()})}),await u(`Textures`,async()=>{l(async()=>{e.make_current()}),await f(`createTexture returns a WebGLTexture`,async()=>{let e=p.createTexture();d(e).toBeDefined(),d(e).not.toBeNull()}),await f(`bindTexture + texImage2D with Uint8Array`,async()=>{let e=p.createTexture();p.bindTexture(p.TEXTURE_2D,e);let t=new Uint8Array([255,0,0,255]);d(()=>p.texImage2D(p.TEXTURE_2D,0,p.RGBA,1,1,0,p.RGBA,p.UNSIGNED_BYTE,t)).not.toThrow()}),await f(`texParameteri sets filter params without error`,async()=>{let e=p.createTexture();p.bindTexture(p.TEXTURE_2D,e),d(()=>{p.texParameteri(p.TEXTURE_2D,p.TEXTURE_MIN_FILTER,p.NEAREST),p.texParameteri(p.TEXTURE_2D,p.TEXTURE_MAG_FILTER,p.NEAREST),p.texParameteri(p.TEXTURE_2D,p.TEXTURE_WRAP_S,p.CLAMP_TO_EDGE),p.texParameteri(p.TEXTURE_2D,p.TEXTURE_WRAP_T,p.CLAMP_TO_EDGE)}).not.toThrow()}),await f(`deleteTexture cleans up`,async()=>{let e=p.createTexture();d(()=>p.deleteTexture(e)).not.toThrow()})}),await u(`Draw`,async()=>{l(async()=>{e.make_current()}),await f(`clearColor + clear does not throw`,async()=>{d(()=>{p.clearColor(0,0,0,1),p.clear(p.COLOR_BUFFER_BIT)}).not.toThrow(),d(p.getError()).toBe(p.NO_ERROR)}),await f(`viewport does not throw`,async()=>{d(()=>p.viewport(0,0,200,200)).not.toThrow()}),await f(`drawArrays (triangle) produces no GL error`,async()=>{let e=p.createShader(p.VERTEX_SHADER);p.shaderSource(e,`attribute vec2 position; void main() { gl_Position = vec4(position, 0.0, 1.0); }`),p.compileShader(e);let t=p.createShader(p.FRAGMENT_SHADER);p.shaderSource(t,`void main() { gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0); }`),p.compileShader(t);let n=p.createProgram();p.attachShader(n,e),p.attachShader(n,t),p.linkProgram(n),p.useProgram(n);let r=p.createBuffer();p.bindBuffer(p.ARRAY_BUFFER,r),p.bufferData(p.ARRAY_BUFFER,new Float32Array([-1,0,0,-1,1,1]),p.STATIC_DRAW);let i=p.getAttribLocation(n,`position`);p.enableVertexAttribArray(i),p.vertexAttribPointer(i,2,p.FLOAT,!1,0,0),p.clearColor(0,0,0,1),p.clear(p.COLOR_BUFFER_BIT),d(()=>p.drawArrays(p.TRIANGLES,0,3)).not.toThrow(),d(p.getError()).toBe(p.NO_ERROR)})}),await u(`Extensions`,async()=>{l(async()=>{e.make_current()}),await f(`OES_texture_float is supported`,async()=>{d(p.getExtension(`OES_texture_float`)).not.toBeNull()}),await f(`OES_standard_derivatives is supported`,async()=>{d(p.getExtension(`OES_standard_derivatives`)).not.toBeNull()}),await f(`OES_element_index_uint is supported`,async()=>{d(p.getExtension(`OES_element_index_uint`)).not.toBeNull()}),await f(`getSupportedExtensions returns an array`,async()=>{let e=p.getSupportedExtensions();d(Array.isArray(e)).toBeTruthy(),d((e?.length??0)>0).toBeTruthy()}),await f(`WEBGL_debug_renderer_info reports the real driver`,async()=>{d(p.getSupportedExtensions()?.includes(`WEBGL_debug_renderer_info`)).toBeTruthy();let e=p.getExtension(`WEBGL_debug_renderer_info`);d(e).not.toBeNull(),d(e.UNMASKED_VENDOR_WEBGL).toBe(37445),d(e.UNMASKED_RENDERER_WEBGL).toBe(37446);let t=p.getParameter(e.UNMASKED_VENDOR_WEBGL),n=p.getParameter(e.UNMASKED_RENDERER_WEBGL);d(typeof t).toBe(`string`),d(typeof n).toBe(`string`),d(n.length>0).toBeTruthy(),d(n).not.toBe(`ANGLE`)})}),await u(`Gwebgl.WebGLRenderingContext native bindings`,async()=>{l(async()=>{e.make_current()}),await f(`getParameterb returns a boolean`,async()=>{let e=p?._native.getParameterb(p?.BLEND);d(typeof e).toBe(`boolean`)}),await f(`getParameterbv returns an array of booleans`,async()=>{let e=p?._native.getParameterbv(p?.COLOR_WRITEMASK,16);if(d(Array.isArray(e)).toBeTruthy(),Array.isArray(e))for(let t of e)d(typeof t).toBe(`boolean`)}),await f(`getParameterf returns a float`,async()=>{let e=p?._native.getParameterf(p?.SAMPLE_COVERAGE_VALUE);d(typeof e).toBe(`number`)}),await f(`getParameterfv returns an array of floats`,async()=>{let e=p?._native.getParameterfv(p?.DEPTH_RANGE,8);if(d(Array.isArray(e)).toBeTruthy(),Array.isArray(e))for(let t of e)d(typeof t).toBe(`number`)}),await f(`getParameteri returns an integer`,async()=>{let e=p?._native.getParameteri(p?.ARRAY_BUFFER_BINDING);d(typeof e).toBe(`number`)}),await f(`getParameteriv returns an array of integers`,async()=>{let e=p?._native.getParameteriv(p?.MAX_VIEWPORT_DIMS,8);if(d(Array.isArray(e)).toBeTruthy(),Array.isArray(e))for(let t of e)d(typeof t).toBe(`number`)})}),await u(`simple-shader rendering`,async()=>{l(async()=>{e.make_current()}),await f(`renders a green triangle — all pixels (0,255,0,255)`,async()=>{let e=a(p,8,8);p.clearColor(0,0,0,1),p.clear(p.COLOR_BUFFER_BIT);let n=i(p,`attribute vec2 position; void main() { gl_Position = vec4(position, 0.0, 1.0); }`,`void main() { gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0); }`);d(p.getProgramParameter(n,p.LINK_STATUS)).toBeTruthy(),p.useProgram(n),r(p),d(p.getError()).toBe(p.NO_ERROR);let o=new Uint8Array(e.width*e.height*4);p.readPixels(0,0,e.width,e.height,p.RGBA,p.UNSIGNED_BYTE,o);let s=!0;for(let e=0;e<o.length;e+=4)if(o[e]!==0||o[e+1]!==255||o[e+2]!==0||o[e+3]!==255){s=!1;break}d(s).toBeTruthy(),p.deleteProgram(n),t(p,e)})}),await u(`clearColor`,async()=>{l(async()=>{e.make_current()}),await f(`clears to black (0,0,0,0)`,async()=>{let e=a(p);p.clearColor(0,0,0,0),p.clear(p.COLOR_BUFFER_BIT);let n=c(p,0,0);t(p,e),d(n[0]).toBe(0),d(n[1]).toBe(0),d(n[2]).toBe(0),d(n[3]).toBe(0)}),await f(`clears to white (255,255,255,255)`,async()=>{let e=a(p);p.clearColor(1,1,1,1),p.clear(p.COLOR_BUFFER_BIT);let n=c(p,0,0);t(p,e),d(n[0]).toBe(255),d(n[1]).toBe(255),d(n[2]).toBe(255),d(n[3]).toBe(255)}),await f(`clears to green (0,255,0,255)`,async()=>{let e=a(p);p.clearColor(0,1,0,1),p.clear(p.COLOR_BUFFER_BIT);let n=c(p,0,0);t(p,e),d(n[0]).toBe(0),d(n[1]).toBe(255),d(n[2]).toBe(0),d(n[3]).toBe(255)}),await f(`clears to magenta (255,0,255,255)`,async()=>{let e=a(p);p.clearColor(1,0,1,1),p.clear(p.COLOR_BUFFER_BIT);let n=c(p,0,0);t(p,e),d(n[0]).toBe(255),d(n[1]).toBe(0),d(n[2]).toBe(255),d(n[3]).toBe(255)})}),await u(`blending`,async()=>{l(async()=>{e.make_current()});let n=[`precision mediump float;`,`attribute vec2 position;`,`void main() { gl_Position = vec4(position, 0.0, 1.0); }`].join(`
|
|
2
2
|
`),o=[{name:`ADD ONE ONE`,equn:p.FUNC_ADD,func1:p.ONE,func2:p.ONE,dstColor:[.5,.5,.5,1],srcColor:[.5,.5,.5,1],expected:[255,255,255,255]},{name:`ADD ONE ZERO`,equn:p.FUNC_ADD,func1:p.ONE,func2:p.ZERO,dstColor:[.5,.5,.5,.5],srcColor:[.2,.2,.2,1],expected:[51,51,51,255]},{name:`ADD ZERO SRC_COLOR`,equn:p.FUNC_ADD,func1:p.ZERO,func2:p.SRC_COLOR,dstColor:[.8,.8,.8,1],srcColor:[.5,.5,.5,.5],expected:[102,102,102,128]},{name:`ADD DST_COLOR ZERO`,equn:p.FUNC_ADD,func1:p.DST_COLOR,func2:p.ZERO,dstColor:[.8,.8,.8,1],srcColor:[.5,.5,.5,.5],expected:[102,102,102,128]},{name:`ADD SRC_ALPHA ONE_MINUS_SRC_ALPHA`,equn:p.FUNC_ADD,func1:p.SRC_ALPHA,func2:p.ONE_MINUS_SRC_ALPHA,dstColor:[.5,0,.5,1],srcColor:[.5,1,0,.5],expected:[127,127,64,191]}];for(let e of o){let{name:o,equn:l,func1:u,func2:m,dstColor:h,srcColor:g,expected:_}=e,v=[`precision mediump float;`,`void main() { gl_FragColor = vec4(${g[0]},${g[1]},${g[2]},${g[3]}); }`].join(`
|
|
3
3
|
`);await f(o,async()=>{let e=a(p);p.clearColor(h[0],h[1],h[2],h[3]),p.clear(p.COLOR_BUFFER_BIT);let o=i(p,n,v);p.useProgram(o),p.enable(p.BLEND),p.blendEquation(l),p.blendFunc(u,m),r(p),d(p.getError()).toBe(p.NO_ERROR),p.disable(p.BLEND);let f=c(p,0,0);p.deleteProgram(o),t(p,e),d(s(f,_)).toBeTruthy()})}}),await u(`drawElements (indexed drawing)`,async()=>{l(async()=>{e.make_current()}),await f(`draws a quad via index buffer — all pixels green`,async()=>{let e=a(p,8,8);p.clearColor(1,0,0,1),p.clear(p.COLOR_BUFFER_BIT);let n=i(p,`attribute vec2 position; void main() { gl_Position = vec4(position, 0.0, 1.0); }`,`void main() { gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0); }`);p.useProgram(n);let r=p.createBuffer();p.bindBuffer(p.ARRAY_BUFFER,r),p.bufferData(p.ARRAY_BUFFER,new Float32Array([-1,-1,1,-1,-1,1,1,1]),p.STATIC_DRAW),p.enableVertexAttribArray(0),p.vertexAttribPointer(0,2,p.FLOAT,!1,0,0);let o=p.createBuffer();p.bindBuffer(p.ELEMENT_ARRAY_BUFFER,o),p.bufferData(p.ELEMENT_ARRAY_BUFFER,new Uint16Array([0,1,2,2,1,3]),p.STATIC_DRAW),p.drawElements(p.TRIANGLES,6,p.UNSIGNED_SHORT,0),d(p.getError()).toBe(p.NO_ERROR);let s=new Uint8Array(e.width*e.height*4);p.readPixels(0,0,e.width,e.height,p.RGBA,p.UNSIGNED_BYTE,s);let c=!0;for(let e=0;e<s.length;e+=4)if(s[e]!==0||s[e+1]!==255||s[e+2]!==0||s[e+3]!==255){c=!1;break}d(c).toBeTruthy(),p.disableVertexAttribArray(0),p.deleteBuffer(r),p.deleteBuffer(o),p.deleteProgram(n),t(p,e)})}),await u(`readPixels`,async()=>{l(async()=>{e.make_current()}),await f(`RGBA + UNSIGNED_BYTE returns correct data size`,async()=>{let e=a(p,4,4);p.clearColor(1,0,0,1),p.clear(p.COLOR_BUFFER_BIT);let n=new Uint8Array(e.width*e.height*4);p.readPixels(0,0,e.width,e.height,p.RGBA,p.UNSIGNED_BYTE,n),d(p.getError()).toBe(p.NO_ERROR),d(n.length).toBe(e.width*e.height*4),t(p,e)}),await f(`pixel values match the clear color`,async()=>{let e=a(p);p.clearColor(0,0,1,1),p.clear(p.COLOR_BUFFER_BIT);let n=c(p,0,0);t(p,e),d(n[0]).toBe(0),d(n[1]).toBe(0),d(n[2]).toBe(255),d(n[3]).toBe(255)}),await f(`readPixels reads a single red pixel`,async()=>{let e=a(p);p.clearColor(1,0,0,1),p.clear(p.COLOR_BUFFER_BIT);let n=new Uint8Array(4);p.readPixels(0,0,1,1,p.RGBA,p.UNSIGNED_BYTE,n),t(p,e),d(n[0]).toBe(255),d(n[1]).toBe(0),d(n[2]).toBe(0),d(n[3]).toBe(255)})}),await u(`depth buffer`,async()=>{l(async()=>{e.make_current()}),await f(`depth test (LESS) — nearer triangle occludes farther one`,async()=>{let e=[`attribute vec2 position;`,`uniform float depth;`,`void main() { gl_Position = vec4(position, depth, 1.0); }`].join(`
|
|
4
4
|
`),t=[`precision mediump float;`,`uniform vec4 color;`,`void main() { gl_FragColor = color; }`].join(`
|
package/lib/esm/webgl2.spec.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{__name as e}from"./_virtual/_rolldown/runtime.js";import{TEXTURE_FS_300 as t,TEXTURE_VS_300 as n,destroyTestFBO as r,drawTriangle as i,makeProgram as a,makeTestFBO as o,makeTestFBOFloat as s,makeTestFBOWithDepthTexture as c,readPixel as l}from"./test-utils.js";import{beforeEach as u,describe as d,expect as f,it as p,on as m}from"@gjsify/unit";import{WebGL2RenderingContext as h,WebGLBridge as g}from"@gjsify/webgl";import _ from"@girs/glib-2.0";import v from"@girs/gtk-4.0";var y=e(async()=>{await m(`
|
|
1
|
+
import{__name as e}from"./_virtual/_rolldown/runtime.js";import{TEXTURE_FS_300 as t,TEXTURE_VS_300 as n,destroyTestFBO as r,drawTriangle as i,makeProgram as a,makeTestFBO as o,makeTestFBOFloat as s,makeTestFBOWithDepthTexture as c,readPixel as l}from"./test-utils.js";import{beforeEach as u,describe as d,expect as f,it as p,on as m}from"@gjsify/unit";import{WebGL2RenderingContext as h,WebGLBridge as g}from"@gjsify/webgl";import _ from"@girs/glib-2.0";import v from"@girs/gtk-4.0";var y=e(async()=>{await m(`Gl`,async()=>{v.init();let e,m,y=new _.MainLoop(null,!1),b=new v.Window({});b.set_default_size(200,200),e=new g,e.onReady((e,t)=>{m=e.getContext(`webgl2`),y.quit()}),b.set_child(e),b.present();let x=_.timeout_add(_.PRIORITY_DEFAULT,1e4,()=>(y.quit(),_.SOURCE_REMOVE));if(y.run(),_.source_remove(x),!m){console.warn(`WebGL2 context not available — skipping WebGL2 tests`),b.destroy();return}e.make_current(),await d(`WebGL2 context`,async()=>{u(async()=>{e.make_current()}),await p(`getContext("webgl2") returns a WebGL2RenderingContext`,async()=>{f(m).toBeInstanceOf(h)}),await p(`VERSION is "WebGL 2.0"`,async()=>{f(m.getParameter(m.VERSION)).toBe(`WebGL 2.0`)}),await p(`SHADING_LANGUAGE_VERSION is "WebGL GLSL ES 3.00"`,async()=>{f(m.getParameter(m.SHADING_LANGUAGE_VERSION)).toBe(`WebGL GLSL ES 3.00`)}),await p(`drawingBufferWidth and drawingBufferHeight are positive`,async()=>{f(m.drawingBufferWidth>0).toBeTruthy(),f(m.drawingBufferHeight>0).toBeTruthy()}),await p(`getError() returns NO_ERROR initially`,async()=>{f(m.getError()).toBe(m.NO_ERROR)}),await p(`exposes every WebGL2 sized internal format constant`,async()=>{let e=`R8.R8_SNORM.R16F.R32F.R8UI.R8I.R16UI.R16I.R32UI.R32I.RG8.RG8_SNORM.RG16F.RG32F.RG8UI.RG8I.RG16UI.RG16I.RG32UI.RG32I.RGB8.SRGB8.RGB565.RGB8_SNORM.R11F_G11F_B10F.RGB9_E5.RGB16F.RGB32F.RGB8UI.RGB8I.RGB16UI.RGB16I.RGB32UI.RGB32I.RGBA8.SRGB8_ALPHA8.RGBA8_SNORM.RGB5_A1.RGBA4.RGB10_A2.RGBA16F.RGBA32F.RGBA8UI.RGBA8I.RGB10_A2UI.RGBA16UI.RGBA16I.RGBA32I.RGBA32UI.DEPTH_COMPONENT16.DEPTH_COMPONENT24.DEPTH_COMPONENT32F.DEPTH24_STENCIL8.DEPTH32F_STENCIL8`.split(`.`),t=m;f(e.filter(e=>typeof t[e]!=`number`).join(`, `)).toBe(``)}),await p(`allocates an RG16F texture with texStorage2D without error`,async()=>{let e=m.createTexture();m.bindTexture(m.TEXTURE_2D,e),m.texStorage2D(m.TEXTURE_2D,1,m.RG16F,16,16),f(m.getError()).toBe(m.NO_ERROR),m.texSubImage2D(m.TEXTURE_2D,0,0,0,16,16,m.RG,m.HALF_FLOAT,new Uint16Array(256*2)),f(m.getError()).toBe(m.NO_ERROR),m.bindTexture(m.TEXTURE_2D,null),m.deleteTexture(e)})}),await d(`GLSL ES 3.00 compilation`,async()=>{u(async()=>{e.make_current()});let t=[`#version 300 es`,`in vec2 position;`,`void main() { gl_Position = vec4(position, 0.0, 1.0); }`].join(`
|
|
2
2
|
`),n=[`#version 300 es`,`precision mediump float;`,`out vec4 fragColor;`,`void main() { fragColor = vec4(0.0, 1.0, 0.0, 1.0); }`].join(`
|
|
3
3
|
`);await p(`#version 300 es vertex shader compiles`,async()=>{let e=m.createShader(m.VERTEX_SHADER);m.shaderSource(e,t),m.compileShader(e),m.getShaderParameter(e,m.COMPILE_STATUS)||console.error(`VS300 log:`,m.getShaderInfoLog(e)),f(m.getShaderParameter(e,m.COMPILE_STATUS)).toBeTruthy(),m.deleteShader(e)}),await p(`#version 300 es fragment shader compiles`,async()=>{let e=m.createShader(m.FRAGMENT_SHADER);m.shaderSource(e,n),m.compileShader(e),m.getShaderParameter(e,m.COMPILE_STATUS)||console.error(`FS300 log:`,m.getShaderInfoLog(e)),f(m.getShaderParameter(e,m.COMPILE_STATUS)).toBeTruthy(),m.deleteShader(e)}),await p(`leaves the source alone on a context that speaks GLSL ES 3.00`,async()=>{let e=m.createShader(m.VERTEX_SHADER);m.shaderSource(e,t);let n=m.getShaderSource(e)??``,r=n.split(`
|
|
4
4
|
`)[0].trim(),i=n.split(`
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gjsify/webgl",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.38.0",
|
|
4
4
|
"description": "WebGL module for Gjs",
|
|
5
5
|
"module": "lib/esm/index.js",
|
|
6
6
|
"types": "lib/types/index.d.ts",
|
|
@@ -61,8 +61,8 @@
|
|
|
61
61
|
"WebGL"
|
|
62
62
|
],
|
|
63
63
|
"devDependencies": {
|
|
64
|
-
"@gjsify/cli": "^0.
|
|
65
|
-
"@gjsify/unit": "^0.
|
|
64
|
+
"@gjsify/cli": "^0.38.0",
|
|
65
|
+
"@gjsify/unit": "^0.38.0",
|
|
66
66
|
"@types/bit-twiddle": "^1.0.3",
|
|
67
67
|
"@types/node": "^25.9.2",
|
|
68
68
|
"typescript": "^6.0.3"
|
|
@@ -72,10 +72,10 @@
|
|
|
72
72
|
"@girs/gjs": "^4.1.0",
|
|
73
73
|
"@girs/gtk-4.0": "^4.1.0",
|
|
74
74
|
"@girs/gwebgl-0.1": "0.1.0-4.0.0-rc.5",
|
|
75
|
-
"@gjsify/dom-elements": "^0.
|
|
76
|
-
"@gjsify/dom-events": "^0.
|
|
77
|
-
"@gjsify/event-bridge": "^0.
|
|
78
|
-
"@gjsify/utils": "^0.
|
|
75
|
+
"@gjsify/dom-elements": "^0.38.0",
|
|
76
|
+
"@gjsify/dom-events": "^0.38.0",
|
|
77
|
+
"@gjsify/event-bridge": "^0.38.0",
|
|
78
|
+
"@gjsify/utils": "^0.38.0",
|
|
79
79
|
"bit-twiddle": "^1.0.2",
|
|
80
80
|
"glsl-tokenizer": "^2.1.5"
|
|
81
81
|
},
|
|
@@ -90,13 +90,13 @@
|
|
|
90
90
|
},
|
|
91
91
|
"homepage": "https://github.com/gjsify/gjsify/tree/main/packages/framework/webgl#readme",
|
|
92
92
|
"optionalDependencies": {
|
|
93
|
-
"@gjsify/webgl-darwin-arm64": "0.
|
|
94
|
-
"@gjsify/webgl-darwin-x64": "0.
|
|
95
|
-
"@gjsify/webgl-linux-arm64": "0.
|
|
96
|
-
"@gjsify/webgl-linux-ppc64": "0.
|
|
97
|
-
"@gjsify/webgl-linux-riscv64": "0.
|
|
98
|
-
"@gjsify/webgl-linux-s390x": "0.
|
|
99
|
-
"@gjsify/webgl-linux-x64": "0.
|
|
100
|
-
"@gjsify/webgl-win32-x64": "0.
|
|
93
|
+
"@gjsify/webgl-darwin-arm64": "0.38.0",
|
|
94
|
+
"@gjsify/webgl-darwin-x64": "0.38.0",
|
|
95
|
+
"@gjsify/webgl-linux-arm64": "0.38.0",
|
|
96
|
+
"@gjsify/webgl-linux-ppc64": "0.38.0",
|
|
97
|
+
"@gjsify/webgl-linux-riscv64": "0.38.0",
|
|
98
|
+
"@gjsify/webgl-linux-s390x": "0.38.0",
|
|
99
|
+
"@gjsify/webgl-linux-x64": "0.38.0",
|
|
100
|
+
"@gjsify/webgl-win32-x64": "0.38.0"
|
|
101
101
|
}
|
|
102
102
|
}
|