sig
  type shader_object
  type shader_program
  val create :
    shader_type:[ `fragment_shader | `vertex_shader ] ->
    GlShader.shader_object
  val delete : shader:GlShader.shader_object -> unit
  val source : shader:GlShader.shader_object -> string -> unit
  val compile : shader:GlShader.shader_object -> unit
  val create_program : unit -> GlShader.shader_program
  val delete_program : program:GlShader.shader_program -> unit
  val attach :
    program:GlShader.shader_program -> shader:GlShader.shader_object -> unit
  val detach :
    program:GlShader.shader_program -> shader:GlShader.shader_object -> unit
  val link_program : program:GlShader.shader_program -> unit
  val use_program : program:GlShader.shader_program -> unit
  val unuse_program : unit -> unit
  val shader_compile_status : shader:GlShader.shader_object -> bool
  val shader_compile_status_exn : shader:GlShader.shader_object -> unit
  val get_uniform_location :
    program:GlShader.shader_program -> name:string -> int
  val get_program_attached_shaders : program:GlShader.shader_program -> int
  val get_program_active_uniforms : program:GlShader.shader_program -> int
  val get_program_active_attributes : program:GlShader.shader_program -> int
  val get_program_validate_status : program:GlShader.shader_program -> bool
  val get_program_link_status : program:GlShader.shader_program -> bool
  val get_program_delete_status : program:GlShader.shader_program -> bool
  val uniform1f : location:int -> v0:float -> unit
  val uniform2f : location:int -> v0:float -> v1:float -> unit
  val uniform3f : location:int -> v0:float -> v1:float -> v2:float -> unit
  val uniform4f :
    location:int -> v0:float -> v1:float -> v2:float -> v3:float -> unit
  val uniform1i : location:int -> v0:int -> unit
  val uniform2i : location:int -> v0:int -> v1:int -> unit
  val uniform3i : location:int -> v0:int -> v1:int -> v2:int -> unit
  val uniform4i :
    location:int -> v0:int -> v1:int -> v2:int -> v3:int -> unit
  val uniform1fv : location:int -> value:float array -> unit
  val uniform2fv : location:int -> count:int -> value:float array -> unit
  val uniform3fv : location:int -> count:int -> value:float array -> unit
  val uniform4fv : location:int -> count:int -> value:float array -> unit
  val uniform1iv : location:int -> value:int array -> unit
  val uniform2iv : location:int -> count:int -> value:int array -> unit
  val uniform3iv : location:int -> count:int -> value:int array -> unit
  val uniform4iv : location:int -> count:int -> value:int array -> unit
  val uniform_matrix2fv :
    location:int -> count:int -> transpose:bool -> value:float array -> unit
  val uniform_matrix3fv :
    location:int -> count:int -> transpose:bool -> value:float array -> unit
  val uniform_matrix4fv :
    location:int -> count:int -> transpose:bool -> value:float array -> unit
  val uniform_matrix2x3fv :
    location:int -> count:int -> transpose:bool -> value:float array -> unit
  val uniform_matrix3x2fv :
    location:int -> count:int -> transpose:bool -> value:float array -> unit
  val uniform_matrix2x4fv :
    location:int -> count:int -> transpose:bool -> value:float array -> unit
  val uniform_matrix4x2fv :
    location:int -> count:int -> transpose:bool -> value:float array -> unit
  val uniform_matrix3x4fv :
    location:int -> count:int -> transpose:bool -> value:float array -> unit
  val uniform_matrix4x3fv :
    location:int -> count:int -> transpose:bool -> value:float array -> unit
  val get_attrib_location :
    program:GlShader.shader_program -> name:string -> int
  val bind_attrib_location :
    program:GlShader.shader_program -> index:int -> name:string -> unit
  val vertex_attrib1s : index:int -> v:int -> unit
  val vertex_attrib1d : index:int -> v:float -> unit
  val vertex_attrib2s : index:int -> v0:int -> v1:int -> unit
  val vertex_attrib2d : index:int -> v0:float -> v1:float -> unit
  val vertex_attrib3s : index:int -> v0:int -> v1:int -> v2:int -> unit
  val vertex_attrib3d : index:int -> v0:float -> v1:float -> v2:float -> unit
  val vertex_attrib4s :
    index:int -> v0:int -> v1:int -> v2:int -> v3:int -> unit
  val vertex_attrib4d :
    index:int -> v0:float -> v1:float -> v2:float -> v3:float -> unit
  val get_shader_infolog : shader:GlShader.shader_object -> string
  val get_program_infolog : program:GlShader.shader_program -> string
end