Provided by: erlang-manpages_22.2.7+dfsg-1ubuntu0.5_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.9                                             gl(3erl)