@gjsify/webgl 0.3.20 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/esm/_virtual/_rolldown/runtime.js +1 -0
- package/lib/esm/conformance/attribs.spec.js +2 -2
- package/lib/esm/conformance/buffers.spec.js +1 -1
- package/lib/esm/conformance/context.spec.js +3 -3
- package/lib/esm/conformance/programs.spec.js +3 -3
- package/lib/esm/conformance/rendering-basic.spec.js +3 -3
- package/lib/esm/conformance/rendering.spec.js +6 -6
- package/lib/esm/conformance/setup.js +1 -1
- package/lib/esm/conformance/state.spec.js +1 -1
- package/lib/esm/conformance/textures.spec.js +3 -3
- package/lib/esm/conformance/uniforms.spec.js +1 -1
- package/lib/esm/conformance-test.js +1 -1
- package/lib/esm/context/buffer-binding.js +1 -0
- package/lib/esm/context/drawing.js +1 -0
- package/lib/esm/context/framebuffer.js +1 -0
- package/lib/esm/context/index.js +1 -0
- package/lib/esm/context/shader-program.js +8 -0
- package/lib/esm/context/state.js +1 -0
- package/lib/esm/context/texture-management.js +1 -0
- package/lib/esm/extensions/ext-blend-minmax.js +1 -1
- package/lib/esm/extensions/ext-color-buffer-float.js +1 -1
- package/lib/esm/extensions/ext-color-buffer-half-float.js +1 -1
- package/lib/esm/extensions/ext-texture-filter-anisotropic.js +1 -1
- package/lib/esm/extensions/oes-element-index-unit.js +1 -1
- package/lib/esm/extensions/oes-standard-derivatives.js +1 -1
- package/lib/esm/extensions/oes-texture-float-linear.js +1 -1
- package/lib/esm/extensions/oes-texture-float.js +1 -1
- package/lib/esm/extensions/oes-texture-half-float.js +1 -1
- package/lib/esm/extensions/stackgl-destroy-context.js +1 -1
- package/lib/esm/extensions/stackgl-resize-drawing-buffer.js +1 -1
- package/lib/esm/html-canvas-element.js +1 -1
- package/lib/esm/index.js +1 -1
- package/lib/esm/linkable.js +1 -1
- package/lib/esm/test-utils.js +4 -4
- package/lib/esm/test.js +1 -1
- package/lib/esm/utils.js +1 -1
- package/lib/esm/webgl-active-info.js +1 -1
- package/lib/esm/webgl-bridge.js +1 -1
- package/lib/esm/webgl-buffer.js +1 -1
- package/lib/esm/webgl-context-attributes.js +1 -1
- package/lib/esm/webgl-context-base.js +1 -8
- package/lib/esm/webgl-drawing-buffer-wrapper.js +1 -1
- package/lib/esm/webgl-framebuffer.js +1 -1
- package/lib/esm/webgl-program.js +1 -1
- package/lib/esm/webgl-query.js +1 -1
- package/lib/esm/webgl-renderbuffer.js +1 -1
- package/lib/esm/webgl-rendering-context.js +1 -1
- package/lib/esm/webgl-sampler.js +1 -1
- package/lib/esm/webgl-shader-precision-format.js +1 -1
- package/lib/esm/webgl-shader.js +1 -1
- package/lib/esm/webgl-sync.js +1 -1
- package/lib/esm/webgl-texture-unit.js +1 -1
- package/lib/esm/webgl-texture.js +1 -1
- package/lib/esm/webgl-transform-feedback.js +1 -1
- package/lib/esm/webgl-uniform-location.js +1 -1
- package/lib/esm/webgl-vertex-array-object.js +1 -1
- package/lib/esm/webgl-vertex-attribute.js +1 -1
- package/lib/esm/webgl1.spec.js +10 -10
- package/lib/esm/webgl2-rendering-context.js +1 -1
- package/lib/esm/webgl2.spec.js +22 -22
- package/lib/types/context/buffer-binding.d.ts +17 -0
- package/lib/types/context/drawing.d.ts +29 -0
- package/lib/types/context/framebuffer.d.ts +33 -0
- package/lib/types/context/index.d.ts +7 -0
- package/lib/types/context/shader-program.d.ts +67 -0
- package/lib/types/context/state.d.ts +60 -0
- package/lib/types/context/texture-management.d.ts +39 -0
- package/lib/types/index.d.ts +11 -0
- package/lib/types/webgl-context-base.d.ts +41 -198
- package/lib/types/webgl2-rendering-context.d.ts +1 -1
- package/package.json +8 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
var
|
|
1
|
+
import"./_virtual/_rolldown/runtime.js";var WebGLTextureUnit=class{constructor(e,t){this._mode=0,this._bind2D=null,this._bindCube=null,this._ctx=e,this._idx=t}};export{WebGLTextureUnit};
|
package/lib/esm/webgl-texture.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Linkable as e}from"./linkable.js";var
|
|
1
|
+
import"./_virtual/_rolldown/runtime.js";import{Linkable as e}from"./linkable.js";var WebGLTexture=class extends e{constructor(e,t){super(e),this._binding=0,this._levelWidth=new Int32Array(32),this._levelHeight=new Int32Array(32),this._format=0,this._type=0,this._complete=!0,this._ctx=t}_performDelete(){let e=this._ctx;delete e._textures[this._|0],e._gl.deleteTexture(this._|0)}};export{WebGLTexture};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Linkable as e}from"./linkable.js";var
|
|
1
|
+
import"./_virtual/_rolldown/runtime.js";import{Linkable as e}from"./linkable.js";var WebGLTransformFeedback=class extends e{constructor(e,t){super(e),this._ctx=t}_performDelete(){let e=this._ctx;delete e._transformFeedbacks[this._|0],e._native2.deleteTransformFeedback(this._|0)}};export{WebGLTransformFeedback};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var
|
|
1
|
+
import"./_virtual/_rolldown/runtime.js";var WebGLUniformLocation=class{constructor(e,t,n){this._linkCount=0,this._array=null,this._=e,this._program=t,this._linkCount=t._linkCount,this._activeInfo=n,this._array=null}};export{WebGLUniformLocation};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Linkable as e}from"./linkable.js";import{WebGLVertexArrayObjectState as t}from"./webgl-vertex-attribute.js";var
|
|
1
|
+
import"./_virtual/_rolldown/runtime.js";import{Linkable as e}from"./linkable.js";import{WebGLVertexArrayObjectState as t}from"./webgl-vertex-attribute.js";var WebGLVertexArrayObject=class extends e{constructor(e,n){super(e),this._ctx=n,this._objectState=new t(n)}_performDelete(){let e=this._ctx;e._vertexObjectState===this._objectState&&(e._vertexObjectState=e._defaultVertexObjectState),this._objectState.cleanUp(),delete e._vertexArrayObjects[this._|0],e._native2.deleteVertexArray(this._|0)}};export{WebGLVertexArrayObject};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{WebGLBuffer as e}from"./webgl-buffer.js";var
|
|
1
|
+
import"./_virtual/_rolldown/runtime.js";import{WebGLBuffer as e}from"./webgl-buffer.js";var WebGLVertexArrayObjectAttribute=class{constructor(e,t){this._isPointer=!1,this._pointerBuffer=null,this._pointerOffset=0,this._pointerSize=0,this._pointerStride=0,this._pointerType=0,this._pointerNormal=!1,this._divisor=0,this._inputSize=4,this._inputStride=0,this._ctx=e,this._idx=t,this._pointerType=e.FLOAT,this._clear()}_clear(){this._isPointer=!1,this._pointerBuffer=null,this._pointerOffset=0,this._pointerSize=0,this._pointerStride=0,this._pointerType=this._ctx.FLOAT,this._pointerNormal=!1,this._divisor=0,this._inputSize=4,this._inputStride=0}},WebGLVertexArrayGlobalAttribute=class{constructor(e){this._idx=0,this._idx=e,this._data=new Float32Array([0,0,0,1])}},WebGLVertexArrayObjectState=class{constructor(e){this._elementArrayBufferBinding=null;let t=e.getParameter(e.MAX_VERTEX_ATTRIBS);this._attribs=Array(t);for(let n=0;n<t;++n)this._attribs[n]=new WebGLVertexArrayObjectAttribute(e,n);this._elementArrayBufferBinding=null}setElementArrayBuffer(t){if(t!==null&&!(t instanceof e))throw TypeError(`setElementArrayBuffer(WebGLBuffer?)`);let n=this._elementArrayBufferBinding;n!==t&&(n&&(--n._refCount,n._checkDelete()),t&&(t._refCount+=1),this._elementArrayBufferBinding=t)}cleanUp(){let e=this._elementArrayBufferBinding;e&&(--e._refCount,e._checkDelete(),this._elementArrayBufferBinding=null);for(let e=0;e<this._attribs.length;++e){let t=this._attribs[e];t._pointerBuffer&&(--t._pointerBuffer._refCount,t._pointerBuffer._checkDelete()),t._clear()}}releaseArrayBuffer(e){if(e)for(let t=0;t<this._attribs.length;++t){let n=this._attribs[t];n._pointerBuffer===e&&(--n._pointerBuffer._refCount,n._pointerBuffer._checkDelete(),n._clear())}}setVertexAttribPointer(e,t,n,r,i,a,o,s,c){let l=this._attribs[t];e!==l._pointerBuffer&&(l._pointerBuffer&&(--l._pointerBuffer._refCount,l._pointerBuffer._checkDelete()),e&&(e._refCount+=1),l._pointerBuffer=e),l._pointerSize=n,l._pointerOffset=r,l._pointerStride=i,l._pointerType=a,l._pointerNormal=o,l._inputStride=s,l._inputSize=c}},WebGLVertexArrayGlobalState=class{constructor(e){this._arrayBufferBinding=null;let t=e.getParameter(e.MAX_VERTEX_ATTRIBS);this._attribs=Array(t);for(let e=0;e<t;++e)this._attribs[e]=new WebGLVertexArrayGlobalAttribute(e);this._arrayBufferBinding=null}setArrayBuffer(t){if(t!==null&&!(t instanceof e))throw TypeError(`setArrayBuffer(WebGLBuffer?)`);let n=this._arrayBufferBinding;n!==t&&(n&&(--n._refCount,n._checkDelete()),t&&(t._refCount+=1),this._arrayBufferBinding=t)}};export{WebGLVertexArrayGlobalAttribute,WebGLVertexArrayGlobalState,WebGLVertexArrayObjectAttribute,WebGLVertexArrayObjectState};
|
package/lib/esm/webgl1.spec.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import{destroyTestFBO as e,destroyTestFBOWithDepth as t,drawTriangle as n,makeProgram as r,makeTestFBO as i,makeTestFBOWithDepth as a,pixelClose as o,readPixel as s}from"./test-utils.js";import{beforeEach as c,describe as l,expect as u,it as d,on as f}from"@gjsify/unit";import{WebGLBridge as p}from"@gjsify/webgl";import m from"@girs/glib-2.0";import h from"@girs/gtk-4.0";const g=`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 _=async()=>{await f(`Display`,async()=>{h.init();let f,_,v=new m.MainLoop(null,!1),y=new h.Window({});y.set_default_size(200,200),f=new p,f.onReady((e,t)=>{_=t,v.quit()}),y.set_child(f),y.present();let b=m.timeout_add(m.PRIORITY_DEFAULT,1e4,()=>(v.quit(),m.SOURCE_REMOVE));if(v.run(),m.source_remove(b),!_){console.warn(`WebGL context not available after 10s — skipping tests`),y.destroy();return}f.make_current(),await l(`WebGLRenderingContext constants`,async()=>{c(async()=>{f.make_current()}),await d(`should have all standard WebGL constants as numbers`,async()=>{for(let e of g){let t=_?.[e];u(typeof t).toBe(`number`),e===`NONE`||e===`ZERO`||e===`NO_ERROR`||e===`POINTS`?u(t===0).toBeTruthy():u(t>0).toBeTruthy()}})}),await l(`Buffers`,async()=>{c(async()=>{f.make_current()}),await d(`createBuffer returns a WebGLBuffer`,async()=>{let e=_.createBuffer();u(e).toBeDefined(),u(e).not.toBeNull()}),await d(`bindBuffer + bufferData with Float32Array`,async()=>{let e=_.createBuffer();_.bindBuffer(_.ARRAY_BUFFER,e);let t=new Float32Array([1,2,3,4]);u(()=>_.bufferData(_.ARRAY_BUFFER,t,_.STATIC_DRAW)).not.toThrow()}),await d(`getBufferParameter returns buffer size`,async()=>{let e=_.createBuffer();_.bindBuffer(_.ARRAY_BUFFER,e);let t=new Float32Array([1,2,3,4]);_.bufferData(_.ARRAY_BUFFER,t,_.STATIC_DRAW),u(_.getBufferParameter(_.ARRAY_BUFFER,_.BUFFER_SIZE)).toBe(t.byteLength)}),await d(`bufferSubData updates buffer data`,async()=>{let e=_.createBuffer();_.bindBuffer(_.ARRAY_BUFFER,e);let t=new Float32Array([1,2,3,4]);_.bufferData(_.ARRAY_BUFFER,t,_.DYNAMIC_DRAW),u(()=>_.bufferSubData(_.ARRAY_BUFFER,0,new Float32Array([9,9]))).not.toThrow()}),await d(`deleteBuffer cleans up`,async()=>{let e=_.createBuffer();u(()=>_.deleteBuffer(e)).not.toThrow()})}),await l(`Shaders`,async()=>{c(async()=>{f.make_current()});let e=`attribute vec2 position; void main() { gl_Position = vec4(position, 0.0, 1.0); }`,t=`void main() { gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0); }`;await d(`createShader returns a WebGLShader`,async()=>{let e=_.createShader(_.VERTEX_SHADER);u(e).toBeDefined(),u(e).not.toBeNull()}),await d(`vertex shader compiles successfully`,async()=>{let t=_.createShader(_.VERTEX_SHADER);_.shaderSource(t,e),_.compileShader(t);let n=_.getShaderParameter(t,_.COMPILE_STATUS);n||console.error(`Vertex shader log:`,_.getShaderInfoLog(t)),u(n).toBeTruthy()}),await d(`fragment shader compiles successfully`,async()=>{let e=_.createShader(_.FRAGMENT_SHADER);_.shaderSource(e,t),_.compileShader(e);let n=_.getShaderParameter(e,_.COMPILE_STATUS);n||console.error(`Fragment shader log:`,_.getShaderInfoLog(e)),u(n).toBeTruthy()}),await d(`program links successfully`,async()=>{let n=_.createShader(_.VERTEX_SHADER);_.shaderSource(n,e),_.compileShader(n);let r=_.createShader(_.FRAGMENT_SHADER);_.shaderSource(r,t),_.compileShader(r);let i=_.createProgram();_.attachShader(i,n),_.attachShader(i,r),_.linkProgram(i);let a=_.getProgramParameter(i,_.LINK_STATUS);a||console.error(`Program log:`,_.getProgramInfoLog(i)),u(a).toBeTruthy()})}),await l(`Textures`,async()=>{c(async()=>{f.make_current()}),await d(`createTexture returns a WebGLTexture`,async()=>{let e=_.createTexture();u(e).toBeDefined(),u(e).not.toBeNull()}),await d(`bindTexture + texImage2D with Uint8Array`,async()=>{let e=_.createTexture();_.bindTexture(_.TEXTURE_2D,e);let t=new Uint8Array([255,0,0,255]);u(()=>_.texImage2D(_.TEXTURE_2D,0,_.RGBA,1,1,0,_.RGBA,_.UNSIGNED_BYTE,t)).not.toThrow()}),await d(`texParameteri sets filter params without error`,async()=>{let e=_.createTexture();_.bindTexture(_.TEXTURE_2D,e),u(()=>{_.texParameteri(_.TEXTURE_2D,_.TEXTURE_MIN_FILTER,_.NEAREST),_.texParameteri(_.TEXTURE_2D,_.TEXTURE_MAG_FILTER,_.NEAREST),_.texParameteri(_.TEXTURE_2D,_.TEXTURE_WRAP_S,_.CLAMP_TO_EDGE),_.texParameteri(_.TEXTURE_2D,_.TEXTURE_WRAP_T,_.CLAMP_TO_EDGE)}).not.toThrow()}),await d(`deleteTexture cleans up`,async()=>{let e=_.createTexture();u(()=>_.deleteTexture(e)).not.toThrow()})}),await l(`Draw`,async()=>{c(async()=>{f.make_current()}),await d(`clearColor + clear does not throw`,async()=>{u(()=>{_.clearColor(0,0,0,1),_.clear(_.COLOR_BUFFER_BIT)}).not.toThrow(),u(_.getError()).toBe(_.NO_ERROR)}),await d(`viewport does not throw`,async()=>{u(()=>_.viewport(0,0,200,200)).not.toThrow()}),await d(`drawArrays (triangle) produces no GL error`,async()=>{let e=_.createShader(_.VERTEX_SHADER);_.shaderSource(e,`attribute vec2 position; void main() { gl_Position = vec4(position, 0.0, 1.0); }`),_.compileShader(e);let t=_.createShader(_.FRAGMENT_SHADER);_.shaderSource(t,`void main() { gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0); }`),_.compileShader(t);let n=_.createProgram();_.attachShader(n,e),_.attachShader(n,t),_.linkProgram(n),_.useProgram(n);let r=_.createBuffer();_.bindBuffer(_.ARRAY_BUFFER,r),_.bufferData(_.ARRAY_BUFFER,new Float32Array([-1,0,0,-1,1,1]),_.STATIC_DRAW);let i=_.getAttribLocation(n,`position`);_.enableVertexAttribArray(i),_.vertexAttribPointer(i,2,_.FLOAT,!1,0,0),_.clearColor(0,0,0,1),_.clear(_.COLOR_BUFFER_BIT),u(()=>_.drawArrays(_.TRIANGLES,0,3)).not.toThrow(),u(_.getError()).toBe(_.NO_ERROR)})}),await l(`Extensions`,async()=>{c(async()=>{f.make_current()}),await d(`OES_texture_float is supported`,async()=>{u(_.getExtension(`OES_texture_float`)).not.toBeNull()}),await d(`OES_standard_derivatives is supported`,async()=>{u(_.getExtension(`OES_standard_derivatives`)).not.toBeNull()}),await d(`OES_element_index_uint is supported`,async()=>{u(_.getExtension(`OES_element_index_uint`)).not.toBeNull()}),await d(`getSupportedExtensions returns an array`,async()=>{let e=_.getSupportedExtensions();u(Array.isArray(e)).toBeTruthy(),u((e?.length??0)>0).toBeTruthy()})}),await l(`Gwebgl.WebGLRenderingContext native bindings`,async()=>{c(async()=>{f.make_current()}),await d(`getParameterb returns a boolean`,async()=>{let e=_?._native.getParameterb(_?.BLEND);u(typeof e).toBe(`boolean`)}),await d(`getParameterbv returns an array of booleans`,async()=>{let e=_?._native.getParameterbv(_?.COLOR_WRITEMASK,16);if(u(Array.isArray(e)).toBeTruthy(),Array.isArray(e))for(let t of e)u(typeof t).toBe(`boolean`)}),await d(`getParameterf returns a float`,async()=>{let e=_?._native.getParameterf(_?.SAMPLE_COVERAGE_VALUE);u(typeof e).toBe(`number`)}),await d(`getParameterfv returns an array of floats`,async()=>{let e=_?._native.getParameterfv(_?.DEPTH_RANGE,8);if(u(Array.isArray(e)).toBeTruthy(),Array.isArray(e))for(let t of e)u(typeof t).toBe(`number`)}),await d(`getParameteri returns an integer`,async()=>{let e=_?._native.getParameteri(_?.ARRAY_BUFFER_BINDING);u(typeof e).toBe(`number`)}),await d(`getParameteriv returns an array of integers`,async()=>{let e=_?._native.getParameteriv(_?.MAX_VIEWPORT_DIMS,8);if(u(Array.isArray(e)).toBeTruthy(),Array.isArray(e))for(let t of e)u(typeof t).toBe(`number`)})}),await l(`simple-shader rendering`,async()=>{c(async()=>{f.make_current()}),await d(`renders a green triangle — all pixels (0,255,0,255)`,async()=>{let t=i(_,8,8);_.clearColor(0,0,0,1),_.clear(_.COLOR_BUFFER_BIT);let a=r(_,`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); }`);u(_.getProgramParameter(a,_.LINK_STATUS)).toBeTruthy(),_.useProgram(a),n(_),u(_.getError()).toBe(_.NO_ERROR);let o=new Uint8Array(t.width*t.height*4);_.readPixels(0,0,t.width,t.height,_.RGBA,_.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}u(s).toBeTruthy(),_.deleteProgram(a),e(_,t)})}),await l(`clearColor`,async()=>{c(async()=>{f.make_current()}),await d(`clears to black (0,0,0,0)`,async()=>{let t=i(_);_.clearColor(0,0,0,0),_.clear(_.COLOR_BUFFER_BIT);let n=s(_,0,0);e(_,t),u(n[0]).toBe(0),u(n[1]).toBe(0),u(n[2]).toBe(0),u(n[3]).toBe(0)}),await d(`clears to white (255,255,255,255)`,async()=>{let t=i(_);_.clearColor(1,1,1,1),_.clear(_.COLOR_BUFFER_BIT);let n=s(_,0,0);e(_,t),u(n[0]).toBe(255),u(n[1]).toBe(255),u(n[2]).toBe(255),u(n[3]).toBe(255)}),await d(`clears to green (0,255,0,255)`,async()=>{let t=i(_);_.clearColor(0,1,0,1),_.clear(_.COLOR_BUFFER_BIT);let n=s(_,0,0);e(_,t),u(n[0]).toBe(0),u(n[1]).toBe(255),u(n[2]).toBe(0),u(n[3]).toBe(255)}),await d(`clears to magenta (255,0,255,255)`,async()=>{let t=i(_);_.clearColor(1,0,1,1),_.clear(_.COLOR_BUFFER_BIT);let n=s(_,0,0);e(_,t),u(n[0]).toBe(255),u(n[1]).toBe(0),u(n[2]).toBe(255),u(n[3]).toBe(255)})}),await l(`blending`,async()=>{c(async()=>{f.make_current()});let t=[`precision mediump float;`,`attribute vec2 position;`,`void main() { gl_Position = vec4(position, 0.0, 1.0); }`].join(`
|
|
2
|
-
`),
|
|
3
|
-
`);await
|
|
4
|
-
`),
|
|
5
|
-
`),o
|
|
6
|
-
`);await
|
|
7
|
-
`),o=
|
|
8
|
-
`),o=
|
|
9
|
-
`),
|
|
10
|
-
`),o=
|
|
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 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
|
+
`),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
|
+
`);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
|
+
`),t=[`precision mediump float;`,`uniform vec4 color;`,`void main() { gl_FragColor = color; }`].join(`
|
|
5
|
+
`),a=o(p,4,4);p.clearColor(0,0,0,1),p.clearDepth(1),p.clear(p.COLOR_BUFFER_BIT|p.DEPTH_BUFFER_BIT),p.enable(p.DEPTH_TEST),p.depthFunc(p.LESS);let s=i(p,e,t);p.useProgram(s),p.uniform1f(p.getUniformLocation(s,`depth`),0),p.uniform4f(p.getUniformLocation(s,`color`),1,0,0,1),r(p),p.uniform1f(p.getUniformLocation(s,`depth`),.5),p.uniform4f(p.getUniformLocation(s,`color`),0,0,1,1),r(p),d(p.getError()).toBe(p.NO_ERROR),p.disable(p.DEPTH_TEST);let l=c(p,0,0);p.deleteProgram(s),n(p,a),d(l[0]).toBe(255),d(l[1]).toBe(0),d(l[2]).toBe(0)})}),await u(`uniform1fv regression`,async()=>{l(async()=>{e.make_current()});let n=[`attribute vec2 position;`,`void main() { gl_Position = vec4(position, 0.0, 1.0); }`].join(`
|
|
6
|
+
`);await f(`uniform1fv sets a float uniform and affects rendering`,async()=>{let e=[`precision mediump float;`,`uniform float uRed;`,`void main() { gl_FragColor = vec4(uRed, 0.0, 0.0, 1.0); }`].join(`
|
|
7
|
+
`),o=i(p,n,e);d(p.getProgramParameter(o,p.LINK_STATUS)).toBeTruthy(),p.useProgram(o);let s=p.getUniformLocation(o,`uRed`);d(s).not.toBeNull(),p.uniform1fv(s,new Float32Array([1])),d(p.getError()).toBe(p.NO_ERROR);let l=a(p,4,4);p.clearColor(0,0,0,1),p.clear(p.COLOR_BUFFER_BIT),r(p);let u=c(p,0,0);t(p,l),d(u[0]).toBe(255),d(u[1]).toBe(0),d(u[2]).toBe(0),p.deleteProgram(o)}),await f(`uniform1fv sets each array element individually`,async()=>{let e=[`precision mediump float;`,`uniform float uWeights[3];`,`void main() { gl_FragColor = vec4(uWeights[0], uWeights[1], uWeights[2], 1.0); }`].join(`
|
|
8
|
+
`),o=i(p,n,e);d(p.getProgramParameter(o,p.LINK_STATUS)).toBeTruthy(),p.useProgram(o);let s=p.getUniformLocation(o,`uWeights[0]`),l=p.getUniformLocation(o,`uWeights[1]`),u=p.getUniformLocation(o,`uWeights[2]`);d(s).not.toBeNull(),d(l).not.toBeNull(),d(u).not.toBeNull(),p.uniform1fv(s,new Float32Array([0])),p.uniform1fv(l,new Float32Array([1])),p.uniform1fv(u,new Float32Array([0])),d(p.getError()).toBe(p.NO_ERROR);let f=a(p,4,4);p.clearColor(0,0,0,1),p.clear(p.COLOR_BUFFER_BIT),r(p);let m=c(p,0,0);t(p,f),d(m[0]).toBe(0),d(m[1]).toBe(255),d(m[2]).toBe(0),p.deleteProgram(o)})}),await u(`linkProgram with inactive attributes`,async()=>{l(async()=>{e.make_current()}),await f(`links a program whose vertex shader declares but does not use an attribute`,async()=>{let e=[`attribute vec2 position;`,`attribute vec3 unused;`,`void main() { gl_Position = vec4(position, 0.0, 1.0); }`].join(`
|
|
9
|
+
`),n=[`precision mediump float;`,`void main() { gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0); }`].join(`
|
|
10
|
+
`),o=i(p,e,n);d(p.getProgramParameter(o,p.LINK_STATUS)).toBeTruthy(),d(p.getError()).toBe(p.NO_ERROR),p.useProgram(o);let s=a(p,4,4);p.clearColor(0,0,0,1),p.clear(p.COLOR_BUFFER_BIT),r(p),d(p.getError()).toBe(p.NO_ERROR);let l=c(p,0,0);t(p,s),d(l[1]).toBe(255),p.deleteProgram(o)})}),y.destroy()})},`default`);export{v as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Uint8ArrayToVariant as e,arrayToUint8Array as t,checkObject as n,convertPixels as r,extractImageData as i,premultiplyAlpha as a,vertexCount as o}from"./utils.js";import{WebGLActiveInfo as s}from"./webgl-active-info.js";import{WebGLFramebuffer as c}from"./webgl-framebuffer.js";import{WebGLRenderbuffer as l}from"./webgl-renderbuffer.js";import{WebGLTexture as u}from"./webgl-texture.js";import{WebGLContextBase as d}from"./webgl-context-base.js";import{WebGLQuery as f}from"./webgl-query.js";import{WebGLSampler as p}from"./webgl-sampler.js";import{WebGLSync as m}from"./webgl-sync.js";import{WebGLTransformFeedback as h}from"./webgl-transform-feedback.js";import{WebGLVertexArrayObject as g}from"./webgl-vertex-array-object.js";import _ from"@girs/gwebgl-0.1";import v from"gi://GdkPixbuf?version=2.0";import{warnNotImplemented as y}from"@gjsify/utils";var b=class b extends d{get _gl(){return this._native2}constructor(e,t={}){super(e,t),this._queries={},this._samplers={},this._transformFeedbacks={},this._vertexArrayObjects={},this._syncs={},this._activeReadFramebuffer=null,this._activeDrawFramebuffer=null,this._native2=new _.WebGL2RenderingContext({}),this._init()}_getGlslVersion(e){return e?`300 es`:`130`}_validFramebufferAttachment(e){return super._validFramebufferAttachment(e)?!0:e>=36065&&e<=36079}static{this._WGL2_ALL_COLOR_ATTACHMENTS=[36064,36065,36066,36067,36068,36069,36070,36071,36072,36073,36074,36075,36076,36077,36078,36079]}_getColorAttachments(){return b._WGL2_ALL_COLOR_ATTACHMENTS}_preCheckFramebufferStatus(e){let t=e._attachments,n=0,r=0,i=[this.COLOR_ATTACHMENT0,this.DEPTH_ATTACHMENT,this.STENCIL_ATTACHMENT,this.DEPTH_STENCIL_ATTACHMENT,...b._WGL2_ALL_COLOR_ATTACHMENTS];for(let a of i){let i=t[a];if(i){if(i instanceof u){let t=e._attachmentLevel[a]??0,o=i._levelWidth[t]??0,s=i._levelHeight[t]??0;if(o>0&&s>0){n=o,r=s;break}}else if(i instanceof l&&i._width>0&&i._height>0){n=i._width,r=i._height;break}}}return n>0&&r>0?(e._width=n,e._height=r,this.FRAMEBUFFER_COMPLETE):this.FRAMEBUFFER_INCOMPLETE_ATTACHMENT}_updateFramebufferAttachments(e){if(super._updateFramebufferAttachments(e),e)for(let t=1;t<=15;t++){let n=36064+t;if(!(n in e._attachments))continue;let r=e._attachments[n];if(r instanceof u){let t=e._attachmentFace[n]||this.TEXTURE_2D,i=e._attachmentLevel[n]??0;this._gl.framebufferTexture2D(this.FRAMEBUFFER,n,t,r._|0,i|0)}else r instanceof l?this._gl.framebufferRenderbuffer(this.FRAMEBUFFER,n,this.RENDERBUFFER,r._|0):this._gl.framebufferTexture2D(this.FRAMEBUFFER,n,this.TEXTURE_2D,0,0)}}bindBuffer(e,t){if(e===35345||e===35982||e===36662||e===36663){let n=t?t._|0:0;this._gl.bindBuffer(e,n);return}super.bindBuffer(e,t)}bindFramebuffer(e,t){if(e===36008||e===36009){if(!n(t))throw TypeError(`bindFramebuffer(GLenum, WebGLFramebuffer)`);if(t&&t._pendingDelete||t&&!this._checkWrapper(t,c))return;let r=t?t._|0:this._gtkFboId;if(this._gl.bindFramebuffer(e,r),e===36008){let e=this._activeReadFramebuffer;e!==t&&(e&&(--e._refCount,e._checkDelete()),t&&(t._refCount+=1)),this._activeReadFramebuffer=t}else{let e=this._activeDrawFramebuffer;e!==t&&(e&&(--e._refCount,e._checkDelete()),t&&(t._refCount+=1)),this._activeDrawFramebuffer=t,this._activeFramebuffer=t}return}super.bindFramebuffer(this.FRAMEBUFFER,t),this._activeReadFramebuffer=t,this._activeDrawFramebuffer=t}deleteFramebuffer(e){this._activeReadFramebuffer===e&&this.bindFramebuffer(36008,null),this._activeDrawFramebuffer===e&&this.bindFramebuffer(36009,null),super.deleteFramebuffer(e)}bufferData(n,r,i){let a=n===35345||n===35982||n===36662||n===36663,o=i===35041||i===35043||i===35045||i===35042||i===35044||i===35046?this.STATIC_DRAW:i;if(a){if(typeof r==`number`)r>=0&&this._gl.bufferDataSizeOnly(n,r,o);else if(typeof r==`object`&&r){let i=t(r);this._gl.bufferData(n,e(i),o)}return}super.bufferData(n,r,o)}bufferSubData(n,r,i){if(n===35345||n===35982||n===36662||n===36663){if(r<0){this.setError(this.INVALID_VALUE);return}if(!i){this.setError(this.INVALID_VALUE);return}let a=t(i);this._gl.bufferSubData(n,r,e(a));return}super.bufferSubData(n,r,i)}bindTexture(e,t){if(e===32879||e===35866){let n=t?t._|0:0;this._gl.bindTexture(e,n),t&&(t._binding=e);return}super.bindTexture(e,t)}texParameteri(e,t,n){if(e===32879||e===35866){this._gl.texParameteri(e,t,n);return}if(t===32882||t===34892||t===34893||t===33084||t===33085||t===33083||t===33082){this._gl.texParameteri(e,t,n);return}super.texParameteri(e,t,n)}drawArrays(e,t,n){if(t<0||n<0){this.setError(this.INVALID_VALUE);return}if(!this._checkStencilState())return;let r=o(this,e,n);if(r<0){this.setError(this.INVALID_ENUM);return}this._framebufferOk()&&n!==0&&this._checkVertexAttribState(n+t-1>>>0)&&this._native2.drawArrays(e,t,r)}drawElements(e=0,t=0,n=0,r=0){if(t<0||r<0){this.setError(this.INVALID_VALUE);return}if(!this._checkStencilState())return;let i=this._vertexObjectState._elementArrayBufferBinding;if(!i){this.setError(this.INVALID_OPERATION);return}let a=null,o=r;if(n===this.UNSIGNED_SHORT){if(o%2){this.setError(this.INVALID_OPERATION);return}o>>=1,a=new Uint16Array(i._elements.buffer)}else if(n===this.UNSIGNED_INT){if(o%4){this.setError(this.INVALID_OPERATION);return}o>>=2,a=new Uint32Array(i._elements.buffer)}else if(n===this.UNSIGNED_BYTE)a=i._elements;else{this.setError(this.INVALID_ENUM);return}let s=t;switch(e){case this.TRIANGLES:t%3&&(s-=t%3);break;case this.LINES:t%2&&(s-=t%2);break;case this.POINTS:break;case this.LINE_LOOP:case this.LINE_STRIP:if(t<2){this.setError(this.INVALID_OPERATION);return}break;case this.TRIANGLE_FAN:case this.TRIANGLE_STRIP:if(t<3){this.setError(this.INVALID_OPERATION);return}break;default:this.setError(this.INVALID_ENUM);return}if(!this._framebufferOk()||t===0)return;let c=0;for(let e=o;e<o+s;++e)e<a.length&&a[e]>c&&(c=a[e]);this._checkVertexAttribState(c)&&this._native2.drawElements(e,s,n,r)}createVertexArray(){let e=this._native2.createVertexArray();if(!e)return null;let t=new g(e,this);return this._vertexArrayObjects[e]=t,t}deleteVertexArray(e){!e||!(e instanceof g)||(e._pendingDelete=!0,e._checkDelete())}isVertexArray(e){return!e||!(e instanceof g)?!1:this._native2.isVertexArray(e._)}bindVertexArray(e){e===null?(this._native2.bindVertexArray(0),this._vertexObjectState=this._defaultVertexObjectState):e instanceof g?(this._native2.bindVertexArray(e._),this._vertexObjectState=e._objectState):this.setError(this.INVALID_OPERATION)}createQuery(){let e=this._native2.createQuery();if(!e)return null;let t=new f(e,this);return this._queries[e]=t,t}deleteQuery(e){!e||!(e instanceof f)||(e._pendingDelete=!0,e._checkDelete())}isQuery(e){return!e||!(e instanceof f)?!1:this._native2.isQuery(e._)}beginQuery(e,t){t instanceof f&&this._native2.beginQuery(e,t._)}endQuery(e){this._native2.endQuery(e)}getQuery(e,t){return y(`WebGL2RenderingContext.getQuery`),null}getQueryParameter(e,t){return e instanceof f?this._native2.getQueryParameter(e._,t):null}createSampler(){let e=this._native2.createSampler();if(!e)return null;let t=new p(e,this);return this._samplers[e]=t,t}deleteSampler(e){!e||!(e instanceof p)||(e._pendingDelete=!0,e._checkDelete())}isSampler(e){return!e||!(e instanceof p)?!1:this._native2.isSampler(e._)}bindSampler(e,t){this._native2.bindSampler(e,t?t._:0)}samplerParameteri(e,t,n){e instanceof p&&this._native2.samplerParameteri(e._,t,n)}samplerParameterf(e,t,n){e instanceof p&&this._native2.samplerParameterf(e._,t,n)}getSamplerParameter(e,t){return e instanceof p?t===33082||t===33083?this._native2.getSamplerParameterf(e._,t):this._native2.getSamplerParameteri(e._,t):null}fenceSync(e,t){let n=this._native2.fenceSync(e,t);if(!n)return null;let r=new m(n,this);return this._syncs[n]=r,r}isSync(e){return!e||!(e instanceof m)?!1:this._native2.isSync(e._)}deleteSync(e){!e||!(e instanceof m)||(e._pendingDelete=!0,e._checkDelete())}clientWaitSync(e,t,n){return e instanceof m?this._native2.clientWaitSync(e._,t,n):37148}waitSync(e,t,n){e instanceof m&&this._native2.waitSync(e._,t,n)}getSyncParameter(e,t){return e instanceof m?this._native2.getSyncParameter(e._,t):null}createTransformFeedback(){let e=this._native2.createTransformFeedback();if(!e)return null;let t=new h(e,this);return this._transformFeedbacks[e]=t,t}deleteTransformFeedback(e){!e||!(e instanceof h)||(e._pendingDelete=!0,e._checkDelete())}isTransformFeedback(e){return!e||!(e instanceof h)?!1:this._native2.isTransformFeedback(e._)}bindTransformFeedback(e,t){this._native2.bindTransformFeedback(e,t?t._:0)}beginTransformFeedback(e){this._native2.beginTransformFeedback(e)}endTransformFeedback(){this._native2.endTransformFeedback()}pauseTransformFeedback(){this._native2.pauseTransformFeedback()}resumeTransformFeedback(){this._native2.resumeTransformFeedback()}transformFeedbackVaryings(e,t,n){this._native2.transformFeedbackVaryings(e._,t,n)}getTransformFeedbackVarying(e,t){let n=this._native2.getTransformFeedbackVarying(e._,t).deepUnpack();return new s({size:n.size,type:n.type,name:n.name})}bindBufferBase(e,t,n){this._native2.bindBufferBase(e,t,n?n._:0)}bindBufferRange(e,t,n,r,i){this._native2.bindBufferRange(e,t,n?n._:0,r,i)}copyBufferSubData(e,t,n,r,i){this._native2.copyBufferSubData(e,t,n,r,i)}getBufferSubData(e,t,n,r,i){let a=i===void 0?n.byteLength-(r??0):i,o=this._native2.getBufferSubData(e,t,a),s=new Uint8Array(n.buffer,n.byteOffset+(r??0)*(n instanceof Uint8Array?1:n.BYTES_PER_ELEMENT??1));s.set(o.subarray(0,s.byteLength))}texImage3D(t,n,r,i,a,o,s,c,l,u){u===null?this._native2.texImage3DNull(t,n,r,i,a,o,s,c,l):this._native2.texImage3D(t,n,r,i,a,o,s,c,l,e(new Uint8Array(u.buffer,u.byteOffset,u.byteLength)))}texSubImage3D(t,n,r,i,a,o,s,c,l,u,d){d!==null&&this._native2.texSubImage3D(t,n,r,i,a,o,s,c,l,u,e(new Uint8Array(d.buffer,d.byteOffset,d.byteLength)))}compressedTexImage3D(t,n,r,i,a,o,s,c,l){this._native2.compressedTexImage3D(t,n,r,i,a,o,s,e(new Uint8Array(l.buffer,l.byteOffset,l.byteLength)))}compressedTexSubImage3D(t,n,r,i,a,o,s,c,l,u,d){this._native2.compressedTexSubImage3D(t,n,r,i,a,o,s,c,l,e(new Uint8Array(d.buffer,d.byteOffset,d.byteLength)))}copyTexSubImage3D(e,t,n,r,i,a,o,s,c){this._native2.copyTexSubImage3D(e,t,n,r,i,a,o,s,c)}texStorage2D(e,t,n,r,i){this._native2.texStorage2D(e,t,n,r,i);let a=this._getTexImage(e);if(a){for(let e=0;e<t;e++)a._levelWidth[e]=Math.max(1,r>>e),a._levelHeight[e]=Math.max(1,i>>e);a._format=this.RGBA,a._type=this.UNSIGNED_BYTE}}texStorage3D(e,t,n,r,i,a){this._native2.texStorage3D(e,t,n,r,i,a)}texImage2D(t=0,n=0,o=0,s=0,c=0,l=0,u=0,d=0,f){let p=0,m=0,h=0,g=0;if(arguments.length===6)if(d=c,h=s,l instanceof v.Pixbuf){let e=l;p=e.get_width(),m=e.get_height(),f=e.get_pixels()}else{let e=i(l);if(e==null)throw TypeError(`texImage2D(GLenum, GLint, GLenum, GLint, GLenum, GLenum, ImageData | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement)`);p=e.width,m=e.height,f=e.data}else arguments.length>=9&&(p=s,m=c,g=l,h=u);let _=this._getTexImage(t);if(!_){this.setError(this.INVALID_OPERATION);return}let y=r(f);if(this._unpackPremultAlpha&&y&&h===this.RGBA&&(y=a(y)),this._unpackFlipY&&y&&p>0&&m>0){let e=this._computePixelSize(d,h);if(e>0){let t=this._computeRowStride(p,e),n=new Uint8Array(y.length);for(let e=0;e<m;e++){let r=e*t,i=(m-1-e)*t;n.set(y.subarray(r,r+t),i)}y=n}}this._saveError(),this._gl.texImage2D(t,n,o,p,m,g,h,d,e(y));let b=this.getError();if(this._restoreError(b),b!==this.NO_ERROR)return;_._levelWidth[n]=p,_._levelHeight[n]=m,_._format=h,_._type=d;let x=this._activeFramebuffer;if(x){let e=!1,t=this._getAttachments();for(let n=0;n<t.length;++n)if(x._attachments[t[n]]===_){e=!0;break}e&&this._activeFramebuffer&&this._updateFramebufferAttachments(this._activeFramebuffer)}}texSubImage2D(t=0,n=0,o=0,s=0,c=0,l=0,u=0,d=0,f){let p=0,m=0,h=0;if(arguments.length===7)if(d=l,h=c,u instanceof v.Pixbuf){let e=u;p=e.get_width(),m=e.get_height(),f=e.get_pixels()}else{let e=i(u);if(e==null)throw TypeError(`texSubImage2D(GLenum, GLint, GLint, GLint, GLenum, GLenum, ImageData | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement)`);p=e.width,m=e.height,f=e.data}else p=c,m=l,h=u;if(!this._getTexImage(t)){this.setError(this.INVALID_OPERATION);return}let g=r(f);if(!g){this.setError(this.INVALID_OPERATION);return}if(this._unpackPremultAlpha&&g&&h===this.RGBA&&(g=a(g)),this._unpackFlipY&&g&&p>0&&m>0){let e=this._computePixelSize(d,h);if(e>0){let t=this._computeRowStride(p,e),n=new Uint8Array(g.length);for(let e=0;e<m;e++){let r=e*t,i=(m-1-e)*t;n.set(g.subarray(r,r+t),i)}g=n}}this._gl.texSubImage2D(t,n,o,s,p,m,h,d,e(g))}framebufferTextureLayer(e,t,n,r,i){this._native2.framebufferTextureLayer(e,t,n?n._:0,r,i)}drawArraysInstanced(e,t,n,r){if(t<0||n<0||r<0){this.setError(this.INVALID_VALUE);return}if(!this._checkStencilState())return;let i=o(this,e,n);if(i<0){this.setError(this.INVALID_ENUM);return}if(this._framebufferOk()&&!(n===0||r===0)&&this._checkVertexAttribState(n+t-1>>>0)){if(globalThis.__GJSIFY_DEBUG_GL){let e=this.__drawInstCount=(this.__drawInstCount|0)+1;(e<=5||e%100==0)&&console.log(`[WebGL] drawArraysInstanced #${e} count=${i} instances=${r} fbo=${this._activeFramebuffer?._??`_gtkFbo`}`)}this._native2.drawArraysInstanced(e,t,i,r)}}drawElementsInstanced(e,t,n,r,i){if(t<0||r<0||i<0){this.setError(this.INVALID_VALUE);return}if(!this._checkStencilState())return;let a=this._vertexObjectState._elementArrayBufferBinding;if(!a){this.setError(this.INVALID_OPERATION);return}let o=null,s=r;if(n===this.UNSIGNED_SHORT){if(s%2){this.setError(this.INVALID_OPERATION);return}s>>=1,o=new Uint16Array(a._elements.buffer)}else if(n===this.UNSIGNED_INT){if(s%4){this.setError(this.INVALID_OPERATION);return}s>>=2,o=new Uint32Array(a._elements.buffer)}else if(n===this.UNSIGNED_BYTE)o=a._elements;else{this.setError(this.INVALID_ENUM);return}let c=t;switch(e){case this.TRIANGLES:t%3&&(c-=t%3);break;case this.LINES:t%2&&(c-=t%2);break;case this.POINTS:break;case this.LINE_LOOP:case this.LINE_STRIP:if(t<2){this.setError(this.INVALID_OPERATION);return}break;case this.TRIANGLE_FAN:case this.TRIANGLE_STRIP:if(t<3){this.setError(this.INVALID_OPERATION);return}break;default:this.setError(this.INVALID_ENUM);return}if(!this._framebufferOk())return;if(c===0||i===0){this._checkVertexAttribState(0);return}if(c+s>>>0>o.length){this.setError(this.INVALID_OPERATION);return}let l=0;for(let e=s;e<s+c;++e)o[e]>l&&(l=o[e]);this._checkVertexAttribState(l)&&this._native2.drawElementsInstanced(e,c,n,r,i)}vertexAttribDivisor(e,t){this._native2.vertexAttribDivisor(e,t)}vertexAttribIPointer(e,t,n,r,i){this._native2.vertexAttribIPointer(e,t,n,r,i)}drawBuffers(e){let t=!1;for(let n=0;n<e.length;n++)if(e[n]===1029){t=!0;break}if(!t){this._native2.drawBuffers(e);return}this._native2.drawBuffers(e.map(e=>e===1029?this.COLOR_ATTACHMENT0:e))}drawRangeElements(e,t,n,r,i,a){if(r<0||a<0){this.setError(this.INVALID_VALUE);return}if(n<t){this.setError(this.INVALID_VALUE);return}this.drawElements(e,r,i,a)}blitFramebuffer(e,t,n,r,i,a,o,s,c,l){if(globalThis.__GJSIFY_DEBUG_GL){let e=this._gl.getError();e!==0&&console.log(`[WebGL] blitFramebuffer PRE-ERROR 0x${e.toString(16)}`)}if(this._native2.blitFramebuffer(e,t,n,r,i,a,o,s,c,l),globalThis.__GJSIFY_DEBUG_GL){let i=this._gl.getError(),a=this.__blitCount=(this.__blitCount|0)+1;a<=5&&console.log(`[WebGL] blitFramebuffer #${a} src=(${e},${t},${n},${r}) readFbo=${this._activeReadFramebuffer?._??`_gtkFbo`} err=${i===0?`OK`:`0x`+i.toString(16)}`)}}clearBufferfv(e,t,n,r){let i=this._native2;if(typeof i.clearBufferfv==`function`){i.clearBufferfv(e,t,Array.from(n));return}let a=n;if(e===6144){let e=this.getParameter(this.COLOR_CLEAR_VALUE);this.clearColor(a[0]??0,a[1]??0,a[2]??0,a[3]??0),this.clear(this.COLOR_BUFFER_BIT),e&&this.clearColor(e[0],e[1],e[2],e[3])}else if(e===6145){let e=this.getParameter(this.DEPTH_CLEAR_VALUE);this.clearDepth(a[0]??1),this.clear(this.DEPTH_BUFFER_BIT),e!==null&&this.clearDepth(e)}}clearBufferiv(e,t,n,r){let i=this._native2;if(typeof i.clearBufferiv==`function`){i.clearBufferiv(e,t,Array.from(n));return}if(e===6146){let e=n,t=this.getParameter(this.STENCIL_CLEAR_VALUE);this.clearStencil(e[0]??0),this.clear(this.STENCIL_BUFFER_BIT),t!==null&&this.clearStencil(t)}}clearBufferuiv(e,t,n,r){let i=this._native2;if(typeof i.clearBufferuiv==`function`){i.clearBufferuiv(e,t,Array.from(n));return}}clearBufferfi(e,t,n,r){let i=this._native2;if(typeof i.clearBufferfi==`function`){i.clearBufferfi(e,t,n,r);return}if(e===34041){let e=this.getParameter(this.DEPTH_CLEAR_VALUE),t=this.getParameter(this.STENCIL_CLEAR_VALUE);this.clearDepth(n),this.clearStencil(r),this.clear(this.DEPTH_BUFFER_BIT|this.STENCIL_BUFFER_BIT),e!==null&&this.clearDepth(e),t!==null&&this.clearStencil(t)}}invalidateFramebuffer(e,t){this._native2.invalidateFramebuffer(e,t)}invalidateSubFramebuffer(e,t,n,r,i,a){this._native2.invalidateSubFramebuffer(e,t,n,r,i,a)}readBuffer(e){this._native2.readBuffer(e)}renderbufferStorageMultisample(e,t,n,r,i){if(e!==this.RENDERBUFFER){this.setError(this.INVALID_ENUM);return}let a=this._activeRenderbuffer;if(!a){this.setError(this.INVALID_OPERATION);return}this._saveError(),this._native2.renderbufferStorageMultisample(e,t,n,r,i);let o=this.getError();this._restoreError(o),o===this.NO_ERROR&&(a._width=r,a._height=i,a._format=n)}uniform1ui(e,t){e&&this._native2.uniform1ui(e._,t)}uniform2ui(e,t,n){e&&this._native2.uniform2ui(e._,t,n)}uniform3ui(e,t,n,r){e&&this._native2.uniform3ui(e._,t,n,r)}uniform4ui(e,t,n,r,i){e&&this._native2.uniform4ui(e._,t,n,r,i)}uniform1uiv(e,t,n,r){if(!e)return;let i=t instanceof Uint32Array?t:new Uint32Array(t);this._native2.uniform1uiv(e._,i.length,i)}uniform2uiv(e,t,n,r){if(!e)return;let i=t instanceof Uint32Array?t:new Uint32Array(t);this._native2.uniform2uiv(e._,i.length/2,i)}uniform3uiv(e,t,n,r){if(!e)return;let i=t instanceof Uint32Array?t:new Uint32Array(t);this._native2.uniform3uiv(e._,i.length/3,i)}uniform4uiv(e,t,n,r){if(!e)return;let i=t instanceof Uint32Array?t:new Uint32Array(t);this._native2.uniform4uiv(e._,i.length/4,i)}uniformMatrix2x3fv(e,t,n,r,i){if(!e)return;let a=n instanceof Float32Array?n:new Float32Array(n);this._native2.uniformMatrix2x3fv(e._,t,a)}uniformMatrix3x2fv(e,t,n,r,i){if(!e)return;let a=n instanceof Float32Array?n:new Float32Array(n);this._native2.uniformMatrix3x2fv(e._,t,a)}uniformMatrix2x4fv(e,t,n,r,i){if(!e)return;let a=n instanceof Float32Array?n:new Float32Array(n);this._native2.uniformMatrix2x4fv(e._,t,a)}uniformMatrix4x2fv(e,t,n,r,i){if(!e)return;let a=n instanceof Float32Array?n:new Float32Array(n);this._native2.uniformMatrix4x2fv(e._,t,a)}uniformMatrix3x4fv(e,t,n,r,i){if(!e)return;let a=n instanceof Float32Array?n:new Float32Array(n);this._native2.uniformMatrix3x4fv(e._,t,a)}uniformMatrix4x3fv(e,t,n,r,i){if(!e)return;let a=n instanceof Float32Array?n:new Float32Array(n);this._native2.uniformMatrix4x3fv(e._,t,a)}getUniform(e,t){let n=t?._activeInfo?.type,r=5125,i=36294,a=36295;if(!(n===r||n===i||n===a||n===36296))return super.getUniform(e,t);if(!e||!t)return null;let o=this._gl.getUniformi(e._|0,t._|0);return o?n===r?o[0]>>>0:n===i?new Uint32Array([o[0]>>>0,o[1]>>>0]):n===a?new Uint32Array([o[0]>>>0,o[1]>>>0,o[2]>>>0]):new Uint32Array([o[0]>>>0,o[1]>>>0,o[2]>>>0,o[3]>>>0]):null}getUniformBlockIndex(e,t){return this._native2.getUniformBlockIndex(e._,t)}uniformBlockBinding(e,t,n){this._native2.uniformBlockBinding(e._,t,n)}getActiveUniformBlockName(e,t){let n=this._native2.getActiveUniformBlockName(e._,t);return n.length>0?n:null}getActiveUniformBlockParameter(e,t,n){return this._native2.getActiveUniformBlockParameter(e._,t,n)}getActiveUniforms(e,t,n){return this._native2.getActiveUniforms(e._,t,n)}getFragDataLocation(e,t){return this._native2.getFragDataLocation(e._,t)}getIndexedParameter(e,t){return this._native2.getIndexedParameteri(e,t)}getInternalformatParameter(e,t,n){return this._native2.getInternalformatParameter(e,t,n)}getParameter(e){if(e===7938)return`WebGL 2.0`;if(e===35724)return`WebGL GLSL ES 3.00`;if(e===7939)return y(`WebGL2RenderingContext.getParameter(GL_EXTENSIONS)`),``;if(e===36006)return this._activeDrawFramebuffer;if(e===36010)return this._activeReadFramebuffer;switch(e){case 36183:case 35071:case 32883:case 36063:case 34852:case 36203:case 33001:case 33e3:case 37157:case 35373:case 35657:case 35077:case 35978:case 35979:case 35968:case 35376:case 35375:case 35659:case 37154:case 35371:case 35658:case 35379:case 35374:case 35377:case 35076:case 3330:case 3332:case 3331:case 35053:case 35055:case 3074:case 32874:case 35869:case 36389:case 35983:case 35368:case 35380:case 32878:case 3314:case 32877:case 3316:case 3315:case 34045:return this._native2.getParameterx(e)?.deepUnpack()|0;case 35977:case 36388:case 36387:return!!this._native2.getParameterx(e)?.deepUnpack()}return super.getParameter(e)}getStringi(e,t){let n=this._native2.getStringi(e,t);return n.length>0?n:null}renderbufferStorage(e,t,n,r){if(e!==this.RENDERBUFFER){this.setError(this.INVALID_ENUM);return}let i=this._activeRenderbuffer;if(!i){this.setError(this.INVALID_OPERATION);return}if(n<0||r<0){this.setError(this.INVALID_VALUE);return}for(;this._gl.getError()!==this.NO_ERROR;);if(this._gl.renderbufferStorage(e,t,n,r),this._gl.getError()!==this.NO_ERROR)return;i._width=n,i._height=r,i._format=t;let a=this._activeFramebuffer;if(a){let e=this._getAttachments(),t=!1;for(let n=0;n<e.length;++n)if(a._attachments[e[n]]===i){t=!0;break}t&&this._updateFramebufferAttachments(a)}}getSupportedExtensions(){let e=super.getSupportedExtensions();for(let t of[`EXT_color_buffer_float`,`EXT_color_buffer_half_float`,`OES_texture_half_float`])e.indexOf(t)===-1&&e.push(t);return e}readPixels(t,n,r,i,a,o,s){if(!s)return;if(r<0||i<0){this.setError(this.INVALID_VALUE);return}if(!this._framebufferOk())return;let c=a===6408||a===32856?4:a===6407?3:a===33319?2:1,l=o===5126?4:o===5131||o===36193?2:o===5125||o===5124?4:o===5123||o===5122?2:1,u=r*i*c*l,d=new Uint8Array(u);this._saveError();let f=this._gl.readPixels(t,n,r,i,a,o,e(d)),p=this.getError();if(this._restoreError(p),p!==this.NO_ERROR)return;let m=f&&f.length>0?f:d;if(s instanceof Uint8Array)s.set(m);else if(s instanceof Float32Array){let e=new Float32Array(m.buffer,0,s.length);s.set(e)}}_framebufferOk(){return!0}};export{b as WebGL2RenderingContext};
|
|
1
|
+
import"./_virtual/_rolldown/runtime.js";import{Uint8ArrayToVariant as e,arrayToUint8Array as t,checkObject as n,convertPixels as r,extractImageData as i,premultiplyAlpha as a,vertexCount as o}from"./utils.js";import{WebGLFramebuffer as s}from"./webgl-framebuffer.js";import{WebGLRenderbuffer as c}from"./webgl-renderbuffer.js";import{WebGLTexture as l}from"./webgl-texture.js";import{WebGLActiveInfo as u}from"./webgl-active-info.js";import{WebGLContextBase as d}from"./webgl-context-base.js";import{WebGLQuery as f}from"./webgl-query.js";import{WebGLSampler as p}from"./webgl-sampler.js";import{WebGLSync as m}from"./webgl-sync.js";import{WebGLTransformFeedback as h}from"./webgl-transform-feedback.js";import{WebGLVertexArrayObject as g}from"./webgl-vertex-array-object.js";import _ from"@girs/gwebgl-0.1";import{warnNotImplemented as v}from"@gjsify/utils";import y from"gi://GdkPixbuf?version=2.0";function debugGlEnabled(){return globalThis.__GJSIFY_DEBUG_GL===!0}var b=class WebGL2RenderingContext extends d{get _gl(){return this._native2}constructor(e,t={}){super(e,t),this._queries={},this._samplers={},this._transformFeedbacks={},this._vertexArrayObjects={},this._syncs={},this._activeReadFramebuffer=null,this._activeDrawFramebuffer=null,this._native2=new _.WebGL2RenderingContext({}),this._init()}_getGlslVersion(e){return e?`300 es`:`130`}_validFramebufferAttachment(e){return super._validFramebufferAttachment(e)?!0:e>=36065&&e<=36079}static{this._WGL2_ALL_COLOR_ATTACHMENTS=[36064,36065,36066,36067,36068,36069,36070,36071,36072,36073,36074,36075,36076,36077,36078,36079]}_getColorAttachments(){return WebGL2RenderingContext._WGL2_ALL_COLOR_ATTACHMENTS}_preCheckFramebufferStatus(e){let t=e._attachments,n=0,r=0,i=[this.COLOR_ATTACHMENT0,this.DEPTH_ATTACHMENT,this.STENCIL_ATTACHMENT,this.DEPTH_STENCIL_ATTACHMENT,...WebGL2RenderingContext._WGL2_ALL_COLOR_ATTACHMENTS];for(let a of i){let i=t[a];if(i){if(i instanceof l){let t=e._attachmentLevel[a]??0,o=i._levelWidth[t]??0,s=i._levelHeight[t]??0;if(o>0&&s>0){n=o,r=s;break}}else if(i instanceof c&&i._width>0&&i._height>0){n=i._width,r=i._height;break}}}return n>0&&r>0?(e._width=n,e._height=r,this.FRAMEBUFFER_COMPLETE):this.FRAMEBUFFER_INCOMPLETE_ATTACHMENT}_updateFramebufferAttachments(e){if(super._updateFramebufferAttachments(e),e)for(let t=1;t<=15;t++){let n=36064+t;if(!(n in e._attachments))continue;let r=e._attachments[n];if(r instanceof l){let t=e._attachmentFace[n]||this.TEXTURE_2D,i=e._attachmentLevel[n]??0;this._gl.framebufferTexture2D(this.FRAMEBUFFER,n,t,r._|0,i|0)}else r instanceof c?this._gl.framebufferRenderbuffer(this.FRAMEBUFFER,n,this.RENDERBUFFER,r._|0):this._gl.framebufferTexture2D(this.FRAMEBUFFER,n,this.TEXTURE_2D,0,0)}}bindBuffer(e,t){if(e===35345||e===35982||e===36662||e===36663){let n=t?t._|0:0;this._gl.bindBuffer(e,n);return}super.bindBuffer(e,t)}bindFramebuffer(e,t){if(e===36008||e===36009){if(!n(t))throw TypeError(`bindFramebuffer(GLenum, WebGLFramebuffer)`);if(t&&t._pendingDelete||t&&!this._checkWrapper(t,s))return;let r=t?t._|0:this._gtkFboId;if(this._gl.bindFramebuffer(e,r),e===36008){let e=this._activeReadFramebuffer;e!==t&&(e&&(--e._refCount,e._checkDelete()),t&&(t._refCount+=1)),this._activeReadFramebuffer=t}else{let e=this._activeDrawFramebuffer;e!==t&&(e&&(--e._refCount,e._checkDelete()),t&&(t._refCount+=1)),this._activeDrawFramebuffer=t,this._activeFramebuffer=t}return}super.bindFramebuffer(this.FRAMEBUFFER,t),this._activeReadFramebuffer=t,this._activeDrawFramebuffer=t}deleteFramebuffer(e){this._activeReadFramebuffer===e&&this.bindFramebuffer(36008,null),this._activeDrawFramebuffer===e&&this.bindFramebuffer(36009,null),super.deleteFramebuffer(e)}bufferData(n,r,i){let a=n===35345||n===35982||n===36662||n===36663,o=i===35041||i===35043||i===35045||i===35042||i===35044||i===35046?this.STATIC_DRAW:i;if(a){if(typeof r==`number`)r>=0&&this._gl.bufferDataSizeOnly(n,r,o);else if(typeof r==`object`&&r){let i=t(r);this._gl.bufferData(n,e(i),o)}return}super.bufferData(n,r,o)}bufferSubData(n,r,i){if(n===35345||n===35982||n===36662||n===36663){if(r<0){this.setError(this.INVALID_VALUE);return}if(!i){this.setError(this.INVALID_VALUE);return}let a=t(i);this._gl.bufferSubData(n,r,e(a));return}super.bufferSubData(n,r,i)}bindTexture(e,t){if(e===32879||e===35866){let n=t,r=n?n._|0:0;this._gl.bindTexture(e,r),n&&(n._binding=e);return}super.bindTexture(e,t)}texParameteri(e,t,n){if(e===32879||e===35866){this._gl.texParameteri(e,t,n);return}if(t===32882||t===34892||t===34893||t===33084||t===33085||t===33083||t===33082){this._gl.texParameteri(e,t,n);return}super.texParameteri(e,t,n)}drawArrays(e,t,n){if(t<0||n<0){this.setError(this.INVALID_VALUE);return}if(!this._checkStencilState())return;let r=o(this,e,n);if(r<0){this.setError(this.INVALID_ENUM);return}this._framebufferOk()&&n!==0&&this._checkVertexAttribState(n+t-1>>>0)&&this._native2.drawArrays(e,t,r)}drawElements(e=0,t=0,n=0,r=0){if(t<0||r<0){this.setError(this.INVALID_VALUE);return}if(!this._checkStencilState())return;let i=this._vertexObjectState._elementArrayBufferBinding;if(!i){this.setError(this.INVALID_OPERATION);return}let a=null,o=r;if(n===this.UNSIGNED_SHORT){if(o%2){this.setError(this.INVALID_OPERATION);return}o>>=1,a=new Uint16Array(i._elements.buffer)}else if(n===this.UNSIGNED_INT){if(o%4){this.setError(this.INVALID_OPERATION);return}o>>=2,a=new Uint32Array(i._elements.buffer)}else if(n===this.UNSIGNED_BYTE)a=i._elements;else{this.setError(this.INVALID_ENUM);return}let s=t;switch(e){case this.TRIANGLES:t%3&&(s-=t%3);break;case this.LINES:t%2&&(s-=t%2);break;case this.POINTS:break;case this.LINE_LOOP:case this.LINE_STRIP:if(t<2){this.setError(this.INVALID_OPERATION);return}break;case this.TRIANGLE_FAN:case this.TRIANGLE_STRIP:if(t<3){this.setError(this.INVALID_OPERATION);return}break;default:this.setError(this.INVALID_ENUM);return}if(!this._framebufferOk()||t===0)return;let c=0;for(let e=o;e<o+s;++e)e<a.length&&a[e]>c&&(c=a[e]);this._checkVertexAttribState(c)&&this._native2.drawElements(e,s,n,r)}createVertexArray(){let e=this._native2.createVertexArray();if(!e)return null;let t=new g(e,this);return this._vertexArrayObjects[e]=t,t}deleteVertexArray(e){!e||!(e instanceof g)||(e._pendingDelete=!0,e._checkDelete())}isVertexArray(e){return!e||!(e instanceof g)?!1:this._native2.isVertexArray(e._)}bindVertexArray(e){e===null?(this._native2.bindVertexArray(0),this._vertexObjectState=this._defaultVertexObjectState):e instanceof g?(this._native2.bindVertexArray(e._),this._vertexObjectState=e._objectState):this.setError(this.INVALID_OPERATION)}createQuery(){let e=this._native2.createQuery();if(!e)return null;let t=new f(e,this);return this._queries[e]=t,t}deleteQuery(e){!e||!(e instanceof f)||(e._pendingDelete=!0,e._checkDelete())}isQuery(e){return!e||!(e instanceof f)?!1:this._native2.isQuery(e._)}beginQuery(e,t){t instanceof f&&this._native2.beginQuery(e,t._)}endQuery(e){this._native2.endQuery(e)}getQuery(e,t){return v(`WebGL2RenderingContext.getQuery`),null}getQueryParameter(e,t){return e instanceof f?this._native2.getQueryParameter(e._,t):null}createSampler(){let e=this._native2.createSampler();if(!e)return null;let t=new p(e,this);return this._samplers[e]=t,t}deleteSampler(e){!e||!(e instanceof p)||(e._pendingDelete=!0,e._checkDelete())}isSampler(e){return!e||!(e instanceof p)?!1:this._native2.isSampler(e._)}bindSampler(e,t){this._native2.bindSampler(e,t?t._:0)}samplerParameteri(e,t,n){e instanceof p&&this._native2.samplerParameteri(e._,t,n)}samplerParameterf(e,t,n){e instanceof p&&this._native2.samplerParameterf(e._,t,n)}getSamplerParameter(e,t){return e instanceof p?t===33082||t===33083?this._native2.getSamplerParameterf(e._,t):this._native2.getSamplerParameteri(e._,t):null}fenceSync(e,t){let n=this._native2.fenceSync(e,t);if(!n)return null;let r=new m(n,this);return this._syncs[n]=r,r}isSync(e){return!e||!(e instanceof m)?!1:this._native2.isSync(e._)}deleteSync(e){!e||!(e instanceof m)||(e._pendingDelete=!0,e._checkDelete())}clientWaitSync(e,t,n){return e instanceof m?this._native2.clientWaitSync(e._,t,n):37148}waitSync(e,t,n){e instanceof m&&this._native2.waitSync(e._,t,n)}getSyncParameter(e,t){return e instanceof m?this._native2.getSyncParameter(e._,t):null}createTransformFeedback(){let e=this._native2.createTransformFeedback();if(!e)return null;let t=new h(e,this);return this._transformFeedbacks[e]=t,t}deleteTransformFeedback(e){!e||!(e instanceof h)||(e._pendingDelete=!0,e._checkDelete())}isTransformFeedback(e){return!e||!(e instanceof h)?!1:this._native2.isTransformFeedback(e._)}bindTransformFeedback(e,t){this._native2.bindTransformFeedback(e,t?t._:0)}beginTransformFeedback(e){this._native2.beginTransformFeedback(e)}endTransformFeedback(){this._native2.endTransformFeedback()}pauseTransformFeedback(){this._native2.pauseTransformFeedback()}resumeTransformFeedback(){this._native2.resumeTransformFeedback()}transformFeedbackVaryings(e,t,n){this._native2.transformFeedbackVaryings(e._,t,n)}getTransformFeedbackVarying(e,t){let n=this._native2.getTransformFeedbackVarying(e._,t).deepUnpack();return new u({size:n.size,type:n.type,name:n.name})}bindBufferBase(e,t,n){this._native2.bindBufferBase(e,t,n?n._:0)}bindBufferRange(e,t,n,r,i){this._native2.bindBufferRange(e,t,n?n._:0,r,i)}copyBufferSubData(e,t,n,r,i){this._native2.copyBufferSubData(e,t,n,r,i)}getBufferSubData(e,t,n,r,i){let a=i===void 0?n.byteLength-(r??0):i,o=this._native2.getBufferSubData(e,t,a),s=new Uint8Array(n.buffer,n.byteOffset+(r??0)*(n instanceof Uint8Array?1:n.BYTES_PER_ELEMENT??1));s.set(o.subarray(0,s.byteLength))}texImage3D(t,n,r,i,a,o,s,c,l,u){u===null?this._native2.texImage3DNull(t,n,r,i,a,o,s,c,l):this._native2.texImage3D(t,n,r,i,a,o,s,c,l,e(new Uint8Array(u.buffer,u.byteOffset,u.byteLength)))}texSubImage3D(t,n,r,i,a,o,s,c,l,u,d){d!==null&&this._native2.texSubImage3D(t,n,r,i,a,o,s,c,l,u,e(new Uint8Array(d.buffer,d.byteOffset,d.byteLength)))}compressedTexImage3D(t,n,r,i,a,o,s,c,l){this._native2.compressedTexImage3D(t,n,r,i,a,o,s,e(new Uint8Array(l.buffer,l.byteOffset,l.byteLength)))}compressedTexSubImage3D(t,n,r,i,a,o,s,c,l,u,d){this._native2.compressedTexSubImage3D(t,n,r,i,a,o,s,c,l,e(new Uint8Array(d.buffer,d.byteOffset,d.byteLength)))}copyTexSubImage3D(e,t,n,r,i,a,o,s,c){this._native2.copyTexSubImage3D(e,t,n,r,i,a,o,s,c)}texStorage2D(e,t,n,r,i){this._native2.texStorage2D(e,t,n,r,i);let a=this._getTexImage(e);if(a){for(let e=0;e<t;e++)a._levelWidth[e]=Math.max(1,r>>e),a._levelHeight[e]=Math.max(1,i>>e);a._format=this.RGBA,a._type=this.UNSIGNED_BYTE}}texStorage3D(e,t,n,r,i,a){this._native2.texStorage3D(e,t,n,r,i,a)}texImage2D(t=0,n=0,o=0,s=0,c=0,l=0,u=0,d=0,f){let p=0,m=0,h=0,g=0;if(arguments.length===6)if(d=c,h=s,l instanceof y.Pixbuf){let e=l;p=e.get_width(),m=e.get_height(),f=e.get_pixels()}else{let e=i(l);if(e==null)throw TypeError(`texImage2D(GLenum, GLint, GLenum, GLint, GLenum, GLenum, ImageData | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement)`);p=e.width,m=e.height,f=e.data}else arguments.length>=9&&(p=s,m=c,g=l,h=u);let _=this._getTexImage(t);if(!_){this.setError(this.INVALID_OPERATION);return}let v=r(f);if(this._unpackPremultAlpha&&v&&h===this.RGBA&&(v=a(v)),this._unpackFlipY&&v&&p>0&&m>0){let e=this._computePixelSize(d,h);if(e>0){let t=this._computeRowStride(p,e),n=new Uint8Array(v.length);for(let e=0;e<m;e++){let r=e*t,i=(m-1-e)*t;n.set(v.subarray(r,r+t),i)}v=n}}this._saveError(),this._gl.texImage2D(t,n,o,p,m,g,h,d,e(v));let b=this.getError();if(this._restoreError(b),b!==this.NO_ERROR)return;_._levelWidth[n]=p,_._levelHeight[n]=m,_._format=h,_._type=d;let x=this._activeFramebuffer;if(x){let e=!1,t=this._getAttachments();for(let n=0;n<t.length;++n)if(x._attachments[t[n]]===_){e=!0;break}e&&this._activeFramebuffer&&this._updateFramebufferAttachments(this._activeFramebuffer)}}texSubImage2D(t=0,n=0,o=0,s=0,c=0,l=0,u=0,d=0,f){let p=0,m=0,h=0;if(arguments.length===7)if(d=l,h=c,u instanceof y.Pixbuf){let e=u;p=e.get_width(),m=e.get_height(),f=e.get_pixels()}else{let e=i(u);if(e==null)throw TypeError(`texSubImage2D(GLenum, GLint, GLint, GLint, GLenum, GLenum, ImageData | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement)`);p=e.width,m=e.height,f=e.data}else p=c,m=l,h=u;if(!this._getTexImage(t)){this.setError(this.INVALID_OPERATION);return}let g=r(f);if(!g){this.setError(this.INVALID_OPERATION);return}if(this._unpackPremultAlpha&&g&&h===this.RGBA&&(g=a(g)),this._unpackFlipY&&g&&p>0&&m>0){let e=this._computePixelSize(d,h);if(e>0){let t=this._computeRowStride(p,e),n=new Uint8Array(g.length);for(let e=0;e<m;e++){let r=e*t,i=(m-1-e)*t;n.set(g.subarray(r,r+t),i)}g=n}}this._gl.texSubImage2D(t,n,o,s,p,m,h,d,e(g))}framebufferTextureLayer(e,t,n,r,i){this._native2.framebufferTextureLayer(e,t,n?n._:0,r,i)}drawArraysInstanced(e,t,n,r){if(t<0||n<0||r<0){this.setError(this.INVALID_VALUE);return}if(!this._checkStencilState())return;let i=o(this,e,n);if(i<0){this.setError(this.INVALID_ENUM);return}if(this._framebufferOk()&&!(n===0||r===0)&&this._checkVertexAttribState(n+t-1>>>0)){if(debugGlEnabled()){let e=this,t=e.__drawInstCount=(e.__drawInstCount|0)+1;(t<=5||t%100==0)&&console.log(`[WebGL] drawArraysInstanced #${t} count=${i} instances=${r} fbo=${this._activeFramebuffer?._??`_gtkFbo`}`)}this._native2.drawArraysInstanced(e,t,i,r)}}drawElementsInstanced(e,t,n,r,i){if(t<0||r<0||i<0){this.setError(this.INVALID_VALUE);return}if(!this._checkStencilState())return;let a=this._vertexObjectState._elementArrayBufferBinding;if(!a){this.setError(this.INVALID_OPERATION);return}let o=null,s=r;if(n===this.UNSIGNED_SHORT){if(s%2){this.setError(this.INVALID_OPERATION);return}s>>=1,o=new Uint16Array(a._elements.buffer)}else if(n===this.UNSIGNED_INT){if(s%4){this.setError(this.INVALID_OPERATION);return}s>>=2,o=new Uint32Array(a._elements.buffer)}else if(n===this.UNSIGNED_BYTE)o=a._elements;else{this.setError(this.INVALID_ENUM);return}let c=t;switch(e){case this.TRIANGLES:t%3&&(c-=t%3);break;case this.LINES:t%2&&(c-=t%2);break;case this.POINTS:break;case this.LINE_LOOP:case this.LINE_STRIP:if(t<2){this.setError(this.INVALID_OPERATION);return}break;case this.TRIANGLE_FAN:case this.TRIANGLE_STRIP:if(t<3){this.setError(this.INVALID_OPERATION);return}break;default:this.setError(this.INVALID_ENUM);return}if(!this._framebufferOk())return;if(c===0||i===0){this._checkVertexAttribState(0);return}if(c+s>>>0>o.length){this.setError(this.INVALID_OPERATION);return}let l=0;for(let e=s;e<s+c;++e)o[e]>l&&(l=o[e]);this._checkVertexAttribState(l)&&this._native2.drawElementsInstanced(e,c,n,r,i)}vertexAttribDivisor(e,t){this._native2.vertexAttribDivisor(e,t)}vertexAttribIPointer(e,t,n,r,i){this._native2.vertexAttribIPointer(e,t,n,r,i)}drawBuffers(e){let t=!1;for(let n=0;n<e.length;n++)if(e[n]===1029){t=!0;break}if(!t){this._native2.drawBuffers(e);return}this._native2.drawBuffers(e.map(e=>e===1029?this.COLOR_ATTACHMENT0:e))}drawRangeElements(e,t,n,r,i,a){if(r<0||a<0){this.setError(this.INVALID_VALUE);return}if(n<t){this.setError(this.INVALID_VALUE);return}this.drawElements(e,r,i,a)}blitFramebuffer(e,t,n,r,i,a,o,s,c,l){if(debugGlEnabled()){let e=this._gl.getError();e!==0&&console.log(`[WebGL] blitFramebuffer PRE-ERROR 0x${e.toString(16)}`)}if(this._native2.blitFramebuffer(e,t,n,r,i,a,o,s,c,l),debugGlEnabled()){let i=this._gl.getError(),a=this,o=a.__blitCount=(a.__blitCount|0)+1;o<=5&&console.log(`[WebGL] blitFramebuffer #${o} src=(${e},${t},${n},${r}) readFbo=${this._activeReadFramebuffer?._??`_gtkFbo`} err=${i===0?`OK`:`0x`+i.toString(16)}`)}}clearBufferfv(e,t,n,r){let i=this._native2;if(typeof i.clearBufferfv==`function`){i.clearBufferfv(e,t,Array.from(n));return}let a=n;if(e===6144){let e=this.getParameter(this.COLOR_CLEAR_VALUE);this.clearColor(a[0]??0,a[1]??0,a[2]??0,a[3]??0),this.clear(this.COLOR_BUFFER_BIT),e&&this.clearColor(e[0],e[1],e[2],e[3])}else if(e===6145){let e=this.getParameter(this.DEPTH_CLEAR_VALUE);this.clearDepth(a[0]??1),this.clear(this.DEPTH_BUFFER_BIT),e!==null&&this.clearDepth(e)}}clearBufferiv(e,t,n,r){let i=this._native2;if(typeof i.clearBufferiv==`function`){i.clearBufferiv(e,t,Array.from(n));return}if(e===6146){let e=n,t=this.getParameter(this.STENCIL_CLEAR_VALUE);this.clearStencil(e[0]??0),this.clear(this.STENCIL_BUFFER_BIT),t!==null&&this.clearStencil(t)}}clearBufferuiv(e,t,n,r){let i=this._native2;if(typeof i.clearBufferuiv==`function`){i.clearBufferuiv(e,t,Array.from(n));return}}clearBufferfi(e,t,n,r){let i=this._native2;if(typeof i.clearBufferfi==`function`){i.clearBufferfi(e,t,n,r);return}if(e===34041){let e=this.getParameter(this.DEPTH_CLEAR_VALUE),t=this.getParameter(this.STENCIL_CLEAR_VALUE);this.clearDepth(n),this.clearStencil(r),this.clear(this.DEPTH_BUFFER_BIT|this.STENCIL_BUFFER_BIT),e!==null&&this.clearDepth(e),t!==null&&this.clearStencil(t)}}invalidateFramebuffer(e,t){this._native2.invalidateFramebuffer(e,t)}invalidateSubFramebuffer(e,t,n,r,i,a){this._native2.invalidateSubFramebuffer(e,t,n,r,i,a)}readBuffer(e){this._native2.readBuffer(e)}renderbufferStorageMultisample(e,t,n,r,i){if(e!==this.RENDERBUFFER){this.setError(this.INVALID_ENUM);return}let a=this._activeRenderbuffer;if(!a){this.setError(this.INVALID_OPERATION);return}this._saveError(),this._native2.renderbufferStorageMultisample(e,t,n,r,i);let o=this.getError();this._restoreError(o),o===this.NO_ERROR&&(a._width=r,a._height=i,a._format=n)}uniform1ui(e,t){e&&this._native2.uniform1ui(e._,t)}uniform2ui(e,t,n){e&&this._native2.uniform2ui(e._,t,n)}uniform3ui(e,t,n,r){e&&this._native2.uniform3ui(e._,t,n,r)}uniform4ui(e,t,n,r,i){e&&this._native2.uniform4ui(e._,t,n,r,i)}uniform1uiv(e,t,n,r){if(!e)return;let i=t instanceof Uint32Array?t:new Uint32Array(t);this._native2.uniform1uiv(e._,i.length,i)}uniform2uiv(e,t,n,r){if(!e)return;let i=t instanceof Uint32Array?t:new Uint32Array(t);this._native2.uniform2uiv(e._,i.length/2,i)}uniform3uiv(e,t,n,r){if(!e)return;let i=t instanceof Uint32Array?t:new Uint32Array(t);this._native2.uniform3uiv(e._,i.length/3,i)}uniform4uiv(e,t,n,r){if(!e)return;let i=t instanceof Uint32Array?t:new Uint32Array(t);this._native2.uniform4uiv(e._,i.length/4,i)}uniformMatrix2x3fv(e,t,n,r,i){if(!e)return;let a=n instanceof Float32Array?n:new Float32Array(n);this._native2.uniformMatrix2x3fv(e._,t,a)}uniformMatrix3x2fv(e,t,n,r,i){if(!e)return;let a=n instanceof Float32Array?n:new Float32Array(n);this._native2.uniformMatrix3x2fv(e._,t,a)}uniformMatrix2x4fv(e,t,n,r,i){if(!e)return;let a=n instanceof Float32Array?n:new Float32Array(n);this._native2.uniformMatrix2x4fv(e._,t,a)}uniformMatrix4x2fv(e,t,n,r,i){if(!e)return;let a=n instanceof Float32Array?n:new Float32Array(n);this._native2.uniformMatrix4x2fv(e._,t,a)}uniformMatrix3x4fv(e,t,n,r,i){if(!e)return;let a=n instanceof Float32Array?n:new Float32Array(n);this._native2.uniformMatrix3x4fv(e._,t,a)}uniformMatrix4x3fv(e,t,n,r,i){if(!e)return;let a=n instanceof Float32Array?n:new Float32Array(n);this._native2.uniformMatrix4x3fv(e._,t,a)}getUniform(e,t){let n=t?._activeInfo?.type,r=5125,i=36294,a=36295,o=n===r||n===i||n===a||n===36296,s=e;if(!o)return super.getUniform(s,t);if(!e||!t)return null;let c=this._native2.getUniformi(s._|0,t._|0);return c?n===r?c[0]>>>0:n===i?new Uint32Array([c[0]>>>0,c[1]>>>0]):n===a?new Uint32Array([c[0]>>>0,c[1]>>>0,c[2]>>>0]):new Uint32Array([c[0]>>>0,c[1]>>>0,c[2]>>>0,c[3]>>>0]):null}getUniformBlockIndex(e,t){return this._native2.getUniformBlockIndex(e._,t)}uniformBlockBinding(e,t,n){this._native2.uniformBlockBinding(e._,t,n)}getActiveUniformBlockName(e,t){let n=this._native2.getActiveUniformBlockName(e._,t);return n.length>0?n:null}getActiveUniformBlockParameter(e,t,n){return this._native2.getActiveUniformBlockParameter(e._,t,n)}getActiveUniforms(e,t,n){return this._native2.getActiveUniforms(e._,t,n)}getFragDataLocation(e,t){return this._native2.getFragDataLocation(e._,t)}getIndexedParameter(e,t){return this._native2.getIndexedParameteri(e,t)}getInternalformatParameter(e,t,n){return this._native2.getInternalformatParameter(e,t,n)}getParameter(e){if(e===7938)return`WebGL 2.0`;if(e===35724)return`WebGL GLSL ES 3.00`;if(e===7939)return v(`WebGL2RenderingContext.getParameter(GL_EXTENSIONS)`),``;if(e===36006)return this._activeDrawFramebuffer;if(e===36010)return this._activeReadFramebuffer;switch(e){case 36183:case 35071:case 32883:case 36063:case 34852:case 36203:case 33001:case 33e3:case 37157:case 35373:case 35657:case 35077:case 35978:case 35979:case 35968:case 35376:case 35375:case 35659:case 37154:case 35371:case 35658:case 35379:case 35374:case 35377:case 35076:case 3330:case 3332:case 3331:case 35053:case 35055:case 3074:case 32874:case 35869:case 36389:case 35983:case 35368:case 35380:case 32878:case 3314:case 32877:case 3316:case 3315:case 34045:return this._native2.getParameterx(e)?.deepUnpack()|0;case 35977:case 36388:case 36387:return!!this._native2.getParameterx(e)?.deepUnpack()}return super.getParameter(e)}getStringi(e,t){let n=this._native2.getStringi(e,t);return n.length>0?n:null}renderbufferStorage(e,t,n,r){if(e!==this.RENDERBUFFER){this.setError(this.INVALID_ENUM);return}let i=this._activeRenderbuffer;if(!i){this.setError(this.INVALID_OPERATION);return}if(n<0||r<0){this.setError(this.INVALID_VALUE);return}for(;this._gl.getError()!==this.NO_ERROR;);if(this._gl.renderbufferStorage(e,t,n,r),this._gl.getError()!==this.NO_ERROR)return;i._width=n,i._height=r,i._format=t;let a=this._activeFramebuffer;if(a){let e=this._getAttachments(),t=!1;for(let n=0;n<e.length;++n)if(a._attachments[e[n]]===i){t=!0;break}t&&this._updateFramebufferAttachments(a)}}getSupportedExtensions(){let e=super.getSupportedExtensions();for(let t of[`EXT_color_buffer_float`,`EXT_color_buffer_half_float`,`OES_texture_half_float`])e.indexOf(t)===-1&&e.push(t);return e}readPixels(t,n,r,i,a,o,s){if(!s)return;if(r<0||i<0){this.setError(this.INVALID_VALUE);return}if(!this._framebufferOk())return;let c=a===6408||a===32856?4:a===6407?3:a===33319?2:1,l=o===5126?4:o===5131||o===36193?2:o===5125||o===5124?4:o===5123||o===5122?2:1,u=r*i*c*l,d=new Uint8Array(u);this._saveError();let f=this._gl.readPixels(t,n,r,i,a,o,e(d)),p=this.getError();if(this._restoreError(p),p!==this.NO_ERROR)return;let m=f&&f.length>0?f:d;if(s instanceof Uint8Array)s.set(m);else if(s instanceof Float32Array){let e=new Float32Array(m.buffer,0,s.length);s.set(e)}}_framebufferOk(){return!0}};export{b as WebGL2RenderingContext};
|
package/lib/esm/webgl2.spec.js
CHANGED
|
@@ -1,45 +1,45 @@
|
|
|
1
|
-
import{TEXTURE_FS_300 as
|
|
2
|
-
`),
|
|
3
|
-
`);await
|
|
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(`Display`,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 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
|
+
`),n=[`#version 300 es`,`precision mediump float;`,`out vec4 fragColor;`,`void main() { fragColor = vec4(0.0, 1.0, 0.0, 1.0); }`].join(`
|
|
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(`#version 300 es program links and renders green`,async()=>{let e=a(m,t,n);m.getProgramParameter(e,m.LINK_STATUS)||console.error(`Program300 log:`,m.getProgramInfoLog(e)),f(m.getProgramParameter(e,m.LINK_STATUS)).toBeTruthy();let s=o(m,4,4);m.clearColor(0,0,0,1),m.clear(m.COLOR_BUFFER_BIT),m.useProgram(e),i(m),f(m.getError()).toBe(m.NO_ERROR);let c=l(m,0,0);r(m,s),f(c[0]).toBe(0),f(c[1]).toBe(255),f(c[2]).toBe(0),f(c[3]).toBe(255),m.deleteProgram(e)})}),await d(`VAO`,async()=>{u(async()=>{e.make_current()}),await p(`createVertexArray returns a non-null object`,async()=>{let e=m.createVertexArray();f(e).not.toBeNull(),f(e).toBeDefined(),m.deleteVertexArray(e)}),await p(`isVertexArray is true after creation, false after deletion`,async()=>{let e=m.createVertexArray();m.bindVertexArray(e),f(m.isVertexArray(e)).toBeTruthy(),m.bindVertexArray(null),m.deleteVertexArray(e),f(m.isVertexArray(e)).toBeFalsy()}),await p(`VAO preserves vertex attribute state`,async()=>{let e=[`#version 300 es`,`in vec2 position;`,`void main() { gl_Position = vec4(position,0.0,1.0); }`].join(`
|
|
4
4
|
`),t=[`#version 300 es`,`precision mediump float;`,`out vec4 c;`,`void main() { c = vec4(0.0,1.0,0.0,1.0); }`].join(`
|
|
5
|
-
`),
|
|
6
|
-
`),
|
|
7
|
-
`);await
|
|
8
|
-
`),n=
|
|
9
|
-
`);await
|
|
10
|
-
`),n=
|
|
11
|
-
`),n=
|
|
5
|
+
`),n=a(m,e,t);m.useProgram(n);let i=o(m,4,4),s=m.createVertexArray();m.bindVertexArray(s);let c=m.createBuffer();m.bindBuffer(m.ARRAY_BUFFER,c),m.bufferData(m.ARRAY_BUFFER,new Float32Array([-2,-2,-2,4,4,-2]),m.STREAM_DRAW),m.enableVertexAttribArray(0),m.vertexAttribPointer(0,2,m.FLOAT,!1,0,0),m.bindVertexArray(null),m.bindVertexArray(s),m.clearColor(0,0,0,1),m.clear(m.COLOR_BUFFER_BIT),m.drawArrays(m.TRIANGLES,0,3),f(m.getError()).toBe(m.NO_ERROR);let u=l(m,0,0);r(m,i),f(u[1]).toBe(255),m.bindVertexArray(null),m.deleteVertexArray(s),m.deleteBuffer(c),m.deleteProgram(n)})}),await d(`getBufferSubData`,async()=>{u(async()=>{e.make_current()}),await p(`reads back float data written with bufferData`,async()=>{let e=new Float32Array([1,2,3,4]),t=m.createBuffer();m.bindBuffer(m.ARRAY_BUFFER,t),m.bufferData(m.ARRAY_BUFFER,e,m.STATIC_READ);let n=new Float32Array(4);m.getBufferSubData(m.ARRAY_BUFFER,0,n),f(m.getError()).toBe(m.NO_ERROR),f(n[0]).toBe(1),f(n[1]).toBe(2),f(n[2]).toBe(3),f(n[3]).toBe(4),m.deleteBuffer(t)}),await p(`reads a sub-range correctly`,async()=>{let e=new Float32Array([10,20,30,40]),t=m.createBuffer();m.bindBuffer(m.ARRAY_BUFFER,t),m.bufferData(m.ARRAY_BUFFER,e,m.STATIC_READ);let n=new Float32Array(2);m.getBufferSubData(m.ARRAY_BUFFER,8,n),f(n[0]).toBe(30),f(n[1]).toBe(40),m.deleteBuffer(t)})}),await d(`sync objects`,async()=>{u(async()=>{e.make_current()}),await p(`fenceSync returns a non-null sync`,async()=>{let e=m.fenceSync(m.SYNC_GPU_COMMANDS_COMPLETE,0);f(e).not.toBeNull(),m.deleteSync(e),f(m.getError()).toBe(m.NO_ERROR)}),await p(`isSync is true before deletion, false after`,async()=>{let e=m.fenceSync(m.SYNC_GPU_COMMANDS_COMPLETE,0);f(m.isSync(e)).toBeTruthy(),m.deleteSync(e),f(m.isSync(e)).toBeFalsy()}),await p(`clientWaitSync returns TIMEOUT_EXPIRED or CONDITION_SATISFIED`,async()=>{let e=m.fenceSync(m.SYNC_GPU_COMMANDS_COMPLETE,0);m.flush();let t=m.clientWaitSync(e,0,0);f(t===m.TIMEOUT_EXPIRED||t===m.CONDITION_SATISFIED||t===m.ALREADY_SIGNALED).toBeTruthy(),m.deleteSync(e)})}),await d(`uint uniforms`,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(`
|
|
6
|
+
`),n=[`#version 300 es`,`precision mediump float;`,`uniform uint uR; uniform uint uG; uniform uint uB;`,`out vec4 c;`,`void main() { c = vec4(float(uR)/255.0, float(uG)/255.0, float(uB)/255.0, 1.0); }`].join(`
|
|
7
|
+
`);await p(`uniform1ui sets an unsigned int uniform`,async()=>{let e=a(m,t,n);f(m.getProgramParameter(e,m.LINK_STATUS)).toBeTruthy(),m.useProgram(e);let r=m.getUniformLocation(e,`uR`),i=m.getUniformLocation(e,`uG`),o=m.getUniformLocation(e,`uB`);m.uniform1ui(r,0),m.uniform1ui(i,255),m.uniform1ui(o,0),f(m.getError()).toBe(m.NO_ERROR),f(m.getUniform(e,r)).toBe(0),f(m.getUniform(e,i)).toBe(255),m.deleteProgram(e)}),await p(`uniform2ui, uniform3ui, uniform4ui set without error`,async()=>{let e=[`#version 300 es`,`precision mediump float;`,`uniform uvec2 u2; uniform uvec3 u3; uniform uvec4 u4;`,`out vec4 c;`,`void main() { c = vec4(float(u2.x), float(u3.x), float(u4.x), 1.0)/255.0; }`].join(`
|
|
8
|
+
`),n=a(m,t,e);m.useProgram(n),m.uniform2ui(m.getUniformLocation(n,`u2`),1,2),m.uniform3ui(m.getUniformLocation(n,`u3`),1,2,3),m.uniform4ui(m.getUniformLocation(n,`u4`),1,2,3,4),f(m.getError()).toBe(m.NO_ERROR),m.deleteProgram(n)})}),await d(`non-square matrix uniforms`,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(`
|
|
9
|
+
`);await p(`uniformMatrix2x3fv sets a mat2x3 without error`,async()=>{let e=[`#version 300 es`,`precision mediump float;`,`uniform mat2x3 m; out vec4 c;`,`void main() { c = vec4(m[0][0], m[0][1], m[0][2], 1.0); }`].join(`
|
|
10
|
+
`),n=a(m,t,e);m.useProgram(n),m.uniformMatrix2x3fv(m.getUniformLocation(n,`m`),!1,new Float32Array([1,0,0,0,1,0])),f(m.getError()).toBe(m.NO_ERROR),m.deleteProgram(n)}),await p(`uniformMatrix3x2fv sets a mat3x2 without error`,async()=>{let e=[`#version 300 es`,`precision mediump float;`,`uniform mat3x2 m; out vec4 c;`,`void main() { c = vec4(m[0][0], m[0][1], 0.0, 1.0); }`].join(`
|
|
11
|
+
`),n=a(m,t,e);m.useProgram(n),m.uniformMatrix3x2fv(m.getUniformLocation(n,`m`),!1,new Float32Array([1,0,0,1,0,0])),f(m.getError()).toBe(m.NO_ERROR),m.deleteProgram(n)})}),await d(`Uniform Buffer Objects`,async()=>{u(async()=>{e.make_current()}),await p(`getUniformBlockIndex + uniformBlockBinding works`,async()=>{let e=[`#version 300 es`,`layout(std140) uniform Params { vec4 color; };`,`in vec2 position;`,`out vec4 vColor;`,`void main() { vColor = color; gl_Position = vec4(position,0.0,1.0); }`].join(`
|
|
12
12
|
`),t=[`#version 300 es`,`precision mediump float;`,`in vec4 vColor; out vec4 c;`,`void main() { c = vColor; }`].join(`
|
|
13
|
-
`),
|
|
13
|
+
`),n=a(m,e,t);f(m.getProgramParameter(n,m.LINK_STATUS)).toBeTruthy();let s=m.getUniformBlockIndex(n,`Params`);f(s).not.toBe(m.INVALID_INDEX),m.uniformBlockBinding(n,s,0),f(m.getError()).toBe(m.NO_ERROR);let c=m.createBuffer();m.bindBuffer(m.UNIFORM_BUFFER,c),m.bufferData(m.UNIFORM_BUFFER,new Float32Array([0,1,0,1]),m.STATIC_DRAW),m.bindBufferBase(m.UNIFORM_BUFFER,0,c);let u=o(m,4,4);m.useProgram(n),m.clearColor(0,0,0,1),m.clear(m.COLOR_BUFFER_BIT),i(m),f(m.getError()).toBe(m.NO_ERROR);let d=l(m,0,0);r(m,u),f(d[1]).toBe(255),m.deleteBuffer(c),m.deleteProgram(n)})}),await d(`instanced drawing`,async()=>{u(async()=>{e.make_current()}),await p(`drawArraysInstanced renders without error`,async()=>{let e=[`#version 300 es`,`in vec2 position;`,`void main() { gl_Position = vec4(position,0.0,1.0); }`].join(`
|
|
14
14
|
`),t=[`#version 300 es`,`precision mediump float;`,`out vec4 c;`,`void main() { c = vec4(0.0,1.0,0.0,1.0); }`].join(`
|
|
15
|
-
`),
|
|
15
|
+
`),n=a(m,e,t);m.useProgram(n);let i=o(m,4,4),s=m.createBuffer();m.bindBuffer(m.ARRAY_BUFFER,s),m.bufferData(m.ARRAY_BUFFER,new Float32Array([-2,-2,-2,4,4,-2]),m.STREAM_DRAW),m.enableVertexAttribArray(0),m.vertexAttribPointer(0,2,m.FLOAT,!1,0,0),m.vertexAttribDivisor(0,0),m.clearColor(0,0,0,1),m.clear(m.COLOR_BUFFER_BIT),m.drawArraysInstanced(m.TRIANGLES,0,3,1),f(m.getError()).toBe(m.NO_ERROR);let c=l(m,0,0);r(m,i),f(c[1]).toBe(255),m.disableVertexAttribArray(0),m.deleteBuffer(s),m.deleteProgram(n)})}),await d(`drawBuffers (MRT)`,async()=>{u(async()=>{e.make_current()}),await p(`drawBuffers with 2 COLOR_ATTACHMENTs renders to both`,async()=>{let e=[`#version 300 es`,`in vec2 position;`,`void main() { gl_Position = vec4(position,0.0,1.0); }`].join(`
|
|
16
16
|
`),t=[`#version 300 es`,`precision mediump float;`,`layout(location=0) out vec4 c0;`,`layout(location=1) out vec4 c1;`,`void main() { c0 = vec4(1.0,0.0,0.0,1.0); c1 = vec4(0.0,0.0,1.0,1.0); }`].join(`
|
|
17
|
-
`),n=
|
|
17
|
+
`),n=a(m,e,t);f(m.getProgramParameter(n,m.LINK_STATUS)).toBeTruthy();let r=m.createFramebuffer();m.bindFramebuffer(m.FRAMEBUFFER,r);let o=m.createTexture();m.bindTexture(m.TEXTURE_2D,o),m.texImage2D(m.TEXTURE_2D,0,m.RGBA,4,4,0,m.RGBA,m.UNSIGNED_BYTE,null),m.framebufferTexture2D(m.FRAMEBUFFER,m.COLOR_ATTACHMENT0,m.TEXTURE_2D,o,0);let s=m.createTexture();m.bindTexture(m.TEXTURE_2D,s),m.texImage2D(m.TEXTURE_2D,0,m.RGBA,4,4,0,m.RGBA,m.UNSIGNED_BYTE,null),m.framebufferTexture2D(m.FRAMEBUFFER,m.COLOR_ATTACHMENT1,m.TEXTURE_2D,s,0);let c=m.checkFramebufferStatus(m.FRAMEBUFFER);if(c!==m.FRAMEBUFFER_COMPLETE){console.warn(`MRT framebuffer not complete:`,c),m.bindFramebuffer(m.FRAMEBUFFER,null),m.deleteFramebuffer(r),m.deleteTexture(o),m.deleteTexture(s),m.deleteProgram(n);return}m.drawBuffers([m.COLOR_ATTACHMENT0,m.COLOR_ATTACHMENT1]),m.viewport(0,0,4,4),m.clearColor(0,0,0,1),m.clear(m.COLOR_BUFFER_BIT),m.useProgram(n),i(m),f(m.getError()).toBe(m.NO_ERROR),m.readBuffer(m.COLOR_ATTACHMENT0);let u=l(m,0,0);f(u[0]).toBe(255),f(u[1]).toBe(0),m.readBuffer(m.COLOR_ATTACHMENT1);let d=l(m,0,0);f(d[0]).toBe(0),f(d[2]).toBe(255),m.bindFramebuffer(m.FRAMEBUFFER,null),m.deleteFramebuffer(r),m.deleteTexture(o),m.deleteTexture(s),m.deleteProgram(n)})}),await d(`3D texture`,async()=>{u(async()=>{e.make_current()}),await p(`createTexture + TEXTURE_3D binding works`,async()=>{let e=m.createTexture();f(e).not.toBeNull(),m.bindTexture(m.TEXTURE_3D,e),f(m.getError()).toBe(m.NO_ERROR),m.deleteTexture(e)}),await p(`texImage3D uploads a 2×2×2 RGBA texture without error`,async()=>{let e=m.createTexture();m.bindTexture(m.TEXTURE_3D,e),m.texParameteri(m.TEXTURE_3D,m.TEXTURE_MIN_FILTER,m.NEAREST),m.texParameteri(m.TEXTURE_3D,m.TEXTURE_MAG_FILTER,m.NEAREST),m.texParameteri(m.TEXTURE_3D,m.TEXTURE_WRAP_S,m.CLAMP_TO_EDGE),m.texParameteri(m.TEXTURE_3D,m.TEXTURE_WRAP_T,m.CLAMP_TO_EDGE),m.texParameteri(m.TEXTURE_3D,m.TEXTURE_WRAP_R,m.CLAMP_TO_EDGE);let t=new Uint8Array(32).fill(128);m.texImage3D(m.TEXTURE_3D,0,m.RGBA,2,2,2,0,m.RGBA,m.UNSIGNED_BYTE,t),f(m.getError()).toBe(m.NO_ERROR),m.deleteTexture(e)}),await p(`texStorage3D allocates storage without error`,async()=>{let e=m.createTexture();m.bindTexture(m.TEXTURE_3D,e),m.texStorage3D(m.TEXTURE_3D,1,m.RGBA8,4,4,4),f(m.getError()).toBe(m.NO_ERROR),m.deleteTexture(e)})}),await d(`transform feedback`,async()=>{u(async()=>{e.make_current()}),await p(`captures vertex shader output via transform feedback`,async()=>{let e=[`#version 300 es`,`in float inVal;`,`out float outVal;`,`void main() { outVal = inVal * 2.0; gl_Position = vec4(0.0); }`].join(`
|
|
18
18
|
`),t=[`#version 300 es`,`precision mediump float;`,`out vec4 c;`,`void main() { c = vec4(0.0); }`].join(`
|
|
19
|
-
`),
|
|
19
|
+
`),n=m.createShader(m.VERTEX_SHADER);m.shaderSource(n,e),m.compileShader(n),m.getShaderParameter(n,m.COMPILE_STATUS)||console.error(`TF VS:`,m.getShaderInfoLog(n));let i=m.createShader(m.FRAGMENT_SHADER);m.shaderSource(i,t),m.compileShader(i);let a=m.createProgram();m.attachShader(a,n),m.attachShader(a,i),m.transformFeedbackVaryings(a,[`outVal`],m.SEPARATE_ATTRIBS),m.linkProgram(a),m.getProgramParameter(a,m.LINK_STATUS)||console.error(`TF prog:`,m.getProgramInfoLog(a)),f(m.getProgramParameter(a,m.LINK_STATUS)).toBeTruthy();let s=m.createBuffer();m.bindBuffer(m.ARRAY_BUFFER,s),m.bufferData(m.ARRAY_BUFFER,new Float32Array([1,2,3,4]),m.STATIC_DRAW);let c=m.getAttribLocation(a,`inVal`);m.enableVertexAttribArray(c),m.vertexAttribPointer(c,1,m.FLOAT,!1,0,0);let l=m.createBuffer();m.bindBuffer(m.TRANSFORM_FEEDBACK_BUFFER,l),m.bufferData(m.TRANSFORM_FEEDBACK_BUFFER,16,m.STATIC_READ);let u=m.createTransformFeedback();m.bindTransformFeedback(m.TRANSFORM_FEEDBACK,u),m.bindBufferBase(m.TRANSFORM_FEEDBACK_BUFFER,0,l);let d=o(m,1,1);m.useProgram(a),m.enable(m.RASTERIZER_DISCARD),m.beginTransformFeedback(m.POINTS),m.drawArrays(m.POINTS,0,4),m.endTransformFeedback(),m.disable(m.RASTERIZER_DISCARD),f(m.getError()).toBe(m.NO_ERROR),m.bindTransformFeedback(m.TRANSFORM_FEEDBACK,null),r(m,d);let p=new Float32Array(4);m.bindBuffer(m.TRANSFORM_FEEDBACK_BUFFER,l),m.getBufferSubData(m.TRANSFORM_FEEDBACK_BUFFER,0,p),f(p[0]).toBe(2),f(p[1]).toBe(4),f(p[2]).toBe(6),f(p[3]).toBe(8),m.disableVertexAttribArray(c),m.deleteBuffer(s),m.deleteBuffer(l),m.deleteTransformFeedback(u),m.deleteProgram(a)})}),await d(`getStringi`,async()=>{u(async()=>{e.make_current()}),await p(`getStringi(EXTENSIONS, 0) returns a string`,async()=>{if(m.getParameter(m.NUM_EXTENSIONS)>0){let e=m.getStringi(m.EXTENSIONS,0);f(typeof e).toBe(`string`),f(e.length>0).toBeTruthy()}})}),await d(`WebGL2 extensions`,async()=>{u(async()=>{e.make_current()}),await p(`supports EXT_color_buffer_float`,async()=>{f(m.getExtension(`EXT_color_buffer_float`)).toBeTruthy()}),await p(`supports EXT_color_buffer_half_float`,async()=>{f(m.getExtension(`EXT_color_buffer_half_float`)).toBeTruthy()}),await p(`supports OES_texture_half_float`,async()=>{f(m.getExtension(`OES_texture_half_float`)).toBeTruthy()}),await p(`OES_texture_half_float exposes HALF_FLOAT_OES constant`,async()=>{let e=m.getExtension(`OES_texture_half_float`);f(e).toBeTruthy(),f(e.HALF_FLOAT_OES).toBe(36193)})}),await d(`WebGL2 renderbufferStorage formats`,async()=>{u(async()=>{e.make_current()});async function testRbFormat(e){let t=m.createRenderbuffer();m.bindRenderbuffer(m.RENDERBUFFER,t),m.renderbufferStorage(m.RENDERBUFFER,e,64,64);let n=m.getError();return m.deleteRenderbuffer(t),n}await p(`accepts RGBA8 (0x8058)`,async()=>{f(await testRbFormat(32856)).toBe(m.NO_ERROR)}),await p(`accepts DEPTH_COMPONENT24 (0x81A6)`,async()=>{f(await testRbFormat(33190)).toBe(m.NO_ERROR)}),await p(`accepts DEPTH24_STENCIL8 (0x88F0)`,async()=>{f(await testRbFormat(35056)).toBe(m.NO_ERROR)})}),await d(`WebGL2 float render target`,async()=>{u(async()=>{e.make_current()}),await p(`can create RGBA16F texture and attach to FBO`,async()=>{let e=m.createTexture();m.bindTexture(m.TEXTURE_2D,e),m.texImage2D(m.TEXTURE_2D,0,34842,64,64,0,m.RGBA,5131,null),f(m.getError()).toBe(m.NO_ERROR);let t=m.createFramebuffer();m.bindFramebuffer(m.FRAMEBUFFER,t),m.framebufferTexture2D(m.FRAMEBUFFER,m.COLOR_ATTACHMENT0,m.TEXTURE_2D,e,0),f(m.checkFramebufferStatus(m.FRAMEBUFFER)).toBe(m.FRAMEBUFFER_COMPLETE),m.clearColor(1,0,0,1),m.clear(m.COLOR_BUFFER_BIT),f(m.getError()).toBe(m.NO_ERROR),m.bindFramebuffer(m.FRAMEBUFFER,null),m.deleteFramebuffer(t),m.deleteTexture(e)}),await p(`can create RGBA8 renderbuffer FBO`,async()=>{let e=m.createRenderbuffer();m.bindRenderbuffer(m.RENDERBUFFER,e),m.renderbufferStorage(m.RENDERBUFFER,32856,64,64),f(m.getError()).toBe(m.NO_ERROR);let t=m.createFramebuffer();m.bindFramebuffer(m.FRAMEBUFFER,t),m.framebufferRenderbuffer(m.FRAMEBUFFER,m.COLOR_ATTACHMENT0,m.RENDERBUFFER,e),f(m.checkFramebufferStatus(m.FRAMEBUFFER)).toBe(m.FRAMEBUFFER_COMPLETE),m.clearColor(0,1,0,1),m.clear(m.COLOR_BUFFER_BIT),f(m.getError()).toBe(m.NO_ERROR),m.bindFramebuffer(m.FRAMEBUFFER,null),m.deleteFramebuffer(t),m.deleteRenderbuffer(e)})}),await d(`WebGL2 GLSL 1.0 compatibility`,async()=>{u(async()=>{e.make_current()}),await p(`compiles versionless shaders with attribute/varying`,async()=>{let e=a(m,`attribute vec2 position;
|
|
20
20
|
varying vec2 vUv;
|
|
21
21
|
void main() { vUv = position; gl_Position = vec4(position, 0.0, 1.0); }`,`precision mediump float;
|
|
22
22
|
varying vec2 vUv;
|
|
23
|
-
void main() { gl_FragColor = vec4(vUv, 0.0, 1.0); }`);
|
|
23
|
+
void main() { gl_FragColor = vec4(vUv, 0.0, 1.0); }`);f(e).toBeTruthy(),e&&(f(m.getProgramParameter(e,m.LINK_STATUS)).toBeTruthy(),m.deleteProgram(e))})}),await d(`WebGL2 textured rendering`,async()=>{u(async()=>{e.make_current()}),await p(`samples a 2x2 RGBA texture to produce red output`,async()=>{let e=o(m,4,4),s=m.createTexture();m.bindTexture(m.TEXTURE_2D,s);let c=new Uint8Array([255,0,0,255,255,0,0,255,255,0,0,255,255,0,0,255]);m.texImage2D(m.TEXTURE_2D,0,m.RGBA,2,2,0,m.RGBA,m.UNSIGNED_BYTE,c),m.texParameteri(m.TEXTURE_2D,m.TEXTURE_MIN_FILTER,m.NEAREST),m.texParameteri(m.TEXTURE_2D,m.TEXTURE_MAG_FILTER,m.NEAREST);let u=a(m,n,t);f(m.getProgramParameter(u,m.LINK_STATUS)).toBeTruthy(),m.useProgram(u);let d=m.getUniformLocation(u,`uTexture`);m.uniform1i(d,0),m.activeTexture(m.TEXTURE0),m.bindTexture(m.TEXTURE_2D,s),i(m),f(m.getError()).toBe(m.NO_ERROR);let p=l(m,0,0);f(p[0]).toBe(255),f(p[1]).toBe(0),f(p[2]).toBe(0),f(p[3]).toBe(255),m.deleteTexture(s),m.deleteProgram(u),r(m,e)})}),await d(`WebGL2 FBO chain (post-processing)`,async()=>{u(async()=>{e.make_current()}),await p(`renders green to FBO1, samples FBO1 texture into FBO2`,async()=>{let e=[`#version 300 es`,`in vec2 position;`,`void main() { gl_Position = vec4(position,0.0,1.0); }`].join(`
|
|
24
24
|
`),s=[`#version 300 es`,`precision mediump float;`,`out vec4 c;`,`void main() { c = vec4(0.0,1.0,0.0,1.0); }`].join(`
|
|
25
|
-
`),
|
|
26
|
-
`),
|
|
27
|
-
`),u=
|
|
25
|
+
`),c=o(m,4,4);f(m.checkFramebufferStatus(m.FRAMEBUFFER)).toBe(m.FRAMEBUFFER_COMPLETE);let u=a(m,e,s);m.useProgram(u),m.clearColor(0,0,0,1),m.clear(m.COLOR_BUFFER_BIT),i(m),f(m.getError()).toBe(m.NO_ERROR),f(l(m,0,0)[1]).toBe(255);let d=o(m,4,4);f(m.checkFramebufferStatus(m.FRAMEBUFFER)).toBe(m.FRAMEBUFFER_COMPLETE);let p=a(m,n,t);m.useProgram(p);let h=m.getUniformLocation(p,`uTexture`);m.uniform1i(h,0),m.activeTexture(m.TEXTURE0),m.bindTexture(m.TEXTURE_2D,c.colorTex),m.clearColor(0,0,0,1),m.clear(m.COLOR_BUFFER_BIT),i(m),f(m.getError()).toBe(m.NO_ERROR),f(l(m,0,0)[1]).toBe(255),m.deleteProgram(u),m.deleteProgram(p),r(m,d),r(m,c)})}),await d(`WebGL2 half-float FBO chain`,async()=>{u(async()=>{e.make_current()}),await p(`renders green to RGBA16F FBO, samples into RGBA8 FBO`,async()=>{let e=[`#version 300 es`,`in vec2 position;`,`void main() { gl_Position = vec4(position,0.0,1.0); }`].join(`
|
|
26
|
+
`),c=[`#version 300 es`,`precision mediump float;`,`out vec4 c;`,`void main() { c = vec4(0.0,1.0,0.0,1.0); }`].join(`
|
|
27
|
+
`),u=s(m,4,4);f(m.checkFramebufferStatus(m.FRAMEBUFFER)).toBe(m.FRAMEBUFFER_COMPLETE);let d=a(m,e,c);m.useProgram(d),m.clearColor(0,0,0,1),m.clear(m.COLOR_BUFFER_BIT),i(m),f(m.getError()).toBe(m.NO_ERROR);let p=o(m,4,4),h=a(m,n,t);m.useProgram(h);let g=m.getUniformLocation(h,`uTexture`);m.uniform1i(g,0),m.activeTexture(m.TEXTURE0),m.bindTexture(m.TEXTURE_2D,u.colorTex),m.clearColor(0,0,0,1),m.clear(m.COLOR_BUFFER_BIT),i(m),f(m.getError()).toBe(m.NO_ERROR),f(l(m,0,0)[1]).toBe(255),m.deleteProgram(d),m.deleteProgram(h),r(m,p),m.bindFramebuffer(m.FRAMEBUFFER,u.fb),m.framebufferTexture2D(m.FRAMEBUFFER,m.COLOR_ATTACHMENT0,m.TEXTURE_2D,null,0),m.bindFramebuffer(m.FRAMEBUFFER,null),m.deleteTexture(u.colorTex),m.deleteFramebuffer(u.fb)})}),await d(`WebGL2 depth texture FBO`,async()=>{u(async()=>{e.make_current()}),await p(`creates FBO with depth texture and renders with depth test`,async()=>{let e=c(m,4,4);f(m.checkFramebufferStatus(m.FRAMEBUFFER)).toBe(m.FRAMEBUFFER_COMPLETE);let t=[`#version 300 es`,`in vec2 position;`,`uniform float uDepth;`,`void main() { gl_Position = vec4(position, uDepth, 1.0); }`].join(`
|
|
28
28
|
`),n=[`#version 300 es`,`precision mediump float;`,`uniform vec4 uColor;`,`out vec4 c;`,`void main() { c = uColor; }`].join(`
|
|
29
|
-
`),a
|
|
29
|
+
`),r=a(m,t,n);m.useProgram(r),m.enable(m.DEPTH_TEST),m.depthFunc(m.LESS),m.clearColor(0,0,0,1),m.clearDepth(1),m.clear(m.COLOR_BUFFER_BIT|m.DEPTH_BUFFER_BIT);let o=m.getUniformLocation(r,`uColor`),s=m.getUniformLocation(r,`uDepth`);m.uniform4f(o,1,0,0,1),m.uniform1f(s,.5),i(m),m.uniform4f(o,0,1,0,1),m.uniform1f(s,0),i(m),f(m.getError()).toBe(m.NO_ERROR),f(l(m,0,0)[1]).toBe(255),m.disable(m.DEPTH_TEST),m.bindFramebuffer(m.FRAMEBUFFER,e.fb),m.framebufferTexture2D(m.FRAMEBUFFER,m.COLOR_ATTACHMENT0,m.TEXTURE_2D,null,0),m.framebufferTexture2D(m.FRAMEBUFFER,m.DEPTH_ATTACHMENT,m.TEXTURE_2D,null,0),m.bindFramebuffer(m.FRAMEBUFFER,null),m.deleteTexture(e.colorTex),m.deleteTexture(e.depthTex),m.deleteFramebuffer(e.fb),m.deleteProgram(r)})}),await d(`WebGL2 generateMipmap`,async()=>{u(async()=>{e.make_current()}),await p(`generates mipmaps for a 4x4 texture without error`,async()=>{let e=m.createTexture();m.bindTexture(m.TEXTURE_2D,e);let s=new Uint8Array(64);for(let e=0;e<s.length;e+=4)s[e]=255,s[e+3]=255;m.texImage2D(m.TEXTURE_2D,0,m.RGBA,4,4,0,m.RGBA,m.UNSIGNED_BYTE,s),m.generateMipmap(m.TEXTURE_2D),f(m.getError()).toBe(m.NO_ERROR),m.texParameteri(m.TEXTURE_2D,m.TEXTURE_MIN_FILTER,m.LINEAR_MIPMAP_LINEAR),f(m.getError()).toBe(m.NO_ERROR);let c=o(m,4,4),u=a(m,n,t);m.useProgram(u),m.bindTexture(m.TEXTURE_2D,e),m.uniform1i(m.getUniformLocation(u,`uTexture`),0),i(m),f(m.getError()).toBe(m.NO_ERROR),f(l(m,0,0)[0]).toBeGreaterThan(200),m.deleteTexture(e),m.deleteProgram(u),r(m,c)})}),await d(`WebGL2 cubemap texture`,async()=>{u(async()=>{e.make_current()}),await p(`creates cubemap and verifies FBO attachment`,async()=>{let e=m.createTexture();m.bindTexture(m.TEXTURE_CUBE_MAP,e);let t=[m.TEXTURE_CUBE_MAP_POSITIVE_X,m.TEXTURE_CUBE_MAP_NEGATIVE_X,m.TEXTURE_CUBE_MAP_POSITIVE_Y,m.TEXTURE_CUBE_MAP_NEGATIVE_Y,m.TEXTURE_CUBE_MAP_POSITIVE_Z,m.TEXTURE_CUBE_MAP_NEGATIVE_Z],n=[[255,0,0,255],[0,255,0,255],[0,0,255,255],[255,255,0,255],[255,0,255,255],[0,255,255,255]];for(let e=0;e<6;e++)m.texImage2D(t[e],0,m.RGBA,1,1,0,m.RGBA,m.UNSIGNED_BYTE,new Uint8Array(n[e]));f(m.getError()).toBe(m.NO_ERROR),m.texParameteri(m.TEXTURE_CUBE_MAP,m.TEXTURE_MIN_FILTER,m.NEAREST),m.texParameteri(m.TEXTURE_CUBE_MAP,m.TEXTURE_MAG_FILTER,m.NEAREST);let r=m.createFramebuffer();m.bindFramebuffer(m.FRAMEBUFFER,r),m.framebufferTexture2D(m.FRAMEBUFFER,m.COLOR_ATTACHMENT0,m.TEXTURE_CUBE_MAP_POSITIVE_X,e,0),f(m.checkFramebufferStatus(m.FRAMEBUFFER)).toBe(m.FRAMEBUFFER_COMPLETE),m.viewport(0,0,1,1),m.clearColor(0,1,1,1),m.clear(m.COLOR_BUFFER_BIT),f(m.getError()).toBe(m.NO_ERROR);let i=l(m,0,0);f(i[0]).toBe(0),f(i[1]).toBe(255),f(i[2]).toBe(255),m.bindFramebuffer(m.FRAMEBUFFER,null),m.deleteFramebuffer(r),m.deleteTexture(e)})}),await d(`WebGL2 READ_FRAMEBUFFER / DRAW_FRAMEBUFFER`,async()=>{u(async()=>{e.make_current()}),await p(`bindFramebuffer accepts READ_FRAMEBUFFER and DRAW_FRAMEBUFFER`,async()=>{let e=m.createFramebuffer(),t=m.createFramebuffer();m.bindFramebuffer(36008,e),m.bindFramebuffer(36009,t),f(m.getError()).toBe(m.NO_ERROR),f(m.getParameter(36010)).toBe(e),f(m.getParameter(36006)).toBe(t),m.bindFramebuffer(m.FRAMEBUFFER,null),f(m.getError()).toBe(m.NO_ERROR),m.deleteFramebuffer(e),m.deleteFramebuffer(t)})}),await d(`WebGL2 RGBA8 FBO (sized internal format)`,async()=>{u(async()=>{e.make_current()}),await p(`renders solid color to RGBA8 FBO, readPixels confirms result`,async()=>{let e=m.createFramebuffer(),t=m.createTexture();m.bindTexture(m.TEXTURE_2D,t),m.texImage2D(m.TEXTURE_2D,0,32856,4,4,0,m.RGBA,m.UNSIGNED_BYTE,null),m.texParameteri(m.TEXTURE_2D,m.TEXTURE_MIN_FILTER,m.NEAREST),m.texParameteri(m.TEXTURE_2D,m.TEXTURE_MAG_FILTER,m.NEAREST),m.bindTexture(m.TEXTURE_2D,null),m.bindFramebuffer(m.FRAMEBUFFER,e),m.framebufferTexture2D(m.FRAMEBUFFER,m.COLOR_ATTACHMENT0,m.TEXTURE_2D,t,0),f(m.checkFramebufferStatus(m.FRAMEBUFFER)).toBe(m.FRAMEBUFFER_COMPLETE),m.viewport(0,0,4,4),m.clearColor(0,1,0,1),m.clear(m.COLOR_BUFFER_BIT),f(m.getError()).toBe(m.NO_ERROR);let n=new Uint8Array(4);m.readPixels(0,0,1,1,m.RGBA,m.UNSIGNED_BYTE,n),f(m.getError()).toBe(m.NO_ERROR),f(n[0]).toBe(0),f(n[1]).toBe(255),f(n[2]).toBe(0),f(n[3]).toBe(255),m.bindFramebuffer(m.FRAMEBUFFER,e),m.framebufferTexture2D(m.FRAMEBUFFER,m.COLOR_ATTACHMENT0,m.TEXTURE_2D,null,0),m.bindFramebuffer(m.FRAMEBUFFER,null),m.deleteTexture(t),m.deleteFramebuffer(e)})}),await d(`WebGL2 RGBA16F FBO draw + FLOAT readPixels`,async()=>{u(async()=>{e.make_current()}),await p(`renders red triangle to RGBA16F FBO, reads back as FLOAT`,async()=>{let e=m,t=a(e,`#version 300 es
|
|
30
30
|
in vec2 position;
|
|
31
31
|
void main(){gl_Position=vec4(position,0.,1.);}`,`#version 300 es
|
|
32
32
|
precision mediump float;
|
|
33
33
|
out vec4 c;
|
|
34
|
-
void main(){c=vec4(1.,0.,0.,1.);}`);
|
|
34
|
+
void main(){c=vec4(1.,0.,0.,1.);}`);f(m.getProgramParameter(t,m.LINK_STATUS)).toBeTruthy();let n=s(m);m.useProgram(t),i(e),f(m.getError()).toBe(m.NO_ERROR);let r=new Float32Array(4);m.readPixels(0,0,1,1,m.RGBA,m.FLOAT,r),f(m.getError()).toBe(m.NO_ERROR),f(Math.abs(r[0]-1)<.01).toBeTruthy(),f(Math.abs(r[1]-0)<.01).toBeTruthy(),f(Math.abs(r[2]-0)<.01).toBeTruthy(),f(Math.abs(r[3]-1)<.01).toBeTruthy(),m.useProgram(null),m.bindFramebuffer(m.FRAMEBUFFER,n.fb),m.framebufferTexture2D(m.FRAMEBUFFER,m.COLOR_ATTACHMENT0,m.TEXTURE_2D,null,0),m.bindFramebuffer(m.FRAMEBUFFER,null),m.deleteTexture(n.colorTex),m.deleteFramebuffer(n.fb),m.deleteProgram(t)})}),await d(`WebGL2 MRT — writes to COLOR_ATTACHMENT0 and COLOR_ATTACHMENT1`,async()=>{u(async()=>{e.make_current()}),await p(`MRT shader writes different colors to CA0 and CA1`,async()=>{let e=m,t=a(e,`#version 300 es
|
|
35
35
|
in vec2 position;
|
|
36
36
|
void main(){gl_Position=vec4(position,0.,1.);}`,`#version 300 es
|
|
37
37
|
precision mediump float;
|
|
38
38
|
layout(location=0) out vec4 c0;
|
|
39
39
|
layout(location=1) out vec4 c1;
|
|
40
|
-
void main(){c0=vec4(1.,0.,0.,1.);c1=vec4(0.,0.,1.,1.);}`);
|
|
40
|
+
void main(){c0=vec4(1.,0.,0.,1.);c1=vec4(0.,0.,1.,1.);}`);f(m.getProgramParameter(t,m.LINK_STATUS)).toBeTruthy();let n=m.createFramebuffer(),r=m.createTexture(),o=m.createTexture();for(let[e,t]of[[r,m.COLOR_ATTACHMENT0],[o,m.COLOR_ATTACHMENT0+1]])m.bindTexture(m.TEXTURE_2D,e),m.texImage2D(m.TEXTURE_2D,0,m.RGBA,4,4,0,m.RGBA,m.UNSIGNED_BYTE,null),m.texParameteri(m.TEXTURE_2D,m.TEXTURE_MIN_FILTER,m.NEAREST),m.texParameteri(m.TEXTURE_2D,m.TEXTURE_MAG_FILTER,m.NEAREST),m.bindTexture(m.TEXTURE_2D,null),m.bindFramebuffer(m.FRAMEBUFFER,n),m.framebufferTexture2D(m.FRAMEBUFFER,t,m.TEXTURE_2D,e,0);f(m.checkFramebufferStatus(m.FRAMEBUFFER)).toBe(m.FRAMEBUFFER_COMPLETE),m.viewport(0,0,4,4),m.drawBuffers([m.COLOR_ATTACHMENT0,m.COLOR_ATTACHMENT0+1]),m.useProgram(t),i(e),f(m.getError()).toBe(m.NO_ERROR);let s=m.createFramebuffer();m.bindFramebuffer(m.FRAMEBUFFER,s),m.framebufferTexture2D(m.FRAMEBUFFER,m.COLOR_ATTACHMENT0,m.TEXTURE_2D,r,0);let c=new Uint8Array(4);m.readPixels(0,0,1,1,m.RGBA,m.UNSIGNED_BYTE,c),f(c[0]).toBe(255),f(c[1]).toBe(0),f(c[2]).toBe(0);let l=m.createFramebuffer();m.bindFramebuffer(m.FRAMEBUFFER,l),m.framebufferTexture2D(m.FRAMEBUFFER,m.COLOR_ATTACHMENT0,m.TEXTURE_2D,o,0);let u=new Uint8Array(4);m.readPixels(0,0,1,1,m.RGBA,m.UNSIGNED_BYTE,u),f(u[0]).toBe(0),f(u[1]).toBe(0),f(u[2]).toBe(255),m.useProgram(null),m.bindFramebuffer(m.FRAMEBUFFER,null),m.deleteTexture(r),m.deleteTexture(o),m.deleteFramebuffer(n),m.deleteFramebuffer(s),m.deleteFramebuffer(l),m.deleteProgram(t)})}),await d(`WebGL2 Excalibur-style VAO draw + READ/DRAW blitToScreen`,async()=>{u(async()=>{e.make_current()}),await p(`VAO draw to source FBO survives clearBufferfv+blit pipeline`,async()=>{let e=m,t=m.createFramebuffer(),n=m.createTexture();m.bindTexture(m.TEXTURE_2D,n),m.texImage2D(m.TEXTURE_2D,0,m.RGBA,4,4,0,m.RGBA,m.UNSIGNED_BYTE,null),m.texParameteri(m.TEXTURE_2D,m.TEXTURE_MIN_FILTER,m.NEAREST),m.texParameteri(m.TEXTURE_2D,m.TEXTURE_MAG_FILTER,m.NEAREST),m.texParameteri(m.TEXTURE_2D,m.TEXTURE_WRAP_S,m.CLAMP_TO_EDGE),m.texParameteri(m.TEXTURE_2D,m.TEXTURE_WRAP_T,m.CLAMP_TO_EDGE),m.bindTexture(m.TEXTURE_2D,null),m.bindFramebuffer(m.FRAMEBUFFER,t),m.framebufferTexture2D(m.FRAMEBUFFER,m.COLOR_ATTACHMENT0,m.TEXTURE_2D,n,0),f(m.checkFramebufferStatus(m.FRAMEBUFFER)).toBe(m.FRAMEBUFFER_COMPLETE);let r=m.createFramebuffer(),i=m.createTexture();m.bindTexture(m.TEXTURE_2D,i),m.texImage2D(m.TEXTURE_2D,0,m.RGBA,4,4,0,m.RGBA,m.UNSIGNED_BYTE,null),m.texParameteri(m.TEXTURE_2D,m.TEXTURE_MIN_FILTER,m.NEAREST),m.texParameteri(m.TEXTURE_2D,m.TEXTURE_MAG_FILTER,m.NEAREST),m.bindTexture(m.TEXTURE_2D,null),m.bindFramebuffer(m.FRAMEBUFFER,r),m.framebufferTexture2D(m.FRAMEBUFFER,m.COLOR_ATTACHMENT0,m.TEXTURE_2D,i,0),f(m.checkFramebufferStatus(m.FRAMEBUFFER)).toBe(m.FRAMEBUFFER_COMPLETE),m.bindFramebuffer(m.FRAMEBUFFER,null);let o=a(e,`#version 300 es
|
|
41
41
|
in vec2 a_pos;
|
|
42
42
|
void main(){gl_Position=vec4(a_pos,0.,1.);}`,`#version 300 es
|
|
43
43
|
precision mediump float;
|
|
44
44
|
out vec4 c;
|
|
45
|
-
void main(){c=vec4(0.,1.,0.,1.);}`);
|
|
45
|
+
void main(){c=vec4(0.,1.,0.,1.);}`);f(m.getProgramParameter(o,m.LINK_STATUS)).toBeTruthy();let s=m.createVertexArray();m.bindVertexArray(s);let c=m.createBuffer();m.bindBuffer(m.ARRAY_BUFFER,c),m.bufferData(m.ARRAY_BUFFER,new Float32Array([-1,-1,3,-1,-1,3]),m.STATIC_DRAW);let l=m.getAttribLocation(o,`a_pos`);m.enableVertexAttribArray(l),m.vertexAttribPointer(l,2,m.FLOAT,!1,0,0),m.bindVertexArray(null),m.bindFramebuffer(m.FRAMEBUFFER,t),m.viewport(0,0,4,4),m.clearColor(0,0,1,1),m.clear(m.COLOR_BUFFER_BIT),m.useProgram(o),m.bindVertexArray(s),m.drawArrays(m.TRIANGLES,0,3),m.bindVertexArray(null),f(m.getError()).toBe(m.NO_ERROR),m.bindFramebuffer(36008,t),m.bindFramebuffer(36009,r),f(m.getError()).toBe(m.NO_ERROR),m.clearBufferfv(m.COLOR,0,[0,0,1,1]),f(m.getError()).toBe(m.NO_ERROR),m.blitFramebuffer(0,0,4,4,0,0,4,4,m.COLOR_BUFFER_BIT,m.LINEAR),f(m.getError()).toBe(m.NO_ERROR),m.bindFramebuffer(m.FRAMEBUFFER,r);let u=new Uint8Array(4);m.readPixels(0,0,1,1,m.RGBA,m.UNSIGNED_BYTE,u),f(m.getError()).toBe(m.NO_ERROR),m.bindFramebuffer(m.FRAMEBUFFER,t);let d=new Uint8Array(4);m.readPixels(0,0,1,1,m.RGBA,m.UNSIGNED_BYTE,d),f(m.getError()).toBe(m.NO_ERROR),m.bindVertexArray(null),m.deleteVertexArray(s),m.deleteBuffer(c),m.deleteProgram(o),m.bindFramebuffer(m.FRAMEBUFFER,t),m.framebufferTexture2D(m.FRAMEBUFFER,m.COLOR_ATTACHMENT0,m.TEXTURE_2D,null,0),m.bindFramebuffer(m.FRAMEBUFFER,r),m.framebufferTexture2D(m.FRAMEBUFFER,m.COLOR_ATTACHMENT0,m.TEXTURE_2D,null,0),m.bindFramebuffer(m.FRAMEBUFFER,null),m.deleteTexture(n),m.deleteTexture(i),m.deleteFramebuffer(t),m.deleteFramebuffer(r),f(u[0]).toBe(0),f(u[1]).toBe(255),f(u[2]).toBe(0),f(u[3]).toBe(255),f(d[0]).toBe(0),f(d[1]).toBe(255),f(d[2]).toBe(0),f(d[3]).toBe(255)})}),await d(`WebGL2 bufferSubData with UNIFORM_BUFFER`,async()=>{u(async()=>{e.make_current()}),await p(`bufferSubData with UNIFORM_BUFFER target returns NO_ERROR`,async()=>{let e=35345,t=m.createBuffer();m.bindBuffer(e,t),m.bufferData(e,new Float32Array([1,0,0,1]),m.STATIC_DRAW),f(m.getError()).toBe(m.NO_ERROR),m.bufferSubData(e,0,new Float32Array([0,1,0,1])),f(m.getError()).toBe(m.NO_ERROR),m.bindBuffer(e,null),m.deleteBuffer(t)})}),b.destroy()})},`default`);export{y as default};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { WebGLBuffer } from '../webgl-buffer.js';
|
|
2
|
+
export interface BufferBindingMethods {
|
|
3
|
+
bindBuffer(target: GLenum | undefined, buffer: WebGLBuffer | null): void;
|
|
4
|
+
bufferData(target: GLenum, size: GLsizeiptr, usage: GLenum): void;
|
|
5
|
+
bufferData(target: GLenum, data: BufferSource | null, usage: GLenum): void;
|
|
6
|
+
bufferSubData(target?: GLenum, offset?: GLintptr, data?: BufferSource): void;
|
|
7
|
+
createBuffer(): WebGLBuffer | null;
|
|
8
|
+
deleteBuffer(buffer: WebGLBuffer | null): void;
|
|
9
|
+
getBufferParameter(target?: GLenum, pname?: GLenum): unknown;
|
|
10
|
+
_getActiveBuffer(target: GLenum): WebGLBuffer | null;
|
|
11
|
+
}
|
|
12
|
+
declare module '../webgl-context-base.js' {
|
|
13
|
+
interface WebGLContextBase extends BufferBindingMethods {
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/** Install buffer-binding methods on the given prototype. Called from webgl-context-base.ts. */
|
|
17
|
+
export declare function installBufferBindingMethods(proto: object): void;
|