@gjsify/webgl 0.3.20 → 0.3.21

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.
Files changed (49) hide show
  1. package/lib/esm/conformance/attribs.spec.js +2 -2
  2. package/lib/esm/conformance/buffers.spec.js +1 -1
  3. package/lib/esm/conformance/context.spec.js +2 -2
  4. package/lib/esm/conformance/programs.spec.js +1 -1
  5. package/lib/esm/conformance/rendering-basic.spec.js +1 -1
  6. package/lib/esm/conformance/rendering.spec.js +3 -3
  7. package/lib/esm/conformance/setup.js +1 -1
  8. package/lib/esm/conformance/state.spec.js +1 -1
  9. package/lib/esm/conformance/textures.spec.js +1 -1
  10. package/lib/esm/conformance/uniforms.spec.js +1 -1
  11. package/lib/esm/extensions/ext-blend-minmax.js +1 -1
  12. package/lib/esm/extensions/ext-color-buffer-float.js +1 -1
  13. package/lib/esm/extensions/ext-color-buffer-half-float.js +1 -1
  14. package/lib/esm/extensions/ext-texture-filter-anisotropic.js +1 -1
  15. package/lib/esm/extensions/oes-element-index-unit.js +1 -1
  16. package/lib/esm/extensions/oes-standard-derivatives.js +1 -1
  17. package/lib/esm/extensions/oes-texture-float-linear.js +1 -1
  18. package/lib/esm/extensions/oes-texture-float.js +1 -1
  19. package/lib/esm/extensions/oes-texture-half-float.js +1 -1
  20. package/lib/esm/extensions/stackgl-destroy-context.js +1 -1
  21. package/lib/esm/extensions/stackgl-resize-drawing-buffer.js +1 -1
  22. package/lib/esm/html-canvas-element.js +1 -1
  23. package/lib/esm/linkable.js +1 -1
  24. package/lib/esm/test-utils.js +4 -4
  25. package/lib/esm/utils.js +1 -1
  26. package/lib/esm/webgl-active-info.js +1 -1
  27. package/lib/esm/webgl-buffer.js +1 -1
  28. package/lib/esm/webgl-context-attributes.js +1 -1
  29. package/lib/esm/webgl-context-base.js +2 -2
  30. package/lib/esm/webgl-drawing-buffer-wrapper.js +1 -1
  31. package/lib/esm/webgl-framebuffer.js +1 -1
  32. package/lib/esm/webgl-program.js +1 -1
  33. package/lib/esm/webgl-query.js +1 -1
  34. package/lib/esm/webgl-renderbuffer.js +1 -1
  35. package/lib/esm/webgl-rendering-context.js +1 -1
  36. package/lib/esm/webgl-sampler.js +1 -1
  37. package/lib/esm/webgl-shader-precision-format.js +1 -1
  38. package/lib/esm/webgl-shader.js +1 -1
  39. package/lib/esm/webgl-sync.js +1 -1
  40. package/lib/esm/webgl-texture-unit.js +1 -1
  41. package/lib/esm/webgl-texture.js +1 -1
  42. package/lib/esm/webgl-transform-feedback.js +1 -1
  43. package/lib/esm/webgl-uniform-location.js +1 -1
  44. package/lib/esm/webgl-vertex-array-object.js +1 -1
  45. package/lib/esm/webgl-vertex-attribute.js +1 -1
  46. package/lib/esm/webgl1.spec.js +2 -2
  47. package/lib/esm/webgl2-rendering-context.js +1 -1
  48. package/lib/esm/webgl2.spec.js +3 -3
  49. package/package.json +6 -6
@@ -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{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 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 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,4 +1,4 @@
1
- import{TEXTURE_FS_300 as e,TEXTURE_VS_300 as t,destroyTestFBO as n,drawTriangle as r,makeProgram as i,makeTestFBO as a,makeTestFBOFloat as o,makeTestFBOWithDepthTexture 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{WebGL2RenderingContext as m,WebGLBridge as h}from"@gjsify/webgl";import g from"@girs/glib-2.0";import _ from"@girs/gtk-4.0";var v=async()=>{await p(`Display`,async()=>{_.init();let p,v,y=new g.MainLoop(null,!1),b=new _.Window({});b.set_default_size(200,200),p=new h,p.onReady((e,t)=>{v=e.getContext(`webgl2`),y.quit()}),b.set_child(p),b.present();let x=g.timeout_add(g.PRIORITY_DEFAULT,1e4,()=>(y.quit(),g.SOURCE_REMOVE));if(y.run(),g.source_remove(x),!v){console.warn(`WebGL2 context not available — skipping WebGL2 tests`),b.destroy();return}p.make_current(),await u(`WebGL2 context`,async()=>{l(async()=>{p.make_current()}),await f(`getContext("webgl2") returns a WebGL2RenderingContext`,async()=>{d(v).toBeInstanceOf(m)}),await f(`VERSION is "WebGL 2.0"`,async()=>{d(v.getParameter(v.VERSION)).toBe(`WebGL 2.0`)}),await f(`SHADING_LANGUAGE_VERSION is "WebGL GLSL ES 3.00"`,async()=>{d(v.getParameter(v.SHADING_LANGUAGE_VERSION)).toBe(`WebGL GLSL ES 3.00`)}),await f(`drawingBufferWidth and drawingBufferHeight are positive`,async()=>{d(v.drawingBufferWidth>0).toBeTruthy(),d(v.drawingBufferHeight>0).toBeTruthy()}),await f(`getError() returns NO_ERROR initially`,async()=>{d(v.getError()).toBe(v.NO_ERROR)})}),await u(`GLSL ES 3.00 compilation`,async()=>{l(async()=>{p.make_current()});let e=[`#version 300 es`,`in vec2 position;`,`void main() { gl_Position = vec4(position, 0.0, 1.0); }`].join(`
1
+ import{TEXTURE_FS_300 as e,TEXTURE_VS_300 as t,destroyTestFBO as n,drawTriangle as r,makeProgram as i,makeTestFBO as a,makeTestFBOFloat as o,makeTestFBOWithDepthTexture 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{WebGL2RenderingContext as m,WebGLBridge as h}from"@gjsify/webgl";import g from"@girs/glib-2.0";import _ from"@girs/gtk-4.0";var webgl2_spec_default=async()=>{await p(`Display`,async()=>{_.init();let p,v,y=new g.MainLoop(null,!1),b=new _.Window({});b.set_default_size(200,200),p=new h,p.onReady((e,t)=>{v=e.getContext(`webgl2`),y.quit()}),b.set_child(p),b.present();let x=g.timeout_add(g.PRIORITY_DEFAULT,1e4,()=>(y.quit(),g.SOURCE_REMOVE));if(y.run(),g.source_remove(x),!v){console.warn(`WebGL2 context not available — skipping WebGL2 tests`),b.destroy();return}p.make_current(),await u(`WebGL2 context`,async()=>{l(async()=>{p.make_current()}),await f(`getContext("webgl2") returns a WebGL2RenderingContext`,async()=>{d(v).toBeInstanceOf(m)}),await f(`VERSION is "WebGL 2.0"`,async()=>{d(v.getParameter(v.VERSION)).toBe(`WebGL 2.0`)}),await f(`SHADING_LANGUAGE_VERSION is "WebGL GLSL ES 3.00"`,async()=>{d(v.getParameter(v.SHADING_LANGUAGE_VERSION)).toBe(`WebGL GLSL ES 3.00`)}),await f(`drawingBufferWidth and drawingBufferHeight are positive`,async()=>{d(v.drawingBufferWidth>0).toBeTruthy(),d(v.drawingBufferHeight>0).toBeTruthy()}),await f(`getError() returns NO_ERROR initially`,async()=>{d(v.getError()).toBe(v.NO_ERROR)})}),await u(`GLSL ES 3.00 compilation`,async()=>{l(async()=>{p.make_current()});let e=[`#version 300 es`,`in vec2 position;`,`void main() { gl_Position = vec4(position, 0.0, 1.0); }`].join(`
2
2
  `),t=[`#version 300 es`,`precision mediump float;`,`out vec4 fragColor;`,`void main() { fragColor = vec4(0.0, 1.0, 0.0, 1.0); }`].join(`
3
3
  `);await f(`#version 300 es vertex shader compiles`,async()=>{let t=v.createShader(v.VERTEX_SHADER);v.shaderSource(t,e),v.compileShader(t),v.getShaderParameter(t,v.COMPILE_STATUS)||console.error(`VS300 log:`,v.getShaderInfoLog(t)),d(v.getShaderParameter(t,v.COMPILE_STATUS)).toBeTruthy(),v.deleteShader(t)}),await f(`#version 300 es fragment shader compiles`,async()=>{let e=v.createShader(v.FRAGMENT_SHADER);v.shaderSource(e,t),v.compileShader(e),v.getShaderParameter(e,v.COMPILE_STATUS)||console.error(`FS300 log:`,v.getShaderInfoLog(e)),d(v.getShaderParameter(e,v.COMPILE_STATUS)).toBeTruthy(),v.deleteShader(e)}),await f(`#version 300 es program links and renders green`,async()=>{let o=i(v,e,t);v.getProgramParameter(o,v.LINK_STATUS)||console.error(`Program300 log:`,v.getProgramInfoLog(o)),d(v.getProgramParameter(o,v.LINK_STATUS)).toBeTruthy();let s=a(v,4,4);v.clearColor(0,0,0,1),v.clear(v.COLOR_BUFFER_BIT),v.useProgram(o),r(v),d(v.getError()).toBe(v.NO_ERROR);let l=c(v,0,0);n(v,s),d(l[0]).toBe(0),d(l[1]).toBe(255),d(l[2]).toBe(0),d(l[3]).toBe(255),v.deleteProgram(o)})}),await u(`VAO`,async()=>{l(async()=>{p.make_current()}),await f(`createVertexArray returns a non-null object`,async()=>{let e=v.createVertexArray();d(e).not.toBeNull(),d(e).toBeDefined(),v.deleteVertexArray(e)}),await f(`isVertexArray is true after creation, false after deletion`,async()=>{let e=v.createVertexArray();v.bindVertexArray(e),d(v.isVertexArray(e)).toBeTruthy(),v.bindVertexArray(null),v.deleteVertexArray(e),d(v.isVertexArray(e)).toBeFalsy()}),await f(`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(`
@@ -16,7 +16,7 @@ import{TEXTURE_FS_300 as e,TEXTURE_VS_300 as t,destroyTestFBO as n,drawTriangle
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
17
  `),n=i(v,e,t);d(v.getProgramParameter(n,v.LINK_STATUS)).toBeTruthy();let a=v.createFramebuffer();v.bindFramebuffer(v.FRAMEBUFFER,a);let o=v.createTexture();v.bindTexture(v.TEXTURE_2D,o),v.texImage2D(v.TEXTURE_2D,0,v.RGBA,4,4,0,v.RGBA,v.UNSIGNED_BYTE,null),v.framebufferTexture2D(v.FRAMEBUFFER,v.COLOR_ATTACHMENT0,v.TEXTURE_2D,o,0);let s=v.createTexture();v.bindTexture(v.TEXTURE_2D,s),v.texImage2D(v.TEXTURE_2D,0,v.RGBA,4,4,0,v.RGBA,v.UNSIGNED_BYTE,null),v.framebufferTexture2D(v.FRAMEBUFFER,v.COLOR_ATTACHMENT1,v.TEXTURE_2D,s,0);let l=v.checkFramebufferStatus(v.FRAMEBUFFER);if(l!==v.FRAMEBUFFER_COMPLETE){console.warn(`MRT framebuffer not complete:`,l),v.bindFramebuffer(v.FRAMEBUFFER,null),v.deleteFramebuffer(a),v.deleteTexture(o),v.deleteTexture(s),v.deleteProgram(n);return}v.drawBuffers([v.COLOR_ATTACHMENT0,v.COLOR_ATTACHMENT1]),v.viewport(0,0,4,4),v.clearColor(0,0,0,1),v.clear(v.COLOR_BUFFER_BIT),v.useProgram(n),r(v),d(v.getError()).toBe(v.NO_ERROR),v.readBuffer(v.COLOR_ATTACHMENT0);let u=c(v,0,0);d(u[0]).toBe(255),d(u[1]).toBe(0),v.readBuffer(v.COLOR_ATTACHMENT1);let f=c(v,0,0);d(f[0]).toBe(0),d(f[2]).toBe(255),v.bindFramebuffer(v.FRAMEBUFFER,null),v.deleteFramebuffer(a),v.deleteTexture(o),v.deleteTexture(s),v.deleteProgram(n)})}),await u(`3D texture`,async()=>{l(async()=>{p.make_current()}),await f(`createTexture + TEXTURE_3D binding works`,async()=>{let e=v.createTexture();d(e).not.toBeNull(),v.bindTexture(v.TEXTURE_3D,e),d(v.getError()).toBe(v.NO_ERROR),v.deleteTexture(e)}),await f(`texImage3D uploads a 2×2×2 RGBA texture without error`,async()=>{let e=v.createTexture();v.bindTexture(v.TEXTURE_3D,e),v.texParameteri(v.TEXTURE_3D,v.TEXTURE_MIN_FILTER,v.NEAREST),v.texParameteri(v.TEXTURE_3D,v.TEXTURE_MAG_FILTER,v.NEAREST),v.texParameteri(v.TEXTURE_3D,v.TEXTURE_WRAP_S,v.CLAMP_TO_EDGE),v.texParameteri(v.TEXTURE_3D,v.TEXTURE_WRAP_T,v.CLAMP_TO_EDGE),v.texParameteri(v.TEXTURE_3D,v.TEXTURE_WRAP_R,v.CLAMP_TO_EDGE);let t=new Uint8Array(32).fill(128);v.texImage3D(v.TEXTURE_3D,0,v.RGBA,2,2,2,0,v.RGBA,v.UNSIGNED_BYTE,t),d(v.getError()).toBe(v.NO_ERROR),v.deleteTexture(e)}),await f(`texStorage3D allocates storage without error`,async()=>{let e=v.createTexture();v.bindTexture(v.TEXTURE_3D,e),v.texStorage3D(v.TEXTURE_3D,1,v.RGBA8,4,4,4),d(v.getError()).toBe(v.NO_ERROR),v.deleteTexture(e)})}),await u(`transform feedback`,async()=>{l(async()=>{p.make_current()}),await f(`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
- `),r=v.createShader(v.VERTEX_SHADER);v.shaderSource(r,e),v.compileShader(r),v.getShaderParameter(r,v.COMPILE_STATUS)||console.error(`TF VS:`,v.getShaderInfoLog(r));let i=v.createShader(v.FRAGMENT_SHADER);v.shaderSource(i,t),v.compileShader(i);let o=v.createProgram();v.attachShader(o,r),v.attachShader(o,i),v.transformFeedbackVaryings(o,[`outVal`],v.SEPARATE_ATTRIBS),v.linkProgram(o),v.getProgramParameter(o,v.LINK_STATUS)||console.error(`TF prog:`,v.getProgramInfoLog(o)),d(v.getProgramParameter(o,v.LINK_STATUS)).toBeTruthy();let s=v.createBuffer();v.bindBuffer(v.ARRAY_BUFFER,s),v.bufferData(v.ARRAY_BUFFER,new Float32Array([1,2,3,4]),v.STATIC_DRAW);let c=v.getAttribLocation(o,`inVal`);v.enableVertexAttribArray(c),v.vertexAttribPointer(c,1,v.FLOAT,!1,0,0);let l=v.createBuffer();v.bindBuffer(v.TRANSFORM_FEEDBACK_BUFFER,l),v.bufferData(v.TRANSFORM_FEEDBACK_BUFFER,16,v.STATIC_READ);let u=v.createTransformFeedback();v.bindTransformFeedback(v.TRANSFORM_FEEDBACK,u),v.bindBufferBase(v.TRANSFORM_FEEDBACK_BUFFER,0,l);let f=a(v,1,1);v.useProgram(o),v.enable(v.RASTERIZER_DISCARD),v.beginTransformFeedback(v.POINTS),v.drawArrays(v.POINTS,0,4),v.endTransformFeedback(),v.disable(v.RASTERIZER_DISCARD),d(v.getError()).toBe(v.NO_ERROR),v.bindTransformFeedback(v.TRANSFORM_FEEDBACK,null),n(v,f);let p=new Float32Array(4);v.bindBuffer(v.TRANSFORM_FEEDBACK_BUFFER,l),v.getBufferSubData(v.TRANSFORM_FEEDBACK_BUFFER,0,p),d(p[0]).toBe(2),d(p[1]).toBe(4),d(p[2]).toBe(6),d(p[3]).toBe(8),v.disableVertexAttribArray(c),v.deleteBuffer(s),v.deleteBuffer(l),v.deleteTransformFeedback(u),v.deleteProgram(o)})}),await u(`getStringi`,async()=>{l(async()=>{p.make_current()}),await f(`getStringi(EXTENSIONS, 0) returns a string`,async()=>{if(v.getParameter(v.NUM_EXTENSIONS)>0){let e=v.getStringi(v.EXTENSIONS,0);d(typeof e).toBe(`string`),d(e.length>0).toBeTruthy()}})}),await u(`WebGL2 extensions`,async()=>{l(async()=>{p.make_current()}),await f(`supports EXT_color_buffer_float`,async()=>{d(v.getExtension(`EXT_color_buffer_float`)).toBeTruthy()}),await f(`supports EXT_color_buffer_half_float`,async()=>{d(v.getExtension(`EXT_color_buffer_half_float`)).toBeTruthy()}),await f(`supports OES_texture_half_float`,async()=>{d(v.getExtension(`OES_texture_half_float`)).toBeTruthy()}),await f(`OES_texture_half_float exposes HALF_FLOAT_OES constant`,async()=>{let e=v.getExtension(`OES_texture_half_float`);d(e).toBeTruthy(),d(e.HALF_FLOAT_OES).toBe(36193)})}),await u(`WebGL2 renderbufferStorage formats`,async()=>{l(async()=>{p.make_current()});async function e(e){let t=v.createRenderbuffer();v.bindRenderbuffer(v.RENDERBUFFER,t),v.renderbufferStorage(v.RENDERBUFFER,e,64,64);let n=v.getError();return v.deleteRenderbuffer(t),n}await f(`accepts RGBA8 (0x8058)`,async()=>{d(await e(32856)).toBe(v.NO_ERROR)}),await f(`accepts DEPTH_COMPONENT24 (0x81A6)`,async()=>{d(await e(33190)).toBe(v.NO_ERROR)}),await f(`accepts DEPTH24_STENCIL8 (0x88F0)`,async()=>{d(await e(35056)).toBe(v.NO_ERROR)})}),await u(`WebGL2 float render target`,async()=>{l(async()=>{p.make_current()}),await f(`can create RGBA16F texture and attach to FBO`,async()=>{let e=v.createTexture();v.bindTexture(v.TEXTURE_2D,e),v.texImage2D(v.TEXTURE_2D,0,34842,64,64,0,v.RGBA,5131,null),d(v.getError()).toBe(v.NO_ERROR);let t=v.createFramebuffer();v.bindFramebuffer(v.FRAMEBUFFER,t),v.framebufferTexture2D(v.FRAMEBUFFER,v.COLOR_ATTACHMENT0,v.TEXTURE_2D,e,0),d(v.checkFramebufferStatus(v.FRAMEBUFFER)).toBe(v.FRAMEBUFFER_COMPLETE),v.clearColor(1,0,0,1),v.clear(v.COLOR_BUFFER_BIT),d(v.getError()).toBe(v.NO_ERROR),v.bindFramebuffer(v.FRAMEBUFFER,null),v.deleteFramebuffer(t),v.deleteTexture(e)}),await f(`can create RGBA8 renderbuffer FBO`,async()=>{let e=v.createRenderbuffer();v.bindRenderbuffer(v.RENDERBUFFER,e),v.renderbufferStorage(v.RENDERBUFFER,32856,64,64),d(v.getError()).toBe(v.NO_ERROR);let t=v.createFramebuffer();v.bindFramebuffer(v.FRAMEBUFFER,t),v.framebufferRenderbuffer(v.FRAMEBUFFER,v.COLOR_ATTACHMENT0,v.RENDERBUFFER,e),d(v.checkFramebufferStatus(v.FRAMEBUFFER)).toBe(v.FRAMEBUFFER_COMPLETE),v.clearColor(0,1,0,1),v.clear(v.COLOR_BUFFER_BIT),d(v.getError()).toBe(v.NO_ERROR),v.bindFramebuffer(v.FRAMEBUFFER,null),v.deleteFramebuffer(t),v.deleteRenderbuffer(e)})}),await u(`WebGL2 GLSL 1.0 compatibility`,async()=>{l(async()=>{p.make_current()}),await f(`compiles versionless shaders with attribute/varying`,async()=>{let e=i(v,`attribute vec2 position;
19
+ `),r=v.createShader(v.VERTEX_SHADER);v.shaderSource(r,e),v.compileShader(r),v.getShaderParameter(r,v.COMPILE_STATUS)||console.error(`TF VS:`,v.getShaderInfoLog(r));let i=v.createShader(v.FRAGMENT_SHADER);v.shaderSource(i,t),v.compileShader(i);let o=v.createProgram();v.attachShader(o,r),v.attachShader(o,i),v.transformFeedbackVaryings(o,[`outVal`],v.SEPARATE_ATTRIBS),v.linkProgram(o),v.getProgramParameter(o,v.LINK_STATUS)||console.error(`TF prog:`,v.getProgramInfoLog(o)),d(v.getProgramParameter(o,v.LINK_STATUS)).toBeTruthy();let s=v.createBuffer();v.bindBuffer(v.ARRAY_BUFFER,s),v.bufferData(v.ARRAY_BUFFER,new Float32Array([1,2,3,4]),v.STATIC_DRAW);let c=v.getAttribLocation(o,`inVal`);v.enableVertexAttribArray(c),v.vertexAttribPointer(c,1,v.FLOAT,!1,0,0);let l=v.createBuffer();v.bindBuffer(v.TRANSFORM_FEEDBACK_BUFFER,l),v.bufferData(v.TRANSFORM_FEEDBACK_BUFFER,16,v.STATIC_READ);let u=v.createTransformFeedback();v.bindTransformFeedback(v.TRANSFORM_FEEDBACK,u),v.bindBufferBase(v.TRANSFORM_FEEDBACK_BUFFER,0,l);let f=a(v,1,1);v.useProgram(o),v.enable(v.RASTERIZER_DISCARD),v.beginTransformFeedback(v.POINTS),v.drawArrays(v.POINTS,0,4),v.endTransformFeedback(),v.disable(v.RASTERIZER_DISCARD),d(v.getError()).toBe(v.NO_ERROR),v.bindTransformFeedback(v.TRANSFORM_FEEDBACK,null),n(v,f);let p=new Float32Array(4);v.bindBuffer(v.TRANSFORM_FEEDBACK_BUFFER,l),v.getBufferSubData(v.TRANSFORM_FEEDBACK_BUFFER,0,p),d(p[0]).toBe(2),d(p[1]).toBe(4),d(p[2]).toBe(6),d(p[3]).toBe(8),v.disableVertexAttribArray(c),v.deleteBuffer(s),v.deleteBuffer(l),v.deleteTransformFeedback(u),v.deleteProgram(o)})}),await u(`getStringi`,async()=>{l(async()=>{p.make_current()}),await f(`getStringi(EXTENSIONS, 0) returns a string`,async()=>{if(v.getParameter(v.NUM_EXTENSIONS)>0){let e=v.getStringi(v.EXTENSIONS,0);d(typeof e).toBe(`string`),d(e.length>0).toBeTruthy()}})}),await u(`WebGL2 extensions`,async()=>{l(async()=>{p.make_current()}),await f(`supports EXT_color_buffer_float`,async()=>{d(v.getExtension(`EXT_color_buffer_float`)).toBeTruthy()}),await f(`supports EXT_color_buffer_half_float`,async()=>{d(v.getExtension(`EXT_color_buffer_half_float`)).toBeTruthy()}),await f(`supports OES_texture_half_float`,async()=>{d(v.getExtension(`OES_texture_half_float`)).toBeTruthy()}),await f(`OES_texture_half_float exposes HALF_FLOAT_OES constant`,async()=>{let e=v.getExtension(`OES_texture_half_float`);d(e).toBeTruthy(),d(e.HALF_FLOAT_OES).toBe(36193)})}),await u(`WebGL2 renderbufferStorage formats`,async()=>{l(async()=>{p.make_current()});async function testRbFormat(e){let t=v.createRenderbuffer();v.bindRenderbuffer(v.RENDERBUFFER,t),v.renderbufferStorage(v.RENDERBUFFER,e,64,64);let n=v.getError();return v.deleteRenderbuffer(t),n}await f(`accepts RGBA8 (0x8058)`,async()=>{d(await testRbFormat(32856)).toBe(v.NO_ERROR)}),await f(`accepts DEPTH_COMPONENT24 (0x81A6)`,async()=>{d(await testRbFormat(33190)).toBe(v.NO_ERROR)}),await f(`accepts DEPTH24_STENCIL8 (0x88F0)`,async()=>{d(await testRbFormat(35056)).toBe(v.NO_ERROR)})}),await u(`WebGL2 float render target`,async()=>{l(async()=>{p.make_current()}),await f(`can create RGBA16F texture and attach to FBO`,async()=>{let e=v.createTexture();v.bindTexture(v.TEXTURE_2D,e),v.texImage2D(v.TEXTURE_2D,0,34842,64,64,0,v.RGBA,5131,null),d(v.getError()).toBe(v.NO_ERROR);let t=v.createFramebuffer();v.bindFramebuffer(v.FRAMEBUFFER,t),v.framebufferTexture2D(v.FRAMEBUFFER,v.COLOR_ATTACHMENT0,v.TEXTURE_2D,e,0),d(v.checkFramebufferStatus(v.FRAMEBUFFER)).toBe(v.FRAMEBUFFER_COMPLETE),v.clearColor(1,0,0,1),v.clear(v.COLOR_BUFFER_BIT),d(v.getError()).toBe(v.NO_ERROR),v.bindFramebuffer(v.FRAMEBUFFER,null),v.deleteFramebuffer(t),v.deleteTexture(e)}),await f(`can create RGBA8 renderbuffer FBO`,async()=>{let e=v.createRenderbuffer();v.bindRenderbuffer(v.RENDERBUFFER,e),v.renderbufferStorage(v.RENDERBUFFER,32856,64,64),d(v.getError()).toBe(v.NO_ERROR);let t=v.createFramebuffer();v.bindFramebuffer(v.FRAMEBUFFER,t),v.framebufferRenderbuffer(v.FRAMEBUFFER,v.COLOR_ATTACHMENT0,v.RENDERBUFFER,e),d(v.checkFramebufferStatus(v.FRAMEBUFFER)).toBe(v.FRAMEBUFFER_COMPLETE),v.clearColor(0,1,0,1),v.clear(v.COLOR_BUFFER_BIT),d(v.getError()).toBe(v.NO_ERROR),v.bindFramebuffer(v.FRAMEBUFFER,null),v.deleteFramebuffer(t),v.deleteRenderbuffer(e)})}),await u(`WebGL2 GLSL 1.0 compatibility`,async()=>{l(async()=>{p.make_current()}),await f(`compiles versionless shaders with attribute/varying`,async()=>{let e=i(v,`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;
@@ -42,4 +42,4 @@ 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.);}`);d(v.getProgramParameter(o,v.LINK_STATUS)).toBeTruthy();let s=v.createVertexArray();v.bindVertexArray(s);let c=v.createBuffer();v.bindBuffer(v.ARRAY_BUFFER,c),v.bufferData(v.ARRAY_BUFFER,new Float32Array([-1,-1,3,-1,-1,3]),v.STATIC_DRAW);let l=v.getAttribLocation(o,`a_pos`);v.enableVertexAttribArray(l),v.vertexAttribPointer(l,2,v.FLOAT,!1,0,0),v.bindVertexArray(null),v.bindFramebuffer(v.FRAMEBUFFER,t),v.viewport(0,0,4,4),v.clearColor(0,0,1,1),v.clear(v.COLOR_BUFFER_BIT),v.useProgram(o),v.bindVertexArray(s),v.drawArrays(v.TRIANGLES,0,3),v.bindVertexArray(null),d(v.getError()).toBe(v.NO_ERROR),v.bindFramebuffer(36008,t),v.bindFramebuffer(36009,r),d(v.getError()).toBe(v.NO_ERROR),v.clearBufferfv(v.COLOR,0,[0,0,1,1]),d(v.getError()).toBe(v.NO_ERROR),v.blitFramebuffer(0,0,4,4,0,0,4,4,v.COLOR_BUFFER_BIT,v.LINEAR),d(v.getError()).toBe(v.NO_ERROR),v.bindFramebuffer(v.FRAMEBUFFER,r);let u=new Uint8Array(4);v.readPixels(0,0,1,1,v.RGBA,v.UNSIGNED_BYTE,u),d(v.getError()).toBe(v.NO_ERROR),v.bindFramebuffer(v.FRAMEBUFFER,t);let f=new Uint8Array(4);v.readPixels(0,0,1,1,v.RGBA,v.UNSIGNED_BYTE,f),d(v.getError()).toBe(v.NO_ERROR),v.bindVertexArray(null),v.deleteVertexArray(s),v.deleteBuffer(c),v.deleteProgram(o),v.bindFramebuffer(v.FRAMEBUFFER,t),v.framebufferTexture2D(v.FRAMEBUFFER,v.COLOR_ATTACHMENT0,v.TEXTURE_2D,null,0),v.bindFramebuffer(v.FRAMEBUFFER,r),v.framebufferTexture2D(v.FRAMEBUFFER,v.COLOR_ATTACHMENT0,v.TEXTURE_2D,null,0),v.bindFramebuffer(v.FRAMEBUFFER,null),v.deleteTexture(n),v.deleteTexture(a),v.deleteFramebuffer(t),v.deleteFramebuffer(r),d(u[0]).toBe(0),d(u[1]).toBe(255),d(u[2]).toBe(0),d(u[3]).toBe(255),d(f[0]).toBe(0),d(f[1]).toBe(255),d(f[2]).toBe(0),d(f[3]).toBe(255)})}),await u(`WebGL2 bufferSubData with UNIFORM_BUFFER`,async()=>{l(async()=>{p.make_current()}),await f(`bufferSubData with UNIFORM_BUFFER target returns NO_ERROR`,async()=>{let e=35345,t=v.createBuffer();v.bindBuffer(e,t),v.bufferData(e,new Float32Array([1,0,0,1]),v.STATIC_DRAW),d(v.getError()).toBe(v.NO_ERROR),v.bufferSubData(e,0,new Float32Array([0,1,0,1])),d(v.getError()).toBe(v.NO_ERROR),v.bindBuffer(e,null),v.deleteBuffer(t)})}),b.destroy()})};export{v as default};
45
+ void main(){c=vec4(0.,1.,0.,1.);}`);d(v.getProgramParameter(o,v.LINK_STATUS)).toBeTruthy();let s=v.createVertexArray();v.bindVertexArray(s);let c=v.createBuffer();v.bindBuffer(v.ARRAY_BUFFER,c),v.bufferData(v.ARRAY_BUFFER,new Float32Array([-1,-1,3,-1,-1,3]),v.STATIC_DRAW);let l=v.getAttribLocation(o,`a_pos`);v.enableVertexAttribArray(l),v.vertexAttribPointer(l,2,v.FLOAT,!1,0,0),v.bindVertexArray(null),v.bindFramebuffer(v.FRAMEBUFFER,t),v.viewport(0,0,4,4),v.clearColor(0,0,1,1),v.clear(v.COLOR_BUFFER_BIT),v.useProgram(o),v.bindVertexArray(s),v.drawArrays(v.TRIANGLES,0,3),v.bindVertexArray(null),d(v.getError()).toBe(v.NO_ERROR),v.bindFramebuffer(36008,t),v.bindFramebuffer(36009,r),d(v.getError()).toBe(v.NO_ERROR),v.clearBufferfv(v.COLOR,0,[0,0,1,1]),d(v.getError()).toBe(v.NO_ERROR),v.blitFramebuffer(0,0,4,4,0,0,4,4,v.COLOR_BUFFER_BIT,v.LINEAR),d(v.getError()).toBe(v.NO_ERROR),v.bindFramebuffer(v.FRAMEBUFFER,r);let u=new Uint8Array(4);v.readPixels(0,0,1,1,v.RGBA,v.UNSIGNED_BYTE,u),d(v.getError()).toBe(v.NO_ERROR),v.bindFramebuffer(v.FRAMEBUFFER,t);let f=new Uint8Array(4);v.readPixels(0,0,1,1,v.RGBA,v.UNSIGNED_BYTE,f),d(v.getError()).toBe(v.NO_ERROR),v.bindVertexArray(null),v.deleteVertexArray(s),v.deleteBuffer(c),v.deleteProgram(o),v.bindFramebuffer(v.FRAMEBUFFER,t),v.framebufferTexture2D(v.FRAMEBUFFER,v.COLOR_ATTACHMENT0,v.TEXTURE_2D,null,0),v.bindFramebuffer(v.FRAMEBUFFER,r),v.framebufferTexture2D(v.FRAMEBUFFER,v.COLOR_ATTACHMENT0,v.TEXTURE_2D,null,0),v.bindFramebuffer(v.FRAMEBUFFER,null),v.deleteTexture(n),v.deleteTexture(a),v.deleteFramebuffer(t),v.deleteFramebuffer(r),d(u[0]).toBe(0),d(u[1]).toBe(255),d(u[2]).toBe(0),d(u[3]).toBe(255),d(f[0]).toBe(0),d(f[1]).toBe(255),d(f[2]).toBe(0),d(f[3]).toBe(255)})}),await u(`WebGL2 bufferSubData with UNIFORM_BUFFER`,async()=>{l(async()=>{p.make_current()}),await f(`bufferSubData with UNIFORM_BUFFER target returns NO_ERROR`,async()=>{let e=35345,t=v.createBuffer();v.bindBuffer(e,t),v.bufferData(e,new Float32Array([1,0,0,1]),v.STATIC_DRAW),d(v.getError()).toBe(v.NO_ERROR),v.bufferSubData(e,0,new Float32Array([0,1,0,1])),d(v.getError()).toBe(v.NO_ERROR),v.bindBuffer(e,null),v.deleteBuffer(t)})}),b.destroy()})};export{webgl2_spec_default as default};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gjsify/webgl",
3
- "version": "0.3.20",
3
+ "version": "0.3.21",
4
4
  "description": "WebGL module for Gjs",
5
5
  "module": "lib/esm/index.js",
6
6
  "types": "lib/types/index.d.ts",
@@ -39,8 +39,8 @@
39
39
  "WebGL"
40
40
  ],
41
41
  "devDependencies": {
42
- "@gjsify/cli": "^0.3.20",
43
- "@gjsify/unit": "^0.3.20",
42
+ "@gjsify/cli": "^0.3.21",
43
+ "@gjsify/unit": "^0.3.21",
44
44
  "@types/bit-twiddle": "^1.0.3",
45
45
  "@types/node": "^25.6.2",
46
46
  "typescript": "^6.0.3"
@@ -49,9 +49,9 @@
49
49
  "@girs/gjs": "4.0.0-rc.14",
50
50
  "@girs/gtk-4.0": "4.23.0-4.0.0-rc.14",
51
51
  "@girs/gwebgl-0.1": "0.1.0-4.0.0-rc.5",
52
- "@gjsify/dom-elements": "^0.3.20",
53
- "@gjsify/event-bridge": "^0.3.20",
54
- "@gjsify/utils": "^0.3.20",
52
+ "@gjsify/dom-elements": "^0.3.21",
53
+ "@gjsify/event-bridge": "^0.3.21",
54
+ "@gjsify/utils": "^0.3.21",
55
55
  "bit-twiddle": "^1.0.2",
56
56
  "glsl-tokenizer": "^2.1.5"
57
57
  }