sig
  type vbo_id
  external glGenBuffer : unit -> VBO.vbo_id = "ml_glgenbuffer" "noalloc"
  external glGenBuffers : n:int -> VBO.vbo_id array = "ml_glgenbuffers"
  external glDeleteBuffer : vbo:VBO.vbo_id -> unit = "ml_gldeletebuffer"
    "noalloc"
  val glDeleteBuffers : vbos:VBO.vbo_id array -> unit
  type buffer_object_target =
      GL_ARRAY_BUFFER
    | GL_ELEMENT_ARRAY_BUFFER
    | GL_PIXEL_PACK_BUFFER
    | GL_PIXEL_UNPACK_BUFFER
  external glBindBuffer :
    target:VBO.buffer_object_target -> vbo:VBO.vbo_id -> unit
    = "ml_glbindbuffer" "noalloc"
  external glUnbindBuffer : target:VBO.buffer_object_target -> unit
    = "ml_glunbindbuffer" "noalloc"
  type vbo_usage_pattern =
      GL_STREAM_DRAW
    | GL_STREAM_READ
    | GL_STREAM_COPY
    | GL_STATIC_DRAW
    | GL_STATIC_READ
    | GL_STATIC_COPY
    | GL_DYNAMIC_DRAW
    | GL_DYNAMIC_READ
    | GL_DYNAMIC_COPY
  external glBufferData :
    target:VBO.buffer_object_target ->
    size:int ->
    data:('a, 'b, Bigarray.c_layout) Bigarray.Array1.t ->
    usage:VBO.vbo_usage_pattern -> unit = "ml_glbufferdata"
  external glBufferDataNull :
    target:VBO.buffer_object_target ->
    size:int -> usage:VBO.vbo_usage_pattern -> unit = "ml_glbufferdata_null"
  external glBufferSubData :
    target:VBO.buffer_object_target ->
    offset:int ->
    size:int -> data:('a, 'b, Bigarray.c_layout) Bigarray.Array1.t -> unit
    = "ml_glbuffersubdata"
  external elem_size :
    ba:('a, 'b, Bigarray.c_layout) Bigarray.Array1.t -> int
    = "ml_ba_elem_size"
  val ba_sizeof : ba:('a, 'b, Bigarray.c_layout) Bigarray.Array1.t -> int
  type access_policy = GL_READ_ONLY | GL_WRITE_ONLY | GL_READ_WRITE
  type mapped_buffer
  external glMapBufferAbs :
    target:VBO.buffer_object_target ->
    access:VBO.access_policy -> VBO.mapped_buffer = "ml_glmapbuffer_abs"
  external glUnmapBuffer : target:VBO.buffer_object_target -> unit
    = "ml_glunmapbuffer"
  external mapped_buffer_blit :
    VBO.mapped_buffer ->
    (float, Bigarray.float32_elt, Bigarray.c_layout) Bigarray.Array1.t ->
    len:int -> unit = "mapped_buffer_blit"
  external mapped_buffer_blit_ofs :
    VBO.mapped_buffer ->
    (float, Bigarray.float32_elt, Bigarray.c_layout) Bigarray.Array1.t ->
    ofs:int -> len:int -> unit = "mapped_buffer_blit_ofs"
  type bo_param =
      GL_BUFFER_ACCESS
    | GL_BUFFER_MAPPED
    | GL_BUFFER_SIZE
    | GL_BUFFER_USAGE
  external glGetBufferAccess :
    target:VBO.buffer_object_target -> VBO.access_policy
    = "ml_glGetBufferParameter_ACCESS"
  external glGetBufferMapped : target:VBO.buffer_object_target -> bool
    = "ml_glGetBufferParameter_MAPPED"
  external glGetBufferSize : target:VBO.buffer_object_target -> int
    = "ml_glGetBufferParameter_SIZE"
  external glGetBufferUsage :
    target:VBO.buffer_object_target -> VBO.vbo_usage_pattern
    = "ml_glGetBufferParameter_USAGE"
end