sig
  val accum : op:[ `accum | `add | `load | `mult | `return ] -> float -> unit
  val alpha_func : Gl.cmp_func -> ref:Gl.clampf -> unit
  type sfactor =
      [ `dst_alpha
      | `dst_color
      | `one
      | `one_minus_dst_alpha
      | `one_minus_dst_color
      | `one_minus_src_alpha
      | `src_alpha
      | `src_alpha_saturate
      | `zero ]
  type dfactor =
      [ `dst_alpha
      | `one
      | `one_minus_dst_alpha
      | `one_minus_src_alpha
      | `one_minus_src_color
      | `src_alpha
      | `src_color
      | `zero ]
  val blend_func : src:GlFunc.sfactor -> dst:GlFunc.dfactor -> unit
  val color_mask :
    ?red:bool -> ?green:bool -> ?blue:bool -> ?alpha:bool -> unit -> unit
  val depth_func : Gl.cmp_func -> unit
  val depth_mask : bool -> unit
  val depth_range : near:float -> far:float -> unit
  val index_mask : int -> unit
  val stencil_func : Gl.cmp_func -> ref:int -> mask:int -> unit
  val stencil_mask : int -> unit
  type stencil_op = [ `decr | `incr | `invert | `keep | `replace | `zero ]
  val stencil_op :
    ?fail:GlFunc.stencil_op ->
    ?zfail:GlFunc.stencil_op -> ?zpass:GlFunc.stencil_op -> unit -> unit
  type logic_op =
      [ `And
      | `Or
      | `and_inverted
      | `and_reverse
      | `clear
      | `copy
      | `copy_inverted
      | `equiv
      | `invert
      | `nand
      | `noop
      | `nor
      | `or_inverted
      | `or_reverse
      | `set
      | `xor ]
  val logic_op : GlFunc.logic_op -> unit
  type draw_buffer =
      [ `aux of int
      | `back
      | `back_left
      | `back_right
      | `front
      | `front_and_back
      | `front_left
      | `front_right
      | `left
      | `none
      | `right ]
  val draw_buffer : GlFunc.draw_buffer -> unit
  type read_buffer =
      [ `aux of int
      | `back
      | `back_left
      | `back_right
      | `front
      | `front_left
      | `front_right
      | `left
      | `right ]
  val read_buffer : GlFunc.read_buffer -> unit
end