Provided by: erlang-manpages_20.2.2+dfsg-1ubuntu2_all bug

NAME

       gl -  Standard OpenGL api.

DESCRIPTION

       Standard OpenGL api. See www.khronos.org

       Booleans are represented by integers 0 and 1.

DATA TYPES

         clamp() = float():

           0.0..1.0

         enum() = non_neg_integer():

           See wx/include/gl.hrl

         matrix() = matrix12() | matrix16():

         matrix12() = {float(), float(), float(), float(), float(), float(), float(), float(), float(), float(),
         float(), float()}:

         matrix16() = {float(), float(), float(), float(), float(), float(), float(), float(), float(), float(),
         float(), float(), float(), float(), float(), float()}:

         mem() = binary() | tuple():

           Memory block

         offset() = non_neg_integer():

           Offset in memory block

EXPORTS

       clearIndex(C) -> ok

              Types:

                 C = float()

              Specify the clear value for the color index buffers

              gl:clearIndex  specifies  the  index used by gl:clear/1 to clear the color index buffers. C is not
              clamped. Rather, C is converted to a fixed-point value with unspecified precision to the right  of
              the  binary point. The integer part of this value is then masked with 2 m-1, where m is the number
              of bits in a color index stored in the frame buffer.

              See external documentation.

       clearColor(Red, Green, Blue, Alpha) -> ok

              Types:

                 Red = clamp()
                 Green = clamp()
                 Blue = clamp()
                 Alpha = clamp()

              Specify clear values for the color buffers

              gl:clearColor specifies the red, green, blue, and alpha values used by  gl:clear/1  to  clear  the
              color buffers. Values specified by gl:clearColor are clamped to the range [0 1].

              See external documentation.

       clear(Mask) -> ok

              Types:

                 Mask = integer()

              Clear buffers to preset values

              gl:clear  sets  the  bitplane  area of the window to values previously selected by gl:clearColor ,
              gl:clearDepth, and gl:clearStencil. Multiple  color  buffers  can  be  cleared  simultaneously  by
              selecting more than one buffer at a time using gl:drawBuffer/1 .

              See external documentation.

       indexMask(Mask) -> ok

              Types:

                 Mask = integer()

              Control the writing of individual bits in the color index buffers

              gl:indexMask  controls  the  writing  of  individual  bits  in  the color index buffers. The least
              significant n bits of Mask , where n is the number of bits in a  color  index  buffer,  specify  a
              mask.  Where a 1 (one) appears in the mask, it's possible to write to the corresponding bit in the
              color index buffer (or buffers). Where a  0  (zero)  appears,  the  corresponding  bit  is  write-
              protected.

              See external documentation.

       colorMask(Red, Green, Blue, Alpha) -> ok

              Types:

                 Red = 0 | 1
                 Green = 0 | 1
                 Blue = 0 | 1
                 Alpha = 0 | 1

              Enable and disable writing of frame buffer color components

              gl:colorMask and gl:colorMaski specify whether the individual color components in the frame buffer
              can or cannot be written. gl:colorMaski  sets  the  mask  for  a  specific  draw  buffer,  whereas
              gl:colorMask  sets  the  mask for all draw buffers. If Red is ?GL_FALSE, for example, no change is
              made to the red component of any pixel in any of the color  buffers,  regardless  of  the  drawing
              operation attempted.

              See external documentation.

       alphaFunc(Func, Ref) -> ok

              Types:

                 Func = enum()
                 Ref = clamp()

              Specify the alpha test function

              The  alpha  test  discards  fragments depending on the outcome of a comparison between an incoming
              fragment's alpha value and a constant reference value. gl:alphaFunc specifies the reference  value
              and  the  comparison  function.  The  comparison is performed only if alpha testing is enabled. By
              default, it is not enabled. (See gl:enable/1 and gl:enable/1 of ?GL_ALPHA_TEST.)

              See external documentation.

       blendFunc(Sfactor, Dfactor) -> ok

              Types:

                 Sfactor = enum()
                 Dfactor = enum()

              Specify pixel arithmetic

              Pixels can be drawn using a function that blends the incoming (source) RGBA values with  the  RGBA
              values  that  are  already  in  the  frame  buffer (the destination values). Blending is initially
              disabled. Use gl:enable/1 and gl:enable/1 with argument ?GL_BLEND to enable and disable blending.

              See external documentation.

       logicOp(Opcode) -> ok

              Types:

                 Opcode = enum()

              Specify a logical pixel operation for rendering

              gl:logicOp specifies a logical operation that, when enabled, is applied between the incoming  RGBA
              color  and  the RGBA color at the corresponding location in the frame buffer. To enable or disable
              the  logical  operation,  call  gl:enable/1  and   gl:enable/1   using   the   symbolic   constant
              ?GL_COLOR_LOGIC_OP. The initial value is disabled.

              See external documentation.

       cullFace(Mode) -> ok

              Types:

                 Mode = enum()

              Specify whether front- or back-facing facets can be culled

              gl:cullFace  specifies whether front- or back-facing facets are culled (as specified by mode) when
              facet culling is enabled. Facet culling  is  initially  disabled.  To  enable  and  disable  facet
              culling,  call  the  gl:enable/1  and gl:enable/1 commands with the argument ?GL_CULL_FACE. Facets
              include triangles, quadrilaterals, polygons, and rectangles.

              See external documentation.

       frontFace(Mode) -> ok

              Types:

                 Mode = enum()

              Define front- and back-facing polygons

              In a scene composed entirely of opaque closed surfaces, back-facing polygons  are  never  visible.
              Eliminating  these  invisible polygons has the obvious benefit of speeding up the rendering of the
              image. To enable and disable elimination of back-facing polygons, call gl:enable/1 and gl:enable/1
              with argument ?GL_CULL_FACE.

              See external documentation.

       pointSize(Size) -> ok

              Types:

                 Size = float()

              Specify the diameter of rasterized points

              gl:pointSize  specifies  the  rasterized  diameter  of points. If point size mode is disabled (see
              gl:enable/1 with parameter ?GL_PROGRAM_POINT_SIZE), this value will be used to  rasterize  points.
              Otherwise, the value written to the shading language built-in variable gl_PointSize will be used.

              See external documentation.

       lineWidth(Width) -> ok

              Types:

                 Width = float()

              Specify the width of rasterized lines

              gl:lineWidth  specifies  the  rasterized width of both aliased and antialiased lines. Using a line
              width other than 1 has different effects, depending on whether line antialiasing  is  enabled.  To
              enable   and   disable   line   antialiasing,  call  gl:enable/1  and  gl:enable/1  with  argument
              ?GL_LINE_SMOOTH. Line antialiasing is initially disabled.

              See external documentation.

       lineStipple(Factor, Pattern) -> ok

              Types:

                 Factor = integer()
                 Pattern = integer()

              Specify the line stipple pattern

              Line stippling masks out certain fragments produced by rasterization; those fragments will not  be
              drawn.  The masking is achieved by using three parameters: the 16-bit line stipple pattern Pattern
              , the repeat count Factor , and an integer stipple counter s.

              See external documentation.

       polygonMode(Face, Mode) -> ok

              Types:

                 Face = enum()
                 Mode = enum()

              Select a polygon rasterization mode

              gl:polygonMode controls the interpretation of polygons for  rasterization.  Face  describes  which
              polygons  Mode  applies to: both front and back-facing polygons (?GL_FRONT_AND_BACK ). The polygon
              mode affects only the final rasterization of polygons. In particular, a polygon's vertices are lit
              and the polygon is clipped and possibly culled before these modes are applied.

              See external documentation.

       polygonOffset(Factor, Units) -> ok

              Types:

                 Factor = float()
                 Units = float()

              Set the scale and units used to calculate depth values

              When  ?GL_POLYGON_OFFSET_FILL,  ?GL_POLYGON_OFFSET_LINE,  or  ?GL_POLYGON_OFFSET_POINT is enabled,
              each fragment's depth value will be offset after it is interpolated from the depth values  of  the
              appropriate  vertices.  The value of the offset is factor×DZ+r×units, where DZ is a measurement of
              the change in depth relative to the screen area of the polygon, and r is the smallest  value  that
              is  guaranteed  to  produce  a  resolvable  offset for a given implementation. The offset is added
              before the depth test is performed and before the value is written into the depth buffer.

              See external documentation.

       polygonStipple(Mask) -> ok

              Types:

                 Mask = binary()

              Set the polygon stippling pattern

              Polygon stippling, like line stippling  (see  gl:lineStipple/2  ),  masks  out  certain  fragments
              produced by rasterization, creating a pattern. Stippling is independent of polygon antialiasing.

              See external documentation.

       getPolygonStipple() -> binary()

              Return the polygon stipple pattern

              gl:getPolygonStipple  returns  to  Pattern  a 32×32 polygon stipple pattern. The pattern is packed
              into memory as if gl:readPixels/7 with both height and width of 32, type of ?GL_BITMAP, and format
              of  ?GL_COLOR_INDEX  were  called,  and the stipple pattern were stored in an internal 32×32 color
              index buffer. Unlike gl:readPixels/7 , however, pixel transfer operations  (shift,  offset,  pixel
              map) are not applied to the returned stipple image.

              See external documentation.

       edgeFlag(Flag) -> ok

              Types:

                 Flag = 0 | 1

              Flag edges as either boundary or nonboundary

              Each  vertex  of  a  polygon,  separate  triangle,  or  separate quadrilateral specified between a
              gl:'begin'/1 / gl:'begin'/1 pair is marked as the start of either a boundary or nonboundary  edge.
              If  the  current edge flag is true when the vertex is specified, the vertex is marked as the start
              of a boundary edge. Otherwise,  the  vertex  is  marked  as  the  start  of  a  nonboundary  edge.
              gl:edgeFlag sets the edge flag bit to ?GL_TRUE if Flag is ?GL_TRUE and to ?GL_FALSE otherwise.

              See external documentation.

       edgeFlagv(Flag) -> ok

              Types:

                 Flag = {Flag::0 | 1}

              Equivalent to edgeFlag(Flag).

       scissor(X, Y, Width, Height) -> ok

              Types:

                 X = integer()
                 Y = integer()
                 Width = integer()
                 Height = integer()

              Define the scissor box

              gl:scissor  defines  a  rectangle,  called  the  scissor box, in window coordinates. The first two
              arguments, X and Y , specify the lower left corner of the box. Width and Height specify the  width
              and height of the box.

              See external documentation.

       clipPlane(Plane, Equation) -> ok

              Types:

                 Plane = enum()
                 Equation = {float(), float(), float(), float()}

              Specify a plane against which all geometry is clipped

              Geometry  is  always  clipped  against  the  boundaries  of  a  six-plane frustum in x, y , and z.
              gl:clipPlane allows the specification of additional planes, not necessarily perpendicular  to  the
              x,  y,  or  z  axis,  against  which  all  geometry is clipped. To determine the maximum number of
              additional  clipping  planes,  call  gl:getBooleanv/1  with  argument   ?GL_MAX_CLIP_PLANES.   All
              implementations  support  at least six such clipping planes. Because the resulting clipping region
              is the intersection of the defined half-spaces, it is always convex.

              See external documentation.

       getClipPlane(Plane) -> {float(), float(), float(), float()}

              Types:

                 Plane = enum()

              Return the coefficients of the specified clipping plane

              gl:getClipPlane returns in Equation the four coefficients of the plane equation for Plane .

              See external documentation.

       drawBuffer(Mode) -> ok

              Types:

                 Mode = enum()

              Specify which color buffers are to be drawn into

              When colors are written to the frame buffer, they are written into the color buffers specified  by
              gl:drawBuffer. The specifications are as follows:

              See external documentation.

       readBuffer(Mode) -> ok

              Types:

                 Mode = enum()

              Select a color buffer source for pixels

              gl:readBuffer   specifies   a  color  buffer  as  the  source  for  subsequent  gl:readPixels/7  ,
              gl:copyTexImage1D/7 , gl:copyTexImage2D/8 , gl:copyTexSubImage1D/6 , gl:copyTexSubImage2D/8 ,  and
              gl:copyTexSubImage3D/9  commands. Mode accepts one of twelve or more predefined values. In a fully
              configured system, ?GL_FRONT, ?GL_LEFT,  and  ?GL_FRONT_LEFT  all  name  the  front  left  buffer,
              ?GL_FRONT_RIGHT and ?GL_RIGHT name the front right buffer, and ?GL_BACK_LEFT and ?GL_BACK name the
              back left buffer. Further more, the constants ?GL_COLOR_ATTACHMENTi may be used  to  indicate  the
              ith color attachment where i ranges from zero to the value of ?GL_MAX_COLOR_ATTACHMENTS minus one.

              See external documentation.

       enable(Cap) -> ok

              Types:

                 Cap = enum()

              Enable or disable server-side GL capabilities

              gl:enable  and  gl:enable/1  enable  and  disable  various  capabilities.  Use  gl:isEnabled/1  or
              gl:getBooleanv/1 to determine the current setting of any capability. The initial  value  for  each
              capability  with  the  exception of ?GL_DITHER and ?GL_MULTISAMPLE is ?GL_FALSE. The initial value
              for ?GL_DITHER and ?GL_MULTISAMPLE is ?GL_TRUE.

              See external documentation.

       disable(Cap) -> ok

              Types:

                 Cap = enum()

              See enable/1

       isEnabled(Cap) -> 0 | 1

              Types:

                 Cap = enum()

              Test whether a capability is enabled

              gl:isEnabled returns ?GL_TRUE if Cap is an enabled capability  and  returns  ?GL_FALSE  otherwise.
              Boolean  states  that  are  indexed  may  be  tested with gl:isEnabledi . For gl:isEnabledi, Index
              specifies the index of the capability to test. Index must be between zero and the count of indexed
              capabilities  for  Cap  . Initially all capabilities except ?GL_DITHER are disabled; ?GL_DITHER is
              initially enabled.

              See external documentation.

       enableClientState(Cap) -> ok

              Types:

                 Cap = enum()

              Enable or disable client-side capability

              gl:enableClientState  and  gl:enableClientState/1  enable  or   disable   individual   client-side
              capabilities. By default, all client-side capabilities are disabled. Both gl:enableClientState and
              gl:enableClientState/1 take a single argument, Cap , which can assume one of the following values:

              See external documentation.

       disableClientState(Cap) -> ok

              Types:

                 Cap = enum()

              See enableClientState/1

       getBooleanv(Pname) -> [0 | 1]

              Types:

                 Pname = enum()

              Return the value or values of a selected parameter

              These four commands return values for simple state variables in GL. Pname is a  symbolic  constant
              indicating the state variable to be returned, and Params is a pointer to an array of the indicated
              type in which to place the returned data.

              See external documentation.

       getDoublev(Pname) -> [float()]

              Types:

                 Pname = enum()

              See getBooleanv/1

       getFloatv(Pname) -> [float()]

              Types:

                 Pname = enum()

              See getBooleanv/1

       getIntegerv(Pname) -> [integer()]

              Types:

                 Pname = enum()

              See getBooleanv/1

       pushAttrib(Mask) -> ok

              Types:

                 Mask = integer()

              Push and pop the server attribute stack

              gl:pushAttrib takes one argument, a mask that indicates which groups of state variables to save on
              the  attribute  stack.  Symbolic  constants  are  used  to set bits in the mask. Mask is typically
              constructed by specifying the bitwise-or of several of these constants together. The special  mask
              ?GL_ALL_ATTRIB_BITS can be used to save all stackable states.

              See external documentation.

       popAttrib() -> ok

              See pushAttrib/1

       pushClientAttrib(Mask) -> ok

              Types:

                 Mask = integer()

              Push and pop the client attribute stack

              gl:pushClientAttrib  takes  one  argument,  a  mask  that  indicates  which groups of client-state
              variables to save on the client attribute stack. Symbolic constants are used to set  bits  in  the
              mask.  Mask  is  typically  constructed by specifying the bitwise-or of several of these constants
              together. The special mask ?GL_CLIENT_ALL_ATTRIB_BITS can be used to  save  all  stackable  client
              state.

              See external documentation.

       popClientAttrib() -> ok

              See pushClientAttrib/1

       renderMode(Mode) -> integer()

              Types:

                 Mode = enum()

              Set rasterization mode

              gl:renderMode  sets  the rasterization mode. It takes one argument, Mode , which can assume one of
              three predefined values:

              See external documentation.

       getError() -> enum()

              Return error information

              gl:getError returns the value of the error flag. Each detectable error is assigned a numeric  code
              and  symbolic  name.  When  an  error  occurs, the error flag is set to the appropriate error code
              value. No other errors are recorded until gl:getError is called, the error code is  returned,  and
              the  flag  is reset to ?GL_NO_ERROR. If a call to gl:getError returns ?GL_NO_ERROR, there has been
              no detectable error since the last call to gl:getError , or since the GL was initialized.

              See external documentation.

       getString(Name) -> string()

              Types:

                 Name = enum()

              Return a string describing the current GL connection

              gl:getString returns a pointer to a static  string  describing  some  aspect  of  the  current  GL
              connection. Name can be one of the following:

              See external documentation.

       finish() -> ok

              Block until all GL execution is complete

              gl:finish  does  not  return  until the effects of all previously called GL commands are complete.
              Such effects include all changes to GL state, all changes to connection state, and all changes  to
              the frame buffer contents.

              See external documentation.

       flush() -> ok

              Force execution of GL commands in finite time

              Different  GL  implementations  buffer  commands in several different locations, including network
              buffers and the graphics accelerator itself. gl:flush empties all of these  buffers,  causing  all
              issued  commands  to  be  executed as quickly as they are accepted by the actual rendering engine.
              Though this execution may not be completed in any particular time  period,  it  does  complete  in
              finite time.

              See external documentation.

       hint(Target, Mode) -> ok

              Types:

                 Target = enum()
                 Mode = enum()

              Specify implementation-specific hints

              Certain  aspects  of  GL  behavior,  when there is room for interpretation, can be controlled with
              hints. A hint is specified with two arguments.  Target  is  a  symbolic  constant  indicating  the
              behavior  to be controlled, and Mode is another symbolic constant indicating the desired behavior.
              The initial value for each Target is ?GL_DONT_CARE . Mode can be one of the following:

              See external documentation.

       clearDepth(Depth) -> ok

              Types:

                 Depth = clamp()

              Specify the clear value for the depth buffer

              gl:clearDepth specifies the depth value used by gl:clear/1  to  clear  the  depth  buffer.  Values
              specified by gl:clearDepth are clamped to the range [0 1].

              See external documentation.

       depthFunc(Func) -> ok

              Types:

                 Func = enum()

              Specify the value used for depth buffer comparisons

              gl:depthFunc specifies the function used to compare each incoming pixel depth value with the depth
              value present in the depth buffer. The comparison is performed only if depth testing  is  enabled.
              (See gl:enable/1 and gl:enable/1 of ?GL_DEPTH_TEST .)

              See external documentation.

       depthMask(Flag) -> ok

              Types:

                 Flag = 0 | 1

              Enable or disable writing into the depth buffer

              gl:depthMask  specifies  whether  the  depth  buffer is enabled for writing. If Flag is ?GL_FALSE,
              depth buffer writing is disabled. Otherwise, it is enabled. Initially,  depth  buffer  writing  is
              enabled.

              See external documentation.

       depthRange(Near_val, Far_val) -> ok

              Types:

                 Near_val = clamp()
                 Far_val = clamp()

              Specify mapping of depth values from normalized device coordinates to window coordinates

              After  clipping and division by w, depth coordinates range from -1 to 1, corresponding to the near
              and far clipping planes.  gl:depthRange  specifies  a  linear  mapping  of  the  normalized  depth
              coordinates  in  this  range  to  window  depth coordinates. Regardless of the actual depth buffer
              implementation, window coordinate depth values are treated as though they range from 0  through  1
              (like color components). Thus, the values accepted by gl:depthRange are both clamped to this range
              before they are accepted.

              See external documentation.

       clearAccum(Red, Green, Blue, Alpha) -> ok

              Types:

                 Red = float()
                 Green = float()
                 Blue = float()
                 Alpha = float()

              Specify clear values for the accumulation buffer

              gl:clearAccum specifies the red, green, blue, and alpha values used by  gl:clear/1  to  clear  the
              accumulation buffer.

              See external documentation.

       accum(Op, Value) -> ok

              Types:

                 Op = enum()
                 Value = float()

              Operate on the accumulation buffer

              The  accumulation  buffer  is  an  extended-range  color  buffer. Images are not rendered into it.
              Rather, images rendered into  one  of  the  color  buffers  are  added  to  the  contents  of  the
              accumulation  buffer  after  rendering.  Effects  such  as  antialiasing  (of  points,  lines, and
              polygons), motion blur, and depth of field can be created by accumulating  images  generated  with
              different transformation matrices.

              See external documentation.

       matrixMode(Mode) -> ok

              Types:

                 Mode = enum()

              Specify which matrix is the current matrix

              gl:matrixMode sets the current matrix mode. Mode can assume one of four values:

              See external documentation.

       ortho(Left, Right, Bottom, Top, Near_val, Far_val) -> ok

              Types:

                 Left = float()
                 Right = float()
                 Bottom = float()
                 Top = float()
                 Near_val = float()
                 Far_val = float()

              Multiply the current matrix with an orthographic matrix

              gl:ortho  describes  a transformation that produces a parallel projection. The current matrix (see
              gl:matrixMode/1 ) is multiplied by this matrix and the result replaces the current matrix,  as  if
              gl:multMatrixd/1 were called with the following matrix as its argument:

              See external documentation.

       frustum(Left, Right, Bottom, Top, Near_val, Far_val) -> ok

              Types:

                 Left = float()
                 Right = float()
                 Bottom = float()
                 Top = float()
                 Near_val = float()
                 Far_val = float()

              Multiply the current matrix by a perspective matrix

              gl:frustum  describes  a  perspective  matrix  that produces a perspective projection. The current
              matrix (see gl:matrixMode/1 ) is multiplied by this matrix and the  result  replaces  the  current
              matrix, as if gl:multMatrixd/1 were called with the following matrix as its argument:

              See external documentation.

       viewport(X, Y, Width, Height) -> ok

              Types:

                 X = integer()
                 Y = integer()
                 Width = integer()
                 Height = integer()

              Set the viewport

              gl:viewport  specifies  the affine transformation of x and y from normalized device coordinates to
              window coordinates. Let (x nd y nd) be normalized device coordinates. Then the window  coordinates
              (x w y w) are computed as follows:

              See external documentation.

       pushMatrix() -> ok

              Push and pop the current matrix stack

              There  is a stack of matrices for each of the matrix modes. In ?GL_MODELVIEW mode, the stack depth
              is at least 32. In the other modes, ?GL_COLOR, ?GL_PROJECTION , and ?GL_TEXTURE, the depth  is  at
              least 2. The current matrix in any mode is the matrix on the top of the stack for that mode.

              See external documentation.

       popMatrix() -> ok

              See pushMatrix/0

       loadIdentity() -> ok

              Replace the current matrix with the identity matrix

              gl:loadIdentity  replaces  the  current  matrix  with  the  identity  matrix.  It  is semantically
              equivalent to calling gl:loadMatrixd/1 with the identity matrix

              See external documentation.

       loadMatrixd(M) -> ok

              Types:

                 M = matrix()

              Replace the current matrix with the specified matrix

              gl:loadMatrix replaces the current matrix with the one whose elements are specified  by  M  .  The
              current  matrix  is  the  projection matrix, modelview matrix, or texture matrix, depending on the
              current matrix mode (see gl:matrixMode/1 ).

              See external documentation.

       loadMatrixf(M) -> ok

              Types:

                 M = matrix()

              See loadMatrixd/1

       multMatrixd(M) -> ok

              Types:

                 M = matrix()

              Multiply the current matrix with the specified matrix

              gl:multMatrix multiplies the current matrix with the one specified using  M  ,  and  replaces  the
              current matrix with the product.

              See external documentation.

       multMatrixf(M) -> ok

              Types:

                 M = matrix()

              See multMatrixd/1

       rotated(Angle, X, Y, Z) -> ok

              Types:

                 Angle = float()
                 X = float()
                 Y = float()
                 Z = float()

              Multiply the current matrix by a rotation matrix

              gl:rotate  produces a rotation of Angle degrees around the vector (x y z). The current matrix (see
              gl:matrixMode/1 ) is multiplied by a rotation  matrix  with  the  product  replacing  the  current
              matrix, as if gl:multMatrixd/1 were called with the following matrix as its argument:

              See external documentation.

       rotatef(Angle, X, Y, Z) -> ok

              Types:

                 Angle = float()
                 X = float()
                 Y = float()
                 Z = float()

              See rotated/4

       scaled(X, Y, Z) -> ok

              Types:

                 X = float()
                 Y = float()
                 Z = float()

              Multiply the current matrix by a general scaling matrix

              gl:scale  produces  a nonuniform scaling along the x, y, and z axes. The three parameters indicate
              the desired scale factor along each of the three axes.

              See external documentation.

       scalef(X, Y, Z) -> ok

              Types:

                 X = float()
                 Y = float()
                 Z = float()

              See scaled/3

       translated(X, Y, Z) -> ok

              Types:

                 X = float()
                 Y = float()
                 Z = float()

              Multiply the current matrix by a translation matrix

              gl:translate produces a translation by (x y z). The  current  matrix  (see  gl:matrixMode/1  )  is
              multiplied  by  this  translation  matrix,  with  the  product replacing the current matrix, as if
              gl:multMatrixd/1 were called with the following matrix for its argument:

              See external documentation.

       translatef(X, Y, Z) -> ok

              Types:

                 X = float()
                 Y = float()
                 Z = float()

              See translated/3

       isList(List) -> 0 | 1

              Types:

                 List = integer()

              Determine if a name corresponds to a display list

              gl:isList returns ?GL_TRUE if List is the name of a display list and returns ?GL_FALSE  if  it  is
              not, or if an error occurs.

              See external documentation.

       deleteLists(List, Range) -> ok

              Types:

                 List = integer()
                 Range = integer()

              Delete a contiguous group of display lists

              gl:deleteLists  causes  a contiguous group of display lists to be deleted. List is the name of the
              first display list to be deleted, and Range is the number of display lists to delete. All  display
              lists d with list<= d<= list+range-1 are deleted.

              See external documentation.

       genLists(Range) -> integer()

              Types:

                 Range = integer()

              Generate a contiguous set of empty display lists

              gl:genLists  has  one  argument,  Range . It returns an integer n such that Range contiguous empty
              display lists, named n, n+1, ..., n+range-1, are created. If Range is 0, if there is no  group  of
              Range  contiguous  names  available, or if any error is generated, no display lists are generated,
              and 0 is returned.

              See external documentation.

       newList(List, Mode) -> ok

              Types:

                 List = integer()
                 Mode = enum()

              Create or replace a display list

              Display lists are groups of GL commands that have been stored for  subsequent  execution.  Display
              lists  are created with gl:newList. All subsequent commands are placed in the display list, in the
              order issued, until gl:endList/0 is called.

              See external documentation.

       endList() -> ok

              glBeginList

              See external documentation.

       callList(List) -> ok

              Types:

                 List = integer()

              Execute a display list

              gl:callList causes the named display list to be executed. The commands saved in the  display  list
              are  executed  in order, just as if they were called without using a display list. If List has not
              been defined as a display list, gl:callList is ignored.

              See external documentation.

       callLists(Lists) -> ok

              Types:

                 Lists = [integer()]

              Execute a list of display lists

              gl:callLists causes each display list in the list of names passed as Lists to be  executed.  As  a
              result, the commands saved in each display list are executed in order, just as if they were called
              without using a display list. Names of display lists that have not been defined are ignored.

              See external documentation.

       listBase(Base) -> ok

              Types:

                 Base = integer()

              set the display-list base for

              gl:callLists/1

              gl:callLists/1 specifies an array of offsets. Display-list names are generated by adding  Base  to
              each offset. Names that reference valid display lists are executed; the others are ignored.

              See external documentation.

       begin(Mode) -> ok

              Types:

                 Mode = enum()

              Delimit the vertices of a primitive or a group of like primitives

              gl:'begin'  and  gl:'begin'/1  delimit  the  vertices  that  define a primitive or a group of like
              primitives. gl:'begin' accepts a single argument that specifies in which of ten ways the  vertices
              are  interpreted.  Taking  n  as  an  integer  count starting at one, and N as the total number of
              vertices specified, the interpretations are as follows:

              See external documentation.

       end() -> ok

              See 'begin'/1

       vertex2d(X, Y) -> ok

              Types:

                 X = float()
                 Y = float()

              Specify a vertex

              gl:vertex commands are used within gl:'begin'/1 / gl:'begin'/1 pairs to specify point,  line,  and
              polygon  vertices.  The  current  color,  normal,  texture  coordinates,  and  fog  coordinate are
              associated with the vertex when gl:vertex is called.

              See external documentation.

       vertex2f(X, Y) -> ok

              Types:

                 X = float()
                 Y = float()

              See vertex2d/2

       vertex2i(X, Y) -> ok

              Types:

                 X = integer()
                 Y = integer()

              See vertex2d/2

       vertex2s(X, Y) -> ok

              Types:

                 X = integer()
                 Y = integer()

              See vertex2d/2

       vertex3d(X, Y, Z) -> ok

              Types:

                 X = float()
                 Y = float()
                 Z = float()

              See vertex2d/2

       vertex3f(X, Y, Z) -> ok

              Types:

                 X = float()
                 Y = float()
                 Z = float()

              See vertex2d/2

       vertex3i(X, Y, Z) -> ok

              Types:

                 X = integer()
                 Y = integer()
                 Z = integer()

              See vertex2d/2

       vertex3s(X, Y, Z) -> ok

              Types:

                 X = integer()
                 Y = integer()
                 Z = integer()

              See vertex2d/2

       vertex4d(X, Y, Z, W) -> ok

              Types:

                 X = float()
                 Y = float()
                 Z = float()
                 W = float()

              See vertex2d/2

       vertex4f(X, Y, Z, W) -> ok

              Types:

                 X = float()
                 Y = float()
                 Z = float()
                 W = float()

              See vertex2d/2

       vertex4i(X, Y, Z, W) -> ok

              Types:

                 X = integer()
                 Y = integer()
                 Z = integer()
                 W = integer()

              See vertex2d/2

       vertex4s(X, Y, Z, W) -> ok

              Types:

                 X = integer()
                 Y = integer()
                 Z = integer()
                 W = integer()

              See vertex2d/2

       vertex2dv(V) -> ok

              Types:

                 V = {X::float(), Y::float()}

              Equivalent to vertex2d(X, Y).

       vertex2fv(V) -> ok

              Types:

                 V = {X::float(), Y::float()}

              Equivalent to vertex2f(X, Y).

       vertex2iv(V) -> ok

              Types:

                 V = {X::integer(), Y::integer()}

              Equivalent to vertex2i(X, Y).

       vertex2sv(V) -> ok

              Types:

                 V = {X::integer(), Y::integer()}

              Equivalent to vertex2s(X, Y).

       vertex3dv(V) -> ok

              Types:

                 V = {X::float(), Y::float(), Z::float()}

              Equivalent to vertex3d(X, Y, Z).

       vertex3fv(V) -> ok

              Types:

                 V = {X::float(), Y::float(), Z::float()}

              Equivalent to vertex3f(X, Y, Z).

       vertex3iv(V) -> ok

              Types:

                 V = {X::integer(), Y::integer(), Z::integer()}

              Equivalent to vertex3i(X, Y, Z).

       vertex3sv(V) -> ok

              Types:

                 V = {X::integer(), Y::integer(), Z::integer()}

              Equivalent to vertex3s(X, Y, Z).

       vertex4dv(V) -> ok

              Types:

                 V = {X::float(), Y::float(), Z::float(), W::float()}

              Equivalent to vertex4d(X, Y, Z, W).

       vertex4fv(V) -> ok

              Types:

                 V = {X::float(), Y::float(), Z::float(), W::float()}

              Equivalent to vertex4f(X, Y, Z, W).

       vertex4iv(V) -> ok

              Types:

                 V = {X::integer(), Y::integer(), Z::integer(), W::integer()}

              Equivalent to vertex4i(X, Y, Z, W).

       vertex4sv(V) -> ok

              Types:

                 V = {X::integer(), Y::integer(), Z::integer(), W::integer()}

              Equivalent to vertex4s(X, Y, Z, W).

       normal3b(Nx, Ny, Nz) -> ok

              Types:

                 Nx = integer()
                 Ny = integer()
                 Nz = integer()

              Set the current normal vector

              The current normal is set to the given coordinates whenever gl:normal is issued. Byte,  short,  or
              integer  arguments are converted to floating-point format with a linear mapping that maps the most
              positive representable integer value to 1.0 and the most negative representable integer  value  to
              -1.0.

              See external documentation.

       normal3d(Nx, Ny, Nz) -> ok

              Types:

                 Nx = float()
                 Ny = float()
                 Nz = float()

              See normal3b/3

       normal3f(Nx, Ny, Nz) -> ok

              Types:

                 Nx = float()
                 Ny = float()
                 Nz = float()

              See normal3b/3

       normal3i(Nx, Ny, Nz) -> ok

              Types:

                 Nx = integer()
                 Ny = integer()
                 Nz = integer()

              See normal3b/3

       normal3s(Nx, Ny, Nz) -> ok

              Types:

                 Nx = integer()
                 Ny = integer()
                 Nz = integer()

              See normal3b/3

       normal3bv(V) -> ok

              Types:

                 V = {Nx::integer(), Ny::integer(), Nz::integer()}

              Equivalent to normal3b(Nx, Ny, Nz).

       normal3dv(V) -> ok

              Types:

                 V = {Nx::float(), Ny::float(), Nz::float()}

              Equivalent to normal3d(Nx, Ny, Nz).

       normal3fv(V) -> ok

              Types:

                 V = {Nx::float(), Ny::float(), Nz::float()}

              Equivalent to normal3f(Nx, Ny, Nz).

       normal3iv(V) -> ok

              Types:

                 V = {Nx::integer(), Ny::integer(), Nz::integer()}

              Equivalent to normal3i(Nx, Ny, Nz).

       normal3sv(V) -> ok

              Types:

                 V = {Nx::integer(), Ny::integer(), Nz::integer()}

              Equivalent to normal3s(Nx, Ny, Nz).

       indexd(C) -> ok

              Types:

                 C = float()

              Set the current color index

              gl:index updates the current (single-valued) color index. It takes one argument, the new value for
              the current color index.

              See external documentation.

       indexf(C) -> ok

              Types:

                 C = float()

              See indexd/1

       indexi(C) -> ok

              Types:

                 C = integer()

              See indexd/1

       indexs(C) -> ok

              Types:

                 C = integer()

              See indexd/1

       indexub(C) -> ok

              Types:

                 C = integer()

              See indexd/1

       indexdv(C) -> ok

              Types:

                 C = {C::float()}

              Equivalent to indexd(C).

       indexfv(C) -> ok

              Types:

                 C = {C::float()}

              Equivalent to indexf(C).

       indexiv(C) -> ok

              Types:

                 C = {C::integer()}

              Equivalent to indexi(C).

       indexsv(C) -> ok

              Types:

                 C = {C::integer()}

              Equivalent to indexs(C).

       indexubv(C) -> ok

              Types:

                 C = {C::integer()}

              Equivalent to indexub(C).

       color3b(Red, Green, Blue) -> ok

              Types:

                 Red = integer()
                 Green = integer()
                 Blue = integer()

              Set the current color

              The GL stores both a current single-valued color index  and  a  current  four-valued  RGBA  color.
              gl:color  sets  a  new  four-valued  RGBA  color.  gl:color  has two major variants: gl:color3 and
              gl:color4. gl:color3 variants specify new red, green, and  blue  values  explicitly  and  set  the
              current  alpha value to 1.0 (full intensity) implicitly. gl:color4 variants specify all four color
              components explicitly.

              See external documentation.

       color3d(Red, Green, Blue) -> ok

              Types:

                 Red = float()
                 Green = float()
                 Blue = float()

              See color3b/3

       color3f(Red, Green, Blue) -> ok

              Types:

                 Red = float()
                 Green = float()
                 Blue = float()

              See color3b/3

       color3i(Red, Green, Blue) -> ok

              Types:

                 Red = integer()
                 Green = integer()
                 Blue = integer()

              See color3b/3

       color3s(Red, Green, Blue) -> ok

              Types:

                 Red = integer()
                 Green = integer()
                 Blue = integer()

              See color3b/3

       color3ub(Red, Green, Blue) -> ok

              Types:

                 Red = integer()
                 Green = integer()
                 Blue = integer()

              See color3b/3

       color3ui(Red, Green, Blue) -> ok

              Types:

                 Red = integer()
                 Green = integer()
                 Blue = integer()

              See color3b/3

       color3us(Red, Green, Blue) -> ok

              Types:

                 Red = integer()
                 Green = integer()
                 Blue = integer()

              See color3b/3

       color4b(Red, Green, Blue, Alpha) -> ok

              Types:

                 Red = integer()
                 Green = integer()
                 Blue = integer()
                 Alpha = integer()

              See color3b/3

       color4d(Red, Green, Blue, Alpha) -> ok

              Types:

                 Red = float()
                 Green = float()
                 Blue = float()
                 Alpha = float()

              See color3b/3

       color4f(Red, Green, Blue, Alpha) -> ok

              Types:

                 Red = float()
                 Green = float()
                 Blue = float()
                 Alpha = float()

              See color3b/3

       color4i(Red, Green, Blue, Alpha) -> ok

              Types:

                 Red = integer()
                 Green = integer()
                 Blue = integer()
                 Alpha = integer()

              See color3b/3

       color4s(Red, Green, Blue, Alpha) -> ok

              Types:

                 Red = integer()
                 Green = integer()
                 Blue = integer()
                 Alpha = integer()

              See color3b/3

       color4ub(Red, Green, Blue, Alpha) -> ok

              Types:

                 Red = integer()
                 Green = integer()
                 Blue = integer()
                 Alpha = integer()

              See color3b/3

       color4ui(Red, Green, Blue, Alpha) -> ok

              Types:

                 Red = integer()
                 Green = integer()
                 Blue = integer()
                 Alpha = integer()

              See color3b/3

       color4us(Red, Green, Blue, Alpha) -> ok

              Types:

                 Red = integer()
                 Green = integer()
                 Blue = integer()
                 Alpha = integer()

              See color3b/3

       color3bv(V) -> ok

              Types:

                 V = {Red::integer(), Green::integer(), Blue::integer()}

              Equivalent to color3b(Red, Green, Blue).

       color3dv(V) -> ok

              Types:

                 V = {Red::float(), Green::float(), Blue::float()}

              Equivalent to color3d(Red, Green, Blue).

       color3fv(V) -> ok

              Types:

                 V = {Red::float(), Green::float(), Blue::float()}

              Equivalent to color3f(Red, Green, Blue).

       color3iv(V) -> ok

              Types:

                 V = {Red::integer(), Green::integer(), Blue::integer()}

              Equivalent to color3i(Red, Green, Blue).

       color3sv(V) -> ok

              Types:

                 V = {Red::integer(), Green::integer(), Blue::integer()}

              Equivalent to color3s(Red, Green, Blue).

       color3ubv(V) -> ok

              Types:

                 V = {Red::integer(), Green::integer(), Blue::integer()}

              Equivalent to color3ub(Red, Green, Blue).

       color3uiv(V) -> ok

              Types:

                 V = {Red::integer(), Green::integer(), Blue::integer()}

              Equivalent to color3ui(Red, Green, Blue).

       color3usv(V) -> ok

              Types:

                 V = {Red::integer(), Green::integer(), Blue::integer()}

              Equivalent to color3us(Red, Green, Blue).

       color4bv(V) -> ok

              Types:

                 V = {Red::integer(), Green::integer(), Blue::integer(), Alpha::integer()}

              Equivalent to color4b(Red, Green, Blue, Alpha).

       color4dv(V) -> ok

              Types:

                 V = {Red::float(), Green::float(), Blue::float(), Alpha::float()}

              Equivalent to color4d(Red, Green, Blue, Alpha).

       color4fv(V) -> ok

              Types:

                 V = {Red::float(), Green::float(), Blue::float(), Alpha::float()}

              Equivalent to color4f(Red, Green, Blue, Alpha).

       color4iv(V) -> ok

              Types:

                 V = {Red::integer(), Green::integer(), Blue::integer(), Alpha::integer()}

              Equivalent to color4i(Red, Green, Blue, Alpha).

       color4sv(V) -> ok

              Types:

                 V = {Red::integer(), Green::integer(), Blue::integer(), Alpha::integer()}

              Equivalent to color4s(Red, Green, Blue, Alpha).

       color4ubv(V) -> ok

              Types:

                 V = {Red::integer(), Green::integer(), Blue::integer(), Alpha::integer()}

              Equivalent to color4ub(Red, Green, Blue, Alpha).

       color4uiv(V) -> ok

              Types:

                 V = {Red::integer(), Green::integer(), Blue::integer(), Alpha::integer()}

              Equivalent to color4ui(Red, Green, Blue, Alpha).

       color4usv(V) -> ok

              Types:

                 V = {Red::integer(), Green::integer(), Blue::integer(), Alpha::integer()}

              Equivalent to color4us(Red, Green, Blue, Alpha).

       texCoord1d(S) -> ok

              Types:

                 S = float()

              Set the current texture coordinates

              gl:texCoord specifies texture coordinates in one, two, three,  or  four  dimensions.  gl:texCoord1
              sets  the current texture coordinates to (s 0 0 1); a call to gl:texCoord2 sets them to (s t 0 1).
              Similarly, gl:texCoord3 specifies the texture coordinates as (s t r 1), and  gl:texCoord4  defines
              all four components explicitly as (s t r q).

              See external documentation.

       texCoord1f(S) -> ok

              Types:

                 S = float()

              See texCoord1d/1

       texCoord1i(S) -> ok

              Types:

                 S = integer()

              See texCoord1d/1

       texCoord1s(S) -> ok

              Types:

                 S = integer()

              See texCoord1d/1

       texCoord2d(S, T) -> ok

              Types:

                 S = float()
                 T = float()

              See texCoord1d/1

       texCoord2f(S, T) -> ok

              Types:

                 S = float()
                 T = float()

              See texCoord1d/1

       texCoord2i(S, T) -> ok

              Types:

                 S = integer()
                 T = integer()

              See texCoord1d/1

       texCoord2s(S, T) -> ok

              Types:

                 S = integer()
                 T = integer()

              See texCoord1d/1

       texCoord3d(S, T, R) -> ok

              Types:

                 S = float()
                 T = float()
                 R = float()

              See texCoord1d/1

       texCoord3f(S, T, R) -> ok

              Types:

                 S = float()
                 T = float()
                 R = float()

              See texCoord1d/1

       texCoord3i(S, T, R) -> ok

              Types:

                 S = integer()
                 T = integer()
                 R = integer()

              See texCoord1d/1

       texCoord3s(S, T, R) -> ok

              Types:

                 S = integer()
                 T = integer()
                 R = integer()

              See texCoord1d/1

       texCoord4d(S, T, R, Q) -> ok

              Types:

                 S = float()
                 T = float()
                 R = float()
                 Q = float()

              See texCoord1d/1

       texCoord4f(S, T, R, Q) -> ok

              Types:

                 S = float()
                 T = float()
                 R = float()
                 Q = float()

              See texCoord1d/1

       texCoord4i(S, T, R, Q) -> ok

              Types:

                 S = integer()
                 T = integer()
                 R = integer()
                 Q = integer()

              See texCoord1d/1

       texCoord4s(S, T, R, Q) -> ok

              Types:

                 S = integer()
                 T = integer()
                 R = integer()
                 Q = integer()

              See texCoord1d/1

       texCoord1dv(V) -> ok

              Types:

                 V = {S::float()}

              Equivalent to texCoord1d(S).

       texCoord1fv(V) -> ok

              Types:

                 V = {S::float()}

              Equivalent to texCoord1f(S).

       texCoord1iv(V) -> ok

              Types:

                 V = {S::integer()}

              Equivalent to texCoord1i(S).

       texCoord1sv(V) -> ok

              Types:

                 V = {S::integer()}

              Equivalent to texCoord1s(S).

       texCoord2dv(V) -> ok

              Types:

                 V = {S::float(), T::float()}

              Equivalent to texCoord2d(S, T).

       texCoord2fv(V) -> ok

              Types:

                 V = {S::float(), T::float()}

              Equivalent to texCoord2f(S, T).

       texCoord2iv(V) -> ok

              Types:

                 V = {S::integer(), T::integer()}

              Equivalent to texCoord2i(S, T).

       texCoord2sv(V) -> ok

              Types:

                 V = {S::integer(), T::integer()}

              Equivalent to texCoord2s(S, T).

       texCoord3dv(V) -> ok

              Types:

                 V = {S::float(), T::float(), R::float()}

              Equivalent to texCoord3d(S, T, R).

       texCoord3fv(V) -> ok

              Types:

                 V = {S::float(), T::float(), R::float()}

              Equivalent to texCoord3f(S, T, R).

       texCoord3iv(V) -> ok

              Types:

                 V = {S::integer(), T::integer(), R::integer()}

              Equivalent to texCoord3i(S, T, R).

       texCoord3sv(V) -> ok

              Types:

                 V = {S::integer(), T::integer(), R::integer()}

              Equivalent to texCoord3s(S, T, R).

       texCoord4dv(V) -> ok

              Types:

                 V = {S::float(), T::float(), R::float(), Q::float()}

              Equivalent to texCoord4d(S, T, R, Q).

       texCoord4fv(V) -> ok

              Types:

                 V = {S::float(), T::float(), R::float(), Q::float()}

              Equivalent to texCoord4f(S, T, R, Q).

       texCoord4iv(V) -> ok

              Types:

                 V = {S::integer(), T::integer(), R::integer(), Q::integer()}

              Equivalent to texCoord4i(S, T, R, Q).

       texCoord4sv(V) -> ok

              Types:

                 V = {S::integer(), T::integer(), R::integer(), Q::integer()}

              Equivalent to texCoord4s(S, T, R, Q).

       rasterPos2d(X, Y) -> ok

              Types:

                 X = float()
                 Y = float()

              Specify the raster position for pixel operations

              The  GL  maintains a 3D position in window coordinates. This position, called the raster position,
              is used to position pixel and bitmap write operations. It is maintained  with  subpixel  accuracy.
              See gl:bitmap/7 , gl:drawPixels/5 , and gl:copyPixels/5 .

              See external documentation.

       rasterPos2f(X, Y) -> ok

              Types:

                 X = float()
                 Y = float()

              See rasterPos2d/2

       rasterPos2i(X, Y) -> ok

              Types:

                 X = integer()
                 Y = integer()

              See rasterPos2d/2

       rasterPos2s(X, Y) -> ok

              Types:

                 X = integer()
                 Y = integer()

              See rasterPos2d/2

       rasterPos3d(X, Y, Z) -> ok

              Types:

                 X = float()
                 Y = float()
                 Z = float()

              See rasterPos2d/2

       rasterPos3f(X, Y, Z) -> ok

              Types:

                 X = float()
                 Y = float()
                 Z = float()

              See rasterPos2d/2

       rasterPos3i(X, Y, Z) -> ok

              Types:

                 X = integer()
                 Y = integer()
                 Z = integer()

              See rasterPos2d/2

       rasterPos3s(X, Y, Z) -> ok

              Types:

                 X = integer()
                 Y = integer()
                 Z = integer()

              See rasterPos2d/2

       rasterPos4d(X, Y, Z, W) -> ok

              Types:

                 X = float()
                 Y = float()
                 Z = float()
                 W = float()

              See rasterPos2d/2

       rasterPos4f(X, Y, Z, W) -> ok

              Types:

                 X = float()
                 Y = float()
                 Z = float()
                 W = float()

              See rasterPos2d/2

       rasterPos4i(X, Y, Z, W) -> ok

              Types:

                 X = integer()
                 Y = integer()
                 Z = integer()
                 W = integer()

              See rasterPos2d/2

       rasterPos4s(X, Y, Z, W) -> ok

              Types:

                 X = integer()
                 Y = integer()
                 Z = integer()
                 W = integer()

              See rasterPos2d/2

       rasterPos2dv(V) -> ok

              Types:

                 V = {X::float(), Y::float()}

              Equivalent to rasterPos2d(X, Y).

       rasterPos2fv(V) -> ok

              Types:

                 V = {X::float(), Y::float()}

              Equivalent to rasterPos2f(X, Y).

       rasterPos2iv(V) -> ok

              Types:

                 V = {X::integer(), Y::integer()}

              Equivalent to rasterPos2i(X, Y).

       rasterPos2sv(V) -> ok

              Types:

                 V = {X::integer(), Y::integer()}

              Equivalent to rasterPos2s(X, Y).

       rasterPos3dv(V) -> ok

              Types:

                 V = {X::float(), Y::float(), Z::float()}

              Equivalent to rasterPos3d(X, Y, Z).

       rasterPos3fv(V) -> ok

              Types:

                 V = {X::float(), Y::float(), Z::float()}

              Equivalent to rasterPos3f(X, Y, Z).

       rasterPos3iv(V) -> ok

              Types:

                 V = {X::integer(), Y::integer(), Z::integer()}

              Equivalent to rasterPos3i(X, Y, Z).

       rasterPos3sv(V) -> ok

              Types:

                 V = {X::integer(), Y::integer(), Z::integer()}

              Equivalent to rasterPos3s(X, Y, Z).

       rasterPos4dv(V) -> ok

              Types:

                 V = {X::float(), Y::float(), Z::float(), W::float()}

              Equivalent to rasterPos4d(X, Y, Z, W).

       rasterPos4fv(V) -> ok

              Types:

                 V = {X::float(), Y::float(), Z::float(), W::float()}

              Equivalent to rasterPos4f(X, Y, Z, W).

       rasterPos4iv(V) -> ok

              Types:

                 V = {X::integer(), Y::integer(), Z::integer(), W::integer()}

              Equivalent to rasterPos4i(X, Y, Z, W).

       rasterPos4sv(V) -> ok

              Types:

                 V = {X::integer(), Y::integer(), Z::integer(), W::integer()}

              Equivalent to rasterPos4s(X, Y, Z, W).

       rectd(X1, Y1, X2, Y2) -> ok

              Types:

                 X1 = float()
                 Y1 = float()
                 X2 = float()
                 Y2 = float()

              Draw a rectangle

              gl:rect  supports  efficient  specification  of  rectangles  as  two corner points. Each rectangle
              command takes four arguments, organized either as two consecutive pairs of (x y) coordinates or as
              two  pointers  to arrays, each containing an (x y) pair. The resulting rectangle is defined in the
              z=0 plane.

              See external documentation.

       rectf(X1, Y1, X2, Y2) -> ok

              Types:

                 X1 = float()
                 Y1 = float()
                 X2 = float()
                 Y2 = float()

              See rectd/4

       recti(X1, Y1, X2, Y2) -> ok

              Types:

                 X1 = integer()
                 Y1 = integer()
                 X2 = integer()
                 Y2 = integer()

              See rectd/4

       rects(X1, Y1, X2, Y2) -> ok

              Types:

                 X1 = integer()
                 Y1 = integer()
                 X2 = integer()
                 Y2 = integer()

              See rectd/4

       rectdv(V1, V2) -> ok

              Types:

                 V1 = {float(), float()}
                 V2 = {float(), float()}

              See rectd/4

       rectfv(V1, V2) -> ok

              Types:

                 V1 = {float(), float()}
                 V2 = {float(), float()}

              See rectd/4

       rectiv(V1, V2) -> ok

              Types:

                 V1 = {integer(), integer()}
                 V2 = {integer(), integer()}

              See rectd/4

       rectsv(V1, V2) -> ok

              Types:

                 V1 = {integer(), integer()}
                 V2 = {integer(), integer()}

              See rectd/4

       vertexPointer(Size, Type, Stride, Ptr) -> ok

              Types:

                 Size = integer()
                 Type = enum()
                 Stride = integer()
                 Ptr = offset() | mem()

              Define an array of vertex data

              gl:vertexPointer specifies the location and data format of an array of vertex coordinates  to  use
              when  rendering. Size specifies the number of coordinates per vertex, and must be 2, 3, or 4. Type
              specifies the data type of each coordinate, and Stride specifies the byte stride from  one  vertex
              to  the  next,  allowing  vertices  and  attributes  to be packed into a single array or stored in
              separate arrays. (Single-array  storage  may  be  more  efficient  on  some  implementations;  see
              gl:interleavedArrays/3 .)

              See external documentation.

       normalPointer(Type, Stride, Ptr) -> ok

              Types:

                 Type = enum()
                 Stride = integer()
                 Ptr = offset() | mem()

              Define an array of normals

              gl:normalPointer  specifies  the  location  and  data  format  of  an array of normals to use when
              rendering. Type specifies the data type of each normal coordinate, and Stride specifies  the  byte
              stride  from  one  normal to the next, allowing vertices and attributes to be packed into a single
              array or stored  in  separate  arrays.  (Single-array  storage  may  be  more  efficient  on  some
              implementations; see gl:interleavedArrays/3 .)

              See external documentation.

       colorPointer(Size, Type, Stride, Ptr) -> ok

              Types:

                 Size = integer()
                 Type = enum()
                 Stride = integer()
                 Ptr = offset() | mem()

              Define an array of colors

              gl:colorPointer specifies the location and data format of an array of color components to use when
              rendering. Size specifies the number of components per color, and must be 3 or 4.  Type  specifies
              the  data type of each color component, and Stride specifies the byte stride from one color to the
              next, allowing vertices and attributes to be packed into a single  array  or  stored  in  separate
              arrays.   (Single-array   storage   may   be   more   efficient   on   some  implementations;  see
              gl:interleavedArrays/3 .)

              See external documentation.

       indexPointer(Type, Stride, Ptr) -> ok

              Types:

                 Type = enum()
                 Stride = integer()
                 Ptr = offset() | mem()

              Define an array of color indexes

              gl:indexPointer specifies the location and data format of an array of color indexes  to  use  when
              rendering.  Type  specifies the data type of each color index and Stride specifies the byte stride
              from one color index to the next, allowing vertices and attributes to  be  packed  into  a  single
              array or stored in separate arrays.

              See external documentation.

       texCoordPointer(Size, Type, Stride, Ptr) -> ok

              Types:

                 Size = integer()
                 Type = enum()
                 Stride = integer()
                 Ptr = offset() | mem()

              Define an array of texture coordinates

              gl:texCoordPointer  specifies  the  location and data format of an array of texture coordinates to
              use when rendering. Size specifies the number of coordinates per texture coordinate set, and  must
              be  1,  2,  3, or 4. Type specifies the data type of each texture coordinate, and Stride specifies
              the byte stride from one texture coordinate set to the next, allowing vertices and  attributes  to
              be  packed  into  a  single  array or stored in separate arrays. (Single-array storage may be more
              efficient on some implementations; see gl:interleavedArrays/3 .)

              See external documentation.

       edgeFlagPointer(Stride, Ptr) -> ok

              Types:

                 Stride = integer()
                 Ptr = offset() | mem()

              Define an array of edge flags

              gl:edgeFlagPointer specifies the location and data format of an array of boolean edge flags to use
              when rendering. Stride specifies the byte stride from one edge flag to the next, allowing vertices
              and attributes to be packed into a single array or stored in separate arrays.

              See external documentation.

       arrayElement(I) -> ok

              Types:

                 I = integer()

              Render a vertex using the specified vertex array element

              gl:arrayElement commands are used within gl:'begin'/1 / gl:'begin'/1 pairs to specify  vertex  and
              attribute  data  for  point,  line,  and  polygon  primitives. If ?GL_VERTEX_ARRAY is enabled when
              gl:arrayElement is called, a single vertex is drawn, using vertex and attribute  data  taken  from
              location  I  of  the enabled arrays. If ?GL_VERTEX_ARRAY is not enabled, no drawing occurs but the
              attributes corresponding to the enabled arrays are modified.

              See external documentation.

       drawArrays(Mode, First, Count) -> ok

              Types:

                 Mode = enum()
                 First = integer()
                 Count = integer()

              Render primitives from array data

              gl:drawArrays specifies multiple geometric primitives with very few subroutine calls.  Instead  of
              calling  a  GL procedure to pass each individual vertex, normal, texture coordinate, edge flag, or
              color, you can prespecify separate arrays of  vertices,  normals,  and  colors  and  use  them  to
              construct a sequence of primitives with a single call to gl:drawArrays .

              See external documentation.

       drawElements(Mode, Count, Type, Indices) -> ok

              Types:

                 Mode = enum()
                 Count = integer()
                 Type = enum()
                 Indices = offset() | mem()

              Render primitives from array data

              gl:drawElements specifies multiple geometric primitives with very few subroutine calls. Instead of
              calling a GL function to pass each individual vertex, normal, texture coordinate,  edge  flag,  or
              color,  you  can  prespecify  separate  arrays  of  vertices,  normals, and so on, and use them to
              construct a sequence of primitives with a single call to gl:drawElements .

              See external documentation.

       interleavedArrays(Format, Stride, Pointer) -> ok

              Types:

                 Format = enum()
                 Stride = integer()
                 Pointer = offset() | mem()

              Simultaneously specify and enable several interleaved arrays

              gl:interleavedArrays lets you specify and enable individual  color,  normal,  texture  and  vertex
              arrays whose elements are part of a larger aggregate array element. For some implementations, this
              is more efficient than specifying the arrays separately.

              See external documentation.

       shadeModel(Mode) -> ok

              Types:

                 Mode = enum()

              Select flat or smooth shading

              GL primitives can have either flat or smooth shading. Smooth  shading,  the  default,  causes  the
              computed colors of vertices to be interpolated as the primitive is rasterized, typically assigning
              different colors to each resulting pixel fragment. Flat shading selects the computed color of just
              one  vertex and assigns it to all the pixel fragments generated by rasterizing a single primitive.
              In either case, the computed color of a vertex is the result of lighting if lighting  is  enabled,
              or it is the current color at the time the vertex was specified if lighting is disabled.

              See external documentation.

       lightf(Light, Pname, Param) -> ok

              Types:

                 Light = enum()
                 Pname = enum()
                 Param = float()

              Set light source parameters

              gl:light  sets  the  values  of individual light source parameters. Light names the light and is a
              symbolic name of the form ?GL_LIGHT i, where i ranges from 0 to the value of ?GL_MAX_LIGHTS  -  1.
              Pname  specifies  one  of  ten light source parameters, again by symbolic name. Params is either a
              single value or a pointer to an array that contains the new values.

              See external documentation.

       lighti(Light, Pname, Param) -> ok

              Types:

                 Light = enum()
                 Pname = enum()
                 Param = integer()

              See lightf/3

       lightfv(Light, Pname, Params) -> ok

              Types:

                 Light = enum()
                 Pname = enum()
                 Params = tuple()

              See lightf/3

       lightiv(Light, Pname, Params) -> ok

              Types:

                 Light = enum()
                 Pname = enum()
                 Params = tuple()

              See lightf/3

       getLightfv(Light, Pname) -> {float(), float(), float(), float()}

              Types:

                 Light = enum()
                 Pname = enum()

              Return light source parameter values

              gl:getLight returns in Params the value or values of a light source  parameter.  Light  names  the
              light  and  is  a  symbolic  name  of  the  form ?GL_LIGHT i where i ranges from 0 to the value of
              ?GL_MAX_LIGHTS - 1. ?GL_MAX_LIGHTS is an implementation dependent constant that is greater than or
              equal to eight. Pname specifies one of ten light source parameters, again by symbolic name.

              See external documentation.

       getLightiv(Light, Pname) -> {integer(), integer(), integer(), integer()}

              Types:

                 Light = enum()
                 Pname = enum()

              See getLightfv/2

       lightModelf(Pname, Param) -> ok

              Types:

                 Pname = enum()
                 Param = float()

              Set the lighting model parameters

              gl:lightModel  sets the lighting model parameter. Pname names a parameter and Params gives the new
              value. There are three lighting model parameters:

              See external documentation.

       lightModeli(Pname, Param) -> ok

              Types:

                 Pname = enum()
                 Param = integer()

              See lightModelf/2

       lightModelfv(Pname, Params) -> ok

              Types:

                 Pname = enum()
                 Params = tuple()

              See lightModelf/2

       lightModeliv(Pname, Params) -> ok

              Types:

                 Pname = enum()
                 Params = tuple()

              See lightModelf/2

       materialf(Face, Pname, Param) -> ok

              Types:

                 Face = enum()
                 Pname = enum()
                 Param = float()

              Specify material parameters for the lighting model

              gl:material assigns values to  material  parameters.  There  are  two  matched  sets  of  material
              parameters.  One,  the front-facing set, is used to shade points, lines, bitmaps, and all polygons
              (when two-sided lighting is disabled), or just front-facing polygons (when two-sided  lighting  is
              enabled).  The  other  set, back-facing, is used to shade back-facing polygons only when two-sided
              lighting is enabled. Refer to the gl:lightModelf/2 reference page for details concerning one-  and
              two-sided lighting calculations.

              See external documentation.

       materiali(Face, Pname, Param) -> ok

              Types:

                 Face = enum()
                 Pname = enum()
                 Param = integer()

              See materialf/3

       materialfv(Face, Pname, Params) -> ok

              Types:

                 Face = enum()
                 Pname = enum()
                 Params = tuple()

              See materialf/3

       materialiv(Face, Pname, Params) -> ok

              Types:

                 Face = enum()
                 Pname = enum()
                 Params = tuple()

              See materialf/3

       getMaterialfv(Face, Pname) -> {float(), float(), float(), float()}

              Types:

                 Face = enum()
                 Pname = enum()

              Return material parameters

              gl:getMaterial  returns  in  Params  the value or values of parameter Pname of material Face . Six
              parameters are defined:

              See external documentation.

       getMaterialiv(Face, Pname) -> {integer(), integer(), integer(), integer()}

              Types:

                 Face = enum()
                 Pname = enum()

              See getMaterialfv/2

       colorMaterial(Face, Mode) -> ok

              Types:

                 Face = enum()
                 Mode = enum()

              Cause a material color to track the current color

              gl:colorMaterial  specifies  which   material   parameters   track   the   current   color.   When
              ?GL_COLOR_MATERIAL  is  enabled,  the  material parameter or parameters specified by Mode , of the
              material or materials specified by Face , track the current color at all times.

              See external documentation.

       pixelZoom(Xfactor, Yfactor) -> ok

              Types:

                 Xfactor = float()
                 Yfactor = float()

              Specify the pixel zoom factors

              gl:pixelZoom  specifies  values  for  the  x  and  y  zoom  factors.  During  the   execution   of
              gl:drawPixels/5  or  gl:copyPixels/5  ,  if  ( xr, yr) is the current raster position, and a given
              element is in the mth row and nth column of the pixel rectangle, then pixels whose centers are  in
              the rectangle with corners at

              See external documentation.

       pixelStoref(Pname, Param) -> ok

              Types:

                 Pname = enum()
                 Param = float()

              Set pixel storage modes

              gl:pixelStore  sets pixel storage modes that affect the operation of subsequent gl:readPixels/7 as
              well  as  the  unpacking  of  texture  patterns   (see   gl:texImage1D/8   ,   gl:texImage2D/9   ,
              gl:texImage3D/10    ,    gl:texSubImage1D/7   ,   gl:texSubImage1D/7   ,   gl:texSubImage1D/7   ),
              gl:compressedTexImage1D/7    ,    gl:compressedTexImage2D/8    ,    gl:compressedTexImage3D/9    ,
              gl:compressedTexSubImage1D/7 , gl:compressedTexSubImage2D/9 or gl:compressedTexSubImage1D/7 .

              See external documentation.

       pixelStorei(Pname, Param) -> ok

              Types:

                 Pname = enum()
                 Param = integer()

              See pixelStoref/2

       pixelTransferf(Pname, Param) -> ok

              Types:

                 Pname = enum()
                 Param = float()

              Set pixel transfer modes

              gl:pixelTransfer sets pixel transfer modes that affect the operation of subsequent gl:copyPixels/5
              , gl:copyTexImage1D/7 , gl:copyTexImage2D/8 , gl:copyTexSubImage1D/6  ,  gl:copyTexSubImage2D/8  ,
              gl:copyTexSubImage3D/9  ,  gl:drawPixels/5 , gl:readPixels/7 , gl:texImage1D/8 , gl:texImage2D/9 ,
              gl:texImage3D/10 , gl:texSubImage1D/7 ,  gl:texSubImage1D/7  ,  and  gl:texSubImage1D/7  commands.
              Additionally,   if   the   ARB_imaging   subset  is  supported,  the  routines  gl:colorTable/6  ,
              gl:colorSubTable/6  ,  gl:convolutionFilter1D/6  ,  gl:convolutionFilter2D/7  ,  gl:histogram/4  ,
              gl:minmax/3  ,  and gl:separableFilter2D/8 are also affected. The algorithms that are specified by
              pixel transfer modes operate on pixels after they are read from the frame buffer ( gl:copyPixels/5
              gl:copyTexImage1D/7  ,  gl:copyTexImage2D/8  ,  gl:copyTexSubImage1D/6  , gl:copyTexSubImage2D/8 ,
              gl:copyTexSubImage3D/9 , and gl:readPixels/7 ), or unpacked from client memory ( gl:drawPixels/5 ,
              gl:texImage1D/8  ,  gl:texImage2D/9 , gl:texImage3D/10 , gl:texSubImage1D/7 , gl:texSubImage1D/7 ,
              and gl:texSubImage1D/7 ). Pixel transfer operations happen in the same  order,  and  in  the  same
              manner,  regardless  of the command that resulted in the pixel operation. Pixel storage modes (see
              gl:pixelStoref/2 ) control the unpacking of pixels being read from client memory and  the  packing
              of pixels being written back into client memory.

              See external documentation.

       pixelTransferi(Pname, Param) -> ok

              Types:

                 Pname = enum()
                 Param = integer()

              See pixelTransferf/2

       pixelMapfv(Map, Mapsize, Values) -> ok

              Types:

                 Map = enum()
                 Mapsize = integer()
                 Values = binary()

              Set up pixel transfer maps

              gl:pixelMap  sets  up translation tables, or maps, used by gl:copyPixels/5 , gl:copyTexImage1D/7 ,
              gl:copyTexImage2D/8 , gl:copyTexSubImage1D/6 , gl:copyTexSubImage2D/8 ,  gl:copyTexSubImage3D/9  ,
              gl:drawPixels/5  ,  gl:readPixels/7  ,  gl:texImage1D/8  ,  gl:texImage2D/9  ,  gl:texImage3D/10 ,
              gl:texSubImage1D/7  ,  gl:texSubImage1D/7  ,  and  gl:texSubImage1D/7  .  Additionally,   if   the
              ARB_imaging   subset   is   supported,   the   routines  gl:colorTable/6  ,  gl:colorSubTable/6  ,
              gl:convolutionFilter1D/6  ,  gl:convolutionFilter2D/7  ,  gl:histogram/4  ,  gl:minmax/3   ,   and
              gl:separableFilter2D/8  .  Use  of  these  maps is described completely in the gl:pixelTransferf/2
              reference page, and partly in the reference pages for the pixel and texture image  commands.  Only
              the specification of the maps is described in this reference page.

              See external documentation.

       pixelMapuiv(Map, Mapsize, Values) -> ok

              Types:

                 Map = enum()
                 Mapsize = integer()
                 Values = binary()

              See pixelMapfv/3

       pixelMapusv(Map, Mapsize, Values) -> ok

              Types:

                 Map = enum()
                 Mapsize = integer()
                 Values = binary()

              See pixelMapfv/3

       getPixelMapfv(Map, Values) -> ok

              Types:

                 Map = enum()
                 Values = mem()

              Return the specified pixel map

              See  the  gl:pixelMapfv/3  reference  page  for a description of the acceptable values for the Map
              parameter. gl:getPixelMap returns in Data the contents of the pixel map specified in Map  .  Pixel
              maps  are  used  during  the  execution  of  gl:readPixels/7 , gl:drawPixels/5 , gl:copyPixels/5 ,
              gl:texImage1D/8 , gl:texImage2D/9 , gl:texImage3D/10 , gl:texSubImage1D/7 ,  gl:texSubImage1D/7  ,
              gl:texSubImage1D/7   ,   gl:copyTexImage1D/7  ,  gl:copyTexImage2D/8  ,  gl:copyTexSubImage1D/6  ,
              gl:copyTexSubImage2D/8 , and gl:copyTexSubImage3D/9 . to map color indices, stencil indices, color
              components, and depth components to other values.

              See external documentation.

       getPixelMapuiv(Map, Values) -> ok

              Types:

                 Map = enum()
                 Values = mem()

              See getPixelMapfv/2

       getPixelMapusv(Map, Values) -> ok

              Types:

                 Map = enum()
                 Values = mem()

              See getPixelMapfv/2

       bitmap(Width, Height, Xorig, Yorig, Xmove, Ymove, Bitmap) -> ok

              Types:

                 Width = integer()
                 Height = integer()
                 Xorig = float()
                 Yorig = float()
                 Xmove = float()
                 Ymove = float()
                 Bitmap = offset() | mem()

              Draw a bitmap

              A  bitmap  is  a binary image. When drawn, the bitmap is positioned relative to the current raster
              position, and frame buffer pixels corresponding to 1's in the bitmap are written using the current
              raster color or index. Frame buffer pixels corresponding to 0's in the bitmap are not modified.

              See external documentation.

       readPixels(X, Y, Width, Height, Format, Type, Pixels) -> ok

              Types:

                 X = integer()
                 Y = integer()
                 Width = integer()
                 Height = integer()
                 Format = enum()
                 Type = enum()
                 Pixels = mem()

              Read a block of pixels from the frame buffer

              gl:readPixels  returns  pixel data from the frame buffer, starting with the pixel whose lower left
              corner is at location ( X , Y ), into client memory starting at location Data . Several parameters
              control  the processing of the pixel data before it is placed into client memory. These parameters
              are set with gl:pixelStoref/2 . This reference page describes  the  effects  on  gl:readPixels  of
              most, but not all of the parameters specified by these three commands.

              See external documentation.

       drawPixels(Width, Height, Format, Type, Pixels) -> ok

              Types:

                 Width = integer()
                 Height = integer()
                 Format = enum()
                 Type = enum()
                 Pixels = offset() | mem()

              Write a block of pixels to the frame buffer

              gl:drawPixels  reads  pixel  data  from memory and writes it into the frame buffer relative to the
              current raster position, provided that the raster  position  is  valid.  Use  gl:rasterPos2d/2  or
              gl:windowPos2d/2   to  set  the  current  raster  position;  use  gl:getBooleanv/1  with  argument
              ?GL_CURRENT_RASTER_POSITION_VALID to determine if the specified  raster  position  is  valid,  and
              gl:getBooleanv/1 with argument ?GL_CURRENT_RASTER_POSITION to query the raster position.

              See external documentation.

       copyPixels(X, Y, Width, Height, Type) -> ok

              Types:

                 X = integer()
                 Y = integer()
                 Width = integer()
                 Height = integer()
                 Type = enum()

              Copy pixels in the frame buffer

              gl:copyPixels copies a screen-aligned rectangle of pixels from the specified frame buffer location
              to a region relative to the current raster position. Its operation is well  defined  only  if  the
              entire  pixel  source  region  is within the exposed portion of the window. Results of copies from
              outside the window, or from regions of the window that are not exposed, are hardware dependent and
              undefined.

              See external documentation.

       stencilFunc(Func, Ref, Mask) -> ok

              Types:

                 Func = enum()
                 Ref = integer()
                 Mask = integer()

              Set front and back function and reference value for stencil testing

              Stenciling,  like  depth-buffering,  enables  and  disables  drawing on a per-pixel basis. Stencil
              planes are first drawn into using GL drawing primitives, then geometry  and  images  are  rendered
              using  the  stencil  planes  to  mask  out portions of the screen. Stenciling is typically used in
              multipass rendering algorithms  to  achieve  special  effects,  such  as  decals,  outlining,  and
              constructive solid geometry rendering.

              See external documentation.

       stencilMask(Mask) -> ok

              Types:

                 Mask = integer()

              Control the front and back writing of individual bits in the stencil planes

              gl:stencilMask  controls  the  writing  of  individual  bits  in  the  stencil  planes.  The least
              significant n bits of Mask , where n is the number of bits in the stencil buffer, specify a  mask.
              Where  a  1  appears  in  the mask, it's possible to write to the corresponding bit in the stencil
              buffer. Where a 0 appears, the corresponding bit  is  write-protected.  Initially,  all  bits  are
              enabled for writing.

              See external documentation.

       stencilOp(Fail, Zfail, Zpass) -> ok

              Types:

                 Fail = enum()
                 Zfail = enum()
                 Zpass = enum()

              Set front and back stencil test actions

              Stenciling, like depth-buffering, enables and disables drawing on a per-pixel basis. You draw into
              the stencil planes using GL drawing primitives, then render geometry and images, using the stencil
              planes  to  mask  out  portions of the screen. Stenciling is typically used in multipass rendering
              algorithms to achieve special effects, such as decals, outlining, and constructive solid  geometry
              rendering.

              See external documentation.

       clearStencil(S) -> ok

              Types:

                 S = integer()

              Specify the clear value for the stencil buffer

              gl:clearStencil  specifies  the  index used by gl:clear/1 to clear the stencil buffer. S is masked
              with 2 m-1, where m is the number of bits in the stencil buffer.

              See external documentation.

       texGend(Coord, Pname, Param) -> ok

              Types:

                 Coord = enum()
                 Pname = enum()
                 Param = float()

              Control the generation of texture coordinates

              gl:texGen selects a texture-coordinate generation function or supplies coefficients for one of the
              functions. Coord names one of the (s, t, r, q ) texture coordinates; it must be one of the symbols
              ?GL_S,  ?GL_T,  ?GL_R  ,  or  ?GL_Q.  Pname   must   be   one   of   three   symbolic   constants:
              ?GL_TEXTURE_GEN_MODE , ?GL_OBJECT_PLANE, or ?GL_EYE_PLANE. If Pname is ?GL_TEXTURE_GEN_MODE , then
              Params chooses a mode, one of ?GL_OBJECT_LINEAR, ?GL_EYE_LINEAR , ?GL_SPHERE_MAP,  ?GL_NORMAL_MAP,
              or  ?GL_REFLECTION_MAP.  If  Pname  is  either  ?GL_OBJECT_PLANE or ?GL_EYE_PLANE, Params contains
              coefficients for the corresponding texture generation function.

              See external documentation.

       texGenf(Coord, Pname, Param) -> ok

              Types:

                 Coord = enum()
                 Pname = enum()
                 Param = float()

              See texGend/3

       texGeni(Coord, Pname, Param) -> ok

              Types:

                 Coord = enum()
                 Pname = enum()
                 Param = integer()

              See texGend/3

       texGendv(Coord, Pname, Params) -> ok

              Types:

                 Coord = enum()
                 Pname = enum()
                 Params = tuple()

              See texGend/3

       texGenfv(Coord, Pname, Params) -> ok

              Types:

                 Coord = enum()
                 Pname = enum()
                 Params = tuple()

              See texGend/3

       texGeniv(Coord, Pname, Params) -> ok

              Types:

                 Coord = enum()
                 Pname = enum()
                 Params = tuple()

              See texGend/3

       getTexGendv(Coord, Pname) -> {float(), float(), float(), float()}

              Types:

                 Coord = enum()
                 Pname = enum()

              Return texture coordinate generation parameters

              gl:getTexGen returns in Params selected parameters of a  texture  coordinate  generation  function
              that  was  specified using gl:texGend/3 . Coord names one of the (s, t, r, q) texture coordinates,
              using the symbolic constant ?GL_S, ?GL_T, ?GL_R, or ?GL_Q.

              See external documentation.

       getTexGenfv(Coord, Pname) -> {float(), float(), float(), float()}

              Types:

                 Coord = enum()
                 Pname = enum()

              See getTexGendv/2

       getTexGeniv(Coord, Pname) -> {integer(), integer(), integer(), integer()}

              Types:

                 Coord = enum()
                 Pname = enum()

              See getTexGendv/2

       texEnvf(Target, Pname, Param) -> ok

              Types:

                 Target = enum()
                 Pname = enum()
                 Param = float()

              glTexEnvf

              See external documentation.

       texEnvi(Target, Pname, Param) -> ok

              Types:

                 Target = enum()
                 Pname = enum()
                 Param = integer()

              glTexEnvi

              See external documentation.

       texEnvfv(Target, Pname, Params) -> ok

              Types:

                 Target = enum()
                 Pname = enum()
                 Params = tuple()

              Set texture environment parameters

              A texture environment specifies how texture values are interpreted when a  fragment  is  textured.
              When  Target  is  ?GL_TEXTURE_FILTER_CONTROL,  Pname must be ?GL_TEXTURE_LOD_BIAS . When Target is
              ?GL_TEXTURE_ENV, Pname  can  be  ?GL_TEXTURE_ENV_MODE  ,  ?GL_TEXTURE_ENV_COLOR,  ?GL_COMBINE_RGB,
              ?GL_COMBINE_ALPHA,  ?GL_RGB_SCALE  ,  ?GL_ALPHA_SCALE,  ?GL_SRC0_RGB,  ?GL_SRC1_RGB, ?GL_SRC2_RGB,
              ?GL_SRC0_ALPHA , ?GL_SRC1_ALPHA, or ?GL_SRC2_ALPHA.

              See external documentation.

       texEnviv(Target, Pname, Params) -> ok

              Types:

                 Target = enum()
                 Pname = enum()
                 Params = tuple()

              See texEnvfv/3

       getTexEnvfv(Target, Pname) -> {float(), float(), float(), float()}

              Types:

                 Target = enum()
                 Pname = enum()

              Return texture environment parameters

              gl:getTexEnv returns in Params selected values of a texture environment that  was  specified  with
              gl:texEnvfv/3 . Target specifies a texture environment.

              See external documentation.

       getTexEnviv(Target, Pname) -> {integer(), integer(), integer(), integer()}

              Types:

                 Target = enum()
                 Pname = enum()

              See getTexEnvfv/2

       texParameterf(Target, Pname, Param) -> ok

              Types:

                 Target = enum()
                 Pname = enum()
                 Param = float()

              Set texture parameters

              gl:texParameter  assigns the value or values in Params to the texture parameter specified as Pname
              . Target defines the target texture, either ?GL_TEXTURE_1D , ?GL_TEXTURE_2D, ?GL_TEXTURE_1D_ARRAY,
              ?GL_TEXTURE_2D_ARRAY,  ?GL_TEXTURE_RECTANGLE  ,  or  ?GL_TEXTURE_3D.  The  following  symbols  are
              accepted in Pname :

              See external documentation.

       texParameteri(Target, Pname, Param) -> ok

              Types:

                 Target = enum()
                 Pname = enum()
                 Param = integer()

              See texParameterf/3

       texParameterfv(Target, Pname, Params) -> ok

              Types:

                 Target = enum()
                 Pname = enum()
                 Params = tuple()

              See texParameterf/3

       texParameteriv(Target, Pname, Params) -> ok

              Types:

                 Target = enum()
                 Pname = enum()
                 Params = tuple()

              See texParameterf/3

       getTexParameterfv(Target, Pname) -> {float(), float(), float(), float()}

              Types:

                 Target = enum()
                 Pname = enum()

              Return texture parameter values

              gl:getTexParameter returns in Params the value or values of the  texture  parameter  specified  as
              Pname  .  Target  defines  the  target  texture.  ?GL_TEXTURE_1D,  ?GL_TEXTURE_2D, ?GL_TEXTURE_3D,
              ?GL_TEXTURE_1D_ARRAY,   ?GL_TEXTURE_2D_ARRAY   ,   ?GL_TEXTURE_RECTANGLE,    ?GL_TEXTURE_CUBE_MAP,
              ?GL_TEXTURE_CUBE_MAP_ARRAY  specify  one-, two-, or three-dimensional, one-dimensional array, two-
              dimensional array, rectangle, cube-mapped or  cube-mapped  array  texturing,  respectively.  Pname
              accepts the same symbols as gl:texParameterf/3 , with the same interpretations:

              See external documentation.

       getTexParameteriv(Target, Pname) -> {integer(), integer(), integer(), integer()}

              Types:

                 Target = enum()
                 Pname = enum()

              See getTexParameterfv/2

       getTexLevelParameterfv(Target, Level, Pname) -> {float()}

              Types:

                 Target = enum()
                 Level = integer()
                 Pname = enum()

              Return texture parameter values for a specific level of detail

              gl:getTexLevelParameter  returns in Params texture parameter values for a specific level-of-detail
              value,  specified  as  Level  .  Target  defines  the  target  texture,   either   ?GL_TEXTURE_1D,
              ?GL_TEXTURE_2D, ?GL_TEXTURE_3D, ?GL_PROXY_TEXTURE_1D , ?GL_PROXY_TEXTURE_2D, ?GL_PROXY_TEXTURE_3D,
              ?GL_TEXTURE_CUBE_MAP_POSITIVE_X                 ,                 ?GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
              ?GL_TEXTURE_CUBE_MAP_POSITIVE_Y,                 ?GL_TEXTURE_CUBE_MAP_NEGATIVE_Y                 ,
              ?GL_TEXTURE_CUBE_MAP_POSITIVE_Z, ?GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, or ?GL_PROXY_TEXTURE_CUBE_MAP .

              See external documentation.

       getTexLevelParameteriv(Target, Level, Pname) -> {integer()}

              Types:

                 Target = enum()
                 Level = integer()
                 Pname = enum()

              See getTexLevelParameterfv/3

       texImage1D(Target, Level, InternalFormat, Width, Border, Format, Type, Pixels) -> ok

              Types:

                 Target = enum()
                 Level = integer()
                 InternalFormat = integer()
                 Width = integer()
                 Border = integer()
                 Format = enum()
                 Type = enum()
                 Pixels = offset() | mem()

              Specify a one-dimensional texture image

              Texturing maps a portion of a specified texture image onto  each  graphical  primitive  for  which
              texturing  is  enabled.  To  enable  and  disable  one-dimensional texturing, call gl:enable/1 and
              gl:enable/1 with argument ?GL_TEXTURE_1D.

              See external documentation.

       texImage2D(Target, Level, InternalFormat, Width, Height, Border, Format, Type, Pixels) -> ok

              Types:

                 Target = enum()
                 Level = integer()
                 InternalFormat = integer()
                 Width = integer()
                 Height = integer()
                 Border = integer()
                 Format = enum()
                 Type = enum()
                 Pixels = offset() | mem()

              Specify a two-dimensional texture image

              Texturing allows elements of an image array to be read by shaders.

              See external documentation.

       getTexImage(Target, Level, Format, Type, Pixels) -> ok

              Types:

                 Target = enum()
                 Level = integer()
                 Format = enum()
                 Type = enum()
                 Pixels = mem()

              Return a texture image

              gl:getTexImage returns a texture image into Img . Target specifies  whether  the  desired  texture
              image    is    one    specified    by    gl:texImage1D/8    (?GL_TEXTURE_1D   ),   gl:texImage2D/9
              (?GL_TEXTURE_1D_ARRAY, ?GL_TEXTURE_RECTANGLE, ?GL_TEXTURE_2D or any of ?GL_TEXTURE_CUBE_MAP_*), or
              gl:texImage3D/10  (?GL_TEXTURE_2D_ARRAY  ,  ?GL_TEXTURE_3D).  Level  specifies the level-of-detail
              number of the desired image. Format and Type specify the format and  type  of  the  desired  image
              array.  See  the reference page for gl:texImage1D/8 for a description of the acceptable values for
              the Format and Type parameters, respectively.

              See external documentation.

       genTextures(N) -> [integer()]

              Types:

                 N = integer()

              Generate texture names

              gl:genTextures returns N texture names in Textures . There is no guarantee that the names  form  a
              contiguous  set  of integers; however, it is guaranteed that none of the returned names was in use
              immediately before the call to gl:genTextures.

              See external documentation.

       deleteTextures(Textures) -> ok

              Types:

                 Textures = [integer()]

              Delete named textures

              gl:deleteTextures deletes N textures named by the elements of the array Textures . After a texture
              is  deleted,  it has no contents or dimensionality, and its name is free for reuse (for example by
              gl:genTextures/1 ). If a texture that is currently bound is deleted, the binding reverts to 0 (the
              default texture).

              See external documentation.

       bindTexture(Target, Texture) -> ok

              Types:

                 Target = enum()
                 Texture = integer()

              Bind a named texture to a texturing target

              gl:bindTexture  lets  you create or use a named texture. Calling gl:bindTexture with Target set to
              ?GL_TEXTURE_1D, ?GL_TEXTURE_2D, ?GL_TEXTURE_3D ,  or  ?GL_TEXTURE_1D_ARRAY,  ?GL_TEXTURE_2D_ARRAY,
              ?GL_TEXTURE_RECTANGLE       ,       ?GL_TEXTURE_CUBE_MAP,       ?GL_TEXTURE_2D_MULTISAMPLE      or
              ?GL_TEXTURE_2D_MULTISAMPLE_ARRAY and Texture set to the name of the new texture binds the  texture
              name  to  the target. When a texture is bound to a target, the previous binding for that target is
              automatically broken.

              See external documentation.

       prioritizeTextures(Textures, Priorities) -> ok

              Types:

                 Textures = [integer()]
                 Priorities = [clamp()]

              Set texture residence priority

              gl:prioritizeTextures assigns the N texture priorities given in Priorities to the N textures named
              in Textures .

              See external documentation.

       areTexturesResident(Textures) -> {0 | 1, Residences::[0 | 1]}

              Types:

                 Textures = [integer()]

              Determine if textures are loaded in texture memory

              GL  establishes  a working set of textures that are resident in texture memory. These textures can
              be bound to a texture target much more efficiently than textures that are not resident.

              See external documentation.

       isTexture(Texture) -> 0 | 1

              Types:

                 Texture = integer()

              Determine if a name corresponds to a texture

              gl:isTexture returns ?GL_TRUE if Texture is currently the name of a texture. If Texture  is  zero,
              or  is  a  non-zero  value  that  is  not  currently the name of a texture, or if an error occurs,
              gl:isTexture returns ?GL_FALSE.

              See external documentation.

       texSubImage1D(Target, Level, Xoffset, Width, Format, Type, Pixels) -> ok

              Types:

                 Target = enum()
                 Level = integer()
                 Xoffset = integer()
                 Width = integer()
                 Format = enum()
                 Type = enum()
                 Pixels = offset() | mem()

              glTexSubImage

              See external documentation.

       texSubImage2D(Target, Level, Xoffset, Yoffset, Width, Height, Format, Type, Pixels) -> ok

              Types:

                 Target = enum()
                 Level = integer()
                 Xoffset = integer()
                 Yoffset = integer()
                 Width = integer()
                 Height = integer()
                 Format = enum()
                 Type = enum()
                 Pixels = offset() | mem()

              glTexSubImage

              See external documentation.

       copyTexImage1D(Target, Level, Internalformat, X, Y, Width, Border) -> ok

              Types:

                 Target = enum()
                 Level = integer()
                 Internalformat = enum()
                 X = integer()
                 Y = integer()
                 Width = integer()
                 Border = integer()

              Copy pixels into a 1D texture image

              gl:copyTexImage1D  defines  a  one-dimensional  texture  image  with  pixels  from   the   current
              ?GL_READ_BUFFER.

              See external documentation.

       copyTexImage2D(Target, Level, Internalformat, X, Y, Width, Height, Border) -> ok

              Types:

                 Target = enum()
                 Level = integer()
                 Internalformat = enum()
                 X = integer()
                 Y = integer()
                 Width = integer()
                 Height = integer()
                 Border = integer()

              Copy pixels into a 2D texture image

              gl:copyTexImage2D  defines  a two-dimensional texture image, or cube-map texture image with pixels
              from the current ?GL_READ_BUFFER.

              See external documentation.

       copyTexSubImage1D(Target, Level, Xoffset, X, Y, Width) -> ok

              Types:

                 Target = enum()
                 Level = integer()
                 Xoffset = integer()
                 X = integer()
                 Y = integer()
                 Width = integer()

              Copy a one-dimensional texture subimage

              gl:copyTexSubImage1D replaces a portion of a one-dimensional texture image with  pixels  from  the
              current ?GL_READ_BUFFER (rather than from main memory, as is the case for gl:texSubImage1D/7 ).

              See external documentation.

       copyTexSubImage2D(Target, Level, Xoffset, Yoffset, X, Y, Width, Height) -> ok

              Types:

                 Target = enum()
                 Level = integer()
                 Xoffset = integer()
                 Yoffset = integer()
                 X = integer()
                 Y = integer()
                 Width = integer()
                 Height = integer()

              Copy a two-dimensional texture subimage

              gl:copyTexSubImage2D replaces a rectangular portion of a two-dimensional texture image or cube-map
              texture image with pixels from the current ?GL_READ_BUFFER (rather than from main  memory,  as  is
              the case for gl:texSubImage1D/7 ).

              See external documentation.

       map1d(Target, U1, U2, Stride, Order, Points) -> ok

              Types:

                 Target = enum()
                 U1 = float()
                 U2 = float()
                 Stride = integer()
                 Order = integer()
                 Points = binary()

              glMap

              See external documentation.

       map1f(Target, U1, U2, Stride, Order, Points) -> ok

              Types:

                 Target = enum()
                 U1 = float()
                 U2 = float()
                 Stride = integer()
                 Order = integer()
                 Points = binary()

              glMap

              See external documentation.

       map2d(Target, U1, U2, Ustride, Uorder, V1, V2, Vstride, Vorder, Points) -> ok

              Types:

                 Target = enum()
                 U1 = float()
                 U2 = float()
                 Ustride = integer()
                 Uorder = integer()
                 V1 = float()
                 V2 = float()
                 Vstride = integer()
                 Vorder = integer()
                 Points = binary()

              glMap

              See external documentation.

       map2f(Target, U1, U2, Ustride, Uorder, V1, V2, Vstride, Vorder, Points) -> ok

              Types:

                 Target = enum()
                 U1 = float()
                 U2 = float()
                 Ustride = integer()
                 Uorder = integer()
                 V1 = float()
                 V2 = float()
                 Vstride = integer()
                 Vorder = integer()
                 Points = binary()

              glMap

              See external documentation.

       getMapdv(Target, Query, V) -> ok

              Types:

                 Target = enum()
                 Query = enum()
                 V = mem()

              Return evaluator parameters

              gl:map1d/6  and  gl:map1d/6  define  evaluators.  gl:getMap  returns  evaluator parameters. Target
              chooses a map, Query selects a specific parameter, and V points to storage where the  values  will
              be returned.

              See external documentation.

       getMapfv(Target, Query, V) -> ok

              Types:

                 Target = enum()
                 Query = enum()
                 V = mem()

              See getMapdv/3

       getMapiv(Target, Query, V) -> ok

              Types:

                 Target = enum()
                 Query = enum()
                 V = mem()

              See getMapdv/3

       evalCoord1d(U) -> ok

              Types:

                 U = float()

              Evaluate enabled one- and two-dimensional maps

              gl:evalCoord1  evaluates  enabled one-dimensional maps at argument U . gl:evalCoord2 does the same
              for two-dimensional maps using two domain values, U and V . To define a map, call  gl:map1d/6  and
              gl:map1d/6 ; to enable and disable it, call gl:enable/1 and gl:enable/1 .

              See external documentation.

       evalCoord1f(U) -> ok

              Types:

                 U = float()

              See evalCoord1d/1

       evalCoord1dv(U) -> ok

              Types:

                 U = {U::float()}

              Equivalent to evalCoord1d(U).

       evalCoord1fv(U) -> ok

              Types:

                 U = {U::float()}

              Equivalent to evalCoord1f(U).

       evalCoord2d(U, V) -> ok

              Types:

                 U = float()
                 V = float()

              See evalCoord1d/1

       evalCoord2f(U, V) -> ok

              Types:

                 U = float()
                 V = float()

              See evalCoord1d/1

       evalCoord2dv(U) -> ok

              Types:

                 U = {U::float(), V::float()}

              Equivalent to evalCoord2d(U, V).

       evalCoord2fv(U) -> ok

              Types:

                 U = {U::float(), V::float()}

              Equivalent to evalCoord2f(U, V).

       mapGrid1d(Un, U1, U2) -> ok

              Types:

                 Un = integer()
                 U1 = float()
                 U2 = float()

              Define a one- or two-dimensional mesh

              gl:mapGrid  and  gl:evalMesh1/3 are used together to efficiently generate and evaluate a series of
              evenly-spaced map domain values. gl:evalMesh1/3 steps through the integer domain of a one- or two-
              dimensional  grid,  whose  range  is the domain of the evaluation maps specified by gl:map1d/6 and
              gl:map1d/6 .

              See external documentation.

       mapGrid1f(Un, U1, U2) -> ok

              Types:

                 Un = integer()
                 U1 = float()
                 U2 = float()

              See mapGrid1d/3

       mapGrid2d(Un, U1, U2, Vn, V1, V2) -> ok

              Types:

                 Un = integer()
                 U1 = float()
                 U2 = float()
                 Vn = integer()
                 V1 = float()
                 V2 = float()

              See mapGrid1d/3

       mapGrid2f(Un, U1, U2, Vn, V1, V2) -> ok

              Types:

                 Un = integer()
                 U1 = float()
                 U2 = float()
                 Vn = integer()
                 V1 = float()
                 V2 = float()

              See mapGrid1d/3

       evalPoint1(I) -> ok

              Types:

                 I = integer()

              Generate and evaluate a single point in a mesh

              gl:mapGrid1d/3 and gl:evalMesh1/3 are used in tandem to efficiently generate and evaluate a series
              of  evenly  spaced  map domain values. gl:evalPoint can be used to evaluate a single grid point in
              the same gridspace that is traversed by gl:evalMesh1/3 . Calling gl:evalPoint1  is  equivalent  to
              calling glEvalCoord1( i.&Delta; u+u 1 ); where &Delta; u=(u 2-u 1)/n

              See external documentation.

       evalPoint2(I, J) -> ok

              Types:

                 I = integer()
                 J = integer()

              See evalPoint1/1

       evalMesh1(Mode, I1, I2) -> ok

              Types:

                 Mode = enum()
                 I1 = integer()
                 I2 = integer()

              Compute a one- or two-dimensional grid of points or lines

              gl:mapGrid1d/3 and gl:evalMesh are used in tandem to efficiently generate and evaluate a series of
              evenly-spaced map domain values. gl:evalMesh steps through the integer domain of a  one-  or  two-
              dimensional  grid,  whose  range  is the domain of the evaluation maps specified by gl:map1d/6 and
              gl:map1d/6 . Mode determines whether the resulting vertices are connected  as  points,  lines,  or
              filled polygons.

              See external documentation.

       evalMesh2(Mode, I1, I2, J1, J2) -> ok

              Types:

                 Mode = enum()
                 I1 = integer()
                 I2 = integer()
                 J1 = integer()
                 J2 = integer()

              See evalMesh1/3

       fogf(Pname, Param) -> ok

              Types:

                 Pname = enum()
                 Param = float()

              Specify fog parameters

              Fog  is  initially  disabled.  While  enabled, fog affects rasterized geometry, bitmaps, and pixel
              blocks, but not buffer  clear  operations.  To  enable  and  disable  fog,  call  gl:enable/1  and
              gl:enable/1 with argument ?GL_FOG.

              See external documentation.

       fogi(Pname, Param) -> ok

              Types:

                 Pname = enum()
                 Param = integer()

              See fogf/2

       fogfv(Pname, Params) -> ok

              Types:

                 Pname = enum()
                 Params = tuple()

              See fogf/2

       fogiv(Pname, Params) -> ok

              Types:

                 Pname = enum()
                 Params = tuple()

              See fogf/2

       feedbackBuffer(Size, Type, Buffer) -> ok

              Types:

                 Size = integer()
                 Type = enum()
                 Buffer = mem()

              Controls feedback mode

              The gl:feedbackBuffer function controls feedback. Feedback, like selection, is a GL mode. The mode
              is selected by calling gl:renderMode/1 with ?GL_FEEDBACK. When the GL  is  in  feedback  mode,  no
              pixels  are  produced by rasterization. Instead, information about primitives that would have been
              rasterized is fed back to the application using the GL.

              See external documentation.

       passThrough(Token) -> ok

              Types:

                 Token = float()

              Place a marker in the feedback buffer

              See external documentation.

       selectBuffer(Size, Buffer) -> ok

              Types:

                 Size = integer()
                 Buffer = mem()

              Establish a buffer for selection mode values

              gl:selectBuffer has two arguments: Buffer is a pointer to an array of unsigned integers, and  Size
              indicates  the  size of the array. Buffer returns values from the name stack (see gl:initNames/0 ,
              gl:loadName/1 , gl:pushName/1 ) when the rendering mode  is  ?GL_SELECT  (see  gl:renderMode/1  ).
              gl:selectBuffer  must  be issued before selection mode is enabled, and it must not be issued while
              the rendering mode is ?GL_SELECT.

              See external documentation.

       initNames() -> ok

              Initialize the name stack

              The name stack is used during selection mode to allow sets of rendering commands  to  be  uniquely
              identified. It consists of an ordered set of unsigned integers. gl:initNames causes the name stack
              to be initialized to its default empty state.

              See external documentation.

       loadName(Name) -> ok

              Types:

                 Name = integer()

              Load a name onto the name stack

              The name stack is used during selection mode to allow sets of rendering commands  to  be  uniquely
              identified. It consists of an ordered set of unsigned integers and is initially empty.

              See external documentation.

       pushName(Name) -> ok

              Types:

                 Name = integer()

              Push and pop the name stack

              The  name  stack  is used during selection mode to allow sets of rendering commands to be uniquely
              identified. It consists of an ordered set of unsigned integers and is initially empty.

              See external documentation.

       popName() -> ok

              See pushName/1

       blendColor(Red, Green, Blue, Alpha) -> ok

              Types:

                 Red = clamp()
                 Green = clamp()
                 Blue = clamp()
                 Alpha = clamp()

              Set the blend color

              The ?GL_BLEND_COLOR may be used to calculate the source  and  destination  blending  factors.  The
              color  components  are  clamped  to  the range [0 1] before being stored. See gl:blendFunc/2 for a
              complete description of the blending operations. Initially the ?GL_BLEND_COLOR is set to (0, 0, 0,
              0).

              See external documentation.

       blendEquation(Mode) -> ok

              Types:

                 Mode = enum()

              Specify the equation used for both the RGB blend equation and the Alpha blend equation

              The  blend  equations  determine  how  a new pixel (the ''source'' color) is combined with a pixel
              already in the framebuffer (the ''destination'' color). This function  sets  both  the  RGB  blend
              equation  and the alpha blend equation to a single equation. gl:blendEquationi specifies the blend
              equation for a single draw buffer whereas gl:blendEquation sets the blend equation  for  all  draw
              buffers.

              See external documentation.

       drawRangeElements(Mode, Start, End, Count, Type, Indices) -> ok

              Types:

                 Mode = enum()
                 Start = integer()
                 End = integer()
                 Count = integer()
                 Type = enum()
                 Indices = offset() | mem()

              Render primitives from array data

              gl:drawRangeElements  is  a  restricted form of gl:drawElements/4 . Mode , Start , End , and Count
              match the corresponding arguments to gl:drawElements/4 , with the additional constraint  that  all
              values in the arrays Count must lie between Start and End , inclusive.

              See external documentation.

       texImage3D(Target, Level, InternalFormat, Width, Height, Depth, Border, Format, Type, Pixels) -> ok

              Types:

                 Target = enum()
                 Level = integer()
                 InternalFormat = integer()
                 Width = integer()
                 Height = integer()
                 Depth = integer()
                 Border = integer()
                 Format = enum()
                 Type = enum()
                 Pixels = offset() | mem()

              Specify a three-dimensional texture image

              Texturing  maps  a  portion  of  a specified texture image onto each graphical primitive for which
              texturing is enabled. To enable and disable  three-dimensional  texturing,  call  gl:enable/1  and
              gl:enable/1 with argument ?GL_TEXTURE_3D.

              See external documentation.

       texSubImage3D(Target, Level, Xoffset, Yoffset, Zoffset, Width, Height, Depth, Format, Type, Pixels) -> ok

              Types:

                 Target = enum()
                 Level = integer()
                 Xoffset = integer()
                 Yoffset = integer()
                 Zoffset = integer()
                 Width = integer()
                 Height = integer()
                 Depth = integer()
                 Format = enum()
                 Type = enum()
                 Pixels = offset() | mem()

              glTexSubImage

              See external documentation.

       copyTexSubImage3D(Target, Level, Xoffset, Yoffset, Zoffset, X, Y, Width, Height) -> ok

              Types:

                 Target = enum()
                 Level = integer()
                 Xoffset = integer()
                 Yoffset = integer()
                 Zoffset = integer()
                 X = integer()
                 Y = integer()
                 Width = integer()
                 Height = integer()

              Copy a three-dimensional texture subimage

              gl:copyTexSubImage3D  replaces  a  rectangular  portion  of a three-dimensional texture image with
              pixels from the current ?GL_READ_BUFFER (rather  than  from  main  memory,  as  is  the  case  for
              gl:texSubImage1D/7 ).

              See external documentation.

       colorTable(Target, Internalformat, Width, Format, Type, Table) -> ok

              Types:

                 Target = enum()
                 Internalformat = enum()
                 Width = integer()
                 Format = enum()
                 Type = enum()
                 Table = offset() | mem()

              Define a color lookup table

              gl:colorTable  may  be  used in two ways: to test the actual size and color resolution of a lookup
              table given a particular set of parameters, or to load the contents of a color lookup  table.  Use
              the targets ?GL_PROXY_* for the first case and the other targets for the second case.

              See external documentation.

       colorTableParameterfv(Target, Pname, Params) -> ok

              Types:

                 Target = enum()
                 Pname = enum()
                 Params = {float(), float(), float(), float()}

              Set color lookup table parameters

              gl:colorTableParameter  is  used  to  specify  the  scale  factors and bias terms applied to color
              components when they are loaded into a color table. Target indicates which color table  the  scale
              and  bias terms apply to; it must be set to ?GL_COLOR_TABLE, ?GL_POST_CONVOLUTION_COLOR_TABLE , or
              ?GL_POST_COLOR_MATRIX_COLOR_TABLE.

              See external documentation.

       colorTableParameteriv(Target, Pname, Params) -> ok

              Types:

                 Target = enum()
                 Pname = enum()
                 Params = {integer(), integer(), integer(), integer()}

              See colorTableParameterfv/3

       copyColorTable(Target, Internalformat, X, Y, Width) -> ok

              Types:

                 Target = enum()
                 Internalformat = enum()
                 X = integer()
                 Y = integer()
                 Width = integer()

              Copy pixels into a color table

              gl:copyColorTable loads a color table with pixels from the current  ?GL_READ_BUFFER  (rather  than
              from main memory, as is the case for gl:colorTable/6 ).

              See external documentation.

       getColorTable(Target, Format, Type, Table) -> ok

              Types:

                 Target = enum()
                 Format = enum()
                 Type = enum()
                 Table = mem()

              Retrieve contents of a color lookup table

              gl:getColorTable  returns  in Table the contents of the color table specified by Target . No pixel
              transfer operations are performed, but pixel storage modes that are applicable to  gl:readPixels/7
              are performed.

              See external documentation.

       getColorTableParameterfv(Target, Pname) -> {float(), float(), float(), float()}

              Types:

                 Target = enum()
                 Pname = enum()

              Get color lookup table parameters

              Returns parameters specific to color table Target .

              See external documentation.

       getColorTableParameteriv(Target, Pname) -> {integer(), integer(), integer(), integer()}

              Types:

                 Target = enum()
                 Pname = enum()

              See getColorTableParameterfv/2

       colorSubTable(Target, Start, Count, Format, Type, Data) -> ok

              Types:

                 Target = enum()
                 Start = integer()
                 Count = integer()
                 Format = enum()
                 Type = enum()
                 Data = offset() | mem()

              Respecify a portion of a color table

              gl:colorSubTable  is  used  to  respecify a contiguous portion of a color table previously defined
              using gl:colorTable/6 . The pixels referenced by Data replace the portion of  the  existing  table
              from  indices  Start  to start+count-1, inclusive. This region may not include any entries outside
              the range of the color table as it was originally specified. It is  not  an  error  to  specify  a
              subtexture with width of 0, but such a specification has no effect.

              See external documentation.

       copyColorSubTable(Target, Start, X, Y, Width) -> ok

              Types:

                 Target = enum()
                 Start = integer()
                 X = integer()
                 Y = integer()
                 Width = integer()

              Respecify a portion of a color table

              gl:copyColorSubTable is used to respecify a contiguous portion of a color table previously defined
              using gl:colorTable/6 . The pixels copied from the framebuffer replace the portion of the existing
              table  from indices Start to start+x-1, inclusive. This region may not include any entries outside
              the range of the color table, as was originally specified.  It  is  not  an  error  to  specify  a
              subtexture with width of 0, but such a specification has no effect.

              See external documentation.

       convolutionFilter1D(Target, Internalformat, Width, Format, Type, Image) -> ok

              Types:

                 Target = enum()
                 Internalformat = enum()
                 Width = integer()
                 Format = enum()
                 Type = enum()
                 Image = offset() | mem()

              Define a one-dimensional convolution filter

              gl:convolutionFilter1D builds a one-dimensional convolution filter kernel from an array of pixels.

              See external documentation.

       convolutionFilter2D(Target, Internalformat, Width, Height, Format, Type, Image) -> ok

              Types:

                 Target = enum()
                 Internalformat = enum()
                 Width = integer()
                 Height = integer()
                 Format = enum()
                 Type = enum()
                 Image = offset() | mem()

              Define a two-dimensional convolution filter

              gl:convolutionFilter2D builds a two-dimensional convolution filter kernel from an array of pixels.

              See external documentation.

       convolutionParameterf(Target, Pname, Params) -> ok

              Types:

                 Target = enum()
                 Pname = enum()
                 Params = tuple()

              Set convolution parameters

              gl:convolutionParameter sets the value of a convolution parameter.

              See external documentation.

       convolutionParameterfv(Target::enum(), Pname::enum(), Params) -> ok

              Types:

                 Params = {Params::tuple()}

              Equivalent to convolutionParameterf(Target, Pname, Params).

       convolutionParameteri(Target, Pname, Params) -> ok

              Types:

                 Target = enum()
                 Pname = enum()
                 Params = tuple()

              See convolutionParameterf/3

       convolutionParameteriv(Target::enum(), Pname::enum(), Params) -> ok

              Types:

                 Params = {Params::tuple()}

              Equivalent to convolutionParameteri(Target, Pname, Params).

       copyConvolutionFilter1D(Target, Internalformat, X, Y, Width) -> ok

              Types:

                 Target = enum()
                 Internalformat = enum()
                 X = integer()
                 Y = integer()
                 Width = integer()

              Copy pixels into a one-dimensional convolution filter

              gl:copyConvolutionFilter1D  defines  a  one-dimensional convolution filter kernel with pixels from
              the  current  ?GL_READ_BUFFER  (rather   than   from   main   memory,   as   is   the   case   for
              gl:convolutionFilter1D/6 ).

              See external documentation.

       copyConvolutionFilter2D(Target, Internalformat, X, Y, Width, Height) -> ok

              Types:

                 Target = enum()
                 Internalformat = enum()
                 X = integer()
                 Y = integer()
                 Width = integer()
                 Height = integer()

              Copy pixels into a two-dimensional convolution filter

              gl:copyConvolutionFilter2D  defines  a  two-dimensional convolution filter kernel with pixels from
              the  current  ?GL_READ_BUFFER  (rather   than   from   main   memory,   as   is   the   case   for
              gl:convolutionFilter2D/7 ).

              See external documentation.

       getConvolutionFilter(Target, Format, Type, Image) -> ok

              Types:

                 Target = enum()
                 Format = enum()
                 Type = enum()
                 Image = mem()

              Get current 1D or 2D convolution filter kernel

              gl:getConvolutionFilter  returns  the  current 1D or 2D convolution filter kernel as an image. The
              one- or two-dimensional image is placed in Image according to the  specifications  in  Format  and
              Type  .  No  pixel transfer operations are performed on this image, but the relevant pixel storage
              modes are applied.

              See external documentation.

       getConvolutionParameterfv(Target, Pname) -> {float(), float(), float(), float()}

              Types:

                 Target = enum()
                 Pname = enum()

              Get convolution parameters

              gl:getConvolutionParameter retrieves convolution parameters. Target determines  which  convolution
              filter is queried. Pname determines which parameter is returned:

              See external documentation.

       getConvolutionParameteriv(Target, Pname) -> {integer(), integer(), integer(), integer()}

              Types:

                 Target = enum()
                 Pname = enum()

              See getConvolutionParameterfv/2

       separableFilter2D(Target, Internalformat, Width, Height, Format, Type, Row, Column) -> ok

              Types:

                 Target = enum()
                 Internalformat = enum()
                 Width = integer()
                 Height = integer()
                 Format = enum()
                 Type = enum()
                 Row = offset() | mem()
                 Column = offset() | mem()

              Define a separable two-dimensional convolution filter

              gl:separableFilter2D  builds a two-dimensional separable convolution filter kernel from two arrays
              of pixels.

              See external documentation.

       getHistogram(Target, Reset, Format, Type, Values) -> ok

              Types:

                 Target = enum()
                 Reset = 0 | 1
                 Format = enum()
                 Type = enum()
                 Values = mem()

              Get histogram table

              gl:getHistogram returns the current histogram table as a one-dimensional image with the same width
              as  the  histogram.  No  pixel  transfer operations are performed on this image, but pixel storage
              modes that are applicable to 1D images are honored.

              See external documentation.

       getHistogramParameterfv(Target, Pname) -> {float()}

              Types:

                 Target = enum()
                 Pname = enum()

              Get histogram parameters

              gl:getHistogramParameter is used to query parameter values for the  current  histogram  or  for  a
              proxy.  The  histogram state information may be queried by calling gl:getHistogramParameter with a
              Target  of  ?GL_HISTOGRAM  (to  obtain  information  for   the   current   histogram   table)   or
              ?GL_PROXY_HISTOGRAM  (to  obtain  information  from  the most recent proxy request) and one of the
              following values for the Pname argument:

              See external documentation.

       getHistogramParameteriv(Target, Pname) -> {integer()}

              Types:

                 Target = enum()
                 Pname = enum()

              See getHistogramParameterfv/2

       getMinmax(Target, Reset, Format, Types, Values) -> ok

              Types:

                 Target = enum()
                 Reset = 0 | 1
                 Format = enum()
                 Types = enum()
                 Values = mem()

              Get minimum and maximum pixel values

              gl:getMinmax returns the accumulated minimum and maximum pixel values (computed on a per-component
              basis)  in  a one-dimensional image of width 2. The first set of return values are the minima, and
              the second set of return values are the maxima. The format of the return values is  determined  by
              Format , and their type is determined by Types .

              See external documentation.

       getMinmaxParameterfv(Target, Pname) -> {float()}

              Types:

                 Target = enum()
                 Pname = enum()

              Get minmax parameters

              gl:getMinmaxParameter retrieves parameters for the current minmax table by setting Pname to one of
              the following values:

              See external documentation.

       getMinmaxParameteriv(Target, Pname) -> {integer()}

              Types:

                 Target = enum()
                 Pname = enum()

              See getMinmaxParameterfv/2

       histogram(Target, Width, Internalformat, Sink) -> ok

              Types:

                 Target = enum()
                 Width = integer()
                 Internalformat = enum()
                 Sink = 0 | 1

              Define histogram table

              When ?GL_HISTOGRAM is enabled, RGBA color components are converted to histogram table  indices  by
              clamping  to the range [0,1], multiplying by the width of the histogram table, and rounding to the
              nearest integer. The table entries selected by the RGBA indices  are  then  incremented.  (If  the
              internal format of the histogram table includes luminance, then the index derived from the R color
              component determines the luminance table entry to be incremented.) If a histogram table  entry  is
              incremented beyond its maximum value, then its value becomes undefined. (This is not an error.)

              See external documentation.

       minmax(Target, Internalformat, Sink) -> ok

              Types:

                 Target = enum()
                 Internalformat = enum()
                 Sink = 0 | 1

              Define minmax table

              When ?GL_MINMAX is enabled, the RGBA components of incoming pixels are compared to the minimum and
              maximum values for each component, which are stored in the two-element minmax  table.  (The  first
              element  stores  the  minima,  and  the second element stores the maxima.) If a pixel component is
              greater than the corresponding component in the maximum  element,  then  the  maximum  element  is
              updated  with  the  pixel  component  value.  If  a pixel component is less than the corresponding
              component in the minimum element, then the minimum element is updated  with  the  pixel  component
              value.  (In  both cases, if the internal format of the minmax table includes luminance, then the R
              color component of incoming pixels is used for comparison.) The contents of the minmax  table  may
              be  retrieved  at  a  later  time  by  calling gl:getMinmax/5 . The minmax operation is enabled or
              disabled by calling gl:enable/1 or gl:enable/1 , respectively, with an argument of ?GL_MINMAX .

              See external documentation.

       resetHistogram(Target) -> ok

              Types:

                 Target = enum()

              Reset histogram table entries to zero

              gl:resetHistogram resets all the elements of the current histogram table to zero.

              See external documentation.

       resetMinmax(Target) -> ok

              Types:

                 Target = enum()

              Reset minmax table entries to initial values

              gl:resetMinmax resets the elements of the current  minmax  table  to  their  initial  values:  the
              maximum  element  receives the minimum possible component values, and the minimum element receives
              the maximum possible component values.

              See external documentation.

       activeTexture(Texture) -> ok

              Types:

                 Texture = enum()

              Select active texture unit

              gl:activeTexture selects which texture unit subsequent texture state calls will affect. The number
              of texture units an implementation supports is implementation dependent, but must be at least 80.

              See external documentation.

       sampleCoverage(Value, Invert) -> ok

              Types:

                 Value = clamp()
                 Invert = 0 | 1

              Specify multisample coverage parameters

              Multisampling  samples  a  pixel  multiple  times  at  various  implementation-dependent  subpixel
              locations to generate antialiasing effects. Multisampling transparently antialiases points, lines,
              polygons, and images if it is enabled.

              See external documentation.

       compressedTexImage3D(Target, Level, Internalformat, Width, Height, Depth, Border, ImageSize, Data) -> ok

              Types:

                 Target = enum()
                 Level = integer()
                 Internalformat = enum()
                 Width = integer()
                 Height = integer()
                 Depth = integer()
                 Border = integer()
                 ImageSize = integer()
                 Data = offset() | mem()

              Specify a three-dimensional texture image in a compressed format

              Texturing allows elements of an image array to be read by shaders.

              See external documentation.

       compressedTexImage2D(Target, Level, Internalformat, Width, Height, Border, ImageSize, Data) -> ok

              Types:

                 Target = enum()
                 Level = integer()
                 Internalformat = enum()
                 Width = integer()
                 Height = integer()
                 Border = integer()
                 ImageSize = integer()
                 Data = offset() | mem()

              Specify a two-dimensional texture image in a compressed format

              Texturing allows elements of an image array to be read by shaders.

              See external documentation.

       compressedTexImage1D(Target, Level, Internalformat, Width, Border, ImageSize, Data) -> ok

              Types:

                 Target = enum()
                 Level = integer()
                 Internalformat = enum()
                 Width = integer()
                 Border = integer()
                 ImageSize = integer()
                 Data = offset() | mem()

              Specify a one-dimensional texture image in a compressed format

              Texturing allows elements of an image array to be read by shaders.

              See external documentation.

       compressedTexSubImage3D(Target,   Level,   Xoffset,  Yoffset,  Zoffset,  Width,  Height,  Depth,  Format,
       ImageSize, Data) -> ok

              Types:

                 Target = enum()
                 Level = integer()
                 Xoffset = integer()
                 Yoffset = integer()
                 Zoffset = integer()
                 Width = integer()
                 Height = integer()
                 Depth = integer()
                 Format = enum()
                 ImageSize = integer()
                 Data = offset() | mem()

              Specify a three-dimensional texture subimage in a compressed format

              Texturing allows elements of an image array to be read by shaders.

              See external documentation.

       compressedTexSubImage2D(Target, Level, Xoffset, Yoffset, Width, Height, Format, ImageSize, Data) -> ok

              Types:

                 Target = enum()
                 Level = integer()
                 Xoffset = integer()
                 Yoffset = integer()
                 Width = integer()
                 Height = integer()
                 Format = enum()
                 ImageSize = integer()
                 Data = offset() | mem()

              Specify a two-dimensional texture subimage in a compressed format

              Texturing allows elements of an image array to be read by shaders.

              See external documentation.

       compressedTexSubImage1D(Target, Level, Xoffset, Width, Format, ImageSize, Data) -> ok

              Types:

                 Target = enum()
                 Level = integer()
                 Xoffset = integer()
                 Width = integer()
                 Format = enum()
                 ImageSize = integer()
                 Data = offset() | mem()

              Specify a one-dimensional texture subimage in a compressed format

              Texturing allows elements of an image array to be read by shaders.

              See external documentation.

       getCompressedTexImage(Target, Lod, Img) -> ok

              Types:

                 Target = enum()
                 Lod = integer()
                 Img = mem()

              Return a compressed texture image

              gl:getCompressedTexImage returns the compressed texture image associated with Target and Lod  into
              Img  . Img should be an array of ?GL_TEXTURE_COMPRESSED_IMAGE_SIZE bytes. Target specifies whether
              the desired texture image was one specified by gl:texImage1D/8  (?GL_TEXTURE_1D),  gl:texImage2D/9
              (?GL_TEXTURE_2D  or  any  of  ?GL_TEXTURE_CUBE_MAP_*  ), or gl:texImage3D/10 (?GL_TEXTURE_3D). Lod
              specifies the level-of-detail number of the desired image.

              See external documentation.

       clientActiveTexture(Texture) -> ok

              Types:

                 Texture = enum()

              Select active texture unit

              gl:clientActiveTexture selects the  vertex  array  client  state  parameters  to  be  modified  by
              gl:texCoordPointer/4    ,    and    enabled    or    disabled   with   gl:enableClientState/1   or
              gl:enableClientState/1 , respectively, when called with a parameter of ?GL_TEXTURE_COORD_ARRAY .

              See external documentation.

       multiTexCoord1d(Target, S) -> ok

              Types:

                 Target = enum()
                 S = float()

              Set the current texture coordinates

              gl:multiTexCoord  specifies  texture  coordinates  in  one,  two,  three,  or   four   dimensions.
              gl:multiTexCoord1  sets  the current texture coordinates to (s 0 0 1); a call to gl:multiTexCoord2
              sets them to (s t 0 1). Similarly, gl:multiTexCoord3 specifies the texture coordinates as (s  t  r
              1), and gl:multiTexCoord4 defines all four components explicitly as (s t r q).

              See external documentation.

       multiTexCoord1dv(Target::enum(), V) -> ok

              Types:

                 V = {S::float()}

              Equivalent to multiTexCoord1d(Target, S).

       multiTexCoord1f(Target, S) -> ok

              Types:

                 Target = enum()
                 S = float()

              See multiTexCoord1d/2

       multiTexCoord1fv(Target::enum(), V) -> ok

              Types:

                 V = {S::float()}

              Equivalent to multiTexCoord1f(Target, S).

       multiTexCoord1i(Target, S) -> ok

              Types:

                 Target = enum()
                 S = integer()

              See multiTexCoord1d/2

       multiTexCoord1iv(Target::enum(), V) -> ok

              Types:

                 V = {S::integer()}

              Equivalent to multiTexCoord1i(Target, S).

       multiTexCoord1s(Target, S) -> ok

              Types:

                 Target = enum()
                 S = integer()

              See multiTexCoord1d/2

       multiTexCoord1sv(Target::enum(), V) -> ok

              Types:

                 V = {S::integer()}

              Equivalent to multiTexCoord1s(Target, S).

       multiTexCoord2d(Target, S, T) -> ok

              Types:

                 Target = enum()
                 S = float()
                 T = float()

              See multiTexCoord1d/2

       multiTexCoord2dv(Target::enum(), V) -> ok

              Types:

                 V = {S::float(), T::float()}

              Equivalent to multiTexCoord2d(Target, S, T).

       multiTexCoord2f(Target, S, T) -> ok

              Types:

                 Target = enum()
                 S = float()
                 T = float()

              See multiTexCoord1d/2

       multiTexCoord2fv(Target::enum(), V) -> ok

              Types:

                 V = {S::float(), T::float()}

              Equivalent to multiTexCoord2f(Target, S, T).

       multiTexCoord2i(Target, S, T) -> ok

              Types:

                 Target = enum()
                 S = integer()
                 T = integer()

              See multiTexCoord1d/2

       multiTexCoord2iv(Target::enum(), V) -> ok

              Types:

                 V = {S::integer(), T::integer()}

              Equivalent to multiTexCoord2i(Target, S, T).

       multiTexCoord2s(Target, S, T) -> ok

              Types:

                 Target = enum()
                 S = integer()
                 T = integer()

              See multiTexCoord1d/2

       multiTexCoord2sv(Target::enum(), V) -> ok

              Types:

                 V = {S::integer(), T::integer()}

              Equivalent to multiTexCoord2s(Target, S, T).

       multiTexCoord3d(Target, S, T, R) -> ok

              Types:

                 Target = enum()
                 S = float()
                 T = float()
                 R = float()

              See multiTexCoord1d/2

       multiTexCoord3dv(Target::enum(), V) -> ok

              Types:

                 V = {S::float(), T::float(), R::float()}

              Equivalent to multiTexCoord3d(Target, S, T, R).

       multiTexCoord3f(Target, S, T, R) -> ok

              Types:

                 Target = enum()
                 S = float()
                 T = float()
                 R = float()

              See multiTexCoord1d/2

       multiTexCoord3fv(Target::enum(), V) -> ok

              Types:

                 V = {S::float(), T::float(), R::float()}

              Equivalent to multiTexCoord3f(Target, S, T, R).

       multiTexCoord3i(Target, S, T, R) -> ok

              Types:

                 Target = enum()
                 S = integer()
                 T = integer()
                 R = integer()

              See multiTexCoord1d/2

       multiTexCoord3iv(Target::enum(), V) -> ok

              Types:

                 V = {S::integer(), T::integer(), R::integer()}

              Equivalent to multiTexCoord3i(Target, S, T, R).

       multiTexCoord3s(Target, S, T, R) -> ok

              Types:

                 Target = enum()
                 S = integer()
                 T = integer()
                 R = integer()

              See multiTexCoord1d/2

       multiTexCoord3sv(Target::enum(), V) -> ok

              Types:

                 V = {S::integer(), T::integer(), R::integer()}

              Equivalent to multiTexCoord3s(Target, S, T, R).

       multiTexCoord4d(Target, S, T, R, Q) -> ok

              Types:

                 Target = enum()
                 S = float()
                 T = float()
                 R = float()
                 Q = float()

              See multiTexCoord1d/2

       multiTexCoord4dv(Target::enum(), V) -> ok

              Types:

                 V = {S::float(), T::float(), R::float(), Q::float()}

              Equivalent to multiTexCoord4d(Target, S, T, R, Q).

       multiTexCoord4f(Target, S, T, R, Q) -> ok

              Types:

                 Target = enum()
                 S = float()
                 T = float()
                 R = float()
                 Q = float()

              See multiTexCoord1d/2

       multiTexCoord4fv(Target::enum(), V) -> ok

              Types:

                 V = {S::float(), T::float(), R::float(), Q::float()}

              Equivalent to multiTexCoord4f(Target, S, T, R, Q).

       multiTexCoord4i(Target, S, T, R, Q) -> ok

              Types:

                 Target = enum()
                 S = integer()
                 T = integer()
                 R = integer()
                 Q = integer()

              See multiTexCoord1d/2

       multiTexCoord4iv(Target::enum(), V) -> ok

              Types:

                 V = {S::integer(), T::integer(), R::integer(), Q::integer()}

              Equivalent to multiTexCoord4i(Target, S, T, R, Q).

       multiTexCoord4s(Target, S, T, R, Q) -> ok

              Types:

                 Target = enum()
                 S = integer()
                 T = integer()
                 R = integer()
                 Q = integer()

              See multiTexCoord1d/2

       multiTexCoord4sv(Target::enum(), V) -> ok

              Types:

                 V = {S::integer(), T::integer(), R::integer(), Q::integer()}

              Equivalent to multiTexCoord4s(Target, S, T, R, Q).

       loadTransposeMatrixf(M) -> ok

              Types:

                 M = matrix()

              Replace the current matrix with the specified row-major ordered matrix

              gl:loadTransposeMatrix  replaces the current matrix with the one whose elements are specified by M
              . The current matrix is the projection matrix, modelview matrix, or texture matrix,  depending  on
              the current matrix mode (see gl:matrixMode/1 ).

              See external documentation.

       loadTransposeMatrixd(M) -> ok

              Types:

                 M = matrix()

              See loadTransposeMatrixf/1

       multTransposeMatrixf(M) -> ok

              Types:

                 M = matrix()

              Multiply the current matrix with the specified row-major ordered matrix

              gl:multTransposeMatrix multiplies the current matrix with the one specified using M , and replaces
              the current matrix with the product.

              See external documentation.

       multTransposeMatrixd(M) -> ok

              Types:

                 M = matrix()

              See multTransposeMatrixf/1

       blendFuncSeparate(SfactorRGB, DfactorRGB, SfactorAlpha, DfactorAlpha) -> ok

              Types:

                 SfactorRGB = enum()
                 DfactorRGB = enum()
                 SfactorAlpha = enum()
                 DfactorAlpha = enum()

              Specify pixel arithmetic for RGB and alpha components separately

              Pixels can be drawn using a function that blends the incoming (source) RGBA values with  the  RGBA
              values  that  are  already  in  the  frame  buffer (the destination values). Blending is initially
              disabled. Use gl:enable/1 and gl:enable/1 with argument ?GL_BLEND to enable and disable blending.

              See external documentation.

       multiDrawArrays(Mode, First, Count) -> ok

              Types:

                 Mode = enum()
                 First = [integer()] | mem()
                 Count = [integer()] | mem()

              Render multiple sets of primitives from array data

              gl:multiDrawArrays specifies multiple sets of geometric primitives with very few subroutine calls.
              Instead of calling a GL procedure to pass each individual vertex, normal, texture coordinate, edge
              flag, or color, you can prespecify separate arrays of vertices, normals, and colors and  use  them
              to construct a sequence of primitives with a single call to gl:multiDrawArrays.

              See external documentation.

       pointParameterf(Pname, Param) -> ok

              Types:

                 Pname = enum()
                 Param = float()

              Specify point parameters

              The following values are accepted for Pname :

              See external documentation.

       pointParameterfv(Pname, Params) -> ok

              Types:

                 Pname = enum()
                 Params = tuple()

              See pointParameterf/2

       pointParameteri(Pname, Param) -> ok

              Types:

                 Pname = enum()
                 Param = integer()

              See pointParameterf/2

       pointParameteriv(Pname, Params) -> ok

              Types:

                 Pname = enum()
                 Params = tuple()

              See pointParameterf/2

       fogCoordf(Coord) -> ok

              Types:

                 Coord = float()

              Set the current fog coordinates

              gl:fogCoord  specifies  the  fog  coordinate  that  is associated with each vertex and the current
              raster position. The value specified is interpolated and used in  computing  the  fog  color  (see
              gl:fogf/2 ).

              See external documentation.

       fogCoordfv(Coord) -> ok

              Types:

                 Coord = {Coord::float()}

              Equivalent to fogCoordf(Coord).

       fogCoordd(Coord) -> ok

              Types:

                 Coord = float()

              See fogCoordf/1

       fogCoorddv(Coord) -> ok

              Types:

                 Coord = {Coord::float()}

              Equivalent to fogCoordd(Coord).

       fogCoordPointer(Type, Stride, Pointer) -> ok

              Types:

                 Type = enum()
                 Stride = integer()
                 Pointer = offset() | mem()

              Define an array of fog coordinates

              gl:fogCoordPointer  specifies  the  location and data format of an array of fog coordinates to use
              when rendering. Type specifies the data type of each fog coordinate, and Stride specifies the byte
              stride  from  one fog coordinate to the next, allowing vertices and attributes to be packed into a
              single array or stored in separate arrays.

              See external documentation.

       secondaryColor3b(Red, Green, Blue) -> ok

              Types:

                 Red = integer()
                 Green = integer()
                 Blue = integer()

              Set the current secondary color

              The GL stores both a primary four-valued RGBA color and a secondary four-valued RGBA color  (where
              alpha is always set to 0.0) that is associated with every vertex.

              See external documentation.

       secondaryColor3bv(V) -> ok

              Types:

                 V = {Red::integer(), Green::integer(), Blue::integer()}

              Equivalent to secondaryColor3b(Red, Green, Blue).

       secondaryColor3d(Red, Green, Blue) -> ok

              Types:

                 Red = float()
                 Green = float()
                 Blue = float()

              See secondaryColor3b/3

       secondaryColor3dv(V) -> ok

              Types:

                 V = {Red::float(), Green::float(), Blue::float()}

              Equivalent to secondaryColor3d(Red, Green, Blue).

       secondaryColor3f(Red, Green, Blue) -> ok

              Types:

                 Red = float()
                 Green = float()
                 Blue = float()

              See secondaryColor3b/3

       secondaryColor3fv(V) -> ok

              Types:

                 V = {Red::float(), Green::float(), Blue::float()}

              Equivalent to secondaryColor3f(Red, Green, Blue).

       secondaryColor3i(Red, Green, Blue) -> ok

              Types:

                 Red = integer()
                 Green = integer()
                 Blue = integer()

              See secondaryColor3b/3

       secondaryColor3iv(V) -> ok

              Types:

                 V = {Red::integer(), Green::integer(), Blue::integer()}

              Equivalent to secondaryColor3i(Red, Green, Blue).

       secondaryColor3s(Red, Green, Blue) -> ok

              Types:

                 Red = integer()
                 Green = integer()
                 Blue = integer()

              See secondaryColor3b/3

       secondaryColor3sv(V) -> ok

              Types:

                 V = {Red::integer(), Green::integer(), Blue::integer()}

              Equivalent to secondaryColor3s(Red, Green, Blue).

       secondaryColor3ub(Red, Green, Blue) -> ok

              Types:

                 Red = integer()
                 Green = integer()
                 Blue = integer()

              See secondaryColor3b/3

       secondaryColor3ubv(V) -> ok

              Types:

                 V = {Red::integer(), Green::integer(), Blue::integer()}

              Equivalent to secondaryColor3ub(Red, Green, Blue).

       secondaryColor3ui(Red, Green, Blue) -> ok

              Types:

                 Red = integer()
                 Green = integer()
                 Blue = integer()

              See secondaryColor3b/3

       secondaryColor3uiv(V) -> ok

              Types:

                 V = {Red::integer(), Green::integer(), Blue::integer()}

              Equivalent to secondaryColor3ui(Red, Green, Blue).

       secondaryColor3us(Red, Green, Blue) -> ok

              Types:

                 Red = integer()
                 Green = integer()
                 Blue = integer()

              See secondaryColor3b/3

       secondaryColor3usv(V) -> ok

              Types:

                 V = {Red::integer(), Green::integer(), Blue::integer()}

              Equivalent to secondaryColor3us(Red, Green, Blue).

       secondaryColorPointer(Size, Type, Stride, Pointer) -> ok

              Types:

                 Size = integer()
                 Type = enum()
                 Stride = integer()
                 Pointer = offset() | mem()

              Define an array of secondary colors

              gl:secondaryColorPointer specifies the location and data format of an array of color components to
              use when rendering. Size specifies the number of  components  per  color,  and  must  be  3.  Type
              specifies  the  data  type  of each color component, and Stride specifies the byte stride from one
              color to the next, allowing vertices and attributes to be packed into a single array or stored  in
              separate arrays.

              See external documentation.

       windowPos2d(X, Y) -> ok

              Types:

                 X = float()
                 Y = float()

              Specify the raster position in window coordinates for pixel operations

              The  GL  maintains a 3D position in window coordinates. This position, called the raster position,
              is used to position pixel and bitmap write operations. It is maintained  with  subpixel  accuracy.
              See gl:bitmap/7 , gl:drawPixels/5 , and gl:copyPixels/5 .

              See external documentation.

       windowPos2dv(V) -> ok

              Types:

                 V = {X::float(), Y::float()}

              Equivalent to windowPos2d(X, Y).

       windowPos2f(X, Y) -> ok

              Types:

                 X = float()
                 Y = float()

              See windowPos2d/2

       windowPos2fv(V) -> ok

              Types:

                 V = {X::float(), Y::float()}

              Equivalent to windowPos2f(X, Y).

       windowPos2i(X, Y) -> ok

              Types:

                 X = integer()
                 Y = integer()

              See windowPos2d/2

       windowPos2iv(V) -> ok

              Types:

                 V = {X::integer(), Y::integer()}

              Equivalent to windowPos2i(X, Y).

       windowPos2s(X, Y) -> ok

              Types:

                 X = integer()
                 Y = integer()

              See windowPos2d/2

       windowPos2sv(V) -> ok

              Types:

                 V = {X::integer(), Y::integer()}

              Equivalent to windowPos2s(X, Y).

       windowPos3d(X, Y, Z) -> ok

              Types:

                 X = float()
                 Y = float()
                 Z = float()

              See windowPos2d/2

       windowPos3dv(V) -> ok

              Types:

                 V = {X::float(), Y::float(), Z::float()}

              Equivalent to windowPos3d(X, Y, Z).

       windowPos3f(X, Y, Z) -> ok

              Types:

                 X = float()
                 Y = float()
                 Z = float()

              See windowPos2d/2

       windowPos3fv(V) -> ok

              Types:

                 V = {X::float(), Y::float(), Z::float()}

              Equivalent to windowPos3f(X, Y, Z).

       windowPos3i(X, Y, Z) -> ok

              Types:

                 X = integer()
                 Y = integer()
                 Z = integer()

              See windowPos2d/2

       windowPos3iv(V) -> ok

              Types:

                 V = {X::integer(), Y::integer(), Z::integer()}

              Equivalent to windowPos3i(X, Y, Z).

       windowPos3s(X, Y, Z) -> ok

              Types:

                 X = integer()
                 Y = integer()
                 Z = integer()

              See windowPos2d/2

       windowPos3sv(V) -> ok

              Types:

                 V = {X::integer(), Y::integer(), Z::integer()}

              Equivalent to windowPos3s(X, Y, Z).

       genQueries(N) -> [integer()]

              Types:

                 N = integer()

              Generate query object names

              gl:genQueries  returns  N  query object names in Ids . There is no guarantee that the names form a
              contiguous set of integers; however, it is guaranteed that none of the returned names was  in  use
              immediately before the call to gl:genQueries.

              See external documentation.

       deleteQueries(Ids) -> ok

              Types:

                 Ids = [integer()]

              Delete named query objects

              gl:deleteQueries  deletes  N  query objects named by the elements of the array Ids . After a query
              object is deleted, it  has  no  contents,  and  its  name  is  free  for  reuse  (for  example  by
              gl:genQueries/1 ).

              See external documentation.

       isQuery(Id) -> 0 | 1

              Types:

                 Id = integer()

              Determine if a name corresponds to a query object

              gl:isQuery  returns ?GL_TRUE if Id is currently the name of a query object. If Id is zero, or is a
              non-zero value that is not currently the name of a query object, or if an error occurs, gl:isQuery
              returns ?GL_FALSE.

              See external documentation.

       beginQuery(Target, Id) -> ok

              Types:

                 Target = enum()
                 Id = integer()

              Delimit the boundaries of a query object

              gl:beginQuery  and  gl:beginQuery/2 delimit the boundaries of a query object. Query must be a name
              previously returned from a call to gl:genQueries/1 . If a query object with name Id does  not  yet
              exist it is created with the type determined by Target . Target must be one of ?GL_SAMPLES_PASSED,
              ?GL_ANY_SAMPLES_PASSED, ?GL_PRIMITIVES_GENERATED ,  ?GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN,  or
              ?GL_TIME_ELAPSED. The behavior of the query object depends on its type and is as follows.

              See external documentation.

       endQuery(Target) -> ok

              Types:

                 Target = enum()

              See beginQuery/2

       getQueryiv(Target, Pname) -> integer()

              Types:

                 Target = enum()
                 Pname = enum()

              glGetQuery

              See external documentation.

       getQueryObjectiv(Id, Pname) -> integer()

              Types:

                 Id = integer()
                 Pname = enum()

              Return parameters of a query object

              gl:getQueryObject returns in Params a selected parameter of the query object specified by Id .

              See external documentation.

       getQueryObjectuiv(Id, Pname) -> integer()

              Types:

                 Id = integer()
                 Pname = enum()

              See getQueryObjectiv/2

       bindBuffer(Target, Buffer) -> ok

              Types:

                 Target = enum()
                 Buffer = integer()

              Bind a named buffer object

              gl:bindBuffer  binds  a buffer object to the specified buffer binding point. Calling gl:bindBuffer
              with Target set to one of the accepted symbolic constants and Buffer set to the name of  a  buffer
              object  binds  that buffer object name to the target. If no buffer object with name Buffer exists,
              one is created with that name. When a buffer object is bound to a target, the previous binding for
              that target is automatically broken.

              See external documentation.

       deleteBuffers(Buffers) -> ok

              Types:

                 Buffers = [integer()]

              Delete named buffer objects

              gl:deleteBuffers  deletes  N  buffer  objects named by the elements of the array Buffers . After a
              buffer object is deleted, it has no contents, and its name is  free  for  reuse  (for  example  by
              gl:genBuffers/1 ). If a buffer object that is currently bound is deleted, the binding reverts to 0
              (the absence of any buffer object).

              See external documentation.

       genBuffers(N) -> [integer()]

              Types:

                 N = integer()

              Generate buffer object names

              gl:genBuffers returns N buffer object names in Buffers . There is no guarantee that the names form
              a contiguous set of integers; however, it is guaranteed that none of the returned names was in use
              immediately before the call to gl:genBuffers .

              See external documentation.

       isBuffer(Buffer) -> 0 | 1

              Types:

                 Buffer = integer()

              Determine if a name corresponds to a buffer object

              gl:isBuffer returns ?GL_TRUE if Buffer is currently the name of a  buffer  object.  If  Buffer  is
              zero,  or  is  a  non-zero value that is not currently the name of a buffer object, or if an error
              occurs, gl:isBuffer returns ?GL_FALSE .

              See external documentation.

       bufferData(Target, Size, Data, Usage) -> ok

              Types:

                 Target = enum()
                 Size = integer()
                 Data = offset() | mem()
                 Usage = enum()

              Creates and initializes a buffer object's data store

              gl:bufferData creates a new data store for the buffer object currently bound to Target . Any  pre-
              existing data store is deleted. The new data store is created with the specified Size in bytes and
              Usage . If Data is not ?NULL, the data store is initialized with data from this  pointer.  In  its
              initial  state,  the  new  data store is not mapped, it has a ?NULL mapped pointer, and its mapped
              access is ?GL_READ_WRITE .

              See external documentation.

       bufferSubData(Target, Offset, Size, Data) -> ok

              Types:

                 Target = enum()
                 Offset = integer()
                 Size = integer()
                 Data = offset() | mem()

              Updates a subset of a buffer object's data store

              gl:bufferSubData redefines some or all of the data store for the buffer object currently bound  to
              Target  .  Data  starting at byte offset Offset and extending for Size bytes is copied to the data
              store from the memory pointed to by Data . An error is thrown if Offset and Size together define a
              range beyond the bounds of the buffer object's data store.

              See external documentation.

       getBufferSubData(Target, Offset, Size, Data) -> ok

              Types:

                 Target = enum()
                 Offset = integer()
                 Size = integer()
                 Data = mem()

              Returns a subset of a buffer object's data store

              gl:getBufferSubData  returns  some  or  all  of the data from the buffer object currently bound to
              Target . Data starting at byte offset Offset and extending for Size bytes is copied from the  data
              store  to  the  memory  pointed  to by Data . An error is thrown if the buffer object is currently
              mapped, or if Offset and Size together define a range beyond the bounds  of  the  buffer  object's
              data store.

              See external documentation.

       getBufferParameteriv(Target, Pname) -> integer()

              Types:

                 Target = enum()
                 Pname = enum()

              Return parameters of a buffer object

              gl:getBufferParameteriv  returns  in  Data  a selected parameter of the buffer object specified by
              Target .

              See external documentation.

       blendEquationSeparate(ModeRGB, ModeAlpha) -> ok

              Types:

                 ModeRGB = enum()
                 ModeAlpha = enum()

              Set the RGB blend equation and the alpha blend equation separately

              The blend equations determines how a new pixel (the ''source'' color) is  combined  with  a  pixel
              already  in  the  framebuffer  (the  ''destination''  color).  These  functions specifie one blend
              equation  for  the  RGB-color  components  and  one  blend  equation  for  the  alpha   component.
              gl:blendEquationSeparatei  specifies  the  blend  equations  for  a  single  draw  buffer  whereas
              gl:blendEquationSeparate sets the blend equations for all draw buffers.

              See external documentation.

       drawBuffers(Bufs) -> ok

              Types:

                 Bufs = [enum()]

              Specifies a list of color buffers to be drawn into

              gl:drawBuffers defines an array of buffers into which outputs from the fragment shader  data  will
              be written. If a fragment shader writes a value to one or more user defined output variables, then
              the value of each variable will be written into the buffer specified at  a  location  within  Bufs
              corresponding  to the location assigned to that user defined output. The draw buffer used for user
              defined outputs assigned to locations greater than or equal to N is implicitly set to ?GL_NONE and
              any data written to such an output is discarded.

              See external documentation.

       stencilOpSeparate(Face, Sfail, Dpfail, Dppass) -> ok

              Types:

                 Face = enum()
                 Sfail = enum()
                 Dpfail = enum()
                 Dppass = enum()

              Set front and/or back stencil test actions

              Stenciling, like depth-buffering, enables and disables drawing on a per-pixel basis. You draw into
              the stencil planes using GL drawing primitives, then render geometry and images, using the stencil
              planes  to  mask  out  portions of the screen. Stenciling is typically used in multipass rendering
              algorithms to achieve special effects, such as decals, outlining, and constructive solid  geometry
              rendering.

              See external documentation.

       stencilFuncSeparate(Face, Func, Ref, Mask) -> ok

              Types:

                 Face = enum()
                 Func = enum()
                 Ref = integer()
                 Mask = integer()

              Set front and/or back function and reference value for stencil testing

              Stenciling, like depth-buffering, enables and disables drawing on a per-pixel basis. You draw into
              the stencil planes using GL drawing primitives, then render geometry and images, using the stencil
              planes  to  mask  out  portions of the screen. Stenciling is typically used in multipass rendering
              algorithms to achieve special effects, such as decals, outlining, and constructive solid  geometry
              rendering.

              See external documentation.

       stencilMaskSeparate(Face, Mask) -> ok

              Types:

                 Face = enum()
                 Mask = integer()

              Control the front and/or back writing of individual bits in the stencil planes

              gl:stencilMaskSeparate  controls  the  writing of individual bits in the stencil planes. The least
              significant n bits of Mask , where n is the number of bits in the stencil buffer, specify a  mask.
              Where  a  1  appears  in  the mask, it's possible to write to the corresponding bit in the stencil
              buffer. Where a 0 appears, the corresponding bit  is  write-protected.  Initially,  all  bits  are
              enabled for writing.

              See external documentation.

       attachShader(Program, Shader) -> ok

              Types:

                 Program = integer()
                 Shader = integer()

              Attaches a shader object to a program object

              In  order  to  create a complete shader program, there must be a way to specify the list of things
              that will be linked together. Program objects provide this  mechanism.  Shaders  that  are  to  be
              linked together in a program object must first be attached to that program object. gl:attachShader
              attaches the shader object specified by Shader to the program object specified by Program  .  This
              indicates that Shader will be included in link operations that will be performed on Program .

              See external documentation.

       bindAttribLocation(Program, Index, Name) -> ok

              Types:

                 Program = integer()
                 Index = integer()
                 Name = string()

              Associates a generic vertex attribute index with a named attribute variable

              gl:bindAttribLocation is used to associate a user-defined attribute variable in the program object
              specified by Program with a generic vertex attribute index. The name of the user-defined attribute
              variable  is passed as a null terminated string in Name . The generic vertex attribute index to be
              bound to this variable is specified by Index . When Program is made part of current state,  values
              provided  via  the  generic  vertex  attribute  Index  will  modify  the value of the user-defined
              attribute variable specified by Name .

              See external documentation.

       compileShader(Shader) -> ok

              Types:

                 Shader = integer()

              Compiles a shader object

              gl:compileShader compiles the source code strings that have  been  stored  in  the  shader  object
              specified by Shader .

              See external documentation.

       createProgram() -> integer()

              Creates a program object

              gl:createProgram  creates  an empty program object and returns a non-zero value by which it can be
              referenced. A program object is an object to which shader objects can be attached. This provides a
              mechanism  to specify the shader objects that will be linked to create a program. It also provides
              a means for checking the compatibility of the shaders that will be used to create a  program  (for
              instance,  checking  the  compatibility  between  a  vertex shader and a fragment shader). When no
              longer needed as part of a program object, shader objects can be detached.

              See external documentation.

       createShader(Type) -> integer()

              Types:

                 Type = enum()

              Creates a shader object

              gl:createShader creates an empty shader object and returns a non-zero value by  which  it  can  be
              referenced.  A  shader  object  is  used to maintain the source code strings that define a shader.
              ShaderType indicates the type of shader to be created. Five  types  of  shader  are  supported.  A
              shader  of  type  ?GL_VERTEX_SHADER is a shader that is intended to run on the programmable vertex
              processor. A shader of type ?GL_TESS_CONTROL_SHADER is a shader that is intended  to  run  on  the
              programmable    tessellation    processor    in    the   control   stage.   A   shader   of   type
              ?GL_TESS_EVALUATION_SHADER is a shader that is intended to run on  the  programmable  tessellation
              processor  in  the  evaluation  stage.  A  shader  of type ?GL_GEOMETRY_SHADER is a shader that is
              intended to run on the programmable geometry processor. A shader of type ?GL_FRAGMENT_SHADER is  a
              shader that is intended to run on the programmable fragment processor.

              See external documentation.

       deleteProgram(Program) -> ok

              Types:

                 Program = integer()

              Deletes a program object

              gl:deleteProgram  frees  the  memory  and  invalidates the name associated with the program object
              specified by Program. This command effectively undoes the effects of a call to  gl:createProgram/0
              .

              See external documentation.

       deleteShader(Shader) -> ok

              Types:

                 Shader = integer()

              Deletes a shader object

              gl:deleteShader  frees  the  memory  and  invalidates  the  name associated with the shader object
              specified by Shader . This command effectively undoes the effects of a call to gl:createShader/1 .

              See external documentation.

       detachShader(Program, Shader) -> ok

              Types:

                 Program = integer()
                 Shader = integer()

              Detaches a shader object from a program object to which it is attached

              gl:detachShader detaches the shader object specified by Shader from the program  object  specified
              by Program . This command can be used to undo the effect of the command gl:attachShader/2 .

              See external documentation.

       disableVertexAttribArray(Index) -> ok

              Types:

                 Index = integer()

              Enable or disable a generic vertex attribute array

              gl:enableVertexAttribArray  enables  the  generic  vertex  attribute  array  specified  by Index .
              gl:disableVertexAttribArray disables the generic vertex attribute array specified by  Index  .  By
              default, all client-side capabilities are disabled, including all generic vertex attribute arrays.
              If enabled, the values in the generic vertex  attribute  array  will  be  accessed  and  used  for
              rendering when calls are made to vertex array commands such as gl:drawArrays/3 , gl:drawElements/4
              , gl:drawRangeElements/6 , see glMultiDrawElements , or gl:multiDrawArrays/3 .

              See external documentation.

       enableVertexAttribArray(Index) -> ok

              Types:

                 Index = integer()

              See disableVertexAttribArray/1

       getActiveAttrib(Program, Index, BufSize) -> {Size::integer(), Type::enum(), Name::string()}

              Types:

                 Program = integer()
                 Index = integer()
                 BufSize = integer()

              Returns information about an active attribute variable for the specified program object

              gl:getActiveAttrib returns information about an active attribute variable in  the  program  object
              specified   by   Program   .   The  number  of  active  attributes  can  be  obtained  by  calling
              gl:getProgramiv/2 with the value ?GL_ACTIVE_ATTRIBUTES. A value of 0 for Index selects  the  first
              active  attribute  variable.  Permissible  values  for  Index range from 0 to the number of active
              attribute variables minus 1.

              See external documentation.

       getActiveUniform(Program, Index, BufSize) -> {Size::integer(), Type::enum(), Name::string()}

              Types:

                 Program = integer()
                 Index = integer()
                 BufSize = integer()

              Returns information about an active uniform variable for the specified program object

              gl:getActiveUniform returns information about an active uniform variable  in  the  program  object
              specified  by  Program  .  The  number  of  active  uniform  variables  can be obtained by calling
              gl:getProgramiv/2 with the value ?GL_ACTIVE_UNIFORMS. A value of 0 for  Index  selects  the  first
              active uniform variable. Permissible values for Index range from 0 to the number of active uniform
              variables minus 1.

              See external documentation.

       getAttachedShaders(Program, MaxCount) -> [integer()]

              Types:

                 Program = integer()
                 MaxCount = integer()

              Returns the handles of the shader objects attached to a program object

              gl:getAttachedShaders returns the names of the shader objects attached to Program . The  names  of
              shader  objects  that  are  attached  to Program will be returned in Shaders. The actual number of
              shader names written into Shaders is returned in Count. If  no  shader  objects  are  attached  to
              Program , Count is set to 0. The maximum number of shader names that may be returned in Shaders is
              specified by MaxCount .

              See external documentation.

       getAttribLocation(Program, Name) -> integer()

              Types:

                 Program = integer()
                 Name = string()

              Returns the location of an attribute variable

              gl:getAttribLocation queries the previously linked program object specified  by  Program  for  the
              attribute variable specified by Name and returns the index of the generic vertex attribute that is
              bound to that attribute variable. If Name is a matrix attribute variable, the index of  the  first
              column  of  the  matrix is returned. If the named attribute variable is not an active attribute in
              the specified program object or if Name starts with the reserved prefix "gl_", a value  of  -1  is
              returned.

              See external documentation.

       getProgramiv(Program, Pname) -> integer()

              Types:

                 Program = integer()
                 Pname = enum()

              Returns a parameter from a program object

              gl:getProgram  returns  in  Params  the  value  of  a parameter for a specific program object. The
              following parameters are defined:

              See external documentation.

       getProgramInfoLog(Program, BufSize) -> string()

              Types:

                 Program = integer()
                 BufSize = integer()

              Returns the information log for a program object

              gl:getProgramInfoLog returns the information log for the specified program object. The information
              log  for  a  program object is modified when the program object is linked or validated. The string
              that is returned will be null terminated.

              See external documentation.

       getShaderiv(Shader, Pname) -> integer()

              Types:

                 Shader = integer()
                 Pname = enum()

              Returns a parameter from a shader object

              gl:getShader returns in Params the value  of  a  parameter  for  a  specific  shader  object.  The
              following parameters are defined:

              See external documentation.

       getShaderInfoLog(Shader, BufSize) -> string()

              Types:

                 Shader = integer()
                 BufSize = integer()

              Returns the information log for a shader object

              gl:getShaderInfoLog  returns  the information log for the specified shader object. The information
              log for a shader object is modified when the shader is compiled. The string that is returned  will
              be null terminated.

              See external documentation.

       getShaderSource(Shader, BufSize) -> string()

              Types:

                 Shader = integer()
                 BufSize = integer()

              Returns the source code string from a shader object

              gl:getShaderSource  returns  the  concatenation  of the source code strings from the shader object
              specified by Shader . The source code strings for a shader object are the  result  of  a  previous
              call to gl:shaderSource/2 . The string returned by the function will be null terminated.

              See external documentation.

       getUniformLocation(Program, Name) -> integer()

              Types:

                 Program = integer()
                 Name = string()

              Returns the location of a uniform variable

              gl:getUniformLocation  returns  an  integer  that  represents  the  location of a specific uniform
              variable within a program object. Name must be a null terminated string  that  contains  no  white
              space.  Name  must be an active uniform variable name in Program that is not a structure, an array
              of structures, or a subcomponent of a vector or a matrix. This function returns -1  if  Name  does
              not  correspond to an active uniform variable in Program , if Name starts with the reserved prefix
              "gl_", or if Name is associated with an atomic counter or a named uniform block.

              See external documentation.

       getUniformfv(Program, Location) -> matrix()

              Types:

                 Program = integer()
                 Location = integer()

              Returns the value of a uniform variable

              gl:getUniform returns in Params the value(s) of the specified uniform variable. The  type  of  the
              uniform  variable  specified  by Location determines the number of values returned. If the uniform
              variable is defined in the shader as a boolean, int, or float, a single value will be returned. If
              it is defined as a vec2, ivec2, or bvec2, two values will be returned. If it is defined as a vec3,
              ivec3, or bvec3, three values will be returned, and so on.  To  query  values  stored  in  uniform
              variables  declared  as  arrays, call gl:getUniform for each element of the array. To query values
              stored in uniform variables declared as structures, call  gl:getUniform  for  each  field  in  the
              structure.  The values for uniform variables declared as a matrix will be returned in column major
              order.

              See external documentation.

       getUniformiv(Program, Location) -> {integer(), integer(),  integer(),  integer(),  integer(),  integer(),
       integer(),  integer(),  integer(),  integer(),  integer(),  integer(),  integer(),  integer(), integer(),
       integer()}

              Types:

                 Program = integer()
                 Location = integer()

              See getUniformfv/2

       getVertexAttribdv(Index, Pname) -> {float(), float(), float(), float()}

              Types:

                 Index = integer()
                 Pname = enum()

              Return a generic vertex attribute parameter

              gl:getVertexAttrib returns in Params the value  of  a  generic  vertex  attribute  parameter.  The
              generic  vertex attribute to be queried is specified by Index , and the parameter to be queried is
              specified by Pname .

              See external documentation.

       getVertexAttribfv(Index, Pname) -> {float(), float(), float(), float()}

              Types:

                 Index = integer()
                 Pname = enum()

              See getVertexAttribdv/2

       getVertexAttribiv(Index, Pname) -> {integer(), integer(), integer(), integer()}

              Types:

                 Index = integer()
                 Pname = enum()

              See getVertexAttribdv/2

       isProgram(Program) -> 0 | 1

              Types:

                 Program = integer()

              Determines if a name corresponds to a program object

              gl:isProgram returns ?GL_TRUE if Program is the name of a program object previously  created  with
              gl:createProgram/0  and not yet deleted with gl:deleteProgram/1 . If Program is zero or a non-zero
              value that is not the name of a program object,  or  if  an  error  occurs,  gl:isProgram  returns
              ?GL_FALSE.

              See external documentation.

       isShader(Shader) -> 0 | 1

              Types:

                 Shader = integer()

              Determines if a name corresponds to a shader object

              gl:isShader  returns  ?GL_TRUE  if  Shader  is the name of a shader object previously created with
              gl:createShader/1 and not yet deleted with gl:deleteShader/1 . If Shader is  zero  or  a  non-zero
              value  that  is  not  the  name  of  a  shader  object, or if an error occurs, gl:isShader returns
              ?GL_FALSE.

              See external documentation.

       linkProgram(Program) -> ok

              Types:

                 Program = integer()

              Links a program object

              gl:linkProgram links the program object specified by Program .  If  any  shader  objects  of  type
              ?GL_VERTEX_SHADER  are  attached  to Program , they will be used to create an executable that will
              run on the programmable vertex processor. If any shader objects of  type  ?GL_GEOMETRY_SHADER  are
              attached  to Program , they will be used to create an executable that will run on the programmable
              geometry processor. If any shader objects of type ?GL_FRAGMENT_SHADER are attached  to  Program  ,
              they will be used to create an executable that will run on the programmable fragment processor.

              See external documentation.

       shaderSource(Shader, String) -> ok

              Types:

                 Shader = integer()
                 String = iolist()

              Replaces the source code in a shader object

              gl:shaderSource  sets  the  source  code  in  Shader  to  the  source code in the array of strings
              specified by String . Any source code  previously  stored  in  the  shader  object  is  completely
              replaced.  The  number  of  strings  in the array is specified by Count . If Length is ?NULL, each
              string is assumed to be null terminated. If Length is a value other than ?NULL, it  points  to  an
              array  containing  a string length for each of the corresponding elements of String . Each element
              in the Length array may contain the length of the corresponding string (the null character is  not
              counted  as  part of the string length) or a value less than 0 to indicate that the string is null
              terminated. The source code strings are not scanned or parsed at this time; they are simply copied
              into the specified shader object.

              See external documentation.

       useProgram(Program) -> ok

              Types:

                 Program = integer()

              Installs a program object as part of current rendering state

              gl:useProgram installs the program object specified by Program as part of current rendering state.
              One or more executables are created in a program object by successfully attaching  shader  objects
              to it with gl:attachShader/2 , successfully compiling the shader objects with gl:compileShader/1 ,
              and successfully linking the program object with gl:linkProgram/1 .

              See external documentation.

       uniform1f(Location, V0) -> ok

              Types:

                 Location = integer()
                 V0 = float()

              Specify the value of a uniform variable for the current program object

              gl:uniform modifies the value of a uniform variable or a uniform variable array. The  location  of
              the uniform variable to be modified is specified by Location , which should be a value returned by
              gl:getUniformLocation/2 . gl:uniform operates on the program object that was made part of  current
              state by calling gl:useProgram/1 .

              See external documentation.

       uniform2f(Location, V0, V1) -> ok

              Types:

                 Location = integer()
                 V0 = float()
                 V1 = float()

              See uniform1f/2

       uniform3f(Location, V0, V1, V2) -> ok

              Types:

                 Location = integer()
                 V0 = float()
                 V1 = float()
                 V2 = float()

              See uniform1f/2

       uniform4f(Location, V0, V1, V2, V3) -> ok

              Types:

                 Location = integer()
                 V0 = float()
                 V1 = float()
                 V2 = float()
                 V3 = float()

              See uniform1f/2

       uniform1i(Location, V0) -> ok

              Types:

                 Location = integer()
                 V0 = integer()

              See uniform1f/2

       uniform2i(Location, V0, V1) -> ok

              Types:

                 Location = integer()
                 V0 = integer()
                 V1 = integer()

              See uniform1f/2

       uniform3i(Location, V0, V1, V2) -> ok

              Types:

                 Location = integer()
                 V0 = integer()
                 V1 = integer()
                 V2 = integer()

              See uniform1f/2

       uniform4i(Location, V0, V1, V2, V3) -> ok

              Types:

                 Location = integer()
                 V0 = integer()
                 V1 = integer()
                 V2 = integer()
                 V3 = integer()

              See uniform1f/2

       uniform1fv(Location, Value) -> ok

              Types:

                 Location = integer()
                 Value = [float()]

              See uniform1f/2

       uniform2fv(Location, Value) -> ok

              Types:

                 Location = integer()
                 Value = [{float(), float()}]

              See uniform1f/2

       uniform3fv(Location, Value) -> ok

              Types:

                 Location = integer()
                 Value = [{float(), float(), float()}]

              See uniform1f/2

       uniform4fv(Location, Value) -> ok

              Types:

                 Location = integer()
                 Value = [{float(), float(), float(), float()}]

              See uniform1f/2

       uniform1iv(Location, Value) -> ok

              Types:

                 Location = integer()
                 Value = [integer()]

              See uniform1f/2

       uniform2iv(Location, Value) -> ok

              Types:

                 Location = integer()
                 Value = [{integer(), integer()}]

              See uniform1f/2

       uniform3iv(Location, Value) -> ok

              Types:

                 Location = integer()
                 Value = [{integer(), integer(), integer()}]

              See uniform1f/2

       uniform4iv(Location, Value) -> ok

              Types:

                 Location = integer()
                 Value = [{integer(), integer(), integer(), integer()}]

              See uniform1f/2

       uniformMatrix2fv(Location, Transpose, Value) -> ok

              Types:

                 Location = integer()
                 Transpose = 0 | 1
                 Value = [{float(), float(), float(), float()}]

              See uniform1f/2

       uniformMatrix3fv(Location, Transpose, Value) -> ok

              Types:

                 Location = integer()
                 Transpose = 0 | 1
                 Value = [{float(), float(), float(), float(), float(), float(), float(), float(), float()}]

              See uniform1f/2

       uniformMatrix4fv(Location, Transpose, Value) -> ok

              Types:

                 Location = integer()
                 Transpose = 0 | 1
                 Value  =  [{float(),  float(),  float(),  float(), float(), float(), float(), float(), float(),
                 float(), float(), float(), float(), float(), float(), float()}]

              See uniform1f/2

       validateProgram(Program) -> ok

              Types:

                 Program = integer()

              Validates a program object

              gl:validateProgram checks to see whether the executables contained in Program  can  execute  given
              the  current  OpenGL  state. The information generated by the validation process will be stored in
              Program 's information log. The validation information may consist of an empty string, or  it  may
              be a string containing information about how the current program object interacts with the rest of
              current OpenGL state. This provides a way for OpenGL implementers to convey more information about
              why the current program is inefficient, suboptimal, failing to execute, and so on.

              See external documentation.

       vertexAttrib1d(Index, X) -> ok

              Types:

                 Index = integer()
                 X = float()

              Specifies the value of a generic vertex attribute

              The gl:vertexAttrib family of entry points allows an application to pass generic vertex attributes
              in numbered locations.

              See external documentation.

       vertexAttrib1dv(Index::integer(), V) -> ok

              Types:

                 V = {X::float()}

              Equivalent to vertexAttrib1d(Index, X).

       vertexAttrib1f(Index, X) -> ok

              Types:

                 Index = integer()
                 X = float()

              See vertexAttrib1d/2

       vertexAttrib1fv(Index::integer(), V) -> ok

              Types:

                 V = {X::float()}

              Equivalent to vertexAttrib1f(Index, X).

       vertexAttrib1s(Index, X) -> ok

              Types:

                 Index = integer()
                 X = integer()

              See vertexAttrib1d/2

       vertexAttrib1sv(Index::integer(), V) -> ok

              Types:

                 V = {X::integer()}

              Equivalent to vertexAttrib1s(Index, X).

       vertexAttrib2d(Index, X, Y) -> ok

              Types:

                 Index = integer()
                 X = float()
                 Y = float()

              See vertexAttrib1d/2

       vertexAttrib2dv(Index::integer(), V) -> ok

              Types:

                 V = {X::float(), Y::float()}

              Equivalent to vertexAttrib2d(Index, X, Y).

       vertexAttrib2f(Index, X, Y) -> ok

              Types:

                 Index = integer()
                 X = float()
                 Y = float()

              See vertexAttrib1d/2

       vertexAttrib2fv(Index::integer(), V) -> ok

              Types:

                 V = {X::float(), Y::float()}

              Equivalent to vertexAttrib2f(Index, X, Y).

       vertexAttrib2s(Index, X, Y) -> ok

              Types:

                 Index = integer()
                 X = integer()
                 Y = integer()

              See vertexAttrib1d/2

       vertexAttrib2sv(Index::integer(), V) -> ok

              Types:

                 V = {X::integer(), Y::integer()}

              Equivalent to vertexAttrib2s(Index, X, Y).

       vertexAttrib3d(Index, X, Y, Z) -> ok

              Types:

                 Index = integer()
                 X = float()
                 Y = float()
                 Z = float()

              See vertexAttrib1d/2

       vertexAttrib3dv(Index::integer(), V) -> ok

              Types:

                 V = {X::float(), Y::float(), Z::float()}

              Equivalent to vertexAttrib3d(Index, X, Y, Z).

       vertexAttrib3f(Index, X, Y, Z) -> ok

              Types:

                 Index = integer()
                 X = float()
                 Y = float()
                 Z = float()

              See vertexAttrib1d/2

       vertexAttrib3fv(Index::integer(), V) -> ok

              Types:

                 V = {X::float(), Y::float(), Z::float()}

              Equivalent to vertexAttrib3f(Index, X, Y, Z).

       vertexAttrib3s(Index, X, Y, Z) -> ok

              Types:

                 Index = integer()
                 X = integer()
                 Y = integer()
                 Z = integer()

              See vertexAttrib1d/2

       vertexAttrib3sv(Index::integer(), V) -> ok

              Types:

                 V = {X::integer(), Y::integer(), Z::integer()}

              Equivalent to vertexAttrib3s(Index, X, Y, Z).

       vertexAttrib4Nbv(Index, V) -> ok

              Types:

                 Index = integer()
                 V = {integer(), integer(), integer(), integer()}

              See vertexAttrib1d/2

       vertexAttrib4Niv(Index, V) -> ok

              Types:

                 Index = integer()
                 V = {integer(), integer(), integer(), integer()}

              See vertexAttrib1d/2

       vertexAttrib4Nsv(Index, V) -> ok

              Types:

                 Index = integer()
                 V = {integer(), integer(), integer(), integer()}

              See vertexAttrib1d/2

       vertexAttrib4Nub(Index, X, Y, Z, W) -> ok

              Types:

                 Index = integer()
                 X = integer()
                 Y = integer()
                 Z = integer()
                 W = integer()

              See vertexAttrib1d/2

       vertexAttrib4Nubv(Index::integer(), V) -> ok

              Types:

                 V = {X::integer(), Y::integer(), Z::integer(), W::integer()}

              Equivalent to vertexAttrib4Nub(Index, X, Y, Z, W).

       vertexAttrib4Nuiv(Index, V) -> ok

              Types:

                 Index = integer()
                 V = {integer(), integer(), integer(), integer()}

              See vertexAttrib1d/2

       vertexAttrib4Nusv(Index, V) -> ok

              Types:

                 Index = integer()
                 V = {integer(), integer(), integer(), integer()}

              See vertexAttrib1d/2

       vertexAttrib4bv(Index, V) -> ok

              Types:

                 Index = integer()
                 V = {integer(), integer(), integer(), integer()}

              See vertexAttrib1d/2

       vertexAttrib4d(Index, X, Y, Z, W) -> ok

              Types:

                 Index = integer()
                 X = float()
                 Y = float()
                 Z = float()
                 W = float()

              See vertexAttrib1d/2

       vertexAttrib4dv(Index::integer(), V) -> ok

              Types:

                 V = {X::float(), Y::float(), Z::float(), W::float()}

              Equivalent to vertexAttrib4d(Index, X, Y, Z, W).

       vertexAttrib4f(Index, X, Y, Z, W) -> ok

              Types:

                 Index = integer()
                 X = float()
                 Y = float()
                 Z = float()
                 W = float()

              See vertexAttrib1d/2

       vertexAttrib4fv(Index::integer(), V) -> ok

              Types:

                 V = {X::float(), Y::float(), Z::float(), W::float()}

              Equivalent to vertexAttrib4f(Index, X, Y, Z, W).

       vertexAttrib4iv(Index, V) -> ok

              Types:

                 Index = integer()
                 V = {integer(), integer(), integer(), integer()}

              See vertexAttrib1d/2

       vertexAttrib4s(Index, X, Y, Z, W) -> ok

              Types:

                 Index = integer()
                 X = integer()
                 Y = integer()
                 Z = integer()
                 W = integer()

              See vertexAttrib1d/2

       vertexAttrib4sv(Index::integer(), V) -> ok

              Types:

                 V = {X::integer(), Y::integer(), Z::integer(), W::integer()}

              Equivalent to vertexAttrib4s(Index, X, Y, Z, W).

       vertexAttrib4ubv(Index, V) -> ok

              Types:

                 Index = integer()
                 V = {integer(), integer(), integer(), integer()}

              See vertexAttrib1d/2

       vertexAttrib4uiv(Index, V) -> ok

              Types:

                 Index = integer()
                 V = {integer(), integer(), integer(), integer()}

              See vertexAttrib1d/2

       vertexAttrib4usv(Index, V) -> ok

              Types:

                 Index = integer()
                 V = {integer(), integer(), integer(), integer()}

              See vertexAttrib1d/2

       vertexAttribPointer(Index, Size, Type, Normalized, Stride, Pointer) -> ok

              Types:

                 Index = integer()
                 Size = integer()
                 Type = enum()
                 Normalized = 0 | 1
                 Stride = integer()
                 Pointer = offset() | mem()

              Define an array of generic vertex attribute data

              gl:vertexAttribPointer, gl:vertexAttribIPointer and gl:vertexAttribLPointer specify  the  location
              and  data  format  of the array of generic vertex attributes at index Index to use when rendering.
              Size specifies the number of components per attribute and must be 1, 2, 3, 4,  or  ?GL_BGRA.  Type
              specifies the data type of each component, and Stride specifies the byte stride from one attribute
              to the next, allowing vertices and attributes to be packed  into  a  single  array  or  stored  in
              separate arrays.

              See external documentation.

       uniformMatrix2x3fv(Location, Transpose, Value) -> ok

              Types:

                 Location = integer()
                 Transpose = 0 | 1
                 Value = [{float(), float(), float(), float(), float(), float()}]

              See uniform1f/2

       uniformMatrix3x2fv(Location, Transpose, Value) -> ok

              Types:

                 Location = integer()
                 Transpose = 0 | 1
                 Value = [{float(), float(), float(), float(), float(), float()}]

              See uniform1f/2

       uniformMatrix2x4fv(Location, Transpose, Value) -> ok

              Types:

                 Location = integer()
                 Transpose = 0 | 1
                 Value = [{float(), float(), float(), float(), float(), float(), float(), float()}]

              See uniform1f/2

       uniformMatrix4x2fv(Location, Transpose, Value) -> ok

              Types:

                 Location = integer()
                 Transpose = 0 | 1
                 Value = [{float(), float(), float(), float(), float(), float(), float(), float()}]

              See uniform1f/2

       uniformMatrix3x4fv(Location, Transpose, Value) -> ok

              Types:

                 Location = integer()
                 Transpose = 0 | 1
                 Value  =  [{float(),  float(),  float(),  float(), float(), float(), float(), float(), float(),
                 float(), float(), float()}]

              See uniform1f/2

       uniformMatrix4x3fv(Location, Transpose, Value) -> ok

              Types:

                 Location = integer()
                 Transpose = 0 | 1
                 Value = [{float(), float(), float(), float(),  float(),  float(),  float(),  float(),  float(),
                 float(), float(), float()}]

              See uniform1f/2

       colorMaski(Index, R, G, B, A) -> ok

              Types:

                 Index = integer()
                 R = 0 | 1
                 G = 0 | 1
                 B = 0 | 1
                 A = 0 | 1

              glColorMaski

              See external documentation.

       getBooleani_v(Target, Index) -> [0 | 1]

              Types:

                 Target = enum()
                 Index = integer()

              See getBooleanv/1

       getIntegeri_v(Target, Index) -> [integer()]

              Types:

                 Target = enum()
                 Index = integer()

              See getBooleanv/1

       enablei(Target, Index) -> ok

              Types:

                 Target = enum()
                 Index = integer()

              See enable/1

       disablei(Target, Index) -> ok

              Types:

                 Target = enum()
                 Index = integer()

              glEnablei

              See external documentation.

       isEnabledi(Target, Index) -> 0 | 1

              Types:

                 Target = enum()
                 Index = integer()

              glIsEnabledi

              See external documentation.

       beginTransformFeedback(PrimitiveMode) -> ok

              Types:

                 PrimitiveMode = enum()

              Start transform feedback operation

              Transform feedback mode captures the values of varying variables written by the vertex shader (or,
              if active, the geometry shader). Transform  feedback  is  said  to  be  active  after  a  call  to
              gl:beginTransformFeedback  until  a  subsequent  call  to  gl:beginTransformFeedback/1 . Transform
              feedback commands must be paired.

              See external documentation.

       endTransformFeedback() -> ok

              See beginTransformFeedback/1

       bindBufferRange(Target, Index, Buffer, Offset, Size) -> ok

              Types:

                 Target = enum()
                 Index = integer()
                 Buffer = integer()
                 Offset = integer()
                 Size = integer()

              Bind a range within a buffer object to an indexed buffer target

              gl:bindBufferRange binds a range the buffer object Buffer represented by Offset and  Size  to  the
              binding  point at index Index of the array of targets specified by Target . Each Target represents
              an indexed array of buffer binding points, as well as a single general binding point that  can  be
              used  by  other  buffer  manipulation  functions  such  as  gl:bindBuffer/2 or see glMapBuffer. In
              addition to binding a range of Buffer to the indexed buffer binding target, gl:bindBufferBase also
              binds the range to the generic buffer binding point specified by Target .

              See external documentation.

       bindBufferBase(Target, Index, Buffer) -> ok

              Types:

                 Target = enum()
                 Index = integer()
                 Buffer = integer()

              Bind a buffer object to an indexed buffer target

              gl:bindBufferBase  binds the buffer object Buffer to the binding point at index Index of the array
              of targets specified by Target . Each Target represents an indexed array of buffer binding points,
              as  well as a single general binding point that can be used by other buffer manipulation functions
              such as gl:bindBuffer/2 or see glMapBuffer. In addition to binding Buffer to  the  indexed  buffer
              binding  target, gl:bindBufferBase also binds Buffer to the generic buffer binding point specified
              by Target .

              See external documentation.

       transformFeedbackVaryings(Program, Varyings, BufferMode) -> ok

              Types:

                 Program = integer()
                 Varyings = iolist()
                 BufferMode = enum()

              Specify values to record in transform feedback buffers

              The names of the vertex or geometry shader outputs to be recorded in transform feedback  mode  are
              specified using gl:transformFeedbackVaryings. When a geometry shader is active, transform feedback
              records the values of selected  geometry  shader  output  variables  from  the  emitted  vertices.
              Otherwise, the values of the selected vertex shader outputs are recorded.

              See external documentation.

       getTransformFeedbackVarying(Program, Index, BufSize) -> {Size::integer(), Type::enum(), Name::string()}

              Types:

                 Program = integer()
                 Index = integer()
                 BufSize = integer()

              Retrieve information about varying variables selected for transform feedback

              Information  about  the  set of varying variables in a linked program that will be captured during
              transform   feedback    may    be    retrieved    by    calling    gl:getTransformFeedbackVarying.
              gl:getTransformFeedbackVarying provides information about the varying variable selected by Index .
              An Index of 0 selects the first varying  variable  specified  in  the  Varyings  array  passed  to
              gl:transformFeedbackVaryings/3  ,  and  an  Index of ?GL_TRANSFORM_FEEDBACK_VARYINGS-1 selects the
              last such variable.

              See external documentation.

       clampColor(Target, Clamp) -> ok

              Types:

                 Target = enum()
                 Clamp = enum()

              specify whether data read via

              gl:readPixels/7 should be clamped

              gl:clampColor controls color clamping that is performed during gl:readPixels/7 .  Target  must  be
              ?GL_CLAMP_READ_COLOR. If Clamp is ?GL_TRUE, read color clamping is enabled; if Clamp is ?GL_FALSE,
              read color clamping is disabled. If Clamp is ?GL_FIXED_ONLY, read color clamping is  enabled  only
              if the selected read buffer has fixed point components and disabled otherwise.

              See external documentation.

       beginConditionalRender(Id, Mode) -> ok

              Types:

                 Id = integer()
                 Mode = enum()

              Start conditional rendering

              Conditional    rendering    is   started   using   gl:beginConditionalRender   and   ended   using
              gl:endConditionalRender . During conditional rendering, all vertex  array  commands,  as  well  as
              gl:clear/1  and  gl:clearBufferiv/3 have no effect if the (?GL_SAMPLES_PASSED) result of the query
              object Id is zero, or if the  (?GL_ANY_SAMPLES_PASSED)  result  is  ?GL_FALSE  .  The  results  of
              commands  setting  the  current  vertex  state,  such as gl:vertexAttrib1d/2 are undefined. If the
              (?GL_SAMPLES_PASSED) result is non-zero or if the (?GL_ANY_SAMPLES_PASSED )  result  is  ?GL_TRUE,
              such commands are not discarded. The Id parameter to gl:beginConditionalRender must be the name of
              a query object previously returned from a call to gl:genQueries/1 . Mode specifies how the results
              of the query object are to be interpreted. If Mode is ?GL_QUERY_WAIT, the GL waits for the results
              of the query to be available and then uses  the  results  to  determine  if  subsequent  rendering
              commands are discarded. If Mode is ?GL_QUERY_NO_WAIT, the GL may choose to unconditionally execute
              the subsequent rendering commands without waiting for the query to complete.

              See external documentation.

       endConditionalRender() -> ok

              See beginConditionalRender/2

       vertexAttribIPointer(Index, Size, Type, Stride, Pointer) -> ok

              Types:

                 Index = integer()
                 Size = integer()
                 Type = enum()
                 Stride = integer()
                 Pointer = offset() | mem()

              glVertexAttribIPointer

              See external documentation.

       getVertexAttribIiv(Index, Pname) -> {integer(), integer(), integer(), integer()}

              Types:

                 Index = integer()
                 Pname = enum()

              See getVertexAttribdv/2

       getVertexAttribIuiv(Index, Pname) -> {integer(), integer(), integer(), integer()}

              Types:

                 Index = integer()
                 Pname = enum()

              glGetVertexAttribI

              See external documentation.

       vertexAttribI1i(Index, X) -> ok

              Types:

                 Index = integer()
                 X = integer()

              See vertexAttrib1d/2

       vertexAttribI2i(Index, X, Y) -> ok

              Types:

                 Index = integer()
                 X = integer()
                 Y = integer()

              See vertexAttrib1d/2

       vertexAttribI3i(Index, X, Y, Z) -> ok

              Types:

                 Index = integer()
                 X = integer()
                 Y = integer()
                 Z = integer()

              See vertexAttrib1d/2

       vertexAttribI4i(Index, X, Y, Z, W) -> ok

              Types:

                 Index = integer()
                 X = integer()
                 Y = integer()
                 Z = integer()
                 W = integer()

              See vertexAttrib1d/2

       vertexAttribI1ui(Index, X) -> ok

              Types:

                 Index = integer()
                 X = integer()

              See vertexAttrib1d/2

       vertexAttribI2ui(Index, X, Y) -> ok

              Types:

                 Index = integer()
                 X = integer()
                 Y = integer()

              See vertexAttrib1d/2

       vertexAttribI3ui(Index, X, Y, Z) -> ok

              Types:

                 Index = integer()
                 X = integer()
                 Y = integer()
                 Z = integer()

              See vertexAttrib1d/2

       vertexAttribI4ui(Index, X, Y, Z, W) -> ok

              Types:

                 Index = integer()
                 X = integer()
                 Y = integer()
                 Z = integer()
                 W = integer()

              See vertexAttrib1d/2

       vertexAttribI1iv(Index::integer(), V) -> ok

              Types:

                 V = {X::integer()}

              Equivalent to vertexAttribI1i(Index, X).

       vertexAttribI2iv(Index::integer(), V) -> ok

              Types:

                 V = {X::integer(), Y::integer()}

              Equivalent to vertexAttribI2i(Index, X, Y).

       vertexAttribI3iv(Index::integer(), V) -> ok

              Types:

                 V = {X::integer(), Y::integer(), Z::integer()}

              Equivalent to vertexAttribI3i(Index, X, Y, Z).

       vertexAttribI4iv(Index::integer(), V) -> ok

              Types:

                 V = {X::integer(), Y::integer(), Z::integer(), W::integer()}

              Equivalent to vertexAttribI4i(Index, X, Y, Z, W).

       vertexAttribI1uiv(Index::integer(), V) -> ok

              Types:

                 V = {X::integer()}

              Equivalent to vertexAttribI1ui(Index, X).

       vertexAttribI2uiv(Index::integer(), V) -> ok

              Types:

                 V = {X::integer(), Y::integer()}

              Equivalent to vertexAttribI2ui(Index, X, Y).

       vertexAttribI3uiv(Index::integer(), V) -> ok

              Types:

                 V = {X::integer(), Y::integer(), Z::integer()}

              Equivalent to vertexAttribI3ui(Index, X, Y, Z).

       vertexAttribI4uiv(Index::integer(), V) -> ok

              Types:

                 V = {X::integer(), Y::integer(), Z::integer(), W::integer()}

              Equivalent to vertexAttribI4ui(Index, X, Y, Z, W).

       vertexAttribI4bv(Index, V) -> ok

              Types:

                 Index = integer()
                 V = {integer(), integer(), integer(), integer()}

              See vertexAttrib1d/2

       vertexAttribI4sv(Index, V) -> ok

              Types:

                 Index = integer()
                 V = {integer(), integer(), integer(), integer()}

              See vertexAttrib1d/2

       vertexAttribI4ubv(Index, V) -> ok

              Types:

                 Index = integer()
                 V = {integer(), integer(), integer(), integer()}

              See vertexAttrib1d/2

       vertexAttribI4usv(Index, V) -> ok

              Types:

                 Index = integer()
                 V = {integer(), integer(), integer(), integer()}

              See vertexAttrib1d/2

       getUniformuiv(Program, Location) -> {integer(), integer(), integer(),  integer(),  integer(),  integer(),
       integer(),  integer(),  integer(),  integer(),  integer(),  integer(),  integer(),  integer(), integer(),
       integer()}

              Types:

                 Program = integer()
                 Location = integer()

              See getUniformfv/2

       bindFragDataLocation(Program, Color, Name) -> ok

              Types:

                 Program = integer()
                 Color = integer()
                 Name = string()

              Bind a user-defined varying out variable to a fragment shader color number

              gl:bindFragDataLocation explicitly specifies the binding of the user-defined varying out  variable
              Name  to  fragment  shader  color  number  ColorNumber  for  program  Program  . If Name was bound
              previously, its assigned binding is replaced with ColorNumber . Name  must  be  a  null-terminated
              string. ColorNumber must be less than ?GL_MAX_DRAW_BUFFERS .

              See external documentation.

       getFragDataLocation(Program, Name) -> integer()

              Types:

                 Program = integer()
                 Name = string()

              Query the bindings of color numbers to user-defined varying out variables

              gl:getFragDataLocation  retrieves  the  assigned color number binding for the user-defined varying
              out variable Name for program Program . Program must have previously been linked. Name must  be  a
              null-terminated  string.  If  Name  is not the name of an active user-defined varying out fragment
              shader variable within Program , -1 will be returned.

              See external documentation.

       uniform1ui(Location, V0) -> ok

              Types:

                 Location = integer()
                 V0 = integer()

              See uniform1f/2

       uniform2ui(Location, V0, V1) -> ok

              Types:

                 Location = integer()
                 V0 = integer()
                 V1 = integer()

              See uniform1f/2

       uniform3ui(Location, V0, V1, V2) -> ok

              Types:

                 Location = integer()
                 V0 = integer()
                 V1 = integer()
                 V2 = integer()

              See uniform1f/2

       uniform4ui(Location, V0, V1, V2, V3) -> ok

              Types:

                 Location = integer()
                 V0 = integer()
                 V1 = integer()
                 V2 = integer()
                 V3 = integer()

              See uniform1f/2

       uniform1uiv(Location, Value) -> ok

              Types:

                 Location = integer()
                 Value = [integer()]

              See uniform1f/2

       uniform2uiv(Location, Value) -> ok

              Types:

                 Location = integer()
                 Value = [{integer(), integer()}]

              See uniform1f/2

       uniform3uiv(Location, Value) -> ok

              Types:

                 Location = integer()
                 Value = [{integer(), integer(), integer()}]

              See uniform1f/2

       uniform4uiv(Location, Value) -> ok

              Types:

                 Location = integer()
                 Value = [{integer(), integer(), integer(), integer()}]

              See uniform1f/2

       texParameterIiv(Target, Pname, Params) -> ok

              Types:

                 Target = enum()
                 Pname = enum()
                 Params = tuple()

              See texParameterf/3

       texParameterIuiv(Target, Pname, Params) -> ok

              Types:

                 Target = enum()
                 Pname = enum()
                 Params = tuple()

              glTexParameterI

              See external documentation.

       getTexParameterIiv(Target, Pname) -> {integer(), integer(), integer(), integer()}

              Types:

                 Target = enum()
                 Pname = enum()

              See getTexParameterfv/2

       getTexParameterIuiv(Target, Pname) -> {integer(), integer(), integer(), integer()}

              Types:

                 Target = enum()
                 Pname = enum()

              glGetTexParameterI

              See external documentation.

       clearBufferiv(Buffer, Drawbuffer, Value) -> ok

              Types:

                 Buffer = enum()
                 Drawbuffer = integer()
                 Value = tuple()

              Clear individual buffers of the currently bound draw framebuffer

              gl:clearBuffer* clears the specified buffer to the specified value(s). If Buffer is  ?GL_COLOR,  a
              particular  draw  buffer  ?GL_DRAWBUFFER I is specified by passing I as DrawBuffer . In this case,
              Value points to a four-element vector specifying the R, G, B and A color to clear that draw buffer
              to.  If  Buffer  is  one  of  ?GL_FRONT,  ?GL_BACK,  ?GL_LEFT,  ?GL_RIGHT, or ?GL_FRONT_AND_BACK ,
              identifying multiple buffers, each selected buffer is cleared to  the  same  value.  Clamping  and
              conversion for fixed-point color buffers are performed in the same fashion as gl:clearColor/4 .

              See external documentation.

       clearBufferuiv(Buffer, Drawbuffer, Value) -> ok

              Types:

                 Buffer = enum()
                 Drawbuffer = integer()
                 Value = tuple()

              See clearBufferiv/3

       clearBufferfv(Buffer, Drawbuffer, Value) -> ok

              Types:

                 Buffer = enum()
                 Drawbuffer = integer()
                 Value = tuple()

              See clearBufferiv/3

       clearBufferfi(Buffer, Drawbuffer, Depth, Stencil) -> ok

              Types:

                 Buffer = enum()
                 Drawbuffer = integer()
                 Depth = float()
                 Stencil = integer()

              glClearBufferfi

              See external documentation.

       getStringi(Name, Index) -> string()

              Types:

                 Name = enum()
                 Index = integer()

              See getString/1

       drawArraysInstanced(Mode, First, Count, Primcount) -> ok

              Types:

                 Mode = enum()
                 First = integer()
                 Count = integer()
                 Primcount = integer()

              glDrawArraysInstance

              See external documentation.

       drawElementsInstanced(Mode, Count, Type, Indices, Primcount) -> ok

              Types:

                 Mode = enum()
                 Count = integer()
                 Type = enum()
                 Indices = offset() | mem()
                 Primcount = integer()

              glDrawElementsInstance

              See external documentation.

       texBuffer(Target, Internalformat, Buffer) -> ok

              Types:

                 Target = enum()
                 Internalformat = enum()
                 Buffer = integer()

              Attach the storage for a buffer object to the active buffer texture

              gl:texBuffer attaches the storage for the buffer object named Buffer to the active buffer texture,
              and specifies the internal format for the texel array found in  the  attached  buffer  object.  If
              Buffer  is  zero,  any  buffer object attached to the buffer texture is detached and no new buffer
              object is attached. If Buffer is non-zero, it must be the  name  of  an  existing  buffer  object.
              Target  must  be ?GL_TEXTURE_BUFFER . Internalformat specifies the storage format, and must be one
              of the following sized internal formats:

              See external documentation.

       primitiveRestartIndex(Index) -> ok

              Types:

                 Index = integer()

              Specify the primitive restart index

              gl:primitiveRestartIndex specifies a vertex array element that is treated specially when primitive
              restarting is enabled. This is known as the primitive restart index.

              See external documentation.

       getInteger64i_v(Target, Index) -> [integer()]

              Types:

                 Target = enum()
                 Index = integer()

              See getBooleanv/1

       getBufferParameteri64v(Target, Pname) -> [integer()]

              Types:

                 Target = enum()
                 Pname = enum()

              glGetBufferParameteri64v

              See external documentation.

       framebufferTexture(Target, Attachment, Texture, Level) -> ok

              Types:

                 Target = enum()
                 Attachment = enum()
                 Texture = integer()
                 Level = integer()

              Attach a level of a texture object as a logical buffer to the currently bound framebuffer object

              gl:framebufferTexture, gl:framebufferTexture1D, gl:framebufferTexture2D, and gl:framebufferTexture
              attach a selected mipmap level or image of a texture object as one of the logical buffers  of  the
              framebuffer   object   currently   bound   to   Target  .  Target  must  be  ?GL_DRAW_FRAMEBUFFER,
              ?GL_READ_FRAMEBUFFER, or ?GL_FRAMEBUFFER . ?GL_FRAMEBUFFER is equivalent to ?GL_DRAW_FRAMEBUFFER.

              See external documentation.

       vertexAttribDivisor(Index, Divisor) -> ok

              Types:

                 Index = integer()
                 Divisor = integer()

              Modify the rate at which generic vertex attributes advance during instanced rendering

              gl:vertexAttribDivisor modifies the rate at which generic vertex attributes advance when rendering
              multiple  instances of primitives in a single draw call. If Divisor is zero, the attribute at slot
              Index advances once per vertex. If Divisor is non-zero, the attribute advances  once  per  Divisor
              instances  of  the  set(s) of vertices being rendered. An attribute is referred to as instanced if
              its ?GL_VERTEX_ATTRIB_ARRAY_DIVISOR value is non-zero.

              See external documentation.

       minSampleShading(Value) -> ok

              Types:

                 Value = clamp()

              Specifies minimum rate at which sample shaing takes place

              gl:minSampleShading specifies the rate at which samples are shaded within a covered pixel. Sample-
              rate  shading  is  enabled  by  calling  gl:enable/1  with  the  parameter ?GL_SAMPLE_SHADING . If
              ?GL_MULTISAMPLE or ?GL_SAMPLE_SHADING is disabled, sample shading has  no  effect.  Otherwise,  an
              implementation  must  provide  at  least  as many unique color values for each covered fragment as
              specified by Value times Samples where Samples  is  the  value  of  ?GL_SAMPLES  for  the  current
              framebuffer. At least 1 sample for each covered fragment is generated.

              See external documentation.

       blendEquationi(Buf, Mode) -> ok

              Types:

                 Buf = integer()
                 Mode = enum()

              See blendEquation/1

       blendEquationSeparatei(Buf, ModeRGB, ModeAlpha) -> ok

              Types:

                 Buf = integer()
                 ModeRGB = enum()
                 ModeAlpha = enum()

              See blendEquationSeparate/2

       blendFunci(Buf, Src, Dst) -> ok

              Types:

                 Buf = integer()
                 Src = enum()
                 Dst = enum()

              glBlendFunci

              See external documentation.

       blendFuncSeparatei(Buf, SrcRGB, DstRGB, SrcAlpha, DstAlpha) -> ok

              Types:

                 Buf = integer()
                 SrcRGB = enum()
                 DstRGB = enum()
                 SrcAlpha = enum()
                 DstAlpha = enum()

              See blendFuncSeparate/4

       loadTransposeMatrixfARB(M) -> ok

              Types:

                 M = matrix()

              glLoadTransposeMatrixARB

              See external documentation.

       loadTransposeMatrixdARB(M) -> ok

              Types:

                 M = matrix()

              glLoadTransposeMatrixARB

              See external documentation.

       multTransposeMatrixfARB(M) -> ok

              Types:

                 M = matrix()

              glMultTransposeMatrixARB

              See external documentation.

       multTransposeMatrixdARB(M) -> ok

              Types:

                 M = matrix()

              glMultTransposeMatrixARB

              See external documentation.

       weightbvARB(Weights) -> ok

              Types:

                 Weights = [integer()]

              glWeightARB

              See external documentation.

       weightsvARB(Weights) -> ok

              Types:

                 Weights = [integer()]

              glWeightARB

              See external documentation.

       weightivARB(Weights) -> ok

              Types:

                 Weights = [integer()]

              glWeightARB

              See external documentation.

       weightfvARB(Weights) -> ok

              Types:

                 Weights = [float()]

              glWeightARB

              See external documentation.

       weightdvARB(Weights) -> ok

              Types:

                 Weights = [float()]

              glWeightARB

              See external documentation.

       weightubvARB(Weights) -> ok

              Types:

                 Weights = [integer()]

              glWeightARB

              See external documentation.

       weightusvARB(Weights) -> ok

              Types:

                 Weights = [integer()]

              glWeightARB

              See external documentation.

       weightuivARB(Weights) -> ok

              Types:

                 Weights = [integer()]

              glWeightARB

              See external documentation.

       vertexBlendARB(Count) -> ok

              Types:

                 Count = integer()

              glVertexBlenARB

              See external documentation.

       currentPaletteMatrixARB(Index) -> ok

              Types:

                 Index = integer()

              glCurrentPaletteMatrixARB

              See external documentation.

       matrixIndexubvARB(Indices) -> ok

              Types:

                 Indices = [integer()]

              glMatrixIndexARB

              See external documentation.

       matrixIndexusvARB(Indices) -> ok

              Types:

                 Indices = [integer()]

              glMatrixIndexARB

              See external documentation.

       matrixIndexuivARB(Indices) -> ok

              Types:

                 Indices = [integer()]

              glMatrixIndexARB

              See external documentation.

       programStringARB(Target, Format, String) -> ok

              Types:

                 Target = enum()
                 Format = enum()
                 String = string()

              glProgramStringARB

              See external documentation.

       bindProgramARB(Target, Program) -> ok

              Types:

                 Target = enum()
                 Program = integer()

              glBindProgramARB

              See external documentation.

       deleteProgramsARB(Programs) -> ok

              Types:

                 Programs = [integer()]

              glDeleteProgramsARB

              See external documentation.

       genProgramsARB(N) -> [integer()]

              Types:

                 N = integer()

              glGenProgramsARB

              See external documentation.

       programEnvParameter4dARB(Target, Index, X, Y, Z, W) -> ok

              Types:

                 Target = enum()
                 Index = integer()
                 X = float()
                 Y = float()
                 Z = float()
                 W = float()

              glProgramEnvParameterARB

              See external documentation.

       programEnvParameter4dvARB(Target, Index, Params) -> ok

              Types:

                 Target = enum()
                 Index = integer()
                 Params = {float(), float(), float(), float()}

              glProgramEnvParameterARB

              See external documentation.

       programEnvParameter4fARB(Target, Index, X, Y, Z, W) -> ok

              Types:

                 Target = enum()
                 Index = integer()
                 X = float()
                 Y = float()
                 Z = float()
                 W = float()

              glProgramEnvParameterARB

              See external documentation.

       programEnvParameter4fvARB(Target, Index, Params) -> ok

              Types:

                 Target = enum()
                 Index = integer()
                 Params = {float(), float(), float(), float()}

              glProgramEnvParameterARB

              See external documentation.

       programLocalParameter4dARB(Target, Index, X, Y, Z, W) -> ok

              Types:

                 Target = enum()
                 Index = integer()
                 X = float()
                 Y = float()
                 Z = float()
                 W = float()

              glProgramLocalParameterARB

              See external documentation.

       programLocalParameter4dvARB(Target, Index, Params) -> ok

              Types:

                 Target = enum()
                 Index = integer()
                 Params = {float(), float(), float(), float()}

              glProgramLocalParameterARB

              See external documentation.

       programLocalParameter4fARB(Target, Index, X, Y, Z, W) -> ok

              Types:

                 Target = enum()
                 Index = integer()
                 X = float()
                 Y = float()
                 Z = float()
                 W = float()

              glProgramLocalParameterARB

              See external documentation.

       programLocalParameter4fvARB(Target, Index, Params) -> ok

              Types:

                 Target = enum()
                 Index = integer()
                 Params = {float(), float(), float(), float()}

              glProgramLocalParameterARB

              See external documentation.

       getProgramEnvParameterdvARB(Target, Index) -> {float(), float(), float(), float()}

              Types:

                 Target = enum()
                 Index = integer()

              glGetProgramEnvParameterARB

              See external documentation.

       getProgramEnvParameterfvARB(Target, Index) -> {float(), float(), float(), float()}

              Types:

                 Target = enum()
                 Index = integer()

              glGetProgramEnvParameterARB

              See external documentation.

       getProgramLocalParameterdvARB(Target, Index) -> {float(), float(), float(), float()}

              Types:

                 Target = enum()
                 Index = integer()

              glGetProgramLocalParameterARB

              See external documentation.

       getProgramLocalParameterfvARB(Target, Index) -> {float(), float(), float(), float()}

              Types:

                 Target = enum()
                 Index = integer()

              glGetProgramLocalParameterARB

              See external documentation.

       getProgramStringARB(Target, Pname, String) -> ok

              Types:

                 Target = enum()
                 Pname = enum()
                 String = mem()

              glGetProgramStringARB

              See external documentation.

       getBufferParameterivARB(Target, Pname) -> [integer()]

              Types:

                 Target = enum()
                 Pname = enum()

              glGetBufferParameterARB

              See external documentation.

       deleteObjectARB(Obj) -> ok

              Types:

                 Obj = integer()

              glDeleteObjectARB

              See external documentation.

       getHandleARB(Pname) -> integer()

              Types:

                 Pname = enum()

              glGetHandleARB

              See external documentation.

       detachObjectARB(ContainerObj, AttachedObj) -> ok

              Types:

                 ContainerObj = integer()
                 AttachedObj = integer()

              glDetachObjectARB

              See external documentation.

       createShaderObjectARB(ShaderType) -> integer()

              Types:

                 ShaderType = enum()

              glCreateShaderObjectARB

              See external documentation.

       shaderSourceARB(ShaderObj, String) -> ok

              Types:

                 ShaderObj = integer()
                 String = iolist()

              glShaderSourceARB

              See external documentation.

       compileShaderARB(ShaderObj) -> ok

              Types:

                 ShaderObj = integer()

              glCompileShaderARB

              See external documentation.

       createProgramObjectARB() -> integer()

              glCreateProgramObjectARB

              See external documentation.

       attachObjectARB(ContainerObj, Obj) -> ok

              Types:

                 ContainerObj = integer()
                 Obj = integer()

              glAttachObjectARB

              See external documentation.

       linkProgramARB(ProgramObj) -> ok

              Types:

                 ProgramObj = integer()

              glLinkProgramARB

              See external documentation.

       useProgramObjectARB(ProgramObj) -> ok

              Types:

                 ProgramObj = integer()

              glUseProgramObjectARB

              See external documentation.

       validateProgramARB(ProgramObj) -> ok

              Types:

                 ProgramObj = integer()

              glValidateProgramARB

              See external documentation.

       getObjectParameterfvARB(Obj, Pname) -> float()

              Types:

                 Obj = integer()
                 Pname = enum()

              glGetObjectParameterARB

              See external documentation.

       getObjectParameterivARB(Obj, Pname) -> integer()

              Types:

                 Obj = integer()
                 Pname = enum()

              glGetObjectParameterARB

              See external documentation.

       getInfoLogARB(Obj, MaxLength) -> string()

              Types:

                 Obj = integer()
                 MaxLength = integer()

              glGetInfoLogARB

              See external documentation.

       getAttachedObjectsARB(ContainerObj, MaxCount) -> [integer()]

              Types:

                 ContainerObj = integer()
                 MaxCount = integer()

              glGetAttachedObjectsARB

              See external documentation.

       getUniformLocationARB(ProgramObj, Name) -> integer()

              Types:

                 ProgramObj = integer()
                 Name = string()

              glGetUniformLocationARB

              See external documentation.

       getActiveUniformARB(ProgramObj, Index, MaxLength) -> {Size::integer(), Type::enum(), Name::string()}

              Types:

                 ProgramObj = integer()
                 Index = integer()
                 MaxLength = integer()

              glGetActiveUniformARB

              See external documentation.

       getUniformfvARB(ProgramObj, Location) -> matrix()

              Types:

                 ProgramObj = integer()
                 Location = integer()

              glGetUniformARB

              See external documentation.

       getUniformivARB(ProgramObj,   Location)   ->  {integer(),  integer(),  integer(),  integer(),  integer(),
       integer(), integer(),  integer(),  integer(),  integer(),  integer(),  integer(),  integer(),  integer(),
       integer(), integer()}

              Types:

                 ProgramObj = integer()
                 Location = integer()

              glGetUniformARB

              See external documentation.

       getShaderSourceARB(Obj, MaxLength) -> string()

              Types:

                 Obj = integer()
                 MaxLength = integer()

              glGetShaderSourceARB

              See external documentation.

       bindAttribLocationARB(ProgramObj, Index, Name) -> ok

              Types:

                 ProgramObj = integer()
                 Index = integer()
                 Name = string()

              glBindAttribLocationARB

              See external documentation.

       getActiveAttribARB(ProgramObj, Index, MaxLength) -> {Size::integer(), Type::enum(), Name::string()}

              Types:

                 ProgramObj = integer()
                 Index = integer()
                 MaxLength = integer()

              glGetActiveAttribARB

              See external documentation.

       getAttribLocationARB(ProgramObj, Name) -> integer()

              Types:

                 ProgramObj = integer()
                 Name = string()

              glGetAttribLocationARB

              See external documentation.

       isRenderbuffer(Renderbuffer) -> 0 | 1

              Types:

                 Renderbuffer = integer()

              Determine if a name corresponds to a renderbuffer object

              gl:isRenderbuffer returns ?GL_TRUE if Renderbuffer is currently the name of a renderbuffer object.
              If Renderbuffer is zero, or if Renderbuffer is not the name of a renderbuffer  object,  or  if  an
              error  occurs,  gl:isRenderbuffer  returns  ?GL_FALSE.  If  Renderbuffer  is  a  name  returned by
              gl:genRenderbuffers/1 , by that has not yet been bound through a call to gl:bindRenderbuffer/2  or
              gl:framebufferRenderbuffer/4  ,  then  the name is not a renderbuffer object and gl:isRenderbuffer
              returns ?GL_FALSE .

              See external documentation.

       bindRenderbuffer(Target, Renderbuffer) -> ok

              Types:

                 Target = enum()
                 Renderbuffer = integer()

              Bind a renderbuffer to a renderbuffer target

              gl:bindRenderbuffer binds the renderbuffer object  with  name  Renderbuffer  to  the  renderbuffer
              target  specified  by  Target  .  Target  must be ?GL_RENDERBUFFER . Renderbuffer is the name of a
              renderbuffer object previously returned from a call to gl:genRenderbuffers/1 , or  zero  to  break
              the existing binding of a renderbuffer object to Target .

              See external documentation.

       deleteRenderbuffers(Renderbuffers) -> ok

              Types:

                 Renderbuffers = [integer()]

              Delete renderbuffer objects

              gl:deleteRenderbuffers  deletes  the  N  renderbuffer  objects whose names are stored in the array
              addressed by Renderbuffers . The name zero is reserved by the GL and is silently  ignored,  should
              it  occur in Renderbuffers , as are other unused names. Once a renderbuffer object is deleted, its
              name is again unused and it has no contents. If a renderbuffer that  is  currently  bound  to  the
              target ?GL_RENDERBUFFER is deleted, it is as though gl:bindRenderbuffer/2 had been executed with a
              Target of ?GL_RENDERBUFFER and a Name of zero.

              See external documentation.

       genRenderbuffers(N) -> [integer()]

              Types:

                 N = integer()

              Generate renderbuffer object names

              gl:genRenderbuffers returns N renderbuffer object names in Renderbuffers . There is  no  guarantee
              that  the  names  form  a  contiguous  set of integers; however, it is guaranteed that none of the
              returned names was in use immediately before the call to gl:genRenderbuffers .

              See external documentation.

       renderbufferStorage(Target, Internalformat, Width, Height) -> ok

              Types:

                 Target = enum()
                 Internalformat = enum()
                 Width = integer()
                 Height = integer()

              Establish data storage, format and dimensions of a renderbuffer object's image

              gl:renderbufferStorage is  equivalent  to  calling  gl:renderbufferStorageMultisample/5  with  the
              Samples set to zero.

              See external documentation.

       getRenderbufferParameteriv(Target, Pname) -> integer()

              Types:

                 Target = enum()
                 Pname = enum()

              Retrieve information about a bound renderbuffer object

              gl:getRenderbufferParameteriv  retrieves  information  about  a  bound renderbuffer object. Target
              specifies the target of the query operation and must be ?GL_RENDERBUFFER  .  Pname  specifies  the
              parameter    whose    value   to   query   and   must   be   one   of   ?GL_RENDERBUFFER_WIDTH   ,
              ?GL_RENDERBUFFER_HEIGHT,     ?GL_RENDERBUFFER_INTERNAL_FORMAT,     ?GL_RENDERBUFFER_RED_SIZE     ,
              ?GL_RENDERBUFFER_GREEN_SIZE,     ?GL_RENDERBUFFER_BLUE_SIZE,     ?GL_RENDERBUFFER_ALPHA_SIZE     ,
              ?GL_RENDERBUFFER_DEPTH_SIZE,  ?GL_RENDERBUFFER_DEPTH_SIZE,  ?GL_RENDERBUFFER_STENCIL_SIZE   ,   or
              ?GL_RENDERBUFFER_SAMPLES.

              See external documentation.

       isFramebuffer(Framebuffer) -> 0 | 1

              Types:

                 Framebuffer = integer()

              Determine if a name corresponds to a framebuffer object

              gl:isFramebuffer returns ?GL_TRUE if Framebuffer is currently the name of a framebuffer object. If
              Framebuffer is zero, or if ?framebuffer is not the name of a framebuffer object, or  if  an  error
              occurs,   gl:isFramebuffer   returns   ?GL_FALSE.   If   Framebuffer   is   a   name  returned  by
              gl:genFramebuffers/1 , by that has not yet been bound through a  call  to  gl:bindFramebuffer/2  ,
              then the name is not a framebuffer object and gl:isFramebuffer returns ?GL_FALSE.

              See external documentation.

       bindFramebuffer(Target, Framebuffer) -> ok

              Types:

                 Target = enum()
                 Framebuffer = integer()

              Bind a framebuffer to a framebuffer target

              gl:bindFramebuffer  binds  the  framebuffer object with name Framebuffer to the framebuffer target
              specified by Target .  Target  must  be  either  ?GL_DRAW_FRAMEBUFFER  ,  ?GL_READ_FRAMEBUFFER  or
              ?GL_FRAMEBUFFER. If a framebuffer object is bound to ?GL_DRAW_FRAMEBUFFER or ?GL_READ_FRAMEBUFFER,
              it becomes the target for rendering or readback operations, respectively, until it is  deleted  or
              another  framebuffer  is  bound  to  the corresponding bind point. Calling gl:bindFramebuffer with
              Target set to ?GL_FRAMEBUFFER binds Framebuffer to both the read  and  draw  framebuffer  targets.
              Framebuffer   is   the   name  of  a  framebuffer  object  previously  returned  from  a  call  to
              gl:genFramebuffers/1 , or zero to break the existing binding of a framebuffer object to Target .

              See external documentation.

       deleteFramebuffers(Framebuffers) -> ok

              Types:

                 Framebuffers = [integer()]

              Delete framebuffer objects

              gl:deleteFramebuffers deletes the N framebuffer objects  whose  names  are  stored  in  the  array
              addressed by Framebuffers . The name zero is reserved by the GL and is silently ignored, should it
              occur in Framebuffers , as are other unused names. Once a framebuffer object is deleted, its  name
              is again unused and it has no attachments. If a framebuffer that is currently bound to one or more
              of  the  targets  ?GL_DRAW_FRAMEBUFFER  or  ?GL_READ_FRAMEBUFFER  is  deleted,  it  is  as  though
              gl:bindFramebuffer/2 had been executed with the corresponding Target and Framebuffer zero.

              See external documentation.

       genFramebuffers(N) -> [integer()]

              Types:

                 N = integer()

              Generate framebuffer object names

              gl:genFramebuffers  returns  N  framebuffer  object  names in Ids . There is no guarantee that the
              names form a contiguous set of integers; however, it is guaranteed that none of the returned names
              was in use immediately before the call to gl:genFramebuffers .

              See external documentation.

       checkFramebufferStatus(Target) -> enum()

              Types:

                 Target = enum()

              Check the completeness status of a framebuffer

              gl:checkFramebufferStatus  queries  the  completeness  status  of the framebuffer object currently
              bound to Target . Target must be ?GL_DRAW_FRAMEBUFFER,  ?GL_READ_FRAMEBUFFER  or  ?GL_FRAMEBUFFER.
              ?GL_FRAMEBUFFER is equivalent to ?GL_DRAW_FRAMEBUFFER .

              See external documentation.

       framebufferTexture1D(Target, Attachment, Textarget, Texture, Level) -> ok

              Types:

                 Target = enum()
                 Attachment = enum()
                 Textarget = enum()
                 Texture = integer()
                 Level = integer()

              See framebufferTexture/4

       framebufferTexture2D(Target, Attachment, Textarget, Texture, Level) -> ok

              Types:

                 Target = enum()
                 Attachment = enum()
                 Textarget = enum()
                 Texture = integer()
                 Level = integer()

              See framebufferTexture/4

       framebufferTexture3D(Target, Attachment, Textarget, Texture, Level, Zoffset) -> ok

              Types:

                 Target = enum()
                 Attachment = enum()
                 Textarget = enum()
                 Texture = integer()
                 Level = integer()
                 Zoffset = integer()

              See framebufferTexture/4

       framebufferRenderbuffer(Target, Attachment, Renderbuffertarget, Renderbuffer) -> ok

              Types:

                 Target = enum()
                 Attachment = enum()
                 Renderbuffertarget = enum()
                 Renderbuffer = integer()

              Attach a renderbuffer as a logical buffer to the currently bound framebuffer object

              gl:framebufferRenderbuffer  attaches a renderbuffer as one of the logical buffers of the currently
              bound framebuffer object. Renderbuffer is the name of the renderbuffer object to attach  and  must
              be  either  zero,  or  the name of an existing renderbuffer object of type Renderbuffertarget . If
              Renderbuffer is not zero and if gl:framebufferRenderbuffer is successful,  then  the  renderbuffer
              name  Renderbuffer  will be used as the logical buffer identified by Attachment of the framebuffer
              currently bound to Target .

              See external documentation.

       getFramebufferAttachmentParameteriv(Target, Attachment, Pname) -> integer()

              Types:

                 Target = enum()
                 Attachment = enum()
                 Pname = enum()

              Retrieve information about attachments of a bound framebuffer object

              gl:getFramebufferAttachmentParameter returns information about attachments of a bound  framebuffer
              object.  Target  specifies  the  framebuffer  binding  point  and  must  be  ?GL_DRAW_FRAMEBUFFER,
              ?GL_READ_FRAMEBUFFER or ?GL_FRAMEBUFFER. ?GL_FRAMEBUFFER is equivalent to ?GL_DRAW_FRAMEBUFFER.

              See external documentation.

       generateMipmap(Target) -> ok

              Types:

                 Target = enum()

              Generate mipmaps for a specified texture target

              gl:generateMipmap generates mipmaps for the texture attached to Target of the active texture unit.
              For  cube  map  textures,  a  ?GL_INVALID_OPERATION  error is generated if the texture attached to
              Target is not cube complete.

              See external documentation.

       blitFramebuffer(SrcX0, SrcY0, SrcX1, SrcY1, DstX0, DstY0, DstX1, DstY1, Mask, Filter) -> ok

              Types:

                 SrcX0 = integer()
                 SrcY0 = integer()
                 SrcX1 = integer()
                 SrcY1 = integer()
                 DstX0 = integer()
                 DstY0 = integer()
                 DstX1 = integer()
                 DstY1 = integer()
                 Mask = integer()
                 Filter = enum()

              Copy a block of pixels from the read framebuffer to the draw framebuffer

              gl:blitFramebuffer transfers a rectangle of pixel values from one region of the  read  framebuffer
              to another region in the draw framebuffer. Mask is the bitwise OR of a number of values indicating
              which buffers are to be copied. The values are ?GL_COLOR_BUFFER_BIT  ,  ?GL_DEPTH_BUFFER_BIT,  and
              ?GL_STENCIL_BUFFER_BIT.  The  pixels  corresponding  to  these  buffers are copied from the source
              rectangle bounded by the locations ( SrcX0 ; SrcY0 ) and ( SrcX1 ;  SrcY1  )  to  the  destination
              rectangle  bounded  by  the locations ( DstX0 ; DstY0 ) and ( DstX1 ; DstY1 ). The lower bounds of
              the rectangle are inclusive, while the upper bounds are exclusive.

              See external documentation.

       renderbufferStorageMultisample(Target, Samples, Internalformat, Width, Height) -> ok

              Types:

                 Target = enum()
                 Samples = integer()
                 Internalformat = enum()
                 Width = integer()
                 Height = integer()

              Establish data storage, format, dimensions and sample count of a renderbuffer object's image

              gl:renderbufferStorageMultisample establishes the data storage, format, dimensions and  number  of
              samples of a renderbuffer object's image.

              See external documentation.

       framebufferTextureLayer(Target, Attachment, Texture, Level, Layer) -> ok

              Types:

                 Target = enum()
                 Attachment = enum()
                 Texture = integer()
                 Level = integer()
                 Layer = integer()

              See framebufferTexture/4

       framebufferTextureFaceARB(Target, Attachment, Texture, Level, Face) -> ok

              Types:

                 Target = enum()
                 Attachment = enum()
                 Texture = integer()
                 Level = integer()
                 Face = enum()

              See framebufferTexture/4

       flushMappedBufferRange(Target, Offset, Length) -> ok

              Types:

                 Target = enum()
                 Offset = integer()
                 Length = integer()

              Indicate modifications to a range of a mapped buffer

              gl:flushMappedBufferRange  indicates  that  modifications  have  been  made to a range of a mapped
              buffer. The buffer must previously have been mapped with the ?GL_MAP_FLUSH_EXPLICIT  flag.  Offset
              and  Length  indicate the modified subrange of the mapping, in basic units. The specified subrange
              to  flush  is  relative  to  the  start  of  the   currently   mapped   range   of   the   buffer.
              gl:flushMappedBufferRange  may  be  called  multiple  times  to indicate distinct subranges of the
              mapping which require flushing.

              See external documentation.

       bindVertexArray(Array) -> ok

              Types:

                 Array = integer()

              Bind a vertex array object

              gl:bindVertexArray binds the vertex array object with name Array . Array is the name of  a  vertex
              array  object  previously  returned  from  a  call  to gl:genVertexArrays/1 , or zero to break the
              existing vertex array object binding.

              See external documentation.

       deleteVertexArrays(Arrays) -> ok

              Types:

                 Arrays = [integer()]

              Delete vertex array objects

              gl:deleteVertexArrays deletes N vertex array objects whose names are stored in the array addressed
              by Arrays . Once a vertex array object is deleted it has no contents and its name is again unused.
              If a vertex array object that is currently bound is deleted, the binding for that  object  reverts
              to zero and the default vertex array becomes current. Unused names in Arrays are silently ignored,
              as is the value zero.

              See external documentation.

       genVertexArrays(N) -> [integer()]

              Types:

                 N = integer()

              Generate vertex array object names

              gl:genVertexArrays returns N vertex array object names in Arrays . There is no guarantee that  the
              names form a contiguous set of integers; however, it is guaranteed that none of the returned names
              was in use immediately before the call to gl:genVertexArrays .

              See external documentation.

       isVertexArray(Array) -> 0 | 1

              Types:

                 Array = integer()

              Determine if a name corresponds to a vertex array object

              gl:isVertexArray returns ?GL_TRUE if Array is currently the name  of  a  renderbuffer  object.  If
              Renderbuffer is zero, or if Array is not the name of a renderbuffer object, or if an error occurs,
              gl:isVertexArray returns ?GL_FALSE . If Array is a name returned by gl:genVertexArrays/1 , by that
              has  not  yet  been  bound  through a call to gl:bindVertexArray/1 , then the name is not a vertex
              array object and gl:isVertexArray returns ?GL_FALSE.

              See external documentation.

       getUniformIndices(Program, UniformNames) -> [integer()]

              Types:

                 Program = integer()
                 UniformNames = iolist()

              Retrieve the index of a named uniform block

              gl:getUniformIndices retrieves the indices of a number of uniforms within Program .

              See external documentation.

       getActiveUniformsiv(Program, UniformIndices, Pname) -> [integer()]

              Types:

                 Program = integer()
                 UniformIndices = [integer()]
                 Pname = enum()

              glGetActiveUniforms

              See external documentation.

       getActiveUniformName(Program, UniformIndex, BufSize) -> string()

              Types:

                 Program = integer()
                 UniformIndex = integer()
                 BufSize = integer()

              Query the name of an active uniform

              gl:getActiveUniformName returns the name of the active uniform at UniformIndex within Program . If
              UniformName  is  not  NULL,  up to BufSize characters (including a nul-terminator) will be written
              into the array whose address is specified by UniformName . If Length is not NULL,  the  number  of
              characters  that  were  (or  would  have  been)  written  into UniformName (not including the nul-
              terminator) will be placed in the variable whose address is specified in Length  .  If  Length  is
              NULL,  no  length  is  returned. The length of the longest uniform name in Program is given by the
              value of ?GL_ACTIVE_UNIFORM_MAX_LENGTH, which can be queried with gl:getProgramiv/2 .

              See external documentation.

       getUniformBlockIndex(Program, UniformBlockName) -> integer()

              Types:

                 Program = integer()
                 UniformBlockName = string()

              Retrieve the index of a named uniform block

              gl:getUniformBlockIndex retrieves the index of a uniform block within Program .

              See external documentation.

       getActiveUniformBlockiv(Program, UniformBlockIndex, Pname, Params) -> ok

              Types:

                 Program = integer()
                 UniformBlockIndex = integer()
                 Pname = enum()
                 Params = mem()

              Query information about an active uniform block

              gl:getActiveUniformBlockiv retrieves information about an active uniform block within Program .

              See external documentation.

       getActiveUniformBlockName(Program, UniformBlockIndex, BufSize) -> string()

              Types:

                 Program = integer()
                 UniformBlockIndex = integer()
                 BufSize = integer()

              Retrieve the name of an active uniform block

              gl:getActiveUniformBlockName retrieves the name of the active uniform block  at  UniformBlockIndex
              within Program .

              See external documentation.

       uniformBlockBinding(Program, UniformBlockIndex, UniformBlockBinding) -> ok

              Types:

                 Program = integer()
                 UniformBlockIndex = integer()
                 UniformBlockBinding = integer()

              Assign a binding point to an active uniform block

              Binding  points  for  active  uniform  blocks are assigned using gl:uniformBlockBinding. Each of a
              program's active uniform blocks has a corresponding uniform buffer binding point. Program  is  the
              name of a program object for which the command gl:linkProgram/1 has been issued in the past.

              See external documentation.

       copyBufferSubData(ReadTarget, WriteTarget, ReadOffset, WriteOffset, Size) -> ok

              Types:

                 ReadTarget = enum()
                 WriteTarget = enum()
                 ReadOffset = integer()
                 WriteOffset = integer()
                 Size = integer()

              Copy part of the data store of a buffer object to the data store of another buffer object

              gl:copyBufferSubData  copies  part  of  the  data  store  attached to Readtarget to the data store
              attached to Writetarget . The number of basic machine units indicated by Size is copied  from  the
              source, at offset Readoffset to the destination at Writeoffset , also in basic machine units.

              See external documentation.

       drawElementsBaseVertex(Mode, Count, Type, Indices, Basevertex) -> ok

              Types:

                 Mode = enum()
                 Count = integer()
                 Type = enum()
                 Indices = offset() | mem()
                 Basevertex = integer()

              Render primitives from array data with a per-element offset

              gl:drawElementsBaseVertex  behaves  identically  to  gl:drawElements/4 except that the ith element
              transferred by the corresponding draw call will be taken from element Indices [i] + Basevertex  of
              each  enabled array. If the resulting value is larger than the maximum value representable by Type
              , it is as if the calculation were upconverted to  32-bit  unsigned  integers  (with  wrapping  on
              overflow conditions). The operation is undefined if the sum would be negative.

              See external documentation.

       drawRangeElementsBaseVertex(Mode, Start, End, Count, Type, Indices, Basevertex) -> ok

              Types:

                 Mode = enum()
                 Start = integer()
                 End = integer()
                 Count = integer()
                 Type = enum()
                 Indices = offset() | mem()
                 Basevertex = integer()

              Render primitives from array data with a per-element offset

              gl:drawRangeElementsBaseVertex  is a restricted form of gl:drawElementsBaseVertex/5 . Mode , Start
              , End , Count and Basevertex match the corresponding arguments  to  gl:drawElementsBaseVertex/5  ,
              with the additional constraint that all values in the array Indices must lie between Start and End
              , inclusive, prior to adding Basevertex . Index values lying outside the range [ Start , End ] are
              treated  in  the  same  way  as  gl:drawElementsBaseVertex/5 . The i th element transferred by the
              corresponding draw call will be taken from element Indices [i] + Basevertex of each enabled array.
              If  the  resulting  value is larger than the maximum value representable by Type , it is as if the
              calculation were upconverted to 32-bit unsigned integers (with wrapping on  overflow  conditions).
              The operation is undefined if the sum would be negative.

              See external documentation.

       drawElementsInstancedBaseVertex(Mode, Count, Type, Indices, Primcount, Basevertex) -> ok

              Types:

                 Mode = enum()
                 Count = integer()
                 Type = enum()
                 Indices = offset() | mem()
                 Primcount = integer()
                 Basevertex = integer()

              Render multiple instances of a set of primitives from array data with a per-element offset

              gl:drawElementsInstancedBaseVertex  behaves  identically to gl:drawElementsInstanced/5 except that
              the ith element transferred by the corresponding draw call will be taken from element Indices  [i]
              +  Basevertex  of  each  enabled  array.  If  the resulting value is larger than the maximum value
              representable by Type , it is as if the calculation were upconverted to 32-bit  unsigned  integers
              (with wrapping on overflow conditions). The operation is undefined if the sum would be negative.

              See external documentation.

       provokingVertex(Mode) -> ok

              Types:

                 Mode = enum()

              Specifiy the vertex to be used as the source of data for flat shaded varyings

              Flatshading  a  vertex shader varying output means to assign all vetices of the primitive the same
              value for that output. The vertex from which these values is derived is  known  as  the  provoking
              vertex  and gl:provokingVertex specifies which vertex is to be used as the source of data for flat
              shaded varyings.

              See external documentation.

       fenceSync(Condition, Flags) -> integer()

              Types:

                 Condition = enum()
                 Flags = integer()

              Create a new sync object and insert it into the GL command stream

              gl:fenceSync creates a new fence sync object, inserts a fence command into the GL  command  stream
              and  associates  it  with  that sync object, and returns a non-zero name corresponding to the sync
              object.

              See external documentation.

       isSync(Sync) -> 0 | 1

              Types:

                 Sync = integer()

              Determine if a name corresponds to a sync object

              gl:isSync returns ?GL_TRUE if Sync is currently the name of a sync object. If Sync is not the name
              of  a  sync  object, or if an error occurs, gl:isSync returns ?GL_FALSE. Note that zero is not the
              name of a sync object.

              See external documentation.

       deleteSync(Sync) -> ok

              Types:

                 Sync = integer()

              Delete a sync object

              gl:deleteSync deletes the sync object specified by Sync . If the fence  command  corresponding  to
              the  specified  sync  object has completed, or if no gl:waitSync/3 or gl:clientWaitSync/3 commands
              are blocking on Sync , the object is deleted immediately. Otherwise, Sync is flagged for  deletion
              and  will  be  deleted  when  it  is  no longer associated with any fence command and is no longer
              blocking any gl:waitSync/3 or gl:clientWaitSync/3 command. In  either  case,  after  gl:deleteSync
              returns, the name Sync is invalid and can no longer be used to refer to the sync object.

              See external documentation.

       clientWaitSync(Sync, Flags, Timeout) -> enum()

              Types:

                 Sync = integer()
                 Flags = integer()
                 Timeout = integer()

              Block and wait for a sync object to become signaled

              gl:clientWaitSync  causes  the  client  to block and wait for the sync object specified by Sync to
              become signaled. If Sync is signaled when gl:clientWaitSync is called,  gl:clientWaitSync  returns
              immediately,  otherwise  it  will  block and wait for up to Timeout nanoseconds for Sync to become
              signaled.

              See external documentation.

       waitSync(Sync, Flags, Timeout) -> ok

              Types:

                 Sync = integer()
                 Flags = integer()
                 Timeout = integer()

              Instruct the GL server to block until the specified sync object becomes signaled

              gl:waitSync causes the GL server to block and wait until Sync becomes signaled. Sync is  the  name
              of  an  existing sync object upon which to wait. Flags and Timeout are currently not used and must
              be set to zero and the special value ?GL_TIMEOUT_IGNORED , respectively

              Flags and Timeout are placeholders for anticipated future extensions of sync object  capabilities.
              They  must  have  these  reserved  values  in order that existing code calling gl:waitSync operate
              properly in the presence of such extensions.

              See external documentation.

       getInteger64v(Pname) -> [integer()]

              Types:

                 Pname = enum()

              See getBooleanv/1

       getSynciv(Sync, Pname, BufSize) -> [integer()]

              Types:

                 Sync = integer()
                 Pname = enum()
                 BufSize = integer()

              Query the properties of a sync object

              gl:getSynciv retrieves properties of a sync object. Sync specifies the name  of  the  sync  object
              whose properties to retrieve.

              See external documentation.

       texImage2DMultisample(Target, Samples, Internalformat, Width, Height, Fixedsamplelocations) -> ok

              Types:

                 Target = enum()
                 Samples = integer()
                 Internalformat = integer()
                 Width = integer()
                 Height = integer()
                 Fixedsamplelocations = 0 | 1

              Establish  the  data storage, format, dimensions, and number of samples of a multisample texture's
              image

              gl:texImage2DMultisample establishes the data storage, format, dimensions and number of samples of
              a multisample texture's image.

              See external documentation.

       texImage3DMultisample(Target, Samples, Internalformat, Width, Height, Depth, Fixedsamplelocations) -> ok

              Types:

                 Target = enum()
                 Samples = integer()
                 Internalformat = integer()
                 Width = integer()
                 Height = integer()
                 Depth = integer()
                 Fixedsamplelocations = 0 | 1

              Establish  the  data storage, format, dimensions, and number of samples of a multisample texture's
              image

              gl:texImage3DMultisample establishes the data storage, format, dimensions and number of samples of
              a multisample texture's image.

              See external documentation.

       getMultisamplefv(Pname, Index) -> {float(), float()}

              Types:

                 Pname = enum()
                 Index = integer()

              Retrieve the location of a sample

              gl:getMultisamplefv  queries  the location of a given sample. Pname specifies the sample parameter
              to retrieve and must be ?GL_SAMPLE_POSITION.  Index  corresponds  to  the  sample  for  which  the
              location  should  be  returned.  The  sample  location is returned as two floating-point values in
              Val[0] and Val[1] , each between 0 and 1, corresponding to the X and Y locations  respectively  in
              the  GL pixel space of that sample. (0.5, 0.5) this corresponds to the pixel center. Index must be
              between zero and the value of ?GL_SAMPLES - 1.

              See external documentation.

       sampleMaski(Index, Mask) -> ok

              Types:

                 Index = integer()
                 Mask = integer()

              Set the value of a sub-word of the sample mask

              gl:sampleMaski sets one 32-bit sub-word of the multi-word sample mask, ?GL_SAMPLE_MASK_VALUE .

              See external documentation.

       namedStringARB(Type, Name, String) -> ok

              Types:

                 Type = enum()
                 Name = string()
                 String = string()

              glNamedStringARB

              See external documentation.

       deleteNamedStringARB(Name) -> ok

              Types:

                 Name = string()

              glDeleteNamedStringARB

              See external documentation.

       compileShaderIncludeARB(Shader, Path) -> ok

              Types:

                 Shader = integer()
                 Path = iolist()

              glCompileShaderIncludeARB

              See external documentation.

       isNamedStringARB(Name) -> 0 | 1

              Types:

                 Name = string()

              glIsNamedStringARB

              See external documentation.

       getNamedStringARB(Name, BufSize) -> string()

              Types:

                 Name = string()
                 BufSize = integer()

              glGetNamedStringARB

              See external documentation.

       getNamedStringivARB(Name, Pname) -> integer()

              Types:

                 Name = string()
                 Pname = enum()

              glGetNamedStringARB

              See external documentation.

       bindFragDataLocationIndexed(Program, ColorNumber, Index, Name) -> ok

              Types:

                 Program = integer()
                 ColorNumber = integer()
                 Index = integer()
                 Name = string()

              glBindFragDataLocationIndexe

              See external documentation.

       getFragDataIndex(Program, Name) -> integer()

              Types:

                 Program = integer()
                 Name = string()

              Query the bindings of color indices to user-defined varying out variables

              gl:getFragDataIndex returns the index of the fragment color to which the variable Name  was  bound
              when  the program object Program was last linked. If Name is not a varying out variable of Program
              , or if an error occurs, -1 will be returned.

              See external documentation.

       genSamplers(Count) -> [integer()]

              Types:

                 Count = integer()

              Generate sampler object names

              gl:genSamplers returns N sampler object names in Samplers . There is no guarantee that  the  names
              form  a  contiguous set of integers; however, it is guaranteed that none of the returned names was
              in use immediately before the call to gl:genSamplers .

              See external documentation.

       deleteSamplers(Samplers) -> ok

              Types:

                 Samplers = [integer()]

              Delete named sampler objects

              gl:deleteSamplers deletes N sampler objects named by the elements of  the  array  Ids  .  After  a
              sampler  object  is deleted, its name is again unused. If a sampler object that is currently bound
              to a sampler unit is deleted, it is as though gl:bindSampler/2 is called with unit set to the unit
              the sampler is bound to and sampler zero. Unused names in samplers are silently ignored, as is the
              reserved name zero.

              See external documentation.

       isSampler(Sampler) -> 0 | 1

              Types:

                 Sampler = integer()

              Determine if a name corresponds to a sampler object

              gl:isSampler returns ?GL_TRUE if Id is currently the name of a sampler object. If Id is  zero,  or
              is  a  non-zero  value  that is not currently the name of a sampler object, or if an error occurs,
              gl:isSampler returns ?GL_FALSE.

              See external documentation.

       bindSampler(Unit, Sampler) -> ok

              Types:

                 Unit = integer()
                 Sampler = integer()

              Bind a named sampler to a texturing target

              gl:bindSampler binds Sampler to the texture unit at index Unit . Sampler must be zero or the  name
              of  a  sampler object previously returned from a call to gl:genSamplers/1 . Unit must be less than
              the value of ?GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS.

              See external documentation.

       samplerParameteri(Sampler, Pname, Param) -> ok

              Types:

                 Sampler = integer()
                 Pname = enum()
                 Param = integer()

              Set sampler parameters

              gl:samplerParameter assigns the value or values in Params to the sampler  parameter  specified  as
              Pname  .  Sampler  specifies  the sampler object to be modified, and must be the name of a sampler
              object previously returned from a call to gl:genSamplers/1 . The following symbols are accepted in
              Pname :

              See external documentation.

       samplerParameteriv(Sampler, Pname, Param) -> ok

              Types:

                 Sampler = integer()
                 Pname = enum()
                 Param = [integer()]

              See samplerParameteri/3

       samplerParameterf(Sampler, Pname, Param) -> ok

              Types:

                 Sampler = integer()
                 Pname = enum()
                 Param = float()

              See samplerParameteri/3

       samplerParameterfv(Sampler, Pname, Param) -> ok

              Types:

                 Sampler = integer()
                 Pname = enum()
                 Param = [float()]

              See samplerParameteri/3

       samplerParameterIiv(Sampler, Pname, Param) -> ok

              Types:

                 Sampler = integer()
                 Pname = enum()
                 Param = [integer()]

              See samplerParameteri/3

       samplerParameterIuiv(Sampler, Pname, Param) -> ok

              Types:

                 Sampler = integer()
                 Pname = enum()
                 Param = [integer()]

              glSamplerParameterI

              See external documentation.

       getSamplerParameteriv(Sampler, Pname) -> [integer()]

              Types:

                 Sampler = integer()
                 Pname = enum()

              Return sampler parameter values

              gl:getSamplerParameter returns in Params the value or values of the sampler parameter specified as
              Pname . Sampler defines the target sampler, and must be the name of an  existing  sampler  object,
              returned  from  a  previous  call  to  gl:genSamplers/1  .  Pname  accepts  the  same  symbols  as
              gl:samplerParameteri/3 , with the same interpretations:

              See external documentation.

       getSamplerParameterIiv(Sampler, Pname) -> [integer()]

              Types:

                 Sampler = integer()
                 Pname = enum()

              See getSamplerParameteriv/2

       getSamplerParameterfv(Sampler, Pname) -> [float()]

              Types:

                 Sampler = integer()
                 Pname = enum()

              See getSamplerParameteriv/2

       getSamplerParameterIuiv(Sampler, Pname) -> [integer()]

              Types:

                 Sampler = integer()
                 Pname = enum()

              glGetSamplerParameterI

              See external documentation.

       queryCounter(Id, Target) -> ok

              Types:

                 Id = integer()
                 Target = enum()

              Record the GL time into a query object after all previous commands have reached the GL server  but
              have not yet necessarily executed.

              gl:queryCounter  causes  the GL to record the current time into the query object named Id . Target
              must be ?GL_TIMESTAMP. The time is recorded after all previous  commands  on  the  GL  client  and
              server  state  and  the framebuffer have been fully realized. When the time is recorded, the query
              result for that object is marked available. gl:queryCounter timer queries can  be  used  within  a
              gl:beginQuery/2  /  gl:beginQuery/2  block  where  the  target is ?GL_TIME_ELAPSED and it does not
              affect the result of that query object.

              See external documentation.

       getQueryObjecti64v(Id, Pname) -> integer()

              Types:

                 Id = integer()
                 Pname = enum()

              glGetQueryObjecti64v

              See external documentation.

       getQueryObjectui64v(Id, Pname) -> integer()

              Types:

                 Id = integer()
                 Pname = enum()

              glGetQueryObjectui64v

              See external documentation.

       drawArraysIndirect(Mode, Indirect) -> ok

              Types:

                 Mode = enum()
                 Indirect = offset() | mem()

              Render primitives from array data, taking parameters from memory

              gl:drawArraysIndirect specifies multiple geometric primitives  with  very  few  subroutine  calls.
              gl:drawArraysIndirect behaves similarly to gl:drawArraysInstancedBaseInstance/5 , execept that the
              parameters to gl:drawArraysInstancedBaseInstance/5 are stored in memory at the  address  given  by
              Indirect .

              See external documentation.

       drawElementsIndirect(Mode, Type, Indirect) -> ok

              Types:

                 Mode = enum()
                 Type = enum()
                 Indirect = offset() | mem()

              Render indexed primitives from array data, taking parameters from memory

              gl:drawElementsIndirect  specifies  multiple indexed geometric primitives with very few subroutine
              calls.            gl:drawElementsIndirect             behaves             similarly             to
              gl:drawElementsInstancedBaseVertexBaseInstance/7    ,    execpt    that    the    parameters    to
              gl:drawElementsInstancedBaseVertexBaseInstance/7 are stored in memory  at  the  address  given  by
              Indirect .

              See external documentation.

       uniform1d(Location, X) -> ok

              Types:

                 Location = integer()
                 X = float()

              See uniform1f/2

       uniform2d(Location, X, Y) -> ok

              Types:

                 Location = integer()
                 X = float()
                 Y = float()

              See uniform1f/2

       uniform3d(Location, X, Y, Z) -> ok

              Types:

                 Location = integer()
                 X = float()
                 Y = float()
                 Z = float()

              See uniform1f/2

       uniform4d(Location, X, Y, Z, W) -> ok

              Types:

                 Location = integer()
                 X = float()
                 Y = float()
                 Z = float()
                 W = float()

              See uniform1f/2

       uniform1dv(Location, Value) -> ok

              Types:

                 Location = integer()
                 Value = [float()]

              See uniform1f/2

       uniform2dv(Location, Value) -> ok

              Types:

                 Location = integer()
                 Value = [{float(), float()}]

              See uniform1f/2

       uniform3dv(Location, Value) -> ok

              Types:

                 Location = integer()
                 Value = [{float(), float(), float()}]

              See uniform1f/2

       uniform4dv(Location, Value) -> ok

              Types:

                 Location = integer()
                 Value = [{float(), float(), float(), float()}]

              See uniform1f/2

       uniformMatrix2dv(Location, Transpose, Value) -> ok

              Types:

                 Location = integer()
                 Transpose = 0 | 1
                 Value = [{float(), float(), float(), float()}]

              See uniform1f/2

       uniformMatrix3dv(Location, Transpose, Value) -> ok

              Types:

                 Location = integer()
                 Transpose = 0 | 1
                 Value = [{float(), float(), float(), float(), float(), float(), float(), float(), float()}]

              See uniform1f/2

       uniformMatrix4dv(Location, Transpose, Value) -> ok

              Types:

                 Location = integer()
                 Transpose = 0 | 1
                 Value  =  [{float(),  float(),  float(),  float(), float(), float(), float(), float(), float(),
                 float(), float(), float(), float(), float(), float(), float()}]

              See uniform1f/2

       uniformMatrix2x3dv(Location, Transpose, Value) -> ok

              Types:

                 Location = integer()
                 Transpose = 0 | 1
                 Value = [{float(), float(), float(), float(), float(), float()}]

              See uniform1f/2

       uniformMatrix2x4dv(Location, Transpose, Value) -> ok

              Types:

                 Location = integer()
                 Transpose = 0 | 1
                 Value = [{float(), float(), float(), float(), float(), float(), float(), float()}]

              See uniform1f/2

       uniformMatrix3x2dv(Location, Transpose, Value) -> ok

              Types:

                 Location = integer()
                 Transpose = 0 | 1
                 Value = [{float(), float(), float(), float(), float(), float()}]

              See uniform1f/2

       uniformMatrix3x4dv(Location, Transpose, Value) -> ok

              Types:

                 Location = integer()
                 Transpose = 0 | 1
                 Value = [{float(), float(), float(), float(),  float(),  float(),  float(),  float(),  float(),
                 float(), float(), float()}]

              See uniform1f/2

       uniformMatrix4x2dv(Location, Transpose, Value) -> ok

              Types:

                 Location = integer()
                 Transpose = 0 | 1
                 Value = [{float(), float(), float(), float(), float(), float(), float(), float()}]

              See uniform1f/2

       uniformMatrix4x3dv(Location, Transpose, Value) -> ok

              Types:

                 Location = integer()
                 Transpose = 0 | 1
                 Value  =  [{float(),  float(),  float(),  float(), float(), float(), float(), float(), float(),
                 float(), float(), float()}]

              See uniform1f/2

       getUniformdv(Program, Location) -> matrix()

              Types:

                 Program = integer()
                 Location = integer()

              See getUniformfv/2

       getSubroutineUniformLocation(Program, Shadertype, Name) -> integer()

              Types:

                 Program = integer()
                 Shadertype = enum()
                 Name = string()

              Retrieve the location of a subroutine uniform of a given shader stage within a program

              gl:getSubroutineUniformLocation returns the location of the subroutine uniform  variable  Name  in
              the  shader  stage  of  type Shadertype attached to Program , with behavior otherwise identical to
              gl:getUniformLocation/2 .

              See external documentation.

       getSubroutineIndex(Program, Shadertype, Name) -> integer()

              Types:

                 Program = integer()
                 Shadertype = enum()
                 Name = string()

              Retrieve the index of a subroutine uniform of a given shader stage within a program

              gl:getSubroutineIndex returns the index of a subroutine uniform within a shader stage attached  to
              a  program  object.  Program  contains  the  name  of the program to which the shader is attached.
              Shadertype specifies the stage from which to query shader  subroutine  index.  Name  contains  the
              null-terminated name of the subroutine uniform whose name to query.

              See external documentation.

       getActiveSubroutineUniformName(Program, Shadertype, Index, Bufsize) -> string()

              Types:

                 Program = integer()
                 Shadertype = enum()
                 Index = integer()
                 Bufsize = integer()

              Query the name of an active shader subroutine uniform

              gl:getActiveSubroutineUniformName  retrieves  the  name  of  an  active shader subroutine uniform.
              Program contains the name of the program containing the uniform. Shadertype  specifies  the  stage
              for  which  which  the uniform location, given by Index , is valid. Index must be between zero and
              the value of ?GL_ACTIVE_SUBROUTINE_UNIFORMS minus one for the shader stage.

              See external documentation.

       getActiveSubroutineName(Program, Shadertype, Index, Bufsize) -> string()

              Types:

                 Program = integer()
                 Shadertype = enum()
                 Index = integer()
                 Bufsize = integer()

              Query the name of an active shader subroutine

              gl:getActiveSubroutineName queries the name of  an  active  shader  subroutine  uniform  from  the
              program  object  given  in  Program  .  Index specifies the index of the shader subroutine uniform
              within  the  shader  stage  given  by  Stage  ,  and  must  between  zero   and   the   value   of
              ?GL_ACTIVE_SUBROUTINES minus one for the shader stage.

              See external documentation.

       uniformSubroutinesuiv(Shadertype, Indices) -> ok

              Types:

                 Shadertype = enum()
                 Indices = [integer()]

              Load active subroutine uniforms

              gl:uniformSubroutines  loads  all  active  subroutine  uniforms for shader stage Shadertype of the
              current program with subroutine indices from Indices , storing  Indices[i]  into  the  uniform  at
              location  I  . Count must be equal to the value of ?GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS for the
              program currently in use at shader stage Shadertype . Furthermore, all values in Indices  must  be
              less than the value of ?GL_ACTIVE_SUBROUTINES for the shader stage.

              See external documentation.

       getUniformSubroutineuiv(Shadertype,  Location) -> {integer(), integer(), integer(), integer(), integer(),
       integer(), integer(),  integer(),  integer(),  integer(),  integer(),  integer(),  integer(),  integer(),
       integer(), integer()}

              Types:

                 Shadertype = enum()
                 Location = integer()

              Retrieve the value of a subroutine uniform of a given shader stage of the current program

              gl:getUniformSubroutine  retrieves  the  value  of the subroutine uniform at location Location for
              shader stage Shadertype of  the  current  program.  Location  must  be  less  than  the  value  of
              ?GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS for the shader currently in use at shader stage Shadertype
              . The value of the subroutine uniform is returned in Values .

              See external documentation.

       getProgramStageiv(Program, Shadertype, Pname) -> integer()

              Types:

                 Program = integer()
                 Shadertype = enum()
                 Pname = enum()

              Retrieve properties of a program object corresponding to a specified shader stage

              gl:getProgramStage queries a parameter of a shader stage attached to  a  program  object.  Program
              contains  the  name of the program to which the shader is attached. Shadertype specifies the stage
              from which to query the parameter. Pname specifies which parameter should be queried. The value or
              values of the parameter to be queried is returned in the variable whose address is given in Values
              .

              See external documentation.

       patchParameteri(Pname, Value) -> ok

              Types:

                 Pname = enum()
                 Value = integer()

              Specifies the parameters for patch primitives

              gl:patchParameter specifies the parameters that will be used for patch primitives. Pname specifies
              the  parameter  to  modify and must be either ?GL_PATCH_VERTICES, ?GL_PATCH_DEFAULT_OUTER_LEVEL or
              ?GL_PATCH_DEFAULT_INNER_LEVEL. For gl:patchParameteri, Value  specifies  the  new  value  for  the
              parameter  specified  by Pname . For gl:patchParameterfv, Values specifies the address of an array
              containing the new values for the parameter specified by Pname .

              See external documentation.

       patchParameterfv(Pname, Values) -> ok

              Types:

                 Pname = enum()
                 Values = [float()]

              See patchParameteri/2

       bindTransformFeedback(Target, Id) -> ok

              Types:

                 Target = enum()
                 Id = integer()

              Bind a transform feedback object

              gl:bindTransformFeedback binds the transform feedback object with name Id to the current GL state.
              Id  must  be  a name previously returned from a call to gl:genTransformFeedbacks/1 . If Id has not
              previously been bound, a new transform feedback object with name Id and initialized with with  the
              default transform state vector is created.

              See external documentation.

       deleteTransformFeedbacks(Ids) -> ok

              Types:

                 Ids = [integer()]

              Delete transform feedback objects

              gl:deleteTransformFeedbacks deletes the N transform feedback objects whose names are stored in the
              array Ids . Unused names in Ids are ignored, as is the  name  zero.  After  a  transform  feedback
              object  is  deleted,  its  name  is  again  unused  and it has no contents. If an active transform
              feedback object is deleted, its name immediately becomes unused, but the underlying object is  not
              deleted until it is no longer active.

              See external documentation.

       genTransformFeedbacks(N) -> [integer()]

              Types:

                 N = integer()

              Reserve transform feedback object names

              gl:genTransformFeedbacks  returns  N  previously  unused  transform feedback object names in Ids .
              These names are marked as used, for  the  purposes  of  gl:genTransformFeedbacks  only,  but  they
              acquire transform feedback state only when they are first bound.

              See external documentation.

       isTransformFeedback(Id) -> 0 | 1

              Types:

                 Id = integer()

              Determine if a name corresponds to a transform feedback object

              gl:isTransformFeedback  returns  ?GL_TRUE  if  Id  is  currently  the name of a transform feedback
              object. If Id is zero, or if ?id is not the name of a transform feedback object, or  if  an  error
              occurs,    gl:isTransformFeedback   returns   ?GL_FALSE.   If   Id   is   a   name   returned   by
              gl:genTransformFeedbacks/1  ,  but  that  has   not   yet   been   bound   through   a   call   to
              gl:bindTransformFeedback/2   ,   then   the   name   is   not  a  transform  feedback  object  and
              gl:isTransformFeedback returns ?GL_FALSE .

              See external documentation.

       pauseTransformFeedback() -> ok

              Pause transform feedback operations

              gl:pauseTransformFeedback pauses transform feedback operations on the currently  active  transform
              feedback  object.  When  transform  feedback  operations  are  paused, transform feedback is still
              considered active and changing most transform feedback state related to the object results  in  an
              error. However, a new transform feedback object may be bound while transform feedback is paused.

              See external documentation.

       resumeTransformFeedback() -> ok

              Resume transform feedback operations

              gl:resumeTransformFeedback resumes transform feedback operations on the currently active transform
              feedback object. When transform feedback  operations  are  paused,  transform  feedback  is  still
              considered  active  and changing most transform feedback state related to the object results in an
              error. However, a new transform feedback object may be bound while transform feedback is paused.

              See external documentation.

       drawTransformFeedback(Mode, Id) -> ok

              Types:

                 Mode = enum()
                 Id = integer()

              Render primitives using a count derived from a transform feedback object

              gl:drawTransformFeedback draws primitives of a type specified by Mode using a count retrieved from
              the transform feedback specified by Id . Calling gl:drawTransformFeedback is equivalent to calling
              gl:drawArrays/3 with Mode as specified, First set to zero, and Count set to the number of vertices
              captured  on  vertex  stream  zero  the  last  time transform feedback was active on the transform
              feedback object named by Id .

              See external documentation.

       drawTransformFeedbackStream(Mode, Id, Stream) -> ok

              Types:

                 Mode = enum()
                 Id = integer()
                 Stream = integer()

              Render primitives using a count derived from a specifed stream of a transform feedback object

              gl:drawTransformFeedbackStream draws primitives  of  a  type  specified  by  Mode  using  a  count
              retrieved  from the transform feedback stream specified by Stream of the transform feedback object
              specified by Id . Calling gl:drawTransformFeedbackStream is equivalent to calling  gl:drawArrays/3
              with  Mode  as  specified,  First set to zero, and Count set to the number of vertices captured on
              vertex stream Stream the last time transform feedback was active on the transform feedback  object
              named by Id .

              See external documentation.

       beginQueryIndexed(Target, Index, Id) -> ok

              Types:

                 Target = enum()
                 Index = integer()
                 Id = integer()

              glBeginQueryIndexe

              See external documentation.

       endQueryIndexed(Target, Index) -> ok

              Types:

                 Target = enum()
                 Index = integer()

              Delimit the boundaries of a query object on an indexed target

              gl:beginQueryIndexed and gl:endQueryIndexed/2 delimit the boundaries of a query object. Query must
              be a name previously returned from a call to gl:genQueries/1 . If a query object with name Id does
              not  yet  exist  it  is  created  with  the  type  determined  by  Target  . Target must be one of
              ?GL_SAMPLES_PASSED,          ?GL_ANY_SAMPLES_PASSED          ,           ?GL_PRIMITIVES_GENERATED,
              ?GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN,  or ?GL_TIME_ELAPSED . The behavior of the query object
              depends on its type and is as follows.

              See external documentation.

       getQueryIndexediv(Target, Index, Pname) -> integer()

              Types:

                 Target = enum()
                 Index = integer()
                 Pname = enum()

              Return parameters of an indexed query object target

              gl:getQueryIndexediv returns in Params a selected parameter of the  indexed  query  object  target
              specified  by  Target and Index . Index specifies the index of the query object target and must be
              between zero and a target-specific maxiumum.

              See external documentation.

       releaseShaderCompiler() -> ok

              Release resources consumed by the implementation's shader compiler

              gl:releaseShaderCompiler provides a hint to the implementation that it may free internal resources
              associated  with  its  shader  compiler.  gl:compileShader/1  may  subsequently  be called and the
              implementation  may  at  that  time  reallocate  resources  previously  freed  by  the   call   to
              gl:releaseShaderCompiler.

              See external documentation.

       shaderBinary(Shaders, Binaryformat, Binary) -> ok

              Types:

                 Shaders = [integer()]
                 Binaryformat = enum()
                 Binary = binary()

              Load pre-compiled shader binaries

              gl:shaderBinary  loads pre-compiled shader binary code into the Count shader objects whose handles
              are given in Shaders . Binary points to Length bytes  of  binary  shader  code  stored  in  client
              memory. BinaryFormat specifies the format of the pre-compiled code.

              See external documentation.

       getShaderPrecisionFormat(Shadertype,      Precisiontype)      ->      {Range::{integer(),     integer()},
       Precision::integer()}

              Types:

                 Shadertype = enum()
                 Precisiontype = enum()

              Retrieve the range and precision for numeric formats supported by the shader compiler

              gl:getShaderPrecisionFormat retrieves the numeric range and  precision  for  the  implementation's
              representation  of  quantities  in  different numeric formats in specified shader type. ShaderType
              specifies the type of shader for which the numeric precision and range is to be retrieved and must
              be  one of ?GL_VERTEX_SHADER or ?GL_FRAGMENT_SHADER. PrecisionType specifies the numeric format to
              query  and  must  be  one  of   ?GL_LOW_FLOAT,   ?GL_MEDIUM_FLOAT   ?GL_HIGH_FLOAT,   ?GL_LOW_INT,
              ?GL_MEDIUM_INT, or ?GL_HIGH_INT.

              See external documentation.

       depthRangef(N, F) -> ok

              Types:

                 N = clamp()
                 F = clamp()

              See depthRange/2

       clearDepthf(D) -> ok

              Types:

                 D = clamp()

              glClearDepthf

              See external documentation.

       getProgramBinary(Program, BufSize) -> {BinaryFormat::enum(), Binary::binary()}

              Types:

                 Program = integer()
                 BufSize = integer()

              Return a binary representation of a program object's compiled and linked executable source

              gl:getProgramBinary  returns  a  binary  representation  of the compiled and linked executable for
              Program into the array of bytes whose address is specified in Binary . The maximum number of bytes
              that may be written into Binary is specified by BufSize . If the program binary is greater in size
              than BufSize bytes, then an error is generated, otherwise the actual number of bytes written  into
              Binary  is returned in the variable whose address is given by Length . If Length is ?NULL, then no
              length is returned.

              See external documentation.

       programBinary(Program, BinaryFormat, Binary) -> ok

              Types:

                 Program = integer()
                 BinaryFormat = enum()
                 Binary = binary()

              Load a program object with a program binary

              gl:programBinary  loads  a  program  object  with  a  program  binary  previously  returned   from
              gl:getProgramBinary/2  .  BinaryFormat  and  Binary  must  be those returned by a previous call to
              gl:getProgramBinary/2 , and Length must be the length returned by gl:getProgramBinary/2  ,  or  by
              gl:getProgramiv/2 when called with Pname set to ?GL_PROGRAM_BINARY_LENGTH. If these conditions are
              not met, loading the program binary will fail and  Program  's  ?GL_LINK_STATUS  will  be  set  to
              ?GL_FALSE.

              See external documentation.

       programParameteri(Program, Pname, Value) -> ok

              Types:

                 Program = integer()
                 Pname = enum()
                 Value = integer()

              Specify a parameter for a program object

              gl:programParameter specifies a new value for the parameter nameed by Pname for the program object
              Program .

              See external documentation.

       useProgramStages(Pipeline, Stages, Program) -> ok

              Types:

                 Pipeline = integer()
                 Stages = integer()
                 Program = integer()

              Bind stages of a program object to a program pipeline

              gl:useProgramStages binds executables from a program object associated with  a  specified  set  of
              shader  stages  to  the program pipeline object given by Pipeline . Pipeline specifies the program
              pipeline object to which to bind the executables. Stages contains a logical  combination  of  bits
              indicating  the  shader  stages  to use within Program with the program pipeline object Pipeline .
              Stages must  be  a  logical  combination  of  ?GL_VERTEX_SHADER_BIT,  ?GL_TESS_CONTROL_SHADER_BIT,
              ?GL_TESS_EVALUATION_SHADER_BIT    ,    ?GL_GEOMETRY_SHADER_BIT,    and    ?GL_FRAGMENT_SHADER_BIT.
              Additionally, the special  value  ?GL_ALL_SHADER_BITS  may  be  specified  to  indicate  that  all
              executables contained in Program should be installed in Pipeline .

              See external documentation.

       activeShaderProgram(Pipeline, Program) -> ok

              Types:

                 Pipeline = integer()
                 Program = integer()

              Set the active program object for a program pipeline object

              gl:activeShaderProgram  sets  the linked program named by Program to be the active program for the
              program pipeline object Pipeline . The active program in the active program pipeline object is the
              target  of  calls  to  gl:uniform1f/2  when  no  program  has  been made current through a call to
              gl:useProgram/1 .

              See external documentation.

       createShaderProgramv(Type, Strings) -> integer()

              Types:

                 Type = enum()
                 Strings = iolist()

              glCreateShaderProgramv

              See external documentation.

       bindProgramPipeline(Pipeline) -> ok

              Types:

                 Pipeline = integer()

              Bind a program pipeline to the current context

              gl:bindProgramPipeline binds a program pipeline object to the current context. Pipeline must be  a
              name  previously  returned from a call to gl:genProgramPipelines/1 . If no program pipeline exists
              with name Pipeline then a new pipeline object is created with that name  and  initialized  to  the
              default state vector.

              See external documentation.

       deleteProgramPipelines(Pipelines) -> ok

              Types:

                 Pipelines = [integer()]

              Delete program pipeline objects

              gl:deleteProgramPipelines  deletes  the  N  program pipeline objects whose names are stored in the
              array Pipelines . Unused names in Pipelines are ignored, as is the  name  zero.  After  a  program
              pipeline  object  is deleted, its name is again unused and it has no contents. If program pipeline
              object that is currently bound is deleted, the binding for that object  reverts  to  zero  and  no
              program pipeline object becomes current.

              See external documentation.

       genProgramPipelines(N) -> [integer()]

              Types:

                 N = integer()

              Reserve program pipeline object names

              gl:genProgramPipelines  returns  N  previously unused program pipeline object names in Pipelines .
              These names are marked as used, for the purposes of gl:genProgramPipelines only, but they  acquire
              program pipeline state only when they are first bound.

              See external documentation.

       isProgramPipeline(Pipeline) -> 0 | 1

              Types:

                 Pipeline = integer()

              Determine if a name corresponds to a program pipeline object

              gl:isProgramPipeline  returns  ?GL_TRUE  if  Pipeline  is currently the name of a program pipeline
              object. If Pipeline is zero, or if ?pipeline is not the name of a program pipeline object,  or  if
              an  error  occurs,  gl:isProgramPipeline  returns  ?GL_FALSE.  If  Pipeline  is a name returned by
              gl:genProgramPipelines/1  ,  but   that   has   not   yet   been   bound   through   a   call   to
              gl:bindProgramPipeline/1 , then the name is not a program pipeline object and gl:isProgramPipeline
              returns ?GL_FALSE .

              See external documentation.

       getProgramPipelineiv(Pipeline, Pname) -> integer()

              Types:

                 Pipeline = integer()
                 Pname = enum()

              Retrieve properties of a program pipeline object

              gl:getProgramPipelineiv retrieves the value of a property of the program pipeline object  Pipeline
              . Pname specifies the name of the parameter whose value to retrieve. The value of the parameter is
              written to the variable whose address is given by Params .

              See external documentation.

       programUniform1i(Program, Location, V0) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 V0 = integer()

              Specify the value of a uniform variable for a specified program object

              gl:programUniform modifies the value of a uniform  variable  or  a  uniform  variable  array.  The
              location of the uniform variable to be modified is specified by Location , which should be a value
              returned by gl:getUniformLocation/2 . gl:programUniform operates on the program  object  specified
              by Program .

              See external documentation.

       programUniform1iv(Program, Location, Value) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 Value = [integer()]

              See programUniform1i/3

       programUniform1f(Program, Location, V0) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 V0 = float()

              See programUniform1i/3

       programUniform1fv(Program, Location, Value) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 Value = [float()]

              See programUniform1i/3

       programUniform1d(Program, Location, V0) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 V0 = float()

              See programUniform1i/3

       programUniform1dv(Program, Location, Value) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 Value = [float()]

              See programUniform1i/3

       programUniform1ui(Program, Location, V0) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 V0 = integer()

              See programUniform1i/3

       programUniform1uiv(Program, Location, Value) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 Value = [integer()]

              See programUniform1i/3

       programUniform2i(Program, Location, V0, V1) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 V0 = integer()
                 V1 = integer()

              See programUniform1i/3

       programUniform2iv(Program, Location, Value) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 Value = [{integer(), integer()}]

              See programUniform1i/3

       programUniform2f(Program, Location, V0, V1) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 V0 = float()
                 V1 = float()

              See programUniform1i/3

       programUniform2fv(Program, Location, Value) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 Value = [{float(), float()}]

              See programUniform1i/3

       programUniform2d(Program, Location, V0, V1) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 V0 = float()
                 V1 = float()

              See programUniform1i/3

       programUniform2dv(Program, Location, Value) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 Value = [{float(), float()}]

              See programUniform1i/3

       programUniform2ui(Program, Location, V0, V1) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 V0 = integer()
                 V1 = integer()

              See programUniform1i/3

       programUniform2uiv(Program, Location, Value) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 Value = [{integer(), integer()}]

              See programUniform1i/3

       programUniform3i(Program, Location, V0, V1, V2) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 V0 = integer()
                 V1 = integer()
                 V2 = integer()

              See programUniform1i/3

       programUniform3iv(Program, Location, Value) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 Value = [{integer(), integer(), integer()}]

              See programUniform1i/3

       programUniform3f(Program, Location, V0, V1, V2) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 V0 = float()
                 V1 = float()
                 V2 = float()

              See programUniform1i/3

       programUniform3fv(Program, Location, Value) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 Value = [{float(), float(), float()}]

              See programUniform1i/3

       programUniform3d(Program, Location, V0, V1, V2) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 V0 = float()
                 V1 = float()
                 V2 = float()

              See programUniform1i/3

       programUniform3dv(Program, Location, Value) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 Value = [{float(), float(), float()}]

              See programUniform1i/3

       programUniform3ui(Program, Location, V0, V1, V2) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 V0 = integer()
                 V1 = integer()
                 V2 = integer()

              See programUniform1i/3

       programUniform3uiv(Program, Location, Value) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 Value = [{integer(), integer(), integer()}]

              See programUniform1i/3

       programUniform4i(Program, Location, V0, V1, V2, V3) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 V0 = integer()
                 V1 = integer()
                 V2 = integer()
                 V3 = integer()

              See programUniform1i/3

       programUniform4iv(Program, Location, Value) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 Value = [{integer(), integer(), integer(), integer()}]

              See programUniform1i/3

       programUniform4f(Program, Location, V0, V1, V2, V3) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 V0 = float()
                 V1 = float()
                 V2 = float()
                 V3 = float()

              See programUniform1i/3

       programUniform4fv(Program, Location, Value) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 Value = [{float(), float(), float(), float()}]

              See programUniform1i/3

       programUniform4d(Program, Location, V0, V1, V2, V3) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 V0 = float()
                 V1 = float()
                 V2 = float()
                 V3 = float()

              See programUniform1i/3

       programUniform4dv(Program, Location, Value) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 Value = [{float(), float(), float(), float()}]

              See programUniform1i/3

       programUniform4ui(Program, Location, V0, V1, V2, V3) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 V0 = integer()
                 V1 = integer()
                 V2 = integer()
                 V3 = integer()

              See programUniform1i/3

       programUniform4uiv(Program, Location, Value) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 Value = [{integer(), integer(), integer(), integer()}]

              See programUniform1i/3

       programUniformMatrix2fv(Program, Location, Transpose, Value) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 Transpose = 0 | 1
                 Value = [{float(), float(), float(), float()}]

              See programUniform1i/3

       programUniformMatrix3fv(Program, Location, Transpose, Value) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 Transpose = 0 | 1
                 Value = [{float(), float(), float(), float(), float(), float(), float(), float(), float()}]

              See programUniform1i/3

       programUniformMatrix4fv(Program, Location, Transpose, Value) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 Transpose = 0 | 1
                 Value  =  [{float(),  float(),  float(),  float(), float(), float(), float(), float(), float(),
                 float(), float(), float(), float(), float(), float(), float()}]

              See programUniform1i/3

       programUniformMatrix2dv(Program, Location, Transpose, Value) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 Transpose = 0 | 1
                 Value = [{float(), float(), float(), float()}]

              See programUniform1i/3

       programUniformMatrix3dv(Program, Location, Transpose, Value) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 Transpose = 0 | 1
                 Value = [{float(), float(), float(), float(), float(), float(), float(), float(), float()}]

              See programUniform1i/3

       programUniformMatrix4dv(Program, Location, Transpose, Value) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 Transpose = 0 | 1
                 Value = [{float(), float(), float(), float(),  float(),  float(),  float(),  float(),  float(),
                 float(), float(), float(), float(), float(), float(), float()}]

              See programUniform1i/3

       programUniformMatrix2x3fv(Program, Location, Transpose, Value) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 Transpose = 0 | 1
                 Value = [{float(), float(), float(), float(), float(), float()}]

              See programUniform1i/3

       programUniformMatrix3x2fv(Program, Location, Transpose, Value) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 Transpose = 0 | 1
                 Value = [{float(), float(), float(), float(), float(), float()}]

              See programUniform1i/3

       programUniformMatrix2x4fv(Program, Location, Transpose, Value) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 Transpose = 0 | 1
                 Value = [{float(), float(), float(), float(), float(), float(), float(), float()}]

              See programUniform1i/3

       programUniformMatrix4x2fv(Program, Location, Transpose, Value) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 Transpose = 0 | 1
                 Value = [{float(), float(), float(), float(), float(), float(), float(), float()}]

              See programUniform1i/3

       programUniformMatrix3x4fv(Program, Location, Transpose, Value) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 Transpose = 0 | 1
                 Value  =  [{float(),  float(),  float(),  float(), float(), float(), float(), float(), float(),
                 float(), float(), float()}]

              See programUniform1i/3

       programUniformMatrix4x3fv(Program, Location, Transpose, Value) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 Transpose = 0 | 1
                 Value = [{float(), float(), float(), float(),  float(),  float(),  float(),  float(),  float(),
                 float(), float(), float()}]

              See programUniform1i/3

       programUniformMatrix2x3dv(Program, Location, Transpose, Value) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 Transpose = 0 | 1
                 Value = [{float(), float(), float(), float(), float(), float()}]

              See programUniform1i/3

       programUniformMatrix3x2dv(Program, Location, Transpose, Value) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 Transpose = 0 | 1
                 Value = [{float(), float(), float(), float(), float(), float()}]

              See programUniform1i/3

       programUniformMatrix2x4dv(Program, Location, Transpose, Value) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 Transpose = 0 | 1
                 Value = [{float(), float(), float(), float(), float(), float(), float(), float()}]

              See programUniform1i/3

       programUniformMatrix4x2dv(Program, Location, Transpose, Value) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 Transpose = 0 | 1
                 Value = [{float(), float(), float(), float(), float(), float(), float(), float()}]

              See programUniform1i/3

       programUniformMatrix3x4dv(Program, Location, Transpose, Value) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 Transpose = 0 | 1
                 Value  =  [{float(),  float(),  float(),  float(), float(), float(), float(), float(), float(),
                 float(), float(), float()}]

              See programUniform1i/3

       programUniformMatrix4x3dv(Program, Location, Transpose, Value) -> ok

              Types:

                 Program = integer()
                 Location = integer()
                 Transpose = 0 | 1
                 Value = [{float(), float(), float(), float(),  float(),  float(),  float(),  float(),  float(),
                 float(), float(), float()}]

              See programUniform1i/3

       validateProgramPipeline(Pipeline) -> ok

              Types:

                 Pipeline = integer()

              Validate a program pipeline object against current GL state

              gl:validateProgramPipeline  instructs  the  implementation  to  validate  the  shader  executables
              contained in Pipeline against the current  GL  state.  The  implementation  may  use  this  as  an
              opportunity  to  perform  any internal shader modifications that may be required to ensure correct
              operation of the installed shaders given the current GL state.

              See external documentation.

       getProgramPipelineInfoLog(Pipeline, BufSize) -> string()

              Types:

                 Pipeline = integer()
                 BufSize = integer()

              Retrieve the info log string from a program pipeline object

              gl:getProgramPipelineInfoLog retrieves the info log for the program pipeline object Pipeline . The
              info  log, including its null terminator, is written into the array of characters whose address is
              given by InfoLog . The maximum number of characters that may be written into InfoLog is  given  by
              BufSize  ,  and  the  actual  number of characters written into InfoLog is returned in the integer
              whose address is given by Length . If Length is ?NULL, no length is returned.

              See external documentation.

       vertexAttribL1d(Index, X) -> ok

              Types:

                 Index = integer()
                 X = float()

              glVertexAttribL

              See external documentation.

       vertexAttribL2d(Index, X, Y) -> ok

              Types:

                 Index = integer()
                 X = float()
                 Y = float()

              glVertexAttribL

              See external documentation.

       vertexAttribL3d(Index, X, Y, Z) -> ok

              Types:

                 Index = integer()
                 X = float()
                 Y = float()
                 Z = float()

              glVertexAttribL

              See external documentation.

       vertexAttribL4d(Index, X, Y, Z, W) -> ok

              Types:

                 Index = integer()
                 X = float()
                 Y = float()
                 Z = float()
                 W = float()

              glVertexAttribL

              See external documentation.

       vertexAttribL1dv(Index::integer(), V) -> ok

              Types:

                 V = {X::float()}

              Equivalent to vertexAttribL1d(Index, X).

       vertexAttribL2dv(Index::integer(), V) -> ok

              Types:

                 V = {X::float(), Y::float()}

              Equivalent to vertexAttribL2d(Index, X, Y).

       vertexAttribL3dv(Index::integer(), V) -> ok

              Types:

                 V = {X::float(), Y::float(), Z::float()}

              Equivalent to vertexAttribL3d(Index, X, Y, Z).

       vertexAttribL4dv(Index::integer(), V) -> ok

              Types:

                 V = {X::float(), Y::float(), Z::float(), W::float()}

              Equivalent to vertexAttribL4d(Index, X, Y, Z, W).

       vertexAttribLPointer(Index, Size, Type, Stride, Pointer) -> ok

              Types:

                 Index = integer()
                 Size = integer()
                 Type = enum()
                 Stride = integer()
                 Pointer = offset() | mem()

              glVertexAttribLPointer

              See external documentation.

       getVertexAttribLdv(Index, Pname) -> {float(), float(), float(), float()}

              Types:

                 Index = integer()
                 Pname = enum()

              glGetVertexAttribL

              See external documentation.

       viewportArrayv(First, V) -> ok

              Types:

                 First = integer()
                 V = [{float(), float(), float(), float()}]

              glViewportArrayv

              See external documentation.

       viewportIndexedf(Index, X, Y, W, H) -> ok

              Types:

                 Index = integer()
                 X = float()
                 Y = float()
                 W = float()
                 H = float()

              Set a specified viewport

              gl:viewportIndexedf and gl:viewportIndexedfv specify the parameters for a single  viewport.  Index
              specifies  the  index  of  the  viewport  to  modify.  Index  must  be  less  than  the  value  of
              ?GL_MAX_VIEWPORTS. For gl:viewportIndexedf, X , Y , W , and H specify the left, bottom, width  and
              height  of  the viewport in pixels, respectively. For gl:viewportIndexedfv, V contains the address
              of an array of floating point values specifying the left ( x), bottom ( y), width ( w), and height
              (  h)  of  each  viewport,  in  that order. x and y give the location of the viewport's lower left
              corner, and w and h give the  width  and  height  of  the  viewport,  respectively.  The  viewport
              specifies  the  affine  transformation  of  x  and  y from normalized device coordinates to window
              coordinates. Let (x nd y nd) be normalized device coordinates. Then the window coordinates (x w  y
              w) are computed as follows:

              See external documentation.

       viewportIndexedfv(Index, V) -> ok

              Types:

                 Index = integer()
                 V = {float(), float(), float(), float()}

              See viewportIndexedf/5

       scissorArrayv(First, V) -> ok

              Types:

                 First = integer()
                 V = [{integer(), integer(), integer(), integer()}]

              glScissorArrayv

              See external documentation.

       scissorIndexed(Index, Left, Bottom, Width, Height) -> ok

              Types:

                 Index = integer()
                 Left = integer()
                 Bottom = integer()
                 Width = integer()
                 Height = integer()

              glScissorIndexe

              See external documentation.

       scissorIndexedv(Index, V) -> ok

              Types:

                 Index = integer()
                 V = {integer(), integer(), integer(), integer()}

              glScissorIndexe

              See external documentation.

       depthRangeArrayv(First, V) -> ok

              Types:

                 First = integer()
                 V = [{clamp(), clamp()}]

              glDepthRangeArrayv

              See external documentation.

       depthRangeIndexed(Index, N, F) -> ok

              Types:

                 Index = integer()
                 N = clamp()
                 F = clamp()

              glDepthRangeIndexe

              See external documentation.

       getFloati_v(Target, Index) -> [float()]

              Types:

                 Target = enum()
                 Index = integer()

              See getBooleanv/1

       getDoublei_v(Target, Index) -> [float()]

              Types:

                 Target = enum()
                 Index = integer()

              See getBooleanv/1

       debugMessageControlARB(Source, Type, Severity, Ids, Enabled) -> ok

              Types:

                 Source = enum()
                 Type = enum()
                 Severity = enum()
                 Ids = [integer()]
                 Enabled = 0 | 1

              glDebugMessageControlARB

              See external documentation.

       debugMessageInsertARB(Source, Type, Id, Severity, Buf) -> ok

              Types:

                 Source = enum()
                 Type = enum()
                 Id = integer()
                 Severity = enum()
                 Buf = string()

              glDebugMessageInsertARB

              See external documentation.

       getDebugMessageLogARB(Count,     Bufsize)     ->    {integer(),    Sources::[enum()],    Types::[enum()],
       Ids::[integer()], Severities::[enum()], MessageLog::[string()]}

              Types:

                 Count = integer()
                 Bufsize = integer()

              glGetDebugMessageLogARB

              See external documentation.

       getGraphicsResetStatusARB() -> enum()

              glGetGraphicsResetStatusARB

              See external documentation.

       drawArraysInstancedBaseInstance(Mode, First, Count, Primcount, Baseinstance) -> ok

              Types:

                 Mode = enum()
                 First = integer()
                 Count = integer()
                 Primcount = integer()
                 Baseinstance = integer()

              Draw multiple instances of a range of elements with offset applied to instanced attributes

              gl:drawArraysInstancedBaseInstance behaves identically to gl:drawArrays/3  except  that  Primcount
              instances  of  the range of elements are executed and the value of the internal counter InstanceID
              advances for each iteration. InstanceID is an internal 32-bit integer counter that may be read  by
              a vertex shader as ?gl_InstanceID .

              See external documentation.

       drawElementsInstancedBaseInstance(Mode, Count, Type, Indices, Primcount, Baseinstance) -> ok

              Types:

                 Mode = enum()
                 Count = integer()
                 Type = enum()
                 Indices = offset() | mem()
                 Primcount = integer()
                 Baseinstance = integer()

              Draw multiple instances of a set of elements with offset applied to instanced attributes

              gl:drawElementsInstancedBaseInstance   behaves   identically   to  gl:drawElements/4  except  that
              Primcount instances of the set of elements are executed and the  value  of  the  internal  counter
              InstanceID  advances for each iteration. InstanceID is an internal 32-bit integer counter that may
              be read by a vertex shader as ?gl_InstanceID .

              See external documentation.

       drawElementsInstancedBaseVertexBaseInstance(Mode,   Count,   Type,   Indices,   Primcount,    Basevertex,
       Baseinstance) -> ok

              Types:

                 Mode = enum()
                 Count = integer()
                 Type = enum()
                 Indices = offset() | mem()
                 Primcount = integer()
                 Basevertex = integer()
                 Baseinstance = integer()

              Render multiple instances of a set of primitives from array data with a per-element offset

              gl:drawElementsInstancedBaseVertexBaseInstance  behaves  identically to gl:drawElementsInstanced/5
              except that the ith element transferred by the corresponding draw call will be taken from  element
              Indices  [i] + Basevertex of each enabled array. If the resulting value is larger than the maximum
              value representable by Type , it is as if the calculation  were  upconverted  to  32-bit  unsigned
              integers  (with  wrapping  on overflow conditions). The operation is undefined if the sum would be
              negative. The Basevertex has no effect on the shader-visible value of ?gl_VertexID.

              See external documentation.

       drawTransformFeedbackInstanced(Mode, Id, Primcount) -> ok

              Types:

                 Mode = enum()
                 Id = integer()
                 Primcount = integer()

              glDrawTransformFeedbackInstance

              See external documentation.

       drawTransformFeedbackStreamInstanced(Mode, Id, Stream, Primcount) -> ok

              Types:

                 Mode = enum()
                 Id = integer()
                 Stream = integer()
                 Primcount = integer()

              glDrawTransformFeedbackStreamInstance

              See external documentation.

       getInternalformativ(Target, Internalformat, Pname, BufSize) -> [integer()]

              Types:

                 Target = enum()
                 Internalformat = enum()
                 Pname = enum()
                 BufSize = integer()

              glGetInternalformat

              See external documentation.

       bindImageTexture(Unit, Texture, Level, Layered, Layer, Access, Format) -> ok

              Types:

                 Unit = integer()
                 Texture = integer()
                 Level = integer()
                 Layered = 0 | 1
                 Layer = integer()
                 Access = enum()
                 Format = enum()

              Bind a level of a texture to an image unit

              gl:bindImageTexture binds a single level of a texture to an image unit for the purpose of  reading
              and  writing  it  from  shaders. Unit specifies the zero-based index of the image unit to which to
              bind the texture level. Texture specifies the name of an existing texture object to  bind  to  the
              image  unit.  If  Texture  is  zero,  then any existing binding to the image unit is broken. Level
              specifies the level of the texture to bind to the image unit.

              See external documentation.

       memoryBarrier(Barriers) -> ok

              Types:

                 Barriers = integer()

              Defines a barrier ordering memory transactions

              gl:memoryBarrier defines a barrier ordering the memory transactions issued prior  to  the  command
              relative to those issued after the barrier. For the purposes of this ordering, memory transactions
              performed by shaders are considered to be issued by  the  rendering  command  that  triggered  the
              execution  of  the  shader.  Barriers  is  a  bitfield  indicating  the set of operations that are
              synchronized with shader stores; the bits used in Barriers are as follows:

              See external documentation.

       texStorage1D(Target, Levels, Internalformat, Width) -> ok

              Types:

                 Target = enum()
                 Levels = integer()
                 Internalformat = enum()
                 Width = integer()

              Simultaneously specify storage for all levels of a one-dimensional texture

              gl:texStorage1D specifies the storage requirements for all levels  of  a  one-dimensional  texture
              simultaneously.  Once  a  texture is specified with this command, the format and dimensions of all
              levels become immutable unless it is a proxy texture. The contents  of  the  image  may  still  be
              modified,  however,  its  storage requirements may not change. Such a texture is referred to as an
              immutable-format texture.

              See external documentation.

       texStorage2D(Target, Levels, Internalformat, Width, Height) -> ok

              Types:

                 Target = enum()
                 Levels = integer()
                 Internalformat = enum()
                 Width = integer()
                 Height = integer()

              Simultaneously specify storage for all  levels  of  a  two-dimensional  or  one-dimensional  array
              texture

              gl:texStorage2D  specifies the storage requirements for all levels of a two-dimensional texture or
              one-dimensional texture array simultaneously. Once a texture is specified with this  command,  the
              format and dimensions of all levels become immutable unless it is a proxy texture. The contents of
              the image may still be modified, however, its storage requirements may not change. Such a  texture
              is referred to as an immutable-format texture.

              See external documentation.

       texStorage3D(Target, Levels, Internalformat, Width, Height, Depth) -> ok

              Types:

                 Target = enum()
                 Levels = integer()
                 Internalformat = enum()
                 Width = integer()
                 Height = integer()
                 Depth = integer()

              Simultaneously  specify  storage  for  all levels of a three-dimensional, two-dimensional array or
              cube-map array texture

              gl:texStorage3D specifies the storage requirements for all levels  of  a  three-dimensional,  two-
              dimensional  array or cube-map array texture simultaneously. Once a texture is specified with this
              command, the format and dimensions of all levels become immutable unless it is  a  proxy  texture.
              The contents of the image may still be modified, however, its storage requirements may not change.
              Such a texture is referred to as an immutable-format texture.

              See external documentation.

       depthBoundsEXT(Zmin, Zmax) -> ok

              Types:

                 Zmin = clamp()
                 Zmax = clamp()

              glDepthBoundsEXT

              See external documentation.

       stencilClearTagEXT(StencilTagBits, StencilClearTag) -> ok

              Types:

                 StencilTagBits = integer()
                 StencilClearTag = integer()

              glStencilClearTagEXT

              See external documentation.

AUTHORS

       <>

                                                    wx 1.8.3                                            gl(3erl)