code: function createProgramInfoFromProgram(gl, program) {
    const uniformSetters = createUniformSetters(gl, program);
    const attribSetters = createAttributeSetters(gl, program);
    const programInfo = {
      program: program,
      uniformSetters: uniformSetters,
      attribSetters: attribSetters,
    };
  
    if (utils.isWebGL2(gl)) {
      programInfo.uniformBlockSpec = createUniformBlockSpecFromProgram(gl, program);
      programInfo.transformFeedbackInfo = createTransformFeedbackInfo(gl, program);
    }
  
    return programInfo;
  }
docs: @typedef {Object} ProgramInfo
  @property {WebGLProgram} program A shader program
  @property {Object<string, function>} uniformSetters object of setters as returned from createUniformSetters,
  @property {Object<string, function>} attribSetters object of setters as returned from createAttribSetters,
  @propetty {module:twgl.UniformBlockSpec} [uniformBlockSpace] a uniform block spec for making UniformBlockInfos with createUniformBlockInfo etc..
  @property {Object<string, module:twgl.TransformFeedbackInfo>} [transformFeedbackInfo] info for transform feedbacks
  @memberOf module:twgl
   
  Creates a ProgramInfo from an existing program.
  
  A ProgramInfo contains
  
  programInfo = {
  program: WebGLProgram,
  uniformSetters: object of setters as returned from createUniformSetters,
  attribSetters: object of setters as returned from createAttribSetters,
  }
  
  @param {WebGLRenderingContext} gl The WebGLRenderingContext
  to use.
  @param {WebGLProgram} program an existing WebGLProgram.
  @return {module:twgl.ProgramInfo} The created ProgramInfo.
  @memberOf module:twgl/programs