docs: function _commitStencilStates(gl, cur, next) {
    if (next.stencilTest !== cur.stencilTest) {
      if (!next.stencilTest) {
        gl.disable(gl.STENCIL_TEST);
        return;
      }
  
      gl.enable(gl.STENCIL_TEST);
  
      if (next.stencilSep) {
        gl.stencilFuncSeparate(gl.FRONT, next.stencilFuncFront, next.stencilRefFront, next.stencilMaskFront);
        gl.stencilMaskSeparate(gl.FRONT, next.stencilWriteMaskFront);
        gl.stencilOpSeparate(gl.FRONT, next.stencilFailOpFront, next.stencilZFailOpFront, next.stencilZPassOpFront);
        gl.stencilFuncSeparate(gl.BACK, next.stencilFuncBack, next.stencilRefBack, next.stencilMaskBack);
        gl.stencilMaskSeparate(gl.BACK, next.stencilWriteMaskBack);
        gl.stencilOpSeparate(gl.BACK, next.stencilFailOpBack, next.stencilZFailOpBack, next.stencilZPassOpBack);
      } else {
        gl.stencilFunc(next.stencilFuncFront, next.stencilRefFront, next.stencilMaskFront);
        gl.stencilMask(next.stencilWriteMaskFront);
        gl.stencilOp(next.stencilFailOpFront, next.stencilZFailOpFront, next.stencilZPassOpFront);
      }
  
      return;
    }
  
    // fast return
    if (!next.stencilTest) {
      return;
    }
  
    if (cur.stencilSep !== next.stencilSep) {
      if (next.stencilSep) {
        gl.stencilFuncSeparate(gl.FRONT, next.stencilFuncFront, next.stencilRefFront, next.stencilMaskFront);
        gl.stencilMaskSeparate(gl.FRONT, next.stencilWriteMaskFront);
        gl.stencilOpSeparate(gl.FRONT, next.stencilFailOpFront, next.stencilZFailOpFront, next.stencilZPassOpFront);
        gl.stencilFuncSeparate(gl.BACK, next.stencilFuncBack, next.stencilRefBack, next.stencilMaskBack);
        gl.stencilMaskSeparate(gl.BACK, next.stencilWriteMaskBack);
        gl.stencilOpSeparate(gl.BACK, next.stencilFailOpBack, next.stencilZFailOpBack, next.stencilZPassOpBack);
      } else {
        gl.stencilFunc(next.stencilFuncFront, next.stencilRefFront, next.stencilMaskFront);
        gl.stencilMask(next.stencilWriteMaskFront);
        gl.stencilOp(next.stencilFailOpFront, next.stencilZFailOpFront, next.stencilZPassOpFront);
      }
      return;
    }
  
    if (next.stencilSep) {
      // front
      if (
        cur.stencilFuncFront !== next.stencilFuncFront ||
        cur.stencilRefFront !== next.stencilRefFront ||
        cur.stencilMaskFront !== next.stencilMaskFront
      ) {
        gl.stencilFuncSeparate(gl.FRONT, next.stencilFuncFront, next.stencilRefFront, next.stencilMaskFront);
      }
      if (cur.stencilWriteMaskFront !== next.stencilWriteMaskFront) {
        gl.stencilMaskSeparate(gl.FRONT, next.stencilWriteMaskFront);
      }
      if (
        cur.stencilFailOpFront !== next.stencilFailOpFront ||
        cur.stencilZFailOpFront !== next.stencilZFailOpFront ||
        cur.stencilZPassOpFront !== next.stencilZPassOpFront
      ) {
        gl.stencilOpSeparate(gl.FRONT, next.stencilFailOpFront, next.stencilZFailOpFront, next.stencilZPassOpFront);
      }
  
      // back
      if (
        cur.stencilFuncBack !== next.stencilFuncBack ||
        cur.stencilRefBack !== next.stencilRefBack ||
        cur.stencilMaskBack !== next.stencilMaskBack
      ) {
        gl.stencilFuncSeparate(gl.BACK, next.stencilFuncBack, next.stencilRefBack, next.stencilMaskBack);
      }
      if (cur.stencilWriteMaskBack !== next.stencilWriteMaskBack) {
        gl.stencilMaskSeparate(gl.BACK, next.stencilWriteMaskBack);
      }
      if (
        cur.stencilFailOpBack !== next.stencilFailOpBack ||
        cur.stencilZFailOpBack !== next.stencilZFailOpBack ||
        cur.stencilZPassOpBack !== next.stencilZPassOpBack
      ) {
        gl.stencilOpSeparate(gl.BACK, next.stencilFailOpBack, next.stencilZFailOpBack, next.stencilZPassOpBack);
      }
    } else {
      if (
        cur.stencilFuncFront !== next.stencilFuncFront ||
        cur.stencilRefFront !== next.stencilRefFront ||
        cur.stencilMaskFront !== next.stencilMaskFront
      ) {
        gl.stencilFunc(next.stencilFuncFront, next.stencilRefFront, next.stencilMaskFront);
      }
      if (cur.stencilWriteMaskFront !== next.stencilWriteMaskFront) {
        gl.stencilMask(next.stencilWriteMaskFront);
      }
      if (
        cur.stencilFailOpFront !== next.stencilFailOpFront ||
        cur.stencilZFailOpFront !== next.stencilZFailOpFront ||
        cur.stencilZPassOpFront !== next.stencilZPassOpFront
      ) {
        gl.stencilOp(next.stencilFailOpFront, next.stencilZFailOpFront, next.stencilZPassOpFront);
      }
    }
  
  }