sig
  type client_state =
      GL_COLOR_ARRAY
    | GL_EDGE_FLAG_ARRAY
    | GL_FOG_COORD_ARRAY
    | GL_INDEX_ARRAY
    | GL_NORMAL_ARRAY
    | GL_SECONDARY_COLOR_ARRAY
    | GL_TEXTURE_COORD_ARRAY
    | GL_VERTEX_ARRAY
  external glEnableClientState : client_state:VertArray.client_state -> unit
    = "ml_glenableclientstate"
  external glDisableClientState : client_state:VertArray.client_state -> unit
    = "ml_gldisableclientstate"
  external glDrawArrays : mode:GL.primitive -> first:int -> count:int -> unit
    = "ml_gldrawarrays"
  external glMultiDrawArrays : mode:int -> arr:(int * int) array -> unit
    = "ml_glmultidrawarrays"
  external glArrayElement : i:int -> unit = "ml_glarrayelement"
  module Elem :
    sig
      type elem_data_type =
          GL_UNSIGNED_BYTE
        | GL_UNSIGNED_SHORT
        | GL_UNSIGNED_INT
    end
  external glDrawElements :
    mode:GL.primitive ->
    count:int ->
    data_type:VertArray.Elem.elem_data_type ->
    data:('a, 'b, Bigarray.c_layout) Bigarray.Array1.t -> unit
    = "ml_gldrawelements"
  external glDrawRangeElements :
    mode:GL.primitive ->
    start:int ->
    end_:int ->
    count:int ->
    data_type:VertArray.Elem.elem_data_type ->
    data:('a, 'b, Bigarray.c_layout) Bigarray.Array1.t -> unit
    = "ml_gldrawrangeelements_bytecode" "ml_gldrawrangeelements_native"
  type interleaved_format =
      GL_V2F
    | GL_V3F
    | GL_C4UB_V2F
    | GL_C4UB_V3F
    | GL_C3F_V3F
    | GL_N3F_V3F
    | GL_C4F_N3F_V3F
    | GL_T2F_V3F
    | GL_T4F_V4F
    | GL_T2F_C4UB_V3F
    | GL_T2F_C3F_V3F
    | GL_T2F_N3F_V3F
    | GL_T2F_C4F_N3F_V3F
    | GL_T4F_C4F_N3F_V4F
  external glInterleavedArrays :
    fmt:VertArray.interleaved_format ->
    stride:int ->
    pointer:('a, 'b, Bigarray.c_layout) Bigarray.Array1.t -> unit
    = "ml_glinterleavedarrays"
  module Coord :
    sig type coord_data_type = GL_SHORT | GL_INT | GL_FLOAT | GL_DOUBLE end
  external glVertexPointer :
    size:int ->
    data_type:VertArray.Coord.coord_data_type ->
    stride:int -> data:('a, 'b, Bigarray.c_layout) Bigarray.Array1.t -> unit
    = "ml_glvertexpointer"
  external glTexCoordPointer :
    size:int ->
    data_type:VertArray.Coord.coord_data_type ->
    stride:int -> data:('a, 'b, Bigarray.c_layout) Bigarray.Array1.t -> unit
    = "ml_gltexcoordpointer"
  module Norm :
    sig
      type norm_data_type =
          GL_BYTE
        | GL_SHORT
        | GL_INT
        | GL_FLOAT
        | GL_DOUBLE
    end
  external glNormalPointer :
    data_type:VertArray.Norm.norm_data_type ->
    stride:int -> data:('a, 'b, Bigarray.c_layout) Bigarray.Array1.t -> unit
    = "ml_glnormalpointer"
  module Index :
    sig
      type index_data_type =
          GL_UNSIGNED_BYTE
        | GL_SHORT
        | GL_INT
        | GL_FLOAT
        | GL_DOUBLE
    end
  external glIndexPointer :
    data_type:VertArray.Index.index_data_type ->
    stride:int -> data:('a, 'b, Bigarray.c_layout) Bigarray.Array1.t -> unit
    = "ml_glindexpointer"
  module Color :
    sig
      type color_data_type =
          GL_BYTE
        | GL_UNSIGNED_BYTE
        | GL_SHORT
        | GL_UNSIGNED_SHORT
        | GL_INT
        | GL_UNSIGNED_INT
        | GL_FLOAT
        | GL_DOUBLE
    end
  external glColorPointer :
    size:int ->
    data_type:VertArray.Color.color_data_type ->
    stride:int -> data:('a, 'b, Bigarray.c_layout) Bigarray.Array1.t -> unit
    = "ml_glcolorpointer"
  external glEdgeFlagPointer :
    stride:int ->
    data:('a, Bigarray.int8_unsigned_elt, Bigarray.c_layout)
         Bigarray.Array1.t ->
    unit = "ml_gledgeflagpointer"
end