diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,62 @@
+3.0.3.0
+-------
+* Handle MonadFail proposal.
+
+3.0.2.2
+-------
+* Relaxed upper version bound for `containers`.
+
+3.0.2.1
+-------
+* Relaxed upper version bound for `OpenGLRaw`.
+
+3.0.2.0
+-------
+* Added support for S3_s3tc, EXT_texture_compression_s3tc, ARB_texture_float, and EXT_packed_depth_stencil extensions.
+
+3.0.1.0
+-------
+* Added `Uniform` instances for `GLmatrix`, `Vertex1`, `Vector1`, `Vector2`, `Vector3`, and `Vector4`.
+* Unbreak `Uniform` instances for `GLint`, `GLuint` and `Gldouble`.
+* Relaxed upper version bound for `OpenGLRaw`.
+
+3.0.0.2
+-------
+* Removed redundant constraints.
+
+3.0.0.1
+-------
+* Relaxed upper version bound for `OpenGLRaw`.
+
+3.0.0.0
+-------
+* Depend on new `OpenGLRaw` and `GLURaw` packages.
+
+2.13.2.1
+--------
+* Relaxed upper version bound for `transformers`.
+
+2.13.2.0
+--------
+* Implement Uniform instances for `GLint`, `GLuint`, `GLfloat`, and `GLdouble`.
+
+2.13.1.1
+--------
+* Aftermath for the `glClearNamedFramebufferfi` chaos in the OpenGL registry,
+  see the corresponding
+  [issue](https://www.khronos.org/bugzilla/show_bug.cgi?id=1394) on Khronos.
+
+2.13.1.0
+--------
+* Added `extensionSupported`.
+* Relaxed upper version bound for OpenGLRaw.
+* Added CHANGELOG.md to distribution.
+
+2.13.0.0
+--------
+* Added missing drawing commands using vertex arrays and some related types.
+* Added missing whole framebuffer operations.
+* Added getters for `stencilMaskSeparate`, `stencilFuncSeparate`, and `stencilOpSeparate`, making them full-blown `StateVar`s.
+* Added `patchDefaultInnerLevel` and `patchDefaultOuterLevel` to control the default tessellation levels.
+* Added `ContextLost` constructor to `ErrorCategory` type.
+* Added `SeparateAttribs` and deprecated `SeperateAttribs`, fixing a spelling mistake.
diff --git a/Graphics/Rendering/OpenGL.hs b/Graphics/Rendering/OpenGL.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL.hs
+++ /dev/null
@@ -1,138 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- A convenience module, combining the Haskell bindings for GL and GLU.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL (
-   -- * Supported Extensions
-
-   -- $SupportedExtensions
-
-   -- * Legal stuff
-
-   -- $LegalStuff
-
-     module Graphics.Rendering.OpenGL.GL
-   , module Graphics.Rendering.OpenGL.GLU
-) where
-
-import Graphics.Rendering.OpenGL.GL
-import Graphics.Rendering.OpenGL.GLU
-
---------------------------------------------------------------------------------
--- $SupportedExtensions
--- There is support for full OpenGL 2.1, including the imaging subset, plus some
--- extensions:
---
--- @
--- extension                      | core since
--- -------------------------------+------------
--- GL_APPLE_packed_pixels         | 1.2
--- GL_APPLE_ycbcr_422             |
--- GL_ARB_copy_buffer             | 3.1
--- GL_ARB_depth_buffer_float      | 3.0
--- GL_ARB_depth_texture           | 1.4
--- GL_ARB_half_float_pixel        | 3.0
--- GL_ARB_imaging                 |
--- GL_ARB_multisample             | 1.3
--- GL_ARB_multitexture            | 1.3
--- GL_ARB_occlusion_query         | 1.5
--- GL_ARB_point_parameters        | 1.4
--- GL_ARB_point_sprite            |
--- GL_ARB_shadow                  | 1.4
--- GL_ARB_texture_border_clamp    | 1.3
--- GL_ARB_texture_compression     | 1.3
--- GL_ARB_texture_cube_map        | 1.3
--- GL_ARB_texture_env_add         | 1.3
--- GL_ARB_texture_env_combine     | 1.3
--- GL_ARB_texture_env_crossbar    | 1.4
--- GL_ARB_texture_env_dot3        | 1.3
--- GL_ARB_texture_mirrored_repeat | 1.4
--- GL_ARB_texture_rectangle       | 3.1
--- GL_ARB_transpose_matrix        | 1.3
--- GL_ARB_vertex_buffer_object    | 1.5
--- GL_ARB_vertex_shader           | 2.0
--- GL_ARB_window_pos              | 1.4
--- GL_EXT_abgr                    |
--- GL_EXT_bgra                    | 1.2
--- GL_EXT_blend_color             | 1.4
--- GL_EXT_blend_func_separate     | 1.4
--- GL_EXT_blend_logic_op          | 1.1
--- GL_EXT_blend_minmax            | 1.4
--- GL_EXT_blend_subtract          | 1.4
--- GL_EXT_color_subtable          |
--- GL_EXT_compiled_vertex_array   |
--- GL_EXT_convolution             |
--- GL_EXT_copy_texture            | 1.1
--- GL_EXT_depth_bounds_test       |
--- GL_EXT_draw_range_elements     | 1.2
--- GL_EXT_fog_coord               | 1.4
--- GL_EXT_histogram               |
--- GL_EXT_multi_draw_arrays       | 1.4
--- GL_EXT_packed_float            | 3.0
--- GL_EXT_packed_pixels           | 1.2
--- GL_EXT_polygon_offset          | 1.1
--- GL_EXT_rescale_normal          | 1.2
--- GL_EXT_secondary_color         | 1.4
--- GL_EXT_separate_specular_color | 1.2
--- GL_EXT_shadow_funcs            | 1.5
--- GL_EXT_stencil_two_side        |
--- GL_EXT_stencil_wrap            | 1.4
--- GL_EXT_subtexture              | 1.1
--- GL_EXT_texture                 | 1.1
--- GL_EXT_texture3D               | 1.2
--- GL_EXT_texture_lod_bias        | 1.4
--- GL_EXT_texture_shared_exponent | 3.0
--- GL_EXT_texture_object          | 1.1
--- GL_EXT_vertex_array            | 1.1
--- GL_HP_convolution_border_modes |
--- GL_IBM_rasterpos_clip          |
--- GL_MESA_ycbcr_texture          |
--- GL_NV_blend_square             | 1.4
--- GL_NV_depth_clamp              |
--- GL_NV_fog_distance             |
--- GL_NV_light_max_exponent       |
--- GL_NV_packed_depth_stencil     |
--- GL_NV_primitive_restart        |
--- GL_SGIS_generate_mipmap        | 1.4
--- GL_SGIS_texture_edge_clamp     |
--- GL_SGIS_texture_lod            |
--- GL_SGI_color_matrix            |
--- GL_SGI_color_table             |
--- @
-
---------------------------------------------------------------------------------
--- $LegalStuff
--- The documentation is loosely based on the man pages of the OpenGL Sample
--- Implemenation from SGI, see: <http://oss.sgi.com/projects/ogl-sample/>. It is
--- used under the SGI Free Software License B. This license requires the
--- following notice:
---
--- /License Applicability/. Except to the extent portions of this file are made
--- subject to an alternative license as permitted in the SGI Free Software
--- License B, Version 1.1 (the \"License\"), the contents of this file are
--- subject only to the provisions of the License. You may not use this file
--- except in compliance with the License. You may obtain a copy of the License
--- at Silicon Graphics, Inc., attn: Legal Services, 1600 Amphitheatre Parkway,
--- Mountain View, CA 94043-1351, or at: <http://oss.sgi.com/projects/FreeB/>.
--- 
--- Note that, as provided in the License, the Software is distributed on an \"AS
--- IS\" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS
--- DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND
--- CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A PARTICULAR
--- PURPOSE, AND NON-INFRINGEMENT.
---
--- /Original Code/. The Original Code is: OpenGL Sample Implementation, Version
--- 1.2.1, released January 26, 2000, developed by Silicon Graphics, Inc. The
--- Original Code is Copyright (c) 1991-2002 Silicon Graphics, Inc.  Copyright in
--- any portions created by third parties is as indicated elsewhere herein. All
--- Rights Reserved.
diff --git a/Graphics/Rendering/OpenGL/GL.hs b/Graphics/Rendering/OpenGL/GL.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL.hs
+++ /dev/null
@@ -1,95 +0,0 @@
------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- A Haskell binding for OpenGL, the industry\'s most widely used and
--- supported 2D and 3D graphics API.
---
------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL (
-   -- * OpenGL Operation
-   module Graphics.Rendering.OpenGL.GL.BasicTypes,
-   module Graphics.Rendering.OpenGL.GL.BeginEnd,
-   module Graphics.Rendering.OpenGL.GL.VertexSpec,
-   module Graphics.Rendering.OpenGL.GL.VertexArrays,
-   module Graphics.Rendering.OpenGL.GL.BufferObjects,
-   module Graphics.Rendering.OpenGL.GL.Rectangles,
-   module Graphics.Rendering.OpenGL.GL.CoordTrans,
-   module Graphics.Rendering.OpenGL.GL.Clipping,
-   module Graphics.Rendering.OpenGL.GL.RasterPos,
-   module Graphics.Rendering.OpenGL.GL.Colors,
-   module Graphics.Rendering.OpenGL.GL.Shaders,
-
-   -- * Rasterization
-   module Graphics.Rendering.OpenGL.GL.Antialiasing,
-   module Graphics.Rendering.OpenGL.GL.Points,
-   module Graphics.Rendering.OpenGL.GL.LineSegments,
-   module Graphics.Rendering.OpenGL.GL.Polygons,
-   module Graphics.Rendering.OpenGL.GL.PixelRectangles,
-   module Graphics.Rendering.OpenGL.GL.Bitmaps,
-   module Graphics.Rendering.OpenGL.GL.Texturing,
-   module Graphics.Rendering.OpenGL.GL.ColorSum,
-   module Graphics.Rendering.OpenGL.GL.Fog,
-
-   -- * Per-Fragment Operations and the Framebuffer
-   module Graphics.Rendering.OpenGL.GL.PerFragment,
-   module Graphics.Rendering.OpenGL.GL.Framebuffer,
-   module Graphics.Rendering.OpenGL.GL.ReadCopyPixels,
-
-   -- * Special Functions
-   module Graphics.Rendering.OpenGL.GL.Evaluators,
-   module Graphics.Rendering.OpenGL.GL.Selection,
-   module Graphics.Rendering.OpenGL.GL.Feedback,
-   module Graphics.Rendering.OpenGL.GL.DisplayLists,
-   module Graphics.Rendering.OpenGL.GL.FlushFinish,
-   module Graphics.Rendering.OpenGL.GL.Hints,
-
-   -- * State and State Requests
-   module Graphics.Rendering.OpenGL.GL.StateVar,
-   module Graphics.Rendering.OpenGL.GL.StringQueries,
-   module Graphics.Rendering.OpenGL.GL.SavingState
-) where
-
-import Graphics.Rendering.OpenGL.GL.BasicTypes
-import Graphics.Rendering.OpenGL.GL.BeginEnd
-import Graphics.Rendering.OpenGL.GL.VertexSpec
-import Graphics.Rendering.OpenGL.GL.VertexArrays
-import Graphics.Rendering.OpenGL.GL.BufferObjects
-import Graphics.Rendering.OpenGL.GL.Rectangles
-import Graphics.Rendering.OpenGL.GL.CoordTrans
-import Graphics.Rendering.OpenGL.GL.Clipping
-import Graphics.Rendering.OpenGL.GL.RasterPos
-import Graphics.Rendering.OpenGL.GL.Colors
-import Graphics.Rendering.OpenGL.GL.Shaders
-
-import Graphics.Rendering.OpenGL.GL.Antialiasing
-import Graphics.Rendering.OpenGL.GL.Points
-import Graphics.Rendering.OpenGL.GL.LineSegments
-import Graphics.Rendering.OpenGL.GL.Polygons
-import Graphics.Rendering.OpenGL.GL.PixelRectangles
-import Graphics.Rendering.OpenGL.GL.Bitmaps
-import Graphics.Rendering.OpenGL.GL.Texturing
-import Graphics.Rendering.OpenGL.GL.ColorSum
-import Graphics.Rendering.OpenGL.GL.Fog
-
-import Graphics.Rendering.OpenGL.GL.PerFragment
-import Graphics.Rendering.OpenGL.GL.Framebuffer
-import Graphics.Rendering.OpenGL.GL.ReadCopyPixels
-
-import Graphics.Rendering.OpenGL.GL.Evaluators
-import Graphics.Rendering.OpenGL.GL.Selection
-import Graphics.Rendering.OpenGL.GL.Feedback
-import Graphics.Rendering.OpenGL.GL.DisplayLists
-import Graphics.Rendering.OpenGL.GL.FlushFinish
-import Graphics.Rendering.OpenGL.GL.Hints
-
-import Graphics.Rendering.OpenGL.GL.StateVar
-import Graphics.Rendering.OpenGL.GL.StringQueries
-import Graphics.Rendering.OpenGL.GL.SavingState
diff --git a/Graphics/Rendering/OpenGL/GL/Antialiasing.hs b/Graphics/Rendering/OpenGL/GL/Antialiasing.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/Antialiasing.hs
+++ /dev/null
@@ -1,43 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.Antialiasing
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to section 3.2 (Antialiasing) of the OpenGL 2.1
--- specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.Antialiasing (
-   sampleBuffers, samples, multisample, subpixelBits
-) where
-
-import Graphics.Rendering.OpenGL.GL.Capability (
-   EnableCap(CapMultisample), makeCapability )
-import Graphics.Rendering.OpenGL.GL.BasicTypes ( GLsizei, Capability )
-import Graphics.Rendering.OpenGL.GL.QueryUtils (
-   GetPName(GetSampleBuffers,GetSamples,GetSubpixelBits), getSizei1 )
-import Graphics.Rendering.OpenGL.GL.StateVar (
-   GettableStateVar, makeGettableStateVar, StateVar )
-
---------------------------------------------------------------------------------
-
-sampleBuffers :: GettableStateVar GLsizei
-sampleBuffers = antialiasingInfo GetSampleBuffers
-
-samples :: GettableStateVar GLsizei
-samples = antialiasingInfo GetSamples
-
-multisample :: StateVar Capability
-multisample = makeCapability CapMultisample
-
-subpixelBits :: GettableStateVar GLsizei
-subpixelBits = antialiasingInfo GetSubpixelBits
-
-antialiasingInfo :: GetPName -> GettableStateVar GLsizei
-antialiasingInfo = makeGettableStateVar . getSizei1 id
diff --git a/Graphics/Rendering/OpenGL/GL/BasicTypes.hs b/Graphics/Rendering/OpenGL/GL/BasicTypes.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/BasicTypes.hs
+++ /dev/null
@@ -1,110 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.BasicTypes
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to section 2.3 (GL Command Sytax) of the OpenGL 2.1
--- specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.BasicTypes (
-   GLboolean, GLbyte, GLubyte, GLchar, GLshort, GLushort, GLint, GLuint,
-   GLsizei, GLenum, GLintptr, GLsizeiptr, GLbitfield, GLfloat, GLclampf,
-   GLdouble, GLclampd, Capability(..)
-) where
-
---------------------------------------------------------------------------------
-
-#include "HsOpenGLConfig.h"
-
---------------------------------------------------------------------------------
-
-import Data.Int
-import Data.Word
-
--- If we don't find modern OpenGL headers at configuration time, make some
--- educated guesses here.
-
-#if !defined(HTYPE_GLCHAR) || !defined(HTYPE_GLINTPTR) || !defined(HTYPE_GLSIZEIPTR)
-import Foreign.C.Types
-#endif
-
-#if !defined(HTYPE_GLCHAR)
-#define HTYPE_GLCHAR CChar
-#endif
-
-#if !defined(HTYPE_GLINTPTR)
-#define HTYPE_GLINTPTR CPtrdiff
-#endif
-
-#if !defined(HTYPE_GLSIZEIPTR)
-#define HTYPE_GLSIZEIPTR CPtrdiff
-#endif
-
---------------------------------------------------------------------------------
-
--- | Boolean (min. 1 bit)
-type GLboolean = HTYPE_GLBOOLEAN
-
--- | Signed 2\'s complement binary integer (min. 8 bits)
-type GLbyte = HTYPE_GLBYTE
-
--- | Unsigned binary integer (min. 8 bits)
-type GLubyte = HTYPE_GLUBYTE
-
--- | Characters making up strings
-type GLchar = HTYPE_GLCHAR
-
--- | Signed 2\'s complement binary integer (min. 16 bits)
-type GLshort = HTYPE_GLSHORT
-
--- | Unsigned binary integer (min. 16 bits)
-type GLushort = HTYPE_GLUSHORT
-
--- | Signed 2\'s complement binary integer (min. 32 bits)
-type GLint = HTYPE_GLINT
-
--- | Unsigned binary integer (min. 32 bits)
-type GLuint = HTYPE_GLUINT
-
--- | Non-negatitve binary integer size (min. 32 bits)
-type GLsizei = HTYPE_GLSIZEI
-
--- | Enumerated binary integer value (min. 32 bits)
-type GLenum = HTYPE_GLENUM
-
--- | Signed 2\'s complement binary integer (sufficiently large enough to hold
--- any address)
-type GLintptr = HTYPE_GLINTPTR
-
--- | Non-negatitve binary integer size (sufficiently large enough to hold any
--- address)
-type GLsizeiptr = HTYPE_GLSIZEIPTR
-
--- | Bit field (min. 32 bits)
-type GLbitfield = HTYPE_GLBITFIELD
-
--- | Floating-point value (min. 32 bits)
-type GLfloat = HTYPE_GLFLOAT
-
--- | Floating-point value clamped to [0,1] (min. 32 bits)
-type GLclampf = HTYPE_GLCLAMPF
-
--- | Floating-point value (min. 64 bits)
-type GLdouble = HTYPE_GLDOUBLE
-
--- | Floating-point value clamped to [0,1] (min. 64 bits)
-type GLclampd = HTYPE_GLCLAMPD
-
---------------------------------------------------------------------------------
-
-data Capability =
-     Disabled
-   | Enabled
-   deriving ( Eq, Ord, Show )
diff --git a/Graphics/Rendering/OpenGL/GL/BeginEnd.hs b/Graphics/Rendering/OpenGL/GL/BeginEnd.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/BeginEnd.hs
+++ /dev/null
@@ -1,146 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.BeginEnd
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to section 2.6 (Begin\/End Paradigm) of the
--- OpenGL 2.1 specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.BeginEnd (
-   -- * Begin and End Objects
-   PrimitiveMode(..),
-   renderPrimitive, unsafeRenderPrimitive, primitiveRestart,
-
-   -- * Polygon Edges
-   EdgeFlag(..),
-   edgeFlag
-) where
-
-import Graphics.Rendering.OpenGL.GL.BasicTypes ( GLenum, GLboolean )
-import Graphics.Rendering.OpenGL.GL.EdgeFlag (
-   EdgeFlag(..), marshalEdgeFlag, unmarshalEdgeFlag )
-import Graphics.Rendering.OpenGL.GL.Exception ( bracket_, unsafeBracket_ )
-import Graphics.Rendering.OpenGL.GL.Extensions (
-   FunPtr, unsafePerformIO, Invoker, getProcAddress )
-import Graphics.Rendering.OpenGL.GL.PrimitiveMode (
-   PrimitiveMode(..), marshalPrimitiveMode )
-import Graphics.Rendering.OpenGL.GL.QueryUtils (
-   getBoolean1, GetPName(GetEdgeFlag) )
-import Graphics.Rendering.OpenGL.GL.StateVar ( StateVar, makeStateVar )
-
---------------------------------------------------------------------------------
-
-#include "HsOpenGLExt.h"
-
---------------------------------------------------------------------------------
-
--- | Delimit the vertices that define a primitive or a group of like primitives.
---
--- Only a subset of GL commands can be used in the delimited action:
--- Those for specifying vertex coordinates
--- ('Graphics.Rendering.OpenGL.GL.VertexSpec.vertex',
---  'Graphics.Rendering.OpenGL.GL.VertexSpec.vertexv'),
--- vertex colors
--- ('Graphics.Rendering.OpenGL.GL.VertexSpec.color',
---  'Graphics.Rendering.OpenGL.GL.VertexSpec.colorv',
---  'Graphics.Rendering.OpenGL.GL.VertexSpec.secondaryColor',
---  'Graphics.Rendering.OpenGL.GL.VertexSpec.secondaryColorv',
---  'Graphics.Rendering.OpenGL.GL.VertexSpec.index',
---  'Graphics.Rendering.OpenGL.GL.VertexSpec.indexv'),
--- normal
--- ('Graphics.Rendering.OpenGL.GL.VertexSpec.normal',
---  'Graphics.Rendering.OpenGL.GL.VertexSpec.normalv'),
--- texture coordinates
--- ('Graphics.Rendering.OpenGL.GL.VertexSpec.texCoord',
---  'Graphics.Rendering.OpenGL.GL.VertexSpec.texCoordv',
---  'Graphics.Rendering.OpenGL.GL.VertexSpec.multiTexCoord',
---  'Graphics.Rendering.OpenGL.GL.VertexSpec.multiTexCoordv'),
--- and fog coordinates
--- ('Graphics.Rendering.OpenGL.GL.VertexSpec.fogCoord',
---  'Graphics.Rendering.OpenGL.GL.VertexSpec.fogCoordv').
--- Additionally,
--- 'Graphics.Rendering.OpenGL.GL.Evaluators.evalPoint1',
--- 'Graphics.Rendering.OpenGL.GL.Evaluators.evalPoint2',
--- 'Graphics.Rendering.OpenGL.GL.Evaluators.evalCoord1',
--- 'Graphics.Rendering.OpenGL.GL.Evaluators.evalCoord1v',
--- 'Graphics.Rendering.OpenGL.GL.Evaluators.evalCoord2',
--- 'Graphics.Rendering.OpenGL.GL.Evaluators.evalCoord2v',
--- 'Graphics.Rendering.OpenGL.GL.Colors.materialAmbient',
--- 'Graphics.Rendering.OpenGL.GL.Colors.materialDiffuse',
--- 'Graphics.Rendering.OpenGL.GL.Colors.materialAmbientAndDiffuse',
--- 'Graphics.Rendering.OpenGL.GL.Colors.materialSpecular',
--- 'Graphics.Rendering.OpenGL.GL.Colors.materialEmission',
--- 'Graphics.Rendering.OpenGL.GL.Colors.materialShininess',
--- 'Graphics.Rendering.OpenGL.GL.DisplayLists.callList',
--- 'Graphics.Rendering.OpenGL.GL.DisplayLists.callLists',
--- and setting 'edgeFlag' are allowed. Writing the respective state variables
--- is allowed in the delimited action, too.
---
--- Regardless of the chosen 'PrimitiveMode', there is no limit to the number of
--- vertices that can be defined during a single 'renderPrimitive'. Lines,
--- triangles, quadrilaterals, and polygons that are incompletely specified are
--- not drawn. Incomplete specification results when either too few vertices are
--- provided to specify even a single primitive or when an incorrect multiple of
--- vertices is specified. The incomplete primitive is ignored; the rest are
--- drawn.
---
--- The minimum specification of vertices for each primitive is as follows: 1
--- for a point, 2 for a line, 3 for a triangle, 4 for a quadrilateral, and 3 for
--- a polygon. Modes that require a certain multiple of vertices are 'Lines' (2),
--- 'Triangles' (3), 'Quads' (4), and 'QuadStrip' (2).
-
-renderPrimitive :: PrimitiveMode -> IO a -> IO a
-renderPrimitive = renderPrim bracket_
-
--- | A more efficient, but potentially dangerous version of 'renderPrimitive':
--- The given action is not allowed to throw an exception.
-
-unsafeRenderPrimitive :: PrimitiveMode -> IO a -> IO a
-unsafeRenderPrimitive = renderPrim unsafeBracket_
-
-{-# INLINE renderPrim #-}
-renderPrim :: (IO () -> IO () -> IO a -> IO a) -> PrimitiveMode -> IO a -> IO a
-renderPrim brack_ beginMode =
-   brack_ (glBegin (marshalPrimitiveMode beginMode)) glEnd
-
-foreign import CALLCONV unsafe "glBegin" glBegin :: GLenum -> IO ()
-
-foreign import CALLCONV unsafe "glEnd" glEnd :: IO ()
-
---------------------------------------------------------------------------------
-
-primitiveRestart :: IO ()
-primitiveRestart = glPrimitiveRestartNV
-
-EXTENSION_ENTRY("GL_NV_primitive_restart",glPrimitiveRestartNV,IO ())
-
---------------------------------------------------------------------------------
-
--- | Each vertex of a polygon, separate triangle, or separate quadrilateral
--- specified during 'renderPrimitive' is marked as the start of either a boundary
--- or nonboundary (interior) edge.
---
--- The vertices of connected triangles and connected quadrilaterals are always
--- marked as boundary, regardless of the value of the edge flag.
---
--- Boundary and nonboundary edge flags on vertices are significant only if
--- 'Graphics.Rendering.OpenGL.GL.Polygons.polygonMode' is set to
--- 'Graphics.Rendering.OpenGL.GL.Polygons.Point' or
--- 'Graphics.Rendering.OpenGL.GL.Polygons.Line'.
---
--- Note that the current edge flag can be updated at any time, in particular
--- during 'renderPrimitive'.
-
-edgeFlag :: StateVar EdgeFlag
-edgeFlag =
-   makeStateVar (getBoolean1 unmarshalEdgeFlag GetEdgeFlag)
-                (glEdgeFlag . marshalEdgeFlag)
-
-foreign import CALLCONV unsafe "glEdgeFlag" glEdgeFlag :: GLboolean -> IO ()
diff --git a/Graphics/Rendering/OpenGL/GL/Bitmaps.hs b/Graphics/Rendering/OpenGL/GL/Bitmaps.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/Bitmaps.hs
+++ /dev/null
@@ -1,32 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.Bitmaps
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to section 3.7 (Bitmaps) of the OpenGL 2.1 specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.Bitmaps (
-   bitmap
-) where
-
-import Foreign.Ptr ( Ptr )
-import Graphics.Rendering.OpenGL.GL.BasicTypes ( GLsizei, GLfloat )
-import Graphics.Rendering.OpenGL.GL.CoordTrans ( Size(..), Vector2(..) )
-import Graphics.Rendering.OpenGL.GL.VertexSpec ( Vertex2(..) )
-
---------------------------------------------------------------------------------
-
-bitmap :: Size -> (Vertex2 GLfloat) -> (Vector2 GLfloat) -> Ptr a -> IO ()
-bitmap (Size w h) (Vertex2 xbo ybo) (Vector2 xbi ybi) =
-   glBitmap w h xbo ybo xbi ybi
-
-foreign import CALLCONV unsafe "glBitmap"
-   glBitmap :: GLsizei -> GLsizei -> GLfloat -> GLfloat -> GLfloat -> GLfloat
-            -> Ptr a -> IO ()
diff --git a/Graphics/Rendering/OpenGL/GL/BlendingFactor.hs b/Graphics/Rendering/OpenGL/GL/BlendingFactor.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/BlendingFactor.hs
+++ /dev/null
@@ -1,77 +0,0 @@
--- #hide
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.BlendingFactor
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This is a purely internal module for (un-)marshaling BlendingFactor.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.BlendingFactor (
-   BlendingFactor(..), marshalBlendingFactor, unmarshalBlendingFactor
-) where
-
-import Graphics.Rendering.OpenGL.GL.BasicTypes ( GLenum )
-
---------------------------------------------------------------------------------
-
-data BlendingFactor =
-     Zero
-   | One
-   | SrcColor
-   | OneMinusSrcColor
-   | DstColor
-   | OneMinusDstColor
-   | SrcAlpha
-   | OneMinusSrcAlpha
-   | DstAlpha
-   | OneMinusDstAlpha
-   | ConstantColor
-   | OneMinusConstantColor
-   | ConstantAlpha
-   | OneMinusConstantAlpha
-   | SrcAlphaSaturate
-   deriving ( Eq, Ord, Show )
-
-marshalBlendingFactor :: BlendingFactor -> GLenum
-marshalBlendingFactor x = case x of
-   Zero -> 0x0
-   One -> 0x1
-   SrcColor -> 0x300
-   OneMinusSrcColor -> 0x301
-   DstColor -> 0x306
-   OneMinusDstColor -> 0x307
-   SrcAlpha -> 0x302
-   OneMinusSrcAlpha -> 0x303
-   DstAlpha -> 0x304
-   OneMinusDstAlpha -> 0x305
-   ConstantColor -> 0x8001
-   OneMinusConstantColor -> 0x8002
-   ConstantAlpha -> 0x8003
-   OneMinusConstantAlpha -> 0x8004
-   SrcAlphaSaturate -> 0x308
-
-unmarshalBlendingFactor :: GLenum -> BlendingFactor
-unmarshalBlendingFactor x
-   | x == 0x0 = Zero
-   | x == 0x1 = One
-   | x == 0x300 = SrcColor
-   | x == 0x301 = OneMinusSrcColor
-   | x == 0x306 = DstColor
-   | x == 0x307 = OneMinusDstColor
-   | x == 0x302 = SrcAlpha
-   | x == 0x303 = OneMinusSrcAlpha
-   | x == 0x304 = DstAlpha
-   | x == 0x305 = OneMinusDstAlpha
-   | x == 0x8001 = ConstantColor
-   | x == 0x8002 = OneMinusConstantColor
-   | x == 0x8003 = ConstantAlpha
-   | x == 0x8004 = OneMinusConstantAlpha
-   | x == 0x308 = SrcAlphaSaturate
-   | otherwise = error ("unmarshalBlendingFactor: illegal value " ++ show x)
diff --git a/Graphics/Rendering/OpenGL/GL/BufferMode.hs b/Graphics/Rendering/OpenGL/GL/BufferMode.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/BufferMode.hs
+++ /dev/null
@@ -1,93 +0,0 @@
--- #hide
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.BufferMode
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This is a purely internal module for (un-)marshaling BufferMode.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.BufferMode (
-   BufferMode(..), marshalBufferMode, unmarshalBufferMode
-) where
-
-import Graphics.Rendering.OpenGL.GL.BasicTypes ( GLenum, GLsizei )
-
---------------------------------------------------------------------------------
-
--- | The set of color buffers which are selected for reading and writing.
-
-data BufferMode =
-     NoBuffers
-     -- ^ No color buffers are selected.
-   | FrontLeftBuffer
-     -- ^ Only the front left color buffer is selected.
-   | FrontRightBuffer
-     -- ^ Only the front right color buffer is selected.
-   | BackLeftBuffer
-     -- ^ Only the  back left color buffer is selected.
-   | BackRightBuffer
-     -- ^ Only the back right color buffer is selected.
-   | FrontBuffers
-     -- ^ Only the front left and front right color buffers are selected. If
-     -- there is no front right color buffer, only the front left color buffer
-     -- is selected.
-   | BackBuffers
-     -- ^ Only the back left and back right color buffers are selected. If there
-     -- is no back right color buffer, only the back left color buffer is
-     -- selected.
-   | LeftBuffers
-     -- ^ Only the front left and back left color buffers are selected. If there
-     -- is no back left color buffer, only the front left color buffer is
-     -- selected.
-   | RightBuffers
-     -- ^ Only the front right and back right color buffers are selected. If
-     -- there is no back right color buffer, only the front right color buffer
-     -- is selected.
-   | FrontAndBackBuffers
-     -- ^ All the front and back color buffers (front left, front right, back
-     -- left, back right) are selected. If there are no back color buffers, only
-     -- the front left and front right color buffers are selected. If there are
-     -- no right color buffers, only the front left and back left color buffers
-     -- are selected. If there are no right or back color buffers, only the
-     -- front left color buffer is selected.
-   | AuxBuffer GLsizei
-     -- ^ Only the given auxiliary color buffer no. /i/ is selected.
-   deriving ( Eq, Ord, Show )
-
-marshalBufferMode :: BufferMode -> Maybe GLenum
-marshalBufferMode x = case x of
-   NoBuffers -> Just 0x0
-   FrontLeftBuffer -> Just 0x400
-   FrontRightBuffer -> Just 0x401
-   BackLeftBuffer -> Just 0x402
-   BackRightBuffer -> Just 0x403
-   FrontBuffers -> Just 0x404
-   BackBuffers -> Just 0x405
-   LeftBuffers -> Just 0x406
-   RightBuffers -> Just 0x407
-   FrontAndBackBuffers -> Just 0x408
-   AuxBuffer i
-      | i <= 246  -> Just (0x409 + fromIntegral i)
-      | otherwise -> Nothing
-
-unmarshalBufferMode :: GLenum -> BufferMode
-unmarshalBufferMode x
-   | x == 0x0 = NoBuffers
-   | x == 0x400 = FrontLeftBuffer
-   | x == 0x401 = FrontRightBuffer
-   | x == 0x402 = BackLeftBuffer
-   | x == 0x403 = BackRightBuffer
-   | x == 0x404 = FrontBuffers
-   | x == 0x405 = BackBuffers
-   | x == 0x406 = LeftBuffers
-   | x == 0x407 = RightBuffers
-   | x == 0x408 = FrontAndBackBuffers
-   | 0x409 <= x && x <= 0x4ff = AuxBuffer (fromIntegral x - 0x409)
-   | otherwise = error ("unmarshalBufferMode: illegal value " ++ show x)
diff --git a/Graphics/Rendering/OpenGL/GL/BufferObjects.hs b/Graphics/Rendering/OpenGL/GL/BufferObjects.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/BufferObjects.hs
+++ /dev/null
@@ -1,344 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.BufferObjects
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to section 2.9 (Buffer Objects) of the OpenGL 2.1
--- specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.BufferObjects (
-   -- * Object Names
-   ObjectName(..),
-
-   -- * Buffer Objects
-   BufferObject(BufferObject),
-
-   -- * Binding Buffer Objects
-   BufferTarget(..), bindBuffer, arrayBufferBinding,
-   vertexAttribArrayBufferBinding,
-
-   -- * Handling Buffer Data
-   BufferUsage(..), bufferData, TransferDirection(..), bufferSubData,
-
-   -- * Mapping Buffer Objects
-   BufferAccess(..), MappingFailure(..), withMappedBuffer,
-   mapBuffer, unmapBuffer,
-   bufferAccess, bufferMapped
-) where
-
-import Foreign.Marshal.Alloc ( alloca )
-import Foreign.Marshal.Array ( withArrayLen, peekArray, allocaArray )
-import Foreign.Ptr ( Ptr )
-import Foreign.Storable ( Storable(peek) )
-import Graphics.Rendering.OpenGL.GL.BasicTypes (
-   GLboolean, GLenum, GLint, GLintptr, GLuint, GLsizei, GLsizeiptr )
-import Graphics.Rendering.OpenGL.GL.Exception ( finallyRet )
-import Graphics.Rendering.OpenGL.GL.Extensions (
-   FunPtr, unsafePerformIO, Invoker, getProcAddress )
-import Graphics.Rendering.OpenGL.GL.GLboolean ( unmarshalGLboolean )
-import Graphics.Rendering.OpenGL.GL.PeekPoke ( peek1 )
-import Graphics.Rendering.OpenGL.GL.QueryUtils (
-   GetPName(GetArrayBufferBinding,GetElementArrayBufferBinding,
-            GetVertexArrayBufferBinding,GetNormalArrayBufferBinding,
-            GetColorArrayBufferBinding,GetIndexArrayBufferBinding,
-            GetTextureCoordArrayBufferBinding,GetEdgeFlagArrayBufferBinding,
-            GetFogCoordArrayBufferBinding,GetSecondaryColorArrayBufferBinding,
-            GetPixelPackBufferBinding,GetPixelUnpackBufferBinding,
-            GetCopyReadBuffer,GetCopyWriteBuffer),
-   getInteger1, maybeNullPtr,
-   GetVertexAttribPName(GetVertexAttribArrayBufferBinding), getVertexAttribInteger1 )
-import Graphics.Rendering.OpenGL.GL.StateVar (
-   GettableStateVar, makeGettableStateVar, StateVar, makeStateVar )
-import Graphics.Rendering.OpenGL.GL.VertexArrays ( ClientArrayType(..) )
-import Graphics.Rendering.OpenGL.GL.VertexSpec ( AttribLocation )
-import Graphics.Rendering.OpenGL.GLU.ErrorsInternal ( recordInvalidEnum )
-
---------------------------------------------------------------------------------
-
-#include "HsOpenGLExt.h"
-
---------------------------------------------------------------------------------
-
--- | An 'ObjectName' corresponds to the general OpenGL notion of an explicitly
--- handled object name, e.g. a display list name, a texture object name, a
--- buffer object name, etc.
-
-class ObjectName a where
-   genObjectNames :: Int -> IO [a]
-   deleteObjectNames:: [a] -> IO ()
-   isObjectName :: a -> IO Bool
-
---------------------------------------------------------------------------------
-
-newtype BufferObject = BufferObject { bufferID :: GLuint }
-   deriving ( Eq, Ord, Show )
-
---------------------------------------------------------------------------------
-
-instance ObjectName BufferObject where
-   genObjectNames n =
-      allocaArray n $ \buf -> do
-        glGenBuffersARB (fromIntegral n) buf
-        fmap (map BufferObject) $ peekArray n buf
-
-   deleteObjectNames bufferObjects =
-      withArrayLen (map bufferID bufferObjects) $
-         glDeleteBuffersARB . fromIntegral
-
-   isObjectName = fmap unmarshalGLboolean . glIsBufferARB . bufferID
-
-EXTENSION_ENTRY("GL_ARB_vertex_buffer_object or OpenGL 1.5",glGenBuffersARB,GLsizei -> Ptr GLuint -> IO ())
-
-EXTENSION_ENTRY("GL_ARB_vertex_buffer_object or OpenGL 1.5",glDeleteBuffersARB,GLsizei -> Ptr GLuint -> IO ())
-
-EXTENSION_ENTRY("GL_ARB_vertex_buffer_object or OpenGL 1.5",glIsBufferARB,GLuint -> IO GLboolean)
-
---------------------------------------------------------------------------------
-
-data BufferTarget =
-     ArrayBuffer
-   | CopyReadBuffer
-   | CopyWriteBuffer
-   | ElementArrayBuffer
-   | PixelPackBuffer
-   | PixelUnpackBuffer
-   deriving ( Eq, Ord, Show )
-
-marshalBufferTarget :: BufferTarget -> GLenum
-marshalBufferTarget x = case x of
-   ArrayBuffer -> 0x8892
-   CopyReadBuffer -> 0x8F36
-   CopyWriteBuffer -> 0x8F37
-   ElementArrayBuffer -> 0x8893
-   PixelPackBuffer -> 0x88eb
-   PixelUnpackBuffer -> 0x88ec
-
-bufferTargetToGetPName :: BufferTarget -> GetPName
-bufferTargetToGetPName x = case x of
-   ArrayBuffer -> GetArrayBufferBinding
-   ElementArrayBuffer -> GetElementArrayBufferBinding
-   CopyReadBuffer -> GetCopyReadBuffer
-   CopyWriteBuffer -> GetCopyWriteBuffer
-   PixelPackBuffer -> GetPixelPackBufferBinding
-   PixelUnpackBuffer -> GetPixelUnpackBufferBinding
-
---------------------------------------------------------------------------------
-
-data BufferUsage =
-     StreamDraw
-   | StreamRead
-   | StreamCopy
-   | StaticDraw
-   | StaticRead
-   | StaticCopy
-   | DynamicDraw
-   | DynamicRead
-   | DynamicCopy
-   deriving ( Eq, Ord, Show )
-
-marshalBufferUsage :: BufferUsage -> GLenum
-marshalBufferUsage x = case x of
-   StreamDraw -> 0x88e0
-   StreamRead -> 0x88e1
-   StreamCopy -> 0x88e2
-   StaticDraw -> 0x88e4
-   StaticRead -> 0x88e5
-   StaticCopy -> 0x88e6
-   DynamicDraw -> 0x88e8
-   DynamicRead -> 0x88e9
-   DynamicCopy -> 0x88ea
-
-unmarshalBufferUsage :: GLenum -> BufferUsage
-unmarshalBufferUsage x
-   | x == 0x88e0 = StreamDraw
-   | x == 0x88e1 = StreamRead
-   | x == 0x88e2 = StreamCopy
-   | x == 0x88e4 = StaticDraw
-   | x == 0x88e5 = StaticRead
-   | x == 0x88e6 = StaticCopy
-   | x == 0x88e8 = DynamicDraw
-   | x == 0x88e9 = DynamicRead
-   | x == 0x88ea = DynamicCopy
-   | otherwise = error ("unmarshalBufferUsage: illegal value " ++ show x)
-
---------------------------------------------------------------------------------
-
-data BufferAccess =
-     ReadOnly
-   | WriteOnly
-   | ReadWrite
-   deriving ( Eq, Ord, Show )
-
-marshalBufferAccess :: BufferAccess -> GLenum
-marshalBufferAccess x = case x of
-   ReadOnly -> 0x88b8
-   WriteOnly -> 0x88b9
-   ReadWrite -> 0x88ba
-
-unmarshalBufferAccess :: GLenum -> BufferAccess
-unmarshalBufferAccess x
-   | x == 0x88b8 = ReadOnly
-   | x == 0x88b9 = WriteOnly
-   | x == 0x88ba = ReadWrite
-   | otherwise = error ("unmarshalBufferAccess: illegal value " ++ show x)
-
---------------------------------------------------------------------------------
-
-bindBuffer :: BufferTarget -> StateVar (Maybe BufferObject)
-bindBuffer t = makeStateVar (getBindBuffer t) (setBindBuffer t)
-
-getBindBuffer :: BufferTarget -> IO (Maybe BufferObject)
-getBindBuffer = bufferQuery bufferTargetToGetPName
-
-bufferQuery :: (a -> GetPName) -> a -> IO (Maybe BufferObject)
-bufferQuery func t = do
-   buf <- getInteger1 (BufferObject . fromIntegral) (func t)
-   return $ if buf == noBufferObject then Nothing else Just buf
-
-noBufferObject :: BufferObject
-noBufferObject = BufferObject 0
-
-setBindBuffer :: BufferTarget -> Maybe BufferObject -> IO ()
-setBindBuffer t =
-   glBindBufferARB (marshalBufferTarget t) . bufferID . maybe noBufferObject id
-
-EXTENSION_ENTRY("GL_ARB_vertex_buffer_object or OpenGL 1.5",glBindBufferARB,GLenum -> GLuint -> IO ())
-
-clientArrayTypeToGetPName :: ClientArrayType -> GetPName
-clientArrayTypeToGetPName x = case x of
-   VertexArray -> GetVertexArrayBufferBinding
-   NormalArray -> GetNormalArrayBufferBinding
-   ColorArray -> GetColorArrayBufferBinding
-   IndexArray -> GetIndexArrayBufferBinding
-   TextureCoordArray -> GetTextureCoordArrayBufferBinding
-   EdgeFlagArray -> GetEdgeFlagArrayBufferBinding
-   FogCoordArray -> GetFogCoordArrayBufferBinding
-   SecondaryColorArray -> GetSecondaryColorArrayBufferBinding
-   MatrixIndexArray -> error "clientArrayTypeToGetPName: impossible"
-
-arrayBufferBinding :: ClientArrayType -> GettableStateVar (Maybe BufferObject)
-arrayBufferBinding t =
-   makeGettableStateVar $ case t of
-      MatrixIndexArray -> do recordInvalidEnum ; return Nothing
-      _ -> bufferQuery clientArrayTypeToGetPName t
-
-
-vertexAttribArrayBufferBinding :: AttribLocation -> GettableStateVar (Maybe BufferObject)
-vertexAttribArrayBufferBinding location =
-   makeGettableStateVar $ do
-      buf <- getVertexAttribInteger1 (BufferObject . fromIntegral) location GetVertexAttribArrayBufferBinding
-      return $ if buf == noBufferObject then Nothing else Just buf
-
---------------------------------------------------------------------------------
-
-bufferData :: BufferTarget -> StateVar (GLsizeiptr, Ptr a, BufferUsage)
-bufferData t = makeStateVar (getBufferData t) (setBufferData t)
-
-getBufferData :: BufferTarget -> IO (GLsizeiptr, Ptr a, BufferUsage)
-getBufferData t = do
-   s <- getBufferParameter t fromIntegral GetBufferSize
-   p <- getBufferPointer t
-   u <- getBufferParameter t unmarshalBufferUsage GetBufferUsage
-   return (s, p, u)
-
-setBufferData :: BufferTarget -> (GLsizeiptr, Ptr a, BufferUsage) -> IO ()
-setBufferData t (s, p, u) =
-   glBufferDataARB (marshalBufferTarget t) s p (marshalBufferUsage u)
-
-EXTENSION_ENTRY("GL_ARB_vertex_buffer_object or OpenGL 1.5",glBufferDataARB,GLenum -> GLsizeiptr -> Ptr a -> GLenum -> IO ())
-
---------------------------------------------------------------------------------
-
-data TransferDirection =
-     ReadFromBuffer
-   | WriteToBuffer
-   deriving ( Eq, Ord, Show )
-
-bufferSubData ::
-   BufferTarget -> TransferDirection -> GLintptr -> GLsizeiptr -> Ptr a -> IO ()
-bufferSubData t WriteToBuffer = glBufferSubDataARB (marshalBufferTarget t)
-bufferSubData t ReadFromBuffer = glGetBufferSubDataARB (marshalBufferTarget t)
-
-EXTENSION_ENTRY("GL_ARB_vertex_buffer_object or OpenGL 1.5",glBufferSubDataARB,GLenum -> GLintptr -> GLsizeiptr -> Ptr a -> IO ())
-
-EXTENSION_ENTRY("GL_ARB_vertex_buffer_object or OpenGL 1.5",glGetBufferSubDataARB,GLenum -> GLintptr -> GLsizeiptr -> Ptr a -> IO ())
-
---------------------------------------------------------------------------------
-
-data GetBufferPName =
-     GetBufferSize
-   | GetBufferUsage
-   | GetBufferAccess
-   | GetBufferMapped
-
-marshalGetBufferPName :: GetBufferPName -> GLenum
-marshalGetBufferPName x = case x of
-   GetBufferSize -> 0x8764
-   GetBufferUsage -> 0x8765
-   GetBufferAccess -> 0x88bb
-   GetBufferMapped -> 0x88bc
-
-getBufferParameter :: BufferTarget -> (GLenum -> a) -> GetBufferPName -> IO a
-getBufferParameter t f p = alloca $ \buf -> do
-   glGetBufferParameterivARB (marshalBufferTarget t)
-                             (marshalGetBufferPName p) buf
-   peek1 (f . fromIntegral) buf
-
-EXTENSION_ENTRY("GL_ARB_vertex_buffer_object or OpenGL 1.5",glGetBufferParameterivARB,GLenum -> GLenum -> Ptr GLint -> IO ())
-
---------------------------------------------------------------------------------
-
-getBufferPointer :: BufferTarget -> IO (Ptr a)
-getBufferPointer t = alloca $ \buf -> do
-   -- only one pname: GL_BUFFER_MAP_POINTER
-   glGetBufferPointervARB (marshalBufferTarget t) 0x88bd buf
-   peek buf
-
-EXTENSION_ENTRY("GL_ARB_vertex_buffer_object or OpenGL 1.5",glGetBufferPointervARB,GLenum -> GLenum -> Ptr (Ptr a) -> IO ())
-
---------------------------------------------------------------------------------
-
-data MappingFailure =
-     MappingFailed
-   | UnmappingFailed
-   deriving ( Eq, Ord, Show )
-
--- | Convenience function for an exception-safe combination of 'mapBuffer' and
--- 'unmapBuffer'.
-withMappedBuffer :: BufferTarget -> BufferAccess -> (Ptr a -> IO b) -> (MappingFailure -> IO b) -> IO b
-withMappedBuffer t a action err = do
-   maybeBuf <- mapBuffer t a
-   case maybeBuf  of
-      Nothing -> err MappingFailed
-      Just buf -> do (ret, ok) <- action buf `finallyRet` unmapBuffer t
-                     if ok
-                        then return ret
-                        else err UnmappingFailed
-
-mapBuffer :: BufferTarget -> BufferAccess -> IO (Maybe (Ptr a))
-mapBuffer t = fmap (maybeNullPtr Nothing Just) . mapBuffer_ t
-
-mapBuffer_ :: BufferTarget -> BufferAccess -> IO (Ptr a)
-mapBuffer_ t = glMapBufferARB (marshalBufferTarget t) . marshalBufferAccess
-
-EXTENSION_ENTRY("GL_ARB_vertex_buffer_object or OpenGL 1.5",glMapBufferARB,GLenum -> GLenum -> IO (Ptr a))
-
-unmapBuffer :: BufferTarget -> IO Bool
-unmapBuffer = fmap unmarshalGLboolean . glUnmapBufferARB . marshalBufferTarget
-
-EXTENSION_ENTRY("GL_ARB_vertex_buffer_object or OpenGL 1.5",glUnmapBufferARB,GLenum -> IO GLboolean)
-
-bufferAccess :: BufferTarget -> GettableStateVar BufferAccess
-bufferAccess t = makeGettableStateVar $
-   getBufferParameter t unmarshalBufferAccess GetBufferAccess
-
-bufferMapped :: BufferTarget -> GettableStateVar Bool
-bufferMapped t = makeGettableStateVar $
-   getBufferParameter t unmarshalGLboolean GetBufferMapped
diff --git a/Graphics/Rendering/OpenGL/GL/Capability.hs b/Graphics/Rendering/OpenGL/GL/Capability.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/Capability.hs
+++ /dev/null
@@ -1,269 +0,0 @@
--- #hide
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.Capability
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This is a purely internal module for handling OpenGL capabilities, i.e.
--- boolean state variables.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.Capability (
-   marshalCapability, unmarshalCapability,
-   EnableCap(..), makeCapability, makeStateVarMaybe
-) where
-
-import Graphics.Rendering.OpenGL.GL.BasicTypes (
-   GLboolean, GLenum, GLsizei, Capability(..) )
-import Graphics.Rendering.OpenGL.GL.GLboolean (
-   marshalGLboolean, unmarshalGLboolean )
-import Graphics.Rendering.OpenGL.GL.QueryUtils (
-   clipPlaneIndexToEnum, lightIndexToEnum )
-import Graphics.Rendering.OpenGL.GL.StateVar (
-   HasGetter(get), HasSetter(($=)), StateVar, makeStateVar )
-import Graphics.Rendering.OpenGL.GLU.ErrorsInternal ( recordInvalidEnum )
-
---------------------------------------------------------------------------------
-
-marshalCapability :: Capability -> GLboolean
-marshalCapability = marshalGLboolean . (Enabled ==)
-
-unmarshalCapability :: GLboolean -> Capability
-unmarshalCapability x = if unmarshalGLboolean x then Enabled else Disabled
-
---------------------------------------------------------------------------------
-
-data EnableCap =
-     CapFog
-   | CapLighting
-   | CapTexture1D
-   | CapTexture2D
-   | CapTextureRectangle
-   | CapLineStipple
-   | CapPolygonStipple
-   | CapCullFace
-   | CapAlphaTest
-   | CapBlend
-   | CapIndexLogicOp
-   | CapColorLogicOp
-   | CapDither
-   | CapStencilTest
-   | CapDepthTest
-   | CapClipPlane GLsizei
-   | CapLight GLsizei
-   | CapTextureGenS
-   | CapTextureGenT
-   | CapTextureGenR
-   | CapTextureGenQ
-   | CapMap1Vertex3
-   | CapMap1Vertex4
-   | CapMap1Color4
-   | CapMap1Index
-   | CapMap1Normal
-   | CapMap1TextureCoord1
-   | CapMap1TextureCoord2
-   | CapMap1TextureCoord3
-   | CapMap1TextureCoord4
-   | CapMap2Vertex3
-   | CapMap2Vertex4
-   | CapMap2Color4
-   | CapMap2Index
-   | CapMap2Normal
-   | CapMap2TextureCoord1
-   | CapMap2TextureCoord2
-   | CapMap2TextureCoord3
-   | CapMap2TextureCoord4
-   | CapPointSmooth
-   | CapLineSmooth
-   | CapPolygonSmooth
-   | CapScissorTest
-   | CapColorMaterial
-   | CapNormalize
-   | CapAutoNormal
-   | CapPolygonOffsetPoint
-   | CapPolygonOffsetLine
-   | CapPolygonOffsetFill
-   | CapVertexArray
-   | CapNormalArray
-   | CapColorArray
-   | CapIndexArray
-   | CapTextureCoordArray
-   | CapEdgeFlagArray
-   | CapFogCoordArray
-   | CapSecondaryColorArray
-   | CapMatrixIndexArray
-   | CapConvolution1D
-   | CapConvolution2D
-   | CapSeparable2D
-   | CapHistogram
-   | CapMinmax
-   | CapRescaleNormal
-   | CapSharedTexturePalette
-   | CapTexture3D
-   | CapMultisample
-   | CapSampleAlphaToCoverage
-   | CapSampleAlphaToOne
-   | CapSampleCoverage
-   | CapColorTable
-   | CapPostConvolutionColorTable
-   | CapPostColorMatrixColorTable
-   | CapColorSum
-   | CapTextureCubeMap
-   | CapWeightSumUnity
-   | CapVertexBlend
-   | CapWeightArray
-   | CapMatrixPalette
-   | CapDepthClamp
-   | CapDepthBoundsTest
-   | CapPrimitiveRestart -- NOTE: client state!
-   | CapPointSprite
-   | CapStencilTestTwoSide
-   | CapRasterPositionUnclipped
-   | CapTextureColorTable
-   | CapVertexProgramPointSize
-   | CapVertexProgramTwoSide
-
-marshalEnableCap :: EnableCap -> Maybe GLenum
-marshalEnableCap x = case x of
-   CapFog -> Just 0xb60
-   CapLighting -> Just 0xb50
-   CapTexture1D -> Just 0xde0
-   CapTexture2D -> Just 0xde1
-   CapTextureRectangle -> Just 0x84F5
-   CapLineStipple -> Just 0xb24
-   CapPolygonStipple -> Just 0xb42
-   CapCullFace -> Just 0xb44
-   CapAlphaTest -> Just 0xbc0
-   CapBlend -> Just 0xbe2
-   CapIndexLogicOp -> Just 0xbf1
-   CapColorLogicOp -> Just 0xbf2
-   CapDither -> Just 0xbd0
-   CapStencilTest -> Just 0xb90
-   CapDepthTest -> Just 0xb71
-   CapClipPlane i -> clipPlaneIndexToEnum i
-   CapLight i -> lightIndexToEnum i
-   CapTextureGenS -> Just 0xc60
-   CapTextureGenT -> Just 0xc61
-   CapTextureGenR -> Just 0xc62
-   CapTextureGenQ -> Just 0xc63
-   CapMap1Vertex3 -> Just 0xd97
-   CapMap1Vertex4 -> Just 0xd98
-   CapMap1Color4 -> Just 0xd90
-   CapMap1Index -> Just 0xd91
-   CapMap1Normal -> Just 0xd92
-   CapMap1TextureCoord1 -> Just 0xd93
-   CapMap1TextureCoord2 -> Just 0xd94
-   CapMap1TextureCoord3 -> Just 0xd95
-   CapMap1TextureCoord4 -> Just 0xd96
-   CapMap2Vertex3 -> Just 0xdb7
-   CapMap2Vertex4 -> Just 0xdb8
-   CapMap2Color4 -> Just 0xdb0
-   CapMap2Index -> Just 0xdb1
-   CapMap2Normal -> Just 0xdb2
-   CapMap2TextureCoord1 -> Just 0xdb3
-   CapMap2TextureCoord2 -> Just 0xdb4
-   CapMap2TextureCoord3 -> Just 0xdb5
-   CapMap2TextureCoord4 -> Just 0xdb6
-   CapPointSmooth -> Just 0xb10
-   CapLineSmooth -> Just 0xb20
-   CapPolygonSmooth -> Just 0xb41
-   CapScissorTest -> Just 0xc11
-   CapColorMaterial -> Just 0xb57
-   CapNormalize -> Just 0xba1
-   CapAutoNormal -> Just 0xd80
-   CapPolygonOffsetPoint -> Just 0x2a01
-   CapPolygonOffsetLine -> Just 0x2a02
-   CapPolygonOffsetFill -> Just 0x8037
-   CapVertexArray -> Just 0x8074
-   CapNormalArray -> Just 0x8075
-   CapColorArray -> Just 0x8076
-   CapIndexArray -> Just 0x8077
-   CapTextureCoordArray -> Just 0x8078
-   CapEdgeFlagArray -> Just 0x8079
-   CapFogCoordArray -> Just 0x8457
-   CapSecondaryColorArray -> Just 0x845e
-   CapMatrixIndexArray -> Just 0x8844
-   CapConvolution1D -> Just 0x8010
-   CapConvolution2D -> Just 0x8011
-   CapSeparable2D -> Just 0x8012
-   CapHistogram -> Just 0x8024
-   CapMinmax -> Just 0x802e
-   CapRescaleNormal -> Just 0x803a
-   CapSharedTexturePalette -> Just 0x81fb
-   CapTexture3D -> Just 0x806f
-   CapMultisample -> Just 0x809d
-   CapSampleAlphaToCoverage -> Just 0x809e
-   CapSampleAlphaToOne -> Just 0x809f
-   CapSampleCoverage -> Just 0x80a0
-   CapColorTable -> Just 0x80d0
-   CapPostConvolutionColorTable -> Just 0x80d1
-   CapPostColorMatrixColorTable -> Just 0x80d2
-   CapColorSum -> Just 0x8458
-   CapTextureCubeMap -> Just 0x8513
-   CapWeightSumUnity -> Just 0x86a6
-   CapVertexBlend -> Just 0x86a7
-   CapWeightArray -> Just 0x86ad
-   CapMatrixPalette -> Just 0x8840
-   CapDepthClamp -> Just 0x864f
-   CapDepthBoundsTest -> Just 0x8890
-   CapPrimitiveRestart -> Just 0x8558
-   CapPointSprite -> Just 0x8861
-   CapStencilTestTwoSide -> Just 0x8910
-   CapRasterPositionUnclipped -> Just 0x19262
-   CapTextureColorTable -> Just 0x80bc
-   CapVertexProgramPointSize -> Just 0x8642
-   CapVertexProgramTwoSide -> Just 0x8643
-
---------------------------------------------------------------------------------
-
-makeCapability :: EnableCap -> StateVar Capability
-makeCapability cap = makeStateVar (isEnabled cap) (enable cap)
-
---------------------------------------------------------------------------------
-
-isEnabled :: EnableCap -> IO Capability
-isEnabled =
-   maybe (do recordInvalidEnum; return Disabled)
-         (fmap unmarshalCapability . glIsEnabled) .
-   marshalEnableCap
-
-foreign import CALLCONV unsafe "glIsEnabled" glIsEnabled ::
-   GLenum -> IO GLboolean
-
---------------------------------------------------------------------------------
-
-enable :: EnableCap -> Capability -> IO ()
-enable cap state = maybe recordInvalidEnum (f state) (marshalEnableCap cap)
-   where f Disabled = glDisable
-         f Enabled  = glEnable
-
-foreign import CALLCONV unsafe "glDisable" glDisable :: GLenum -> IO ()
-
-foreign import CALLCONV unsafe "glEnable" glEnable :: GLenum -> IO ()
-
---------------------------------------------------------------------------------
-
-makeStateVarMaybe :: IO EnableCap -> IO a -> (a -> IO ()) -> StateVar (Maybe a)
-makeStateVarMaybe getCap getAct setAct =
-   makeStateVar
-      (getStateVarMaybe getCap getAct)
-      (setStateVarMaybe getCap setAct)
-
-getStateVarMaybe :: IO EnableCap -> IO a -> IO (Maybe a)
-getStateVarMaybe getCap act = do
-   capability <- fmap makeCapability getCap
-   state <- get capability
-   if state == Enabled
-      then fmap Just act
-      else return Nothing
-
-setStateVarMaybe :: IO EnableCap -> (a -> IO ()) -> Maybe a -> IO ()
-setStateVarMaybe getCap act val = do
-   capability <- fmap makeCapability getCap
-   maybe (capability $= Disabled) (\x -> act x >> capability $= Enabled) val
diff --git a/Graphics/Rendering/OpenGL/GL/Clipping.hs b/Graphics/Rendering/OpenGL/GL/Clipping.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/Clipping.hs
+++ /dev/null
@@ -1,57 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.Clipping
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to section 2.12 (Clipping) of the OpenGL 2.1 specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.Clipping (
-   ClipPlaneName(..), clipPlane, maxClipPlanes
-) where
-
-import Foreign.Marshal.Alloc ( alloca )
-import Foreign.Marshal.Utils ( with )
-import Foreign.Ptr ( Ptr, castPtr )
-import Graphics.Rendering.OpenGL.GL.BasicTypes ( GLenum, GLsizei, GLdouble )
-import Graphics.Rendering.OpenGL.GL.Capability (
-   EnableCap(CapClipPlane), makeStateVarMaybe )
-import Graphics.Rendering.OpenGL.GL.CoordTrans ( Plane(..) )
-import Graphics.Rendering.OpenGL.GL.PeekPoke ( peek1 )
-import Graphics.Rendering.OpenGL.GL.QueryUtils (
-   GetPName(GetClipPlane,GetMaxClipPlanes),
-   clipPlaneIndexToEnum, getDoublev, getSizei1 )
-import Graphics.Rendering.OpenGL.GL.StateVar (
-   GettableStateVar, makeGettableStateVar, StateVar )
-import Graphics.Rendering.OpenGL.GLU.ErrorsInternal ( recordInvalidEnum )
-
---------------------------------------------------------------------------------
-
-newtype ClipPlaneName = ClipPlaneName GLsizei
-   deriving ( Eq, Ord, Show )
-
---------------------------------------------------------------------------------
-
-clipPlane :: ClipPlaneName -> StateVar (Maybe (Plane GLdouble))
-clipPlane (ClipPlaneName i) =
-   makeStateVarMaybe
-      (return (CapClipPlane i))
-      (alloca $ \buf -> do
-          getDoublev (GetClipPlane i) (castPtr buf)
-          peek1 id (buf :: Ptr (Plane GLdouble)))
-      (\plane -> maybe recordInvalidEnum (with plane . glClipPlane)
-                       (clipPlaneIndexToEnum i))
-
-foreign import CALLCONV unsafe "glClipPlane" glClipPlane ::
-   GLenum -> Ptr (Plane GLdouble) -> IO ()
-
---------------------------------------------------------------------------------
-
-maxClipPlanes :: GettableStateVar GLsizei
-maxClipPlanes = makeGettableStateVar (getSizei1 id GetMaxClipPlanes)
diff --git a/Graphics/Rendering/OpenGL/GL/ColorSum.hs b/Graphics/Rendering/OpenGL/GL/ColorSum.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/ColorSum.hs
+++ /dev/null
@@ -1,27 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.ColorSum
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to section 3.9 (Color Sum) of the OpenGL 2.1 specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.ColorSum (
-   colorSum
-) where
-
-import Graphics.Rendering.OpenGL.GL.Capability (
-   EnableCap(CapColorSum), makeCapability )
-import Graphics.Rendering.OpenGL.GL.BasicTypes ( Capability )
-import Graphics.Rendering.OpenGL.GL.StateVar ( StateVar )
-
---------------------------------------------------------------------------------
-
-colorSum :: StateVar Capability
-colorSum = makeCapability CapColorSum
diff --git a/Graphics/Rendering/OpenGL/GL/Colors.hs b/Graphics/Rendering/OpenGL/GL/Colors.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/Colors.hs
+++ /dev/null
@@ -1,497 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.Colors
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to section 2.14 (Colors and Coloring) of the
--- OpenGL 2.1 specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.Colors (
-   -- * Lighting
-   lighting, Light(..), light, maxLights,
-   FrontFaceDirection(..), frontFace,
-
-   -- * Lighting Parameter Specification
-   Face(..),
-   materialAmbient, materialDiffuse, materialAmbientAndDiffuse,
-   materialSpecular, materialEmission, materialShininess, maxShininess,
-   materialColorIndexes,
-
-   ambient, diffuse, specular,
-   position, spotDirection, spotExponent, maxSpotExponent, spotCutoff,
-   attenuation,
-
-   lightModelAmbient, lightModelLocalViewer, lightModelTwoSide,
-   vertexProgramTwoSide,
-   LightModelColorControl(..), lightModelColorControl,
-
-   -- * ColorMaterial
-   ColorMaterialParameter(..), colorMaterial,
-
-   -- * Flatshading
-   ShadingModel(..), shadeModel
-) where
-
-import Control.Monad ( liftM2, liftM3 )
-import Foreign.Marshal.Alloc ( alloca )
-import Foreign.Marshal.Array ( allocaArray, withArray )
-import Foreign.Marshal.Utils ( with )
-import Foreign.Ptr ( Ptr )
-import Foreign.Storable ( Storable(peek) )
-import Graphics.Rendering.OpenGL.GL.Capability (
-   marshalCapability, unmarshalCapability,
-   EnableCap(CapVertexProgramTwoSide,CapLighting,CapColorMaterial,CapLight),
-   makeCapability,
-   makeStateVarMaybe )
-import Graphics.Rendering.OpenGL.GL.BasicTypes (
-   GLenum, GLint, GLsizei, GLfloat,Capability )
-import Graphics.Rendering.OpenGL.GL.Face (
-   Face(..), marshalFace, unmarshalFace )
-import Graphics.Rendering.OpenGL.GL.PeekPoke ( peek3 )
-import Graphics.Rendering.OpenGL.GL.QueryUtils (
-   GetPName(GetMaxLights, GetFrontFace,GetShadeModel,
-            GetLightModelAmbient, GetLightModelLocalViewer,
-            GetLightModelTwoSide, GetLightModelColorControl,
-            GetColorMaterialFace,GetColorMaterialParameter,
-            GetMaxShininess,GetMaxSpotExponent),
-   getBoolean1, getEnum1, getSizei1, getFloat1, getFloat4, lightIndexToEnum )
-import Graphics.Rendering.OpenGL.GL.StateVar (
-   HasGetter(get), HasSetter(($=)),
-   GettableStateVar, makeGettableStateVar, StateVar, makeStateVar )
-import Graphics.Rendering.OpenGL.GL.VertexSpec (
-   Color4(..), Normal3(..), Vertex4(..), Index1(..) )
-import Graphics.Rendering.OpenGL.GLU.ErrorsInternal ( recordInvalidEnum )
-
---------------------------------------------------------------------------------
-
-lighting :: StateVar Capability
-lighting = makeCapability CapLighting
-
---------------------------------------------------------------------------------
-
-newtype Light = Light GLsizei
-   deriving ( Eq, Ord, Show )
-
-marshalLight :: Light -> Maybe GLenum
-marshalLight (Light l) = lightIndexToEnum l
-
---------------------------------------------------------------------------------
-
-light :: Light -> StateVar Capability
-light (Light l) = makeCapability (CapLight l)
-
-maxLights :: GettableStateVar GLsizei
-maxLights = makeGettableStateVar (getSizei1 id GetMaxLights)
-
---------------------------------------------------------------------------------
-
-data FrontFaceDirection =
-     CW
-   | CCW
-   deriving ( Eq, Ord, Show )
-
-marshalFrontFaceDirection :: FrontFaceDirection -> GLenum
-marshalFrontFaceDirection x = case x of
-   CW -> 0x900
-   CCW -> 0x901
-
-unmarshalFrontFaceDirection :: GLenum -> FrontFaceDirection
-unmarshalFrontFaceDirection x
-   | x == 0x900 = CW
-   | x == 0x901 = CCW
-   | otherwise = error ("unmarshalFrontFaceDirection: illegal value " ++ show x)
-
---------------------------------------------------------------------------------
-
-frontFace :: StateVar FrontFaceDirection
-frontFace =
-   makeStateVar
-      (getEnum1 unmarshalFrontFaceDirection GetFrontFace)
-      (glFrontFace . marshalFrontFaceDirection)
-
-foreign import CALLCONV unsafe "glFrontFace" glFrontFace :: GLenum -> IO ()
-
---------------------------------------------------------------------------------
-
-data MaterialParameter =
-     MaterialEmission
-   | MaterialShininess
-   | MaterialAmbientAndDiffuse
-   | MaterialColorIndexes
-   | MaterialAmbient
-   | MaterialDiffuse
-   | MaterialSpecular
-
-marshalMaterialParameter :: MaterialParameter -> GLenum
-marshalMaterialParameter x = case x of
-   MaterialEmission -> 0x1600
-   MaterialShininess -> 0x1601
-   MaterialAmbientAndDiffuse -> 0x1602
-   MaterialColorIndexes -> 0x1603
-   MaterialAmbient -> 0x1200
-   MaterialDiffuse -> 0x1201
-   MaterialSpecular -> 0x1202
-
---------------------------------------------------------------------------------
-
-materialAmbient :: Face -> StateVar (Color4 GLfloat)
-materialAmbient =
-   makeMaterialVar glGetMaterialfvc glMaterialfvc MaterialAmbient
-
-materialDiffuse :: Face -> StateVar (Color4 GLfloat)
-materialDiffuse =
-   makeMaterialVar glGetMaterialfvc glMaterialfvc MaterialDiffuse
-
-materialAmbientAndDiffuse :: Face -> StateVar (Color4 GLfloat)
-materialAmbientAndDiffuse =
-   makeMaterialVar glGetMaterialfvc glMaterialfvc MaterialAmbientAndDiffuse
-
-materialSpecular :: Face -> StateVar (Color4 GLfloat)
-materialSpecular =
-   makeMaterialVar glGetMaterialfvc glMaterialfvc MaterialSpecular
-
-materialEmission :: Face -> StateVar (Color4 GLfloat)
-materialEmission =
-   makeMaterialVar glGetMaterialfvc glMaterialfvc MaterialEmission
-
-makeMaterialVar :: Storable a
-                => (GLenum -> GLenum -> Ptr a -> IO ())
-                -> (GLenum -> GLenum -> Ptr a -> IO ())
-                -> MaterialParameter -> Face -> StateVar a
-makeMaterialVar getter setter materialParameter face =
-   makeStateVar (alloca $ \buf -> do getter f mp buf ; peek buf)
-                (\val -> with val $ setter f mp)
-   where mp = marshalMaterialParameter materialParameter
-         f  = marshalFace face
-
-foreign import CALLCONV unsafe "glGetMaterialfv" glGetMaterialfvc ::
-   GLenum -> GLenum -> Ptr (Color4 GLfloat) -> IO ()
-
-foreign import CALLCONV unsafe "glMaterialfv" glMaterialfvc ::
-   GLenum -> GLenum -> Ptr (Color4 GLfloat) -> IO ()
-
---------------------------------------------------------------------------------
-
-materialShininess :: Face -> StateVar GLfloat
-materialShininess =
-   makeMaterialVar glGetMaterialfvf glMaterialff MaterialShininess
-
-foreign import CALLCONV unsafe "glGetMaterialfv" glGetMaterialfvf ::
-   GLenum -> GLenum -> Ptr GLfloat -> IO ()
-
-foreign import CALLCONV unsafe "glMaterialfv" glMaterialff ::
-   GLenum -> GLenum -> Ptr GLfloat -> IO ()
-
-maxShininess :: GettableStateVar GLfloat
-maxShininess = makeGettableStateVar $ getFloat1 id GetMaxShininess
-
---------------------------------------------------------------------------------
-
--- Alas, (Index1 GLint, Index1 GLint, Index1 GLint) is not an instance of
--- Storable...
-
-materialColorIndexes ::
-   Face -> StateVar (Index1 GLint, Index1 GLint, Index1 GLint)
-materialColorIndexes face =
-   makeStateVar (getMaterialColorIndexes face) (setMaterialColorIndexes face)
-
-getMaterialColorIndexes :: Face -> IO (Index1 GLint, Index1 GLint, Index1 GLint)
-getMaterialColorIndexes face =
-   allocaArray 3 $ \buf -> do
-      glGetMaterialiv (marshalFace face)
-                      (marshalMaterialParameter MaterialColorIndexes)
-                      buf
-      peek3 (\a d s -> (Index1 a, Index1 d, Index1 s)) buf
-
-foreign import CALLCONV unsafe "glGetMaterialiv" glGetMaterialiv ::
-   GLenum -> GLenum -> Ptr GLint -> IO ()
-
-setMaterialColorIndexes ::
-   Face -> (Index1 GLint, Index1 GLint, Index1 GLint) -> IO ()
-setMaterialColorIndexes face (Index1 a, Index1 d, Index1 s) =
-   withArray [a, d, s] $
-      glMaterialiv (marshalFace face)
-                   (marshalMaterialParameter MaterialColorIndexes)
-
-foreign import CALLCONV unsafe "glMaterialiv" glMaterialiv ::
-   GLenum -> GLenum -> Ptr GLint -> IO ()
-
---------------------------------------------------------------------------------
-
-data LightParameter =
-     Ambient'
-   | Diffuse'
-   | Specular'
-   | Position
-   | SpotDirection
-   | SpotExponent
-   | SpotCutoff
-   | ConstantAttenuation
-   | LinearAttenuation
-   | QuadraticAttenuation
-
-marshalLightParameter :: LightParameter -> GLenum
-marshalLightParameter x = case x of
-   Ambient' -> 0x1200
-   Diffuse' -> 0x1201
-   Specular' -> 0x1202
-   Position -> 0x1203
-   SpotDirection -> 0x1204
-   SpotExponent -> 0x1205
-   SpotCutoff -> 0x1206
-   ConstantAttenuation -> 0x1207
-   LinearAttenuation -> 0x1208
-   QuadraticAttenuation -> 0x1209
-
---------------------------------------------------------------------------------
-
-ambient :: Light -> StateVar (Color4 GLfloat)
-ambient = makeLightVar glGetLightfvc glLightfvc Ambient' black
-
-black :: Color4 GLfloat
-black = Color4 0 0 0 0
-
-diffuse :: Light -> StateVar (Color4 GLfloat)
-diffuse = makeLightVar glGetLightfvc glLightfvc Diffuse' black
-
-specular :: Light -> StateVar (Color4 GLfloat)
-specular = makeLightVar glGetLightfvc glLightfvc Specular' black
-
-makeLightVar :: Storable a
-             => (GLenum -> GLenum -> Ptr a -> IO ())
-             -> (GLenum -> GLenum -> Ptr a -> IO ())
-             -> LightParameter -> a -> Light -> StateVar a
-makeLightVar getter setter lightParameter defaultValue theLight =
-   makeStateVar (maybe (return defaultValue) getLightVar ml)
-                (\val -> maybe recordInvalidEnum (setLightVar val) ml)
-   where lp          = marshalLightParameter lightParameter
-         ml          = marshalLight theLight
-         getLightVar = \l -> alloca $ \buf -> do getter l lp buf ; peek buf
-         setLightVar = \val l -> with val $ setter l lp
-
-foreign import CALLCONV unsafe "glGetLightfv" glGetLightfvc ::
-   GLenum -> GLenum -> Ptr (Color4 GLfloat) -> IO ()
-
-foreign import CALLCONV unsafe "glLightfv" glLightfvc ::
-   GLenum -> GLenum -> Ptr (Color4 GLfloat) -> IO ()
-
---------------------------------------------------------------------------------
-
-position :: Light -> StateVar (Vertex4 GLfloat)
-position = makeLightVar glGetLightfvv glLightfvv Position (Vertex4 0 0 0 0)
-
-foreign import CALLCONV unsafe "glLightfv" glLightfvv ::
-   GLenum -> GLenum -> Ptr (Vertex4 GLfloat) -> IO ()
-
-foreign import CALLCONV unsafe "glGetLightfv" glGetLightfvv ::
-   GLenum -> GLenum -> Ptr (Vertex4 GLfloat) -> IO ()
-
---------------------------------------------------------------------------------
-
-spotDirection :: Light -> StateVar (Normal3 GLfloat)
-spotDirection =
-   makeLightVar glGetLightfvn glLightfvn SpotDirection (Normal3 0 0 0)
-
-foreign import CALLCONV unsafe "glLightfv" glLightfvn ::
-   GLenum -> GLenum -> Ptr (Normal3 GLfloat) -> IO ()
-
-foreign import CALLCONV unsafe "glGetLightfv" glGetLightfvn ::
-   GLenum -> GLenum -> Ptr (Normal3 GLfloat) -> IO ()
-
---------------------------------------------------------------------------------
-
-spotExponent :: Light -> StateVar GLfloat
-spotExponent = makeLightVar glGetLightfv glLightfv SpotExponent 0
-
-foreign import CALLCONV unsafe "glLightfv" glLightfv ::
-   GLenum -> GLenum -> Ptr GLfloat -> IO ()
-
-foreign import CALLCONV unsafe "glGetLightfv" glGetLightfv ::
-   GLenum -> GLenum -> Ptr GLfloat -> IO ()
-
-maxSpotExponent :: GettableStateVar GLfloat
-maxSpotExponent = makeGettableStateVar $ getFloat1 id GetMaxSpotExponent
-
---------------------------------------------------------------------------------
-
-spotCutoff :: Light -> StateVar GLfloat
-spotCutoff = makeLightVar glGetLightfv glLightfv SpotCutoff 0
-
---------------------------------------------------------------------------------
-
-attenuation :: Light -> StateVar (GLfloat, GLfloat, GLfloat)
-attenuation theLight =
-   makeStateVar
-      (liftM3 (,,) (get (constantAttenuation  theLight))
-                   (get (linearAttenuation    theLight))
-                   (get (quadraticAttenuation theLight)))
-      (\(constant, linear, quadratic) -> do
-         constantAttenuation  theLight $= constant
-         linearAttenuation    theLight $= linear
-         quadraticAttenuation theLight $= quadratic)
-
-constantAttenuation :: Light -> StateVar GLfloat
-constantAttenuation = makeLightVar glGetLightfv glLightfv ConstantAttenuation 0
-
-linearAttenuation :: Light -> StateVar GLfloat
-linearAttenuation = makeLightVar glGetLightfv glLightfv LinearAttenuation 0
-
-quadraticAttenuation :: Light -> StateVar GLfloat
-quadraticAttenuation =
-   makeLightVar glGetLightfv glLightfv QuadraticAttenuation 0
-
---------------------------------------------------------------------------------
-
-data LightModelParameter =
-     LightModelAmbient
-   | LightModelLocalViewer
-   | LightModelTwoSide
-   | LightModelColorControl
-
-marshalLightModelParameter :: LightModelParameter -> GLenum
-marshalLightModelParameter x = case x of
-   LightModelAmbient -> 0xb53
-   LightModelLocalViewer -> 0xb51
-   LightModelTwoSide -> 0xb52
-   LightModelColorControl -> 0x81f8
-
---------------------------------------------------------------------------------
-
-lightModelAmbient :: StateVar (Color4 GLfloat)
-lightModelAmbient =
-   makeStateVar
-      (getFloat4 Color4 GetLightModelAmbient)
-      (\c -> with c $
-                glLightModelfv (marshalLightModelParameter LightModelAmbient))
-
-foreign import CALLCONV unsafe "glLightModelfv" glLightModelfv ::
-   GLenum -> Ptr (Color4 GLfloat) -> IO ()
-
---------------------------------------------------------------------------------
-
-lightModelLocalViewer :: StateVar Capability
-lightModelLocalViewer =
-   makeLightModelCapVar GetLightModelLocalViewer LightModelLocalViewer
-
-makeLightModelCapVar :: GetPName -> LightModelParameter -> StateVar Capability
-makeLightModelCapVar pname lightModelParameter =
-   makeStateVar
-      (getBoolean1 unmarshalCapability pname)
-      (glLightModeli (marshalLightModelParameter lightModelParameter) .
-                     fromIntegral . marshalCapability)
-
-foreign import CALLCONV unsafe "glLightModeli" glLightModeli ::
-   GLenum -> GLint -> IO ()
-
---------------------------------------------------------------------------------
-
-lightModelTwoSide :: StateVar Capability
-lightModelTwoSide = makeLightModelCapVar GetLightModelTwoSide LightModelTwoSide
-
-vertexProgramTwoSide :: StateVar Capability
-vertexProgramTwoSide = makeCapability CapVertexProgramTwoSide
-
---------------------------------------------------------------------------------
-
-data LightModelColorControl =
-     SingleColor
-   | SeparateSpecularColor
-   deriving ( Eq, Ord, Show )
-
-marshalLightModelColorControl :: LightModelColorControl -> GLenum
-marshalLightModelColorControl x = case x of
-   SingleColor -> 0x81f9
-   SeparateSpecularColor -> 0x81fa
-
-unmarshalLightModelColorControl :: GLenum -> LightModelColorControl
-unmarshalLightModelColorControl x
-   | x == 0x81f9 = SingleColor
-   | x == 0x81fa = SeparateSpecularColor
-   | otherwise = error ("unmarshalLightModelColorControl: illegal value " ++ show x)
-
---------------------------------------------------------------------------------
-
-lightModelColorControl :: StateVar LightModelColorControl
-lightModelColorControl =
-   makeStateVar
-      (getEnum1 unmarshalLightModelColorControl GetLightModelColorControl)
-      (glLightModeli (marshalLightModelParameter LightModelColorControl) .
-                     fromIntegral . marshalLightModelColorControl)
-
---------------------------------------------------------------------------------
-
-data ColorMaterialParameter =
-     Ambient
-   | Diffuse
-   | Specular
-   | Emission
-   | AmbientAndDiffuse
-   deriving ( Eq, Ord, Show )
-
-marshalColorMaterialParameter :: ColorMaterialParameter -> GLenum
-marshalColorMaterialParameter x = case x of
-   Ambient -> 0x1200
-   Diffuse -> 0x1201
-   Specular -> 0x1202
-   Emission -> 0x1600
-   AmbientAndDiffuse -> 0x1602
-
-unmarshalColorMaterialParameter :: GLenum -> ColorMaterialParameter
-unmarshalColorMaterialParameter x
-   | x == 0x1200 = Ambient
-   | x == 0x1201 = Diffuse
-   | x == 0x1202 = Specular
-   | x == 0x1600 = Emission
-   | x == 0x1602 = AmbientAndDiffuse
-   | otherwise = error ("unmarshalColorMaterialParameter: illegal value " ++ show x)
-
---------------------------------------------------------------------------------
-
-colorMaterial :: StateVar (Maybe (Face, ColorMaterialParameter))
-colorMaterial =
-   makeStateVarMaybe
-      (return CapColorMaterial)
-      (liftM2
-         (,)
-         (getEnum1 unmarshalFace GetColorMaterialFace)
-         (getEnum1 unmarshalColorMaterialParameter GetColorMaterialParameter))
-      (\(face, param) -> glColorMaterial (marshalFace face)
-                                         (marshalColorMaterialParameter param))
-
-foreign import CALLCONV unsafe "glColorMaterial" glColorMaterial ::
-   GLenum -> GLenum -> IO ()
-
---------------------------------------------------------------------------------
-
-data ShadingModel =
-     Flat
-   | Smooth
-   deriving ( Eq, Ord, Show )
-
-marshalShadingModel :: ShadingModel -> GLenum
-marshalShadingModel x = case x of
-   Flat -> 0x1d00
-   Smooth -> 0x1d01
-
-unmarshalShadingModel :: GLenum -> ShadingModel
-unmarshalShadingModel x
-   | x == 0x1d00 = Flat
-   | x == 0x1d01 = Smooth
-   | otherwise = error ("unmarshalShadingModel: illegal value " ++ show x)
-
---------------------------------------------------------------------------------
-
-shadeModel :: StateVar ShadingModel
-shadeModel =
-   makeStateVar
-      (getEnum1 unmarshalShadingModel GetShadeModel)
-      (glShadeModel . marshalShadingModel)
-
-foreign import CALLCONV unsafe "glShadeModel" glShadeModel :: GLenum -> IO ()
diff --git a/Graphics/Rendering/OpenGL/GL/ComparisonFunction.hs b/Graphics/Rendering/OpenGL/GL/ComparisonFunction.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/ComparisonFunction.hs
+++ /dev/null
@@ -1,57 +0,0 @@
--- #hide
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.ComparisonFunction
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This is a purely internal module for (un-)marshaling ComparisonFunction.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.ComparisonFunction (
-   ComparisonFunction(..), marshalComparisonFunction,
-   unmarshalComparisonFunction
-) where
-
-import Graphics.Rendering.OpenGL.GL.BasicTypes ( GLenum )
-
---------------------------------------------------------------------------------
-
-data ComparisonFunction =
-     Never
-   | Less
-   | Equal
-   | Lequal
-   | Greater
-   | Notequal
-   | Gequal
-   | Always
-   deriving ( Eq, Ord, Show )
-
-marshalComparisonFunction :: ComparisonFunction -> GLenum
-marshalComparisonFunction x = case x of
-   Never -> 0x200
-   Less -> 0x201
-   Equal -> 0x202
-   Lequal -> 0x203
-   Greater -> 0x204
-   Notequal -> 0x205
-   Gequal -> 0x206
-   Always -> 0x207
-
-unmarshalComparisonFunction :: GLenum -> ComparisonFunction
-unmarshalComparisonFunction x
-   | x == 0x200 = Never
-   | x == 0x201 = Less
-   | x == 0x202 = Equal
-   | x == 0x203 = Lequal
-   | x == 0x204 = Greater
-   | x == 0x205 = Notequal
-   | x == 0x206 = Gequal
-   | x == 0x207 = Always
-   | otherwise = error ("unmarshalComparisonFunction: illegal value " ++ show x)
diff --git a/Graphics/Rendering/OpenGL/GL/ControlPoint.hs b/Graphics/Rendering/OpenGL/GL/ControlPoint.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/ControlPoint.hs
+++ /dev/null
@@ -1,163 +0,0 @@
--- #hide
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.ControlPoint
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This is a purely internal module for handling control points.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.ControlPoint (
-   ControlPoint(..)
-) where
-
-import Foreign.Ptr ( Ptr )
-import Foreign.Storable ( Storable(peek,poke) )
-import Graphics.Rendering.OpenGL.GL.BasicTypes ( GLenum )
-import Graphics.Rendering.OpenGL.GL.Capability ( EnableCap(..) )
-import Graphics.Rendering.OpenGL.GL.Domain ( Domain )
-import Graphics.Rendering.OpenGL.GL.VertexArrays ( Stride )
-import Graphics.Rendering.OpenGL.GL.VertexSpec (
-   Vertex3, Vertex4, Index1, Color4, Normal3, TexCoord1, TexCoord2, TexCoord3,
-   TexCoord4 )
-
---------------------------------------------------------------------------------
-
-class ControlPoint c where
-   map1Target       :: Domain d => c d -> GLenum
-   map2Target       :: Domain d => c d -> GLenum
-   enableCap1       :: Domain d => c d -> EnableCap
-   enableCap2       :: Domain d => c d -> EnableCap
-   numComponents    :: Domain d => c d -> Stride
-   peekControlPoint :: Domain d => Ptr (c d) -> IO (c d)
-   pokeControlPoint :: Domain d => Ptr (c d) -> (c d) -> IO ()
-
-instance ControlPoint Vertex3 where
-   map1Target       = marshalMapTarget . const Map1Vertex3
-   map2Target       = marshalMapTarget . const Map2Vertex3
-   enableCap1       = const CapMap1Vertex3
-   enableCap2       = const CapMap2Vertex3
-   numComponents    = const 3
-   peekControlPoint = peek
-   pokeControlPoint = poke
-
-instance ControlPoint Vertex4 where
-   map1Target       = marshalMapTarget . const Map1Vertex4
-   map2Target       = marshalMapTarget . const Map2Vertex4
-   enableCap1       = const CapMap1Vertex4
-   enableCap2       = const CapMap2Vertex4
-   numComponents    = const 4
-   peekControlPoint = peek
-   pokeControlPoint = poke
-
-instance ControlPoint Index1 where
-   map1Target       = marshalMapTarget . const Map1Index
-   map2Target       = marshalMapTarget . const Map2Index
-   enableCap1       = const CapMap1Index
-   enableCap2       = const CapMap2Index
-   numComponents    = const 1
-   peekControlPoint = peek
-   pokeControlPoint = poke
-
-instance ControlPoint Color4 where
-   map1Target       = marshalMapTarget . const Map1Color4
-   map2Target       = marshalMapTarget . const Map2Color4
-   enableCap1       = const CapMap1Color4
-   enableCap2       = const CapMap2Color4
-   numComponents    = const 4
-   peekControlPoint = peek
-   pokeControlPoint = poke
-
-instance ControlPoint Normal3 where
-   map1Target       = marshalMapTarget . const Map1Normal
-   map2Target       = marshalMapTarget . const Map2Normal
-   enableCap1       = const CapMap1Normal
-   enableCap2       = const CapMap2Normal
-   numComponents    = const 3
-   peekControlPoint = peek
-   pokeControlPoint = poke
-
-instance ControlPoint TexCoord1 where
-   map1Target       = marshalMapTarget . const Map1TextureCoord1
-   map2Target       = marshalMapTarget . const Map2TextureCoord1
-   enableCap1       = const CapMap1TextureCoord1
-   enableCap2       = const CapMap2TextureCoord1
-   numComponents    = const 1
-   peekControlPoint = peek
-   pokeControlPoint = poke
-
-instance ControlPoint TexCoord2 where
-   map1Target       = marshalMapTarget . const Map1TextureCoord2
-   map2Target       = marshalMapTarget . const Map2TextureCoord2
-   enableCap1       = const CapMap1TextureCoord2
-   enableCap2       = const CapMap2TextureCoord2
-   numComponents    = const 2
-   peekControlPoint = peek
-   pokeControlPoint = poke
-
-instance ControlPoint TexCoord3 where
-   map1Target       = marshalMapTarget . const Map1TextureCoord3
-   map2Target       = marshalMapTarget . const Map2TextureCoord3
-   enableCap1       = const CapMap1TextureCoord3
-   enableCap2       = const CapMap2TextureCoord3
-   numComponents    = const 3
-   peekControlPoint = peek
-   pokeControlPoint = poke
-
-instance ControlPoint TexCoord4 where
-   map1Target       = marshalMapTarget . const Map1TextureCoord4
-   map2Target       = marshalMapTarget . const Map2TextureCoord4
-   enableCap1       = const CapMap1TextureCoord4
-   enableCap2       = const CapMap2TextureCoord4
-   numComponents    = const 4
-   peekControlPoint = peek
-   pokeControlPoint = poke
-
---------------------------------------------------------------------------------
-
-data MapTarget =
-     Map1Color4
-   | Map1Index
-   | Map1Normal
-   | Map1TextureCoord1
-   | Map1TextureCoord2
-   | Map1TextureCoord3
-   | Map1TextureCoord4
-   | Map1Vertex3
-   | Map1Vertex4
-   | Map2Color4
-   | Map2Index
-   | Map2Normal
-   | Map2TextureCoord1
-   | Map2TextureCoord2
-   | Map2TextureCoord3
-   | Map2TextureCoord4
-   | Map2Vertex3
-   | Map2Vertex4
-
-marshalMapTarget :: MapTarget -> GLenum
-marshalMapTarget x = case x of
-   Map1Color4 -> 0xd90
-   Map1Index -> 0xd91
-   Map1Normal -> 0xd92
-   Map1TextureCoord1 -> 0xd93
-   Map1TextureCoord2 -> 0xd94
-   Map1TextureCoord3 -> 0xd95
-   Map1TextureCoord4 -> 0xd96
-   Map1Vertex3 -> 0xd97
-   Map1Vertex4 -> 0xd98
-   Map2Color4 -> 0xdb0
-   Map2Index -> 0xdb1
-   Map2Normal -> 0xdb2
-   Map2TextureCoord1 -> 0xdb3
-   Map2TextureCoord2 -> 0xdb4
-   Map2TextureCoord3 -> 0xdb5
-   Map2TextureCoord4 -> 0xdb6
-   Map2Vertex3 -> 0xdb7
-   Map2Vertex4 -> 0xdb8
diff --git a/Graphics/Rendering/OpenGL/GL/CoordTrans.hs b/Graphics/Rendering/OpenGL/GL/CoordTrans.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/CoordTrans.hs
+++ /dev/null
@@ -1,603 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.CoordTrans
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to section 2.11 (Coordinate Transformations) of the
--- OpenGL 2.1 specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.CoordTrans (
-   -- * Controlling the Viewport
-   depthRange,
-   Position(..), Size(..), viewport, maxViewportDims,
-
-   -- * Matrices
-   MatrixMode(..), matrixMode,
-   Vector1(..), Vector2(..), Vector3(..), Vector4(..),
-   MatrixOrder(..), MatrixComponent(rotate,translate,scale), Matrix(..),
-   currentMatrix, matrix, multMatrix, GLmatrix, loadIdentity,
-   ortho, frustum, depthClamp,
-   activeTexture,
-   preservingMatrix, unsafePreservingMatrix,
-   stackDepth, maxStackDepth,
-
-   -- * Normal Transformation
-   rescaleNormal, normalize,
-
-   -- * Generating Texture Coordinates
-   Plane(..), TextureCoordName(..), TextureGenMode(..), textureGenMode
-) where
-
-import Foreign.ForeignPtr ( ForeignPtr, mallocForeignPtrArray, withForeignPtr )
-import Foreign.Marshal.Alloc ( alloca )
-import Foreign.Marshal.Array ( allocaArray, peekArray, pokeArray, withArray )
-import Foreign.Marshal.Utils ( with )
-import Foreign.Ptr ( Ptr, castPtr )
-import Foreign.Storable ( Storable(..) )
-import Graphics.Rendering.OpenGL.GL.Capability (
-   EnableCap(CapRescaleNormal, CapNormalize,CapDepthClamp,
-             CapTextureGenS, CapTextureGenT,
-             CapTextureGenR, CapTextureGenQ),
-   makeCapability, makeStateVarMaybe )
-import Graphics.Rendering.OpenGL.GL.BasicTypes (
-   GLenum, GLint, GLsizei, GLfloat, GLdouble, GLclampd, Capability(..) )
-import Graphics.Rendering.OpenGL.GL.Exception ( bracket, unsafeBracket_ )
-import Graphics.Rendering.OpenGL.GL.Extensions (
-   FunPtr, unsafePerformIO, Invoker, getProcAddress )
-import Graphics.Rendering.OpenGL.GL.PeekPoke ( peek1, peek4, poke4 )
-import Graphics.Rendering.OpenGL.GL.QueryUtils (
-   GetPName(GetDepthRange,GetViewport,GetMaxViewportDims,GetMatrixMode,
-            GetModelviewMatrix,GetProjectionMatrix,
-            GetTextureMatrix, GetColorMatrix,GetMatrixPalette,GetActiveTexture,
-            GetCurrentMatrixStackDepth,GetModelviewStackDepth,
-            GetMaxModelviewStackDepth,GetProjectionStackDepth,
-            GetMaxProjectionStackDepth,GetTextureStackDepth,
-            GetMaxTextureStackDepth,GetColorMatrixStackDepth,
-            GetMaxColorMatrixStackDepth,GetMaxMatrixPaletteStackDepth),
-   getInteger2, getInteger4, getEnum1, getSizei1, getFloatv,
-   getDouble2, getDoublev, modelviewIndexToEnum, modelviewEnumToIndex )
-import Graphics.Rendering.OpenGL.GL.StateVar (
-   GettableStateVar, makeGettableStateVar, HasGetter(get), HasSetter(($=)),
-   StateVar, makeStateVar )
-import Graphics.Rendering.OpenGL.GL.Tensor (
-   Vector1(..), Vector2(..), Vector3(..), Vector4(..) )
-import Graphics.Rendering.OpenGL.GL.Texturing.TextureUnit (
-   marshalTextureUnit, unmarshalTextureUnit )
-import Graphics.Rendering.OpenGL.GL.VertexSpec ( TextureUnit )
-import Graphics.Rendering.OpenGL.GLU.ErrorsInternal (
-   recordInvalidEnum, recordInvalidValue )
-
---------------------------------------------------------------------------------
-
-#include "HsOpenGLExt.h"
-#include "HsOpenGLTypes.h"
-
---------------------------------------------------------------------------------
-
--- | After clipping and division by /w/, depth coordinates range from -1 to 1,
--- corresponding to the near and far clipping planes. '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 'depthRange'
--- are both clamped to this range before they are accepted.
---
--- The initial setting of (0, 1) maps the near plane to 0 and the far plane to
--- 1. With this mapping, the depth buffer range is fully utilized.
---
--- It is not necessary that the near value be less than the far value. Reverse
--- mappings such as (1, 0) are acceptable.
-
-depthRange :: StateVar (GLclampd, GLclampd)
-depthRange = makeStateVar (getDouble2 (,) GetDepthRange) (uncurry glDepthRange)
-
-foreign import CALLCONV unsafe "glDepthRange" glDepthRange ::
-   GLclampd -> GLclampd -> IO ()
-
---------------------------------------------------------------------------------
-
--- | A 2-dimensional position, measured in pixels.
-data Position = Position !GLint !GLint
-   deriving ( Eq, Ord, Show )
-
--- | A 2-dimensional size, measured in pixels.
-data Size = Size !GLsizei !GLsizei
-   deriving ( Eq, Ord, Show )
-
--- | Controls the affine transformation from normalized device coordinates to
--- window coordinates. The viewport state variable consists of the coordinates
--- (/x/, /y/) of the lower left corner of the viewport rectangle, (in pixels,
--- initial value (0,0)), and the size (/width/, /height/) of the viewport. When
--- a GL context is first attached to a window, /width/ and /height/ are set to
--- the dimensions of that window.
---
--- Let (/xnd/, /ynd/) be normalized device coordinates. Then the window
--- coordinates (/xw/, /yw/) are computed as follows:
---
--- /xw/ = (/xnd/ + 1) (/width/  \/ 2) + /x/
---
--- /yw/ = (/ynd/ + 1) (/heigth/ \/ 2) + /y/
---
--- Viewport width and height are silently clamped to a range that depends on the
--- implementation, see 'maxViewportDims'.
-
-viewport :: StateVar (Position, Size)
-viewport = makeStateVar (getInteger4 makeVp GetViewport)
-                        (\(Position x y, Size w h) -> glViewport x y w h)
-   where makeVp x y w h = (Position x y, Size (fromIntegral w) (fromIntegral h))
-
-foreign import CALLCONV unsafe "glViewport" glViewport ::
-   GLint -> GLint -> GLsizei -> GLsizei -> IO ()
-
--- | The implementation-dependent maximum viewport width and height.
-
-maxViewportDims :: GettableStateVar Size
-maxViewportDims = makeGettableStateVar (getInteger2 Size GetMaxViewportDims)
-
---------------------------------------------------------------------------------
-
--- | A matrix stack.
-
-data MatrixMode =
-     Modelview GLsizei  -- ^ The modelview matrix stack of the specified vertex unit.
-   | Projection         -- ^ The projection matrix stack.
-   | Texture            -- ^ The texture matrix stack.
-   | Color              -- ^ The color matrix stack.
-   | MatrixPalette      -- ^ The matrix palette stack.
-   deriving ( Eq, Ord, Show )
-
-marshalMatrixMode :: MatrixMode -> Maybe GLenum
-marshalMatrixMode x = case x of
-   Modelview i -> modelviewIndexToEnum i
-   Projection -> Just 0x1701
-   Texture -> Just 0x1702
-   Color -> Just 0x1800
-   MatrixPalette -> Just 0x8840
-
-unmarshalMatrixMode :: GLenum -> MatrixMode
-unmarshalMatrixMode x
-   | x == 0x1701 = Projection
-   | x == 0x1702 = Texture
-   | x == 0x1800 = Color
-   | x == 0x8840 = MatrixPalette
-   | otherwise =
-        case modelviewEnumToIndex x of
-           Just i -> Modelview i
-           Nothing -> error ("unmarshalMatrixMode: illegal value " ++ show x)
-
-matrixModeToGetMatrix :: MatrixMode -> GetPName
-matrixModeToGetMatrix x = case x of
-   Modelview _   -> GetModelviewMatrix -- ???
-   Projection    -> GetProjectionMatrix
-   Texture       -> GetTextureMatrix
-   Color         -> GetColorMatrix
-   MatrixPalette -> GetMatrixPalette
-
-matrixModeToGetStackDepth :: MatrixMode -> GetPName
-matrixModeToGetStackDepth x =  case x of
-   Modelview _   -> GetModelviewStackDepth
-   Projection    -> GetProjectionStackDepth
-   Texture       -> GetTextureStackDepth
-   Color         -> GetColorMatrixStackDepth
-   MatrixPalette -> error "matrixModeToGetStackDepth: impossible"
-
-matrixModeToGetMaxStackDepth :: MatrixMode -> GetPName
-matrixModeToGetMaxStackDepth x = case x of
-   Modelview _    -> GetMaxModelviewStackDepth
-   Projection     -> GetMaxProjectionStackDepth
-   Texture        -> GetMaxTextureStackDepth
-   Color          -> GetMaxColorMatrixStackDepth
-   MatrixPalette  -> GetMaxMatrixPaletteStackDepth
-
---------------------------------------------------------------------------------
-
--- | Controls which matrix stack is the target for subsequent matrix operations.
--- The initial value is ('Modelview' 0).
-
-matrixMode :: StateVar MatrixMode
-matrixMode =
-   makeStateVar (getEnum1 unmarshalMatrixMode GetMatrixMode)
-                (maybe recordInvalidValue glMatrixMode . marshalMatrixMode)
-
-foreign import CALLCONV unsafe "glMatrixMode" glMatrixMode :: GLenum -> IO ()
-
---------------------------------------------------------------------------------
-
-data MatrixOrder = ColumnMajor | RowMajor
-   deriving ( Eq, Ord, Show )
-
---------------------------------------------------------------------------------
-
-class Storable c => MatrixComponent c where
-   getMatrix :: GetPName -> Ptr c -> IO ()
-   loadMatrix :: Ptr c -> IO ()
-   loadTransposeMatrix :: Ptr c -> IO ()
-   multMatrix_ :: Ptr c -> IO ()
-   multTransposeMatrix :: Ptr c -> IO ()
-   rotate :: c -> Vector3 c -> IO ()
-   translate :: Vector3 c -> IO ()
-   scale :: c -> c -> c -> IO ()
-
-instance MatrixComponent GLfloat_ where
-   getMatrix = getFloatv
-   loadMatrix = glLoadMatrixf
-   loadTransposeMatrix = glLoadTransposeMatrixfARB
-   multMatrix_ = glMultMatrixf
-   multTransposeMatrix = glMultTransposeMatrixfARB
-   rotate a (Vector3 x y z) = glRotatef a x y z
-   translate (Vector3 x y z) = glTranslatef x y z
-   scale = glScalef
-
-instance MatrixComponent GLdouble_ where
-   getMatrix = getDoublev
-   loadMatrix = glLoadMatrixd
-   loadTransposeMatrix = glLoadTransposeMatrixdARB
-   multMatrix_ = glMultMatrixd
-   multTransposeMatrix = glMultTransposeMatrixdARB
-   rotate a (Vector3 x y z) = glRotated a x y z
-   translate (Vector3 x y z) = glTranslated x y z
-   scale = glScaled
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "glLoadMatrixf" glLoadMatrixf :: Ptr GLfloat -> IO ()
-foreign import CALLCONV unsafe "glLoadMatrixd" glLoadMatrixd :: Ptr GLdouble -> IO ()
-
-EXTENSION_ENTRY("GL_ARB_transpose_matrix or OpenGL 1.3",glLoadTransposeMatrixfARB,Ptr GLfloat -> IO ())
-EXTENSION_ENTRY("GL_ARB_transpose_matrix or OpenGL 1.3",glLoadTransposeMatrixdARB,Ptr GLdouble -> IO ())
-
-foreign import CALLCONV unsafe "glMultMatrixf" glMultMatrixf :: Ptr GLfloat -> IO ()
-foreign import CALLCONV unsafe "glMultMatrixd" glMultMatrixd :: Ptr GLdouble -> IO ()
-
-EXTENSION_ENTRY("GL_ARB_transpose_matrix or OpenGL 1.3",glMultTransposeMatrixfARB,Ptr GLfloat -> IO ())
-EXTENSION_ENTRY("GL_ARB_transpose_matrix or OpenGL 1.3",glMultTransposeMatrixdARB,Ptr GLdouble -> IO ())
-
-foreign import CALLCONV unsafe "glRotatef" glRotatef :: GLfloat -> GLfloat -> GLfloat -> GLfloat -> IO ()
-foreign import CALLCONV unsafe "glRotated" glRotated :: GLdouble -> GLdouble -> GLdouble -> GLdouble -> IO ()
-
-foreign import CALLCONV unsafe "glTranslatef" glTranslatef :: GLfloat -> GLfloat -> GLfloat -> IO ()
-foreign import CALLCONV unsafe "glTranslated" glTranslated :: GLdouble -> GLdouble -> GLdouble -> IO ()
-
-foreign import CALLCONV unsafe "glScalef" glScalef :: GLfloat -> GLfloat -> GLfloat -> IO ()
-foreign import CALLCONV unsafe "glScaled" glScaled :: GLdouble -> GLdouble -> GLdouble -> IO ()
-
---------------------------------------------------------------------------------
-
-class Matrix m where
-   -- | Create a new matrix of the given order (containing undefined elements)
-   -- and call the action to fill it with 4x4 elements.
-   withNewMatrix ::
-      MatrixComponent c => MatrixOrder -> (Ptr c -> IO ()) -> IO (m c)
-
-   -- | Call the action with the given matrix. /Note:/ The action is /not/
-   -- allowed to modify the matrix elements!
-   withMatrix ::
-      MatrixComponent c => m c -> (MatrixOrder -> Ptr c -> IO a) -> IO a
-
-   newMatrix :: MatrixComponent c => MatrixOrder -> [c] -> IO (m c)
-   getMatrixComponents :: MatrixComponent c => MatrixOrder -> m c -> IO [c]
-
-   withNewMatrix order act =
-      allocaArray 16 $ \p -> do
-         act p
-         components <- peekArray 16 p
-         newMatrix order components
-
-   withMatrix mat act = do
-      components <- getMatrixComponents ColumnMajor mat
-      withArray components $ act ColumnMajor
-
-   newMatrix order components =
-      withNewMatrix order $ flip pokeArray (take 16 components)
-
-   getMatrixComponents desiredOrder mat =
-      withMatrix mat $ \order p ->
-        if desiredOrder == order
-           then peekArray 16 p
-           else mapM (peekElemOff p) [ 0, 4,  8, 12,
-                                       1, 5,  9, 13,
-                                       2, 6, 10, 14,
-                                       3, 7, 11, 15 ]
-
---------------------------------------------------------------------------------
-
-{-# DEPRECATED currentMatrix "use `matrix' instead" #-}
-currentMatrix :: (Matrix m, MatrixComponent c) => StateVar (m c)
-currentMatrix = matrix Nothing
-
-matrix :: (Matrix m, MatrixComponent c) => Maybe MatrixMode -> StateVar (m c)
-matrix maybeMode =
-   makeStateVar
-      (maybe (get matrixMode) return maybeMode >>= (getMatrix' . matrixModeToGetMatrix))
-      (maybe id withMatrixMode maybeMode . setMatrix)
-
-withMatrixMode :: MatrixMode -> IO a -> IO a
-withMatrixMode mode act =
-   preservingMatrixMode $ do
-      matrixMode $= mode
-      act
-
-getMatrix' :: (Matrix m, MatrixComponent c) => GetPName -> IO (m c)
-getMatrix' = withNewMatrix ColumnMajor . getMatrix
-
-setMatrix :: (Matrix m, MatrixComponent c) => m c -> IO ()
-setMatrix mat =
-   withMatrix mat $ \order ->
-      case order of
-         ColumnMajor -> loadMatrix
-         RowMajor    -> loadTransposeMatrix
-
-multMatrix :: (Matrix m, MatrixComponent c) => m c -> IO ()
-multMatrix mat =
-   withMatrix mat $ \order ->
-      case order of
-         ColumnMajor -> multMatrix_
-         RowMajor    -> multTransposeMatrix
-
---------------------------------------------------------------------------------
-
-data GLmatrix a = GLmatrix MatrixOrder (ForeignPtr a)
-#ifdef __HADDOCK__
--- Help Haddock a bit, because it doesn't do any instance inference.
-instance Eq (GLmatrix a)
-instance Ord (GLmatrix a)
-instance Show (GLmatrix a)
-#else
-   deriving ( Eq, Ord, Show )
-#endif
-
-instance Matrix GLmatrix where
-   withNewMatrix order f = do
-      fp <- mallocForeignPtrArray 16
-      withForeignPtr fp f
-      return $ GLmatrix order fp
-
-   withMatrix (GLmatrix order fp) f = withForeignPtr fp (f order)
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "glLoadIdentity" loadIdentity :: IO ()
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "glOrtho" ortho ::
-   GLdouble -> GLdouble -> GLdouble -> GLdouble -> GLdouble -> GLdouble -> IO ()
-
-foreign import CALLCONV unsafe "glFrustum" frustum ::
-   GLdouble -> GLdouble -> GLdouble -> GLdouble -> GLdouble -> GLdouble -> IO ()
-
---------------------------------------------------------------------------------
-
-depthClamp :: StateVar Capability
-depthClamp = makeCapability CapDepthClamp
-
---------------------------------------------------------------------------------
-
-activeTexture :: StateVar TextureUnit
-activeTexture = makeStateVar (getEnum1 unmarshalTextureUnit GetActiveTexture)
-                             (glActiveTextureARB . marshalTextureUnit)
-
-EXTENSION_ENTRY("GL_ARB_multitexture or OpenGL 1.3",glActiveTextureARB,GLenum -> IO ())   
-
---------------------------------------------------------------------------------
-
--- | Push the current matrix stack down by one, duplicating the current matrix,
--- excute the given action, and pop the current matrix stack, replacing the
--- current matrix with the one below it on the stack (i.e. restoring it to its
--- previous state). The returned value is that of the given action. Note that
--- a round-trip to the server is probably required. For a more efficient
--- version, see 'unsafePreservingMatrix'.
-
-preservingMatrix :: IO a -> IO a
-preservingMatrix = unsafePreservingMatrix . preservingMatrixMode
-
--- performance paranoia: No (un-)marshaling by avoiding matrixMode
-preservingMatrixMode :: IO a -> IO a
-preservingMatrixMode = bracket (getEnum1 id GetMatrixMode) glMatrixMode . const
-
--- | A more efficient, but potentially dangerous version of 'preservingMatrix':
--- The given action is not allowed to throw an exception or change the
--- current matrix mode permanently.
-
-unsafePreservingMatrix :: IO a -> IO a
-unsafePreservingMatrix = unsafeBracket_ glPushMatrix glPopMatrix
-
-foreign import CALLCONV unsafe "glPushMatrix" glPushMatrix :: IO ()
-
-foreign import CALLCONV unsafe "glPopMatrix" glPopMatrix :: IO ()
-
---------------------------------------------------------------------------------
-
-stackDepth :: Maybe MatrixMode -> GettableStateVar GLsizei
-stackDepth maybeMode =
-   makeGettableStateVar $
-      case maybeMode of
-         Nothing -> getSizei1 id GetCurrentMatrixStackDepth -- only with ARB_fragment_program
-         Just MatrixPalette -> do recordInvalidEnum ; return 0
-         Just mode -> getSizei1 id (matrixModeToGetStackDepth mode)
-
-maxStackDepth :: MatrixMode -> GettableStateVar GLsizei
-maxStackDepth =
-   makeGettableStateVar . getSizei1 id . matrixModeToGetMaxStackDepth
-
---------------------------------------------------------------------------------
-
--- | If 'rescaleNormal' contains 'Enabled', normal vectors specified with
--- 'Graphics.Rendering.OpenGL.GL.VertexSpec.normal' are scaled by a scaling
--- factor derived from the modelview matrix. 'rescaleNormal' requires that the
--- originally specified normals were of unit length, and that the modelview
--- matrix contains only uniform scales for proper results. The initial value of
--- 'rescaleNormal' is 'Disabled'.
-
-rescaleNormal :: StateVar Capability
-rescaleNormal = makeCapability CapRescaleNormal
-
--- | If 'normalize' contains 'Enabled', normal vectors specified with
--- 'Graphics.Rendering.OpenGL.GL.VertexSpec.normal' are scaled to unit length
--- after transformation. The initial value of 'normalize' is 'Disabled'.
-
-normalize :: StateVar Capability
-normalize = makeCapability CapNormalize
-
---------------------------------------------------------------------------------
-
-data Plane a = Plane !a !a !a !a
-   deriving ( Eq, Ord, Show )
-
-instance Storable a => Storable (Plane a) where
-   sizeOf    ~(Plane a _ _ _) = 4 * sizeOf a
-   alignment ~(Plane a _ _ _) = alignment a
-   peek                       = peek4 Plane . castPtr
-   poke ptr   (Plane a b c d) = poke4 (castPtr ptr) a b c d
-
---------------------------------------------------------------------------------
-
-data TextureCoordName =
-     S
-   | T
-   | R
-   | Q
-   deriving ( Eq, Ord, Show )
-
-marshalTextureCoordName :: TextureCoordName -> GLenum
-marshalTextureCoordName x = case x of
-   S -> 0x2000
-   T -> 0x2001
-   R -> 0x2002
-   Q -> 0x2003
-
---------------------------------------------------------------------------------
-
-data TextureGenParameter =
-     TextureGenMode
-   | ObjectPlane
-   | EyePlane
-
-marshalTextureGenParameter :: TextureGenParameter -> GLenum
-marshalTextureGenParameter x = case x of
-   TextureGenMode -> 0x2500
-   ObjectPlane -> 0x2501
-   EyePlane -> 0x2502
-
---------------------------------------------------------------------------------
-
-data TextureGenMode' =
-     EyeLinear'
-   | ObjectLinear'
-   | SphereMap'
-   | NormalMap'
-   | ReflectionMap'
-
-marshalTextureGenMode' :: TextureGenMode' -> GLint
-marshalTextureGenMode' x = case x of
-   EyeLinear' -> 0x2400
-   ObjectLinear' -> 0x2401
-   SphereMap' -> 0x2402
-   NormalMap' -> 0x8511
-   ReflectionMap' -> 0x8512
-
-unmarshalTextureGenMode' :: GLint -> TextureGenMode'
-unmarshalTextureGenMode' x
-   | x == 0x2400 = EyeLinear'
-   | x == 0x2401 = ObjectLinear'
-   | x == 0x2402 = SphereMap'
-   | x == 0x8511 = NormalMap'
-   | x == 0x8512 = ReflectionMap'
-   | otherwise = error ("unmarshalTextureGenMode': illegal value " ++ show x)
-
---------------------------------------------------------------------------------
-
-data TextureGenMode =
-     EyeLinear    (Plane GLdouble)
-   | ObjectLinear (Plane GLdouble)
-   | SphereMap
-   | NormalMap
-   | ReflectionMap
-   deriving ( Eq, Ord, Show )
-
-marshalTextureGenMode :: TextureGenMode -> GLint
-marshalTextureGenMode = marshalTextureGenMode' . convertMode
-   where convertMode (EyeLinear    _) = EyeLinear'
-         convertMode (ObjectLinear _) = ObjectLinear'
-         convertMode SphereMap        = SphereMap'
-         convertMode NormalMap        = NormalMap'
-         convertMode ReflectionMap    = ReflectionMap'
-
---------------------------------------------------------------------------------
-
-textureGenMode :: TextureCoordName -> StateVar (Maybe TextureGenMode)
-textureGenMode coord =
-   makeStateVarMaybe
-      (return $ textureCoordNameToEnableCap coord)
-      (do mode <- getMode coord
-          case mode of
-             EyeLinear'     -> fmap EyeLinear $ getPlane coord EyePlane
-             ObjectLinear'  -> fmap ObjectLinear $ getPlane coord ObjectPlane
-             SphereMap'     -> return SphereMap
-             NormalMap'     -> return NormalMap
-             ReflectionMap' -> return ReflectionMap)
-      (\mode -> do
-         setMode coord mode
-         case mode of
-            EyeLinear    plane -> setPlane coord EyePlane    plane
-            ObjectLinear plane -> setPlane coord ObjectPlane plane
-            _ -> return ())
-
---------------------------------------------------------------------------------
-
-textureCoordNameToEnableCap :: TextureCoordName -> EnableCap
-textureCoordNameToEnableCap coord = case coord of
-   S -> CapTextureGenS
-   T -> CapTextureGenT
-   R -> CapTextureGenR
-   Q -> CapTextureGenQ
-
---------------------------------------------------------------------------------
-
-getMode :: TextureCoordName -> IO TextureGenMode'
-getMode coord = alloca $ \buf -> do
-   glGetTexGeniv (marshalTextureCoordName coord)
-                 (marshalTextureGenParameter TextureGenMode)
-                 buf
-   peek1 unmarshalTextureGenMode' buf
-
-foreign import CALLCONV unsafe "glGetTexGeniv" glGetTexGeniv ::
-   GLenum -> GLenum -> Ptr GLint -> IO ()
-
-setMode :: TextureCoordName -> TextureGenMode -> IO ()
-setMode coord mode =
-   glTexGeni (marshalTextureCoordName coord)
-             (marshalTextureGenParameter TextureGenMode)
-             (marshalTextureGenMode mode)
-
-foreign import CALLCONV unsafe "glTexGeni" glTexGeni ::
-    GLenum -> GLenum -> GLint -> IO ()
-
---------------------------------------------------------------------------------
-
-getPlane :: TextureCoordName -> TextureGenParameter -> IO (Plane GLdouble)
-getPlane coord param = alloca $ \planeBuffer -> do
-   glGetTexGendv (marshalTextureCoordName coord)
-                 (marshalTextureGenParameter param)
-                 planeBuffer
-   peek planeBuffer
-
-foreign import CALLCONV unsafe "glGetTexGendv" glGetTexGendv ::
-   GLenum -> GLenum -> Ptr (Plane GLdouble) -> IO ()
-
-setPlane :: TextureCoordName -> TextureGenParameter -> Plane GLdouble -> IO ()
-setPlane coord param plane =
-   with plane $ \planeBuffer ->
-      glTexGendv (marshalTextureCoordName coord)
-                 (marshalTextureGenParameter param)
-                 planeBuffer
-
-foreign import CALLCONV unsafe "glTexGendv" glTexGendv ::
-   GLenum -> GLenum -> Ptr (Plane GLdouble) -> IO ()
diff --git a/Graphics/Rendering/OpenGL/GL/DataType.hs b/Graphics/Rendering/OpenGL/GL/DataType.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/DataType.hs
+++ /dev/null
@@ -1,126 +0,0 @@
--- #hide
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.DataType
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This is a purely internal module for (un-)marshaling DataType.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.DataType (
-   DataType(..), marshalDataType, unmarshalDataType
-) where
-
-import Graphics.Rendering.OpenGL.GL.BasicTypes ( GLenum )
-
---------------------------------------------------------------------------------
-
--- basically table 3.2 (pixel data type parameter) plus a few additions
-data DataType =
-     UnsignedByte
-   | Byte
-   | UnsignedShort
-   | Short
-   | UnsignedInt
-   | Int
-   | HalfFloat
-   | Float
-   | UnsignedByte332
-   | UnsignedByte233Rev
-   | UnsignedShort565
-   | UnsignedShort565Rev
-   | UnsignedShort4444
-   | UnsignedShort4444Rev
-   | UnsignedShort5551
-   | UnsignedShort1555Rev
-   | UnsignedInt8888
-   | UnsignedInt8888Rev
-   | UnsignedInt1010102
-   | UnsignedInt2101010Rev
-   | UnsignedInt248
-   | UnsignedInt10f11f11fRev
-   | UnsignedInt5999Rev
-   | Float32UnsignedInt248Rev
-   | Bitmap                    -- pixel data, deprecated in 3.1
-   | UnsignedShort88           -- MESA_ycbcr_texture/APPLE_ycbcr_422
-   | UnsignedShort88Rev        -- MESA_ycbcr_texture/APPLE_ycbcr_422
-   | Double                    -- vertex arrays (EXT_vertex_array, now core)
-   | TwoBytes                  -- CallLists
-   | ThreeBytes                -- CallLists
-   | FourBytes                 -- CallLists
-   deriving ( Eq, Ord, Show )
-
-marshalDataType :: DataType -> GLenum
-marshalDataType x = case x of
-   UnsignedByte -> 0x1401
-   Byte -> 0x1400
-   UnsignedShort -> 0x1403
-   Short -> 0x1402
-   UnsignedInt -> 0x1405
-   Int -> 0x1404
-   HalfFloat -> 0x140B
-   Float -> 0x1406
-   UnsignedByte332 -> 0x8032
-   UnsignedByte233Rev -> 0x8362
-   UnsignedShort565 -> 0x8363
-   UnsignedShort565Rev -> 0x8364
-   UnsignedShort4444 -> 0x8033
-   UnsignedShort4444Rev -> 0x8365
-   UnsignedShort5551 -> 0x8034
-   UnsignedShort1555Rev -> 0x8366
-   UnsignedInt8888 -> 0x8035
-   UnsignedInt8888Rev -> 0x8367
-   UnsignedInt1010102 -> 0x8036
-   UnsignedInt2101010Rev -> 0x8368
-   UnsignedInt248 -> 0x84fa
-   UnsignedInt10f11f11fRev -> 0x8C3B
-   UnsignedInt5999Rev -> 0x8C3E
-   Float32UnsignedInt248Rev -> 0x8DAD
-   Bitmap -> 0x1a00
-   UnsignedShort88 -> 0x85ba
-   UnsignedShort88Rev -> 0x85bb
-   Double -> 0x140a
-   TwoBytes -> 0x1407
-   ThreeBytes -> 0x1408
-   FourBytes -> 0x1409
-
-unmarshalDataType :: GLenum -> DataType
-unmarshalDataType x
-   | x == 0x1401 = UnsignedByte
-   | x == 0x1400 = Byte
-   | x == 0x1403 = UnsignedShort
-   | x == 0x1402 = Short
-   | x == 0x1405 = UnsignedInt
-   | x == 0x1404 = Int
-   | x == 0x140B = HalfFloat
-   | x == 0x1406 = Float
-   | x == 0x8032 = UnsignedByte332
-   | x == 0x8362 = UnsignedByte233Rev
-   | x == 0x8363 = UnsignedShort565
-   | x == 0x8364 = UnsignedShort565Rev
-   | x == 0x8033 = UnsignedShort4444
-   | x == 0x8365 = UnsignedShort4444Rev
-   | x == 0x8034 = UnsignedShort5551
-   | x == 0x8366 = UnsignedShort1555Rev
-   | x == 0x8035 = UnsignedInt8888
-   | x == 0x8367 = UnsignedInt8888Rev
-   | x == 0x8036 = UnsignedInt1010102
-   | x == 0x8368 = UnsignedInt2101010Rev
-   | x == 0x84fa = UnsignedInt248
-   | x == 0x8C3B = UnsignedInt10f11f11fRev
-   | x == 0x8C3E = UnsignedInt5999Rev
-   | x == 0x8DAD = Float32UnsignedInt248Rev
-   | x == 0x1a00 = Bitmap
-   | x == 0x85ba = UnsignedShort88
-   | x == 0x85bb = UnsignedShort88Rev
-   | x == 0x140a = Double
-   | x == 0x1407 = TwoBytes
-   | x == 0x1408 = ThreeBytes
-   | x == 0x1409 = FourBytes
-   | otherwise = error ("unmarshalDataType: illegal value " ++ show x)
diff --git a/Graphics/Rendering/OpenGL/GL/DisplayLists.hs b/Graphics/Rendering/OpenGL/GL/DisplayLists.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/DisplayLists.hs
+++ /dev/null
@@ -1,174 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.DisplayLists
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to section 5.4 (Display Lists) of the OpenGL 2.1
--- specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.DisplayLists (
-   -- * Defining Display Lists
-   DisplayList(..), ListMode(..), defineList, defineNewList, listIndex,
-   listMode, maxListNesting,
-
-   -- * Calling Display Lists
-   callList, callLists, listBase,
-
-   -- * Deprecated Functions
-   genLists, deleteLists, isList,
-) where
-
-import Foreign.Ptr ( Ptr )
-import Graphics.Rendering.OpenGL.GL.BasicTypes (
-   GLboolean, GLuint, GLsizei, GLenum )
-import Graphics.Rendering.OpenGL.GL.BufferObjects ( ObjectName(..) )
-import Graphics.Rendering.OpenGL.GL.DataType ( marshalDataType )
-import Graphics.Rendering.OpenGL.GL.VertexArrays ( DataType )
-import Graphics.Rendering.OpenGL.GL.Exception ( bracket_ )
-import Graphics.Rendering.OpenGL.GL.GLboolean ( unmarshalGLboolean )
-import Graphics.Rendering.OpenGL.GL.QueryUtils (
-   GetPName(GetListIndex,GetListMode,GetMaxListNesting,GetListBase),
-   getEnum1, getSizei1 )
-import Graphics.Rendering.OpenGL.GL.StateVar (
-   GettableStateVar, makeGettableStateVar, StateVar, makeStateVar )
-import Graphics.Rendering.OpenGL.GLU.ErrorsInternal ( recordOutOfMemory )
-
---------------------------------------------------------------------------------
-
-newtype DisplayList = DisplayList GLuint
-   deriving ( Eq, Ord, Show )
-
-instance ObjectName DisplayList where
-   genObjectNames = genLists_
-   deleteObjectNames = deleteLists_
-   isObjectName = isList_
-
---------------------------------------------------------------------------------
-
-{-# DEPRECATED genLists "use `genObjectNames' instead" #-}
-genLists :: GLsizei -> IO [DisplayList]
-genLists = genLists_ . fromIntegral
-
-genLists_ :: Int -> IO [DisplayList]
-genLists_ n = do
-   first <- glGenLists (fromIntegral n)
-   if DisplayList first == noDisplayList
-      then do recordOutOfMemory
-              return []
-      else return [ DisplayList l | l <- [ first .. first + fromIntegral n - 1 ] ]
-
-foreign import CALLCONV unsafe "glGenLists" glGenLists :: GLsizei -> IO GLuint
-
---------------------------------------------------------------------------------
-
-{-# DEPRECATED deleteLists "use `deleteObjectNames' instead" #-}
-deleteLists :: [DisplayList] -> IO ()
-deleteLists = deleteLists_
-
-deleteLists_ :: [DisplayList] -> IO ()
-deleteLists_ = mapM_ (uncurry glDeleteLists) . combineConsecutive
-
-foreign import CALLCONV unsafe "glDeleteLists" glDeleteLists ::
-   DisplayList -> GLsizei -> IO ()
-
-combineConsecutive :: [DisplayList] -> [(DisplayList, GLsizei)]
-combineConsecutive []     = []
-combineConsecutive (z:zs) = (z, len) : combineConsecutive rest
-   where (len, rest) = run (0 :: GLsizei) z zs
-         run n x xs = case n + 1 of
-                         m -> case xs of
-                                 []                          -> (m, [])
-                                 (y:ys) | x `isFollowedBy` y -> run m y ys
-                                        | otherwise          -> (m, xs)
-         DisplayList x `isFollowedBy` DisplayList y = x + 1 == y
-
---------------------------------------------------------------------------------
-
-{-# DEPRECATED isList "use `isObjectName' instead" #-}
-isList :: DisplayList -> IO Bool
-isList = isList_
-
-isList_ :: DisplayList -> IO Bool
-isList_ = fmap unmarshalGLboolean . glIsList
-
-foreign import CALLCONV unsafe "glIsList" glIsList ::
-   DisplayList -> IO GLboolean
-
---------------------------------------------------------------------------------
-
-data ListMode =
-     Compile
-   | CompileAndExecute
-   deriving ( Eq, Ord, Show )
-
-marshalListMode :: ListMode -> GLenum
-marshalListMode x = case x of
-   Compile -> 0x1300
-   CompileAndExecute -> 0x1301
-
-unmarshalListMode :: GLenum -> ListMode
-unmarshalListMode x
-   | x == 0x1300 = Compile
-   | x == 0x1301 = CompileAndExecute
-   | otherwise = error ("unmarshalListMode: illegal value " ++ show x)
-
---------------------------------------------------------------------------------
-
-defineList :: DisplayList -> ListMode -> IO a -> IO a
-defineList lst mode = bracket_ (glNewList lst (marshalListMode mode)) glEndList
-
-foreign import CALLCONV unsafe "glNewList" glNewList ::
-   DisplayList -> GLenum -> IO ()
-
-foreign import CALLCONV unsafe "glEndList" glEndList :: IO ()
-
-defineNewList :: ListMode -> IO a -> IO DisplayList
-defineNewList mode action = do
-   lists <- genLists 1
-   if null lists
-      then do recordOutOfMemory
-              return noDisplayList
-      else do let lst = head lists
-              defineList lst mode action
-              return lst
-
---------------------------------------------------------------------------------
-
-listIndex :: GettableStateVar (Maybe DisplayList)
-listIndex =
-   makeGettableStateVar
-      (do l <- getEnum1 DisplayList GetListIndex
-          return $ if l == noDisplayList then Nothing else Just l)
-
-noDisplayList :: DisplayList
-noDisplayList = DisplayList 0
-
-listMode :: GettableStateVar ListMode
-listMode = makeGettableStateVar (getEnum1 unmarshalListMode GetListMode)
-
-maxListNesting :: GettableStateVar GLsizei
-maxListNesting = makeGettableStateVar (getSizei1 id GetMaxListNesting)
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "glCallList" callList :: DisplayList -> IO ()
-
-callLists :: GLsizei -> DataType -> Ptr a -> IO ()
-callLists n = glCallLists n . marshalDataType
-
-foreign import CALLCONV unsafe "glCallLists" glCallLists ::
-   GLsizei -> GLenum -> Ptr a -> IO ()
-
---------------------------------------------------------------------------------
-
-listBase :: StateVar DisplayList
-listBase = makeStateVar (getEnum1 DisplayList GetListBase) glListBase
-
-foreign import CALLCONV unsafe "glListBase" glListBase :: DisplayList -> IO ()
diff --git a/Graphics/Rendering/OpenGL/GL/Domain.hs b/Graphics/Rendering/OpenGL/GL/Domain.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/Domain.hs
+++ /dev/null
@@ -1,138 +0,0 @@
--- #hide
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.Domain
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This is a purely internal module for handling evaluator domains.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.Domain (
-   Domain(..)
-) where
-
-import Foreign.Ptr ( Ptr )
-import Foreign.Storable ( Storable )
-import Graphics.Rendering.OpenGL.GL.BasicTypes (
-   GLenum, GLint, GLfloat, GLdouble )
-import Graphics.Rendering.OpenGL.GL.QueryUtils (
-   GetPName, getFloat2, getFloat4, getDouble2, getDouble4 )
-
---------------------------------------------------------------------------------
-
-#include "HsOpenGLTypes.h"
-
---------------------------------------------------------------------------------
-
-class Storable d => Domain d where
-   glMap1      :: GLenum -> d -> d -> GLint -> GLint -> Ptr d -> IO ()
-   glMap2      :: GLenum -> d -> d -> GLint -> GLint -> d -> d -> GLint -> GLint -> Ptr d -> IO ()
-   glGetMapv   :: GLenum -> GLenum -> Ptr d -> IO ()
-   evalCoord1  :: d -> IO ()
-   evalCoord1v :: Ptr d -> IO ()
-   evalCoord2  :: (d, d) -> IO ()
-   evalCoord2v :: Ptr d -> IO ()
-   glMapGrid1  :: GLint -> d -> d -> IO ()
-   glMapGrid2  :: GLint -> d -> d -> GLint -> d -> d -> IO ()
-   get2        :: (d -> d -> a) -> GetPName -> IO a
-   get4        :: (d -> d -> d -> d -> a) -> GetPName -> IO a
-
---------------------------------------------------------------------------------
-
-instance Domain GLfloat_ where
-   glMap1      = glMap1f
-   glMap2      = glMap2f
-   glGetMapv   = glGetMapfv
-   evalCoord1  = glEvalCoord1f
-   evalCoord1v = glEvalCoord1fv
-   evalCoord2  = uncurry glEvalCoord2f
-   evalCoord2v = glEvalCoord2fv
-   glMapGrid1  = glMapGrid1f
-   glMapGrid2  = glMapGrid2f
-   get2        = getFloat2
-   get4        = getFloat4
-
-foreign import CALLCONV unsafe "glMap1f" glMap1f ::
-      GLenum
-   -> GLfloat -> GLfloat -> GLint -> GLint
-   -> Ptr GLfloat -> IO ()
-
-foreign import CALLCONV unsafe "glMap2f" glMap2f ::
-      GLenum
-   -> GLfloat -> GLfloat -> GLint -> GLint
-   -> GLfloat -> GLfloat -> GLint -> GLint
-   -> Ptr GLfloat -> IO ()
-
-foreign import CALLCONV unsafe "glGetMapfv" glGetMapfv ::
-   GLenum -> GLenum -> Ptr GLfloat -> IO ()
-
-foreign import CALLCONV unsafe "glEvalCoord1f" glEvalCoord1f ::
-   GLfloat -> IO ()
-
-foreign import CALLCONV unsafe "glEvalCoord1fv" glEvalCoord1fv ::
-   Ptr GLfloat -> IO ()
-
-foreign import CALLCONV unsafe "glEvalCoord2f" glEvalCoord2f ::
-   GLfloat -> GLfloat -> IO ()
-
-foreign import CALLCONV unsafe "glEvalCoord2fv" glEvalCoord2fv ::
-   Ptr GLfloat -> IO ()
-
-foreign import CALLCONV unsafe "glMapGrid1f" glMapGrid1f ::
-   GLint -> GLfloat -> GLfloat -> IO ()
-
-foreign import CALLCONV unsafe "glMapGrid2f" glMapGrid2f ::
-   GLint -> GLfloat -> GLfloat -> GLint -> GLfloat -> GLfloat -> IO ()
-
---------------------------------------------------------------------------------
-
-instance Domain GLdouble_ where
-   glMap1      = glMap1d
-   glMap2      = glMap2d
-   glGetMapv   = glGetMapdv
-   evalCoord1  = glEvalCoord1d
-   evalCoord1v = glEvalCoord1dv
-   evalCoord2  = uncurry glEvalCoord2d
-   evalCoord2v = glEvalCoord2dv
-   glMapGrid1  = glMapGrid1d
-   glMapGrid2  = glMapGrid2d
-   get2        = getDouble2
-   get4        = getDouble4
-
-foreign import CALLCONV unsafe "glMap1d" glMap1d ::
-      GLenum
-   -> GLdouble -> GLdouble -> GLint -> GLint
-   -> Ptr GLdouble -> IO ()
-
-foreign import CALLCONV unsafe "glMap2d" glMap2d ::
-      GLenum
-   -> GLdouble -> GLdouble -> GLint -> GLint
-   -> GLdouble -> GLdouble -> GLint -> GLint
-   -> Ptr GLdouble -> IO ()
-
-foreign import CALLCONV unsafe "glGetMapdv" glGetMapdv ::
-   GLenum -> GLenum -> Ptr GLdouble -> IO ()
-
-foreign import CALLCONV unsafe "glEvalCoord1d" glEvalCoord1d ::
-   GLdouble -> IO ()
-
-foreign import CALLCONV unsafe "glEvalCoord1dv" glEvalCoord1dv ::
-   Ptr GLdouble -> IO ()
-
-foreign import CALLCONV unsafe "glEvalCoord2d" glEvalCoord2d ::
-   GLdouble -> GLdouble -> IO ()
-
-foreign import CALLCONV unsafe "glEvalCoord2dv" glEvalCoord2dv ::
-   Ptr GLdouble -> IO ()
-
-foreign import CALLCONV unsafe "glMapGrid1d" glMapGrid1d ::
-   GLint -> GLdouble -> GLdouble -> IO ()
-
-foreign import CALLCONV unsafe "glMapGrid2d" glMapGrid2d ::
-   GLint -> GLdouble -> GLdouble -> GLint -> GLdouble -> GLdouble -> IO ()
diff --git a/Graphics/Rendering/OpenGL/GL/EdgeFlag.hs b/Graphics/Rendering/OpenGL/GL/EdgeFlag.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/EdgeFlag.hs
+++ /dev/null
@@ -1,37 +0,0 @@
--- #hide
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.EdgeFlag
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This is a purely internal module for (un-)marshaling EdgeFlag.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.EdgeFlag (
-   EdgeFlag(..), marshalEdgeFlag, unmarshalEdgeFlag
-) where
-
-import Graphics.Rendering.OpenGL.GL.BasicTypes ( GLboolean )
-import Graphics.Rendering.OpenGL.GL.GLboolean (
-   marshalGLboolean, unmarshalGLboolean )
-
---------------------------------------------------------------------------------
-
--- | A vertex can begin an edge which lies in the interior of its polygon or on
--- the polygon\'s boundary.
-
-data EdgeFlag = BeginsInteriorEdge | BeginsBoundaryEdge
-   deriving ( Eq, Ord, Show )
-
-marshalEdgeFlag :: EdgeFlag -> GLboolean
-marshalEdgeFlag = marshalGLboolean . (BeginsBoundaryEdge ==)
-
-unmarshalEdgeFlag :: GLboolean -> EdgeFlag
-unmarshalEdgeFlag f =
-   if unmarshalGLboolean f then BeginsBoundaryEdge else BeginsBoundaryEdge
diff --git a/Graphics/Rendering/OpenGL/GL/Evaluators.hs b/Graphics/Rendering/OpenGL/GL/Evaluators.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/Evaluators.hs
+++ /dev/null
@@ -1,405 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.Evaluators
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to section 5.1 (Evaluators) of the OpenGL 2.1 specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.Evaluators (
-   -- * Evaluator-related Types
-   Order, maxOrder, Domain, MapDescriptor(..), ControlPoint,
-
-   -- * Defining Evaluator Maps
-   -- ** One-dimensional Evaluator Maps
-   Map1(..), GLmap1, map1,
-
-   -- ** Two-dimensional Evaluator Maps
-   Map2(..), GLmap2, map2,
-
-   -- * Using Evaluator Maps
-
-   -- ** Evaluating an Arbitrary Coordinate Value
-   evalCoord1, evalCoord1v, evalCoord2, evalCoord2v,
-
-   -- ** Using Evenly Spaced Coordinate Values
-
-   -- *** Defining a Grid
-   mapGrid1, mapGrid2,
-
-   -- *** Evaluating a Whole Mesh
-   evalMesh1, evalMesh2,
-
-   -- *** Evaluating a Single Point on a Mesh
-   evalPoint1, evalPoint2,
-
-   -- * Normal Generation
-   autoNormal
-) where
-
-import Control.Monad ( zipWithM_ )
-import Data.List ( genericLength )
-import Foreign.ForeignPtr ( ForeignPtr, mallocForeignPtrArray, withForeignPtr )
-import Foreign.Marshal.Alloc ( alloca )
-import Foreign.Marshal.Array ( allocaArray )
-import Foreign.Ptr ( Ptr, plusPtr )
-import Foreign.Storable ( Storable(peek,sizeOf) )
-import Graphics.Rendering.OpenGL.GL.Capability (
-   EnableCap(CapAutoNormal), makeCapability, makeStateVarMaybe )
-import Graphics.Rendering.OpenGL.GL.ControlPoint
-import Graphics.Rendering.OpenGL.GL.Domain
-import Graphics.Rendering.OpenGL.GL.BasicTypes ( GLenum, GLint, Capability )
-import Graphics.Rendering.OpenGL.GL.PeekPoke ( peek2, peek4 )
-import Graphics.Rendering.OpenGL.GL.PolygonMode ( marshalPolygonMode )
-import Graphics.Rendering.OpenGL.GL.Polygons ( PolygonMode )
-import Graphics.Rendering.OpenGL.GL.QueryUtils (
-   GetPName(GetMaxEvalOrder,
-            GetMap1GridSegments,GetMap1GridDomain,
-            GetMap2GridSegments,GetMap2GridDomain),
-   getSizei1, getInteger1, getInteger2 )
-import Graphics.Rendering.OpenGL.GL.StateVar (
-   GettableStateVar, makeGettableStateVar, StateVar, makeStateVar )
-import Graphics.Rendering.OpenGL.GL.VertexArrays ( NumComponents, Stride )
-
---------------------------------------------------------------------------------
-
-#include "HsOpenGLTypes.h"
-
---------------------------------------------------------------------------------
-
-type Order = GLint
-
-maxOrder :: GettableStateVar Order
-maxOrder = makeGettableStateVar (getSizei1 id GetMaxEvalOrder)
-
---------------------------------------------------------------------------------
-
-data Domain d => MapDescriptor d =
-   MapDescriptor (d, d) Stride Order NumComponents
-   deriving ( Eq, Ord, Show )
-
-totalComponents1 :: Domain d => MapDescriptor d -> Int
-totalComponents1 (MapDescriptor _ stride order numComp) =
-   fromIntegral stride * (fromIntegral order - 1) + fromIntegral numComp
-
-totalComponents2 :: Domain d => MapDescriptor d -> MapDescriptor d -> Int
-totalComponents2 uDescriptor vDescriptor@(MapDescriptor _ _ _ numComp) =
-   totalComponents1 uDescriptor + totalComponents1 vDescriptor - fromIntegral numComp
-
---------------------------------------------------------------------------------
-
-peekControlPoints1 ::
-   (ControlPoint c, Domain d) => MapDescriptor d -> Ptr d -> IO [c d]
-peekControlPoints1 descriptor ptr =
-   mapM peekControlPoint (controlPointPtrs1 descriptor ptr)
-
-peekControlPoints2 ::
-      (ControlPoint c, Domain d)
-   => MapDescriptor d -> MapDescriptor d -> Ptr d -> IO [[c d]]
-peekControlPoints2 uDescriptor vDescriptor ptr =
-   mapM (mapM peekControlPoint) (controlPointPtrs2 uDescriptor vDescriptor ptr)
-
-pokeControlPoints1 ::
-   (ControlPoint c, Domain d) => MapDescriptor d -> Ptr d -> [c d] -> IO ()
-pokeControlPoints1 descriptor ptr =
-   zipWithM_ pokeControlPoint (controlPointPtrs1 descriptor ptr)
-
-pokeControlPoints2 ::
-      (ControlPoint c, Domain d)
-   => MapDescriptor d -> MapDescriptor d -> Ptr d -> [[c d]] -> IO ()
-pokeControlPoints2 uDescriptor vDescriptor ptr =
-   zipWithM_ (zipWithM_ pokeControlPoint)
-             (controlPointPtrs2 uDescriptor vDescriptor ptr)
-
-controlPointPtrs1 :: Domain d => MapDescriptor d -> Ptr d -> [Ptr a]
-controlPointPtrs1 (MapDescriptor _ stride order _) ptr =
-   [ ptr `plusPtr` (o * s) | o <- [ 0 .. fromIntegral order - 1 ] ]
-   where s = sizeOfPtr ptr * fromIntegral stride
-
-controlPointPtrs2 ::
-   Domain d => MapDescriptor d -> MapDescriptor d -> Ptr d -> [[Ptr a]]
-controlPointPtrs2 uDescriptor vDescriptor ptr =
-   [ controlPointPtrs1 vDescriptor p | p <- controlPointPtrs1 uDescriptor ptr ]
-
-sizeOfPtr :: Storable a => Ptr a -> Int
-sizeOfPtr = sizeOf . (const undefined :: Ptr a -> a)
-
---------------------------------------------------------------------------------
-
-class Map1 m where
-   withNewMap1 :: (ControlPoint c, Domain d)
-      => MapDescriptor d -> (Ptr d -> IO ()) -> IO (m c d)
-
-   withMap1 :: (ControlPoint c, Domain d)
-      => m c d -> (MapDescriptor d -> Ptr d -> IO a) -> IO a
-
-   newMap1 :: (ControlPoint c, Domain d)
-      => (d, d) -> [c d] -> IO (m c d)
-
-   getMap1Components :: (ControlPoint c, Domain d)
-      => m c d -> IO ((d, d), [c d])
-
-   withNewMap1 descriptor@(MapDescriptor domain _ _ _) act = do
-      allocaArray (totalComponents1 descriptor) $ \ptr -> do
-         act ptr
-         controlPoints <- peekControlPoints1 descriptor ptr
-         newMap1 domain controlPoints
-
-   withMap1 m act = do
-      (domain, controlPoints) <- getMap1Components m
-      let stride = numComponents (head controlPoints)
-          order = genericLength controlPoints
-          descriptor = MapDescriptor domain stride order (fromIntegral stride)
-      allocaArray (totalComponents1 descriptor) $ \ptr -> do
-         pokeControlPoints1 descriptor ptr controlPoints
-         act descriptor ptr
-
-   newMap1 domain controlPoints = do
-      let stride = numComponents (head controlPoints)
-          order = genericLength controlPoints
-          descriptor = MapDescriptor domain stride order (fromIntegral stride)
-      withNewMap1 descriptor $ \ptr ->
-         pokeControlPoints1 descriptor ptr controlPoints
-
-   getMap1Components m =
-      withMap1 m $ \descriptor@(MapDescriptor domain _ _ _) ptr -> do
-         controlPoints <- peekControlPoints1 descriptor ptr
-         return (domain, controlPoints)
-
---------------------------------------------------------------------------------
-
-data (ControlPoint c, Domain d) => GLmap1 c d =
-   GLmap1 (MapDescriptor d) (ForeignPtr d)
-#ifdef __HADDOCK__
--- Help Haddock a bit, because it doesn't do any instance inference.
-instance Eq d => Eq (GLmap1 c d)
-instance Ord d => Ord (GLmap1 c d)
-instance Show d => Show (GLmap1 c d)
-#else
-   deriving ( Eq, Ord, Show )
-#endif
-
-instance Map1 GLmap1 where
-   withNewMap1 descriptor act = do
-      fp <- mallocForeignPtrArray (totalComponents1 descriptor)
-      withForeignPtr fp act
-      return $ GLmap1 descriptor fp
-
-   withMap1 (GLmap1 descriptor fp) act =
-      withForeignPtr fp $ act descriptor
-
---------------------------------------------------------------------------------
- 
-map1 :: (Map1 m, ControlPoint c, Domain d) => StateVar (Maybe (m c d))
-map1 = makeMap1StateVar enableCap1 getMap1 setMap1
-
-makeMap1StateVar ::
-      (c d -> EnableCap) -> (c d -> IO (m c d)) -> (c d -> m c d -> IO ())
-   -> StateVar (Maybe (m c d))
-makeMap1StateVar getCap getAct setAct =
-   makeStateVarMaybe
-      (return (getCap undefined))
-      (getAct undefined)
-      (setAct undefined)
-
-getMap1 :: (Map1 m, ControlPoint c, Domain d) => c d -> IO (m c d)
-getMap1 dummyControlPoint = do
-   let target = map1Target dummyControlPoint
-       numComp = fromIntegral (numComponents dummyControlPoint)
-   domain <- allocaArray 2 $ \ptr -> do
-      glGetMapv target (marshalGetMapQuery Domain) ptr
-      peek2 (,) ptr
-   order <- alloca $ \ptr -> do
-      glGetMapiv target (marshalGetMapQuery Order) ptr
-      fmap fromIntegral $ peek ptr
-   withNewMap1 (MapDescriptor domain (numComponents dummyControlPoint) order numComp) $
-      glGetMapv target (marshalGetMapQuery Coeff)
-
-setMap1 :: (Map1 m, ControlPoint c, Domain d) => c d -> m c d -> IO ()
-setMap1 dummyControlPoint m =
-   withMap1 m $ \(MapDescriptor (u1, u2) stride order _) ->
-      glMap1 (map1Target dummyControlPoint) u1 u2
-             (fromIntegral stride) (fromIntegral order)
-
---------------------------------------------------------------------------------
-
-class Map2 m where
-   withNewMap2 :: (ControlPoint c, Domain d)
-      => MapDescriptor d -> MapDescriptor d -> (Ptr d -> IO ()) -> IO (m c d)
-
-   withMap2 :: (ControlPoint c, Domain d)
-      => m c d -> (MapDescriptor d -> MapDescriptor d -> Ptr d -> IO a) -> IO a
-
-   newMap2 :: (ControlPoint c, Domain d)
-      => (d, d) -> (d, d) -> [[c d]] -> IO (m c d)
-
-   getMap2Components :: (ControlPoint c, Domain d)
-      => m c d -> IO ((d, d), (d, d), [[c d]])
-
-   withNewMap2 uDescriptor@(MapDescriptor uDomain _ _ _)
-               vDescriptor@(MapDescriptor vDomain _ _ _) act =
-      allocaArray (totalComponents2 uDescriptor vDescriptor) $ \ptr -> do
-         act ptr
-         controlPoints <- peekControlPoints2 uDescriptor vDescriptor ptr
-         newMap2 uDomain vDomain controlPoints
-
-   withMap2 m act = do
-      (uDomain, vDomain, controlPoints) <- getMap2Components m
-      let vStride = numComponents (head (head controlPoints))
-          vOrder = genericLength (head controlPoints)
-          uStride = vStride * fromIntegral vOrder
-          uOrder = genericLength controlPoints
-          numComp = fromIntegral vStride
-          uDescriptor = MapDescriptor uDomain uStride uOrder numComp
-          vDescriptor = MapDescriptor vDomain vStride vOrder numComp
-      allocaArray (totalComponents2 uDescriptor vDescriptor) $ \ptr -> do
-         pokeControlPoints2 uDescriptor vDescriptor ptr controlPoints
-         act uDescriptor vDescriptor ptr
-
-   newMap2 uDomain vDomain controlPoints = do
-      let vStride = numComponents (head (head controlPoints))
-          vOrder = genericLength (head controlPoints)
-          uStride = vStride * fromIntegral vOrder
-          uOrder = genericLength controlPoints
-          numComp = fromIntegral vStride
-          uDescriptor = MapDescriptor uDomain uStride uOrder numComp
-          vDescriptor = MapDescriptor vDomain vStride vOrder numComp
-      withNewMap2 uDescriptor vDescriptor $ \ptr ->
-         pokeControlPoints2 uDescriptor vDescriptor ptr controlPoints
-
-   getMap2Components m =
-      withMap2 m $ \uDescriptor@(MapDescriptor uDomain _ _ _)
-                    vDescriptor@(MapDescriptor vDomain _ _ _) ptr -> do
-         controlPoints <- peekControlPoints2 uDescriptor vDescriptor ptr
-         return (uDomain, vDomain, controlPoints)
-
---------------------------------------------------------------------------------
-
-data (ControlPoint c, Domain d) => GLmap2 c d =
-   GLmap2 (MapDescriptor d)  (MapDescriptor d) (ForeignPtr d)
-#ifdef __HADDOCK__
--- Help Haddock a bit, because it doesn't do any instance inference.
-instance Eq d => Eq (GLmap2 c d)
-instance Ord d => Ord (GLmap2 c d)
-instance Show d => Show (GLmap2 c d)
-#else
-   deriving ( Eq, Ord, Show )
-#endif
-
-instance Map2 GLmap2 where
-   withNewMap2 uDescriptor vDescriptor act = do
-      fp <- mallocForeignPtrArray (totalComponents2 uDescriptor vDescriptor)
-      withForeignPtr fp act
-      return $ GLmap2 uDescriptor vDescriptor fp
-
-   withMap2 (GLmap2 uDescriptor vDescriptor fp) act =
-      withForeignPtr fp $ act uDescriptor vDescriptor
-
---------------------------------------------------------------------------------
-
-map2 :: (Map2 m, ControlPoint c, Domain d) => StateVar (Maybe (m c d))
-map2 = makeMap2StateVar enableCap2 getMap2 setMap2
-
-makeMap2StateVar ::
-      (c d -> EnableCap) -> (c d -> IO (m c d)) -> (c d -> m c d -> IO ())
-   -> StateVar (Maybe (m c d))
-makeMap2StateVar getCap getAct setAct =
-   makeStateVarMaybe
-      (return (getCap undefined))
-      (getAct undefined)
-      (setAct undefined)
-
-getMap2 :: (Map2 m, ControlPoint c, Domain d) => c d -> IO (m c d)
-getMap2 dummyControlPoint = do
-   let target = map2Target dummyControlPoint
-   (uDomain, vDomain) <- allocaArray 4 $ \ptr -> do
-      glGetMapv target (marshalGetMapQuery Domain) ptr
-      peek4 (\u1 u2 v1 v2 -> ((u1, u2), (v1, v2))) ptr
-   (uOrder, vOrder) <- allocaArray 2 $ \ptr -> do
-      glGetMapiv target (marshalGetMapQuery Order) ptr
-      peek2 (,) ptr
-   let vStride = numComponents dummyControlPoint
-       uStride = vStride * fromIntegral vOrder
-   withNewMap2 (MapDescriptor uDomain uStride uOrder (fromIntegral vStride))
-               (MapDescriptor vDomain vStride vOrder (fromIntegral vStride)) $
-      glGetMapv target (marshalGetMapQuery Coeff)
-
-setMap2 :: (Map2 m, ControlPoint c, Domain d) => c d -> m c d -> IO ()
-setMap2 dummyControlPoint m =
-   withMap2 m $ \(MapDescriptor (u1, u2) uStride uOrder _)
-                 (MapDescriptor (v1, v2) vStride vOrder _) ->
-      glMap2 (map2Target dummyControlPoint)
-             u1 u2 (fromIntegral uStride) (fromIntegral uOrder)
-             v1 v2 (fromIntegral vStride) (fromIntegral vOrder)
-
---------------------------------------------------------------------------------
-
-data GetMapQuery =
-     Coeff
-   | Order
-   | Domain
-
-marshalGetMapQuery :: GetMapQuery -> GLenum
-marshalGetMapQuery x = case x of
-   Coeff -> 0xa00
-   Order -> 0xa01
-   Domain -> 0xa02
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "glGetMapiv" glGetMapiv ::
-   GLenum -> GLenum -> Ptr GLint -> IO ()
-
---------------------------------------------------------------------------------
-
-mapGrid1 :: Domain d => StateVar (GLint, (d, d))
-mapGrid1 =
-   makeStateVar
-      (do n <- getInteger1 id GetMap1GridSegments
-          domain <- get2 (,) GetMap1GridDomain
-          return (n, domain))
-      (\(n, (u1, u2)) -> glMapGrid1 n u1 u2)
-
-mapGrid2 :: Domain d => StateVar ((GLint, (d, d)), (GLint, (d, d)))
-mapGrid2 =
-   makeStateVar
-      (do (un, vn) <- getInteger2 (,) GetMap2GridSegments
-          (u1, u2, v1, v2) <- get4 (,,,) GetMap2GridDomain
-          return ((un, (u1, u2)), (vn, (v1, v2))))
-      (\((un, (u1, u2)), (vn, (v1, v2))) -> glMapGrid2 un u1 u2 vn v1 v2)
-
---------------------------------------------------------------------------------
-
-evalMesh1 :: PolygonMode -> (GLint, GLint) -> IO ()
-evalMesh1 m (p1, p2) = glEvalMesh1 (marshalPolygonMode m) p1 p2
-
-foreign import CALLCONV unsafe "glEvalMesh1" glEvalMesh1 ::
-   GLenum -> GLint -> GLint -> IO ()
-
-evalMesh2 :: PolygonMode -> (GLint, GLint) -> (GLint, GLint) -> IO ()
-evalMesh2 m (p1, p2) (q1, q2) = glEvalMesh2 (marshalPolygonMode m) p1 p2 q1 q2
-
-foreign import CALLCONV unsafe "glEvalMesh2" glEvalMesh2 ::
-   GLenum -> GLint -> GLint -> GLint -> GLint -> IO ()
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "glEvalPoint1" evalPoint1 ::
-   GLint -> IO ()
-
-evalPoint2 :: (GLint, GLint) -> IO ()
-evalPoint2 = uncurry glEvalPoint2
-
-foreign import CALLCONV unsafe "glEvalPoint2" glEvalPoint2 ::
-   GLint -> GLint -> IO ()
-
---------------------------------------------------------------------------------
-
-autoNormal :: StateVar Capability
-autoNormal = makeCapability CapAutoNormal
diff --git a/Graphics/Rendering/OpenGL/GL/Exception.hs b/Graphics/Rendering/OpenGL/GL/Exception.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/Exception.hs
+++ /dev/null
@@ -1,54 +0,0 @@
--- #hide
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.Exception
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This is a purely internal module to compensate for differences between
--- Haskell implementations.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.Exception (
-   bracket, bracket_, unsafeBracket_, finallyRet
-) where
-
-import Data.IORef ( newIORef, readIORef, writeIORef )
-
-#ifdef __NHC__
-import qualified IO ( bracket, bracket_ )
-
-{-# INLINE bracket #-}
-bracket  :: IO a -> (a -> IO b) -> (a -> IO c) -> IO c
-bracket = IO.bracket
-
-{-# INLINE bracket_ #-}
-bracket_ :: IO a -> IO b -> IO c -> IO c
-bracket_ before = IO.bracket_ before . const
-
-finally :: IO a -> IO b -> IO a
-finally = flip . bracket_ . return $ undefined
-#else
-import Control.Exception ( bracket, bracket_, finally )
-#endif
-
-{-# INLINE unsafeBracket_ #-}
-unsafeBracket_ :: IO a -> IO b -> IO c -> IO c
-unsafeBracket_ before after thing = do
-   before
-   r <- thing
-   after
-   return r
-
-{-# INLINE finallyRet #-}
-finallyRet :: IO a -> IO b -> IO (a, b)
-a `finallyRet` sequel = do
-   r2Ref <- newIORef undefined
-   r1 <- a `finally` (sequel >>= writeIORef r2Ref)
-   r2 <- readIORef r2Ref
-   return (r1, r2)
diff --git a/Graphics/Rendering/OpenGL/GL/Extensions.hs b/Graphics/Rendering/OpenGL/GL/Extensions.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/Extensions.hs
+++ /dev/null
@@ -1,47 +0,0 @@
--- #hide
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.Extensions
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This is a purely internal module for handling the OpenGL extension
--- mechanism.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.Extensions (
-   FunPtr, unsafePerformIO,
-   Invoker, getProcAddress   -- used only internally
-) where
-
-import Foreign.C.String ( CString, withCString )
-import Foreign.Ptr ( FunPtr, nullFunPtr )
-import System.IO.Unsafe ( unsafePerformIO )
-
-#ifdef __HUGS__
-{-# CFILES cbits/HsOpenGL.c #-}
-#endif
-
---------------------------------------------------------------------------------
-
-type Invoker a = FunPtr a -> a
-
-getProcAddress :: String -> String -> IO (FunPtr a)
-getProcAddress ext call =
-   throwIfNull ("unknown OpenGL call " ++ call ++ ", check for " ++ ext) $
-      withCString call hs_OpenGL_getProcAddress
-
-throwIfNull :: String -> IO (FunPtr a) -> IO (FunPtr a)
-throwIfNull msg act = do
-   res <- act
-   if res == nullFunPtr
-      then ioError (userError msg)
-      else return res
-
-foreign import ccall unsafe "hs_OpenGL_getProcAddress" hs_OpenGL_getProcAddress
-   :: CString -> IO (FunPtr a)
diff --git a/Graphics/Rendering/OpenGL/GL/Face.hs b/Graphics/Rendering/OpenGL/GL/Face.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/Face.hs
+++ /dev/null
@@ -1,41 +0,0 @@
--- #hide
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.Face
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This is a purely internal module for (un-)marshaling Face.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.Face (
-   Face(..), marshalFace, unmarshalFace
-) where
-
-import Graphics.Rendering.OpenGL.GL.BasicTypes ( GLenum )
-
---------------------------------------------------------------------------------
-
-data Face =
-     Front
-   | Back
-   | FrontAndBack
-   deriving ( Eq, Ord, Show )
-
-marshalFace :: Face -> GLenum
-marshalFace x = case x of
-   Front -> 0x404
-   Back -> 0x405
-   FrontAndBack -> 0x408
-
-unmarshalFace :: GLenum -> Face
-unmarshalFace x
-   | x == 0x404 = Front
-   | x == 0x405 = Back
-   | x == 0x408 = FrontAndBack
-   | otherwise = error ("unmarshalFace: illegal value " ++ show x)
diff --git a/Graphics/Rendering/OpenGL/GL/Feedback.hs b/Graphics/Rendering/OpenGL/GL/Feedback.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/Feedback.hs
+++ /dev/null
@@ -1,203 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.Feedback
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to section 5.3 (Feedback) of the OpenGL 2.1 specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.Feedback (
-   FeedbackToken(..), VertexInfo(..), ColorInfo, FeedbackType(..),
-   getFeedbackTokens, PassThroughValue(..), passThrough
-) where
-
-import Control.Monad ( liftM2, liftM3, liftM4 )
-import Foreign.Marshal.Array ( allocaArray )
-import Foreign.Ptr ( Ptr, plusPtr )
-import Foreign.Storable ( Storable(sizeOf) )
-import Graphics.Rendering.OpenGL.GL.BasicTypes (
-   GLenum, GLint, GLsizei, GLfloat )
-import Graphics.Rendering.OpenGL.GL.IOState (
-   IOState, getIOState, peekIOState, evalIOState, nTimes )
-import Graphics.Rendering.OpenGL.GL.RenderMode ( withRenderMode )
-import Graphics.Rendering.OpenGL.GL.Selection ( RenderMode(Feedback) )
-import Graphics.Rendering.OpenGL.GL.StateVar ( HasGetter(get) )
-import Graphics.Rendering.OpenGL.GL.VertexSpec (
-   Vertex2(..), Vertex3(..), Vertex4(..), Index1(..), Color4(..),
-   TexCoord4(..), rgbaMode )
-
---------------------------------------------------------------------------------
-
-data FeedbackToken =
-     PointToken VertexInfo
-   | LineToken VertexInfo VertexInfo
-   | LineResetToken VertexInfo VertexInfo
-   | PolygonToken [VertexInfo]
-   | BitmapToken VertexInfo
-   | DrawPixelToken VertexInfo
-   | CopyPixelToken VertexInfo
-   | PassThroughToken PassThroughValue
-   deriving ( Eq, Ord, Show )
-
-data VertexInfo =
-     Vertex2D             (Vertex2 GLfloat)
-   | Vertex3D             (Vertex3 GLfloat)
-   | Vertex3DColor        (Vertex3 GLfloat) ColorInfo
-   | Vertex3DColorTexture (Vertex3 GLfloat) ColorInfo (TexCoord4 GLfloat)
-   | Vertex4DColorTexture (Vertex4 GLfloat) ColorInfo (TexCoord4 GLfloat)
-   deriving ( Eq, Ord, Show )
-
-type ColorInfo = Either (Index1 GLint) (Color4 GLfloat)
-
---------------------------------------------------------------------------------
-
-data FeedbackTag =
-     PointTag
-   | LineTag
-   | LineResetTag
-   | PolygonTag
-   | BitmapTag
-   | DrawPixelTag
-   | CopyPixelTag
-   | PassThroughTag
-
-unmarshalFeedbackTag :: GLenum -> FeedbackTag
-unmarshalFeedbackTag x
-   | x == 0x701 = PointTag
-   | x == 0x702 = LineTag
-   | x == 0x707 = LineResetTag
-   | x == 0x703 = PolygonTag
-   | x == 0x704 = BitmapTag
-   | x == 0x705 = DrawPixelTag
-   | x == 0x706 = CopyPixelTag
-   | x == 0x700 = PassThroughTag
-   | otherwise = error ("unmarshalFeedbackTag: illegal value " ++ show x)
-
---------------------------------------------------------------------------------
-
-data FeedbackType =
-     TwoD
-   | ThreeD
-   | ThreeDColor
-   | ThreeDColorTexture
-   | FourDColorTexture
-   deriving ( Eq, Ord, Show )
-
-marshalFeedbackType :: FeedbackType -> GLenum
-marshalFeedbackType x = case x of
-   TwoD -> 0x600
-   ThreeD -> 0x601
-   ThreeDColor -> 0x602
-   ThreeDColorTexture -> 0x603
-   FourDColorTexture -> 0x604
-
---------------------------------------------------------------------------------
-
-getFeedbackTokens ::
-   GLsizei -> FeedbackType -> IO a -> IO (a, Maybe [FeedbackToken])
-getFeedbackTokens bufSize feedbackType action =
-   allocaArray (fromIntegral bufSize) $ \buf -> do
-      glFeedbackBuffer bufSize (marshalFeedbackType feedbackType) buf
-      (value, numValues) <- withRenderMode Feedback action
-      tokens <- parseFeedbackBuffer numValues buf feedbackType
-      return (value, tokens)
-
-foreign import CALLCONV unsafe "glFeedbackBuffer" glFeedbackBuffer ::
-   GLsizei -> GLenum -> Ptr GLfloat -> IO ()
-
---------------------------------------------------------------------------------
-
-parseFeedbackBuffer ::
-   GLint -> Ptr GLfloat -> FeedbackType -> IO (Maybe [FeedbackToken])
-parseFeedbackBuffer numValues buf feedbackType
-   | numValues < 0 = return Nothing
-   | otherwise     = do
-      rgba <- get rgbaMode
-      let end = buf `plusPtr`
-                  (sizeOf (undefined :: GLfloat) * fromIntegral numValues)
-          infoParser = calcInfoParser feedbackType (calcColorParser rgba)
-          loop tokens = do
-             ptr <- getIOState
-             if ptr == end
-                then return (reverse tokens)
-                else do token <- tokenParser infoParser
-                        loop (token : tokens)
-      fmap Just $ evalIOState (loop []) buf
-
-type Parser a = IOState GLfloat a
-
-tokenParser :: Parser VertexInfo -> Parser FeedbackToken
-tokenParser infoParser = do
-   tag <- parseGLenum
-   case unmarshalFeedbackTag tag of
-      PointTag -> fmap PointToken infoParser
-      LineTag -> liftM2 LineToken infoParser infoParser
-      LineResetTag -> liftM2 LineResetToken infoParser infoParser
-      PolygonTag -> do n <- parseGLint; fmap PolygonToken (nTimes n infoParser)
-      BitmapTag -> fmap BitmapToken infoParser
-      DrawPixelTag -> fmap DrawPixelToken infoParser
-      CopyPixelTag -> fmap CopyPixelToken infoParser
-      PassThroughTag -> fmap PassThroughToken parsePassThroughValue
-
-calcInfoParser :: FeedbackType -> Parser ColorInfo -> Parser VertexInfo
-calcInfoParser feedbackType colorParser = case feedbackType of
-   TwoD ->
-      fmap Vertex2D parseVertex2
-   ThreeD ->
-      fmap Vertex3D parseVertex3
-   ThreeDColor ->
-      liftM2 Vertex3DColor parseVertex3 colorParser
-   ThreeDColorTexture ->
-      liftM3 Vertex3DColorTexture parseVertex3 colorParser parseTexCoord4
-   FourDColorTexture ->
-      liftM3 Vertex4DColorTexture parseVertex4 colorParser parseTexCoord4
-
-parseVertex2 :: Parser (Vertex2 GLfloat)
-parseVertex2 = liftM2 Vertex2 parseGLfloat parseGLfloat
-
-parseVertex3 :: Parser (Vertex3 GLfloat)
-parseVertex3 = liftM3 Vertex3 parseGLfloat parseGLfloat parseGLfloat
-
-parseVertex4 :: Parser (Vertex4 GLfloat)
-parseVertex4 =
-   liftM4 Vertex4 parseGLfloat parseGLfloat parseGLfloat parseGLfloat
-
-calcColorParser :: Bool -> Parser ColorInfo
-calcColorParser False = fmap Left parseIndex1
-calcColorParser True  = fmap Right parseColor4
-
-parseIndex1 :: Parser (Index1 GLint)
-parseIndex1 = fmap Index1 parseGLint
-
-parseColor4 :: Parser (Color4 GLfloat)
-parseColor4 = liftM4 Color4 parseGLfloat parseGLfloat parseGLfloat parseGLfloat
-
-parseTexCoord4 :: Parser (TexCoord4 GLfloat)
-parseTexCoord4 =
-   liftM4 TexCoord4 parseGLfloat parseGLfloat parseGLfloat parseGLfloat
-
-parsePassThroughValue :: Parser PassThroughValue
-parsePassThroughValue = fmap PassThroughValue parseGLfloat
-
-parseGLenum :: Parser GLenum
-parseGLenum = fmap round parseGLfloat
-
-parseGLint :: Parser GLint
-parseGLint = fmap round parseGLfloat
-
-parseGLfloat :: Parser GLfloat
-parseGLfloat = peekIOState
-
---------------------------------------------------------------------------------
-
-newtype PassThroughValue = PassThroughValue GLfloat
-   deriving ( Eq, Ord, Show )
-
-foreign import CALLCONV unsafe "glPassThrough" passThrough ::
-   PassThroughValue -> IO ()
diff --git a/Graphics/Rendering/OpenGL/GL/FlushFinish.hs b/Graphics/Rendering/OpenGL/GL/FlushFinish.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/FlushFinish.hs
+++ /dev/null
@@ -1,46 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.FlushFinish
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to section 5.5 (Flush and Finish) of the OpenGL 2.1
--- specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.FlushFinish (
-   flush, finish      
-) where
-
---------------------------------------------------------------------------------
-
--- | Different GL implementations buffer commands in several different
--- locations, including network buffers and the graphics accelerator itself.
--- '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.
--- 
--- Because any GL program might be executed over a network, or on an accelerator
--- that buffers commands, all programs should call 'flush' whenever they count
--- on having all of their previously issued commands completed. For example,
--- call 'flush' before waiting for user input that depends on the generated
--- image.
--- 
--- Note that 'flush' can return at any time. It does not wait until the
--- execution of all previously issued GL commands is complete.
-
-foreign import CALLCONV unsafe "glFlush" flush :: IO ()
-
--- | '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.
--- 
--- Note that 'finish' requires a round trip to the server.
-
-foreign import CALLCONV unsafe "glFinish" finish :: IO ()
diff --git a/Graphics/Rendering/OpenGL/GL/Fog.hs b/Graphics/Rendering/OpenGL/GL/Fog.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/Fog.hs
+++ /dev/null
@@ -1,206 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.Fog
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to section 3.10 (Fog) of the OpenGL 2.1 specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.Fog (
-   fog,
-   FogMode(..), fogMode,
-   fogColor, fogIndex,
-   FogCoordSrc(..), fogCoordSrc,
-   FogDistanceMode(..), fogDistanceMode
-) where
-
-import Foreign.Marshal.Utils ( with )
-import Foreign.Ptr ( Ptr )
-import Graphics.Rendering.OpenGL.GL.Capability (
-   EnableCap(CapFog), makeCapability )
-import Graphics.Rendering.OpenGL.GL.BasicTypes (
-   GLenum, GLint, GLfloat, Capability )
-import Graphics.Rendering.OpenGL.GL.QueryUtils (
-   GetPName(GetFogIndex,GetFogDensity,GetFogStart,GetFogEnd,GetFogMode,
-   GetFogColor,GetFogCoordSrc,GetFogDistanceMode),
-   getInteger1, getFloat1, getFloat4 )
-import Graphics.Rendering.OpenGL.GL.StateVar ( StateVar, makeStateVar )
-import Graphics.Rendering.OpenGL.GL.VertexSpec (
-   Color4(Color4), Index1(Index1) )
-
---------------------------------------------------------------------------------
-
-fog :: StateVar Capability
-fog = makeCapability CapFog
-
---------------------------------------------------------------------------------
-
-data FogParameter =
-     FogIndex
-   | FogDensity
-   | FogStart
-   | FogEnd
-   | FogMode
-   | FogColor
-   | FogCoordSrc
-   | FogDistanceMode
-
-marshalFogParameter :: FogParameter -> GLenum
-marshalFogParameter x = case x of
-   FogIndex -> 0xb61
-   FogDensity -> 0xb62
-   FogStart -> 0xb63
-   FogEnd -> 0xb64
-   FogMode -> 0xb65
-   FogColor -> 0xb66
-   FogCoordSrc -> 0x8450
-   FogDistanceMode -> 0x855a
-
---------------------------------------------------------------------------------
-
-data FogMode' =
-     Linear'
-   | Exp'
-   | Exp2'
-
-marshalFogMode' :: FogMode' -> GLint
-marshalFogMode' x = case x of
-   Linear' -> 0x2601
-   Exp' -> 0x800
-   Exp2' -> 0x801
-
-unmarshalFogMode' :: GLint -> FogMode'
-unmarshalFogMode' x
-   | x == 0x2601 = Linear'
-   | x == 0x800 = Exp'
-   | x == 0x801 = Exp2'
-   | otherwise = error ("unmarshalFogMode': illegal value " ++ show x)
-
---------------------------------------------------------------------------------
-
-data FogMode =
-     Linear GLfloat GLfloat
-   | Exp GLfloat
-   | Exp2 GLfloat
-   deriving ( Eq, Ord, Show )
-
---------------------------------------------------------------------------------
-
-fogMode :: StateVar FogMode
-fogMode = makeStateVar getFogMode setFogMode
-
-getFogMode :: IO FogMode
-getFogMode = do
-   mode <- getInteger1 unmarshalFogMode' GetFogMode
-   case mode of
-      Linear' -> do
-         start <- getFloat1 id GetFogStart
-         end <- getFloat1 id GetFogEnd
-         return $ Linear start end
-      Exp' -> getFloat1 Exp GetFogDensity
-      Exp2' -> getFloat1 Exp2 GetFogDensity
-
-setFogMode :: FogMode -> IO ()
-setFogMode (Linear start end) = do
-   fogi FogMode (marshalFogMode' Linear')
-   fogf FogStart start
-   fogf FogEnd end
-setFogMode (Exp density) = do
-   fogi FogMode (marshalFogMode' Exp')
-   fogf FogDensity density
-setFogMode (Exp2 density) = do
-   fogi FogMode (marshalFogMode' Exp2')
-   fogf FogDensity density
-
---------------------------------------------------------------------------------
-
-fogi :: FogParameter -> GLint -> IO ()
-fogi = glFogi . marshalFogParameter
-
-foreign import CALLCONV unsafe "glFogi" glFogi :: GLenum -> GLint -> IO ()
-
-fogf :: FogParameter -> GLfloat -> IO ()
-fogf = glFogf . marshalFogParameter
-
-foreign import CALLCONV unsafe "glFogf" glFogf :: GLenum -> GLfloat -> IO ()
-
-fogfv :: FogParameter -> Ptr (Color4 GLfloat) -> IO ()
-fogfv = glFogfv . marshalFogParameter
-
-foreign import CALLCONV unsafe "glFogfv" glFogfv ::
-   GLenum -> Ptr (Color4 GLfloat) -> IO ()
-
---------------------------------------------------------------------------------
-
-fogColor :: StateVar (Color4 GLfloat)
-fogColor =
-   makeStateVar (getFloat4 Color4 GetFogColor) (\c -> with c $ fogfv FogColor)
-
---------------------------------------------------------------------------------
-
-fogIndex :: StateVar (Index1 GLint)
-fogIndex =
-   makeStateVar
-      (getInteger1 Index1 GetFogIndex)
-      (\(Index1 i) -> fogi FogIndex i)
-
---------------------------------------------------------------------------------
-
-data FogCoordSrc =
-     FogCoord
-   | FragmentDepth
-   deriving ( Eq, Ord, Show )
-
-marshalFogCoordSrc :: FogCoordSrc -> GLint
-marshalFogCoordSrc x = case x of
-   FogCoord -> 0x8451
-   FragmentDepth -> 0x8452
-
-unmarshalFogCoordSrc :: GLint -> FogCoordSrc
-unmarshalFogCoordSrc x
-   | x == 0x8451 = FogCoord
-   | x == 0x8452 = FragmentDepth
-   | otherwise = error ("unmarshalFogCoordSrc: illegal value " ++ show x)
-
---------------------------------------------------------------------------------
-
-fogCoordSrc :: StateVar FogCoordSrc
-fogCoordSrc =
-   makeStateVar
-      (getInteger1 unmarshalFogCoordSrc GetFogCoordSrc)
-      (fogi FogCoordSrc . marshalFogCoordSrc)
-
---------------------------------------------------------------------------------
-
-data FogDistanceMode =
-     EyeRadial
-   | EyePlaneSigned
-   | EyePlaneAbsolute
-   deriving ( Eq, Ord, Show )
-
-marshalFogDistanceMode :: FogDistanceMode -> GLint
-marshalFogDistanceMode x = case x of
-   EyeRadial -> 0x855b
-   EyePlaneSigned -> 0x2502
-   EyePlaneAbsolute -> 0x855c
-
-unmarshalFogDistanceMode :: GLint -> FogDistanceMode
-unmarshalFogDistanceMode x
-   | x== 0x855b = EyeRadial
-   | x == 0x2502 = EyePlaneSigned
-   | x == 0x855c = EyePlaneAbsolute
-   | otherwise = error ("unmarshalFogDistanceMode: illegal value " ++ show x)
-
---------------------------------------------------------------------------------
-
-fogDistanceMode :: StateVar FogDistanceMode
-fogDistanceMode =
-   makeStateVar
-      (getInteger1 unmarshalFogDistanceMode GetFogDistanceMode)
-      (fogi FogDistanceMode . marshalFogDistanceMode)
diff --git a/Graphics/Rendering/OpenGL/GL/Framebuffer.hs b/Graphics/Rendering/OpenGL/GL/Framebuffer.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/Framebuffer.hs
+++ /dev/null
@@ -1,470 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.Framebuffer
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to section 4.2 (Whole Framebuffer Operations) of the
--- OpenGL 2.1 specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.Framebuffer (
-   -- * Querying the Buffer Configuration
-   auxBuffers, doubleBuffer, stereoBuffer,
-   rgbaBits, stencilBits, depthBits, accumBits, rgbaSignedComponents,
-
-   -- * Selecting a Buffer for Writing
-   BufferMode(..), drawBuffer, drawBuffers, maxDrawBuffers,
-
-   -- * Fine Control of Buffer Updates
-   indexMask, colorMask, stencilMask, stencilMaskSeparate, depthMask,
-
-   -- * Clearing the Buffers
-   ClearBuffer(..), clear,
-   clearColor, clearIndex, clearStencil, clearDepth, clearAccum,
-
-   -- * The Accumulation Buffer
-   AccumOp(..), accum
-) where
-
-import Control.Monad ( liftM4 )
-import Data.List ( genericLength )
-import Data.Maybe ( isJust, fromJust )
-import Foreign.Marshal.Array ( withArray )
-import Foreign.Ptr ( Ptr )
-import Graphics.Rendering.OpenGL.GL.BufferMode (
-   BufferMode(..), marshalBufferMode, unmarshalBufferMode )
-import Graphics.Rendering.OpenGL.GL.Capability (
-   marshalCapability, unmarshalCapability )
-import Graphics.Rendering.OpenGL.GL.BasicTypes (
-   GLboolean, GLenum, GLsizei, GLint, GLuint, GLbitfield, GLfloat, GLclampf,
-   GLclampd,
-#ifdef __HADDOCK__
-   Capability(..)
-#else
-   Capability
-#endif
-   )
-import Graphics.Rendering.OpenGL.GL.Extensions (
-   FunPtr, unsafePerformIO, Invoker, getProcAddress )
-import Graphics.Rendering.OpenGL.GL.Face ( Face, marshalFace )
-import Graphics.Rendering.OpenGL.GL.GLboolean ( unmarshalGLboolean )
-import Graphics.Rendering.OpenGL.GL.QueryUtils (
-   GetPName(GetAuxBuffers,GetDoublebuffer,GetStereo,GetRedBits,GetGreenBits,
-            GetBlueBits,GetAlphaBits,GetStencilBits,GetDepthBits,
-            GetAccumRedBits,GetAccumGreenBits,GetAccumBlueBits,
-            GetAccumAlphaBits,GetRGBASignedComponents,GetDrawBuffer,
-            GetIndexWritemask,GetColorWritemask,GetDepthWritemask,
-            GetStencilWritemask,GetColorClearValue,GetIndexClearValue,
-            GetDepthClearValue,GetStencilClearValue,GetAccumClearValue,
-            GetMaxDrawBuffers,GetDrawBufferN),
-   getInteger1, getInteger4, getBoolean1, getBoolean4, getEnum1, getSizei1,
-   getFloat1, getFloat4, getDouble1 )
-import Graphics.Rendering.OpenGL.GL.StateVar (
-   HasGetter(get), GettableStateVar, makeGettableStateVar,
-   SettableStateVar, makeSettableStateVar,
-   StateVar, makeStateVar )
-import Graphics.Rendering.OpenGL.GL.VertexSpec (
-   Color4(Color4), Index1(Index1) )
-import Graphics.Rendering.OpenGL.GLU.ErrorsInternal ( recordInvalidValue )
-
---------------------------------------------------------------------------------
-
-#include "HsOpenGLExt.h"
-
---------------------------------------------------------------------------------
-
--- | The implementation and context dependent number of auxiliary buffers.
-
-auxBuffers :: GettableStateVar GLsizei
-auxBuffers = makeGettableStateVar $ getSizei1 id GetAuxBuffers
-
--- | 'True' if front and back buffers exist.
-
-doubleBuffer :: GettableStateVar Bool
-doubleBuffer =
-   makeGettableStateVar $ getBoolean1 unmarshalGLboolean GetDoublebuffer
-
--- | 'True' if left and right buffers exist.
-
-stereoBuffer :: GettableStateVar Bool
-stereoBuffer =
-    makeGettableStateVar $ getBoolean1 unmarshalGLboolean GetStereo
-
-rgbaBits :: GettableStateVar (Color4 GLsizei)
-rgbaBits =
-   makeGettableStateVar $
-      liftM4 Color4 (getSizei1 id GetRedBits)
-                    (getSizei1 id GetGreenBits)
-                    (getSizei1 id GetBlueBits)
-                    (getSizei1 id GetAlphaBits)
-
-stencilBits :: GettableStateVar GLsizei
-stencilBits = makeGettableStateVar $ getSizei1 id GetStencilBits
-
-depthBits :: GettableStateVar GLsizei
-depthBits = makeGettableStateVar $ getSizei1 id GetDepthBits
-
-accumBits :: GettableStateVar (Color4 GLsizei)
-accumBits =
-   makeGettableStateVar $
-      liftM4 Color4 (getSizei1 id GetAccumRedBits)
-                    (getSizei1 id GetAccumGreenBits)
-                    (getSizei1 id GetAccumBlueBits)
-                    (getSizei1 id GetAccumAlphaBits)
-
-rgbaSignedComponents :: GettableStateVar (Color4 Bool)
-rgbaSignedComponents =
-   makeGettableStateVar $
-      getInteger4 (\r g b a -> Color4 (unmarshalGLboolean r)
-                                      (unmarshalGLboolean g)
-                                      (unmarshalGLboolean b)
-                                      (unmarshalGLboolean a))
-                  GetRGBASignedComponents
-
---------------------------------------------------------------------------------
-
--- | When colors are written to the framebuffer, they are written into the color
--- buffers specified by 'drawBuffer'.
--- 
--- If more than one color buffer is selected for drawing, then blending or
--- logical operations are computed and applied independently for each color
--- buffer and can produce different results in each buffer.
---
--- Monoscopic contexts include only left buffers, and stereoscopic contexts
--- include both left and right buffers. Likewise, single-buffered contexts
--- include only front buffers, and double-buffered contexts include both front
--- and back buffers. The context is selected at GL initialization.
---
--- The initial value is 'FrontBuffers' for single-buffered contexts, and
--- 'BackBuffers' for double-buffered contexts.
-
-drawBuffer :: StateVar BufferMode
-drawBuffer =
-   makeStateVar
-      (getEnum1 unmarshalBufferMode GetDrawBuffer)
-      (maybe recordInvalidValue glDrawBuffer . marshalBufferMode)
-
-foreign import CALLCONV unsafe "glDrawBuffer" glDrawBuffer ::
-   GLenum -> IO ()
-
---------------------------------------------------------------------------------
-
--- | 'drawBuffers' defines the draw buffers to which all fragment colors are
--- written. The draw buffers being defined correspond in order to the respective
--- fragment colors. The draw buffer for fragment colors beyond those specified
--- is set to 'NoBuffers'.
---
--- Except for 'NoBuffers', a buffer may not appear more then once in the given
--- list. Specifying a buffer more then once will result in an
--- 'Graphics.Rendering.OpenGL.GLU.Errors.InvalidOperation'.
---
--- If fixed-function fragment shading is being performed, 'drawBuffers'
--- specifies a set of draw buffers into which the fragment color is written.
---
--- If a fragment shader writes to @gl_FragColor@, 'drawBuffers' specifies a set
--- of draw buffers into which the single fragment color defined by
--- @gl_FragColor@ is written. If a fragment shader writes to @gl_FragData@,
--- 'drawBuffers' specifies a set of draw buffers into which each of the multiple
--- fragment colors defined by @gl_FragData@ are separately written. If a
--- fragment shader writes to neither @gl_FragColor@ nor @gl_FragData@, the
--- values of the fragment colors following shader execution are undefined, and
--- may differ for each fragment color.
-
-drawBuffers :: StateVar [BufferMode]
-drawBuffers = makeStateVar getDrawBuffers setDrawBuffers
-
-getDrawBuffers :: IO [BufferMode]
-getDrawBuffers = do
-   n <- get maxDrawBuffers
-   mapM (getEnum1 unmarshalBufferMode . GetDrawBufferN) [ 0 .. n ]
-
-setDrawBuffers :: [BufferMode] -> IO ()
-setDrawBuffers modes = do
-   let ms = map marshalBufferMode modes
-   if all isJust ms
-      then withArray (map fromJust ms) $
-              glDrawBuffers (genericLength ms)
-      else recordInvalidValue
-
-EXTENSION_ENTRY("GL_ARB_draw_buffers or OpenGL 2.0",glDrawBuffers,GLsizei -> Ptr GLenum -> IO ())
-
---------------------------------------------------------------------------------
-
--- | Contains the maximum number of buffers that can activated via 'drawBuffers'
--- or which can be simultaneously written into from within a fragment shader
--- using the special output variable array @gl_FragData@. This constant
--- effectively defines the size of the @gl_FragData@ array. The minimum legal
--- value is 1.
-
-maxDrawBuffers :: GettableStateVar GLsizei
-maxDrawBuffers = makeGettableStateVar $ getSizei1 id GetMaxDrawBuffers
-
---------------------------------------------------------------------------------
-
--- | Controls the writing of individual bits in the color index buffers. The
--- least significant /n/ bits of its value, where /n/ is the number of bits in a
--- color index buffer, specify a mask.  Where a 1 appears in the mask, it is
--- possible to write to the corresponding bit in the color index buffer (or
--- buffers). Where a 0 appears, the corresponding bit is write-protected.
---
--- This mask is used only in color index mode, and it affects only the buffers
--- currently selected for writing (see 'drawBuffer'). Initially, all bits are
--- enabled for writing.
-
-indexMask :: StateVar GLuint
-indexMask =
-   makeStateVar (getInteger1 fromIntegral GetIndexWritemask) glIndexMask
-
-foreign import CALLCONV unsafe "glIndexMask" glIndexMask :: GLuint -> IO ()
-
---------------------------------------------------------------------------------
-
--- | Controls whether the individual color components in the framebuffer can or
--- cannot be written. If the red flag is 'Disabled', 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. Initially, all color
--- components can be written.
---
--- Changes to individual bits of components cannot be controlled. Rather,
--- changes are either enabled or disabled for entire color components.
--- Furthermore, this mask is used only in RGBA mode.
-
-colorMask :: StateVar (Color4 Capability)
-colorMask =
-   makeStateVar
-      (getBoolean4 (\r g b a -> Color4 (unmarshalCapability r)
-                                       (unmarshalCapability g)
-                                       (unmarshalCapability b)
-                                       (unmarshalCapability a))
-                                      GetColorWritemask)
-      (\(Color4 r g b a) -> glColorMask (marshalCapability r)
-                                        (marshalCapability g)
-                                        (marshalCapability b)
-                                        (marshalCapability a))
-
-foreign import CALLCONV unsafe "glColorMask" glColorMask ::
-   GLboolean -> GLboolean -> GLboolean -> GLboolean -> IO ()
-
---------------------------------------------------------------------------------
-
--- | Controls whether the depth buffer is enabled for writing. The initial state
--- is 'Enabled'.
-
-depthMask :: StateVar Capability
-depthMask = makeStateVar (getBoolean1 unmarshalCapability GetDepthWritemask)
-                         (glDepthMask . marshalCapability)
-
-foreign import CALLCONV unsafe "glDepthMask" glDepthMask :: GLboolean -> IO ()
-
---------------------------------------------------------------------------------
-
--- | Controls the writing of individual bits in the stencil planes. The least
--- significant /n/ bits of its value, where /n/ is the number of bits in the
--- stencil buffer, specify a mask. Where a 1 appears in the mask, it is
--- 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.
-
-stencilMask :: StateVar GLuint
-stencilMask =
-   makeStateVar (getInteger1 fromIntegral GetStencilWritemask) glStencilMask
-
-foreign import CALLCONV unsafe "glStencilMask" glStencilMask :: GLuint -> IO ()
-
-stencilMaskSeparate :: Face -> SettableStateVar GLuint
-stencilMaskSeparate face =
-   makeSettableStateVar $
-      glStencilMaskSeparate (marshalFace face)
-
-EXTENSION_ENTRY("OpenGL 2.0",glStencilMaskSeparate,GLenum -> GLuint -> IO ())
-
---------------------------------------------------------------------------------
-
--- | The buffers which can be cleared with 'clear'.
-
-data ClearBuffer =
-     ColorBuffer   -- ^ The buffers currently enabled for color writing.
-   | AccumBuffer   -- ^ The accumulation buffer.
-   | StencilBuffer -- ^ The stencil buffer.
-   | DepthBuffer   -- ^ The depth buffer.
-   deriving ( Eq, Ord, Show )
-
-marshalClearBuffer :: ClearBuffer -> GLbitfield
-marshalClearBuffer x = case x of
-   ColorBuffer -> 0x4000
-   AccumBuffer -> 0x200
-   StencilBuffer -> 0x400
-   DepthBuffer -> 0x100
-
---------------------------------------------------------------------------------
-
--- | Set the bitplane area of the window to values previously selected by
--- 'clearColor', 'clearIndex', 'clearDepth', 'clearStencil', and 'clearAccum'.
--- Multiple color buffers can be cleared simultaneously by selecting more than
--- one buffer at a time using 'drawBuffer'.
---
--- The pixel ownership test, the scissor test, dithering, and the buffer
--- writemasks affect the operation of 'clear'. The scissor box bounds the
--- cleared region. Alpha function, blend function, logical operation,
--- stenciling, texure mapping, and depth-buffering are ignored by 'clear'.
---
--- 'clear' takes a list of buffers, indicating which buffers are to be cleared.
--- If a buffer is not present, then a 'clear' directed at that buffer has no
--- effect.
---
--- The value to which each buffer is cleared depends on the setting of the clear
--- value for that buffer.
-
-clear :: [ClearBuffer] -> IO ()
-clear = glClear . sum . map marshalClearBuffer
-
-foreign import CALLCONV unsafe "glClear" glClear :: GLbitfield -> IO ()
-
---------------------------------------------------------------------------------
-
--- | Controls the red, green, blue, and alpha values used by 'clear' to clear
--- the color buffers. Values written into 'clearColor' are clamped to the range
--- [0, 1]. Initially, all values are 0.
-
-clearColor :: StateVar (Color4 GLclampf)
-clearColor = makeStateVar (getFloat4 Color4 GetColorClearValue)
-                          (\(Color4 r g b a) -> glClearColor r g b a)
-
-foreign import CALLCONV unsafe "glClearColor" glClearColor ::
-    GLclampf -> GLclampf -> GLclampf -> GLclampf -> IO ()
-
---------------------------------------------------------------------------------
-
--- | Controls the index /c/ used by 'clear' 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 framebuffer. Initially, the value is 0.
-
-clearIndex :: StateVar (Index1 GLfloat)
-clearIndex = makeStateVar (getFloat1 Index1 GetIndexClearValue)
-                          (\(Index1 i) -> glClearIndex i)
-
-foreign import CALLCONV unsafe "glClearIndex" glClearIndex :: GLfloat -> IO ()
-
---------------------------------------------------------------------------------
-
--- | Controls the depth value used by 'clear' to clear the depth buffer. Values
--- written into 'clearDepth' are clamped to the range [0, 1]. The initial value
--- is 1.
-
-clearDepth :: StateVar GLclampd
-clearDepth = makeStateVar (getDouble1 id GetDepthClearValue) glClearDepth
-
-foreign import CALLCONV unsafe "glClearDepth" glClearDepth :: GLclampd -> IO ()
-
---------------------------------------------------------------------------------
-
--- | Controls the value /s/ used by 'clear' to clear the stencil buffer. /s/ is
--- masked with 2^/m/-1, where /m/ is the number of bits in the stencil buffer.
--- Initially, the value is 0.
-
-clearStencil :: StateVar GLint
-clearStencil = makeStateVar (getInteger1 id GetStencilClearValue) glClearStencil
-
-foreign import CALLCONV unsafe "glClearStencil" glClearStencil :: GLint -> IO ()
-
---------------------------------------------------------------------------------
-
--- | Controls the red, green, blue, and alpha values used by 'clear' to clear
--- the accumulation buffer. Values written into 'clearAccum' are clamped to the
--- range [-1, 1]. The initial values are all 0.
-
-clearAccum :: StateVar (Color4 GLfloat)
-clearAccum =
-   makeStateVar (getFloat4 Color4 GetAccumClearValue)
-                (\(Color4 r g b a) -> glClearAccum r g b a)
-
-foreign import CALLCONV unsafe "glClearAccum" glClearAccum ::
-   GLfloat -> GLfloat -> GLfloat -> GLfloat -> IO ()
-
---------------------------------------------------------------------------------
-
--- | An operation on the accumulation buffer.
-
-data AccumOp =
-     Accum
-     -- ^ Obtains /R/, /G/, /B/, and /A/ values from the buffer currently
-     -- selected for reading (see
-     -- 'Graphics.Rendering.OpenGL.GL.ReadCopyPixels.readBuffer'). Each
-     -- component value is divided by 2^/n/-1, where /n/ is the number of bits
-     -- allocated to each color component in the currently selected buffer. The
-     -- result is a floating-point value in the range [0, 1], which is
-     -- multiplied by the value given to 'accum' and added to the corresponding
-     -- pixel component in the accumulation buffer, thereby updating the
-     -- accumulation buffer.
-   | Load
-     -- ^ Similar to 'Accum', except that the current value in the accumulation
-     -- buffer is not used in the calculation of the new value. That is, the
-     -- /R/, /G/, /B/, and /A/ values from the currently selected buffer are
-     -- divided by 2^/n/-1, multiplied by the value given to 'accum', and then
-     -- stored in the corresponding accumulation buffer cell, overwriting the
-     -- current value.
-   | Return
-     -- ^ Transfers accumulation buffer values to the color buffer or buffers
-     -- currently selected for writing. Each /R/, /G/, /B/, and /A/ component
-     -- is multiplied by the value given to 'accum', then multiplied by 2^/n/-1,
-     -- clamped to the range [0, 2^/n/-1], and stored in the corresponding
-     -- display buffer cell. The only fragment operations that are applied to
-     -- this transfer are pixel ownership, scissor, dithering, and color
-     -- writemasks.
-   | Mult
-     -- ^ Multiplies each /R/, /G/, /B/, and /A/ in the accumulation buffer by
-     -- the value given to 'accum' and returns the scaled component to its
-     -- corresponding accumulation buffer location.
-   | Add
-     -- ^ Adds the value given to 'accum' to each /R/, /G/, /B/, and /A/ in the
-     -- accumulation buffer.
-   deriving ( Eq, Ord, Show )
-
-marshalAccumOp :: AccumOp -> GLenum
-marshalAccumOp x = case x of
-   Accum -> 0x100
-   Load -> 0x101
-   Return -> 0x102
-   Mult -> 0x103
-   Add -> 0x104
-
---------------------------------------------------------------------------------
-
--- | 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.
---
--- Each pixel in the accumulation buffer consists of red, green, blue, and alpha
--- values. The number of bits per component in the accumulation buffer depends
--- on the implementation (see 'accumBits'). Regardless of the number of bits per
--- component, the range of values stored by each component is [-1, 1]. The
--- accumulation buffer pixels are mapped one-to-one with frame buffer pixels.
---
--- 'accum' operates on the accumulation buffer. The first argument selects an
--- accumulation buffer operation. The second argument, is a floating-point value
--- to be used in that operation, see 'AccumOp'.
---
--- All accumulation buffer operations are limited to the area of the current
--- scissor box and applied identically to the red, green, blue, and alpha
--- components of each pixel. If an 'accum' operation results in a value outside
--- the range [-1, 1], the contents of an accumulation buffer pixel component
--- are undefined.
---
--- To clear the accumulation buffer, use 'clearAccum' to specify the clear
--- value, then call 'clear' with the accumulation buffer enabled.
-
-accum :: AccumOp -> GLfloat -> IO ()
-accum = glAccum . marshalAccumOp
-
-foreign import CALLCONV unsafe "glAccum" glAccum :: GLenum -> GLfloat -> IO ()
diff --git a/Graphics/Rendering/OpenGL/GL/GLboolean.hs b/Graphics/Rendering/OpenGL/GL/GLboolean.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/GLboolean.hs
+++ /dev/null
@@ -1,27 +0,0 @@
--- #hide
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.GLboolean
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This is a purely internal module for (un-)marshaling GLboolean.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.GLboolean (
-   marshalGLboolean, unmarshalGLboolean
-) where
-
---------------------------------------------------------------------------------
-
-marshalGLboolean :: Num a => Bool -> a
-marshalGLboolean False = 0
-marshalGLboolean True  = 1
-
-unmarshalGLboolean :: Num a => a -> Bool
-unmarshalGLboolean = (/= 0)
diff --git a/Graphics/Rendering/OpenGL/GL/Hints.hs b/Graphics/Rendering/OpenGL/GL/Hints.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/Hints.hs
+++ /dev/null
@@ -1,94 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.Hints
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to section 5.6 (Hints) of the OpenGL 2.1 specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.Hints (
-   HintTarget(..), HintMode(..), hint
-) where
-
-import Graphics.Rendering.OpenGL.GL.BasicTypes ( GLenum )
-import Graphics.Rendering.OpenGL.GL.QueryUtils (
-   GetPName(GetPerspectiveCorrectionHint,GetPointSmoothHint,GetLineSmoothHint,
-            GetPolygonSmoothHint,GetFogHint,GetGenerateMipmapHint,
-            GetTextureCompressionHint,GetPackCMYKHint,GetUnpackCMYKHint),
-   getEnum1 )
-import Graphics.Rendering.OpenGL.GL.StateVar ( StateVar, makeStateVar )
-
---------------------------------------------------------------------------------
-
-data HintTarget =
-     PerspectiveCorrection
-   | PointSmooth
-   | LineSmooth
-   | PolygonSmooth
-   | Fog
-   | GenerateMipmap
-   | TextureCompression
-   | PackCMYK
-   | UnpackCMYK
-   deriving ( Eq, Ord, Show )
-
-marshalHintTarget :: HintTarget -> GLenum
-marshalHintTarget x = case x of
-   PerspectiveCorrection -> 0xc50
-   PointSmooth -> 0xc51
-   LineSmooth -> 0xc52
-   PolygonSmooth -> 0xc53
-   Fog -> 0xc54
-   GenerateMipmap -> 0x8192
-   TextureCompression -> 0x84ef
-   PackCMYK -> 0x800e
-   UnpackCMYK -> 0x800f
-
-hintTargetToGetPName :: HintTarget -> GetPName
-hintTargetToGetPName x = case x of
-   PerspectiveCorrection -> GetPerspectiveCorrectionHint
-   PointSmooth -> GetPointSmoothHint
-   LineSmooth -> GetLineSmoothHint
-   PolygonSmooth -> GetPolygonSmoothHint
-   Fog -> GetFogHint
-   GenerateMipmap -> GetGenerateMipmapHint
-   TextureCompression -> GetTextureCompressionHint
-   PackCMYK -> GetPackCMYKHint
-   UnpackCMYK -> GetUnpackCMYKHint
-
---------------------------------------------------------------------------------
-
-data HintMode =
-     DontCare
-   | Fastest
-   | Nicest
-   deriving ( Eq, Ord, Show )
-
-marshalHintMode :: HintMode -> GLenum
-marshalHintMode x = case x of
-   DontCare -> 0x1100
-   Fastest -> 0x1101
-   Nicest -> 0x1102
-
-unmarshalHintMode :: GLenum -> HintMode
-unmarshalHintMode x
-   | x == 0x1100 = DontCare
-   | x == 0x1101 = Fastest
-   | x == 0x1102 = Nicest
-   | otherwise = error ("unmarshalHintMode: illegal value " ++ show x)
-
---------------------------------------------------------------------------------
-
-hint ::  HintTarget -> StateVar HintMode
-hint t =
-   makeStateVar
-      (getEnum1 unmarshalHintMode (hintTargetToGetPName t))
-      (glHint (marshalHintTarget t) . marshalHintMode)
-
-foreign import CALLCONV unsafe "glHint" glHint :: GLenum -> GLenum -> IO ()
diff --git a/Graphics/Rendering/OpenGL/GL/IOState.hs b/Graphics/Rendering/OpenGL/GL/IOState.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/IOState.hs
+++ /dev/null
@@ -1,56 +0,0 @@
--- #hide
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.IOState
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This is a purely internal module for an IO monad with a pointer as an
--- additional state, basically a /StateT (Ptr s) IO a/.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.IOState (
-   IOState(..), getIOState, peekIOState, evalIOState, nTimes
-) where
-
-import Foreign.Ptr ( Ptr, plusPtr )
-import Foreign.Storable ( Storable(sizeOf,peek) )
-
---------------------------------------------------------------------------------
-
-newtype IOState s a = IOState { runIOState :: Ptr s -> IO (a, Ptr s) }
-
-instance Functor (IOState s) where
-   fmap f m = IOState $ \s -> do (x, s') <- runIOState m s ; return (f x, s')
-
-instance Monad (IOState s) where
-   return a = IOState $ \s -> return (a, s)
-   m >>= k  = IOState $ \s -> do (a, s') <- runIOState m s ; runIOState (k a) s'
-   fail str = IOState $ \_ -> fail str
-
-getIOState :: IOState s (Ptr s)
-getIOState = IOState $ \s -> return (s, s)
-
-putIOState :: Ptr s -> IOState s ()
-putIOState s = IOState $ \_ -> return ((), s)
-
-peekIOState :: Storable a => IOState a a
-peekIOState = do
-   ptr <- getIOState
-   x <- liftIOState $ peek ptr
-   putIOState (ptr `plusPtr` sizeOf x)
-   return x
-
-liftIOState :: IO a -> IOState s a
-liftIOState m = IOState $ \s -> do a <- m ; return (a, s)
-
-evalIOState :: IOState s a -> Ptr s -> IO a
-evalIOState m s = do (a, _) <- runIOState m s ; return a
-
-nTimes :: Integral a => a -> IOState b c -> IOState b [c]
-nTimes n = sequence . replicate (fromIntegral n)
diff --git a/Graphics/Rendering/OpenGL/GL/LineSegments.hs b/Graphics/Rendering/OpenGL/GL/LineSegments.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/LineSegments.hs
+++ /dev/null
@@ -1,162 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.LineSegments
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to section 3.4 (Line Segments) of the OpenGL 2.1
--- specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.LineSegments (
-   -- * Line Rasterization
-   lineWidth,
-
-   -- * Line Stipple
-   lineStipple,
-
-   -- * Line Antialiasing
-  lineSmooth,
-
-   -- * Implementation-Dependent Limits
-   aliasedLineWidthRange, smoothLineWidthRange, smoothLineWidthGranularity
-) where
-
-import Control.Monad ( liftM2 )
-import Graphics.Rendering.OpenGL.GL.Capability (
-   EnableCap(CapLineSmooth,CapLineStipple), makeCapability, makeStateVarMaybe )
-import Graphics.Rendering.OpenGL.GL.BasicTypes (
-   GLint, GLushort, GLfloat, Capability )
-import Graphics.Rendering.OpenGL.GL.QueryUtils (
-   GetPName(GetLineWidth,GetAliasedLineWidthRange,GetSmoothLineWidthRange,
-            GetSmoothLineWidthGranularity,GetLineStippleRepeat,
-            GetLineStipplePattern),
-   getInteger1, getFloat1, getFloat2 )
-import Graphics.Rendering.OpenGL.GL.StateVar (
-   GettableStateVar, makeGettableStateVar, StateVar, makeStateVar )
-
---------------------------------------------------------------------------------
-
--- | 'lineWidth' contains the rasterized width of both aliased and antialiased
--- lines. The initial value is 1. Using a line width other than 1 has different
--- effects, depending on whether line antialiasing is enabled (see
--- 'lineSmooth'). Line antialiasing is initially disabled.
---
--- If line antialiasing is disabled, the actual width is determined by rounding
--- the supplied width to the nearest integer. (If the rounding results in the
--- value 0, it is as if the line width were 1.) If /delta x/ >= /delta y/, /i/
--- pixels are filled in each column that is rasterized, where /i/ is the
--- rounded value of 'lineWidth'. Otherwise, /i/ pixels are filled in each row
--- that is rasterized.
---
--- If antialiasing is enabled, line rasterization produces a fragment for each
--- pixel square that intersects the region lying within the rectangle having
--- width equal to the current line width, length equal to the actual length of
--- the line, and centered on the mathematical line segment. The coverage value
--- for each fragment is the window coordinate area of the intersection of the
--- rectangular region with the corresponding pixel square. This value is saved
--- and used in the final rasterization step.
---
--- Not all widths can be supported when line antialiasing is enabled. If an
--- unsupported width is requested, the nearest supported width is used. Only
--- width 1 is guaranteed to be supported; others depend on the implementation.
---  Likewise, there is a range for aliased line widths as well. To query the
--- range of supported widths of antialiased lines and the size difference
--- between supported widths within the range, query 'smoothLineWidthRange' and
--- 'smoothLineWidthGranularity', respectively. For aliased lines, query the
--- supported range with 'aliasedLineWidthRange'.
---
--- The line width specified when 'lineWidth' is set is always returned when it
--- is queried. Clamping and rounding for aliased and antialiased lines have no
--- effect on the specified value.
---
--- A non-antialiased line width may be clamped to an implementation-dependent
--- maximum.  Query 'aliasedLineWidthRange' to determine the maximum width.
---
--- An 'Graphics.Rendering.OpenGL.GLU.Errors.InvalidValue' is generated if
--- 'lineWidth' is set to a value less than or equal to zero.
---
--- An 'Graphics.Rendering.OpenGL.GLU.Errors.InvalidOperation' is generated if
--- 'lineWidth' is set during
--- 'Graphics.Rendering.OpenGL.GL.BeginEnd.renderPrimitive'.
-
-lineWidth :: StateVar GLfloat
-lineWidth = makeStateVar (getFloat1 id GetLineWidth) glLineWidth
-
-foreign import CALLCONV unsafe "glLineWidth" glLineWidth :: GLfloat -> IO ()
-
---------------------------------------------------------------------------------
-
--- | Line stippling masks out certain fragments produced by rasterization; those
--- fragments will not be drawn. The masking is achieved by using three
--- parameters: the repeat count (1st element of the 'lineStipple' pair, clamped
--- to the range [ 1 .. 256 ]), the 16-bit line stipple pattern (2nd element),
--- and an integer stipple counter /s/.
---
--- The counter /s/ is reset to 0 at before the first action during
--- 'Graphics.Rendering.OpenGL.GL.BeginEnd.renderPrimitive' is called and before
--- each line segment during
--- 'Graphics.Rendering.OpenGL.GL.BeginEnd.renderPrimitive' is generated. It is
--- incremented after each fragment of a unit width aliased line segment is
--- generated or after each /i/ fragments of an /i/ width line segment are
--- generated. The /i/ fragments associated with count /s/ are masked out if
--- @'Data.Bits.testBit' /pattern/ (( /s/ \/ /factor/ ) /mod/ 16)@ is 'False',
--- otherwise these fragments are sent to the frame buffer. Bit zero of the
--- pattern is the least significant bit, i.e. it is used first.
---
--- Antialiased lines are treated as a sequence of rectangles of height 1 for
--- purposes of stippling. Whether rectangle /s/ is rasterized or not depends on
--- the fragment rule described for aliased lines, counting rectangles rather
--- than groups of fragments.
---
--- The initial value of 'lineStipple' is 'Nothing', i.e. line stippling is
--- disabled.
---
--- An 'Graphics.Rendering.OpenGL.GLU.Errors.InvalidOperation' is generated if
--- 'lineStipple' is set during
--- 'Graphics.Rendering.OpenGL.GL.BeginEnd.renderPrimitive'.
-
-lineStipple :: StateVar (Maybe (GLint, GLushort))
-lineStipple =
-   makeStateVarMaybe
-      (return CapLineStipple)
-      (liftM2 (,) (getInteger1 id GetLineStippleRepeat)
-                  (getInteger1 fromIntegral GetLineStipplePattern))
-      (uncurry glLineStipple)
-
-foreign import CALLCONV unsafe "glLineStipple" glLineStipple ::
-   GLint -> GLushort -> IO ()
-
---------------------------------------------------------------------------------
-
--- | Controls whether line antialiasing is enabled. The initial state is
--- 'Graphics.Rendering.OpenGL.GL.BasicTypes.Disabled'.
-
-lineSmooth :: StateVar Capability
-lineSmooth = makeCapability CapLineSmooth
-
---------------------------------------------------------------------------------
-
--- | The smallest and largest supported width of aliased lines.
-
-aliasedLineWidthRange :: GettableStateVar (GLfloat, GLfloat)
-aliasedLineWidthRange =
-   makeGettableStateVar $ getFloat2 (,) GetAliasedLineWidthRange
-
--- | The smallest and largest supported width of antialiased lines.
-
-smoothLineWidthRange :: GettableStateVar (GLfloat, GLfloat)
-smoothLineWidthRange =
-   makeGettableStateVar $ getFloat2 (,) GetSmoothLineWidthRange
-
--- | The antialiased line width granularity, i.e. the size difference between
--- supported widths.
-
-smoothLineWidthGranularity :: GettableStateVar GLfloat
-smoothLineWidthGranularity =
-   makeGettableStateVar $ getFloat1 id GetSmoothLineWidthGranularity
diff --git a/Graphics/Rendering/OpenGL/GL/PeekPoke.hs b/Graphics/Rendering/OpenGL/GL/PeekPoke.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/PeekPoke.hs
+++ /dev/null
@@ -1,107 +0,0 @@
--- #hide
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.PeekPoke
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This is a purely internal module with peek- and poke-related utilities.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.PeekPoke (
-   poke1, poke2, poke3, poke4,
-   peek1, peek2, peek3, peek4,
-   peek1M, peek2M, peek3M, peek4M
-) where
-
-import Foreign.Ptr ( Ptr )
-import Foreign.Storable ( Storable(peekElemOff,pokeElemOff) )
-
---------------------------------------------------------------------------------
--- The implementation is little bit verbose/redundant, but seems to generate
--- better code than mapM/zipWithM_.
-
---------------------------------------------------------------------------------
-
-{-# INLINE poke1 #-}
-poke1 :: Storable a => Ptr a -> a -> IO ()
-poke1 ptr x =
-   pokeElemOff ptr 0 x
-
-{-# INLINE poke2 #-}
-poke2 :: Storable a => Ptr a -> a -> a -> IO ()
-poke2 ptr x y = do
-   pokeElemOff ptr 0 x
-   pokeElemOff ptr 1 y
-
-{-# INLINE poke3 #-}
-poke3 :: Storable a => Ptr a -> a -> a -> a -> IO ()
-poke3 ptr x y z = do
-   pokeElemOff ptr 0 x
-   pokeElemOff ptr 1 y
-   pokeElemOff ptr 2 z
-
-{-# INLINE poke4 #-}
-poke4 :: Storable a => Ptr a -> a -> a -> a -> a -> IO ()
-poke4 ptr x y z w = do
-   pokeElemOff ptr 0 x
-   pokeElemOff ptr 1 y
-   pokeElemOff ptr 2 z
-   pokeElemOff ptr 3 w
-
---------------------------------------------------------------------------------
-
-{-# INLINE peek1 #-}
-peek1 :: Storable a => (a -> b) -> Ptr a -> IO b
-peek1 f ptr = do
-   x <- peekElemOff ptr 0
-   return $ f x
-
-{-# INLINE peek2 #-}
-peek2 :: Storable a => (a -> a -> b) -> Ptr a -> IO b
-peek2 f = peek2M $ \x y -> return (f x y)
-
-{-# INLINE peek3 #-}
-peek3 :: Storable a => (a -> a -> a -> b) -> Ptr a -> IO b
-peek3 f = peek3M $ \x y z -> return (f x y z)
-
-{-# INLINE peek4 #-}
-peek4 :: Storable a => (a -> a -> a -> a -> b) -> Ptr a -> IO b
-peek4 f = peek4M $ \x y z w -> return (f x y z w)
-
---------------------------------------------------------------------------------
-
-{-# INLINE peek1M #-}
-peek1M :: Storable a => (a -> IO b) -> Ptr a -> IO b
-peek1M f ptr = do
-   x <- peekElemOff ptr 0
-   f x
-
-{-# INLINE peek2M #-}
-peek2M :: Storable a => (a -> a -> IO b) -> Ptr a -> IO b
-peek2M f ptr = do
-   x <- peekElemOff ptr 0
-   y <- peekElemOff ptr 1
-   f x y
-
-{-# INLINE peek3M #-}
-peek3M :: Storable a => (a -> a -> a -> IO b) -> Ptr a -> IO b
-peek3M f ptr = do
-   x <- peekElemOff ptr 0
-   y <- peekElemOff ptr 1
-   z <- peekElemOff ptr 2
-   f x y z
-
-{-# INLINE peek4M #-}
-peek4M :: Storable a => (a -> a -> a -> a -> IO b) -> Ptr a -> IO b
-peek4M f ptr = do
-   x <- peekElemOff ptr 0
-   y <- peekElemOff ptr 1
-   z <- peekElemOff ptr 2
-   w <- peekElemOff ptr 3
-   f x y z w
diff --git a/Graphics/Rendering/OpenGL/GL/PerFragment.hs b/Graphics/Rendering/OpenGL/GL/PerFragment.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/PerFragment.hs
+++ /dev/null
@@ -1,546 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.PerFragment
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to section 4.1 (Per-Fragment Operations) of the
--- OpenGL 2.1 specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.PerFragment (
-   -- * Scissor Test
-   scissor,
-
-   -- * Multisample Fragment Operations
-   sampleAlphaToCoverage,  sampleAlphaToOne, sampleCoverage,
-
-   -- * Depth Bounds Test
-   depthBounds,
-
-   -- * Alpha Test
-   ComparisonFunction(..), alphaFunc,
-
-   -- * Stencil Test
-   stencilTest, stencilFunc, stencilFuncSeparate, StencilOp(..), stencilOp,
-   stencilOpSeparate, activeStencilFace,
-
-   -- * Depth Buffer Test
-   depthFunc,
-
-   -- * Occlusion Queries
-   QueryObject(QueryObject), QueryTarget(..), withQuery,
-   beginQuery, endQuery,
-   queryCounterBits, currentQuery,
-   queryResult, queryResultAvailable,
-
-   -- * Blending
-   blend, BlendEquation(..), blendEquation, blendEquationSeparate,
-   BlendingFactor(..), blendFuncSeparate, blendFunc, blendColor,
-
-   -- * Dithering
-   dither,
-
-   -- * Logical Operation
-   LogicOp(..), logicOp
-) where
-
-import Control.Monad ( liftM2, liftM3 )
-import Foreign.Marshal.Alloc ( alloca )
-import Foreign.Marshal.Array ( withArrayLen, peekArray, allocaArray )
-import Foreign.Ptr ( Ptr )
-import Graphics.Rendering.OpenGL.GL.BufferObjects ( ObjectName(..) )
-import Graphics.Rendering.OpenGL.GL.Capability (
-   EnableCap(CapScissorTest,CapSampleAlphaToCoverage,CapSampleAlphaToOne,
-             CapSampleCoverage,CapDepthBoundsTest,CapAlphaTest,CapStencilTest,
-             CapStencilTestTwoSide,CapDepthTest,CapBlend,CapDither,
-             CapIndexLogicOp,CapColorLogicOp),
-   makeCapability, makeStateVarMaybe )
-import Graphics.Rendering.OpenGL.GL.BasicTypes (
-   GLboolean, GLint, GLuint, GLsizei, GLenum, GLclampf, GLclampd, Capability )
-import Graphics.Rendering.OpenGL.GL.BlendingFactor (
-   BlendingFactor(..), marshalBlendingFactor, unmarshalBlendingFactor )
-import Graphics.Rendering.OpenGL.GL.ComparisonFunction ( ComparisonFunction(..),
-   marshalComparisonFunction, unmarshalComparisonFunction )
-import Graphics.Rendering.OpenGL.GL.CoordTrans ( Position(..), Size(..) )
-import Graphics.Rendering.OpenGL.GL.Exception ( bracket_ )
-import Graphics.Rendering.OpenGL.GL.Extensions (
-   FunPtr, unsafePerformIO, Invoker, getProcAddress )
-import Graphics.Rendering.OpenGL.GL.Face ( marshalFace, unmarshalFace )
-import Graphics.Rendering.OpenGL.GL.Colors ( Face )
-import Graphics.Rendering.OpenGL.GL.GLboolean (
-   marshalGLboolean, unmarshalGLboolean )
-import Graphics.Rendering.OpenGL.GL.PeekPoke ( peek1 )
-import Graphics.Rendering.OpenGL.GL.QueryUtils (
-   GetPName(GetScissorBox,GetSampleCoverageValue,GetSampleCoverageInvert,
-            GetDepthBounds,GetAlphaTestFunc,GetAlphaTestRef,GetStencilFunc,
-            GetStencilRef,GetStencilValueMask,GetStencilFail,
-            GetStencilPassDepthFail,GetStencilPassDepthPass,
-            GetActiveStencilFace,GetDepthFunc,GetBlendEquation,
-            GetBlendEquationAlpha,GetBlendDstRGB,GetBlendSrcRGB,
-            GetBlendDstAlpha,GetBlendSrcAlpha,GetBlendSrc,GetBlendDst,
-            GetBlendColor,GetLogicOpMode),
-   getInteger1, getInteger4, getEnum1, getFloat1, getFloat4, getDouble2,
-   getBoolean1 )
-import Graphics.Rendering.OpenGL.GL.StateVar (
-   HasGetter(get), GettableStateVar, makeGettableStateVar,
-   SettableStateVar, makeSettableStateVar,
-   StateVar, makeStateVar )
-import Graphics.Rendering.OpenGL.GL.VertexSpec ( Color4(..), rgbaMode )
-
---------------------------------------------------------------------------------
-
-#include "HsOpenGLExt.h"
-
---------------------------------------------------------------------------------
-
-scissor :: StateVar (Maybe (Position, Size))
-scissor =
-   makeStateVarMaybe
-      (return CapScissorTest)
-      (getInteger4 makeSB GetScissorBox)
-      (\(Position x y, Size w h) -> glScissor x y w h)
-   where makeSB x y w h = (Position x y, Size (fromIntegral w) (fromIntegral h))
-       
-foreign import CALLCONV unsafe "glScissor" glScissor ::
-   GLint -> GLint -> GLsizei -> GLsizei -> IO ()
-
---------------------------------------------------------------------------------
-
-sampleAlphaToCoverage :: StateVar Capability
-sampleAlphaToCoverage = makeCapability CapSampleAlphaToCoverage
-
-sampleAlphaToOne :: StateVar Capability
-sampleAlphaToOne = makeCapability CapSampleAlphaToOne
-
-sampleCoverage :: StateVar (Maybe (GLclampf, Bool))
-sampleCoverage =
-   makeStateVarMaybe
-      (return CapSampleCoverage)
-      (liftM2 (,) (getFloat1 id GetSampleCoverageValue)
-                  (getBoolean1 unmarshalGLboolean GetSampleCoverageInvert))
-      (\(value, invert) -> glSampleCoverageARB value (marshalGLboolean invert))
-
-EXTENSION_ENTRY("GL_ARB_multisample or OpenGL 1.3",glSampleCoverageARB,GLclampf -> GLboolean -> IO ())
-
---------------------------------------------------------------------------------
-
-depthBounds :: StateVar (Maybe (GLclampd, GLclampd))
-depthBounds =
-   makeStateVarMaybe
-      (return CapDepthBoundsTest)
-      (getDouble2 (,) GetDepthBounds)
-      (uncurry glDepthBoundsEXT)
-       
-EXTENSION_ENTRY("GL_EXT_depth_bounds_test",glDepthBoundsEXT,GLclampd -> GLclampd -> IO ())
-
---------------------------------------------------------------------------------
-
-alphaFunc :: StateVar (Maybe (ComparisonFunction, GLclampf))
-alphaFunc =
-   makeStateVarMaybe
-      (return CapAlphaTest)
-      (liftM2 (,) (getEnum1 unmarshalComparisonFunction GetAlphaTestFunc)
-                  (getFloat1 id GetAlphaTestRef))
-      (uncurry (glAlphaFunc . marshalComparisonFunction))
-
-foreign import CALLCONV unsafe "glAlphaFunc" glAlphaFunc ::
-   GLenum -> GLclampf -> IO ()
-
---------------------------------------------------------------------------------
-
-stencilTest :: StateVar Capability
-stencilTest = makeCapability CapStencilTest
-
---------------------------------------------------------------------------------
-
-stencilFunc :: StateVar (ComparisonFunction, GLint, GLuint)
-stencilFunc =
-   makeStateVar
-      (liftM3 (,,) (getEnum1 unmarshalComparisonFunction GetStencilFunc)
-                   (getInteger1 id GetStencilRef)
-                   (getInteger1 fromIntegral GetStencilValueMask))
-      (\(func, ref, mask) ->
-         glStencilFunc (marshalComparisonFunction func) ref mask)
-
-foreign import CALLCONV unsafe "glStencilFunc" glStencilFunc ::
-   GLenum -> GLint -> GLuint -> IO ()
-
-stencilFuncSeparate :: Face -> SettableStateVar (ComparisonFunction, GLint, GLuint)
-stencilFuncSeparate face =
-   makeSettableStateVar $ \(func, ref, mask) ->
-      glStencilFuncSeparate (marshalFace face) (marshalComparisonFunction func) ref mask
-
-EXTENSION_ENTRY("OpenGL 2.0",glStencilFuncSeparate,GLenum -> GLenum -> GLint -> GLuint -> IO ())
-
---------------------------------------------------------------------------------
-
-data StencilOp =
-     OpZero
-   | OpKeep
-   | OpReplace
-   | OpIncr
-   | OpIncrWrap
-   | OpDecr
-   | OpDecrWrap
-   | OpInvert
-   deriving ( Eq, Ord, Show )
-
-marshalStencilOp :: StencilOp -> GLenum
-marshalStencilOp x = case x of
-   OpZero -> 0x0
-   OpKeep -> 0x1e00
-   OpReplace -> 0x1e01
-   OpIncr -> 0x1e02
-   OpIncrWrap -> 0x8507
-   OpDecr -> 0x1e03
-   OpDecrWrap -> 0x8508
-   OpInvert -> 0x150a
-
-unmarshalStencilOp :: GLenum -> StencilOp
-unmarshalStencilOp x
-   | x == 0x0 = OpZero
-   | x == 0x1e00 = OpKeep
-   | x == 0x1e01 = OpReplace
-   | x == 0x1e02 = OpIncr
-   | x == 0x8507 = OpIncrWrap
-   | x == 0x1e03 = OpDecr
-   | x == 0x8508 = OpDecrWrap
-   | x == 0x150a = OpInvert
-   | otherwise = error ("unmarshalStencilOp: illegal value " ++ show x)
-
---------------------------------------------------------------------------------
-
-stencilOp :: StateVar (StencilOp, StencilOp, StencilOp)
-stencilOp =
-   makeStateVar
-      (liftM3 (,,) (getEnum1 unmarshalStencilOp GetStencilFail)
-                   (getEnum1 unmarshalStencilOp GetStencilPassDepthFail)
-                   (getEnum1 unmarshalStencilOp GetStencilPassDepthPass))
-      (\(sf, spdf, spdp) -> glStencilOp (marshalStencilOp sf)
-                                        (marshalStencilOp spdf)
-                                        (marshalStencilOp spdp))
-
-foreign import CALLCONV unsafe "glStencilOp" glStencilOp ::
-   GLenum -> GLenum -> GLenum -> IO ()
-
-stencilOpSeparate :: Face -> SettableStateVar (StencilOp, StencilOp, StencilOp)
-stencilOpSeparate face =
-   makeSettableStateVar $ \(sf, spdf, spdp) ->
-      glStencilOpSeparate (marshalFace face)
-                          (marshalStencilOp sf)
-                          (marshalStencilOp spdf)
-                          (marshalStencilOp spdp)
-
-EXTENSION_ENTRY("OpenGL 2.0",glStencilOpSeparate,GLenum -> GLenum -> GLenum -> GLenum -> IO ())
-
---------------------------------------------------------------------------------
-
-activeStencilFace :: StateVar (Maybe Face)
-activeStencilFace =
-   makeStateVarMaybe
-      (return CapStencilTestTwoSide)
-      (getEnum1 unmarshalFace GetActiveStencilFace)
-      (glActiveStencilFaceEXT . marshalFace)
-
-EXTENSION_ENTRY("GL_EXT_stencil_two_side",glActiveStencilFaceEXT,GLenum -> IO ())
-
---------------------------------------------------------------------------------
-
-depthFunc :: StateVar (Maybe ComparisonFunction)
-depthFunc =
-   makeStateVarMaybe
-      (return CapDepthTest)
-      (getEnum1 unmarshalComparisonFunction GetDepthFunc)
-      (glDepthFunc . marshalComparisonFunction)
-
-foreign import CALLCONV unsafe "glDepthFunc" glDepthFunc :: GLenum -> IO ()
-
---------------------------------------------------------------------------------
-
-newtype QueryObject = QueryObject { queryID :: GLuint }
-   deriving ( Eq, Ord, Show )
-
---------------------------------------------------------------------------------
-
-instance ObjectName QueryObject where
-   genObjectNames n =
-      allocaArray n $ \buf -> do
-        glGenQueriesARB (fromIntegral n) buf
-        fmap (map QueryObject) $ peekArray n buf
-
-   deleteObjectNames queryObjects =
-      withArrayLen (map queryID queryObjects) $
-         glDeleteQueriesARB . fromIntegral
-
-   isObjectName = fmap unmarshalGLboolean . glIsQueryARB . queryID
-
-
-EXTENSION_ENTRY("GL_ARB_occlusion_query or OpenGL 1.5",glGenQueriesARB,GLsizei -> Ptr GLuint -> IO ())
-
-EXTENSION_ENTRY("GL_ARB_occlusion_query or OpenGL 1.5",glDeleteQueriesARB,GLsizei -> Ptr GLuint -> IO ())
-
-EXTENSION_ENTRY("GL_ARB_occlusion_query or OpenGL 1.5",glIsQueryARB,GLuint -> IO GLboolean)
-
---------------------------------------------------------------------------------
-
-data QueryTarget =
-     SamplesPassed
-   deriving ( Eq, Ord, Show )
-
-marshalQueryTarget :: QueryTarget -> GLenum
-marshalQueryTarget x = case x of
-   SamplesPassed -> 0x8914
-
---------------------------------------------------------------------------------
-
-beginQuery :: QueryTarget -> QueryObject -> IO ()
-beginQuery t = glBeginQueryARB (marshalQueryTarget t) . queryID
-
-EXTENSION_ENTRY("GL_ARB_occlusion_query or OpenGL 1.5",glBeginQueryARB,GLenum -> GLuint -> IO ())
-
-endQuery :: QueryTarget -> IO ()
-endQuery = glEndQueryARB . marshalQueryTarget
-
-EXTENSION_ENTRY("GL_ARB_occlusion_query or OpenGL 1.5",glEndQueryARB,GLenum -> IO ())
-
--- | Convenience function for an exception-safe combination of 'beginQuery' and
--- 'endQuery'.
-withQuery :: QueryTarget -> QueryObject -> IO a -> IO a
-withQuery t q = bracket_ (beginQuery t q) (endQuery t)
-
---------------------------------------------------------------------------------
-
-data GetQueryPName =
-     QueryCounterBits
-   | CurrentQuery
-
-marshalGetQueryPName :: GetQueryPName -> GLenum
-marshalGetQueryPName x = case x of
-   QueryCounterBits -> 0x8864
-   CurrentQuery -> 0x8865
-
---------------------------------------------------------------------------------
-
-queryCounterBits :: QueryTarget -> GettableStateVar GLsizei
-queryCounterBits = getQueryi fromIntegral QueryCounterBits
-
-currentQuery :: QueryTarget -> GettableStateVar (Maybe QueryObject)
-currentQuery =
-   getQueryi
-      (\q -> if q == 0 then Nothing else Just (QueryObject (fromIntegral q)))
-      CurrentQuery
-
-getQueryi :: (GLint -> a) -> GetQueryPName -> QueryTarget -> GettableStateVar a
-getQueryi f p t =
-   makeGettableStateVar $
-      alloca $ \buf -> do
-         glGetQueryivARB (marshalQueryTarget t) (marshalGetQueryPName p) buf
-         peek1 f buf
-
-EXTENSION_ENTRY("GL_ARB_occlusion_query or OpenGL 1.5",glGetQueryivARB,GLenum -> GLenum -> Ptr GLint -> IO ())
-
---------------------------------------------------------------------------------
-
-data GetQueryObjectPName =
-     QueryResult
-   | QueryResultAvailable
-
-marshalGetQueryObjectPName :: GetQueryObjectPName -> GLenum
-marshalGetQueryObjectPName x = case x of
-   QueryResult -> 0x8866
-   QueryResultAvailable -> 0x8867
-
---------------------------------------------------------------------------------
-
-queryResult :: QueryObject -> GettableStateVar GLuint
-queryResult = getQueryObjectui id QueryResult
-
-queryResultAvailable :: QueryObject -> GettableStateVar Bool
-queryResultAvailable = getQueryObjectui unmarshalGLboolean QueryResultAvailable
-
-getQueryObjectui ::
-   (GLuint -> a) -> GetQueryObjectPName -> QueryObject -> GettableStateVar a
-getQueryObjectui f p q =
-   makeGettableStateVar $
-      alloca $ \buf -> do
-         glGetQueryObjectuivARB (queryID q) (marshalGetQueryObjectPName p) buf
-         peek1 f buf
-
-EXTENSION_ENTRY("GL_ARB_occlusion_query or OpenGL 1.5",glGetQueryObjectuivARB,GLuint -> GLenum -> Ptr GLuint -> IO ())
-
---------------------------------------------------------------------------------
-
-blend :: StateVar Capability
-blend = makeCapability CapBlend
-
---------------------------------------------------------------------------------
-
-data BlendEquation =
-     FuncAdd
-   | FuncSubtract
-   | FuncReverseSubtract
-   | Min
-   | Max
-   | LogicOp
-   deriving ( Eq, Ord, Show )
-
-marshalBlendEquation :: BlendEquation -> GLenum
-marshalBlendEquation x = case x of
-   FuncAdd -> 0x8006
-   FuncSubtract -> 0x800a
-   FuncReverseSubtract -> 0x800b
-   Min -> 0x8007
-   Max -> 0x8008
-   LogicOp -> 0xbf1
-
-unmarshalBlendEquation :: GLenum -> BlendEquation
-unmarshalBlendEquation x
-   | x == 0x8006 = FuncAdd
-   | x == 0x800a = FuncSubtract
-   | x == 0x800b = FuncReverseSubtract
-   | x == 0x8007 = Min
-   | x == 0x8008 = Max
-   | x == 0xbf1 = LogicOp
-   | otherwise = error ("unmarshalBlendEquation: illegal value " ++ show x)
-
---------------------------------------------------------------------------------
-
-blendEquation :: StateVar BlendEquation
-blendEquation =
-   makeStateVar
-      (getEnum1 unmarshalBlendEquation GetBlendEquation)
-      (glBlendEquationEXT . marshalBlendEquation)
-
-EXTENSION_ENTRY("GL_EXT_blend_minmax or GL_EXT_blend_subtract or OpenGL 1.4",glBlendEquationEXT,GLenum -> IO ())
-
-blendEquationSeparate :: StateVar (BlendEquation,BlendEquation)
-blendEquationSeparate =
-   makeStateVar
-      (liftM2 (,) (getEnum1 unmarshalBlendEquation GetBlendEquation)
-                  (getEnum1 unmarshalBlendEquation GetBlendEquationAlpha))
-      (\(funcRGB, funcAlpha) ->
-          glBlendEquationSeparate (marshalBlendEquation funcRGB)
-                                  (marshalBlendEquation funcAlpha))
-
-EXTENSION_ENTRY("GL_EXT_blend_equation_separate or OpenGL 2.0",glBlendEquationSeparate,GLenum -> GLenum -> IO ())
-
---------------------------------------------------------------------------------
-
-blendFuncSeparate ::
-   StateVar ((BlendingFactor, BlendingFactor), (BlendingFactor, BlendingFactor))
-blendFuncSeparate =
-   makeStateVar
-      (do srcRGB   <- getEnum1 unmarshalBlendingFactor GetBlendSrcRGB
-          srcAlpha <- getEnum1 unmarshalBlendingFactor GetBlendSrcAlpha
-          dstRGB   <- getEnum1 unmarshalBlendingFactor GetBlendDstRGB
-          dstAlpha <- getEnum1 unmarshalBlendingFactor GetBlendDstAlpha
-          return ((srcRGB, srcAlpha), (dstRGB, dstAlpha)))
-      (\((srcRGB, srcAlpha), (dstRGB, dstAlpha)) ->
-         glBlendFuncSeparateEXT (marshalBlendingFactor srcRGB)
-                                (marshalBlendingFactor srcAlpha)
-                                (marshalBlendingFactor dstRGB)
-                                (marshalBlendingFactor dstAlpha))
-
-EXTENSION_ENTRY("GL_EXT_blend_func_separate or OpenGL 1.4",glBlendFuncSeparateEXT,GLenum -> GLenum -> GLenum -> GLenum -> IO ())
-
-blendFunc :: StateVar (BlendingFactor, BlendingFactor)
-blendFunc =
-   makeStateVar
-      (liftM2 (,) (getEnum1 unmarshalBlendingFactor GetBlendSrc)
-                  (getEnum1 unmarshalBlendingFactor GetBlendDst))
-      (\(s, d) ->
-         glBlendFunc (marshalBlendingFactor s) (marshalBlendingFactor d))
-
-foreign import CALLCONV unsafe "glBlendFunc" glBlendFunc ::
-   GLenum -> GLenum -> IO ()
-
-blendColor :: StateVar (Color4 GLclampf)
-blendColor =
-   makeStateVar
-      (getFloat4 Color4 GetBlendColor)
-      (\(Color4 r g b a) -> glBlendColorEXT r g b a)
-
-EXTENSION_ENTRY("GL_EXT_blend_color or OpenGL 1.4",glBlendColorEXT,GLclampf -> GLclampf -> GLclampf -> GLclampf -> IO ())
-
---------------------------------------------------------------------------------
-
-dither :: StateVar Capability
-dither = makeCapability CapDither
-
---------------------------------------------------------------------------------
-
-data LogicOp =
-     Clear
-   | And
-   | AndReverse
-   | Copy
-   | AndInverted
-   | Noop
-   | Xor
-   | Or
-   | Nor
-   | Equiv
-   | Invert
-   | OrReverse
-   | CopyInverted
-   | OrInverted
-   | Nand
-   | Set
-   deriving ( Eq, Ord, Show )
-
-marshalLogicOp :: LogicOp -> GLenum
-marshalLogicOp x = case x of
-   Clear -> 0x1500
-   And -> 0x1501
-   AndReverse -> 0x1502
-   Copy -> 0x1503
-   AndInverted -> 0x1504
-   Noop -> 0x1505
-   Xor -> 0x1506
-   Or -> 0x1507
-   Nor -> 0x1508
-   Equiv -> 0x1509
-   Invert -> 0x150a
-   OrReverse -> 0x150b
-   CopyInverted -> 0x150c
-   OrInverted -> 0x150d
-   Nand -> 0x150e
-   Set -> 0x150f
-
-unmarshalLogicOp :: GLenum -> LogicOp
-unmarshalLogicOp x
-   | x == 0x1500 = Clear
-   | x == 0x1501 = And
-   | x == 0x1502 = AndReverse
-   | x == 0x1503 = Copy
-   | x == 0x1504 = AndInverted
-   | x == 0x1505 = Noop
-   | x == 0x1506 = Xor
-   | x == 0x1507 = Or
-   | x == 0x1508 = Nor
-   | x == 0x1509 = Equiv
-   | x == 0x150a = Invert
-   | x == 0x150b = OrReverse
-   | x == 0x150c = CopyInverted
-   | x == 0x150d = OrInverted
-   | x == 0x150e = Nand
-   | x == 0x150f = Set
-   | otherwise = error ("unmarshalLogicOp: illegal value " ++ show x)
-
---------------------------------------------------------------------------------
-
-logicOp :: StateVar (Maybe LogicOp)
-logicOp =
-   makeStateVarMaybe
-      (do rgba <- get rgbaMode
-          return $ if rgba then CapColorLogicOp else CapIndexLogicOp)
-      (getEnum1 unmarshalLogicOp GetLogicOpMode)
-      (glLogicOp . marshalLogicOp)
-
-foreign import CALLCONV unsafe "glLogicOp" glLogicOp :: GLenum -> IO ()
diff --git a/Graphics/Rendering/OpenGL/GL/PixelData.hs b/Graphics/Rendering/OpenGL/GL/PixelData.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/PixelData.hs
+++ /dev/null
@@ -1,40 +0,0 @@
--- #hide
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.PixelData
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This is a purely internal helper module.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.PixelData (
-   PixelData(..), withPixelData
-) where
-
-import Foreign.Ptr ( Ptr )
-import Graphics.Rendering.OpenGL.GL.BasicTypes ( GLenum )
-import Graphics.Rendering.OpenGL.GL.DataType ( DataType, marshalDataType )
-import Graphics.Rendering.OpenGL.GL.PixelFormat (
-   PixelFormat, marshalPixelFormat )
-
---------------------------------------------------------------------------------
-
-data PixelData a = PixelData PixelFormat DataType (Ptr a)
-#ifdef __HADDOCK__
--- Help Haddock a bit, because it doesn't do any instance inference.
-instance Eq (PixelData a)
-instance Ord (PixelData a)
-instance Show (PixelData a)
-#else
-   deriving ( Eq, Ord, Show )
-#endif
-
-withPixelData :: PixelData a -> (GLenum -> GLenum -> Ptr a -> b) -> b
-withPixelData (PixelData pixelFormat dataType ptr) f =
-   f (marshalPixelFormat pixelFormat) (marshalDataType dataType) ptr
diff --git a/Graphics/Rendering/OpenGL/GL/PixelFormat.hs b/Graphics/Rendering/OpenGL/GL/PixelFormat.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/PixelFormat.hs
+++ /dev/null
@@ -1,98 +0,0 @@
--- #hide
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.PixelFormat
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This is a purely internal module for (un-)marshaling PixelFormat.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.PixelFormat (
-   PixelFormat(..), marshalPixelFormat, unmarshalPixelFormat
-) where
-
-import Graphics.Rendering.OpenGL.GL.BasicTypes ( GLenum )
-
---------------------------------------------------------------------------------
-
-data PixelFormat =
-     ColorIndex
-   | StencilIndex
-   | DepthComponent
-   | Red
-   | Green
-   | Blue
-   | Alpha
-   | RGB
-   | RGBA
-   | Luminance
-   | LuminanceAlpha
-   | ABGR
-   | BGR
-   | BGRA
-   | CMYK
-   | CMYKA
-   | FourTwoTwo
-   | FourTwoTwoRev
-   | FourTwoTwoAverage
-   | FourTwoTwoRevAverage
-   | YCBCR422
-   | DepthStencil
-   deriving ( Eq, Ord, Show )
-
-marshalPixelFormat :: PixelFormat -> GLenum
-marshalPixelFormat x = case x of
-   ColorIndex -> 0x1900
-   StencilIndex -> 0x1901
-   DepthComponent -> 0x1902
-   Red -> 0x1903
-   Green -> 0x1904
-   Blue -> 0x1905
-   Alpha -> 0x1906
-   RGB -> 0x1907
-   RGBA -> 0x1908
-   Luminance -> 0x1909
-   LuminanceAlpha -> 0x190a
-   ABGR -> 0x8000
-   BGR -> 0x80E0
-   BGRA -> 0x80E1
-   CMYK -> 0x800C
-   CMYKA -> 0x800D
-   FourTwoTwo -> 0x80CC
-   FourTwoTwoRev -> 0x80CD
-   FourTwoTwoAverage -> 0x80CE
-   FourTwoTwoRevAverage -> 0x80CF
-   YCBCR422 -> 0x85B9
-   DepthStencil -> 0x84f9
-
-unmarshalPixelFormat :: GLenum -> PixelFormat
-unmarshalPixelFormat x
-   | x == 0x1900 = ColorIndex
-   | x == 0x1901 = StencilIndex
-   | x == 0x1902 = DepthComponent
-   | x == 0x1903 = Red
-   | x == 0x1904 = Green
-   | x == 0x1905 = Blue
-   | x == 0x1906 = Alpha
-   | x == 0x1907 = RGB
-   | x == 0x1908 = RGBA
-   | x == 0x1909 = Luminance
-   | x == 0x190a = LuminanceAlpha
-   | x == 0x8000 = ABGR
-   | x == 0x80E0 = BGR
-   | x == 0x80E1 = BGRA
-   | x == 0x800C = CMYK
-   | x == 0x800D = CMYKA
-   | x == 0x80CC = FourTwoTwo
-   | x == 0x80CD = FourTwoTwoRev
-   | x == 0x80CE = FourTwoTwoAverage
-   | x == 0x80CF = FourTwoTwoRevAverage
-   | x == 0x85B9 = YCBCR422
-   | x == 0x84f9 = DepthStencil
-   | otherwise = error ("unmarshalPixelFormat: illegal value " ++ show x)
diff --git a/Graphics/Rendering/OpenGL/GL/PixelRectangles.hs b/Graphics/Rendering/OpenGL/GL/PixelRectangles.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/PixelRectangles.hs
+++ /dev/null
@@ -1,34 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.PixelRectangles
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to section 3.6 (Pixel Rectangles) of the OpenGL 2.1
--- specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.PixelRectangles (
-   module Graphics.Rendering.OpenGL.GL.PixelRectangles.PixelStorage,
-   module Graphics.Rendering.OpenGL.GL.PixelRectangles.PixelTransfer,
-   module Graphics.Rendering.OpenGL.GL.PixelRectangles.PixelMap,
-   module Graphics.Rendering.OpenGL.GL.PixelRectangles.ColorTable,
-   module Graphics.Rendering.OpenGL.GL.PixelRectangles.Convolution,
-   module Graphics.Rendering.OpenGL.GL.PixelRectangles.Histogram,
-   module Graphics.Rendering.OpenGL.GL.PixelRectangles.Minmax,
-   module Graphics.Rendering.OpenGL.GL.PixelRectangles.Rasterization
-) where
-
-import Graphics.Rendering.OpenGL.GL.PixelRectangles.PixelStorage
-import Graphics.Rendering.OpenGL.GL.PixelRectangles.PixelTransfer
-import Graphics.Rendering.OpenGL.GL.PixelRectangles.PixelMap
-import Graphics.Rendering.OpenGL.GL.PixelRectangles.ColorTable
-import Graphics.Rendering.OpenGL.GL.PixelRectangles.Convolution
-import Graphics.Rendering.OpenGL.GL.PixelRectangles.Histogram
-import Graphics.Rendering.OpenGL.GL.PixelRectangles.Minmax
-import Graphics.Rendering.OpenGL.GL.PixelRectangles.Rasterization
diff --git a/Graphics/Rendering/OpenGL/GL/PixelRectangles/ColorTable.hs b/Graphics/Rendering/OpenGL/GL/PixelRectangles/ColorTable.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/PixelRectangles/ColorTable.hs
+++ /dev/null
@@ -1,279 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.PixelRectangles.ColorTable
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to a part of section 3.6.1 (Pixel Storage Modes) of
--- the OpenGL 2.1 specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.PixelRectangles.ColorTable (
-   ColorTableStage(..), colorTableStage,
-   Proxy(..), ColorTable(..), PixelInternalFormat(..),
-   colorTable, getColorTable, copyColorTable, colorSubTable, copyColorSubTable,
-   colorTableScale, colorTableBias, colorTableFormat, colorTableWidth,
-   colorTableRGBASizes, colorTableLuminanceSize, colorTableIntesitySize,
-) where
-
-import Foreign.Marshal.Alloc ( alloca )
-import Foreign.Marshal.Utils ( with )
-import Foreign.Ptr ( Ptr )
-import Foreign.Storable ( Storable(..) )
-import Graphics.Rendering.OpenGL.GL.Capability (
-   EnableCap(CapColorTable,CapPostConvolutionColorTable,
-             CapPostColorMatrixColorTable,CapTextureColorTable),
-   makeCapability )
-import Graphics.Rendering.OpenGL.GL.BasicTypes (
-   GLenum, GLint, GLsizei, GLfloat, Capability )
-import Graphics.Rendering.OpenGL.GL.CoordTrans ( Position(..) )
-import Graphics.Rendering.OpenGL.GL.Extensions (
-   FunPtr, unsafePerformIO, Invoker, getProcAddress )
-import Graphics.Rendering.OpenGL.GL.PeekPoke ( peek1 )
-import Graphics.Rendering.OpenGL.GL.PixelRectangles.Rasterization (
-    PixelData(..) )
-import Graphics.Rendering.OpenGL.GL.PixelData ( withPixelData )
-import Graphics.Rendering.OpenGL.GL.Texturing.PixelInternalFormat (
-   PixelInternalFormat(..), marshalPixelInternalFormat',
-   unmarshalPixelInternalFormat )
-import Graphics.Rendering.OpenGL.GL.StateVar (
-   GettableStateVar, makeGettableStateVar, StateVar, makeStateVar )
-import Graphics.Rendering.OpenGL.GL.VertexSpec ( Color4(..) )
-import Graphics.Rendering.OpenGL.GLU.ErrorsInternal (
-   recordInvalidEnum )
-
---------------------------------------------------------------------------------
-
-#include "HsOpenGLExt.h"
-
---------------------------------------------------------------------------------
-
-data ColorTableStage =
-     ColorTableStage
-   | PostConvolutionColorTableStage
-   | PostColorMatrixColorTableStage
-   | TextureColorTableStage
-   deriving ( Eq, Ord, Show )
-
-colorTableStageToColorTable :: ColorTableStage -> ColorTable
-colorTableStageToColorTable x = case x of
-   ColorTableStage -> ColorTable
-   PostConvolutionColorTableStage -> PostConvolutionColorTable
-   PostColorMatrixColorTableStage -> PostColorMatrixColorTable
-   TextureColorTableStage -> TextureColorTable
-
-colorTableStageToEnableCap :: ColorTableStage -> EnableCap
-colorTableStageToEnableCap x = case x of
-   ColorTableStage -> CapColorTable
-   PostConvolutionColorTableStage -> CapPostConvolutionColorTable
-   PostColorMatrixColorTableStage -> CapPostColorMatrixColorTable
-   TextureColorTableStage -> CapTextureColorTable
-
---------------------------------------------------------------------------------
-
-colorTableStage :: ColorTableStage -> StateVar Capability
-colorTableStage = makeCapability . colorTableStageToEnableCap
-
---------------------------------------------------------------------------------
-
-data ColorTable =
-     ColorTable
-   | PostConvolutionColorTable
-   | PostColorMatrixColorTable
-   | Texture1DColorTable
-   | Texture2DColorTable
-   | Texture3DColorTable
-   | TextureCubeMapColorTable
-   | TextureColorTable
-   | SharedTexturePalette
-   deriving ( Eq, Ord, Show )
-
-marshalColorTable :: ColorTable -> GLenum
-marshalColorTable x = case x of
-   ColorTable -> 0x80d0
-   PostConvolutionColorTable -> 0x80d1
-   PostColorMatrixColorTable -> 0x80d2
-   Texture1DColorTable -> 0xde0
-   Texture2DColorTable -> 0xde1
-   Texture3DColorTable -> 0x806f
-   TextureCubeMapColorTable -> 0x8513
-   TextureColorTable -> 0x80bc
-   SharedTexturePalette -> 0x81fb
-
---------------------------------------------------------------------------------
-
-data Proxy =
-     NoProxy
-   | Proxy
-   deriving ( Eq, Ord, Show )
-
---------------------------------------------------------------------------------
-
-marshalProxyColorTable :: Proxy -> ColorTable -> Maybe GLenum
-marshalProxyColorTable NoProxy x = Just (marshalColorTable x)
-marshalProxyColorTable Proxy   x = case x of
-   ColorTable -> Just 0x80d3
-   PostConvolutionColorTable -> Just 0x80d4
-   PostColorMatrixColorTable -> Just 0x80d5
-   Texture1DColorTable -> Just 0x8063
-   Texture2DColorTable -> Just 0x8064
-   Texture3DColorTable -> Just 0x8070
-   TextureCubeMapColorTable -> Just 0x851b
-   TextureColorTable -> Just 0x80bd
-   SharedTexturePalette -> Nothing
-
---------------------------------------------------------------------------------
-
-colorTable ::
-   Proxy -> ColorTable -> PixelInternalFormat -> GLsizei -> PixelData a -> IO ()
-colorTable proxy ct int w pd =
-   maybe recordInvalidEnum
-         (\target -> withPixelData pd $
-            glColorTable target (marshalPixelInternalFormat' int) w)
-         (marshalProxyColorTable proxy ct)
-
-EXTENSION_ENTRY("GL_ARB_imaging",glColorTable,GLenum -> GLenum -> GLsizei -> GLenum -> GLenum -> Ptr a -> IO ())
-
---------------------------------------------------------------------------------
-
-getColorTable :: ColorTable -> PixelData a -> IO ()
-getColorTable ct pd =
-   withPixelData pd $ glGetColorTable (marshalColorTable ct)
-
-EXTENSION_ENTRY("GL_ARB_imaging",glGetColorTable,GLenum -> GLenum -> GLenum -> Ptr a -> IO ())
-
---------------------------------------------------------------------------------
-
-copyColorTable :: ColorTable -> PixelInternalFormat -> Position -> GLsizei -> IO ()
-copyColorTable ct int (Position x y) =
-   glCopyColorTable (marshalColorTable ct) (marshalPixelInternalFormat' int) x y
-
-EXTENSION_ENTRY("GL_ARB_imaging",glCopyColorTable,GLenum -> GLenum -> GLint -> GLint -> GLsizei -> IO ())
-
---------------------------------------------------------------------------------
-
-colorSubTable :: ColorTable -> GLsizei -> GLsizei -> PixelData a -> IO ()
-colorSubTable ct start count pd =
-   withPixelData pd $ glColorSubTable (marshalColorTable ct) start count
-
-EXTENSION_ENTRY("GL_ARB_imaging",glColorSubTable,GLenum -> GLsizei -> GLsizei -> GLenum -> GLenum -> Ptr a -> IO ())
-
---------------------------------------------------------------------------------
-
-copyColorSubTable :: ColorTable -> GLsizei -> Position -> GLsizei -> IO ()
-copyColorSubTable ct start (Position x y) =
-   glCopyColorSubTable (marshalColorTable ct) start x y
-
-EXTENSION_ENTRY("GL_ARB_imaging",glCopyColorSubTable,GLenum -> GLsizei -> GLint -> GLint -> GLsizei -> IO ())
-
---------------------------------------------------------------------------------
-
-data ColorTablePName =
-     ColorTableScale
-   | ColorTableBias
-   | ColorTableFormat
-   | ColorTableWidth
-   | ColorTableRedSize
-   | ColorTableGreenSize
-   | ColorTableBlueSize
-   | ColorTableAlphaSize
-   | ColorTableLuminanceSize
-   | ColorTableIntensitySize
-
-marshalColorTablePName :: ColorTablePName -> GLenum
-marshalColorTablePName x = case x of
-   ColorTableScale -> 0x80d6
-   ColorTableBias -> 0x80d7
-   ColorTableFormat -> 0x80d8
-   ColorTableWidth -> 0x80d9
-   ColorTableRedSize -> 0x80da
-   ColorTableGreenSize -> 0x80db
-   ColorTableBlueSize -> 0x80dc
-   ColorTableAlphaSize -> 0x80dd
-   ColorTableLuminanceSize -> 0x80de
-   ColorTableIntensitySize -> 0x80df
-
---------------------------------------------------------------------------------
-
-colorTableScale :: ColorTableStage -> StateVar (Color4 GLfloat)
-colorTableScale = colorTableScaleBias ColorTableScale
-
-colorTableBias :: ColorTableStage -> StateVar (Color4 GLfloat)
-colorTableBias = colorTableScaleBias ColorTableBias
-
-colorTableScaleBias ::
-   ColorTablePName -> ColorTableStage -> StateVar (Color4 GLfloat)
-colorTableScaleBias p s =
-   makeStateVar (getColorTableParameterC4f ct p) (colorTableParameterC4f ct p)
-   where ct = colorTableStageToColorTable s
-
-getColorTableParameterC4f ::
-   ColorTable -> ColorTablePName -> IO (Color4 GLfloat) 
-getColorTableParameterC4f ct p =
-   alloca $ \buf -> do
-      glGetColorTableParameterfv
-         (marshalColorTable ct)
-         (marshalColorTablePName p)
-         buf
-      peek buf
-
-EXTENSION_ENTRY("GL_ARB_imaging",glGetColorTableParameterfv,GLenum -> GLenum -> Ptr (Color4 GLfloat) -> IO ())
-
-colorTableParameterC4f ::
-   ColorTable -> ColorTablePName -> Color4 GLfloat -> IO ()
-colorTableParameterC4f ct p c =
-   with c $
-      glColorTableParameterfv (marshalColorTable ct) (marshalColorTablePName p)
-
-EXTENSION_ENTRY("GL_ARB_imaging",glColorTableParameterfv,GLenum -> GLenum -> Ptr (Color4 GLfloat) -> IO ())
-
---------------------------------------------------------------------------------
-
-colorTableFormat :: ColorTable -> GettableStateVar PixelInternalFormat
-colorTableFormat ct =
-   makeGettableStateVar $
-      getColorTableParameteri unmarshalPixelInternalFormat ct ColorTableFormat
-
-getColorTableParameteri :: (GLint -> a) -> ColorTable -> ColorTablePName -> IO a
-getColorTableParameteri f ct p =
-   alloca $ \buf -> do
-      glGetColorTableParameteriv
-         (marshalColorTable ct)
-         (marshalColorTablePName p)
-         buf
-      peek1 f buf
-
-EXTENSION_ENTRY("GL_ARB_imaging",glGetColorTableParameteriv,GLenum -> GLenum -> Ptr GLint -> IO ())
-
---------------------------------------------------------------------------------
-
-colorTableWidth :: ColorTable -> GettableStateVar GLsizei
-colorTableWidth ct =
-   makeGettableStateVar $
-      getColorTableParameteri fromIntegral ct ColorTableWidth
-
---------------------------------------------------------------------------------
-
-colorTableRGBASizes :: ColorTable -> GettableStateVar (Color4 GLsizei)
-colorTableRGBASizes ct =
-   makeGettableStateVar $ do
-      r <- getColorTableParameteri fromIntegral ct ColorTableRedSize
-      g <- getColorTableParameteri fromIntegral ct ColorTableGreenSize
-      b <- getColorTableParameteri fromIntegral ct ColorTableBlueSize
-      a <- getColorTableParameteri fromIntegral ct ColorTableAlphaSize
-      return $ Color4 r g b a
-
-colorTableLuminanceSize :: ColorTable -> GettableStateVar GLsizei
-colorTableLuminanceSize ct =
-   makeGettableStateVar $
-      getColorTableParameteri fromIntegral ct ColorTableLuminanceSize
-
-colorTableIntesitySize :: ColorTable -> GettableStateVar GLsizei
-colorTableIntesitySize ct =
-   makeGettableStateVar $
-      getColorTableParameteri fromIntegral ct ColorTableIntensitySize
diff --git a/Graphics/Rendering/OpenGL/GL/PixelRectangles/Convolution.hs b/Graphics/Rendering/OpenGL/GL/PixelRectangles/Convolution.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/PixelRectangles/Convolution.hs
+++ /dev/null
@@ -1,318 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.PixelRectangles.Convolution
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to a part of section 3.6.1 (Pixel Storage Modes) of
--- the OpenGL 2.1 specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.PixelRectangles.Convolution (
-   ConvolutionTarget(..), convolution,
-   convolutionFilter1D, getConvolutionFilter1D,
-   convolutionFilter2D, getConvolutionFilter2D,
-   separableFilter2D, getSeparableFilter2D,
-   copyConvolutionFilter1D, copyConvolutionFilter2D,
-   convolutionWidth, convolutionHeight,
-   maxConvolutionWidth, maxConvolutionHeight,
-   ConvolutionBorderMode(..), convolutionBorderMode,
-   convolutionFilterScale, convolutionFilterBias,
-) where
-
-import Foreign.Marshal.Alloc ( alloca )
-import Foreign.Marshal.Utils ( with )
-import Foreign.Ptr ( Ptr, nullPtr )
-import Foreign.Storable ( Storable(..) )
-import Graphics.Rendering.OpenGL.GL.Capability (
-   EnableCap(CapConvolution1D, CapConvolution2D,CapSeparable2D),
-   makeCapability )
-import Graphics.Rendering.OpenGL.GL.BasicTypes (
-   GLenum, GLint, GLsizei, GLfloat, Capability )
-import Graphics.Rendering.OpenGL.GL.CoordTrans ( Position(..), Size(..) )
-import Graphics.Rendering.OpenGL.GL.Extensions (
-   FunPtr, unsafePerformIO, Invoker, getProcAddress )
-import Graphics.Rendering.OpenGL.GL.PeekPoke ( peek1 )
-import Graphics.Rendering.OpenGL.GL.PixelRectangles.ColorTable (
-   PixelInternalFormat )
-import Graphics.Rendering.OpenGL.GL.PixelRectangles.Rasterization (
-    PixelData(..) )
-import Graphics.Rendering.OpenGL.GL.PixelData ( withPixelData )
-import Graphics.Rendering.OpenGL.GL.Texturing.PixelInternalFormat (
-   marshalPixelInternalFormat' )
-import Graphics.Rendering.OpenGL.GL.StateVar (
-   GettableStateVar, makeGettableStateVar, StateVar, makeStateVar )
-import Graphics.Rendering.OpenGL.GL.VertexSpec ( Color4(..) )
-import Graphics.Rendering.OpenGL.GLU.ErrorsInternal (
-   recordInvalidValue )
-
---------------------------------------------------------------------------------
-
-#include "HsOpenGLExt.h"
-
---------------------------------------------------------------------------------
-
-data ConvolutionTarget =
-     Convolution1D
-   | Convolution2D
-   | Separable2D
-   deriving ( Eq, Ord, Show )
-
-marshalConvolutionTarget :: ConvolutionTarget -> GLenum
-marshalConvolutionTarget x = case x of
-   Convolution1D -> 0x8010
-   Convolution2D -> 0x8011
-   Separable2D -> 0x8012
-
-convolutionTargetToEnableCap :: ConvolutionTarget -> EnableCap
-convolutionTargetToEnableCap x = case x of
-   Convolution1D -> CapConvolution1D
-   Convolution2D -> CapConvolution2D
-   Separable2D -> CapSeparable2D
-
---------------------------------------------------------------------------------
-
-convolution :: ConvolutionTarget -> StateVar Capability
-convolution = makeCapability . convolutionTargetToEnableCap
-
---------------------------------------------------------------------------------
-
-convolutionFilter1D :: PixelInternalFormat -> GLsizei -> PixelData a -> IO ()
-convolutionFilter1D int w pd =
-   withPixelData pd $
-      glConvolutionFilter1D
-         (marshalConvolutionTarget Convolution1D)
-         (marshalPixelInternalFormat' int) w
-
-EXTENSION_ENTRY("GL_ARB_imaging",glConvolutionFilter1D,GLenum -> GLenum -> GLsizei -> GLenum -> GLenum -> Ptr a -> IO ())
-
---------------------------------------------------------------------------------
-
-getConvolutionFilter1D :: PixelData a -> IO ()
-getConvolutionFilter1D = getConvolutionFilter Convolution1D
-
-getConvolutionFilter :: ConvolutionTarget -> PixelData a -> IO ()
-getConvolutionFilter t pd =
-   withPixelData pd $ glGetConvolutionFilter (marshalConvolutionTarget t)
-
-EXTENSION_ENTRY("GL_ARB_imaging",glGetConvolutionFilter,GLenum -> GLenum -> GLenum -> Ptr a -> IO ())
-
---------------------------------------------------------------------------------
-
-convolutionFilter2D :: PixelInternalFormat -> Size -> PixelData a -> IO ()
-convolutionFilter2D int (Size w h) pd =
-   withPixelData pd $
-      glConvolutionFilter2D
-         (marshalConvolutionTarget Convolution2D)
-         (marshalPixelInternalFormat' int) w h
-
-EXTENSION_ENTRY("GL_ARB_imaging",glConvolutionFilter2D,GLenum -> GLenum -> GLsizei -> GLsizei -> GLenum -> GLenum -> Ptr a -> IO ())
-
---------------------------------------------------------------------------------
-
-getConvolutionFilter2D :: PixelData a -> IO ()
-getConvolutionFilter2D = getConvolutionFilter Convolution2D
-
---------------------------------------------------------------------------------
-
-separableFilter2D ::
-   PixelInternalFormat -> Size -> PixelData a -> PixelData a -> IO ()
-separableFilter2D int (Size w h) pdRow pdCol =
-   withPixelData pdRow $ \f1 d1 p1 ->
-      withPixelData pdCol $ \f2 d2 p2 ->
-         if f1 == f2 && d1 == d2
-            then glSeparableFilter2D
-                    (marshalConvolutionTarget Separable2D)
-                    (marshalPixelInternalFormat' int) w h f1 d1 p1 p2
-            else recordInvalidValue
-
-EXTENSION_ENTRY("GL_ARB_imaging",glSeparableFilter2D,GLenum -> GLenum -> GLsizei -> GLsizei -> GLenum -> GLenum -> Ptr a -> Ptr a -> IO ())
-
---------------------------------------------------------------------------------
-
-getSeparableFilter2D :: PixelData a -> PixelData a -> IO ()
-getSeparableFilter2D pdRow pdCol =
-   withPixelData pdRow $ \f1 d1 p1 ->
-      withPixelData pdCol $ \f2 d2 p2 ->
-         if f1 == f2 && d1 == d2
-            then glGetSeparableFilter
-                    (marshalConvolutionTarget Separable2D) f1 d1 p1 p2 nullPtr
-            else recordInvalidValue
-
-EXTENSION_ENTRY("GL_ARB_imaging",glGetSeparableFilter,GLenum -> GLenum -> GLenum -> Ptr a -> Ptr a -> Ptr a -> IO ())
-
---------------------------------------------------------------------------------
-
-copyConvolutionFilter1D :: PixelInternalFormat -> Position -> GLsizei -> IO ()
-copyConvolutionFilter1D int (Position x y) =
-   glCopyConvolutionFilter1D
-      (marshalConvolutionTarget Convolution1D) (marshalPixelInternalFormat' int)
-      x y
-
-EXTENSION_ENTRY("GL_ARB_imaging",glCopyConvolutionFilter1D,GLenum -> GLenum -> GLint -> GLint -> GLsizei -> IO ())
-
---------------------------------------------------------------------------------
-
-copyConvolutionFilter2D :: PixelInternalFormat -> Position -> Size -> IO ()
-copyConvolutionFilter2D int (Position x y) (Size w h) =
-   glCopyConvolutionFilter2D
-      (marshalConvolutionTarget Convolution2D) (marshalPixelInternalFormat' int)
-      x y w h
-
-EXTENSION_ENTRY("GL_ARB_imaging",glCopyConvolutionFilter2D,GLenum -> GLenum -> GLint -> GLint -> GLsizei -> GLsizei -> IO ())
-
---------------------------------------------------------------------------------
-
-data ConvolutionParameter =
-     ConvolutionBorderColor
-   | ConvolutionBorderMode
-   | ConvolutionFilterScale
-   | ConvolutionFilterBias
-   | ConvolutionFormat
-   | ConvolutionWidth
-   | ConvolutionHeight
-   | MaxConvolutionWidth
-   | MaxConvolutionHeight
-   deriving ( Eq, Ord, Show )
-
-marshalConvolutionParameter :: ConvolutionParameter -> GLenum
-marshalConvolutionParameter x = case x of
-   ConvolutionBorderColor -> 0x8154
-   ConvolutionBorderMode -> 0x8013
-   ConvolutionFilterScale -> 0x8014
-   ConvolutionFilterBias -> 0x8015
-   ConvolutionFormat -> 0x8017
-   ConvolutionWidth -> 0x8018
-   ConvolutionHeight -> 0x8019
-   MaxConvolutionWidth -> 0x801a
-   MaxConvolutionHeight -> 0x801b
-
---------------------------------------------------------------------------------
-
-convolutionWidth :: ConvolutionTarget -> GettableStateVar GLsizei
-convolutionWidth t = convolutionParameteri t ConvolutionWidth
-
-convolutionHeight :: ConvolutionTarget -> GettableStateVar GLsizei
-convolutionHeight t = convolutionParameteri t ConvolutionHeight
-
-maxConvolutionWidth :: ConvolutionTarget -> GettableStateVar GLsizei
-maxConvolutionWidth t = convolutionParameteri t MaxConvolutionWidth
-
-maxConvolutionHeight :: ConvolutionTarget -> GettableStateVar GLsizei
-maxConvolutionHeight t = convolutionParameteri t MaxConvolutionHeight
-
-convolutionParameteri ::
-   ConvolutionTarget -> ConvolutionParameter -> GettableStateVar GLsizei
-convolutionParameteri t p =
-   makeGettableStateVar (getConvolutionParameteri fromIntegral t p)
-
-getConvolutionParameteri ::
-   (GLint -> a) -> ConvolutionTarget -> ConvolutionParameter -> IO a
-getConvolutionParameteri f t p =
-   alloca $ \buf -> do
-      glGetConvolutionParameteriv
-         (marshalConvolutionTarget t) (marshalConvolutionParameter p) buf
-      peek1 f buf
-
-EXTENSION_ENTRY("GL_ARB_imaging",glGetConvolutionParameteriv,GLenum -> GLenum -> Ptr GLint -> IO ())
-
---------------------------------------------------------------------------------
-
-data ConvolutionBorderMode' =
-     Reduce'
-   | ConstantBorder'
-   | ReplicateBorder'
-
-marshalConvolutionBorderMode' :: ConvolutionBorderMode' -> GLint
-marshalConvolutionBorderMode' x = case x of
-   Reduce' -> 0x8016
-   ConstantBorder' -> 0x8151
-   ReplicateBorder' -> 0x8153
-
-unmarshalConvolutionBorderMode' :: GLint -> ConvolutionBorderMode'
-unmarshalConvolutionBorderMode' x
-   | x == 0x8016 = Reduce'
-   | x == 0x8151 = ConstantBorder'
-   | x == 0x8153 = ReplicateBorder'
-   | otherwise = error ("unmarshalConvolutionBorderMode': illegal value " ++ show x)
-
---------------------------------------------------------------------------------
-
-data ConvolutionBorderMode =
-     Reduce
-   | ConstantBorder (Color4 GLfloat)
-   | ReplicateBorder
-   deriving ( Eq, Ord, Show )
-
---------------------------------------------------------------------------------
-
-convolutionBorderMode :: ConvolutionTarget -> StateVar ConvolutionBorderMode
-convolutionBorderMode t =
-   makeStateVar (getConvolutionBorderMode t) (setConvolutionBorderMode t)
-
-getConvolutionBorderMode :: ConvolutionTarget -> IO ConvolutionBorderMode
-getConvolutionBorderMode t = do
-   mode <- getConvolutionParameteri
-              unmarshalConvolutionBorderMode' t ConvolutionBorderMode
-   case mode of
-      Reduce' -> return Reduce
-      ConstantBorder' -> do
-         c <- getConvolutionParameterC4f t ConvolutionBorderColor
-         return $ ConstantBorder c
-      ReplicateBorder' -> return ReplicateBorder
-
-setConvolutionBorderMode :: ConvolutionTarget -> ConvolutionBorderMode -> IO ()
-setConvolutionBorderMode t mode = do
-   let setBM = setConvolutionParameteri
-                  marshalConvolutionBorderMode' t ConvolutionBorderMode
-   case mode of
-      Reduce -> setBM Reduce'
-      ConstantBorder c -> do
-         setBM ConstantBorder'
-         convolutionParameterC4f t ConvolutionBorderColor c
-      ReplicateBorder -> setBM ReplicateBorder'
-
-setConvolutionParameteri ::
-   (a -> GLint) -> ConvolutionTarget -> ConvolutionParameter -> a -> IO ()
-setConvolutionParameteri f t p x =
-   glConvolutionParameteri
-      (marshalConvolutionTarget t) (marshalConvolutionParameter p) (f x)
-
-EXTENSION_ENTRY("GL_ARB_imaging",glConvolutionParameteri,GLenum -> GLenum -> GLint -> IO ())
-
---------------------------------------------------------------------------------
-
-convolutionFilterScale :: ConvolutionTarget -> StateVar (Color4 GLfloat)
-convolutionFilterScale = convolutionC4f ConvolutionFilterScale
-
-convolutionFilterBias :: ConvolutionTarget -> StateVar (Color4 GLfloat)
-convolutionFilterBias = convolutionC4f ConvolutionFilterBias
-
-convolutionC4f ::
-   ConvolutionParameter -> ConvolutionTarget -> StateVar (Color4 GLfloat)
-convolutionC4f p t =
-   makeStateVar (getConvolutionParameterC4f t p) (convolutionParameterC4f t p)
-
-getConvolutionParameterC4f ::
-   ConvolutionTarget -> ConvolutionParameter -> IO (Color4 GLfloat)
-getConvolutionParameterC4f t p =
-   alloca $ \buf -> do
-      glGetConvolutionParameterfv
-         (marshalConvolutionTarget t) (marshalConvolutionParameter p) buf
-      peek buf
-
-EXTENSION_ENTRY("GL_ARB_imaging",glGetConvolutionParameterfv,GLenum -> GLenum -> Ptr (Color4 GLfloat) -> IO ())
-
-convolutionParameterC4f ::
-   ConvolutionTarget -> ConvolutionParameter -> Color4 GLfloat -> IO ()
-convolutionParameterC4f t p c =
-   with c $
-      glConvolutionParameterfv
-         (marshalConvolutionTarget t) (marshalConvolutionParameter p)
-
-EXTENSION_ENTRY("GL_ARB_imaging",glConvolutionParameterfv,GLenum -> GLenum -> Ptr (Color4 GLfloat) -> IO ())
diff --git a/Graphics/Rendering/OpenGL/GL/PixelRectangles/Histogram.hs b/Graphics/Rendering/OpenGL/GL/PixelRectangles/Histogram.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/PixelRectangles/Histogram.hs
+++ /dev/null
@@ -1,157 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.PixelRectangles.Histogram
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to a part of section 3.6.1 (Pixel Storage Modes) of
--- the OpenGL 2.1 specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.PixelRectangles.Histogram (
-   Sink(..), histogram, Reset(..), getHistogram, resetHistogram,
-   histogramRGBASizes, histogramLuminanceSize
-) where
-
-import Foreign.Marshal.Alloc ( alloca )
-import Foreign.Ptr ( Ptr )
-import Graphics.Rendering.OpenGL.GL.Capability (
-   EnableCap(CapHistogram), makeStateVarMaybe )
-import Graphics.Rendering.OpenGL.GL.BasicTypes (
-   GLboolean, GLenum, GLint, GLsizei )
-import Graphics.Rendering.OpenGL.GL.Extensions (
-   FunPtr, unsafePerformIO, Invoker, getProcAddress )
-import Graphics.Rendering.OpenGL.GL.PeekPoke ( peek1 )
-import Graphics.Rendering.OpenGL.GL.PixelRectangles.Rasterization (
-    PixelData(..) )
-import Graphics.Rendering.OpenGL.GL.PixelRectangles.ColorTable (
-   PixelInternalFormat )
-import Graphics.Rendering.OpenGL.GL.PixelData ( withPixelData )
-import Graphics.Rendering.OpenGL.GL.Texturing.PixelInternalFormat (
-   marshalPixelInternalFormat', unmarshalPixelInternalFormat )
-import Graphics.Rendering.OpenGL.GL.PixelRectangles.ColorTable ( Proxy(..) )
-import Graphics.Rendering.OpenGL.GL.PixelRectangles.Sink (
-   Sink(..), marshalSink, unmarshalSink )
-import Graphics.Rendering.OpenGL.GL.PixelRectangles.Reset (
-   Reset(..), marshalReset )
-import Graphics.Rendering.OpenGL.GL.StateVar (
-   GettableStateVar, makeGettableStateVar, StateVar )
-import Graphics.Rendering.OpenGL.GL.VertexSpec ( Color4(..) )
-
---------------------------------------------------------------------------------
-
-#include "HsOpenGLExt.h"
-
---------------------------------------------------------------------------------
-
-data HistogramTarget =
-     Histogram
-   | ProxyHistogram
-
-marshalHistogramTarget :: HistogramTarget -> GLenum
-marshalHistogramTarget x = case x of
-   Histogram -> 0x8024
-   ProxyHistogram -> 0x8025
-
-proxyToHistogramTarget :: Proxy -> HistogramTarget
-proxyToHistogramTarget x = case x of
-   NoProxy -> Histogram
-   Proxy -> ProxyHistogram
-
---------------------------------------------------------------------------------
-
-histogram :: Proxy -> StateVar (Maybe (GLsizei, PixelInternalFormat, Sink))
-histogram proxy =
-   makeStateVarMaybe
-      (return CapHistogram) (getHistogram' proxy) (setHistogram proxy)
-
-getHistogram' :: Proxy -> IO (GLsizei, PixelInternalFormat, Sink)
-getHistogram' proxy = do
-   w <- getHistogramParameteri fromIntegral proxy HistogramWidth
-   f <- getHistogramParameteri unmarshalPixelInternalFormat proxy HistogramFormat
-   s <- getHistogramParameteri unmarshalSink proxy HistogramSink
-   return (w, f, s)
-
-getHistogramParameteri ::
-   (GLint -> a) -> Proxy -> GetHistogramParameterPName -> IO a
-getHistogramParameteri f proxy p =
-   alloca $ \buf -> do
-      glGetHistogramParameteriv
-         (marshalHistogramTarget (proxyToHistogramTarget proxy))
-         (marshalGetHistogramParameterPName p)
-         buf
-      peek1 f buf
-
-EXTENSION_ENTRY("GL_ARB_imaging",glGetHistogramParameteriv,GLenum -> GLenum -> Ptr GLint -> IO ())
-
-setHistogram :: Proxy -> (GLsizei, PixelInternalFormat, Sink) -> IO ()
-setHistogram proxy (w, int, sink) =
-   glHistogram
-      (marshalHistogramTarget (proxyToHistogramTarget proxy))
-      w
-      (marshalPixelInternalFormat' int)
-      (marshalSink sink)
-         
-EXTENSION_ENTRY("GL_ARB_imaging",glHistogram,GLenum -> GLsizei -> GLenum -> GLboolean -> IO ())
-
---------------------------------------------------------------------------------
-
-getHistogram :: Reset -> PixelData a -> IO ()
-getHistogram reset pd =
-   withPixelData pd $
-      glGetHistogram
-         (marshalHistogramTarget Histogram)
-         (marshalReset reset)
-
-EXTENSION_ENTRY("GL_ARB_imaging",glGetHistogram,GLenum -> GLboolean -> GLenum -> GLenum -> Ptr a -> IO ())
-
---------------------------------------------------------------------------------
-
-resetHistogram :: IO ()
-resetHistogram = glResetHistogram (marshalHistogramTarget Histogram)
-
-EXTENSION_ENTRY("GL_ARB_imaging",glResetHistogram,GLenum -> IO ())
-
---------------------------------------------------------------------------------
-
-data GetHistogramParameterPName =
-     HistogramWidth
-   | HistogramFormat
-   | HistogramRedSize
-   | HistogramGreenSize
-   | HistogramBlueSize
-   | HistogramAlphaSize
-   | HistogramLuminanceSize
-   | HistogramSink
-
-marshalGetHistogramParameterPName :: GetHistogramParameterPName -> GLenum
-marshalGetHistogramParameterPName x = case x of
-   HistogramWidth -> 0x8026
-   HistogramFormat -> 0x8027
-   HistogramRedSize -> 0x8028
-   HistogramGreenSize -> 0x8029
-   HistogramBlueSize -> 0x802a
-   HistogramAlphaSize -> 0x802b
-   HistogramLuminanceSize -> 0x802c
-   HistogramSink -> 0x802d
-
---------------------------------------------------------------------------------
-
-histogramRGBASizes :: Proxy -> GettableStateVar (Color4 GLsizei)
-histogramRGBASizes proxy =
-   makeGettableStateVar $ do
-      r <- getHistogramParameteri fromIntegral proxy HistogramRedSize
-      g <- getHistogramParameteri fromIntegral proxy HistogramGreenSize
-      b <- getHistogramParameteri fromIntegral proxy HistogramBlueSize
-      a <- getHistogramParameteri fromIntegral proxy HistogramAlphaSize
-      return $ Color4 r g b a
-
-histogramLuminanceSize :: Proxy -> GettableStateVar GLsizei
-histogramLuminanceSize proxy =
-   makeGettableStateVar $
-      getHistogramParameteri id proxy HistogramLuminanceSize
diff --git a/Graphics/Rendering/OpenGL/GL/PixelRectangles/Minmax.hs b/Graphics/Rendering/OpenGL/GL/PixelRectangles/Minmax.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/PixelRectangles/Minmax.hs
+++ /dev/null
@@ -1,114 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.PixelRectangles.Minmax
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to a part of section 3.6.1 (Pixel Storage Modes) of
--- the OpenGL 2.1 specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.PixelRectangles.Minmax (
-   minmax, getMinmax, resetMinmax
-) where
-
-import Foreign.Marshal.Alloc ( alloca )
-import Foreign.Ptr ( Ptr )
-import Graphics.Rendering.OpenGL.GL.Capability (
-   EnableCap(CapMinmax), makeStateVarMaybe )
-import Graphics.Rendering.OpenGL.GL.BasicTypes ( GLboolean, GLenum, GLint )
-import Graphics.Rendering.OpenGL.GL.Extensions (
-   FunPtr, unsafePerformIO, Invoker, getProcAddress )
-import Graphics.Rendering.OpenGL.GL.PeekPoke ( peek1 )
-import Graphics.Rendering.OpenGL.GL.PixelRectangles.ColorTable (
-   PixelInternalFormat )
-import Graphics.Rendering.OpenGL.GL.PixelRectangles.Rasterization (
-    PixelData(..) )
-import Graphics.Rendering.OpenGL.GL.PixelData ( withPixelData )
-import Graphics.Rendering.OpenGL.GL.Texturing.PixelInternalFormat (
-   marshalPixelInternalFormat', unmarshalPixelInternalFormat )
-import Graphics.Rendering.OpenGL.GL.PixelRectangles.Histogram (
-   Reset(..), Sink )
-import Graphics.Rendering.OpenGL.GL.PixelRectangles.Reset (
-   marshalReset )
-import Graphics.Rendering.OpenGL.GL.PixelRectangles.Sink (
-   marshalSink, unmarshalSink )
-import Graphics.Rendering.OpenGL.GL.StateVar ( StateVar )
-
---------------------------------------------------------------------------------
-
-#include "HsOpenGLExt.h"
-
---------------------------------------------------------------------------------
-
-data MinmaxTarget =
-     Minmax
-
-marshalMinmaxTarget :: MinmaxTarget -> GLenum
-marshalMinmaxTarget x = case x of
-   Minmax -> 0x802e
-
---------------------------------------------------------------------------------
-
-minmax :: StateVar (Maybe (PixelInternalFormat, Sink))
-minmax = makeStateVarMaybe (return CapMinmax) getMinmax' setMinmax
-
-getMinmax' :: IO (PixelInternalFormat, Sink)
-getMinmax' = do
-   f <- getMinmaxParameteri unmarshalPixelInternalFormat MinmaxFormat
-   s <- getMinmaxParameteri unmarshalSink MinmaxSink
-   return (f, s)
-
-setMinmax :: (PixelInternalFormat, Sink) -> IO ()
-setMinmax (int, sink) =
-   glMinmax
-      (marshalMinmaxTarget Minmax)
-      (marshalPixelInternalFormat' int)
-      (marshalSink sink)
-
-EXTENSION_ENTRY("GL_ARB_imaging",glMinmax,GLenum -> GLenum -> GLboolean -> IO ())
-
---------------------------------------------------------------------------------
-
-getMinmax :: Reset -> PixelData a -> IO ()
-getMinmax reset pd =
-   withPixelData pd $
-      glGetMinmax (marshalMinmaxTarget Minmax) (marshalReset reset)
-
-EXTENSION_ENTRY("GL_ARB_imaging",glGetMinmax,GLenum -> GLboolean -> GLenum -> GLenum -> Ptr a -> IO ())
-
---------------------------------------------------------------------------------
-
-resetMinmax :: IO ()
-resetMinmax = glResetMinmax (marshalMinmaxTarget Minmax)
-
-EXTENSION_ENTRY("GL_ARB_imaging",glResetMinmax,GLenum -> IO ())
-
---------------------------------------------------------------------------------
-
-data GetMinmaxParameterPName =
-     MinmaxFormat
-   | MinmaxSink
-
-marshalGetMinmaxParameterPName :: GetMinmaxParameterPName -> GLenum
-marshalGetMinmaxParameterPName x = case x of
-   MinmaxFormat -> 0x802f
-   MinmaxSink -> 0x8030
-
---------------------------------------------------------------------------------
-
-getMinmaxParameteri :: (GLint -> a) -> GetMinmaxParameterPName -> IO a
-getMinmaxParameteri f p =
-   alloca $ \buf -> do
-      glGetMinmaxParameteriv
-         (marshalMinmaxTarget Minmax)
-         (marshalGetMinmaxParameterPName p)
-         buf
-      peek1 f buf
-
-EXTENSION_ENTRY("GL_ARB_imaging",glGetMinmaxParameteriv,GLenum -> GLenum -> Ptr GLint -> IO ())
diff --git a/Graphics/Rendering/OpenGL/GL/PixelRectangles/PixelMap.hs b/Graphics/Rendering/OpenGL/GL/PixelRectangles/PixelMap.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/PixelRectangles/PixelMap.hs
+++ /dev/null
@@ -1,244 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.PixelRectangles.PixelMap
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to a part of section 3.6.1 (Pixel Storage Modes) of
--- the OpenGL 2.1 specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.PixelRectangles.PixelMap (
-   PixelMapTarget(..), PixelMapComponent, PixelMap(..), GLpixelmap,
-   maxPixelMapTable, pixelMap, pixelMapIToRGBA, pixelMapRGBAToRGBA,
-) where
-
-import Data.List ( zipWith4 )
-import Data.Word
-import Foreign.ForeignPtr ( ForeignPtr, mallocForeignPtrArray, withForeignPtr )
-import Foreign.Marshal.Array ( allocaArray, peekArray, pokeArray, withArrayLen )
-import Foreign.Ptr ( Ptr )
-import Foreign.Storable ( Storable(..) )
-import Graphics.Rendering.OpenGL.GL.BasicTypes (
-   GLenum, GLushort, GLuint, GLsizei, GLfloat )
-import Graphics.Rendering.OpenGL.GL.QueryUtils (
-   GetPName(GetMaxPixelMapTable,GetPixelMapIToISize,GetPixelMapSToSSize,
-            GetPixelMapIToRSize,GetPixelMapIToGSize,GetPixelMapIToBSize,
-            GetPixelMapIToASize,GetPixelMapRToRSize,GetPixelMapGToGSize,
-            GetPixelMapBToBSize,GetPixelMapAToASize),
-   getInteger1, getSizei1 )
-import Graphics.Rendering.OpenGL.GL.StateVar (
-   HasSetter(($=)), HasGetter(get), GettableStateVar, makeGettableStateVar,
-   StateVar, makeStateVar )
-import Graphics.Rendering.OpenGL.GL.VertexSpec ( Color4(..) )
-
---------------------------------------------------------------------------------
-
-#include "HsOpenGLTypes.h"
-
---------------------------------------------------------------------------------
-
-data PixelMapTarget =
-     IToI
-   | SToS
-   | IToR
-   | IToG
-   | IToB
-   | IToA
-   | RToR
-   | GToG
-   | BToB
-   | AToA
-
-marshalPixelMapTarget :: PixelMapTarget -> GLenum
-marshalPixelMapTarget x = case x of
-   IToI -> 0xc70
-   SToS -> 0xc71
-   IToR -> 0xc72
-   IToG -> 0xc73
-   IToB -> 0xc74
-   IToA -> 0xc75
-   RToR -> 0xc76
-   GToG -> 0xc77
-   BToB -> 0xc78
-   AToA -> 0xc79
-
-pixelMapTargetToGetPName :: PixelMapTarget -> GetPName
-pixelMapTargetToGetPName x = case x of
-   IToI -> GetPixelMapIToISize
-   SToS -> GetPixelMapSToSSize
-   IToR -> GetPixelMapIToRSize
-   IToG -> GetPixelMapIToGSize
-   IToB -> GetPixelMapIToBSize
-   IToA -> GetPixelMapIToASize
-   RToR -> GetPixelMapRToRSize
-   GToG -> GetPixelMapGToGSize
-   BToB -> GetPixelMapBToBSize
-   AToA -> GetPixelMapAToASize
-
---------------------------------------------------------------------------------
-
-maxPixelMapTable :: GettableStateVar GLsizei
-maxPixelMapTable = makeGettableStateVar $ getSizei1 id GetMaxPixelMapTable
-
---------------------------------------------------------------------------------
-
-class Storable c => PixelMapComponent c where
-   getPixelMapv :: GLenum -> Ptr c -> IO ()
-   pixelMapv :: GLenum -> GLsizei -> Ptr c -> IO ()
-
-instance PixelMapComponent GLushort_ where
-   getPixelMapv = glGetPixelMapusv
-   pixelMapv = glPixelMapusv
-
-foreign import CALLCONV unsafe "glGetPixelMapusv" glGetPixelMapusv ::
-   GLenum -> Ptr GLushort -> IO ()
-
-foreign import CALLCONV unsafe "glPixelMapusv" glPixelMapusv ::
-   GLenum -> GLsizei -> Ptr GLushort -> IO ()
-
-instance PixelMapComponent GLuint_ where
-   getPixelMapv = glGetPixelMapuiv
-   pixelMapv = glPixelMapuiv
-
-foreign import CALLCONV unsafe "glGetPixelMapuiv" glGetPixelMapuiv ::
-   GLenum -> Ptr GLuint -> IO ()
-
-foreign import CALLCONV unsafe "glPixelMapuiv" glPixelMapuiv ::
-   GLenum -> GLsizei -> Ptr GLuint -> IO ()
-
-instance PixelMapComponent GLfloat_ where
-   getPixelMapv = glGetPixelMapfv
-   pixelMapv = glPixelMapfv
-
-foreign import CALLCONV unsafe "glGetPixelMapfv" glGetPixelMapfv ::
-   GLenum -> Ptr GLfloat -> IO ()
-
-foreign import CALLCONV unsafe "glPixelMapfv" glPixelMapfv ::
-   GLenum -> GLsizei -> Ptr GLfloat -> IO ()
-
---------------------------------------------------------------------------------
-
-class PixelMap m where
-   withNewPixelMap ::
-      PixelMapComponent c => Int -> (Ptr c -> IO ()) -> IO (m c)
-   withPixelMap ::
-      PixelMapComponent c => m c -> (Int -> Ptr c -> IO a) -> IO a
-   newPixelMap :: PixelMapComponent c => [c] -> IO (m c)
-   getPixelMapComponents :: PixelMapComponent c => m c -> IO [c]
-
-   withNewPixelMap size act =
-      allocaArray size $ \p -> do
-         act p
-         components <- peekArray size p
-         newPixelMap components
-
-   withPixelMap m act = do
-      components <- getPixelMapComponents m
-      withArrayLen components act
-
-   newPixelMap elements =
-      withNewPixelMap (length elements) $ flip pokeArray elements
-
-   getPixelMapComponents m =
-      withPixelMap m peekArray
-
---------------------------------------------------------------------------------
-
-data GLpixelmap a = GLpixelmap Int (ForeignPtr a)
-#ifdef __HADDOCK__
--- Help Haddock a bit, because it doesn't do any instance inference.
-instance Eq (GLpixelmap a)
-instance Ord (GLpixelmap a)
-instance Show (GLpixelmap a)
-#else
-   deriving ( Eq, Ord, Show )
-#endif
-
-instance PixelMap GLpixelmap where
-   withNewPixelMap size f = do
-      fp <- mallocForeignPtrArray size
-      withForeignPtr fp f
-      return $ GLpixelmap size fp
-
-   withPixelMap (GLpixelmap size fp) f = withForeignPtr fp (f size)
-
---------------------------------------------------------------------------------
-
-pixelMap :: (PixelMap m, PixelMapComponent c) => PixelMapTarget -> StateVar (m c)
-pixelMap pm =
-   makeStateVar
-      (do size <- pixelMapSize pm
-          withNewPixelMap size $ getPixelMapv (marshalPixelMapTarget pm))
-      (\theMap -> withPixelMap theMap $ pixelMapv (marshalPixelMapTarget pm) . fromIntegral)
-
-pixelMapSize :: PixelMapTarget -> IO Int
-pixelMapSize = getInteger1 fromIntegral . pixelMapTargetToGetPName
-
---------------------------------------------------------------------------------
-
--- | Convenience state variable
-
-pixelMapIToRGBA :: PixelMapComponent c => StateVar [Color4 c]
-pixelMapIToRGBA = pixelMapXToY (IToR, IToG, IToB, IToA)
-
--- | Convenience state variable
-
-pixelMapRGBAToRGBA :: PixelMapComponent c => StateVar [Color4 c]
-pixelMapRGBAToRGBA = pixelMapXToY (RToR, GToG, BToB, AToA)
-
-pixelMapXToY :: PixelMapComponent c =>
-      (PixelMapTarget, PixelMapTarget, PixelMapTarget, PixelMapTarget)
-   -> StateVar [Color4 c]
-pixelMapXToY targets =
-   makeStateVar (getPixelMapXToY targets) (setPixelMapXToY targets)
-
-getPixelMapXToY :: PixelMapComponent c
-   => (PixelMapTarget, PixelMapTarget, PixelMapTarget, PixelMapTarget)
-   -> IO [Color4 c]
-getPixelMapXToY (toR, toG, toB, toA) = do
-   withPixelMapFor toR $ \sizeR bufR ->
-      withPixelMapFor toG $ \sizeG bufG ->
-         withPixelMapFor toB $ \sizeB bufB ->
-            withPixelMapFor toA $ \sizeA bufA -> do
-               let maxSize = sizeR `max` sizeG `max` sizeB `max` sizeA
-               r <- sample sizeR bufR maxSize
-               g <- sample sizeR bufG maxSize
-               b <- sample sizeR bufB maxSize
-               a <- sample sizeR bufA maxSize
-               return $ zipWith4 Color4 r g b a
-
-withPixelMapFor ::
-    PixelMapComponent c => PixelMapTarget -> (Int -> Ptr c -> IO a) -> IO a
-withPixelMapFor target f = do
-    theMap <- get (pixelMap target)
-    withGLpixelmap theMap f
-
-withGLpixelmap :: PixelMapComponent c
-               => GLpixelmap c -> (Int -> Ptr c -> IO a) -> IO a
-withGLpixelmap = withPixelMap
-
-sample :: Storable a => Int -> Ptr a -> Int -> IO [a]
-sample len ptr newLen = f (fromIntegral (newLen - 1)) []
-   where scale :: Float
-         scale = fromIntegral len / fromIntegral newLen
-         f l acc | l < 0     = return acc
-                 | otherwise = do e <- peekElemOff ptr (truncate (l * scale))
-                                  f (l - 1) (e : acc)
-
-setPixelMapXToY :: PixelMapComponent c
-   => (PixelMapTarget, PixelMapTarget, PixelMapTarget, PixelMapTarget)
-   -> [Color4 c] -> IO ()
-setPixelMapXToY (toR, toG, toB, toA) colors = do
-   (pixelMap toR $=) =<< newGLpixelmap [ r | Color4 r _ _ _ <- colors ]
-   (pixelMap toG $=) =<< newGLpixelmap [ g | Color4 _ g _ _ <- colors ]
-   (pixelMap toB $=) =<< newGLpixelmap [ b | Color4 _ _ b _ <- colors ]
-   (pixelMap toA $=) =<< newGLpixelmap [ a | Color4 _ _ _ a <- colors ]
-
-newGLpixelmap :: PixelMapComponent c => [c] -> IO (GLpixelmap c)
-newGLpixelmap = newPixelMap
diff --git a/Graphics/Rendering/OpenGL/GL/PixelRectangles/PixelStorage.hs b/Graphics/Rendering/OpenGL/GL/PixelRectangles/PixelStorage.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/PixelRectangles/PixelStorage.hs
+++ /dev/null
@@ -1,128 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.PixelRectangles.PixelStorage
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to section 3.6.1 (Pixel Storage Modes) of the
--- OpenGL 2.1 specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.PixelRectangles.PixelStorage (
-   PixelStoreDirection(..), swapBytes, lsbFirst, rowLength, skipRows,
-   skipPixels, rowAlignment, imageHeight, skipImages
-) where
-
-import Graphics.Rendering.OpenGL.GL.BasicTypes ( GLenum, GLint )
-import Graphics.Rendering.OpenGL.GL.GLboolean (
-   marshalGLboolean, unmarshalGLboolean )
-import Graphics.Rendering.OpenGL.GL.QueryUtils (
-   GetPName(GetUnpackSwapBytes,GetUnpackLSBFirst,GetUnpackRowLength,
-            GetUnpackSkipRows,GetUnpackSkipPixels,GetUnpackAlignment,
-            GetUnpackImageHeight,GetUnpackSkipImages,GetPackSwapBytes,
-            GetPackLSBFirst,GetPackRowLength,GetPackSkipRows,GetPackSkipPixels,
-            GetPackAlignment,GetPackImageHeight,GetPackSkipImages),
-   getBoolean1, getInteger1 )
-import Graphics.Rendering.OpenGL.GL.StateVar ( StateVar, makeStateVar )
-
---------------------------------------------------------------------------------
-
-data PixelStoreDirection =
-     Pack
-   | Unpack
-   deriving ( Eq, Ord, Show )
-
---------------------------------------------------------------------------------
-
-data PixelStore =
-     UnpackSwapBytes
-   | UnpackLSBFirst
-   | UnpackRowLength
-   | UnpackSkipRows
-   | UnpackSkipPixels
-   | UnpackAlignment
-   | PackSwapBytes
-   | PackLSBFirst
-   | PackRowLength
-   | PackSkipRows
-   | PackSkipPixels
-   | PackAlignment
-   | PackSkipImages
-   | PackImageHeight
-   | UnpackSkipImages
-   | UnpackImageHeight
-
-marshalPixelStore :: PixelStore -> GLenum
-marshalPixelStore x = case x of
-   UnpackSwapBytes -> 0xcf0
-   UnpackLSBFirst -> 0xcf1
-   UnpackRowLength -> 0xcf2
-   UnpackSkipRows -> 0xcf3
-   UnpackSkipPixels -> 0xcf4
-   UnpackAlignment -> 0xcf5
-   PackSwapBytes -> 0xd00
-   PackLSBFirst -> 0xd01
-   PackRowLength -> 0xd02
-   PackSkipRows -> 0xd03
-   PackSkipPixels -> 0xd04
-   PackAlignment -> 0xd05
-   PackSkipImages -> 0x806b
-   PackImageHeight -> 0x806c
-   UnpackSkipImages -> 0x806d
-   UnpackImageHeight -> 0x806e
-
---------------------------------------------------------------------------------
-
-swapBytes :: PixelStoreDirection -> StateVar Bool
-swapBytes Pack   = pixelStoreb GetPackSwapBytes PackSwapBytes
-swapBytes Unpack = pixelStoreb GetUnpackSwapBytes UnpackSwapBytes
-
-lsbFirst :: PixelStoreDirection -> StateVar Bool
-lsbFirst Pack   = pixelStoreb GetPackLSBFirst PackLSBFirst
-lsbFirst Unpack = pixelStoreb GetUnpackLSBFirst UnpackLSBFirst
-
-rowLength :: PixelStoreDirection -> StateVar GLint
-rowLength Pack   = pixelStorei GetPackRowLength PackRowLength
-rowLength Unpack = pixelStorei GetUnpackRowLength UnpackRowLength
-
-skipRows :: PixelStoreDirection -> StateVar GLint
-skipRows Pack   = pixelStorei GetPackSkipRows PackSkipRows
-skipRows Unpack = pixelStorei GetUnpackSkipRows UnpackSkipRows
-
-skipPixels :: PixelStoreDirection -> StateVar GLint
-skipPixels Pack   = pixelStorei GetPackSkipPixels PackSkipPixels
-skipPixels Unpack = pixelStorei GetUnpackSkipPixels UnpackSkipPixels
-
-rowAlignment :: PixelStoreDirection -> StateVar GLint
-rowAlignment Pack   = pixelStorei GetPackAlignment PackAlignment
-rowAlignment Unpack = pixelStorei GetUnpackAlignment UnpackAlignment
-
-imageHeight :: PixelStoreDirection -> StateVar GLint
-imageHeight Pack   = pixelStorei GetPackImageHeight PackImageHeight
-imageHeight Unpack = pixelStorei GetUnpackImageHeight UnpackImageHeight
-
-skipImages :: PixelStoreDirection -> StateVar GLint
-skipImages Pack   = pixelStorei GetPackSkipImages PackSkipImages
-skipImages Unpack = pixelStorei GetUnpackSkipImages UnpackSkipImages
-
---------------------------------------------------------------------------------
-
-pixelStoreb :: GetPName -> PixelStore -> StateVar Bool
-pixelStoreb pn ps =
-   makeStateVar
-      (getBoolean1 unmarshalGLboolean pn)
-      (glPixelStorei (marshalPixelStore ps) . marshalGLboolean)
-
-pixelStorei :: GetPName -> PixelStore -> StateVar GLint
-pixelStorei pn ps =
-   makeStateVar
-      (getInteger1 id pn)
-      (glPixelStorei (marshalPixelStore ps))
-
-foreign import CALLCONV unsafe "glPixelStorei" glPixelStorei ::
-   GLenum -> GLint -> IO ()
diff --git a/Graphics/Rendering/OpenGL/GL/PixelRectangles/PixelTransfer.hs b/Graphics/Rendering/OpenGL/GL/PixelRectangles/PixelTransfer.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/PixelRectangles/PixelTransfer.hs
+++ /dev/null
@@ -1,253 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.PixelRectangles.PixelTransfer
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to a part of section 3.6.1 (Pixel Storage Modes) of
--- the OpenGL 2.1 specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.PixelRectangles.PixelTransfer (
-   PixelTransferStage(..),
-   mapColor, mapStencil, indexShift, indexOffset, depthScale, depthBias,
-   rgbaScale, rgbaBias
-) where
-
-import Graphics.Rendering.OpenGL.GL.Capability (
-   marshalCapability, unmarshalCapability )
-import Graphics.Rendering.OpenGL.GL.BasicTypes (
-   GLenum, GLint, GLfloat, Capability )
-import Graphics.Rendering.OpenGL.GL.QueryUtils (
-   GetPName(GetMapColor,GetMapStencil,GetIndexShift,GetIndexOffset,
-            GetRedScale,GetGreenScale,GetBlueScale,GetAlphaScale,GetDepthScale,
-            GetRedBias,GetGreenBias,GetBlueBias,GetAlphaBias,GetDepthBias,
-            GetPostConvolutionRedScale,GetPostConvolutionGreenScale,
-            GetPostConvolutionBlueScale,GetPostConvolutionAlphaScale,
-            GetPostConvolutionRedBias,GetPostConvolutionGreenBias,
-            GetPostConvolutionBlueBias,GetPostConvolutionAlphaBias,
-            GetPostColorMatrixRedScale,GetPostColorMatrixGreenScale,
-            GetPostColorMatrixBlueScale,GetPostColorMatrixAlphaScale,
-            GetPostColorMatrixRedBias,GetPostColorMatrixGreenBias,
-            GetPostColorMatrixBlueBias,GetPostColorMatrixAlphaBias),
-   getBoolean1, getInteger1, getFloat1 )
-import Graphics.Rendering.OpenGL.GL.StateVar ( StateVar, makeStateVar )
-import Graphics.Rendering.OpenGL.GL.VertexSpec ( Color4(..) )
-
---------------------------------------------------------------------------------
-
-data PixelTransfer =
-     MapColor
-   | MapStencil
-   | IndexShift
-   | IndexOffset
-   | RedScale
-   | RedBias
-   | GreenScale
-   | GreenBias
-   | BlueScale
-   | BlueBias
-   | AlphaScale
-   | AlphaBias
-   | DepthScale
-   | DepthBias
-   | PostConvolutionRedScale
-   | PostConvolutionGreenScale
-   | PostConvolutionBlueScale
-   | PostConvolutionAlphaScale
-   | PostConvolutionRedBias
-   | PostConvolutionGreenBias
-   | PostConvolutionBlueBias
-   | PostConvolutionAlphaBias
-   | PostColorMatrixRedScale
-   | PostColorMatrixGreenScale
-   | PostColorMatrixBlueScale
-   | PostColorMatrixAlphaScale
-   | PostColorMatrixRedBias
-   | PostColorMatrixGreenBias
-   | PostColorMatrixBlueBias
-   | PostColorMatrixAlphaBias
-
-marshalPixelTransfer :: PixelTransfer -> GLenum
-marshalPixelTransfer x = case x of
-   MapColor -> 0xd10
-   MapStencil -> 0xd11
-   IndexShift -> 0xd12
-   IndexOffset -> 0xd13
-   RedScale -> 0xd14
-   RedBias -> 0xd15
-   GreenScale -> 0xd18
-   GreenBias -> 0xd19
-   BlueScale -> 0xd1a
-   BlueBias -> 0xd1b
-   AlphaScale -> 0xd1c
-   AlphaBias -> 0xd1d
-   DepthScale -> 0xd1e
-   DepthBias -> 0xd1f
-   PostConvolutionRedScale -> 0x801c
-   PostConvolutionGreenScale -> 0x801d
-   PostConvolutionBlueScale -> 0x801e
-   PostConvolutionAlphaScale -> 0x801f
-   PostConvolutionRedBias -> 0x8020
-   PostConvolutionGreenBias -> 0x8021
-   PostConvolutionBlueBias -> 0x8022
-   PostConvolutionAlphaBias -> 0x8023
-   PostColorMatrixRedScale -> 0x80b4
-   PostColorMatrixGreenScale -> 0x80b5
-   PostColorMatrixBlueScale -> 0x80b6
-   PostColorMatrixAlphaScale -> 0x80b7
-   PostColorMatrixRedBias -> 0x80b8
-   PostColorMatrixGreenBias -> 0x80b9
-   PostColorMatrixBlueBias -> 0x80ba
-   PostColorMatrixAlphaBias -> 0x80bb
-
---------------------------------------------------------------------------------
-
-data PixelTransferStage =
-     PreConvolution
-   | PostConvolution
-   | PostColorMatrix
-   deriving ( Eq, Ord, Show )
-
-stageToGetScales ::
-      PixelTransferStage
-   -> (GetPName, GetPName, GetPName, GetPName)
-stageToGetScales s = case s of
-   PreConvolution  -> (GetRedScale,
-                       GetGreenScale,
-                       GetBlueScale,
-                       GetAlphaScale)
-   PostConvolution -> (GetPostConvolutionRedScale,
-                       GetPostConvolutionGreenScale,
-                       GetPostConvolutionBlueScale,
-                       GetPostConvolutionAlphaScale)
-   PostColorMatrix -> (GetPostColorMatrixRedScale,
-                       GetPostColorMatrixGreenScale,
-                       GetPostColorMatrixBlueScale,
-                       GetPostColorMatrixAlphaScale)
-
-stageToSetScales ::
-      PixelTransferStage
-   -> (PixelTransfer, PixelTransfer, PixelTransfer, PixelTransfer)
-stageToSetScales s = case s of
-   PreConvolution  -> (RedScale,
-                       GreenScale,
-                       BlueScale,
-                       AlphaScale)
-   PostConvolution -> (PostConvolutionRedScale,
-                       PostConvolutionGreenScale,
-                       PostConvolutionBlueScale,
-                       PostConvolutionAlphaScale)
-   PostColorMatrix -> (PostColorMatrixRedScale,
-                       PostColorMatrixGreenScale,
-                       PostColorMatrixBlueScale,
-                       PostColorMatrixAlphaScale)
-
-stageToGetBiases ::
-      PixelTransferStage
-   -> (GetPName, GetPName, GetPName, GetPName)
-stageToGetBiases s = case s of
-   PreConvolution  -> (GetRedBias,
-                       GetGreenBias,
-                       GetBlueBias,
-                       GetAlphaBias)
-   PostConvolution -> (GetPostConvolutionRedBias,
-                       GetPostConvolutionGreenBias,
-                       GetPostConvolutionBlueBias,
-                       GetPostConvolutionAlphaBias)
-   PostColorMatrix -> (GetPostColorMatrixRedBias,
-                       GetPostColorMatrixGreenBias,
-                       GetPostColorMatrixBlueBias,
-                       GetPostColorMatrixAlphaBias)
-
-stageToSetBiases ::
-      PixelTransferStage
-   -> (PixelTransfer, PixelTransfer, PixelTransfer, PixelTransfer)
-stageToSetBiases s = case s of
-   PreConvolution  -> (RedBias,
-                       GreenBias,
-                       BlueBias,
-                       AlphaBias)
-   PostConvolution -> (PostConvolutionRedBias,
-                       PostConvolutionGreenBias,
-                       PostConvolutionBlueBias,
-                       PostConvolutionAlphaBias)
-   PostColorMatrix -> (PostColorMatrixRedBias,
-                       PostColorMatrixGreenBias,
-                       PostColorMatrixBlueBias,
-                       PostColorMatrixAlphaBias)
-
---------------------------------------------------------------------------------
-
-mapColor :: StateVar Capability
-mapColor = pixelTransferb GetMapColor MapColor
-
-mapStencil :: StateVar Capability
-mapStencil = pixelTransferb GetMapStencil MapStencil
-
-indexShift :: StateVar GLint
-indexShift = pixelTransferi GetIndexShift IndexShift
-
-indexOffset :: StateVar GLint
-indexOffset = pixelTransferi GetIndexOffset IndexOffset
-
-depthScale :: StateVar GLfloat
-depthScale = pixelTransferf GetDepthScale DepthScale
-
-depthBias :: StateVar GLfloat
-depthBias = pixelTransferf GetDepthBias DepthBias
-
-rgbaScale :: PixelTransferStage -> StateVar (Color4 GLfloat)
-rgbaScale s = pixelTransfer4f (stageToGetScales s) (stageToSetScales s)
-
-rgbaBias :: PixelTransferStage -> StateVar (Color4 GLfloat)
-rgbaBias s = pixelTransfer4f (stageToGetBiases s) (stageToSetBiases s)
-
---------------------------------------------------------------------------------
-
-pixelTransferb :: GetPName -> PixelTransfer -> StateVar Capability
-pixelTransferb pn pt =
-   makeStateVar
-      (getBoolean1 unmarshalCapability pn)
-      (glPixelTransferi (marshalPixelTransfer pt) .
-       fromIntegral . marshalCapability)
-
-pixelTransferi :: GetPName -> PixelTransfer -> StateVar GLint
-pixelTransferi pn pt =
-   makeStateVar
-      (getInteger1 id pn)
-      (glPixelTransferi (marshalPixelTransfer pt))
-
-foreign import CALLCONV unsafe "glPixelTransferi" glPixelTransferi ::
-   GLenum -> GLint -> IO ()
-
-pixelTransferf :: GetPName -> PixelTransfer -> StateVar GLfloat
-pixelTransferf pn pt =
-   makeStateVar
-      (getFloat1 id pn)
-      (glPixelTransferf (marshalPixelTransfer pt))
-
-pixelTransfer4f ::
-      (GetPName,      GetPName,      GetPName,      GetPName)
-   -> (PixelTransfer, PixelTransfer, PixelTransfer, PixelTransfer)
-   -> StateVar (Color4 GLfloat)
-pixelTransfer4f (pr, pg, pb, pa) (tr, tg, tb, ta) = makeStateVar get4f set4f
-   where get4f = do
-            r <- getFloat1 id pr
-            g <- getFloat1 id pg
-            b <- getFloat1 id pb
-            a <- getFloat1 id pa
-            return $ Color4 r g b a
-         set4f (Color4 r g b a) = do
-            glPixelTransferf (marshalPixelTransfer tr) r
-            glPixelTransferf (marshalPixelTransfer tg) g
-            glPixelTransferf (marshalPixelTransfer tb) b
-            glPixelTransferf (marshalPixelTransfer ta) a
-
-foreign import CALLCONV unsafe "glPixelTransferf" glPixelTransferf ::
-   GLenum -> GLfloat -> IO ()
diff --git a/Graphics/Rendering/OpenGL/GL/PixelRectangles/Rasterization.hs b/Graphics/Rendering/OpenGL/GL/PixelRectangles/Rasterization.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/PixelRectangles/Rasterization.hs
+++ /dev/null
@@ -1,47 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.PixelRectangles.Rasterization
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to a part of section 3.6.4 (Rasterization of Pixel
--- Rectangles) of the OpenGL 2.1 specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.PixelRectangles.Rasterization (
-   PixelData(..), PixelFormat(..), drawPixels, pixelZoom
-) where
-
-import Control.Monad ( liftM2 )
-import Foreign.Ptr ( Ptr )
-import Graphics.Rendering.OpenGL.GL.BasicTypes ( GLenum, GLsizei, GLfloat )
-import Graphics.Rendering.OpenGL.GL.CoordTrans ( Size(..) )
-import Graphics.Rendering.OpenGL.GL.PixelData ( PixelData(..), withPixelData )
-import Graphics.Rendering.OpenGL.GL.PixelFormat ( PixelFormat(..) )
-import Graphics.Rendering.OpenGL.GL.QueryUtils (
-   GetPName(GetZoomX,GetZoomY), getFloat1 )
-import Graphics.Rendering.OpenGL.GL.StateVar ( StateVar, makeStateVar )
-
---------------------------------------------------------------------------------
-
-drawPixels :: Size -> PixelData a -> IO ()
-drawPixels (Size w h) pd = withPixelData pd $ glDrawPixels w h
-
-foreign import CALLCONV unsafe "glDrawPixels" glDrawPixels ::
-   GLsizei -> GLsizei -> GLenum -> GLenum -> Ptr a -> IO ()
-
---------------------------------------------------------------------------------
-
-pixelZoom :: StateVar (GLfloat, GLfloat)
-pixelZoom =
-   makeStateVar
-      (liftM2 (,) (getFloat1 id GetZoomX) (getFloat1 id GetZoomY))
-      (uncurry glPixelZoom)
-
-foreign import CALLCONV unsafe "glPixelZoom" glPixelZoom ::
-   GLfloat -> GLfloat -> IO ()
diff --git a/Graphics/Rendering/OpenGL/GL/PixelRectangles/Reset.hs b/Graphics/Rendering/OpenGL/GL/PixelRectangles/Reset.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/PixelRectangles/Reset.hs
+++ /dev/null
@@ -1,31 +0,0 @@
--- #hide
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.PixelRectangles.Reset
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This is a purely internal module for (un-)marshaling Reset.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.PixelRectangles.Reset (
-   Reset(..), marshalReset
-) where
-
-import Graphics.Rendering.OpenGL.GL.BasicTypes ( GLboolean )
-import Graphics.Rendering.OpenGL.GL.GLboolean ( marshalGLboolean )
-
---------------------------------------------------------------------------------
-
-data Reset =
-     NoReset
-   | Reset
-   deriving ( Eq, Ord, Show )
-
-marshalReset :: Reset -> GLboolean
-marshalReset x = marshalGLboolean (x == Reset)
diff --git a/Graphics/Rendering/OpenGL/GL/PixelRectangles/Sink.hs b/Graphics/Rendering/OpenGL/GL/PixelRectangles/Sink.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/PixelRectangles/Sink.hs
+++ /dev/null
@@ -1,35 +0,0 @@
--- #hide
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.PixelRectangles.Sink
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This is a purely internal module for (un-)marshaling Sink.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.PixelRectangles.Sink (
-   Sink(..), marshalSink, unmarshalSink
-) where
-
-import Graphics.Rendering.OpenGL.GL.BasicTypes ( GLboolean, GLint )
-import Graphics.Rendering.OpenGL.GL.GLboolean (
-   marshalGLboolean, unmarshalGLboolean )
-
---------------------------------------------------------------------------------
-
-data Sink =
-     PassThrough
-   | Sink
-   deriving ( Eq, Ord, Show )
-
-marshalSink :: Sink -> GLboolean
-marshalSink x = marshalGLboolean (x == Sink)
-
-unmarshalSink :: GLint -> Sink
-unmarshalSink s = if unmarshalGLboolean s then Sink else PassThrough
diff --git a/Graphics/Rendering/OpenGL/GL/PointParameter.hs b/Graphics/Rendering/OpenGL/GL/PointParameter.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/PointParameter.hs
+++ /dev/null
@@ -1,54 +0,0 @@
--- #hide
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.PointParameter
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This is a purely internal module for setting point parameters.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.PointParameter (
-   PointParameter(..), pointParameterf, pointParameterfv
-) where
-
-import Foreign.Ptr ( Ptr )
-import Graphics.Rendering.OpenGL.GL.BasicTypes ( GLenum, GLfloat )
-import Graphics.Rendering.OpenGL.GL.Extensions (
-   FunPtr, unsafePerformIO, Invoker, getProcAddress )
-
---------------------------------------------------------------------------------
-
-#include "HsOpenGLExt.h"
-
---------------------------------------------------------------------------------
-
-data PointParameter =
-     PointSizeMin
-   | PointSizeMax
-   | PointFadeThresholdSize
-   | PointDistanceAttenuation
-
-marshalPointParameter :: PointParameter -> GLenum
-marshalPointParameter x = case x of
-   PointSizeMin -> 0x8126
-   PointSizeMax -> 0x8127
-   PointFadeThresholdSize -> 0x8128
-   PointDistanceAttenuation -> 0x8129
-
---------------------------------------------------------------------------------
-
-pointParameterf :: PointParameter -> GLfloat -> IO ()
-pointParameterf = glPointParameterfARB . marshalPointParameter
-
-EXTENSION_ENTRY("GL_ARB_point_parameters or OpenGL 1.4",glPointParameterfARB,GLenum -> GLfloat -> IO ())
-
-pointParameterfv :: PointParameter -> Ptr GLfloat -> IO ()
-pointParameterfv = glPointParameterfvARB . marshalPointParameter
-
-EXTENSION_ENTRY("GL_ARB_point_parameters or OpenGL 1.4",glPointParameterfvARB,GLenum -> Ptr GLfloat -> IO ())
diff --git a/Graphics/Rendering/OpenGL/GL/Points.hs b/Graphics/Rendering/OpenGL/GL/Points.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/Points.hs
+++ /dev/null
@@ -1,227 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.Points
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to section 3.3 (Points) of the OpenGL 2.1 specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.Points (
-   -- * Point Rasterization
-   pointSize, vertexProgramPointSize,
-
-   -- * Controlling the Derived Size
-   pointSizeRange, pointDistanceAttenuation,
-
-   -- * Fading Points
-   pointFadeThresholdSize,
-
-   -- * Point Antialiasing
-   pointSmooth,
-
-   -- * Point Sprites
-   pointSprite,
-
-   -- * Implementation-Dependent Limits
-   aliasedPointSizeRange, smoothPointSizeRange, smoothPointSizeGranularity
-) where
-
-import Control.Monad ( liftM2 )
-import Foreign.Marshal.Array ( withArray )
-import Graphics.Rendering.OpenGL.GL.Capability (
-   EnableCap(CapVertexProgramPointSize,CapPointSmooth,CapPointSprite),
-   makeCapability )
-import Graphics.Rendering.OpenGL.GL.BasicTypes ( GLfloat, Capability )
-import Graphics.Rendering.OpenGL.GL.QueryUtils (
-   GetPName(GetPointSize,GetAliasedPointSizeRange,GetSmoothPointSizeRange,
-            GetSmoothPointSizeGranularity,GetPointSizeMin,GetPointSizeMax,
-            GetPointDistanceAttenuation,GetPointFadeThresholdSize),
-   getFloat1, getFloat2, getFloat3 )
-import Graphics.Rendering.OpenGL.GL.PointParameter (
-   PointParameter(..), pointParameterf, pointParameterfv )
-import Graphics.Rendering.OpenGL.GL.StateVar (
-   GettableStateVar, makeGettableStateVar, StateVar, makeStateVar )
-
---------------------------------------------------------------------------------
-
--- | 'pointSize' contains the rasterized diameter of both aliased and
--- antialiased points. The initial value is 1. Using a point size other than 1
--- has different effects, depending on whether point antialiasing is enabled
--- (see 'pointSmooth') or point sprites are enabled (see 'pointSprite'). Both
--- are initially disabled.
---
--- The specified point size is multiplied with a distance attenuation factor
--- and clamped to the specified 'pointSizeRange', and further clamped to the
--- implementation-dependent point size range to produce the derived point size
--- using
---
--- @   /derivedSize/ = /clamp/ (/size/ * /sqrt/ (1 \/ (/a/ + /b/ * /d/ + /c/ * /d/^2)))@
---
--- where /d/ is the eye-coordinate distance from the eye to the vertex, and /a/,
--- /b/, and /c/ are the distance attenuation coefficients (see
--- 'pointDistanceAttenuation').
---
--- If multisampling is disabled, the computed point size is used as the point\'s
--- width.
---
--- If multisampling is enabled, the point may be faded by modifying the point
--- alpha value (see 'Graphics.Rendering.OpenGL.GL.PerFragment.sampleCoverage')
--- instead of allowing the point width to go below a given
--- 'pointFadeThresholdSize'. In this case, the width is further modified in
--- the following manner:
---
--- @   /width/ = if /derivedSize/ >= /threshold/ then /derivedSize/ else /threshold/@
---
--- The point alpha value is modified by computing:
---
--- @   /alpha/ = if /derivedSize/ >= /threshold/ then 1 else (/derivedSize/ \/ /threshold/)^2@
---
--- If point antialiasing is disabled, the actual size is determined by rounding
--- the supplied size to the nearest integer. (If the rounding results in the
--- value 0, it is as if the point size were 1.) If the rounded size is odd,
--- then the center point (/x/, /y/) of the pixel fragment that represents
--- the point is computed as
---
--- @   (/x/, /y/) = (/floor/ /xw/ + 0.5, /floor/ /yw/ + 0.5)@
---
--- where /xw/ and /yw/ indicate window coordinates. All pixels that lie within
--- the square grid of the rounded size centered at (/x/, /y/) make up the
--- fragment. If the size is even, the center point is
---
--- @   (/x/, /y/) = (/floor/ (/xw/ + 0.5), /floor/ (/yw/ + 0.5))@
---
--- and the rasterized fragment\'s centers are the half-integer window
--- coordinates within the square of the rounded size centered at (/x/, /y/). All
--- pixel fragments produced in rasterizing a nonantialiased point are assigned
--- the same associated data, that of the vertex corresponding to the point.
---
--- If antialiasing is enabled, then point rasterization produces a fragment for
--- each pixel square that intersects the region lying within the circle having
--- diameter equal to the current point size and centered at the point\'s
--- (/xw/, /yw/). The coverage value for each fragment is the window coordinate
--- area of the intersection of the circular region with the corresponding pixel
--- square. This value is saved and used in the final rasterization step. The
--- data associated with each fragment is the data associated with the point
--- being rasterized.
---
--- Not all sizes are supported when point antialiasing is enabled. If an
--- unsupported size is requested, the nearest supported size is used.  Only size
--- 1 is guaranteed to be supported; others depend on the implementation. To
--- query the range of supported sizes for antialiased points and the size
--- difference between supported sizes within the range, query
--- 'smoothPointSizeRange' and 'smoothPointSizeGranularity', respectively. For
--- aliased points, query the supported range with 'aliasedPointSizeRange'.
---
--- The point size specified when 'pointSize' is set is always returned when it
--- is queried. Clamping and rounding for aliased and antialiased points have no
--- effect on the specified value.
---
--- A non-antialiased point size may be clamped to an implementation-dependent
--- maximum. Although this maximum cannot be queried, it must be no less than the
--- maximum value for antialiased points, rounded to the nearest integer value.
---
--- An 'Graphics.Rendering.OpenGL.GLU.Errors.InvalidValue' is generated if
--- 'pointSize' is set to a value less than or equal to zero.
---
--- An 'Graphics.Rendering.OpenGL.GLU.Errors.InvalidOperation' is generated if
--- 'pointSize' is set during
--- 'Graphics.Rendering.OpenGL.GL.BeginEnd.renderPrimitive'.
-
-pointSize :: StateVar GLfloat
-pointSize = makeStateVar (getFloat1 id GetPointSize) glPointSize
-
-foreign import CALLCONV unsafe "glPointSize" glPointSize :: GLfloat -> IO ()
-
---------------------------------------------------------------------------------
-
-vertexProgramPointSize :: StateVar Capability
-vertexProgramPointSize = makeCapability CapVertexProgramPointSize
-
---------------------------------------------------------------------------------
-
--- | The range to which the derived point size is clamped, see 'pointSize'. Note
--- that the size is further clamped to the implementation-dependent limits, see
--- 'aliasedPointSizeRange' and 'smoothPointSizeRange'. The initial range is
--- (0, 1).
---
--- An 'Graphics.Rendering.OpenGL.GLU.Errors.InvalidValue' is generated if the
--- lower or upper bound of the range is set to a value less than zero. If the
--- lower bound is greater than the upper bound, the point size after clamping is
--- undefined, but no error is generated.
-
-pointSizeRange :: StateVar (GLfloat, GLfloat)
-pointSizeRange =
-   makeStateVar
-   (liftM2 (,) (getFloat1 id GetPointSizeMin) (getFloat1 id GetPointSizeMax))
-   (\(sizeMin, sizeMax) -> do pointParameterf PointSizeMin sizeMin
-                              pointParameterf PointSizeMax sizeMax)
-
---------------------------------------------------------------------------------
-
--- | The  constant, linear, and quadratic distance attenuation coefficients, see
--- 'pointSize'. The initial coefficients are (1, 0, 0).
-
-pointDistanceAttenuation :: StateVar (GLfloat, GLfloat, GLfloat)
-pointDistanceAttenuation =
-   makeStateVar
-      (getFloat3 (,,) GetPointDistanceAttenuation)
-      (\(a, b, c) -> withArray [a, b, c] $
-                        pointParameterfv PointDistanceAttenuation)
-
---------------------------------------------------------------------------------
-
--- | The threshold for alpha attenuation of points when multisampling is used,
--- see 'pointSize'. The initial threshold is 1.
---
--- An 'Graphics.Rendering.OpenGL.GLU.Errors.InvalidValue' is generated if the
--- threshold is set to a value less than zero.
-
-pointFadeThresholdSize :: StateVar GLfloat
-pointFadeThresholdSize =
-   makeStateVar
-      (getFloat1 id GetPointFadeThresholdSize)
-      (pointParameterf PointFadeThresholdSize)
-
---------------------------------------------------------------------------------
-
--- | Controls whether point antialiasing is enabled. The initial state is
--- 'Graphics.Rendering.OpenGL.GL.BasicTypes.Disabled'.
-
-pointSmooth :: StateVar Capability
-pointSmooth = makeCapability CapPointSmooth
-
---------------------------------------------------------------------------------
-
--- | Controls whether point sprites are enabled. The initial state is
--- 'Graphics.Rendering.OpenGL.GL.BasicTypes.Disabled'. When point sprites are
--- enabled, the state of point antialiasing (i.e. 'pointSmooth') is ignored.
-
-pointSprite :: StateVar Capability
-pointSprite = makeCapability CapPointSprite
-
---------------------------------------------------------------------------------
-
--- | The smallest and largest supported size of aliased points.
-
-aliasedPointSizeRange :: GettableStateVar (GLfloat, GLfloat)
-aliasedPointSizeRange =
-   makeGettableStateVar $ getFloat2 (,) GetAliasedPointSizeRange
-
--- | The smallest and largest supported size of antialiased points.
-
-smoothPointSizeRange :: GettableStateVar (GLfloat, GLfloat)
-smoothPointSizeRange =
-   makeGettableStateVar $ getFloat2 (,) GetSmoothPointSizeRange
-
--- | The antialiased point size granularity, i.e. the size difference between
--- supported sizes.
-
-smoothPointSizeGranularity :: GettableStateVar GLfloat
-smoothPointSizeGranularity =
-   makeGettableStateVar $ getFloat1 id GetSmoothPointSizeGranularity
diff --git a/Graphics/Rendering/OpenGL/GL/PolygonMode.hs b/Graphics/Rendering/OpenGL/GL/PolygonMode.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/PolygonMode.hs
+++ /dev/null
@@ -1,41 +0,0 @@
--- #hide
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.PolygonMode
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This is a purely internal module for (un-)marshaling PolygonMode.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.PolygonMode (
-   PolygonMode(..), marshalPolygonMode, unmarshalPolygonMode
-) where
-
-import Graphics.Rendering.OpenGL.GL.BasicTypes ( GLenum )
-
---------------------------------------------------------------------------------
-
-data PolygonMode =
-     Point
-   | Line
-   | Fill
-   deriving ( Eq, Ord, Show )
-
-marshalPolygonMode :: PolygonMode -> GLenum
-marshalPolygonMode x = case x of
-   Point -> 0x1b00
-   Line -> 0x1b01
-   Fill -> 0x1b02
-
-unmarshalPolygonMode :: GLenum -> PolygonMode
-unmarshalPolygonMode x
-   | x == 0x1b00 = Point
-   | x == 0x1b01 = Line
-   | x == 0x1b02 = Fill
-   | otherwise = error ("unmarshalPolygonMode: illegal value " ++ show x)
diff --git a/Graphics/Rendering/OpenGL/GL/Polygons.hs b/Graphics/Rendering/OpenGL/GL/Polygons.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/Polygons.hs
+++ /dev/null
@@ -1,163 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.Polygons
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to section 3.5 (Polygons) of the OpenGL 2.1 specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.Polygons (
-   polygonSmooth, cullFace,
-   PolygonStipple(..), GLpolygonstipple, polygonStipple,
-   PolygonMode(..), polygonMode, polygonOffset,
-   polygonOffsetPoint, polygonOffsetLine, polygonOffsetFill
-) where
-
-import Control.Monad ( liftM2 )
-import Foreign.ForeignPtr ( ForeignPtr, mallocForeignPtrArray, withForeignPtr )
-import Foreign.Marshal.Array ( allocaArray, withArray, peekArray, pokeArray )
-import Foreign.Ptr ( Ptr )
-import Graphics.Rendering.OpenGL.GL.Capability (
-   EnableCap(CapPolygonSmooth,CapCullFace,CapPolygonStipple,
-             CapPolygonOffsetPoint,CapPolygonOffsetLine,CapPolygonOffsetFill),
-   makeCapability, makeStateVarMaybe )
-import Graphics.Rendering.OpenGL.GL.BasicTypes (
-   GLenum, GLubyte, GLfloat, Capability )
-import Graphics.Rendering.OpenGL.GL.Face ( marshalFace, unmarshalFace )
-import Graphics.Rendering.OpenGL.GL.Colors ( Face(..) )
-import Graphics.Rendering.OpenGL.GL.PixelRectangles (
-   PixelStoreDirection(..), rowLength, skipRows, skipPixels )
-import Graphics.Rendering.OpenGL.GL.PolygonMode (
-   PolygonMode(..), marshalPolygonMode, unmarshalPolygonMode )
-import Graphics.Rendering.OpenGL.GL.QueryUtils (
-   GetPName(GetCullFaceMode,GetPolygonMode,GetPolygonOffsetFactor,
-            GetPolygonOffsetUnits),
-   getInteger2, getEnum1, getFloat1 )
-import Graphics.Rendering.OpenGL.GL.SavingState (
-   ClientAttributeGroup(PixelStoreAttributes), preservingClientAttrib )
-import Graphics.Rendering.OpenGL.GL.StateVar (
-   HasSetter(($=)), StateVar, makeStateVar )
-
---------------------------------------------------------------------------------
-
-polygonSmooth :: StateVar Capability
-polygonSmooth = makeCapability CapPolygonSmooth
-
---------------------------------------------------------------------------------
-
-cullFace :: StateVar (Maybe Face)
-cullFace = makeStateVarMaybe (return CapCullFace)
-                             (getEnum1 unmarshalFace GetCullFaceMode)
-                             (glCullFace . marshalFace)
-
-foreign import CALLCONV unsafe "glCullFace" glCullFace :: GLenum -> IO ()
-
---------------------------------------------------------------------------------
-
-numPolygonStippleBytes :: Int
-numPolygonStippleBytes = 128   -- 32x32 bits divided into GLubytes
-
-class PolygonStipple s where
-   withNewPolygonStipple :: (Ptr GLubyte -> IO ()) -> IO s
-   withPolygonStipple :: s -> (Ptr GLubyte -> IO a) -> IO a
-   newPolygonStipple :: [GLubyte] -> IO s
-   getPolygonStippleComponents :: s -> IO [GLubyte]
-
-   withNewPolygonStipple act =
-      allocaArray numPolygonStippleBytes $ \p -> do
-         act p
-         components <- peekArray numPolygonStippleBytes p
-         newPolygonStipple components
-
-   withPolygonStipple s act = do
-      components <- getPolygonStippleComponents s
-      withArray components act
-
-   newPolygonStipple components =
-      withNewPolygonStipple $
-         flip pokeArray (take numPolygonStippleBytes components)
-
-   getPolygonStippleComponents s =
-      withPolygonStipple s $ peekArray numPolygonStippleBytes
-
---------------------------------------------------------------------------------
-
-data GLpolygonstipple = GLpolygonstipple (ForeignPtr GLubyte)
-   deriving ( Eq, Ord, Show )
-
-instance PolygonStipple GLpolygonstipple where
-   withNewPolygonStipple f = do
-      fp <- mallocForeignPtrArray numPolygonStippleBytes
-      withForeignPtr fp f
-      return $ GLpolygonstipple fp
-
-   withPolygonStipple (GLpolygonstipple fp) = withForeignPtr fp
-
---------------------------------------------------------------------------------
-
-polygonStipple :: PolygonStipple s => StateVar (Maybe s)
-polygonStipple =
-   makeStateVarMaybe (return CapPolygonStipple)
-      (withoutGaps Pack $ withNewPolygonStipple glGetPolygonStipple)
-      (\s -> withoutGaps Unpack $ withPolygonStipple s glPolygonStipple)
-
--- Note: No need to set rowAlignment, our memory allocator always returns a
--- region which is at least 8-byte aligned (the maximum)
-withoutGaps :: PixelStoreDirection -> IO a -> IO a
-withoutGaps direction action =
-   preservingClientAttrib [ PixelStoreAttributes ] $ do
-      rowLength  direction $= 0
-      skipRows   direction $= 0
-      skipPixels direction $= 0
-      action
-
-foreign import CALLCONV unsafe "glGetPolygonStipple" glGetPolygonStipple ::
-   Ptr GLubyte -> IO ()
-
-foreign import CALLCONV unsafe "glPolygonStipple" glPolygonStipple ::
-   Ptr GLubyte -> IO ()
-
---------------------------------------------------------------------------------
-
-polygonMode :: StateVar (PolygonMode, PolygonMode)
-polygonMode = makeStateVar getPolygonMode setPolygonMode
-
-getPolygonMode :: IO (PolygonMode, PolygonMode)
-getPolygonMode = getInteger2 (\front back -> (un front, un back)) GetPolygonMode
-   where un = unmarshalPolygonMode . fromIntegral
-
-setPolygonMode :: (PolygonMode, PolygonMode) -> IO ()
-setPolygonMode (front, back) = do
-   glPolygonMode (marshalFace Front) (marshalPolygonMode front)
-   glPolygonMode (marshalFace Back ) (marshalPolygonMode back )
-
-foreign import CALLCONV unsafe "glPolygonMode" glPolygonMode ::
-   GLenum -> GLenum -> IO ()
-
---------------------------------------------------------------------------------
-
-polygonOffset :: StateVar (GLfloat, GLfloat)
-polygonOffset =
-   makeStateVar (liftM2 (,) (getFloat1 id GetPolygonOffsetFactor)
-                            (getFloat1 id GetPolygonOffsetUnits))
-                (uncurry glPolygonOffset)
-
-foreign import CALLCONV unsafe "glPolygonOffset" glPolygonOffset ::
-   GLfloat -> GLfloat -> IO ()
-
---------------------------------------------------------------------------------
-
-polygonOffsetPoint :: StateVar Capability
-polygonOffsetPoint = makeCapability CapPolygonOffsetPoint
-
-polygonOffsetLine :: StateVar Capability
-polygonOffsetLine = makeCapability CapPolygonOffsetLine
-
-polygonOffsetFill :: StateVar Capability
-polygonOffsetFill = makeCapability CapPolygonOffsetFill
diff --git a/Graphics/Rendering/OpenGL/GL/PrimitiveMode.hs b/Graphics/Rendering/OpenGL/GL/PrimitiveMode.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/PrimitiveMode.hs
+++ /dev/null
@@ -1,96 +0,0 @@
--- #hide
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.PrimitiveMode
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This is a purely internal module for (un-)marshaling PrimitiveMode.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.PrimitiveMode (
-   PrimitiveMode(..), marshalPrimitiveMode, unmarshalPrimitiveMode
-) where
-
-import Graphics.Rendering.OpenGL.GL.BasicTypes ( GLenum )
-
---------------------------------------------------------------------------------
-
--- | Specification of the way the vertices given during 'renderPrimitive' are
--- interpreted. In the description of the constructors, /n/ is an integer count
--- starting at one, and /N/ is the total number of vertices specified.
-
-data PrimitiveMode =
-     Points
-     -- ^ Treats each vertex as a single point. Vertex /n/ defines point /n/.
-     -- /N/ points are drawn.
-   | Lines
-     -- ^ Treats each pair of vertices as an independent line segment. Vertices
-     -- 2/n/-1 and 2/n/ define line /n/. /N/\/2 lines are drawn.
-   | LineLoop
-     -- ^ Draws a connected group of line segments from the first vertex to the
-     -- last, then back to the first. Vertices /n/ and /n/+1 define line /n/.
-     -- The last line, however, is defined by vertices /N/ and 1. /N/ lines
-     -- are drawn.
-   | LineStrip
-     -- ^ Draws a connected group of line  segments from the first vertex to the
-     -- last. Vertices /n/ and /n/+1 define line /n/. /N/-1 lines are drawn.
-   | Triangles
-     -- ^ Treats each triplet of vertices as an independent triangle. Vertices
-     -- /3n-2/, /3n-1/, and /3n/ define triangle /n/. /N\/3/ triangles are drawn.
-   | TriangleStrip
-     -- ^ Draws a connected group of triangles. One triangle is defined for each
-     -- vertex presented after the first two vertices. For odd /n/, vertices
-     -- /n/, /n/+1, and /n/+2 define triangle /n/. For even /n/, vertices /n/+1,
-     -- /n/, and /n/+2 define triangle /n/. /N/-2 triangles are drawn.
-   | TriangleFan
-     -- ^ Draws a connected group of triangles. One triangle is defined for each
-     -- vertex presented after the first two vertices. Vertices 1, /n/+1, and
-     -- /n/+2 define triangle /n/. /N/-2 triangles are drawn.
-   | Quads
-     -- ^ Treats each group of four vertices as an independent quadrilateral.
-     -- Vertices 4/n/-3, 4/n/-2, 4/n/-1, and 4/n/ define quadrilateral /n/.
-     -- /N/\/4 quadrilaterals are drawn.
-   | QuadStrip
-     -- ^ Draws a connected group of quadrilaterals. One quadrilateral is
-     --defined for each pair of vertices presented after the first pair.
-     -- Vertices 2/n/-1, 2/n/, 2/n/+2, and 2/n/+1 define quadrilateral /n/.
-     -- /N/\/2-1 quadrilaterals are drawn. Note that the order in which vertices
-     -- are used to construct a quadrilateral from strip data is different from
-     -- that used with independent data.
-   | Polygon
-     -- ^ Draws a single, convex polygon. Vertices 1 through /N/ define this
-     -- polygon.
-   deriving ( Eq, Ord, Show )
-
-marshalPrimitiveMode :: PrimitiveMode -> GLenum
-marshalPrimitiveMode x = case x of
-   Points -> 0x0
-   Lines -> 0x1
-   LineLoop -> 0x2
-   LineStrip -> 0x3
-   Triangles -> 0x4
-   TriangleStrip -> 0x5
-   TriangleFan -> 0x6
-   Quads -> 0x7
-   QuadStrip -> 0x8
-   Polygon -> 0x9
-
-unmarshalPrimitiveMode :: GLenum -> PrimitiveMode
-unmarshalPrimitiveMode x
-   | x == 0x0 = Points
-   | x == 0x1 = Lines
-   | x == 0x2 = LineLoop
-   | x == 0x3 = LineStrip
-   | x == 0x4 = Triangles
-   | x == 0x5 = TriangleStrip
-   | x == 0x6 = TriangleFan
-   | x == 0x7 = Quads
-   | x == 0x8 = QuadStrip
-   | x == 0x9 = Polygon
-   | otherwise = error ("unmarshalPrimitiveMode: illegal value " ++ show x)
diff --git a/Graphics/Rendering/OpenGL/GL/QueryUtils.hs b/Graphics/Rendering/OpenGL/GL/QueryUtils.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/QueryUtils.hs
+++ /dev/null
@@ -1,1056 +0,0 @@
--- #hide
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.QueryUtils
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This is a purely internal module with utilities to query OpenGL state.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.QueryUtils (
-   GetPName(..),
-   clipPlaneIndexToEnum, lightIndexToEnum,
-   modelviewIndexToEnum, modelviewEnumToIndex,
-   getBoolean1, getBoolean4,
-   getInteger1, getInteger2, getInteger4, getIntegerv,
-   getEnum1,
-   getSizei1,
-   getFloat1, getFloat2, getFloat3, getFloat4, getFloatv,
-   getDouble1, getDouble2, getDouble4, getDoublev,
-   maybeNullPtr,
-   AttribLocation(..), GetVertexAttribPName(..),
-   getVertexAttribInteger1, getVertexAttribEnum1, getVertexAttribBoolean1,
-   getVertexAttribFloat4, getVertexAttribIInteger4, getVertexAttribIuInteger4, 
-   GetVertexAttribPointerPName(..), getVertexAttribPointer
-) where
-
-import Foreign.Marshal.Alloc ( alloca )
-import Foreign.Marshal.Array ( allocaArray )
-import Foreign.Ptr ( Ptr, nullPtr )
-import Foreign.Storable ( Storable(peek) )
-import Graphics.Rendering.OpenGL.GL.BasicTypes (
-   GLboolean, GLenum, GLint, GLsizei, GLuint, GLfloat, GLdouble )
-import Graphics.Rendering.OpenGL.GL.Extensions (
-   FunPtr, unsafePerformIO, Invoker, getProcAddress )
-import Graphics.Rendering.OpenGL.GL.PeekPoke ( peek1, peek2, peek3, peek4 )
-import Graphics.Rendering.OpenGL.GLU.ErrorsInternal ( recordInvalidEnum )
-
---------------------------------------------------------------------------------
-
-#include "HsOpenGLExt.h"
-
---------------------------------------------------------------------------------
-
-data GetPName =
-     GetCurrentColor
-   | GetCurrentIndex
-   | GetCurrentNormal
-   | GetCurrentTextureCoords
-   | GetCurrentRasterColor
-   | GetCurrentRasterSecondaryColor
-   | GetCurrentRasterIndex
-   | GetCurrentRasterTextureCoords
-   | GetCurrentRasterPosition
-   | GetCurrentRasterPositionValid
-   | GetCurrentRasterDistance
-   | GetCurrentMatrixIndex
-   | GetPointSmooth
-   | GetPointSize
-   | GetPointSizeRange
-   | GetPointSizeGranularity
-   | GetLineSmooth
-   | GetLineWidth
-   | GetLineWidthRange
-   | GetLineWidthGranularity
-   | GetLineStipple
-   | GetLineStipplePattern
-   | GetLineStippleRepeat
-   | GetSmoothPointSizeRange
-   | GetSmoothPointSizeGranularity
-   | GetSmoothLineWidthRange
-   | GetSmoothLineWidthGranularity
-   | GetAliasedPointSizeRange
-   | GetAliasedLineWidthRange
-   | GetListMode
-   | GetMaxListNesting
-   | GetListBase
-   | GetListIndex
-   | GetPolygonMode
-   | GetPolygonSmooth
-   | GetPolygonStipple
-   | GetEdgeFlag
-   | GetCullFace
-   | GetCullFaceMode
-   | GetFrontFace
-   | GetLighting
-   | GetLightModelLocalViewer
-   | GetLightModelTwoSide
-   | GetLightModelAmbient
-   | GetShadeModel
-   | GetColorMaterialFace
-   | GetColorMaterialParameter
-   | GetColorMaterial
-   | GetFog
-   | GetFogIndex
-   | GetFogDensity
-   | GetFogStart
-   | GetFogEnd
-   | GetFogMode
-   | GetFogColor
-   | GetFogCoordSrc
-   | GetCurrentFogCoord
-   | GetDepthRange
-   | GetDepthTest
-   | GetDepthWritemask
-   | GetDepthClearValue
-   | GetDepthFunc
-   | GetAccumClearValue
-   | GetStencilTest
-   | GetStencilClearValue
-   | GetStencilFunc
-   | GetStencilValueMask
-   | GetStencilFail
-   | GetStencilPassDepthFail
-   | GetStencilPassDepthPass
-   | GetStencilRef
-   | GetStencilWritemask
-   | GetMatrixMode
-   | GetNormalize
-   | GetViewport
-   | GetModelviewStackDepth
-   | GetProjectionStackDepth
-   | GetTextureStackDepth
-   | GetModelviewMatrix
-   | GetProjectionMatrix
-   | GetTextureMatrix
-   | GetAttribStackDepth
-   | GetClientAttribStackDepth
-   | GetAlphaTest
-   | GetAlphaTestFunc
-   | GetAlphaTestRef
-   | GetDither
-   | GetBlendDst
-   | GetBlendSrc
-   | GetBlend
-   | GetLogicOpMode
-   | GetIndexLogicOp
-   | GetLogicOp
-   | GetColorLogicOp
-   | GetAuxBuffers
-   | GetDrawBuffer
-   | GetReadBuffer
-   | GetScissorBox
-   | GetScissorTest
-   | GetIndexClearValue
-   | GetIndexWritemask
-   | GetColorClearValue
-   | GetColorWritemask
-   | GetIndexMode
-   | GetRGBAMode
-   | GetDoublebuffer
-   | GetStereo
-   | GetRenderMode
-   | GetPerspectiveCorrectionHint
-   | GetPointSmoothHint
-   | GetLineSmoothHint
-   | GetPolygonSmoothHint
-   | GetFogHint
-   | GetGenerateMipmapHint
-   | GetTextureCompressionHint
-   | GetTextureGenS
-   | GetTextureGenT
-   | GetTextureGenR
-   | GetTextureGenQ
-   | GetPixelMapIToISize
-   | GetPixelMapSToSSize
-   | GetPixelMapIToRSize
-   | GetPixelMapIToGSize
-   | GetPixelMapIToBSize
-   | GetPixelMapIToASize
-   | GetPixelMapRToRSize
-   | GetPixelMapGToGSize
-   | GetPixelMapBToBSize
-   | GetPixelMapAToASize
-   | GetUnpackSwapBytes
-   | GetUnpackLSBFirst
-   | GetUnpackRowLength
-   | GetUnpackSkipRows
-   | GetUnpackSkipPixels
-   | GetUnpackAlignment
-   | GetPackSwapBytes
-   | GetPackLSBFirst
-   | GetPackRowLength
-   | GetPackSkipRows
-   | GetPackSkipPixels
-   | GetPackAlignment
-   | GetMapColor
-   | GetMapStencil
-   | GetIndexShift
-   | GetIndexOffset
-   | GetRedScale
-   | GetRedBias
-   | GetZoomX
-   | GetZoomY
-   | GetGreenScale
-   | GetGreenBias
-   | GetBlueScale
-   | GetBlueBias
-   | GetAlphaScale
-   | GetAlphaBias
-   | GetDepthScale
-   | GetDepthBias
-   | GetMaxEvalOrder
-   | GetMaxLights
-   | GetMaxClipPlanes
-   | GetMaxTextureSize
-   | GetMaxPixelMapTable
-   | GetMaxAttribStackDepth
-   | GetMaxModelviewStackDepth
-   | GetMaxNameStackDepth
-   | GetMaxProjectionStackDepth
-   | GetMaxTextureStackDepth
-   | GetMaxViewportDims
-   | GetMaxClientAttribStackDepth
-   | GetSubpixelBits
-   | GetIndexBits
-   | GetRedBits
-   | GetGreenBits
-   | GetBlueBits
-   | GetAlphaBits
-   | GetDepthBits
-   | GetStencilBits
-   | GetAccumRedBits
-   | GetAccumGreenBits
-   | GetAccumBlueBits
-   | GetAccumAlphaBits
-   | GetNameStackDepth
-   | GetAutoNormal
-   | GetMap1Color4
-   | GetMap1Index
-   | GetMap1Normal
-   | GetMap1TextureCoord1
-   | GetMap1TextureCoord2
-   | GetMap1TextureCoord3
-   | GetMap1TextureCoord4
-   | GetMap1Vertex3
-   | GetMap1Vertex4
-   | GetMap2Color4
-   | GetMap2Index
-   | GetMap2Normal
-   | GetMap2TextureCoord1
-   | GetMap2TextureCoord2
-   | GetMap2TextureCoord3
-   | GetMap2TextureCoord4
-   | GetMap2Vertex3
-   | GetMap2Vertex4
-   | GetMap1GridDomain
-   | GetMap1GridSegments
-   | GetMap2GridDomain
-   | GetMap2GridSegments
-   | GetTexture1D
-   | GetTexture2D
-   | GetFeedbackBufferSize
-   | GetFeedbackBufferType
-   | GetSelectionBufferSize
-   | GetPolygonOffsetUnits
-   | GetPolygonOffsetPoint
-   | GetPolygonOffsetLine
-   | GetPolygonOffsetFill
-   | GetPolygonOffsetFactor
-   | GetTextureBinding1D
-   | GetTextureBinding2D
-   | GetTextureBinding3D
-   | GetVertexArray
-   | GetNormalArray
-   | GetColorArray
-   | GetIndexArray
-   | GetTextureCoordArray
-   | GetEdgeFlagArray
-   | GetFogCoordArray
-   | GetSecondaryColorArray
-   | GetMatrixIndexArray
-   | GetVertexArraySize
-   | GetVertexArrayType
-   | GetVertexArrayStride
-   | GetNormalArrayType
-   | GetNormalArrayStride
-   | GetColorArraySize
-   | GetColorArrayType
-   | GetColorArrayStride
-   | GetIndexArrayType
-   | GetIndexArrayStride
-   | GetTextureCoordArraySize
-   | GetTextureCoordArrayType
-   | GetTextureCoordArrayStride
-   | GetEdgeFlagArrayStride
-   | GetFogCoordArrayType
-   | GetFogCoordArrayStride
-   | GetSecondaryColorArraySize
-   | GetSecondaryColorArrayType
-   | GetSecondaryColorArrayStride
-   | GetMatrixIndexArraySize
-   | GetMatrixIndexArrayType
-   | GetMatrixIndexArrayStride
-   | GetClipPlane GLsizei
-   | GetLight GLsizei
-   | GetTransposeModelviewMatrix
-   | GetTransposeProjectionMatrix
-   | GetTransposeTextureMatrix
-   | GetTransposeColorMatrix
-   | GetLightModelColorControl
-   | GetBlendColor
-   | GetBlendEquation
-   | GetBlendEquationAlpha
-   | GetColorTable
-   | GetPostConvolutionColorTable
-   | GetPostColorMatrixColorTable
-   | GetConvolution1D
-   | GetConvolution2D
-   | GetSeparable2D
-   | GetMaxConvolutionWidth
-   | GetMaxConvolutionHeight
-   | GetPostConvolutionRedScale
-   | GetPostConvolutionGreenScale
-   | GetPostConvolutionBlueScale
-   | GetPostConvolutionAlphaScale
-   | GetPostConvolutionRedBias
-   | GetPostConvolutionGreenBias
-   | GetPostConvolutionBlueBias
-   | GetPostConvolutionAlphaBias
-   | GetHistogram
-   | GetMinmax
-   | GetColorSum
-   | GetCurrentSecondaryColor
-   | GetRescaleNormal
-   | GetSharedTexturePalette
-   | GetTexture3DBinding
-   | GetPackSkipImages
-   | GetPackImageHeight
-   | GetUnpackSkipImages
-   | GetUnpackImageHeight
-   | GetTexture3D
-   | GetMax3DTextureSize
-   | GetMaxTextureLODBias
-   | GetMaxTextureMaxAnisotropy
-   | GetMultisample
-   | GetSampleAlphaToCoverage
-   | GetSampleAlphaToOne
-   | GetSampleCoverage
-   | GetSampleBuffers
-   | GetSamples
-   | GetSampleCoverageValue
-   | GetSampleCoverageInvert
-   | GetPointSizeMin
-   | GetPointSizeMax
-   | GetPointFadeThresholdSize
-   | GetPointDistanceAttenuation
-   | GetColorMatrix
-   | GetColorMatrixStackDepth
-   | GetMaxColorMatrixStackDepth
-   | GetPostColorMatrixRedScale
-   | GetPostColorMatrixGreenScale
-   | GetPostColorMatrixBlueScale
-   | GetPostColorMatrixAlphaScale
-   | GetPostColorMatrixRedBias
-   | GetPostColorMatrixGreenBias
-   | GetPostColorMatrixBlueBias
-   | GetPostColorMatrixAlphaBias
-   | GetMaxElementsVertices
-   | GetMaxElementsIndices
-   | GetActiveTexture
-   | GetClientActiveTexture
-   | GetMaxTextureUnits
-   | GetTextureCubeMap
-   | GetMaxCubeMapTextureSize
-   | GetMaxRectangleTextureSize
-   | GetNumCompressedTextureFormats
-   | GetCompressedTextureFormats
-   | GetMaxVertexUnits
-   | GetActiveVertexUnits
-   | GetWeightSumUnity
-   | GetVertexBlend
-   | GetModelview GLsizei
-   | GetCurrentWeight
-   | GetWeightArrayType
-   | GetWeightArrayStride
-   | GetWeightArraySize
-   | GetWeightArray
-   | GetMatrixPalette
-   | GetMaxMatrixPaletteStackDepth
-   | GetMaxPaletteMatrices
-   | GetCurrentPaletteMatrix
-   | GetBlendDstRGB
-   | GetBlendSrcRGB
-   | GetBlendDstAlpha
-   | GetBlendSrcAlpha
-   | GetPackCMYKHint
-   | GetUnpackCMYKHint
-   | GetArrayElementLockFirst
-   | GetArrayElementLockCount
-   | GetMaxShininess
-   | GetMaxSpotExponent
-   | GetFogDistanceMode
-   | GetDepthBounds
-   | GetPrimitiveRestartIndex
-   | GetActiveStencilFace
-   | GetArrayBufferBinding
-   | GetElementArrayBufferBinding
-   | GetVertexArrayBufferBinding
-   | GetNormalArrayBufferBinding
-   | GetColorArrayBufferBinding
-   | GetIndexArrayBufferBinding
-   | GetTextureCoordArrayBufferBinding
-   | GetEdgeFlagArrayBufferBinding
-   | GetSecondaryColorArrayBufferBinding
-   | GetFogCoordArrayBufferBinding
-   | GetTextureBindingCubeMap
-   | GetTextureBindingRectangle
-   | GetCurrentMatrix
-   | GetCurrentMatrixStackDepth
-   | GetMaxCombinedTextureImageUnits
-   | GetMaxDrawBuffers
-   | GetMaxFragmentUniformComponents
-   | GetMaxTextureCoords
-   | GetMaxTextureImageUnits
-   | GetMaxVaryingFloats
-   | GetMaxVertexAttribs
-   | GetMaxVertexTextureImageUnits
-   | GetMaxVertexUniformComponents
-   | GetCurrentProgram
-   | GetPixelPackBufferBinding
-   | GetPixelUnpackBufferBinding
-   | GetDrawBufferN GLsizei
-   | GetRGBASignedComponents
-   | GetCopyReadBuffer
-   | GetCopyWriteBuffer
-   -- GetWeightArrayBufferBinding
-
-marshalGetPName :: GetPName -> Maybe GLenum
-marshalGetPName x = case x of
-   GetCurrentColor -> Just 0xb00
-   GetCurrentIndex -> Just 0xb01
-   GetCurrentNormal -> Just 0xb02
-   GetCurrentTextureCoords -> Just 0xb03
-   GetCurrentRasterColor -> Just 0xb04
-   GetCurrentRasterSecondaryColor -> Just 0x845f
-   GetCurrentRasterIndex -> Just 0xb05
-   GetCurrentRasterTextureCoords -> Just 0xb06
-   GetCurrentRasterPosition -> Just 0xb07
-   GetCurrentRasterPositionValid -> Just 0xb08
-   GetCurrentRasterDistance -> Just 0xb09
-   GetCurrentMatrixIndex -> Just 0x8845
-   GetPointSmooth -> Just 0xb10
-   GetPointSize -> Just 0xb11
-   GetPointSizeRange -> Just 0xb12
-   GetPointSizeGranularity -> Just 0xb13
-   GetLineSmooth -> Just 0xb20
-   GetLineWidth -> Just 0xb21
-   GetLineWidthRange -> Just 0xb22
-   GetLineWidthGranularity -> Just 0xb23
-   GetLineStipple -> Just 0xb24
-   GetLineStipplePattern -> Just 0xb25
-   GetLineStippleRepeat -> Just 0xb26
-   GetSmoothPointSizeRange -> Just 0xb12
-   GetSmoothPointSizeGranularity -> Just 0xb13
-   GetSmoothLineWidthRange -> Just 0xb22
-   GetSmoothLineWidthGranularity -> Just 0xb23
-   GetAliasedPointSizeRange -> Just 0x846d
-   GetAliasedLineWidthRange -> Just 0x846e
-   GetListMode -> Just 0xb30
-   GetMaxListNesting -> Just 0xb31
-   GetListBase -> Just 0xb32
-   GetListIndex -> Just 0xb33
-   GetPolygonMode -> Just 0xb40
-   GetPolygonSmooth -> Just 0xb41
-   GetPolygonStipple -> Just 0xb42
-   GetEdgeFlag -> Just 0xb43
-   GetCullFace -> Just 0xb44
-   GetCullFaceMode -> Just 0xb45
-   GetFrontFace -> Just 0xb46
-   GetLighting -> Just 0xb50
-   GetLightModelLocalViewer -> Just 0xb51
-   GetLightModelTwoSide -> Just 0xb52
-   GetLightModelAmbient -> Just 0xb53
-   GetShadeModel -> Just 0xb54
-   GetColorMaterialFace -> Just 0xb55
-   GetColorMaterialParameter -> Just 0xb56
-   GetColorMaterial -> Just 0xb57
-   GetFog -> Just 0xb60
-   GetFogIndex -> Just 0xb61
-   GetFogDensity -> Just 0xb62
-   GetFogStart -> Just 0xb63
-   GetFogEnd -> Just 0xb64
-   GetFogMode -> Just 0xb65
-   GetFogColor -> Just 0xb66
-   GetFogCoordSrc -> Just 0x8450
-   GetCurrentFogCoord -> Just 0x8453
-   GetDepthRange -> Just 0xb70
-   GetDepthTest -> Just 0xb71
-   GetDepthWritemask -> Just 0xb72
-   GetDepthClearValue -> Just 0xb73
-   GetDepthFunc -> Just 0xb74
-   GetAccumClearValue -> Just 0xb80
-   GetStencilTest -> Just 0xb90
-   GetStencilClearValue -> Just 0xb91
-   GetStencilFunc -> Just 0xb92
-   GetStencilValueMask -> Just 0xb93
-   GetStencilFail -> Just 0xb94
-   GetStencilPassDepthFail -> Just 0xb95
-   GetStencilPassDepthPass -> Just 0xb96
-   GetStencilRef -> Just 0xb97
-   GetStencilWritemask -> Just 0xb98
-   GetMatrixMode -> Just 0xba0
-   GetNormalize -> Just 0xba1
-   GetViewport -> Just 0xba2
-   GetModelviewStackDepth -> Just 0xba3
-   GetProjectionStackDepth -> Just 0xba4
-   GetTextureStackDepth -> Just 0xba5
-   GetModelviewMatrix -> Just 0xba6
-   GetProjectionMatrix -> Just 0xba7
-   GetTextureMatrix -> Just 0xba8
-   GetAttribStackDepth -> Just 0xbb0
-   GetClientAttribStackDepth -> Just 0xbb1
-   GetAlphaTest -> Just 0xbc0
-   GetAlphaTestFunc -> Just 0xbc1
-   GetAlphaTestRef -> Just 0xbc2
-   GetDither -> Just 0xbd0
-   GetBlendDst -> Just 0xbe0
-   GetBlendSrc -> Just 0xbe1
-   GetBlend -> Just 0xbe2
-   GetLogicOpMode -> Just 0xbf0
-   GetIndexLogicOp -> Just 0xbf1
-   GetLogicOp -> Just 0xbf1
-   GetColorLogicOp -> Just 0xbf2
-   GetAuxBuffers -> Just 0xc00
-   GetDrawBuffer -> Just 0xc01
-   GetReadBuffer -> Just 0xc02
-   GetScissorBox -> Just 0xc10
-   GetScissorTest -> Just 0xc11
-   GetIndexClearValue -> Just 0xc20
-   GetIndexWritemask -> Just 0xc21
-   GetColorClearValue -> Just 0xc22
-   GetColorWritemask -> Just 0xc23
-   GetIndexMode -> Just 0xc30
-   GetRGBAMode -> Just 0xc31
-   GetDoublebuffer -> Just 0xc32
-   GetStereo -> Just 0xc33
-   GetRenderMode -> Just 0xc40
-   GetPerspectiveCorrectionHint -> Just 0xc50
-   GetPointSmoothHint -> Just 0xc51
-   GetLineSmoothHint -> Just 0xc52
-   GetPolygonSmoothHint -> Just 0xc53
-   GetFogHint -> Just 0xc54
-   GetGenerateMipmapHint -> Just 0x8192
-   GetTextureCompressionHint -> Just 0x84ef
-   GetTextureGenS -> Just 0xc60
-   GetTextureGenT -> Just 0xc61
-   GetTextureGenR -> Just 0xc62
-   GetTextureGenQ -> Just 0xc63
-   GetPixelMapIToISize -> Just 0xcb0
-   GetPixelMapSToSSize -> Just 0xcb1
-   GetPixelMapIToRSize -> Just 0xcb2
-   GetPixelMapIToGSize -> Just 0xcb3
-   GetPixelMapIToBSize -> Just 0xcb4
-   GetPixelMapIToASize -> Just 0xcb5
-   GetPixelMapRToRSize -> Just 0xcb6
-   GetPixelMapGToGSize -> Just 0xcb7
-   GetPixelMapBToBSize -> Just 0xcb8
-   GetPixelMapAToASize -> Just 0xcb9
-   GetUnpackSwapBytes -> Just 0xcf0
-   GetUnpackLSBFirst -> Just 0xcf1
-   GetUnpackRowLength -> Just 0xcf2
-   GetUnpackSkipRows -> Just 0xcf3
-   GetUnpackSkipPixels -> Just 0xcf4
-   GetUnpackAlignment -> Just 0xcf5
-   GetPackSwapBytes -> Just 0xd00
-   GetPackLSBFirst -> Just 0xd01
-   GetPackRowLength -> Just 0xd02
-   GetPackSkipRows -> Just 0xd03
-   GetPackSkipPixels -> Just 0xd04
-   GetPackAlignment -> Just 0xd05
-   GetMapColor -> Just 0xd10
-   GetMapStencil -> Just 0xd11
-   GetIndexShift -> Just 0xd12
-   GetIndexOffset -> Just 0xd13
-   GetRedScale -> Just 0xd14
-   GetRedBias -> Just 0xd15
-   GetZoomX -> Just 0xd16
-   GetZoomY -> Just 0xd17
-   GetGreenScale -> Just 0xd18
-   GetGreenBias -> Just 0xd19
-   GetBlueScale -> Just 0xd1a
-   GetBlueBias -> Just 0xd1b
-   GetAlphaScale -> Just 0xd1c
-   GetAlphaBias -> Just 0xd1d
-   GetDepthScale -> Just 0xd1e
-   GetDepthBias -> Just 0xd1f
-   GetMaxEvalOrder -> Just 0xd30
-   GetMaxLights -> Just 0xd31
-   GetMaxClipPlanes -> Just 0xd32
-   GetMaxTextureSize -> Just 0xd33
-   GetMaxPixelMapTable -> Just 0xd34
-   GetMaxAttribStackDepth -> Just 0xd35
-   GetMaxModelviewStackDepth -> Just 0xd36
-   GetMaxNameStackDepth -> Just 0xd37
-   GetMaxProjectionStackDepth -> Just 0xd38
-   GetMaxTextureStackDepth -> Just 0xd39
-   GetMaxViewportDims -> Just 0xd3a
-   GetMaxClientAttribStackDepth -> Just 0xd3b
-   GetSubpixelBits -> Just 0xd50
-   GetIndexBits -> Just 0xd51
-   GetRedBits -> Just 0xd52
-   GetGreenBits -> Just 0xd53
-   GetBlueBits -> Just 0xd54
-   GetAlphaBits -> Just 0xd55
-   GetDepthBits -> Just 0xd56
-   GetStencilBits -> Just 0xd57
-   GetAccumRedBits -> Just 0xd58
-   GetAccumGreenBits -> Just 0xd59
-   GetAccumBlueBits -> Just 0xd5a
-   GetAccumAlphaBits -> Just 0xd5b
-   GetNameStackDepth -> Just 0xd70
-   GetAutoNormal -> Just 0xd80
-   GetMap1Color4 -> Just 0xd90
-   GetMap1Index -> Just 0xd91
-   GetMap1Normal -> Just 0xd92
-   GetMap1TextureCoord1 -> Just 0xd93
-   GetMap1TextureCoord2 -> Just 0xd94
-   GetMap1TextureCoord3 -> Just 0xd95
-   GetMap1TextureCoord4 -> Just 0xd96
-   GetMap1Vertex3 -> Just 0xd97
-   GetMap1Vertex4 -> Just 0xd98
-   GetMap2Color4 -> Just 0xdb0
-   GetMap2Index -> Just 0xdb1
-   GetMap2Normal -> Just 0xdb2
-   GetMap2TextureCoord1 -> Just 0xdb3
-   GetMap2TextureCoord2 -> Just 0xdb4
-   GetMap2TextureCoord3 -> Just 0xdb5
-   GetMap2TextureCoord4 -> Just 0xdb6
-   GetMap2Vertex3 -> Just 0xdb7
-   GetMap2Vertex4 -> Just 0xdb8
-   GetMap1GridDomain -> Just 0xdd0
-   GetMap1GridSegments -> Just 0xdd1
-   GetMap2GridDomain -> Just 0xdd2
-   GetMap2GridSegments -> Just 0xdd3
-   GetTexture1D -> Just 0xde0
-   GetTexture2D -> Just 0xde1
-   GetFeedbackBufferSize -> Just 0xdf1
-   GetFeedbackBufferType -> Just 0xdf2
-   GetSelectionBufferSize -> Just 0xdf4
-   GetPolygonOffsetUnits -> Just 0x2a00
-   GetPolygonOffsetPoint -> Just 0x2a01
-   GetPolygonOffsetLine -> Just 0x2a02
-   GetPolygonOffsetFill -> Just 0x8037
-   GetPolygonOffsetFactor -> Just 0x8038
-   GetTextureBinding1D -> Just 0x8068
-   GetTextureBinding2D -> Just 0x8069
-   GetTextureBinding3D -> Just 0x806a
-   GetVertexArray -> Just 0x8074
-   GetNormalArray -> Just 0x8075
-   GetColorArray -> Just 0x8076
-   GetIndexArray -> Just 0x8077
-   GetTextureCoordArray -> Just 0x8078
-   GetEdgeFlagArray -> Just 0x8079
-   GetFogCoordArray -> Just 0x8457
-   GetSecondaryColorArray -> Just 0x845e
-   GetMatrixIndexArray -> Just 0x8844
-   GetVertexArraySize -> Just 0x807a
-   GetVertexArrayType -> Just 0x807b
-   GetVertexArrayStride -> Just 0x807c
-   GetNormalArrayType -> Just 0x807e
-   GetNormalArrayStride -> Just 0x807f
-   GetColorArraySize -> Just 0x8081
-   GetColorArrayType -> Just 0x8082
-   GetColorArrayStride -> Just 0x8083
-   GetIndexArrayType -> Just 0x8085
-   GetIndexArrayStride -> Just 0x8086
-   GetTextureCoordArraySize -> Just 0x8088
-   GetTextureCoordArrayType -> Just 0x8089
-   GetTextureCoordArrayStride -> Just 0x808a
-   GetEdgeFlagArrayStride -> Just 0x808c
-   GetFogCoordArrayType -> Just 0x8454
-   GetFogCoordArrayStride -> Just 0x8455
-   GetSecondaryColorArraySize -> Just 0x845a
-   GetSecondaryColorArrayType -> Just 0x845b
-   GetSecondaryColorArrayStride -> Just 0x845c
-   GetMatrixIndexArraySize -> Just 0x8846
-   GetMatrixIndexArrayType -> Just 0x8847
-   GetMatrixIndexArrayStride -> Just 0x8848
-   GetClipPlane i -> clipPlaneIndexToEnum i
-   GetLight i -> lightIndexToEnum i
-   GetTransposeModelviewMatrix -> Just 0x84e3
-   GetTransposeProjectionMatrix -> Just 0x84e4
-   GetTransposeTextureMatrix -> Just 0x84e5
-   GetTransposeColorMatrix -> Just 0x84e6
-   GetLightModelColorControl -> Just 0x81f8
-   GetBlendColor -> Just 0x8005
-   GetBlendEquation -> Just 0x8009
-   GetBlendEquationAlpha -> Just 0x883d
-   GetColorTable -> Just 0x80d0
-   GetPostConvolutionColorTable -> Just 0x80d1
-   GetPostColorMatrixColorTable -> Just 0x80d2
-   GetConvolution1D -> Just 0x8010
-   GetConvolution2D -> Just 0x8011
-   GetSeparable2D -> Just 0x8012
-   GetMaxConvolutionWidth -> Just 0x801a
-   GetMaxConvolutionHeight -> Just 0x801b
-   GetPostConvolutionRedScale -> Just 0x801c
-   GetPostConvolutionGreenScale -> Just 0x801d
-   GetPostConvolutionBlueScale -> Just 0x801e
-   GetPostConvolutionAlphaScale -> Just 0x801f
-   GetPostConvolutionRedBias -> Just 0x8020
-   GetPostConvolutionGreenBias -> Just 0x8021
-   GetPostConvolutionBlueBias -> Just 0x8022
-   GetPostConvolutionAlphaBias -> Just 0x8023
-   GetHistogram -> Just 0x8024
-   GetMinmax -> Just 0x802e
-   GetColorSum -> Just 0x8458
-   GetCurrentSecondaryColor -> Just 0x8459
-   GetRescaleNormal -> Just 0x803a
-   GetSharedTexturePalette -> Just 0x81fb
-   GetTexture3DBinding -> Just 0x806a
-   GetPackSkipImages -> Just 0x806b
-   GetPackImageHeight -> Just 0x806c
-   GetUnpackSkipImages -> Just 0x806d
-   GetUnpackImageHeight -> Just 0x806e
-   GetTexture3D -> Just 0x806f
-   GetMax3DTextureSize -> Just 0x8073
-   GetMaxTextureLODBias -> Just 0x84fd
-   GetMaxTextureMaxAnisotropy -> Just 0x84ff
-   GetMultisample -> Just 0x809d
-   GetSampleAlphaToCoverage -> Just 0x809e
-   GetSampleAlphaToOne -> Just 0x809f
-   GetSampleCoverage -> Just 0x80a0
-   GetSampleBuffers -> Just 0x80a8
-   GetSamples -> Just 0x80a9
-   GetSampleCoverageValue -> Just 0x80aa
-   GetSampleCoverageInvert -> Just 0x80ab
-   GetPointSizeMin -> Just 0x8126
-   GetPointSizeMax -> Just 0x8127
-   GetPointFadeThresholdSize -> Just 0x8128
-   GetPointDistanceAttenuation -> Just 0x8129
-   GetColorMatrix -> Just 0x80b1
-   GetColorMatrixStackDepth -> Just 0x80b2
-   GetMaxColorMatrixStackDepth -> Just 0x80b3
-   GetPostColorMatrixRedScale -> Just 0x80b4
-   GetPostColorMatrixGreenScale -> Just 0x80b5
-   GetPostColorMatrixBlueScale -> Just 0x80b6
-   GetPostColorMatrixAlphaScale -> Just 0x80b7
-   GetPostColorMatrixRedBias -> Just 0x80b8
-   GetPostColorMatrixGreenBias -> Just 0x80b9
-   GetPostColorMatrixBlueBias -> Just 0x80ba
-   GetPostColorMatrixAlphaBias -> Just 0x80bb
-   GetMaxElementsVertices -> Just 0x80e8
-   GetMaxElementsIndices -> Just 0x80e9
-   GetActiveTexture -> Just 0x84e0
-   GetClientActiveTexture -> Just 0x84e1
-   GetMaxTextureUnits -> Just 0x84e2
-   GetTextureCubeMap -> Just 0x8513
-   GetMaxCubeMapTextureSize -> Just 0x851c
-   GetMaxRectangleTextureSize -> Just 0x84F8
-   GetNumCompressedTextureFormats -> Just 0x86a2
-   GetCompressedTextureFormats -> Just 0x86a3
-   GetMaxVertexUnits -> Just 0x86a4
-   GetActiveVertexUnits -> Just 0x86a5
-   GetWeightSumUnity -> Just 0x86a6
-   GetVertexBlend -> Just 0x86a7
-   GetModelview i -> modelviewIndexToEnum i
-   GetCurrentWeight -> Just 0x86a8
-   GetWeightArrayType -> Just 0x86a9
-   GetWeightArrayStride -> Just 0x86aa
-   GetWeightArraySize -> Just 0x86ab
-   GetWeightArray -> Just 0x86ad
-   GetMatrixPalette -> Just 0x8840
-   GetMaxMatrixPaletteStackDepth -> Just 0x8841
-   GetMaxPaletteMatrices -> Just 0x8842
-   GetCurrentPaletteMatrix -> Just 0x8843
-   GetBlendDstRGB -> Just 0x80c8
-   GetBlendSrcRGB -> Just 0x80c9
-   GetBlendDstAlpha -> Just 0x80ca
-   GetBlendSrcAlpha -> Just 0x80cb
-   GetPackCMYKHint -> Just 0x800e
-   GetUnpackCMYKHint -> Just 0x800f
-   GetArrayElementLockFirst -> Just 0x81a8
-   GetArrayElementLockCount -> Just 0x81a9
-   GetMaxShininess -> Just 0x8504
-   GetMaxSpotExponent -> Just 0x8505
-   GetFogDistanceMode -> Just 0x855a
-   GetDepthBounds -> Just 0x8891
-   GetPrimitiveRestartIndex -> Just 0x8559
-   GetActiveStencilFace -> Just 0x8911
-   GetArrayBufferBinding -> Just 0x8894
-   GetElementArrayBufferBinding -> Just 0x8895
-   GetVertexArrayBufferBinding -> Just 0x8896
-   GetNormalArrayBufferBinding -> Just 0x8897
-   GetColorArrayBufferBinding -> Just 0x8898
-   GetIndexArrayBufferBinding -> Just 0x8899
-   GetTextureCoordArrayBufferBinding -> Just 0x889a
-   GetEdgeFlagArrayBufferBinding -> Just 0x889b
-   GetSecondaryColorArrayBufferBinding -> Just 0x889c
-   GetFogCoordArrayBufferBinding -> Just 0x889d
-   GetTextureBindingCubeMap -> Just 0x8514
-   GetTextureBindingRectangle -> Just 0x84f6
-   GetCurrentMatrix -> Just 0x8641
-   GetCurrentMatrixStackDepth -> Just 0x8640
-   GetMaxCombinedTextureImageUnits -> Just 0x8b4d
-   GetMaxDrawBuffers -> Just 0x8824
-   GetMaxFragmentUniformComponents -> Just 0x8b49
-   GetMaxTextureCoords -> Just 0x8871
-   GetMaxTextureImageUnits -> Just 0x8872
-   GetMaxVaryingFloats -> Just 0x8b4b
-   GetMaxVertexAttribs -> Just 0x8869
-   GetMaxVertexTextureImageUnits -> Just 0x8b4c
-   GetMaxVertexUniformComponents -> Just 0x8b4a
-   GetCurrentProgram -> Just 0x8b8d
-   GetPixelPackBufferBinding -> Just 0x88ed
-   GetPixelUnpackBufferBinding -> Just 0x88EF
-   GetDrawBufferN i -> drawBufferIndexToEnum i
-   GetRGBASignedComponents -> Just 0x8C3C
-   GetCopyReadBuffer -> Just 0x8F36
-   GetCopyWriteBuffer -> Just 0x8F37
-   -- GetWeightArrayBufferBinding -> Just 0x889e
-
---------------------------------------------------------------------------------
-
--- 0x3000 through 0x3FFF are reserved for clip planes
-
-clipPlaneIndexToEnum :: GLsizei -> Maybe GLenum
-clipPlaneIndexToEnum i
-   | 0 <= i && i <= 0xFFF = Just (0x3000 + fromIntegral i)
-   | otherwise = Nothing
-
---------------------------------------------------------------------------------
-
--- 0x4000 through 0x4FFF are reserved for light numbers
-
-lightIndexToEnum :: GLsizei -> Maybe GLenum
-lightIndexToEnum i
-   | 0 <= i && i <= 0xFFF = Just (0x4000 + fromIntegral i)
-   | otherwise = Nothing
-
---------------------------------------------------------------------------------
-
--- 0x1700, 0x850a, and 0x8722 through 0x873f are reserved for modelview matrices
-
-modelviewIndexToEnum :: GLsizei -> Maybe GLenum
-modelviewIndexToEnum 0 = Just 0x1700
-modelviewIndexToEnum 1 = Just 0x850a
-modelviewIndexToEnum i
-   | 2 <= i && i <= 31 = Just (0x8720 + fromIntegral i)
-   | otherwise = Nothing
-
-modelviewEnumToIndex :: GLenum -> Maybe GLsizei
-modelviewEnumToIndex x
-   | x == 0x1700 = Just 0
-   | x == 0x850a = Just 1
-   | 0x8722 <= x && x <= 0x873f = Just (fromIntegral x - 0x8720)
-   | otherwise = Nothing
-
---------------------------------------------------------------------------------
-
--- 0x8825 through 0x8834 are reserved for draw buffers
-
-drawBufferIndexToEnum :: GLsizei -> Maybe GLenum
-drawBufferIndexToEnum i
-   | 0 <= i && i <= 15 = Just (0x8825 + fromIntegral i)
-   | otherwise = Nothing
-
---------------------------------------------------------------------------------
-
-getBoolean1 :: (GLboolean -> a) -> GetPName -> IO a
-getBoolean1 f n = alloca $ \buf -> do
-   getBooleanv n buf
-   peek1 f buf
-
-getBoolean4 :: (GLboolean -> GLboolean -> GLboolean -> GLboolean -> a)
-            -> GetPName -> IO a
-getBoolean4 f n = allocaArray 4 $ \buf -> do
-   getBooleanv n buf
-   peek4 f buf
-
-foreign import CALLCONV unsafe "glGetBooleanv" glGetBooleanv ::
-   GLenum -> Ptr GLboolean -> IO ()
-
-getBooleanv :: GetPName -> Ptr GLboolean -> IO ()
-getBooleanv = makeGetter glGetBooleanv
-
-{-# INLINE makeGetter #-}
-makeGetter :: (GLenum -> Ptr a -> IO ()) -> GetPName -> Ptr a -> IO ()
-makeGetter f = maybe (const recordInvalidEnum) f . marshalGetPName
-
---------------------------------------------------------------------------------
-
-getInteger1 :: (GLint -> a) -> GetPName -> IO a
-getInteger1 f n = alloca $ \buf -> do
-   getIntegerv n buf
-   peek1 f buf
-
-getInteger2 :: (GLint -> GLint -> a) -> GetPName -> IO a
-getInteger2 f n = allocaArray 2 $ \buf -> do
-   getIntegerv n buf
-   peek2 f buf
-
-getInteger4 :: (GLint -> GLint -> GLint -> GLint -> a) -> GetPName -> IO a
-getInteger4 f n = allocaArray 4 $ \buf -> do
-   getIntegerv n buf
-   peek4 f buf
-
-getIntegerv :: GetPName -> Ptr GLint -> IO ()
-getIntegerv = maybe (const recordInvalidEnum) glGetIntegerv . marshalGetPName
-
-foreign import CALLCONV unsafe "glGetIntegerv" glGetIntegerv ::
-   GLenum -> Ptr GLint -> IO ()
-
---------------------------------------------------------------------------------
-
-getEnum1 :: (GLenum -> a) -> GetPName -> IO a
-getEnum1 f = getInteger1 (f . fromIntegral)
-
-getSizei1 :: (GLsizei -> a) -> GetPName -> IO a
-getSizei1 f = getInteger1 (f . fromIntegral)
-
---------------------------------------------------------------------------------
-
-getFloat1 :: (GLfloat -> a) -> GetPName -> IO a
-getFloat1 f n = alloca $ \buf -> do
-   getFloatv n buf
-   peek1 f buf
-
-getFloat2 :: (GLfloat -> GLfloat -> a) -> GetPName -> IO a
-getFloat2 f n = allocaArray 2 $ \buf -> do
-   getFloatv n buf
-   peek2 f buf
-
-getFloat3 :: (GLfloat -> GLfloat -> GLfloat -> a) -> GetPName -> IO a
-getFloat3 f n = allocaArray 3 $ \buf -> do
-   getFloatv n buf
-   peek3 f buf
-
-getFloat4 ::
-   (GLfloat -> GLfloat -> GLfloat -> GLfloat -> a) -> GetPName -> IO a
-getFloat4 f n = allocaArray 4 $ \buf -> do
-   getFloatv n buf
-   peek4 f buf
-
-getFloatv :: GetPName -> Ptr GLfloat -> IO ()
-getFloatv = maybe (const recordInvalidEnum) glGetFloatv . marshalGetPName
-
-foreign import CALLCONV unsafe "glGetFloatv" glGetFloatv ::
-   GLenum -> Ptr GLfloat -> IO ()
-
---------------------------------------------------------------------------------
-
-getDouble1 :: (GLdouble -> a) -> GetPName -> IO a
-getDouble1 f n = alloca $ \buf -> do
-   getDoublev n buf
-   peek1 f buf
-
-getDouble2 :: (GLdouble -> GLdouble -> a) -> GetPName -> IO a
-getDouble2 f n = allocaArray 2 $ \buf -> do
-   getDoublev n buf
-   peek2 f buf
-
-getDouble4 ::
-   (GLdouble -> GLdouble -> GLdouble -> GLdouble -> a) -> GetPName -> IO a
-getDouble4 f n = allocaArray 4 $ \buf -> do
-   getDoublev n buf
-   peek4 f buf
-
-getDoublev :: GetPName -> Ptr GLdouble -> IO ()
-getDoublev = maybe (const recordInvalidEnum) glGetDoublev . marshalGetPName
-
-foreign import CALLCONV unsafe "glGetDoublev" glGetDoublev ::
-   GLenum -> Ptr GLdouble -> IO ()
-
---------------------------------------------------------------------------------
-
-maybeNullPtr :: b -> (Ptr a -> b) -> Ptr a -> b
-maybeNullPtr n f ptr | ptr == nullPtr = n
-                     | otherwise      = f ptr
---------------------------------------------------------------------------------
-
-newtype AttribLocation = AttribLocation GLuint
-   deriving ( Eq, Ord, Show )
-
---------------------------------------------------------------------------------
-
-data GetVertexAttribPName =
-     GetVertexAttribArrayEnabled
-   | GetVertexAttribArraySize
-   | GetVertexAttribArrayStride
-   | GetVertexAttribArrayType
-   | GetVertexAttribArrayNormalized
-   | GetCurrentVertexAttrib
-   | GetVertexAttribArrayBufferBinding
-   | GetVertexAttribArrayInteger
-
-marshalGetVertexAttribPName :: GetVertexAttribPName -> GLenum
-marshalGetVertexAttribPName x = case x of
-   GetVertexAttribArrayEnabled -> 0x8622
-   GetVertexAttribArraySize -> 0x8623
-   GetVertexAttribArrayStride -> 0x8624
-   GetVertexAttribArrayType -> 0x8625
-   GetVertexAttribArrayNormalized -> 0x886A
-   GetCurrentVertexAttrib -> 0x8626
-   GetVertexAttribArrayBufferBinding -> 0x889F
-   GetVertexAttribArrayInteger -> 0x88FD
-
---------------------------------------------------------------------------------
-
-getVertexAttribInteger1 :: (GLint -> b) -> AttribLocation -> GetVertexAttribPName -> IO b
-getVertexAttribInteger1 f location n = alloca $ \buf -> do
-   glGetVertexAttribivARB location (marshalGetVertexAttribPName n) buf
-   peek1 f buf
-
-getVertexAttribEnum1 :: (GLenum -> b) -> AttribLocation -> GetVertexAttribPName -> IO b
-getVertexAttribEnum1 f = getVertexAttribInteger1 (f . fromIntegral)
-
-getVertexAttribBoolean1 :: (GLboolean -> b) -> AttribLocation -> GetVertexAttribPName -> IO b
-getVertexAttribBoolean1 f = getVertexAttribInteger1 (f . fromIntegral)
-
-EXTENSION_ENTRY("GL_ARB_vertex_shader or OpenGL 2.0",glGetVertexAttribivARB,AttribLocation -> GLenum -> Ptr GLint -> IO ())
-
-getVertexAttribFloat4 :: (GLfloat -> GLfloat -> GLfloat -> GLfloat -> b) -> AttribLocation -> GetVertexAttribPName -> IO b
-getVertexAttribFloat4 f location n = alloca $ \buf -> do
-   glGetVertexAttribfvARB location (marshalGetVertexAttribPName n) buf
-   peek4 f buf
-
-EXTENSION_ENTRY("GL_ARB_vertex_shader or OpenGL 2.0",glGetVertexAttribfvARB,AttribLocation -> GLenum -> Ptr GLfloat -> IO ())
-
-getVertexAttribIInteger4 :: (GLint -> GLint -> GLint -> GLint -> b) -> AttribLocation -> GetVertexAttribPName -> IO b
-getVertexAttribIInteger4 f location n = alloca $ \buf -> do
-   glGetVertexAttribIivARB location (marshalGetVertexAttribPName n) buf
-   peek4 f buf
-
-EXTENSION_ENTRY("GL_EXT_gpu_shader4 or OpenGL 3.0",glGetVertexAttribIivARB,AttribLocation -> GLenum -> Ptr GLint -> IO ())
-
-getVertexAttribIuInteger4 :: (GLuint -> GLuint -> GLuint -> GLuint -> b) -> AttribLocation -> GetVertexAttribPName -> IO b
-getVertexAttribIuInteger4 f location n = alloca $ \buf -> do
-   glGetVertexAttribIuivARB location (marshalGetVertexAttribPName n) buf
-   peek4 f buf
-
-EXTENSION_ENTRY("GL_EXT_gpu_shader4 or OpenGL 3.0",glGetVertexAttribIuivARB,AttribLocation -> GLenum -> Ptr GLuint -> IO ())
-
---------------------------------------------------------------------------------
-
-data GetVertexAttribPointerPName =
-   VertexAttribArrayPointer
-
-marshalGetVertexAttribPointerPName :: GetVertexAttribPointerPName -> GLenum
-marshalGetVertexAttribPointerPName x = case x of
-   VertexAttribArrayPointer -> 0x8645
-
---------------------------------------------------------------------------------
-
-getVertexAttribPointer :: AttribLocation -> GetVertexAttribPointerPName -> IO (Ptr a)
-getVertexAttribPointer location n = alloca $ \buf -> do
-   glGetVertexAttribPointervARB location (marshalGetVertexAttribPointerPName n) buf
-   peek buf
-
-EXTENSION_ENTRY("GL_ARB_vertex_shader or OpenGL 2.0",glGetVertexAttribPointervARB,AttribLocation -> GLenum -> Ptr (Ptr a) -> IO ())
diff --git a/Graphics/Rendering/OpenGL/GL/RasterPos.hs b/Graphics/Rendering/OpenGL/GL/RasterPos.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/RasterPos.hs
+++ /dev/null
@@ -1,310 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.RasterPos
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to section 2.13 (Current Raster Position) of the
--- OpenGL 2.1 specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.RasterPos (
-   currentRasterPosition, RasterPosComponent, RasterPos(..),
-   WindowPosComponent, WindowPos(..),
-   currentRasterDistance, currentRasterColor, currentRasterSecondaryColor,
-   currentRasterIndex, currentRasterTexCoords, currentRasterPositionValid,
-   rasterPositionUnclipped
-) where
-
-import Data.Int
-import Foreign.Ptr ( Ptr, castPtr )
-import Graphics.Rendering.OpenGL.GL.BasicTypes (
-   GLshort, GLint, GLfloat, GLdouble, Capability )
-import Graphics.Rendering.OpenGL.GL.GLboolean ( unmarshalGLboolean )
-import Graphics.Rendering.OpenGL.GL.Capability (
-   EnableCap(CapRasterPositionUnclipped), makeCapability )
-import Graphics.Rendering.OpenGL.GL.Extensions (
-   FunPtr, unsafePerformIO, Invoker, getProcAddress )
-import Graphics.Rendering.OpenGL.GL.QueryUtils (
-   GetPName(GetCurrentRasterPosition,GetCurrentRasterDistance,
-            GetCurrentRasterColor,GetCurrentRasterSecondaryColor,
-            GetCurrentRasterIndex,GetCurrentRasterTextureCoords,
-            GetCurrentRasterPositionValid),
-   getBoolean1, getInteger1, getFloat1, getFloat4 )
-import Graphics.Rendering.OpenGL.GL.StateVar (
-   GettableStateVar, makeGettableStateVar, StateVar, makeStateVar )
-import Graphics.Rendering.OpenGL.GL.VertexSpec (
-   Vertex2(..), Vertex3(..), Vertex4(..), TexCoord4(..),
-   Color4(..), Index1(..) )
-
---------------------------------------------------------------------------------
-
-#include "HsOpenGLExt.h"
-#include "HsOpenGLTypes.h"
-
---------------------------------------------------------------------------------
-
-currentRasterPosition :: StateVar (Vertex4 GLfloat)
-currentRasterPosition =
-   makeStateVar (getFloat4 Vertex4 GetCurrentRasterPosition) rasterPos
-
---------------------------------------------------------------------------------
-
-class RasterPosComponent a where
-   rasterPos2 :: a -> a -> IO ()
-   rasterPos3 :: a -> a -> a -> IO ()
-   rasterPos4 :: a -> a -> a -> a -> IO ()
-
-   rasterPos2v :: Ptr a -> IO ()
-   rasterPos3v :: Ptr a -> IO ()
-   rasterPos4v :: Ptr a -> IO ()
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "glRasterPos2s" glRasterPos2s ::
-   GLshort -> GLshort -> IO ()
-
-foreign import CALLCONV unsafe "glRasterPos3s" glRasterPos3s ::
-   GLshort -> GLshort -> GLshort -> IO ()
-
-foreign import CALLCONV unsafe "glRasterPos4s" glRasterPos4s ::
-   GLshort -> GLshort -> GLshort -> GLshort -> IO ()
-
-foreign import CALLCONV unsafe "glRasterPos2sv" glRasterPos2sv ::
-   Ptr GLshort -> IO ()
-
-foreign import CALLCONV unsafe "glRasterPos3sv" glRasterPos3sv ::
-   Ptr GLshort -> IO ()
-
-foreign import CALLCONV unsafe "glRasterPos4sv" glRasterPos4sv ::
-   Ptr GLshort -> IO ()
-
-instance RasterPosComponent GLshort_ where
-   rasterPos2 = glRasterPos2s
-   rasterPos3 = glRasterPos3s
-   rasterPos4 = glRasterPos4s
-
-   rasterPos2v = glRasterPos2sv
-   rasterPos3v = glRasterPos3sv
-   rasterPos4v = glRasterPos4sv
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "glRasterPos2i" glRasterPos2i ::
-   GLint -> GLint -> IO ()
-
-foreign import CALLCONV unsafe "glRasterPos3i" glRasterPos3i ::
-   GLint -> GLint -> GLint -> IO ()
-
-foreign import CALLCONV unsafe "glRasterPos4i" glRasterPos4i ::
-   GLint -> GLint -> GLint -> GLint -> IO ()
-
-foreign import CALLCONV unsafe "glRasterPos2iv" glRasterPos2iv ::
-   Ptr GLint -> IO ()
-
-foreign import CALLCONV unsafe "glRasterPos3iv" glRasterPos3iv ::
-   Ptr GLint -> IO ()
-
-foreign import CALLCONV unsafe "glRasterPos4iv" glRasterPos4iv ::
-   Ptr GLint -> IO ()
-
-instance RasterPosComponent GLint_ where
-   rasterPos2 = glRasterPos2i
-   rasterPos3 = glRasterPos3i
-   rasterPos4 = glRasterPos4i
-
-   rasterPos2v = glRasterPos2iv
-   rasterPos3v = glRasterPos3iv
-   rasterPos4v = glRasterPos4iv
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "glRasterPos2f" glRasterPos2f ::
-   GLfloat -> GLfloat -> IO ()
-
-foreign import CALLCONV unsafe "glRasterPos3f" glRasterPos3f ::
-   GLfloat -> GLfloat -> GLfloat -> IO ()
-
-foreign import CALLCONV unsafe "glRasterPos4f" glRasterPos4f ::
-   GLfloat -> GLfloat -> GLfloat -> GLfloat -> IO ()
-
-foreign import CALLCONV unsafe "glRasterPos2fv" glRasterPos2fv ::
-   Ptr GLfloat -> IO ()
-
-foreign import CALLCONV unsafe "glRasterPos3fv" glRasterPos3fv ::
-   Ptr GLfloat -> IO ()
-
-foreign import CALLCONV unsafe "glRasterPos4fv" glRasterPos4fv ::
-   Ptr GLfloat -> IO ()
-
-instance RasterPosComponent GLfloat_ where
-   rasterPos2 = glRasterPos2f
-   rasterPos3 = glRasterPos3f
-   rasterPos4 = glRasterPos4f
-
-   rasterPos2v = glRasterPos2fv
-   rasterPos3v = glRasterPos3fv
-   rasterPos4v = glRasterPos4fv
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "glRasterPos2d" glRasterPos2d ::
-   GLdouble -> GLdouble -> IO ()
-
-foreign import CALLCONV unsafe "glRasterPos3d" glRasterPos3d ::
-   GLdouble -> GLdouble -> GLdouble -> IO ()
-
-foreign import CALLCONV unsafe "glRasterPos4d" glRasterPos4d ::
-   GLdouble -> GLdouble -> GLdouble -> GLdouble -> IO ()
-
-foreign import CALLCONV unsafe "glRasterPos2dv" glRasterPos2dv ::
-   Ptr GLdouble -> IO ()
-
-foreign import CALLCONV unsafe "glRasterPos3dv" glRasterPos3dv ::
-   Ptr GLdouble -> IO ()
-
-foreign import CALLCONV unsafe "glRasterPos4dv" glRasterPos4dv ::
-   Ptr GLdouble -> IO ()
-
-instance RasterPosComponent GLdouble_ where
-   rasterPos2 = glRasterPos2d
-   rasterPos3 = glRasterPos3d
-   rasterPos4 = glRasterPos4d
-
-   rasterPos2v = glRasterPos2dv
-   rasterPos3v = glRasterPos3dv
-   rasterPos4v = glRasterPos4dv
-
---------------------------------------------------------------------------------
-
-class RasterPos a where
-   rasterPos  ::     a -> IO ()
-   rasterPosv :: Ptr a -> IO ()
-
-instance RasterPosComponent a => RasterPos (Vertex2 a) where
-   rasterPos (Vertex2 x y) = rasterPos2 x y
-   rasterPosv = rasterPos2v . (castPtr :: Ptr (Vertex2 b) -> Ptr b)
-
-instance RasterPosComponent a => RasterPos (Vertex3 a) where
-   rasterPos (Vertex3 x y z) = rasterPos3 x y z
-   rasterPosv = rasterPos3v . (castPtr :: Ptr (Vertex3 b) -> Ptr b)
-
-instance RasterPosComponent a => RasterPos (Vertex4 a) where
-   rasterPos (Vertex4 x y z w) = rasterPos4 x y z w
-   rasterPosv = rasterPos4v . (castPtr :: Ptr (Vertex4 b) -> Ptr b)
-
---------------------------------------------------------------------------------
-
-class WindowPosComponent a where
-   windowPos2 :: a -> a -> IO ()
-   windowPos3 :: a -> a -> a -> IO ()
-
-   windowPos2v :: Ptr a -> IO ()
-   windowPos3v :: Ptr a -> IO ()
-
---------------------------------------------------------------------------------
-
-EXTENSION_ENTRY("GL_ARB_window_pos or OpenGL 1.4",glWindowPos2sARB,GLshort -> GLshort -> IO ())
-EXTENSION_ENTRY("GL_ARB_window_pos or OpenGL 1.4",glWindowPos3sARB,GLshort -> GLshort -> GLshort -> IO ())
-EXTENSION_ENTRY("GL_ARB_window_pos or OpenGL 1.4",glWindowPos2svARB,Ptr GLshort -> IO ())
-EXTENSION_ENTRY("GL_ARB_window_pos or OpenGL 1.4",glWindowPos3svARB,Ptr GLshort -> IO ())
-
-instance WindowPosComponent GLshort_ where
-   windowPos2 = glWindowPos2sARB
-   windowPos3 = glWindowPos3sARB
-
-   windowPos2v = glWindowPos2svARB
-   windowPos3v = glWindowPos3svARB
-
---------------------------------------------------------------------------------
-
-EXTENSION_ENTRY("GL_ARB_window_pos or OpenGL 1.4",glWindowPos2iARB,GLint -> GLint -> IO ())
-EXTENSION_ENTRY("GL_ARB_window_pos or OpenGL 1.4",glWindowPos3iARB,GLint -> GLint -> GLint -> IO ())
-EXTENSION_ENTRY("GL_ARB_window_pos or OpenGL 1.4",glWindowPos2ivARB,Ptr GLint -> IO ())
-EXTENSION_ENTRY("GL_ARB_window_pos or OpenGL 1.4",glWindowPos3ivARB,Ptr GLint -> IO ())
-
-instance WindowPosComponent GLint_ where
-   windowPos2 = glWindowPos2iARB
-   windowPos3 = glWindowPos3iARB
-
-   windowPos2v = glWindowPos2ivARB
-   windowPos3v = glWindowPos3ivARB
-
---------------------------------------------------------------------------------
-
-EXTENSION_ENTRY("GL_ARB_window_pos or OpenGL 1.4",glWindowPos2fARB,GLfloat -> GLfloat -> IO ())
-EXTENSION_ENTRY("GL_ARB_window_pos or OpenGL 1.4",glWindowPos3fARB,GLfloat -> GLfloat -> GLfloat -> IO ())
-EXTENSION_ENTRY("GL_ARB_window_pos or OpenGL 1.4",glWindowPos2fvARB,Ptr GLfloat -> IO ())
-EXTENSION_ENTRY("GL_ARB_window_pos or OpenGL 1.4",glWindowPos3fvARB,Ptr GLfloat -> IO ())
-
-instance WindowPosComponent GLfloat_ where
-   windowPos2 = glWindowPos2fARB
-   windowPos3 = glWindowPos3fARB
-
-   windowPos2v = glWindowPos2fvARB
-   windowPos3v = glWindowPos3fvARB
-
---------------------------------------------------------------------------------
-
-EXTENSION_ENTRY("GL_ARB_window_pos or OpenGL 1.4",glWindowPos2dARB,GLdouble -> GLdouble -> IO ())
-EXTENSION_ENTRY("GL_ARB_window_pos or OpenGL 1.4",glWindowPos3dARB,GLdouble -> GLdouble -> GLdouble -> IO ())
-EXTENSION_ENTRY("GL_ARB_window_pos or OpenGL 1.4",glWindowPos2dvARB,Ptr GLdouble -> IO ())
-EXTENSION_ENTRY("GL_ARB_window_pos or OpenGL 1.4",glWindowPos3dvARB,Ptr GLdouble -> IO ())
-
-instance WindowPosComponent GLdouble_ where
-   windowPos2 = glWindowPos2dARB
-   windowPos3 = glWindowPos3dARB
-
-   windowPos2v = glWindowPos2dvARB
-   windowPos3v = glWindowPos3dvARB
-
---------------------------------------------------------------------------------
-
-class WindowPos a where
-   windowPos  ::     a -> IO ()
-   windowPosv :: Ptr a -> IO ()
-
-instance WindowPosComponent a => WindowPos (Vertex2 a) where
-   windowPos (Vertex2 x y) = windowPos2 x y
-   windowPosv = windowPos2v . (castPtr :: Ptr (Vertex2 b) -> Ptr b)
-
-instance WindowPosComponent a => WindowPos (Vertex3 a) where
-   windowPos (Vertex3 x y z) = windowPos3 x y z
-   windowPosv = windowPos3v . (castPtr :: Ptr (Vertex3 b) -> Ptr b)
-
---------------------------------------------------------------------------------
-
-currentRasterDistance :: GettableStateVar GLfloat
-currentRasterDistance =
-   makeGettableStateVar (getFloat1 id GetCurrentRasterDistance)
-
-currentRasterColor :: GettableStateVar (Color4 GLfloat)
-currentRasterColor =
-   makeGettableStateVar (getFloat4 Color4 GetCurrentRasterColor)
-
-currentRasterSecondaryColor :: GettableStateVar (Color4 GLfloat)
-currentRasterSecondaryColor =
-   makeGettableStateVar (getFloat4 Color4 GetCurrentRasterSecondaryColor)
-
-currentRasterIndex :: GettableStateVar (Index1 GLint)
-currentRasterIndex =
-   makeGettableStateVar (getInteger1 Index1 GetCurrentRasterIndex)
-
-currentRasterTexCoords :: GettableStateVar (TexCoord4 GLfloat)
-currentRasterTexCoords =
-   makeGettableStateVar (getFloat4 TexCoord4 GetCurrentRasterTextureCoords)
-
-currentRasterPositionValid :: GettableStateVar Bool
-currentRasterPositionValid =
-   makeGettableStateVar
-      (getBoolean1 unmarshalGLboolean GetCurrentRasterPositionValid)
-
---------------------------------------------------------------------------------
-
-rasterPositionUnclipped :: StateVar Capability
-rasterPositionUnclipped = makeCapability CapRasterPositionUnclipped
diff --git a/Graphics/Rendering/OpenGL/GL/ReadCopyPixels.hs b/Graphics/Rendering/OpenGL/GL/ReadCopyPixels.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/ReadCopyPixels.hs
+++ /dev/null
@@ -1,77 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.ReadCopyPixels
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to section 4.3 (Drawing, Reading, and Copying Pixels)
--- of the OpenGL 2.1 specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.ReadCopyPixels (
-   -- * Reading Pixels
-   readPixels, readBuffer,
-
-   -- * Copying Pixels
-   PixelCopyType(..), copyPixels
-) where
-
-import Foreign.Ptr ( Ptr )
-import Graphics.Rendering.OpenGL.GL.BasicTypes ( GLenum, GLint, GLsizei )
-import Graphics.Rendering.OpenGL.GL.BufferMode (
-   marshalBufferMode, unmarshalBufferMode )
-import Graphics.Rendering.OpenGL.GL.Framebuffer ( BufferMode(..) )
-import Graphics.Rendering.OpenGL.GL.CoordTrans ( Position(..), Size(..) )
-import Graphics.Rendering.OpenGL.GL.PixelData ( withPixelData )
-import Graphics.Rendering.OpenGL.GL.PixelRectangles ( PixelData )
-import Graphics.Rendering.OpenGL.GL.QueryUtils (
-   GetPName(GetReadBuffer), getEnum1 )
-import Graphics.Rendering.OpenGL.GL.StateVar ( StateVar, makeStateVar )
-import Graphics.Rendering.OpenGL.GLU.ErrorsInternal ( recordInvalidValue )
-
---------------------------------------------------------------------------------
-
-readPixels :: Position -> Size -> PixelData a -> IO ()
-readPixels (Position x y) (Size w h) pd =
-   withPixelData pd $ glReadPixels x y w h
-
-foreign import CALLCONV unsafe "glReadPixels" glReadPixels ::
-   GLint -> GLint -> GLsizei -> GLsizei -> GLenum -> GLenum -> Ptr a -> IO ()
-
---------------------------------------------------------------------------------
-
-readBuffer :: StateVar BufferMode
-readBuffer =
-   makeStateVar
-      (getEnum1 unmarshalBufferMode GetReadBuffer)
-      (maybe recordInvalidValue glReadBuffer . marshalBufferMode)
-
-foreign import CALLCONV unsafe "glReadBuffer" glReadBuffer :: GLenum -> IO ()
-
---------------------------------------------------------------------------------
-
-data PixelCopyType =
-     CopyColor
-   | CopyDepth
-   | CopyStencil
-   deriving ( Eq, Ord, Show )
-
-marshalPixelCopyType :: PixelCopyType -> GLenum
-marshalPixelCopyType x = case x of
-   CopyColor -> 0x1800
-   CopyDepth -> 0x1801
-   CopyStencil -> 0x1802
-
---------------------------------------------------------------------------------
-
-copyPixels :: Position -> Size -> PixelCopyType -> IO ()
-copyPixels (Position x y) (Size w h) t =
-   glCopyPixels x y w h (marshalPixelCopyType t)
-
-foreign import CALLCONV unsafe "glCopyPixels" glCopyPixels ::
-   GLint -> GLint -> GLsizei -> GLsizei -> GLenum -> IO ()
diff --git a/Graphics/Rendering/OpenGL/GL/Rectangles.hs b/Graphics/Rendering/OpenGL/GL/Rectangles.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/Rectangles.hs
+++ /dev/null
@@ -1,105 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.Rectangles
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to section 2.10 (Rectangles) of the OpenGL 2.1 specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.Rectangles (
-   Rect(..)
-) where
-
-import Data.Int
-import Foreign.Ptr ( Ptr )
-import Graphics.Rendering.OpenGL.GL.BasicTypes (
-   GLshort, GLint, GLfloat, GLdouble )
-import Graphics.Rendering.OpenGL.GL.VertexSpec ( Vertex2(..) )
-#ifdef __HADDOCK__
-import Graphics.Rendering.OpenGL.GL.BeginEnd ( PrimitiveMode(Polygon) )
-#endif
-
---------------------------------------------------------------------------------
-
-#include "HsOpenGLExt.h"
-#include "HsOpenGLTypes.h"
-
---------------------------------------------------------------------------------
-
--- | 'rect' and 'rectv' support 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.
---
--- @'rect' ('Vertex2' x1 y1) ('Vertex2' x2, y2)@ is exactly equivalent to the
--- following sequence:
---
--- @
---    'Graphics.Rendering.OpenGL.GL.BeginEnd.renderPrimitive' 'Graphics.Rendering.OpenGL.GL.BeginEnd.Polygon' $ do
---        'Graphics.Rendering.OpenGL.GL.VertexSpec.vertex' ('Vertex2' x1 y1)
---        'Graphics.Rendering.OpenGL.GL.VertexSpec.vertex' ('Vertex2' x2 y1)
---        'Graphics.Rendering.OpenGL.GL.VertexSpec.vertex' ('Vertex2' x2 y2)
---        'Graphics.Rendering.OpenGL.GL.VertexSpec.vertex' ('Vertex2' x1 y2)
--- @
---
--- Note that if the second vertex is above and to the right of the first vertex,
--- the rectangle is constructed with a counterclockwise winding.
-
-class Rect a where
-   rect  :: Vertex2 a -> Vertex2 a -> IO ()
-   rectv :: Ptr     a -> Ptr     a -> IO ()
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "glRects" glRects ::
-   GLshort -> GLshort -> GLshort -> GLshort -> IO ()
-
-foreign import CALLCONV unsafe "glRectsv" glRectsv ::
-   Ptr GLshort -> Ptr GLshort -> IO ()
-
-instance Rect GLshort_ where
-   rect (Vertex2 x1 y1) (Vertex2 x2 y2) = glRects x1 y1 x2 y2
-   rectv ptr1 ptr2 = glRectsv ptr1 ptr2
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "glRecti" glRecti ::
-   GLint -> GLint -> GLint -> GLint -> IO ()
-
-foreign import CALLCONV unsafe "glRectiv" glRectiv ::
-   Ptr GLint -> Ptr GLint -> IO ()
-
-instance Rect GLint_ where
-   rect (Vertex2 x1 y1) (Vertex2 x2 y2) = glRecti x1 y1 x2 y2
-   rectv ptr1 ptr2 = glRectiv ptr1 ptr2
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "glRectf" glRectf ::
-   GLfloat -> GLfloat -> GLfloat -> GLfloat -> IO ()
-
-foreign import CALLCONV unsafe "glRectfv" glRectfv ::
-   Ptr GLfloat -> Ptr GLfloat -> IO ()
-
-instance Rect GLfloat_ where
-   rect (Vertex2 x1 y1) (Vertex2 x2 y2) = glRectf x1 y1 x2 y2
-   rectv ptr1 ptr2 = glRectfv ptr1 ptr2
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "glRectd" glRectd ::
-   GLdouble -> GLdouble -> GLdouble -> GLdouble -> IO ()
-
-foreign import CALLCONV unsafe "glRectdv" glRectdv ::
-   Ptr GLdouble -> Ptr GLdouble -> IO ()
-
-instance Rect GLdouble_ where
-   rect (Vertex2 x1 y1) (Vertex2 x2 y2) = glRectd x1 y1 x2 y2
-   rectv ptr1 ptr2 = glRectdv ptr1 ptr2
diff --git a/Graphics/Rendering/OpenGL/GL/RenderMode.hs b/Graphics/Rendering/OpenGL/GL/RenderMode.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/RenderMode.hs
+++ /dev/null
@@ -1,64 +0,0 @@
--- #hide
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.RenderMode
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This is a purely internal module related to the current render mode.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.RenderMode (
-   RenderMode(..), withRenderMode, renderMode
-) where
-
-import Graphics.Rendering.OpenGL.GL.BasicTypes ( GLenum, GLint )
-import Graphics.Rendering.OpenGL.GL.Exception ( finallyRet )
-import Graphics.Rendering.OpenGL.GL.QueryUtils (
-   GetPName(GetRenderMode), getEnum1 )
-import Graphics.Rendering.OpenGL.GL.StateVar (
-   HasGetter(get), GettableStateVar, makeGettableStateVar )
-
---------------------------------------------------------------------------------
-
-data RenderMode =
-     Render
-   | Feedback
-   | Select
-   deriving ( Eq, Ord, Show )
-
-marshalRenderMode :: RenderMode -> GLenum
-marshalRenderMode x = case x of
-   Render -> 0x1c00
-   Feedback -> 0x1c01
-   Select -> 0x1c02
-
-unmarshalRenderMode :: GLenum -> RenderMode
-unmarshalRenderMode x
-   | x == 0x1c00 = Render
-   | x == 0x1c01 = Feedback
-   | x == 0x1c02 = Select
-   | otherwise = error ("unmarshalRenderMode: illegal value " ++ show x)
-
---------------------------------------------------------------------------------
-
-withRenderMode :: RenderMode -> IO a -> IO (a, GLint)
-withRenderMode newMode action = do
-   oldMode <- get renderMode
-   setRenderMode newMode
-   action `finallyRet` setRenderMode oldMode
-
-setRenderMode :: RenderMode -> IO GLint
-setRenderMode = glRenderMode . marshalRenderMode
-
-foreign import CALLCONV unsafe "glRenderMode" glRenderMode :: GLenum -> IO GLint
-
---------------------------------------------------------------------------------
-
-renderMode :: GettableStateVar RenderMode
-renderMode = makeGettableStateVar $ getEnum1 unmarshalRenderMode GetRenderMode
diff --git a/Graphics/Rendering/OpenGL/GL/SavingState.hs b/Graphics/Rendering/OpenGL/GL/SavingState.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/SavingState.hs
+++ /dev/null
@@ -1,117 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.SavingState
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to section 6.1.14 (Saving and Restoring State) of the
--- OpenGL 2.1 specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.SavingState (
-   ServerAttributeGroup(..), preservingAttrib,
-   ClientAttributeGroup(..), preservingClientAttrib
-) where
-
-import Graphics.Rendering.OpenGL.GL.BasicTypes ( GLbitfield )
-import Graphics.Rendering.OpenGL.GL.Exception ( bracket_ )
-
---------------------------------------------------------------------------------
-
-data ServerAttributeGroup =
-     CurrentAttributes
-   | PointAttributes
-   | LineAttributes
-   | PolygonAttributes
-   | PolygonStippleAttributes
-   | PixelModeAttributes
-   | LightingAttributes
-   | FogAttributes
-   | DepthBufferAttributes
-   | AccumBufferAttributes
-   | StencilBufferAttributes
-   | ViewportAttributes
-   | TransformAttributes
-   | EnableAttributes
-   | ColorBufferAttributes
-   | HintAttributes
-   | EvalAttributes
-   | ListAttributes
-   | TextureAttributes
-   | ScissorAttributes
-   | MultisampleAttributes
-   | AllServerAttributes
-   deriving ( Eq, Ord, Show )
-
-marshalServerAttributeGroup :: ServerAttributeGroup -> GLbitfield
-marshalServerAttributeGroup x = case x of
-   CurrentAttributes -> 0x1
-   PointAttributes -> 0x2
-   LineAttributes -> 0x4
-   PolygonAttributes -> 0x8
-   PolygonStippleAttributes -> 0x10
-   PixelModeAttributes -> 0x20
-   LightingAttributes -> 0x40
-   FogAttributes -> 0x80
-   DepthBufferAttributes -> 0x100
-   AccumBufferAttributes -> 0x200
-   StencilBufferAttributes -> 0x400
-   ViewportAttributes -> 0x800
-   TransformAttributes -> 0x1000
-   EnableAttributes -> 0x2000
-   ColorBufferAttributes -> 0x4000
-   HintAttributes -> 0x8000
-   EvalAttributes -> 0x10000
-   ListAttributes -> 0x20000
-   TextureAttributes -> 0x40000
-   ScissorAttributes -> 0x80000
-   MultisampleAttributes -> 0x20000000
-   AllServerAttributes -> 0xffffffff
-
---------------------------------------------------------------------------------
-
-preservingAttrib :: [ServerAttributeGroup] -> IO a -> IO a
-preservingAttrib groups = bracket_ (pushAttrib groups) glPopAttrib
-
-pushAttrib :: [ServerAttributeGroup] -> IO ()
-pushAttrib = glPushAttrib . sum . map marshalServerAttributeGroup
-
-foreign import CALLCONV unsafe "glPushAttrib"
-   glPushAttrib :: GLbitfield -> IO ()
-
-foreign import CALLCONV unsafe "glPopAttrib"
-   glPopAttrib :: IO ()
-
---------------------------------------------------------------------------------
-
-data ClientAttributeGroup =
-     PixelStoreAttributes
-   | VertexArrayAttributes
-   | AllClientAttributes
-   deriving ( Eq, Ord, Show )
-
-marshalClientAttributeGroup :: ClientAttributeGroup -> GLbitfield
-marshalClientAttributeGroup x = case x of
-   PixelStoreAttributes -> 0x1
-   VertexArrayAttributes -> 0x2
-   AllClientAttributes -> 0xffffffff
-
---------------------------------------------------------------------------------
-
-preservingClientAttrib :: [ClientAttributeGroup] -> IO a -> IO a
-preservingClientAttrib groups =
-   bracket_ (pushClientAttrib groups) glPopClientAttrib
-
-pushClientAttrib :: [ClientAttributeGroup] -> IO ()
-pushClientAttrib = glPushClientAttrib . sum . map marshalClientAttributeGroup
-
-foreign import CALLCONV unsafe "glPushClientAttrib"
-   glPushClientAttrib :: GLbitfield -> IO ()
-
-foreign import CALLCONV unsafe "glPopClientAttrib"
-   glPopClientAttrib :: IO ()
diff --git a/Graphics/Rendering/OpenGL/GL/Selection.hs b/Graphics/Rendering/OpenGL/GL/Selection.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/Selection.hs
+++ /dev/null
@@ -1,101 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.Selection
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to section 5.2 (Selection) of the OpenGL 2.1 specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.Selection (
-   HitRecord(..), getHitRecords,
-   Name(..), withName, loadName, maxNameStackDepth, nameStackDepth,
-   RenderMode(..), renderMode
-) where
-
-import Foreign.Marshal.Array ( allocaArray )
-import Foreign.Ptr ( Ptr )
-import Graphics.Rendering.OpenGL.GL.BasicTypes (
-   GLint, GLsizei, GLuint, GLfloat )
-import Graphics.Rendering.OpenGL.GL.Exception ( bracket_ )
-import Graphics.Rendering.OpenGL.GL.IOState (
-   IOState, peekIOState, evalIOState, nTimes )
-import Graphics.Rendering.OpenGL.GL.QueryUtils (
-   GetPName(GetMaxNameStackDepth,GetNameStackDepth), getSizei1 )
-import Graphics.Rendering.OpenGL.GL.RenderMode (
-   RenderMode(..), withRenderMode, renderMode )
-import Graphics.Rendering.OpenGL.GL.StateVar (
-   GettableStateVar, makeGettableStateVar )
-
---------------------------------------------------------------------------------
-
-data HitRecord = HitRecord GLfloat GLfloat [Name]
-   deriving ( Eq, Ord, Show )
-
---------------------------------------------------------------------------------
-
-getHitRecords :: GLsizei -> IO a -> IO (a, Maybe [HitRecord])
-getHitRecords bufSize action =
-   allocaArray (fromIntegral bufSize) $ \buf -> do
-      glSelectBuffer bufSize buf
-      (value, numHits) <- withRenderMode Select $ do
-         glInitNames
-         action
-      hits <- parseSelectionBuffer numHits buf
-      return (value, hits)
-
-foreign import CALLCONV unsafe "glInitNames" glInitNames :: IO ()
-
-foreign import CALLCONV unsafe "glSelectBuffer" glSelectBuffer ::
-   GLsizei -> Ptr GLuint -> IO ()
-
---------------------------------------------------------------------------------
-
-parseSelectionBuffer :: GLint -> Ptr GLuint -> IO (Maybe [HitRecord])
-parseSelectionBuffer numHits buf
-   | numHits < 0 = return Nothing
-   | otherwise = fmap Just $ evalIOState (nTimes numHits parseSelectionHit) buf
-
-type Parser a = IOState GLuint a
-
-parseSelectionHit :: Parser HitRecord
-parseSelectionHit = do
-   numNames <- parseGLuint
-   minZ <- parseGLfloat
-   maxZ <- parseGLfloat
-   nameStack <- nTimes numNames parseName
-   return $ HitRecord minZ maxZ nameStack
-
-parseGLuint :: Parser GLuint
-parseGLuint = peekIOState
-
-parseGLfloat :: Parser GLfloat
-parseGLfloat = fmap (\x -> fromIntegral x / 0xffffffff) parseGLuint
-
-parseName :: Parser Name
-parseName = fmap Name parseGLuint
-
---------------------------------------------------------------------------------
-
-newtype Name = Name GLuint
-   deriving ( Eq, Ord, Show )
-
-withName :: Name -> IO a -> IO a
-withName name = bracket_ (glPushName name) glPopName
-
-foreign import CALLCONV unsafe "glPopName" glPopName :: IO ()
-
-foreign import CALLCONV unsafe "glPushName" glPushName :: Name -> IO ()
-
-foreign import CALLCONV unsafe "glLoadName" loadName :: Name -> IO ()
-
-maxNameStackDepth :: GettableStateVar GLsizei
-maxNameStackDepth = makeGettableStateVar (getSizei1 id GetMaxNameStackDepth)
-
-nameStackDepth :: GettableStateVar GLsizei
-nameStackDepth = makeGettableStateVar (getSizei1 id GetNameStackDepth)
diff --git a/Graphics/Rendering/OpenGL/GL/Shaders.hs b/Graphics/Rendering/OpenGL/GL/Shaders.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/Shaders.hs
+++ /dev/null
@@ -1,806 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.Shaders
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to sections 2.15 (Vertex Shaders) and section 3.11
--- (Fragment Shaders) of the OpenGL 2.1 specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.Shaders (
-   -- * Shader Objects
-   Shader, VertexShader, FragmentShader, shaderDeleteStatus, shaderSource,
-   compileShader, compileStatus, shaderInfoLog,
-
-   -- * Program Objects
-   Program, programDeleteStatus, attachedShaders, linkProgram, linkStatus,
-   programInfoLog, validateProgram, validateStatus, currentProgram,
-
-   -- * Vertex attributes
-   attribLocation, VariableType(..), activeAttribs,
-
-   -- * Uniform variables
-   UniformLocation, uniformLocation, activeUniforms, Uniform(..),
-   UniformComponent,
-
-   -- * Implementation limits related to GLSL
-   maxVertexTextureImageUnits, maxTextureImageUnits,
-   maxCombinedTextureImageUnits, maxTextureCoords, maxVertexUniformComponents,
-   maxFragmentUniformComponents, maxVertexAttribs, maxVaryingFloats
-) where
-
-import Control.Monad ( replicateM, mapM_, foldM )
-import Control.Monad.Fix ( MonadFix(..) )
-import Data.Int
-import Data.List ( genericLength, (\\) )
-import Data.Word
-import Foreign.C.String ( peekCAStringLen, withCAStringLen, withCAString )
-import Foreign.Marshal.Alloc ( alloca, allocaBytes )
-import Foreign.Marshal.Array ( allocaArray, withArray, peekArray )
-import Foreign.Marshal.Utils ( withMany )
-import Foreign.Ptr ( Ptr, castPtr, nullPtr )
-import Foreign.Storable ( Storable(peek,sizeOf) )
-import Graphics.Rendering.OpenGL.GL.BasicTypes (
-   GLboolean, GLchar, GLint, GLuint, GLsizei, GLenum, GLfloat )
-import Graphics.Rendering.OpenGL.GL.BufferObjects ( ObjectName(..) )
-import Graphics.Rendering.OpenGL.GL.Extensions (
-   FunPtr, unsafePerformIO, Invoker, getProcAddress )
-import Graphics.Rendering.OpenGL.GL.GLboolean ( unmarshalGLboolean )
-import Graphics.Rendering.OpenGL.GL.PeekPoke ( peek1 )
-import Graphics.Rendering.OpenGL.GL.QueryUtils (
-   GetPName(GetMaxCombinedTextureImageUnits, GetMaxFragmentUniformComponents,
-            GetMaxTextureCoords, GetMaxTextureImageUnits,GetMaxVaryingFloats,
-            GetMaxVertexAttribs, GetMaxVertexTextureImageUnits,
-            GetMaxVertexUniformComponents, GetCurrentProgram),
-   getInteger1, getSizei1 )
-import Graphics.Rendering.OpenGL.GL.StateVar (
-   HasGetter(get), GettableStateVar, makeGettableStateVar, StateVar,
-   makeStateVar )
-import Graphics.Rendering.OpenGL.GL.VertexSpec (
-   AttribLocation(..), Vertex2(..), Vertex3(..), Vertex4(..), TexCoord1(..),
-   TexCoord2(..), TexCoord3(..), TexCoord4(..), Normal3(..), FogCoord1(..),
-   Color3(..), Color4(..), Index1(..) )
-
---------------------------------------------------------------------------------
-
-#include "HsOpenGLExt.h"
-#include "HsOpenGLTypes.h"
-
---------------------------------------------------------------------------------
-
-type GLStringLen = (Ptr GLchar, GLsizei)
-
-peekGLstringLen :: GLStringLen -> IO String
-peekGLstringLen (p,l) = peekCAStringLen (castPtr p, fromIntegral l)
-
-withGLStringLen :: String -> (GLStringLen -> IO a) -> IO a
-withGLStringLen s act =
-   withCAStringLen s $ \(p,len) ->
-      act (castPtr p, fromIntegral len)
-
-withGLString :: String -> (Ptr GLchar -> IO a) -> IO a
-withGLString s act = withCAString s $ act . castPtr
-
---------------------------------------------------------------------------------
-
-newtype VertexShader = VertexShader { vertexShaderID :: GLuint }
-   deriving ( Eq, Ord, Show )
-
-newtype FragmentShader = FragmentShader { fragmentShaderID :: GLuint }
-   deriving ( Eq, Ord, Show )
-
---------------------------------------------------------------------------------
-
-class (Eq s, Ord s, Show s, ObjectName s) => Shader s where
-   shaderID :: s -> GLuint
-   makeShader :: GLuint -> s
-   shaderType :: s -> GLenum
-
-instance Shader VertexShader where
-   makeShader = VertexShader
-   shaderID = vertexShaderID
-   shaderType = const 0x8B31
-
-instance Shader FragmentShader where
-   makeShader = FragmentShader
-   shaderID = fragmentShaderID
-   shaderType = const 0x8B30
-
---------------------------------------------------------------------------------
-
-instance ObjectName VertexShader where
-   genObjectNames = genShaderNames
-   deleteObjectNames = deleteShaderNames
-   isObjectName = isShaderName
-
-instance ObjectName FragmentShader where
-   genObjectNames = genShaderNames
-   deleteObjectNames = deleteShaderNames
-   isObjectName = isShaderName
-
-genShaderNames :: Shader s => Int -> IO [s]
-genShaderNames n = replicateM n createShader
-
-createShader :: Shader s => IO s
-createShader = mfix (fmap makeShader . glCreateShader . shaderType)
-
-deleteShaderNames :: Shader s => [s] -> IO ()
-deleteShaderNames = mapM_ (glDeleteShader . shaderID)
-
-isShaderName :: Shader s => s -> IO Bool
-isShaderName = fmap unmarshalGLboolean . glIsShader . shaderID
-
-EXTENSION_ENTRY("OpenGL 2.0",glCreateShader,GLenum -> IO GLuint)
-EXTENSION_ENTRY("OpenGL 2.0",glDeleteShader,GLuint -> IO ())
-EXTENSION_ENTRY("OpenGL 2.0",glIsShader,GLuint -> IO GLboolean)
-
---------------------------------------------------------------------------------
-
-compileShader :: Shader s => s -> IO ()
-compileShader = glCompileShader . shaderID
-
-EXTENSION_ENTRY("OpenGL 2.0",glCompileShader,GLuint -> IO ())
-
---------------------------------------------------------------------------------
-
-shaderSource :: Shader s => s -> StateVar [String]
-shaderSource shader =
-   makeStateVar (getShaderSource shader) (setShaderSource shader)
-
-setShaderSource :: Shader s => s -> [String] -> IO ()
-setShaderSource shader srcs = do
-   let len = genericLength srcs
-   withMany withGLStringLen srcs $ \charBufsAndLengths -> do
-      let (charBufs, lengths) = unzip charBufsAndLengths
-      withArray charBufs $ \charBufsBuf ->
-         withArray lengths $ \lengthsBuf ->
-            glShaderSource (shaderID shader) len charBufsBuf lengthsBuf
-
-EXTENSION_ENTRY("OpenGL 2.0",glShaderSource,GLuint -> GLsizei -> Ptr (Ptr GLchar) -> Ptr GLint -> IO ())
-
-getShaderSource :: Shader s => s -> IO [String]
-getShaderSource shader = do
-   src <- get (stringQuery (shaderSourceLength shader)
-                           (glGetShaderSource (shaderID shader)))
-   return [src]
-
-EXTENSION_ENTRY("OpenGL 2.0",glGetShaderSource,GLuint -> GLsizei -> Ptr GLsizei -> Ptr GLchar -> IO ())
-
-stringQuery :: GettableStateVar GLsizei -> (GLsizei -> Ptr GLsizei -> Ptr GLchar -> IO ()) -> GettableStateVar String
-stringQuery lengthVar getStr =
-   makeGettableStateVar $ do
-      len <- get lengthVar -- Note: This includes the NUL character!
-      if len == 0
-        then return ""
-        else allocaArray (fromIntegral len) $ \buf -> do
-                getStr len nullPtr buf
-                peekGLstringLen (buf, len-1)
-
---------------------------------------------------------------------------------
-
-shaderInfoLog :: Shader s => s -> GettableStateVar String
-shaderInfoLog shader =
-   stringQuery (shaderInfoLogLength shader) (glGetShaderInfoLog (shaderID shader))
-
-EXTENSION_ENTRY("OpenGL 2.0",glGetShaderInfoLog,GLuint -> GLsizei -> Ptr GLsizei -> Ptr GLchar -> IO ())
-
---------------------------------------------------------------------------------
-
-shaderDeleteStatus :: Shader s => s -> GettableStateVar Bool
-shaderDeleteStatus = shaderVar unmarshalGLboolean ShaderDeleteStatus
-
-compileStatus :: Shader s => s -> GettableStateVar Bool
-compileStatus = shaderVar unmarshalGLboolean CompileStatus
-
-shaderInfoLogLength :: Shader s => s -> GettableStateVar GLsizei
-shaderInfoLogLength = shaderVar fromIntegral ShaderInfoLogLength
-
-shaderSourceLength :: Shader s => s -> GettableStateVar GLsizei
-shaderSourceLength = shaderVar fromIntegral ShaderSourceLength
-
-shaderTypeEnum :: Shader s => s -> GettableStateVar GLenum
-shaderTypeEnum = shaderVar fromIntegral ShaderType
-
---------------------------------------------------------------------------------
-
-data GetShaderPName =
-     ShaderDeleteStatus
-   | CompileStatus
-   | ShaderInfoLogLength
-   | ShaderSourceLength
-   | ShaderType
-
-marshalGetShaderPName :: GetShaderPName -> GLenum
-marshalGetShaderPName x = case x of
-   ShaderDeleteStatus -> 0x8B80
-   CompileStatus -> 0x8B81
-   ShaderInfoLogLength -> 0x8B84
-   ShaderSourceLength -> 0x8B88
-   ShaderType -> 0x8B4F
-
-shaderVar :: Shader s => (GLint -> a) -> GetShaderPName -> s -> GettableStateVar a
-shaderVar f p shader =
-   makeGettableStateVar $
-      alloca $ \buf -> do
-         glGetShaderiv (shaderID shader) (marshalGetShaderPName p) buf
-         peek1 f buf
-
-EXTENSION_ENTRY("OpenGL 2.0",glGetShaderiv,GLuint -> GLenum -> Ptr GLint -> IO ())
-
---------------------------------------------------------------------------------
-
-newtype Program = Program { programID :: GLuint }
-   deriving ( Eq, Ord, Show )
-
-instance ObjectName Program where
-   genObjectNames n = replicateM n $ fmap Program glCreateProgram
-   deleteObjectNames = mapM_ (glDeleteProgram . programID)
-   isObjectName = fmap unmarshalGLboolean . glIsProgram . programID
-
-EXTENSION_ENTRY("OpenGL 2.0",glCreateProgram,IO GLuint)
-EXTENSION_ENTRY("OpenGL 2.0",glDeleteProgram,GLuint -> IO ())
-EXTENSION_ENTRY("OpenGL 2.0",glIsProgram,GLuint -> IO GLboolean)
-
---------------------------------------------------------------------------------
-
-attachedShaders :: Program -> StateVar ([VertexShader],[FragmentShader])
-attachedShaders program =
-   makeStateVar (getAttachedShaders program) (setAttachedShaders program)
-
-getAttachedShaders :: Program -> IO ([VertexShader],[FragmentShader])
-getAttachedShaders program = getAttachedShaderIDs program >>= splitShaderIDs
-
-getAttachedShaderIDs :: Program -> IO [GLuint]
-getAttachedShaderIDs program = do
-   numShaders <- get (numAttachedShaders program)
-   allocaArray (fromIntegral numShaders) $ \buf -> do
-      glGetAttachedShaders (programID program) numShaders nullPtr buf
-      peekArray (fromIntegral numShaders) buf
-
-EXTENSION_ENTRY("OpenGL 2.0",glGetAttachedShaders,GLuint -> GLsizei -> Ptr GLsizei -> Ptr GLuint -> IO ())
-
-splitShaderIDs :: [GLuint] -> IO ([VertexShader],[FragmentShader])
-splitShaderIDs ids = do
-   (vs, fs) <- partitionM isVertexShaderID ids
-   return (map VertexShader vs, map FragmentShader fs)
-
-isVertexShaderID :: GLuint -> IO Bool
-isVertexShaderID x = do
-   t <- get (shaderTypeEnum (VertexShader x))
-   return $ t == shaderType (undefined :: VertexShader)
-
-partitionM :: (a -> IO Bool) -> [a] -> IO ([a],[a])
-partitionM p = foldM select ([],[])
-   where select (ts, fs) x = do
-            b <- p x
-            return $ if b then (x:ts, fs) else (ts, x:fs)
-
-setAttachedShaders :: Program -> ([VertexShader],[FragmentShader]) -> IO ()
-setAttachedShaders program (vs, fs) = do
-   currentIDs <- getAttachedShaderIDs program
-   let newIDs = map shaderID vs ++ map shaderID fs
-   mapM_ (glAttachShader program) (newIDs \\ currentIDs)
-   mapM_ (glDetachShader program) (currentIDs \\ newIDs)
-
-EXTENSION_ENTRY("OpenGL 2.0",glAttachShader,Program -> GLuint -> IO ())
-EXTENSION_ENTRY("OpenGL 2.0",glDetachShader,Program -> GLuint -> IO ())
-
---------------------------------------------------------------------------------
-
-linkProgram :: Program -> IO ()
-linkProgram = glLinkProgram
-
-EXTENSION_ENTRY("OpenGL 2.0",glLinkProgram,Program -> IO ())
-
-currentProgram :: StateVar (Maybe Program)
-currentProgram =
-   makeStateVar
-      (do p <- getCurrentProgram
-          return $ if p == noProgram then Nothing else Just p)
-      (glUseProgram . maybe noProgram id)
-
-getCurrentProgram :: IO Program
-getCurrentProgram = fmap Program $ getInteger1 fromIntegral GetCurrentProgram
-
-noProgram :: Program
-noProgram = Program 0
-
-EXTENSION_ENTRY("OpenGL 2.0",glUseProgram,Program -> IO ())
-
-validateProgram :: Program -> IO ()
-validateProgram = glValidateProgram
-
-EXTENSION_ENTRY("OpenGL 2.0",glValidateProgram,Program -> IO ())
-
-programInfoLog :: Program -> GettableStateVar String
-programInfoLog p =
-   stringQuery (programInfoLogLength p) (glGetProgramInfoLog (programID p))
-
-EXTENSION_ENTRY("OpenGL 2.0",glGetProgramInfoLog,GLuint -> GLsizei -> Ptr GLsizei -> Ptr GLchar -> IO ())
-
---------------------------------------------------------------------------------
-
-programDeleteStatus :: Program -> GettableStateVar Bool
-programDeleteStatus = programVar unmarshalGLboolean ProgramDeleteStatus
-
-linkStatus :: Program -> GettableStateVar Bool
-linkStatus = programVar unmarshalGLboolean LinkStatus
-
-validateStatus :: Program -> GettableStateVar Bool
-validateStatus = programVar unmarshalGLboolean ValidateStatus
-
-programInfoLogLength :: Program -> GettableStateVar GLsizei
-programInfoLogLength = programVar fromIntegral ProgramInfoLogLength
-
-numAttachedShaders :: Program -> GettableStateVar GLsizei
-numAttachedShaders = programVar fromIntegral AttachedShaders
-
-activeAttributes :: Program -> GettableStateVar GLuint
-activeAttributes = programVar fromIntegral ActiveAttributes
-
-activeAttributeMaxLength :: Program -> GettableStateVar GLsizei
-activeAttributeMaxLength = programVar fromIntegral ActiveAttributeMaxLength
-
-numActiveUniforms :: Program -> GettableStateVar GLuint
-numActiveUniforms = programVar fromIntegral ActiveUniforms
-
-activeUniformMaxLength :: Program -> GettableStateVar GLsizei
-activeUniformMaxLength = programVar fromIntegral ActiveUniformMaxLength
-
---------------------------------------------------------------------------------
-
-data GetProgramPName =
-     ProgramDeleteStatus
-   | LinkStatus
-   | ValidateStatus
-   | ProgramInfoLogLength
-   | AttachedShaders
-   | ActiveAttributes
-   | ActiveAttributeMaxLength
-   | ActiveUniforms
-   | ActiveUniformMaxLength
-
-marshalGetProgramPName :: GetProgramPName -> GLenum
-marshalGetProgramPName x = case x of
-   ProgramDeleteStatus -> 0x8B80
-   LinkStatus -> 0x8B82
-   ValidateStatus -> 0x8B83
-   ProgramInfoLogLength -> 0x8B84
-   AttachedShaders -> 0x8B85
-   ActiveAttributes -> 0x8B89
-   ActiveAttributeMaxLength -> 0x8B8A
-   ActiveUniforms -> 0x8B86
-   ActiveUniformMaxLength -> 0x8B87
-
-programVar :: (GLint -> a) -> GetProgramPName -> Program -> GettableStateVar a
-programVar f p program =
-   makeGettableStateVar $
-      alloca $ \buf -> do
-         glGetProgramiv (programID program) (marshalGetProgramPName p) buf
-         peek1 f buf
-
-EXTENSION_ENTRY("OpenGL 2.0",glGetProgramiv,GLuint -> GLenum -> Ptr GLint -> IO ())
-
---------------------------------------------------------------------------------
-
-attribLocation :: Program -> String -> StateVar AttribLocation
-attribLocation program name =
-   makeStateVar (getAttribLocation program name)
-                (\location -> bindAttribLocation program location name)
-
-getAttribLocation :: Program -> String -> IO AttribLocation
-getAttribLocation program name =
-   fmap (AttribLocation . fromIntegral) $
-      withGLString name $
-         glGetAttribLocation program
-
-EXTENSION_ENTRY("OpenGL 2.0",glGetAttribLocation,Program -> Ptr GLchar -> IO GLint)
-
-bindAttribLocation :: Program -> AttribLocation -> String -> IO ()
-bindAttribLocation program location name =
-   withGLString name $
-      glBindAttribLocation program location
-
-EXTENSION_ENTRY("OpenGL 2.0",glBindAttribLocation,Program -> AttribLocation -> Ptr GLchar -> IO ())
-
---------------------------------------------------------------------------------
-
--- Table 2.9 of the OpenGL 3.1 spec: OpenGL Shading Language type tokens
-data VariableType =
-     Float'
-   | FloatVec2
-   | FloatVec3
-   | FloatVec4
-   | Int'
-   | IntVec2
-   | IntVec3
-   | IntVec4
-   | UnsignedInt'
-   | UnsignedIntVec2
-   | UnsignedIntVec3
-   | UnsignedIntVec4
-   | Bool
-   | BoolVec2
-   | BoolVec3
-   | BoolVec4
-   | FloatMat2
-   | FloatMat3
-   | FloatMat4
-   | FloatMat2x3
-   | FloatMat2x4
-   | FloatMat3x2
-   | FloatMat3x4
-   | FloatMat4x2
-   | FloatMat4x3
-   | Sampler1D
-   | Sampler2D
-   | Sampler3D
-   | SamplerCube
-   | Sampler1DShadow
-   | Sampler2DShadow
-   | Sampler1DArray
-   | Sampler2DArray
-   | Sampler1DArrayShadow
-   | Sampler2DArrayShadow
-   | SamplerCubeShadow
-   | Sampler2DRect
-   | Sampler2DRectShadow
-   | IntSampler1D
-   | IntSampler2D
-   | IntSampler3D
-   | IntSamplerCube
-   | IntSampler1DArray
-   | IntSampler2DArray
-   | UnsignedIntSampler1D
-   | UnsignedIntSampler2D
-   | UnsignedIntSampler3D
-   | UnsignedIntSamplerCube
-   | UnsignedIntSampler1DArray
-   | UnsignedIntSampler2DArray
-   deriving ( Eq, Ord, Show )
-
-unmarshalVariableType :: GLenum -> VariableType
-unmarshalVariableType x
-   | x == 0x1406 = Float'
-   | x == 0x8B50 = FloatVec2
-   | x == 0x8B51 = FloatVec3
-   | x == 0x8B52 = FloatVec4
-   | x == 0x1404 = Int'
-   | x == 0x8B53 = IntVec2
-   | x == 0x8B54 = IntVec3
-   | x == 0x8B55 = IntVec4
-   | x == 0x1405 = UnsignedInt'
-   | x == 0x8DC6 = UnsignedIntVec2
-   | x == 0x8DC7 = UnsignedIntVec3
-   | x == 0x8DC8 = UnsignedIntVec4
-   | x == 0x8B56 = Bool
-   | x == 0x8B57 = BoolVec2
-   | x == 0x8B58 = BoolVec3
-   | x == 0x8B59 = BoolVec4
-   | x == 0x8B5A = FloatMat2
-   | x == 0x8B5B = FloatMat3
-   | x == 0x8B5C = FloatMat4
-   | x == 0x8B65 = FloatMat2x3
-   | x == 0x8B66 = FloatMat2x4
-   | x == 0x8B67 = FloatMat3x2
-   | x == 0x8B68 = FloatMat3x4
-   | x == 0x8B69 = FloatMat4x2
-   | x == 0x8B6A = FloatMat4x3
-   | x == 0x8B5D = Sampler1D
-   | x == 0x8B5E = Sampler2D
-   | x == 0x8B5F = Sampler3D
-   | x == 0x8B60 = SamplerCube
-   | x == 0x8B61 = Sampler1DShadow
-   | x == 0x8B62 = Sampler2DShadow
-   | x == 0x8DC0 = Sampler1DArray
-   | x == 0x8DC1 = Sampler2DArray
-   | x == 0x8DC3 = Sampler1DArrayShadow
-   | x == 0x8DC4 = Sampler2DArrayShadow
-   | x == 0x8DC5 = SamplerCubeShadow
-   | x == 0x8B63 = Sampler2DRect
-   | x == 0x8B64 = Sampler2DRectShadow
-   | x == 0x8DC9 = IntSampler1D
-   | x == 0x8DCA = IntSampler2D
-   | x == 0x8DCB = IntSampler3D
-   | x == 0x8DCC = IntSamplerCube
-   | x == 0x8DCE = IntSampler1DArray
-   | x == 0x8DCF = IntSampler2DArray
-   | x == 0x8DD1 = UnsignedIntSampler1D
-   | x == 0x8DD2 = UnsignedIntSampler2D
-   | x == 0x8DD3 = UnsignedIntSampler3D
-   | x == 0x8DD4 = UnsignedIntSamplerCube
-   | x == 0x8DD6 = UnsignedIntSampler1DArray
-   | x == 0x8DD7 = UnsignedIntSampler2DArray
-   | otherwise = error ("unmarshalVariableType: illegal value " ++ show x)
-
---------------------------------------------------------------------------------
-
-activeVars :: (Program -> GettableStateVar GLuint)
-           -> (Program -> GettableStateVar GLsizei)
-           -> (Program -> GLuint -> GLsizei -> Ptr GLsizei -> Ptr GLint -> Ptr GLenum -> Ptr GLchar -> IO ())
-           -> Program -> GettableStateVar [(GLint,VariableType,String)]
-activeVars numVars maxLength getter program =
-   makeGettableStateVar $ do
-      numActiveVars <- get (numVars program)
-      maxLen <- get (maxLength program)
-      allocaArray (fromIntegral maxLen) $ \nameBuf ->
-         alloca $ \nameLengthBuf ->
-            alloca $ \sizeBuf ->
-               alloca $ \typeBuf ->
-                  flip mapM [0 .. numActiveVars - 1] $ \i -> do
-                    getter program i maxLen nameLengthBuf sizeBuf typeBuf nameBuf
-                    l <- peek nameLengthBuf
-                    s <- peek sizeBuf
-                    t <- peek typeBuf
-                    n <- peekGLstringLen (nameBuf, l)
-                    return (s, unmarshalVariableType t, n)
-
-activeAttribs :: Program -> GettableStateVar [(GLint,VariableType,String)]
-activeAttribs = activeVars activeAttributes activeAttributeMaxLength glGetActiveAttrib
-
-EXTENSION_ENTRY("OpenGL 2.0",glGetActiveAttrib,Program -> GLuint -> GLsizei -> Ptr GLsizei -> Ptr GLint -> Ptr GLenum -> Ptr GLchar -> IO ())
-
---------------------------------------------------------------------------------
-
-newtype UniformLocation = UniformLocation GLint
-   deriving ( Eq, Ord, Show )
-
-uniformLocation :: Program -> String -> GettableStateVar UniformLocation
-uniformLocation program name =
-   makeGettableStateVar $
-      fmap UniformLocation $
-         withGLString name $
-            glGetUniformLocation program
-
-EXTENSION_ENTRY("OpenGL 2.0",glGetUniformLocation,Program -> Ptr GLchar -> IO GLint)
-
---------------------------------------------------------------------------------
-
-activeUniforms :: Program -> GettableStateVar [(GLint,VariableType,String)]
-activeUniforms = activeVars numActiveUniforms activeUniformMaxLength glGetActiveUniform
-
-EXTENSION_ENTRY("OpenGL 2.0",glGetActiveUniform,Program -> GLuint -> GLsizei -> Ptr GLsizei -> Ptr GLint -> Ptr GLenum -> Ptr GLchar -> IO ())
-
---------------------------------------------------------------------------------
-
-class Storable a => UniformComponent a where
-   uniform1 :: UniformLocation -> a -> IO ()
-   uniform2 :: UniformLocation -> a -> a -> IO ()
-   uniform3 :: UniformLocation -> a -> a -> a -> IO ()
-   uniform4 :: UniformLocation -> a -> a -> a -> a -> IO ()
-
-   getUniform :: Storable (b a) => Program -> UniformLocation -> Ptr (b a) -> IO ()
-
-   uniform1v :: UniformLocation -> GLsizei -> Ptr a -> IO ()
-   uniform2v :: UniformLocation -> GLsizei -> Ptr a -> IO ()
-   uniform3v :: UniformLocation -> GLsizei -> Ptr a -> IO ()
-   uniform4v :: UniformLocation -> GLsizei -> Ptr a -> IO ()
-
---------------------------------------------------------------------------------
-
-EXTENSION_ENTRY("OpenGL 2.0",glUniform1i,UniformLocation -> GLint -> IO ())
-EXTENSION_ENTRY("OpenGL 2.0",glUniform2i,UniformLocation -> GLint -> GLint -> IO ())
-EXTENSION_ENTRY("OpenGL 2.0",glUniform3i,UniformLocation -> GLint -> GLint -> GLint -> IO ())
-EXTENSION_ENTRY("OpenGL 2.0",glUniform4i,UniformLocation -> GLint -> GLint -> GLint -> GLint -> IO ())
-
-EXTENSION_ENTRY("OpenGL 2.0",glGetUniformiv,Program -> UniformLocation -> Ptr GLint -> IO ())
-
-EXTENSION_ENTRY("OpenGL 2.0",glUniform1iv,UniformLocation -> GLsizei -> Ptr GLint -> IO ())
-EXTENSION_ENTRY("OpenGL 2.0",glUniform2iv,UniformLocation -> GLsizei -> Ptr GLint -> IO ())
-EXTENSION_ENTRY("OpenGL 2.0",glUniform3iv,UniformLocation -> GLsizei -> Ptr GLint -> IO ())
-EXTENSION_ENTRY("OpenGL 2.0",glUniform4iv,UniformLocation -> GLsizei -> Ptr GLint -> IO ())
-
-instance UniformComponent GLint_ where
-   uniform1 = glUniform1i
-   uniform2 = glUniform2i
-   uniform3 = glUniform3i
-   uniform4 = glUniform4i
-
-   getUniform program location = glGetUniformiv program location . castPtr
-
-   uniform1v = glUniform1iv
-   uniform2v = glUniform2iv
-   uniform3v = glUniform3iv
-   uniform4v = glUniform4iv
-
---------------------------------------------------------------------------------
-
-EXTENSION_ENTRY("OpenGL 2.0",glUniform1ui,UniformLocation -> GLuint -> IO ())
-EXTENSION_ENTRY("OpenGL 2.0",glUniform2ui,UniformLocation -> GLuint -> GLuint -> IO ())
-EXTENSION_ENTRY("OpenGL 2.0",glUniform3ui,UniformLocation -> GLuint -> GLuint -> GLuint -> IO ())
-EXTENSION_ENTRY("OpenGL 2.0",glUniform4ui,UniformLocation -> GLuint -> GLuint -> GLuint -> GLuint -> IO ())
-
-EXTENSION_ENTRY("OpenGL 2.0",glGetUniformuiv,Program -> UniformLocation -> Ptr GLuint -> IO ())
-
-EXTENSION_ENTRY("OpenGL 2.0",glUniform1uiv,UniformLocation -> GLsizei -> Ptr GLuint -> IO ())
-EXTENSION_ENTRY("OpenGL 2.0",glUniform2uiv,UniformLocation -> GLsizei -> Ptr GLuint -> IO ())
-EXTENSION_ENTRY("OpenGL 2.0",glUniform3uiv,UniformLocation -> GLsizei -> Ptr GLuint -> IO ())
-EXTENSION_ENTRY("OpenGL 2.0",glUniform4uiv,UniformLocation -> GLsizei -> Ptr GLuint -> IO ())
-
-instance UniformComponent GLuint_ where
-   uniform1 = glUniform1ui
-   uniform2 = glUniform2ui
-   uniform3 = glUniform3ui
-   uniform4 = glUniform4ui
-
-   getUniform program location = glGetUniformuiv program location . castPtr
-
-   uniform1v = glUniform1uiv
-   uniform2v = glUniform2uiv
-   uniform3v = glUniform3uiv
-   uniform4v = glUniform4uiv
-
---------------------------------------------------------------------------------
-
-EXTENSION_ENTRY("OpenGL 2.0",glUniform1f,UniformLocation -> GLfloat -> IO ())
-EXTENSION_ENTRY("OpenGL 2.0",glUniform2f,UniformLocation -> GLfloat -> GLfloat -> IO ())
-EXTENSION_ENTRY("OpenGL 2.0",glUniform3f,UniformLocation -> GLfloat -> GLfloat -> GLfloat -> IO ())
-EXTENSION_ENTRY("OpenGL 2.0",glUniform4f,UniformLocation -> GLfloat -> GLfloat -> GLfloat -> GLfloat -> IO ())
-
-EXTENSION_ENTRY("OpenGL 2.0",glGetUniformfv,Program -> UniformLocation -> Ptr GLfloat -> IO ())
-
-EXTENSION_ENTRY("OpenGL 2.0",glUniform1fv,UniformLocation -> GLsizei -> Ptr GLfloat -> IO ())
-EXTENSION_ENTRY("OpenGL 2.0",glUniform2fv,UniformLocation -> GLsizei -> Ptr GLfloat -> IO ())
-EXTENSION_ENTRY("OpenGL 2.0",glUniform3fv,UniformLocation -> GLsizei -> Ptr GLfloat -> IO ())
-EXTENSION_ENTRY("OpenGL 2.0",glUniform4fv,UniformLocation -> GLsizei -> Ptr GLfloat -> IO ())
-
-instance UniformComponent GLfloat_ where
-   uniform1 = glUniform1f
-   uniform2 = glUniform2f
-   uniform3 = glUniform3f
-   uniform4 = glUniform4f
-
-   getUniform program location = glGetUniformfv program location . castPtr
-
-   uniform1v = glUniform1fv
-   uniform2v = glUniform2fv
-   uniform3v = glUniform3fv
-   uniform4v = glUniform4fv
-
---------------------------------------------------------------------------------
-
-EXTENSION_ENTRY("OpenGL 2.0",glUniformMatrix2fv,UniformLocation -> GLsizei -> GLboolean -> Ptr GLfloat -> IO ())
-EXTENSION_ENTRY("OpenGL 2.0",glUniformMatrix3fv,UniformLocation -> GLsizei -> GLboolean -> Ptr GLfloat -> IO ())
-EXTENSION_ENTRY("OpenGL 2.0",glUniformMatrix4fv,UniformLocation -> GLsizei -> GLboolean -> Ptr GLfloat -> IO ())
-EXTENSION_ENTRY("OpenGL 2.1",glUniformMatrix2x3fv,UniformLocation -> GLsizei -> GLboolean -> Ptr GLfloat -> IO ())
-EXTENSION_ENTRY("OpenGL 2.1",glUniformMatrix3x2fv,UniformLocation -> GLsizei -> GLboolean -> Ptr GLfloat -> IO ())
-EXTENSION_ENTRY("OpenGL 2.1",glUniformMatrix2x4fv,UniformLocation -> GLsizei -> GLboolean -> Ptr GLfloat -> IO ())
-EXTENSION_ENTRY("OpenGL 2.1",glUniformMatrix4x2fv,UniformLocation -> GLsizei -> GLboolean -> Ptr GLfloat -> IO ())
-EXTENSION_ENTRY("OpenGL 2.1",glUniformMatrix3x4fv,UniformLocation -> GLsizei -> GLboolean -> Ptr GLfloat -> IO ())
-EXTENSION_ENTRY("OpenGL 2.1",glUniformMatrix4x3fv,UniformLocation -> GLsizei -> GLboolean -> Ptr GLfloat -> IO ())
-
---------------------------------------------------------------------------------
-
-class Uniform a where
-   uniform :: UniformLocation -> StateVar a
-   uniformv :: UniformLocation -> GLsizei -> Ptr a -> IO ()
-
-maxComponentSize :: Int
-maxComponentSize = sizeOf (undefined :: GLint) `max` sizeOf (undefined :: GLfloat)
-
-maxNumComponents :: Int
-maxNumComponents = 16
-
-maxUniformBufferSize :: Int
-maxUniformBufferSize = maxComponentSize * maxNumComponents
-
-makeUniformVar :: (UniformComponent a, Storable (b a))
-               => (UniformLocation -> b a -> IO ())
-               -> UniformLocation -> StateVar (b a)
-makeUniformVar setter location = makeStateVar getter (setter location)
-   where getter = do
-            program <- getCurrentProgram
-            allocaBytes maxUniformBufferSize  $ \buf -> do
-            getUniform program location buf
-            peek buf
-
-instance UniformComponent a => Uniform (Vertex2 a) where
-   uniform = makeUniformVar $ \location (Vertex2 x y) -> uniform2 location x y
-   uniformv location count = uniform2v location count . (castPtr :: Ptr (Vertex2 b) -> Ptr b)
-
-instance UniformComponent a => Uniform (Vertex3 a) where
-   uniform = makeUniformVar $ \location (Vertex3 x y z) -> uniform3 location x y z
-   uniformv location count = uniform3v location count . (castPtr :: Ptr (Vertex3 b) -> Ptr b)
-
-instance UniformComponent a => Uniform (Vertex4 a) where
-   uniform = makeUniformVar $ \location (Vertex4 x y z w) -> uniform4 location x y z w
-   uniformv location count = uniform4v location count . (castPtr :: Ptr (Vertex4 b) -> Ptr b)
-
-instance UniformComponent a => Uniform (TexCoord1 a) where
-   uniform = makeUniformVar $ \location (TexCoord1 s) -> uniform1 location s
-   uniformv location count = uniform1v location count . (castPtr :: Ptr (TexCoord1 b) -> Ptr b)
-
-instance UniformComponent a => Uniform (TexCoord2 a) where
-   uniform = makeUniformVar $ \location (TexCoord2 s t) -> uniform2 location s t
-   uniformv location count = uniform2v location count . (castPtr :: Ptr (TexCoord2 b) -> Ptr b)
-
-instance UniformComponent a => Uniform (TexCoord3 a) where
-   uniform = makeUniformVar $ \location (TexCoord3 s t r) -> uniform3 location s t  r
-   uniformv location count = uniform3v location count . (castPtr :: Ptr (TexCoord3 b) -> Ptr b)
-
-instance UniformComponent a => Uniform (TexCoord4 a) where
-   uniform = makeUniformVar $ \location (TexCoord4 s t r q) -> uniform4 location s t  r q
-   uniformv location count = uniform4v location count . (castPtr :: Ptr (TexCoord4 b) -> Ptr b)
-
-instance UniformComponent a => Uniform (Normal3 a) where
-   uniform = makeUniformVar $ \location (Normal3 x y z) -> uniform3 location x y z
-   uniformv location count = uniform3v location count . (castPtr :: Ptr (Normal3 b) -> Ptr b)
-
-instance UniformComponent a => Uniform (FogCoord1 a) where
-   uniform = makeUniformVar $ \location (FogCoord1 c) -> uniform1 location c
-   uniformv location count = uniform1v location count . (castPtr :: Ptr (FogCoord1 b) -> Ptr b)
-
-instance UniformComponent a => Uniform (Color3 a) where
-   uniform = makeUniformVar $ \location (Color3 r g b) -> uniform3 location r g b
-   uniformv location count = uniform3v location count . (castPtr :: Ptr (Color3 b) -> Ptr b)
-
-instance UniformComponent a => Uniform (Color4 a) where
-   uniform = makeUniformVar $ \location (Color4 r g b a) -> uniform4 location r g b a
-   uniformv location count = uniform4v location count . (castPtr :: Ptr (Color4 b) -> Ptr b)
-
-instance UniformComponent a => Uniform (Index1 a) where
-   uniform = makeUniformVar $ \location (Index1 i) -> uniform1 location i
-   uniformv location count = uniform1v location count . (castPtr :: Ptr (Index1 b) -> Ptr b)
-
---------------------------------------------------------------------------------
-
--- | Contains the number of hardware units that can be used to access texture
--- maps from the vertex processor. The minimum legal value is 0.
-
-maxVertexTextureImageUnits :: GettableStateVar GLsizei
-maxVertexTextureImageUnits = getLimit GetMaxVertexTextureImageUnits
-
--- | Contains the total number of hardware units that can be used to access
--- texture maps from the fragment processor. The minimum legal value is 2.
-
-maxTextureImageUnits :: GettableStateVar GLsizei
-maxTextureImageUnits = getLimit GetMaxTextureImageUnits
-
--- | Contains the total number of hardware units that can be used to access
--- texture maps from the vertex processor and the fragment processor combined.
--- Note: If the vertex shader and the fragment processing stage access the same
--- texture image unit, then that counts as using two texture image units. The
--- minimum legal value is 2.
-
-maxCombinedTextureImageUnits :: GettableStateVar GLsizei
-maxCombinedTextureImageUnits = getLimit GetMaxCombinedTextureImageUnits
-
--- | Contains the number of texture coordinate sets that are available. The
--- minimum legal value is 2.
-
-maxTextureCoords :: GettableStateVar GLsizei
-maxTextureCoords = getLimit GetMaxTextureCoords
-
--- | Contains the number of individual components (i.e., floating-point, integer
--- or boolean values) that are available for vertex shader uniform variables.
--- The minimum legal value is 512.
-maxVertexUniformComponents :: GettableStateVar GLsizei
-maxVertexUniformComponents = getLimit GetMaxVertexUniformComponents
-
--- | Contains the number of individual components (i.e., floating-point, integer
--- or boolean values) that are available for fragment shader uniform variables.
--- The minimum legal value is 64.
-
-maxFragmentUniformComponents :: GettableStateVar GLsizei
-maxFragmentUniformComponents = getLimit GetMaxFragmentUniformComponents
-
--- | Contains the number of active vertex attributes that are available. The
--- minimum legal value is 16.
-
-maxVertexAttribs :: GettableStateVar GLsizei
-maxVertexAttribs = getLimit GetMaxVertexAttribs
-
--- | Contains the number of individual floating-point values available for
--- varying variables. The minimum legal value is 32.
-
-maxVaryingFloats :: GettableStateVar GLsizei
-maxVaryingFloats = getLimit GetMaxVaryingFloats
-
-getLimit :: GetPName -> GettableStateVar GLsizei
-getLimit = makeGettableStateVar . getSizei1 id
diff --git a/Graphics/Rendering/OpenGL/GL/StateVar.hs b/Graphics/Rendering/OpenGL/GL/StateVar.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/StateVar.hs
+++ /dev/null
@@ -1,101 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.StateVar
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.StateVar (
-   HasGetter(..),
-   GettableStateVar, makeGettableStateVar,
-   HasSetter(..), set,
-   SettableStateVar, makeSettableStateVar,
-   StateVar, makeStateVar,
-   ($~), ($=!), ($~!)
-) where
-
-import Data.IORef ( IORef, readIORef, writeIORef )
-
---------------------------------------------------------------------------------
-
-infixr 2 $=
-
---------------------------------------------------------------------------------
-
-class HasGetter g where
-   get :: g a -> IO a
-
---------------------------------------------------------------------------------
-
-newtype GettableStateVar a = GettableStateVar (IO a)
-
-instance HasGetter GettableStateVar where
-   get (GettableStateVar g) = g
-
-makeGettableStateVar :: IO a -> GettableStateVar a
-makeGettableStateVar = GettableStateVar
-
---------------------------------------------------------------------------------
-
-class HasSetter s where
-   ($=) :: s a -> a -> IO ()
-
-{-# DEPRECATED set "use `sequence_' instead" #-}
-set :: [IO ()] -> IO ()
-set = sequence_
-
---------------------------------------------------------------------------------
-
-newtype SettableStateVar a = SettableStateVar (a -> IO ())
-
-instance HasSetter SettableStateVar where
-   ($=) (SettableStateVar s) a = s a
-
--- | A strict variant of '$='.
-($=!) :: HasSetter s => s a -> a -> IO ()
-v $=! x = x `seq` v $= x
-
-makeSettableStateVar :: (a -> IO ()) -> SettableStateVar a
-makeSettableStateVar = SettableStateVar
-
---------------------------------------------------------------------------------
-
-data StateVar a =
-   StateVar (GettableStateVar a) (SettableStateVar a)
-
-instance HasGetter StateVar where
-   get (StateVar g _) = get g
-
-instance HasSetter StateVar where
-   ($=) (StateVar _ s) a = s $= a
-
-makeStateVar :: IO a -> (a -> IO ()) -> StateVar a
-makeStateVar g s = StateVar (makeGettableStateVar g) (makeSettableStateVar s)
-
---------------------------------------------------------------------------------
-
--- | A modificator convenience function.
-
-($~) :: (HasGetter v, HasSetter v) => v a -> (a -> a) -> IO ()
-v $~ f = do
-   x <- get v
-   v $= f x
-
--- | A strict variant of '$~'.
-($~!) :: (HasGetter v, HasSetter v) => v a -> (a -> a) -> IO ()
-v $~! f = do
-   x <- get v
-   v $=! f x
-
---------------------------------------------------------------------------------
-
-instance HasGetter IORef where
-   get = readIORef
-
-instance HasSetter IORef where
-   ($=) = writeIORef
diff --git a/Graphics/Rendering/OpenGL/GL/StringQueries.hs b/Graphics/Rendering/OpenGL/GL/StringQueries.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/StringQueries.hs
+++ /dev/null
@@ -1,88 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.StringQueries
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to parts of section 6.1.11 (Pointer and String
--- Queries) of the OpenGL 2.1 specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.StringQueries (
-   vendor, renderer, glVersion, glExtensions, shadingLanguageVersion, majorMinor
-) where
-
-import Data.Char ( isDigit )
-import Foreign.C.String ( peekCString )
-import Foreign.Ptr ( Ptr, castPtr )
-import Graphics.Rendering.OpenGL.GL.BasicTypes ( GLenum, GLubyte )
-import Graphics.Rendering.OpenGL.GL.QueryUtils ( maybeNullPtr )
-import Graphics.Rendering.OpenGL.GL.StateVar (
-   HasGetter(get), GettableStateVar, makeGettableStateVar )
-
---------------------------------------------------------------------------------
-
-vendor :: GettableStateVar String
-vendor = makeGettableStateVar (getString Vendor)
-
-renderer :: GettableStateVar String
-renderer = makeGettableStateVar (getString Renderer)
-
-glVersion :: GettableStateVar String
-glVersion = makeGettableStateVar (getString Version)
-
-glExtensions :: GettableStateVar [String]
-glExtensions = makeGettableStateVar (fmap words $ getString Extensions)
-
-shadingLanguageVersion :: GettableStateVar String
-shadingLanguageVersion = makeGettableStateVar (getString ShadingLanguageVersion)
-
---------------------------------------------------------------------------------
-
-data StringName =
-     Vendor
-   | Renderer
-   | Version
-   | Extensions
-   | ShadingLanguageVersion
-
-marshalStringName :: StringName -> GLenum
-marshalStringName x = case x of
-   Vendor -> 0x1f00
-   Renderer -> 0x1f01
-   Version -> 0x1f02
-   Extensions -> 0x1f03
-   ShadingLanguageVersion -> 0x8b8c
-
---------------------------------------------------------------------------------
-
-getString :: StringName -> IO String
-getString n = glGetString (marshalStringName n) >>=
-              maybeNullPtr (return "") (peekCString . castPtr)
-
-foreign import CALLCONV unsafe "glGetString" glGetString ::
-   GLenum -> IO (Ptr GLubyte)
-
---------------------------------------------------------------------------------
-
--- | A utility function to be used with e.g. 'glVersion' or
--- 'shadingLanguageVersion', transforming a variable containing a string of the
--- form /major.minor[optional rest]/ into a variable containing a numeric
--- major\/minor version. If the string is malformed, which should never happen
--- with a sane OpenGL implementation, it is transformed to @(-1,-1)@.
-
-majorMinor :: GettableStateVar String -> GettableStateVar (Int, Int)
-majorMinor = makeGettableStateVar . fmap parse . get
-   where defaultVersion = (-1, -1)
-         parse str =
-            case span isDigit str of
-               (major@(_:_), '.':rest) ->
-                  case span isDigit rest of
-                     (minor@(_:_), _) -> (read major, read minor)
-                     _ -> defaultVersion
-               _ -> defaultVersion
diff --git a/Graphics/Rendering/OpenGL/GL/Tensor.hs b/Graphics/Rendering/OpenGL/GL/Tensor.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/Tensor.hs
+++ /dev/null
@@ -1,327 +0,0 @@
--- #hide
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.Tensor
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This is a purely internal module for points, vectors and matrices.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.Tensor (
-   Vertex1(..), Vertex2(..), Vertex3(..), Vertex4(..),
-   Vector1(..), Vector2(..), Vector3(..), Vector4(..)
-) where
-
-import Control.Applicative ( Applicative(..) )
-import Control.Monad ( ap )
-import Data.Foldable ( Foldable(..) )
-import Data.Ix ( Ix )
-import Data.Traversable ( Traversable(..) )
-import Data.Typeable (
-   Typeable(..), mkTyCon, mkTyConApp, Typeable1(..), typeOfDefault )
-import Foreign.Ptr ( castPtr )
-import Foreign.Storable ( Storable(..) )
-import Graphics.Rendering.OpenGL.GL.PeekPoke (
-   poke1, poke2, poke3, poke4, peek1, peek2, peek3, peek4 )
-
---------------------------------------------------------------------------------
-
--- | A vertex with /y/=0, /z/=0 and /w/=1.
-newtype Vertex1 a = Vertex1 a
-   deriving (Eq, Ord, Ix, Bounded, Show, Read)
-
-instance Functor Vertex1 where
-   fmap f (Vertex1 x) = Vertex1 (f x)
-
-instance Applicative Vertex1 where
-   pure a = Vertex1 a
-   Vertex1 f <*> Vertex1 x = Vertex1 (f x)
-
-instance Foldable Vertex1 where
-   foldr f a (Vertex1 x) = x `f ` a
-   foldl f a (Vertex1 x) = a `f` x
-   foldr1 _ (Vertex1 x) = x
-   foldl1 _ (Vertex1 x) = x
-
-instance Traversable Vertex1 where
-   traverse f (Vertex1 x) = pure Vertex1 <*> f x
-   sequenceA (Vertex1 x) =  pure Vertex1 <*> x
-   mapM f (Vertex1 x) = return Vertex1 `ap` f x
-   sequence (Vertex1 x) = return Vertex1 `ap` x
-
-instance Typeable1 Vertex1 where
-   typeOf1 _ = mkTyConApp (mkTyCon "Vertex1") []
-
-instance Typeable a => Typeable (Vertex1 a) where
-   typeOf = typeOfDefault
-
-instance Storable a => Storable (Vertex1 a) where
-   sizeOf    ~(Vertex1 s) = sizeOf s
-   alignment ~(Vertex1 s) = alignment s
-   peek = peek1 Vertex1 . castPtr
-   poke ptr (Vertex1 s) = poke1 (castPtr ptr) s
-
---------------------------------------------------------------------------------
-
--- | A vertex with /z/=0 and /w/=1.
-data Vertex2 a = Vertex2 !a !a
-   deriving (Eq, Ord, Ix, Bounded, Show, Read)
-
-instance Functor Vertex2 where
-   fmap f (Vertex2 x y) = Vertex2 (f x) (f y)
-
-instance Applicative Vertex2 where
-   pure a = Vertex2 a a
-   Vertex2 f g <*> Vertex2 x y = Vertex2 (f x) (g y)
-
-instance Foldable Vertex2 where
-   foldr f a (Vertex2 x y) = x `f ` (y `f` a)
-   foldl f a (Vertex2 x y) = (a `f` x) `f` y
-   foldr1 f (Vertex2 x y) = x `f` y
-   foldl1 f (Vertex2 x y) = x `f` y
-
-instance Traversable Vertex2 where
-   traverse f (Vertex2 x y) = pure Vertex2 <*> f x <*> f y
-   sequenceA (Vertex2 x y) =  pure Vertex2 <*> x <*> y
-   mapM f (Vertex2 x y) = return Vertex2 `ap` f x `ap` f y
-   sequence (Vertex2 x y) = return Vertex2 `ap` x `ap` y
-
-instance Typeable1 Vertex2 where
-   typeOf1 _ = mkTyConApp (mkTyCon "Vertex2") []
-
-instance Typeable a => Typeable (Vertex2 a) where
-   typeOf = typeOfDefault
-
-instance Storable a => Storable (Vertex2 a) where
-   sizeOf ~(Vertex2 x _) = 2 * sizeOf x
-   alignment ~(Vertex2 x _) = alignment x
-   peek = peek2 Vertex2 . castPtr
-   poke ptr (Vertex2 x y) = poke2 (castPtr ptr) x y
-
---------------------------------------------------------------------------------
-
--- | A vertex with /w/=1.
-data Vertex3 a = Vertex3 !a !a !a
-   deriving (Eq, Ord, Ix, Bounded, Show, Read)
-
-instance Functor Vertex3 where
-   fmap f (Vertex3 x y z) = Vertex3 (f x) (f y) (f z)
-
-instance Applicative Vertex3 where
-   pure a = Vertex3 a a a
-   Vertex3 f g h <*> Vertex3 x y z = Vertex3 (f x) (g y) (h z)
-
-instance Foldable Vertex3 where
-   foldr f a (Vertex3 x y z) = x `f ` (y `f` (z `f` a))
-   foldl f a (Vertex3 x y z) = ((a `f` x) `f` y) `f` z
-   foldr1 f (Vertex3 x y z) = x `f` (y `f` z)
-   foldl1 f (Vertex3 x y z) = (x `f` y) `f` z
-
-instance Traversable Vertex3 where
-   traverse f (Vertex3 x y z) = pure Vertex3 <*> f x <*> f y <*> f z
-   sequenceA (Vertex3 x y z) =  pure Vertex3 <*> x <*> y <*> z
-   mapM f (Vertex3 x y z) = return Vertex3 `ap` f x `ap` f y `ap` f z
-   sequence (Vertex3 x y z) = return Vertex3 `ap` x `ap` y `ap` z
-
-instance Typeable1 Vertex3 where
-   typeOf1 _ = mkTyConApp (mkTyCon "Vertex3") []
-
-instance Typeable a => Typeable (Vertex3 a) where
-   typeOf = typeOfDefault
-
-instance Storable a => Storable (Vertex3 a) where
-   sizeOf ~(Vertex3 x _ _) = 3 * sizeOf x
-   alignment ~(Vertex3 x _ _) = alignment x
-   peek = peek3 Vertex3 . castPtr
-   poke ptr (Vertex3 x y z) = poke3 (castPtr ptr) x y z
-
---------------------------------------------------------------------------------
-
--- | A fully-fledged four-dimensional vertex.
-data Vertex4 a = Vertex4 !a !a !a !a
-   deriving (Eq, Ord, Ix, Bounded, Show, Read)
-
-instance Functor Vertex4 where
-   fmap f (Vertex4 x y z w) = Vertex4 (f x) (f y) (f z) (f w)
-
-instance Applicative Vertex4 where
-   pure a = Vertex4 a a a a
-   Vertex4 f g h i <*> Vertex4 x y z w = Vertex4 (f x) (g y) (h z) (i w)
-
-instance Foldable Vertex4 where
-   foldr f a (Vertex4 x y z w) = x `f ` (y `f` (z `f` (w `f` a)))
-   foldl f a (Vertex4 x y z w) = (((a `f` x) `f` y) `f` z) `f` w
-   foldr1 f (Vertex4 x y z w) = x `f` (y `f` (z `f` w))
-   foldl1 f (Vertex4 x y z w) = ((x `f` y) `f` z) `f` w
-
-instance Traversable Vertex4 where
-   traverse f (Vertex4 x y z w) = pure Vertex4 <*> f x <*> f y <*> f z <*> f w
-   sequenceA (Vertex4 x y z w) =  pure Vertex4 <*> x <*> y <*> z <*> w
-   mapM f (Vertex4 x y z w) = return Vertex4 `ap` f x `ap` f y `ap` f z `ap` f w
-   sequence (Vertex4 x y z w) = return Vertex4 `ap` x `ap` y `ap` z `ap` w
-
-instance Typeable1 Vertex4 where
-   typeOf1 _ = mkTyConApp (mkTyCon "Vertex4") []
-
-instance Typeable a => Typeable (Vertex4 a) where
-   typeOf = typeOfDefault
-
-instance Storable a => Storable (Vertex4 a) where
-   sizeOf ~(Vertex4 x _ _ _) = 4 * sizeOf x
-   alignment ~(Vertex4 x _ _ _) = alignment x
-   peek = peek4 Vertex4 . castPtr
-   poke ptr (Vertex4 x y z w) = poke4 (castPtr ptr) x y z w
-
---------------------------------------------------------------------------------
-
--- | A one-dimensional vector.
-newtype Vector1 a = Vector1 a
-   deriving (Eq, Ord, Ix, Bounded, Show, Read)
-
-instance Functor Vector1 where
-   fmap f (Vector1 x) = Vector1 (f x)
-
-instance Applicative Vector1 where
-   pure a = Vector1 a
-   Vector1 f <*> Vector1 x = Vector1 (f x)
-
-instance Foldable Vector1 where
-   foldr f a (Vector1 x) = x `f ` a
-   foldl f a (Vector1 x) = a `f` x
-   foldr1 _ (Vector1 x) = x
-   foldl1 _ (Vector1 x) = x
-
-instance Traversable Vector1 where
-   traverse f (Vector1 x) = pure Vector1 <*> f x
-   sequenceA (Vector1 x) =  pure Vector1 <*> x
-   mapM f (Vector1 x) = return Vector1 `ap` f x
-   sequence (Vector1 x) = return Vector1 `ap` x
-
-instance Typeable1 Vector1 where
-   typeOf1 _ = mkTyConApp (mkTyCon "Vector1") []
-
-instance Typeable a => Typeable (Vector1 a) where
-   typeOf = typeOfDefault
-
-instance Storable a => Storable (Vector1 a) where
-   sizeOf    ~(Vector1 s) = sizeOf s
-   alignment ~(Vector1 s) = alignment s
-   peek = peek1 Vector1 . castPtr
-   poke ptr (Vector1 s) = poke1 (castPtr ptr) s
-
---------------------------------------------------------------------------------
-
--- | A two-dimensional vector.
-data Vector2 a = Vector2 !a !a
-   deriving (Eq, Ord, Ix, Bounded, Show, Read)
-
-instance Functor Vector2 where
-   fmap f (Vector2 x y) = Vector2 (f x) (f y)
-
-instance Applicative Vector2 where
-   pure a = Vector2 a a
-   Vector2 f g <*> Vector2 x y = Vector2 (f x) (g y)
-
-instance Foldable Vector2 where
-   foldr f a (Vector2 x y) = x `f ` (y `f` a)
-   foldl f a (Vector2 x y) = (a `f` x) `f` y
-   foldr1 f (Vector2 x y) = x `f` y
-   foldl1 f (Vector2 x y) = x `f` y
-
-instance Traversable Vector2 where
-   traverse f (Vector2 x y) = pure Vector2 <*> f x <*> f y
-   sequenceA (Vector2 x y) =  pure Vector2 <*> x <*> y
-   mapM f (Vector2 x y) = return Vector2 `ap` f x `ap` f y
-   sequence (Vector2 x y) = return Vector2 `ap` x `ap` y
-
-instance Typeable1 Vector2 where
-   typeOf1 _ = mkTyConApp (mkTyCon "Vector2") []
-
-instance Typeable a => Typeable (Vector2 a) where
-   typeOf = typeOfDefault
-
-instance Storable a => Storable (Vector2 a) where
-   sizeOf ~(Vector2 x _) = 2 * sizeOf x
-   alignment ~(Vector2 x _) = alignment x
-   peek = peek2 Vector2 . castPtr
-   poke ptr (Vector2 x y) = poke2 (castPtr ptr) x y
-
---------------------------------------------------------------------------------
-
--- | A three-dimensional vector.
-data Vector3 a = Vector3 !a !a !a
-   deriving (Eq, Ord, Ix, Bounded, Show, Read)
-
-instance Functor Vector3 where
-   fmap f (Vector3 x y z) = Vector3 (f x) (f y) (f z)
-
-instance Applicative Vector3 where
-   pure a = Vector3 a a a
-   Vector3 f g h <*> Vector3 x y z = Vector3 (f x) (g y) (h z)
-
-instance Foldable Vector3 where
-   foldr f a (Vector3 x y z) = x `f ` (y `f` (z `f` a))
-   foldl f a (Vector3 x y z) = ((a `f` x) `f` y) `f` z
-   foldr1 f (Vector3 x y z) = x `f` (y `f` z)
-   foldl1 f (Vector3 x y z) = (x `f` y) `f` z
-
-instance Traversable Vector3 where
-   traverse f (Vector3 x y z) = pure Vector3 <*> f x <*> f y <*> f z
-   sequenceA (Vector3 x y z) =  pure Vector3 <*> x <*> y <*> z
-   mapM f (Vector3 x y z) = return Vector3 `ap` f x `ap` f y `ap` f z
-   sequence (Vector3 x y z) = return Vector3 `ap` x `ap` y `ap` z
-
-instance Typeable1 Vector3 where
-   typeOf1 _ = mkTyConApp (mkTyCon "Vector3") []
-
-instance Typeable a => Typeable (Vector3 a) where
-   typeOf = typeOfDefault
-
-instance Storable a => Storable (Vector3 a) where
-   sizeOf ~(Vector3 x _ _) = 3 * sizeOf x
-   alignment ~(Vector3 x _ _) = alignment x
-   peek = peek3 Vector3 . castPtr
-   poke ptr (Vector3 x y z) = poke3 (castPtr ptr) x y z
-
---------------------------------------------------------------------------------
-
--- | A four-dimensional vector.
-data Vector4 a = Vector4 !a !a !a !a
-   deriving (Eq, Ord, Ix, Bounded, Show, Read)
-
-instance Functor Vector4 where
-   fmap f (Vector4 x y z w) = Vector4 (f x) (f y) (f z) (f w)
-
-instance Applicative Vector4 where
-   pure a = Vector4 a a a a
-   Vector4 f g h i <*> Vector4 x y z w = Vector4 (f x) (g y) (h z) (i w)
-
-instance Foldable Vector4 where
-   foldr f a (Vector4 x y z w) = x `f ` (y `f` (z `f` (w `f` a)))
-   foldl f a (Vector4 x y z w) = (((a `f` x) `f` y) `f` z) `f` w
-   foldr1 f (Vector4 x y z w) = x `f` (y `f` (z `f` w))
-   foldl1 f (Vector4 x y z w) = ((x `f` y) `f` z) `f` w
-
-instance Traversable Vector4 where
-   traverse f (Vector4 x y z w) = pure Vector4 <*> f x <*> f y <*> f z <*> f w
-   sequenceA (Vector4 x y z w) =  pure Vector4 <*> x <*> y <*> z <*> w
-   mapM f (Vector4 x y z w) = return Vector4 `ap` f x `ap` f y `ap` f z `ap` f w
-   sequence (Vector4 x y z w) = return Vector4 `ap` x `ap` y `ap` z `ap` w
-
-instance Typeable1 Vector4 where
-   typeOf1 _ = mkTyConApp (mkTyCon "Vector4") []
-
-instance Typeable a => Typeable (Vector4 a) where
-   typeOf = typeOfDefault
-
-instance Storable a => Storable (Vector4 a) where
-   sizeOf ~(Vector4 x _ _ _) = 4 * sizeOf x
-   alignment ~(Vector4 x _ _ _) = alignment x
-   peek = peek4 Vector4 . castPtr
-   poke ptr (Vector4 x y z w) = poke4 (castPtr ptr) x y z w
diff --git a/Graphics/Rendering/OpenGL/GL/Texturing.hs b/Graphics/Rendering/OpenGL/GL/Texturing.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/Texturing.hs
+++ /dev/null
@@ -1,29 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.Texturing
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to section 3.8 (Texturing) of the OpenGL 2.1 specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.Texturing (
-   module Graphics.Rendering.OpenGL.GL.Texturing.Specification,
-   module Graphics.Rendering.OpenGL.GL.Texturing.Parameters,
-   module Graphics.Rendering.OpenGL.GL.Texturing.Objects,
-   module Graphics.Rendering.OpenGL.GL.Texturing.Environments,
-   module Graphics.Rendering.OpenGL.GL.Texturing.Application,
-   module Graphics.Rendering.OpenGL.GL.Texturing.Queries
-) where
-
-import Graphics.Rendering.OpenGL.GL.Texturing.Specification
-import Graphics.Rendering.OpenGL.GL.Texturing.Parameters
-import Graphics.Rendering.OpenGL.GL.Texturing.Objects
-import Graphics.Rendering.OpenGL.GL.Texturing.Environments
-import Graphics.Rendering.OpenGL.GL.Texturing.Application
-import Graphics.Rendering.OpenGL.GL.Texturing.Queries
diff --git a/Graphics/Rendering/OpenGL/GL/Texturing/Application.hs b/Graphics/Rendering/OpenGL/GL/Texturing/Application.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/Texturing/Application.hs
+++ /dev/null
@@ -1,41 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.Texturing.Application
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to section 3.8.15 (Texture Application) of the
--- OpenGL 2.1 specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.Texturing.Application (
-   texture
-) where
-
-import Graphics.Rendering.OpenGL.GL.BasicTypes ( Capability )
-import Graphics.Rendering.OpenGL.GL.Capability (
-   EnableCap(CapTexture1D,CapTexture2D,CapTexture3D,CapTextureCubeMap,
-             CapTextureRectangle),
-   makeCapability )
-import Graphics.Rendering.OpenGL.GL.StateVar ( StateVar )
-import Graphics.Rendering.OpenGL.GL.Texturing.Specification (
-   TextureTarget(..) )
-
---------------------------------------------------------------------------------
-
--- ToDo: cube maps
-texture :: TextureTarget -> StateVar Capability
-texture = makeCapability . textureTargetToEnableCap
-
-textureTargetToEnableCap :: TextureTarget -> EnableCap
-textureTargetToEnableCap x = case x of
-    Texture1D -> CapTexture1D
-    Texture2D -> CapTexture2D
-    Texture3D -> CapTexture3D
-    TextureCubeMap -> CapTextureCubeMap
-    TextureRectangle -> CapTextureRectangle
diff --git a/Graphics/Rendering/OpenGL/GL/Texturing/Environments.hs b/Graphics/Rendering/OpenGL/GL/Texturing/Environments.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/Texturing/Environments.hs
+++ /dev/null
@@ -1,365 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.Texturing.Environments
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to section 3.8.13 (Texture Environments and Texture
--- Functions) of the OpenGL 2.1 specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.Texturing.Environments (
-   TextureFunction(..), textureFunction,
-   TextureCombineFunction(..), combineRGB, combineAlpha,
-   ArgNum(..), Arg(..), Src(..), argRGB, argAlpha,
-   rgbScale, alphaScale,
-   constantColor, textureUnitLODBias
-) where
-
-import Control.Monad ( liftM2 )
-import Foreign.Marshal.Alloc ( alloca )
-import Foreign.Ptr ( Ptr )
-import Foreign.Storable ( Storable )
-import Foreign.Marshal.Utils ( with )
-import Graphics.Rendering.OpenGL.GL.BasicTypes ( GLint, GLenum, GLfloat )
-import Graphics.Rendering.OpenGL.GL.BlendingFactor (
-   marshalBlendingFactor, unmarshalBlendingFactor )
-import Graphics.Rendering.OpenGL.GL.PeekPoke ( peek1 )
-import Graphics.Rendering.OpenGL.GL.PerFragment ( BlendingFactor )
-import Graphics.Rendering.OpenGL.GL.StateVar (
-   HasGetter(get), HasSetter(($=)), StateVar, makeStateVar )
-import Graphics.Rendering.OpenGL.GL.Texturing.Parameters ( LOD )
-import Graphics.Rendering.OpenGL.GL.Texturing.TextureUnit (
-   marshalTextureUnit, unmarshalTextureUnit )
-import Graphics.Rendering.OpenGL.GL.VertexSpec( Color4(..), TextureUnit )
-
---------------------------------------------------------------------------------
-
-data TextureEnvTarget =
-     TextureEnv
-   | TextureFilterControl   -- GL_TEXTURE_LOD_BIAS_EXT
-   | PointSprite            -- GL_COORD_REPLACE_NV
-
-marshalTextureEnvTarget :: TextureEnvTarget -> GLenum
-marshalTextureEnvTarget x = case x of
-   TextureEnv -> 0x2300
-   TextureFilterControl -> 0x8500
-   PointSprite -> 0x8861
-
---------------------------------------------------------------------------------
-
-data TextureEnvParameter =
-     TexEnvParamTextureEnvMode
-   | TexEnvParamTextureEnvColor
-   | TexEnvParamCombineRGB
-   | TexEnvParamCombineAlpha
-   | TexEnvParamSrc0RGB
-   | TexEnvParamSrc1RGB
-   | TexEnvParamSrc2RGB
-   | TexEnvParamSrc3RGB
-   | TexEnvParamSrc0Alpha
-   | TexEnvParamSrc1Alpha
-   | TexEnvParamSrc2Alpha
-   | TexEnvParamSrc3Alpha
-   | TexEnvParamOperand0RGB
-   | TexEnvParamOperand1RGB
-   | TexEnvParamOperand2RGB
-   | TexEnvParamOperand3RGB
-   | TexEnvParamOperand0Alpha
-   | TexEnvParamOperand1Alpha
-   | TexEnvParamOperand2Alpha
-   | TexEnvParamOperand3Alpha
-   | TexEnvParamRGBScale
-   | TexEnvParamAlphaScale
-   | TexEnvParamLODBias
-
-marshalTextureEnvParameter :: TextureEnvParameter -> GLenum
-marshalTextureEnvParameter x = case x of
-   TexEnvParamTextureEnvMode -> 0x2200
-   TexEnvParamTextureEnvColor -> 0x2201
-   TexEnvParamCombineRGB -> 0x8571
-   TexEnvParamCombineAlpha -> 0x8572
-   TexEnvParamSrc0RGB -> 0x8580
-   TexEnvParamSrc1RGB -> 0x8581
-   TexEnvParamSrc2RGB -> 0x8582
-   TexEnvParamSrc3RGB -> 0x8583
-   TexEnvParamSrc0Alpha -> 0x8588
-   TexEnvParamSrc1Alpha -> 0x8589
-   TexEnvParamSrc2Alpha -> 0x858a
-   TexEnvParamSrc3Alpha -> 0x858b
-   TexEnvParamOperand0RGB -> 0x8590
-   TexEnvParamOperand1RGB -> 0x8591
-   TexEnvParamOperand2RGB -> 0x8592
-   TexEnvParamOperand3RGB -> 0x8593
-   TexEnvParamOperand0Alpha -> 0x8598
-   TexEnvParamOperand1Alpha -> 0x8599
-   TexEnvParamOperand2Alpha -> 0x859a
-   TexEnvParamOperand3Alpha -> 0x859b
-   TexEnvParamRGBScale -> 0x8573
-   TexEnvParamAlphaScale -> 0xd1c
-   TexEnvParamLODBias -> 0x8501
-
---------------------------------------------------------------------------------
-
-texEnv :: (GLenum -> GLenum -> b -> IO ())
-       -> (a -> (b -> IO ()) -> IO ())
-       -> TextureEnvTarget -> TextureEnvParameter -> a -> IO ()
-texEnv glTexEnv marshalAct t p x =
-   marshalAct x $
-      glTexEnv (marshalTextureEnvTarget t) (marshalTextureEnvParameter p)
-
-foreign import CALLCONV unsafe "glTexEnvi"
-   glTexEnvi :: GLenum -> GLenum ->  GLint -> IO ()
-
-foreign import CALLCONV unsafe "glTexEnvf"
-   glTexEnvf :: GLenum -> GLenum ->  GLfloat -> IO ()
-
-foreign import CALLCONV unsafe "glTexEnvfv"
-   glTexEnvC4f :: GLenum -> GLenum -> Ptr (Color4 GLfloat) -> IO ()
-
---------------------------------------------------------------------------------
-
-getTexEnv :: Storable b
-          => (GLenum -> GLenum -> Ptr b -> IO ())
-          -> (b -> a)
-          -> TextureEnvTarget -> TextureEnvParameter -> IO a
-getTexEnv glGetTexEnv unmarshal t p =
-   alloca $ \buf -> do
-     glGetTexEnv (marshalTextureEnvTarget t) (marshalTextureEnvParameter p) buf
-     peek1 unmarshal buf
-
-foreign import CALLCONV unsafe "glGetTexEnviv"
-   glGetTexEnviv :: GLenum -> GLenum -> Ptr GLint -> IO ()
-
-foreign import CALLCONV unsafe "glGetTexEnvfv"
-   glGetTexEnvfv :: GLenum -> GLenum -> Ptr GLfloat -> IO ()
-
-foreign import CALLCONV unsafe "glGetTexEnvfv"
-   glGetTexEnvC4f :: GLenum -> GLenum -> Ptr (Color4 GLfloat) -> IO ()
-
---------------------------------------------------------------------------------
-
-m2a :: (a -> b) -> a -> (b -> IO ()) -> IO ()
-m2a marshal x act = act (marshal x)
-
-texEnvi ::
-   (GLint -> a) -> (a -> GLint) -> TextureEnvTarget -> TextureEnvParameter -> StateVar a
-texEnvi unmarshal marshal t p =
-   makeStateVar
-      (getTexEnv glGetTexEnviv unmarshal     t p)
-      (texEnv    glTexEnvi     (m2a marshal) t p)
-
-texEnvf ::
-   (GLfloat -> a) -> (a -> GLfloat) -> TextureEnvTarget -> TextureEnvParameter -> StateVar a
-texEnvf unmarshal marshal t p =
-   makeStateVar
-      (getTexEnv glGetTexEnvfv unmarshal     t p)
-      (texEnv    glTexEnvf     (m2a marshal) t p)
-
-texEnvC4f :: TextureEnvTarget -> TextureEnvParameter -> StateVar (Color4 GLfloat)
-texEnvC4f t p =
-   makeStateVar
-      (getTexEnv glGetTexEnvC4f id   t p)
-      (texEnv    glTexEnvC4f    with t p)
-
---------------------------------------------------------------------------------
-
-data TextureFunction =
-     Modulate
-   | Decal
-   | Blend
-   | Replace
-   | AddUnsigned
-   | Combine
-   | Combine4
-   deriving ( Eq, Ord, Show )
-
-marshalTextureFunction :: TextureFunction -> GLint
-marshalTextureFunction x = case x of
-   Modulate -> 0x2100
-   Decal -> 0x2101
-   Blend -> 0xbe2
-   Replace -> 0x1e01
-   AddUnsigned -> 0x104
-   Combine -> 0x8570
-   Combine4 -> 0x8503
-
-unmarshalTextureFunction :: GLint -> TextureFunction
-unmarshalTextureFunction x
-   | x == 0x2100 = Modulate
-   | x == 0x2101 = Decal
-   | x == 0xbe2 = Blend
-   | x == 0x1e01 = Replace
-   | x == 0x104 = AddUnsigned
-   | x == 0x8570 = Combine
-   | x == 0x8503 = Combine4
-   | otherwise = error ("unmarshalTextureFunction: illegal value " ++ show x)
-
---------------------------------------------------------------------------------
-
-textureFunction :: StateVar TextureFunction
-textureFunction =
-   texEnvi unmarshalTextureFunction marshalTextureFunction TextureEnv TexEnvParamTextureEnvMode
-
---------------------------------------------------------------------------------
-
-data TextureCombineFunction =
-     Replace'
-   | Modulate'
-   | AddUnsigned'
-   | AddSigned
-   | Interpolate
-   | Subtract
-   | Dot3RGB
-   | Dot3RGBA
-   deriving ( Eq, Ord, Show )
-
-marshalTextureCombineFunction :: TextureCombineFunction -> GLint
-marshalTextureCombineFunction x = case x of
-   Replace' -> 0x1e01
-   Modulate' -> 0x2100
-   AddUnsigned' -> 0x104
-   AddSigned -> 0x8574
-   Interpolate -> 0x8575
-   Subtract -> 0x84e7
-   Dot3RGB -> 0x86ae
-   Dot3RGBA -> 0x86af
-
-unmarshalTextureCombineFunction :: GLint -> TextureCombineFunction
-unmarshalTextureCombineFunction x
-   | x == 0x1e01 = Replace'
-   | x == 0x2100 = Modulate'
-   | x == 0x104 = AddUnsigned'
-   | x == 0x8574 = AddSigned
-   | x == 0x8575 = Interpolate
-   | x == 0x84e7 = Subtract
-   | x == 0x86ae = Dot3RGB
-   | x == 0x86af = Dot3RGBA
-   | otherwise = error ("unmarshalTextureCombineFunction: illegal value " ++ show x)
-
---------------------------------------------------------------------------------
-
-combineRGB :: StateVar TextureCombineFunction
-combineRGB = combine TexEnvParamCombineRGB
-
-combineAlpha :: StateVar TextureCombineFunction
-combineAlpha = combine TexEnvParamCombineAlpha
-
-combine :: TextureEnvParameter -> StateVar TextureCombineFunction
-combine =
-   texEnvi unmarshalTextureCombineFunction marshalTextureCombineFunction TextureEnv
-
---------------------------------------------------------------------------------
-
-data ArgNum =
-     Arg0
-   | Arg1
-   | Arg2
-   | Arg3
-   deriving ( Eq, Ord, Show )
-
-argNumToOperandRGB :: ArgNum -> TextureEnvParameter
-argNumToOperandRGB x = case x of
-   Arg0 -> TexEnvParamOperand0RGB
-   Arg1 -> TexEnvParamOperand1RGB
-   Arg2 -> TexEnvParamOperand2RGB
-   Arg3 -> TexEnvParamOperand3RGB
-
-argNumToOperandAlpha :: ArgNum -> TextureEnvParameter
-argNumToOperandAlpha x = case x of
-   Arg0 -> TexEnvParamOperand0Alpha
-   Arg1 -> TexEnvParamOperand1Alpha
-   Arg2 -> TexEnvParamOperand2Alpha
-   Arg3 -> TexEnvParamOperand3Alpha
-
-argNumToSrcRGB :: ArgNum -> TextureEnvParameter
-argNumToSrcRGB x = case x of
-   Arg0 -> TexEnvParamSrc0RGB
-   Arg1 -> TexEnvParamSrc1RGB
-   Arg2 -> TexEnvParamSrc2RGB
-   Arg3 -> TexEnvParamSrc3RGB
-
-argNumToSrcAlpha :: ArgNum -> TextureEnvParameter
-argNumToSrcAlpha x = case x of
-   Arg0 -> TexEnvParamSrc0Alpha
-   Arg1 -> TexEnvParamSrc1Alpha
-   Arg2 -> TexEnvParamSrc2Alpha
-   Arg3 -> TexEnvParamSrc3Alpha
-
---------------------------------------------------------------------------------
-
-data Arg = Arg BlendingFactor Src
-   deriving ( Eq, Ord, Show )
-
---------------------------------------------------------------------------------
-
-data Src =
-     CurrentUnit
-   | Previous
-   | Crossbar TextureUnit
-   | Constant
-   | PrimaryColor
-   deriving ( Eq, Ord, Show )
-
-marshalSrc :: Src -> GLint
-marshalSrc x = case x of
-   CurrentUnit -> 0x1702
-   Previous -> 0x8578
-   Crossbar u -> fromIntegral (marshalTextureUnit u)
-   Constant -> 0x8576
-   PrimaryColor -> 0x8577
-
-unmarshalSrc :: GLint -> Src
-unmarshalSrc x
-   | x == 0x1702 = CurrentUnit
-   | x == 0x8578 = Previous
-   | x == 0x8576 = Constant
-   | x == 0x8577 = PrimaryColor
-   | otherwise = Crossbar (unmarshalTextureUnit (fromIntegral x))
-
---------------------------------------------------------------------------------
-
-argRGB :: ArgNum -> StateVar Arg
-argRGB n = arg (argNumToOperandRGB n) (argNumToSrcRGB n)
-
-argAlpha :: ArgNum -> StateVar Arg
-argAlpha n = arg (argNumToOperandAlpha n) (argNumToSrcAlpha n)
-
-arg :: TextureEnvParameter -> TextureEnvParameter -> StateVar Arg
-arg op src = combineArg (textureEnvOperand op) (textureEnvSrc src)
-   where combineArg v w = makeStateVar
-                             (liftM2 Arg (get v) (get w))
-                             (\(Arg x y) -> do v $= x; w $= y)
-
-textureEnvOperand :: TextureEnvParameter -> StateVar BlendingFactor
-textureEnvOperand =
-   texEnvi (unmarshalBlendingFactor . fromIntegral) (fromIntegral . marshalBlendingFactor) TextureEnv
-
-textureEnvSrc :: TextureEnvParameter -> StateVar Src
-textureEnvSrc = texEnvi unmarshalSrc marshalSrc TextureEnv
-
---------------------------------------------------------------------------------
-
-rgbScale :: StateVar GLfloat
-rgbScale = scale TexEnvParamRGBScale
-
-alphaScale :: StateVar GLfloat
-alphaScale = scale TexEnvParamAlphaScale
-
-scale :: TextureEnvParameter -> StateVar GLfloat
-scale = texEnvf id id TextureEnv
-
---------------------------------------------------------------------------------
-
-constantColor :: StateVar (Color4 GLfloat)
-constantColor = texEnvC4f TextureEnv TexEnvParamTextureEnvColor
-
---------------------------------------------------------------------------------
-
-textureUnitLODBias :: StateVar LOD
-textureUnitLODBias = texEnvf id id TextureFilterControl TexEnvParamLODBias
diff --git a/Graphics/Rendering/OpenGL/GL/Texturing/Objects.hs b/Graphics/Rendering/OpenGL/GL/Texturing/Objects.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/Texturing/Objects.hs
+++ /dev/null
@@ -1,130 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.Texturing.Objects
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to section 3.8.12 (Texture Objects) of the OpenGL 2.1
--- specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.Texturing.Objects (
-   TextureObject(TextureObject), textureBinding,
-   textureResident, areTexturesResident,
-   TexturePriority, texturePriority, prioritizeTextures
-) where
-
-import Data.List ( partition )
-import Foreign.Marshal.Array ( withArray, withArrayLen, peekArray, allocaArray )
-import Foreign.Ptr ( Ptr )
-import Graphics.Rendering.OpenGL.GL.BasicTypes (
-   GLboolean, GLuint, GLsizei, GLenum, GLclampf )
-import Graphics.Rendering.OpenGL.GL.BufferObjects ( ObjectName(..) )
-import Graphics.Rendering.OpenGL.GL.GLboolean ( unmarshalGLboolean )
-import Graphics.Rendering.OpenGL.GL.QueryUtils (
-   GetPName(GetTextureBinding1D,GetTextureBinding2D,GetTextureBinding3D,
-            GetTextureBindingCubeMap,GetTextureBindingRectangle),
-   getEnum1)
-import Graphics.Rendering.OpenGL.GL.StateVar (
-   GettableStateVar, makeGettableStateVar, StateVar, makeStateVar )
-import Graphics.Rendering.OpenGL.GL.Texturing.TexParameter (
-   TexParameter(TextureResident,TexturePriority), texParamf, getTexParameteri )
-import Graphics.Rendering.OpenGL.GL.Texturing.Specification (
-   TextureTarget(..) )
-import Graphics.Rendering.OpenGL.GL.Texturing.TextureTarget (
-   marshalTextureTarget )
-
---------------------------------------------------------------------------------
-
-newtype TextureObject = TextureObject { textureID :: GLuint }
-   deriving ( Eq, Ord, Show )
-
---------------------------------------------------------------------------------
-
-instance ObjectName TextureObject where
-   genObjectNames n =
-      allocaArray n $ \buf -> do
-        glGenTextures (fromIntegral n) buf
-        fmap (map TextureObject) $ peekArray n buf
-
-   deleteObjectNames textureObjects =
-      withArrayLen (map textureID textureObjects) $
-         glDeleteTextures . fromIntegral
-
-   isObjectName = fmap unmarshalGLboolean . glIsTexture . textureID
-
-foreign import CALLCONV unsafe "glGenTextures"
-   glGenTextures :: GLsizei -> Ptr GLuint -> IO ()
-
-foreign import CALLCONV unsafe "glDeleteTextures"
-   glDeleteTextures :: GLsizei -> Ptr GLuint -> IO ()
-
-foreign import CALLCONV unsafe "glIsTexture"
-   glIsTexture :: GLuint -> IO GLboolean
-
---------------------------------------------------------------------------------
-
-textureBinding :: TextureTarget -> StateVar (Maybe TextureObject)
-textureBinding t =
-   makeStateVar
-      (do o <- getEnum1 TextureObject (textureTargetToGetPName t)
-          return $ if o == defaultTextureObject then Nothing else Just o)
-      (glBindTexture (marshalTextureTarget t) . textureID . (maybe defaultTextureObject id))
-
-defaultTextureObject :: TextureObject
-defaultTextureObject = TextureObject 0
-
-textureTargetToGetPName :: TextureTarget -> GetPName
-textureTargetToGetPName x = case x of
-    Texture1D -> GetTextureBinding1D
-    Texture2D -> GetTextureBinding2D
-    Texture3D -> GetTextureBinding3D
-    TextureCubeMap -> GetTextureBindingCubeMap
-    TextureRectangle -> GetTextureBindingRectangle
-
-foreign import CALLCONV unsafe "glBindTexture"
-   glBindTexture :: GLenum -> GLuint -> IO ()
-
---------------------------------------------------------------------------------
-
-textureResident :: TextureTarget -> GettableStateVar Bool
-textureResident t =
-   makeGettableStateVar $
-      getTexParameteri unmarshalGLboolean t TextureResident
-
-areTexturesResident :: [TextureObject] -> IO ([TextureObject],[TextureObject])
-areTexturesResident texObjs = do
-   withArrayLen (map textureID texObjs) $ \len texObjsBuf ->
-      allocaArray len $ \residentBuf -> do
-         allResident <-
-            glAreTexturesResident (fromIntegral len) texObjsBuf residentBuf
-         if unmarshalGLboolean allResident
-            then return (texObjs, [])
-            else do
-               tr <- fmap (zip texObjs) $ peekArray len residentBuf
-               let (resident, nonResident) = partition (unmarshalGLboolean . snd) tr
-               return (map fst resident, map fst nonResident)
-
-foreign import CALLCONV unsafe "glAreTexturesResident"
-   glAreTexturesResident :: GLsizei -> Ptr GLuint -> Ptr GLboolean -> IO GLboolean
-
---------------------------------------------------------------------------------
-
-type TexturePriority = GLclampf
-
-texturePriority :: TextureTarget -> StateVar TexturePriority
-texturePriority = texParamf id id TexturePriority
-
-prioritizeTextures :: [(TextureObject,TexturePriority)] -> IO ()
-prioritizeTextures tps =
-   withArrayLen (map (textureID . fst) tps) $ \len texObjsBuf ->
-      withArray (map snd tps) $
-         glPrioritizeTextures (fromIntegral len) texObjsBuf
-
-foreign import CALLCONV unsafe "glPrioritizeTextures"
-   glPrioritizeTextures :: GLsizei -> Ptr GLuint -> Ptr GLclampf -> IO ()
diff --git a/Graphics/Rendering/OpenGL/GL/Texturing/Parameters.hs b/Graphics/Rendering/OpenGL/GL/Texturing/Parameters.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/Texturing/Parameters.hs
+++ /dev/null
@@ -1,266 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.Texturing.Parameters
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to section 3.8.4 (Texture Parameters), section 3.8.7
--- (Texture Wrap Mode), section 3.8.8 (Texture Minification), and section 3.8.9
--- (Texture Magnification) of the OpenGL 2.1 specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.Texturing.Parameters (
-   TextureFilter(..), MinificationFilter, MagnificationFilter, textureFilter,
-   Repetition(..), Clamping(..), textureWrapMode,
-   textureBorderColor, LOD, textureObjectLODBias, maxTextureLODBias,
-   textureLODRange, textureMaxAnisotropy, maxTextureMaxAnisotropy,
-   textureLevelRange, generateMipmap, depthTextureMode, textureCompareMode,
-   textureCompareFailValue, TextureCompareOperator(..), textureCompareOperator
-) where
-
-import Graphics.Rendering.OpenGL.GL.BasicTypes (
-   GLint, GLfloat, GLclampf, Capability(..) )
-import Graphics.Rendering.OpenGL.GL.Capability (
-   marshalCapability, unmarshalCapability )
-import Graphics.Rendering.OpenGL.GL.ComparisonFunction (
-   marshalComparisonFunction, unmarshalComparisonFunction )
-import Graphics.Rendering.OpenGL.GL.CoordTrans ( TextureCoordName(..) )
-import Graphics.Rendering.OpenGL.GL.PerFragment ( ComparisonFunction )
-import Graphics.Rendering.OpenGL.GL.PixelRectangles (
-   PixelInternalFormat(..) )
-import Graphics.Rendering.OpenGL.GL.QueryUtils (
-   GetPName(GetMaxTextureMaxAnisotropy,GetMaxTextureLODBias), getFloat1)
-import Graphics.Rendering.OpenGL.GL.StateVar (
-   GettableStateVar, makeGettableStateVar,
-   StateVar, makeStateVar )
-import Graphics.Rendering.OpenGL.GL.Texturing.Specification (
-   Level, TextureTarget(..) )
-import Graphics.Rendering.OpenGL.GL.Texturing.TexParameter (
-   TexParameter(TextureMinFilter,TextureMagFilter,TextureWrapS,TextureWrapT,
-                TextureWrapR,TextureBorderColor,TextureMinLOD,TextureMaxLOD,
-                TextureBaseLevel,TextureMaxLevel,TextureMaxAnisotropy,
-                TextureLODBias,GenerateMipmap,DepthTextureMode,
-                TextureCompareMode,TextureCompareFunc,TextureCompareFailValue,
-                TextureCompare,TextureCompareOperator),
-   texParami, texParamf, texParamC4f, combineTexParams, combineTexParamsMaybe )
-import Graphics.Rendering.OpenGL.GL.Texturing.PixelInternalFormat (
-   marshalPixelInternalFormat, unmarshalPixelInternalFormat )
-import Graphics.Rendering.OpenGL.GL.VertexSpec( Color4(..) )
-import Graphics.Rendering.OpenGL.GLU.ErrorsInternal ( recordInvalidEnum )
-
---------------------------------------------------------------------------------
-
-data TextureFilter =
-     Nearest
-   | Linear'
-   deriving ( Eq, Ord, Show )
-
-type MinificationFilter = (TextureFilter, Maybe TextureFilter)
-
-type MagnificationFilter = TextureFilter
-
--- We treat MagnificationFilter as a degenerated case of MinificationFilter
-magToMin :: MagnificationFilter -> MinificationFilter
-magToMin magFilter = (magFilter, Nothing)
-
-minToMag :: MinificationFilter -> MagnificationFilter
-minToMag (magFilter, Nothing) = magFilter
-minToMag minFilter = error ("minToMag: illegal value " ++ show minFilter)
-
-marshalMinificationFilter :: MinificationFilter -> GLint
-marshalMinificationFilter x = case x of
-   (Nearest, Nothing     ) -> 0x2600
-   (Linear', Nothing     ) -> 0x2601
-   (Nearest, Just Nearest) -> 0x2700
-   (Linear', Just Nearest) -> 0x2701
-   (Nearest, Just Linear') -> 0x2702
-   (Linear', Just Linear') -> 0x2703
-
-marshalMagnificationFilter :: MagnificationFilter -> GLint
-marshalMagnificationFilter = marshalMinificationFilter . magToMin
-
-unmarshalMinificationFilter :: GLint -> MinificationFilter
-unmarshalMinificationFilter x
-   | x ==  0x2600 = (Nearest, Nothing     )
-   | x ==  0x2601 = (Linear', Nothing     )
-   | x ==  0x2700 = (Nearest, Just Nearest)
-   | x ==  0x2701 = (Linear', Just Nearest)
-   | x ==  0x2702 = (Nearest, Just Linear')
-   | x ==  0x2703 = (Linear', Just Linear')
-   | otherwise = error ("unmarshalMinificationFilter: illegal value " ++ show x)
-
-unmarshalMagnificationFilter :: GLint -> MagnificationFilter
-unmarshalMagnificationFilter = minToMag . unmarshalMinificationFilter
-
---------------------------------------------------------------------------------
-
-textureFilter :: TextureTarget -> StateVar (MinificationFilter, MagnificationFilter)
-textureFilter =
-   combineTexParams
-      (texParami unmarshalMinificationFilter  marshalMinificationFilter  TextureMinFilter)
-      (texParami unmarshalMagnificationFilter marshalMagnificationFilter TextureMagFilter)
-
---------------------------------------------------------------------------------
-
-data Repetition =
-     Repeated
-   | Mirrored
-   deriving ( Eq, Ord, Show )
-
-data Clamping =
-     Clamp
-   | Repeat
-   | ClampToEdge
-   | ClampToBorder
-   deriving ( Eq, Ord, Show )
-
-marshalTextureWrapMode :: (Repetition, Clamping) -> GLint
-marshalTextureWrapMode x = case x of
-   (Repeated, Clamp) -> 0x2900
-   (Repeated, Repeat) -> 0x2901
-   (Repeated, ClampToEdge) -> 0x812f
-   (Repeated, ClampToBorder) -> 0x812d
-   (Mirrored, Clamp) -> 0x8742
-   (Mirrored, Repeat) -> 0x8370
-   (Mirrored, ClampToEdge) -> 0x8743
-   (Mirrored, ClampToBorder) -> 0x8912
-
-unmarshalTextureWrapMode :: GLint -> (Repetition, Clamping)
-unmarshalTextureWrapMode x
-   | x == 0x2900 = (Repeated, Clamp)
-   | x == 0x2901 = (Repeated, Repeat)
-   | x == 0x812f = (Repeated, ClampToEdge)
-   | x == 0x812d = (Repeated, ClampToBorder)
-   | x == 0x8742 = (Mirrored, Clamp)
-   | x == 0x8370 = (Mirrored, Repeat)
-   | x == 0x8743 = (Mirrored, ClampToEdge)
-   | x == 0x8912 = (Mirrored, ClampToBorder)
-   | otherwise = error ("unmarshalTextureWrapMode: illegal value " ++ show x)
-
---------------------------------------------------------------------------------
-
-textureWrapMode :: TextureTarget -> TextureCoordName -> StateVar (Repetition,Clamping)
-textureWrapMode t coord = case coord of
-   S -> wrap TextureWrapS
-   T -> wrap TextureWrapT
-   R -> wrap TextureWrapR
-   Q -> invalidTextureCoord
-   where wrap c = texParami unmarshalTextureWrapMode marshalTextureWrapMode c t
-
-invalidTextureCoord :: StateVar (Repetition,Clamping)
-invalidTextureCoord =
-   makeStateVar
-      (do recordInvalidEnum; return (Repeated, Repeat))
-      (const recordInvalidEnum)
-
---------------------------------------------------------------------------------
-
-textureBorderColor :: TextureTarget -> StateVar (Color4 GLfloat)
-textureBorderColor = texParamC4f TextureBorderColor
-
---------------------------------------------------------------------------------
-
-type LOD = GLfloat
-
-textureObjectLODBias :: TextureTarget -> StateVar LOD
-textureObjectLODBias = texParamf id id TextureLODBias
-
-maxTextureLODBias :: GettableStateVar LOD
-maxTextureLODBias =
-   makeGettableStateVar (getFloat1 id GetMaxTextureLODBias)
-
-textureLODRange :: TextureTarget -> StateVar (LOD,LOD)
-textureLODRange =
-   combineTexParams
-      (texParamf id id TextureMinLOD)
-      (texParamf id id TextureMaxLOD)
-
---------------------------------------------------------------------------------
-
-textureMaxAnisotropy :: TextureTarget -> StateVar GLfloat
-textureMaxAnisotropy = texParamf id id TextureMaxAnisotropy
-
-maxTextureMaxAnisotropy :: GettableStateVar GLfloat
-maxTextureMaxAnisotropy =
-   makeGettableStateVar (getFloat1 id GetMaxTextureMaxAnisotropy)
-
---------------------------------------------------------------------------------
-
-textureLevelRange :: TextureTarget -> StateVar (Level,Level)
-textureLevelRange =
-   combineTexParams
-      (texParami id id TextureBaseLevel)
-      (texParami id id TextureMaxLevel)
-
---------------------------------------------------------------------------------
-
-generateMipmap :: TextureTarget -> StateVar Capability
-generateMipmap = texParami unmarshal marshal GenerateMipmap
-   where unmarshal = unmarshalCapability . fromIntegral
-         marshal = fromIntegral . marshalCapability
-
---------------------------------------------------------------------------------
-
--- Only Luminance', Intensity, and Alpha' allowed
-depthTextureMode :: TextureTarget -> StateVar PixelInternalFormat
-depthTextureMode =
-   texParami unmarshalPixelInternalFormat marshalPixelInternalFormat DepthTextureMode
-
---------------------------------------------------------------------------------
-
-marshalTextureCompareMode :: Capability -> GLint
-marshalTextureCompareMode x = case x of
-   Disabled -> 0x0     -- i.e. None
-   Enabled -> 0x884e   -- i.e. CompareRToTexture
-
-unmarshalTextureCompareMode :: GLint -> Capability
-unmarshalTextureCompareMode x
-   | x == 0x0 = Disabled
-   | x == 0x884e = Enabled
-   | otherwise = error ("unmarshalTextureCompareMode: illegal value " ++ show x)
-
---------------------------------------------------------------------------------
-
-textureCompareMode :: TextureTarget -> StateVar (Maybe ComparisonFunction)
-textureCompareMode =
-   combineTexParamsMaybe
-      (texParami unmarshalTextureCompareMode marshalTextureCompareMode TextureCompareMode)
-      (texParami unmarshal marshal TextureCompareFunc)
-   where unmarshal = unmarshalComparisonFunction . fromIntegral
-         marshal = fromIntegral . marshalComparisonFunction
-
---------------------------------------------------------------------------------
-
-textureCompareFailValue :: TextureTarget -> StateVar GLclampf
-textureCompareFailValue = texParamf id id TextureCompareFailValue
-
---------------------------------------------------------------------------------
-
-data TextureCompareOperator =
-     LequalR
-   | GequalR
-   deriving ( Eq, Ord, Show )
-
-marshalTextureCompareOperator :: TextureCompareOperator -> GLint
-marshalTextureCompareOperator x = case x of
-   LequalR -> 0x819c
-   GequalR -> 0x819d
-
-unmarshalTextureCompareOperator :: GLint -> TextureCompareOperator
-unmarshalTextureCompareOperator x
-   | x == 0x819c = LequalR
-   | x == 0x819d = GequalR
-   | otherwise = error ("unmarshalTextureCompareOperator: illegal value " ++ show x)
-
---------------------------------------------------------------------------------
-
-textureCompareOperator :: TextureTarget -> StateVar (Maybe TextureCompareOperator)
-textureCompareOperator =
-   combineTexParamsMaybe
-      (texParami (unmarshalCapability . fromIntegral) (fromIntegral. marshalCapability) TextureCompare)
-      (texParami unmarshalTextureCompareOperator marshalTextureCompareOperator TextureCompareOperator)
diff --git a/Graphics/Rendering/OpenGL/GL/Texturing/PixelInternalFormat.hs b/Graphics/Rendering/OpenGL/GL/Texturing/PixelInternalFormat.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/Texturing/PixelInternalFormat.hs
+++ /dev/null
@@ -1,245 +0,0 @@
--- #hide
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.Texturing.PixelInternalFormat
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This is a purely internal module for (un-)marshaling PixelInternalFormat.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.Texturing.PixelInternalFormat (
-   PixelInternalFormat(..), marshalPixelInternalFormat,
-   marshalPixelInternalFormat', unmarshalPixelInternalFormat,
-) where
-
-import Graphics.Rendering.OpenGL.GL.BasicTypes ( GLint, GLenum )
-
---------------------------------------------------------------------------------
-
-data PixelInternalFormat =
-     Alpha'
-   | DepthComponent'
-   | Luminance'
-   | LuminanceAlpha'
-   | Intensity
-   | RGB'
-   | RGBA'
-   | SRGB
-   | SRGBAlpha
-   | SLuminance
-   | SLuminanceAlpha
-   | Alpha4
-   | Alpha8
-   | Alpha12
-   | Alpha16
-   | DepthComponent16
-   | DepthComponent24
-   | DepthComponent32
-   | Luminance4
-   | Luminance8
-   | Luminance12
-   | Luminance16
-   | Luminance4Alpha4
-   | Luminance6Alpha2
-   | Luminance8Alpha8
-   | Luminance12Alpha4
-   | Luminance12Alpha12
-   | Luminance16Alpha16
-   | Intensity4
-   | Intensity8
-   | Intensity12
-   | Intensity16
-   | R3G3B2
-   | RGB4
-   | RGB5
-   | RGB8
-   | RGB10
-   | RGB12
-   | RGB16
-   | RGBA2
-   | RGBA4
-   | RGB5A1
-   | RGBA8
-   | RGB10A2
-   | RGBA12
-   | RGBA16
-   | SRGB8
-   | SRGB8Alpha8
-   | SLuminance8
-   | SLuminance8Alpha8
-   | CompressedAlpha
-   | CompressedLuminance
-   | CompressedLuminanceAlpha
-   | CompressedIntensity
-   | CompressedRGB
-   | CompressedRGBA
-   | CompressedSRGB
-   | CompressedSRGBAlpha
-   | CompressedSLuminance
-   | CompressedSLuminanceAlpha
-   | DepthComponent32f
-   | Depth32fStencil8
-   | RGB9E5
-   | R11fG11fB10f
-   deriving ( Eq, Ord, Show )
-
-marshalPixelInternalFormat :: PixelInternalFormat -> GLint
-marshalPixelInternalFormat x = case x of
-   Alpha' -> 0x1906
-   DepthComponent' -> 0x1902
-   Luminance' -> 0x1909
-   LuminanceAlpha' -> 0x190a
-   RGB' -> 0x1907
-   RGBA' -> 0x1908
-   SRGB -> 0x8c40
-   SRGBAlpha -> 0x8c42
-   SLuminance -> 0x8c46
-   SLuminanceAlpha -> 0x8c44
-   Alpha4 -> 0x803b
-   Alpha8 -> 0x803c
-   Alpha12 -> 0x803d
-   Alpha16 -> 0x803e
-   DepthComponent16 -> 0x81a5
-   DepthComponent24 -> 0x81a6
-   DepthComponent32 -> 0x81a7
-   Luminance4 -> 0x803f
-   Luminance8 -> 0x8040
-   Luminance12 -> 0x8041
-   Luminance16 -> 0x8042
-   Luminance4Alpha4 -> 0x8043
-   Luminance6Alpha2 -> 0x8044
-   Luminance8Alpha8 -> 0x8045
-   Luminance12Alpha4 -> 0x8046
-   Luminance12Alpha12 -> 0x8047
-   Luminance16Alpha16 -> 0x8048
-   Intensity -> 0x8049
-   Intensity4 -> 0x804a
-   Intensity8 -> 0x804b
-   Intensity12 -> 0x804c
-   Intensity16 -> 0x804d
-   R3G3B2 -> 0x2a10
-   RGB4 -> 0x804f
-   RGB5 -> 0x8050
-   RGB8 -> 0x8051
-   RGB10 -> 0x8052
-   RGB12 -> 0x8053
-   RGB16 -> 0x8054
-   RGBA2 -> 0x8055
-   RGBA4 -> 0x8056
-   RGB5A1 -> 0x8057
-   RGBA8 -> 0x8058
-   RGB10A2 -> 0x8059
-   RGBA12 -> 0x805a
-   RGBA16 -> 0x805b
-   SRGB8 -> 0x8c41
-   SRGB8Alpha8 -> 0x8c43
-   SLuminance8 -> 0x8c47
-   SLuminance8Alpha8 -> 0x8c45
-   CompressedAlpha -> 0x84e9
-   CompressedLuminance -> 0x84ea
-   CompressedLuminanceAlpha -> 0x84eb
-   CompressedIntensity -> 0x84ec
-   CompressedRGB -> 0x84ed
-   CompressedRGBA -> 0x84ee
-   CompressedSRGB -> 0x8c48
-   CompressedSRGBAlpha -> 0x8c49
-   CompressedSLuminance -> 0x8c4a
-   CompressedSLuminanceAlpha -> 0x8c4b
-   DepthComponent32f -> 0x8CAC
-   Depth32fStencil8 -> 0x8CAD
-   RGB9E5 -> 0x8C3D
-   R11fG11fB10f -> 0x8C3A
-
--- *sigh* The OpenGL API is sometimes a bit creative in its usage of types...
-marshalPixelInternalFormat' :: PixelInternalFormat -> GLenum
-marshalPixelInternalFormat' = fromIntegral . marshalPixelInternalFormat
-
-unmarshalPixelInternalFormat :: GLint -> PixelInternalFormat
-unmarshalPixelInternalFormat x
-   | x == 0x1906 = Alpha'
-   | x == 0x1902 = DepthComponent'
-   | x == 0x1909 = Luminance'
-   | x == 0x190a = LuminanceAlpha'
-   | x == 0x1907 = RGB'
-   | x == 0x1908 = RGBA'
-   | x == 0x8c40 = SRGB
-   | x == 0x8c42 = SRGBAlpha
-   | x == 0x8c46 = SLuminance
-   | x == 0x8c44 = SLuminanceAlpha
-   | x == 0x803b = Alpha4
-   | x == 0x803c = Alpha8
-   | x == 0x803d = Alpha12
-   | x == 0x803e = Alpha16
-   | x == 0x81a5 = DepthComponent16
-   | x == 0x81a6 = DepthComponent24
-   | x == 0x81a7 = DepthComponent32
-   | x == 0x803f = Luminance4
-   | x == 0x8040 = Luminance8
-   | x == 0x8041 = Luminance12
-   | x == 0x8042 = Luminance16
-   | x == 0x8043 = Luminance4Alpha4
-   | x == 0x8044 = Luminance6Alpha2
-   | x == 0x8045 = Luminance8Alpha8
-   | x == 0x8046 = Luminance12Alpha4
-   | x == 0x8047 = Luminance12Alpha12
-   | x == 0x8048 = Luminance16Alpha16
-   | x == 0x8049 = Intensity
-   | x == 0x804a = Intensity4
-   | x == 0x804b = Intensity8
-   | x == 0x804c = Intensity12
-   | x == 0x804d = Intensity16
-   | x == 0x2a10 = R3G3B2
-   | x == 0x804f = RGB4
-   | x == 0x8050 = RGB5
-   | x == 0x8051 = RGB8
-   | x == 0x8052 = RGB10
-   | x == 0x8053 = RGB12
-   | x == 0x8054 = RGB16
-   | x == 0x8055 = RGBA2
-   | x == 0x8056 = RGBA4
-   | x == 0x8057 = RGB5A1
-   | x == 0x8058 = RGBA8
-   | x == 0x8059 = RGB10A2
-   | x == 0x805a = RGBA12
-   | x == 0x805b = RGBA16
-   | x == 0x8c41 = SRGB8
-   | x == 0x8c43 = SRGB8Alpha8
-   | x == 0x8c47 = SLuminance8
-   | x == 0x8c45 = SLuminance8Alpha8
-   | x == 0x84e9 = CompressedAlpha
-   | x == 0x84ea = CompressedLuminance
-   | x == 0x84eb = CompressedLuminanceAlpha
-   | x == 0x84ec = CompressedIntensity
-   | x == 0x84ed = CompressedRGB
-   | x == 0x84ee = CompressedRGBA
-   | x == 0x8c48 = CompressedSRGB
-   | x == 0x8c49 = CompressedSRGBAlpha
-   | x == 0x8c4a = CompressedSLuminance
-   | x == 0x8c4b = CompressedSLuminanceAlpha
-   | x == 0x8CAC = DepthComponent32f
-   | x == 0x8CAD = Depth32fStencil8
-   | x == 0x8C3D = RGB9E5
-   -- legacy values
-   | x == 1 = Luminance'
-   | x == 2 = LuminanceAlpha'
-   | x == 3 = RGB'
-   | x == 4 = RGBA'
-   | otherwise = error ("unmarshalPixelInternalFormat: illegal value " ++ show x)
-
--- Note: The following formats are still missing, it's a bit unclear how to
--- handle these nicely. From the EXT_texture_sRGB spec:
---
---    Accepted by the <internalformat> parameter of TexImage2D, CopyTexImage2D,
---    and CompressedTexImage2DARB and the <format> parameter of
---    CompressedTexSubImage2DARB:
---
---       COMPRESSED_SRGB_S3TC_DXT1_EXT                  0x8C4C
---       COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT            0x8C4D
---       COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT            0x8C4E
---       COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT            0x8C4F
diff --git a/Graphics/Rendering/OpenGL/GL/Texturing/Queries.hs b/Graphics/Rendering/OpenGL/GL/Texturing/Queries.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/Texturing/Queries.hs
+++ /dev/null
@@ -1,168 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.Texturing.Queries
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module offers various texture queries.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.Texturing.Queries (
-   TextureQuery, textureInternalFormat, textureSize1D, textureSize2D,
-   textureSize3D, textureBorder, textureRGBASizes, textureSharedSize,
-   textureIntensitySize, textureLuminanceSize, textureIndexSize,
-   textureDepthBits, textureCompressedImageSize, textureProxyOK
-) where
-
-import Control.Monad ( liftM2, liftM3, liftM4 )
-import Foreign.Marshal.Alloc ( alloca )
-import Foreign.Ptr ( Ptr )
-import Graphics.Rendering.OpenGL.GL.BasicTypes ( GLint, GLsizei, GLenum )
-import Graphics.Rendering.OpenGL.GL.GLboolean ( unmarshalGLboolean )
-import Graphics.Rendering.OpenGL.GL.PeekPoke ( peek1 )
-import Graphics.Rendering.OpenGL.GL.Texturing.PixelInternalFormat (
-   unmarshalPixelInternalFormat )
-import Graphics.Rendering.OpenGL.GL.PixelRectangles (
-   Proxy(..), PixelInternalFormat(..) )
-import Graphics.Rendering.OpenGL.GL.StateVar (
-   GettableStateVar, makeGettableStateVar )
-import Graphics.Rendering.OpenGL.GL.Texturing.Specification (
-   TextureTarget(..), CubeMapTarget, Level, Border,
-   TextureSize1D(..), TextureSize2D(..), TextureSize3D(..) )
-import Graphics.Rendering.OpenGL.GL.Texturing.TextureTarget (
-   marshalProxyTextureTarget, marshalCubeMapTarget )
-import Graphics.Rendering.OpenGL.GL.VertexSpec( Color4(..) )
-
---------------------------------------------------------------------------------
-
-data TexLevelParameter =
-     TextureInternalFormat
-   | TextureWidth
-   | TextureHeight
-   | TextureDepth
-   | TextureBorder
-   | TextureRedSize
-   | TextureGreenSize
-   | TextureBlueSize
-   | TextureAlphaSize
-   | TextureIntensitySize
-   | TextureLuminanceSize
-   | TextureIndexSize
-   | DepthBits
-   | TextureCompressedImageSize
-   | TextureCompressed
-   | TextureSharedSize
-
-marshalTexLevelParameter :: TexLevelParameter -> GLenum
-marshalTexLevelParameter x = case x of
-   TextureInternalFormat -> 0x1003
-   TextureWidth -> 0x1000
-   TextureHeight -> 0x1001
-   TextureDepth -> 0x8071
-   TextureBorder -> 0x1005
-   TextureRedSize -> 0x805C
-   TextureGreenSize -> 0x805D
-   TextureBlueSize -> 0x805E
-   TextureAlphaSize -> 0x805F
-   TextureIntensitySize -> 0x8061
-   TextureLuminanceSize -> 0x8060
-   TextureIndexSize -> 0x80ED
-   DepthBits -> 0x0D56
-   TextureCompressedImageSize -> 0x86A0
-   TextureCompressed -> 0x86A1
-   TextureSharedSize -> 0x8C3F
-
---------------------------------------------------------------------------------
-
-type TextureQuery a = Either TextureTarget CubeMapTarget -> Level -> GettableStateVar a
-
-textureInternalFormat :: TextureQuery PixelInternalFormat
-textureInternalFormat t level =
-   makeGettableStateVar $
-      getTexLevelParameteri unmarshalPixelInternalFormat NoProxy t level TextureInternalFormat
-
-textureSize1D :: TextureQuery TextureSize1D
-textureSize1D t level =
-   makeGettableStateVar $
-      getTexLevelParameteri (TextureSize1D . fromIntegral) NoProxy t level TextureWidth
-
-textureSize2D :: TextureQuery TextureSize2D
-textureSize2D t level =
-   makeGettableStateVar $
-      liftM2 TextureSize2D
-             (getTexLevelParameteri fromIntegral NoProxy t level TextureWidth )
-             (getTexLevelParameteri fromIntegral NoProxy t level TextureHeight)
-
-textureSize3D :: TextureQuery TextureSize3D
-textureSize3D t level =
-   makeGettableStateVar $
-      liftM3 TextureSize3D
-             (getTexLevelParameteri fromIntegral NoProxy t level TextureWidth )
-             (getTexLevelParameteri fromIntegral NoProxy t level TextureHeight)
-             (getTexLevelParameteri fromIntegral NoProxy t level TextureDepth )
-
-textureBorder :: TextureQuery Border
-textureBorder t level =
-   makeGettableStateVar $
-      getTexLevelParameteri fromIntegral NoProxy t level TextureBorder
-
-textureRGBASizes :: TextureQuery (Color4 GLsizei)
-textureRGBASizes t level =
-   makeGettableStateVar $
-      liftM4 Color4
-             (getTexLevelParameteri fromIntegral NoProxy t level TextureRedSize  )
-             (getTexLevelParameteri fromIntegral NoProxy t level TextureGreenSize)
-             (getTexLevelParameteri fromIntegral NoProxy t level TextureBlueSize )
-             (getTexLevelParameteri fromIntegral NoProxy t level TextureAlphaSize)
-
-textureSharedSize :: TextureQuery GLsizei
-textureSharedSize t level =
-   makeGettableStateVar $
-      getTexLevelParameteri fromIntegral NoProxy t level TextureSharedSize
-
-textureIntensitySize :: TextureQuery GLsizei
-textureIntensitySize t level =
-   makeGettableStateVar $
-      getTexLevelParameteri fromIntegral NoProxy t level TextureIntensitySize
-
-textureLuminanceSize :: TextureQuery GLsizei
-textureLuminanceSize t level =
-   makeGettableStateVar $
-      getTexLevelParameteri fromIntegral NoProxy t level TextureLuminanceSize
-
-textureIndexSize :: TextureQuery GLsizei
-textureIndexSize t level =
-   makeGettableStateVar $
-      getTexLevelParameteri fromIntegral NoProxy t level TextureIndexSize
-
-textureDepthBits :: TextureQuery GLsizei
-textureDepthBits t level =
-   makeGettableStateVar $
-      getTexLevelParameteri fromIntegral NoProxy t level DepthBits
-
-textureCompressedImageSize :: TextureQuery (Maybe GLsizei)
-textureCompressedImageSize t level =
-   makeGettableStateVar $ do
-      isCompressed <- getTexLevelParameteri unmarshalGLboolean NoProxy t level TextureCompressed
-      if isCompressed
-         then getTexLevelParameteri (Just . fromIntegral) NoProxy t level TextureCompressedImageSize
-         else return Nothing
-
-textureProxyOK :: TextureQuery Bool
-textureProxyOK t level =
-   makeGettableStateVar $
-      getTexLevelParameteri unmarshalGLboolean Proxy t level TextureWidth
-
-getTexLevelParameteri :: (GLint -> a) -> Proxy -> Either TextureTarget CubeMapTarget -> Level -> TexLevelParameter -> IO a
-getTexLevelParameteri f proxy t level p =
-   alloca $ \buf -> do
-      glGetTexLevelParameteriv (either (marshalProxyTextureTarget proxy) (\c -> if proxy == Proxy then marshalProxyTextureTarget Proxy TextureCubeMap else marshalCubeMapTarget c) t) level (marshalTexLevelParameter p) buf
-      peek1 f buf
-
-foreign import CALLCONV unsafe "glGetTexLevelParameteriv"
-   glGetTexLevelParameteriv :: GLenum -> GLint -> GLenum -> Ptr GLint -> IO ()
diff --git a/Graphics/Rendering/OpenGL/GL/Texturing/Specification.hs b/Graphics/Rendering/OpenGL/GL/Texturing/Specification.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/Texturing/Specification.hs
+++ /dev/null
@@ -1,327 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.Texturing.Specification
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to section 3.8.1 (Texture Image Specification),
--- section 3.8.2 (Alternate Texture Image Specification Commands), and section
--- 3.8.3 (Compressed Texture Images) of the OpenGL 2.1 specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.Texturing.Specification (
-   -- * Texture-related Data Types
-   TextureTarget(..), CubeMapTarget(..), Level, Border,
-   TexturePosition1D(..), TexturePosition2D(..), TexturePosition3D(..),
-   TextureSize1D(..), TextureSize2D(..), TextureSize3D(..),
-
-   -- * Texture Image Specification
-   texImage1D, texImage2D, texImage3D,
-   copyTexImage1D, copyTexImage2D,
-   texSubImage1D, texSubImage2D, texSubImage3D,
-   getTexImage,
-
-   -- * Alternate Texture Image Specification Commands
-   copyTexSubImage1D, copyTexSubImage2D, copyTexSubImage3D,
-
-   -- * Compressed Texture Images
-   CompressedTextureFormat(..), compressedTextureFormats,
-   CompressedPixelData(..),
-   compressedTexImage1D, compressedTexImage2D, compressedTexImage3D,
-   compressedTexSubImage1D, compressedTexSubImage2D, compressedTexSubImage3D,
-   getCompressedTexImage,
-
-  -- * Implementation-Dependent Limits
-  maxTextureSize
-) where
-
-import Foreign.Marshal.Array ( peekArray, allocaArray )
-import Foreign.Ptr ( Ptr )
-import Graphics.Rendering.OpenGL.GL.BasicTypes ( GLint, GLsizei, GLenum )
-import Graphics.Rendering.OpenGL.GL.CoordTrans ( Position(..) )
-import Graphics.Rendering.OpenGL.GL.Extensions (
-   FunPtr, unsafePerformIO, Invoker, getProcAddress )
-import Graphics.Rendering.OpenGL.GL.PixelData ( withPixelData )
-import Graphics.Rendering.OpenGL.GL.Texturing.PixelInternalFormat (
-   marshalPixelInternalFormat, marshalPixelInternalFormat' )
-import Graphics.Rendering.OpenGL.GL.PixelRectangles (
-   PixelInternalFormat, PixelData, Proxy(..) )
-import Graphics.Rendering.OpenGL.GL.QueryUtils (
-   GetPName(GetNumCompressedTextureFormats,GetCompressedTextureFormats,
-            GetMaxTextureSize,GetMax3DTextureSize,GetMaxCubeMapTextureSize,
-            GetMaxRectangleTextureSize),
-   getInteger1, getIntegerv)
-import Graphics.Rendering.OpenGL.GL.StateVar (
-   GettableStateVar, makeGettableStateVar )
-import Graphics.Rendering.OpenGL.GL.Texturing.TextureTarget (
-   TextureTarget(..), marshalTextureTarget, marshalProxyTextureTarget,
-   CubeMapTarget(..), marshalCubeMapTarget )
-
---------------------------------------------------------------------------------
-
-#include "HsOpenGLExt.h"
-
---------------------------------------------------------------------------------
-
-type Level = GLint
-
-type Border = GLint
-
-newtype TexturePosition1D = TexturePosition1D GLint
-   deriving ( Eq, Ord, Show )
-
-data TexturePosition2D = TexturePosition2D !GLint !GLint
-   deriving ( Eq, Ord, Show )
-
-data TexturePosition3D = TexturePosition3D !GLint !GLint !GLint
-   deriving ( Eq, Ord, Show )
-
-newtype TextureSize1D = TextureSize1D GLsizei
-   deriving ( Eq, Ord, Show )
-
-data TextureSize2D = TextureSize2D !GLsizei !GLsizei
-   deriving ( Eq, Ord, Show )
-
-data TextureSize3D = TextureSize3D !GLsizei !GLsizei !GLsizei
-   deriving ( Eq, Ord, Show )
-
---------------------------------------------------------------------------------
-
-texImage1D :: Proxy -> Level -> PixelInternalFormat -> TextureSize1D -> Border -> PixelData a -> IO ()
-texImage1D proxy level int (TextureSize1D w) border pd =
-   withPixelData pd $
-      glTexImage1D
-         (marshalProxyTextureTarget proxy Texture1D)
-         level (marshalPixelInternalFormat int) w border
-
-foreign import CALLCONV unsafe "glTexImage1D"
-   glTexImage1D :: GLenum -> GLint -> GLint -> GLsizei -> GLint -> GLenum -> GLenum -> Ptr a -> IO ()
-
---------------------------------------------------------------------------------
-
-texImage2D :: Maybe CubeMapTarget -> Proxy -> Level -> PixelInternalFormat -> TextureSize2D -> Border -> PixelData a -> IO ()
-texImage2D mbCubeMap proxy level int (TextureSize2D w h) border pd =
-   withPixelData pd $
-      glTexImage2D
-         (maybe (marshalProxyTextureTarget proxy Texture2D)
-                (\c -> if proxy == Proxy then marshalProxyTextureTarget Proxy TextureCubeMap else marshalCubeMapTarget c)
-                mbCubeMap)
-         level (marshalPixelInternalFormat int) w h border
-
-foreign import CALLCONV unsafe "glTexImage2D"
-   glTexImage2D :: GLenum -> GLint -> GLint -> GLsizei -> GLsizei -> GLint -> GLenum -> GLenum -> Ptr a -> IO ()
-
---------------------------------------------------------------------------------
-
-texImage3D :: Proxy -> Level -> PixelInternalFormat -> TextureSize3D -> Border -> PixelData a -> IO ()
-texImage3D proxy level int (TextureSize3D w h d) border pd =
-   withPixelData pd $
-      glTexImage3D
-         (marshalProxyTextureTarget proxy Texture3D)
-         level (marshalPixelInternalFormat int) w h d border
-
-EXTENSION_ENTRY("GL_EXT_texture3D or OpenGL 1.2",glTexImage3D,GLenum -> GLint -> GLint -> GLsizei -> GLsizei -> GLsizei -> GLint -> GLenum -> GLenum -> Ptr a -> IO ())
-
---------------------------------------------------------------------------------
-
-getTexImage :: Either TextureTarget CubeMapTarget -> Level -> PixelData a -> IO ()
-getTexImage t level pd =
-   withPixelData pd $
-      glGetTexImage (either marshalTextureTarget marshalCubeMapTarget t) level
-
-foreign import CALLCONV unsafe "glGetTexImage"
-   glGetTexImage :: GLenum -> GLint -> GLenum -> GLenum -> Ptr a -> IO ()
-
---------------------------------------------------------------------------------
-
-copyTexImage1D :: Level -> PixelInternalFormat -> Position -> TextureSize1D -> Border -> IO ()
-copyTexImage1D level int (Position x y) (TextureSize1D w) border =
-   glCopyTexImage1D
-      (marshalTextureTarget Texture1D) level
-      (marshalPixelInternalFormat' int) x y w border
-
-foreign import CALLCONV unsafe "glCopyTexImage1D"
-   glCopyTexImage1D :: GLenum -> GLint -> GLenum -> GLint -> GLint -> GLsizei -> GLint -> IO ()
-
---------------------------------------------------------------------------------
-
-copyTexImage2D :: Maybe CubeMapTarget -> Level -> PixelInternalFormat -> Position -> TextureSize2D -> Border -> IO ()
-copyTexImage2D mbCubeMap level int (Position x y) (TextureSize2D w h) border =
-   glCopyTexImage2D
-      (maybe (marshalTextureTarget Texture2D) marshalCubeMapTarget mbCubeMap) level
-      (marshalPixelInternalFormat' int) x y w h border
-
-foreign import CALLCONV unsafe "glCopyTexImage2D"
-   glCopyTexImage2D :: GLenum -> GLint -> GLenum -> GLint -> GLint -> GLsizei -> GLsizei -> GLint -> IO ()
-
---------------------------------------------------------------------------------
-
-texSubImage1D :: Level -> TexturePosition1D -> TextureSize1D -> PixelData a -> IO ()
-texSubImage1D level (TexturePosition1D xOff) (TextureSize1D w) pd =
-   withPixelData pd $
-      glTexSubImage1D (marshalTextureTarget Texture1D) level xOff w
-
-foreign import CALLCONV unsafe "glTexSubImage1D"
-   glTexSubImage1D :: GLenum -> GLint -> GLint -> GLsizei -> GLenum -> GLenum -> Ptr a -> IO ()
-
---------------------------------------------------------------------------------
-
-texSubImage2D :: Maybe CubeMapTarget -> Level -> TexturePosition2D -> TextureSize2D -> PixelData a -> IO ()
-texSubImage2D mbCubeMap level (TexturePosition2D xOff yOff) (TextureSize2D w h) pd =
-   withPixelData pd $
-      glTexSubImage2D (maybe (marshalTextureTarget Texture2D) marshalCubeMapTarget mbCubeMap) level xOff yOff w h
-
-foreign import CALLCONV unsafe "glTexSubImage2D"
-   glTexSubImage2D :: GLenum -> GLint -> GLint -> GLint -> GLsizei -> GLsizei -> GLenum -> GLenum -> Ptr a -> IO ()
-
---------------------------------------------------------------------------------
-
-texSubImage3D :: Level -> TexturePosition3D -> TextureSize3D -> PixelData a -> IO ()
-texSubImage3D level (TexturePosition3D xOff yOff zOff) (TextureSize3D w h d) pd =
-   withPixelData pd $
-      glTexSubImage3D (marshalTextureTarget Texture3D) level xOff yOff zOff w h d
-
-EXTENSION_ENTRY("GL_EXT_texture3D or OpenGL 1.2",glTexSubImage3D,GLenum -> GLint -> GLint -> GLint -> GLint -> GLsizei -> GLsizei -> GLsizei -> GLenum -> GLenum -> Ptr a -> IO ())
-
---------------------------------------------------------------------------------
-
-copyTexSubImage1D :: Level -> TexturePosition1D -> Position -> TextureSize1D -> IO ()
-copyTexSubImage1D level (TexturePosition1D xOff) (Position x y) (TextureSize1D w) =
-   glCopyTexSubImage1D (marshalTextureTarget Texture1D) level xOff x y w
-
-foreign import CALLCONV unsafe "glCopyTexSubImage1D"
-   glCopyTexSubImage1D :: GLenum -> GLint -> GLint -> GLint -> GLint -> GLsizei -> IO ()
-
---------------------------------------------------------------------------------
-
-copyTexSubImage2D :: Maybe CubeMapTarget -> Level -> TexturePosition2D -> Position -> TextureSize2D -> IO ()
-copyTexSubImage2D mbCubeMap level (TexturePosition2D xOff yOff) (Position x y) (TextureSize2D w h) =
-   glCopyTexSubImage2D (maybe (marshalTextureTarget Texture2D) marshalCubeMapTarget mbCubeMap) level xOff yOff x y w h
-
-foreign import CALLCONV unsafe "glCopyTexSubImage2D"
-   glCopyTexSubImage2D :: GLenum -> GLint -> GLint -> GLint -> GLint -> GLint -> GLsizei -> GLsizei -> IO ()
-
---------------------------------------------------------------------------------
-
-copyTexSubImage3D :: Level -> TexturePosition3D -> Position -> TextureSize2D -> IO ()
-copyTexSubImage3D level (TexturePosition3D xOff yOff zOff) (Position x y) (TextureSize2D w h) =
-   glCopyTexSubImage3D (marshalTextureTarget Texture3D) level xOff yOff zOff x y w h
-
-EXTENSION_ENTRY("GL_EXT_texture3D or OpenGL 1.2",glCopyTexSubImage3D,GLenum -> GLint -> GLint -> GLint -> GLint -> GLint -> GLint -> GLsizei -> GLsizei -> IO ())
-
---------------------------------------------------------------------------------
-
-newtype CompressedTextureFormat = CompressedTextureFormat GLenum
-   deriving ( Eq, Ord, Show )
-
-compressedTextureFormats :: GettableStateVar [CompressedTextureFormat]
-compressedTextureFormats =
-   makeGettableStateVar $ do
-      n <- getInteger1 fromIntegral GetNumCompressedTextureFormats
-      allocaArray n $ \buf -> do
-         getIntegerv GetCompressedTextureFormats buf
-         fmap (map (CompressedTextureFormat . fromIntegral)) $ peekArray n buf
-
---------------------------------------------------------------------------------
-
-data CompressedPixelData a =
-     CompressedPixelData !CompressedTextureFormat GLsizei (Ptr a)
-#ifdef __HADDOCK__
--- Help Haddock a bit, because it doesn't do any instance inference.
-instance Eq (CompressedPixelData a)
-instance Ord (CompressedPixelData a)
-instance Show (CompressedPixelData a)
-#else
-   deriving ( Eq, Ord, Show )
-#endif
-
-withCompressedPixelData ::
-   CompressedPixelData a -> (GLenum -> GLsizei -> Ptr a -> b) -> b
-withCompressedPixelData
-   (CompressedPixelData (CompressedTextureFormat fmt) size ptr) f =
-   f fmt size ptr
-
---------------------------------------------------------------------------------
-
-compressedTexImage1D :: Proxy -> Level -> TextureSize1D -> Border -> CompressedPixelData a -> IO ()
-compressedTexImage1D proxy level (TextureSize1D w) border cpd =
-   withCompressedPixelData cpd $ \fmt ->
-      glCompressedTexImage1DARB
-         (marshalProxyTextureTarget proxy Texture1D) level fmt w border
-
-EXTENSION_ENTRY("GL_ARB_texture_compression or OpenGL 1.3",glCompressedTexImage1DARB,GLenum -> GLint -> GLenum -> GLsizei -> GLint -> GLsizei -> Ptr a -> IO ())
-
---------------------------------------------------------------------------------
-
-compressedTexImage2D :: Maybe CubeMapTarget -> Proxy -> Level -> TextureSize2D -> Border -> CompressedPixelData a -> IO ()
-compressedTexImage2D mbCubeMap proxy level (TextureSize2D w h) border cpd =
-   withCompressedPixelData cpd $ \fmt ->
-      glCompressedTexImage2DARB
-         (maybe (marshalProxyTextureTarget proxy Texture2D)
-                (\c -> if proxy == Proxy then marshalProxyTextureTarget Proxy TextureCubeMap else marshalCubeMapTarget c)
-                mbCubeMap)
-         level fmt w h border
-
-EXTENSION_ENTRY("GL_ARB_texture_compression or OpenGL 1.3",glCompressedTexImage2DARB,GLenum -> GLint -> GLenum -> GLsizei -> GLsizei ->GLint -> GLsizei -> Ptr a -> IO ())
-
---------------------------------------------------------------------------------
-
-compressedTexImage3D :: Proxy -> Level -> TextureSize3D -> Border -> CompressedPixelData a -> IO ()
-compressedTexImage3D proxy level (TextureSize3D w h d) border cpd =
-   withCompressedPixelData cpd $ \fmt ->
-      glCompressedTexImage3DARB
-         (marshalProxyTextureTarget proxy Texture3D) level fmt w h d border
-
-EXTENSION_ENTRY("GL_ARB_texture_compression or OpenGL 1.3",glCompressedTexImage3DARB,GLenum -> GLint -> GLenum -> GLsizei -> GLsizei -> GLsizei -> GLint -> GLsizei -> Ptr a -> IO ())
-
---------------------------------------------------------------------------------
-
-getCompressedTexImage :: Either TextureTarget CubeMapTarget -> Level -> Ptr a -> IO ()
-getCompressedTexImage = glGetCompressedTexImageARB . either marshalTextureTarget marshalCubeMapTarget
-
-EXTENSION_ENTRY("GL_ARB_texture_compression or OpenGL 1.3",glGetCompressedTexImageARB,GLenum -> GLint -> Ptr a -> IO ())
-
---------------------------------------------------------------------------------
-
-compressedTexSubImage1D :: Level -> TexturePosition1D -> TextureSize1D -> CompressedPixelData a -> IO ()
-compressedTexSubImage1D level (TexturePosition1D xOff) (TextureSize1D w) cpd =
-   withCompressedPixelData cpd $
-      glCompressedTexSubImage1DARB (marshalTextureTarget Texture1D) level xOff w
-
-EXTENSION_ENTRY("GL_ARB_texture_compression or OpenGL 1.3",glCompressedTexSubImage1DARB,GLenum -> GLint -> GLint -> GLsizei -> GLenum -> GLsizei -> Ptr a -> IO ())
-
---------------------------------------------------------------------------------
-
-compressedTexSubImage2D :: Maybe CubeMapTarget -> Level -> TexturePosition2D -> TextureSize2D -> CompressedPixelData a -> IO ()
-compressedTexSubImage2D mbCubeMap level (TexturePosition2D xOff yOff) (TextureSize2D w h) cpd =
-   withCompressedPixelData cpd $
-      glCompressedTexSubImage2DARB (maybe (marshalTextureTarget Texture2D) marshalCubeMapTarget mbCubeMap) level xOff yOff w h
-
-EXTENSION_ENTRY("GL_ARB_texture_compression or OpenGL 1.3",glCompressedTexSubImage2DARB,GLenum -> GLint -> GLint -> GLint -> GLsizei -> GLsizei -> GLenum -> GLsizei -> Ptr a-> IO ())
-
---------------------------------------------------------------------------------
-
-compressedTexSubImage3D :: Level -> TexturePosition3D -> TextureSize3D -> CompressedPixelData a -> IO ()
-compressedTexSubImage3D level (TexturePosition3D xOff yOff zOff) (TextureSize3D w h d) cpd =
-   withCompressedPixelData cpd $
-      glCompressedTexSubImage3DARB (marshalTextureTarget Texture3D) level xOff yOff zOff w h d
-
-EXTENSION_ENTRY("GL_ARB_texture_compression or OpenGL 1.3",glCompressedTexSubImage3DARB,GLenum -> GLint -> GLint -> GLint -> GLint -> GLsizei -> GLsizei -> GLsizei -> GLenum -> GLsizei -> Ptr a -> IO ())
-
---------------------------------------------------------------------------------
-
-maxTextureSize :: TextureTarget -> GettableStateVar GLsizei
-maxTextureSize = makeGettableStateVar . getInteger1 fromIntegral . textureTargetToMaxQuery
-
-textureTargetToMaxQuery :: TextureTarget -> GetPName
-textureTargetToMaxQuery x = case x of
-   Texture1D -> GetMaxTextureSize
-   Texture2D -> GetMaxTextureSize
-   Texture3D -> GetMax3DTextureSize
-   TextureCubeMap -> GetMaxCubeMapTextureSize
-   TextureRectangle -> GetMaxRectangleTextureSize
diff --git a/Graphics/Rendering/OpenGL/GL/Texturing/TexParameter.hs b/Graphics/Rendering/OpenGL/GL/Texturing/TexParameter.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/Texturing/TexParameter.hs
+++ /dev/null
@@ -1,171 +0,0 @@
--- #hide
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.Texturing.TexParameter
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This is a purely internal module for getting\/setting texture parameters.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.Texturing.TexParameter (
-   TexParameter(..), texParami, texParamf, texParamC4f, getTexParameteri,
-   combineTexParams, combineTexParamsMaybe
-) where
-
-import Control.Monad ( liftM2 )
-import Foreign.Marshal.Alloc ( alloca )
-import Foreign.Marshal.Utils ( with )
-import Foreign.Storable ( Storable )
-import Foreign.Ptr ( Ptr )
-import Graphics.Rendering.OpenGL.GL.BasicTypes (
-   GLint, GLenum, GLfloat, Capability(..) )
-import Graphics.Rendering.OpenGL.GL.PeekPoke ( peek1 )
-import Graphics.Rendering.OpenGL.GL.StateVar (
-   HasGetter(get), HasSetter(($=)), StateVar, makeStateVar )
-import Graphics.Rendering.OpenGL.GL.Texturing.TextureTarget (
-   TextureTarget(..), marshalTextureTarget )
-import Graphics.Rendering.OpenGL.GL.VertexSpec( Color4(..) )
-
---------------------------------------------------------------------------------
-
-data TexParameter =
-     TextureMinFilter
-   | TextureMagFilter
-   | TextureWrapS
-   | TextureWrapT
-   | TextureWrapR
-   | TextureBorderColor
-   | TextureMinLOD
-   | TextureMaxLOD
-   | TextureBaseLevel
-   | TextureMaxLevel
-   | TexturePriority
-   | TextureMaxAnisotropy
-   | TextureCompare
-   | TextureCompareOperator
-   | TextureCompareFailValue
-   | GenerateMipmap
-   | TextureCompareMode
-   | TextureCompareFunc
-   | DepthTextureMode
-   | TextureLODBias
-   | TextureResident
-
-marshalTexParameter :: TexParameter -> GLenum
-marshalTexParameter x = case x of
-   TextureMinFilter -> 0x2801
-   TextureMagFilter -> 0x2800
-   TextureWrapS -> 0x2802
-   TextureWrapT -> 0x2803
-   TextureWrapR -> 0x8072
-   TextureBorderColor -> 0x1004
-   TextureMinLOD -> 0x813A
-   TextureMaxLOD -> 0x813B
-   TextureBaseLevel -> 0x813C
-   TextureMaxLevel -> 0x813D
-   TexturePriority -> 0x8066
-   TextureMaxAnisotropy -> 0x84FE
-   TextureCompare -> 0x819A
-   TextureCompareOperator -> 0x819B
-   TextureCompareFailValue -> 0x80BF
-   GenerateMipmap -> 0x8191
-   TextureCompareMode -> 0x884C
-   TextureCompareFunc -> 0x884D
-   DepthTextureMode -> 0x884B
-   TextureLODBias -> 0x8501
-   TextureResident -> 0x8067
-
---------------------------------------------------------------------------------
-
-texParameter :: (GLenum -> GLenum -> b -> IO ())
-             -> (a -> (b -> IO ()) -> IO ())
-             -> TextureTarget -> TexParameter -> a -> IO ()
-texParameter glTexParameter marshalAct t p x =
-   marshalAct x $
-      glTexParameter (marshalTextureTarget t) (marshalTexParameter p)
-
-foreign import CALLCONV unsafe "glTexParameteri"
-   glTexParameteri :: GLenum -> GLenum ->  GLint -> IO ()
-
-foreign import CALLCONV unsafe "glTexParameterf"
-   glTexParameterf :: GLenum -> GLenum ->  GLfloat -> IO ()
-
-foreign import CALLCONV unsafe "glTexParameterfv"
-   glTexParameterC4f :: GLenum -> GLenum -> Ptr (Color4 GLfloat) -> IO ()
-
---------------------------------------------------------------------------------
-
-getTexParameter :: Storable b
-                => (GLenum -> GLenum -> Ptr b -> IO ())
-                -> (b -> a)
-                -> TextureTarget -> TexParameter -> IO a
-getTexParameter glGetTexParameter unmarshal t p =
-   alloca $ \buf -> do
-     glGetTexParameter (marshalTextureTarget t) (marshalTexParameter p) buf
-     peek1 unmarshal buf
-
-foreign import CALLCONV unsafe "glGetTexParameteriv"
-   glGetTexParameteriv :: GLenum -> GLenum -> Ptr GLint -> IO ()
-
-foreign import CALLCONV unsafe "glGetTexParameterfv"
-   glGetTexParameterfv :: GLenum -> GLenum -> Ptr GLfloat -> IO ()
-
-foreign import CALLCONV unsafe "glGetTexParameterfv"
-   glGetTexParameterC4f :: GLenum -> GLenum -> Ptr (Color4 GLfloat) -> IO ()
-
---------------------------------------------------------------------------------
-
-m2a :: (a -> b) -> a -> (b -> IO ()) -> IO ()
-m2a marshal x act = act (marshal x)
-
-texParami ::
-   (GLint -> a) -> (a -> GLint) -> TexParameter -> TextureTarget -> StateVar a
-texParami unmarshal marshal p t =
-   makeStateVar
-      (getTexParameter glGetTexParameteriv unmarshal     t p)
-      (texParameter    glTexParameteri     (m2a marshal) t p)
-
-texParamf ::
-   (GLfloat -> a) -> (a -> GLfloat) -> TexParameter -> TextureTarget -> StateVar a
-texParamf unmarshal marshal p t =
-   makeStateVar
-      (getTexParameter glGetTexParameterfv unmarshal     t p)
-      (texParameter    glTexParameterf     (m2a marshal) t p)
-
-texParamC4f :: TexParameter -> TextureTarget -> StateVar (Color4 GLfloat)
-texParamC4f p t =
-   makeStateVar
-      (getTexParameter glGetTexParameterC4f id   t p)
-      (texParameter    glTexParameterC4f    with t p)
-
-getTexParameteri :: (GLint -> a) -> TextureTarget -> TexParameter -> IO a
-getTexParameteri = getTexParameter glGetTexParameteriv
-
---------------------------------------------------------------------------------
-
-combineTexParams :: (TextureTarget -> StateVar a)
-                 -> (TextureTarget -> StateVar b)
-                 -> (TextureTarget -> StateVar (a,b))
-combineTexParams v w t =
-   makeStateVar
-      (liftM2 (,) (get (v t)) (get (w t)))
-      (\(x,y) -> do v t $= x; w t $= y)
-
-combineTexParamsMaybe :: (TextureTarget -> StateVar Capability)
-                      -> (TextureTarget -> StateVar a)
-                      -> (TextureTarget -> StateVar (Maybe a))
-combineTexParamsMaybe enab val t =
-   makeStateVar
-      (do tcm <- get (enab t)
-          case tcm of
-             Disabled -> return Nothing
-             Enabled -> fmap Just $ get (val t))
-      (maybe (enab t $= Disabled)
-             (\tcf -> do val t $= tcf
-                         enab t $= Enabled))
diff --git a/Graphics/Rendering/OpenGL/GL/Texturing/TextureTarget.hs b/Graphics/Rendering/OpenGL/GL/Texturing/TextureTarget.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/Texturing/TextureTarget.hs
+++ /dev/null
@@ -1,69 +0,0 @@
--- #hide
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.Texturing.TextureTarget
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This is a purely internal module for marshaling texture targets.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.Texturing.TextureTarget (
-   TextureTarget(..), marshalTextureTarget, marshalProxyTextureTarget,
-   CubeMapTarget(..), marshalCubeMapTarget
-) where
-
-import Graphics.Rendering.OpenGL.GL.BasicTypes ( GLenum )
-import Graphics.Rendering.OpenGL.GL.PixelRectangles ( Proxy(..) )
-
---------------------------------------------------------------------------------
-
-data TextureTarget =
-     Texture1D
-   | Texture2D
-   | Texture3D
-   | TextureCubeMap
-   | TextureRectangle
-   deriving ( Eq, Ord, Show )
-
-marshalTextureTarget :: TextureTarget -> GLenum
-marshalTextureTarget x = case x of
-   Texture1D -> 0xde0
-   Texture2D -> 0xde1
-   Texture3D -> 0x806f
-   TextureCubeMap -> 0x8513
-   TextureRectangle -> 0x84f5
-
-marshalProxyTextureTarget :: Proxy -> TextureTarget -> GLenum
-marshalProxyTextureTarget NoProxy x = marshalTextureTarget x
-marshalProxyTextureTarget Proxy   x = case x of
-   Texture1D -> 0x8063
-   Texture2D -> 0x8064
-   Texture3D -> 0x8070
-   TextureCubeMap -> 0x851b
-   TextureRectangle -> 0x84f7
-
---------------------------------------------------------------------------------
-
-data CubeMapTarget =
-     TextureCubeMapPositiveX
-   | TextureCubeMapNegativeX
-   | TextureCubeMapPositiveY
-   | TextureCubeMapNegativeY
-   | TextureCubeMapPositiveZ
-   | TextureCubeMapNegativeZ
-   deriving ( Eq, Ord, Show )
-
-marshalCubeMapTarget :: CubeMapTarget -> GLenum
-marshalCubeMapTarget x = case x of
-   TextureCubeMapPositiveX -> 0x8515
-   TextureCubeMapNegativeX -> 0x8516
-   TextureCubeMapPositiveY -> 0x8517
-   TextureCubeMapNegativeY -> 0x8518
-   TextureCubeMapPositiveZ -> 0x8519
-   TextureCubeMapNegativeZ -> 0x851a
diff --git a/Graphics/Rendering/OpenGL/GL/Texturing/TextureUnit.hs b/Graphics/Rendering/OpenGL/GL/Texturing/TextureUnit.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/Texturing/TextureUnit.hs
+++ /dev/null
@@ -1,34 +0,0 @@
--- #hide
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.Texturing.TextureUnit
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This is a purely internal module for (un-)marshaling TextureUnit.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.Texturing.TextureUnit (
-   TextureUnit(..), marshalTextureUnit, unmarshalTextureUnit
-) where
-
-import Graphics.Rendering.OpenGL.GL.BasicTypes ( GLenum, GLuint )
-
---------------------------------------------------------------------------------
-
--- | Identifies a texture unit via its number, which must be in the range of
--- (0 .. 'maxTextureUnit').
-
-newtype TextureUnit = TextureUnit GLuint
-   deriving ( Eq, Ord, Show )
-
-marshalTextureUnit :: TextureUnit -> GLenum
-marshalTextureUnit (TextureUnit x) = 0x84c0 + fromIntegral x
-
-unmarshalTextureUnit :: GLenum -> TextureUnit
-unmarshalTextureUnit x = TextureUnit (fromIntegral (x - 0x84c0))
diff --git a/Graphics/Rendering/OpenGL/GL/VertexArrays.hs b/Graphics/Rendering/OpenGL/GL/VertexArrays.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/VertexArrays.hs
+++ /dev/null
@@ -1,575 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.VertexArrays
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to section 2.8 (Vertex Arrays) of the OpenGL 2.1
--- specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.VertexArrays (
-   -- * Describing Data for the Arrays
-   NumComponents, DataType(..), Stride, VertexArrayDescriptor(..),
-
-   -- * Specifying Data for the Arrays
-   ClientArrayType(..), arrayPointer,
-   InterleavedArrays(..), interleavedArrays,
-
-   -- * Enabling Arrays
-   clientState, clientActiveTexture,
-
-   -- * Dereferencing and Rendering
-   ArrayIndex, NumArrayIndices, NumIndexBlocks,
-   arrayElement, drawArrays, multiDrawArrays, drawElements, multiDrawElements,
-   drawRangeElements, maxElementsVertices, maxElementsIndices, lockArrays,
-   primitiveRestartIndex,
-
-   -- * Generic Vertex Attribute Arrays
-   vertexAttribPointer, vertexAttribArray
-) where
-
-import Foreign.Marshal.Alloc ( alloca )
-import Foreign.Ptr ( Ptr, nullPtr )
-import Foreign.Storable ( Storable(peek) )
-import Graphics.Rendering.OpenGL.GL.Capability (
-   EnableCap(CapVertexArray,CapNormalArray,CapColorArray,CapIndexArray,
-             CapTextureCoordArray,CapEdgeFlagArray,CapFogCoordArray,
-             CapSecondaryColorArray,CapMatrixIndexArray,CapPrimitiveRestart),
-   makeCapability, unmarshalCapability )
-import Graphics.Rendering.OpenGL.GL.BasicTypes (
-   GLboolean, GLenum, GLint, GLuint, GLsizei, Capability(Disabled,Enabled) )
-import Graphics.Rendering.OpenGL.GL.DataType (
-   DataType(..), marshalDataType, unmarshalDataType )
-import Graphics.Rendering.OpenGL.GL.Extensions (
-   FunPtr, unsafePerformIO, Invoker, getProcAddress )
-import Graphics.Rendering.OpenGL.GL.GLboolean (
-   marshalGLboolean, unmarshalGLboolean )
-import Graphics.Rendering.OpenGL.GL.QueryUtils (
-   GetPName(GetVertexArraySize,GetVertexArrayType,GetVertexArrayStride,
-            GetNormalArrayType,GetNormalArrayStride,GetColorArraySize,
-            GetColorArrayType,GetColorArrayStride,GetSecondaryColorArraySize,
-            GetSecondaryColorArrayType,GetSecondaryColorArrayStride,
-            GetIndexArrayType,GetIndexArrayStride,
-            GetFogCoordArrayType,GetFogCoordArrayStride,
-            GetTextureCoordArraySize,GetTextureCoordArrayType,
-            GetTextureCoordArrayStride,GetEdgeFlagArrayStride,
-            GetMaxElementsVertices,GetMaxElementsIndices,
-            GetClientActiveTexture,GetArrayElementLockFirst,
-            GetArrayElementLockCount,GetPrimitiveRestartIndex),
-   getInteger1, getEnum1, getSizei1, AttribLocation,
-   GetVertexAttribPName(..),
-   getVertexAttribInteger1, getVertexAttribEnum1, getVertexAttribBoolean1,
-   GetVertexAttribPointerPName(..), getVertexAttribPointer )
-import Graphics.Rendering.OpenGL.GL.PrimitiveMode ( marshalPrimitiveMode )
-import Graphics.Rendering.OpenGL.GL.BeginEnd ( PrimitiveMode )
-import Graphics.Rendering.OpenGL.GL.StateVar (
-   HasGetter(get),
-   GettableStateVar, makeGettableStateVar, StateVar, makeStateVar )
-import Graphics.Rendering.OpenGL.GL.Texturing.TextureUnit (
-   TextureUnit, marshalTextureUnit, unmarshalTextureUnit )
-import Graphics.Rendering.OpenGL.GLU.ErrorsInternal (
-   recordInvalidEnum, recordInvalidValue )
-import Graphics.Rendering.OpenGL.GL.VertexSpec ( IntegerHandling(..) )
-
---------------------------------------------------------------------------------
-
-#include "HsOpenGLExt.h"
-
---------------------------------------------------------------------------------
-
-type NumComponents = GLint
-
-type Stride = GLsizei
-
-data VertexArrayDescriptor a =
-   VertexArrayDescriptor !NumComponents !DataType !Stride !(Ptr a)
-#ifdef __HADDOCK__
--- Help Haddock a bit, because it doesn't do any instance inference.
-instance Eq (VertexArrayDescriptor a)
-instance Ord (VertexArrayDescriptor a)
-instance Show (VertexArrayDescriptor a)
-#else
-   deriving ( Eq, Ord, Show )
-#endif
-
-noVertexArrayDescriptor :: VertexArrayDescriptor a
-noVertexArrayDescriptor = VertexArrayDescriptor 0 Byte 0 nullPtr
-
---------------------------------------------------------------------------------
-
-data ClientArrayType =
-     VertexArray
-   | NormalArray
-   | ColorArray
-   | IndexArray
-   | TextureCoordArray
-   | EdgeFlagArray
-   | FogCoordArray
-   | SecondaryColorArray
-   | MatrixIndexArray
-   deriving ( Eq, Ord, Show )
-
-marshalClientArrayType :: ClientArrayType -> GLenum
-marshalClientArrayType x = case x of
-   VertexArray -> 0x8074
-   NormalArray -> 0x8075
-   ColorArray -> 0x8076
-   IndexArray -> 0x8077
-   TextureCoordArray -> 0x8078
-   EdgeFlagArray -> 0x8079
-   FogCoordArray -> 0x8457
-   SecondaryColorArray -> 0x845e
-   MatrixIndexArray -> 0x8844
-
--- Hmmm...
-clientArrayTypeToEnableCap :: ClientArrayType -> EnableCap
-clientArrayTypeToEnableCap x = case x of
-   VertexArray -> CapVertexArray
-   NormalArray -> CapNormalArray
-   ColorArray -> CapColorArray
-   IndexArray -> CapIndexArray
-   TextureCoordArray -> CapTextureCoordArray
-   EdgeFlagArray -> CapEdgeFlagArray
-   FogCoordArray -> CapFogCoordArray
-   SecondaryColorArray -> CapSecondaryColorArray
-   MatrixIndexArray -> CapMatrixIndexArray
-
---------------------------------------------------------------------------------
-
-arrayPointer :: ClientArrayType -> StateVar (VertexArrayDescriptor a)
-arrayPointer t = case t of
-   VertexArray -> vertexPointer
-   NormalArray -> normalPointer
-   ColorArray -> colorPointer
-   IndexArray -> indexPointer
-   TextureCoordArray -> texCoordPointer
-   EdgeFlagArray -> edgeFlagPointer
-   FogCoordArray -> fogCoordPointer
-   SecondaryColorArray -> secondaryColorPointer
-   MatrixIndexArray ->
-      makeStateVar
-        (do recordInvalidEnum ; return noVertexArrayDescriptor)
-        (const recordInvalidEnum)
-
-check :: Bool -> IO () -> IO ()
-check flag val = if flag then val else recordInvalidValue
-
---------------------------------------------------------------------------------
-
-vertexPointer :: StateVar (VertexArrayDescriptor a)
-vertexPointer = makeStateVar getVertexPointer setVertexPointer
-
-getVertexPointer :: IO (VertexArrayDescriptor a)
-getVertexPointer = do
-   n <- getInteger1 id GetVertexArraySize
-   d <- getEnum1 unmarshalDataType GetVertexArrayType
-   s <- getInteger1 fromIntegral GetVertexArrayStride
-   p <- getPointer VertexArrayPointer
-   return $ VertexArrayDescriptor n d s p
-
-setVertexPointer :: VertexArrayDescriptor a -> IO ()
-setVertexPointer (VertexArrayDescriptor n d s p) =
-   glVertexPointer n (marshalDataType d) s p
-
-foreign import CALLCONV unsafe "glVertexPointer" glVertexPointer ::
-   GLint -> GLenum -> GLsizei -> Ptr a -> IO ()
-
---------------------------------------------------------------------------------
-
-normalPointer :: StateVar (VertexArrayDescriptor a)
-normalPointer = makeStateVar getNormalPointer setNormalPointer
-
-getNormalPointer :: IO (VertexArrayDescriptor a)
-getNormalPointer = do
-   d <- getEnum1 unmarshalDataType GetNormalArrayType
-   s <- getInteger1 fromIntegral GetNormalArrayStride
-   p <- getPointer NormalArrayPointer
-   return $ VertexArrayDescriptor 3 d s p
-
-setNormalPointer :: VertexArrayDescriptor a -> IO ()
-setNormalPointer (VertexArrayDescriptor n d s p) =
-   check (n == 3) $ glNormalPointer (marshalDataType d) s p
-
-foreign import CALLCONV unsafe "glNormalPointer" glNormalPointer ::
-   GLenum -> GLsizei -> Ptr a -> IO ()
-
---------------------------------------------------------------------------------
-
-colorPointer :: StateVar (VertexArrayDescriptor a)
-colorPointer = makeStateVar getColorPointer setColorPointer
-
-getColorPointer :: IO (VertexArrayDescriptor a)
-getColorPointer = do
-   n <- getInteger1 id GetColorArraySize
-   d <- getEnum1 unmarshalDataType GetColorArrayType
-   s <- getInteger1 fromIntegral GetColorArrayStride
-   p <- getPointer ColorArrayPointer
-   return $ VertexArrayDescriptor n d s p
-
-setColorPointer :: VertexArrayDescriptor a -> IO ()
-setColorPointer (VertexArrayDescriptor n d s p) =
-   check (n == 3 || n == 4) $ glColorPointer n (marshalDataType d) s p
-
-foreign import CALLCONV unsafe "glColorPointer" glColorPointer ::
-   GLint -> GLenum -> GLsizei -> Ptr a -> IO ()
-
---------------------------------------------------------------------------------
-
-indexPointer :: StateVar (VertexArrayDescriptor a)
-indexPointer = makeStateVar getIndexPointer setIndexPointer
-
-getIndexPointer :: IO (VertexArrayDescriptor a)
-getIndexPointer = do
-   d <- getEnum1 unmarshalDataType GetIndexArrayType
-   s <- getInteger1 fromIntegral GetIndexArrayStride
-   p <- getPointer IndexArrayPointer
-   return $ VertexArrayDescriptor 1 d s p
-
-setIndexPointer :: VertexArrayDescriptor a -> IO ()
-setIndexPointer (VertexArrayDescriptor n d s p) =
-   check (n == 1) $ glIndexPointer (marshalDataType d) s p
-
-foreign import CALLCONV unsafe "glIndexPointer" glIndexPointer ::
-   GLenum -> GLsizei -> Ptr a -> IO ()
-
---------------------------------------------------------------------------------
-
-texCoordPointer :: StateVar (VertexArrayDescriptor a)
-texCoordPointer = makeStateVar getTexCoordPointer setTexCoordPointer
-
-getTexCoordPointer :: IO (VertexArrayDescriptor a)
-getTexCoordPointer = do
-   n <- getInteger1 id GetTextureCoordArraySize
-   d <- getEnum1 unmarshalDataType GetTextureCoordArrayType
-   s <- getInteger1 fromIntegral GetTextureCoordArrayStride
-   p <- getPointer TextureCoordArrayPointer
-   return $ VertexArrayDescriptor n d s p
-
-setTexCoordPointer :: VertexArrayDescriptor a -> IO ()
-setTexCoordPointer (VertexArrayDescriptor n d s p) =
-   glTexCoordPointer n (marshalDataType d) s p
-
-foreign import CALLCONV unsafe "glTexCoordPointer" glTexCoordPointer ::
-   GLint -> GLenum -> GLsizei -> Ptr a -> IO ()
-
---------------------------------------------------------------------------------
-
-edgeFlagPointer :: StateVar (VertexArrayDescriptor a)
-edgeFlagPointer = makeStateVar getEdgeFlagPointer setEdgeFlagPointer
-
-getEdgeFlagPointer :: IO (VertexArrayDescriptor a)
-getEdgeFlagPointer = do
-   s <- getInteger1 fromIntegral GetEdgeFlagArrayStride
-   p <- getPointer EdgeFlagArrayPointer
-   return $ VertexArrayDescriptor 1 UnsignedByte s p
-
-setEdgeFlagPointer :: VertexArrayDescriptor a -> IO ()
-setEdgeFlagPointer (VertexArrayDescriptor n d s p) =
-   check (n == 1 && d == UnsignedByte) $ glEdgeFlagPointer s p
-
-foreign import CALLCONV unsafe "glEdgeFlagPointer" glEdgeFlagPointer ::
-   GLsizei -> Ptr a -> IO ()
-
---------------------------------------------------------------------------------
-
-fogCoordPointer :: StateVar (VertexArrayDescriptor a)
-fogCoordPointer = makeStateVar getFogCoordPointer setFogCoordPointer
-
-getFogCoordPointer :: IO (VertexArrayDescriptor a)
-getFogCoordPointer = do
-   d <- getEnum1 unmarshalDataType GetFogCoordArrayType
-   s <- getInteger1 fromIntegral GetFogCoordArrayStride
-   p <- getPointer FogCoordArrayPointer
-   return $ VertexArrayDescriptor 1 d s p
-
-setFogCoordPointer :: VertexArrayDescriptor a -> IO ()
-setFogCoordPointer (VertexArrayDescriptor n d s p) =
-   check (n == 1) $ glFogCoordPointerEXT (marshalDataType d) s p
-
-EXTENSION_ENTRY("GL_EXT_fog_coord or OpenGL 1.4",glFogCoordPointerEXT,GLenum -> GLsizei -> Ptr a -> IO ())
-
---------------------------------------------------------------------------------
-
-secondaryColorPointer :: StateVar (VertexArrayDescriptor a)
-secondaryColorPointer =
-   makeStateVar getSecondaryColorPointer setSecondaryColorPointer
-
-getSecondaryColorPointer :: IO (VertexArrayDescriptor a)
-getSecondaryColorPointer = do
-   n <- getInteger1 id GetSecondaryColorArraySize
-   d <- getEnum1 unmarshalDataType GetSecondaryColorArrayType
-   s <- getInteger1 fromIntegral GetSecondaryColorArrayStride
-   p <- getPointer SecondaryColorArrayPointer
-   return $ VertexArrayDescriptor n d s p
-
-setSecondaryColorPointer :: (VertexArrayDescriptor a) -> IO ()
-setSecondaryColorPointer (VertexArrayDescriptor n d s p) =
-   glSecondaryColorPointerEXT n (marshalDataType d) s p
-
-EXTENSION_ENTRY("GL_EXT_secondary_color or OpenGL 1.4",glSecondaryColorPointerEXT,GLint -> GLenum -> GLsizei -> Ptr a -> IO ())
-
---------------------------------------------------------------------------------
-
-data InterleavedArrays =
-     V2f
-   | V3f
-   | C4ubV2f
-   | C4ubV3f
-   | C3fV3f
-   | N3fV3f
-   | C4fN3fV3f
-   | T2fV3f
-   | T4fV4f
-   | T2fC4ubV3f
-   | T2fC3fV3f
-   | T2fN3fV3f
-   | T2fC4fN3fV3f
-   | T4fC4fN3fV4f
-   deriving ( Eq, Ord, Show )
-
-marshalInterleavedArrays :: InterleavedArrays -> GLenum
-marshalInterleavedArrays x = case x of
-   V2f -> 0x2a20
-   V3f -> 0x2a21
-   C4ubV2f -> 0x2a22
-   C4ubV3f -> 0x2a23
-   C3fV3f -> 0x2a24
-   N3fV3f -> 0x2a25
-   C4fN3fV3f -> 0x2a26
-   T2fV3f -> 0x2a27
-   T4fV4f -> 0x2a28
-   T2fC4ubV3f -> 0x2a29
-   T2fC3fV3f -> 0x2a2a
-   T2fN3fV3f -> 0x2a2b
-   T2fC4fN3fV3f -> 0x2a2c
-   T4fC4fN3fV4f -> 0x2a2d
-
---------------------------------------------------------------------------------
-
-interleavedArrays :: InterleavedArrays -> Stride -> Ptr a -> IO ()
-interleavedArrays = glInterleavedArrays . marshalInterleavedArrays
-
-foreign import CALLCONV unsafe "glInterleavedArrays" glInterleavedArrays ::
-   GLenum -> GLsizei -> Ptr a -> IO ()
-
---------------------------------------------------------------------------------
-
-clientState :: ClientArrayType -> StateVar Capability
-clientState arrayType =
-   makeStateVar (getClientState arrayType) (setClientState arrayType)
-
-getClientState :: ClientArrayType -> IO Capability
-getClientState arrayType = get . makeCapability . clientArrayTypeToEnableCap $ arrayType
-
-setClientState :: ClientArrayType -> Capability -> IO ()
-setClientState arrayType val =
-   (if val == Enabled then glEnableClientState else glDisableClientState)
-      (marshalClientArrayType arrayType)
-
-foreign import CALLCONV unsafe "glEnableClientState" glEnableClientState ::
-   GLenum -> IO ()
-
-foreign import CALLCONV unsafe "glDisableClientState" glDisableClientState ::
-   GLenum -> IO ()
-
---------------------------------------------------------------------------------
-
-clientActiveTexture :: StateVar TextureUnit
-clientActiveTexture =
-   makeStateVar (getEnum1 unmarshalTextureUnit GetClientActiveTexture)
-                (glClientActiveTextureARB . marshalTextureUnit)
-
-EXTENSION_ENTRY("GL_ARB_multitexture or OpenGL 1.3",glClientActiveTextureARB,GLenum -> IO ())
-
---------------------------------------------------------------------------------
-
-type ArrayIndex = GLint
-
-type NumArrayIndices = GLsizei
-
-type NumIndexBlocks = GLsizei
-
---------------------------------------------------------------------------------
-
-arrayElement :: ArrayIndex -> IO ()
-arrayElement = glArrayElement
-
-foreign import CALLCONV unsafe "glArrayElement" glArrayElement :: GLint -> IO ()
-
-drawArrays :: PrimitiveMode -> ArrayIndex -> NumArrayIndices -> IO ()
-drawArrays = glDrawArrays . marshalPrimitiveMode
-
-foreign import CALLCONV unsafe "glDrawArrays" glDrawArrays ::
-   GLenum -> GLint -> GLsizei -> IO ()
-
-multiDrawArrays ::
-      PrimitiveMode -> Ptr ArrayIndex -> Ptr NumArrayIndices -> NumIndexBlocks
-   -> IO ()
-multiDrawArrays = glMultiDrawArraysEXT . marshalPrimitiveMode
-
-EXTENSION_ENTRY("GL_EXT_multi_draw_arrays or OpenGL 1.4",glMultiDrawArraysEXT,GLenum -> Ptr ArrayIndex -> Ptr GLsizei -> GLsizei -> IO ())
-
-drawElements :: PrimitiveMode -> NumArrayIndices -> DataType -> Ptr a -> IO ()
-drawElements m c = glDrawElements (marshalPrimitiveMode m) c . marshalDataType
-
-foreign import CALLCONV unsafe "glDrawElements" glDrawElements ::
-   GLenum -> GLsizei -> GLenum -> Ptr a -> IO ()
-
-multiDrawElements ::
-      PrimitiveMode -> Ptr NumArrayIndices -> DataType -> Ptr (Ptr a)
-   -> NumIndexBlocks -> IO ()
-multiDrawElements m c =
-   glMultiDrawElementsEXT (marshalPrimitiveMode m) c . marshalDataType
-
-EXTENSION_ENTRY("GL_EXT_multi_draw_arrays or OpenGL 1.4",glMultiDrawElementsEXT,GLenum -> Ptr GLsizei -> GLenum -> Ptr (Ptr a) -> GLsizei -> IO ())
-
-drawRangeElements ::
-      PrimitiveMode -> (ArrayIndex, ArrayIndex) -> NumArrayIndices -> DataType
-   -> Ptr a -> IO ()
-drawRangeElements m (s, e) c =
-   glDrawRangeElementsEXT (marshalPrimitiveMode m) (fromIntegral s)
-                          (fromIntegral e) c . marshalDataType
-
-EXTENSION_ENTRY("GL_EXT_draw_range_elements or OpenGL 1.2",glDrawRangeElementsEXT,GLenum -> GLuint -> GLuint -> GLsizei -> GLenum -> Ptr a -> IO ())
-
-maxElementsVertices :: GettableStateVar NumArrayIndices
-maxElementsVertices = makeGettableStateVar (getSizei1 id GetMaxElementsVertices)
-
-maxElementsIndices :: GettableStateVar NumArrayIndices
-maxElementsIndices = makeGettableStateVar (getSizei1 id GetMaxElementsIndices)
-
---------------------------------------------------------------------------------
-
-lockArrays :: StateVar (Maybe (ArrayIndex, NumArrayIndices))
-lockArrays = makeStateVar getLockArrays setLockArrays
-
-getLockArrays :: IO (Maybe (ArrayIndex, NumArrayIndices))
-getLockArrays = do
-   count <- getInteger1 fromIntegral GetArrayElementLockCount
-   if count > 0
-      then do first <- getInteger1 id GetArrayElementLockFirst
-              return $ Just (first, count)
-      else return Nothing
-
-setLockArrays :: Maybe (ArrayIndex, NumArrayIndices) -> IO ()
-setLockArrays = maybe glUnlockArraysEXT (uncurry glLockArraysEXT)
-
-EXTENSION_ENTRY("GL_EXT_compiled_vertex_array",glLockArraysEXT,GLint -> GLsizei -> IO ())
-EXTENSION_ENTRY("GL_EXT_compiled_vertex_array",glUnlockArraysEXT,IO ())
-
---------------------------------------------------------------------------------
-
--- We almost could use makeStateVarMaybe below, but, alas, this is client state.
-
-primitiveRestartIndex :: StateVar (Maybe ArrayIndex)
-primitiveRestartIndex =
-   makeStateVar getPrimitiverestartIndex setPrimitiverestartIndex
-
-getPrimitiverestartIndex :: IO (Maybe ArrayIndex)
-getPrimitiverestartIndex = do
-   state <- get (makeCapability CapPrimitiveRestart)
-   if state == Enabled
-      then fmap Just $ getInteger1 fromIntegral GetPrimitiveRestartIndex
-      else return Nothing
-
-setPrimitiverestartIndex :: Maybe ArrayIndex -> IO ()
-setPrimitiverestartIndex maybeIdx = case maybeIdx of
-   Nothing  -> glDisableClientState primitiveRestartNV
-   Just idx -> do glEnableClientState primitiveRestartNV
-                  glPrimitiveRestartIndexNV (fromIntegral idx)
-   where primitiveRestartNV = 0x8558   -- ToDo: HACK!
-
-EXTENSION_ENTRY("GL_NV_primitive_restart",glPrimitiveRestartIndexNV,GLuint -> IO ())
-
---------------------------------------------------------------------------------
-
-data GetPointervPName =
-     VertexArrayPointer
-   | NormalArrayPointer
-   | ColorArrayPointer
-   | IndexArrayPointer
-   | TextureCoordArrayPointer
-   | EdgeFlagArrayPointer
-   | FogCoordArrayPointer
-   | SecondaryColorArrayPointer
-   | FeedbackBufferPointer
-   | SelectionBufferPointer
-   | WeightArrayPointer
-   | MatrixIndexArrayPointer
-
-marshalGetPointervPName :: GetPointervPName -> GLenum
-marshalGetPointervPName x = case x of
-   VertexArrayPointer -> 0x808e
-   NormalArrayPointer -> 0x808f
-   ColorArrayPointer -> 0x8090
-   IndexArrayPointer -> 0x8091
-   TextureCoordArrayPointer -> 0x8092
-   EdgeFlagArrayPointer -> 0x8093
-   FogCoordArrayPointer -> 0x8456
-   SecondaryColorArrayPointer -> 0x845d
-   FeedbackBufferPointer -> 0xdf0
-   SelectionBufferPointer -> 0xdf3
-   WeightArrayPointer -> 0x86ac
-   MatrixIndexArrayPointer -> 0x8849
-
---------------------------------------------------------------------------------
-
-getPointer :: GetPointervPName -> IO (Ptr a)
-getPointer n = alloca $ \buf -> do
-   glGetPointerv (marshalGetPointervPName n) buf
-   peek buf
-
-foreign import CALLCONV unsafe "glGetPointerv" glGetPointerv ::
-   GLenum -> Ptr (Ptr a) -> IO ()
-
---------------------------------------------------------------------------------
-
-vertexAttribPointer :: AttribLocation -> StateVar (IntegerHandling, VertexArrayDescriptor a)
-vertexAttribPointer location = undefined
-   makeStateVar (getVertexAttribPointer_ location) (setVertexAttribPointer location)
-
-getVertexAttribPointer_ :: AttribLocation -> IO (IntegerHandling, VertexArrayDescriptor a)
-getVertexAttribPointer_ location = do
-   i <- getVertexAttribBoolean1 unmarshalGLboolean location GetVertexAttribArrayInteger
-   h <- if i
-           then return KeepIntegral
-           else do f <- getVertexAttribBoolean1 unmarshalGLboolean location GetVertexAttribArrayNormalized
-                   return $ if f then ToNormalizedFloat else ToFloat
-   n <- getVertexAttribInteger1 id location GetVertexAttribArraySize
-   d <- getVertexAttribEnum1 unmarshalDataType location GetVertexAttribArrayType
-   s <- getVertexAttribInteger1 fromIntegral location GetVertexAttribArrayStride
-   p <- getVertexAttribPointer location VertexAttribArrayPointer
-   return (h, VertexArrayDescriptor n d s p)
-
-setVertexAttribPointer :: AttribLocation -> (IntegerHandling, VertexArrayDescriptor a) -> IO ()
-setVertexAttribPointer location (h, VertexArrayDescriptor n d s p) = case h of
-   ToFloat -> glVertexAttribPointerARB location n md (marshalGLboolean False) s p
-   ToNormalizedFloat -> glVertexAttribPointerARB location n md (marshalGLboolean True) s p
-   KeepIntegral -> glVertexAttribIPointer location n md s p
-  where md = marshalDataType d
-
-EXTENSION_ENTRY("GL_ARB_vertex_shader or OpenGL 2.0",glVertexAttribPointerARB,AttribLocation -> GLint -> GLenum -> GLboolean -> GLsizei -> Ptr a -> IO ())
-EXTENSION_ENTRY("GL_EXT_gpu_shader4 or OpenGL 3.0",glVertexAttribIPointer,AttribLocation -> GLint -> GLenum -> GLsizei -> Ptr a -> IO ())
-
---------------------------------------------------------------------------------
-
-vertexAttribArray :: AttribLocation -> StateVar Capability
-vertexAttribArray location =
-   makeStateVar (getVertexAttribArray location) (flip setVertexAttribArray location)
-
-getVertexAttribArray :: AttribLocation -> IO Capability
-getVertexAttribArray location =
-   getVertexAttribBoolean1 unmarshalCapability location GetVertexAttribArrayEnabled
-
-setVertexAttribArray :: Capability -> AttribLocation -> IO ()
-setVertexAttribArray Disabled = glDisableVertexAttribArrayARB
-setVertexAttribArray Enabled = glEnableVertexAttribArrayARB
-
-EXTENSION_ENTRY("GL_ARB_vertex_shader or OpenGL 2.0",glDisableVertexAttribArrayARB,AttribLocation -> IO ())
-EXTENSION_ENTRY("GL_ARB_vertex_shader or OpenGL 2.0",glEnableVertexAttribArrayARB,AttribLocation -> IO ())
diff --git a/Graphics/Rendering/OpenGL/GL/VertexAttributes.hs b/Graphics/Rendering/OpenGL/GL/VertexAttributes.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/VertexAttributes.hs
+++ /dev/null
@@ -1,366 +0,0 @@
--- #hide
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.VertexAttributes
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This is a purely internal module for auxiliary vertex attributes.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.VertexAttributes (
-   TexCoord1(..), TexCoord2(..), TexCoord3(..), TexCoord4(..),
-   Normal3(..),
-   FogCoord1(..),
-   Color3(..), Color4(..),
-   Index1(..)
-) where
-
-import Control.Applicative ( Applicative(..) )
-import Control.Monad ( ap )
-import Data.Foldable ( Foldable(..) )
-import Data.Ix ( Ix )
-import Data.Traversable ( Traversable(..) )
-import Data.Typeable (
-   Typeable(..), mkTyCon, mkTyConApp, Typeable1(..), typeOfDefault )
-import Foreign.Ptr ( castPtr )
-import Foreign.Storable ( Storable(..) )
-import Graphics.Rendering.OpenGL.GL.PeekPoke (
-   peek1, poke2, poke3, poke4, poke1, peek2, peek3, peek4 )
-
---------------------------------------------------------------------------------
-
--- | Texture coordinates with /t/=0, /r/=0, and /q/=1.
-newtype TexCoord1 a = TexCoord1 a
-   deriving (Eq, Ord, Ix, Bounded, Show, Read)
-
-instance Functor TexCoord1 where
-   fmap f (TexCoord1 x) = TexCoord1 (f x)
-
-instance Applicative TexCoord1 where
-   pure a = TexCoord1 a
-   TexCoord1 f <*> TexCoord1 x = TexCoord1 (f x)
-
-instance Foldable TexCoord1 where
-   foldr f a (TexCoord1 x) = x `f ` a
-   foldl f a (TexCoord1 x) = a `f` x
-   foldr1 _ (TexCoord1 x) = x
-   foldl1 _ (TexCoord1 x) = x
-
-instance Traversable TexCoord1 where
-   traverse f (TexCoord1 x) = pure TexCoord1 <*> f x
-   sequenceA (TexCoord1 x) =  pure TexCoord1 <*> x
-   mapM f (TexCoord1 x) = return TexCoord1 `ap` f x
-   sequence (TexCoord1 x) = return TexCoord1 `ap` x
-
-instance Typeable1 TexCoord1 where
-   typeOf1 _ = mkTyConApp (mkTyCon "TexCoord1") []
-
-instance Typeable a => Typeable (TexCoord1 a) where
-   typeOf = typeOfDefault
-
-instance Storable a => Storable (TexCoord1 a) where
-   sizeOf    ~(TexCoord1 s) = sizeOf s
-   alignment ~(TexCoord1 s) = alignment s
-   peek = peek1 TexCoord1 . castPtr
-   poke ptr (TexCoord1 s) = poke1 (castPtr ptr) s
-
---------------------------------------------------------------------------------
-
--- | Texture coordinates with /r/=0 and /q/=1.
-data TexCoord2 a = TexCoord2 !a !a
-   deriving (Eq, Ord, Ix, Bounded, Show, Read)
-
-instance Functor TexCoord2 where
-   fmap f (TexCoord2 x y) = TexCoord2 (f x) (f y)
-
-instance Applicative TexCoord2 where
-   pure a = TexCoord2 a a
-   TexCoord2 f g <*> TexCoord2 x y = TexCoord2 (f x) (g y)
-
-instance Foldable TexCoord2 where
-   foldr f a (TexCoord2 x y) = x `f ` (y `f` a)
-   foldl f a (TexCoord2 x y) = (a `f` x) `f` y
-   foldr1 f (TexCoord2 x y) = x `f` y
-   foldl1 f (TexCoord2 x y) = x `f` y
-
-instance Traversable TexCoord2 where
-   traverse f (TexCoord2 x y) = pure TexCoord2 <*> f x <*> f y
-   sequenceA (TexCoord2 x y) =  pure TexCoord2 <*> x <*> y
-   mapM f (TexCoord2 x y) = return TexCoord2 `ap` f x `ap` f y
-   sequence (TexCoord2 x y) = return TexCoord2 `ap` x `ap` y
-
-instance Typeable1 TexCoord2 where
-   typeOf1 _ = mkTyConApp (mkTyCon "TexCoord2") []
-
-instance Typeable a => Typeable (TexCoord2 a) where
-   typeOf = typeOfDefault
-
-instance Storable a => Storable (TexCoord2 a) where
-   sizeOf ~(TexCoord2 x _) = 2 * sizeOf x
-   alignment ~(TexCoord2 x _) = alignment x
-   peek = peek2 TexCoord2 . castPtr
-   poke ptr (TexCoord2 x y) = poke2 (castPtr ptr) x y
-
---------------------------------------------------------------------------------
-
--- | Texture coordinates with /q/=1.
-data TexCoord3 a = TexCoord3 !a !a !a
-   deriving (Eq, Ord, Ix, Bounded, Show, Read)
-
-instance Functor TexCoord3 where
-   fmap f (TexCoord3 x y z) = TexCoord3 (f x) (f y) (f z)
-
-instance Applicative TexCoord3 where
-   pure a = TexCoord3 a a a
-   TexCoord3 f g h <*> TexCoord3 x y z = TexCoord3 (f x) (g y) (h z)
-
-instance Foldable TexCoord3 where
-   foldr f a (TexCoord3 x y z) = x `f ` (y `f` (z `f` a))
-   foldl f a (TexCoord3 x y z) = ((a `f` x) `f` y) `f` z
-   foldr1 f (TexCoord3 x y z) = x `f` (y `f` z)
-   foldl1 f (TexCoord3 x y z) = (x `f` y) `f` z
-
-instance Traversable TexCoord3 where
-   traverse f (TexCoord3 x y z) = pure TexCoord3 <*> f x <*> f y <*> f z
-   sequenceA (TexCoord3 x y z) =  pure TexCoord3 <*> x <*> y <*> z
-   mapM f (TexCoord3 x y z) = return TexCoord3 `ap` f x `ap` f y `ap` f z
-   sequence (TexCoord3 x y z) = return TexCoord3 `ap` x `ap` y `ap` z
-
-instance Typeable1 TexCoord3 where
-   typeOf1 _ = mkTyConApp (mkTyCon "TexCoord3") []
-
-instance Typeable a => Typeable (TexCoord3 a) where
-   typeOf = typeOfDefault
-
-instance Storable a => Storable (TexCoord3 a) where
-   sizeOf ~(TexCoord3 x _ _) = 3 * sizeOf x
-   alignment ~(TexCoord3 x _ _) = alignment x
-   peek = peek3 TexCoord3 . castPtr
-   poke ptr (TexCoord3 x y z) = poke3 (castPtr ptr) x y z
-
---------------------------------------------------------------------------------
-
--- | Fully-fledged four-dimensional texture coordinates.
-data TexCoord4 a = TexCoord4 !a !a !a !a
-   deriving (Eq, Ord, Ix, Bounded, Show, Read)
-
-instance Functor TexCoord4 where
-   fmap f (TexCoord4 x y z w) = TexCoord4 (f x) (f y) (f z) (f w)
-
-instance Applicative TexCoord4 where
-   pure a = TexCoord4 a a a a
-   TexCoord4 f g h i <*> TexCoord4 x y z w = TexCoord4 (f x) (g y) (h z) (i w)
-
-instance Foldable TexCoord4 where
-   foldr f a (TexCoord4 x y z w) = x `f ` (y `f` (z `f` (w `f` a)))
-   foldl f a (TexCoord4 x y z w) = (((a `f` x) `f` y) `f` z) `f` w
-   foldr1 f (TexCoord4 x y z w) = x `f` (y `f` (z `f` w))
-   foldl1 f (TexCoord4 x y z w) = ((x `f` y) `f` z) `f` w
-
-instance Traversable TexCoord4 where
-   traverse f (TexCoord4 x y z w) = pure TexCoord4 <*> f x <*> f y <*> f z <*> f w
-   sequenceA (TexCoord4 x y z w) =  pure TexCoord4 <*> x <*> y <*> z <*> w
-   mapM f (TexCoord4 x y z w) = return TexCoord4 `ap` f x `ap` f y `ap` f z `ap` f w
-   sequence (TexCoord4 x y z w) = return TexCoord4 `ap` x `ap` y `ap` z `ap` w
-
-instance Typeable1 TexCoord4 where
-   typeOf1 _ = mkTyConApp (mkTyCon "TexCoord4") []
-
-instance Typeable a => Typeable (TexCoord4 a) where
-   typeOf = typeOfDefault
-
-instance Storable a => Storable (TexCoord4 a) where
-   sizeOf ~(TexCoord4 x _ _ _) = 4 * sizeOf x
-   alignment ~(TexCoord4 x _ _ _) = alignment x
-   peek = peek4 TexCoord4 . castPtr
-   poke ptr (TexCoord4 x y z w) = poke4 (castPtr ptr) x y z w
-
---------------------------------------------------------------------------------
-
--- A three-dimensional normal.
-data Normal3 a = Normal3 !a !a !a
-   deriving (Eq, Ord, Ix, Bounded, Show, Read) 
-instance Functor Normal3 where
-   fmap f (Normal3 x y z) = Normal3 (f x) (f y) (f z)
-
-instance Applicative Normal3 where
-   pure a = Normal3 a a a
-   Normal3 f g h <*> Normal3 x y z = Normal3 (f x) (g y) (h z)
-
-instance Foldable Normal3 where
-   foldr f a (Normal3 x y z) = x `f ` (y `f` (z `f` a))
-   foldl f a (Normal3 x y z) = ((a `f` x) `f` y) `f` z
-   foldr1 f (Normal3 x y z) = x `f` (y `f` z)
-   foldl1 f (Normal3 x y z) = (x `f` y) `f` z
-
-instance Traversable Normal3 where
-   traverse f (Normal3 x y z) = pure Normal3 <*> f x <*> f y <*> f z
-   sequenceA (Normal3 x y z) =  pure Normal3 <*> x <*> y <*> z
-   mapM f (Normal3 x y z) = return Normal3 `ap` f x `ap` f y `ap` f z
-   sequence (Normal3 x y z) = return Normal3 `ap` x `ap` y `ap` z
-
-instance Typeable1 Normal3 where
-   typeOf1 _ = mkTyConApp (mkTyCon "Normal3") []
-
-instance Typeable a => Typeable (Normal3 a) where
-   typeOf = typeOfDefault
-
-instance Storable a => Storable (Normal3 a) where
-   sizeOf ~(Normal3 x _ _) = 3 * sizeOf x
-   alignment ~(Normal3 x _ _) = alignment x
-   peek = peek3 Normal3 . castPtr
-   poke ptr (Normal3 x y z) = poke3 (castPtr ptr) x y z
-
---------------------------------------------------------------------------------
-
--- | A fog coordinate.
-newtype FogCoord1 a = FogCoord1 a
-   deriving (Eq, Ord, Ix, Bounded, Show, Read)
-
-instance Functor FogCoord1 where
-   fmap f (FogCoord1 x) = FogCoord1 (f x)
-
-instance Applicative FogCoord1 where
-   pure a = FogCoord1 a
-   FogCoord1 f <*> FogCoord1 x = FogCoord1 (f x)
-
-instance Foldable FogCoord1 where
-   foldr f a (FogCoord1 x) = x `f ` a
-   foldl f a (FogCoord1 x)  = a `f` x
-   foldr1 _ (FogCoord1 x) = x
-   foldl1 _ (FogCoord1 x) = x
-
-instance Traversable FogCoord1 where
-   traverse f (FogCoord1 x) = pure FogCoord1 <*> f x
-   sequenceA (FogCoord1 x) =  pure FogCoord1 <*> x
-   mapM f (FogCoord1 x) = return FogCoord1 `ap` f x
-   sequence (FogCoord1 x) = return FogCoord1 `ap` x
-
-instance Typeable1 FogCoord1 where
-   typeOf1 _ = mkTyConApp (mkTyCon "FogCoord1") []
-
-instance Typeable a => Typeable (FogCoord1 a) where
-   typeOf = typeOfDefault
-
-instance Storable a => Storable (FogCoord1 a) where
-   sizeOf    ~(FogCoord1 s) = sizeOf s
-   alignment ~(FogCoord1 s) = alignment s
-   peek = peek1 FogCoord1 . castPtr
-   poke ptr (FogCoord1 s) = poke1 (castPtr ptr) s
-
---------------------------------------------------------------------------------
-
--- An RGBA color with /A/=1.
-data Color3 a = Color3 !a !a !a
-   deriving (Eq, Ord, Ix, Bounded, Show, Read)
-
-instance Functor Color3 where
-   fmap f (Color3 x y z) = Color3 (f x) (f y) (f z)
-
-instance Applicative Color3 where
-   pure a = Color3 a a a
-   Color3 f g h <*> Color3 x y z = Color3 (f x) (g y) (h z)
-
-instance Foldable Color3 where
-   foldr f a (Color3 x y z) = x `f ` (y `f` (z `f` a))
-   foldl f a (Color3 x y z) = ((a `f` x) `f` y) `f` z
-   foldr1 f (Color3 x y z) = x `f` (y `f` z)
-   foldl1 f (Color3 x y z) = (x `f` y) `f` z
-
-instance Traversable Color3 where
-   traverse f (Color3 x y z) = pure Color3 <*> f x <*> f y <*> f z
-   sequenceA (Color3 x y z) =  pure Color3 <*> x <*> y <*> z
-   mapM f (Color3 x y z) = return Color3 `ap` f x `ap` f y `ap` f z
-   sequence (Color3 x y z) = return Color3 `ap` x `ap` y `ap` z
-
-instance Typeable1 Color3 where
-   typeOf1 _ = mkTyConApp (mkTyCon "Color3") []
-
-instance Typeable a => Typeable (Color3 a) where
-   typeOf = typeOfDefault
-
-instance Storable a => Storable (Color3 a) where
-   sizeOf ~(Color3 x _ _) = 3 * sizeOf x
-   alignment ~(Color3 x _ _) = alignment x
-   peek = peek3 Color3 . castPtr
-   poke ptr (Color3 x y z) = poke3 (castPtr ptr) x y z
-
---------------------------------------------------------------------------------
-
--- | A fully-fledged RGBA color.
-data Color4 a = Color4 !a !a !a !a
-   deriving (Eq, Ord, Ix, Bounded, Show, Read)
-
-instance Functor Color4 where
-   fmap f (Color4 x y z w) = Color4 (f x) (f y) (f z) (f w)
-
-instance Applicative Color4 where
-   pure a = Color4 a a a a
-   Color4 f g h i <*> Color4 x y z w = Color4 (f x) (g y) (h z) (i w)
-
-instance Foldable Color4 where
-   foldr f a (Color4 x y z w) = x `f ` (y `f` (z `f` (w `f` a)))
-   foldl f a (Color4 x y z w) = (((a `f` x) `f` y) `f` z) `f` w
-   foldr1 f (Color4 x y z w) = x `f` (y `f` (z `f` w))
-   foldl1 f (Color4 x y z w) = ((x `f` y) `f` z) `f` w
-
-instance Traversable Color4 where
-   traverse f (Color4 x y z w) = pure Color4 <*> f x <*> f y <*> f z <*> f w
-   sequenceA (Color4 x y z w) =  pure Color4 <*> x <*> y <*> z <*> w
-   mapM f (Color4 x y z w) = return Color4 `ap` f x `ap` f y `ap` f z `ap` f w
-   sequence (Color4 x y z w) = return Color4 `ap` x `ap` y `ap` z `ap` w
-
-instance Typeable1 Color4 where
-   typeOf1 _ = mkTyConApp (mkTyCon "Color4") []
-
-instance Typeable a => Typeable (Color4 a) where
-   typeOf = typeOfDefault
-
-instance Storable a => Storable (Color4 a) where
-   sizeOf ~(Color4 x _ _ _) = 4 * sizeOf x
-   alignment ~(Color4 x _ _ _) = alignment x
-   peek = peek4 Color4 . castPtr
-   poke ptr (Color4 x y z w) = poke4 (castPtr ptr) x y z w
-
---------------------------------------------------------------------------------
-
--- | A color index.
-newtype Index1 a = Index1 a
-   deriving (Eq, Ord, Ix, Bounded, Show, Read)
-
-instance Functor Index1 where
-   fmap f (Index1 x) = Index1 (f x)
-
-instance Applicative Index1 where
-   pure a = Index1 a
-   Index1 f <*> Index1 x = Index1 (f x)
-
-instance Foldable Index1 where
-   foldr f a (Index1 x) = x `f ` a
-   foldl f a (Index1 x)  = a `f` x
-   foldr1 _ (Index1 x) = x
-   foldl1 _ (Index1 x) = x
-
-instance Traversable Index1 where
-   traverse f (Index1 x) = pure Index1 <*> f x
-   sequenceA (Index1 x) =  pure Index1 <*> x
-   mapM f (Index1 x) = return Index1 `ap` f x
-   sequence (Index1 x) = return Index1 `ap` x
-
-instance Typeable1 Index1 where
-   typeOf1 _ = mkTyConApp (mkTyCon "Index1") []
-
-instance Typeable a => Typeable (Index1 a) where
-   typeOf = typeOfDefault
-
-instance Storable a => Storable (Index1 a) where
-   sizeOf    ~(Index1 s) = sizeOf s
-   alignment ~(Index1 s) = alignment s
-   peek = peek1 Index1 . castPtr
-   poke ptr (Index1 s) = poke1 (castPtr ptr) s
diff --git a/Graphics/Rendering/OpenGL/GL/VertexSpec.hs b/Graphics/Rendering/OpenGL/GL/VertexSpec.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GL/VertexSpec.hs
+++ /dev/null
@@ -1,1558 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GL.VertexSpec
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to section 2.7 (Vertex Specification) of the
--- OpenGL 2.1 specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GL.VertexSpec (
-   -- * Vertex Coordinates
-   Vertex(..),
-   VertexComponent,
-   Vertex1(..), Vertex2(..), Vertex3(..), Vertex4(..),
-
-   -- * Auxiliary Vertex Attributes
-   -- $AuxiliaryVertexAttributes
-
-   -- ** Texture Coordinates
-   currentTextureCoords, TexCoord(..),
-   TexCoordComponent,
-   TexCoord1(..), TexCoord2(..), TexCoord3(..), TexCoord4(..),
-
-   -- ** Normal
-   currentNormal, Normal(..),
-   NormalComponent,
-   Normal3(..),
-
-   -- ** Fog Coordinate
-   currentFogCoord, FogCoord(..),
-   FogCoordComponent,
-   FogCoord1(..),
-
-   -- ** Color and Secondary Color
-   rgbaMode,
-   currentColor, Color(..),
-   currentSecondaryColor, SecondaryColor(..),
-   ColorComponent,
-   Color3(..), Color4(..),
-
-   currentIndex, Index(..),
-   IndexComponent,
-   Index1(..),
-
-   -- * Generic Vertex Attributes
-   IntegerHandling(..), AttribLocation(..),
-   currentVertexAttrib, currentVertexAttribI, currentVertexAttribIu,
-   VertexAttrib(..), VertexAttribComponent(..),
-
-   -- * Texture Units
-   TextureUnit(..), maxTextureUnit
-) where
-
-import Data.Int
-import Data.Word
-import Foreign.Marshal.Array ( allocaArray )
-import Foreign.Ptr ( Ptr, castPtr )
-import Foreign.Storable ( Storable(..) )
-import Graphics.Rendering.OpenGL.GL.BasicTypes (
-   GLenum, GLbyte, GLshort, GLint, GLubyte, GLushort, GLuint, GLfloat,
-   GLdouble )
-import Graphics.Rendering.OpenGL.GL.Extensions (
-   FunPtr, unsafePerformIO, Invoker, getProcAddress )
-import Graphics.Rendering.OpenGL.GL.GLboolean ( unmarshalGLboolean )
-import Graphics.Rendering.OpenGL.GL.PeekPoke (
-   poke4, peek1M, peek2M, peek3M, peek4M )
-import Graphics.Rendering.OpenGL.GL.QueryUtils (
-   AttribLocation(..),
-   GetPName(GetCurrentTextureCoords, GetCurrentNormal, GetCurrentFogCoord,
-            GetCurrentColor, GetCurrentSecondaryColor, GetCurrentIndex,
-            GetMaxTextureUnits,GetRGBAMode),
-   getBoolean1, getInteger1, getEnum1, getFloat1, getFloat3, getFloat4,
-   GetVertexAttribPName(GetCurrentVertexAttrib),
-   getVertexAttribFloat4, getVertexAttribIInteger4, getVertexAttribIuInteger4  )
-import Graphics.Rendering.OpenGL.GL.StateVar (
-   GettableStateVar, makeGettableStateVar, StateVar, makeStateVar )
-import Graphics.Rendering.OpenGL.GL.Tensor (
-   Vertex1(..), Vertex2(..), Vertex3(..), Vertex4(..),
-   Vector1(..), Vector2(..), Vector3(..), Vector4(..) )
-import Graphics.Rendering.OpenGL.GL.Texturing.TextureUnit (
-   TextureUnit(..), marshalTextureUnit, unmarshalTextureUnit )
-import Graphics.Rendering.OpenGL.GL.VertexAttributes (
-   TexCoord1(..), TexCoord2(..), TexCoord3(..), TexCoord4(..),
-   Normal3(..), FogCoord1(..), Color3(..), Color4(..), Index1(..) )
-
---------------------------------------------------------------------------------
-
-#include "HsOpenGLExt.h"
-#include "HsOpenGLTypes.h"
-
---------------------------------------------------------------------------------
-
--- | The class of all types which can be used as a vertex coordinate.
-
-class VertexComponent a where
-   vertex2 :: a -> a -> IO ()
-   vertex3 :: a -> a -> a -> IO ()
-   vertex4 :: a -> a -> a -> a -> IO ()
-
-   vertex2v :: Ptr a -> IO ()
-   vertex3v :: Ptr a -> IO ()
-   vertex4v :: Ptr a -> IO ()
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "glVertex2s" glVertex2s ::
-   GLshort -> GLshort -> IO ()
-
-foreign import CALLCONV unsafe "glVertex3s" glVertex3s ::
-   GLshort -> GLshort -> GLshort -> IO ()
-
-foreign import CALLCONV unsafe "glVertex4s" glVertex4s ::
-   GLshort -> GLshort -> GLshort -> GLshort -> IO ()
-
-foreign import CALLCONV unsafe "glVertex2sv" glVertex2sv ::
-   Ptr GLshort -> IO ()
-
-foreign import CALLCONV unsafe "glVertex3sv" glVertex3sv ::
-   Ptr GLshort -> IO ()
-
-foreign import CALLCONV unsafe "glVertex4sv" glVertex4sv ::
-   Ptr GLshort -> IO ()
-
-instance VertexComponent GLshort_ where
-   vertex2 = glVertex2s
-   vertex3 = glVertex3s
-   vertex4 = glVertex4s
-
-   vertex2v = glVertex2sv
-   vertex3v = glVertex3sv
-   vertex4v = glVertex4sv
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "glVertex2i" glVertex2i ::
-   GLint -> GLint -> IO ()
-
-foreign import CALLCONV unsafe "glVertex3i" glVertex3i ::
-   GLint -> GLint -> GLint -> IO ()
-
-foreign import CALLCONV unsafe "glVertex4i" glVertex4i ::
-   GLint -> GLint -> GLint -> GLint -> IO ()
-
-foreign import CALLCONV unsafe "glVertex2iv" glVertex2iv ::
-   Ptr GLint -> IO ()
-
-foreign import CALLCONV unsafe "glVertex3iv" glVertex3iv ::
-   Ptr GLint -> IO ()
-
-foreign import CALLCONV unsafe "glVertex4iv" glVertex4iv ::
-   Ptr GLint -> IO ()
-
-instance VertexComponent GLint_ where
-   vertex2 = glVertex2i
-   vertex3 = glVertex3i
-   vertex4 = glVertex4i
-
-   vertex2v = glVertex2iv
-   vertex3v = glVertex3iv
-   vertex4v = glVertex4iv
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "glVertex2f" glVertex2f ::
-   GLfloat -> GLfloat -> IO ()
-
-foreign import CALLCONV unsafe "glVertex3f" glVertex3f ::
-   GLfloat -> GLfloat -> GLfloat -> IO ()
-
-foreign import CALLCONV unsafe "glVertex4f" glVertex4f ::
-   GLfloat -> GLfloat -> GLfloat -> GLfloat -> IO ()
-
-foreign import CALLCONV unsafe "glVertex2fv" glVertex2fv ::
-   Ptr GLfloat -> IO ()
-
-foreign import CALLCONV unsafe "glVertex3fv" glVertex3fv ::
-   Ptr GLfloat -> IO ()
-
-foreign import CALLCONV unsafe "glVertex4fv" glVertex4fv ::
-   Ptr GLfloat -> IO ()
-
-instance VertexComponent GLfloat_ where
-   vertex2 = glVertex2f
-   vertex3 = glVertex3f
-   vertex4 = glVertex4f
-
-   vertex2v = glVertex2fv
-   vertex3v = glVertex3fv
-   vertex4v = glVertex4fv
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "glVertex2d" glVertex2d ::
-   GLdouble -> GLdouble -> IO ()
-
-foreign import CALLCONV unsafe "glVertex3d" glVertex3d ::
-   GLdouble -> GLdouble -> GLdouble -> IO ()
-
-foreign import CALLCONV unsafe "glVertex4d" glVertex4d ::
-   GLdouble -> GLdouble -> GLdouble -> GLdouble -> IO ()
-
-foreign import CALLCONV unsafe "glVertex2dv" glVertex2dv ::
-   Ptr GLdouble -> IO ()
-
-foreign import CALLCONV unsafe "glVertex3dv" glVertex3dv ::
-   Ptr GLdouble -> IO ()
-
-foreign import CALLCONV unsafe "glVertex4dv" glVertex4dv ::
-   Ptr GLdouble -> IO ()
-
-instance VertexComponent GLdouble_ where
-   vertex2 = glVertex2d
-   vertex3 = glVertex3d
-   vertex4 = glVertex4d
-
-   vertex2v = glVertex2dv
-   vertex3v = glVertex3dv
-   vertex4v = glVertex4dv
-
---------------------------------------------------------------------------------
-
--- | Specify the (/x/, /y/, /z/, /w/) coordinates of a four-dimensional vertex.
--- This must only be done during
--- 'Graphics.Rendering.OpenGL.GL.BeginEnd.renderPrimitive', otherwise the
--- behaviour is unspecified. The current values of the auxiliary vertex
--- attributes are associated with the vertex.
--- 
--- Note that there is no such thing as a \"current vertex\" which could be
--- retrieved.
-
-class Vertex a where
-   vertex  ::     a -> IO ()
-   vertexv :: Ptr a -> IO ()
-
-instance VertexComponent a => Vertex (Vertex2 a) where
-   vertex (Vertex2 x y) = vertex2 x y
-   vertexv = vertex2v . (castPtr :: Ptr (Vertex2 b) -> Ptr b)
-
-instance VertexComponent a => Vertex (Vertex3 a) where
-   vertex (Vertex3 x y z) = vertex3 x y z
-   vertexv = vertex3v . (castPtr :: Ptr (Vertex3 b) -> Ptr b)
-
-instance VertexComponent a => Vertex (Vertex4 a) where
-   vertex (Vertex4 x y z w) = vertex4 x y z w
-   vertexv = vertex4v . (castPtr :: Ptr (Vertex4 b) -> Ptr b)
-
---------------------------------------------------------------------------------
--- $AuxiliaryVertexAttributes
--- Apart from its coordinates in four-dimensional space, every vertex has
--- associated /auxiliary attributes/: Its texture coordinates, a normal, a
--- fog coordinate, and a color plus a secondary color. For every attribute, the
--- OpenGL state contains its current value, which can be changed at any time.
---
--- Every attribute has a \"natural\" format via which it can be manipulated
--- directly as part of the OpenGL state, e.g. the current texture coordinates
--- are internally handled as @'TexCoord4' 'GLfloat'@. Different formats are
--- converted to this format, e.g. the /s/, /r/, and /t/ coordinates of a
--- @'TexCoord3' 'GLint'@ are converted to floating point values and a /q/
--- coordinate of 1.0 is implicitly assumed.
---
--- Consequently, the vast majority of classes, functions, and data types in this
--- module are for convenience only and offer no additional functionality.
-
---------------------------------------------------------------------------------
-
--- | The current texture coordinates (/s/, /t/, /r/, /q/) for the current
--- texture unit (see 'Graphics.Rendering.OpenGL.GL.CoordTrans.activeTexture').
--- The initial value is (0,0,0,1) for all texture units.
-
-currentTextureCoords :: StateVar (TexCoord4 GLfloat)
-currentTextureCoords =
-   makeStateVar (getFloat4 TexCoord4 GetCurrentTextureCoords) texCoord
-
---------------------------------------------------------------------------------
-
--- | The class of all types which can be used as a texture coordinate.
-
-class TexCoordComponent a where
-   texCoord1 :: a -> IO ()
-   texCoord2 :: a -> a -> IO ()
-   texCoord3 :: a -> a -> a -> IO ()
-   texCoord4 :: a -> a -> a -> a -> IO ()
-
-   texCoord1v :: Ptr a -> IO ()
-   texCoord2v :: Ptr a -> IO ()
-   texCoord3v :: Ptr a -> IO ()
-   texCoord4v :: Ptr a -> IO ()
-
-   multiTexCoord1 :: GLenum -> a -> IO ()
-   multiTexCoord2 :: GLenum -> a -> a -> IO ()
-   multiTexCoord3 :: GLenum -> a -> a -> a -> IO ()
-   multiTexCoord4 :: GLenum -> a -> a -> a -> a -> IO ()
-
-   multiTexCoord1v :: GLenum -> Ptr a -> IO ()
-   multiTexCoord2v :: GLenum -> Ptr a -> IO ()
-   multiTexCoord3v :: GLenum -> Ptr a -> IO ()
-   multiTexCoord4v :: GLenum -> Ptr a -> IO ()
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "glTexCoord1s" glTexCoord1s ::
-   GLshort -> IO ()
-
-foreign import CALLCONV unsafe "glTexCoord2s" glTexCoord2s ::
-   GLshort -> GLshort -> IO ()
-
-foreign import CALLCONV unsafe "glTexCoord3s" glTexCoord3s ::
-   GLshort -> GLshort -> GLshort -> IO ()
-
-foreign import CALLCONV unsafe "glTexCoord4s" glTexCoord4s ::
-   GLshort -> GLshort -> GLshort -> GLshort -> IO ()
-
-foreign import CALLCONV unsafe "glTexCoord1sv" glTexCoord1sv ::
-   Ptr GLshort -> IO ()
-
-foreign import CALLCONV unsafe "glTexCoord2sv" glTexCoord2sv ::
-   Ptr GLshort -> IO ()
-
-foreign import CALLCONV unsafe "glTexCoord3sv" glTexCoord3sv ::
-   Ptr GLshort -> IO ()
-
-foreign import CALLCONV unsafe "glTexCoord4sv" glTexCoord4sv ::
-   Ptr GLshort -> IO ()
-
-EXTENSION_ENTRY("GL_ARB_multitexture or OpenGL 1.3",glMultiTexCoord1sARB,GLenum -> GLshort -> IO ())
-EXTENSION_ENTRY("GL_ARB_multitexture or OpenGL 1.3",glMultiTexCoord2sARB,GLenum -> GLshort -> GLshort -> IO ())
-EXTENSION_ENTRY("GL_ARB_multitexture or OpenGL 1.3",glMultiTexCoord3sARB,GLenum -> GLshort -> GLshort -> GLshort -> IO ())
-EXTENSION_ENTRY("GL_ARB_multitexture or OpenGL 1.3",glMultiTexCoord4sARB,GLenum -> GLshort -> GLshort -> GLshort -> GLshort -> IO ())
-
-EXTENSION_ENTRY("GL_ARB_multitexture or OpenGL 1.3",glMultiTexCoord1svARB,GLenum -> Ptr GLshort -> IO ())
-EXTENSION_ENTRY("GL_ARB_multitexture or OpenGL 1.3",glMultiTexCoord2svARB,GLenum -> Ptr GLshort -> IO ())
-EXTENSION_ENTRY("GL_ARB_multitexture or OpenGL 1.3",glMultiTexCoord3svARB,GLenum -> Ptr GLshort -> IO ())
-EXTENSION_ENTRY("GL_ARB_multitexture or OpenGL 1.3",glMultiTexCoord4svARB,GLenum -> Ptr GLshort -> IO ())
-
-instance TexCoordComponent GLshort_ where
-   texCoord1 = glTexCoord1s
-   texCoord2 = glTexCoord2s
-   texCoord3 = glTexCoord3s
-   texCoord4 = glTexCoord4s
-
-   texCoord1v = glTexCoord1sv
-   texCoord2v = glTexCoord2sv
-   texCoord3v = glTexCoord3sv
-   texCoord4v = glTexCoord4sv
-
-   multiTexCoord1 = glMultiTexCoord1sARB
-   multiTexCoord2 = glMultiTexCoord2sARB
-   multiTexCoord3 = glMultiTexCoord3sARB
-   multiTexCoord4 = glMultiTexCoord4sARB
-
-   multiTexCoord1v = glMultiTexCoord1svARB
-   multiTexCoord2v = glMultiTexCoord2svARB
-   multiTexCoord3v = glMultiTexCoord3svARB
-   multiTexCoord4v = glMultiTexCoord4svARB
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "glTexCoord1i" glTexCoord1i ::
-   GLint -> IO ()
-
-foreign import CALLCONV unsafe "glTexCoord2i" glTexCoord2i ::
-   GLint -> GLint -> IO ()
-
-foreign import CALLCONV unsafe "glTexCoord3i" glTexCoord3i ::
-   GLint -> GLint -> GLint -> IO ()
-
-foreign import CALLCONV unsafe "glTexCoord4i" glTexCoord4i ::
-   GLint -> GLint -> GLint -> GLint -> IO ()
-
-foreign import CALLCONV unsafe "glTexCoord1iv" glTexCoord1iv ::
-   Ptr GLint -> IO ()
-
-foreign import CALLCONV unsafe "glTexCoord2iv" glTexCoord2iv ::
-   Ptr GLint -> IO ()
-
-foreign import CALLCONV unsafe "glTexCoord3iv" glTexCoord3iv ::
-   Ptr GLint -> IO ()
-
-foreign import CALLCONV unsafe "glTexCoord4iv" glTexCoord4iv ::
-   Ptr GLint -> IO ()
-
-EXTENSION_ENTRY("GL_ARB_multitexture or OpenGL 1.3",glMultiTexCoord1iARB,GLenum -> GLint -> IO ())
-EXTENSION_ENTRY("GL_ARB_multitexture or OpenGL 1.3",glMultiTexCoord2iARB,GLenum -> GLint -> GLint -> IO ())
-EXTENSION_ENTRY("GL_ARB_multitexture or OpenGL 1.3",glMultiTexCoord3iARB,GLenum -> GLint -> GLint -> GLint -> IO ())
-EXTENSION_ENTRY("GL_ARB_multitexture or OpenGL 1.3",glMultiTexCoord4iARB,GLenum -> GLint -> GLint -> GLint -> GLint -> IO ())
-
-EXTENSION_ENTRY("GL_ARB_multitexture or OpenGL 1.3",glMultiTexCoord1ivARB,GLenum -> Ptr GLint -> IO ())
-EXTENSION_ENTRY("GL_ARB_multitexture or OpenGL 1.3",glMultiTexCoord2ivARB,GLenum -> Ptr GLint -> IO ())
-EXTENSION_ENTRY("GL_ARB_multitexture or OpenGL 1.3",glMultiTexCoord3ivARB,GLenum -> Ptr GLint -> IO ())
-EXTENSION_ENTRY("GL_ARB_multitexture or OpenGL 1.3",glMultiTexCoord4ivARB,GLenum -> Ptr GLint -> IO ())
-
-instance TexCoordComponent GLint_ where
-   texCoord1 = glTexCoord1i
-   texCoord2 = glTexCoord2i
-   texCoord3 = glTexCoord3i
-   texCoord4 = glTexCoord4i
-
-   texCoord1v = glTexCoord1iv
-   texCoord2v = glTexCoord2iv
-   texCoord3v = glTexCoord3iv
-   texCoord4v = glTexCoord4iv
-
-   multiTexCoord1 = glMultiTexCoord1iARB
-   multiTexCoord2 = glMultiTexCoord2iARB
-   multiTexCoord3 = glMultiTexCoord3iARB
-   multiTexCoord4 = glMultiTexCoord4iARB
-
-   multiTexCoord1v = glMultiTexCoord1ivARB
-   multiTexCoord2v = glMultiTexCoord2ivARB
-   multiTexCoord3v = glMultiTexCoord3ivARB
-   multiTexCoord4v = glMultiTexCoord4ivARB
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "glTexCoord1f" glTexCoord1f ::
-   GLfloat -> IO ()
-
-foreign import CALLCONV unsafe "glTexCoord2f" glTexCoord2f ::
-   GLfloat -> GLfloat -> IO ()
-
-foreign import CALLCONV unsafe "glTexCoord3f" glTexCoord3f ::
-   GLfloat -> GLfloat -> GLfloat -> IO ()
-
-foreign import CALLCONV unsafe "glTexCoord4f" glTexCoord4f ::
-   GLfloat -> GLfloat -> GLfloat -> GLfloat -> IO ()
-
-foreign import CALLCONV unsafe "glTexCoord1fv" glTexCoord1fv ::
-   Ptr GLfloat -> IO ()
-
-foreign import CALLCONV unsafe "glTexCoord2fv" glTexCoord2fv ::
-   Ptr GLfloat -> IO ()
-
-foreign import CALLCONV unsafe "glTexCoord3fv" glTexCoord3fv ::
-   Ptr GLfloat -> IO ()
-
-foreign import CALLCONV unsafe "glTexCoord4fv" glTexCoord4fv ::
-   Ptr GLfloat -> IO ()
-
-EXTENSION_ENTRY("GL_ARB_multitexture or OpenGL 1.3",glMultiTexCoord1fARB,GLenum -> GLfloat -> IO ())
-EXTENSION_ENTRY("GL_ARB_multitexture or OpenGL 1.3",glMultiTexCoord2fARB,GLenum -> GLfloat -> GLfloat -> IO ())
-EXTENSION_ENTRY("GL_ARB_multitexture or OpenGL 1.3",glMultiTexCoord3fARB,GLenum -> GLfloat -> GLfloat -> GLfloat -> IO ())
-EXTENSION_ENTRY("GL_ARB_multitexture or OpenGL 1.3",glMultiTexCoord4fARB,GLenum -> GLfloat -> GLfloat -> GLfloat -> GLfloat -> IO ())
-
-EXTENSION_ENTRY("GL_ARB_multitexture or OpenGL 1.3",glMultiTexCoord1fvARB,GLenum -> Ptr GLfloat -> IO ())
-EXTENSION_ENTRY("GL_ARB_multitexture or OpenGL 1.3",glMultiTexCoord2fvARB,GLenum -> Ptr GLfloat -> IO ())
-EXTENSION_ENTRY("GL_ARB_multitexture or OpenGL 1.3",glMultiTexCoord3fvARB,GLenum -> Ptr GLfloat -> IO ())
-EXTENSION_ENTRY("GL_ARB_multitexture or OpenGL 1.3",glMultiTexCoord4fvARB,GLenum -> Ptr GLfloat -> IO ())
-
-instance TexCoordComponent GLfloat_ where
-   texCoord1 = glTexCoord1f
-   texCoord2 = glTexCoord2f
-   texCoord3 = glTexCoord3f
-   texCoord4 = glTexCoord4f
-
-   texCoord1v = glTexCoord1fv
-   texCoord2v = glTexCoord2fv
-   texCoord3v = glTexCoord3fv
-   texCoord4v = glTexCoord4fv
-
-   multiTexCoord1 = glMultiTexCoord1fARB
-   multiTexCoord2 = glMultiTexCoord2fARB
-   multiTexCoord3 = glMultiTexCoord3fARB
-   multiTexCoord4 = glMultiTexCoord4fARB
-
-   multiTexCoord1v = glMultiTexCoord1fvARB
-   multiTexCoord2v = glMultiTexCoord2fvARB
-   multiTexCoord3v = glMultiTexCoord3fvARB
-   multiTexCoord4v = glMultiTexCoord4fvARB
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "glTexCoord1d" glTexCoord1d ::
-   GLdouble -> IO ()
-
-foreign import CALLCONV unsafe "glTexCoord2d" glTexCoord2d ::
-   GLdouble -> GLdouble -> IO ()
-
-foreign import CALLCONV unsafe "glTexCoord3d" glTexCoord3d ::
-   GLdouble -> GLdouble -> GLdouble -> IO ()
-
-foreign import CALLCONV unsafe "glTexCoord4d" glTexCoord4d ::
-   GLdouble -> GLdouble -> GLdouble -> GLdouble -> IO ()
-
-foreign import CALLCONV unsafe "glTexCoord1dv" glTexCoord1dv ::
-   Ptr GLdouble -> IO ()
-
-foreign import CALLCONV unsafe "glTexCoord2dv" glTexCoord2dv ::
-   Ptr GLdouble -> IO ()
-
-foreign import CALLCONV unsafe "glTexCoord3dv" glTexCoord3dv ::
-   Ptr GLdouble -> IO ()
-
-foreign import CALLCONV unsafe "glTexCoord4dv" glTexCoord4dv ::
-   Ptr GLdouble -> IO ()
-
-EXTENSION_ENTRY("GL_ARB_multitexture or OpenGL 1.3",glMultiTexCoord1dARB,GLenum -> GLdouble -> IO ())
-EXTENSION_ENTRY("GL_ARB_multitexture or OpenGL 1.3",glMultiTexCoord2dARB,GLenum -> GLdouble -> GLdouble -> IO ())
-EXTENSION_ENTRY("GL_ARB_multitexture or OpenGL 1.3",glMultiTexCoord3dARB,GLenum -> GLdouble -> GLdouble -> GLdouble -> IO ())
-EXTENSION_ENTRY("GL_ARB_multitexture or OpenGL 1.3",glMultiTexCoord4dARB,GLenum -> GLdouble -> GLdouble -> GLdouble -> GLdouble -> IO ())
-
-EXTENSION_ENTRY("GL_ARB_multitexture or OpenGL 1.3",glMultiTexCoord1dvARB,GLenum -> Ptr GLdouble -> IO ())
-EXTENSION_ENTRY("GL_ARB_multitexture or OpenGL 1.3",glMultiTexCoord2dvARB,GLenum -> Ptr GLdouble -> IO ())
-EXTENSION_ENTRY("GL_ARB_multitexture or OpenGL 1.3",glMultiTexCoord3dvARB,GLenum -> Ptr GLdouble -> IO ())
-EXTENSION_ENTRY("GL_ARB_multitexture or OpenGL 1.3",glMultiTexCoord4dvARB,GLenum -> Ptr GLdouble -> IO ())
-
-instance TexCoordComponent GLdouble_ where
-   texCoord1 = glTexCoord1d
-   texCoord2 = glTexCoord2d
-   texCoord3 = glTexCoord3d
-   texCoord4 = glTexCoord4d
-
-   texCoord1v = glTexCoord1dv
-   texCoord2v = glTexCoord2dv
-   texCoord3v = glTexCoord3dv
-   texCoord4v = glTexCoord4dv
-
-   multiTexCoord1 = glMultiTexCoord1dARB
-   multiTexCoord2 = glMultiTexCoord2dARB
-   multiTexCoord3 = glMultiTexCoord3dARB
-   multiTexCoord4 = glMultiTexCoord4dARB
-
-   multiTexCoord1v = glMultiTexCoord1dvARB
-   multiTexCoord2v = glMultiTexCoord2dvARB
-   multiTexCoord3v = glMultiTexCoord3dvARB
-   multiTexCoord4v = glMultiTexCoord4dvARB
-
---------------------------------------------------------------------------------
-
--- | Change the current texture coordinates of the current or given texture
--- unit.
-
-class TexCoord a where
-   texCoord       ::                    a -> IO ()
-   texCoordv      ::                Ptr a -> IO ()
-   multiTexCoord  :: TextureUnit ->     a -> IO ()
-   multiTexCoordv :: TextureUnit -> Ptr a -> IO ()
-
-instance TexCoordComponent a => TexCoord (TexCoord1 a) where
-   texCoord (TexCoord1 s) = texCoord1 s
-   texCoordv = texCoord1v . (castPtr :: Ptr (TexCoord1 b) -> Ptr b)
-   multiTexCoord u (TexCoord1 s) =
-      multiTexCoord1 (marshalTextureUnit u) s
-   multiTexCoordv u =
-      multiTexCoord1v (marshalTextureUnit u) . (castPtr :: Ptr (TexCoord1 b) -> Ptr b)
-
-instance TexCoordComponent a => TexCoord (TexCoord2 a) where
-   texCoord (TexCoord2 s t) = texCoord2 s t
-   texCoordv = texCoord2v . (castPtr :: Ptr (TexCoord2 b) -> Ptr b)
-   multiTexCoord u (TexCoord2 s t) =
-      multiTexCoord2 (marshalTextureUnit u) s t
-   multiTexCoordv u =
-      multiTexCoord2v (marshalTextureUnit u) . (castPtr :: Ptr (TexCoord2 b) -> Ptr b)
-
-instance TexCoordComponent a => TexCoord (TexCoord3 a) where
-   texCoord (TexCoord3 s t r) = texCoord3 s t r
-   texCoordv = texCoord3v . (castPtr :: Ptr (TexCoord3 b) -> Ptr b)
-   multiTexCoord u (TexCoord3 s t r) =
-      multiTexCoord3 (marshalTextureUnit u) s t r
-   multiTexCoordv u =
-      multiTexCoord3v (marshalTextureUnit u) . (castPtr :: Ptr (TexCoord3 b) -> Ptr b)
-
-instance TexCoordComponent a => TexCoord (TexCoord4 a) where
-   texCoord (TexCoord4 s t r q) = texCoord4 s t r q
-   texCoordv = texCoord4v . (castPtr :: Ptr (TexCoord4 b) -> Ptr b)
-   multiTexCoord u (TexCoord4 s t r q) =
-      multiTexCoord4 (marshalTextureUnit u) s t r q
-   multiTexCoordv u =
-      multiTexCoord4v (marshalTextureUnit u) . (castPtr :: Ptr (TexCoord4 b) -> Ptr b)
-
---------------------------------------------------------------------------------
-
--- | The current normal (/x/, /y/, /z/). The initial value is the unit vector
--- (0, 0, 1).
-
-currentNormal :: StateVar (Normal3 GLfloat)
-currentNormal = makeStateVar (getFloat3 Normal3 GetCurrentNormal) normal
-
---------------------------------------------------------------------------------
-
--- | The class of all types which can be used as a component of a normal.
-
-class NormalComponent a where
-   normal3 :: a -> a -> a -> IO ()
-   normal3v :: Ptr a -> IO ()
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "glNormal3b" glNormal3b ::
-   GLbyte -> GLbyte -> GLbyte -> IO ()
-
-foreign import CALLCONV unsafe "glNormal3bv" glNormal3bv ::
-   Ptr GLbyte -> IO ()
-
-instance NormalComponent GLbyte_ where
-   normal3 = glNormal3b
-   normal3v = glNormal3bv
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "glNormal3s" glNormal3s ::
-   GLshort -> GLshort -> GLshort -> IO ()
-
-foreign import CALLCONV unsafe "glNormal3sv" glNormal3sv ::
-   Ptr GLshort -> IO ()
-
-instance NormalComponent GLshort_ where
-   normal3 = glNormal3s
-   normal3v = glNormal3sv
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "glNormal3i" glNormal3i ::
-   GLint -> GLint -> GLint -> IO ()
-
-foreign import CALLCONV unsafe "glNormal3iv" glNormal3iv ::
-   Ptr GLint -> IO ()
-
-instance NormalComponent GLint_ where
-   normal3 = glNormal3i
-   normal3v = glNormal3iv
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "glNormal3f" glNormal3f ::
-   GLfloat -> GLfloat -> GLfloat -> IO ()
-
-foreign import CALLCONV unsafe "glNormal3fv" glNormal3fv ::
-   Ptr GLfloat -> IO ()
-
-instance NormalComponent GLfloat_ where
-   normal3 = glNormal3f
-   normal3v = glNormal3fv
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "glNormal3d" glNormal3d ::
-   GLdouble -> GLdouble -> GLdouble -> IO ()
-
-foreign import CALLCONV unsafe "glNormal3dv" glNormal3dv ::
-   Ptr GLdouble -> IO ()
-
-instance NormalComponent GLdouble_ where
-   normal3 = glNormal3d
-   normal3v = glNormal3dv
-
---------------------------------------------------------------------------------
-
--- | Change the current normal. Integral arguments are converted to
--- floating-point 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.
---
--- Normals specified with 'normal' or 'normalv' need not have unit length.
--- If 'Graphics.Rendering.OpenGL.GL.CoordTrans.normalize' is enabled, then
--- normals of any length specified with 'normal' or 'normalv' are normalized
--- after transformation. If
--- 'Graphics.Rendering.OpenGL.GL.CoordTrans.rescaleNormal' is enabled, normals
--- are scaled by a scaling factor derived from the modelview matrix.
--- 'Graphics.Rendering.OpenGL.GL.CoordTrans.rescaleNormal' requires that the
--- originally specified normals were of unit length, and that the modelview
--- matrix contains only uniform scales for proper results. Normalization is 
--- initially disabled.
-
-class Normal a where
-   normal  ::     a -> IO ()
-   normalv :: Ptr a -> IO ()
-
-instance NormalComponent a => Normal (Normal3 a) where
-   normal (Normal3 x y z) = normal3 x y z
-   normalv = normal3v . (castPtr :: Ptr (Normal3 b) -> Ptr b)
-
---------------------------------------------------------------------------------
-
--- | The current fog coordinate. The initial value is 0.
-
-currentFogCoord :: StateVar (FogCoord1 GLfloat)
-currentFogCoord =
-   makeStateVar (getFloat1 FogCoord1 GetCurrentFogCoord) fogCoord
-
---------------------------------------------------------------------------------
-
--- | The class of all types which can be used as the fog coordinate.
-
-class FogCoordComponent a where
-   fogCoord1 :: a -> IO ()
-   fogCoord1v :: Ptr a -> IO ()
-
---------------------------------------------------------------------------------
-
-EXTENSION_ENTRY("GL_EXT_fog_coord or OpenGL 1.4",glFogCoordfEXT,GLfloat -> IO ())
-EXTENSION_ENTRY("GL_EXT_fog_coord or OpenGL 1.4",glFogCoordfvEXT,Ptr GLfloat -> IO ())
-
-instance FogCoordComponent GLfloat_ where
-   fogCoord1 = glFogCoordfEXT
-   fogCoord1v = glFogCoordfvEXT
-
---------------------------------------------------------------------------------
-
-EXTENSION_ENTRY("GL_EXT_fog_coord or OpenGL 1.4",glFogCoorddEXT,GLdouble -> IO ())
-EXTENSION_ENTRY("GL_EXT_fog_coord or OpenGL 1.4",glFogCoorddvEXT,Ptr GLdouble -> IO ())
-
-instance FogCoordComponent GLdouble_ where
-   fogCoord1 = glFogCoorddEXT
-   fogCoord1v = glFogCoorddvEXT
-
---------------------------------------------------------------------------------
-
--- | Change the current fog coordinate.
-
-class FogCoord a where
-   fogCoord  ::     a -> IO ()
-   fogCoordv :: Ptr a -> IO ()
-
-instance FogCoordComponent a => FogCoord (FogCoord1 a) where
-   fogCoord (FogCoord1 c) = fogCoord1 c
-   fogCoordv = fogCoord1v . (castPtr :: Ptr (FogCoord1 b) -> Ptr b)
-
---------------------------------------------------------------------------------
-
--- | If 'rgbaMode' contains 'True', the color buffers store RGBA value. If
--- color indexes are stored, it contains 'False'.
-
-rgbaMode :: GettableStateVar Bool
-rgbaMode = makeGettableStateVar (getBoolean1 unmarshalGLboolean GetRGBAMode)
-
---------------------------------------------------------------------------------
-
--- The current color (/R/, /G/, /B/, /A/). The initial value is (1, 1, 1, 1).
--- Note that this state variable is significant only when the GL is in RGBA
--- mode.
-
-currentColor :: StateVar (Color4 GLfloat)
-currentColor =
-   makeStateVar (getFloat4 Color4 GetCurrentColor) color
-
--- The current secondary color (/R/, /G/, /B/). The initial value is (0, 0, 0).
--- Note that this state variable is significant only when the GL is in RGBA
--- mode.
-
-currentSecondaryColor :: StateVar (Color3 GLfloat)
-currentSecondaryColor =
-   makeStateVar
-      (do Color4 r g b _ <- getFloat4 Color4 GetCurrentSecondaryColor
-          return $ Color3 r g b)
-      secondaryColor
-
---------------------------------------------------------------------------------
-
--- | The class of all types which can be used as a color component.
-
-class ColorComponent a where
-   color3 :: a -> a -> a -> IO ()
-   color4 :: a -> a -> a -> a -> IO ()
-
-   color3v :: Ptr a -> IO ()
-   color4v :: Ptr a -> IO ()
-
-   secondaryColor3  :: a -> a -> a -> IO ()
-   secondaryColor3v :: Ptr a -> IO ()
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "glColor3b" glColor3b ::
-   GLbyte -> GLbyte -> GLbyte -> IO ()
-
-foreign import CALLCONV unsafe "glColor4b" glColor4b ::
-   GLbyte -> GLbyte -> GLbyte -> GLbyte -> IO ()
-
-foreign import CALLCONV unsafe "glColor3bv" glColor3bv ::
-   Ptr GLbyte -> IO ()
-
-foreign import CALLCONV unsafe "glColor4bv" glColor4bv ::
-   Ptr GLbyte -> IO ()
-
-EXTENSION_ENTRY("GL_EXT_secondary_color or OpenGL 1.4",glSecondaryColor3bEXT,GLbyte -> GLbyte -> GLbyte -> IO ())
-EXTENSION_ENTRY("GL_EXT_secondary_color or OpenGL 1.4",glSecondaryColor3bvEXT,Ptr GLbyte -> IO ())
-
-instance ColorComponent GLbyte_ where
-   color3 = glColor3b
-   color4 = glColor4b
-
-   color3v = glColor3bv
-   color4v = glColor4bv
-
-   secondaryColor3 = glSecondaryColor3bEXT
-   secondaryColor3v = glSecondaryColor3bvEXT
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "glColor3s" glColor3s ::
-   GLshort -> GLshort -> GLshort -> IO ()
-
-foreign import CALLCONV unsafe "glColor4s" glColor4s ::
-   GLshort -> GLshort -> GLshort -> GLshort -> IO ()
-
-foreign import CALLCONV unsafe "glColor3sv" glColor3sv ::
-   Ptr GLshort -> IO ()
-
-foreign import CALLCONV unsafe "glColor4sv" glColor4sv ::
-   Ptr GLshort -> IO ()
-
-EXTENSION_ENTRY("GL_EXT_secondary_color or OpenGL 1.4",glSecondaryColor3sEXT,GLshort -> GLshort -> GLshort -> IO ())
-EXTENSION_ENTRY("GL_EXT_secondary_color or OpenGL 1.4",glSecondaryColor3svEXT,Ptr GLshort -> IO ())
-
-instance ColorComponent GLshort_ where
-   color3 = glColor3s
-   color4 = glColor4s
-
-   color3v = glColor3sv
-   color4v = glColor4sv
-
-   secondaryColor3 = glSecondaryColor3sEXT
-   secondaryColor3v = glSecondaryColor3svEXT
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "glColor3i" glColor3i ::
-   GLint -> GLint -> GLint -> IO ()
-
-foreign import CALLCONV unsafe "glColor4i" glColor4i ::
-   GLint -> GLint -> GLint -> GLint -> IO ()
-
-foreign import CALLCONV unsafe "glColor3iv" glColor3iv ::
-   Ptr GLint -> IO ()
-
-foreign import CALLCONV unsafe "glColor4iv" glColor4iv ::
-   Ptr GLint -> IO ()
-
-EXTENSION_ENTRY("GL_EXT_secondary_color or OpenGL 1.4",glSecondaryColor3iEXT,GLint -> GLint -> GLint -> IO ())
-EXTENSION_ENTRY("GL_EXT_secondary_color or OpenGL 1.4",glSecondaryColor3ivEXT,Ptr GLint -> IO ())
-
-instance ColorComponent GLint_ where
-   color3 = glColor3i
-   color4 = glColor4i
-
-   color3v = glColor3iv
-   color4v = glColor4iv
-
-   secondaryColor3 = glSecondaryColor3iEXT
-   secondaryColor3v = glSecondaryColor3ivEXT
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "glColor3f" glColor3f ::
-   GLfloat -> GLfloat -> GLfloat -> IO ()
-
-foreign import CALLCONV unsafe "glColor4f" glColor4f ::
-   GLfloat -> GLfloat -> GLfloat -> GLfloat -> IO ()
-
-foreign import CALLCONV unsafe "glColor3fv" glColor3fv ::
-   Ptr GLfloat -> IO ()
-
-foreign import CALLCONV unsafe "glColor4fv" glColor4fv ::
-   Ptr GLfloat -> IO ()
-
-EXTENSION_ENTRY("GL_EXT_secondary_color or OpenGL 1.4",glSecondaryColor3fEXT,GLfloat -> GLfloat -> GLfloat -> IO ())
-EXTENSION_ENTRY("GL_EXT_secondary_color or OpenGL 1.4",glSecondaryColor3fvEXT,Ptr GLfloat -> IO ())
-
-instance ColorComponent GLfloat_ where
-   color3 = glColor3f
-   color4 = glColor4f
-
-   color3v = glColor3fv
-   color4v = glColor4fv
-
-   secondaryColor3 = glSecondaryColor3fEXT
-   secondaryColor3v = glSecondaryColor3fvEXT
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "glColor3d" glColor3d ::
-   GLdouble -> GLdouble -> GLdouble -> IO ()
-
-foreign import CALLCONV unsafe "glColor4d" glColor4d ::
-   GLdouble -> GLdouble -> GLdouble -> GLdouble -> IO ()
-
-foreign import CALLCONV unsafe "glColor3dv" glColor3dv ::
-   Ptr GLdouble -> IO ()
-
-foreign import CALLCONV unsafe "glColor4dv" glColor4dv ::
-   Ptr GLdouble -> IO ()
-
-EXTENSION_ENTRY("GL_EXT_secondary_color or OpenGL 1.4",glSecondaryColor3dEXT,GLdouble -> GLdouble -> GLdouble -> IO ())
-EXTENSION_ENTRY("GL_EXT_secondary_color or OpenGL 1.4",glSecondaryColor3dvEXT,Ptr GLdouble -> IO ())
-
-instance ColorComponent GLdouble_ where
-   color3 = glColor3d
-   color4 = glColor4d
-
-   color3v = glColor3dv
-   color4v = glColor4dv
-
-   secondaryColor3 = glSecondaryColor3dEXT
-   secondaryColor3v = glSecondaryColor3dvEXT
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "glColor3ub" glColor3ub ::
-   GLubyte -> GLubyte -> GLubyte -> IO ()
-
-foreign import CALLCONV unsafe "glColor4ub" glColor4ub ::
-   GLubyte -> GLubyte -> GLubyte -> GLubyte -> IO ()
-
-
-foreign import CALLCONV unsafe "glColor3ubv" glColor3ubv ::
-   Ptr GLubyte -> IO ()
-
-foreign import CALLCONV unsafe "glColor4ubv" glColor4ubv ::
-   Ptr GLubyte -> IO ()
-
-EXTENSION_ENTRY("GL_EXT_secondary_color or OpenGL 1.4",glSecondaryColor3ubEXT,GLubyte -> GLubyte -> GLubyte -> IO ())
-EXTENSION_ENTRY("GL_EXT_secondary_color or OpenGL 1.4",glSecondaryColor3ubvEXT,Ptr GLubyte -> IO ())
-
-instance ColorComponent GLubyte_ where
-   color3 = glColor3ub
-   color4 = glColor4ub
-
-   color3v = glColor3ubv
-   color4v = glColor4ubv
-
-   secondaryColor3 = glSecondaryColor3ubEXT
-   secondaryColor3v = glSecondaryColor3ubvEXT
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "glColor3us" glColor3us ::
-   GLushort -> GLushort -> GLushort -> IO ()
-
-foreign import CALLCONV unsafe "glColor4us" glColor4us ::
-   GLushort -> GLushort -> GLushort -> GLushort -> IO ()
-
-foreign import CALLCONV unsafe "glColor3usv" glColor3usv ::
-   Ptr GLushort -> IO ()
-
-foreign import CALLCONV unsafe "glColor4usv" glColor4usv ::
-   Ptr GLushort -> IO ()
-
-EXTENSION_ENTRY("GL_EXT_secondary_color or OpenGL 1.4",glSecondaryColor3usEXT,GLushort -> GLushort -> GLushort -> IO ())
-EXTENSION_ENTRY("GL_EXT_secondary_color or OpenGL 1.4",glSecondaryColor3usvEXT,Ptr GLushort -> IO ())
-
-instance ColorComponent GLushort_ where
-   color3 = glColor3us
-   color4 = glColor4us
-
-   color3v = glColor3usv
-   color4v = glColor4usv
-
-   secondaryColor3 = glSecondaryColor3usEXT
-   secondaryColor3v = glSecondaryColor3usvEXT
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "glColor3ui" glColor3ui ::
-   GLuint -> GLuint -> GLuint -> IO ()
-
-foreign import CALLCONV unsafe "glColor4ui" glColor4ui ::
-   GLuint -> GLuint -> GLuint -> GLuint -> IO ()
-
-foreign import CALLCONV unsafe "glColor3uiv" glColor3uiv ::
-   Ptr GLuint -> IO ()
-
-foreign import CALLCONV unsafe "glColor4uiv" glColor4uiv ::
-   Ptr GLuint -> IO ()
-
-EXTENSION_ENTRY("GL_EXT_secondary_color or OpenGL 1.4",glSecondaryColor3uiEXT,GLuint -> GLuint -> GLuint -> IO ())
-EXTENSION_ENTRY("GL_EXT_secondary_color or OpenGL 1.4",glSecondaryColor3uivEXT,Ptr GLuint -> IO ())
-
-instance ColorComponent GLuint_ where
-   color3 = glColor3ui
-   color4 = glColor4ui
-
-   color3v = glColor3uiv
-   color4v = glColor4uiv
-
-   secondaryColor3 = glSecondaryColor3uiEXT
-   secondaryColor3v = glSecondaryColor3uivEXT
-
---------------------------------------------------------------------------------
-
--- | Change the current color.
-
-class Color a where
-   color  ::     a -> IO ()
-   colorv :: Ptr a -> IO ()
-
-instance ColorComponent a => Color (Color3 a) where
-   color (Color3 r g b) = color3 r g b
-   colorv = color3v . (castPtr :: Ptr (Color3 b) -> Ptr b)
-
-instance ColorComponent a => Color (Color4 a) where
-   color (Color4 r g b a) = color4 r g b a
-   colorv = color4v . (castPtr :: Ptr (Color4 b) -> Ptr b)
-
---------------------------------------------------------------------------------
-
--- | Change the current secondary color.
-
-class SecondaryColor a where
-   secondaryColor  ::     a -> IO ()
-   secondaryColorv :: Ptr a -> IO ()
-
-instance ColorComponent a => SecondaryColor (Color3 a) where
-   secondaryColor (Color3 r g b) = secondaryColor3 r g b
-   secondaryColorv = secondaryColor3v . (castPtr :: Ptr (Color3 b) -> Ptr b)
-
---------------------------------------------------------------------------------
-
--- The current color index. The initial value is 1. Note that this state
--- variable is significant only when the GL is in color index mode.
-
-currentIndex :: StateVar (Index1 GLint)
-currentIndex = makeStateVar (getInteger1 Index1 GetCurrentIndex) index
-
---------------------------------------------------------------------------------
-
--- | The class of all types which can be used as a color index.
-
-class IndexComponent a where
-   index1 :: a -> IO ()
-   index1v :: Ptr a -> IO ()
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "glIndexs" glIndexs ::
-   GLshort -> IO ()
-
-foreign import CALLCONV unsafe "glIndexsv" glIndexsv ::
-   Ptr GLshort -> IO ()
-
-instance IndexComponent GLshort_ where
-   index1 = glIndexs
-   index1v = glIndexsv
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "glIndexi" glIndexi ::
-   GLint -> IO ()
-
-foreign import CALLCONV unsafe "glIndexiv" glIndexiv ::
-   Ptr GLint -> IO ()
-
-instance IndexComponent GLint_ where
-   index1 = glIndexi
-   index1v = glIndexiv
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "glIndexf" glIndexf ::
-   GLfloat -> IO ()
-
-foreign import CALLCONV unsafe "glIndexfv" glIndexfv ::
-   Ptr GLfloat -> IO ()
-
-instance IndexComponent GLfloat_ where
-   index1 = glIndexf
-   index1v = glIndexfv
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "glIndexd" glIndexd ::
-   GLdouble -> IO ()
-
-foreign import CALLCONV unsafe "glIndexdv" glIndexdv ::
-   Ptr GLdouble -> IO ()
-
-instance IndexComponent GLdouble_ where
-   index1 = glIndexd
-   index1v = glIndexdv
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "glIndexub" glIndexub ::
-   GLubyte -> IO ()
-
-foreign import CALLCONV unsafe "glIndexubv" glIndexubv ::
-   Ptr GLubyte -> IO ()
-
-instance IndexComponent GLubyte_ where
-   index1 = glIndexub
-   index1v = glIndexubv
-
---------------------------------------------------------------------------------
-
--- | Change the current color index.
-
-class Index a where
-   index  ::     a -> IO ()  -- Collision with Prelude.index
-   indexv :: Ptr a -> IO ()
-
-instance IndexComponent a => Index (Index1 a) where
-   index (Index1 i) = index1 i
-   indexv = index1v . (castPtr :: Ptr (Index1 b) -> Ptr b)
-
---------------------------------------------------------------------------------
-
-data IntegerHandling =
-     ToFloat
-   | ToNormalizedFloat
-   | KeepIntegral
-   deriving ( Eq, Ord, Show )
-
---------------------------------------------------------------------------------
-
-currentVertexAttrib :: AttribLocation -> StateVar (Vertex4 GLfloat)
-currentVertexAttrib location =
-   makeStateVar
-      (getVertexAttribFloat4 Vertex4 location GetCurrentVertexAttrib)
-      (vertexAttrib ToFloat location)
-
-currentVertexAttribI :: AttribLocation -> StateVar (Vertex4 GLint)
-currentVertexAttribI location =
-   makeStateVar
-      (getVertexAttribIInteger4 Vertex4 location GetCurrentVertexAttrib)
-      (vertexAttrib ToNormalizedFloat location)
-
-currentVertexAttribIu :: AttribLocation -> StateVar (Vertex4 GLuint)
-currentVertexAttribIu location =
-   makeStateVar
-      (getVertexAttribIuInteger4 Vertex4 location GetCurrentVertexAttrib)
-      (vertexAttrib KeepIntegral location)
-
---------------------------------------------------------------------------------
--- The generic vertex attribute API is not as orthogonal as we would like.
--- Minimal methods: vertexAttrib4v and vertexAttrib4Nv and vertexAttrib4Iv
-
--- | The class of all types which can be used as a generic vertex attribute.
--- NOTE: Do not use the methods of this class directly, they were only exported
--- by accident and will be hidden in future versions of this package.
-
-class (Storable a, Num a) => VertexAttribComponent a where
-   vertexAttrib1 :: AttribLocation -> a -> IO ()
-   vertexAttrib2 :: AttribLocation -> a -> a -> IO ()
-   vertexAttrib3 :: AttribLocation -> a -> a -> a -> IO ()
-   vertexAttrib4 :: AttribLocation -> a -> a -> a -> a -> IO ()
-
-   vertexAttrib1N :: AttribLocation -> a -> IO ()
-   vertexAttrib2N :: AttribLocation -> a -> a -> IO ()
-   vertexAttrib3N :: AttribLocation -> a -> a -> a -> IO ()
-   vertexAttrib4N :: AttribLocation -> a -> a -> a -> a -> IO ()
-
-   vertexAttrib1I :: AttribLocation -> a -> IO ()
-   vertexAttrib2I :: AttribLocation -> a -> a -> IO ()
-   vertexAttrib3I :: AttribLocation -> a -> a -> a -> IO ()
-   vertexAttrib4I :: AttribLocation -> a -> a -> a -> a -> IO ()
-
-   vertexAttrib1v :: AttribLocation -> Ptr a -> IO ()
-   vertexAttrib2v :: AttribLocation -> Ptr a -> IO ()
-   vertexAttrib3v :: AttribLocation -> Ptr a -> IO ()
-   vertexAttrib4v :: AttribLocation -> Ptr a -> IO ()
-
-   vertexAttrib1Nv :: AttribLocation -> Ptr a -> IO ()
-   vertexAttrib2Nv :: AttribLocation -> Ptr a -> IO ()
-   vertexAttrib3Nv :: AttribLocation -> Ptr a -> IO ()
-   vertexAttrib4Nv :: AttribLocation -> Ptr a -> IO ()
-
-   vertexAttrib1Iv :: AttribLocation -> Ptr a -> IO ()
-   vertexAttrib2Iv :: AttribLocation -> Ptr a -> IO ()
-   vertexAttrib3Iv :: AttribLocation -> Ptr a -> IO ()
-   vertexAttrib4Iv :: AttribLocation -> Ptr a -> IO ()
-
-   vertexAttrib1 location x = vertexAttrib4 location x 0 0 1
-   vertexAttrib2 location x y = vertexAttrib4 location x y 0 1
-   vertexAttrib3 location x y z = vertexAttrib4 location x y z 1
-   vertexAttrib4 location x y z w = allocaArray 4 $ \buf -> do
-                                       poke4 buf x y z w
-                                       vertexAttrib4v location buf
-
-   vertexAttrib1N location x = vertexAttrib4N location x 0 0 1
-   vertexAttrib2N location x y = vertexAttrib4N location x y 0 1
-   vertexAttrib3N location x y z = vertexAttrib4N location x y z 1
-   vertexAttrib4N location x y z w = allocaArray 4 $ \buf -> do
-                                       poke4 buf x y z w
-                                       vertexAttrib4Nv location buf
-
-   vertexAttrib1I location x = vertexAttrib4I location x 0 0 1
-   vertexAttrib2I location x y = vertexAttrib4I location x y 0 1
-   vertexAttrib3I location x y z = vertexAttrib4I location x y z 1
-   vertexAttrib4I location x y z w = allocaArray 4 $ \buf -> do
-                                       poke4 buf x y z w
-                                       vertexAttrib4Iv location buf
-
-   vertexAttrib1v location = peek1M $ vertexAttrib1 location
-   vertexAttrib2v location = peek2M $ vertexAttrib2 location
-   vertexAttrib3v location = peek3M $ vertexAttrib3 location
-
-   vertexAttrib1Nv location = peek1M $ vertexAttrib1N location
-   vertexAttrib2Nv location = peek2M $ vertexAttrib2N location
-   vertexAttrib3Nv location = peek3M $ vertexAttrib3N location
-
-   vertexAttrib1Iv location = peek1M $ vertexAttrib1I location
-   vertexAttrib2Iv location = peek2M $ vertexAttrib2I location
-   vertexAttrib3Iv location = peek3M $ vertexAttrib3I location
-
---------------------------------------------------------------------------------
-
-EXTENSION_ENTRY("GL_ARB_vertex_shader or OpenGL 2.0",glVertexAttrib4bvARB,AttribLocation -> Ptr GLbyte -> IO ())
-EXTENSION_ENTRY("GL_ARB_vertex_shader or OpenGL 2.0",glVertexAttrib4NbvARB,AttribLocation -> Ptr GLbyte -> IO ())
-EXTENSION_ENTRY("GL_EXT_gpu_shader4 or OpenGL 3.0",glVertexAttribI4bv,AttribLocation -> Ptr GLbyte -> IO ())
-
-instance VertexAttribComponent GLbyte_ where
-   vertexAttrib4v = glVertexAttrib4bvARB
-   vertexAttrib4Nv = glVertexAttrib4NbvARB
-   vertexAttrib4Iv = glVertexAttribI4bv
-
---------------------------------------------------------------------------------
-
-EXTENSION_ENTRY("GL_ARB_vertex_shader or OpenGL 2.0",glVertexAttrib4NubARB,AttribLocation -> GLubyte -> GLubyte -> GLubyte -> GLubyte -> IO ())
-EXTENSION_ENTRY("GL_ARB_vertex_shader or OpenGL 2.0",glVertexAttrib4ubvARB,AttribLocation -> Ptr GLubyte -> IO ())
-EXTENSION_ENTRY("GL_ARB_vertex_shader or OpenGL 2.0",glVertexAttrib4NubvARB,AttribLocation -> Ptr GLubyte -> IO ())
-EXTENSION_ENTRY("GL_EXT_gpu_shader4 or OpenGL 3.0",glVertexAttribI4ubv,AttribLocation -> Ptr GLubyte -> IO ())
-
-instance VertexAttribComponent GLubyte_ where
-   vertexAttrib4N = glVertexAttrib4NubARB
-   vertexAttrib4v = glVertexAttrib4ubvARB
-   vertexAttrib4Nv = glVertexAttrib4NubvARB
-   vertexAttrib4Iv = glVertexAttribI4ubv
-
---------------------------------------------------------------------------------
-
-EXTENSION_ENTRY("GL_ARB_vertex_shader or OpenGL 2.0",glVertexAttrib1sARB,AttribLocation -> GLshort -> IO ())
-EXTENSION_ENTRY("GL_ARB_vertex_shader or OpenGL 2.0",glVertexAttrib2sARB,AttribLocation -> GLshort -> GLshort -> IO ())
-EXTENSION_ENTRY("GL_ARB_vertex_shader or OpenGL 2.0",glVertexAttrib3sARB,AttribLocation -> GLshort -> GLshort -> GLshort -> IO ())
-EXTENSION_ENTRY("GL_ARB_vertex_shader or OpenGL 2.0",glVertexAttrib4sARB,AttribLocation -> GLshort -> GLshort -> GLshort -> GLshort -> IO ())
-
-EXTENSION_ENTRY("GL_ARB_vertex_shader or OpenGL 2.0",glVertexAttrib1svARB,AttribLocation -> Ptr GLshort -> IO ())
-EXTENSION_ENTRY("GL_ARB_vertex_shader or OpenGL 2.0",glVertexAttrib2svARB,AttribLocation -> Ptr GLshort -> IO ())
-EXTENSION_ENTRY("GL_ARB_vertex_shader or OpenGL 2.0",glVertexAttrib3svARB,AttribLocation -> Ptr GLshort -> IO ())
-EXTENSION_ENTRY("GL_ARB_vertex_shader or OpenGL 2.0",glVertexAttrib4svARB,AttribLocation -> Ptr GLshort -> IO ())
-
-EXTENSION_ENTRY("GL_ARB_vertex_shader or OpenGL 2.0",glVertexAttrib4NsvARB,AttribLocation -> Ptr GLshort -> IO ())
-
-EXTENSION_ENTRY("GL_EXT_gpu_shader4 or OpenGL 3.0",glVertexAttribI4sv,AttribLocation -> Ptr GLshort -> IO ())
-
-instance VertexAttribComponent GLshort_ where
-   vertexAttrib1 = glVertexAttrib1sARB
-   vertexAttrib2 = glVertexAttrib2sARB
-   vertexAttrib3 = glVertexAttrib3sARB
-   vertexAttrib4 = glVertexAttrib4sARB
-
-   vertexAttrib1v = glVertexAttrib1svARB
-   vertexAttrib2v = glVertexAttrib2svARB
-   vertexAttrib3v = glVertexAttrib3svARB
-   vertexAttrib4v = glVertexAttrib4svARB
-
-   vertexAttrib4Nv = glVertexAttrib4NsvARB
-
-   vertexAttrib4Iv = glVertexAttribI4sv
-
---------------------------------------------------------------------------------
-
-EXTENSION_ENTRY("GL_ARB_vertex_shader or OpenGL 2.0",glVertexAttrib4usvARB,AttribLocation -> Ptr GLushort -> IO ())
-EXTENSION_ENTRY("GL_ARB_vertex_shader or OpenGL 2.0",glVertexAttrib4NusvARB,AttribLocation -> Ptr GLushort -> IO ())
-EXTENSION_ENTRY("GL_EXT_gpu_shader4 or OpenGL 3.0",glVertexAttribI4usv,AttribLocation -> Ptr GLushort -> IO ())
-
-instance VertexAttribComponent GLushort_ where
-   vertexAttrib4v = glVertexAttrib4usvARB
-   vertexAttrib4Nv = glVertexAttrib4NusvARB
-   vertexAttrib4Iv = glVertexAttribI4usv
-
---------------------------------------------------------------------------------
-
-EXTENSION_ENTRY("GL_EXT_gpu_shader4 or OpenGL 3.0",glVertexAttribI1i,AttribLocation -> GLint -> IO ())
-EXTENSION_ENTRY("GL_EXT_gpu_shader4 or OpenGL 3.0",glVertexAttribI2i,AttribLocation -> GLint -> GLint -> IO ())
-EXTENSION_ENTRY("GL_EXT_gpu_shader4 or OpenGL 3.0",glVertexAttribI3i,AttribLocation -> GLint -> GLint -> GLint -> IO ())
-EXTENSION_ENTRY("GL_EXT_gpu_shader4 or OpenGL 3.0",glVertexAttribI4i,AttribLocation -> GLint -> GLint -> GLint -> GLint -> IO ())
-
-EXTENSION_ENTRY("GL_ARB_vertex_shader or OpenGL 2.0",glVertexAttrib4ivARB,AttribLocation -> Ptr GLint -> IO ())
-
-EXTENSION_ENTRY("GL_ARB_vertex_shader or OpenGL 2.0",glVertexAttrib4NivARB,AttribLocation -> Ptr GLint -> IO ())
-
-EXTENSION_ENTRY("GL_EXT_gpu_shader4 or OpenGL 3.0",glVertexAttribI1iv,AttribLocation -> Ptr GLint -> IO ())
-EXTENSION_ENTRY("GL_EXT_gpu_shader4 or OpenGL 3.0",glVertexAttribI2iv,AttribLocation -> Ptr GLint -> IO ())
-EXTENSION_ENTRY("GL_EXT_gpu_shader4 or OpenGL 3.0",glVertexAttribI3iv,AttribLocation -> Ptr GLint -> IO ())
-EXTENSION_ENTRY("GL_EXT_gpu_shader4 or OpenGL 3.0",glVertexAttribI4iv,AttribLocation -> Ptr GLint -> IO ())
-
-instance VertexAttribComponent GLint_ where
-   vertexAttrib1I = glVertexAttribI1i
-   vertexAttrib2I = glVertexAttribI2i
-   vertexAttrib3I = glVertexAttribI3i
-   vertexAttrib4I = glVertexAttribI4i
-
-   vertexAttrib4v = glVertexAttrib4ivARB
-
-   vertexAttrib4Nv = glVertexAttrib4NivARB
-
-   vertexAttrib1Iv = glVertexAttribI1iv
-   vertexAttrib2Iv = glVertexAttribI2iv
-   vertexAttrib3Iv = glVertexAttribI3iv
-   vertexAttrib4Iv = glVertexAttribI4iv
-
---------------------------------------------------------------------------------
-
-EXTENSION_ENTRY("GL_EXT_gpu_shader4 or OpenGL 3.0",glVertexAttribI1ui,AttribLocation -> GLuint -> IO ())
-EXTENSION_ENTRY("GL_EXT_gpu_shader4 or OpenGL 3.0",glVertexAttribI2ui,AttribLocation -> GLuint -> GLuint -> IO ())
-EXTENSION_ENTRY("GL_EXT_gpu_shader4 or OpenGL 3.0",glVertexAttribI3ui,AttribLocation -> GLuint -> GLuint -> GLuint -> IO ())
-EXTENSION_ENTRY("GL_EXT_gpu_shader4 or OpenGL 3.0",glVertexAttribI4ui,AttribLocation -> GLuint -> GLuint -> GLuint -> GLuint -> IO ())
-
-EXTENSION_ENTRY("GL_ARB_vertex_shader or OpenGL 2.0",glVertexAttrib4uivARB,AttribLocation -> Ptr GLuint -> IO ())
-
-EXTENSION_ENTRY("GL_ARB_vertex_shader or OpenGL 2.0",glVertexAttrib4NuivARB,AttribLocation -> Ptr GLuint -> IO ())
-
-EXTENSION_ENTRY("GL_EXT_gpu_shader4 or OpenGL 3.0",glVertexAttribI1uiv,AttribLocation -> Ptr GLuint -> IO ())
-EXTENSION_ENTRY("GL_EXT_gpu_shader4 or OpenGL 3.0",glVertexAttribI2uiv,AttribLocation -> Ptr GLuint -> IO ())
-EXTENSION_ENTRY("GL_EXT_gpu_shader4 or OpenGL 3.0",glVertexAttribI3uiv,AttribLocation -> Ptr GLuint -> IO ())
-EXTENSION_ENTRY("GL_EXT_gpu_shader4 or OpenGL 3.0",glVertexAttribI4uiv,AttribLocation -> Ptr GLuint -> IO ())
-
-instance VertexAttribComponent GLuint_ where
-   vertexAttrib1I = glVertexAttribI1ui
-   vertexAttrib2I = glVertexAttribI2ui
-   vertexAttrib3I = glVertexAttribI3ui
-   vertexAttrib4I = glVertexAttribI4ui
-
-   vertexAttrib4v = glVertexAttrib4uivARB
-
-   vertexAttrib4Nv = glVertexAttrib4NuivARB
-
-   vertexAttrib1Iv = glVertexAttribI1uiv
-   vertexAttrib2Iv = glVertexAttribI2uiv
-   vertexAttrib3Iv = glVertexAttribI3uiv
-   vertexAttrib4Iv = glVertexAttribI4uiv
-
---------------------------------------------------------------------------------
-
-EXTENSION_ENTRY("GL_ARB_vertex_shader or OpenGL 2.0",glVertexAttrib1fARB,AttribLocation -> GLfloat -> IO ())
-EXTENSION_ENTRY("GL_ARB_vertex_shader or OpenGL 2.0",glVertexAttrib2fARB,AttribLocation -> GLfloat -> GLfloat -> IO ())
-EXTENSION_ENTRY("GL_ARB_vertex_shader or OpenGL 2.0",glVertexAttrib3fARB,AttribLocation -> GLfloat -> GLfloat -> GLfloat -> IO ())
-EXTENSION_ENTRY("GL_ARB_vertex_shader or OpenGL 2.0",glVertexAttrib4fARB,AttribLocation -> GLfloat -> GLfloat -> GLfloat -> GLfloat -> IO ())
-
-EXTENSION_ENTRY("GL_ARB_vertex_shader or OpenGL 2.0",glVertexAttrib1fvARB,AttribLocation -> Ptr GLfloat -> IO ())
-EXTENSION_ENTRY("GL_ARB_vertex_shader or OpenGL 2.0",glVertexAttrib2fvARB,AttribLocation -> Ptr GLfloat -> IO ())
-EXTENSION_ENTRY("GL_ARB_vertex_shader or OpenGL 2.0",glVertexAttrib3fvARB,AttribLocation -> Ptr GLfloat -> IO ())
-EXTENSION_ENTRY("GL_ARB_vertex_shader or OpenGL 2.0",glVertexAttrib4fvARB,AttribLocation -> Ptr GLfloat -> IO ())
-
-instance VertexAttribComponent GLfloat_ where
-   vertexAttrib1 = glVertexAttrib1fARB
-   vertexAttrib2 = glVertexAttrib2fARB
-   vertexAttrib3 = glVertexAttrib3fARB
-   vertexAttrib4 = glVertexAttrib4fARB
-
-   vertexAttrib1v = glVertexAttrib1fvARB
-   vertexAttrib2v = glVertexAttrib2fvARB
-   vertexAttrib3v = glVertexAttrib3fvARB
-   vertexAttrib4v = glVertexAttrib4fvARB
-
-   vertexAttrib4Nv = vertexAttrib4v
-
-   vertexAttrib4Iv = vertexAttrib4IvRealFrac
-
-vertexAttrib4IvRealFrac :: (Storable a, RealFrac a) => AttribLocation -> Ptr a -> IO ()
-vertexAttrib4IvRealFrac location = peek4M $ \x y z w ->
-   vertexAttrib4I location (toGLint x) (toGLint y) (toGLint z) (toGLint w)
-
--- formula 2.6 from the OpenGL 3.1 spec
-toGLint :: RealFrac a => a -> GLint
-toGLint = truncate . (fromIntegral (maxBound :: GLint) *). clamp
-   where clamp = max (-1.0) . min 1.0
-
---------------------------------------------------------------------------------
-
-EXTENSION_ENTRY("GL_ARB_vertex_shader or OpenGL 2.0",glVertexAttrib1dARB,AttribLocation -> GLdouble -> IO ())
-EXTENSION_ENTRY("GL_ARB_vertex_shader or OpenGL 2.0",glVertexAttrib2dARB,AttribLocation -> GLdouble -> GLdouble -> IO ())
-EXTENSION_ENTRY("GL_ARB_vertex_shader or OpenGL 2.0",glVertexAttrib3dARB,AttribLocation -> GLdouble -> GLdouble -> GLdouble -> IO ())
-EXTENSION_ENTRY("GL_ARB_vertex_shader or OpenGL 2.0",glVertexAttrib4dARB,AttribLocation -> GLdouble -> GLdouble -> GLdouble -> GLdouble -> IO ())
-
-EXTENSION_ENTRY("GL_ARB_vertex_shader or OpenGL 2.0",glVertexAttrib1dvARB,AttribLocation -> Ptr GLdouble -> IO ())
-EXTENSION_ENTRY("GL_ARB_vertex_shader or OpenGL 2.0",glVertexAttrib2dvARB,AttribLocation -> Ptr GLdouble -> IO ())
-EXTENSION_ENTRY("GL_ARB_vertex_shader or OpenGL 2.0",glVertexAttrib3dvARB,AttribLocation -> Ptr GLdouble -> IO ())
-EXTENSION_ENTRY("GL_ARB_vertex_shader or OpenGL 2.0",glVertexAttrib4dvARB,AttribLocation -> Ptr GLdouble -> IO ())
-
-instance VertexAttribComponent GLdouble_ where
-   vertexAttrib1 = glVertexAttrib1dARB
-   vertexAttrib2 = glVertexAttrib2dARB
-   vertexAttrib3 = glVertexAttrib3dARB
-   vertexAttrib4 = glVertexAttrib4dARB
-
-   vertexAttrib1v = glVertexAttrib1dvARB
-   vertexAttrib2v = glVertexAttrib2dvARB
-   vertexAttrib3v = glVertexAttrib3dvARB
-   vertexAttrib4v = glVertexAttrib4dvARB
-
-   vertexAttrib4Nv = vertexAttrib4v
-
-   vertexAttrib4Iv = vertexAttrib4IvRealFrac
-
---------------------------------------------------------------------------------
-
-class VertexAttrib a where
-   vertexAttrib  :: IntegerHandling -> AttribLocation ->     a -> IO ()
-   vertexAttribv :: IntegerHandling -> AttribLocation -> Ptr a -> IO ()
-
-instance VertexAttribComponent a => VertexAttrib (Vertex1 a) where
-   vertexAttrib ToFloat location (Vertex1 i) = vertexAttrib1 location i
-   vertexAttrib ToNormalizedFloat location (Vertex1 i) = vertexAttrib1N location i
-   vertexAttrib KeepIntegral location (Vertex1 i) = vertexAttrib1I location i
-
-   vertexAttribv ToFloat location = vertexAttrib1v location . (castPtr :: Ptr (Vertex1 b) -> Ptr b)
-   vertexAttribv ToNormalizedFloat location = vertexAttrib1Nv location . (castPtr :: Ptr (Vertex1 b) -> Ptr b)
-   vertexAttribv KeepIntegral location = vertexAttrib1Iv location . (castPtr :: Ptr (Vertex1 b) -> Ptr b)
-
-instance VertexAttribComponent a => VertexAttrib (Vertex2 a) where
-   vertexAttrib ToFloat location (Vertex2 x y) = vertexAttrib2 location x y
-   vertexAttrib ToNormalizedFloat location (Vertex2 x y) = vertexAttrib2N location x y
-   vertexAttrib KeepIntegral location (Vertex2 x y) = vertexAttrib2I location x y
-
-   vertexAttribv ToFloat location = vertexAttrib2v location . (castPtr :: Ptr (Vertex2 b) -> Ptr b)
-   vertexAttribv ToNormalizedFloat location = vertexAttrib2Nv location . (castPtr :: Ptr (Vertex2 b) -> Ptr b)
-   vertexAttribv KeepIntegral location = vertexAttrib2Iv location . (castPtr :: Ptr (Vertex2 b) -> Ptr b)
-
-instance VertexAttribComponent a => VertexAttrib (Vertex3 a) where
-   vertexAttrib ToFloat location (Vertex3 x y z) = vertexAttrib3 location x y z
-   vertexAttrib ToNormalizedFloat location (Vertex3 x y z) = vertexAttrib3N location x y z
-   vertexAttrib KeepIntegral location (Vertex3 x y z) = vertexAttrib3I location x y z
-
-   vertexAttribv ToFloat location = vertexAttrib3v location . (castPtr :: Ptr (Vertex3 b) -> Ptr b)
-   vertexAttribv ToNormalizedFloat location = vertexAttrib3Nv location . (castPtr :: Ptr (Vertex3 b) -> Ptr b)
-   vertexAttribv KeepIntegral location = vertexAttrib3Iv location . (castPtr :: Ptr (Vertex3 b) -> Ptr b)
-
-instance VertexAttribComponent a => VertexAttrib (Vertex4 a) where
-   vertexAttrib ToFloat location (Vertex4 x y z w) = vertexAttrib4 location x y z w
-   vertexAttrib ToNormalizedFloat location (Vertex4 x y z w) = vertexAttrib4N location x y z w
-   vertexAttrib KeepIntegral location (Vertex4 x y z w) = vertexAttrib4I location x y z w
-
-   vertexAttribv ToFloat location = vertexAttrib4v location . (castPtr :: Ptr (Vertex4 b) -> Ptr b)
-   vertexAttribv ToNormalizedFloat location = vertexAttrib4Nv location . (castPtr :: Ptr (Vertex4 b) -> Ptr b)
-   vertexAttribv KeepIntegral location = vertexAttrib4Iv location . (castPtr :: Ptr (Vertex4 b) -> Ptr b)
-
-instance VertexAttribComponent a => VertexAttrib (Vector1 a) where
-   vertexAttrib ToFloat location (Vector1 i) = vertexAttrib1 location i
-   vertexAttrib ToNormalizedFloat location (Vector1 i) = vertexAttrib1N location i
-   vertexAttrib KeepIntegral location (Vector1 i) = vertexAttrib1I location i
-
-   vertexAttribv ToFloat location = vertexAttrib1v location . (castPtr :: Ptr (Vector1 b) -> Ptr b)
-   vertexAttribv ToNormalizedFloat location = vertexAttrib1Nv location . (castPtr :: Ptr (Vector1 b) -> Ptr b)
-   vertexAttribv KeepIntegral location = vertexAttrib1Iv location . (castPtr :: Ptr (Vector1 b) -> Ptr b)
-
-instance VertexAttribComponent a => VertexAttrib (Vector2 a) where
-   vertexAttrib ToFloat location (Vector2 x y) = vertexAttrib2 location x y
-   vertexAttrib ToNormalizedFloat location (Vector2 x y) = vertexAttrib2N location x y
-   vertexAttrib KeepIntegral location (Vector2 x y) = vertexAttrib2I location x y
-
-   vertexAttribv ToFloat location = vertexAttrib2v location . (castPtr :: Ptr (Vector2 b) -> Ptr b)
-   vertexAttribv ToNormalizedFloat location = vertexAttrib2Nv location . (castPtr :: Ptr (Vector2 b) -> Ptr b)
-   vertexAttribv KeepIntegral location = vertexAttrib2Iv location . (castPtr :: Ptr (Vector2 b) -> Ptr b)
-
-instance VertexAttribComponent a => VertexAttrib (Vector3 a) where
-   vertexAttrib ToFloat location (Vector3 x y z) = vertexAttrib3 location x y z
-   vertexAttrib ToNormalizedFloat location (Vector3 x y z) = vertexAttrib3N location x y z
-   vertexAttrib KeepIntegral location (Vector3 x y z) = vertexAttrib3I location x y z
-
-   vertexAttribv ToFloat location = vertexAttrib3v location . (castPtr :: Ptr (Vector3 b) -> Ptr b)
-   vertexAttribv ToNormalizedFloat location = vertexAttrib3Nv location . (castPtr :: Ptr (Vector3 b) -> Ptr b)
-   vertexAttribv KeepIntegral location = vertexAttrib3Iv location . (castPtr :: Ptr (Vector3 b) -> Ptr b)
-
-instance VertexAttribComponent a => VertexAttrib (Vector4 a) where
-   vertexAttrib ToFloat location (Vector4 x y z w) = vertexAttrib4 location x y z w
-   vertexAttrib ToNormalizedFloat location (Vector4 x y z w) = vertexAttrib4N location x y z w
-   vertexAttrib KeepIntegral location (Vector4 x y z w) = vertexAttrib4I location x y z w
-
-   vertexAttribv ToFloat location = vertexAttrib4v location . (castPtr :: Ptr (Vector4 b) -> Ptr b)
-   vertexAttribv ToNormalizedFloat location = vertexAttrib4Nv location . (castPtr :: Ptr (Vector4 b) -> Ptr b)
-   vertexAttribv KeepIntegral location = vertexAttrib4Iv location . (castPtr :: Ptr (Vector4 b) -> Ptr b)
-
-instance VertexAttribComponent a => VertexAttrib (TexCoord1 a) where
-   vertexAttrib ToFloat location (TexCoord1 s) = vertexAttrib1 location s
-   vertexAttrib ToNormalizedFloat location (TexCoord1 s) = vertexAttrib1N location s
-   vertexAttrib KeepIntegral location (TexCoord1 s) = vertexAttrib1I location s
-
-   vertexAttribv ToFloat location = vertexAttrib1v location . (castPtr :: Ptr (TexCoord1 b) -> Ptr b)
-   vertexAttribv ToNormalizedFloat location = vertexAttrib1Nv location . (castPtr :: Ptr (TexCoord1 b) -> Ptr b)
-   vertexAttribv KeepIntegral location = vertexAttrib1Iv location . (castPtr :: Ptr (TexCoord1 b) -> Ptr b)
-
-instance VertexAttribComponent a => VertexAttrib (TexCoord2 a) where
-   vertexAttrib ToFloat location (TexCoord2 s t) = vertexAttrib2 location s t
-   vertexAttrib ToNormalizedFloat location (TexCoord2 s t) = vertexAttrib2N location s t
-   vertexAttrib KeepIntegral location (TexCoord2 s t) = vertexAttrib2I location s t
-
-   vertexAttribv ToFloat location = vertexAttrib2v location . (castPtr :: Ptr (TexCoord2 b) -> Ptr b)
-   vertexAttribv ToNormalizedFloat location = vertexAttrib2Nv location . (castPtr :: Ptr (TexCoord2 b) -> Ptr b)
-   vertexAttribv KeepIntegral location = vertexAttrib2Iv location . (castPtr :: Ptr (TexCoord2 b) -> Ptr b)
-
-instance VertexAttribComponent a => VertexAttrib (TexCoord3 a) where
-   vertexAttrib ToFloat location (TexCoord3 s t u) = vertexAttrib3 location s t u
-   vertexAttrib ToNormalizedFloat location (TexCoord3 s t u) = vertexAttrib3N location s t u
-   vertexAttrib KeepIntegral location (TexCoord3 s t u) = vertexAttrib3I location s t u
-
-   vertexAttribv ToFloat location = vertexAttrib3v location . (castPtr :: Ptr (TexCoord3 b) -> Ptr b)
-   vertexAttribv ToNormalizedFloat location = vertexAttrib3Nv location . (castPtr :: Ptr (TexCoord3 b) -> Ptr b)
-   vertexAttribv KeepIntegral location = vertexAttrib3Iv location . (castPtr :: Ptr (TexCoord3 b) -> Ptr b)
-
-instance VertexAttribComponent a => VertexAttrib (TexCoord4 a) where
-   vertexAttrib ToFloat location (TexCoord4 s t u v) = vertexAttrib4 location s t u v
-   vertexAttrib ToNormalizedFloat location (TexCoord4 s t u v) = vertexAttrib4N location s t u v
-   vertexAttrib KeepIntegral location (TexCoord4 s t u v) = vertexAttrib4I location s t u v
-
-   vertexAttribv ToFloat location = vertexAttrib4v location . (castPtr :: Ptr (TexCoord4 b) -> Ptr b)
-   vertexAttribv ToNormalizedFloat location = vertexAttrib4Nv location . (castPtr :: Ptr (TexCoord4 b) -> Ptr b)
-   vertexAttribv KeepIntegral location = vertexAttrib4Iv location . (castPtr :: Ptr (TexCoord4 b) -> Ptr b)
-
-instance VertexAttribComponent a => VertexAttrib (Normal3 a) where
-   vertexAttrib ToFloat location (Normal3 x y z) = vertexAttrib3 location x y z
-   vertexAttrib ToNormalizedFloat location (Normal3 x y z) = vertexAttrib3N location x y z
-   vertexAttrib KeepIntegral location (Normal3 x y z) = vertexAttrib3I location x y z
-
-   vertexAttribv ToFloat location = vertexAttrib3v location . (castPtr :: Ptr (Normal3 b) -> Ptr b)
-   vertexAttribv ToNormalizedFloat location = vertexAttrib3Nv location . (castPtr :: Ptr (Normal3 b) -> Ptr b)
-   vertexAttribv KeepIntegral location = vertexAttrib3Iv location . (castPtr :: Ptr (Normal3 b) -> Ptr b)
-
-instance VertexAttribComponent a => VertexAttrib (FogCoord1 a) where
-   vertexAttrib ToFloat location (FogCoord1 c) = vertexAttrib1 location c
-   vertexAttrib ToNormalizedFloat location (FogCoord1 c) = vertexAttrib1N location c
-   vertexAttrib KeepIntegral location (FogCoord1 c) = vertexAttrib1I location c
-
-   vertexAttribv ToFloat location = vertexAttrib1v location . (castPtr :: Ptr (FogCoord1 b) -> Ptr b)
-   vertexAttribv ToNormalizedFloat location = vertexAttrib1Nv location . (castPtr :: Ptr (FogCoord1 b) -> Ptr b)
-   vertexAttribv KeepIntegral location = vertexAttrib1Iv location . (castPtr :: Ptr (FogCoord1 b) -> Ptr b)
-
-instance VertexAttribComponent a => VertexAttrib (Color3 a) where
-   vertexAttrib ToFloat location (Color3 r g b) = vertexAttrib3 location r g b
-   vertexAttrib ToNormalizedFloat location (Color3 r g b) = vertexAttrib3N location r g b
-   vertexAttrib KeepIntegral location (Color3 r g b) = vertexAttrib3I location r g b
-
-   vertexAttribv ToFloat location = vertexAttrib3v location . (castPtr :: Ptr (Color3 b) -> Ptr b)
-   vertexAttribv ToNormalizedFloat location = vertexAttrib3Nv location . (castPtr :: Ptr (Color3 b) -> Ptr b)
-   vertexAttribv KeepIntegral location = vertexAttrib3Iv location . (castPtr :: Ptr (Color3 b) -> Ptr b)
-
-instance VertexAttribComponent a => VertexAttrib (Color4 a) where
-   vertexAttrib ToFloat location (Color4 r g b a) = vertexAttrib4 location r g b a
-   vertexAttrib ToNormalizedFloat location (Color4 r g b a) = vertexAttrib4N location r g b a
-   vertexAttrib KeepIntegral location (Color4 r g b a) = vertexAttrib4I location r g b a
-
-   vertexAttribv ToFloat location = vertexAttrib4v location . (castPtr :: Ptr (Color4 b) -> Ptr b)
-   vertexAttribv ToNormalizedFloat location = vertexAttrib4Nv location . (castPtr :: Ptr (Color4 b) -> Ptr b)
-   vertexAttribv KeepIntegral location = vertexAttrib4Iv location . (castPtr :: Ptr (Color4 b) -> Ptr b)
-
-instance VertexAttribComponent a => VertexAttrib (Index1 a) where
-   vertexAttrib ToFloat location (Index1 i) = vertexAttrib1 location i
-   vertexAttrib ToNormalizedFloat location (Index1 i) = vertexAttrib1N location i
-   vertexAttrib KeepIntegral location (Index1 i) = vertexAttrib1I location i
-
-   vertexAttribv ToFloat location = vertexAttrib1v location . (castPtr :: Ptr (Index1 b) -> Ptr b)
-   vertexAttribv ToNormalizedFloat location = vertexAttrib1Nv location . (castPtr :: Ptr (Index1 b) -> Ptr b)
-   vertexAttribv KeepIntegral location = vertexAttrib1Iv location . (castPtr :: Ptr (Index1 b) -> Ptr b)
-
---------------------------------------------------------------------------------
-
--- | An implementation must support at least 2 texture units, but it may
--- support up to 32 ones. This state variable can be used to query the actual
--- implementation limit.
-
-maxTextureUnit :: GettableStateVar TextureUnit
-maxTextureUnit =
-   makeGettableStateVar (getEnum1 unmarshalTextureUnit GetMaxTextureUnits)
diff --git a/Graphics/Rendering/OpenGL/GLU.hs b/Graphics/Rendering/OpenGL/GLU.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GLU.hs
+++ /dev/null
@@ -1,31 +0,0 @@
------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GLU
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- A Haskell binding for GLU, OpenGL\'s accompanying utility library.
---
------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GLU (
-     module Graphics.Rendering.OpenGL.GLU.Initialization,
-     module Graphics.Rendering.OpenGL.GLU.Mipmapping,
-     module Graphics.Rendering.OpenGL.GLU.Matrix,
-     module Graphics.Rendering.OpenGL.GLU.Tessellation,
-     module Graphics.Rendering.OpenGL.GLU.Quadrics,
-     module Graphics.Rendering.OpenGL.GLU.NURBS,
-     module Graphics.Rendering.OpenGL.GLU.Errors
-) where
-
-import Graphics.Rendering.OpenGL.GLU.Initialization
-import Graphics.Rendering.OpenGL.GLU.Mipmapping
-import Graphics.Rendering.OpenGL.GLU.Matrix
-import Graphics.Rendering.OpenGL.GLU.Tessellation
-import Graphics.Rendering.OpenGL.GLU.Quadrics
-import Graphics.Rendering.OpenGL.GLU.NURBS
-import Graphics.Rendering.OpenGL.GLU.Errors
diff --git a/Graphics/Rendering/OpenGL/GLU/Errors.hs b/Graphics/Rendering/OpenGL/GLU/Errors.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GLU/Errors.hs
+++ /dev/null
@@ -1,36 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GLU.Errors
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to section 2.5 (GL Errors) of the OpenGL 2.1 specs
--- and chapter 8 (Errors) of the GLU specs, offering a generalized view of
--- errors in GL and GLU.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GLU.Errors (
-   Error(..), ErrorCategory(..), errors
-) where
-
-import Graphics.Rendering.OpenGL.GL.StateVar (
-   GettableStateVar, makeGettableStateVar )
-import Graphics.Rendering.OpenGL.GLU.ErrorsInternal (
-   Error(..), ErrorCategory(..), getErrors )
-
---------------------------------------------------------------------------------
-
--- | When an error occurs, it is recorded in this state variable and no further
--- errors are recorded. Reading 'errors' returns the currently recorded errors
--- (there may be more than one due to a possibly distributed implementation) and
--- resets the state variable to @[]@, re-enabling the recording of future
--- errors. The value @[]@ means that there has been no detectable error since
--- the last time 'errors' was read, or since the GL was initialized.
-
-errors :: GettableStateVar [Error]
-errors = makeGettableStateVar getErrors
diff --git a/Graphics/Rendering/OpenGL/GLU/ErrorsInternal.hs b/Graphics/Rendering/OpenGL/GLU/ErrorsInternal.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GLU/ErrorsInternal.hs
+++ /dev/null
@@ -1,256 +0,0 @@
-{-# OPTIONS_GHC -fno-cse #-}
-
--- #hide
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GLU.ErrorsInternal
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This is a purely internal module corresponding to some parts of section 2.5
--- (GL Errors) of the OpenGL 2.1 specs and chapter 8 (Errors) of the GLU specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GLU.ErrorsInternal (
-   Error(..), ErrorCategory(..), getErrors,
-   recordErrorCode, recordInvalidEnum, recordInvalidValue, recordOutOfMemory
-) where
-
-import Foreign.Ptr ( Ptr, castPtr )
-import Foreign.C.String ( peekCString )
-import Data.IORef ( IORef, newIORef, readIORef, writeIORef )
-import System.IO.Unsafe ( unsafePerformIO )
-import Graphics.Rendering.OpenGL.GL.BasicTypes ( GLenum, GLubyte )
-
---------------------------------------------------------------------------------
--- Alas, GL and GLU define error enumerants with the same names, so we have to
--- rename these to avoid name clashes. Ugly, ugly, ugly...
-
-data GL_ErrorCode =
-     GL_NoError
-   | GL_InvalidEnum
-   | GL_InvalidValue
-   | GL_InvalidOperation
-   | GL_InvalidFramebufferOperation
-   | GL_OutOfMemory
-   | GL_StackOverflow
-   | GL_StackUnderflow
-   | GL_TableTooLarge
-
-gl_marshalErrorCode :: GL_ErrorCode -> GLenum
-gl_marshalErrorCode x = case x of
-   GL_NoError -> 0x0
-   GL_InvalidEnum -> 0x500
-   GL_InvalidValue -> 0x501
-   GL_InvalidOperation -> 0x502
-   GL_InvalidFramebufferOperation -> 0x0506
-   GL_OutOfMemory -> 0x505
-   GL_StackOverflow -> 0x503
-   GL_StackUnderflow -> 0x504
-   GL_TableTooLarge -> 0x8031
-
---------------------------------------------------------------------------------
--- See comment above
-
-data GLU_ErrorCode =
-     GLU_InvalidEnum
-   | GLU_InvalidValue
-   | GLU_OutOfMemory
-   | GLU_InvalidOperation
-
-glu_marshalErrorCode :: GLU_ErrorCode -> GLenum
-glu_marshalErrorCode x = case x of
-   GLU_InvalidEnum -> 0x18a24
-   GLU_InvalidValue -> 0x18a25
-   GLU_OutOfMemory -> 0x18a26
-   GLU_InvalidOperation -> 0x18a28
-
---------------------------------------------------------------------------------
-
--- only the errors with the smallest and the largsest enum value
-data NurbsError =
-     NurbsError1
-   | NurbsError37
-
-marshalNurbsError :: NurbsError -> GLenum
-marshalNurbsError x = case x of
-   NurbsError1 -> 0x1879b
-   NurbsError37 -> 0x187bf
-
---------------------------------------------------------------------------------
-
--- only the errors with the smallest and the largsest enum value
-data TessError =
-     TessError1
-   | TessError8
-
-marshalTessError :: TessError -> GLenum
-marshalTessError x = case x of
-   TessError1 -> 0x18737
-   TessError8 -> 0x1873e
-
---------------------------------------------------------------------------------
-
--- | GL\/GLU errors consist of a general error category and a description of
--- what went wrong.
-
-data Error = Error ErrorCategory String
-   deriving ( Eq, Ord, Show )
-
---------------------------------------------------------------------------------
-
--- | General GL\/GLU error categories
-
-data ErrorCategory
-   = InvalidEnum
-   | InvalidValue
-   | InvalidOperation
-   | InvalidFramebufferOperation
-   | OutOfMemory
-   | StackOverflow
-   | StackUnderflow
-   | TableTooLarge
-   | TesselatorError
-   | NURBSError
-   deriving ( Eq, Ord, Show )
-
-unmarshalErrorCategory :: GLenum -> ErrorCategory
-unmarshalErrorCategory c
-   | isInvalidEnum c      = InvalidEnum
-   | isInvalidValue c     = InvalidValue
-   | isInvalidOperation c = InvalidOperation
-   | isInvalidFramebufferOperation c = InvalidFramebufferOperation 
-   | isOutOfMemory c      = OutOfMemory
-   | isStackOverflow c    = StackOverflow
-   | isStackUnderflow c   = StackUnderflow
-   | isTableTooLarge c    = TableTooLarge
-   | isTesselatorError c  = TesselatorError
-   | isNURBSError c       = NURBSError
-   | otherwise = error "unmarshalErrorCategory"
-
-isInvalidEnum :: GLenum -> Bool
-isInvalidEnum c =
-   c == gl_marshalErrorCode  GL_InvalidEnum ||
-   c == glu_marshalErrorCode GLU_InvalidEnum
-
-isInvalidValue :: GLenum -> Bool
-isInvalidValue c =
-   c == gl_marshalErrorCode  GL_InvalidValue ||
-   c == glu_marshalErrorCode GLU_InvalidValue
-
-isInvalidOperation :: GLenum -> Bool
-isInvalidOperation c =
-   c == gl_marshalErrorCode  GL_InvalidOperation ||
-   c == glu_marshalErrorCode GLU_InvalidOperation
-
-isInvalidFramebufferOperation :: GLenum -> Bool
-isInvalidFramebufferOperation c =
-   c == gl_marshalErrorCode GL_InvalidFramebufferOperation
-
-isOutOfMemory :: GLenum -> Bool
-isOutOfMemory c =
-   c == gl_marshalErrorCode  GL_OutOfMemory ||
-   c == glu_marshalErrorCode GLU_OutOfMemory
-
-isStackOverflow :: GLenum -> Bool
-isStackOverflow c =
-   c == gl_marshalErrorCode GL_StackOverflow
-
-isStackUnderflow :: GLenum -> Bool
-isStackUnderflow c =
-   c == gl_marshalErrorCode GL_StackUnderflow
-
-isTableTooLarge :: GLenum -> Bool
-isTableTooLarge c =
-   c == gl_marshalErrorCode GL_TableTooLarge
-
-isTesselatorError :: GLenum -> Bool
-isTesselatorError c =
-   marshalTessError TessError1 <= c &&
-   c <= marshalTessError TessError8
-
-isNURBSError :: GLenum -> Bool
-isNURBSError c =
-   marshalNurbsError NurbsError1 <= c &&
-   c <= marshalNurbsError NurbsError37
-
---------------------------------------------------------------------------------
-
--- The returned error string is statically allocated, so peekCString
--- does the right thing here. No malloc/free necessary here.
-
-makeError :: GLenum -> IO Error
-makeError e = do
-   let category = unmarshalErrorCategory e
-   ptr <- gluErrorString e
-   description <- peekCString (castPtr ptr)
-   return $ Error category description
-
-foreign import CALLCONV unsafe "gluErrorString" gluErrorString ::
-   GLenum -> IO (Ptr GLubyte)
-
---------------------------------------------------------------------------------
-
--- This seems to be a common Haskell hack nowadays: A plain old global variable
--- with an associated getter and mutator. Perhaps some language/library support
--- is needed?
-
-{-# NOINLINE theRecordedErrors #-}
-theRecordedErrors :: IORef ([GLenum],Bool)
-theRecordedErrors = unsafePerformIO (newIORef ([], True))
-
-getRecordedErrors :: IO ([GLenum],Bool)
-getRecordedErrors =  readIORef theRecordedErrors
-
-setRecordedErrors :: ([GLenum],Bool) -> IO ()
-setRecordedErrors = writeIORef theRecordedErrors
-
---------------------------------------------------------------------------------
-
-getGLErrors :: IO [GLenum]
-getGLErrors = getGLErrorsAux []
-   where getGLErrorsAux acc = do
-            errorCode <- glGetError
-            if isError errorCode
-               then getGLErrorsAux (errorCode : acc)
-               else return $ reverse acc
-
-isError :: GLenum -> Bool
-isError = (/= gl_marshalErrorCode GL_NoError)
-
-foreign import CALLCONV unsafe "glGetError" glGetError :: IO GLenum
-
---------------------------------------------------------------------------------
-
-getErrors :: IO [Error]
-getErrors = do
-   es <- getErrorCodesAux (const ([], True))
-   mapM makeError es
-
-recordErrorCode :: GLenum -> IO ()
-recordErrorCode e = do
-   getErrorCodesAux (\es -> (if null es then [e] else [], False))
-   return ()
-
-recordInvalidEnum :: IO ()
-recordInvalidEnum = recordErrorCode (gl_marshalErrorCode GL_InvalidEnum)
-
-recordInvalidValue :: IO ()
-recordInvalidValue = recordErrorCode (gl_marshalErrorCode GL_InvalidValue)
-
-recordOutOfMemory :: IO ()
-recordOutOfMemory = recordErrorCode (glu_marshalErrorCode GLU_OutOfMemory)
-
--- ToDo: Make this thread-safe
-getErrorCodesAux :: ([GLenum] -> ([GLenum],Bool)) -> IO [GLenum]
-getErrorCodesAux f = do
-   (recordedErrors, useGLErrors) <- getRecordedErrors
-   glErrors <- getGLErrors
-   let es = if useGLErrors then recordedErrors ++ glErrors else recordedErrors
-   setRecordedErrors (f es)
-   return es
diff --git a/Graphics/Rendering/OpenGL/GLU/Initialization.hs b/Graphics/Rendering/OpenGL/GLU/Initialization.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GLU/Initialization.hs
+++ /dev/null
@@ -1,53 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GLU.Initialization
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to chapter 2 (Initialization) of the GLU specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GLU.Initialization (
-   gluVersion, gluExtensions
-) where
-
-import Foreign.Ptr ( Ptr, castPtr )
-import Foreign.C.String ( peekCString )
-import Graphics.Rendering.OpenGL.GL.BasicTypes ( GLenum, GLubyte )
-import Graphics.Rendering.OpenGL.GL.QueryUtils ( maybeNullPtr )
-import Graphics.Rendering.OpenGL.GL.StateVar (
-   GettableStateVar, makeGettableStateVar )
-
---------------------------------------------------------------------------------
-
-gluVersion :: GettableStateVar String
-gluVersion = makeGettableStateVar (getString Version)
-
-gluExtensions :: GettableStateVar [String]
-gluExtensions = makeGettableStateVar (fmap words $ getString Extensions)
-
---------------------------------------------------------------------------------
-
-data StringName =
-     Version
-   | Extensions
-   deriving ( Eq, Ord, Show )
-
-marshalStringName :: StringName -> GLenum
-marshalStringName x = case x of
-   Version -> 0x189c0
-   Extensions -> 0x189c1
-
---------------------------------------------------------------------------------
-
-getString :: StringName -> IO String
-getString n = gluGetString (marshalStringName n) >>=
-              maybeNullPtr (return "") (peekCString . castPtr)
-
-foreign import CALLCONV unsafe "gluGetString" gluGetString ::
-   GLenum -> IO (Ptr GLubyte)
diff --git a/Graphics/Rendering/OpenGL/GLU/Matrix.hs b/Graphics/Rendering/OpenGL/GLU/Matrix.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GLU/Matrix.hs
+++ /dev/null
@@ -1,161 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GLU.Matrix
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to chapter 4 (Matrix Manipulation) of the GLU specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GLU.Matrix (
-   ortho2D, perspective, lookAt, pickMatrix,
-   project, unProject, unProject4
-) where
-
-import Foreign.Marshal.Alloc ( alloca )
-import Foreign.Marshal.Array ( withArray )
-import Foreign.Ptr ( Ptr )
-import Foreign.Storable ( Storable(peek,peekElemOff) )
-import Graphics.Rendering.OpenGL.GL.BasicTypes ( GLint, GLdouble, GLclampd )
-import Graphics.Rendering.OpenGL.GL.CoordTrans (
-   MatrixOrder(..), Matrix(..), MatrixComponent,
-   Vector3(..), Position(..), Size(..) )
-import Graphics.Rendering.OpenGL.GL.Extensions (
-   FunPtr, unsafePerformIO, Invoker, getProcAddress )
-import Graphics.Rendering.OpenGL.GL.GLboolean ( unmarshalGLboolean )
-import Graphics.Rendering.OpenGL.GL.VertexSpec ( Vertex3(..), Vertex4(..) )
-import Graphics.Rendering.OpenGL.GLU.ErrorsInternal ( recordInvalidValue )
-
---------------------------------------------------------------------------------
-
-#include "HsOpenGLExt.h"
-
---------------------------------------------------------------------------------
--- matrix setup
-
-foreign import CALLCONV unsafe "gluOrtho2D" ortho2D ::
-   GLdouble -> GLdouble -> GLdouble -> GLdouble -> IO ()
-
-foreign import CALLCONV unsafe "gluPerspective" perspective ::
-   GLdouble -> GLdouble -> GLdouble -> GLdouble -> IO ()
-
-lookAt :: Vertex3 GLdouble -> Vertex3 GLdouble -> Vector3 GLdouble -> IO ()
-lookAt (Vertex3 eyeX    eyeY    eyeZ)
-       (Vertex3 centerX centerY centerZ)
-       (Vector3 upX     upY     upZ) =
-   gluLookAt eyeX eyeY eyeZ centerX centerY centerZ upX upY upZ
-
-foreign import CALLCONV unsafe "gluLookAt" gluLookAt ::
-      GLdouble -> GLdouble -> GLdouble
-   -> GLdouble -> GLdouble -> GLdouble
-   -> GLdouble -> GLdouble -> GLdouble -> IO ()
-
-pickMatrix ::
-   (GLdouble, GLdouble) -> (GLdouble, GLdouble) -> (Position, Size) -> IO ()
-pickMatrix (x, y) (w, h) viewport =
-   withViewport viewport $ gluPickMatrix x y w h
-
-foreign import CALLCONV unsafe "gluPickMatrix" gluPickMatrix ::
-   GLdouble -> GLdouble -> GLdouble -> GLdouble -> Ptr GLint -> IO ()
-
---------------------------------------------------------------------------------
--- coordinate projection
-
-project ::
-      Matrix m
-   => Vertex3 GLdouble -> m GLdouble -> m GLdouble -> (Position, Size)
-   -> IO (Vertex3 GLdouble)
-project (Vertex3 objX objY objZ) model proj viewport =
-   withColumnMajor model $ \modelBuf ->
-   withColumnMajor proj $ \projBuf ->
-   withViewport viewport $ \viewBuf ->
-   getVertex3 $ gluProject objX objY objZ modelBuf projBuf viewBuf
-
-foreign import CALLCONV unsafe "gluProject" gluProject ::
-      GLdouble -> GLdouble -> GLdouble
-   -> Ptr GLdouble -> Ptr GLdouble -> Ptr GLint
-   -> Ptr GLdouble -> Ptr GLdouble -> Ptr GLdouble -> IO GLint
-
-unProject ::
-      Matrix m
-   => Vertex3 GLdouble -> m GLdouble -> m GLdouble -> (Position, Size)
-   -> IO (Vertex3 GLdouble)
-unProject (Vertex3 objX objY objZ) model proj viewport =
-   withColumnMajor model $ \modelBuf ->
-   withColumnMajor proj $ \projBuf ->
-   withViewport viewport $ \viewBuf ->
-   getVertex3 $ gluUnProject objX objY objZ modelBuf projBuf viewBuf
-
-foreign import CALLCONV unsafe "gluUnProject" gluUnProject ::
-      GLdouble -> GLdouble -> GLdouble
-   -> Ptr GLdouble -> Ptr GLdouble -> Ptr GLint
-   -> Ptr GLdouble -> Ptr GLdouble -> Ptr GLdouble -> IO GLint
-
-unProject4 ::
-      Matrix m
-   => Vertex4 GLdouble -> m GLdouble -> m GLdouble -> (Position, Size)
-   -> GLclampd -> GLclampd
-   -> IO (Vertex4 GLdouble)
-unProject4 (Vertex4 objX objY objZ clipW) model proj viewport near far =
-   withColumnMajor model $ \modelBuf ->
-   withColumnMajor proj $ \projBuf ->
-   withViewport viewport $ \viewBuf ->
-   getVertex4 $
-      gluUnProject4 objX objY objZ clipW modelBuf projBuf viewBuf near far
-
-EXTENSION_ENTRY("GLU 1.3",gluUnProject4,GLdouble -> GLdouble -> GLdouble -> GLdouble -> Ptr GLdouble -> Ptr GLdouble -> Ptr GLint -> GLclampd -> GLclampd -> Ptr GLdouble -> Ptr GLdouble -> Ptr GLdouble -> Ptr GLdouble -> IO GLint)
-
---------------------------------------------------------------------------------
-
-withViewport :: (Position, Size) -> (Ptr GLint -> IO a ) -> IO a
-withViewport (Position x y, Size w h) =
-   withArray [ x, y, fromIntegral w, fromIntegral h ]
-
-withColumnMajor :: (Matrix m, MatrixComponent c) => m c -> (Ptr c -> IO b) -> IO b
-withColumnMajor mat act = withMatrix mat juggle
-   where juggle ColumnMajor p = act p
-         juggle RowMajor    p = do
-            transposedElems <- mapM (peekElemOff p) [ 0, 4,  8, 12,
-                                                      1, 5,  9, 13,
-                                                      2, 6, 10, 14,
-                                                      3, 7, 11, 15 ]
-            withArray transposedElems act
-
-getVertex3 ::
-      (Ptr GLdouble -> Ptr GLdouble -> Ptr GLdouble -> IO GLint)
-   -> IO (Vertex3 GLdouble)
-getVertex3 act =
-   alloca $ \xBuf ->
-   alloca $ \yBuf ->
-   alloca $ \zBuf -> do
-   ok <- act xBuf yBuf zBuf
-   if unmarshalGLboolean ok
-      then do x <- peek xBuf
-              y <- peek yBuf
-              z <- peek zBuf
-              return $ Vertex3 x y z
-      else do recordInvalidValue
-              return $ Vertex3 0 0 0
-
-getVertex4 ::
-      (Ptr GLdouble -> Ptr GLdouble -> Ptr GLdouble -> Ptr GLdouble -> IO GLint)
-   -> IO (Vertex4 GLdouble)
-getVertex4 act =
-   alloca $ \xBuf ->
-   alloca $ \yBuf ->
-   alloca $ \zBuf ->
-   alloca $ \wBuf -> do
-   ok <- act xBuf yBuf zBuf wBuf
-   if unmarshalGLboolean ok
-      then do x <- peek xBuf
-              y <- peek yBuf
-              z <- peek zBuf
-              w <- peek wBuf
-              return $ Vertex4 x y z w
-      else do recordInvalidValue
-              return $ Vertex4 0 0 0 0
diff --git a/Graphics/Rendering/OpenGL/GLU/Mipmapping.hs b/Graphics/Rendering/OpenGL/GLU/Mipmapping.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GLU/Mipmapping.hs
+++ /dev/null
@@ -1,75 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GLU.Mipmapping
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to chapter 3 (Mipmapping) of the GLU specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GLU.Mipmapping (
-   scaleImage, build1DMipmaps, build2DMipmaps
-) where
-
-import Foreign.Ptr ( Ptr )
-import Graphics.Rendering.OpenGL.GL.BasicTypes ( GLsizei, GLint, GLenum )
-import Graphics.Rendering.OpenGL.GL.CoordTrans ( Size(..) )
-import Graphics.Rendering.OpenGL.GL.PixelData ( PixelData, withPixelData )
-import Graphics.Rendering.OpenGL.GL.Texturing.PixelInternalFormat (
-   PixelInternalFormat, marshalPixelInternalFormat )
-import Graphics.Rendering.OpenGL.GL.Texturing.TextureTarget (
-   TextureTarget, marshalTextureTarget )
-import Graphics.Rendering.OpenGL.GLU.ErrorsInternal ( recordInvalidValue )
-
---------------------------------------------------------------------------------
--- Section 3.1 (Image Scaling)
-
-scaleImage :: Size -> PixelData a -> Size -> PixelData b -> IO ()
-scaleImage (Size widthIn  heightIn)  pdIn (Size widthOut heightOut) pdOut =
-   withPixelData pdIn $ \fIn dIn pIn ->
-      withPixelData pdOut $ \fOut dOut pOut ->
-         if fIn == fOut
-            then gluScaleImage
-                    fIn widthIn heightIn dIn pIn widthOut heightOut dOut pOut
-            else recordInvalidValue
-
-foreign import CALLCONV unsafe "gluScaleImage" gluScaleImage ::
-   GLenum -> GLsizei -> GLsizei -> GLenum -> Ptr a
-          -> GLsizei -> GLsizei -> GLenum -> Ptr b -> IO ()
-
---------------------------------------------------------------------------------
--- Section 3.2 (Automatic Mipmapping)
--- Missing for GLU 1.3: gluBuild3DMipmaps, gluBuild{1,2,3}DMipmapLevels
-
-build1DMipmaps ::
-   TextureTarget -> PixelInternalFormat -> GLsizei -> PixelData a -> IO ()
-build1DMipmaps target internalFormat height pd = do
-   withPixelData pd $
-      gluBuild1DMipmaps
-         (marshalTextureTarget target)
-         (marshalPixelInternalFormat internalFormat)
-         height
-   return ()   -- TODO: Should we use the return value?
-
-foreign import CALLCONV unsafe "gluBuild1DMipmaps" gluBuild1DMipmaps ::
-      GLenum -> GLint -> GLsizei -> GLenum -> GLenum -> Ptr a -> IO GLint
-
---------------------------------------------------------------------------------
-
-build2DMipmaps :: TextureTarget -> PixelInternalFormat -> GLsizei -> GLsizei
-               -> PixelData a -> IO ()
-build2DMipmaps target internalFormat width height pd = do
-   withPixelData pd $
-      gluBuild2DMipmaps
-         (marshalTextureTarget target)
-         (marshalPixelInternalFormat internalFormat)
-         width height
-   return ()   -- TODO: Should we use the return value?
-
-foreign import CALLCONV unsafe "gluBuild2DMipmaps" gluBuild2DMipmaps ::
-      GLenum -> GLint -> GLsizei -> GLsizei -> GLenum -> GLenum -> Ptr a -> IO GLint
diff --git a/Graphics/Rendering/OpenGL/GLU/NURBS.hs b/Graphics/Rendering/OpenGL/GLU/NURBS.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GLU/NURBS.hs
+++ /dev/null
@@ -1,465 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GLU.NURBS
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to chapter 7 (NURBS) of the GLU specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GLU.NURBS (
-   NURBSObj, withNURBSObj,
-   NURBSBeginCallback, withNURBSBeginCallback,
-   NURBSVertexCallback, withNURBSVertexCallback,
-   NURBSNormalCallback, withNURBSNormalCallback,
-   NURBSColorCallback, withNURBSColorCallback,
-   NURBSEndCallback, withNURBSEndCallback,
-   checkForNURBSError,
-   nurbsBeginEndCurve, nurbsCurve,
-   nurbsBeginEndSurface, nurbsSurface,
-   TrimmingPoint, nurbsBeginEndTrim, pwlCurve, trimmingCurve,
-   NURBSMode(..), setNURBSMode,
-   setNURBSCulling,
-   SamplingMethod(..), setSamplingMethod,
-   loadSamplingMatrices,
-   DisplayMode'(..), setDisplayMode'
-) where
-
-import Control.Monad ( unless )
-import Foreign.Marshal.Array ( withArray )
-import Foreign.Ptr ( Ptr, nullPtr, castPtr, FunPtr, freeHaskellFunPtr )
-import Foreign.Storable ( Storable(..) )
-import Graphics.Rendering.OpenGL.GL.BasicTypes (
-   GLenum, GLint, GLfloat, Capability )
-import Graphics.Rendering.OpenGL.GL.Capability ( marshalCapability )
-import Graphics.Rendering.OpenGL.GL.ControlPoint
-import Graphics.Rendering.OpenGL.GL.CoordTrans (
-   Position(..), Size(..), MatrixOrder(ColumnMajor), MatrixComponent, Matrix(..) )
-import Graphics.Rendering.OpenGL.GL.Exception ( bracket, bracket_ )
-import Graphics.Rendering.OpenGL.GL.GLboolean ( marshalGLboolean )
-import Graphics.Rendering.OpenGL.GL.PrimitiveMode ( unmarshalPrimitiveMode )
-import Graphics.Rendering.OpenGL.GL.BeginEnd ( PrimitiveMode )
-import Graphics.Rendering.OpenGL.GL.VertexSpec (
-   Vertex2, Vertex3, Normal3, Color4 )
-import Graphics.Rendering.OpenGL.GLU.ErrorsInternal (
-   recordErrorCode, recordOutOfMemory )
-
---------------------------------------------------------------------------------
-
-data NURBSCallback =
-     Error
-   | Begin
-   | Vertex
-   | Normal
-   | Color
-   | TextureCoord
-   | End
-   | BeginData
-   | VertexData
-   | NormalData
-   | ColorData
-   | TextureCoordData
-   | EndData
-
-marshalNURBSCallback :: NURBSCallback -> GLenum
-marshalNURBSCallback x = case x of
-   Error -> 100103
-   Begin -> 100164
-   Vertex -> 100165
-   Normal -> 100166
-   Color -> 100167
-   TextureCoord -> 100168
-   End -> 100169
-   BeginData -> 100170
-   VertexData -> 100171
-   NormalData -> 100172
-   ColorData -> 100173
-   TextureCoordData -> 100174
-   EndData -> 100175
-
---------------------------------------------------------------------------------
--- chapter 7.1: The NURBS Object
-
--- an opaque pointer to a NURBS object
-newtype NURBSObj = NURBSObj (Ptr NURBSObj)
-
-isNullNURBSObj :: NURBSObj -> Bool
-isNullNURBSObj (NURBSObj ptr) = ptr == nullPtr
-
-withNURBSObj :: a -> (NURBSObj -> IO a) -> IO a
-withNURBSObj failureValue action =
-   bracket gluNewNurbsRenderer safeDeleteNurbsRenderer
-           (\nurbsObj -> if isNullNURBSObj nurbsObj
-                            then do recordOutOfMemory
-                                    return failureValue
-                            else action nurbsObj)
-
-foreign import CALLCONV safe "gluNewNurbsRenderer"
-   gluNewNurbsRenderer :: IO NURBSObj
-
-safeDeleteNurbsRenderer :: NURBSObj -> IO ()
-safeDeleteNurbsRenderer nurbsObj =
-   unless (isNullNURBSObj nurbsObj) $ gluDeleteNurbsRenderer nurbsObj
-
-foreign import CALLCONV safe "gluDeleteNurbsRenderer"
-   gluDeleteNurbsRenderer :: NURBSObj -> IO ()
-
---------------------------------------------------------------------------------
--- chapter 7.2: Callbacks (begin)
-
-type NURBSBeginCallback = PrimitiveMode -> IO ()
-
-type BeginCallback' = GLenum -> IO ()
-
-withNURBSBeginCallback :: NURBSObj -> NURBSBeginCallback -> IO a -> IO a
-withNURBSBeginCallback nurbsObj beginCallback action =
-   bracket (makeBeginCallback (beginCallback . unmarshalPrimitiveMode))
-           freeHaskellFunPtr $ \callbackPtr -> do
-      setBeginCallback nurbsObj (marshalNURBSCallback Begin) callbackPtr
-      action
-
-foreign import CALLCONV "wrapper" makeBeginCallback ::
-   BeginCallback' -> IO (FunPtr BeginCallback')
-
-foreign import CALLCONV safe "gluNurbsCallback"
-   setBeginCallback :: NURBSObj -> GLenum -> FunPtr BeginCallback' -> IO ()
-
---------------------------------------------------------------------------------
--- chapter 7.2: Callbacks (vertex)
-
-type NURBSVertexCallback = Vertex3 GLfloat -> IO ()
-
-type VertexCallback' = Ptr (Vertex3 GLfloat) -> IO ()
-
-withNURBSVertexCallback :: NURBSObj -> NURBSVertexCallback -> IO a -> IO a
-withNURBSVertexCallback nurbsObj vertexCallback action =
-   bracket (makeVertexCallback (\p -> peek p >>= vertexCallback))
-           freeHaskellFunPtr $ \callbackPtr -> do
-      setVertexCallback nurbsObj (marshalNURBSCallback Vertex) callbackPtr
-      action
-
-foreign import CALLCONV "wrapper" makeVertexCallback ::
-   VertexCallback' -> IO (FunPtr VertexCallback')
-
-foreign import CALLCONV safe "gluNurbsCallback"
-   setVertexCallback :: NURBSObj -> GLenum -> FunPtr VertexCallback' -> IO ()
-
---------------------------------------------------------------------------------
--- chapter 7.2: Callbacks (normal)
-
-type NURBSNormalCallback = Normal3 GLfloat -> IO ()
-
-type NormalCallback' = Ptr (Normal3 GLfloat) -> IO ()
-
-withNURBSNormalCallback :: NURBSObj -> NURBSNormalCallback -> IO a -> IO a
-withNURBSNormalCallback nurbsObj normalCallback action =
-   bracket (makeNormalCallback (\p -> peek p >>= normalCallback))
-           freeHaskellFunPtr $ \callbackPtr -> do
-      setNormalCallback nurbsObj (marshalNURBSCallback Normal) callbackPtr
-      action
-
-foreign import CALLCONV "wrapper" makeNormalCallback ::
-   NormalCallback' -> IO (FunPtr NormalCallback')
-
-foreign import CALLCONV safe "gluNurbsCallback"
-   setNormalCallback :: NURBSObj -> GLenum -> FunPtr NormalCallback' -> IO ()
-
---------------------------------------------------------------------------------
--- chapter 7.2: Callbacks (color)
-
-type NURBSColorCallback = Color4 GLfloat -> IO ()
-
-type ColorCallback' = Ptr (Color4 GLfloat) -> IO ()
-
-withNURBSColorCallback :: NURBSObj -> NURBSColorCallback -> IO a -> IO a
-withNURBSColorCallback nurbsObj colorCallback action =
-   bracket (makeColorCallback (\p -> peek p >>= colorCallback))
-           freeHaskellFunPtr $ \callbackPtr -> do
-      setColorCallback nurbsObj (marshalNURBSCallback Color) callbackPtr
-      action
-
-foreign import CALLCONV "wrapper" makeColorCallback ::
-   ColorCallback' -> IO (FunPtr ColorCallback')
-
-foreign import CALLCONV safe "gluNurbsCallback"
-   setColorCallback :: NURBSObj -> GLenum -> FunPtr ColorCallback' -> IO ()
-
---------------------------------------------------------------------------------
--- chapter 7.2: Callbacks (end)
-
-type NURBSEndCallback = IO ()
-
-withNURBSEndCallback :: NURBSObj -> NURBSEndCallback -> IO a -> IO a
-withNURBSEndCallback nurbsObj endCallback action =
-   bracket (makeEndCallback endCallback)
-           freeHaskellFunPtr $ \callbackPtr -> do
-      setEndCallback nurbsObj (marshalNURBSCallback End) callbackPtr
-      action
-
-foreign import CALLCONV "wrapper" makeEndCallback ::
-   NURBSEndCallback -> IO (FunPtr NURBSEndCallback)
-
-foreign import CALLCONV safe "gluNurbsCallback"
-   setEndCallback :: NURBSObj -> GLenum -> FunPtr NURBSEndCallback -> IO ()
-
---------------------------------------------------------------------------------
--- chapter 7.2: Callbacks (error)
-
-type ErrorCallback = GLenum -> IO ()
-
-withErrorCallback :: NURBSObj -> ErrorCallback -> IO a -> IO a
-withErrorCallback nurbsObj errorCallback action =
-   bracket (makeErrorCallback errorCallback)
-           freeHaskellFunPtr $ \callbackPtr -> do
-      setErrorCallback nurbsObj (marshalNURBSCallback Error) callbackPtr
-      action
-
-foreign import CALLCONV "wrapper" makeErrorCallback ::
-   ErrorCallback -> IO (FunPtr ErrorCallback)
-
-foreign import CALLCONV safe "gluNurbsCallback"
-   setErrorCallback :: NURBSObj -> GLenum -> FunPtr ErrorCallback -> IO ()
-
-checkForNURBSError :: NURBSObj -> IO a -> IO a
-checkForNURBSError nurbsObj = withErrorCallback nurbsObj recordErrorCode
-
---------------------------------------------------------------------------------
--- chapter 7.3: NURBS Curves
-
-nurbsBeginEndCurve :: NURBSObj -> IO a -> IO a
-nurbsBeginEndCurve nurbsObj =
-   bracket_ (gluBeginCurve nurbsObj) (gluEndCurve nurbsObj)
-
-foreign import CALLCONV safe "gluBeginCurve"
-   gluBeginCurve :: NURBSObj -> IO ()
-
-nurbsCurve :: ControlPoint c => NURBSObj -> GLint -> Ptr GLfloat -> GLint -> Ptr (c GLfloat) -> GLint -> IO ()
-nurbsCurve nurbsObj knotCount knots stride control order =
-   gluNurbsCurve nurbsObj knotCount knots stride (castPtr control) order (map1Target (pseudoPeek control))
-
-pseudoPeek :: Ptr (c GLfloat) -> c GLfloat
-pseudoPeek _ = undefined
-
-foreign import CALLCONV safe "gluNurbsCurve"
-   gluNurbsCurve :: NURBSObj -> GLint -> Ptr GLfloat -> GLint -> Ptr GLfloat -> GLint -> GLenum -> IO ()
-
-foreign import CALLCONV safe "gluEndCurve"
-   gluEndCurve :: NURBSObj -> IO ()
-
---------------------------------------------------------------------------------
--- chapter 7.4: NURBS Surfaces
-
-nurbsBeginEndSurface :: NURBSObj -> IO a -> IO a
-nurbsBeginEndSurface nurbsObj =
-   bracket_ (gluBeginSurface nurbsObj) (gluEndSurface nurbsObj)
-
-foreign import CALLCONV safe "gluBeginSurface"
-   gluBeginSurface :: NURBSObj -> IO ()
-
-nurbsSurface :: ControlPoint c => NURBSObj -> GLint -> Ptr GLfloat -> GLint -> Ptr GLfloat -> GLint -> GLint -> Ptr (c GLfloat) -> GLint -> GLint -> IO ()
-nurbsSurface nurbsObj sKnotCount sKnots tKnotCount tKnots sStride tStride control sOrder tOrder =
-   gluNurbsSurface nurbsObj sKnotCount sKnots tKnotCount tKnots sStride tStride (castPtr control) sOrder tOrder (map2Target (pseudoPeek control))
-
-foreign import CALLCONV safe "gluNurbsSurface"
-   gluNurbsSurface :: NURBSObj -> GLint -> Ptr GLfloat -> GLint -> Ptr GLfloat -> GLint -> GLint -> Ptr GLfloat -> GLint -> GLint -> GLenum -> IO ()
-
-foreign import CALLCONV safe "gluEndSurface"
-   gluEndSurface :: NURBSObj -> IO ()
-
---------------------------------------------------------------------------------
--- chapter 7.5: Trimming
-
-class TrimmingPoint p where
-   trimmingTarget :: p GLfloat -> GLenum
-
-instance TrimmingPoint Vertex2 where
-   trimmingTarget = marshalNURBSTrim . const Map1Trim2
-
-instance TrimmingPoint Vertex3 where
-   trimmingTarget = marshalNURBSTrim . const Map1Trim3
-
-data NURBSTrim =
-     Map1Trim2
-   | Map1Trim3
-
-marshalNURBSTrim :: NURBSTrim -> GLenum
-marshalNURBSTrim x = case x of
-   Map1Trim2 -> 100210
-   Map1Trim3 -> 100211
-
-nurbsBeginEndTrim :: NURBSObj -> IO a -> IO a
-nurbsBeginEndTrim nurbsObj =
-   bracket_ (gluBeginTrim nurbsObj) (gluEndTrim nurbsObj)
-
-foreign import CALLCONV safe "gluBeginTrim"
-   gluBeginTrim :: NURBSObj -> IO ()
-
-pwlCurve :: TrimmingPoint p => NURBSObj -> GLint -> Ptr (p GLfloat) -> GLint -> IO ()
-pwlCurve nurbsObj count points stride =
-   gluPwlCurve nurbsObj count (castPtr points) stride (trimmingTarget (pseudoPeek points))
-
-foreign import CALLCONV safe "gluPwlCurve"
-   gluPwlCurve :: NURBSObj -> GLint -> Ptr GLfloat -> GLint -> GLenum -> IO ()
-
-trimmingCurve :: TrimmingPoint c => NURBSObj -> GLint -> Ptr GLfloat -> GLint -> Ptr (c GLfloat) -> GLint -> IO ()
-trimmingCurve nurbsObj knotCount knots stride control order =
-   gluNurbsCurve nurbsObj knotCount knots stride (castPtr control) order (trimmingTarget (pseudoPeek control))
-
-foreign import CALLCONV safe "gluEndTrim"
-   gluEndTrim :: NURBSObj -> IO ()
-
---------------------------------------------------------------------------------
--- chapter 7.6: NURBS Properties
-
-data NURBSProperty =
-     AutoLoadMatrix
-   | Culling
-   | ParametricTolerance
-   | SamplingTolerance
-   | DisplayMode'
-   | SamplingMethod
-   | UStep
-   | VStep
-   | NURBSMode
-
-marshalNURBSProperty :: NURBSProperty -> GLenum
-marshalNURBSProperty x = case x of
-   AutoLoadMatrix -> 100200
-   Culling -> 100201
-   ParametricTolerance -> 100202
-   SamplingTolerance -> 100203
-   DisplayMode' -> 100204
-   SamplingMethod -> 100205
-   UStep -> 100206
-   VStep -> 100207
-   NURBSMode -> 100160
-
---------------------------------------------------------------------------------
-
-setNURBSProperty :: NURBSObj -> NURBSProperty -> GLfloat -> IO ()
-setNURBSProperty nurbsObj = gluNurbsProperty nurbsObj . marshalNURBSProperty
-
-foreign import CALLCONV safe "gluNurbsProperty"
-   gluNurbsProperty :: NURBSObj -> GLenum -> GLfloat -> IO ()
-
---------------------------------------------------------------------------------
-
-data NURBSMode =
-     NURBSTessellator
-   | NURBSRenderer
-   deriving ( Eq, Ord, Show )
-
-marshalNURBSMode :: NURBSMode -> GLfloat
-marshalNURBSMode x = case x of
-   NURBSTessellator -> 100161
-   NURBSRenderer -> 100162
-
-setNURBSMode :: NURBSObj -> NURBSMode -> IO ()
-setNURBSMode nurbsObj = setNURBSProperty nurbsObj NURBSMode . marshalNURBSMode
-
---------------------------------------------------------------------------------
-
-setNURBSCulling :: NURBSObj -> Capability -> IO ()
-setNURBSCulling nurbsObj = setNURBSProperty nurbsObj Culling . fromIntegral . marshalCapability
-
---------------------------------------------------------------------------------
-
-data SamplingMethod' =
-     PathLength'
-   | ParametricError'
-   | DomainDistance'
-   | ObjectPathLength'
-   | ObjectParametricError'
-
-marshalSamplingMethod' :: SamplingMethod' -> GLfloat
-marshalSamplingMethod' x = case x of
-   PathLength' -> 100215
-   ParametricError' -> 100216
-   DomainDistance' -> 100217
-   ObjectPathLength' -> 100209
-   ObjectParametricError' -> 100208
-
-setSamplingMethod' :: NURBSObj -> SamplingMethod' -> IO ()
-setSamplingMethod' nurbsObj = setNURBSProperty nurbsObj SamplingMethod . marshalSamplingMethod'
-
---------------------------------------------------------------------------------
-
-data SamplingMethod =
-     PathLength GLfloat
-   | ParametricError GLfloat
-   | DomainDistance GLfloat GLfloat
-   | ObjectPathLength GLfloat
-   | ObjectParametricError GLfloat
-   deriving ( Eq, Ord, Show )
-
-setSamplingMethod :: NURBSObj -> SamplingMethod -> IO ()
-setSamplingMethod nurbsObj x = case x of
-   PathLength s -> do
-      setNURBSProperty nurbsObj SamplingTolerance s
-      setSamplingMethod' nurbsObj PathLength'
-   ParametricError p -> do
-      setNURBSProperty nurbsObj ParametricTolerance p
-      setSamplingMethod' nurbsObj ParametricError'
-   DomainDistance u v -> do
-      setNURBSProperty nurbsObj UStep u
-      setNURBSProperty nurbsObj VStep v
-      setSamplingMethod' nurbsObj DomainDistance'
-   ObjectPathLength s -> do
-      setNURBSProperty nurbsObj SamplingTolerance s
-      setSamplingMethod' nurbsObj ObjectPathLength'
-   ObjectParametricError p -> do
-      setNURBSProperty nurbsObj ParametricTolerance p
-      setSamplingMethod' nurbsObj ObjectParametricError'
-
---------------------------------------------------------------------------------
-
-setAutoLoadMatrix :: NURBSObj -> Bool -> IO ()
-setAutoLoadMatrix nurbsObj = setNURBSProperty nurbsObj AutoLoadMatrix . marshalGLboolean
-
-loadSamplingMatrices :: (Matrix m1, Matrix m2) => NURBSObj -> Maybe (m1 GLfloat, m2 GLfloat, (Position, Size)) -> IO ()
-loadSamplingMatrices nurbsObj =
-   maybe
-      (setAutoLoadMatrix nurbsObj True)
-      (\(mv, proj, (Position x y, Size w h)) -> do
-          withMatrixColumnMajor mv $ \mvBuf ->
-             withMatrixColumnMajor proj $ \projBuf ->
-                withArray [x, y, w, h] $ \viewportBuf ->
-                  gluLoadSamplingMatrices nurbsObj mvBuf projBuf viewportBuf
-          setAutoLoadMatrix nurbsObj False)
-
-withMatrixColumnMajor :: (Matrix m, MatrixComponent c) => m c -> (Ptr c -> IO a) -> IO a
-withMatrixColumnMajor mat act =
-   withMatrix mat $ \order p ->
-      if order == ColumnMajor
-         then act p
-         else do
-            elems <- mapM (peekElemOff p) [ 0, 4,  8, 12,
-                                            1, 5,  9, 13,
-                                            2, 6, 10, 14,
-                                            3, 7, 11, 15 ]
-            withArray elems act
-
-foreign import CALLCONV safe "gluLoadSamplingMatrices"
-   gluLoadSamplingMatrices :: NURBSObj -> Ptr GLfloat -> Ptr GLfloat -> Ptr GLint -> IO ()
-
---------------------------------------------------------------------------------
-
-data DisplayMode' =
-     Fill'
-   | OutlinePolygon
-   | OutlinePatch
-   deriving ( Eq, Ord, Show )
-
-marshalDisplayMode' :: DisplayMode' -> GLfloat
-marshalDisplayMode' x = case x of
-   Fill' -> 100012
-   OutlinePolygon -> 100240
-   OutlinePatch -> 100241
-
-setDisplayMode' :: NURBSObj -> DisplayMode' -> IO ()
-setDisplayMode' nurbsObj = setNURBSProperty nurbsObj DisplayMode' . marshalDisplayMode'
diff --git a/Graphics/Rendering/OpenGL/GLU/Quadrics.hs b/Graphics/Rendering/OpenGL/GLU/Quadrics.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GLU/Quadrics.hs
+++ /dev/null
@@ -1,212 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GLU.Quadrics
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to chapter 6 (Quadrics) of the GLU specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GLU.Quadrics (
-   QuadricNormal, QuadricTexture(..), QuadricOrientation(..),
-   QuadricDrawStyle(..), QuadricStyle(..),
-   Radius, Height, Angle, Slices, Stacks, Loops, QuadricPrimitive(..),
-   renderQuadric
-) where
-
-import Control.Monad ( unless )
-import Foreign.Ptr ( Ptr, nullPtr, FunPtr, freeHaskellFunPtr )
-import Graphics.Rendering.OpenGL.GL.BasicTypes (
-   GLboolean, GLenum, GLint, GLdouble )
-import Graphics.Rendering.OpenGL.GL.Colors ( ShadingModel(Smooth,Flat) )
-import Graphics.Rendering.OpenGL.GL.Exception ( bracket )
-import Graphics.Rendering.OpenGL.GL.GLboolean ( marshalGLboolean )
-import Graphics.Rendering.OpenGL.GLU.ErrorsInternal (
-   recordErrorCode, recordOutOfMemory )
-
---------------------------------------------------------------------------------
-
-data QuadricDrawStyle =
-     PointStyle
-   | LineStyle
-   | FillStyle
-   | SilhouetteStyle
-   deriving ( Eq, Ord, Show )
-
-marshalQuadricDrawStyle :: QuadricDrawStyle -> GLenum
-marshalQuadricDrawStyle x = case x of
-   PointStyle -> 0x186aa
-   LineStyle -> 0x186ab
-   FillStyle -> 0x186ac
-   SilhouetteStyle -> 0x186ad
-
---------------------------------------------------------------------------------
-
-data QuadricCallback =
-     Error'2
-   deriving ( Eq, Ord, Show )
-
-marshalQuadricCallback :: QuadricCallback -> GLenum
-marshalQuadricCallback x = case x of
-   Error'2 -> 0x18707
-
---------------------------------------------------------------------------------
-
-type QuadricNormal = Maybe ShadingModel
-
-marshalQuadricNormal :: QuadricNormal -> GLenum
-marshalQuadricNormal (Just Smooth) = 0x186a0
-marshalQuadricNormal (Just Flat  ) = 0x186a1
-marshalQuadricNormal Nothing       = 0x186a2
-
---------------------------------------------------------------------------------
-
-data QuadricOrientation =
-     Outside
-   | Inside
-   deriving ( Eq, Ord, Show )
-
-marshalQuadricOrientation :: QuadricOrientation -> GLenum
-marshalQuadricOrientation x = case x of
-   Outside -> 0x186b4
-   Inside -> 0x186b5
-
---------------------------------------------------------------------------------
-
-data QuadricTexture
-   = NoTextureCoordinates
-   | GenerateTextureCoordinates
-   deriving ( Eq,Ord )
-
-marshalQuadricTexture :: QuadricTexture -> GLboolean
-marshalQuadricTexture NoTextureCoordinates       = marshalGLboolean False
-marshalQuadricTexture GenerateTextureCoordinates = marshalGLboolean True
-
---------------------------------------------------------------------------------
-
-data QuadricStyle
-   = QuadricStyle QuadricNormal
-                  QuadricTexture
-                  QuadricOrientation
-                  QuadricDrawStyle
-   deriving ( Eq,Ord )
-
---------------------------------------------------------------------------------
-
-type Radius = GLdouble
-type Height = GLdouble
-type Angle  = GLdouble
-type Slices = GLint
-type Stacks = GLint
-type Loops  = GLint
-
---------------------------------------------------------------------------------
-
-data QuadricPrimitive
-   = Sphere Radius Slices Stacks
-   | Cylinder Radius Radius Height Slices Stacks
-   | Disk Radius Radius Slices Loops
-   | PartialDisk Radius Radius Slices Loops Angle Angle
-   deriving ( Eq, Ord )
-
---------------------------------------------------------------------------------
-
-renderQuadric :: QuadricStyle -> QuadricPrimitive -> IO ()
-renderQuadric style prim = do
-   withQuadricObj recordOutOfMemory $ \quadricObj ->
-      withErrorCallback quadricObj recordErrorCode $ do
-         setStyle quadricObj style
-         renderPrimitive quadricObj prim
-
-withQuadricObj :: IO a -> (QuadricObj -> IO a) -> IO a
-withQuadricObj failure success =
-   bracket gluNewQuadric safeDeleteQuadric
-           (\quadricObj -> if isNullQuadricObj quadricObj
-                              then failure
-                              else success quadricObj)
-
-withErrorCallback :: QuadricObj -> QuadricCallback' -> IO a -> IO a
-withErrorCallback quadricObj callback action =
-   bracket (makeQuadricCallback callback) freeHaskellFunPtr $ \callbackPtr -> do
-      gluQuadricCallback quadricObj (marshalQuadricCallback Error'2) callbackPtr
-      action
-
-setStyle :: QuadricObj -> QuadricStyle -> IO ()
-setStyle quadricObj (QuadricStyle n t o d) = do
-   gluQuadricNormals     quadricObj (marshalQuadricNormal      n)
-   gluQuadricTexture     quadricObj (marshalQuadricTexture     t)
-   gluQuadricOrientation quadricObj (marshalQuadricOrientation o)
-   gluQuadricDrawStyle   quadricObj (marshalQuadricDrawStyle   d)
-
-renderPrimitive :: QuadricObj -> QuadricPrimitive -> IO ()
-renderPrimitive quadricObj (Sphere r s n) =
-   gluSphere quadricObj r s n
-renderPrimitive quadricObj (Cylinder b t h s n) =
-   gluCylinder quadricObj b t h s n
-renderPrimitive quadricObj (Disk i o s l) =
-   gluDisk quadricObj i o s l
-renderPrimitive quadricObj (PartialDisk i o s l a w) =
-   gluPartialDisk quadricObj i o s l a w
-
---------------------------------------------------------------------------------
-
--- 'Char' is a fake here, any marshalable type would do
-newtype QuadricObj = QuadricObj (Ptr Char)
-   deriving ( Eq )
-
-isNullQuadricObj :: QuadricObj -> Bool
-isNullQuadricObj = (QuadricObj nullPtr ==)
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "gluNewQuadric" gluNewQuadric :: IO QuadricObj
-
-safeDeleteQuadric :: QuadricObj -> IO ()
-safeDeleteQuadric quadricObj =
-   unless (isNullQuadricObj quadricObj) $ gluDeleteQuadric quadricObj
-
-foreign import CALLCONV unsafe "gluDeleteQuadric" gluDeleteQuadric ::
-   QuadricObj -> IO ()
-
---------------------------------------------------------------------------------
-
-type QuadricCallback' = GLenum -> IO ()
-
-foreign import CALLCONV "wrapper" makeQuadricCallback ::
-   QuadricCallback' -> IO (FunPtr QuadricCallback')
-
-foreign import CALLCONV unsafe "gluQuadricCallback" gluQuadricCallback ::
-   QuadricObj -> GLenum -> FunPtr QuadricCallback' -> IO ()
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "gluQuadricNormals" gluQuadricNormals ::
-   QuadricObj -> GLenum -> IO ()
-
-foreign import CALLCONV unsafe "gluQuadricTexture" gluQuadricTexture ::
-   QuadricObj -> GLboolean -> IO ()
-
-foreign import CALLCONV unsafe "gluQuadricOrientation" gluQuadricOrientation ::
-   QuadricObj -> GLenum -> IO ()
-
-foreign import CALLCONV unsafe "gluQuadricDrawStyle" gluQuadricDrawStyle ::
-   QuadricObj -> GLenum -> IO ()
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV safe "gluSphere" gluSphere ::
-   QuadricObj -> Radius -> Slices -> Stacks -> IO ()
-
-foreign import CALLCONV safe "gluCylinder" gluCylinder ::
-  QuadricObj -> Radius -> Radius -> Height -> Slices -> Stacks -> IO ()
-
-foreign import CALLCONV safe "gluDisk" gluDisk ::
-   QuadricObj -> Radius -> Radius -> Slices -> Loops -> IO ()
-
-foreign import CALLCONV safe "gluPartialDisk" gluPartialDisk ::
-   QuadricObj -> Radius -> Radius -> Slices -> Loops -> Angle -> Angle -> IO ()
diff --git a/Graphics/Rendering/OpenGL/GLU/Tessellation.hs b/Graphics/Rendering/OpenGL/GLU/Tessellation.hs
deleted file mode 100644
--- a/Graphics/Rendering/OpenGL/GLU/Tessellation.hs
+++ /dev/null
@@ -1,709 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.GLU.Tessellation
--- Copyright   :  (c) Sven Panne 2002-2009
--- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
--- 
--- Maintainer  :  sven.panne@aedion.de
--- Stability   :  stable
--- Portability :  portable
---
--- This module corresponds to chapter 5 (Polygon Tessellation) of the GLU specs.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.GLU.Tessellation (
-   -- * Polygon description
-   AnnotatedVertex(..), ComplexContour(..), ComplexPolygon(..),
-
-   -- * Combining vertices
-   WeightedProperties(..), Combiner,
-
-   -- * Tessellation parameters
-   TessWinding(..), Tolerance,
-
-   -- * Tessellator type
-   Tessellator,
-
-   -- * Contour extraction
-   SimpleContour(..), PolygonContours(..), extractContours,
-
-   -- * Triangulation
-   TriangleVertex, Triangle(..), Triangulation(..), triangulate,
-
-   -- * Tessellation into primitives
-   Primitive(..), SimplePolygon(..), tessellate
-) where
-
-import Control.Monad ( foldM, unless )
-import Data.IORef ( newIORef, readIORef, writeIORef, modifyIORef )
-import Data.Maybe ( fromJust )
-import Foreign.Marshal.Alloc ( allocaBytes )
-import Foreign.Marshal.Array ( peekArray, pokeArray )
-import Foreign.Marshal.Pool ( Pool, withPool, pooledNew )
-import Foreign.Ptr ( Ptr, nullPtr, plusPtr, castPtr, FunPtr, freeHaskellFunPtr )
-import Foreign.Storable ( Storable(..) )
-import Graphics.Rendering.OpenGL.GL.BasicTypes (
-   GLboolean, GLclampf, GLdouble, GLenum )
-import Graphics.Rendering.OpenGL.GL.EdgeFlag ( unmarshalEdgeFlag )
-import Graphics.Rendering.OpenGL.GL.Exception ( bracket )
-import Graphics.Rendering.OpenGL.GL.GLboolean ( marshalGLboolean )
-import Graphics.Rendering.OpenGL.GL.PrimitiveMode ( unmarshalPrimitiveMode )
-import Graphics.Rendering.OpenGL.GL.BeginEnd (
-   PrimitiveMode, EdgeFlag(BeginsInteriorEdge) )
-import Graphics.Rendering.OpenGL.GL.VertexSpec (
-   Vertex3(..), Normal3(..) )
-import Graphics.Rendering.OpenGL.GL.QueryUtils ( maybeNullPtr )
-import Graphics.Rendering.OpenGL.GLU.ErrorsInternal (
-   recordErrorCode, recordOutOfMemory )
-
---------------------------------------------------------------------------------
-
-data TessCallback =
-     TessBegin
-   | Begin
-   | TessVertex
-   | Vertex
-   | TessEnd
-   | End
-   | TessError
-   | Error'
-   | TessEdgeFlag
-   | EdgeFlag
-   | TessCombine
-   | TessBeginData
-   | TessVertexData
-   | TessEndData
-   | TessErrorData
-   | TessEdgeFlagData
-   | TessCombineData
-
-marshalTessCallback :: TessCallback -> GLenum
-marshalTessCallback x = case x of
-   TessBegin -> 0x18704
-   Begin -> 0x18704
-   TessVertex -> 0x18705
-   Vertex -> 0x18705
-   TessEnd -> 0x18706
-   End -> 0x18706
-   TessError -> 0x18707
-   Error' -> 0x18707
-   TessEdgeFlag -> 0x18708
-   EdgeFlag -> 0x18708
-   TessCombine -> 0x18709
-   TessBeginData -> 0x1870a
-   TessVertexData -> 0x1870b
-   TessEndData -> 0x1870c
-   TessErrorData -> 0x1870d
-   TessEdgeFlagData -> 0x1870e
-   TessCombineData -> 0x1870f
-
---------------------------------------------------------------------------------
-
-data TessProperty =
-     TessWindingRule
-   | TessBoundaryOnly
-   | TessTolerance
-
-marshalTessProperty :: TessProperty -> GLenum
-marshalTessProperty x = case x of
-   TessWindingRule -> 0x1872c
-   TessBoundaryOnly -> 0x1872d
-   TessTolerance -> 0x1872e
-
---------------------------------------------------------------------------------
-
-data TessWinding =
-     TessWindingOdd
-   | TessWindingNonzero
-   | TessWindingPositive
-   | TessWindingNegative
-   | TessWindingAbsGeqTwo
-   deriving ( Eq, Ord, Show )
-
-marshalTessWinding :: TessWinding -> GLenum
-marshalTessWinding x = case x of
-   TessWindingOdd -> 0x18722
-   TessWindingNonzero -> 0x18723
-   TessWindingPositive -> 0x18724
-   TessWindingNegative -> 0x18725
-   TessWindingAbsGeqTwo -> 0x18726
-
---------------------------------------------------------------------------------
-
--- | The basic building block in tessellation is a 3D vertex with an associated
--- property, e.g. color, texture coordinates, etc.
-
-data AnnotatedVertex v = AnnotatedVertex (Vertex3 GLdouble) v
-#ifdef __HADDOCK__
--- Help Haddock a bit, because it doesn't do any instance inference.
-instance Eq v => Eq (AnnotatedVertex v)
-instance Ord v => Ord (AnnotatedVertex v)
-#else
-   deriving ( Eq, Ord )
-#endif
-
-offsetOfProperty :: Storable v => v -> Int
-offsetOfProperty v = alignOffset v (3 * sizeOf x)
-   where AnnotatedVertex (Vertex3 x _ _) _ = undefined
-
-alignOffset :: Storable a => a -> Int -> Int
-alignOffset x offset = n - (n `mod` a)
-   where a = alignment x
-         n = a + offset - 1
-
-instance Storable v => Storable (AnnotatedVertex v) where
-
-   sizeOf ~(AnnotatedVertex (Vertex3 x _ _) v) =
-      alignOffset x (sizeOf v + offsetOfProperty v)
-
-   alignment ~(AnnotatedVertex (Vertex3 x _ _) _) =
-      alignment x
-
-   peek ptr = do
-      x <- peekElemOff (castPtr ptr) 0
-      y <- peekElemOff (castPtr ptr) 1
-      z <- peekElemOff (castPtr ptr) 2
-      let dummyElement :: Ptr (AnnotatedVertex v) -> v
-          dummyElement = undefined
-      v <- peekByteOff (castPtr ptr) (offsetOfProperty (dummyElement ptr))
-      return $ AnnotatedVertex (Vertex3 x y z) v
-
-   poke ptr (AnnotatedVertex (Vertex3 x y z) v) = do
-      pokeElemOff (castPtr ptr) 0 x
-      pokeElemOff (castPtr ptr) 1 y
-      pokeElemOff (castPtr ptr) 2 z
-      pokeByteOff (castPtr ptr) (offsetOfProperty v) v
-
---------------------------------------------------------------------------------
-
--- | A complex contour, which can be self-intersecting and\/or concave.
-
-newtype ComplexContour v = ComplexContour [AnnotatedVertex v]
-#ifdef __HADDOCK__
--- Help Haddock a bit, because it doesn't do any instance inference.
-instance Eq v => Eq (ComplexContour v)
-instance Ord v => Ord (ComplexContour v)
-#else
-   deriving ( Eq, Ord )
-#endif
-
-sizeOfComplexContour :: Storable v => ComplexContour v -> Int
-sizeOfComplexContour (ComplexContour vs) =
-   length vs * sizeOf (head vs)
-
-pokeComplexContour ::
-   Storable v => Ptr (ComplexContour v) -> ComplexContour v -> IO ()
-pokeComplexContour ptr (ComplexContour vs) =
-   pokeArray (castPtr ptr) vs
-
---------------------------------------------------------------------------------
-
--- | A complex (possibly concave) polygon, represented by one or more complex
--- and possibly intersecting contours.
-
-newtype ComplexPolygon v = ComplexPolygon [ComplexContour v]
-#ifdef __HADDOCK__
--- Help Haddock a bit, because it doesn't do any instance inference.
-instance Eq v => Eq (ComplexPolygon v)
-instance Ord v => Ord (ComplexPolygon v)
-#else
-   deriving ( Eq, Ord )
-#endif
-
-sizeOfComplexPolygon :: Storable v => ComplexPolygon v -> Int
-sizeOfComplexPolygon (ComplexPolygon complexContours) =
-   sum (map sizeOfComplexContour complexContours)
-
-pokeComplexPolygon ::
-   Storable v => Ptr (ComplexPolygon v) -> ComplexPolygon v -> IO ()
-pokeComplexPolygon ptr (ComplexPolygon complexContours) =
-   foldM pokeAndAdvance (castPtr ptr) complexContours >> return ()
-   where pokeAndAdvance p complexContour = do
-            pokeComplexContour p complexContour
-            return $ p `plusPtr` sizeOfComplexContour complexContour
-
-withComplexPolygon ::
-   Storable v => ComplexPolygon v -> (Ptr (ComplexPolygon v) -> IO a) -> IO a
-withComplexPolygon complexPolygon f =
-   allocaBytes (sizeOfComplexPolygon complexPolygon) $ \ptr -> do
-      pokeComplexPolygon ptr complexPolygon
-      f ptr
-
---------------------------------------------------------------------------------
-
--- | Four vertex properties (cf. 'AnnotatedVertex') with associated weigths
--- summing up to 1.0.
-
-data WeightedProperties v
-   = WeightedProperties (GLclampf, v)
-                        (GLclampf, v)
-                        (GLclampf, v)
-                        (GLclampf, v)
-#ifdef __HADDOCK__
--- Help Haddock a bit, because it doesn't do any instance inference.
-instance Eq v => Eq (WeightedProperties v)
-instance Ord v => Ord (WeightedProperties v)
-#else
-   deriving ( Eq, Ord )
-#endif
-
--- | A function combining given vertex properties into a property for a newly
--- generated vertex
-
-type Combiner v
-    = Vertex3 GLdouble
-   -> WeightedProperties v
-   -> v
-
---------------------------------------------------------------------------------
-
--- | The relative tolerance under which two vertices can be combined (see
--- 'Combiner'). Multiplication with the largest coordinate magnitude of all
--- polygon vertices yields the maximum distance between two mergeable vertices.
---
--- Note that merging is optional and the tolerance is only a hint.
-
-type Tolerance = GLdouble
-
---------------------------------------------------------------------------------
-
--- | A general tessellator type.
---
--- Before tessellation of a complex polygon, all its vertices are projected into
--- a plane perpendicular to the given normal. If the given normal is
--- @Normal3 0 0 0@, a fitting plane of all vertices is used.
-
-type Tessellator p v
-   = TessWinding
-  -> Tolerance
-  -> Normal3 GLdouble
-  -> Combiner v
-  -> ComplexPolygon v
-  -> IO (p v)
-
---------------------------------------------------------------------------------
-
--- | A simple, non-self-intersecting contour
-
-newtype SimpleContour v = SimpleContour [AnnotatedVertex v]
-#ifdef __HADDOCK__
--- Help Haddock a bit, because it doesn't do any instance inference.
-instance Eq v => Eq (SimpleContour v)
-instance Ord v => Ord (SimpleContour v)
-#else
-   deriving ( Eq, Ord )
-#endif
-
--- | The contours of a complex polygon, represented by one or more
--- non-intersecting simple contours
-
-newtype PolygonContours v = PolygonContours [SimpleContour v]
-#ifdef __HADDOCK__
--- Help Haddock a bit, because it doesn't do any instance inference.
-instance Eq v => Eq (PolygonContours v)
-instance Ord v => Ord (PolygonContours v)
-#else
-   deriving ( Eq, Ord )
-#endif
-
-extractContours :: Storable v => Tessellator PolygonContours v
-extractContours windingRule tolerance normal combiner complexPoly = do
-
-   vertices <- newIORef []
-   let addVertex v = modifyIORef vertices (v:)
-
-   contours <- newIORef []
-   let finishContour = do
-          vs <- readIORef vertices
-          writeIORef vertices []
-          modifyIORef contours (SimpleContour (reverse vs) :)
-
-       getContours = fmap (PolygonContours . reverse) (readIORef contours)
-
-   withTessellatorObj (PolygonContours [])$ \tessObj -> do
-      setTessellatorProperties tessObj windingRule tolerance normal True
-      withVertexCallback tessObj addVertex $
-         withEndCallback tessObj finishContour $
-            checkForError tessObj $
-               withCombineCallback tessObj combiner $ do
-                  defineComplexPolygon tessObj complexPoly
-                  getContours
-
---------------------------------------------------------------------------------
-
--- | A triangle vertex with additional information about the edge it begins
-
-type TriangleVertex v = AnnotatedVertex (v,EdgeFlag)
-
--- | A triangle, represented by three triangle vertices
-
-data Triangle v
-   = Triangle (TriangleVertex v) (TriangleVertex v) (TriangleVertex v)
-#ifdef __HADDOCK__
--- Help Haddock a bit, because it doesn't do any instance inference.
-instance Eq v => Eq (Triangle v)
-instance Ord v => Ord (Triangle v)
-#else
-   deriving ( Eq, Ord )
-#endif
-
--- | A triangulation of a complex polygon
-
-newtype Triangulation v = Triangulation [Triangle v]
-#ifdef __HADDOCK__
--- Help Haddock a bit, because it doesn't do any instance inference.
-instance Eq v => Eq (Triangulation v)
-instance Ord v => Ord (Triangulation v)
-#else
-   deriving ( Eq, Ord )
-#endif
-
-triangulate :: Storable v => Tessellator Triangulation v
-triangulate windingRule tolerance normal combiner complexPoly = do
-
-   edgeFlagState <- newIORef BeginsInteriorEdge
-   let registerEdgeFlag = writeIORef edgeFlagState
-
-   vertices <- newIORef []
-   let addVertex (AnnotatedVertex xyz v) = do
-          ef <- readIORef edgeFlagState
-          modifyIORef vertices (AnnotatedVertex xyz (v,ef) :)
-
-       getTriangulation = do
-          vs <- readIORef vertices
-          return $ Triangulation (collectTriangles (reverse vs))
-
-   withTessellatorObj (Triangulation []) $ \tessObj -> do
-      setTessellatorProperties tessObj windingRule tolerance normal False
-      withEdgeFlagCallback tessObj registerEdgeFlag $
-         withVertexCallback tessObj addVertex $
-            checkForError tessObj $
-               withCombineCallback tessObj combiner $ do
-                  defineComplexPolygon tessObj complexPoly
-                  getTriangulation
-
-collectTriangles :: [TriangleVertex v] -> [Triangle v]
-collectTriangles []           = []
-collectTriangles (a:b:c:rest) = Triangle a b c : collectTriangles rest
-collectTriangles _            = error "triangles left"
-
---------------------------------------------------------------------------------
-
-data Primitive v = Primitive PrimitiveMode [AnnotatedVertex v]
-#ifdef __HADDOCK__
--- Help Haddock a bit, because it doesn't do any instance inference.
-instance Eq v => Eq (Primitive v)
-instance Ord v => Ord (Primitive v)
-#else
-   deriving ( Eq, Ord )
-#endif
-
-newtype SimplePolygon v = SimplePolygon [Primitive v]
-#ifdef __HADDOCK__
--- Help Haddock a bit, because it doesn't do any instance inference.
-instance Eq v => Eq (SimplePolygon v)
-instance Ord v => Ord (SimplePolygon v)
-#else
-   deriving ( Eq, Ord )
-#endif
-
-tessellate :: Storable v => Tessellator SimplePolygon v
-tessellate windingRule tolerance normal combiner complexPoly = do
-
-   beginModeState <- newIORef undefined
-   let setPrimitiveMode = writeIORef beginModeState
-
-   vertices <- newIORef []
-   let addVertex v = modifyIORef vertices (v:)
-
-   primitives <- newIORef []
-   let finishPrimitive = do
-          beginMode <- readIORef beginModeState
-          vs <- readIORef vertices
-          writeIORef vertices []
-          modifyIORef primitives (Primitive beginMode (reverse vs) :)
-
-       getSimplePolygon = fmap (SimplePolygon . reverse) (readIORef primitives)
-
-   withTessellatorObj (SimplePolygon []) $ \tessObj -> do
-      setTessellatorProperties tessObj windingRule tolerance normal False
-      withBeginCallback tessObj setPrimitiveMode $
-         withVertexCallback tessObj addVertex $
-            withEndCallback tessObj finishPrimitive $
-               checkForError tessObj $
-                  withCombineCallback tessObj combiner $ do
-                     defineComplexPolygon tessObj complexPoly
-                     getSimplePolygon
-
---------------------------------------------------------------------------------
--- chapter 5.1: The Tessellation Object
-
--- an opaque pointer to a tessellator object
-newtype TessellatorObj = TessellatorObj (Ptr TessellatorObj)
-
-isNullTesselatorObj :: TessellatorObj -> Bool
-isNullTesselatorObj (TessellatorObj ptr) = ptr == nullPtr
-
-withTessellatorObj :: a -> (TessellatorObj -> IO a) -> IO a
-withTessellatorObj failureValue action =
-   bracket gluNewTess safeDeleteTess
-           (\tessObj -> if isNullTesselatorObj tessObj
-                           then do recordOutOfMemory
-                                   return failureValue
-                           else action tessObj)
-
-foreign import CALLCONV unsafe "gluNewTess" gluNewTess :: IO TessellatorObj
-
-safeDeleteTess :: TessellatorObj -> IO ()
-safeDeleteTess tessObj =
-   unless (isNullTesselatorObj tessObj) $ gluDeleteTess tessObj
-
-foreign import CALLCONV unsafe "gluDeleteTess" gluDeleteTess ::
-   TessellatorObj -> IO ()
-
---------------------------------------------------------------------------------
--- chapter 5.2: Polygon Definition (polygons)
-
-defineComplexPolygon ::
-   Storable v => TessellatorObj -> ComplexPolygon v -> IO ()
-defineComplexPolygon tessObj cp@(ComplexPolygon complexContours) =
-   withComplexPolygon cp $ \ptr ->
-      tessBeginEndPolygon tessObj nullPtr $
-         let loop _ []     = return ()
-             loop p (c:cs) = do defineComplexContour tessObj (castPtr p) c
-                                loop (p `plusPtr` sizeOfComplexContour c) cs
-         in loop ptr complexContours
-
-tessBeginEndPolygon :: TessellatorObj -> Ptr p -> IO a -> IO a
-tessBeginEndPolygon tessObj ptr f = do
-   gluTessBeginPolygon tessObj ptr
-   res <- f
-   gluTessEndPolygon tessObj
-   return res
-
-foreign import CALLCONV safe "gluTessBeginPolygon" gluTessBeginPolygon ::
-   TessellatorObj -> Ptr p -> IO ()
-
-foreign import CALLCONV safe "gluTessEndPolygon" gluTessEndPolygon ::
-   TessellatorObj -> IO ()
-
---------------------------------------------------------------------------------
--- chapter 5.2: Polygon Definition (contours)
-
-defineComplexContour ::
-   Storable v =>
-   TessellatorObj -> Ptr (ComplexContour v) -> ComplexContour v -> IO ()
-defineComplexContour tessObj ptr (ComplexContour annotatedVertices) =
-   tessBeginEndContour tessObj $
-         let loop _ []     = return ()
-             loop p (v:vs) = do defineVertex tessObj (castPtr p)
-                                loop (p `plusPtr` sizeOf v) vs
-         in loop ptr annotatedVertices
-
-tessBeginEndContour :: TessellatorObj -> IO a -> IO a
-tessBeginEndContour tessObj f = do
-   gluTessBeginContour tessObj
-   res <- f
-   gluTessEndContour tessObj
-   return res
-
-foreign import CALLCONV safe "gluTessBeginContour" gluTessBeginContour ::
-   TessellatorObj -> IO ()
-
-foreign import CALLCONV safe "gluTessEndContour" gluTessEndContour ::
-   TessellatorObj -> IO ()
-
---------------------------------------------------------------------------------
--- chapter 5.2: Polygon Definition (vertices)
-
-defineVertex :: TessellatorObj -> Ptr (AnnotatedVertex v) -> IO ()
-defineVertex tessObj ptr = gluTessVertex tessObj (castPtr ptr) ptr
-
-foreign import CALLCONV safe "gluTessVertex" gluTessVertex ::
-   TessellatorObj -> Ptr (Vertex3 GLdouble) -> Ptr (AnnotatedVertex v) -> IO ()
-
---------------------------------------------------------------------------------
--- chapter 5.3: Callbacks (begin)
-
-type BeginCallback  = PrimitiveMode -> IO ()
-
-type BeginCallback' = GLenum -> IO ()
-
-withBeginCallback :: TessellatorObj -> BeginCallback -> IO a -> IO a
-withBeginCallback tessObj beginCallback action =
-   bracket (makeBeginCallback (beginCallback . unmarshalPrimitiveMode))
-           freeHaskellFunPtr $ \callbackPtr -> do
-      setBeginCallback tessObj (marshalTessCallback TessBegin) callbackPtr
-      action
-
-foreign import CALLCONV "wrapper" makeBeginCallback ::
-   BeginCallback' -> IO (FunPtr BeginCallback')
-
-foreign import CALLCONV unsafe "gluTessCallback" setBeginCallback ::
-   TessellatorObj -> GLenum -> FunPtr BeginCallback' -> IO ()
-
---------------------------------------------------------------------------------
--- chapter 5.3: Callbacks (edgeFlag)
-
-type EdgeFlagCallback  = EdgeFlag -> IO ()
-
-type EdgeFlagCallback' = GLboolean -> IO ()
-
-withEdgeFlagCallback :: TessellatorObj -> EdgeFlagCallback -> IO a -> IO a
-withEdgeFlagCallback tessObj edgeFlagCallback action =
-   bracket (makeEdgeFlagCallback (edgeFlagCallback . unmarshalEdgeFlag))
-           freeHaskellFunPtr $ \callbackPtr -> do
-      setEdgeFlagCallback tessObj (marshalTessCallback TessEdgeFlag) callbackPtr
-      action
-
-foreign import CALLCONV "wrapper" makeEdgeFlagCallback ::
-   EdgeFlagCallback' -> IO (FunPtr EdgeFlagCallback')
-
-foreign import CALLCONV unsafe "gluTessCallback" setEdgeFlagCallback ::
-   TessellatorObj -> GLenum -> FunPtr EdgeFlagCallback' -> IO ()
-
---------------------------------------------------------------------------------
--- chapter 5.3: Callbacks (vertex)
-
-type VertexCallback v = AnnotatedVertex v -> IO ()
-
-type VertexCallback' v = Ptr (AnnotatedVertex v) -> IO ()
-
-withVertexCallback ::
-   Storable v => TessellatorObj -> VertexCallback v -> IO a -> IO a
-withVertexCallback tessObj vertexCallback action =
-   bracket (makeVertexCallback (\p -> peek p >>= vertexCallback))
-           freeHaskellFunPtr $ \callbackPtr -> do
-      setVertexCallback tessObj (marshalTessCallback TessVertex) callbackPtr
-      action
-
-foreign import CALLCONV "wrapper" makeVertexCallback ::
-   VertexCallback' v -> IO (FunPtr (VertexCallback' v))
-
-foreign import CALLCONV unsafe "gluTessCallback" setVertexCallback ::
-   TessellatorObj -> GLenum -> FunPtr (VertexCallback' v) -> IO ()
-
---------------------------------------------------------------------------------
--- chapter 5.3: Callbacks (end)
-
-type EndCallback  = IO ()
-
-withEndCallback :: TessellatorObj -> EndCallback -> IO a -> IO a
-withEndCallback tessObj endCallback action =
-   bracket (makeEndCallback endCallback) freeHaskellFunPtr $ \callbackPtr -> do
-      setEndCallback tessObj (marshalTessCallback TessEnd) callbackPtr
-      action
-
-foreign import CALLCONV "wrapper" makeEndCallback ::
-   EndCallback -> IO (FunPtr EndCallback)
-
-foreign import CALLCONV unsafe "gluTessCallback" setEndCallback ::
-   TessellatorObj -> GLenum -> FunPtr EndCallback -> IO ()
-
---------------------------------------------------------------------------------
--- chapter 5.3: Callbacks (error)
-
-type ErrorCallback = GLenum -> IO ()
-
-withErrorCallback :: TessellatorObj -> ErrorCallback -> IO a -> IO a
-withErrorCallback tessObj errorCallback action =
-   bracket (makeErrorCallback errorCallback)
-           freeHaskellFunPtr $ \callbackPtr -> do
-      setErrorCallback tessObj (marshalTessCallback TessError) callbackPtr
-      action
-
-foreign import CALLCONV "wrapper" makeErrorCallback ::
-   ErrorCallback -> IO (FunPtr ErrorCallback)
-
-foreign import CALLCONV unsafe "gluTessCallback" setErrorCallback ::
-   TessellatorObj -> GLenum -> FunPtr ErrorCallback -> IO ()
-
-checkForError :: TessellatorObj -> IO a -> IO a
-checkForError tessObj = withErrorCallback tessObj recordErrorCode
-
---------------------------------------------------------------------------------
--- chapter 5.3: Callbacks (combine)
-
-type CombineCallback v =
-      Ptr (Vertex3 GLdouble)
-   -> Ptr (Ptr (AnnotatedVertex v))
-   -> Ptr GLclampf
-   -> Ptr (Ptr (AnnotatedVertex v))
-   -> IO ()
-
-withCombineCallback ::
-   Storable v => TessellatorObj -> Combiner v -> IO a -> IO a
-withCombineCallback tessObj combiner action =
-   withPool $ \vertexPool ->
-      bracket (makeCombineCallback (combineProperties vertexPool combiner))
-              freeHaskellFunPtr $ \callbackPtr -> do
-         setCombineCallback tessObj (marshalTessCallback TessCombine) callbackPtr
-         action 
-
--- NOTE: SGI's tesselator has a bug, sometimes passing NULL for the last two
--- vertices instead of valid vertex data, so we have to work around this. We
--- just pass the first vertex in these cases, which is OK, because the
--- corresponding weight is 0.
-combineProperties :: Storable v => Pool -> Combiner v -> CombineCallback v
-combineProperties pool combiner newVertexPtr propertyPtrs weights result = do
-   newVertex <- peek newVertexPtr
-   [v0, v1, v2, v3] <- mapM (getProperty propertyPtrs) [0..3]
-   [w0, w1, w2, w3] <- peekArray 4 weights
-   let defaultProperty = fromJust v0
-       f = maybe defaultProperty id
-       wp = WeightedProperties (w0, f v0) (w1, f v1) (w2, f v2) (w3, f v3)
-       av = AnnotatedVertex newVertex (combiner newVertex wp)
-   poke result =<< pooledNew pool av
-
-getProperty :: Storable v => Ptr (Ptr (AnnotatedVertex v)) -> Int -> IO (Maybe v)
-getProperty propertyPtrs n = peekElemOff propertyPtrs n >>=
-                             maybeNullPtr (return Nothing) peekProperty
-
-peekProperty :: Storable v => Ptr (AnnotatedVertex v) -> IO (Maybe v)
-peekProperty ptr = do
-   AnnotatedVertex _ v <- peek ptr
-   return (Just v)
-
-foreign import CALLCONV "wrapper" makeCombineCallback ::
-   CombineCallback v -> IO (FunPtr (CombineCallback v))
-
-foreign import CALLCONV unsafe "gluTessCallback" setCombineCallback ::
-   TessellatorObj -> GLenum -> FunPtr (CombineCallback v) -> IO ()
-
---------------------------------------------------------------------------------
--- chapter 5.4: Control over Tessellation
-
-setTessellatorProperties ::
-    TessellatorObj -> TessWinding -> Tolerance -> Normal3 GLdouble -> Bool
- -> IO ()
-setTessellatorProperties tessObj windingRule tolerance normal boundaryOnly = do
-   setWindingRule tessObj windingRule
-   setTolerance tessObj tolerance
-   setNormal tessObj normal
-   setBoundaryOnly tessObj boundaryOnly
-
-setWindingRule :: TessellatorObj -> TessWinding -> IO ()
-setWindingRule tessObj =
-   tessProperty tessObj TessWindingRule . fromIntegral . marshalTessWinding
-
-setBoundaryOnly :: TessellatorObj -> Bool -> IO ()
-setBoundaryOnly tessObj =
-   tessProperty tessObj TessBoundaryOnly . marshalGLboolean
-
-setTolerance :: TessellatorObj -> Tolerance -> IO ()
-setTolerance tessObj =
-   tessProperty tessObj TessTolerance
-
-tessProperty :: TessellatorObj -> TessProperty -> GLdouble -> IO ()
-tessProperty tessObj =
-   gluTessProperty tessObj . marshalTessProperty
-
-foreign import CALLCONV unsafe "gluTessProperty" gluTessProperty ::
-   TessellatorObj -> GLenum -> GLdouble -> IO ()
-
-setNormal :: TessellatorObj -> Normal3 GLdouble -> IO ()
-setNormal tessObj (Normal3 x y z) = gluTessNormal tessObj x y z
-
-foreign import CALLCONV unsafe "gluTessNormal" gluTessNormal ::
-   TessellatorObj -> GLdouble -> GLdouble -> GLdouble -> IO ()
diff --git a/OpenGL.buildinfo.in b/OpenGL.buildinfo.in
deleted file mode 100644
--- a/OpenGL.buildinfo.in
+++ /dev/null
@@ -1,8 +0,0 @@
--- @configure_input@
--- System-dependent values used by Distribution.Simple.defaultUserHooks
---
-buildable: @BUILD_PACKAGE_BOOL@
-ghc-options: -DCALLCONV=@CALLCONV@
-cc-options: -DCALLCONV=@CALLCONV@ @GLU_CFLAGS@
-ld-options: @GLU_LIBS@
-frameworks: @GLU_FRAMEWORKS@
diff --git a/OpenGL.cabal b/OpenGL.cabal
--- a/OpenGL.cabal
+++ b/OpenGL.cabal
@@ -1,119 +1,187 @@
-name:		OpenGL
-version:	2.2.3.0
-license:	BSD3
-license-file:	LICENSE
-maintainer:	Sven Panne <sven.panne@aedion.de>
-bug-reports:	mailto:hopengl@haskell.org
-homepage:	http://www.haskell.org/HOpenGL/
-category:	Graphics
-synopsis:	A binding for the OpenGL graphics system
+name: OpenGL
+version: 3.0.3.0
+synopsis: A binding for the OpenGL graphics system
 description:
-	A Haskell binding for the OpenGL graphics system (GL, version
-	2.1) and its accompanying utility library (GLU, version 1.3).
-	OpenGL is the industry's most widely used and supported 2D and 3D
-	graphics application programming interface (API), incorporating
-	a broad set of rendering, texture mapping, special effects, and
-	other powerful visualization functions.  For more information
-	about OpenGL, please see: <http://www.opengl.org/>.
-build-type:     Configure
+  A Haskell binding for the OpenGL graphics system (GL, version 4.6) and its
+  accompanying utility library (GLU, version 1.3).
+  .
+  OpenGL is the industry's most widely used and supported 2D and 3D graphics
+  application programming interface (API), incorporating a broad set of
+  rendering, texture mapping, special effects, and other powerful visualization
+  functions. For more information about OpenGL and its various extensions,
+  please see <http://www.opengl.org/>
+  and <http://www.opengl.org/registry/>.
+homepage: https://wiki.haskell.org/OpenGL
+bug-reports: https://github.com/haskell-opengl/OpenGL/issues
+copyright: Copyright (C) 2002-2019 Sven Panne
+license: BSD3
+license-file: LICENSE
+author: Sven Panne
+maintainer: Sven Panne <svenpanne@gmail.com>, Jason Dagit <dagitj@gmail.com>
+category: Graphics
+build-type: Simple
+tested-with:
+  GHC == 7.8.4
+  GHC == 7.10.3
+  GHC == 8.0.2
+  GHC == 8.2.2
+  GHC == 8.4.3
+  GHC == 8.6.5
+  GHC == 8.8.1
+cabal-version: >= 1.10
 extra-source-files:
-	OpenGL.buildinfo.in README aclocal.m4 config.guess config.sub configure
-	configure.ac include/HsOpenGL.h.in include/HsOpenGLExt.h
-	include/HsOpenGLTypes.h install-sh include/HsOpenGLConfig.h.in
-extra-tmp-files:
-	config.log config.status autom4te.cache
-	OpenGL.buildinfo include/HsOpenGLConfig.h include/HsOpenGL.h
-exposed-modules:
-	Graphics.Rendering.OpenGL.GL.Antialiasing,
-	Graphics.Rendering.OpenGL.GL.BasicTypes,
-	Graphics.Rendering.OpenGL.GL.BeginEnd,
-	Graphics.Rendering.OpenGL.GL.Bitmaps,
-	Graphics.Rendering.OpenGL.GL.BufferObjects,
-	Graphics.Rendering.OpenGL.GL.Clipping,
-	Graphics.Rendering.OpenGL.GL.Colors,
-	Graphics.Rendering.OpenGL.GL.ColorSum,
-	Graphics.Rendering.OpenGL.GL.CoordTrans,
-	Graphics.Rendering.OpenGL.GL.DisplayLists,
-	Graphics.Rendering.OpenGL.GL.Evaluators,
-	Graphics.Rendering.OpenGL.GL.Feedback,
-	Graphics.Rendering.OpenGL.GL.FlushFinish,
-	Graphics.Rendering.OpenGL.GL.Fog,
-	Graphics.Rendering.OpenGL.GL.Framebuffer,
-	Graphics.Rendering.OpenGL.GL.Hints,
-	Graphics.Rendering.OpenGL.GL,
-	Graphics.Rendering.OpenGL.GL.LineSegments,
-	Graphics.Rendering.OpenGL.GL.PerFragment,
-	Graphics.Rendering.OpenGL.GL.PixelRectangles.ColorTable,
-	Graphics.Rendering.OpenGL.GL.PixelRectangles.Convolution,
-	Graphics.Rendering.OpenGL.GL.PixelRectangles.Histogram,
-	Graphics.Rendering.OpenGL.GL.PixelRectangles,
-	Graphics.Rendering.OpenGL.GL.PixelRectangles.Minmax,
-	Graphics.Rendering.OpenGL.GL.PixelRectangles.PixelMap,
-	Graphics.Rendering.OpenGL.GL.PixelRectangles.PixelStorage,
-	Graphics.Rendering.OpenGL.GL.PixelRectangles.PixelTransfer,
-	Graphics.Rendering.OpenGL.GL.PixelRectangles.Rasterization,
-	Graphics.Rendering.OpenGL.GL.Points,
-	Graphics.Rendering.OpenGL.GL.Polygons,
-	Graphics.Rendering.OpenGL.GL.RasterPos,
-	Graphics.Rendering.OpenGL.GL.ReadCopyPixels,
-	Graphics.Rendering.OpenGL.GL.Rectangles,
-	Graphics.Rendering.OpenGL.GL.SavingState,
-	Graphics.Rendering.OpenGL.GL.Selection,
-	Graphics.Rendering.OpenGL.GL.Shaders,
-	Graphics.Rendering.OpenGL.GL.StateVar,
-	Graphics.Rendering.OpenGL.GL.StringQueries,
-	Graphics.Rendering.OpenGL.GL.Texturing.Application,
-	Graphics.Rendering.OpenGL.GL.Texturing.Environments,
-	Graphics.Rendering.OpenGL.GL.Texturing,
-	Graphics.Rendering.OpenGL.GL.Texturing.Objects,
-	Graphics.Rendering.OpenGL.GL.Texturing.Parameters,
-	Graphics.Rendering.OpenGL.GL.Texturing.Queries,
-	Graphics.Rendering.OpenGL.GL.Texturing.Specification,
-	Graphics.Rendering.OpenGL.GLU.Errors,
-	Graphics.Rendering.OpenGL.GLU,
-	Graphics.Rendering.OpenGL.GLU.Initialization,
-	Graphics.Rendering.OpenGL.GLU.Matrix,
-	Graphics.Rendering.OpenGL.GLU.Mipmapping,
-	Graphics.Rendering.OpenGL.GLU.NURBS,
-	Graphics.Rendering.OpenGL.GLU.Quadrics,
-	Graphics.Rendering.OpenGL.GLU.Tessellation,
-	Graphics.Rendering.OpenGL.GL.VertexArrays,
-	Graphics.Rendering.OpenGL.GL.VertexSpec,
-	Graphics.Rendering.OpenGL
-other-modules:
-	Graphics.Rendering.OpenGL.GL.BlendingFactor,
-	Graphics.Rendering.OpenGL.GL.BufferMode,
-	Graphics.Rendering.OpenGL.GL.Capability,
-	Graphics.Rendering.OpenGL.GL.ComparisonFunction,
-	Graphics.Rendering.OpenGL.GL.ControlPoint,
-	Graphics.Rendering.OpenGL.GL.DataType,
-	Graphics.Rendering.OpenGL.GL.Domain,
-	Graphics.Rendering.OpenGL.GL.EdgeFlag,
-	Graphics.Rendering.OpenGL.GL.Exception,
-	Graphics.Rendering.OpenGL.GL.Extensions,
-	Graphics.Rendering.OpenGL.GL.Face,
-	Graphics.Rendering.OpenGL.GL.GLboolean,
-	Graphics.Rendering.OpenGL.GL.IOState,
-	Graphics.Rendering.OpenGL.GL.PeekPoke,
-	Graphics.Rendering.OpenGL.GL.PixelData,
-	Graphics.Rendering.OpenGL.GL.PixelFormat,
-	Graphics.Rendering.OpenGL.GL.PixelRectangles.Reset,
-	Graphics.Rendering.OpenGL.GL.PixelRectangles.Sink,
-	Graphics.Rendering.OpenGL.GL.PointParameter,
-	Graphics.Rendering.OpenGL.GL.PolygonMode,
-	Graphics.Rendering.OpenGL.GL.PrimitiveMode,
-	Graphics.Rendering.OpenGL.GL.QueryUtils,
-	Graphics.Rendering.OpenGL.GL.RenderMode,
-	Graphics.Rendering.OpenGL.GL.Tensor,
-	Graphics.Rendering.OpenGL.GL.Texturing.PixelInternalFormat,
-	Graphics.Rendering.OpenGL.GL.Texturing.TexParameter,
-	Graphics.Rendering.OpenGL.GL.Texturing.TextureTarget,
-	Graphics.Rendering.OpenGL.GL.Texturing.TextureUnit,
-	Graphics.Rendering.OpenGL.GL.VertexAttributes,
-	Graphics.Rendering.OpenGL.GLU.ErrorsInternal
-c-sources:	cbits/HsOpenGL.c
-include-dirs:	include
-includes: HsOpenGL.h
-install-includes: HsOpenGL.h
-build-depends:	base
-extensions:	CPP, ForeignFunctionInterface
+   CHANGELOG.md
+   README.md
+
+library
+  exposed-modules:
+    Graphics.Rendering.OpenGL
+    Graphics.Rendering.OpenGL.GL
+    Graphics.Rendering.OpenGL.GL.Antialiasing
+    Graphics.Rendering.OpenGL.GL.BeginEnd
+    Graphics.Rendering.OpenGL.GL.Bitmaps
+    Graphics.Rendering.OpenGL.GL.BufferObjects
+    Graphics.Rendering.OpenGL.GL.Clipping
+    Graphics.Rendering.OpenGL.GL.ColorSum
+    Graphics.Rendering.OpenGL.GL.Colors
+    Graphics.Rendering.OpenGL.GL.ConditionalRendering
+    Graphics.Rendering.OpenGL.GL.CoordTrans
+    Graphics.Rendering.OpenGL.GL.DebugOutput
+    Graphics.Rendering.OpenGL.GL.DisplayLists
+    Graphics.Rendering.OpenGL.GL.Evaluators
+    Graphics.Rendering.OpenGL.GL.Feedback
+    Graphics.Rendering.OpenGL.GL.FlushFinish
+    Graphics.Rendering.OpenGL.GL.Fog
+    Graphics.Rendering.OpenGL.GL.Framebuffer
+    Graphics.Rendering.OpenGL.GL.FramebufferObjects
+    Graphics.Rendering.OpenGL.GL.FramebufferObjects.Attachments
+    Graphics.Rendering.OpenGL.GL.FramebufferObjects.FramebufferObjects
+    Graphics.Rendering.OpenGL.GL.FramebufferObjects.Queries
+    Graphics.Rendering.OpenGL.GL.FramebufferObjects.RenderbufferObjects
+    Graphics.Rendering.OpenGL.GL.Hints
+    Graphics.Rendering.OpenGL.GL.LineSegments
+    Graphics.Rendering.OpenGL.GL.PerFragment
+    Graphics.Rendering.OpenGL.GL.PixelRectangles
+    Graphics.Rendering.OpenGL.GL.PixelRectangles.ColorTable
+    Graphics.Rendering.OpenGL.GL.PixelRectangles.Convolution
+    Graphics.Rendering.OpenGL.GL.PixelRectangles.Histogram
+    Graphics.Rendering.OpenGL.GL.PixelRectangles.Minmax
+    Graphics.Rendering.OpenGL.GL.PixelRectangles.PixelMap
+    Graphics.Rendering.OpenGL.GL.PixelRectangles.PixelStorage
+    Graphics.Rendering.OpenGL.GL.PixelRectangles.PixelTransfer
+    Graphics.Rendering.OpenGL.GL.PixelRectangles.Rasterization
+    Graphics.Rendering.OpenGL.GL.PixellikeObject
+    Graphics.Rendering.OpenGL.GL.Points
+    Graphics.Rendering.OpenGL.GL.Polygons
+    Graphics.Rendering.OpenGL.GL.PrimitiveMode
+    Graphics.Rendering.OpenGL.GL.QueryObjects
+    Graphics.Rendering.OpenGL.GL.RasterPos
+    Graphics.Rendering.OpenGL.GL.ReadCopyPixels
+    Graphics.Rendering.OpenGL.GL.Rectangles
+    Graphics.Rendering.OpenGL.GL.SavingState
+    Graphics.Rendering.OpenGL.GL.Selection
+    Graphics.Rendering.OpenGL.GL.Shaders
+    Graphics.Rendering.OpenGL.GL.Shaders.Attribs
+    Graphics.Rendering.OpenGL.GL.Shaders.Limits
+    Graphics.Rendering.OpenGL.GL.Shaders.ProgramBinaries
+    Graphics.Rendering.OpenGL.GL.Shaders.ProgramObjects
+    Graphics.Rendering.OpenGL.GL.Shaders.ShaderBinaries
+    Graphics.Rendering.OpenGL.GL.Shaders.ShaderObjects
+    Graphics.Rendering.OpenGL.GL.Shaders.Uniform
+    Graphics.Rendering.OpenGL.GL.StringQueries
+    Graphics.Rendering.OpenGL.GL.SyncObjects
+    Graphics.Rendering.OpenGL.GL.Tensor
+    Graphics.Rendering.OpenGL.GL.Texturing
+    Graphics.Rendering.OpenGL.GL.Texturing.Application
+    Graphics.Rendering.OpenGL.GL.Texturing.Environments
+    Graphics.Rendering.OpenGL.GL.Texturing.Objects
+    Graphics.Rendering.OpenGL.GL.Texturing.Parameters
+    Graphics.Rendering.OpenGL.GL.Texturing.Queries
+    Graphics.Rendering.OpenGL.GL.Texturing.Specification
+    Graphics.Rendering.OpenGL.GL.TransformFeedback
+    Graphics.Rendering.OpenGL.GL.VertexArrayObjects
+    Graphics.Rendering.OpenGL.GL.VertexArrays
+    Graphics.Rendering.OpenGL.GL.VertexSpec
+    Graphics.Rendering.OpenGL.GLU
+    Graphics.Rendering.OpenGL.GLU.Errors
+    Graphics.Rendering.OpenGL.GLU.Initialization
+    Graphics.Rendering.OpenGL.GLU.Matrix
+    Graphics.Rendering.OpenGL.GLU.Mipmapping
+    Graphics.Rendering.OpenGL.GLU.NURBS
+    Graphics.Rendering.OpenGL.GLU.Quadrics
+    Graphics.Rendering.OpenGL.GLU.Tessellation
+  other-modules:
+    Graphics.Rendering.OpenGL.GL.BlendingFactor
+    Graphics.Rendering.OpenGL.GL.BufferMode
+    Graphics.Rendering.OpenGL.GL.ByteString
+    Graphics.Rendering.OpenGL.GL.Capability
+    Graphics.Rendering.OpenGL.GL.ComparisonFunction
+    Graphics.Rendering.OpenGL.GL.ControlPoint
+    Graphics.Rendering.OpenGL.GL.DataType
+    Graphics.Rendering.OpenGL.GL.Domain
+    Graphics.Rendering.OpenGL.GL.EdgeFlag
+    Graphics.Rendering.OpenGL.GL.Exception
+    Graphics.Rendering.OpenGL.GL.Face
+    Graphics.Rendering.OpenGL.GL.FramebufferObjects.FramebufferObject
+    Graphics.Rendering.OpenGL.GL.FramebufferObjects.FramebufferObjectAttachment
+    Graphics.Rendering.OpenGL.GL.FramebufferObjects.FramebufferTarget
+    Graphics.Rendering.OpenGL.GL.FramebufferObjects.RenderbufferObject
+    Graphics.Rendering.OpenGL.GL.FramebufferObjects.RenderbufferTarget
+    Graphics.Rendering.OpenGL.GL.GLboolean
+    Graphics.Rendering.OpenGL.GL.IOState
+    Graphics.Rendering.OpenGL.GL.MatrixComponent
+    Graphics.Rendering.OpenGL.GL.PeekPoke
+    Graphics.Rendering.OpenGL.GL.PixelData
+    Graphics.Rendering.OpenGL.GL.PixelFormat
+    Graphics.Rendering.OpenGL.GL.PixelRectangles.Reset
+    Graphics.Rendering.OpenGL.GL.PixelRectangles.Sink
+    Graphics.Rendering.OpenGL.GL.PointParameter
+    Graphics.Rendering.OpenGL.GL.PolygonMode
+    Graphics.Rendering.OpenGL.GL.PrimitiveModeInternal
+    Graphics.Rendering.OpenGL.GL.QueryObject
+    Graphics.Rendering.OpenGL.GL.QueryUtils
+    Graphics.Rendering.OpenGL.GL.QueryUtils.PName
+    Graphics.Rendering.OpenGL.GL.QueryUtils.VertexAttrib
+    Graphics.Rendering.OpenGL.GL.RenderMode
+    Graphics.Rendering.OpenGL.GL.Shaders.Program
+    Graphics.Rendering.OpenGL.GL.Shaders.Shader
+    Graphics.Rendering.OpenGL.GL.Shaders.Variables
+    Graphics.Rendering.OpenGL.GL.Texturing.Filter
+    Graphics.Rendering.OpenGL.GL.Texturing.PixelInternalFormat
+    Graphics.Rendering.OpenGL.GL.Texturing.TexParameter
+    Graphics.Rendering.OpenGL.GL.Texturing.TextureObject
+    Graphics.Rendering.OpenGL.GL.Texturing.TextureTarget
+    Graphics.Rendering.OpenGL.GL.Texturing.TextureUnit
+    Graphics.Rendering.OpenGL.GL.VertexAttributes
+    Graphics.Rendering.OpenGL.GLU.ErrorsInternal
+  hs-source-dirs: src
+  ghc-options: -Wall
+  if impl(ghc > 8)
+    ghc-options: -Wcompat
+  build-depends:
+    base         >= 3   && < 5,
+    bytestring   >= 0.9 && < 0.11,
+    containers   >= 0.3 && < 0.7,
+    text         >= 0.1 && < 1.3,
+    transformers >= 0.2 && < 0.6,
+    ObjectName   >= 1.1 && < 1.2,
+    StateVar     >= 1.1 && < 1.2,
+    OpenGLRaw    >= 3.0 && < 3.4,
+    GLURaw       >= 2.0 && < 2.1
+  default-language: Haskell2010
+  other-extensions:
+    CPP
+    DeriveDataTypeable
+    KindSignatures
+    TypeSynonymInstances
+  if os(windows)
+    if arch(i386)
+      cpp-options: "-DCALLCONV=stdcall"
+    else
+      cpp-options: "-DCALLCONV=ccall"
+  else
+    cpp-options: "-DCALLCONV=ccall"
+
+source-repository head
+  type: git
+  location: https://github.com/haskell-opengl/OpenGL.git
diff --git a/README b/README
deleted file mode 100644
--- a/README
+++ /dev/null
@@ -1,4 +0,0 @@
-To build this package using Cabal directly from darcs, you must run
-"autoreconf" before the usual Cabal build steps (configure/build/install).
-autoreconf is included in the GNU autoconf tools.  There is no need to run
-the "configure" script: the "setup configure" step will do this for you.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,4 @@
+[![Hackage](https://img.shields.io/hackage/v/OpenGL.svg)](https://hackage.haskell.org/package/OpenGL)
+[![Stackage LTS](https://www.stackage.org/package/OpenGL/badge/lts)](https://www.stackage.org/lts/package/OpenGL)
+[![Stackage nightly](https://www.stackage.org/package/OpenGL/badge/nightly)](https://www.stackage.org/nightly/package/OpenGL)
+[![Build Status](https://img.shields.io/travis/haskell-opengl/OpenGL/master.svg)](https://travis-ci.org/haskell-opengl/OpenGL)
diff --git a/Setup.hs b/Setup.hs
--- a/Setup.hs
+++ b/Setup.hs
@@ -1,6 +1,2 @@
-module Main (main) where
-
 import Distribution.Simple
-
-main :: IO ()
-main = defaultMainWithHooks autoconfUserHooks
+main = defaultMain
diff --git a/aclocal.m4 b/aclocal.m4
deleted file mode 100644
--- a/aclocal.m4
+++ /dev/null
@@ -1,288 +0,0 @@
-# Extra autoconf macros for the Glasgow fptools
-#
-# To be a good autoconf citizen, names of local macros have prefixed with FP_ to
-# ensure we don't clash with any pre-supplied autoconf ones.
-
-dnl ** Map an arithmetic C type to a Haskell type.
-dnl    Based on autconf's AC_CHECK_SIZEOF.
-
-dnl FPTOOLS_CHECK_HTYPE(TYPE [, DEFAULT_VALUE, [, VALUE-FOR-CROSS-COMPILATION])
-AC_DEFUN([FPTOOLS_CHECK_HTYPE],
-[changequote(<<, >>)dnl
-dnl The name to #define.
-define(<<AC_TYPE_NAME>>, translit(htype_$1, [a-z *], [A-Z_P]))dnl
-dnl The cache variable name.
-define(<<AC_CV_NAME>>, translit(fptools_cv_htype_$1, [ *], [_p]))dnl
-define(<<AC_CV_NAME_supported>>, translit(fptools_cv_htype_sup_$1, [ *], [_p]))dnl
-changequote([, ])dnl
-AC_MSG_CHECKING(Haskell type for $1)
-AC_CACHE_VAL(AC_CV_NAME,
-[AC_CV_NAME_supported=yes
-fp_check_htype_save_cppflags="$CPPFLAGS"
-CPPFLAGS="$CPPFLAGS $X_CFLAGS"
-AC_RUN_IFELSE([AC_LANG_SOURCE([[#include <stdio.h>
-#include <stddef.h>
-
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#if HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-
-#if HAVE_FCNTL_H
-# include <fcntl.h>
-#endif
-
-#if HAVE_SIGNAL_H
-# include <signal.h>
-#endif
-
-#if HAVE_TIME_H
-# include <time.h>
-#endif
-
-#if HAVE_TERMIOS_H
-# include <termios.h>
-#endif
-
-#if HAVE_STRING_H
-# include <string.h>
-#endif
-
-#if HAVE_CTYPE_H
-# include <ctype.h>
-#endif
-
-#if defined(HAVE_GL_GL_H)
-# include <GL/gl.h>
-#elif defined(HAVE_OPENGL_GL_H)
-# include <OpenGL/gl.h>
-#endif
-
-#if defined(HAVE_AL_AL_H)
-# include <AL/al.h>
-#elif defined(HAVE_OPENAL_AL_H)
-# include <OpenAL/al.h>
-#endif
-
-#if defined(HAVE_AL_ALC_H)
-# include <AL/alc.h>
-#elif defined(HAVE_OPENAL_ALC_H)
-# include <OpenAL/alc.h>
-#endif
-
-#if HAVE_SYS_RESOURCE_H
-# include <sys/resource.h>
-#endif
-
-typedef $1 testing;
-
-main() {
-  FILE *f=fopen("conftestval", "w");
-  if (!f) exit(1);
-  if (((testing)((int)((testing)1.4))) == ((testing)1.4)) {
-    fprintf(f, "%s%d\n",
-           ((testing)(-1) < (testing)0) ? "Int" : "Word",
-           sizeof(testing)*8);
-  } else {
-    fprintf(f,"%s\n",
-           (sizeof(testing) >  sizeof(double)) ? "LDouble" :
-           (sizeof(testing) == sizeof(double)) ? "Double"  : "Float");
-  }
-  fclose(f);
-  exit(0);
-}]])],[AC_CV_NAME=`cat conftestval`],
-[ifelse([$2], , [AC_CV_NAME=NotReallyAType; AC_CV_NAME_supported=no], [AC_CV_NAME=$2])],
-[ifelse([$3], , [AC_CV_NAME=NotReallyATypeCross; AC_CV_NAME_supported=no], [AC_CV_NAME=$3])])
-CPPFLAGS="$fp_check_htype_save_cppflags"]) dnl
-if test "$AC_CV_NAME_supported" = yes; then
-  AC_MSG_RESULT($AC_CV_NAME)
-  AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME, [Define to Haskell type for $1])
-else
-  AC_MSG_RESULT([not supported])
-fi
-undefine([AC_TYPE_NAME])dnl
-undefine([AC_CV_NAME])dnl
-undefine([AC_CV_NAME_supported])dnl
-])
-
-
-# FP_ARG_OPENGL
-# -------------
-AC_DEFUN([FP_ARG_OPENGL],
-[AC_ARG_ENABLE([opengl],
-  [AC_HELP_STRING([--enable-opengl],
-    [build a Haskell binding for OpenGL (GL/GLU). On Mac OS X, use
-     --enable-opengl=x11 to use X11 instead of the "native" libraries.
-     (default=autodetect)])],
-  [enable_opengl=$enableval],
-  [enable_opengl=yes])
-])# FP_ARG_OPENGL
-
-
-# FP_CHECK_QUARTZ_OPENGL
-# ----------------------
-AC_DEFUN([FP_CHECK_QUARTZ_OPENGL],
-[AC_REQUIRE([FP_ARG_OPENGL])
-AC_REQUIRE([AC_CANONICAL_TARGET])
-
-use_quartz_opengl=no
-if test x"$enable_opengl" = xyes; then
-  case $target_os in
-  darwin*)
-    AC_DEFINE([USE_QUARTZ_OPENGL], [1],
-              [Define to 1 if native OpenGL should be used on Mac OS X])
-    use_quartz_opengl=yes
-    ;;
-  esac
-fi
-
-GLU_FRAMEWORKS=
-GLUT_FRAMEWORKS=
-if test x"$use_quartz_opengl" = xyes; then
-  GLU_FRAMEWORKS=OpenGL
-  GLUT_FRAMEWORKS=GLUT
-fi
-AC_SUBST([GLU_FRAMEWORKS])
-AC_SUBST([GLUT_FRAMEWORKS])
-])# FP_CHECK_QUARTZ_OPENGL
-
-
-# FP_CHECK_WIN32
-# --------------
-# If Windows is the target platform (e.g. MinGW/MSYS or Cygwin with
-# -mno-cygwin), the variable "fp_is_win32" is set to "yes", otherwise (e.g. *nix
-# systems or plain Cygwin) it is set to "no".
-AC_DEFUN([FP_CHECK_WIN32],
-[AC_CACHE_CHECK([for Windows environment], [fp_cv_is_win32],
-  [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
-#if !_WIN32
-   syntax error;
-#endif
-])], [fp_cv_is_win32=yes], [fp_cv_is_win32=no])])
-fp_is_win32="$fp_cv_is_win32"[]dnl
-])# FP_CHECK_WIN32
-
-
-# FP_PATH_XTRA
-# ------------
-# Same as AC_PATH_XTRA, but works even for broken Cygwins which try to include
-# the non-existant <gl/mesa_wgl.h> header when -mno-cygwin is used.
-AC_DEFUN([FP_PATH_XTRA],
-[AC_REQUIRE([FP_CHECK_WIN32])
-if test x"$fp_is_win32" = xyes; then
-  no_x=yes
-else
-  AC_PATH_XTRA
-fi
-])# FP_PATH_XTRA
-
-
-# FP_CHECK_GL_HELPER(LIBNAME, LIBS, INCLUDES, FUNCTION-BODY)
-# ----------------------------------------------------------
-# Try each library in LIBS to successfully link INCLUDES plus FUNCTION-BODY,
-# setting LIBNAME_CFLAGS and LIBNAME_LIBS to the corresponding values. Sets
-# no_LIBNAME to "yes" if no suitable library was found. (LIBNAME_CFLAGS0
-# contains the value of LIBNAME_CFLAGS without CPPFLAGS, and LIBNAME_LIBS0
-# contains the value of LIBNAME_LIBS without LDFLAGS, but these are only
-# used internally.)
-AC_DEFUN([FP_CHECK_GL_HELPER],
-[AC_CACHE_CHECK([for $1 library], [fp_cv_check_$1_lib],
-  [fp_cv_check_$1_lib="no"
-  fp_save_CPPFLAGS="$CPPFLAGS"
-  CPPFLAGS="$CPPFLAGS ${$1_CFLAGS}"
-  fp_save_LIBS="$LIBS"
-  for fp_try_lib in $2; do
-    # transform "-lfoo" to "foo.lib" when using cl
-    if test x"$CC" = xcl; then
-      fp_try_lib=`echo $fp_try_lib | sed -e 's/^-l//' -e 's/$/.lib/'`
-    fi
-    LIBS="$fp_try_lib ${$1_LIBS} $fp_save_LIBS"
-    AC_LINK_IFELSE([AC_LANG_PROGRAM([$3], [$4])], [fp_cv_check_$1_lib="$fp_try_lib ${$1_LIBS}"; break])
-  done
-  LIBS="$fp_save_LIBS"
-  CPPFLAGS="$fp_save_CPPFLAGS"])
-
-  if test x"$fp_cv_check_$1_lib" = xno; then
-    no_$1=yes
-    $1_CFLAGS=
-    $1_LIBS=
-  else
-    $1_CFLAGS0="${$1_CFLAGS}"
-    $1_CFLAGS="$CPPFLAGS ${$1_CFLAGS0}"
-    $1_LIBS0="$fp_cv_check_$1_lib"
-    $1_LIBS="$LDFLAGS ${$1_LIBS0}"
-  fi
-])# FP_CHECK_GL_HELPER
-
-
-# FP_CHECK_GL
-# -----------
-AC_DEFUN([FP_CHECK_GL],
-[AC_REQUIRE([FP_PATH_XTRA])
-AC_REQUIRE([FP_CHECK_QUARTZ_OPENGL])
-AC_REQUIRE([FP_CHECK_WIN32])
-
-if test x"$use_quartz_opengl" = xno; then
-  AC_CHECK_FUNC(atan,[fp_libm_not_needed=yes],[fp_libm_not_needed=dunno])
-  if test x"$fp_libm_not_needed" = xdunno; then
-     AC_CHECK_LIB([m], [atan], [GL_LIBS="-lm $GL_LIBS"])
-  fi
-
-  if test x"$no_x" != xyes; then
-    test -n "$x_includes" && GL_CFLAGS="-I$x_includes $GL_CFLAGS"
-    test -n "$x_libraries" && GL_LIBS="-L$x_libraries -lX11 $GL_LIBS"
-  fi
-
-  FP_CHECK_GL_HELPER([GL], [-lGL -lopengl32], [@%:@include <GL/gl.h>], [glEnd()])
-
-  if test x"$fp_is_win32" = xyes; then
-    # Ugly: To get wglGetProcAddress on Windows, we have to link with
-    # opengl32.dll, too, even when we are using Cygwin with X11.
-    case "$GL_LIBS" in
-      *-lopengl32*|*opengl32.lib*) ;;
-      *) fp_save_LIBS="$LIBS"
-         LIBS="$LIBS -lopengl32"
-         AC_LINK_IFELSE([AC_LANG_PROGRAM([[@%:@include <GL/gl.h>]], [[glEnd()]])],
-           [GL_LIBS="$GL_LIBS -lopengl32"; GL_LIBS0="$GL_LIBS0 -lopengl32"])
-         LIBS="$fp_save_LIBS"
-         ;;
-    esac
-  fi
-fi
-AC_SUBST([GL_CFLAGS])
-AC_SUBST([GL_LIBS])
-])# FP_CHECK_GL
-
-
-# FP_CHECK_GLU
-# ------------
-AC_DEFUN([FP_CHECK_GLU],
-[AC_REQUIRE([FP_CHECK_GL])dnl
-GLU_CFLAGS="$GL_CFLAGS0"
-GLU_LIBS="$GL_LIBS0"
-
-if test x"$use_quartz_opengl" = xno; then
-  FP_CHECK_GL_HELPER([GLU], [-lglu32 -lGLU], [@%:@include <GL/glu.h>], [gluNewQuadric()])
-fi
-
-AC_SUBST([GLU_CFLAGS])
-AC_SUBST([GLU_LIBS])
-])# FP_CHECK_GLU
-
-
-# FP_ARG_COMPILER
-# -------------
-AC_DEFUN([FP_ARG_COMPILER],
-[AC_ARG_WITH([compiler],
-  [AC_HELP_STRING([--with-compiler@<:@=HC@:>@],
-    [use the given Haskell compiler (default=ghc)])],
-  [with_compiler=$withval],
-  [with_compiler=ghc])
-])# FP_ARG_COMPILER
diff --git a/cbits/HsOpenGL.c b/cbits/HsOpenGL.c
deleted file mode 100644
--- a/cbits/HsOpenGL.c
+++ /dev/null
@@ -1,125 +0,0 @@
-/* -----------------------------------------------------------------------------
- *
- * Module      :  C support for Graphics.Rendering.OpenGL.GL.Extensions
- * Copyright   :  (c) Sven Panne 2002-2005
- * License     :  BSD-style (see the file libraries/GLUT/LICENSE)
- * 
- * Maintainer  :  sven.panne@aedion.de
- * Stability   :  experimental
- * Portability :  portable
- *
- * -------------------------------------------------------------------------- */
-
-#include "HsOpenGL.h"
-#include <string.h>
-
-#if defined(_WIN32)
-#define hs_OpenGL_gpa(x) wglGetProcAddress((LPCSTR)(x))
-#elif defined(USE_QUARTZ_OPENGL)
-#include <mach-o/dyld.h>
-#include <stdlib.h>
-#include <stdio.h>
-
-static void*
-hs_OpenGL_gpa(const char *name)
-{
-  NSSymbol symbol;
-
-  /* Prepend a '_' for the Unix C symbol mangling convention */
-  char* symbolName = (char*)malloc(strlen(name) + 2);
-  if (!symbolName) {
-    fprintf(stderr, "Failed to allocate memory for NSGLGetProcAddress\n");
-    return NULL;
-  }
-  symbolName[0] = '_';
-  strcpy(symbolName + 1, name);
-
-  if (!NSIsSymbolNameDefined(symbolName)) {
-    free(symbolName);
-    return NULL;
-  }
-
-  symbol = NSLookupAndBindSymbol(symbolName);
-  free(symbolName);
-  if (!symbol) {
-    return NULL;
-  }
-
-  return NSAddressOfSymbol(symbol);
-}
-
-/* ToDo: This should really be based on a feature test. */
-#elif defined(__sgi) || defined (__sun)
-#include <dlfcn.h>
-
-static const char* gpaNames[] = {
-  "glXGetProcAddress", "glXGetProcAddressARB", "glXGetProcAddressEXT",
-  "_glXGetProcAddress", "_glXGetProcAddressARB", "_glXGetProcAddressEXT"
-};
-
-static void*
-hs_OpenGL_gpa(const char *name)
-{
-  static int firstTime = 1;
-  static void *handle = NULL;
-  static void *gpa = NULL;
-
-  if (firstTime) {
-    firstTime = 0;
-
-    /* Get a handle for our executable. */
-    handle = dlopen(NULL, RTLD_LAZY);
-    /* If fail this early, there's not much we can do about it. */
-    if (!handle) {
-      return NULL;
-    }
-
-    {
-      /* Let's see if our platform supports a glXGetProcAddress() variant. */
-      int numNames = (int)(sizeof(gpaNames) / sizeof(gpaNames[0]));
-      int i;
-      for (i = 0;   (!gpa) && (i < numNames);   ++i) {
-        gpa = dlsym(handle, gpaNames[i]);
-      }
-    }
-  }
-
-  if (gpa) {
-    /* Fine, we seem to have some kind of glXGetProcAddress(), so use it. */
-    return ((void *(*)(const GLubyte *))gpa)(name);
-  } else if (handle) {
-    /* Fallback to dlsym() if we have no glXGetProcAddress(), although we then
-       ignore the fact that OpenGL entry points could be context dependent. */
-    return dlsym(handle, name);
-  } else {
-    return NULL;
-  }
-}
-
-#else
-#define hs_OpenGL_gpa(x) glXGetProcAddressARB((const GLubyte*)(x))
-#endif
-
-
-/* procName is really a const char*, but currently we can't specify this in
-   Haskell's FFI and consequently get a warning from the C compiler. */
-void*
-hs_OpenGL_getProcAddress(char *procName)
-{
-  void* addr = hs_OpenGL_gpa(procName);
-  if (addr) {
-    return addr;
-  }
-  /* There is no way to get GLU extensions at runtime so we fake this, being
-     careful about GLU headers on WinDoze, which have a bad habit of lying
-     about their actual version. */
-#if defined(GLU_VERSION_1_3) && !defined(_WIN32)
-  if (strcmp(procName, "gluUnProject4") == 0) {
-    return gluUnProject4;
-  }
-  if (strcmp(procName, "gluBuild3DMipmapLevels") == 0) {
-    return gluBuild3DMipmapLevels;
-  }
-#endif
-  return NULL;
-}
diff --git a/config.guess b/config.guess
deleted file mode 100644
--- a/config.guess
+++ /dev/null
@@ -1,1497 +0,0 @@
-#! /bin/sh
-# Attempt to guess a canonical system name.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
-
-timestamp='2006-02-23'
-
-# This file is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Originally written by Per Bothner <per@bothner.com>.
-# Please send patches to <config-patches@gnu.org>.  Submit a context
-# diff and a properly formatted ChangeLog entry.
-#
-# This script attempts to guess a canonical system name similar to
-# config.sub.  If it succeeds, it prints the system name on stdout, and
-# exits with 0.  Otherwise, it exits with 1.
-#
-# The plan is that this can be called by configure scripts if you
-# don't specify an explicit build system type.
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION]
-
-Output the configuration name of the system \`$me' is run on.
-
-Operation modes:
-  -h, --help         print this help, then exit
-  -t, --time-stamp   print date of last modification, then exit
-  -v, --version      print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.guess ($timestamp)
-
-Originally written by Per Bothner.
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
-Free Software Foundation, Inc.
-
-This is free software; see the source for copying conditions.  There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
-  case $1 in
-    --time-stamp | --time* | -t )
-       echo "$timestamp" ; exit ;;
-    --version | -v )
-       echo "$version" ; exit ;;
-    --help | --h* | -h )
-       echo "$usage"; exit ;;
-    -- )     # Stop option processing
-       shift; break ;;
-    - )	# Use stdin as input.
-       break ;;
-    -* )
-       echo "$me: invalid option $1$help" >&2
-       exit 1 ;;
-    * )
-       break ;;
-  esac
-done
-
-if test $# != 0; then
-  echo "$me: too many arguments$help" >&2
-  exit 1
-fi
-
-trap 'exit 1' 1 2 15
-
-# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
-# compiler to aid in system detection is discouraged as it requires
-# temporary files to be created and, as you can see below, it is a
-# headache to deal with in a portable fashion.
-
-# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
-# use `HOST_CC' if defined, but it is deprecated.
-
-# Portable tmp directory creation inspired by the Autoconf team.
-
-set_cc_for_build='
-trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
-trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
-: ${TMPDIR=/tmp} ;
- { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
- { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
- { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
- { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
-dummy=$tmp/dummy ;
-tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
-case $CC_FOR_BUILD,$HOST_CC,$CC in
- ,,)    echo "int x;" > $dummy.c ;
-	for c in cc gcc c89 c99 ; do
-	  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
-	     CC_FOR_BUILD="$c"; break ;
-	  fi ;
-	done ;
-	if test x"$CC_FOR_BUILD" = x ; then
-	  CC_FOR_BUILD=no_compiler_found ;
-	fi
-	;;
- ,,*)   CC_FOR_BUILD=$CC ;;
- ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
-esac ; set_cc_for_build= ;'
-
-# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
-# (ghazi@noc.rutgers.edu 1994-08-24)
-if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
-	PATH=$PATH:/.attbin ; export PATH
-fi
-
-UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
-UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
-UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
-UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
-
-# Note: order is significant - the case branches are not exclusive.
-
-case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
-    *:NetBSD:*:*)
-	# NetBSD (nbsd) targets should (where applicable) match one or
-	# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
-	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
-	# switched to ELF, *-*-netbsd* would select the old
-	# object file format.  This provides both forward
-	# compatibility and a consistent mechanism for selecting the
-	# object file format.
-	#
-	# Note: NetBSD doesn't particularly care about the vendor
-	# portion of the name.  We always set it to "unknown".
-	sysctl="sysctl -n hw.machine_arch"
-	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
-	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
-	case "${UNAME_MACHINE_ARCH}" in
-	    armeb) machine=armeb-unknown ;;
-	    arm*) machine=arm-unknown ;;
-	    sh3el) machine=shl-unknown ;;
-	    sh3eb) machine=sh-unknown ;;
-	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
-	esac
-	# The Operating System including object format, if it has switched
-	# to ELF recently, or will in the future.
-	case "${UNAME_MACHINE_ARCH}" in
-	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
-		eval $set_cc_for_build
-		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
-			| grep __ELF__ >/dev/null
-		then
-		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
-		    # Return netbsd for either.  FIX?
-		    os=netbsd
-		else
-		    os=netbsdelf
-		fi
-		;;
-	    *)
-	        os=netbsd
-		;;
-	esac
-	# The OS release
-	# Debian GNU/NetBSD machines have a different userland, and
-	# thus, need a distinct triplet. However, they do not need
-	# kernel version information, so it can be replaced with a
-	# suitable tag, in the style of linux-gnu.
-	case "${UNAME_VERSION}" in
-	    Debian*)
-		release='-gnu'
-		;;
-	    *)
-		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
-		;;
-	esac
-	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
-	# contains redundant information, the shorter form:
-	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
-	echo "${machine}-${os}${release}"
-	exit ;;
-    *:OpenBSD:*:*)
-	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
-	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
-	exit ;;
-    *:ekkoBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
-	exit ;;
-    *:SolidBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
-	exit ;;
-    macppc:MirBSD:*:*)
-	echo powerppc-unknown-mirbsd${UNAME_RELEASE}
-	exit ;;
-    *:MirBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
-	exit ;;
-    alpha:OSF1:*:*)
-	case $UNAME_RELEASE in
-	*4.0)
-		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
-		;;
-	*5.*)
-	        UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
-		;;
-	esac
-	# According to Compaq, /usr/sbin/psrinfo has been available on
-	# OSF/1 and Tru64 systems produced since 1995.  I hope that
-	# covers most systems running today.  This code pipes the CPU
-	# types through head -n 1, so we only detect the type of CPU 0.
-	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
-	case "$ALPHA_CPU_TYPE" in
-	    "EV4 (21064)")
-		UNAME_MACHINE="alpha" ;;
-	    "EV4.5 (21064)")
-		UNAME_MACHINE="alpha" ;;
-	    "LCA4 (21066/21068)")
-		UNAME_MACHINE="alpha" ;;
-	    "EV5 (21164)")
-		UNAME_MACHINE="alphaev5" ;;
-	    "EV5.6 (21164A)")
-		UNAME_MACHINE="alphaev56" ;;
-	    "EV5.6 (21164PC)")
-		UNAME_MACHINE="alphapca56" ;;
-	    "EV5.7 (21164PC)")
-		UNAME_MACHINE="alphapca57" ;;
-	    "EV6 (21264)")
-		UNAME_MACHINE="alphaev6" ;;
-	    "EV6.7 (21264A)")
-		UNAME_MACHINE="alphaev67" ;;
-	    "EV6.8CB (21264C)")
-		UNAME_MACHINE="alphaev68" ;;
-	    "EV6.8AL (21264B)")
-		UNAME_MACHINE="alphaev68" ;;
-	    "EV6.8CX (21264D)")
-		UNAME_MACHINE="alphaev68" ;;
-	    "EV6.9A (21264/EV69A)")
-		UNAME_MACHINE="alphaev69" ;;
-	    "EV7 (21364)")
-		UNAME_MACHINE="alphaev7" ;;
-	    "EV7.9 (21364A)")
-		UNAME_MACHINE="alphaev79" ;;
-	esac
-	# A Pn.n version is a patched version.
-	# A Vn.n version is a released version.
-	# A Tn.n version is a released field test version.
-	# A Xn.n version is an unreleased experimental baselevel.
-	# 1.2 uses "1.2" for uname -r.
-	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-	exit ;;
-    Alpha\ *:Windows_NT*:*)
-	# How do we know it's Interix rather than the generic POSIX subsystem?
-	# Should we change UNAME_MACHINE based on the output of uname instead
-	# of the specific Alpha model?
-	echo alpha-pc-interix
-	exit ;;
-    21064:Windows_NT:50:3)
-	echo alpha-dec-winnt3.5
-	exit ;;
-    Amiga*:UNIX_System_V:4.0:*)
-	echo m68k-unknown-sysv4
-	exit ;;
-    *:[Aa]miga[Oo][Ss]:*:*)
-	echo ${UNAME_MACHINE}-unknown-amigaos
-	exit ;;
-    *:[Mm]orph[Oo][Ss]:*:*)
-	echo ${UNAME_MACHINE}-unknown-morphos
-	exit ;;
-    *:OS/390:*:*)
-	echo i370-ibm-openedition
-	exit ;;
-    *:z/VM:*:*)
-	echo s390-ibm-zvmoe
-	exit ;;
-    *:OS400:*:*)
-        echo powerpc-ibm-os400
-	exit ;;
-    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
-	echo arm-acorn-riscix${UNAME_RELEASE}
-	exit ;;
-    arm:riscos:*:*|arm:RISCOS:*:*)
-	echo arm-unknown-riscos
-	exit ;;
-    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
-	echo hppa1.1-hitachi-hiuxmpp
-	exit ;;
-    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
-	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
-	if test "`(/bin/universe) 2>/dev/null`" = att ; then
-		echo pyramid-pyramid-sysv3
-	else
-		echo pyramid-pyramid-bsd
-	fi
-	exit ;;
-    NILE*:*:*:dcosx)
-	echo pyramid-pyramid-svr4
-	exit ;;
-    DRS?6000:unix:4.0:6*)
-	echo sparc-icl-nx6
-	exit ;;
-    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
-	case `/usr/bin/uname -p` in
-	    sparc) echo sparc-icl-nx7; exit ;;
-	esac ;;
-    sun4H:SunOS:5.*:*)
-	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
-	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    i86pc:SunOS:5.*:*)
-	echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4*:SunOS:6*:*)
-	# According to config.sub, this is the proper way to canonicalize
-	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
-	# it's likely to be more like Solaris than SunOS4.
-	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4*:SunOS:*:*)
-	case "`/usr/bin/arch -k`" in
-	    Series*|S4*)
-		UNAME_RELEASE=`uname -v`
-		;;
-	esac
-	# Japanese Language versions have a version number like `4.1.3-JL'.
-	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
-	exit ;;
-    sun3*:SunOS:*:*)
-	echo m68k-sun-sunos${UNAME_RELEASE}
-	exit ;;
-    sun*:*:4.2BSD:*)
-	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
-	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
-	case "`/bin/arch`" in
-	    sun3)
-		echo m68k-sun-sunos${UNAME_RELEASE}
-		;;
-	    sun4)
-		echo sparc-sun-sunos${UNAME_RELEASE}
-		;;
-	esac
-	exit ;;
-    aushp:SunOS:*:*)
-	echo sparc-auspex-sunos${UNAME_RELEASE}
-	exit ;;
-    # The situation for MiNT is a little confusing.  The machine name
-    # can be virtually everything (everything which is not
-    # "atarist" or "atariste" at least should have a processor
-    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
-    # to the lowercase version "mint" (or "freemint").  Finally
-    # the system name "TOS" denotes a system which is actually not
-    # MiNT.  But MiNT is downward compatible to TOS, so this should
-    # be no problem.
-    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
-        echo m68k-atari-mint${UNAME_RELEASE}
-	exit ;;
-    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
-	echo m68k-atari-mint${UNAME_RELEASE}
-        exit ;;
-    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
-        echo m68k-atari-mint${UNAME_RELEASE}
-	exit ;;
-    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
-        echo m68k-milan-mint${UNAME_RELEASE}
-        exit ;;
-    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
-        echo m68k-hades-mint${UNAME_RELEASE}
-        exit ;;
-    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
-        echo m68k-unknown-mint${UNAME_RELEASE}
-        exit ;;
-    m68k:machten:*:*)
-	echo m68k-apple-machten${UNAME_RELEASE}
-	exit ;;
-    powerpc:machten:*:*)
-	echo powerpc-apple-machten${UNAME_RELEASE}
-	exit ;;
-    RISC*:Mach:*:*)
-	echo mips-dec-mach_bsd4.3
-	exit ;;
-    RISC*:ULTRIX:*:*)
-	echo mips-dec-ultrix${UNAME_RELEASE}
-	exit ;;
-    VAX*:ULTRIX*:*:*)
-	echo vax-dec-ultrix${UNAME_RELEASE}
-	exit ;;
-    2020:CLIX:*:* | 2430:CLIX:*:*)
-	echo clipper-intergraph-clix${UNAME_RELEASE}
-	exit ;;
-    mips:*:*:UMIPS | mips:*:*:RISCos)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-#ifdef __cplusplus
-#include <stdio.h>  /* for printf() prototype */
-	int main (int argc, char *argv[]) {
-#else
-	int main (argc, argv) int argc; char *argv[]; {
-#endif
-	#if defined (host_mips) && defined (MIPSEB)
-	#if defined (SYSTYPE_SYSV)
-	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
-	#endif
-	#if defined (SYSTYPE_SVR4)
-	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
-	#endif
-	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
-	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
-	#endif
-	#endif
-	  exit (-1);
-	}
-EOF
-	$CC_FOR_BUILD -o $dummy $dummy.c &&
-	  dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
-	  SYSTEM_NAME=`$dummy $dummyarg` &&
-	    { echo "$SYSTEM_NAME"; exit; }
-	echo mips-mips-riscos${UNAME_RELEASE}
-	exit ;;
-    Motorola:PowerMAX_OS:*:*)
-	echo powerpc-motorola-powermax
-	exit ;;
-    Motorola:*:4.3:PL8-*)
-	echo powerpc-harris-powermax
-	exit ;;
-    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
-	echo powerpc-harris-powermax
-	exit ;;
-    Night_Hawk:Power_UNIX:*:*)
-	echo powerpc-harris-powerunix
-	exit ;;
-    m88k:CX/UX:7*:*)
-	echo m88k-harris-cxux7
-	exit ;;
-    m88k:*:4*:R4*)
-	echo m88k-motorola-sysv4
-	exit ;;
-    m88k:*:3*:R3*)
-	echo m88k-motorola-sysv3
-	exit ;;
-    AViiON:dgux:*:*)
-        # DG/UX returns AViiON for all architectures
-        UNAME_PROCESSOR=`/usr/bin/uname -p`
-	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
-	then
-	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
-	       [ ${TARGET_BINARY_INTERFACE}x = x ]
-	    then
-		echo m88k-dg-dgux${UNAME_RELEASE}
-	    else
-		echo m88k-dg-dguxbcs${UNAME_RELEASE}
-	    fi
-	else
-	    echo i586-dg-dgux${UNAME_RELEASE}
-	fi
- 	exit ;;
-    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
-	echo m88k-dolphin-sysv3
-	exit ;;
-    M88*:*:R3*:*)
-	# Delta 88k system running SVR3
-	echo m88k-motorola-sysv3
-	exit ;;
-    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
-	echo m88k-tektronix-sysv3
-	exit ;;
-    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
-	echo m68k-tektronix-bsd
-	exit ;;
-    *:IRIX*:*:*)
-	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
-	exit ;;
-    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
-	echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
-	exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
-    i*86:AIX:*:*)
-	echo i386-ibm-aix
-	exit ;;
-    ia64:AIX:*:*)
-	if [ -x /usr/bin/oslevel ] ; then
-		IBM_REV=`/usr/bin/oslevel`
-	else
-		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
-	fi
-	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
-	exit ;;
-    *:AIX:2:3)
-	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
-		eval $set_cc_for_build
-		sed 's/^		//' << EOF >$dummy.c
-		#include <sys/systemcfg.h>
-
-		main()
-			{
-			if (!__power_pc())
-				exit(1);
-			puts("powerpc-ibm-aix3.2.5");
-			exit(0);
-			}
-EOF
-		if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
-		then
-			echo "$SYSTEM_NAME"
-		else
-			echo rs6000-ibm-aix3.2.5
-		fi
-	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
-		echo rs6000-ibm-aix3.2.4
-	else
-		echo rs6000-ibm-aix3.2
-	fi
-	exit ;;
-    *:AIX:*:[45])
-	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
-	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
-		IBM_ARCH=rs6000
-	else
-		IBM_ARCH=powerpc
-	fi
-	if [ -x /usr/bin/oslevel ] ; then
-		IBM_REV=`/usr/bin/oslevel`
-	else
-		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
-	fi
-	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
-	exit ;;
-    *:AIX:*:*)
-	echo rs6000-ibm-aix
-	exit ;;
-    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
-	echo romp-ibm-bsd4.4
-	exit ;;
-    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
-	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
-	exit ;;                             # report: romp-ibm BSD 4.3
-    *:BOSX:*:*)
-	echo rs6000-bull-bosx
-	exit ;;
-    DPX/2?00:B.O.S.:*:*)
-	echo m68k-bull-sysv3
-	exit ;;
-    9000/[34]??:4.3bsd:1.*:*)
-	echo m68k-hp-bsd
-	exit ;;
-    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
-	echo m68k-hp-bsd4.4
-	exit ;;
-    9000/[34678]??:HP-UX:*:*)
-	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
-	case "${UNAME_MACHINE}" in
-	    9000/31? )            HP_ARCH=m68000 ;;
-	    9000/[34]?? )         HP_ARCH=m68k ;;
-	    9000/[678][0-9][0-9])
-		if [ -x /usr/bin/getconf ]; then
-		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
-                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
-                    case "${sc_cpu_version}" in
-                      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
-                      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
-                      532)                      # CPU_PA_RISC2_0
-                        case "${sc_kernel_bits}" in
-                          32) HP_ARCH="hppa2.0n" ;;
-                          64) HP_ARCH="hppa2.0w" ;;
-			  '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
-                        esac ;;
-                    esac
-		fi
-		if [ "${HP_ARCH}" = "" ]; then
-		    eval $set_cc_for_build
-		    sed 's/^              //' << EOF >$dummy.c
-
-              #define _HPUX_SOURCE
-              #include <stdlib.h>
-              #include <unistd.h>
-
-              int main ()
-              {
-              #if defined(_SC_KERNEL_BITS)
-                  long bits = sysconf(_SC_KERNEL_BITS);
-              #endif
-                  long cpu  = sysconf (_SC_CPU_VERSION);
-
-                  switch (cpu)
-              	{
-              	case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
-              	case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
-              	case CPU_PA_RISC2_0:
-              #if defined(_SC_KERNEL_BITS)
-              	    switch (bits)
-              		{
-              		case 64: puts ("hppa2.0w"); break;
-              		case 32: puts ("hppa2.0n"); break;
-              		default: puts ("hppa2.0"); break;
-              		} break;
-              #else  /* !defined(_SC_KERNEL_BITS) */
-              	    puts ("hppa2.0"); break;
-              #endif
-              	default: puts ("hppa1.0"); break;
-              	}
-                  exit (0);
-              }
-EOF
-		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
-		    test -z "$HP_ARCH" && HP_ARCH=hppa
-		fi ;;
-	esac
-	if [ ${HP_ARCH} = "hppa2.0w" ]
-	then
-	    eval $set_cc_for_build
-
-	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
-	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
-	    # generating 64-bit code.  GNU and HP use different nomenclature:
-	    #
-	    # $ CC_FOR_BUILD=cc ./config.guess
-	    # => hppa2.0w-hp-hpux11.23
-	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
-	    # => hppa64-hp-hpux11.23
-
-	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
-		grep __LP64__ >/dev/null
-	    then
-		HP_ARCH="hppa2.0w"
-	    else
-		HP_ARCH="hppa64"
-	    fi
-	fi
-	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
-	exit ;;
-    ia64:HP-UX:*:*)
-	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
-	echo ia64-hp-hpux${HPUX_REV}
-	exit ;;
-    3050*:HI-UX:*:*)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#include <unistd.h>
-	int
-	main ()
-	{
-	  long cpu = sysconf (_SC_CPU_VERSION);
-	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
-	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
-	     results, however.  */
-	  if (CPU_IS_PA_RISC (cpu))
-	    {
-	      switch (cpu)
-		{
-		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
-		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
-		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
-		  default: puts ("hppa-hitachi-hiuxwe2"); break;
-		}
-	    }
-	  else if (CPU_IS_HP_MC68K (cpu))
-	    puts ("m68k-hitachi-hiuxwe2");
-	  else puts ("unknown-hitachi-hiuxwe2");
-	  exit (0);
-	}
-EOF
-	$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
-		{ echo "$SYSTEM_NAME"; exit; }
-	echo unknown-hitachi-hiuxwe2
-	exit ;;
-    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
-	echo hppa1.1-hp-bsd
-	exit ;;
-    9000/8??:4.3bsd:*:*)
-	echo hppa1.0-hp-bsd
-	exit ;;
-    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
-	echo hppa1.0-hp-mpeix
-	exit ;;
-    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
-	echo hppa1.1-hp-osf
-	exit ;;
-    hp8??:OSF1:*:*)
-	echo hppa1.0-hp-osf
-	exit ;;
-    i*86:OSF1:*:*)
-	if [ -x /usr/sbin/sysversion ] ; then
-	    echo ${UNAME_MACHINE}-unknown-osf1mk
-	else
-	    echo ${UNAME_MACHINE}-unknown-osf1
-	fi
-	exit ;;
-    parisc*:Lites*:*:*)
-	echo hppa1.1-hp-lites
-	exit ;;
-    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
-	echo c1-convex-bsd
-        exit ;;
-    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
-	if getsysinfo -f scalar_acc
-	then echo c32-convex-bsd
-	else echo c2-convex-bsd
-	fi
-        exit ;;
-    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
-	echo c34-convex-bsd
-        exit ;;
-    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
-	echo c38-convex-bsd
-        exit ;;
-    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
-	echo c4-convex-bsd
-        exit ;;
-    CRAY*Y-MP:*:*:*)
-	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*[A-Z]90:*:*:*)
-	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
-	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
-	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
-	      -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*TS:*:*:*)
-	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*T3E:*:*:*)
-	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*SV1:*:*:*)
-	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    *:UNICOS/mp:*:*)
-	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
-	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
-        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
-        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
-        exit ;;
-    5000:UNIX_System_V:4.*:*)
-        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
-        FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
-        echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
-	exit ;;
-    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
-	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
-	exit ;;
-    sparc*:BSD/OS:*:*)
-	echo sparc-unknown-bsdi${UNAME_RELEASE}
-	exit ;;
-    *:BSD/OS:*:*)
-	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
-	exit ;;
-    *:FreeBSD:*:*)
-	case ${UNAME_MACHINE} in
-	    pc98)
-		echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
-	    *)
-		echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
-	esac
-	exit ;;
-    i*:CYGWIN*:*)
-	echo ${UNAME_MACHINE}-pc-cygwin
-	exit ;;
-    i*:MINGW*:*)
-	echo ${UNAME_MACHINE}-pc-mingw32
-	exit ;;
-    i*:MSYS_NT-*:*:*)
-	echo ${UNAME_MACHINE}-pc-mingw32
-	exit ;;
-    i*:windows32*:*)
-    	# uname -m includes "-pc" on this system.
-    	echo ${UNAME_MACHINE}-mingw32
-	exit ;;
-    i*:PW*:*)
-	echo ${UNAME_MACHINE}-pc-pw32
-	exit ;;
-    x86:Interix*:[345]*)
-	echo i586-pc-interix${UNAME_RELEASE}
-	exit ;;
-    EM64T:Interix*:[345]*)
-	echo x86_64-unknown-interix${UNAME_RELEASE}
-	exit ;;
-    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
-	echo i${UNAME_MACHINE}-pc-mks
-	exit ;;
-    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
-	# How do we know it's Interix rather than the generic POSIX subsystem?
-	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
-	# UNAME_MACHINE based on the output of uname instead of i386?
-	echo i586-pc-interix
-	exit ;;
-    i*:UWIN*:*)
-	echo ${UNAME_MACHINE}-pc-uwin
-	exit ;;
-    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
-	echo x86_64-unknown-cygwin
-	exit ;;
-    p*:CYGWIN*:*)
-	echo powerpcle-unknown-cygwin
-	exit ;;
-    prep*:SunOS:5.*:*)
-	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    *:GNU:*:*)
-	# the GNU system
-	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
-	exit ;;
-    *:GNU/*:*:*)
-	# other systems with GNU libc and userland
-	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
-	exit ;;
-    i*86:Minix:*:*)
-	echo ${UNAME_MACHINE}-pc-minix
-	exit ;;
-    arm*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    cris:Linux:*:*)
-	echo cris-axis-linux-gnu
-	exit ;;
-    crisv32:Linux:*:*)
-	echo crisv32-axis-linux-gnu
-	exit ;;
-    frv:Linux:*:*)
-    	echo frv-unknown-linux-gnu
-	exit ;;
-    ia64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    m32r*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    m68*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    mips:Linux:*:*)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#undef CPU
-	#undef mips
-	#undef mipsel
-	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
-	CPU=mipsel
-	#else
-	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
-	CPU=mips
-	#else
-	CPU=
-	#endif
-	#endif
-EOF
-	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
-	    /^CPU/{
-		s: ::g
-		p
-	    }'`"
-	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
-	;;
-    mips64:Linux:*:*)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#undef CPU
-	#undef mips64
-	#undef mips64el
-	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
-	CPU=mips64el
-	#else
-	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
-	CPU=mips64
-	#else
-	CPU=
-	#endif
-	#endif
-EOF
-	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
-	    /^CPU/{
-		s: ::g
-		p
-	    }'`"
-	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
-	;;
-    or32:Linux:*:*)
-	echo or32-unknown-linux-gnu
-	exit ;;
-    ppc:Linux:*:*)
-	echo powerpc-unknown-linux-gnu
-	exit ;;
-    ppc64:Linux:*:*)
-	echo powerpc64-unknown-linux-gnu
-	exit ;;
-    alpha:Linux:*:*)
-	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
-	  EV5)   UNAME_MACHINE=alphaev5 ;;
-	  EV56)  UNAME_MACHINE=alphaev56 ;;
-	  PCA56) UNAME_MACHINE=alphapca56 ;;
-	  PCA57) UNAME_MACHINE=alphapca56 ;;
-	  EV6)   UNAME_MACHINE=alphaev6 ;;
-	  EV67)  UNAME_MACHINE=alphaev67 ;;
-	  EV68*) UNAME_MACHINE=alphaev68 ;;
-        esac
-	objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
-	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
-	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
-	exit ;;
-    parisc:Linux:*:* | hppa:Linux:*:*)
-	# Look for CPU level
-	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
-	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
-	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
-	  *)    echo hppa-unknown-linux-gnu ;;
-	esac
-	exit ;;
-    parisc64:Linux:*:* | hppa64:Linux:*:*)
-	echo hppa64-unknown-linux-gnu
-	exit ;;
-    s390:Linux:*:* | s390x:Linux:*:*)
-	echo ${UNAME_MACHINE}-ibm-linux
-	exit ;;
-    sh64*:Linux:*:*)
-    	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    sh*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    sparc:Linux:*:* | sparc64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    vax:Linux:*:*)
-	echo ${UNAME_MACHINE}-dec-linux-gnu
-	exit ;;
-    x86_64:Linux:*:*)
-	echo x86_64-unknown-linux-gnu
-	exit ;;
-    i*86:Linux:*:*)
-	# The BFD linker knows what the default object file format is, so
-	# first see if it will tell us. cd to the root directory to prevent
-	# problems with other programs or directories called `ld' in the path.
-	# Set LC_ALL=C to ensure ld outputs messages in English.
-	ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
-			 | sed -ne '/supported targets:/!d
-				    s/[ 	][ 	]*/ /g
-				    s/.*supported targets: *//
-				    s/ .*//
-				    p'`
-        case "$ld_supported_targets" in
-	  elf32-i386)
-		TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
-		;;
-	  a.out-i386-linux)
-		echo "${UNAME_MACHINE}-pc-linux-gnuaout"
-		exit ;;
-	  coff-i386)
-		echo "${UNAME_MACHINE}-pc-linux-gnucoff"
-		exit ;;
-	  "")
-		# Either a pre-BFD a.out linker (linux-gnuoldld) or
-		# one that does not give us useful --help.
-		echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
-		exit ;;
-	esac
-	# Determine whether the default compiler is a.out or elf
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#include <features.h>
-	#ifdef __ELF__
-	# ifdef __GLIBC__
-	#  if __GLIBC__ >= 2
-	LIBC=gnu
-	#  else
-	LIBC=gnulibc1
-	#  endif
-	# else
-	LIBC=gnulibc1
-	# endif
-	#else
-	#if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__sun)
-	LIBC=gnu
-	#else
-	LIBC=gnuaout
-	#endif
-	#endif
-	#ifdef __dietlibc__
-	LIBC=dietlibc
-	#endif
-EOF
-	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
-	    /^LIBC/{
-		s: ::g
-		p
-	    }'`"
-	test x"${LIBC}" != x && {
-		echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
-		exit
-	}
-	test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; }
-	;;
-    i*86:DYNIX/ptx:4*:*)
-	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
-	# earlier versions are messed up and put the nodename in both
-	# sysname and nodename.
-	echo i386-sequent-sysv4
-	exit ;;
-    i*86:UNIX_SV:4.2MP:2.*)
-        # Unixware is an offshoot of SVR4, but it has its own version
-        # number series starting with 2...
-        # I am not positive that other SVR4 systems won't match this,
-	# I just have to hope.  -- rms.
-        # Use sysv4.2uw... so that sysv4* matches it.
-	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
-	exit ;;
-    i*86:OS/2:*:*)
-	# If we were able to find `uname', then EMX Unix compatibility
-	# is probably installed.
-	echo ${UNAME_MACHINE}-pc-os2-emx
-	exit ;;
-    i*86:XTS-300:*:STOP)
-	echo ${UNAME_MACHINE}-unknown-stop
-	exit ;;
-    i*86:atheos:*:*)
-	echo ${UNAME_MACHINE}-unknown-atheos
-	exit ;;
-    i*86:syllable:*:*)
-	echo ${UNAME_MACHINE}-pc-syllable
-	exit ;;
-    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
-	echo i386-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    i*86:*DOS:*:*)
-	echo ${UNAME_MACHINE}-pc-msdosdjgpp
-	exit ;;
-    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
-	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
-	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
-		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
-	else
-		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
-	fi
-	exit ;;
-    i*86:*:5:[678]*)
-    	# UnixWare 7.x, OpenUNIX and OpenServer 6.
-	case `/bin/uname -X | grep "^Machine"` in
-	    *486*)	     UNAME_MACHINE=i486 ;;
-	    *Pentium)	     UNAME_MACHINE=i586 ;;
-	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
-	esac
-	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
-	exit ;;
-    i*86:*:3.2:*)
-	if test -f /usr/options/cb.name; then
-		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
-		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
-	elif /bin/uname -X 2>/dev/null >/dev/null ; then
-		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
-		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
-		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
-			&& UNAME_MACHINE=i586
-		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
-			&& UNAME_MACHINE=i686
-		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
-			&& UNAME_MACHINE=i686
-		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
-	else
-		echo ${UNAME_MACHINE}-pc-sysv32
-	fi
-	exit ;;
-    pc:*:*:*)
-	# Left here for compatibility:
-        # uname -m prints for DJGPP always 'pc', but it prints nothing about
-        # the processor, so we play safe by assuming i386.
-	echo i386-pc-msdosdjgpp
-        exit ;;
-    Intel:Mach:3*:*)
-	echo i386-pc-mach3
-	exit ;;
-    paragon:*:*:*)
-	echo i860-intel-osf1
-	exit ;;
-    i860:*:4.*:*) # i860-SVR4
-	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
-	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
-	else # Add other i860-SVR4 vendors below as they are discovered.
-	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
-	fi
-	exit ;;
-    mini*:CTIX:SYS*5:*)
-	# "miniframe"
-	echo m68010-convergent-sysv
-	exit ;;
-    mc68k:UNIX:SYSTEM5:3.51m)
-	echo m68k-convergent-sysv
-	exit ;;
-    M680?0:D-NIX:5.3:*)
-	echo m68k-diab-dnix
-	exit ;;
-    M68*:*:R3V[5678]*:*)
-	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
-    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
-	OS_REL=''
-	test -r /etc/.relid \
-	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
-	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-	  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
-	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
-	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
-    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
-        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-          && { echo i486-ncr-sysv4; exit; } ;;
-    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
-	echo m68k-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    mc68030:UNIX_System_V:4.*:*)
-	echo m68k-atari-sysv4
-	exit ;;
-    TSUNAMI:LynxOS:2.*:*)
-	echo sparc-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    rs6000:LynxOS:2.*:*)
-	echo rs6000-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
-	echo powerpc-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    SM[BE]S:UNIX_SV:*:*)
-	echo mips-dde-sysv${UNAME_RELEASE}
-	exit ;;
-    RM*:ReliantUNIX-*:*:*)
-	echo mips-sni-sysv4
-	exit ;;
-    RM*:SINIX-*:*:*)
-	echo mips-sni-sysv4
-	exit ;;
-    *:SINIX-*:*:*)
-	if uname -p 2>/dev/null >/dev/null ; then
-		UNAME_MACHINE=`(uname -p) 2>/dev/null`
-		echo ${UNAME_MACHINE}-sni-sysv4
-	else
-		echo ns32k-sni-sysv
-	fi
-	exit ;;
-    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
-                      # says <Richard.M.Bartel@ccMail.Census.GOV>
-        echo i586-unisys-sysv4
-        exit ;;
-    *:UNIX_System_V:4*:FTX*)
-	# From Gerald Hewes <hewes@openmarket.com>.
-	# How about differentiating between stratus architectures? -djm
-	echo hppa1.1-stratus-sysv4
-	exit ;;
-    *:*:*:FTX*)
-	# From seanf@swdc.stratus.com.
-	echo i860-stratus-sysv4
-	exit ;;
-    i*86:VOS:*:*)
-	# From Paul.Green@stratus.com.
-	echo ${UNAME_MACHINE}-stratus-vos
-	exit ;;
-    *:VOS:*:*)
-	# From Paul.Green@stratus.com.
-	echo hppa1.1-stratus-vos
-	exit ;;
-    mc68*:A/UX:*:*)
-	echo m68k-apple-aux${UNAME_RELEASE}
-	exit ;;
-    news*:NEWS-OS:6*:*)
-	echo mips-sony-newsos6
-	exit ;;
-    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
-	if [ -d /usr/nec ]; then
-	        echo mips-nec-sysv${UNAME_RELEASE}
-	else
-	        echo mips-unknown-sysv${UNAME_RELEASE}
-	fi
-        exit ;;
-    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
-	echo powerpc-be-beos
-	exit ;;
-    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
-	echo powerpc-apple-beos
-	exit ;;
-    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
-	echo i586-pc-beos
-	exit ;;
-    SX-4:SUPER-UX:*:*)
-	echo sx4-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-5:SUPER-UX:*:*)
-	echo sx5-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-6:SUPER-UX:*:*)
-	echo sx6-nec-superux${UNAME_RELEASE}
-	exit ;;
-    Power*:Rhapsody:*:*)
-	echo powerpc-apple-rhapsody${UNAME_RELEASE}
-	exit ;;
-    *:Rhapsody:*:*)
-	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
-	exit ;;
-    *:Darwin:*:*)
-	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
-	case $UNAME_PROCESSOR in
-	    unknown) UNAME_PROCESSOR=powerpc ;;
-	esac
-	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
-	exit ;;
-    *:procnto*:*:* | *:QNX:[0123456789]*:*)
-	UNAME_PROCESSOR=`uname -p`
-	if test "$UNAME_PROCESSOR" = "x86"; then
-		UNAME_PROCESSOR=i386
-		UNAME_MACHINE=pc
-	fi
-	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
-	exit ;;
-    *:QNX:*:4*)
-	echo i386-pc-qnx
-	exit ;;
-    NSE-?:NONSTOP_KERNEL:*:*)
-	echo nse-tandem-nsk${UNAME_RELEASE}
-	exit ;;
-    NSR-?:NONSTOP_KERNEL:*:*)
-	echo nsr-tandem-nsk${UNAME_RELEASE}
-	exit ;;
-    *:NonStop-UX:*:*)
-	echo mips-compaq-nonstopux
-	exit ;;
-    BS2000:POSIX*:*:*)
-	echo bs2000-siemens-sysv
-	exit ;;
-    DS/*:UNIX_System_V:*:*)
-	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
-	exit ;;
-    *:Plan9:*:*)
-	# "uname -m" is not consistent, so use $cputype instead. 386
-	# is converted to i386 for consistency with other x86
-	# operating systems.
-	if test "$cputype" = "386"; then
-	    UNAME_MACHINE=i386
-	else
-	    UNAME_MACHINE="$cputype"
-	fi
-	echo ${UNAME_MACHINE}-unknown-plan9
-	exit ;;
-    *:TOPS-10:*:*)
-	echo pdp10-unknown-tops10
-	exit ;;
-    *:TENEX:*:*)
-	echo pdp10-unknown-tenex
-	exit ;;
-    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
-	echo pdp10-dec-tops20
-	exit ;;
-    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
-	echo pdp10-xkl-tops20
-	exit ;;
-    *:TOPS-20:*:*)
-	echo pdp10-unknown-tops20
-	exit ;;
-    *:ITS:*:*)
-	echo pdp10-unknown-its
-	exit ;;
-    SEI:*:*:SEIUX)
-        echo mips-sei-seiux${UNAME_RELEASE}
-	exit ;;
-    *:DragonFly:*:*)
-	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
-	exit ;;
-    *:*VMS:*:*)
-    	UNAME_MACHINE=`(uname -p) 2>/dev/null`
-	case "${UNAME_MACHINE}" in
-	    A*) echo alpha-dec-vms ; exit ;;
-	    I*) echo ia64-dec-vms ; exit ;;
-	    V*) echo vax-dec-vms ; exit ;;
-	esac ;;
-    *:XENIX:*:SysV)
-	echo i386-pc-xenix
-	exit ;;
-    i*86:skyos:*:*)
-	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
-	exit ;;
-    i*86:rdos:*:*)
-	echo ${UNAME_MACHINE}-pc-rdos
-	exit ;;
-esac
-
-#echo '(No uname command or uname output not recognized.)' 1>&2
-#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
-
-eval $set_cc_for_build
-cat >$dummy.c <<EOF
-#ifdef _SEQUENT_
-# include <sys/types.h>
-# include <sys/utsname.h>
-#endif
-main ()
-{
-#if defined (sony)
-#if defined (MIPSEB)
-  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
-     I don't know....  */
-  printf ("mips-sony-bsd\n"); exit (0);
-#else
-#include <sys/param.h>
-  printf ("m68k-sony-newsos%s\n",
-#ifdef NEWSOS4
-          "4"
-#else
-	  ""
-#endif
-         ); exit (0);
-#endif
-#endif
-
-#if defined (__arm) && defined (__acorn) && defined (__unix)
-  printf ("arm-acorn-riscix\n"); exit (0);
-#endif
-
-#if defined (hp300) && !defined (hpux)
-  printf ("m68k-hp-bsd\n"); exit (0);
-#endif
-
-#if defined (NeXT)
-#if !defined (__ARCHITECTURE__)
-#define __ARCHITECTURE__ "m68k"
-#endif
-  int version;
-  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
-  if (version < 4)
-    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
-  else
-    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
-  exit (0);
-#endif
-
-#if defined (MULTIMAX) || defined (n16)
-#if defined (UMAXV)
-  printf ("ns32k-encore-sysv\n"); exit (0);
-#else
-#if defined (CMU)
-  printf ("ns32k-encore-mach\n"); exit (0);
-#else
-  printf ("ns32k-encore-bsd\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (__386BSD__)
-  printf ("i386-pc-bsd\n"); exit (0);
-#endif
-
-#if defined (sequent)
-#if defined (i386)
-  printf ("i386-sequent-dynix\n"); exit (0);
-#endif
-#if defined (ns32000)
-  printf ("ns32k-sequent-dynix\n"); exit (0);
-#endif
-#endif
-
-#if defined (_SEQUENT_)
-    struct utsname un;
-
-    uname(&un);
-
-    if (strncmp(un.version, "V2", 2) == 0) {
-	printf ("i386-sequent-ptx2\n"); exit (0);
-    }
-    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
-	printf ("i386-sequent-ptx1\n"); exit (0);
-    }
-    printf ("i386-sequent-ptx\n"); exit (0);
-
-#endif
-
-#if defined (vax)
-# if !defined (ultrix)
-#  include <sys/param.h>
-#  if defined (BSD)
-#   if BSD == 43
-      printf ("vax-dec-bsd4.3\n"); exit (0);
-#   else
-#    if BSD == 199006
-      printf ("vax-dec-bsd4.3reno\n"); exit (0);
-#    else
-      printf ("vax-dec-bsd\n"); exit (0);
-#    endif
-#   endif
-#  else
-    printf ("vax-dec-bsd\n"); exit (0);
-#  endif
-# else
-    printf ("vax-dec-ultrix\n"); exit (0);
-# endif
-#endif
-
-#if defined (alliant) && defined (i860)
-  printf ("i860-alliant-bsd\n"); exit (0);
-#endif
-
-  exit (1);
-}
-EOF
-
-$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
-	{ echo "$SYSTEM_NAME"; exit; }
-
-# Apollos put the system type in the environment.
-
-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
-
-# Convex versions that predate uname can use getsysinfo(1)
-
-if [ -x /usr/convex/getsysinfo ]
-then
-    case `getsysinfo -f cpu_type` in
-    c1*)
-	echo c1-convex-bsd
-	exit ;;
-    c2*)
-	if getsysinfo -f scalar_acc
-	then echo c32-convex-bsd
-	else echo c2-convex-bsd
-	fi
-	exit ;;
-    c34*)
-	echo c34-convex-bsd
-	exit ;;
-    c38*)
-	echo c38-convex-bsd
-	exit ;;
-    c4*)
-	echo c4-convex-bsd
-	exit ;;
-    esac
-fi
-
-cat >&2 <<EOF
-$0: unable to guess system type
-
-This script, last modified $timestamp, has failed to recognize
-the operating system you are using. It is advised that you
-download the most up to date version of the config scripts from
-
-  http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess
-and
-  http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub
-
-If the version you run ($0) is already up to date, please
-send the following data and any information you think might be
-pertinent to <config-patches@gnu.org> in order to provide the needed
-information to handle your system.
-
-config.guess timestamp = $timestamp
-
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
-uname -r = `(uname -r) 2>/dev/null || echo unknown`
-uname -s = `(uname -s) 2>/dev/null || echo unknown`
-uname -v = `(uname -v) 2>/dev/null || echo unknown`
-
-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
-/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
-
-hostinfo               = `(hostinfo) 2>/dev/null`
-/bin/universe          = `(/bin/universe) 2>/dev/null`
-/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
-/bin/arch              = `(/bin/arch) 2>/dev/null`
-/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
-
-UNAME_MACHINE = ${UNAME_MACHINE}
-UNAME_RELEASE = ${UNAME_RELEASE}
-UNAME_SYSTEM  = ${UNAME_SYSTEM}
-UNAME_VERSION = ${UNAME_VERSION}
-EOF
-
-exit 1
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/config.sub b/config.sub
deleted file mode 100644
--- a/config.sub
+++ /dev/null
@@ -1,1608 +0,0 @@
-#! /bin/sh
-# Configuration validation subroutine script.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
-
-timestamp='2006-02-23'
-
-# This file is (in principle) common to ALL GNU software.
-# The presence of a machine in this file suggests that SOME GNU software
-# can handle that machine.  It does not imply ALL GNU software can.
-#
-# This file is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Please send patches to <config-patches@gnu.org>.  Submit a context
-# diff and a properly formatted ChangeLog entry.
-#
-# Configuration subroutine to validate and canonicalize a configuration type.
-# Supply the specified configuration type as an argument.
-# If it is invalid, we print an error message on stderr and exit with code 1.
-# Otherwise, we print the canonical config type on stdout and succeed.
-
-# This file is supposed to be the same for all GNU packages
-# and recognize all the CPU types, system types and aliases
-# that are meaningful with *any* GNU software.
-# Each package is responsible for reporting which valid configurations
-# it does not support.  The user should be able to distinguish
-# a failure to support a valid configuration from a meaningless
-# configuration.
-
-# The goal of this file is to map all the various variations of a given
-# machine specification into a single specification in the form:
-#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
-# or in some cases, the newer four-part form:
-#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
-# It is wrong to echo any other type of specification.
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION] CPU-MFR-OPSYS
-       $0 [OPTION] ALIAS
-
-Canonicalize a configuration name.
-
-Operation modes:
-  -h, --help         print this help, then exit
-  -t, --time-stamp   print date of last modification, then exit
-  -v, --version      print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.sub ($timestamp)
-
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
-Free Software Foundation, Inc.
-
-This is free software; see the source for copying conditions.  There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
-  case $1 in
-    --time-stamp | --time* | -t )
-       echo "$timestamp" ; exit ;;
-    --version | -v )
-       echo "$version" ; exit ;;
-    --help | --h* | -h )
-       echo "$usage"; exit ;;
-    -- )     # Stop option processing
-       shift; break ;;
-    - )	# Use stdin as input.
-       break ;;
-    -* )
-       echo "$me: invalid option $1$help"
-       exit 1 ;;
-
-    *local*)
-       # First pass through any local machine types.
-       echo $1
-       exit ;;
-
-    * )
-       break ;;
-  esac
-done
-
-case $# in
- 0) echo "$me: missing argument$help" >&2
-    exit 1;;
- 1) ;;
- *) echo "$me: too many arguments$help" >&2
-    exit 1;;
-esac
-
-# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
-# Here we must recognize all the valid KERNEL-OS combinations.
-maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
-case $maybe_os in
-  nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
-  uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
-  storm-chaos* | os2-emx* | rtmk-nova*)
-    os=-$maybe_os
-    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
-    ;;
-  *)
-    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
-    if [ $basic_machine != $1 ]
-    then os=`echo $1 | sed 's/.*-/-/'`
-    else os=; fi
-    ;;
-esac
-
-### Let's recognize common machines as not being operating systems so
-### that things like config.sub decstation-3100 work.  We also
-### recognize some manufacturers as not being operating systems, so we
-### can provide default operating systems below.
-case $os in
-	-sun*os*)
-		# Prevent following clause from handling this invalid input.
-		;;
-	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
-	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
-	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
-	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
-	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
-	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
-	-apple | -axis | -knuth | -cray)
-		os=
-		basic_machine=$1
-		;;
-	-sim | -cisco | -oki | -wec | -winbond)
-		os=
-		basic_machine=$1
-		;;
-	-scout)
-		;;
-	-wrs)
-		os=-vxworks
-		basic_machine=$1
-		;;
-	-chorusos*)
-		os=-chorusos
-		basic_machine=$1
-		;;
- 	-chorusrdb)
- 		os=-chorusrdb
-		basic_machine=$1
- 		;;
-	-hiux*)
-		os=-hiuxwe2
-		;;
-	-sco6)
-		os=-sco5v6
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco5)
-		os=-sco3.2v5
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco4)
-		os=-sco3.2v4
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco3.2.[4-9]*)
-		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco3.2v[4-9]*)
-		# Don't forget version if it is 3.2v4 or newer.
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco5v6*)
-		# Don't forget version if it is 3.2v4 or newer.
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco*)
-		os=-sco3.2v2
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-udk*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-isc)
-		os=-isc2.2
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-clix*)
-		basic_machine=clipper-intergraph
-		;;
-	-isc*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-lynx*)
-		os=-lynxos
-		;;
-	-ptx*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
-		;;
-	-windowsnt*)
-		os=`echo $os | sed -e 's/windowsnt/winnt/'`
-		;;
-	-psos*)
-		os=-psos
-		;;
-	-mint | -mint[0-9]*)
-		basic_machine=m68k-atari
-		os=-mint
-		;;
-esac
-
-# Decode aliases for certain CPU-COMPANY combinations.
-case $basic_machine in
-	# Recognize the basic CPU types without company name.
-	# Some are omitted here because they have special meanings below.
-	1750a | 580 \
-	| a29k \
-	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
-	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
-	| am33_2.0 \
-	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
-	| bfin \
-	| c4x | clipper \
-	| d10v | d30v | dlx | dsp16xx \
-	| fr30 | frv \
-	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
-	| i370 | i860 | i960 | ia64 \
-	| ip2k | iq2000 \
-	| m32r | m32rle | m68000 | m68k | m88k | maxq | mb | microblaze | mcore \
-	| mips | mipsbe | mipseb | mipsel | mipsle \
-	| mips16 \
-	| mips64 | mips64el \
-	| mips64vr | mips64vrel \
-	| mips64orion | mips64orionel \
-	| mips64vr4100 | mips64vr4100el \
-	| mips64vr4300 | mips64vr4300el \
-	| mips64vr5000 | mips64vr5000el \
-	| mips64vr5900 | mips64vr5900el \
-	| mipsisa32 | mipsisa32el \
-	| mipsisa32r2 | mipsisa32r2el \
-	| mipsisa64 | mipsisa64el \
-	| mipsisa64r2 | mipsisa64r2el \
-	| mipsisa64sb1 | mipsisa64sb1el \
-	| mipsisa64sr71k | mipsisa64sr71kel \
-	| mipstx39 | mipstx39el \
-	| mn10200 | mn10300 \
-	| mt \
-	| msp430 \
-	| nios | nios2 \
-	| ns16k | ns32k \
-	| or32 \
-	| pdp10 | pdp11 | pj | pjl \
-	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
-	| pyramid \
-	| sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
-	| sh64 | sh64le \
-	| sparc | sparc64 | sparc64b | sparc86x | sparclet | sparclite \
-	| sparcv8 | sparcv9 | sparcv9b \
-	| strongarm \
-	| tahoe | thumb | tic4x | tic80 | tron \
-	| v850 | v850e \
-	| we32k \
-	| x86 | xscale | xscalee[bl] | xstormy16 | xtensa \
-	| z8k)
-		basic_machine=$basic_machine-unknown
-		;;
-	m32c)
-		basic_machine=$basic_machine-unknown
-		;;
-	m6811 | m68hc11 | m6812 | m68hc12)
-		# Motorola 68HC11/12.
-		basic_machine=$basic_machine-unknown
-		os=-none
-		;;
-	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
-		;;
-	ms1)
-		basic_machine=mt-unknown
-		;;
-
-	# We use `pc' rather than `unknown'
-	# because (1) that's what they normally are, and
-	# (2) the word "unknown" tends to confuse beginning users.
-	i*86 | x86_64)
-	  basic_machine=$basic_machine-pc
-	  ;;
-	# Object if more than one company name word.
-	*-*-*)
-		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
-		exit 1
-		;;
-	# Recognize the basic CPU types with company name.
-	580-* \
-	| a29k-* \
-	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
-	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
-	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
-	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
-	| avr-* \
-	| bfin-* | bs2000-* \
-	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
-	| clipper-* | craynv-* | cydra-* \
-	| d10v-* | d30v-* | dlx-* \
-	| elxsi-* \
-	| f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
-	| h8300-* | h8500-* \
-	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
-	| i*86-* | i860-* | i960-* | ia64-* \
-	| ip2k-* | iq2000-* \
-	| m32r-* | m32rle-* \
-	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
-	| m88110-* | m88k-* | maxq-* | mcore-* \
-	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
-	| mips16-* \
-	| mips64-* | mips64el-* \
-	| mips64vr-* | mips64vrel-* \
-	| mips64orion-* | mips64orionel-* \
-	| mips64vr4100-* | mips64vr4100el-* \
-	| mips64vr4300-* | mips64vr4300el-* \
-	| mips64vr5000-* | mips64vr5000el-* \
-	| mips64vr5900-* | mips64vr5900el-* \
-	| mipsisa32-* | mipsisa32el-* \
-	| mipsisa32r2-* | mipsisa32r2el-* \
-	| mipsisa64-* | mipsisa64el-* \
-	| mipsisa64r2-* | mipsisa64r2el-* \
-	| mipsisa64sb1-* | mipsisa64sb1el-* \
-	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
-	| mipstx39-* | mipstx39el-* \
-	| mmix-* \
-	| mt-* \
-	| msp430-* \
-	| nios-* | nios2-* \
-	| none-* | np1-* | ns16k-* | ns32k-* \
-	| orion-* \
-	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
-	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
-	| pyramid-* \
-	| romp-* | rs6000-* \
-	| sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | shbe-* \
-	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
-	| sparc-* | sparc64-* | sparc64b-* | sparc86x-* | sparclet-* \
-	| sparclite-* \
-	| sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
-	| tahoe-* | thumb-* \
-	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
-	| tron-* \
-	| v850-* | v850e-* | vax-* \
-	| we32k-* \
-	| x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \
-	| xstormy16-* | xtensa-* \
-	| ymp-* \
-	| z8k-*)
-		;;
-	m32c-*)
-		;;
-	# Recognize the various machine names and aliases which stand
-	# for a CPU type and a company and sometimes even an OS.
-	386bsd)
-		basic_machine=i386-unknown
-		os=-bsd
-		;;
-	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
-		basic_machine=m68000-att
-		;;
-	3b*)
-		basic_machine=we32k-att
-		;;
-	a29khif)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-    	abacus)
-		basic_machine=abacus-unknown
-		;;
-	adobe68k)
-		basic_machine=m68010-adobe
-		os=-scout
-		;;
-	alliant | fx80)
-		basic_machine=fx80-alliant
-		;;
-	altos | altos3068)
-		basic_machine=m68k-altos
-		;;
-	am29k)
-		basic_machine=a29k-none
-		os=-bsd
-		;;
-	amd64)
-		basic_machine=x86_64-pc
-		;;
-	amd64-*)
-		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	amdahl)
-		basic_machine=580-amdahl
-		os=-sysv
-		;;
-	amiga | amiga-*)
-		basic_machine=m68k-unknown
-		;;
-	amigaos | amigados)
-		basic_machine=m68k-unknown
-		os=-amigaos
-		;;
-	amigaunix | amix)
-		basic_machine=m68k-unknown
-		os=-sysv4
-		;;
-	apollo68)
-		basic_machine=m68k-apollo
-		os=-sysv
-		;;
-	apollo68bsd)
-		basic_machine=m68k-apollo
-		os=-bsd
-		;;
-	aux)
-		basic_machine=m68k-apple
-		os=-aux
-		;;
-	balance)
-		basic_machine=ns32k-sequent
-		os=-dynix
-		;;
-	c90)
-		basic_machine=c90-cray
-		os=-unicos
-		;;
-	convex-c1)
-		basic_machine=c1-convex
-		os=-bsd
-		;;
-	convex-c2)
-		basic_machine=c2-convex
-		os=-bsd
-		;;
-	convex-c32)
-		basic_machine=c32-convex
-		os=-bsd
-		;;
-	convex-c34)
-		basic_machine=c34-convex
-		os=-bsd
-		;;
-	convex-c38)
-		basic_machine=c38-convex
-		os=-bsd
-		;;
-	cray | j90)
-		basic_machine=j90-cray
-		os=-unicos
-		;;
-	craynv)
-		basic_machine=craynv-cray
-		os=-unicosmp
-		;;
-	cr16c)
-		basic_machine=cr16c-unknown
-		os=-elf
-		;;
-	crds | unos)
-		basic_machine=m68k-crds
-		;;
-	crisv32 | crisv32-* | etraxfs*)
-		basic_machine=crisv32-axis
-		;;
-	cris | cris-* | etrax*)
-		basic_machine=cris-axis
-		;;
-	crx)
-		basic_machine=crx-unknown
-		os=-elf
-		;;
-	da30 | da30-*)
-		basic_machine=m68k-da30
-		;;
-	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
-		basic_machine=mips-dec
-		;;
-	decsystem10* | dec10*)
-		basic_machine=pdp10-dec
-		os=-tops10
-		;;
-	decsystem20* | dec20*)
-		basic_machine=pdp10-dec
-		os=-tops20
-		;;
-	delta | 3300 | motorola-3300 | motorola-delta \
-	      | 3300-motorola | delta-motorola)
-		basic_machine=m68k-motorola
-		;;
-	delta88)
-		basic_machine=m88k-motorola
-		os=-sysv3
-		;;
-	djgpp)
-		basic_machine=i586-pc
-		os=-msdosdjgpp
-		;;
-	dpx20 | dpx20-*)
-		basic_machine=rs6000-bull
-		os=-bosx
-		;;
-	dpx2* | dpx2*-bull)
-		basic_machine=m68k-bull
-		os=-sysv3
-		;;
-	ebmon29k)
-		basic_machine=a29k-amd
-		os=-ebmon
-		;;
-	elxsi)
-		basic_machine=elxsi-elxsi
-		os=-bsd
-		;;
-	encore | umax | mmax)
-		basic_machine=ns32k-encore
-		;;
-	es1800 | OSE68k | ose68k | ose | OSE)
-		basic_machine=m68k-ericsson
-		os=-ose
-		;;
-	fx2800)
-		basic_machine=i860-alliant
-		;;
-	genix)
-		basic_machine=ns32k-ns
-		;;
-	gmicro)
-		basic_machine=tron-gmicro
-		os=-sysv
-		;;
-	go32)
-		basic_machine=i386-pc
-		os=-go32
-		;;
-	h3050r* | hiux*)
-		basic_machine=hppa1.1-hitachi
-		os=-hiuxwe2
-		;;
-	h8300hms)
-		basic_machine=h8300-hitachi
-		os=-hms
-		;;
-	h8300xray)
-		basic_machine=h8300-hitachi
-		os=-xray
-		;;
-	h8500hms)
-		basic_machine=h8500-hitachi
-		os=-hms
-		;;
-	harris)
-		basic_machine=m88k-harris
-		os=-sysv3
-		;;
-	hp300-*)
-		basic_machine=m68k-hp
-		;;
-	hp300bsd)
-		basic_machine=m68k-hp
-		os=-bsd
-		;;
-	hp300hpux)
-		basic_machine=m68k-hp
-		os=-hpux
-		;;
-	hp3k9[0-9][0-9] | hp9[0-9][0-9])
-		basic_machine=hppa1.0-hp
-		;;
-	hp9k2[0-9][0-9] | hp9k31[0-9])
-		basic_machine=m68000-hp
-		;;
-	hp9k3[2-9][0-9])
-		basic_machine=m68k-hp
-		;;
-	hp9k6[0-9][0-9] | hp6[0-9][0-9])
-		basic_machine=hppa1.0-hp
-		;;
-	hp9k7[0-79][0-9] | hp7[0-79][0-9])
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k78[0-9] | hp78[0-9])
-		# FIXME: really hppa2.0-hp
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
-		# FIXME: really hppa2.0-hp
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k8[0-9][13679] | hp8[0-9][13679])
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k8[0-9][0-9] | hp8[0-9][0-9])
-		basic_machine=hppa1.0-hp
-		;;
-	hppa-next)
-		os=-nextstep3
-		;;
-	hppaosf)
-		basic_machine=hppa1.1-hp
-		os=-osf
-		;;
-	hppro)
-		basic_machine=hppa1.1-hp
-		os=-proelf
-		;;
-	i370-ibm* | ibm*)
-		basic_machine=i370-ibm
-		;;
-# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
-	i*86v32)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv32
-		;;
-	i*86v4*)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv4
-		;;
-	i*86v)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv
-		;;
-	i*86sol2)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-solaris2
-		;;
-	i386mach)
-		basic_machine=i386-mach
-		os=-mach
-		;;
-	i386-vsta | vsta)
-		basic_machine=i386-unknown
-		os=-vsta
-		;;
-	iris | iris4d)
-		basic_machine=mips-sgi
-		case $os in
-		    -irix*)
-			;;
-		    *)
-			os=-irix4
-			;;
-		esac
-		;;
-	isi68 | isi)
-		basic_machine=m68k-isi
-		os=-sysv
-		;;
-	m88k-omron*)
-		basic_machine=m88k-omron
-		;;
-	magnum | m3230)
-		basic_machine=mips-mips
-		os=-sysv
-		;;
-	merlin)
-		basic_machine=ns32k-utek
-		os=-sysv
-		;;
-	mingw32)
-		basic_machine=i386-pc
-		os=-mingw32
-		;;
-	miniframe)
-		basic_machine=m68000-convergent
-		;;
-	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
-		basic_machine=m68k-atari
-		os=-mint
-		;;
-	mips3*-*)
-		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
-		;;
-	mips3*)
-		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
-		;;
-	monitor)
-		basic_machine=m68k-rom68k
-		os=-coff
-		;;
-	morphos)
-		basic_machine=powerpc-unknown
-		os=-morphos
-		;;
-	msdos)
-		basic_machine=i386-pc
-		os=-msdos
-		;;
-	ms1-*)
-		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
-		;;
-	mvs)
-		basic_machine=i370-ibm
-		os=-mvs
-		;;
-	ncr3000)
-		basic_machine=i486-ncr
-		os=-sysv4
-		;;
-	netbsd386)
-		basic_machine=i386-unknown
-		os=-netbsd
-		;;
-	netwinder)
-		basic_machine=armv4l-rebel
-		os=-linux
-		;;
-	news | news700 | news800 | news900)
-		basic_machine=m68k-sony
-		os=-newsos
-		;;
-	news1000)
-		basic_machine=m68030-sony
-		os=-newsos
-		;;
-	news-3600 | risc-news)
-		basic_machine=mips-sony
-		os=-newsos
-		;;
-	necv70)
-		basic_machine=v70-nec
-		os=-sysv
-		;;
-	next | m*-next )
-		basic_machine=m68k-next
-		case $os in
-		    -nextstep* )
-			;;
-		    -ns2*)
-		      os=-nextstep2
-			;;
-		    *)
-		      os=-nextstep3
-			;;
-		esac
-		;;
-	nh3000)
-		basic_machine=m68k-harris
-		os=-cxux
-		;;
-	nh[45]000)
-		basic_machine=m88k-harris
-		os=-cxux
-		;;
-	nindy960)
-		basic_machine=i960-intel
-		os=-nindy
-		;;
-	mon960)
-		basic_machine=i960-intel
-		os=-mon960
-		;;
-	nonstopux)
-		basic_machine=mips-compaq
-		os=-nonstopux
-		;;
-	np1)
-		basic_machine=np1-gould
-		;;
-	nsr-tandem)
-		basic_machine=nsr-tandem
-		;;
-	op50n-* | op60c-*)
-		basic_machine=hppa1.1-oki
-		os=-proelf
-		;;
-	openrisc | openrisc-*)
-		basic_machine=or32-unknown
-		;;
-	os400)
-		basic_machine=powerpc-ibm
-		os=-os400
-		;;
-	OSE68000 | ose68000)
-		basic_machine=m68000-ericsson
-		os=-ose
-		;;
-	os68k)
-		basic_machine=m68k-none
-		os=-os68k
-		;;
-	pa-hitachi)
-		basic_machine=hppa1.1-hitachi
-		os=-hiuxwe2
-		;;
-	paragon)
-		basic_machine=i860-intel
-		os=-osf
-		;;
-	pbd)
-		basic_machine=sparc-tti
-		;;
-	pbb)
-		basic_machine=m68k-tti
-		;;
-	pc532 | pc532-*)
-		basic_machine=ns32k-pc532
-		;;
-	pc98)
-		basic_machine=i386-pc
-		;;
-	pc98-*)
-		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentium | p5 | k5 | k6 | nexgen | viac3)
-		basic_machine=i586-pc
-		;;
-	pentiumpro | p6 | 6x86 | athlon | athlon_*)
-		basic_machine=i686-pc
-		;;
-	pentiumii | pentium2 | pentiumiii | pentium3)
-		basic_machine=i686-pc
-		;;
-	pentium4)
-		basic_machine=i786-pc
-		;;
-	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
-		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentiumpro-* | p6-* | 6x86-* | athlon-*)
-		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
-		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentium4-*)
-		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pn)
-		basic_machine=pn-gould
-		;;
-	power)	basic_machine=power-ibm
-		;;
-	ppc)	basic_machine=powerpc-unknown
-		;;
-	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppcle | powerpclittle | ppc-le | powerpc-little)
-		basic_machine=powerpcle-unknown
-		;;
-	ppcle-* | powerpclittle-*)
-		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppc64)	basic_machine=powerpc64-unknown
-		;;
-	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
-		basic_machine=powerpc64le-unknown
-		;;
-	ppc64le-* | powerpc64little-*)
-		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ps2)
-		basic_machine=i386-ibm
-		;;
-	pw32)
-		basic_machine=i586-unknown
-		os=-pw32
-		;;
-	rdos)
-		basic_machine=i386-pc
-		os=-rdos
-		;;
-	rom68k)
-		basic_machine=m68k-rom68k
-		os=-coff
-		;;
-	rm[46]00)
-		basic_machine=mips-siemens
-		;;
-	rtpc | rtpc-*)
-		basic_machine=romp-ibm
-		;;
-	s390 | s390-*)
-		basic_machine=s390-ibm
-		;;
-	s390x | s390x-*)
-		basic_machine=s390x-ibm
-		;;
-	sa29200)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-	sb1)
-		basic_machine=mipsisa64sb1-unknown
-		;;
-	sb1el)
-		basic_machine=mipsisa64sb1el-unknown
-		;;
-	sei)
-		basic_machine=mips-sei
-		os=-seiux
-		;;
-	sequent)
-		basic_machine=i386-sequent
-		;;
-	sh)
-		basic_machine=sh-hitachi
-		os=-hms
-		;;
-	sh64)
-		basic_machine=sh64-unknown
-		;;
-	sparclite-wrs | simso-wrs)
-		basic_machine=sparclite-wrs
-		os=-vxworks
-		;;
-	sps7)
-		basic_machine=m68k-bull
-		os=-sysv2
-		;;
-	spur)
-		basic_machine=spur-unknown
-		;;
-	st2000)
-		basic_machine=m68k-tandem
-		;;
-	stratus)
-		basic_machine=i860-stratus
-		os=-sysv4
-		;;
-	sun2)
-		basic_machine=m68000-sun
-		;;
-	sun2os3)
-		basic_machine=m68000-sun
-		os=-sunos3
-		;;
-	sun2os4)
-		basic_machine=m68000-sun
-		os=-sunos4
-		;;
-	sun3os3)
-		basic_machine=m68k-sun
-		os=-sunos3
-		;;
-	sun3os4)
-		basic_machine=m68k-sun
-		os=-sunos4
-		;;
-	sun4os3)
-		basic_machine=sparc-sun
-		os=-sunos3
-		;;
-	sun4os4)
-		basic_machine=sparc-sun
-		os=-sunos4
-		;;
-	sun4sol2)
-		basic_machine=sparc-sun
-		os=-solaris2
-		;;
-	sun3 | sun3-*)
-		basic_machine=m68k-sun
-		;;
-	sun4)
-		basic_machine=sparc-sun
-		;;
-	sun386 | sun386i | roadrunner)
-		basic_machine=i386-sun
-		;;
-	sv1)
-		basic_machine=sv1-cray
-		os=-unicos
-		;;
-	symmetry)
-		basic_machine=i386-sequent
-		os=-dynix
-		;;
-	t3e)
-		basic_machine=alphaev5-cray
-		os=-unicos
-		;;
-	t90)
-		basic_machine=t90-cray
-		os=-unicos
-		;;
-	tic54x | c54x*)
-		basic_machine=tic54x-unknown
-		os=-coff
-		;;
-	tic55x | c55x*)
-		basic_machine=tic55x-unknown
-		os=-coff
-		;;
-	tic6x | c6x*)
-		basic_machine=tic6x-unknown
-		os=-coff
-		;;
-	tx39)
-		basic_machine=mipstx39-unknown
-		;;
-	tx39el)
-		basic_machine=mipstx39el-unknown
-		;;
-	toad1)
-		basic_machine=pdp10-xkl
-		os=-tops20
-		;;
-	tower | tower-32)
-		basic_machine=m68k-ncr
-		;;
-	tpf)
-		basic_machine=s390x-ibm
-		os=-tpf
-		;;
-	udi29k)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-	ultra3)
-		basic_machine=a29k-nyu
-		os=-sym1
-		;;
-	v810 | necv810)
-		basic_machine=v810-nec
-		os=-none
-		;;
-	vaxv)
-		basic_machine=vax-dec
-		os=-sysv
-		;;
-	vms)
-		basic_machine=vax-dec
-		os=-vms
-		;;
-	vpp*|vx|vx-*)
-		basic_machine=f301-fujitsu
-		;;
-	vxworks960)
-		basic_machine=i960-wrs
-		os=-vxworks
-		;;
-	vxworks68)
-		basic_machine=m68k-wrs
-		os=-vxworks
-		;;
-	vxworks29k)
-		basic_machine=a29k-wrs
-		os=-vxworks
-		;;
-	w65*)
-		basic_machine=w65-wdc
-		os=-none
-		;;
-	w89k-*)
-		basic_machine=hppa1.1-winbond
-		os=-proelf
-		;;
-	xbox)
-		basic_machine=i686-pc
-		os=-mingw32
-		;;
-	xps | xps100)
-		basic_machine=xps100-honeywell
-		;;
-	ymp)
-		basic_machine=ymp-cray
-		os=-unicos
-		;;
-	z8k-*-coff)
-		basic_machine=z8k-unknown
-		os=-sim
-		;;
-	none)
-		basic_machine=none-none
-		os=-none
-		;;
-
-# Here we handle the default manufacturer of certain CPU types.  It is in
-# some cases the only manufacturer, in others, it is the most popular.
-	w89k)
-		basic_machine=hppa1.1-winbond
-		;;
-	op50n)
-		basic_machine=hppa1.1-oki
-		;;
-	op60c)
-		basic_machine=hppa1.1-oki
-		;;
-	romp)
-		basic_machine=romp-ibm
-		;;
-	mmix)
-		basic_machine=mmix-knuth
-		;;
-	rs6000)
-		basic_machine=rs6000-ibm
-		;;
-	vax)
-		basic_machine=vax-dec
-		;;
-	pdp10)
-		# there are many clones, so DEC is not a safe bet
-		basic_machine=pdp10-unknown
-		;;
-	pdp11)
-		basic_machine=pdp11-dec
-		;;
-	we32k)
-		basic_machine=we32k-att
-		;;
-	sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele)
-		basic_machine=sh-unknown
-		;;
-	sparc | sparcv8 | sparcv9 | sparcv9b)
-		basic_machine=sparc-sun
-		;;
-	cydra)
-		basic_machine=cydra-cydrome
-		;;
-	orion)
-		basic_machine=orion-highlevel
-		;;
-	orion105)
-		basic_machine=clipper-highlevel
-		;;
-	mac | mpw | mac-mpw)
-		basic_machine=m68k-apple
-		;;
-	pmac | pmac-mpw)
-		basic_machine=powerpc-apple
-		;;
-	*-unknown)
-		# Make sure to match an already-canonicalized machine name.
-		;;
-	*)
-		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
-		exit 1
-		;;
-esac
-
-# Here we canonicalize certain aliases for manufacturers.
-case $basic_machine in
-	*-digital*)
-		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
-		;;
-	*-commodore*)
-		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
-		;;
-	*)
-		;;
-esac
-
-# Decode manufacturer-specific aliases for certain operating systems.
-
-if [ x"$os" != x"" ]
-then
-case $os in
-        # First match some system type aliases
-        # that might get confused with valid system types.
-	# -solaris* is a basic system type, with this one exception.
-	-solaris1 | -solaris1.*)
-		os=`echo $os | sed -e 's|solaris1|sunos4|'`
-		;;
-	-solaris)
-		os=-solaris2
-		;;
-	-svr4*)
-		os=-sysv4
-		;;
-	-unixware*)
-		os=-sysv4.2uw
-		;;
-	-gnu/linux*)
-		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
-		;;
-	# First accept the basic system types.
-	# The portable systems comes first.
-	# Each alternative MUST END IN A *, to match a version number.
-	# -sysv* is not here because it comes later, after sysvr4.
-	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
-	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
-	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
-	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
-	      | -aos* \
-	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
-	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
-	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
-	      | -openbsd* | -solidbsd* \
-	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
-	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
-	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
-	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
-	      | -chorusos* | -chorusrdb* \
-	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
-	      | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
-	      | -uxpv* | -beos* | -mpeix* | -udk* \
-	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
-	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
-	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
-	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
-	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
-	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
-	      | -skyos* | -haiku* | -rdos*)
-	# Remember, each alternative MUST END IN *, to match a version number.
-		;;
-	-qnx*)
-		case $basic_machine in
-		    x86-* | i*86-*)
-			;;
-		    *)
-			os=-nto$os
-			;;
-		esac
-		;;
-	-nto-qnx*)
-		;;
-	-nto*)
-		os=`echo $os | sed -e 's|nto|nto-qnx|'`
-		;;
-	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
-	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
-	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
-		;;
-	-mac*)
-		os=`echo $os | sed -e 's|mac|macos|'`
-		;;
-	-linux-dietlibc)
-		os=-linux-dietlibc
-		;;
-	-linux*)
-		os=`echo $os | sed -e 's|linux|linux-gnu|'`
-		;;
-	-sunos5*)
-		os=`echo $os | sed -e 's|sunos5|solaris2|'`
-		;;
-	-sunos6*)
-		os=`echo $os | sed -e 's|sunos6|solaris3|'`
-		;;
-	-opened*)
-		os=-openedition
-		;;
-        -os400*)
-		os=-os400
-		;;
-	-wince*)
-		os=-wince
-		;;
-	-osfrose*)
-		os=-osfrose
-		;;
-	-osf*)
-		os=-osf
-		;;
-	-utek*)
-		os=-bsd
-		;;
-	-dynix*)
-		os=-bsd
-		;;
-	-acis*)
-		os=-aos
-		;;
-	-atheos*)
-		os=-atheos
-		;;
-	-syllable*)
-		os=-syllable
-		;;
-	-386bsd)
-		os=-bsd
-		;;
-	-ctix* | -uts*)
-		os=-sysv
-		;;
-	-nova*)
-		os=-rtmk-nova
-		;;
-	-ns2 )
-		os=-nextstep2
-		;;
-	-nsk*)
-		os=-nsk
-		;;
-	# Preserve the version number of sinix5.
-	-sinix5.*)
-		os=`echo $os | sed -e 's|sinix|sysv|'`
-		;;
-	-sinix*)
-		os=-sysv4
-		;;
-        -tpf*)
-		os=-tpf
-		;;
-	-triton*)
-		os=-sysv3
-		;;
-	-oss*)
-		os=-sysv3
-		;;
-	-svr4)
-		os=-sysv4
-		;;
-	-svr3)
-		os=-sysv3
-		;;
-	-sysvr4)
-		os=-sysv4
-		;;
-	# This must come after -sysvr4.
-	-sysv*)
-		;;
-	-ose*)
-		os=-ose
-		;;
-	-es1800*)
-		os=-ose
-		;;
-	-xenix)
-		os=-xenix
-		;;
-	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
-		os=-mint
-		;;
-	-aros*)
-		os=-aros
-		;;
-	-kaos*)
-		os=-kaos
-		;;
-	-zvmoe)
-		os=-zvmoe
-		;;
-	-none)
-		;;
-	*)
-		# Get rid of the `-' at the beginning of $os.
-		os=`echo $os | sed 's/[^-]*-//'`
-		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
-		exit 1
-		;;
-esac
-else
-
-# Here we handle the default operating systems that come with various machines.
-# The value should be what the vendor currently ships out the door with their
-# machine or put another way, the most popular os provided with the machine.
-
-# Note that if you're going to try to match "-MANUFACTURER" here (say,
-# "-sun"), then you have to tell the case statement up towards the top
-# that MANUFACTURER isn't an operating system.  Otherwise, code above
-# will signal an error saying that MANUFACTURER isn't an operating
-# system, and we'll never get to this point.
-
-case $basic_machine in
-	*-acorn)
-		os=-riscix1.2
-		;;
-	arm*-rebel)
-		os=-linux
-		;;
-	arm*-semi)
-		os=-aout
-		;;
-    c4x-* | tic4x-*)
-        os=-coff
-        ;;
-	# This must come before the *-dec entry.
-	pdp10-*)
-		os=-tops20
-		;;
-	pdp11-*)
-		os=-none
-		;;
-	*-dec | vax-*)
-		os=-ultrix4.2
-		;;
-	m68*-apollo)
-		os=-domain
-		;;
-	i386-sun)
-		os=-sunos4.0.2
-		;;
-	m68000-sun)
-		os=-sunos3
-		# This also exists in the configure program, but was not the
-		# default.
-		# os=-sunos4
-		;;
-	m68*-cisco)
-		os=-aout
-		;;
-	mips*-cisco)
-		os=-elf
-		;;
-	mips*-*)
-		os=-elf
-		;;
-	or32-*)
-		os=-coff
-		;;
-	*-tti)	# must be before sparc entry or we get the wrong os.
-		os=-sysv3
-		;;
-	sparc-* | *-sun)
-		os=-sunos4.1.1
-		;;
-	*-be)
-		os=-beos
-		;;
-	*-haiku)
-		os=-haiku
-		;;
-	*-ibm)
-		os=-aix
-		;;
-    	*-knuth)
-		os=-mmixware
-		;;
-	*-wec)
-		os=-proelf
-		;;
-	*-winbond)
-		os=-proelf
-		;;
-	*-oki)
-		os=-proelf
-		;;
-	*-hp)
-		os=-hpux
-		;;
-	*-hitachi)
-		os=-hiux
-		;;
-	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
-		os=-sysv
-		;;
-	*-cbm)
-		os=-amigaos
-		;;
-	*-dg)
-		os=-dgux
-		;;
-	*-dolphin)
-		os=-sysv3
-		;;
-	m68k-ccur)
-		os=-rtu
-		;;
-	m88k-omron*)
-		os=-luna
-		;;
-	*-next )
-		os=-nextstep
-		;;
-	*-sequent)
-		os=-ptx
-		;;
-	*-crds)
-		os=-unos
-		;;
-	*-ns)
-		os=-genix
-		;;
-	i370-*)
-		os=-mvs
-		;;
-	*-next)
-		os=-nextstep3
-		;;
-	*-gould)
-		os=-sysv
-		;;
-	*-highlevel)
-		os=-bsd
-		;;
-	*-encore)
-		os=-bsd
-		;;
-	*-sgi)
-		os=-irix
-		;;
-	*-siemens)
-		os=-sysv4
-		;;
-	*-masscomp)
-		os=-rtu
-		;;
-	f30[01]-fujitsu | f700-fujitsu)
-		os=-uxpv
-		;;
-	*-rom68k)
-		os=-coff
-		;;
-	*-*bug)
-		os=-coff
-		;;
-	*-apple)
-		os=-macos
-		;;
-	*-atari*)
-		os=-mint
-		;;
-	*)
-		os=-none
-		;;
-esac
-fi
-
-# Here we handle the case where we know the os, and the CPU type, but not the
-# manufacturer.  We pick the logical manufacturer.
-vendor=unknown
-case $basic_machine in
-	*-unknown)
-		case $os in
-			-riscix*)
-				vendor=acorn
-				;;
-			-sunos*)
-				vendor=sun
-				;;
-			-aix*)
-				vendor=ibm
-				;;
-			-beos*)
-				vendor=be
-				;;
-			-hpux*)
-				vendor=hp
-				;;
-			-mpeix*)
-				vendor=hp
-				;;
-			-hiux*)
-				vendor=hitachi
-				;;
-			-unos*)
-				vendor=crds
-				;;
-			-dgux*)
-				vendor=dg
-				;;
-			-luna*)
-				vendor=omron
-				;;
-			-genix*)
-				vendor=ns
-				;;
-			-mvs* | -opened*)
-				vendor=ibm
-				;;
-			-os400*)
-				vendor=ibm
-				;;
-			-ptx*)
-				vendor=sequent
-				;;
-			-tpf*)
-				vendor=ibm
-				;;
-			-vxsim* | -vxworks* | -windiss*)
-				vendor=wrs
-				;;
-			-aux*)
-				vendor=apple
-				;;
-			-hms*)
-				vendor=hitachi
-				;;
-			-mpw* | -macos*)
-				vendor=apple
-				;;
-			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
-				vendor=atari
-				;;
-			-vos*)
-				vendor=stratus
-				;;
-		esac
-		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
-		;;
-esac
-
-echo $basic_machine$os
-exit
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/configure b/configure
deleted file mode 100644
--- a/configure
+++ /dev/null
@@ -1,9857 +0,0 @@
-#! /bin/sh
-# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.63 for Haskell OpenGL package 2.2.3.0.
-#
-# Report bugs to <sven.panne@aedion.de>.
-#
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
-# 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
-# This configure script is free software; the Free Software Foundation
-# gives unlimited permission to copy, distribute and modify it.
-## --------------------- ##
-## M4sh Initialization.  ##
-## --------------------- ##
-
-# Be more Bourne compatible
-DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-  setopt NO_GLOB_SUBST
-else
-  case `(set -o) 2>/dev/null` in
-  *posix*) set -o posix ;;
-esac
-
-fi
-
-
-
-
-# PATH needs CR
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
-as_nl='
-'
-export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='printf %s\n'
-  as_echo_n='printf %s'
-else
-  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
-    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
-    as_echo_n='/usr/ucb/echo -n'
-  else
-    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
-    as_echo_n_body='eval
-      arg=$1;
-      case $arg in
-      *"$as_nl"*)
-	expr "X$arg" : "X\\(.*\\)$as_nl";
-	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
-      esac;
-      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
-    '
-    export as_echo_n_body
-    as_echo_n='sh -c $as_echo_n_body as_echo'
-  fi
-  export as_echo_body
-  as_echo='sh -c $as_echo_body as_echo'
-fi
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  PATH_SEPARATOR=:
-  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
-    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
-      PATH_SEPARATOR=';'
-  }
-fi
-
-# Support unset when possible.
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  as_unset=unset
-else
-  as_unset=false
-fi
-
-
-# IFS
-# We need space, tab and new line, in precisely that order.  Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" ""	$as_nl"
-
-# Find who we are.  Look in the path if we contain no directory separator.
-case $0 in
-  *[\\/]* ) as_myself=$0 ;;
-  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-done
-IFS=$as_save_IFS
-
-     ;;
-esac
-# We did not find ourselves, most probably we were run as `sh COMMAND'
-# in which case we are not to be found in the path.
-if test "x$as_myself" = x; then
-  as_myself=$0
-fi
-if test ! -f "$as_myself"; then
-  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
-  { (exit 1); exit 1; }
-fi
-
-# Work around bugs in pre-3.0 UWIN ksh.
-for as_var in ENV MAIL MAILPATH
-do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# Required to use basename.
-if expr a : '\(a\)' >/dev/null 2>&1 &&
-   test "X`expr 00001 : '.*\(...\)'`" = X001; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
-  as_basename=basename
-else
-  as_basename=false
-fi
-
-
-# Name of the executable.
-as_me=`$as_basename -- "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-
-# CDPATH.
-$as_unset CDPATH
-
-
-if test "x$CONFIG_SHELL" = x; then
-  if (eval ":") 2>/dev/null; then
-  as_have_required=yes
-else
-  as_have_required=no
-fi
-
-  if test $as_have_required = yes &&	 (eval ":
-(as_func_return () {
-  (exit \$1)
-}
-as_func_success () {
-  as_func_return 0
-}
-as_func_failure () {
-  as_func_return 1
-}
-as_func_ret_success () {
-  return 0
-}
-as_func_ret_failure () {
-  return 1
-}
-
-exitcode=0
-if as_func_success; then
-  :
-else
-  exitcode=1
-  echo as_func_success failed.
-fi
-
-if as_func_failure; then
-  exitcode=1
-  echo as_func_failure succeeded.
-fi
-
-if as_func_ret_success; then
-  :
-else
-  exitcode=1
-  echo as_func_ret_success failed.
-fi
-
-if as_func_ret_failure; then
-  exitcode=1
-  echo as_func_ret_failure succeeded.
-fi
-
-if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
-  :
-else
-  exitcode=1
-  echo positional parameters were not saved.
-fi
-
-test \$exitcode = 0) || { (exit 1); exit 1; }
-
-(
-  as_lineno_1=\$LINENO
-  as_lineno_2=\$LINENO
-  test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" &&
-  test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; }
-") 2> /dev/null; then
-  :
-else
-  as_candidate_shells=
-    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  case $as_dir in
-	 /*)
-	   for as_base in sh bash ksh sh5; do
-	     as_candidate_shells="$as_candidate_shells $as_dir/$as_base"
-	   done;;
-       esac
-done
-IFS=$as_save_IFS
-
-
-      for as_shell in $as_candidate_shells $SHELL; do
-	 # Try only shells that exist, to save several forks.
-	 if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
-		{ ("$as_shell") 2> /dev/null <<\_ASEOF
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-  setopt NO_GLOB_SUBST
-else
-  case `(set -o) 2>/dev/null` in
-  *posix*) set -o posix ;;
-esac
-
-fi
-
-
-:
-_ASEOF
-}; then
-  CONFIG_SHELL=$as_shell
-	       as_have_required=yes
-	       if { "$as_shell" 2> /dev/null <<\_ASEOF
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-  setopt NO_GLOB_SUBST
-else
-  case `(set -o) 2>/dev/null` in
-  *posix*) set -o posix ;;
-esac
-
-fi
-
-
-:
-(as_func_return () {
-  (exit $1)
-}
-as_func_success () {
-  as_func_return 0
-}
-as_func_failure () {
-  as_func_return 1
-}
-as_func_ret_success () {
-  return 0
-}
-as_func_ret_failure () {
-  return 1
-}
-
-exitcode=0
-if as_func_success; then
-  :
-else
-  exitcode=1
-  echo as_func_success failed.
-fi
-
-if as_func_failure; then
-  exitcode=1
-  echo as_func_failure succeeded.
-fi
-
-if as_func_ret_success; then
-  :
-else
-  exitcode=1
-  echo as_func_ret_success failed.
-fi
-
-if as_func_ret_failure; then
-  exitcode=1
-  echo as_func_ret_failure succeeded.
-fi
-
-if ( set x; as_func_ret_success y && test x = "$1" ); then
-  :
-else
-  exitcode=1
-  echo positional parameters were not saved.
-fi
-
-test $exitcode = 0) || { (exit 1); exit 1; }
-
-(
-  as_lineno_1=$LINENO
-  as_lineno_2=$LINENO
-  test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; }
-
-_ASEOF
-}; then
-  break
-fi
-
-fi
-
-      done
-
-      if test "x$CONFIG_SHELL" != x; then
-  for as_var in BASH_ENV ENV
-	do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
-	done
-	export CONFIG_SHELL
-	exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
-fi
-
-
-    if test $as_have_required = no; then
-  echo This script requires a shell more modern than all the
-      echo shells that I found on your system.  Please install a
-      echo modern shell, or manually run the script under such a
-      echo shell if you do have one.
-      { (exit 1); exit 1; }
-fi
-
-
-fi
-
-fi
-
-
-
-(eval "as_func_return () {
-  (exit \$1)
-}
-as_func_success () {
-  as_func_return 0
-}
-as_func_failure () {
-  as_func_return 1
-}
-as_func_ret_success () {
-  return 0
-}
-as_func_ret_failure () {
-  return 1
-}
-
-exitcode=0
-if as_func_success; then
-  :
-else
-  exitcode=1
-  echo as_func_success failed.
-fi
-
-if as_func_failure; then
-  exitcode=1
-  echo as_func_failure succeeded.
-fi
-
-if as_func_ret_success; then
-  :
-else
-  exitcode=1
-  echo as_func_ret_success failed.
-fi
-
-if as_func_ret_failure; then
-  exitcode=1
-  echo as_func_ret_failure succeeded.
-fi
-
-if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
-  :
-else
-  exitcode=1
-  echo positional parameters were not saved.
-fi
-
-test \$exitcode = 0") || {
-  echo No shell found that supports shell functions.
-  echo Please tell bug-autoconf@gnu.org about your system,
-  echo including any error possibly output before this message.
-  echo This can help us improve future autoconf versions.
-  echo Configuration will now proceed without shell functions.
-}
-
-
-
-  as_lineno_1=$LINENO
-  as_lineno_2=$LINENO
-  test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
-
-  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
-  # uniformly replaced by the line number.  The first 'sed' inserts a
-  # line-number line after each line using $LINENO; the second 'sed'
-  # does the real work.  The second script uses 'N' to pair each
-  # line-number line with the line containing $LINENO, and appends
-  # trailing '-' during substitution so that $LINENO is not a special
-  # case at line end.
-  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
-  # scripts with optimization help from Paolo Bonzini.  Blame Lee
-  # E. McMahon (1931-1989) for sed's syntax.  :-)
-  sed -n '
-    p
-    /[$]LINENO/=
-  ' <$as_myself |
-    sed '
-      s/[$]LINENO.*/&-/
-      t lineno
-      b
-      :lineno
-      N
-      :loop
-      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
-      t loop
-      s/-\n.*//
-    ' >$as_me.lineno &&
-  chmod +x "$as_me.lineno" ||
-    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
-   { (exit 1); exit 1; }; }
-
-  # Don't try to exec as it changes $[0], causing all sort of problems
-  # (the dirname of $[0] is not the place where we might find the
-  # original and so on.  Autoconf is especially sensitive to this).
-  . "./$as_me.lineno"
-  # Exit status is that of the last command.
-  exit
-}
-
-
-if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
-  as_dirname=dirname
-else
-  as_dirname=false
-fi
-
-ECHO_C= ECHO_N= ECHO_T=
-case `echo -n x` in
--n*)
-  case `echo 'x\c'` in
-  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
-  *)   ECHO_C='\c';;
-  esac;;
-*)
-  ECHO_N='-n';;
-esac
-if expr a : '\(a\)' >/dev/null 2>&1 &&
-   test "X`expr 00001 : '.*\(...\)'`" = X001; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-rm -f conf$$ conf$$.exe conf$$.file
-if test -d conf$$.dir; then
-  rm -f conf$$.dir/conf$$.file
-else
-  rm -f conf$$.dir
-  mkdir conf$$.dir 2>/dev/null
-fi
-if (echo >conf$$.file) 2>/dev/null; then
-  if ln -s conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s='ln -s'
-    # ... but there are two gotchas:
-    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
-    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
-    # In both cases, we have to default to `cp -p'.
-    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
-      as_ln_s='cp -p'
-  elif ln conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s=ln
-  else
-    as_ln_s='cp -p'
-  fi
-else
-  as_ln_s='cp -p'
-fi
-rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
-rmdir conf$$.dir 2>/dev/null
-
-if mkdir -p . 2>/dev/null; then
-  as_mkdir_p=:
-else
-  test -d ./-p && rmdir ./-p
-  as_mkdir_p=false
-fi
-
-if test -x / >/dev/null 2>&1; then
-  as_test_x='test -x'
-else
-  if ls -dL / >/dev/null 2>&1; then
-    as_ls_L_option=L
-  else
-    as_ls_L_option=
-  fi
-  as_test_x='
-    eval sh -c '\''
-      if test -d "$1"; then
-	test -d "$1/.";
-      else
-	case $1 in
-	-*)set "./$1";;
-	esac;
-	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
-	???[sx]*):;;*)false;;esac;fi
-    '\'' sh
-  '
-fi
-as_executable_p=$as_test_x
-
-# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
-
-# Sed expression to map a string onto a valid variable name.
-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
-
-
-
-exec 7<&0 </dev/null 6>&1
-
-# Name of the host.
-# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
-# so uname gets run too.
-ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
-
-#
-# Initializations.
-#
-ac_default_prefix=/usr/local
-ac_clean_files=
-ac_config_libobj_dir=.
-LIBOBJS=
-cross_compiling=no
-subdirs=
-MFLAGS=
-MAKEFLAGS=
-SHELL=${CONFIG_SHELL-/bin/sh}
-
-# Identity of this package.
-PACKAGE_NAME='Haskell OpenGL package'
-PACKAGE_TARNAME='OpenGL'
-PACKAGE_VERSION='2.2.3.0'
-PACKAGE_STRING='Haskell OpenGL package 2.2.3.0'
-PACKAGE_BUGREPORT='sven.panne@aedion.de'
-
-ac_unique_file="include/HsOpenGL.h.in"
-# Factoring default headers for most tests.
-ac_includes_default="\
-#include <stdio.h>
-#ifdef HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-#ifdef HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-#ifdef STDC_HEADERS
-# include <stdlib.h>
-# include <stddef.h>
-#else
-# ifdef HAVE_STDLIB_H
-#  include <stdlib.h>
-# endif
-#endif
-#ifdef HAVE_STRING_H
-# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
-#  include <memory.h>
-# endif
-# include <string.h>
-#endif
-#ifdef HAVE_STRINGS_H
-# include <strings.h>
-#endif
-#ifdef HAVE_INTTYPES_H
-# include <inttypes.h>
-#endif
-#ifdef HAVE_STDINT_H
-# include <stdint.h>
-#endif
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif"
-
-ac_subst_vars='LTLIBOBJS
-LIBOBJS
-CALLCONV
-BUILD_PACKAGE_BOOL
-EGREP
-GREP
-GLU_LIBS
-GLU_CFLAGS
-GL_LIBS
-GL_CFLAGS
-GLUT_FRAMEWORKS
-GLU_FRAMEWORKS
-target_os
-target_vendor
-target_cpu
-target
-host_os
-host_vendor
-host_cpu
-host
-build_os
-build_vendor
-build_cpu
-build
-X_EXTRA_LIBS
-X_LIBS
-X_PRE_LIBS
-X_CFLAGS
-CPP
-XMKMF
-OBJEXT
-EXEEXT
-ac_ct_CC
-CPPFLAGS
-LDFLAGS
-CFLAGS
-CC
-target_alias
-host_alias
-build_alias
-LIBS
-ECHO_T
-ECHO_N
-ECHO_C
-DEFS
-mandir
-localedir
-libdir
-psdir
-pdfdir
-dvidir
-htmldir
-infodir
-docdir
-oldincludedir
-includedir
-localstatedir
-sharedstatedir
-sysconfdir
-datadir
-datarootdir
-libexecdir
-sbindir
-bindir
-program_transform_name
-prefix
-exec_prefix
-PACKAGE_BUGREPORT
-PACKAGE_STRING
-PACKAGE_VERSION
-PACKAGE_TARNAME
-PACKAGE_NAME
-PATH_SEPARATOR
-SHELL'
-ac_subst_files=''
-ac_user_opts='
-enable_option_checking
-with_compiler
-enable_opengl
-with_x
-'
-      ac_precious_vars='build_alias
-host_alias
-target_alias
-CC
-CFLAGS
-LDFLAGS
-LIBS
-CPPFLAGS
-XMKMF
-CPP'
-
-
-# Initialize some variables set by options.
-ac_init_help=
-ac_init_version=false
-ac_unrecognized_opts=
-ac_unrecognized_sep=
-# The variables have the same names as the options, with
-# dashes changed to underlines.
-cache_file=/dev/null
-exec_prefix=NONE
-no_create=
-no_recursion=
-prefix=NONE
-program_prefix=NONE
-program_suffix=NONE
-program_transform_name=s,x,x,
-silent=
-site=
-srcdir=
-verbose=
-x_includes=NONE
-x_libraries=NONE
-
-# Installation directory options.
-# These are left unexpanded so users can "make install exec_prefix=/foo"
-# and all the variables that are supposed to be based on exec_prefix
-# by default will actually change.
-# Use braces instead of parens because sh, perl, etc. also accept them.
-# (The list follows the same order as the GNU Coding Standards.)
-bindir='${exec_prefix}/bin'
-sbindir='${exec_prefix}/sbin'
-libexecdir='${exec_prefix}/libexec'
-datarootdir='${prefix}/share'
-datadir='${datarootdir}'
-sysconfdir='${prefix}/etc'
-sharedstatedir='${prefix}/com'
-localstatedir='${prefix}/var'
-includedir='${prefix}/include'
-oldincludedir='/usr/include'
-docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
-infodir='${datarootdir}/info'
-htmldir='${docdir}'
-dvidir='${docdir}'
-pdfdir='${docdir}'
-psdir='${docdir}'
-libdir='${exec_prefix}/lib'
-localedir='${datarootdir}/locale'
-mandir='${datarootdir}/man'
-
-ac_prev=
-ac_dashdash=
-for ac_option
-do
-  # If the previous option needs an argument, assign it.
-  if test -n "$ac_prev"; then
-    eval $ac_prev=\$ac_option
-    ac_prev=
-    continue
-  fi
-
-  case $ac_option in
-  *=*)	ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
-  *)	ac_optarg=yes ;;
-  esac
-
-  # Accept the important Cygnus configure options, so we can diagnose typos.
-
-  case $ac_dashdash$ac_option in
-  --)
-    ac_dashdash=yes ;;
-
-  -bindir | --bindir | --bindi | --bind | --bin | --bi)
-    ac_prev=bindir ;;
-  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
-    bindir=$ac_optarg ;;
-
-  -build | --build | --buil | --bui | --bu)
-    ac_prev=build_alias ;;
-  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
-    build_alias=$ac_optarg ;;
-
-  -cache-file | --cache-file | --cache-fil | --cache-fi \
-  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
-    ac_prev=cache_file ;;
-  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
-  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
-    cache_file=$ac_optarg ;;
-
-  --config-cache | -C)
-    cache_file=config.cache ;;
-
-  -datadir | --datadir | --datadi | --datad)
-    ac_prev=datadir ;;
-  -datadir=* | --datadir=* | --datadi=* | --datad=*)
-    datadir=$ac_optarg ;;
-
-  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
-  | --dataroo | --dataro | --datar)
-    ac_prev=datarootdir ;;
-  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
-  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
-    datarootdir=$ac_optarg ;;
-
-  -disable-* | --disable-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2
-   { (exit 1); exit 1; }; }
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"enable_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval enable_$ac_useropt=no ;;
-
-  -docdir | --docdir | --docdi | --doc | --do)
-    ac_prev=docdir ;;
-  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
-    docdir=$ac_optarg ;;
-
-  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
-    ac_prev=dvidir ;;
-  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
-    dvidir=$ac_optarg ;;
-
-  -enable-* | --enable-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2
-   { (exit 1); exit 1; }; }
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"enable_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval enable_$ac_useropt=\$ac_optarg ;;
-
-  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
-  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
-  | --exec | --exe | --ex)
-    ac_prev=exec_prefix ;;
-  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
-  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
-  | --exec=* | --exe=* | --ex=*)
-    exec_prefix=$ac_optarg ;;
-
-  -gas | --gas | --ga | --g)
-    # Obsolete; use --with-gas.
-    with_gas=yes ;;
-
-  -help | --help | --hel | --he | -h)
-    ac_init_help=long ;;
-  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
-    ac_init_help=recursive ;;
-  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
-    ac_init_help=short ;;
-
-  -host | --host | --hos | --ho)
-    ac_prev=host_alias ;;
-  -host=* | --host=* | --hos=* | --ho=*)
-    host_alias=$ac_optarg ;;
-
-  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
-    ac_prev=htmldir ;;
-  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
-  | --ht=*)
-    htmldir=$ac_optarg ;;
-
-  -includedir | --includedir | --includedi | --included | --include \
-  | --includ | --inclu | --incl | --inc)
-    ac_prev=includedir ;;
-  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
-  | --includ=* | --inclu=* | --incl=* | --inc=*)
-    includedir=$ac_optarg ;;
-
-  -infodir | --infodir | --infodi | --infod | --info | --inf)
-    ac_prev=infodir ;;
-  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
-    infodir=$ac_optarg ;;
-
-  -libdir | --libdir | --libdi | --libd)
-    ac_prev=libdir ;;
-  -libdir=* | --libdir=* | --libdi=* | --libd=*)
-    libdir=$ac_optarg ;;
-
-  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
-  | --libexe | --libex | --libe)
-    ac_prev=libexecdir ;;
-  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
-  | --libexe=* | --libex=* | --libe=*)
-    libexecdir=$ac_optarg ;;
-
-  -localedir | --localedir | --localedi | --localed | --locale)
-    ac_prev=localedir ;;
-  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
-    localedir=$ac_optarg ;;
-
-  -localstatedir | --localstatedir | --localstatedi | --localstated \
-  | --localstate | --localstat | --localsta | --localst | --locals)
-    ac_prev=localstatedir ;;
-  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
-  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
-    localstatedir=$ac_optarg ;;
-
-  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
-    ac_prev=mandir ;;
-  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
-    mandir=$ac_optarg ;;
-
-  -nfp | --nfp | --nf)
-    # Obsolete; use --without-fp.
-    with_fp=no ;;
-
-  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
-  | --no-cr | --no-c | -n)
-    no_create=yes ;;
-
-  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
-  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
-    no_recursion=yes ;;
-
-  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
-  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
-  | --oldin | --oldi | --old | --ol | --o)
-    ac_prev=oldincludedir ;;
-  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
-  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
-  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
-    oldincludedir=$ac_optarg ;;
-
-  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
-    ac_prev=prefix ;;
-  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
-    prefix=$ac_optarg ;;
-
-  -program-prefix | --program-prefix | --program-prefi | --program-pref \
-  | --program-pre | --program-pr | --program-p)
-    ac_prev=program_prefix ;;
-  -program-prefix=* | --program-prefix=* | --program-prefi=* \
-  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
-    program_prefix=$ac_optarg ;;
-
-  -program-suffix | --program-suffix | --program-suffi | --program-suff \
-  | --program-suf | --program-su | --program-s)
-    ac_prev=program_suffix ;;
-  -program-suffix=* | --program-suffix=* | --program-suffi=* \
-  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
-    program_suffix=$ac_optarg ;;
-
-  -program-transform-name | --program-transform-name \
-  | --program-transform-nam | --program-transform-na \
-  | --program-transform-n | --program-transform- \
-  | --program-transform | --program-transfor \
-  | --program-transfo | --program-transf \
-  | --program-trans | --program-tran \
-  | --progr-tra | --program-tr | --program-t)
-    ac_prev=program_transform_name ;;
-  -program-transform-name=* | --program-transform-name=* \
-  | --program-transform-nam=* | --program-transform-na=* \
-  | --program-transform-n=* | --program-transform-=* \
-  | --program-transform=* | --program-transfor=* \
-  | --program-transfo=* | --program-transf=* \
-  | --program-trans=* | --program-tran=* \
-  | --progr-tra=* | --program-tr=* | --program-t=*)
-    program_transform_name=$ac_optarg ;;
-
-  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
-    ac_prev=pdfdir ;;
-  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
-    pdfdir=$ac_optarg ;;
-
-  -psdir | --psdir | --psdi | --psd | --ps)
-    ac_prev=psdir ;;
-  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
-    psdir=$ac_optarg ;;
-
-  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-  | -silent | --silent | --silen | --sile | --sil)
-    silent=yes ;;
-
-  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
-    ac_prev=sbindir ;;
-  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
-  | --sbi=* | --sb=*)
-    sbindir=$ac_optarg ;;
-
-  -sharedstatedir | --sharedstatedir | --sharedstatedi \
-  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
-  | --sharedst | --shareds | --shared | --share | --shar \
-  | --sha | --sh)
-    ac_prev=sharedstatedir ;;
-  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
-  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
-  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
-  | --sha=* | --sh=*)
-    sharedstatedir=$ac_optarg ;;
-
-  -site | --site | --sit)
-    ac_prev=site ;;
-  -site=* | --site=* | --sit=*)
-    site=$ac_optarg ;;
-
-  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
-    ac_prev=srcdir ;;
-  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
-    srcdir=$ac_optarg ;;
-
-  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
-  | --syscon | --sysco | --sysc | --sys | --sy)
-    ac_prev=sysconfdir ;;
-  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
-  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
-    sysconfdir=$ac_optarg ;;
-
-  -target | --target | --targe | --targ | --tar | --ta | --t)
-    ac_prev=target_alias ;;
-  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
-    target_alias=$ac_optarg ;;
-
-  -v | -verbose | --verbose | --verbos | --verbo | --verb)
-    verbose=yes ;;
-
-  -version | --version | --versio | --versi | --vers | -V)
-    ac_init_version=: ;;
-
-  -with-* | --with-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2
-   { (exit 1); exit 1; }; }
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"with_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval with_$ac_useropt=\$ac_optarg ;;
-
-  -without-* | --without-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2
-   { (exit 1); exit 1; }; }
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"with_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval with_$ac_useropt=no ;;
-
-  --x)
-    # Obsolete; use --with-x.
-    with_x=yes ;;
-
-  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
-  | --x-incl | --x-inc | --x-in | --x-i)
-    ac_prev=x_includes ;;
-  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
-  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
-    x_includes=$ac_optarg ;;
-
-  -x-libraries | --x-libraries | --x-librarie | --x-librari \
-  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
-    ac_prev=x_libraries ;;
-  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
-  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
-    x_libraries=$ac_optarg ;;
-
-  -*) { $as_echo "$as_me: error: unrecognized option: $ac_option
-Try \`$0 --help' for more information." >&2
-   { (exit 1); exit 1; }; }
-    ;;
-
-  *=*)
-    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
-      { $as_echo "$as_me: error: invalid variable name: $ac_envvar" >&2
-   { (exit 1); exit 1; }; }
-    eval $ac_envvar=\$ac_optarg
-    export $ac_envvar ;;
-
-  *)
-    # FIXME: should be removed in autoconf 3.0.
-    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
-    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
-      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
-    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
-    ;;
-
-  esac
-done
-
-if test -n "$ac_prev"; then
-  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
-  { $as_echo "$as_me: error: missing argument to $ac_option" >&2
-   { (exit 1); exit 1; }; }
-fi
-
-if test -n "$ac_unrecognized_opts"; then
-  case $enable_option_checking in
-    no) ;;
-    fatal) { $as_echo "$as_me: error: unrecognized options: $ac_unrecognized_opts" >&2
-   { (exit 1); exit 1; }; } ;;
-    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
-  esac
-fi
-
-# Check all directory arguments for consistency.
-for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
-		datadir sysconfdir sharedstatedir localstatedir includedir \
-		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
-		libdir localedir mandir
-do
-  eval ac_val=\$$ac_var
-  # Remove trailing slashes.
-  case $ac_val in
-    */ )
-      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
-      eval $ac_var=\$ac_val;;
-  esac
-  # Be sure to have absolute directory names.
-  case $ac_val in
-    [\\/$]* | ?:[\\/]* )  continue;;
-    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
-  esac
-  { $as_echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
-   { (exit 1); exit 1; }; }
-done
-
-# There might be people who depend on the old broken behavior: `$host'
-# used to hold the argument of --host etc.
-# FIXME: To remove some day.
-build=$build_alias
-host=$host_alias
-target=$target_alias
-
-# FIXME: To remove some day.
-if test "x$host_alias" != x; then
-  if test "x$build_alias" = x; then
-    cross_compiling=maybe
-    $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
-    If a cross compiler is detected then cross compile mode will be used." >&2
-  elif test "x$build_alias" != "x$host_alias"; then
-    cross_compiling=yes
-  fi
-fi
-
-ac_tool_prefix=
-test -n "$host_alias" && ac_tool_prefix=$host_alias-
-
-test "$silent" = yes && exec 6>/dev/null
-
-
-ac_pwd=`pwd` && test -n "$ac_pwd" &&
-ac_ls_di=`ls -di .` &&
-ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
-  { $as_echo "$as_me: error: working directory cannot be determined" >&2
-   { (exit 1); exit 1; }; }
-test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
-  { $as_echo "$as_me: error: pwd does not report name of working directory" >&2
-   { (exit 1); exit 1; }; }
-
-
-# Find the source files, if location was not specified.
-if test -z "$srcdir"; then
-  ac_srcdir_defaulted=yes
-  # Try the directory containing this script, then the parent directory.
-  ac_confdir=`$as_dirname -- "$as_myself" ||
-$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_myself" : 'X\(//\)[^/]' \| \
-	 X"$as_myself" : 'X\(//\)$' \| \
-	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_myself" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-  srcdir=$ac_confdir
-  if test ! -r "$srcdir/$ac_unique_file"; then
-    srcdir=..
-  fi
-else
-  ac_srcdir_defaulted=no
-fi
-if test ! -r "$srcdir/$ac_unique_file"; then
-  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
-  { $as_echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
-   { (exit 1); exit 1; }; }
-fi
-ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
-ac_abs_confdir=`(
-	cd "$srcdir" && test -r "./$ac_unique_file" || { $as_echo "$as_me: error: $ac_msg" >&2
-   { (exit 1); exit 1; }; }
-	pwd)`
-# When building in place, set srcdir=.
-if test "$ac_abs_confdir" = "$ac_pwd"; then
-  srcdir=.
-fi
-# Remove unnecessary trailing slashes from srcdir.
-# Double slashes in file names in object file debugging info
-# mess up M-x gdb in Emacs.
-case $srcdir in
-*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
-esac
-for ac_var in $ac_precious_vars; do
-  eval ac_env_${ac_var}_set=\${${ac_var}+set}
-  eval ac_env_${ac_var}_value=\$${ac_var}
-  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
-  eval ac_cv_env_${ac_var}_value=\$${ac_var}
-done
-
-#
-# Report the --help message.
-#
-if test "$ac_init_help" = "long"; then
-  # Omit some internal or obsolete options to make the list less imposing.
-  # This message is too long to be a string in the A/UX 3.1 sh.
-  cat <<_ACEOF
-\`configure' configures Haskell OpenGL package 2.2.3.0 to adapt to many kinds of systems.
-
-Usage: $0 [OPTION]... [VAR=VALUE]...
-
-To assign environment variables (e.g., CC, CFLAGS...), specify them as
-VAR=VALUE.  See below for descriptions of some of the useful variables.
-
-Defaults for the options are specified in brackets.
-
-Configuration:
-  -h, --help              display this help and exit
-      --help=short        display options specific to this package
-      --help=recursive    display the short help of all the included packages
-  -V, --version           display version information and exit
-  -q, --quiet, --silent   do not print \`checking...' messages
-      --cache-file=FILE   cache test results in FILE [disabled]
-  -C, --config-cache      alias for \`--cache-file=config.cache'
-  -n, --no-create         do not create output files
-      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
-
-Installation directories:
-  --prefix=PREFIX         install architecture-independent files in PREFIX
-                          [$ac_default_prefix]
-  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
-                          [PREFIX]
-
-By default, \`make install' will install all the files in
-\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
-an installation prefix other than \`$ac_default_prefix' using \`--prefix',
-for instance \`--prefix=\$HOME'.
-
-For better control, use the options below.
-
-Fine tuning of the installation directories:
-  --bindir=DIR            user executables [EPREFIX/bin]
-  --sbindir=DIR           system admin executables [EPREFIX/sbin]
-  --libexecdir=DIR        program executables [EPREFIX/libexec]
-  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
-  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
-  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
-  --libdir=DIR            object code libraries [EPREFIX/lib]
-  --includedir=DIR        C header files [PREFIX/include]
-  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
-  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
-  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
-  --infodir=DIR           info documentation [DATAROOTDIR/info]
-  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
-  --mandir=DIR            man documentation [DATAROOTDIR/man]
-  --docdir=DIR            documentation root [DATAROOTDIR/doc/OpenGL]
-  --htmldir=DIR           html documentation [DOCDIR]
-  --dvidir=DIR            dvi documentation [DOCDIR]
-  --pdfdir=DIR            pdf documentation [DOCDIR]
-  --psdir=DIR             ps documentation [DOCDIR]
-_ACEOF
-
-  cat <<\_ACEOF
-
-X features:
-  --x-includes=DIR    X include files are in DIR
-  --x-libraries=DIR   X library files are in DIR
-
-System types:
-  --build=BUILD     configure for building on BUILD [guessed]
-  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
-  --target=TARGET   configure for building compilers for TARGET [HOST]
-_ACEOF
-fi
-
-if test -n "$ac_init_help"; then
-  case $ac_init_help in
-     short | recursive ) echo "Configuration of Haskell OpenGL package 2.2.3.0:";;
-   esac
-  cat <<\_ACEOF
-
-Optional Features:
-  --disable-option-checking  ignore unrecognized --enable/--with options
-  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
-  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
-  --enable-opengl         build a Haskell binding for OpenGL (GL/GLU). On Mac
-                          OS X, use --enable-opengl=x11 to use X11 instead of
-                          the "native" libraries. (default=autodetect)
-
-Optional Packages:
-  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
-  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
-  --with-compiler[=HC]    use the given Haskell compiler (default=ghc)
-  --with-x                use the X Window System
-
-Some influential environment variables:
-  CC          C compiler command
-  CFLAGS      C compiler flags
-  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
-              nonstandard directory <lib dir>
-  LIBS        libraries to pass to the linker, e.g. -l<library>
-  CPPFLAGS    C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
-              you have headers in a nonstandard directory <include dir>
-  XMKMF       Path to xmkmf, Makefile generator for X Window System
-  CPP         C preprocessor
-
-Use these variables to override the choices made by `configure' or to help
-it to find libraries and programs with nonstandard names/locations.
-
-Report bugs to <sven.panne@aedion.de>.
-_ACEOF
-ac_status=$?
-fi
-
-if test "$ac_init_help" = "recursive"; then
-  # If there are subdirs, report their specific --help.
-  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
-    test -d "$ac_dir" ||
-      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
-      continue
-    ac_builddir=.
-
-case "$ac_dir" in
-.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
-*)
-  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
-  # A ".." for each directory in $ac_dir_suffix.
-  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
-  case $ac_top_builddir_sub in
-  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
-  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
-  esac ;;
-esac
-ac_abs_top_builddir=$ac_pwd
-ac_abs_builddir=$ac_pwd$ac_dir_suffix
-# for backward compatibility:
-ac_top_builddir=$ac_top_build_prefix
-
-case $srcdir in
-  .)  # We are building in place.
-    ac_srcdir=.
-    ac_top_srcdir=$ac_top_builddir_sub
-    ac_abs_top_srcdir=$ac_pwd ;;
-  [\\/]* | ?:[\\/]* )  # Absolute name.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir
-    ac_abs_top_srcdir=$srcdir ;;
-  *) # Relative name.
-    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_build_prefix$srcdir
-    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
-esac
-ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
-
-    cd "$ac_dir" || { ac_status=$?; continue; }
-    # Check for guested configure.
-    if test -f "$ac_srcdir/configure.gnu"; then
-      echo &&
-      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
-    elif test -f "$ac_srcdir/configure"; then
-      echo &&
-      $SHELL "$ac_srcdir/configure" --help=recursive
-    else
-      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
-    fi || ac_status=$?
-    cd "$ac_pwd" || { ac_status=$?; break; }
-  done
-fi
-
-test -n "$ac_init_help" && exit $ac_status
-if $ac_init_version; then
-  cat <<\_ACEOF
-Haskell OpenGL package configure 2.2.3.0
-generated by GNU Autoconf 2.63
-
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
-2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
-This configure script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it.
-_ACEOF
-  exit
-fi
-cat >config.log <<_ACEOF
-This file contains any messages produced by compilers while
-running configure, to aid debugging if configure makes a mistake.
-
-It was created by Haskell OpenGL package $as_me 2.2.3.0, which was
-generated by GNU Autoconf 2.63.  Invocation command line was
-
-  $ $0 $@
-
-_ACEOF
-exec 5>>config.log
-{
-cat <<_ASUNAME
-## --------- ##
-## Platform. ##
-## --------- ##
-
-hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
-uname -r = `(uname -r) 2>/dev/null || echo unknown`
-uname -s = `(uname -s) 2>/dev/null || echo unknown`
-uname -v = `(uname -v) 2>/dev/null || echo unknown`
-
-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
-/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
-
-/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
-/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
-/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
-/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
-/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
-/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
-
-_ASUNAME
-
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  $as_echo "PATH: $as_dir"
-done
-IFS=$as_save_IFS
-
-} >&5
-
-cat >&5 <<_ACEOF
-
-
-## ----------- ##
-## Core tests. ##
-## ----------- ##
-
-_ACEOF
-
-
-# Keep a trace of the command line.
-# Strip out --no-create and --no-recursion so they do not pile up.
-# Strip out --silent because we don't want to record it for future runs.
-# Also quote any args containing shell meta-characters.
-# Make two passes to allow for proper duplicate-argument suppression.
-ac_configure_args=
-ac_configure_args0=
-ac_configure_args1=
-ac_must_keep_next=false
-for ac_pass in 1 2
-do
-  for ac_arg
-  do
-    case $ac_arg in
-    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
-    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-    | -silent | --silent | --silen | --sile | --sil)
-      continue ;;
-    *\'*)
-      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
-    esac
-    case $ac_pass in
-    1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
-    2)
-      ac_configure_args1="$ac_configure_args1 '$ac_arg'"
-      if test $ac_must_keep_next = true; then
-	ac_must_keep_next=false # Got value, back to normal.
-      else
-	case $ac_arg in
-	  *=* | --config-cache | -C | -disable-* | --disable-* \
-	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
-	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
-	  | -with-* | --with-* | -without-* | --without-* | --x)
-	    case "$ac_configure_args0 " in
-	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
-	    esac
-	    ;;
-	  -* ) ac_must_keep_next=true ;;
-	esac
-      fi
-      ac_configure_args="$ac_configure_args '$ac_arg'"
-      ;;
-    esac
-  done
-done
-$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
-$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
-
-# When interrupted or exit'd, cleanup temporary files, and complete
-# config.log.  We remove comments because anyway the quotes in there
-# would cause problems or look ugly.
-# WARNING: Use '\'' to represent an apostrophe within the trap.
-# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
-trap 'exit_status=$?
-  # Save into config.log some information that might help in debugging.
-  {
-    echo
-
-    cat <<\_ASBOX
-## ---------------- ##
-## Cache variables. ##
-## ---------------- ##
-_ASBOX
-    echo
-    # The following way of writing the cache mishandles newlines in values,
-(
-  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
-    eval ac_val=\$$ac_var
-    case $ac_val in #(
-    *${as_nl}*)
-      case $ac_var in #(
-      *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
-      esac
-      case $ac_var in #(
-      _ | IFS | as_nl) ;; #(
-      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
-      *) $as_unset $ac_var ;;
-      esac ;;
-    esac
-  done
-  (set) 2>&1 |
-    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
-    *${as_nl}ac_space=\ *)
-      sed -n \
-	"s/'\''/'\''\\\\'\'''\''/g;
-	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
-      ;; #(
-    *)
-      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
-      ;;
-    esac |
-    sort
-)
-    echo
-
-    cat <<\_ASBOX
-## ----------------- ##
-## Output variables. ##
-## ----------------- ##
-_ASBOX
-    echo
-    for ac_var in $ac_subst_vars
-    do
-      eval ac_val=\$$ac_var
-      case $ac_val in
-      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
-      esac
-      $as_echo "$ac_var='\''$ac_val'\''"
-    done | sort
-    echo
-
-    if test -n "$ac_subst_files"; then
-      cat <<\_ASBOX
-## ------------------- ##
-## File substitutions. ##
-## ------------------- ##
-_ASBOX
-      echo
-      for ac_var in $ac_subst_files
-      do
-	eval ac_val=\$$ac_var
-	case $ac_val in
-	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
-	esac
-	$as_echo "$ac_var='\''$ac_val'\''"
-      done | sort
-      echo
-    fi
-
-    if test -s confdefs.h; then
-      cat <<\_ASBOX
-## ----------- ##
-## confdefs.h. ##
-## ----------- ##
-_ASBOX
-      echo
-      cat confdefs.h
-      echo
-    fi
-    test "$ac_signal" != 0 &&
-      $as_echo "$as_me: caught signal $ac_signal"
-    $as_echo "$as_me: exit $exit_status"
-  } >&5
-  rm -f core *.core core.conftest.* &&
-    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
-    exit $exit_status
-' 0
-for ac_signal in 1 2 13 15; do
-  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
-done
-ac_signal=0
-
-# confdefs.h avoids OS command line length limits that DEFS can exceed.
-rm -f -r conftest* confdefs.h
-
-# Predefined preprocessor variables.
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_NAME "$PACKAGE_NAME"
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_VERSION "$PACKAGE_VERSION"
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_STRING "$PACKAGE_STRING"
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
-_ACEOF
-
-
-# Let the site file select an alternate cache file if it wants to.
-# Prefer an explicitly selected file to automatically selected ones.
-ac_site_file1=NONE
-ac_site_file2=NONE
-if test -n "$CONFIG_SITE"; then
-  ac_site_file1=$CONFIG_SITE
-elif test "x$prefix" != xNONE; then
-  ac_site_file1=$prefix/share/config.site
-  ac_site_file2=$prefix/etc/config.site
-else
-  ac_site_file1=$ac_default_prefix/share/config.site
-  ac_site_file2=$ac_default_prefix/etc/config.site
-fi
-for ac_site_file in "$ac_site_file1" "$ac_site_file2"
-do
-  test "x$ac_site_file" = xNONE && continue
-  if test -r "$ac_site_file"; then
-    { $as_echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
-$as_echo "$as_me: loading site script $ac_site_file" >&6;}
-    sed 's/^/| /' "$ac_site_file" >&5
-    . "$ac_site_file"
-  fi
-done
-
-if test -r "$cache_file"; then
-  # Some versions of bash will fail to source /dev/null (special
-  # files actually), so we avoid doing that.
-  if test -f "$cache_file"; then
-    { $as_echo "$as_me:$LINENO: loading cache $cache_file" >&5
-$as_echo "$as_me: loading cache $cache_file" >&6;}
-    case $cache_file in
-      [\\/]* | ?:[\\/]* ) . "$cache_file";;
-      *)                      . "./$cache_file";;
-    esac
-  fi
-else
-  { $as_echo "$as_me:$LINENO: creating cache $cache_file" >&5
-$as_echo "$as_me: creating cache $cache_file" >&6;}
-  >$cache_file
-fi
-
-# Check that the precious variables saved in the cache have kept the same
-# value.
-ac_cache_corrupted=false
-for ac_var in $ac_precious_vars; do
-  eval ac_old_set=\$ac_cv_env_${ac_var}_set
-  eval ac_new_set=\$ac_env_${ac_var}_set
-  eval ac_old_val=\$ac_cv_env_${ac_var}_value
-  eval ac_new_val=\$ac_env_${ac_var}_value
-  case $ac_old_set,$ac_new_set in
-    set,)
-      { $as_echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
-      ac_cache_corrupted=: ;;
-    ,set)
-      { $as_echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
-      ac_cache_corrupted=: ;;
-    ,);;
-    *)
-      if test "x$ac_old_val" != "x$ac_new_val"; then
-	# differences in whitespace do not lead to failure.
-	ac_old_val_w=`echo x $ac_old_val`
-	ac_new_val_w=`echo x $ac_new_val`
-	if test "$ac_old_val_w" != "$ac_new_val_w"; then
-	  { $as_echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
-$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
-	  ac_cache_corrupted=:
-	else
-	  { $as_echo "$as_me:$LINENO: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
-$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
-	  eval $ac_var=\$ac_old_val
-	fi
-	{ $as_echo "$as_me:$LINENO:   former value:  \`$ac_old_val'" >&5
-$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
-	{ $as_echo "$as_me:$LINENO:   current value: \`$ac_new_val'" >&5
-$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
-      fi;;
-  esac
-  # Pass precious variables to config.status.
-  if test "$ac_new_set" = set; then
-    case $ac_new_val in
-    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
-    *) ac_arg=$ac_var=$ac_new_val ;;
-    esac
-    case " $ac_configure_args " in
-      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
-      *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
-    esac
-  fi
-done
-if $ac_cache_corrupted; then
-  { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-  { $as_echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
-$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
-  { { $as_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
-$as_echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
-   { (exit 1); exit 1; }; }
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-
-# Safety check: Ensure that we are in the correct source directory.
-
-
-# The first file mentioned below will be generated by autoheader and contains
-# defines which are needed during package build time only. The second header
-# contains all kinds of stuff which is needed for using this package.
-ac_config_headers="$ac_config_headers include/HsOpenGLConfig.h include/HsOpenGL.h"
-
-
-# we do not really care about this here, but this avoids a warning about an
-# unknown option
-
-# Check whether --with-compiler was given.
-if test "${with_compiler+set}" = set; then
-  withval=$with_compiler; with_compiler=$withval
-else
-  with_compiler=ghc
-fi
-
-
-
-# We set this to "yes" later when we have found OpenGL libs and headers.
-GL_BUILD_PACKAGE=no
-
-# Shall we build this package at all?
-# Check whether --enable-opengl was given.
-if test "${enable_opengl+set}" = set; then
-  enableval=$enable_opengl; enable_opengl=$enableval
-else
-  enable_opengl=yes
-fi
-
-
-
-if test x"$enable_opengl" != xno; then
-
-# Check for OpenGL include paths and libraries
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}gcc; ac_word=$2
-{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CC="${ac_tool_prefix}gcc"
-    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:$LINENO: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:$LINENO: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_CC"; then
-  ac_ct_CC=$CC
-  # Extract the first word of "gcc", so it can be a program name with args.
-set dummy gcc; ac_word=$2
-{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_CC="gcc"
-    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
-  { $as_echo "$as_me:$LINENO: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_CC" = x; then
-    CC=""
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    CC=$ac_ct_CC
-  fi
-else
-  CC="$ac_cv_prog_CC"
-fi
-
-if test -z "$CC"; then
-          if test -n "$ac_tool_prefix"; then
-    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}cc; ac_word=$2
-{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CC="${ac_tool_prefix}cc"
-    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:$LINENO: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:$LINENO: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  fi
-fi
-if test -z "$CC"; then
-  # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-  ac_prog_rejected=no
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
-       ac_prog_rejected=yes
-       continue
-     fi
-    ac_cv_prog_CC="cc"
-    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-IFS=$as_save_IFS
-
-if test $ac_prog_rejected = yes; then
-  # We found a bogon in the path, so make sure we never use it.
-  set dummy $ac_cv_prog_CC
-  shift
-  if test $# != 0; then
-    # We chose a different compiler from the bogus one.
-    # However, it has the same basename, so the bogon will be chosen
-    # first if we set CC to just the basename; use the full file name.
-    shift
-    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
-  fi
-fi
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:$LINENO: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:$LINENO: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$CC"; then
-  if test -n "$ac_tool_prefix"; then
-  for ac_prog in cl.exe
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
-    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:$LINENO: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:$LINENO: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-    test -n "$CC" && break
-  done
-fi
-if test -z "$CC"; then
-  ac_ct_CC=$CC
-  for ac_prog in cl.exe
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_CC="$ac_prog"
-    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
-  { $as_echo "$as_me:$LINENO: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$ac_ct_CC" && break
-done
-
-  if test "x$ac_ct_CC" = x; then
-    CC=""
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    CC=$ac_ct_CC
-  fi
-fi
-
-fi
-
-
-test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-{ { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
-See \`config.log' for more details." >&5
-$as_echo "$as_me: error: no acceptable C compiler found in \$PATH
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }; }
-
-# Provide some information about the compiler.
-$as_echo "$as_me:$LINENO: checking for C compiler version" >&5
-set X $ac_compile
-ac_compiler=$2
-{ (ac_try="$ac_compiler --version >&5"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_compiler --version >&5") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
-{ (ac_try="$ac_compiler -v >&5"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_compiler -v >&5") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
-{ (ac_try="$ac_compiler -V >&5"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_compiler -V >&5") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
-
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
-# Try to create an executable without -o first, disregard a.out.
-# It will help us diagnose broken compilers, and finding out an intuition
-# of exeext.
-{ $as_echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
-$as_echo_n "checking for C compiler default output file name... " >&6; }
-ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
-
-# The possible output files:
-ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
-
-ac_rmfiles=
-for ac_file in $ac_files
-do
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
-    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
-  esac
-done
-rm -f $ac_rmfiles
-
-if { (ac_try="$ac_link_default"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_link_default") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; then
-  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
-# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
-# in a Makefile.  We should not override ac_cv_exeext if it was cached,
-# so that the user can short-circuit this test for compilers unknown to
-# Autoconf.
-for ac_file in $ac_files ''
-do
-  test -f "$ac_file" || continue
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
-	;;
-    [ab].out )
-	# We found the default executable, but exeext='' is most
-	# certainly right.
-	break;;
-    *.* )
-        if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
-	then :; else
-	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	fi
-	# We set ac_cv_exeext here because the later test for it is not
-	# safe: cross compilers may not add the suffix if given an `-o'
-	# argument, so we may need to know it at that point already.
-	# Even if this section looks crufty: it has the advantage of
-	# actually working.
-	break;;
-    * )
-	break;;
-  esac
-done
-test "$ac_cv_exeext" = no && ac_cv_exeext=
-
-else
-  ac_file=''
-fi
-
-{ $as_echo "$as_me:$LINENO: result: $ac_file" >&5
-$as_echo "$ac_file" >&6; }
-if test -z "$ac_file"; then
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-{ { $as_echo "$as_me:$LINENO: error: C compiler cannot create executables
-See \`config.log' for more details." >&5
-$as_echo "$as_me: error: C compiler cannot create executables
-See \`config.log' for more details." >&2;}
-   { (exit 77); exit 77; }; }; }
-fi
-
-ac_exeext=$ac_cv_exeext
-
-# Check that the compiler produces executables we can run.  If not, either
-# the compiler is broken, or we cross compile.
-{ $as_echo "$as_me:$LINENO: checking whether the C compiler works" >&5
-$as_echo_n "checking whether the C compiler works... " >&6; }
-# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
-# If not cross compiling, check that we can run a simple program.
-if test "$cross_compiling" != yes; then
-  if { ac_try='./$ac_file'
-  { (case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-    cross_compiling=no
-  else
-    if test "$cross_compiling" = maybe; then
-	cross_compiling=yes
-    else
-	{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-{ { $as_echo "$as_me:$LINENO: error: cannot run C compiled programs.
-If you meant to cross compile, use \`--host'.
-See \`config.log' for more details." >&5
-$as_echo "$as_me: error: cannot run C compiled programs.
-If you meant to cross compile, use \`--host'.
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }; }
-    fi
-  fi
-fi
-{ $as_echo "$as_me:$LINENO: result: yes" >&5
-$as_echo "yes" >&6; }
-
-rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
-ac_clean_files=$ac_clean_files_save
-# Check that the compiler produces executables we can run.  If not, either
-# the compiler is broken, or we cross compile.
-{ $as_echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
-$as_echo_n "checking whether we are cross compiling... " >&6; }
-{ $as_echo "$as_me:$LINENO: result: $cross_compiling" >&5
-$as_echo "$cross_compiling" >&6; }
-
-{ $as_echo "$as_me:$LINENO: checking for suffix of executables" >&5
-$as_echo_n "checking for suffix of executables... " >&6; }
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; then
-  # If both `conftest.exe' and `conftest' are `present' (well, observable)
-# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
-# work properly (i.e., refer to `conftest.exe'), while it won't with
-# `rm'.
-for ac_file in conftest.exe conftest conftest.*; do
-  test -f "$ac_file" || continue
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
-    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	  break;;
-    * ) break;;
-  esac
-done
-else
-  { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
-See \`config.log' for more details." >&5
-$as_echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }; }
-fi
-
-rm -f conftest$ac_cv_exeext
-{ $as_echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
-$as_echo "$ac_cv_exeext" >&6; }
-
-rm -f conftest.$ac_ext
-EXEEXT=$ac_cv_exeext
-ac_exeext=$EXEEXT
-{ $as_echo "$as_me:$LINENO: checking for suffix of object files" >&5
-$as_echo_n "checking for suffix of object files... " >&6; }
-if test "${ac_cv_objext+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.o conftest.obj
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_compile") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; then
-  for ac_file in conftest.o conftest.obj conftest.*; do
-  test -f "$ac_file" || continue;
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
-    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
-       break;;
-  esac
-done
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
-See \`config.log' for more details." >&5
-$as_echo "$as_me: error: cannot compute suffix of object files: cannot compile
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }; }
-fi
-
-rm -f conftest.$ac_cv_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
-$as_echo "$ac_cv_objext" >&6; }
-OBJEXT=$ac_cv_objext
-ac_objext=$OBJEXT
-{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
-$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
-if test "${ac_cv_c_compiler_gnu+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-#ifndef __GNUC__
-       choke me
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
-  ac_compiler_gnu=yes
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_compiler_gnu=no
-fi
-
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_c_compiler_gnu=$ac_compiler_gnu
-
-fi
-{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
-$as_echo "$ac_cv_c_compiler_gnu" >&6; }
-if test $ac_compiler_gnu = yes; then
-  GCC=yes
-else
-  GCC=
-fi
-ac_test_CFLAGS=${CFLAGS+set}
-ac_save_CFLAGS=$CFLAGS
-{ $as_echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
-$as_echo_n "checking whether $CC accepts -g... " >&6; }
-if test "${ac_cv_prog_cc_g+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  ac_save_c_werror_flag=$ac_c_werror_flag
-   ac_c_werror_flag=yes
-   ac_cv_prog_cc_g=no
-   CFLAGS="-g"
-   cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
-  ac_cv_prog_cc_g=yes
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	CFLAGS=""
-      cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
-  :
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_c_werror_flag=$ac_save_c_werror_flag
-	 CFLAGS="-g"
-	 cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
-  ac_cv_prog_cc_g=yes
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-
-fi
-
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-   ac_c_werror_flag=$ac_save_c_werror_flag
-fi
-{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
-$as_echo "$ac_cv_prog_cc_g" >&6; }
-if test "$ac_test_CFLAGS" = set; then
-  CFLAGS=$ac_save_CFLAGS
-elif test $ac_cv_prog_cc_g = yes; then
-  if test "$GCC" = yes; then
-    CFLAGS="-g -O2"
-  else
-    CFLAGS="-g"
-  fi
-else
-  if test "$GCC" = yes; then
-    CFLAGS="-O2"
-  else
-    CFLAGS=
-  fi
-fi
-{ $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
-$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
-if test "${ac_cv_prog_cc_c89+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  ac_cv_prog_cc_c89=no
-ac_save_CC=$CC
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <stdarg.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
-struct buf { int x; };
-FILE * (*rcsopen) (struct buf *, struct stat *, int);
-static char *e (p, i)
-     char **p;
-     int i;
-{
-  return p[i];
-}
-static char *f (char * (*g) (char **, int), char **p, ...)
-{
-  char *s;
-  va_list v;
-  va_start (v,p);
-  s = g (p, va_arg (v,int));
-  va_end (v);
-  return s;
-}
-
-/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
-   function prototypes and stuff, but not '\xHH' hex character constants.
-   These don't provoke an error unfortunately, instead are silently treated
-   as 'x'.  The following induces an error, until -std is added to get
-   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
-   array size at least.  It's necessary to write '\x00'==0 to get something
-   that's true only with -std.  */
-int osf4_cc_array ['\x00' == 0 ? 1 : -1];
-
-/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
-   inside strings and character constants.  */
-#define FOO(x) 'x'
-int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
-
-int test (int i, double x);
-struct s1 {int (*f) (int a);};
-struct s2 {int (*f) (double a);};
-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
-int argc;
-char **argv;
-int
-main ()
-{
-return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
-  ;
-  return 0;
-}
-_ACEOF
-for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
-	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
-do
-  CC="$ac_save_CC $ac_arg"
-  rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
-  ac_cv_prog_cc_c89=$ac_arg
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-
-fi
-
-rm -f core conftest.err conftest.$ac_objext
-  test "x$ac_cv_prog_cc_c89" != "xno" && break
-done
-rm -f conftest.$ac_ext
-CC=$ac_save_CC
-
-fi
-# AC_CACHE_VAL
-case "x$ac_cv_prog_cc_c89" in
-  x)
-    { $as_echo "$as_me:$LINENO: result: none needed" >&5
-$as_echo "none needed" >&6; } ;;
-  xno)
-    { $as_echo "$as_me:$LINENO: result: unsupported" >&5
-$as_echo "unsupported" >&6; } ;;
-  *)
-    CC="$CC $ac_cv_prog_cc_c89"
-    { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
-$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
-esac
-
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-{ $as_echo "$as_me:$LINENO: checking for Windows environment" >&5
-$as_echo_n "checking for Windows environment... " >&6; }
-if test "${fp_cv_is_win32+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-#if !_WIN32
-   syntax error;
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
-  fp_cv_is_win32=yes
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	fp_cv_is_win32=no
-fi
-
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:$LINENO: result: $fp_cv_is_win32" >&5
-$as_echo "$fp_cv_is_win32" >&6; }
-fp_is_win32="$fp_cv_is_win32"
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-{ $as_echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
-$as_echo_n "checking how to run the C preprocessor... " >&6; }
-# On Suns, sometimes $CPP names a directory.
-if test -n "$CPP" && test -d "$CPP"; then
-  CPP=
-fi
-if test -z "$CPP"; then
-  if test "${ac_cv_prog_CPP+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-      # Double quotes because CPP needs to be expanded
-    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
-    do
-      ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if { (ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null && {
-	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       }; then
-  :
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  # Broken: fails on valid input.
-continue
-fi
-
-rm -f conftest.err conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if { (ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null && {
-	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       }; then
-  # Broken: success on invalid input.
-continue
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-
-rm -f conftest.err conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then
-  break
-fi
-
-    done
-    ac_cv_prog_CPP=$CPP
-
-fi
-  CPP=$ac_cv_prog_CPP
-else
-  ac_cv_prog_CPP=$CPP
-fi
-{ $as_echo "$as_me:$LINENO: result: $CPP" >&5
-$as_echo "$CPP" >&6; }
-ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if { (ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null && {
-	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       }; then
-  :
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  # Broken: fails on valid input.
-continue
-fi
-
-rm -f conftest.err conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if { (ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null && {
-	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       }; then
-  # Broken: success on invalid input.
-continue
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-
-rm -f conftest.err conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then
-  :
-else
-  { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-{ { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details." >&5
-$as_echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }; }
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-{ $as_echo "$as_me:$LINENO: checking for X" >&5
-$as_echo_n "checking for X... " >&6; }
-
-
-# Check whether --with-x was given.
-if test "${with_x+set}" = set; then
-  withval=$with_x;
-fi
-
-# $have_x is `yes', `no', `disabled', or empty when we do not yet know.
-if test "x$with_x" = xno; then
-  # The user explicitly disabled X.
-  have_x=disabled
-else
-  case $x_includes,$x_libraries in #(
-    *\'*) { { $as_echo "$as_me:$LINENO: error: cannot use X directory names containing '" >&5
-$as_echo "$as_me: error: cannot use X directory names containing '" >&2;}
-   { (exit 1); exit 1; }; };; #(
-    *,NONE | NONE,*) if test "${ac_cv_have_x+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  # One or both of the vars are not set, and there is no cached value.
-ac_x_includes=no ac_x_libraries=no
-rm -f -r conftest.dir
-if mkdir conftest.dir; then
-  cd conftest.dir
-  cat >Imakefile <<'_ACEOF'
-incroot:
-	@echo incroot='${INCROOT}'
-usrlibdir:
-	@echo usrlibdir='${USRLIBDIR}'
-libdir:
-	@echo libdir='${LIBDIR}'
-_ACEOF
-  if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then
-    # GNU make sometimes prints "make[1]: Entering...", which would confuse us.
-    for ac_var in incroot usrlibdir libdir; do
-      eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`"
-    done
-    # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR.
-    for ac_extension in a so sl dylib la dll; do
-      if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" &&
-	 test -f "$ac_im_libdir/libX11.$ac_extension"; then
-	ac_im_usrlibdir=$ac_im_libdir; break
-      fi
-    done
-    # Screen out bogus values from the imake configuration.  They are
-    # bogus both because they are the default anyway, and because
-    # using them would break gcc on systems where it needs fixed includes.
-    case $ac_im_incroot in
-	/usr/include) ac_x_includes= ;;
-	*) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;;
-    esac
-    case $ac_im_usrlibdir in
-	/usr/lib | /usr/lib64 | /lib | /lib64) ;;
-	*) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;;
-    esac
-  fi
-  cd ..
-  rm -f -r conftest.dir
-fi
-
-# Standard set of common directories for X headers.
-# Check X11 before X11Rn because it is often a symlink to the current release.
-ac_x_header_dirs='
-/usr/X11/include
-/usr/X11R6/include
-/usr/X11R5/include
-/usr/X11R4/include
-
-/usr/include/X11
-/usr/include/X11R6
-/usr/include/X11R5
-/usr/include/X11R4
-
-/usr/local/X11/include
-/usr/local/X11R6/include
-/usr/local/X11R5/include
-/usr/local/X11R4/include
-
-/usr/local/include/X11
-/usr/local/include/X11R6
-/usr/local/include/X11R5
-/usr/local/include/X11R4
-
-/usr/X386/include
-/usr/x386/include
-/usr/XFree86/include/X11
-
-/usr/include
-/usr/local/include
-/usr/unsupported/include
-/usr/athena/include
-/usr/local/x11r5/include
-/usr/lpp/Xamples/include
-
-/usr/openwin/include
-/usr/openwin/share/include'
-
-if test "$ac_x_includes" = no; then
-  # Guess where to find include files, by looking for Xlib.h.
-  # First, try using that file with no special directory specified.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <X11/Xlib.h>
-_ACEOF
-if { (ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null && {
-	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       }; then
-  # We can compile using X headers with no special include directory.
-ac_x_includes=
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  for ac_dir in $ac_x_header_dirs; do
-  if test -r "$ac_dir/X11/Xlib.h"; then
-    ac_x_includes=$ac_dir
-    break
-  fi
-done
-fi
-
-rm -f conftest.err conftest.$ac_ext
-fi # $ac_x_includes = no
-
-if test "$ac_x_libraries" = no; then
-  # Check for the libraries.
-  # See if we find them without any special options.
-  # Don't add to $LIBS permanently.
-  ac_save_LIBS=$LIBS
-  LIBS="-lX11 $LIBS"
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <X11/Xlib.h>
-int
-main ()
-{
-XrmInitialize ()
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_link") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext && {
-	 test "$cross_compiling" = yes ||
-	 $as_test_x conftest$ac_exeext
-       }; then
-  LIBS=$ac_save_LIBS
-# We can link X programs with no special library path.
-ac_x_libraries=
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	LIBS=$ac_save_LIBS
-for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g`
-do
-  # Don't even attempt the hair of trying to link an X program!
-  for ac_extension in a so sl dylib la dll; do
-    if test -r "$ac_dir/libX11.$ac_extension"; then
-      ac_x_libraries=$ac_dir
-      break 2
-    fi
-  done
-done
-fi
-
-rm -rf conftest.dSYM
-rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
-      conftest$ac_exeext conftest.$ac_ext
-fi # $ac_x_libraries = no
-
-case $ac_x_includes,$ac_x_libraries in #(
-  no,* | *,no | *\'*)
-    # Didn't find X, or a directory has "'" in its name.
-    ac_cv_have_x="have_x=no";; #(
-  *)
-    # Record where we found X for the cache.
-    ac_cv_have_x="have_x=yes\
-	ac_x_includes='$ac_x_includes'\
-	ac_x_libraries='$ac_x_libraries'"
-esac
-fi
-;; #(
-    *) have_x=yes;;
-  esac
-  eval "$ac_cv_have_x"
-fi # $with_x != no
-
-if test "$have_x" != yes; then
-  { $as_echo "$as_me:$LINENO: result: $have_x" >&5
-$as_echo "$have_x" >&6; }
-  no_x=yes
-else
-  # If each of the values was on the command line, it overrides each guess.
-  test "x$x_includes" = xNONE && x_includes=$ac_x_includes
-  test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries
-  # Update the cache value to reflect the command line values.
-  ac_cv_have_x="have_x=yes\
-	ac_x_includes='$x_includes'\
-	ac_x_libraries='$x_libraries'"
-  { $as_echo "$as_me:$LINENO: result: libraries $x_libraries, headers $x_includes" >&5
-$as_echo "libraries $x_libraries, headers $x_includes" >&6; }
-fi
-
-
-if test x"$fp_is_win32" = xyes; then
-  no_x=yes
-else
-  if test "$no_x" = yes; then
-  # Not all programs may use this symbol, but it does not hurt to define it.
-
-cat >>confdefs.h <<\_ACEOF
-#define X_DISPLAY_MISSING 1
-_ACEOF
-
-  X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS=
-else
-  if test -n "$x_includes"; then
-    X_CFLAGS="$X_CFLAGS -I$x_includes"
-  fi
-
-  # It would also be nice to do this for all -L options, not just this one.
-  if test -n "$x_libraries"; then
-    X_LIBS="$X_LIBS -L$x_libraries"
-    # For Solaris; some versions of Sun CC require a space after -R and
-    # others require no space.  Words are not sufficient . . . .
-    { $as_echo "$as_me:$LINENO: checking whether -R must be followed by a space" >&5
-$as_echo_n "checking whether -R must be followed by a space... " >&6; }
-    ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries"
-    ac_xsave_c_werror_flag=$ac_c_werror_flag
-    ac_c_werror_flag=yes
-    cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_link") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext && {
-	 test "$cross_compiling" = yes ||
-	 $as_test_x conftest$ac_exeext
-       }; then
-  { $as_echo "$as_me:$LINENO: result: no" >&5
-$as_echo "no" >&6; }
-       X_LIBS="$X_LIBS -R$x_libraries"
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	LIBS="$ac_xsave_LIBS -R $x_libraries"
-       cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_link") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext && {
-	 test "$cross_compiling" = yes ||
-	 $as_test_x conftest$ac_exeext
-       }; then
-  { $as_echo "$as_me:$LINENO: result: yes" >&5
-$as_echo "yes" >&6; }
-	  X_LIBS="$X_LIBS -R $x_libraries"
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	{ $as_echo "$as_me:$LINENO: result: neither works" >&5
-$as_echo "neither works" >&6; }
-fi
-
-rm -rf conftest.dSYM
-rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
-      conftest$ac_exeext conftest.$ac_ext
-fi
-
-rm -rf conftest.dSYM
-rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
-      conftest$ac_exeext conftest.$ac_ext
-    ac_c_werror_flag=$ac_xsave_c_werror_flag
-    LIBS=$ac_xsave_LIBS
-  fi
-
-  # Check for system-dependent libraries X programs must link with.
-  # Do this before checking for the system-independent R6 libraries
-  # (-lICE), since we may need -lsocket or whatever for X linking.
-
-  if test "$ISC" = yes; then
-    X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet"
-  else
-    # Martyn Johnson says this is needed for Ultrix, if the X
-    # libraries were built with DECnet support.  And Karl Berry says
-    # the Alpha needs dnet_stub (dnet does not exist).
-    ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11"
-    cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char XOpenDisplay ();
-int
-main ()
-{
-return XOpenDisplay ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_link") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext && {
-	 test "$cross_compiling" = yes ||
-	 $as_test_x conftest$ac_exeext
-       }; then
-  :
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	{ $as_echo "$as_me:$LINENO: checking for dnet_ntoa in -ldnet" >&5
-$as_echo_n "checking for dnet_ntoa in -ldnet... " >&6; }
-if test "${ac_cv_lib_dnet_dnet_ntoa+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldnet  $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dnet_ntoa ();
-int
-main ()
-{
-return dnet_ntoa ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_link") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext && {
-	 test "$cross_compiling" = yes ||
-	 $as_test_x conftest$ac_exeext
-       }; then
-  ac_cv_lib_dnet_dnet_ntoa=yes
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_cv_lib_dnet_dnet_ntoa=no
-fi
-
-rm -rf conftest.dSYM
-rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dnet_dnet_ntoa" >&5
-$as_echo "$ac_cv_lib_dnet_dnet_ntoa" >&6; }
-if test "x$ac_cv_lib_dnet_dnet_ntoa" = x""yes; then
-  X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet"
-fi
-
-    if test $ac_cv_lib_dnet_dnet_ntoa = no; then
-      { $as_echo "$as_me:$LINENO: checking for dnet_ntoa in -ldnet_stub" >&5
-$as_echo_n "checking for dnet_ntoa in -ldnet_stub... " >&6; }
-if test "${ac_cv_lib_dnet_stub_dnet_ntoa+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldnet_stub  $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dnet_ntoa ();
-int
-main ()
-{
-return dnet_ntoa ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_link") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext && {
-	 test "$cross_compiling" = yes ||
-	 $as_test_x conftest$ac_exeext
-       }; then
-  ac_cv_lib_dnet_stub_dnet_ntoa=yes
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_cv_lib_dnet_stub_dnet_ntoa=no
-fi
-
-rm -rf conftest.dSYM
-rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5
-$as_echo "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; }
-if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = x""yes; then
-  X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub"
-fi
-
-    fi
-fi
-
-rm -rf conftest.dSYM
-rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
-      conftest$ac_exeext conftest.$ac_ext
-    LIBS="$ac_xsave_LIBS"
-
-    # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT,
-    # to get the SysV transport functions.
-    # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4)
-    # needs -lnsl.
-    # The nsl library prevents programs from opening the X display
-    # on Irix 5.2, according to T.E. Dickey.
-    # The functions gethostbyname, getservbyname, and inet_addr are
-    # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking.
-    { $as_echo "$as_me:$LINENO: checking for gethostbyname" >&5
-$as_echo_n "checking for gethostbyname... " >&6; }
-if test "${ac_cv_func_gethostbyname+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-/* Define gethostbyname to an innocuous variant, in case <limits.h> declares gethostbyname.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define gethostbyname innocuous_gethostbyname
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char gethostbyname (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef gethostbyname
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char gethostbyname ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined __stub_gethostbyname || defined __stub___gethostbyname
-choke me
-#endif
-
-int
-main ()
-{
-return gethostbyname ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_link") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext && {
-	 test "$cross_compiling" = yes ||
-	 $as_test_x conftest$ac_exeext
-       }; then
-  ac_cv_func_gethostbyname=yes
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_cv_func_gethostbyname=no
-fi
-
-rm -rf conftest.dSYM
-rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
-      conftest$ac_exeext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_gethostbyname" >&5
-$as_echo "$ac_cv_func_gethostbyname" >&6; }
-
-    if test $ac_cv_func_gethostbyname = no; then
-      { $as_echo "$as_me:$LINENO: checking for gethostbyname in -lnsl" >&5
-$as_echo_n "checking for gethostbyname in -lnsl... " >&6; }
-if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lnsl  $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char gethostbyname ();
-int
-main ()
-{
-return gethostbyname ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_link") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext && {
-	 test "$cross_compiling" = yes ||
-	 $as_test_x conftest$ac_exeext
-       }; then
-  ac_cv_lib_nsl_gethostbyname=yes
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_cv_lib_nsl_gethostbyname=no
-fi
-
-rm -rf conftest.dSYM
-rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_nsl_gethostbyname" >&5
-$as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; }
-if test "x$ac_cv_lib_nsl_gethostbyname" = x""yes; then
-  X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl"
-fi
-
-      if test $ac_cv_lib_nsl_gethostbyname = no; then
-	{ $as_echo "$as_me:$LINENO: checking for gethostbyname in -lbsd" >&5
-$as_echo_n "checking for gethostbyname in -lbsd... " >&6; }
-if test "${ac_cv_lib_bsd_gethostbyname+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lbsd  $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char gethostbyname ();
-int
-main ()
-{
-return gethostbyname ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_link") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext && {
-	 test "$cross_compiling" = yes ||
-	 $as_test_x conftest$ac_exeext
-       }; then
-  ac_cv_lib_bsd_gethostbyname=yes
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_cv_lib_bsd_gethostbyname=no
-fi
-
-rm -rf conftest.dSYM
-rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_bsd_gethostbyname" >&5
-$as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; }
-if test "x$ac_cv_lib_bsd_gethostbyname" = x""yes; then
-  X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd"
-fi
-
-      fi
-    fi
-
-    # lieder@skyler.mavd.honeywell.com says without -lsocket,
-    # socket/setsockopt and other routines are undefined under SCO ODT
-    # 2.0.  But -lsocket is broken on IRIX 5.2 (and is not necessary
-    # on later versions), says Simon Leinen: it contains gethostby*
-    # variants that don't use the name server (or something).  -lsocket
-    # must be given before -lnsl if both are needed.  We assume that
-    # if connect needs -lnsl, so does gethostbyname.
-    { $as_echo "$as_me:$LINENO: checking for connect" >&5
-$as_echo_n "checking for connect... " >&6; }
-if test "${ac_cv_func_connect+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-/* Define connect to an innocuous variant, in case <limits.h> declares connect.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define connect innocuous_connect
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char connect (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef connect
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char connect ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined __stub_connect || defined __stub___connect
-choke me
-#endif
-
-int
-main ()
-{
-return connect ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_link") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext && {
-	 test "$cross_compiling" = yes ||
-	 $as_test_x conftest$ac_exeext
-       }; then
-  ac_cv_func_connect=yes
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_cv_func_connect=no
-fi
-
-rm -rf conftest.dSYM
-rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
-      conftest$ac_exeext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_connect" >&5
-$as_echo "$ac_cv_func_connect" >&6; }
-
-    if test $ac_cv_func_connect = no; then
-      { $as_echo "$as_me:$LINENO: checking for connect in -lsocket" >&5
-$as_echo_n "checking for connect in -lsocket... " >&6; }
-if test "${ac_cv_lib_socket_connect+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lsocket $X_EXTRA_LIBS $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char connect ();
-int
-main ()
-{
-return connect ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_link") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext && {
-	 test "$cross_compiling" = yes ||
-	 $as_test_x conftest$ac_exeext
-       }; then
-  ac_cv_lib_socket_connect=yes
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_cv_lib_socket_connect=no
-fi
-
-rm -rf conftest.dSYM
-rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_socket_connect" >&5
-$as_echo "$ac_cv_lib_socket_connect" >&6; }
-if test "x$ac_cv_lib_socket_connect" = x""yes; then
-  X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS"
-fi
-
-    fi
-
-    # Guillermo Gomez says -lposix is necessary on A/UX.
-    { $as_echo "$as_me:$LINENO: checking for remove" >&5
-$as_echo_n "checking for remove... " >&6; }
-if test "${ac_cv_func_remove+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-/* Define remove to an innocuous variant, in case <limits.h> declares remove.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define remove innocuous_remove
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char remove (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef remove
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char remove ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined __stub_remove || defined __stub___remove
-choke me
-#endif
-
-int
-main ()
-{
-return remove ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_link") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext && {
-	 test "$cross_compiling" = yes ||
-	 $as_test_x conftest$ac_exeext
-       }; then
-  ac_cv_func_remove=yes
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_cv_func_remove=no
-fi
-
-rm -rf conftest.dSYM
-rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
-      conftest$ac_exeext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_remove" >&5
-$as_echo "$ac_cv_func_remove" >&6; }
-
-    if test $ac_cv_func_remove = no; then
-      { $as_echo "$as_me:$LINENO: checking for remove in -lposix" >&5
-$as_echo_n "checking for remove in -lposix... " >&6; }
-if test "${ac_cv_lib_posix_remove+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lposix  $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char remove ();
-int
-main ()
-{
-return remove ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_link") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext && {
-	 test "$cross_compiling" = yes ||
-	 $as_test_x conftest$ac_exeext
-       }; then
-  ac_cv_lib_posix_remove=yes
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_cv_lib_posix_remove=no
-fi
-
-rm -rf conftest.dSYM
-rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_posix_remove" >&5
-$as_echo "$ac_cv_lib_posix_remove" >&6; }
-if test "x$ac_cv_lib_posix_remove" = x""yes; then
-  X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix"
-fi
-
-    fi
-
-    # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay.
-    { $as_echo "$as_me:$LINENO: checking for shmat" >&5
-$as_echo_n "checking for shmat... " >&6; }
-if test "${ac_cv_func_shmat+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-/* Define shmat to an innocuous variant, in case <limits.h> declares shmat.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define shmat innocuous_shmat
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char shmat (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef shmat
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char shmat ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined __stub_shmat || defined __stub___shmat
-choke me
-#endif
-
-int
-main ()
-{
-return shmat ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_link") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext && {
-	 test "$cross_compiling" = yes ||
-	 $as_test_x conftest$ac_exeext
-       }; then
-  ac_cv_func_shmat=yes
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_cv_func_shmat=no
-fi
-
-rm -rf conftest.dSYM
-rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
-      conftest$ac_exeext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_shmat" >&5
-$as_echo "$ac_cv_func_shmat" >&6; }
-
-    if test $ac_cv_func_shmat = no; then
-      { $as_echo "$as_me:$LINENO: checking for shmat in -lipc" >&5
-$as_echo_n "checking for shmat in -lipc... " >&6; }
-if test "${ac_cv_lib_ipc_shmat+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lipc  $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char shmat ();
-int
-main ()
-{
-return shmat ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_link") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext && {
-	 test "$cross_compiling" = yes ||
-	 $as_test_x conftest$ac_exeext
-       }; then
-  ac_cv_lib_ipc_shmat=yes
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_cv_lib_ipc_shmat=no
-fi
-
-rm -rf conftest.dSYM
-rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_ipc_shmat" >&5
-$as_echo "$ac_cv_lib_ipc_shmat" >&6; }
-if test "x$ac_cv_lib_ipc_shmat" = x""yes; then
-  X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc"
-fi
-
-    fi
-  fi
-
-  # Check for libraries that X11R6 Xt/Xaw programs need.
-  ac_save_LDFLAGS=$LDFLAGS
-  test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries"
-  # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to
-  # check for ICE first), but we must link in the order -lSM -lICE or
-  # we get undefined symbols.  So assume we have SM if we have ICE.
-  # These have to be linked with before -lX11, unlike the other
-  # libraries we check for below, so use a different variable.
-  # John Interrante, Karl Berry
-  { $as_echo "$as_me:$LINENO: checking for IceConnectionNumber in -lICE" >&5
-$as_echo_n "checking for IceConnectionNumber in -lICE... " >&6; }
-if test "${ac_cv_lib_ICE_IceConnectionNumber+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lICE $X_EXTRA_LIBS $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char IceConnectionNumber ();
-int
-main ()
-{
-return IceConnectionNumber ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_link") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext && {
-	 test "$cross_compiling" = yes ||
-	 $as_test_x conftest$ac_exeext
-       }; then
-  ac_cv_lib_ICE_IceConnectionNumber=yes
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_cv_lib_ICE_IceConnectionNumber=no
-fi
-
-rm -rf conftest.dSYM
-rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5
-$as_echo "$ac_cv_lib_ICE_IceConnectionNumber" >&6; }
-if test "x$ac_cv_lib_ICE_IceConnectionNumber" = x""yes; then
-  X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE"
-fi
-
-  LDFLAGS=$ac_save_LDFLAGS
-
-fi
-
-fi
-
-ac_aux_dir=
-for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
-  if test -f "$ac_dir/install-sh"; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/install-sh -c"
-    break
-  elif test -f "$ac_dir/install.sh"; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/install.sh -c"
-    break
-  elif test -f "$ac_dir/shtool"; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/shtool install -c"
-    break
-  fi
-done
-if test -z "$ac_aux_dir"; then
-  { { $as_echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5
-$as_echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;}
-   { (exit 1); exit 1; }; }
-fi
-
-# These three variables are undocumented and unsupported,
-# and are intended to be withdrawn in a future Autoconf release.
-# They can cause serious problems if a builder's source tree is in a directory
-# whose full name contains unusual characters.
-ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
-ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
-ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
-
-
-# Make sure we can run config.sub.
-$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
-  { { $as_echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5
-$as_echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;}
-   { (exit 1); exit 1; }; }
-
-{ $as_echo "$as_me:$LINENO: checking build system type" >&5
-$as_echo_n "checking build system type... " >&6; }
-if test "${ac_cv_build+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  ac_build_alias=$build_alias
-test "x$ac_build_alias" = x &&
-  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
-test "x$ac_build_alias" = x &&
-  { { $as_echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
-$as_echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
-   { (exit 1); exit 1; }; }
-ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
-  { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5
-$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;}
-   { (exit 1); exit 1; }; }
-
-fi
-{ $as_echo "$as_me:$LINENO: result: $ac_cv_build" >&5
-$as_echo "$ac_cv_build" >&6; }
-case $ac_cv_build in
-*-*-*) ;;
-*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical build" >&5
-$as_echo "$as_me: error: invalid value of canonical build" >&2;}
-   { (exit 1); exit 1; }; };;
-esac
-build=$ac_cv_build
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_build
-shift
-build_cpu=$1
-build_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-build_os=$*
-IFS=$ac_save_IFS
-case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
-
-
-{ $as_echo "$as_me:$LINENO: checking host system type" >&5
-$as_echo_n "checking host system type... " >&6; }
-if test "${ac_cv_host+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  if test "x$host_alias" = x; then
-  ac_cv_host=$ac_cv_build
-else
-  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
-    { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5
-$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;}
-   { (exit 1); exit 1; }; }
-fi
-
-fi
-{ $as_echo "$as_me:$LINENO: result: $ac_cv_host" >&5
-$as_echo "$ac_cv_host" >&6; }
-case $ac_cv_host in
-*-*-*) ;;
-*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical host" >&5
-$as_echo "$as_me: error: invalid value of canonical host" >&2;}
-   { (exit 1); exit 1; }; };;
-esac
-host=$ac_cv_host
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_host
-shift
-host_cpu=$1
-host_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-host_os=$*
-IFS=$ac_save_IFS
-case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
-
-
-{ $as_echo "$as_me:$LINENO: checking target system type" >&5
-$as_echo_n "checking target system type... " >&6; }
-if test "${ac_cv_target+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  if test "x$target_alias" = x; then
-  ac_cv_target=$ac_cv_host
-else
-  ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` ||
-    { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $target_alias failed" >&5
-$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $target_alias failed" >&2;}
-   { (exit 1); exit 1; }; }
-fi
-
-fi
-{ $as_echo "$as_me:$LINENO: result: $ac_cv_target" >&5
-$as_echo "$ac_cv_target" >&6; }
-case $ac_cv_target in
-*-*-*) ;;
-*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical target" >&5
-$as_echo "$as_me: error: invalid value of canonical target" >&2;}
-   { (exit 1); exit 1; }; };;
-esac
-target=$ac_cv_target
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_target
-shift
-target_cpu=$1
-target_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-target_os=$*
-IFS=$ac_save_IFS
-case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac
-
-
-# The aliases save the names the user supplied, while $host etc.
-# will get canonicalized.
-test -n "$target_alias" &&
-  test "$program_prefix$program_suffix$program_transform_name" = \
-    NONENONEs,x,x, &&
-  program_prefix=${target_alias}-
-
-
-
-use_quartz_opengl=no
-if test x"$enable_opengl" = xyes; then
-  case $target_os in
-  darwin*)
-
-cat >>confdefs.h <<\_ACEOF
-#define USE_QUARTZ_OPENGL 1
-_ACEOF
-
-    use_quartz_opengl=yes
-    ;;
-  esac
-fi
-
-GLU_FRAMEWORKS=
-GLUT_FRAMEWORKS=
-if test x"$use_quartz_opengl" = xyes; then
-  GLU_FRAMEWORKS=OpenGL
-  GLUT_FRAMEWORKS=GLUT
-fi
-
-
-
-
-
-
-
-if test x"$use_quartz_opengl" = xno; then
-  { $as_echo "$as_me:$LINENO: checking for atan" >&5
-$as_echo_n "checking for atan... " >&6; }
-if test "${ac_cv_func_atan+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-/* Define atan to an innocuous variant, in case <limits.h> declares atan.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define atan innocuous_atan
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char atan (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef atan
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char atan ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined __stub_atan || defined __stub___atan
-choke me
-#endif
-
-int
-main ()
-{
-return atan ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_link") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext && {
-	 test "$cross_compiling" = yes ||
-	 $as_test_x conftest$ac_exeext
-       }; then
-  ac_cv_func_atan=yes
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_cv_func_atan=no
-fi
-
-rm -rf conftest.dSYM
-rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
-      conftest$ac_exeext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_atan" >&5
-$as_echo "$ac_cv_func_atan" >&6; }
-if test "x$ac_cv_func_atan" = x""yes; then
-  fp_libm_not_needed=yes
-else
-  fp_libm_not_needed=dunno
-fi
-
-  if test x"$fp_libm_not_needed" = xdunno; then
-     { $as_echo "$as_me:$LINENO: checking for atan in -lm" >&5
-$as_echo_n "checking for atan in -lm... " >&6; }
-if test "${ac_cv_lib_m_atan+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lm  $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char atan ();
-int
-main ()
-{
-return atan ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_link") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext && {
-	 test "$cross_compiling" = yes ||
-	 $as_test_x conftest$ac_exeext
-       }; then
-  ac_cv_lib_m_atan=yes
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_cv_lib_m_atan=no
-fi
-
-rm -rf conftest.dSYM
-rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_m_atan" >&5
-$as_echo "$ac_cv_lib_m_atan" >&6; }
-if test "x$ac_cv_lib_m_atan" = x""yes; then
-  GL_LIBS="-lm $GL_LIBS"
-fi
-
-  fi
-
-  if test x"$no_x" != xyes; then
-    test -n "$x_includes" && GL_CFLAGS="-I$x_includes $GL_CFLAGS"
-    test -n "$x_libraries" && GL_LIBS="-L$x_libraries -lX11 $GL_LIBS"
-  fi
-
-  { $as_echo "$as_me:$LINENO: checking for GL library" >&5
-$as_echo_n "checking for GL library... " >&6; }
-if test "${fp_cv_check_GL_lib+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  fp_cv_check_GL_lib="no"
-  fp_save_CPPFLAGS="$CPPFLAGS"
-  CPPFLAGS="$CPPFLAGS ${GL_CFLAGS}"
-  fp_save_LIBS="$LIBS"
-  for fp_try_lib in -lGL -lopengl32; do
-    # transform "-lfoo" to "foo.lib" when using cl
-    if test x"$CC" = xcl; then
-      fp_try_lib=`echo $fp_try_lib | sed -e 's/^-l//' -e 's/$/.lib/'`
-    fi
-    LIBS="$fp_try_lib ${GL_LIBS} $fp_save_LIBS"
-    cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <GL/gl.h>
-int
-main ()
-{
-glEnd()
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_link") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext && {
-	 test "$cross_compiling" = yes ||
-	 $as_test_x conftest$ac_exeext
-       }; then
-  fp_cv_check_GL_lib="$fp_try_lib ${GL_LIBS}"; break
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-
-fi
-
-rm -rf conftest.dSYM
-rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
-      conftest$ac_exeext conftest.$ac_ext
-  done
-  LIBS="$fp_save_LIBS"
-  CPPFLAGS="$fp_save_CPPFLAGS"
-fi
-{ $as_echo "$as_me:$LINENO: result: $fp_cv_check_GL_lib" >&5
-$as_echo "$fp_cv_check_GL_lib" >&6; }
-
-  if test x"$fp_cv_check_GL_lib" = xno; then
-    no_GL=yes
-    GL_CFLAGS=
-    GL_LIBS=
-  else
-    GL_CFLAGS0="${GL_CFLAGS}"
-    GL_CFLAGS="$CPPFLAGS ${GL_CFLAGS0}"
-    GL_LIBS0="$fp_cv_check_GL_lib"
-    GL_LIBS="$LDFLAGS ${GL_LIBS0}"
-  fi
-
-
-  if test x"$fp_is_win32" = xyes; then
-    # Ugly: To get wglGetProcAddress on Windows, we have to link with
-    # opengl32.dll, too, even when we are using Cygwin with X11.
-    case "$GL_LIBS" in
-      *-lopengl32*|*opengl32.lib*) ;;
-      *) fp_save_LIBS="$LIBS"
-         LIBS="$LIBS -lopengl32"
-         cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <GL/gl.h>
-int
-main ()
-{
-glEnd()
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_link") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext && {
-	 test "$cross_compiling" = yes ||
-	 $as_test_x conftest$ac_exeext
-       }; then
-  GL_LIBS="$GL_LIBS -lopengl32"; GL_LIBS0="$GL_LIBS0 -lopengl32"
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-
-fi
-
-rm -rf conftest.dSYM
-rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
-      conftest$ac_exeext conftest.$ac_ext
-         LIBS="$fp_save_LIBS"
-         ;;
-    esac
-  fi
-fi
-
-
-
-GLU_CFLAGS="$GL_CFLAGS0"
-GLU_LIBS="$GL_LIBS0"
-
-if test x"$use_quartz_opengl" = xno; then
-  { $as_echo "$as_me:$LINENO: checking for GLU library" >&5
-$as_echo_n "checking for GLU library... " >&6; }
-if test "${fp_cv_check_GLU_lib+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  fp_cv_check_GLU_lib="no"
-  fp_save_CPPFLAGS="$CPPFLAGS"
-  CPPFLAGS="$CPPFLAGS ${GLU_CFLAGS}"
-  fp_save_LIBS="$LIBS"
-  for fp_try_lib in -lglu32 -lGLU; do
-    # transform "-lfoo" to "foo.lib" when using cl
-    if test x"$CC" = xcl; then
-      fp_try_lib=`echo $fp_try_lib | sed -e 's/^-l//' -e 's/$/.lib/'`
-    fi
-    LIBS="$fp_try_lib ${GLU_LIBS} $fp_save_LIBS"
-    cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <GL/glu.h>
-int
-main ()
-{
-gluNewQuadric()
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_link") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext && {
-	 test "$cross_compiling" = yes ||
-	 $as_test_x conftest$ac_exeext
-       }; then
-  fp_cv_check_GLU_lib="$fp_try_lib ${GLU_LIBS}"; break
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-
-fi
-
-rm -rf conftest.dSYM
-rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
-      conftest$ac_exeext conftest.$ac_ext
-  done
-  LIBS="$fp_save_LIBS"
-  CPPFLAGS="$fp_save_CPPFLAGS"
-fi
-{ $as_echo "$as_me:$LINENO: result: $fp_cv_check_GLU_lib" >&5
-$as_echo "$fp_cv_check_GLU_lib" >&6; }
-
-  if test x"$fp_cv_check_GLU_lib" = xno; then
-    no_GLU=yes
-    GLU_CFLAGS=
-    GLU_LIBS=
-  else
-    GLU_CFLAGS0="${GLU_CFLAGS}"
-    GLU_CFLAGS="$CPPFLAGS ${GLU_CFLAGS0}"
-    GLU_LIBS0="$fp_cv_check_GLU_lib"
-    GLU_LIBS="$LDFLAGS ${GLU_LIBS0}"
-  fi
-
-fi
-
-
-
-
-
-if test x"$GLU_LIBS" = xno; then
-  { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-{ { $as_echo "$as_me:$LINENO: error: no OpenGL library found, so this package cannot be built
-See \`config.log' for more details." >&5
-$as_echo "$as_me: error: no OpenGL library found, so this package cannot be built
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }; }
-fi
-
-# check for OpenGL include files
-gl_found_header=no
-glu_found_header=no
-fp_save_cppflags="$CPPFLAGS"
-CPPFLAGS="$CPPFLAGS $X_CFLAGS"
-{ $as_echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5
-$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
-if test "${ac_cv_path_GREP+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$GREP"; then
-  ac_path_GREP_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_prog in grep ggrep; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
-# Check for GNU ac_path_GREP and select it if it is found.
-  # Check for GNU $ac_path_GREP
-case `"$ac_path_GREP" --version 2>&1` in
-*GNU*)
-  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo 'GREP' >> "conftest.nl"
-    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    ac_count=`expr $ac_count + 1`
-    if test $ac_count -gt ${ac_path_GREP_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_GREP="$ac_path_GREP"
-      ac_path_GREP_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_GREP_found && break 3
-    done
-  done
-done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_GREP"; then
-    { { $as_echo "$as_me:$LINENO: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
-$as_echo "$as_me: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
-   { (exit 1); exit 1; }; }
-  fi
-else
-  ac_cv_path_GREP=$GREP
-fi
-
-fi
-{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5
-$as_echo "$ac_cv_path_GREP" >&6; }
- GREP="$ac_cv_path_GREP"
-
-
-{ $as_echo "$as_me:$LINENO: checking for egrep" >&5
-$as_echo_n "checking for egrep... " >&6; }
-if test "${ac_cv_path_EGREP+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
-   then ac_cv_path_EGREP="$GREP -E"
-   else
-     if test -z "$EGREP"; then
-  ac_path_EGREP_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_prog in egrep; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
-# Check for GNU ac_path_EGREP and select it if it is found.
-  # Check for GNU $ac_path_EGREP
-case `"$ac_path_EGREP" --version 2>&1` in
-*GNU*)
-  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo 'EGREP' >> "conftest.nl"
-    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    ac_count=`expr $ac_count + 1`
-    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_EGREP="$ac_path_EGREP"
-      ac_path_EGREP_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_EGREP_found && break 3
-    done
-  done
-done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_EGREP"; then
-    { { $as_echo "$as_me:$LINENO: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
-$as_echo "$as_me: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
-   { (exit 1); exit 1; }; }
-  fi
-else
-  ac_cv_path_EGREP=$EGREP
-fi
-
-   fi
-fi
-{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5
-$as_echo "$ac_cv_path_EGREP" >&6; }
- EGREP="$ac_cv_path_EGREP"
-
-
-{ $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5
-$as_echo_n "checking for ANSI C header files... " >&6; }
-if test "${ac_cv_header_stdc+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
-  ac_cv_header_stdc=yes
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_cv_header_stdc=no
-fi
-
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-if test $ac_cv_header_stdc = yes; then
-  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <string.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "memchr" >/dev/null 2>&1; then
-  :
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <stdlib.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "free" >/dev/null 2>&1; then
-  :
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
-  if test "$cross_compiling" = yes; then
-  :
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <ctype.h>
-#include <stdlib.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
-		   (('a' <= (c) && (c) <= 'i') \
-		     || ('j' <= (c) && (c) <= 'r') \
-		     || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
-  int i;
-  for (i = 0; i < 256; i++)
-    if (XOR (islower (i), ISLOWER (i))
-	|| toupper (i) != TOUPPER (i))
-      return 2;
-  return 0;
-}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  :
-else
-  $as_echo "$as_me: program exited with status $ac_status" >&5
-$as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-ac_cv_header_stdc=no
-fi
-rm -rf conftest.dSYM
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-
-
-fi
-fi
-{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
-$as_echo "$ac_cv_header_stdc" >&6; }
-if test $ac_cv_header_stdc = yes; then
-
-cat >>confdefs.h <<\_ACEOF
-#define STDC_HEADERS 1
-_ACEOF
-
-fi
-
-# On IRIX 5.3, sys/types and inttypes.h are conflicting.
-
-
-
-
-
-
-
-
-
-for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
-		  inttypes.h stdint.h unistd.h
-do
-as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
-$as_echo_n "checking for $ac_header... " >&6; }
-if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
-  $as_echo_n "(cached) " >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-
-#include <$ac_header>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
-  eval "$as_ac_Header=yes"
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	eval "$as_ac_Header=no"
-fi
-
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-ac_res=`eval 'as_val=${'$as_ac_Header'}
-		 $as_echo "$as_val"'`
-	       { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-as_val=`eval 'as_val=${'$as_ac_Header'}
-		 $as_echo "$as_val"'`
-   if test "x$as_val" = x""yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-
-
-for ac_header in GL/gl.h OpenGL/gl.h
-do
-as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
-  { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
-$as_echo_n "checking for $ac_header... " >&6; }
-if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
-  $as_echo_n "(cached) " >&6
-fi
-ac_res=`eval 'as_val=${'$as_ac_Header'}
-		 $as_echo "$as_val"'`
-	       { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-else
-  # Is the header compilable?
-{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5
-$as_echo_n "checking $ac_header usability... " >&6; }
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-#include <$ac_header>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
-  ac_header_compiler=yes
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_header_compiler=no
-fi
-
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-$as_echo "$ac_header_compiler" >&6; }
-
-# Is the header present?
-{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5
-$as_echo_n "checking $ac_header presence... " >&6; }
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <$ac_header>
-_ACEOF
-if { (ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null && {
-	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       }; then
-  ac_header_preproc=yes
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  ac_header_preproc=no
-fi
-
-rm -f conftest.err conftest.$ac_ext
-{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-$as_echo "$ac_header_preproc" >&6; }
-
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
-  yes:no: )
-    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
-$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
-    ac_header_preproc=yes
-    ;;
-  no:yes:* )
-    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
-$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
-    { $as_echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
-$as_echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
-    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
-$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
-    { $as_echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
-$as_echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
-$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
-    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
-$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
-    ( cat <<\_ASBOX
-## ----------------------------------- ##
-## Report this to sven.panne@aedion.de ##
-## ----------------------------------- ##
-_ASBOX
-     ) | sed "s/^/$as_me: WARNING:     /" >&2
-    ;;
-esac
-{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
-$as_echo_n "checking for $ac_header... " >&6; }
-if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
-  $as_echo_n "(cached) " >&6
-else
-  eval "$as_ac_Header=\$ac_header_preproc"
-fi
-ac_res=`eval 'as_val=${'$as_ac_Header'}
-		 $as_echo "$as_val"'`
-	       { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-
-fi
-as_val=`eval 'as_val=${'$as_ac_Header'}
-		 $as_echo "$as_val"'`
-   if test "x$as_val" = x""yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
- gl_found_header=yes
-fi
-
-done
-
-
-
-for ac_header in GL/glu.h OpenGL/glu.h
-do
-as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
-  { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
-$as_echo_n "checking for $ac_header... " >&6; }
-if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
-  $as_echo_n "(cached) " >&6
-fi
-ac_res=`eval 'as_val=${'$as_ac_Header'}
-		 $as_echo "$as_val"'`
-	       { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-else
-  # Is the header compilable?
-{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5
-$as_echo_n "checking $ac_header usability... " >&6; }
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-#include <$ac_header>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
-  ac_header_compiler=yes
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_header_compiler=no
-fi
-
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-$as_echo "$ac_header_compiler" >&6; }
-
-# Is the header present?
-{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5
-$as_echo_n "checking $ac_header presence... " >&6; }
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <$ac_header>
-_ACEOF
-if { (ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null && {
-	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       }; then
-  ac_header_preproc=yes
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  ac_header_preproc=no
-fi
-
-rm -f conftest.err conftest.$ac_ext
-{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-$as_echo "$ac_header_preproc" >&6; }
-
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
-  yes:no: )
-    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
-$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
-    ac_header_preproc=yes
-    ;;
-  no:yes:* )
-    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
-$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
-    { $as_echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
-$as_echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
-    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
-$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
-    { $as_echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
-$as_echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
-$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
-    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
-$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
-    ( cat <<\_ASBOX
-## ----------------------------------- ##
-## Report this to sven.panne@aedion.de ##
-## ----------------------------------- ##
-_ASBOX
-     ) | sed "s/^/$as_me: WARNING:     /" >&2
-    ;;
-esac
-{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
-$as_echo_n "checking for $ac_header... " >&6; }
-if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
-  $as_echo_n "(cached) " >&6
-else
-  eval "$as_ac_Header=\$ac_header_preproc"
-fi
-ac_res=`eval 'as_val=${'$as_ac_Header'}
-		 $as_echo "$as_val"'`
-	       { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-
-fi
-as_val=`eval 'as_val=${'$as_ac_Header'}
-		 $as_echo "$as_val"'`
-   if test "x$as_val" = x""yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
- glu_found_header=yes
-fi
-
-done
-
-CPPFLAGS="$fp_save_cppflags"
-
-if test x"$gl_found_header" = xno || test x"$glu_found_header" = xno; then
-  { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-{ { $as_echo "$as_me:$LINENO: error: no OpenGL headers found, so this package cannot be built
-See \`config.log' for more details." >&5
-$as_echo "$as_me: error: no OpenGL headers found, so this package cannot be built
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }; }
-fi
-
-GL_BUILD_PACKAGE=yes
-
-{ $as_echo "$as_me:$LINENO: checking Haskell type for GLboolean" >&5
-$as_echo_n "checking Haskell type for GLboolean... " >&6; }
-if test "${fptools_cv_htype_GLboolean+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  fptools_cv_htype_sup_GLboolean=yes
-fp_check_htype_save_cppflags="$CPPFLAGS"
-CPPFLAGS="$CPPFLAGS $X_CFLAGS"
-if test "$cross_compiling" = yes; then
-  fptools_cv_htype_GLboolean=NotReallyATypeCross; fptools_cv_htype_sup_GLboolean=no
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <stdio.h>
-#include <stddef.h>
-
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#if HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-
-#if HAVE_FCNTL_H
-# include <fcntl.h>
-#endif
-
-#if HAVE_SIGNAL_H
-# include <signal.h>
-#endif
-
-#if HAVE_TIME_H
-# include <time.h>
-#endif
-
-#if HAVE_TERMIOS_H
-# include <termios.h>
-#endif
-
-#if HAVE_STRING_H
-# include <string.h>
-#endif
-
-#if HAVE_CTYPE_H
-# include <ctype.h>
-#endif
-
-#if defined(HAVE_GL_GL_H)
-# include <GL/gl.h>
-#elif defined(HAVE_OPENGL_GL_H)
-# include <OpenGL/gl.h>
-#endif
-
-#if defined(HAVE_AL_AL_H)
-# include <AL/al.h>
-#elif defined(HAVE_OPENAL_AL_H)
-# include <OpenAL/al.h>
-#endif
-
-#if defined(HAVE_AL_ALC_H)
-# include <AL/alc.h>
-#elif defined(HAVE_OPENAL_ALC_H)
-# include <OpenAL/alc.h>
-#endif
-
-#if HAVE_SYS_RESOURCE_H
-# include <sys/resource.h>
-#endif
-
-typedef GLboolean testing;
-
-main() {
-  FILE *f=fopen("conftestval", "w");
-  if (!f) exit(1);
-  if (((testing)((int)((testing)1.4))) == ((testing)1.4)) {
-    fprintf(f, "%s%d\n",
-           ((testing)(-1) < (testing)0) ? "Int" : "Word",
-           sizeof(testing)*8);
-  } else {
-    fprintf(f,"%s\n",
-           (sizeof(testing) >  sizeof(double)) ? "LDouble" :
-           (sizeof(testing) == sizeof(double)) ? "Double"  : "Float");
-  }
-  fclose(f);
-  exit(0);
-}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  fptools_cv_htype_GLboolean=`cat conftestval`
-else
-  $as_echo "$as_me: program exited with status $ac_status" >&5
-$as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-fptools_cv_htype_GLboolean=NotReallyAType; fptools_cv_htype_sup_GLboolean=no
-fi
-rm -rf conftest.dSYM
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-
-
-CPPFLAGS="$fp_check_htype_save_cppflags"
-fi
- if test "$fptools_cv_htype_sup_GLboolean" = yes; then
-  { $as_echo "$as_me:$LINENO: result: $fptools_cv_htype_GLboolean" >&5
-$as_echo "$fptools_cv_htype_GLboolean" >&6; }
-
-cat >>confdefs.h <<_ACEOF
-#define HTYPE_GLBOOLEAN $fptools_cv_htype_GLboolean
-_ACEOF
-
-else
-  { $as_echo "$as_me:$LINENO: result: not supported" >&5
-$as_echo "not supported" >&6; }
-fi
-
-{ $as_echo "$as_me:$LINENO: checking Haskell type for GLbyte" >&5
-$as_echo_n "checking Haskell type for GLbyte... " >&6; }
-if test "${fptools_cv_htype_GLbyte+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  fptools_cv_htype_sup_GLbyte=yes
-fp_check_htype_save_cppflags="$CPPFLAGS"
-CPPFLAGS="$CPPFLAGS $X_CFLAGS"
-if test "$cross_compiling" = yes; then
-  fptools_cv_htype_GLbyte=NotReallyATypeCross; fptools_cv_htype_sup_GLbyte=no
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <stdio.h>
-#include <stddef.h>
-
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#if HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-
-#if HAVE_FCNTL_H
-# include <fcntl.h>
-#endif
-
-#if HAVE_SIGNAL_H
-# include <signal.h>
-#endif
-
-#if HAVE_TIME_H
-# include <time.h>
-#endif
-
-#if HAVE_TERMIOS_H
-# include <termios.h>
-#endif
-
-#if HAVE_STRING_H
-# include <string.h>
-#endif
-
-#if HAVE_CTYPE_H
-# include <ctype.h>
-#endif
-
-#if defined(HAVE_GL_GL_H)
-# include <GL/gl.h>
-#elif defined(HAVE_OPENGL_GL_H)
-# include <OpenGL/gl.h>
-#endif
-
-#if defined(HAVE_AL_AL_H)
-# include <AL/al.h>
-#elif defined(HAVE_OPENAL_AL_H)
-# include <OpenAL/al.h>
-#endif
-
-#if defined(HAVE_AL_ALC_H)
-# include <AL/alc.h>
-#elif defined(HAVE_OPENAL_ALC_H)
-# include <OpenAL/alc.h>
-#endif
-
-#if HAVE_SYS_RESOURCE_H
-# include <sys/resource.h>
-#endif
-
-typedef GLbyte testing;
-
-main() {
-  FILE *f=fopen("conftestval", "w");
-  if (!f) exit(1);
-  if (((testing)((int)((testing)1.4))) == ((testing)1.4)) {
-    fprintf(f, "%s%d\n",
-           ((testing)(-1) < (testing)0) ? "Int" : "Word",
-           sizeof(testing)*8);
-  } else {
-    fprintf(f,"%s\n",
-           (sizeof(testing) >  sizeof(double)) ? "LDouble" :
-           (sizeof(testing) == sizeof(double)) ? "Double"  : "Float");
-  }
-  fclose(f);
-  exit(0);
-}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  fptools_cv_htype_GLbyte=`cat conftestval`
-else
-  $as_echo "$as_me: program exited with status $ac_status" >&5
-$as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-fptools_cv_htype_GLbyte=NotReallyAType; fptools_cv_htype_sup_GLbyte=no
-fi
-rm -rf conftest.dSYM
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-
-
-CPPFLAGS="$fp_check_htype_save_cppflags"
-fi
- if test "$fptools_cv_htype_sup_GLbyte" = yes; then
-  { $as_echo "$as_me:$LINENO: result: $fptools_cv_htype_GLbyte" >&5
-$as_echo "$fptools_cv_htype_GLbyte" >&6; }
-
-cat >>confdefs.h <<_ACEOF
-#define HTYPE_GLBYTE $fptools_cv_htype_GLbyte
-_ACEOF
-
-else
-  { $as_echo "$as_me:$LINENO: result: not supported" >&5
-$as_echo "not supported" >&6; }
-fi
-
-{ $as_echo "$as_me:$LINENO: checking Haskell type for GLubyte" >&5
-$as_echo_n "checking Haskell type for GLubyte... " >&6; }
-if test "${fptools_cv_htype_GLubyte+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  fptools_cv_htype_sup_GLubyte=yes
-fp_check_htype_save_cppflags="$CPPFLAGS"
-CPPFLAGS="$CPPFLAGS $X_CFLAGS"
-if test "$cross_compiling" = yes; then
-  fptools_cv_htype_GLubyte=NotReallyATypeCross; fptools_cv_htype_sup_GLubyte=no
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <stdio.h>
-#include <stddef.h>
-
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#if HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-
-#if HAVE_FCNTL_H
-# include <fcntl.h>
-#endif
-
-#if HAVE_SIGNAL_H
-# include <signal.h>
-#endif
-
-#if HAVE_TIME_H
-# include <time.h>
-#endif
-
-#if HAVE_TERMIOS_H
-# include <termios.h>
-#endif
-
-#if HAVE_STRING_H
-# include <string.h>
-#endif
-
-#if HAVE_CTYPE_H
-# include <ctype.h>
-#endif
-
-#if defined(HAVE_GL_GL_H)
-# include <GL/gl.h>
-#elif defined(HAVE_OPENGL_GL_H)
-# include <OpenGL/gl.h>
-#endif
-
-#if defined(HAVE_AL_AL_H)
-# include <AL/al.h>
-#elif defined(HAVE_OPENAL_AL_H)
-# include <OpenAL/al.h>
-#endif
-
-#if defined(HAVE_AL_ALC_H)
-# include <AL/alc.h>
-#elif defined(HAVE_OPENAL_ALC_H)
-# include <OpenAL/alc.h>
-#endif
-
-#if HAVE_SYS_RESOURCE_H
-# include <sys/resource.h>
-#endif
-
-typedef GLubyte testing;
-
-main() {
-  FILE *f=fopen("conftestval", "w");
-  if (!f) exit(1);
-  if (((testing)((int)((testing)1.4))) == ((testing)1.4)) {
-    fprintf(f, "%s%d\n",
-           ((testing)(-1) < (testing)0) ? "Int" : "Word",
-           sizeof(testing)*8);
-  } else {
-    fprintf(f,"%s\n",
-           (sizeof(testing) >  sizeof(double)) ? "LDouble" :
-           (sizeof(testing) == sizeof(double)) ? "Double"  : "Float");
-  }
-  fclose(f);
-  exit(0);
-}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  fptools_cv_htype_GLubyte=`cat conftestval`
-else
-  $as_echo "$as_me: program exited with status $ac_status" >&5
-$as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-fptools_cv_htype_GLubyte=NotReallyAType; fptools_cv_htype_sup_GLubyte=no
-fi
-rm -rf conftest.dSYM
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-
-
-CPPFLAGS="$fp_check_htype_save_cppflags"
-fi
- if test "$fptools_cv_htype_sup_GLubyte" = yes; then
-  { $as_echo "$as_me:$LINENO: result: $fptools_cv_htype_GLubyte" >&5
-$as_echo "$fptools_cv_htype_GLubyte" >&6; }
-
-cat >>confdefs.h <<_ACEOF
-#define HTYPE_GLUBYTE $fptools_cv_htype_GLubyte
-_ACEOF
-
-else
-  { $as_echo "$as_me:$LINENO: result: not supported" >&5
-$as_echo "not supported" >&6; }
-fi
-
-{ $as_echo "$as_me:$LINENO: checking Haskell type for GLshort" >&5
-$as_echo_n "checking Haskell type for GLshort... " >&6; }
-if test "${fptools_cv_htype_GLshort+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  fptools_cv_htype_sup_GLshort=yes
-fp_check_htype_save_cppflags="$CPPFLAGS"
-CPPFLAGS="$CPPFLAGS $X_CFLAGS"
-if test "$cross_compiling" = yes; then
-  fptools_cv_htype_GLshort=NotReallyATypeCross; fptools_cv_htype_sup_GLshort=no
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <stdio.h>
-#include <stddef.h>
-
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#if HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-
-#if HAVE_FCNTL_H
-# include <fcntl.h>
-#endif
-
-#if HAVE_SIGNAL_H
-# include <signal.h>
-#endif
-
-#if HAVE_TIME_H
-# include <time.h>
-#endif
-
-#if HAVE_TERMIOS_H
-# include <termios.h>
-#endif
-
-#if HAVE_STRING_H
-# include <string.h>
-#endif
-
-#if HAVE_CTYPE_H
-# include <ctype.h>
-#endif
-
-#if defined(HAVE_GL_GL_H)
-# include <GL/gl.h>
-#elif defined(HAVE_OPENGL_GL_H)
-# include <OpenGL/gl.h>
-#endif
-
-#if defined(HAVE_AL_AL_H)
-# include <AL/al.h>
-#elif defined(HAVE_OPENAL_AL_H)
-# include <OpenAL/al.h>
-#endif
-
-#if defined(HAVE_AL_ALC_H)
-# include <AL/alc.h>
-#elif defined(HAVE_OPENAL_ALC_H)
-# include <OpenAL/alc.h>
-#endif
-
-#if HAVE_SYS_RESOURCE_H
-# include <sys/resource.h>
-#endif
-
-typedef GLshort testing;
-
-main() {
-  FILE *f=fopen("conftestval", "w");
-  if (!f) exit(1);
-  if (((testing)((int)((testing)1.4))) == ((testing)1.4)) {
-    fprintf(f, "%s%d\n",
-           ((testing)(-1) < (testing)0) ? "Int" : "Word",
-           sizeof(testing)*8);
-  } else {
-    fprintf(f,"%s\n",
-           (sizeof(testing) >  sizeof(double)) ? "LDouble" :
-           (sizeof(testing) == sizeof(double)) ? "Double"  : "Float");
-  }
-  fclose(f);
-  exit(0);
-}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  fptools_cv_htype_GLshort=`cat conftestval`
-else
-  $as_echo "$as_me: program exited with status $ac_status" >&5
-$as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-fptools_cv_htype_GLshort=NotReallyAType; fptools_cv_htype_sup_GLshort=no
-fi
-rm -rf conftest.dSYM
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-
-
-CPPFLAGS="$fp_check_htype_save_cppflags"
-fi
- if test "$fptools_cv_htype_sup_GLshort" = yes; then
-  { $as_echo "$as_me:$LINENO: result: $fptools_cv_htype_GLshort" >&5
-$as_echo "$fptools_cv_htype_GLshort" >&6; }
-
-cat >>confdefs.h <<_ACEOF
-#define HTYPE_GLSHORT $fptools_cv_htype_GLshort
-_ACEOF
-
-else
-  { $as_echo "$as_me:$LINENO: result: not supported" >&5
-$as_echo "not supported" >&6; }
-fi
-
-{ $as_echo "$as_me:$LINENO: checking Haskell type for GLushort" >&5
-$as_echo_n "checking Haskell type for GLushort... " >&6; }
-if test "${fptools_cv_htype_GLushort+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  fptools_cv_htype_sup_GLushort=yes
-fp_check_htype_save_cppflags="$CPPFLAGS"
-CPPFLAGS="$CPPFLAGS $X_CFLAGS"
-if test "$cross_compiling" = yes; then
-  fptools_cv_htype_GLushort=NotReallyATypeCross; fptools_cv_htype_sup_GLushort=no
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <stdio.h>
-#include <stddef.h>
-
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#if HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-
-#if HAVE_FCNTL_H
-# include <fcntl.h>
-#endif
-
-#if HAVE_SIGNAL_H
-# include <signal.h>
-#endif
-
-#if HAVE_TIME_H
-# include <time.h>
-#endif
-
-#if HAVE_TERMIOS_H
-# include <termios.h>
-#endif
-
-#if HAVE_STRING_H
-# include <string.h>
-#endif
-
-#if HAVE_CTYPE_H
-# include <ctype.h>
-#endif
-
-#if defined(HAVE_GL_GL_H)
-# include <GL/gl.h>
-#elif defined(HAVE_OPENGL_GL_H)
-# include <OpenGL/gl.h>
-#endif
-
-#if defined(HAVE_AL_AL_H)
-# include <AL/al.h>
-#elif defined(HAVE_OPENAL_AL_H)
-# include <OpenAL/al.h>
-#endif
-
-#if defined(HAVE_AL_ALC_H)
-# include <AL/alc.h>
-#elif defined(HAVE_OPENAL_ALC_H)
-# include <OpenAL/alc.h>
-#endif
-
-#if HAVE_SYS_RESOURCE_H
-# include <sys/resource.h>
-#endif
-
-typedef GLushort testing;
-
-main() {
-  FILE *f=fopen("conftestval", "w");
-  if (!f) exit(1);
-  if (((testing)((int)((testing)1.4))) == ((testing)1.4)) {
-    fprintf(f, "%s%d\n",
-           ((testing)(-1) < (testing)0) ? "Int" : "Word",
-           sizeof(testing)*8);
-  } else {
-    fprintf(f,"%s\n",
-           (sizeof(testing) >  sizeof(double)) ? "LDouble" :
-           (sizeof(testing) == sizeof(double)) ? "Double"  : "Float");
-  }
-  fclose(f);
-  exit(0);
-}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  fptools_cv_htype_GLushort=`cat conftestval`
-else
-  $as_echo "$as_me: program exited with status $ac_status" >&5
-$as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-fptools_cv_htype_GLushort=NotReallyAType; fptools_cv_htype_sup_GLushort=no
-fi
-rm -rf conftest.dSYM
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-
-
-CPPFLAGS="$fp_check_htype_save_cppflags"
-fi
- if test "$fptools_cv_htype_sup_GLushort" = yes; then
-  { $as_echo "$as_me:$LINENO: result: $fptools_cv_htype_GLushort" >&5
-$as_echo "$fptools_cv_htype_GLushort" >&6; }
-
-cat >>confdefs.h <<_ACEOF
-#define HTYPE_GLUSHORT $fptools_cv_htype_GLushort
-_ACEOF
-
-else
-  { $as_echo "$as_me:$LINENO: result: not supported" >&5
-$as_echo "not supported" >&6; }
-fi
-
-{ $as_echo "$as_me:$LINENO: checking Haskell type for GLint" >&5
-$as_echo_n "checking Haskell type for GLint... " >&6; }
-if test "${fptools_cv_htype_GLint+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  fptools_cv_htype_sup_GLint=yes
-fp_check_htype_save_cppflags="$CPPFLAGS"
-CPPFLAGS="$CPPFLAGS $X_CFLAGS"
-if test "$cross_compiling" = yes; then
-  fptools_cv_htype_GLint=NotReallyATypeCross; fptools_cv_htype_sup_GLint=no
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <stdio.h>
-#include <stddef.h>
-
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#if HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-
-#if HAVE_FCNTL_H
-# include <fcntl.h>
-#endif
-
-#if HAVE_SIGNAL_H
-# include <signal.h>
-#endif
-
-#if HAVE_TIME_H
-# include <time.h>
-#endif
-
-#if HAVE_TERMIOS_H
-# include <termios.h>
-#endif
-
-#if HAVE_STRING_H
-# include <string.h>
-#endif
-
-#if HAVE_CTYPE_H
-# include <ctype.h>
-#endif
-
-#if defined(HAVE_GL_GL_H)
-# include <GL/gl.h>
-#elif defined(HAVE_OPENGL_GL_H)
-# include <OpenGL/gl.h>
-#endif
-
-#if defined(HAVE_AL_AL_H)
-# include <AL/al.h>
-#elif defined(HAVE_OPENAL_AL_H)
-# include <OpenAL/al.h>
-#endif
-
-#if defined(HAVE_AL_ALC_H)
-# include <AL/alc.h>
-#elif defined(HAVE_OPENAL_ALC_H)
-# include <OpenAL/alc.h>
-#endif
-
-#if HAVE_SYS_RESOURCE_H
-# include <sys/resource.h>
-#endif
-
-typedef GLint testing;
-
-main() {
-  FILE *f=fopen("conftestval", "w");
-  if (!f) exit(1);
-  if (((testing)((int)((testing)1.4))) == ((testing)1.4)) {
-    fprintf(f, "%s%d\n",
-           ((testing)(-1) < (testing)0) ? "Int" : "Word",
-           sizeof(testing)*8);
-  } else {
-    fprintf(f,"%s\n",
-           (sizeof(testing) >  sizeof(double)) ? "LDouble" :
-           (sizeof(testing) == sizeof(double)) ? "Double"  : "Float");
-  }
-  fclose(f);
-  exit(0);
-}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  fptools_cv_htype_GLint=`cat conftestval`
-else
-  $as_echo "$as_me: program exited with status $ac_status" >&5
-$as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-fptools_cv_htype_GLint=NotReallyAType; fptools_cv_htype_sup_GLint=no
-fi
-rm -rf conftest.dSYM
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-
-
-CPPFLAGS="$fp_check_htype_save_cppflags"
-fi
- if test "$fptools_cv_htype_sup_GLint" = yes; then
-  { $as_echo "$as_me:$LINENO: result: $fptools_cv_htype_GLint" >&5
-$as_echo "$fptools_cv_htype_GLint" >&6; }
-
-cat >>confdefs.h <<_ACEOF
-#define HTYPE_GLINT $fptools_cv_htype_GLint
-_ACEOF
-
-else
-  { $as_echo "$as_me:$LINENO: result: not supported" >&5
-$as_echo "not supported" >&6; }
-fi
-
-{ $as_echo "$as_me:$LINENO: checking Haskell type for GLuint" >&5
-$as_echo_n "checking Haskell type for GLuint... " >&6; }
-if test "${fptools_cv_htype_GLuint+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  fptools_cv_htype_sup_GLuint=yes
-fp_check_htype_save_cppflags="$CPPFLAGS"
-CPPFLAGS="$CPPFLAGS $X_CFLAGS"
-if test "$cross_compiling" = yes; then
-  fptools_cv_htype_GLuint=NotReallyATypeCross; fptools_cv_htype_sup_GLuint=no
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <stdio.h>
-#include <stddef.h>
-
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#if HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-
-#if HAVE_FCNTL_H
-# include <fcntl.h>
-#endif
-
-#if HAVE_SIGNAL_H
-# include <signal.h>
-#endif
-
-#if HAVE_TIME_H
-# include <time.h>
-#endif
-
-#if HAVE_TERMIOS_H
-# include <termios.h>
-#endif
-
-#if HAVE_STRING_H
-# include <string.h>
-#endif
-
-#if HAVE_CTYPE_H
-# include <ctype.h>
-#endif
-
-#if defined(HAVE_GL_GL_H)
-# include <GL/gl.h>
-#elif defined(HAVE_OPENGL_GL_H)
-# include <OpenGL/gl.h>
-#endif
-
-#if defined(HAVE_AL_AL_H)
-# include <AL/al.h>
-#elif defined(HAVE_OPENAL_AL_H)
-# include <OpenAL/al.h>
-#endif
-
-#if defined(HAVE_AL_ALC_H)
-# include <AL/alc.h>
-#elif defined(HAVE_OPENAL_ALC_H)
-# include <OpenAL/alc.h>
-#endif
-
-#if HAVE_SYS_RESOURCE_H
-# include <sys/resource.h>
-#endif
-
-typedef GLuint testing;
-
-main() {
-  FILE *f=fopen("conftestval", "w");
-  if (!f) exit(1);
-  if (((testing)((int)((testing)1.4))) == ((testing)1.4)) {
-    fprintf(f, "%s%d\n",
-           ((testing)(-1) < (testing)0) ? "Int" : "Word",
-           sizeof(testing)*8);
-  } else {
-    fprintf(f,"%s\n",
-           (sizeof(testing) >  sizeof(double)) ? "LDouble" :
-           (sizeof(testing) == sizeof(double)) ? "Double"  : "Float");
-  }
-  fclose(f);
-  exit(0);
-}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  fptools_cv_htype_GLuint=`cat conftestval`
-else
-  $as_echo "$as_me: program exited with status $ac_status" >&5
-$as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-fptools_cv_htype_GLuint=NotReallyAType; fptools_cv_htype_sup_GLuint=no
-fi
-rm -rf conftest.dSYM
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-
-
-CPPFLAGS="$fp_check_htype_save_cppflags"
-fi
- if test "$fptools_cv_htype_sup_GLuint" = yes; then
-  { $as_echo "$as_me:$LINENO: result: $fptools_cv_htype_GLuint" >&5
-$as_echo "$fptools_cv_htype_GLuint" >&6; }
-
-cat >>confdefs.h <<_ACEOF
-#define HTYPE_GLUINT $fptools_cv_htype_GLuint
-_ACEOF
-
-else
-  { $as_echo "$as_me:$LINENO: result: not supported" >&5
-$as_echo "not supported" >&6; }
-fi
-
-{ $as_echo "$as_me:$LINENO: checking Haskell type for GLsizei" >&5
-$as_echo_n "checking Haskell type for GLsizei... " >&6; }
-if test "${fptools_cv_htype_GLsizei+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  fptools_cv_htype_sup_GLsizei=yes
-fp_check_htype_save_cppflags="$CPPFLAGS"
-CPPFLAGS="$CPPFLAGS $X_CFLAGS"
-if test "$cross_compiling" = yes; then
-  fptools_cv_htype_GLsizei=NotReallyATypeCross; fptools_cv_htype_sup_GLsizei=no
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <stdio.h>
-#include <stddef.h>
-
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#if HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-
-#if HAVE_FCNTL_H
-# include <fcntl.h>
-#endif
-
-#if HAVE_SIGNAL_H
-# include <signal.h>
-#endif
-
-#if HAVE_TIME_H
-# include <time.h>
-#endif
-
-#if HAVE_TERMIOS_H
-# include <termios.h>
-#endif
-
-#if HAVE_STRING_H
-# include <string.h>
-#endif
-
-#if HAVE_CTYPE_H
-# include <ctype.h>
-#endif
-
-#if defined(HAVE_GL_GL_H)
-# include <GL/gl.h>
-#elif defined(HAVE_OPENGL_GL_H)
-# include <OpenGL/gl.h>
-#endif
-
-#if defined(HAVE_AL_AL_H)
-# include <AL/al.h>
-#elif defined(HAVE_OPENAL_AL_H)
-# include <OpenAL/al.h>
-#endif
-
-#if defined(HAVE_AL_ALC_H)
-# include <AL/alc.h>
-#elif defined(HAVE_OPENAL_ALC_H)
-# include <OpenAL/alc.h>
-#endif
-
-#if HAVE_SYS_RESOURCE_H
-# include <sys/resource.h>
-#endif
-
-typedef GLsizei testing;
-
-main() {
-  FILE *f=fopen("conftestval", "w");
-  if (!f) exit(1);
-  if (((testing)((int)((testing)1.4))) == ((testing)1.4)) {
-    fprintf(f, "%s%d\n",
-           ((testing)(-1) < (testing)0) ? "Int" : "Word",
-           sizeof(testing)*8);
-  } else {
-    fprintf(f,"%s\n",
-           (sizeof(testing) >  sizeof(double)) ? "LDouble" :
-           (sizeof(testing) == sizeof(double)) ? "Double"  : "Float");
-  }
-  fclose(f);
-  exit(0);
-}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  fptools_cv_htype_GLsizei=`cat conftestval`
-else
-  $as_echo "$as_me: program exited with status $ac_status" >&5
-$as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-fptools_cv_htype_GLsizei=NotReallyAType; fptools_cv_htype_sup_GLsizei=no
-fi
-rm -rf conftest.dSYM
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-
-
-CPPFLAGS="$fp_check_htype_save_cppflags"
-fi
- if test "$fptools_cv_htype_sup_GLsizei" = yes; then
-  { $as_echo "$as_me:$LINENO: result: $fptools_cv_htype_GLsizei" >&5
-$as_echo "$fptools_cv_htype_GLsizei" >&6; }
-
-cat >>confdefs.h <<_ACEOF
-#define HTYPE_GLSIZEI $fptools_cv_htype_GLsizei
-_ACEOF
-
-else
-  { $as_echo "$as_me:$LINENO: result: not supported" >&5
-$as_echo "not supported" >&6; }
-fi
-
-{ $as_echo "$as_me:$LINENO: checking Haskell type for GLenum" >&5
-$as_echo_n "checking Haskell type for GLenum... " >&6; }
-if test "${fptools_cv_htype_GLenum+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  fptools_cv_htype_sup_GLenum=yes
-fp_check_htype_save_cppflags="$CPPFLAGS"
-CPPFLAGS="$CPPFLAGS $X_CFLAGS"
-if test "$cross_compiling" = yes; then
-  fptools_cv_htype_GLenum=NotReallyATypeCross; fptools_cv_htype_sup_GLenum=no
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <stdio.h>
-#include <stddef.h>
-
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#if HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-
-#if HAVE_FCNTL_H
-# include <fcntl.h>
-#endif
-
-#if HAVE_SIGNAL_H
-# include <signal.h>
-#endif
-
-#if HAVE_TIME_H
-# include <time.h>
-#endif
-
-#if HAVE_TERMIOS_H
-# include <termios.h>
-#endif
-
-#if HAVE_STRING_H
-# include <string.h>
-#endif
-
-#if HAVE_CTYPE_H
-# include <ctype.h>
-#endif
-
-#if defined(HAVE_GL_GL_H)
-# include <GL/gl.h>
-#elif defined(HAVE_OPENGL_GL_H)
-# include <OpenGL/gl.h>
-#endif
-
-#if defined(HAVE_AL_AL_H)
-# include <AL/al.h>
-#elif defined(HAVE_OPENAL_AL_H)
-# include <OpenAL/al.h>
-#endif
-
-#if defined(HAVE_AL_ALC_H)
-# include <AL/alc.h>
-#elif defined(HAVE_OPENAL_ALC_H)
-# include <OpenAL/alc.h>
-#endif
-
-#if HAVE_SYS_RESOURCE_H
-# include <sys/resource.h>
-#endif
-
-typedef GLenum testing;
-
-main() {
-  FILE *f=fopen("conftestval", "w");
-  if (!f) exit(1);
-  if (((testing)((int)((testing)1.4))) == ((testing)1.4)) {
-    fprintf(f, "%s%d\n",
-           ((testing)(-1) < (testing)0) ? "Int" : "Word",
-           sizeof(testing)*8);
-  } else {
-    fprintf(f,"%s\n",
-           (sizeof(testing) >  sizeof(double)) ? "LDouble" :
-           (sizeof(testing) == sizeof(double)) ? "Double"  : "Float");
-  }
-  fclose(f);
-  exit(0);
-}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  fptools_cv_htype_GLenum=`cat conftestval`
-else
-  $as_echo "$as_me: program exited with status $ac_status" >&5
-$as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-fptools_cv_htype_GLenum=NotReallyAType; fptools_cv_htype_sup_GLenum=no
-fi
-rm -rf conftest.dSYM
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-
-
-CPPFLAGS="$fp_check_htype_save_cppflags"
-fi
- if test "$fptools_cv_htype_sup_GLenum" = yes; then
-  { $as_echo "$as_me:$LINENO: result: $fptools_cv_htype_GLenum" >&5
-$as_echo "$fptools_cv_htype_GLenum" >&6; }
-
-cat >>confdefs.h <<_ACEOF
-#define HTYPE_GLENUM $fptools_cv_htype_GLenum
-_ACEOF
-
-else
-  { $as_echo "$as_me:$LINENO: result: not supported" >&5
-$as_echo "not supported" >&6; }
-fi
-
-{ $as_echo "$as_me:$LINENO: checking Haskell type for GLbitfield" >&5
-$as_echo_n "checking Haskell type for GLbitfield... " >&6; }
-if test "${fptools_cv_htype_GLbitfield+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  fptools_cv_htype_sup_GLbitfield=yes
-fp_check_htype_save_cppflags="$CPPFLAGS"
-CPPFLAGS="$CPPFLAGS $X_CFLAGS"
-if test "$cross_compiling" = yes; then
-  fptools_cv_htype_GLbitfield=NotReallyATypeCross; fptools_cv_htype_sup_GLbitfield=no
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <stdio.h>
-#include <stddef.h>
-
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#if HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-
-#if HAVE_FCNTL_H
-# include <fcntl.h>
-#endif
-
-#if HAVE_SIGNAL_H
-# include <signal.h>
-#endif
-
-#if HAVE_TIME_H
-# include <time.h>
-#endif
-
-#if HAVE_TERMIOS_H
-# include <termios.h>
-#endif
-
-#if HAVE_STRING_H
-# include <string.h>
-#endif
-
-#if HAVE_CTYPE_H
-# include <ctype.h>
-#endif
-
-#if defined(HAVE_GL_GL_H)
-# include <GL/gl.h>
-#elif defined(HAVE_OPENGL_GL_H)
-# include <OpenGL/gl.h>
-#endif
-
-#if defined(HAVE_AL_AL_H)
-# include <AL/al.h>
-#elif defined(HAVE_OPENAL_AL_H)
-# include <OpenAL/al.h>
-#endif
-
-#if defined(HAVE_AL_ALC_H)
-# include <AL/alc.h>
-#elif defined(HAVE_OPENAL_ALC_H)
-# include <OpenAL/alc.h>
-#endif
-
-#if HAVE_SYS_RESOURCE_H
-# include <sys/resource.h>
-#endif
-
-typedef GLbitfield testing;
-
-main() {
-  FILE *f=fopen("conftestval", "w");
-  if (!f) exit(1);
-  if (((testing)((int)((testing)1.4))) == ((testing)1.4)) {
-    fprintf(f, "%s%d\n",
-           ((testing)(-1) < (testing)0) ? "Int" : "Word",
-           sizeof(testing)*8);
-  } else {
-    fprintf(f,"%s\n",
-           (sizeof(testing) >  sizeof(double)) ? "LDouble" :
-           (sizeof(testing) == sizeof(double)) ? "Double"  : "Float");
-  }
-  fclose(f);
-  exit(0);
-}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  fptools_cv_htype_GLbitfield=`cat conftestval`
-else
-  $as_echo "$as_me: program exited with status $ac_status" >&5
-$as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-fptools_cv_htype_GLbitfield=NotReallyAType; fptools_cv_htype_sup_GLbitfield=no
-fi
-rm -rf conftest.dSYM
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-
-
-CPPFLAGS="$fp_check_htype_save_cppflags"
-fi
- if test "$fptools_cv_htype_sup_GLbitfield" = yes; then
-  { $as_echo "$as_me:$LINENO: result: $fptools_cv_htype_GLbitfield" >&5
-$as_echo "$fptools_cv_htype_GLbitfield" >&6; }
-
-cat >>confdefs.h <<_ACEOF
-#define HTYPE_GLBITFIELD $fptools_cv_htype_GLbitfield
-_ACEOF
-
-else
-  { $as_echo "$as_me:$LINENO: result: not supported" >&5
-$as_echo "not supported" >&6; }
-fi
-
-{ $as_echo "$as_me:$LINENO: checking Haskell type for GLfloat" >&5
-$as_echo_n "checking Haskell type for GLfloat... " >&6; }
-if test "${fptools_cv_htype_GLfloat+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  fptools_cv_htype_sup_GLfloat=yes
-fp_check_htype_save_cppflags="$CPPFLAGS"
-CPPFLAGS="$CPPFLAGS $X_CFLAGS"
-if test "$cross_compiling" = yes; then
-  fptools_cv_htype_GLfloat=NotReallyATypeCross; fptools_cv_htype_sup_GLfloat=no
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <stdio.h>
-#include <stddef.h>
-
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#if HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-
-#if HAVE_FCNTL_H
-# include <fcntl.h>
-#endif
-
-#if HAVE_SIGNAL_H
-# include <signal.h>
-#endif
-
-#if HAVE_TIME_H
-# include <time.h>
-#endif
-
-#if HAVE_TERMIOS_H
-# include <termios.h>
-#endif
-
-#if HAVE_STRING_H
-# include <string.h>
-#endif
-
-#if HAVE_CTYPE_H
-# include <ctype.h>
-#endif
-
-#if defined(HAVE_GL_GL_H)
-# include <GL/gl.h>
-#elif defined(HAVE_OPENGL_GL_H)
-# include <OpenGL/gl.h>
-#endif
-
-#if defined(HAVE_AL_AL_H)
-# include <AL/al.h>
-#elif defined(HAVE_OPENAL_AL_H)
-# include <OpenAL/al.h>
-#endif
-
-#if defined(HAVE_AL_ALC_H)
-# include <AL/alc.h>
-#elif defined(HAVE_OPENAL_ALC_H)
-# include <OpenAL/alc.h>
-#endif
-
-#if HAVE_SYS_RESOURCE_H
-# include <sys/resource.h>
-#endif
-
-typedef GLfloat testing;
-
-main() {
-  FILE *f=fopen("conftestval", "w");
-  if (!f) exit(1);
-  if (((testing)((int)((testing)1.4))) == ((testing)1.4)) {
-    fprintf(f, "%s%d\n",
-           ((testing)(-1) < (testing)0) ? "Int" : "Word",
-           sizeof(testing)*8);
-  } else {
-    fprintf(f,"%s\n",
-           (sizeof(testing) >  sizeof(double)) ? "LDouble" :
-           (sizeof(testing) == sizeof(double)) ? "Double"  : "Float");
-  }
-  fclose(f);
-  exit(0);
-}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  fptools_cv_htype_GLfloat=`cat conftestval`
-else
-  $as_echo "$as_me: program exited with status $ac_status" >&5
-$as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-fptools_cv_htype_GLfloat=NotReallyAType; fptools_cv_htype_sup_GLfloat=no
-fi
-rm -rf conftest.dSYM
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-
-
-CPPFLAGS="$fp_check_htype_save_cppflags"
-fi
- if test "$fptools_cv_htype_sup_GLfloat" = yes; then
-  { $as_echo "$as_me:$LINENO: result: $fptools_cv_htype_GLfloat" >&5
-$as_echo "$fptools_cv_htype_GLfloat" >&6; }
-
-cat >>confdefs.h <<_ACEOF
-#define HTYPE_GLFLOAT $fptools_cv_htype_GLfloat
-_ACEOF
-
-else
-  { $as_echo "$as_me:$LINENO: result: not supported" >&5
-$as_echo "not supported" >&6; }
-fi
-
-{ $as_echo "$as_me:$LINENO: checking Haskell type for GLclampf" >&5
-$as_echo_n "checking Haskell type for GLclampf... " >&6; }
-if test "${fptools_cv_htype_GLclampf+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  fptools_cv_htype_sup_GLclampf=yes
-fp_check_htype_save_cppflags="$CPPFLAGS"
-CPPFLAGS="$CPPFLAGS $X_CFLAGS"
-if test "$cross_compiling" = yes; then
-  fptools_cv_htype_GLclampf=NotReallyATypeCross; fptools_cv_htype_sup_GLclampf=no
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <stdio.h>
-#include <stddef.h>
-
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#if HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-
-#if HAVE_FCNTL_H
-# include <fcntl.h>
-#endif
-
-#if HAVE_SIGNAL_H
-# include <signal.h>
-#endif
-
-#if HAVE_TIME_H
-# include <time.h>
-#endif
-
-#if HAVE_TERMIOS_H
-# include <termios.h>
-#endif
-
-#if HAVE_STRING_H
-# include <string.h>
-#endif
-
-#if HAVE_CTYPE_H
-# include <ctype.h>
-#endif
-
-#if defined(HAVE_GL_GL_H)
-# include <GL/gl.h>
-#elif defined(HAVE_OPENGL_GL_H)
-# include <OpenGL/gl.h>
-#endif
-
-#if defined(HAVE_AL_AL_H)
-# include <AL/al.h>
-#elif defined(HAVE_OPENAL_AL_H)
-# include <OpenAL/al.h>
-#endif
-
-#if defined(HAVE_AL_ALC_H)
-# include <AL/alc.h>
-#elif defined(HAVE_OPENAL_ALC_H)
-# include <OpenAL/alc.h>
-#endif
-
-#if HAVE_SYS_RESOURCE_H
-# include <sys/resource.h>
-#endif
-
-typedef GLclampf testing;
-
-main() {
-  FILE *f=fopen("conftestval", "w");
-  if (!f) exit(1);
-  if (((testing)((int)((testing)1.4))) == ((testing)1.4)) {
-    fprintf(f, "%s%d\n",
-           ((testing)(-1) < (testing)0) ? "Int" : "Word",
-           sizeof(testing)*8);
-  } else {
-    fprintf(f,"%s\n",
-           (sizeof(testing) >  sizeof(double)) ? "LDouble" :
-           (sizeof(testing) == sizeof(double)) ? "Double"  : "Float");
-  }
-  fclose(f);
-  exit(0);
-}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  fptools_cv_htype_GLclampf=`cat conftestval`
-else
-  $as_echo "$as_me: program exited with status $ac_status" >&5
-$as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-fptools_cv_htype_GLclampf=NotReallyAType; fptools_cv_htype_sup_GLclampf=no
-fi
-rm -rf conftest.dSYM
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-
-
-CPPFLAGS="$fp_check_htype_save_cppflags"
-fi
- if test "$fptools_cv_htype_sup_GLclampf" = yes; then
-  { $as_echo "$as_me:$LINENO: result: $fptools_cv_htype_GLclampf" >&5
-$as_echo "$fptools_cv_htype_GLclampf" >&6; }
-
-cat >>confdefs.h <<_ACEOF
-#define HTYPE_GLCLAMPF $fptools_cv_htype_GLclampf
-_ACEOF
-
-else
-  { $as_echo "$as_me:$LINENO: result: not supported" >&5
-$as_echo "not supported" >&6; }
-fi
-
-{ $as_echo "$as_me:$LINENO: checking Haskell type for GLdouble" >&5
-$as_echo_n "checking Haskell type for GLdouble... " >&6; }
-if test "${fptools_cv_htype_GLdouble+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  fptools_cv_htype_sup_GLdouble=yes
-fp_check_htype_save_cppflags="$CPPFLAGS"
-CPPFLAGS="$CPPFLAGS $X_CFLAGS"
-if test "$cross_compiling" = yes; then
-  fptools_cv_htype_GLdouble=NotReallyATypeCross; fptools_cv_htype_sup_GLdouble=no
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <stdio.h>
-#include <stddef.h>
-
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#if HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-
-#if HAVE_FCNTL_H
-# include <fcntl.h>
-#endif
-
-#if HAVE_SIGNAL_H
-# include <signal.h>
-#endif
-
-#if HAVE_TIME_H
-# include <time.h>
-#endif
-
-#if HAVE_TERMIOS_H
-# include <termios.h>
-#endif
-
-#if HAVE_STRING_H
-# include <string.h>
-#endif
-
-#if HAVE_CTYPE_H
-# include <ctype.h>
-#endif
-
-#if defined(HAVE_GL_GL_H)
-# include <GL/gl.h>
-#elif defined(HAVE_OPENGL_GL_H)
-# include <OpenGL/gl.h>
-#endif
-
-#if defined(HAVE_AL_AL_H)
-# include <AL/al.h>
-#elif defined(HAVE_OPENAL_AL_H)
-# include <OpenAL/al.h>
-#endif
-
-#if defined(HAVE_AL_ALC_H)
-# include <AL/alc.h>
-#elif defined(HAVE_OPENAL_ALC_H)
-# include <OpenAL/alc.h>
-#endif
-
-#if HAVE_SYS_RESOURCE_H
-# include <sys/resource.h>
-#endif
-
-typedef GLdouble testing;
-
-main() {
-  FILE *f=fopen("conftestval", "w");
-  if (!f) exit(1);
-  if (((testing)((int)((testing)1.4))) == ((testing)1.4)) {
-    fprintf(f, "%s%d\n",
-           ((testing)(-1) < (testing)0) ? "Int" : "Word",
-           sizeof(testing)*8);
-  } else {
-    fprintf(f,"%s\n",
-           (sizeof(testing) >  sizeof(double)) ? "LDouble" :
-           (sizeof(testing) == sizeof(double)) ? "Double"  : "Float");
-  }
-  fclose(f);
-  exit(0);
-}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  fptools_cv_htype_GLdouble=`cat conftestval`
-else
-  $as_echo "$as_me: program exited with status $ac_status" >&5
-$as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-fptools_cv_htype_GLdouble=NotReallyAType; fptools_cv_htype_sup_GLdouble=no
-fi
-rm -rf conftest.dSYM
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-
-
-CPPFLAGS="$fp_check_htype_save_cppflags"
-fi
- if test "$fptools_cv_htype_sup_GLdouble" = yes; then
-  { $as_echo "$as_me:$LINENO: result: $fptools_cv_htype_GLdouble" >&5
-$as_echo "$fptools_cv_htype_GLdouble" >&6; }
-
-cat >>confdefs.h <<_ACEOF
-#define HTYPE_GLDOUBLE $fptools_cv_htype_GLdouble
-_ACEOF
-
-else
-  { $as_echo "$as_me:$LINENO: result: not supported" >&5
-$as_echo "not supported" >&6; }
-fi
-
-{ $as_echo "$as_me:$LINENO: checking Haskell type for GLclampd" >&5
-$as_echo_n "checking Haskell type for GLclampd... " >&6; }
-if test "${fptools_cv_htype_GLclampd+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  fptools_cv_htype_sup_GLclampd=yes
-fp_check_htype_save_cppflags="$CPPFLAGS"
-CPPFLAGS="$CPPFLAGS $X_CFLAGS"
-if test "$cross_compiling" = yes; then
-  fptools_cv_htype_GLclampd=NotReallyATypeCross; fptools_cv_htype_sup_GLclampd=no
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <stdio.h>
-#include <stddef.h>
-
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#if HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-
-#if HAVE_FCNTL_H
-# include <fcntl.h>
-#endif
-
-#if HAVE_SIGNAL_H
-# include <signal.h>
-#endif
-
-#if HAVE_TIME_H
-# include <time.h>
-#endif
-
-#if HAVE_TERMIOS_H
-# include <termios.h>
-#endif
-
-#if HAVE_STRING_H
-# include <string.h>
-#endif
-
-#if HAVE_CTYPE_H
-# include <ctype.h>
-#endif
-
-#if defined(HAVE_GL_GL_H)
-# include <GL/gl.h>
-#elif defined(HAVE_OPENGL_GL_H)
-# include <OpenGL/gl.h>
-#endif
-
-#if defined(HAVE_AL_AL_H)
-# include <AL/al.h>
-#elif defined(HAVE_OPENAL_AL_H)
-# include <OpenAL/al.h>
-#endif
-
-#if defined(HAVE_AL_ALC_H)
-# include <AL/alc.h>
-#elif defined(HAVE_OPENAL_ALC_H)
-# include <OpenAL/alc.h>
-#endif
-
-#if HAVE_SYS_RESOURCE_H
-# include <sys/resource.h>
-#endif
-
-typedef GLclampd testing;
-
-main() {
-  FILE *f=fopen("conftestval", "w");
-  if (!f) exit(1);
-  if (((testing)((int)((testing)1.4))) == ((testing)1.4)) {
-    fprintf(f, "%s%d\n",
-           ((testing)(-1) < (testing)0) ? "Int" : "Word",
-           sizeof(testing)*8);
-  } else {
-    fprintf(f,"%s\n",
-           (sizeof(testing) >  sizeof(double)) ? "LDouble" :
-           (sizeof(testing) == sizeof(double)) ? "Double"  : "Float");
-  }
-  fclose(f);
-  exit(0);
-}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  fptools_cv_htype_GLclampd=`cat conftestval`
-else
-  $as_echo "$as_me: program exited with status $ac_status" >&5
-$as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-fptools_cv_htype_GLclampd=NotReallyAType; fptools_cv_htype_sup_GLclampd=no
-fi
-rm -rf conftest.dSYM
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-
-
-CPPFLAGS="$fp_check_htype_save_cppflags"
-fi
- if test "$fptools_cv_htype_sup_GLclampd" = yes; then
-  { $as_echo "$as_me:$LINENO: result: $fptools_cv_htype_GLclampd" >&5
-$as_echo "$fptools_cv_htype_GLclampd" >&6; }
-
-cat >>confdefs.h <<_ACEOF
-#define HTYPE_GLCLAMPD $fptools_cv_htype_GLclampd
-_ACEOF
-
-else
-  { $as_echo "$as_me:$LINENO: result: not supported" >&5
-$as_echo "not supported" >&6; }
-fi
-
-
-# cruel hack for ancient Windows headers
-{ $as_echo "$as_me:$LINENO: checking Haskell type for char" >&5
-$as_echo_n "checking Haskell type for char... " >&6; }
-if test "${fptools_cv_htype_char+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  fptools_cv_htype_sup_char=yes
-fp_check_htype_save_cppflags="$CPPFLAGS"
-CPPFLAGS="$CPPFLAGS $X_CFLAGS"
-if test "$cross_compiling" = yes; then
-  fptools_cv_htype_char=NotReallyATypeCross; fptools_cv_htype_sup_char=no
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <stdio.h>
-#include <stddef.h>
-
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#if HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-
-#if HAVE_FCNTL_H
-# include <fcntl.h>
-#endif
-
-#if HAVE_SIGNAL_H
-# include <signal.h>
-#endif
-
-#if HAVE_TIME_H
-# include <time.h>
-#endif
-
-#if HAVE_TERMIOS_H
-# include <termios.h>
-#endif
-
-#if HAVE_STRING_H
-# include <string.h>
-#endif
-
-#if HAVE_CTYPE_H
-# include <ctype.h>
-#endif
-
-#if defined(HAVE_GL_GL_H)
-# include <GL/gl.h>
-#elif defined(HAVE_OPENGL_GL_H)
-# include <OpenGL/gl.h>
-#endif
-
-#if defined(HAVE_AL_AL_H)
-# include <AL/al.h>
-#elif defined(HAVE_OPENAL_AL_H)
-# include <OpenAL/al.h>
-#endif
-
-#if defined(HAVE_AL_ALC_H)
-# include <AL/alc.h>
-#elif defined(HAVE_OPENAL_ALC_H)
-# include <OpenAL/alc.h>
-#endif
-
-#if HAVE_SYS_RESOURCE_H
-# include <sys/resource.h>
-#endif
-
-typedef char testing;
-
-main() {
-  FILE *f=fopen("conftestval", "w");
-  if (!f) exit(1);
-  if (((testing)((int)((testing)1.4))) == ((testing)1.4)) {
-    fprintf(f, "%s%d\n",
-           ((testing)(-1) < (testing)0) ? "Int" : "Word",
-           sizeof(testing)*8);
-  } else {
-    fprintf(f,"%s\n",
-           (sizeof(testing) >  sizeof(double)) ? "LDouble" :
-           (sizeof(testing) == sizeof(double)) ? "Double"  : "Float");
-  }
-  fclose(f);
-  exit(0);
-}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  fptools_cv_htype_char=`cat conftestval`
-else
-  $as_echo "$as_me: program exited with status $ac_status" >&5
-$as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-fptools_cv_htype_char=NotReallyAType; fptools_cv_htype_sup_char=no
-fi
-rm -rf conftest.dSYM
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-
-
-CPPFLAGS="$fp_check_htype_save_cppflags"
-fi
- if test "$fptools_cv_htype_sup_char" = yes; then
-  { $as_echo "$as_me:$LINENO: result: $fptools_cv_htype_char" >&5
-$as_echo "$fptools_cv_htype_char" >&6; }
-
-cat >>confdefs.h <<_ACEOF
-#define HTYPE_CHAR $fptools_cv_htype_char
-_ACEOF
-
-else
-  { $as_echo "$as_me:$LINENO: result: not supported" >&5
-$as_echo "not supported" >&6; }
-fi
-
-{ $as_echo "$as_me:$LINENO: checking Haskell type for GLchar" >&5
-$as_echo_n "checking Haskell type for GLchar... " >&6; }
-if test "${fptools_cv_htype_GLchar+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  fptools_cv_htype_sup_GLchar=yes
-fp_check_htype_save_cppflags="$CPPFLAGS"
-CPPFLAGS="$CPPFLAGS $X_CFLAGS"
-if test "$cross_compiling" = yes; then
-  fptools_cv_htype_GLchar=NotReallyATypeCross; fptools_cv_htype_sup_GLchar=no
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <stdio.h>
-#include <stddef.h>
-
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#if HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-
-#if HAVE_FCNTL_H
-# include <fcntl.h>
-#endif
-
-#if HAVE_SIGNAL_H
-# include <signal.h>
-#endif
-
-#if HAVE_TIME_H
-# include <time.h>
-#endif
-
-#if HAVE_TERMIOS_H
-# include <termios.h>
-#endif
-
-#if HAVE_STRING_H
-# include <string.h>
-#endif
-
-#if HAVE_CTYPE_H
-# include <ctype.h>
-#endif
-
-#if defined(HAVE_GL_GL_H)
-# include <GL/gl.h>
-#elif defined(HAVE_OPENGL_GL_H)
-# include <OpenGL/gl.h>
-#endif
-
-#if defined(HAVE_AL_AL_H)
-# include <AL/al.h>
-#elif defined(HAVE_OPENAL_AL_H)
-# include <OpenAL/al.h>
-#endif
-
-#if defined(HAVE_AL_ALC_H)
-# include <AL/alc.h>
-#elif defined(HAVE_OPENAL_ALC_H)
-# include <OpenAL/alc.h>
-#endif
-
-#if HAVE_SYS_RESOURCE_H
-# include <sys/resource.h>
-#endif
-
-typedef GLchar testing;
-
-main() {
-  FILE *f=fopen("conftestval", "w");
-  if (!f) exit(1);
-  if (((testing)((int)((testing)1.4))) == ((testing)1.4)) {
-    fprintf(f, "%s%d\n",
-           ((testing)(-1) < (testing)0) ? "Int" : "Word",
-           sizeof(testing)*8);
-  } else {
-    fprintf(f,"%s\n",
-           (sizeof(testing) >  sizeof(double)) ? "LDouble" :
-           (sizeof(testing) == sizeof(double)) ? "Double"  : "Float");
-  }
-  fclose(f);
-  exit(0);
-}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  fptools_cv_htype_GLchar=`cat conftestval`
-else
-  $as_echo "$as_me: program exited with status $ac_status" >&5
-$as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-fptools_cv_htype_GLchar=$fptools_cv_htype_char
-fi
-rm -rf conftest.dSYM
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-
-
-CPPFLAGS="$fp_check_htype_save_cppflags"
-fi
- if test "$fptools_cv_htype_sup_GLchar" = yes; then
-  { $as_echo "$as_me:$LINENO: result: $fptools_cv_htype_GLchar" >&5
-$as_echo "$fptools_cv_htype_GLchar" >&6; }
-
-cat >>confdefs.h <<_ACEOF
-#define HTYPE_GLCHAR $fptools_cv_htype_GLchar
-_ACEOF
-
-else
-  { $as_echo "$as_me:$LINENO: result: not supported" >&5
-$as_echo "not supported" >&6; }
-fi
-
-
-# ... and a similar hack
-{ $as_echo "$as_me:$LINENO: checking Haskell type for ptrdiff_t" >&5
-$as_echo_n "checking Haskell type for ptrdiff_t... " >&6; }
-if test "${fptools_cv_htype_ptrdiff_t+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  fptools_cv_htype_sup_ptrdiff_t=yes
-fp_check_htype_save_cppflags="$CPPFLAGS"
-CPPFLAGS="$CPPFLAGS $X_CFLAGS"
-if test "$cross_compiling" = yes; then
-  fptools_cv_htype_ptrdiff_t=NotReallyATypeCross; fptools_cv_htype_sup_ptrdiff_t=no
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <stdio.h>
-#include <stddef.h>
-
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#if HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-
-#if HAVE_FCNTL_H
-# include <fcntl.h>
-#endif
-
-#if HAVE_SIGNAL_H
-# include <signal.h>
-#endif
-
-#if HAVE_TIME_H
-# include <time.h>
-#endif
-
-#if HAVE_TERMIOS_H
-# include <termios.h>
-#endif
-
-#if HAVE_STRING_H
-# include <string.h>
-#endif
-
-#if HAVE_CTYPE_H
-# include <ctype.h>
-#endif
-
-#if defined(HAVE_GL_GL_H)
-# include <GL/gl.h>
-#elif defined(HAVE_OPENGL_GL_H)
-# include <OpenGL/gl.h>
-#endif
-
-#if defined(HAVE_AL_AL_H)
-# include <AL/al.h>
-#elif defined(HAVE_OPENAL_AL_H)
-# include <OpenAL/al.h>
-#endif
-
-#if defined(HAVE_AL_ALC_H)
-# include <AL/alc.h>
-#elif defined(HAVE_OPENAL_ALC_H)
-# include <OpenAL/alc.h>
-#endif
-
-#if HAVE_SYS_RESOURCE_H
-# include <sys/resource.h>
-#endif
-
-typedef ptrdiff_t testing;
-
-main() {
-  FILE *f=fopen("conftestval", "w");
-  if (!f) exit(1);
-  if (((testing)((int)((testing)1.4))) == ((testing)1.4)) {
-    fprintf(f, "%s%d\n",
-           ((testing)(-1) < (testing)0) ? "Int" : "Word",
-           sizeof(testing)*8);
-  } else {
-    fprintf(f,"%s\n",
-           (sizeof(testing) >  sizeof(double)) ? "LDouble" :
-           (sizeof(testing) == sizeof(double)) ? "Double"  : "Float");
-  }
-  fclose(f);
-  exit(0);
-}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  fptools_cv_htype_ptrdiff_t=`cat conftestval`
-else
-  $as_echo "$as_me: program exited with status $ac_status" >&5
-$as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-fptools_cv_htype_ptrdiff_t=NotReallyAType; fptools_cv_htype_sup_ptrdiff_t=no
-fi
-rm -rf conftest.dSYM
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-
-
-CPPFLAGS="$fp_check_htype_save_cppflags"
-fi
- if test "$fptools_cv_htype_sup_ptrdiff_t" = yes; then
-  { $as_echo "$as_me:$LINENO: result: $fptools_cv_htype_ptrdiff_t" >&5
-$as_echo "$fptools_cv_htype_ptrdiff_t" >&6; }
-
-cat >>confdefs.h <<_ACEOF
-#define HTYPE_PTRDIFF_T $fptools_cv_htype_ptrdiff_t
-_ACEOF
-
-else
-  { $as_echo "$as_me:$LINENO: result: not supported" >&5
-$as_echo "not supported" >&6; }
-fi
-
-{ $as_echo "$as_me:$LINENO: checking Haskell type for GLintptr" >&5
-$as_echo_n "checking Haskell type for GLintptr... " >&6; }
-if test "${fptools_cv_htype_GLintptr+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  fptools_cv_htype_sup_GLintptr=yes
-fp_check_htype_save_cppflags="$CPPFLAGS"
-CPPFLAGS="$CPPFLAGS $X_CFLAGS"
-if test "$cross_compiling" = yes; then
-  fptools_cv_htype_GLintptr=NotReallyATypeCross; fptools_cv_htype_sup_GLintptr=no
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <stdio.h>
-#include <stddef.h>
-
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#if HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-
-#if HAVE_FCNTL_H
-# include <fcntl.h>
-#endif
-
-#if HAVE_SIGNAL_H
-# include <signal.h>
-#endif
-
-#if HAVE_TIME_H
-# include <time.h>
-#endif
-
-#if HAVE_TERMIOS_H
-# include <termios.h>
-#endif
-
-#if HAVE_STRING_H
-# include <string.h>
-#endif
-
-#if HAVE_CTYPE_H
-# include <ctype.h>
-#endif
-
-#if defined(HAVE_GL_GL_H)
-# include <GL/gl.h>
-#elif defined(HAVE_OPENGL_GL_H)
-# include <OpenGL/gl.h>
-#endif
-
-#if defined(HAVE_AL_AL_H)
-# include <AL/al.h>
-#elif defined(HAVE_OPENAL_AL_H)
-# include <OpenAL/al.h>
-#endif
-
-#if defined(HAVE_AL_ALC_H)
-# include <AL/alc.h>
-#elif defined(HAVE_OPENAL_ALC_H)
-# include <OpenAL/alc.h>
-#endif
-
-#if HAVE_SYS_RESOURCE_H
-# include <sys/resource.h>
-#endif
-
-typedef GLintptr testing;
-
-main() {
-  FILE *f=fopen("conftestval", "w");
-  if (!f) exit(1);
-  if (((testing)((int)((testing)1.4))) == ((testing)1.4)) {
-    fprintf(f, "%s%d\n",
-           ((testing)(-1) < (testing)0) ? "Int" : "Word",
-           sizeof(testing)*8);
-  } else {
-    fprintf(f,"%s\n",
-           (sizeof(testing) >  sizeof(double)) ? "LDouble" :
-           (sizeof(testing) == sizeof(double)) ? "Double"  : "Float");
-  }
-  fclose(f);
-  exit(0);
-}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  fptools_cv_htype_GLintptr=`cat conftestval`
-else
-  $as_echo "$as_me: program exited with status $ac_status" >&5
-$as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-fptools_cv_htype_GLintptr=$fptools_cv_htype_ptrdiff_t
-fi
-rm -rf conftest.dSYM
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-
-
-CPPFLAGS="$fp_check_htype_save_cppflags"
-fi
- if test "$fptools_cv_htype_sup_GLintptr" = yes; then
-  { $as_echo "$as_me:$LINENO: result: $fptools_cv_htype_GLintptr" >&5
-$as_echo "$fptools_cv_htype_GLintptr" >&6; }
-
-cat >>confdefs.h <<_ACEOF
-#define HTYPE_GLINTPTR $fptools_cv_htype_GLintptr
-_ACEOF
-
-else
-  { $as_echo "$as_me:$LINENO: result: not supported" >&5
-$as_echo "not supported" >&6; }
-fi
-
-{ $as_echo "$as_me:$LINENO: checking Haskell type for GLsizeiptr" >&5
-$as_echo_n "checking Haskell type for GLsizeiptr... " >&6; }
-if test "${fptools_cv_htype_GLsizeiptr+set}" = set; then
-  $as_echo_n "(cached) " >&6
-else
-  fptools_cv_htype_sup_GLsizeiptr=yes
-fp_check_htype_save_cppflags="$CPPFLAGS"
-CPPFLAGS="$CPPFLAGS $X_CFLAGS"
-if test "$cross_compiling" = yes; then
-  fptools_cv_htype_GLsizeiptr=NotReallyATypeCross; fptools_cv_htype_sup_GLsizeiptr=no
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <stdio.h>
-#include <stddef.h>
-
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#if HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-
-#if HAVE_FCNTL_H
-# include <fcntl.h>
-#endif
-
-#if HAVE_SIGNAL_H
-# include <signal.h>
-#endif
-
-#if HAVE_TIME_H
-# include <time.h>
-#endif
-
-#if HAVE_TERMIOS_H
-# include <termios.h>
-#endif
-
-#if HAVE_STRING_H
-# include <string.h>
-#endif
-
-#if HAVE_CTYPE_H
-# include <ctype.h>
-#endif
-
-#if defined(HAVE_GL_GL_H)
-# include <GL/gl.h>
-#elif defined(HAVE_OPENGL_GL_H)
-# include <OpenGL/gl.h>
-#endif
-
-#if defined(HAVE_AL_AL_H)
-# include <AL/al.h>
-#elif defined(HAVE_OPENAL_AL_H)
-# include <OpenAL/al.h>
-#endif
-
-#if defined(HAVE_AL_ALC_H)
-# include <AL/alc.h>
-#elif defined(HAVE_OPENAL_ALC_H)
-# include <OpenAL/alc.h>
-#endif
-
-#if HAVE_SYS_RESOURCE_H
-# include <sys/resource.h>
-#endif
-
-typedef GLsizeiptr testing;
-
-main() {
-  FILE *f=fopen("conftestval", "w");
-  if (!f) exit(1);
-  if (((testing)((int)((testing)1.4))) == ((testing)1.4)) {
-    fprintf(f, "%s%d\n",
-           ((testing)(-1) < (testing)0) ? "Int" : "Word",
-           sizeof(testing)*8);
-  } else {
-    fprintf(f,"%s\n",
-           (sizeof(testing) >  sizeof(double)) ? "LDouble" :
-           (sizeof(testing) == sizeof(double)) ? "Double"  : "Float");
-  }
-  fclose(f);
-  exit(0);
-}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
-$as_echo "$ac_try_echo") >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  fptools_cv_htype_GLsizeiptr=`cat conftestval`
-else
-  $as_echo "$as_me: program exited with status $ac_status" >&5
-$as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-fptools_cv_htype_GLsizeiptr=$fptools_cv_htype_ptrdiff_t
-fi
-rm -rf conftest.dSYM
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-
-
-CPPFLAGS="$fp_check_htype_save_cppflags"
-fi
- if test "$fptools_cv_htype_sup_GLsizeiptr" = yes; then
-  { $as_echo "$as_me:$LINENO: result: $fptools_cv_htype_GLsizeiptr" >&5
-$as_echo "$fptools_cv_htype_GLsizeiptr" >&6; }
-
-cat >>confdefs.h <<_ACEOF
-#define HTYPE_GLSIZEIPTR $fptools_cv_htype_GLsizeiptr
-_ACEOF
-
-else
-  { $as_echo "$as_me:$LINENO: result: not supported" >&5
-$as_echo "not supported" >&6; }
-fi
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define GLU_CFLAGS `echo '' $GLU_CFLAGS | sed -e 's/-[^ ]*/,"&"/g' -e 's/^ *,//'`
-_ACEOF
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define GLU_LIBS `echo '' $GLU_LIBS | sed -e 's/-[^ ]*/,"&"/g' -e 's/^ *,//'`
-_ACEOF
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define GLU_FRAMEWORKS `echo '' $GLU_FRAMEWORKS | sed -e 's/-[^ ]*/,"&"/g' -e 's/^ *,//'`
-_ACEOF
-
-
-fi
-
-if test x"$GL_BUILD_PACKAGE" = xyes; then
-  BUILD_PACKAGE_BOOL=True
-else
-  BUILD_PACKAGE_BOOL=False
-fi
-
-
-case "$host" in
-*-mingw32) CALLCONV=stdcall ;;
-*)	CALLCONV=ccall ;;
-esac
-
-
-ac_config_files="$ac_config_files OpenGL.buildinfo"
-
-cat >confcache <<\_ACEOF
-# This file is a shell script that caches the results of configure
-# tests run on this system so they can be shared between configure
-# scripts and configure runs, see configure's option --config-cache.
-# It is not useful on other systems.  If it contains results you don't
-# want to keep, you may remove or edit it.
-#
-# config.status only pays attention to the cache file if you give it
-# the --recheck option to rerun configure.
-#
-# `ac_cv_env_foo' variables (set or unset) will be overridden when
-# loading this file, other *unset* `ac_cv_foo' will be assigned the
-# following values.
-
-_ACEOF
-
-# The following way of writing the cache mishandles newlines in values,
-# but we know of no workaround that is simple, portable, and efficient.
-# So, we kill variables containing newlines.
-# Ultrix sh set writes to stderr and can't be redirected directly,
-# and sets the high bit in the cache file unless we assign to the vars.
-(
-  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
-    eval ac_val=\$$ac_var
-    case $ac_val in #(
-    *${as_nl}*)
-      case $ac_var in #(
-      *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
-      esac
-      case $ac_var in #(
-      _ | IFS | as_nl) ;; #(
-      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
-      *) $as_unset $ac_var ;;
-      esac ;;
-    esac
-  done
-
-  (set) 2>&1 |
-    case $as_nl`(ac_space=' '; set) 2>&1` in #(
-    *${as_nl}ac_space=\ *)
-      # `set' does not quote correctly, so add quotes (double-quote
-      # substitution turns \\\\ into \\, and sed turns \\ into \).
-      sed -n \
-	"s/'/'\\\\''/g;
-	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
-      ;; #(
-    *)
-      # `set' quotes correctly as required by POSIX, so do not add quotes.
-      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
-      ;;
-    esac |
-    sort
-) |
-  sed '
-     /^ac_cv_env_/b end
-     t clear
-     :clear
-     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
-     t end
-     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
-     :end' >>confcache
-if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
-  if test -w "$cache_file"; then
-    test "x$cache_file" != "x/dev/null" &&
-      { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5
-$as_echo "$as_me: updating cache $cache_file" >&6;}
-    cat confcache >$cache_file
-  else
-    { $as_echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5
-$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
-  fi
-fi
-rm -f confcache
-
-test "x$prefix" = xNONE && prefix=$ac_default_prefix
-# Let make expand exec_prefix.
-test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
-
-DEFS=-DHAVE_CONFIG_H
-
-ac_libobjs=
-ac_ltlibobjs=
-for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
-  # 1. Remove the extension, and $U if already installed.
-  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
-  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
-  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
-  #    will be set to the directory where LIBOBJS objects are built.
-  ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext"
-  ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo'
-done
-LIBOBJS=$ac_libobjs
-
-LTLIBOBJS=$ac_ltlibobjs
-
-
-
-: ${CONFIG_STATUS=./config.status}
-ac_write_fail=0
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-{ $as_echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
-$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
-cat >$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-#! $SHELL
-# Generated by $as_me.
-# Run this file to recreate the current configuration.
-# Compiler output produced by configure, useful for debugging
-# configure, is in config.log if it exists.
-
-debug=false
-ac_cs_recheck=false
-ac_cs_silent=false
-SHELL=\${CONFIG_SHELL-$SHELL}
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-## --------------------- ##
-## M4sh Initialization.  ##
-## --------------------- ##
-
-# Be more Bourne compatible
-DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-  setopt NO_GLOB_SUBST
-else
-  case `(set -o) 2>/dev/null` in
-  *posix*) set -o posix ;;
-esac
-
-fi
-
-
-
-
-# PATH needs CR
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
-as_nl='
-'
-export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='printf %s\n'
-  as_echo_n='printf %s'
-else
-  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
-    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
-    as_echo_n='/usr/ucb/echo -n'
-  else
-    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
-    as_echo_n_body='eval
-      arg=$1;
-      case $arg in
-      *"$as_nl"*)
-	expr "X$arg" : "X\\(.*\\)$as_nl";
-	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
-      esac;
-      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
-    '
-    export as_echo_n_body
-    as_echo_n='sh -c $as_echo_n_body as_echo'
-  fi
-  export as_echo_body
-  as_echo='sh -c $as_echo_body as_echo'
-fi
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  PATH_SEPARATOR=:
-  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
-    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
-      PATH_SEPARATOR=';'
-  }
-fi
-
-# Support unset when possible.
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  as_unset=unset
-else
-  as_unset=false
-fi
-
-
-# IFS
-# We need space, tab and new line, in precisely that order.  Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" ""	$as_nl"
-
-# Find who we are.  Look in the path if we contain no directory separator.
-case $0 in
-  *[\\/]* ) as_myself=$0 ;;
-  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-done
-IFS=$as_save_IFS
-
-     ;;
-esac
-# We did not find ourselves, most probably we were run as `sh COMMAND'
-# in which case we are not to be found in the path.
-if test "x$as_myself" = x; then
-  as_myself=$0
-fi
-if test ! -f "$as_myself"; then
-  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
-  { (exit 1); exit 1; }
-fi
-
-# Work around bugs in pre-3.0 UWIN ksh.
-for as_var in ENV MAIL MAILPATH
-do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# Required to use basename.
-if expr a : '\(a\)' >/dev/null 2>&1 &&
-   test "X`expr 00001 : '.*\(...\)'`" = X001; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
-  as_basename=basename
-else
-  as_basename=false
-fi
-
-
-# Name of the executable.
-as_me=`$as_basename -- "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-
-# CDPATH.
-$as_unset CDPATH
-
-
-
-  as_lineno_1=$LINENO
-  as_lineno_2=$LINENO
-  test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
-
-  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
-  # uniformly replaced by the line number.  The first 'sed' inserts a
-  # line-number line after each line using $LINENO; the second 'sed'
-  # does the real work.  The second script uses 'N' to pair each
-  # line-number line with the line containing $LINENO, and appends
-  # trailing '-' during substitution so that $LINENO is not a special
-  # case at line end.
-  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
-  # scripts with optimization help from Paolo Bonzini.  Blame Lee
-  # E. McMahon (1931-1989) for sed's syntax.  :-)
-  sed -n '
-    p
-    /[$]LINENO/=
-  ' <$as_myself |
-    sed '
-      s/[$]LINENO.*/&-/
-      t lineno
-      b
-      :lineno
-      N
-      :loop
-      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
-      t loop
-      s/-\n.*//
-    ' >$as_me.lineno &&
-  chmod +x "$as_me.lineno" ||
-    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
-   { (exit 1); exit 1; }; }
-
-  # Don't try to exec as it changes $[0], causing all sort of problems
-  # (the dirname of $[0] is not the place where we might find the
-  # original and so on.  Autoconf is especially sensitive to this).
-  . "./$as_me.lineno"
-  # Exit status is that of the last command.
-  exit
-}
-
-
-if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
-  as_dirname=dirname
-else
-  as_dirname=false
-fi
-
-ECHO_C= ECHO_N= ECHO_T=
-case `echo -n x` in
--n*)
-  case `echo 'x\c'` in
-  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
-  *)   ECHO_C='\c';;
-  esac;;
-*)
-  ECHO_N='-n';;
-esac
-if expr a : '\(a\)' >/dev/null 2>&1 &&
-   test "X`expr 00001 : '.*\(...\)'`" = X001; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-rm -f conf$$ conf$$.exe conf$$.file
-if test -d conf$$.dir; then
-  rm -f conf$$.dir/conf$$.file
-else
-  rm -f conf$$.dir
-  mkdir conf$$.dir 2>/dev/null
-fi
-if (echo >conf$$.file) 2>/dev/null; then
-  if ln -s conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s='ln -s'
-    # ... but there are two gotchas:
-    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
-    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
-    # In both cases, we have to default to `cp -p'.
-    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
-      as_ln_s='cp -p'
-  elif ln conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s=ln
-  else
-    as_ln_s='cp -p'
-  fi
-else
-  as_ln_s='cp -p'
-fi
-rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
-rmdir conf$$.dir 2>/dev/null
-
-if mkdir -p . 2>/dev/null; then
-  as_mkdir_p=:
-else
-  test -d ./-p && rmdir ./-p
-  as_mkdir_p=false
-fi
-
-if test -x / >/dev/null 2>&1; then
-  as_test_x='test -x'
-else
-  if ls -dL / >/dev/null 2>&1; then
-    as_ls_L_option=L
-  else
-    as_ls_L_option=
-  fi
-  as_test_x='
-    eval sh -c '\''
-      if test -d "$1"; then
-	test -d "$1/.";
-      else
-	case $1 in
-	-*)set "./$1";;
-	esac;
-	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
-	???[sx]*):;;*)false;;esac;fi
-    '\'' sh
-  '
-fi
-as_executable_p=$as_test_x
-
-# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
-
-# Sed expression to map a string onto a valid variable name.
-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
-
-
-exec 6>&1
-
-# Save the log message, to keep $[0] and so on meaningful, and to
-# report actual input values of CONFIG_FILES etc. instead of their
-# values after options handling.
-ac_log="
-This file was extended by Haskell OpenGL package $as_me 2.2.3.0, which was
-generated by GNU Autoconf 2.63.  Invocation command line was
-
-  CONFIG_FILES    = $CONFIG_FILES
-  CONFIG_HEADERS  = $CONFIG_HEADERS
-  CONFIG_LINKS    = $CONFIG_LINKS
-  CONFIG_COMMANDS = $CONFIG_COMMANDS
-  $ $0 $@
-
-on `(hostname || uname -n) 2>/dev/null | sed 1q`
-"
-
-_ACEOF
-
-case $ac_config_files in *"
-"*) set x $ac_config_files; shift; ac_config_files=$*;;
-esac
-
-case $ac_config_headers in *"
-"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
-esac
-
-
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-# Files that config.status was made for.
-config_files="$ac_config_files"
-config_headers="$ac_config_headers"
-
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-ac_cs_usage="\
-\`$as_me' instantiates files from templates according to the
-current configuration.
-
-Usage: $0 [OPTION]... [FILE]...
-
-  -h, --help       print this help, then exit
-  -V, --version    print version number and configuration settings, then exit
-  -q, --quiet, --silent
-                   do not print progress messages
-  -d, --debug      don't remove temporary files
-      --recheck    update $as_me by reconfiguring in the same conditions
-      --file=FILE[:TEMPLATE]
-                   instantiate the configuration file FILE
-      --header=FILE[:TEMPLATE]
-                   instantiate the configuration header FILE
-
-Configuration files:
-$config_files
-
-Configuration headers:
-$config_headers
-
-Report bugs to <bug-autoconf@gnu.org>."
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-ac_cs_version="\\
-Haskell OpenGL package config.status 2.2.3.0
-configured by $0, generated by GNU Autoconf 2.63,
-  with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
-
-Copyright (C) 2008 Free Software Foundation, Inc.
-This config.status script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it."
-
-ac_pwd='$ac_pwd'
-srcdir='$srcdir'
-test -n "\$AWK" || AWK=awk
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-# The default lists apply if the user does not specify any file.
-ac_need_defaults=:
-while test $# != 0
-do
-  case $1 in
-  --*=*)
-    ac_option=`expr "X$1" : 'X\([^=]*\)='`
-    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
-    ac_shift=:
-    ;;
-  *)
-    ac_option=$1
-    ac_optarg=$2
-    ac_shift=shift
-    ;;
-  esac
-
-  case $ac_option in
-  # Handling of the options.
-  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
-    ac_cs_recheck=: ;;
-  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
-    $as_echo "$ac_cs_version"; exit ;;
-  --debug | --debu | --deb | --de | --d | -d )
-    debug=: ;;
-  --file | --fil | --fi | --f )
-    $ac_shift
-    case $ac_optarg in
-    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
-    esac
-    CONFIG_FILES="$CONFIG_FILES '$ac_optarg'"
-    ac_need_defaults=false;;
-  --header | --heade | --head | --hea )
-    $ac_shift
-    case $ac_optarg in
-    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
-    esac
-    CONFIG_HEADERS="$CONFIG_HEADERS '$ac_optarg'"
-    ac_need_defaults=false;;
-  --he | --h)
-    # Conflict between --help and --header
-    { $as_echo "$as_me: error: ambiguous option: $1
-Try \`$0 --help' for more information." >&2
-   { (exit 1); exit 1; }; };;
-  --help | --hel | -h )
-    $as_echo "$ac_cs_usage"; exit ;;
-  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-  | -silent | --silent | --silen | --sile | --sil | --si | --s)
-    ac_cs_silent=: ;;
-
-  # This is an error.
-  -*) { $as_echo "$as_me: error: unrecognized option: $1
-Try \`$0 --help' for more information." >&2
-   { (exit 1); exit 1; }; } ;;
-
-  *) ac_config_targets="$ac_config_targets $1"
-     ac_need_defaults=false ;;
-
-  esac
-  shift
-done
-
-ac_configure_extra_args=
-
-if $ac_cs_silent; then
-  exec 6>/dev/null
-  ac_configure_extra_args="$ac_configure_extra_args --silent"
-fi
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-if \$ac_cs_recheck; then
-  set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
-  shift
-  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
-  CONFIG_SHELL='$SHELL'
-  export CONFIG_SHELL
-  exec "\$@"
-fi
-
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-exec 5>>config.log
-{
-  echo
-  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
-## Running $as_me. ##
-_ASBOX
-  $as_echo "$ac_log"
-} >&5
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-
-# Handling of arguments.
-for ac_config_target in $ac_config_targets
-do
-  case $ac_config_target in
-    "include/HsOpenGLConfig.h") CONFIG_HEADERS="$CONFIG_HEADERS include/HsOpenGLConfig.h" ;;
-    "include/HsOpenGL.h") CONFIG_HEADERS="$CONFIG_HEADERS include/HsOpenGL.h" ;;
-    "OpenGL.buildinfo") CONFIG_FILES="$CONFIG_FILES OpenGL.buildinfo" ;;
-
-  *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
-$as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
-   { (exit 1); exit 1; }; };;
-  esac
-done
-
-
-# If the user did not use the arguments to specify the items to instantiate,
-# then the envvar interface is used.  Set only those that are not.
-# We use the long form for the default assignment because of an extremely
-# bizarre bug on SunOS 4.1.3.
-if $ac_need_defaults; then
-  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
-  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
-fi
-
-# Have a temporary directory for convenience.  Make it in the build tree
-# simply because there is no reason against having it here, and in addition,
-# creating and moving files from /tmp can sometimes cause problems.
-# Hook for its removal unless debugging.
-# Note that there is a small window in which the directory will not be cleaned:
-# after its creation but before its name has been assigned to `$tmp'.
-$debug ||
-{
-  tmp=
-  trap 'exit_status=$?
-  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
-' 0
-  trap '{ (exit 1); exit 1; }' 1 2 13 15
-}
-# Create a (secure) tmp directory for tmp files.
-
-{
-  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
-  test -n "$tmp" && test -d "$tmp"
-}  ||
-{
-  tmp=./conf$$-$RANDOM
-  (umask 077 && mkdir "$tmp")
-} ||
-{
-   $as_echo "$as_me: cannot create a temporary directory in ." >&2
-   { (exit 1); exit 1; }
-}
-
-# Set up the scripts for CONFIG_FILES section.
-# No need to generate them if there are no CONFIG_FILES.
-# This happens for instance with `./config.status config.h'.
-if test -n "$CONFIG_FILES"; then
-
-
-ac_cr=''
-ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
-if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
-  ac_cs_awk_cr='\\r'
-else
-  ac_cs_awk_cr=$ac_cr
-fi
-
-echo 'BEGIN {' >"$tmp/subs1.awk" &&
-_ACEOF
-
-
-{
-  echo "cat >conf$$subs.awk <<_ACEOF" &&
-  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
-  echo "_ACEOF"
-} >conf$$subs.sh ||
-  { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
-$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
-   { (exit 1); exit 1; }; }
-ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'`
-ac_delim='%!_!# '
-for ac_last_try in false false false false false :; do
-  . ./conf$$subs.sh ||
-    { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
-$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
-   { (exit 1); exit 1; }; }
-
-  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
-  if test $ac_delim_n = $ac_delim_num; then
-    break
-  elif $ac_last_try; then
-    { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
-$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
-   { (exit 1); exit 1; }; }
-  else
-    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
-  fi
-done
-rm -f conf$$subs.sh
-
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-cat >>"\$tmp/subs1.awk" <<\\_ACAWK &&
-_ACEOF
-sed -n '
-h
-s/^/S["/; s/!.*/"]=/
-p
-g
-s/^[^!]*!//
-:repl
-t repl
-s/'"$ac_delim"'$//
-t delim
-:nl
-h
-s/\(.\{148\}\).*/\1/
-t more1
-s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
-p
-n
-b repl
-:more1
-s/["\\]/\\&/g; s/^/"/; s/$/"\\/
-p
-g
-s/.\{148\}//
-t nl
-:delim
-h
-s/\(.\{148\}\).*/\1/
-t more2
-s/["\\]/\\&/g; s/^/"/; s/$/"/
-p
-b
-:more2
-s/["\\]/\\&/g; s/^/"/; s/$/"\\/
-p
-g
-s/.\{148\}//
-t delim
-' <conf$$subs.awk | sed '
-/^[^""]/{
-  N
-  s/\n//
-}
-' >>$CONFIG_STATUS || ac_write_fail=1
-rm -f conf$$subs.awk
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-_ACAWK
-cat >>"\$tmp/subs1.awk" <<_ACAWK &&
-  for (key in S) S_is_set[key] = 1
-  FS = ""
-
-}
-{
-  line = $ 0
-  nfields = split(line, field, "@")
-  substed = 0
-  len = length(field[1])
-  for (i = 2; i < nfields; i++) {
-    key = field[i]
-    keylen = length(key)
-    if (S_is_set[key]) {
-      value = S[key]
-      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
-      len += length(value) + length(field[++i])
-      substed = 1
-    } else
-      len += 1 + keylen
-  }
-
-  print line
-}
-
-_ACAWK
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
-  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
-else
-  cat
-fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \
-  || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5
-$as_echo "$as_me: error: could not setup config files machinery" >&2;}
-   { (exit 1); exit 1; }; }
-_ACEOF
-
-# VPATH may cause trouble with some makes, so we remove $(srcdir),
-# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
-# trailing colons and then remove the whole line if VPATH becomes empty
-# (actually we leave an empty line to preserve line numbers).
-if test "x$srcdir" = x.; then
-  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
-s/:*\$(srcdir):*/:/
-s/:*\${srcdir}:*/:/
-s/:*@srcdir@:*/:/
-s/^\([^=]*=[	 ]*\):*/\1/
-s/:*$//
-s/^[^=]*=[	 ]*$//
-}'
-fi
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-fi # test -n "$CONFIG_FILES"
-
-# Set up the scripts for CONFIG_HEADERS section.
-# No need to generate them if there are no CONFIG_HEADERS.
-# This happens for instance with `./config.status Makefile'.
-if test -n "$CONFIG_HEADERS"; then
-cat >"$tmp/defines.awk" <<\_ACAWK ||
-BEGIN {
-_ACEOF
-
-# Transform confdefs.h into an awk script `defines.awk', embedded as
-# here-document in config.status, that substitutes the proper values into
-# config.h.in to produce config.h.
-
-# Create a delimiter string that does not exist in confdefs.h, to ease
-# handling of long lines.
-ac_delim='%!_!# '
-for ac_last_try in false false :; do
-  ac_t=`sed -n "/$ac_delim/p" confdefs.h`
-  if test -z "$ac_t"; then
-    break
-  elif $ac_last_try; then
-    { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_HEADERS" >&5
-$as_echo "$as_me: error: could not make $CONFIG_HEADERS" >&2;}
-   { (exit 1); exit 1; }; }
-  else
-    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
-  fi
-done
-
-# For the awk script, D is an array of macro values keyed by name,
-# likewise P contains macro parameters if any.  Preserve backslash
-# newline sequences.
-
-ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
-sed -n '
-s/.\{148\}/&'"$ac_delim"'/g
-t rset
-:rset
-s/^[	 ]*#[	 ]*define[	 ][	 ]*/ /
-t def
-d
-:def
-s/\\$//
-t bsnl
-s/["\\]/\\&/g
-s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
-D["\1"]=" \3"/p
-s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2"/p
-d
-:bsnl
-s/["\\]/\\&/g
-s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
-D["\1"]=" \3\\\\\\n"\\/p
-t cont
-s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
-t cont
-d
-:cont
-n
-s/.\{148\}/&'"$ac_delim"'/g
-t clear
-:clear
-s/\\$//
-t bsnlc
-s/["\\]/\\&/g; s/^/"/; s/$/"/p
-d
-:bsnlc
-s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
-b cont
-' <confdefs.h | sed '
-s/'"$ac_delim"'/"\\\
-"/g' >>$CONFIG_STATUS || ac_write_fail=1
-
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-  for (key in D) D_is_set[key] = 1
-  FS = ""
-}
-/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
-  line = \$ 0
-  split(line, arg, " ")
-  if (arg[1] == "#") {
-    defundef = arg[2]
-    mac1 = arg[3]
-  } else {
-    defundef = substr(arg[1], 2)
-    mac1 = arg[2]
-  }
-  split(mac1, mac2, "(") #)
-  macro = mac2[1]
-  prefix = substr(line, 1, index(line, defundef) - 1)
-  if (D_is_set[macro]) {
-    # Preserve the white space surrounding the "#".
-    print prefix "define", macro P[macro] D[macro]
-    next
-  } else {
-    # Replace #undef with comments.  This is necessary, for example,
-    # in the case of _POSIX_SOURCE, which is predefined and required
-    # on some systems where configure will not decide to define it.
-    if (defundef == "undef") {
-      print "/*", prefix defundef, macro, "*/"
-      next
-    }
-  }
-}
-{ print }
-_ACAWK
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-  { { $as_echo "$as_me:$LINENO: error: could not setup config headers machinery" >&5
-$as_echo "$as_me: error: could not setup config headers machinery" >&2;}
-   { (exit 1); exit 1; }; }
-fi # test -n "$CONFIG_HEADERS"
-
-
-eval set X "  :F $CONFIG_FILES  :H $CONFIG_HEADERS    "
-shift
-for ac_tag
-do
-  case $ac_tag in
-  :[FHLC]) ac_mode=$ac_tag; continue;;
-  esac
-  case $ac_mode$ac_tag in
-  :[FHL]*:*);;
-  :L* | :C*:*) { { $as_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5
-$as_echo "$as_me: error: invalid tag $ac_tag" >&2;}
-   { (exit 1); exit 1; }; };;
-  :[FH]-) ac_tag=-:-;;
-  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
-  esac
-  ac_save_IFS=$IFS
-  IFS=:
-  set x $ac_tag
-  IFS=$ac_save_IFS
-  shift
-  ac_file=$1
-  shift
-
-  case $ac_mode in
-  :L) ac_source=$1;;
-  :[FH])
-    ac_file_inputs=
-    for ac_f
-    do
-      case $ac_f in
-      -) ac_f="$tmp/stdin";;
-      *) # Look for the file first in the build tree, then in the source tree
-	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
-	 # because $ac_f cannot contain `:'.
-	 test -f "$ac_f" ||
-	   case $ac_f in
-	   [\\/$]*) false;;
-	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
-	   esac ||
-	   { { $as_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5
-$as_echo "$as_me: error: cannot find input file: $ac_f" >&2;}
-   { (exit 1); exit 1; }; };;
-      esac
-      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
-      ac_file_inputs="$ac_file_inputs '$ac_f'"
-    done
-
-    # Let's still pretend it is `configure' which instantiates (i.e., don't
-    # use $as_me), people would be surprised to read:
-    #    /* config.h.  Generated by config.status.  */
-    configure_input='Generated from '`
-	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
-	`' by configure.'
-    if test x"$ac_file" != x-; then
-      configure_input="$ac_file.  $configure_input"
-      { $as_echo "$as_me:$LINENO: creating $ac_file" >&5
-$as_echo "$as_me: creating $ac_file" >&6;}
-    fi
-    # Neutralize special characters interpreted by sed in replacement strings.
-    case $configure_input in #(
-    *\&* | *\|* | *\\* )
-       ac_sed_conf_input=`$as_echo "$configure_input" |
-       sed 's/[\\\\&|]/\\\\&/g'`;; #(
-    *) ac_sed_conf_input=$configure_input;;
-    esac
-
-    case $ac_tag in
-    *:-:* | *:-) cat >"$tmp/stdin" \
-      || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
-$as_echo "$as_me: error: could not create $ac_file" >&2;}
-   { (exit 1); exit 1; }; } ;;
-    esac
-    ;;
-  esac
-
-  ac_dir=`$as_dirname -- "$ac_file" ||
-$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ac_file" : 'X\(//\)[^/]' \| \
-	 X"$ac_file" : 'X\(//\)$' \| \
-	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$ac_file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-  { as_dir="$ac_dir"
-  case $as_dir in #(
-  -*) as_dir=./$as_dir;;
-  esac
-  test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
-    as_dirs=
-    while :; do
-      case $as_dir in #(
-      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
-      *) as_qdir=$as_dir;;
-      esac
-      as_dirs="'$as_qdir' $as_dirs"
-      as_dir=`$as_dirname -- "$as_dir" ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-      test -d "$as_dir" && break
-    done
-    test -z "$as_dirs" || eval "mkdir $as_dirs"
-  } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
-$as_echo "$as_me: error: cannot create directory $as_dir" >&2;}
-   { (exit 1); exit 1; }; }; }
-  ac_builddir=.
-
-case "$ac_dir" in
-.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
-*)
-  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
-  # A ".." for each directory in $ac_dir_suffix.
-  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
-  case $ac_top_builddir_sub in
-  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
-  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
-  esac ;;
-esac
-ac_abs_top_builddir=$ac_pwd
-ac_abs_builddir=$ac_pwd$ac_dir_suffix
-# for backward compatibility:
-ac_top_builddir=$ac_top_build_prefix
-
-case $srcdir in
-  .)  # We are building in place.
-    ac_srcdir=.
-    ac_top_srcdir=$ac_top_builddir_sub
-    ac_abs_top_srcdir=$ac_pwd ;;
-  [\\/]* | ?:[\\/]* )  # Absolute name.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir
-    ac_abs_top_srcdir=$srcdir ;;
-  *) # Relative name.
-    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_build_prefix$srcdir
-    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
-esac
-ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
-
-
-  case $ac_mode in
-  :F)
-  #
-  # CONFIG_FILE
-  #
-
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-# If the template does not know about datarootdir, expand it.
-# FIXME: This hack should be removed a few years after 2.60.
-ac_datarootdir_hack=; ac_datarootdir_seen=
-
-ac_sed_dataroot='
-/datarootdir/ {
-  p
-  q
-}
-/@datadir@/p
-/@docdir@/p
-/@infodir@/p
-/@localedir@/p
-/@mandir@/p
-'
-case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
-*datarootdir*) ac_datarootdir_seen=yes;;
-*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
-  { $as_echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
-$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-  ac_datarootdir_hack='
-  s&@datadir@&$datadir&g
-  s&@docdir@&$docdir&g
-  s&@infodir@&$infodir&g
-  s&@localedir@&$localedir&g
-  s&@mandir@&$mandir&g
-    s&\\\${datarootdir}&$datarootdir&g' ;;
-esac
-_ACEOF
-
-# Neutralize VPATH when `$srcdir' = `.'.
-# Shell code in configure.ac might set extrasub.
-# FIXME: do we really want to maintain this feature?
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-ac_sed_extra="$ac_vpsub
-$extrasub
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-:t
-/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
-s|@configure_input@|$ac_sed_conf_input|;t t
-s&@top_builddir@&$ac_top_builddir_sub&;t t
-s&@top_build_prefix@&$ac_top_build_prefix&;t t
-s&@srcdir@&$ac_srcdir&;t t
-s&@abs_srcdir@&$ac_abs_srcdir&;t t
-s&@top_srcdir@&$ac_top_srcdir&;t t
-s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
-s&@builddir@&$ac_builddir&;t t
-s&@abs_builddir@&$ac_abs_builddir&;t t
-s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
-$ac_datarootdir_hack
-"
-eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \
-  || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
-$as_echo "$as_me: error: could not create $ac_file" >&2;}
-   { (exit 1); exit 1; }; }
-
-test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
-  { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
-  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
-  { $as_echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir'
-which seems to be undefined.  Please make sure it is defined." >&5
-$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
-which seems to be undefined.  Please make sure it is defined." >&2;}
-
-  rm -f "$tmp/stdin"
-  case $ac_file in
-  -) cat "$tmp/out" && rm -f "$tmp/out";;
-  *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";;
-  esac \
-  || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
-$as_echo "$as_me: error: could not create $ac_file" >&2;}
-   { (exit 1); exit 1; }; }
- ;;
-  :H)
-  #
-  # CONFIG_HEADER
-  #
-  if test x"$ac_file" != x-; then
-    {
-      $as_echo "/* $configure_input  */" \
-      && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs"
-    } >"$tmp/config.h" \
-      || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
-$as_echo "$as_me: error: could not create $ac_file" >&2;}
-   { (exit 1); exit 1; }; }
-    if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then
-      { $as_echo "$as_me:$LINENO: $ac_file is unchanged" >&5
-$as_echo "$as_me: $ac_file is unchanged" >&6;}
-    else
-      rm -f "$ac_file"
-      mv "$tmp/config.h" "$ac_file" \
-	|| { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
-$as_echo "$as_me: error: could not create $ac_file" >&2;}
-   { (exit 1); exit 1; }; }
-    fi
-  else
-    $as_echo "/* $configure_input  */" \
-      && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \
-      || { { $as_echo "$as_me:$LINENO: error: could not create -" >&5
-$as_echo "$as_me: error: could not create -" >&2;}
-   { (exit 1); exit 1; }; }
-  fi
- ;;
-
-
-  esac
-
-done # for ac_tag
-
-
-{ (exit 0); exit 0; }
-_ACEOF
-chmod +x $CONFIG_STATUS
-ac_clean_files=$ac_clean_files_save
-
-test $ac_write_fail = 0 ||
-  { { $as_echo "$as_me:$LINENO: error: write failure creating $CONFIG_STATUS" >&5
-$as_echo "$as_me: error: write failure creating $CONFIG_STATUS" >&2;}
-   { (exit 1); exit 1; }; }
-
-
-# configure is writing to config.log, and then calls config.status.
-# config.status does its own redirection, appending to config.log.
-# Unfortunately, on DOS this fails, as config.log is still kept open
-# by configure, so config.status won't be able to write to it; its
-# output is simply discarded.  So we exec the FD to /dev/null,
-# effectively closing config.log, so it can be properly (re)opened and
-# appended to by config.status.  When coming back to configure, we
-# need to make the FD available again.
-if test "$no_create" != yes; then
-  ac_cs_success=:
-  ac_config_status_args=
-  test "$silent" = yes &&
-    ac_config_status_args="$ac_config_status_args --quiet"
-  exec 5>/dev/null
-  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
-  exec 5>>config.log
-  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
-  # would make configure fail if this is the last instruction.
-  $ac_cs_success || { (exit 1); exit 1; }
-fi
-if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
-  { $as_echo "$as_me:$LINENO: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
-$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
-fi
-
diff --git a/configure.ac b/configure.ac
deleted file mode 100644
--- a/configure.ac
+++ /dev/null
@@ -1,97 +0,0 @@
-AC_INIT([Haskell OpenGL package], [2.2.3.0], [sven.panne@aedion.de], [OpenGL])
-
-# Safety check: Ensure that we are in the correct source directory.
-AC_CONFIG_SRCDIR([include/HsOpenGL.h.in])
-
-# The first file mentioned below will be generated by autoheader and contains
-# defines which are needed during package build time only. The second header
-# contains all kinds of stuff which is needed for using this package.
-AC_CONFIG_HEADERS([include/HsOpenGLConfig.h include/HsOpenGL.h])
-
-# we do not really care about this here, but this avoids a warning about an
-# unknown option
-FP_ARG_COMPILER
-
-# We set this to "yes" later when we have found OpenGL libs and headers.
-GL_BUILD_PACKAGE=no
-
-# Shall we build this package at all?
-FP_ARG_OPENGL
-
-if test x"$enable_opengl" != xno; then
-
-# Check for OpenGL include paths and libraries
-FP_CHECK_GLU
-
-if test x"$GLU_LIBS" = xno; then
-  AC_MSG_FAILURE([no OpenGL library found, so this package cannot be built])
-fi
-
-# check for OpenGL include files
-gl_found_header=no
-glu_found_header=no
-fp_save_cppflags="$CPPFLAGS"
-CPPFLAGS="$CPPFLAGS $X_CFLAGS"
-AC_CHECK_HEADERS([GL/gl.h OpenGL/gl.h], [gl_found_header=yes])
-AC_CHECK_HEADERS([GL/glu.h OpenGL/glu.h], [glu_found_header=yes])
-CPPFLAGS="$fp_save_cppflags"
-
-if test x"$gl_found_header" = xno || test x"$glu_found_header" = xno; then
-  AC_MSG_FAILURE([no OpenGL headers found, so this package cannot be built])
-fi
-
-GL_BUILD_PACKAGE=yes
-
-FPTOOLS_CHECK_HTYPE([GLboolean])
-FPTOOLS_CHECK_HTYPE([GLbyte])
-FPTOOLS_CHECK_HTYPE([GLubyte])
-FPTOOLS_CHECK_HTYPE([GLshort])
-FPTOOLS_CHECK_HTYPE([GLushort])
-FPTOOLS_CHECK_HTYPE([GLint])
-FPTOOLS_CHECK_HTYPE([GLuint])
-FPTOOLS_CHECK_HTYPE([GLsizei])
-FPTOOLS_CHECK_HTYPE([GLenum])
-FPTOOLS_CHECK_HTYPE([GLbitfield])
-FPTOOLS_CHECK_HTYPE([GLfloat])
-FPTOOLS_CHECK_HTYPE([GLclampf])
-FPTOOLS_CHECK_HTYPE([GLdouble])
-FPTOOLS_CHECK_HTYPE([GLclampd])
-
-# cruel hack for ancient Windows headers
-FPTOOLS_CHECK_HTYPE([char])
-FPTOOLS_CHECK_HTYPE([GLchar], [$fptools_cv_htype_char])
-
-# ... and a similar hack
-FPTOOLS_CHECK_HTYPE([ptrdiff_t])
-FPTOOLS_CHECK_HTYPE([GLintptr], [$fptools_cv_htype_ptrdiff_t])
-FPTOOLS_CHECK_HTYPE([GLsizeiptr], [$fptools_cv_htype_ptrdiff_t])
-
-AC_DEFINE_UNQUOTED([GLU_CFLAGS],
-  [`echo '' $GLU_CFLAGS | sed -e 's/-[[^ ]]*/,"&"/g' -e 's/^ *,//'`],
-  [C flags for GLU, as a list of string literals.])
-
-AC_DEFINE_UNQUOTED([GLU_LIBS],
-  [`echo '' $GLU_LIBS | sed -e 's/-[[^ ]]*/,"&"/g' -e 's/^ *,//'`],
-  [Library flags for GLU, as a list of string literals.])
-
-AC_DEFINE_UNQUOTED([GLU_FRAMEWORKS],
-  [`echo '' $GLU_FRAMEWORKS | sed -e 's/-[[^ ]]*/,"&"/g' -e 's/^ *,//'`],
-  [Framework flags for GLU, as a list of string literals.])
-
-fi
-
-if test x"$GL_BUILD_PACKAGE" = xyes; then
-  BUILD_PACKAGE_BOOL=True
-else
-  BUILD_PACKAGE_BOOL=False
-fi
-AC_SUBST([BUILD_PACKAGE_BOOL])
-
-case "$host" in
-*-mingw32) CALLCONV=stdcall ;;
-*)	CALLCONV=ccall ;;
-esac
-AC_SUBST([CALLCONV])
-
-AC_CONFIG_FILES([OpenGL.buildinfo])
-AC_OUTPUT
diff --git a/include/HsOpenGL.h b/include/HsOpenGL.h
deleted file mode 100644
--- a/include/HsOpenGL.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/* include/HsOpenGL.h.  Generated from HsOpenGL.h.in by configure.  */
-/* -----------------------------------------------------------------------------
- *
- * Module      :  C support for Graphics.Rendering.OpenGL
- * Copyright   :  (c) Sven Panne 2002-2005
- * License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
- * 
- * Maintainer  :  sven.panne@aedion.de
- * Stability   :  provisional
- * Portability :  portable
- *
- * -------------------------------------------------------------------------- */
-
-#ifndef HSOPENGL_H
-#define HSOPENGL_H
-
-/* Define to 1 if native OpenGL should be used on Mac OS X */
-/* #undef USE_QUARTZ_OPENGL */
-
-#if defined(_WIN32) || defined(__CYGWIN__)
-
-/* for the prototype of wglGetProcAddress */
-#include <windows.h>
-#include <GL/glu.h>
-
-#elif defined(USE_QUARTZ_OPENGL)
-
-#include <OpenGL/glu.h>
-
-#else
-
-/* Hmmm, this seems to be necessary to get a prototype for glXGetProcAddressARB
-   when Mesa is used. Strange... */
-#ifndef GLX_GLXEXT_PROTOTYPES
-#define GLX_GLXEXT_PROTOTYPES
-#endif
-
-#include <GL/glu.h>
-#include <GL/glx.h>
-
-#endif
-
-extern void* hs_OpenGL_getProcAddress(char* procName);
-
-#endif
diff --git a/include/HsOpenGL.h.in b/include/HsOpenGL.h.in
deleted file mode 100644
--- a/include/HsOpenGL.h.in
+++ /dev/null
@@ -1,44 +0,0 @@
-/* -----------------------------------------------------------------------------
- *
- * Module      :  C support for Graphics.Rendering.OpenGL
- * Copyright   :  (c) Sven Panne 2002-2005
- * License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
- * 
- * Maintainer  :  sven.panne@aedion.de
- * Stability   :  provisional
- * Portability :  portable
- *
- * -------------------------------------------------------------------------- */
-
-#ifndef HSOPENGL_H
-#define HSOPENGL_H
-
-/* Define to 1 if native OpenGL should be used on Mac OS X */
-#undef USE_QUARTZ_OPENGL
-
-#if defined(_WIN32) || defined(__CYGWIN__)
-
-/* for the prototype of wglGetProcAddress */
-#include <windows.h>
-#include <GL/glu.h>
-
-#elif defined(USE_QUARTZ_OPENGL)
-
-#include <OpenGL/glu.h>
-
-#else
-
-/* Hmmm, this seems to be necessary to get a prototype for glXGetProcAddressARB
-   when Mesa is used. Strange... */
-#ifndef GLX_GLXEXT_PROTOTYPES
-#define GLX_GLXEXT_PROTOTYPES
-#endif
-
-#include <GL/glu.h>
-#include <GL/glx.h>
-
-#endif
-
-extern void* hs_OpenGL_getProcAddress(char* procName);
-
-#endif
diff --git a/include/HsOpenGLConfig.h.in b/include/HsOpenGLConfig.h.in
deleted file mode 100644
--- a/include/HsOpenGLConfig.h.in
+++ /dev/null
@@ -1,130 +0,0 @@
-/* include/HsOpenGLConfig.h.in.  Generated from configure.ac by autoheader.  */
-
-/* C flags for GLU, as a list of string literals. */
-#undef GLU_CFLAGS
-
-/* Framework flags for GLU, as a list of string literals. */
-#undef GLU_FRAMEWORKS
-
-/* Library flags for GLU, as a list of string literals. */
-#undef GLU_LIBS
-
-/* Define to 1 if you have the <GL/glu.h> header file. */
-#undef HAVE_GL_GLU_H
-
-/* Define to 1 if you have the <GL/gl.h> header file. */
-#undef HAVE_GL_GL_H
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#undef HAVE_INTTYPES_H
-
-/* Define to 1 if you have the <memory.h> header file. */
-#undef HAVE_MEMORY_H
-
-/* Define to 1 if you have the <OpenGL/glu.h> header file. */
-#undef HAVE_OPENGL_GLU_H
-
-/* Define to 1 if you have the <OpenGL/gl.h> header file. */
-#undef HAVE_OPENGL_GL_H
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#undef HAVE_STDINT_H
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#undef HAVE_STDLIB_H
-
-/* Define to 1 if you have the <strings.h> header file. */
-#undef HAVE_STRINGS_H
-
-/* Define to 1 if you have the <string.h> header file. */
-#undef HAVE_STRING_H
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#undef HAVE_SYS_STAT_H
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#undef HAVE_SYS_TYPES_H
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#undef HAVE_UNISTD_H
-
-/* Define to Haskell type for char */
-#undef HTYPE_CHAR
-
-/* Define to Haskell type for GLbitfield */
-#undef HTYPE_GLBITFIELD
-
-/* Define to Haskell type for GLboolean */
-#undef HTYPE_GLBOOLEAN
-
-/* Define to Haskell type for GLbyte */
-#undef HTYPE_GLBYTE
-
-/* Define to Haskell type for GLchar */
-#undef HTYPE_GLCHAR
-
-/* Define to Haskell type for GLclampd */
-#undef HTYPE_GLCLAMPD
-
-/* Define to Haskell type for GLclampf */
-#undef HTYPE_GLCLAMPF
-
-/* Define to Haskell type for GLdouble */
-#undef HTYPE_GLDOUBLE
-
-/* Define to Haskell type for GLenum */
-#undef HTYPE_GLENUM
-
-/* Define to Haskell type for GLfloat */
-#undef HTYPE_GLFLOAT
-
-/* Define to Haskell type for GLint */
-#undef HTYPE_GLINT
-
-/* Define to Haskell type for GLintptr */
-#undef HTYPE_GLINTPTR
-
-/* Define to Haskell type for GLshort */
-#undef HTYPE_GLSHORT
-
-/* Define to Haskell type for GLsizei */
-#undef HTYPE_GLSIZEI
-
-/* Define to Haskell type for GLsizeiptr */
-#undef HTYPE_GLSIZEIPTR
-
-/* Define to Haskell type for GLubyte */
-#undef HTYPE_GLUBYTE
-
-/* Define to Haskell type for GLuint */
-#undef HTYPE_GLUINT
-
-/* Define to Haskell type for GLushort */
-#undef HTYPE_GLUSHORT
-
-/* Define to Haskell type for ptrdiff_t */
-#undef HTYPE_PTRDIFF_T
-
-/* Define to the address where bug reports for this package should be sent. */
-#undef PACKAGE_BUGREPORT
-
-/* Define to the full name of this package. */
-#undef PACKAGE_NAME
-
-/* Define to the full name and version of this package. */
-#undef PACKAGE_STRING
-
-/* Define to the one symbol short name of this package. */
-#undef PACKAGE_TARNAME
-
-/* Define to the version of this package. */
-#undef PACKAGE_VERSION
-
-/* Define to 1 if you have the ANSI C header files. */
-#undef STDC_HEADERS
-
-/* Define to 1 if native OpenGL should be used on Mac OS X */
-#undef USE_QUARTZ_OPENGL
-
-/* Define to 1 if the X Window System is missing or not being used. */
-#undef X_DISPLAY_MISSING
diff --git a/include/HsOpenGLExt.h b/include/HsOpenGLExt.h
deleted file mode 100644
--- a/include/HsOpenGLExt.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/* -----------------------------------------------------------------------------
- *
- * Module      :  GL extension support for Graphics.Rendering.OpenGL
- * Copyright   :  (c) Sven Panne 2002-2005
- * License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
- * 
- * Maintainer  :  sven.panne@aedion.de
- * Stability   :  provisional
- * Portability :  portable
- *
- * This header should only define preprocessor macros!
- *
- * -------------------------------------------------------------------------- */
-
-#ifndef HSOPENGLEXT_H
-#define HSOPENGLEXT_H
-
-/* NOTE: The macro must immediately start with the foreign declaration,
-   otherwise the magic mangler (hack_foreign) in the Hugs build system
-   doesn't recognize it. */
-#define EXTENSION_ENTRY(_msg,_entry,_ty) \
-foreign import CALLCONV unsafe "dynamic" dyn_/**/_entry :: Graphics.Rendering.OpenGL.GL.Extensions.Invoker (_ty) ; \
-_entry :: (_ty) ; \
-_entry = dyn_/**/_entry ptr_/**/_entry ; \
-ptr_/**/_entry :: FunPtr a ; \
-ptr_/**/_entry = unsafePerformIO (Graphics.Rendering.OpenGL.GL.Extensions.getProcAddress (_msg) ("_entry")) ; \
-{-# NOINLINE ptr_/**/_entry #-}
-
-#endif
diff --git a/include/HsOpenGLTypes.h b/include/HsOpenGLTypes.h
deleted file mode 100644
--- a/include/HsOpenGLTypes.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/* -----------------------------------------------------------------------------
- *
- * Module      :  Macros for basic GL types to get better Haddock documentation
- * Copyright   :  (c) Sven Panne 2002-2005
- * License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
- * 
- * Maintainer  :  sven.panne@aedion.de
- * Stability   :  provisional
- * Portability :  portable
- *
- * This header should only define preprocessor macros!
- *
- * -------------------------------------------------------------------------- */
-
-#ifndef HSOPENGLTYPES_H
-#define HSOPENGLTYPES_H
-
-#include "HsOpenGLConfig.h"
-
-/* Using a type synonym in an instance head is not Haskell98, but it is much
-   better for a useful documentation. */
-#ifdef __HADDOCK__
-#define GLbyte_   GLbyte
-#define GLdouble_ GLdouble
-#define GLfloat_  GLfloat
-#define GLint_    GLint
-#define GLshort_  GLshort
-#define GLubyte_  GLubyte
-#define GLuint_   GLuint
-#define GLushort_ GLushort
-#else
-#define GLbyte_   HTYPE_GLBYTE
-#define GLdouble_ HTYPE_GLDOUBLE
-#define GLfloat_  HTYPE_GLFLOAT
-#define GLint_    HTYPE_GLINT
-#define GLshort_  HTYPE_GLSHORT
-#define GLubyte_  HTYPE_GLUBYTE
-#define GLuint_   HTYPE_GLUINT
-#define GLushort_ HTYPE_GLUSHORT
-#endif
-
-#endif
diff --git a/install-sh b/install-sh
deleted file mode 100644
--- a/install-sh
+++ /dev/null
@@ -1,295 +0,0 @@
-#!/bin/sh
-# install - install a program, script, or datafile
-
-scriptversion=2003-09-24.23
-
-# This originates from X11R5 (mit/util/scripts/install.sh), which was
-# later released in X11R6 (xc/config/util/install.sh) with the
-# following copyright and license.
-#
-# Copyright (C) 1994 X Consortium
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to
-# deal in the Software without restriction, including without limitation the
-# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-# sell copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
-# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-# Except as contained in this notice, the name of the X Consortium shall not
-# be used in advertising or otherwise to promote the sale, use or other deal-
-# ings in this Software without prior written authorization from the X Consor-
-# tium.
-#
-#
-# FSF changes to this file are in the public domain.
-#
-# Calling this script install-sh is preferred over install.sh, to prevent
-# `make' implicit rules from creating a file called install from it
-# when there is no Makefile.
-#
-# This script is compatible with the BSD install script, but was written
-# from scratch.  It can only install one file at a time, a restriction
-# shared with many OS's install programs.
-
-# set DOITPROG to echo to test this script
-
-# Don't use :- since 4.3BSD and earlier shells don't like it.
-doit="${DOITPROG-}"
-
-# put in absolute paths if you don't have them in your path; or use env. vars.
-
-mvprog="${MVPROG-mv}"
-cpprog="${CPPROG-cp}"
-chmodprog="${CHMODPROG-chmod}"
-chownprog="${CHOWNPROG-chown}"
-chgrpprog="${CHGRPPROG-chgrp}"
-stripprog="${STRIPPROG-strip}"
-rmprog="${RMPROG-rm}"
-mkdirprog="${MKDIRPROG-mkdir}"
-
-transformbasename=
-transform_arg=
-instcmd="$mvprog"
-chmodcmd="$chmodprog 0755"
-chowncmd=
-chgrpcmd=
-stripcmd=
-rmcmd="$rmprog -f"
-mvcmd="$mvprog"
-src=
-dst=
-dir_arg=
-
-usage="Usage: $0 [OPTION]... SRCFILE DSTFILE
-   or: $0 -d DIR1 DIR2...
-
-In the first form, install SRCFILE to DSTFILE, removing SRCFILE by default.
-In the second, create the directory path DIR.
-
-Options:
--b=TRANSFORMBASENAME
--c         copy source (using $cpprog) instead of moving (using $mvprog).
--d         create directories instead of installing files.
--g GROUP   $chgrp installed files to GROUP.
--m MODE    $chmod installed files to MODE.
--o USER    $chown installed files to USER.
--s         strip installed files (using $stripprog).
--t=TRANSFORM
---help     display this help and exit.
---version  display version info and exit.
-
-Environment variables override the default commands:
-  CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
-"
-
-while test -n "$1"; do
-  case $1 in
-    -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
-        shift
-        continue;;
-
-    -c) instcmd=$cpprog
-        shift
-        continue;;
-
-    -d) dir_arg=true
-        shift
-        continue;;
-
-    -g) chgrpcmd="$chgrpprog $2"
-        shift
-        shift
-        continue;;
-
-    --help) echo "$usage"; exit 0;;
-
-    -m) chmodcmd="$chmodprog $2"
-        shift
-        shift
-        continue;;
-
-    -o) chowncmd="$chownprog $2"
-        shift
-        shift
-        continue;;
-
-    -s) stripcmd=$stripprog
-        shift
-        continue;;
-
-    -t=*) transformarg=`echo $1 | sed 's/-t=//'`
-        shift
-        continue;;
-
-    --version) echo "$0 $scriptversion"; exit 0;;
-
-    *)  if test -z "$src"; then
-          src=$1
-        else
-          # this colon is to work around a 386BSD /bin/sh bug
-          :
-          dst=$1
-        fi
-        shift
-        continue;;
-  esac
-done
-
-if test -z "$src"; then
-  echo "$0: no input file specified." >&2
-  exit 1
-fi
-
-# Protect names starting with `-'.
-case $src in
-  -*) src=./$src ;;
-esac
-
-if test -n "$dir_arg"; then
-  dst=$src
-  src=
-
-  if test -d "$dst"; then
-    instcmd=:
-    chmodcmd=
-  else
-    instcmd=$mkdirprog
-  fi
-else
-  # Waiting for this to be detected by the "$instcmd $src $dsttmp" command
-  # might cause directories to be created, which would be especially bad
-  # if $src (and thus $dsttmp) contains '*'.
-  if test ! -f "$src" && test ! -d "$src"; then
-    echo "$0: $src does not exist." >&2
-    exit 1
-  fi
-
-  if test -z "$dst"; then
-    echo "$0: no destination specified." >&2
-    exit 1
-  fi
-
-  # Protect names starting with `-'.
-  case $dst in
-    -*) dst=./$dst ;;
-  esac
-
-  # If destination is a directory, append the input filename; won't work
-  # if double slashes aren't ignored.
-  if test -d "$dst"; then
-    dst=$dst/`basename "$src"`
-  fi
-fi
-
-# This sed command emulates the dirname command.
-dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
-
-# Make sure that the destination directory exists.
-
-# Skip lots of stat calls in the usual case.
-if test ! -d "$dstdir"; then
-  defaultIFS='
-	'
-  IFS="${IFS-$defaultIFS}"
-
-  oIFS=$IFS
-  # Some sh's can't handle IFS=/ for some reason.
-  IFS='%'
-  set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
-  IFS=$oIFS
-
-  pathcomp=
-
-  while test $# -ne 0 ; do
-    pathcomp=$pathcomp$1
-    shift
-    test -d "$pathcomp" || $mkdirprog "$pathcomp"
-    pathcomp=$pathcomp/
-  done
-fi
-
-if test -n "$dir_arg"; then
-  $doit $instcmd "$dst" \
-    && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
-    && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
-    && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
-    && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
-
-else
-  # If we're going to rename the final executable, determine the name now.
-  if test -z "$transformarg"; then
-    dstfile=`basename "$dst"`
-  else
-    dstfile=`basename "$dst" $transformbasename \
-             | sed $transformarg`$transformbasename
-  fi
-
-  # don't allow the sed command to completely eliminate the filename.
-  test -z "$dstfile" && dstfile=`basename "$dst"`
-
-  # Make a couple of temp file names in the proper directory.
-  dsttmp=$dstdir/_inst.$$_
-  rmtmp=$dstdir/_rm.$$_
-
-  # Trap to clean up those temp files at exit.
-  trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0
-  trap '(exit $?); exit' 1 2 13 15
-
-  # Move or copy the file name to the temp name
-  $doit $instcmd "$src" "$dsttmp" &&
-
-  # and set any options; do chmod last to preserve setuid bits.
-  #
-  # If any of these fail, we abort the whole thing.  If we want to
-  # ignore errors from any of these, just make sure not to ignore
-  # errors from the above "$doit $instcmd $src $dsttmp" command.
-  #
-  { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
-    && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
-    && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
-    && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
-
-  # Now remove or move aside any old file at destination location.  We
-  # try this two ways since rm can't unlink itself on some systems and
-  # the destination file might be busy for other reasons.  In this case,
-  # the final cleanup might fail but the new file should still install
-  # successfully.
-  {
-    if test -f "$dstdir/$dstfile"; then
-      $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
-      || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
-      || {
-	  echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
-	  (exit 1); exit
-      }
-    else
-      :
-    fi
-  } &&
-
-  # Now rename the file to the real destination.
-  $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
-fi &&
-
-# The final little trick to "correctly" pass the exit status to the exit trap.
-{
-  (exit 0); exit
-}
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-end: "$"
-# End:
diff --git a/src/Graphics/Rendering/OpenGL.hs b/src/Graphics/Rendering/OpenGL.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL.hs
@@ -0,0 +1,138 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+-- 
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- A convenience module, combining the Haskell bindings for GL and GLU.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL (
+   -- * Supported Extensions
+
+   -- $SupportedExtensions
+
+   -- * Legal stuff
+
+   -- $LegalStuff
+
+     module Graphics.Rendering.OpenGL.GL
+   , module Graphics.Rendering.OpenGL.GLU
+) where
+
+import Graphics.Rendering.OpenGL.GL
+import Graphics.Rendering.OpenGL.GLU
+
+--------------------------------------------------------------------------------
+-- $SupportedExtensions
+-- There is support for full OpenGL 4.4 (compatibility profile), plus some
+-- extensions:
+--
+-- @
+-- extension                      | core since
+-- -------------------------------+------------
+-- GL_APPLE_packed_pixels         | 1.2
+-- GL_APPLE_ycbcr_422             |
+-- GL_ARB_copy_buffer             | 3.1
+-- GL_ARB_depth_buffer_float      | 3.0
+-- GL_ARB_depth_texture           | 1.4
+-- GL_ARB_half_float_pixel        | 3.0
+-- GL_ARB_imaging                 |
+-- GL_ARB_multisample             | 1.3
+-- GL_ARB_multitexture            | 1.3
+-- GL_ARB_occlusion_query         | 1.5
+-- GL_ARB_point_parameters        | 1.4
+-- GL_ARB_point_sprite            |
+-- GL_ARB_shadow                  | 1.4
+-- GL_ARB_texture_border_clamp    | 1.3
+-- GL_ARB_texture_compression     | 1.3
+-- GL_ARB_texture_cube_map        | 1.3
+-- GL_ARB_texture_env_add         | 1.3
+-- GL_ARB_texture_env_combine     | 1.3
+-- GL_ARB_texture_env_crossbar    | 1.4
+-- GL_ARB_texture_env_dot3        | 1.3
+-- GL_ARB_texture_mirrored_repeat | 1.4
+-- GL_ARB_texture_rectangle       | 3.1
+-- GL_ARB_transpose_matrix        | 1.3
+-- GL_ARB_vertex_buffer_object    | 1.5
+-- GL_ARB_vertex_shader           | 2.0
+-- GL_ARB_window_pos              | 1.4
+-- GL_EXT_abgr                    |
+-- GL_EXT_bgra                    | 1.2
+-- GL_EXT_blend_color             | 1.4
+-- GL_EXT_blend_func_separate     | 1.4
+-- GL_EXT_blend_logic_op          | 1.1
+-- GL_EXT_blend_minmax            | 1.4
+-- GL_EXT_blend_subtract          | 1.4
+-- GL_EXT_color_subtable          |
+-- GL_EXT_compiled_vertex_array   |
+-- GL_EXT_convolution             |
+-- GL_EXT_copy_texture            | 1.1
+-- GL_EXT_depth_bounds_test       |
+-- GL_EXT_draw_range_elements     | 1.2
+-- GL_EXT_fog_coord               | 1.4
+-- GL_EXT_histogram               |
+-- GL_EXT_multi_draw_arrays       | 1.4
+-- GL_EXT_packed_float            | 3.0
+-- GL_EXT_packed_pixels           | 1.2
+-- GL_EXT_polygon_offset          | 1.1
+-- GL_EXT_rescale_normal          | 1.2
+-- GL_EXT_secondary_color         | 1.4
+-- GL_EXT_separate_specular_color | 1.2
+-- GL_EXT_shadow_funcs            | 1.5
+-- GL_EXT_stencil_two_side        |
+-- GL_EXT_stencil_wrap            | 1.4
+-- GL_EXT_subtexture              | 1.1
+-- GL_EXT_texture                 | 1.1
+-- GL_EXT_texture3D               | 1.2
+-- GL_EXT_texture_lod_bias        | 1.4
+-- GL_EXT_texture_shared_exponent | 3.0
+-- GL_EXT_texture_object          | 1.1
+-- GL_EXT_vertex_array            | 1.1
+-- GL_HP_convolution_border_modes |
+-- GL_IBM_rasterpos_clip          |
+-- GL_MESA_ycbcr_texture          |
+-- GL_NV_blend_square             | 1.4
+-- GL_NV_depth_clamp              |
+-- GL_NV_fog_distance             |
+-- GL_NV_light_max_exponent       |
+-- GL_NV_packed_depth_stencil     |
+-- GL_NV_primitive_restart        |
+-- GL_SGIS_generate_mipmap        | 1.4
+-- GL_SGIS_texture_edge_clamp     |
+-- GL_SGIS_texture_lod            |
+-- GL_SGI_color_matrix            |
+-- GL_SGI_color_table             |
+-- @
+
+--------------------------------------------------------------------------------
+-- $LegalStuff
+-- The documentation is loosely based on the man pages of the OpenGL Sample
+-- Implemenation from SGI, see: <http://oss.sgi.com/projects/ogl-sample/>. It is
+-- used under the SGI Free Software License B. This license requires the
+-- following notice:
+--
+-- /License Applicability/. Except to the extent portions of this file are made
+-- subject to an alternative license as permitted in the SGI Free Software
+-- License B, Version 1.1 (the \"License\"), the contents of this file are
+-- subject only to the provisions of the License. You may not use this file
+-- except in compliance with the License. You may obtain a copy of the License
+-- at Silicon Graphics, Inc., attn: Legal Services, 1600 Amphitheatre Parkway,
+-- Mountain View, CA 94043-1351, or at: <http://oss.sgi.com/projects/FreeB/>.
+-- 
+-- Note that, as provided in the License, the Software is distributed on an \"AS
+-- IS\" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS
+-- DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND
+-- CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A PARTICULAR
+-- PURPOSE, AND NON-INFRINGEMENT.
+--
+-- /Original Code/. The Original Code is: OpenGL Sample Implementation, Version
+-- 1.2.1, released January 26, 2000, developed by Silicon Graphics, Inc. The
+-- Original Code is Copyright (c) 1991-2002 Silicon Graphics, Inc.  Copyright in
+-- any portions created by third parties is as indicated elsewhere herein. All
+-- Rights Reserved.
diff --git a/src/Graphics/Rendering/OpenGL/GL.hs b/src/Graphics/Rendering/OpenGL/GL.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL.hs
@@ -0,0 +1,126 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- A Haskell binding for OpenGL, the industry\'s most widely used and
+-- supported 2D and 3D graphics API.
+--
+-----------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL (
+   -- * OpenGL Fundamentals
+   module Graphics.GL.Types,
+   module Graphics.Rendering.OpenGL.GL.FlushFinish,
+   module Data.ObjectName,
+
+   -- * Event Model
+   module Graphics.Rendering.OpenGL.GL.SyncObjects,
+   module Graphics.Rendering.OpenGL.GL.QueryObjects,
+
+   -- * Vertex Specification and Drawing Commands
+   module Graphics.Rendering.OpenGL.GL.PrimitiveMode,
+   module Graphics.Rendering.OpenGL.GL.BeginEnd,
+   module Graphics.Rendering.OpenGL.GL.Rectangles,
+   module Graphics.Rendering.OpenGL.GL.ConditionalRendering,
+
+   -- * OpenGL Operation
+   module Graphics.Rendering.OpenGL.GL.VertexSpec,
+   module Graphics.Rendering.OpenGL.GL.VertexArrays,
+   module Graphics.Rendering.OpenGL.GL.VertexArrayObjects,
+   module Graphics.Rendering.OpenGL.GL.BufferObjects,
+   module Graphics.Rendering.OpenGL.GL.CoordTrans,
+   module Graphics.Rendering.OpenGL.GL.Clipping,
+   module Graphics.Rendering.OpenGL.GL.RasterPos,
+   module Graphics.Rendering.OpenGL.GL.Colors,
+   module Graphics.Rendering.OpenGL.GL.Shaders,
+
+   -- * Rasterization
+   module Graphics.Rendering.OpenGL.GL.Antialiasing,
+   module Graphics.Rendering.OpenGL.GL.FramebufferObjects,
+   module Graphics.Rendering.OpenGL.GL.Points,
+   module Graphics.Rendering.OpenGL.GL.LineSegments,
+   module Graphics.Rendering.OpenGL.GL.Polygons,
+   module Graphics.Rendering.OpenGL.GL.PixelRectangles,
+   module Graphics.Rendering.OpenGL.GL.Bitmaps,
+   module Graphics.Rendering.OpenGL.GL.Texturing,
+   module Graphics.Rendering.OpenGL.GL.ColorSum,
+   module Graphics.Rendering.OpenGL.GL.Fog,
+
+   -- * Per-Fragment Operations and the Framebuffer
+   module Graphics.Rendering.OpenGL.GL.PerFragment,
+   module Graphics.Rendering.OpenGL.GL.Framebuffer,
+   module Graphics.Rendering.OpenGL.GL.ReadCopyPixels,
+
+   -- * Special Functions
+   module Graphics.Rendering.OpenGL.GL.Evaluators,
+   module Graphics.Rendering.OpenGL.GL.Selection,
+   module Graphics.Rendering.OpenGL.GL.Feedback,
+   module Graphics.Rendering.OpenGL.GL.DisplayLists,
+   module Graphics.Rendering.OpenGL.GL.Hints,
+   module Graphics.Rendering.OpenGL.GL.PixellikeObject,
+   module Graphics.Rendering.OpenGL.GL.TransformFeedback,
+   module Graphics.Rendering.OpenGL.GL.DebugOutput,
+
+   -- * State and State Requests
+   module Data.StateVar,
+   module Graphics.Rendering.OpenGL.GL.Tensor,
+   module Graphics.Rendering.OpenGL.GL.StringQueries,
+   module Graphics.Rendering.OpenGL.GL.SavingState
+) where
+
+import Graphics.GL.Types
+import Graphics.Rendering.OpenGL.GL.FlushFinish
+import Data.ObjectName
+import Data.StateVar
+
+import Graphics.Rendering.OpenGL.GL.SyncObjects
+import Graphics.Rendering.OpenGL.GL.QueryObjects
+
+import Graphics.Rendering.OpenGL.GL.PrimitiveMode
+import Graphics.Rendering.OpenGL.GL.BeginEnd
+import Graphics.Rendering.OpenGL.GL.Rectangles
+import Graphics.Rendering.OpenGL.GL.ConditionalRendering
+
+import Graphics.Rendering.OpenGL.GL.VertexSpec
+import Graphics.Rendering.OpenGL.GL.VertexArrays
+import Graphics.Rendering.OpenGL.GL.VertexArrayObjects
+import Graphics.Rendering.OpenGL.GL.BufferObjects
+import Graphics.Rendering.OpenGL.GL.CoordTrans
+import Graphics.Rendering.OpenGL.GL.Clipping
+import Graphics.Rendering.OpenGL.GL.RasterPos
+import Graphics.Rendering.OpenGL.GL.Colors
+import Graphics.Rendering.OpenGL.GL.Shaders
+
+import Graphics.Rendering.OpenGL.GL.Antialiasing
+import Graphics.Rendering.OpenGL.GL.FramebufferObjects
+import Graphics.Rendering.OpenGL.GL.Points
+import Graphics.Rendering.OpenGL.GL.LineSegments
+import Graphics.Rendering.OpenGL.GL.Polygons
+import Graphics.Rendering.OpenGL.GL.PixelRectangles
+import Graphics.Rendering.OpenGL.GL.Bitmaps
+import Graphics.Rendering.OpenGL.GL.Texturing
+import Graphics.Rendering.OpenGL.GL.ColorSum
+import Graphics.Rendering.OpenGL.GL.Fog
+
+import Graphics.Rendering.OpenGL.GL.PerFragment
+import Graphics.Rendering.OpenGL.GL.Framebuffer
+import Graphics.Rendering.OpenGL.GL.ReadCopyPixels
+
+import Graphics.Rendering.OpenGL.GL.Evaluators
+import Graphics.Rendering.OpenGL.GL.Selection
+import Graphics.Rendering.OpenGL.GL.Feedback
+import Graphics.Rendering.OpenGL.GL.DisplayLists
+import Graphics.Rendering.OpenGL.GL.Hints
+import Graphics.Rendering.OpenGL.GL.PixellikeObject
+import Graphics.Rendering.OpenGL.GL.TransformFeedback
+import Graphics.Rendering.OpenGL.GL.DebugOutput
+
+import Graphics.Rendering.OpenGL.GL.Tensor
+import Graphics.Rendering.OpenGL.GL.StringQueries
+import Graphics.Rendering.OpenGL.GL.SavingState
diff --git a/src/Graphics/Rendering/OpenGL/GL/Antialiasing.hs b/src/Graphics/Rendering/OpenGL/GL/Antialiasing.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/Antialiasing.hs
@@ -0,0 +1,40 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.Antialiasing
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 3.2 (Antialiasing) of the OpenGL 2.1
+-- specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.Antialiasing (
+   sampleBuffers, samples, multisample, subpixelBits
+) where
+
+import Data.StateVar
+import Graphics.Rendering.OpenGL.GL.Capability
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+sampleBuffers :: GettableStateVar GLsizei
+sampleBuffers = antialiasingInfo GetSampleBuffers
+
+samples :: GettableStateVar GLsizei
+samples = antialiasingInfo GetSamples
+
+multisample :: StateVar Capability
+multisample = makeCapability CapMultisample
+
+subpixelBits :: GettableStateVar GLsizei
+subpixelBits = antialiasingInfo GetSubpixelBits
+
+antialiasingInfo :: GetPName1I p => p -> GettableStateVar GLsizei
+antialiasingInfo = makeGettableStateVar . getSizei1 id
diff --git a/src/Graphics/Rendering/OpenGL/GL/BeginEnd.hs b/src/Graphics/Rendering/OpenGL/GL/BeginEnd.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/BeginEnd.hs
@@ -0,0 +1,129 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.BeginEnd
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 10.8 (Drawing Commands Using Begin and
+-- End) of the OpenGL 4.4 specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.BeginEnd (
+   -- * Begin and End Objects
+   renderPrimitive, unsafeRenderPrimitive, primitiveRestart,
+
+   -- * Polygon Edges
+   EdgeFlag(..),
+   edgeFlag
+) where
+
+import Data.StateVar
+import Graphics.Rendering.OpenGL.GL.EdgeFlag
+import Graphics.Rendering.OpenGL.GL.Exception
+import Graphics.Rendering.OpenGL.GL.PrimitiveMode
+import Graphics.Rendering.OpenGL.GL.PrimitiveModeInternal
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+-- | Delimit the vertices that define a primitive or a group of like primitives.
+--
+-- Only a subset of GL commands can be used in the delimited action:
+-- Those for specifying vertex coordinates
+-- ('Graphics.Rendering.OpenGL.GL.VertexSpec.vertex',
+--  'Graphics.Rendering.OpenGL.GL.VertexSpec.vertexv'),
+-- vertex colors
+-- ('Graphics.Rendering.OpenGL.GL.VertexSpec.color',
+--  'Graphics.Rendering.OpenGL.GL.VertexSpec.colorv',
+--  'Graphics.Rendering.OpenGL.GL.VertexSpec.secondaryColor',
+--  'Graphics.Rendering.OpenGL.GL.VertexSpec.secondaryColorv',
+--  'Graphics.Rendering.OpenGL.GL.VertexSpec.index',
+--  'Graphics.Rendering.OpenGL.GL.VertexSpec.indexv'),
+-- normal
+-- ('Graphics.Rendering.OpenGL.GL.VertexSpec.normal',
+--  'Graphics.Rendering.OpenGL.GL.VertexSpec.normalv'),
+-- texture coordinates
+-- ('Graphics.Rendering.OpenGL.GL.VertexSpec.texCoord',
+--  'Graphics.Rendering.OpenGL.GL.VertexSpec.texCoordv',
+--  'Graphics.Rendering.OpenGL.GL.VertexSpec.multiTexCoord',
+--  'Graphics.Rendering.OpenGL.GL.VertexSpec.multiTexCoordv'),
+-- and fog coordinates
+-- ('Graphics.Rendering.OpenGL.GL.VertexSpec.fogCoord',
+--  'Graphics.Rendering.OpenGL.GL.VertexSpec.fogCoordv').
+-- Additionally,
+-- 'Graphics.Rendering.OpenGL.GL.Evaluators.evalPoint1',
+-- 'Graphics.Rendering.OpenGL.GL.Evaluators.evalPoint2',
+-- 'Graphics.Rendering.OpenGL.GL.Evaluators.evalCoord1',
+-- 'Graphics.Rendering.OpenGL.GL.Evaluators.evalCoord1v',
+-- 'Graphics.Rendering.OpenGL.GL.Evaluators.evalCoord2',
+-- 'Graphics.Rendering.OpenGL.GL.Evaluators.evalCoord2v',
+-- 'Graphics.Rendering.OpenGL.GL.Colors.materialAmbient',
+-- 'Graphics.Rendering.OpenGL.GL.Colors.materialDiffuse',
+-- 'Graphics.Rendering.OpenGL.GL.Colors.materialAmbientAndDiffuse',
+-- 'Graphics.Rendering.OpenGL.GL.Colors.materialSpecular',
+-- 'Graphics.Rendering.OpenGL.GL.Colors.materialEmission',
+-- 'Graphics.Rendering.OpenGL.GL.Colors.materialShininess',
+-- 'Graphics.Rendering.OpenGL.GL.DisplayLists.callList',
+-- 'Graphics.Rendering.OpenGL.GL.DisplayLists.callLists',
+-- and setting 'edgeFlag' are allowed. Writing the respective state variables
+-- is allowed in the delimited action, too.
+--
+-- Regardless of the chosen 'PrimitiveMode', there is no limit to the number of
+-- vertices that can be defined during a single 'renderPrimitive'. Lines,
+-- triangles, quadrilaterals, and polygons that are incompletely specified are
+-- not drawn. Incomplete specification results when either too few vertices are
+-- provided to specify even a single primitive or when an incorrect multiple of
+-- vertices is specified. The incomplete primitive is ignored; the rest are
+-- drawn.
+--
+-- The minimum specification of vertices for each primitive is as follows: 1
+-- for a point, 2 for a line, 3 for a triangle, 4 for a quadrilateral, and 3 for
+-- a polygon. Modes that require a certain multiple of vertices are 'Lines' (2),
+-- 'Triangles' (3), 'Quads' (4), and 'QuadStrip' (2).
+
+renderPrimitive :: PrimitiveMode -> IO a -> IO a
+renderPrimitive = renderPrim bracket_
+
+-- | A more efficient, but potentially dangerous version of 'renderPrimitive':
+-- The given action is not allowed to throw an exception.
+
+unsafeRenderPrimitive :: PrimitiveMode -> IO a -> IO a
+unsafeRenderPrimitive = renderPrim unsafeBracket_
+
+{-# INLINE renderPrim #-}
+renderPrim :: (IO () -> IO () -> IO a -> IO a) -> PrimitiveMode -> IO a -> IO a
+renderPrim brack_ beginMode =
+   brack_ (glBegin (marshalPrimitiveMode beginMode)) glEnd
+
+--------------------------------------------------------------------------------
+
+primitiveRestart :: IO ()
+primitiveRestart = glPrimitiveRestartNV
+
+--------------------------------------------------------------------------------
+
+-- | Each vertex of a polygon, separate triangle, or separate quadrilateral
+-- specified during 'renderPrimitive' is marked as the start of either a boundary
+-- or nonboundary (interior) edge.
+--
+-- The vertices of connected triangles and connected quadrilaterals are always
+-- marked as boundary, regardless of the value of the edge flag.
+--
+-- Boundary and nonboundary edge flags on vertices are significant only if
+-- 'Graphics.Rendering.OpenGL.GL.Polygons.polygonMode' is set to
+-- 'Graphics.Rendering.OpenGL.GL.Polygons.Point' or
+-- 'Graphics.Rendering.OpenGL.GL.Polygons.Line'.
+--
+-- Note that the current edge flag can be updated at any time, in particular
+-- during 'renderPrimitive'.
+
+edgeFlag :: StateVar EdgeFlag
+edgeFlag =
+   makeStateVar (getBoolean1 unmarshalEdgeFlag GetEdgeFlag)
+                (glEdgeFlag . marshalEdgeFlag)
diff --git a/src/Graphics/Rendering/OpenGL/GL/Bitmaps.hs b/src/Graphics/Rendering/OpenGL/GL/Bitmaps.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/Bitmaps.hs
@@ -0,0 +1,28 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.Bitmaps
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+-- 
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 3.7 (Bitmaps) of the OpenGL 2.1 specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.Bitmaps (
+   bitmap
+) where
+
+import Foreign.Ptr
+import Graphics.Rendering.OpenGL.GL.CoordTrans
+import Graphics.Rendering.OpenGL.GL.Tensor
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+bitmap :: Size -> (Vertex2 GLfloat) -> (Vector2 GLfloat) -> Ptr GLubyte -> IO ()
+bitmap (Size w h) (Vertex2 xbo ybo) (Vector2 xbi ybi) =
+   glBitmap w h xbo ybo xbi ybi
diff --git a/src/Graphics/Rendering/OpenGL/GL/BlendingFactor.hs b/src/Graphics/Rendering/OpenGL/GL/BlendingFactor.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/BlendingFactor.hs
@@ -0,0 +1,77 @@
+{-# OPTIONS_HADDOCK hide #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.BlendingFactor
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+-- 
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This is a purely internal module for (un-)marshaling BlendingFactor.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.BlendingFactor (
+   BlendingFactor(..), marshalBlendingFactor, unmarshalBlendingFactor
+) where
+
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+data BlendingFactor =
+     Zero
+   | One
+   | SrcColor
+   | OneMinusSrcColor
+   | DstColor
+   | OneMinusDstColor
+   | SrcAlpha
+   | OneMinusSrcAlpha
+   | DstAlpha
+   | OneMinusDstAlpha
+   | ConstantColor
+   | OneMinusConstantColor
+   | ConstantAlpha
+   | OneMinusConstantAlpha
+   | SrcAlphaSaturate
+   deriving ( Eq, Ord, Show )
+
+marshalBlendingFactor :: BlendingFactor -> GLenum
+marshalBlendingFactor x = case x of
+   Zero -> GL_ZERO
+   One -> GL_ONE
+   SrcColor -> GL_SRC_COLOR
+   OneMinusSrcColor -> GL_ONE_MINUS_SRC_COLOR
+   DstColor -> GL_DST_COLOR
+   OneMinusDstColor -> GL_ONE_MINUS_DST_COLOR
+   SrcAlpha -> GL_SRC_ALPHA
+   OneMinusSrcAlpha -> GL_ONE_MINUS_SRC_ALPHA
+   DstAlpha -> GL_DST_ALPHA
+   OneMinusDstAlpha -> GL_ONE_MINUS_DST_ALPHA
+   ConstantColor -> GL_CONSTANT_COLOR
+   OneMinusConstantColor -> GL_ONE_MINUS_CONSTANT_COLOR
+   ConstantAlpha -> GL_CONSTANT_ALPHA
+   OneMinusConstantAlpha -> GL_ONE_MINUS_CONSTANT_ALPHA
+   SrcAlphaSaturate -> GL_SRC_ALPHA_SATURATE
+
+unmarshalBlendingFactor :: GLenum -> BlendingFactor
+unmarshalBlendingFactor x
+   | x == GL_ZERO = Zero
+   | x == GL_ONE = One
+   | x == GL_SRC_COLOR = SrcColor
+   | x == GL_ONE_MINUS_SRC_COLOR = OneMinusSrcColor
+   | x == GL_DST_COLOR = DstColor
+   | x == GL_ONE_MINUS_DST_COLOR = OneMinusDstColor
+   | x == GL_SRC_ALPHA = SrcAlpha
+   | x == GL_ONE_MINUS_SRC_ALPHA = OneMinusSrcAlpha
+   | x == GL_DST_ALPHA = DstAlpha
+   | x == GL_ONE_MINUS_DST_ALPHA = OneMinusDstAlpha
+   | x == GL_CONSTANT_COLOR = ConstantColor
+   | x == GL_ONE_MINUS_CONSTANT_COLOR = OneMinusConstantColor
+   | x == GL_CONSTANT_ALPHA = ConstantAlpha
+   | x == GL_ONE_MINUS_CONSTANT_ALPHA = OneMinusConstantAlpha
+   | x == GL_SRC_ALPHA_SATURATE = SrcAlphaSaturate
+   | otherwise = error ("unmarshalBlendingFactor: illegal value " ++ show x)
diff --git a/src/Graphics/Rendering/OpenGL/GL/BufferMode.hs b/src/Graphics/Rendering/OpenGL/GL/BufferMode.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/BufferMode.hs
@@ -0,0 +1,116 @@
+{-# OPTIONS_HADDOCK hide #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.BufferMode
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This is a purely internal module for (un-)marshaling BufferMode.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.BufferMode (
+   BufferMode(..), marshalBufferMode, unmarshalBufferMode,
+   unmarshalBufferModeSafe,
+   maxColorAttachments,
+) where
+
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+-- | The set of color buffers which are selected for reading and writing. Note
+-- that 'FBOColorAttachment' can only be used with framebuffer objects, while
+-- the rest can only be used with the default framebuffer. Furthermore, OpenGL
+-- 3.0 deprecated auxiliary buffers, so avoid 'AuxBuffer' in modern code.
+
+data BufferMode =
+     NoBuffers
+     -- ^ No color buffers are selected.
+   | FrontLeftBuffer
+     -- ^ Only the front left color buffer is selected.
+   | FrontRightBuffer
+     -- ^ Only the front right color buffer is selected.
+   | BackLeftBuffer
+     -- ^ Only the  back left color buffer is selected.
+   | BackRightBuffer
+     -- ^ Only the back right color buffer is selected.
+   | FrontBuffers
+     -- ^ Only the front left and front right color buffers are selected. If
+     -- there is no front right color buffer, only the front left color buffer
+     -- is selected.
+   | BackBuffers
+     -- ^ Only the back left and back right color buffers are selected. If there
+     -- is no back right color buffer, only the back left color buffer is
+     -- selected.
+   | LeftBuffers
+     -- ^ Only the front left and back left color buffers are selected. If there
+     -- is no back left color buffer, only the front left color buffer is
+     -- selected.
+   | RightBuffers
+     -- ^ Only the front right and back right color buffers are selected. If
+     -- there is no back right color buffer, only the front right color buffer
+     -- is selected.
+   | FrontAndBackBuffers
+     -- ^ All the front and back color buffers (front left, front right, back
+     -- left, back right) are selected. If there are no back color buffers, only
+     -- the front left and front right color buffers are selected. If there are
+     -- no right color buffers, only the front left and back left color buffers
+     -- are selected. If there are no right or back color buffers, only the
+     -- front left color buffer is selected.
+   | AuxBuffer GLsizei
+     -- ^ Only the given auxiliary color buffer no. /i/ is selected.
+   | FBOColorAttachment GLsizei
+     -- ^ Only the given color attachment of the bound framebufferobject is selected for reading
+     -- or writing.
+   deriving ( Eq, Ord, Show )
+
+marshalBufferMode :: BufferMode -> Maybe GLenum
+marshalBufferMode x = case x of
+   NoBuffers -> Just GL_NONE
+   FrontLeftBuffer -> Just GL_FRONT_LEFT
+   FrontRightBuffer -> Just GL_FRONT_RIGHT
+   BackLeftBuffer -> Just GL_BACK_LEFT
+   BackRightBuffer -> Just GL_BACK_RIGHT
+   FrontBuffers -> Just GL_FRONT
+   BackBuffers -> Just GL_BACK
+   LeftBuffers -> Just GL_LEFT
+   RightBuffers -> Just GL_RIGHT
+   FrontAndBackBuffers -> Just GL_FRONT_AND_BACK
+   AuxBuffer i
+      | fromIntegral i <= maxAuxBuffer -> Just (GL_AUX0 + fromIntegral i)
+      | otherwise -> Nothing
+   FBOColorAttachment i
+      | fromIntegral i <= maxColorAttachments -> Just (GL_COLOR_ATTACHMENT0 + fromIntegral i)
+      | otherwise -> Nothing
+
+unmarshalBufferMode :: GLenum -> BufferMode
+unmarshalBufferMode x = maybe
+   (error ("unmarshalBufferMode: illegal value " ++ show x)) id $ unmarshalBufferModeSafe x
+
+unmarshalBufferModeSafe :: GLenum -> Maybe BufferMode
+unmarshalBufferModeSafe x
+   | x == GL_NONE = Just NoBuffers
+   | x == GL_FRONT_LEFT = Just FrontLeftBuffer
+   | x == GL_FRONT_RIGHT = Just FrontRightBuffer
+   | x == GL_BACK_LEFT = Just BackLeftBuffer
+   | x == GL_BACK_RIGHT = Just BackRightBuffer
+   | x == GL_FRONT = Just FrontBuffers
+   | x == GL_BACK = Just BackBuffers
+   | x == GL_LEFT = Just LeftBuffers
+   | x == GL_RIGHT = Just RightBuffers
+   | x == GL_FRONT_AND_BACK = Just FrontAndBackBuffers
+   | GL_AUX0 <= x && x <= GL_AUX0 + maxAuxBuffer = Just . AuxBuffer . fromIntegral $ x - GL_AUX0
+   | GL_COLOR_ATTACHMENT0 <= x && x <= GL_COLOR_ATTACHMENT0 + maxColorAttachments
+      = Just . FBOColorAttachment . fromIntegral $ x - GL_COLOR_ATTACHMENT0
+   | otherwise = Nothing
+
+maxAuxBuffer :: GLenum
+maxAuxBuffer = 246
+
+maxColorAttachments :: GLenum
+maxColorAttachments = 16
diff --git a/src/Graphics/Rendering/OpenGL/GL/BufferObjects.hs b/src/Graphics/Rendering/OpenGL/GL/BufferObjects.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/BufferObjects.hs
@@ -0,0 +1,447 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.BufferObjects
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 2.9 (Buffer Objects) of the OpenGL 2.1
+-- specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.BufferObjects (
+   -- * Buffer Objects
+   BufferObject,
+
+   -- * Binding Buffer Objects
+   BufferTarget(..), bindBuffer, arrayBufferBinding,
+   vertexAttribArrayBufferBinding,
+
+   -- * Handling Buffer Data
+   BufferUsage(..), bufferData, TransferDirection(..), bufferSubData,
+
+   -- * Mapping Buffer Objects
+   BufferAccess(..), MappingFailure(..), withMappedBuffer,
+   mapBuffer, unmapBuffer,
+   bufferAccess, bufferMapped,
+
+   MapBufferUsage(..), Offset, Length,
+   mapBufferRange, flushMappedBufferRange,
+
+   -- * Indexed Buffer manipulation
+   BufferIndex,
+   RangeStartIndex, RangeSize,
+   BufferRange,
+   IndexedBufferTarget(..),
+   bindBufferBase, bindBufferRange,
+   indexedBufferStart, indexedBufferSize
+) where
+
+import Control.Monad.IO.Class
+import Data.Maybe ( fromMaybe )
+import Data.ObjectName
+import Data.StateVar
+import Foreign.Marshal.Array ( allocaArray, peekArray, withArrayLen )
+import Foreign.Marshal.Utils ( with )
+import Foreign.Ptr ( Ptr, nullPtr )
+import Graphics.Rendering.OpenGL.GL.DebugOutput
+import Graphics.Rendering.OpenGL.GL.Exception
+import Graphics.Rendering.OpenGL.GL.GLboolean
+import Graphics.Rendering.OpenGL.GL.PeekPoke
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.Rendering.OpenGL.GL.VertexArrays
+import Graphics.Rendering.OpenGL.GLU.ErrorsInternal
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+newtype BufferObject = BufferObject { bufferID :: GLuint }
+   deriving ( Eq, Ord, Show )
+
+--------------------------------------------------------------------------------
+
+instance ObjectName BufferObject where
+   isObjectName = liftIO . fmap unmarshalGLboolean . glIsBuffer . bufferID
+
+   deleteObjectNames bufferObjects =
+      liftIO . withArrayLen (map bufferID bufferObjects) $
+         glDeleteBuffers . fromIntegral
+
+instance GeneratableObjectName BufferObject where
+   genObjectNames n =
+      liftIO . allocaArray n $ \buf -> do
+        glGenBuffers (fromIntegral n) buf
+        fmap (map BufferObject) $ peekArray n buf
+
+instance CanBeLabeled BufferObject where
+   objectLabel = objectNameLabel GL_BUFFER . bufferID
+
+--------------------------------------------------------------------------------
+
+data BufferTarget =
+     ArrayBuffer
+   | AtomicCounterBuffer
+   | CopyReadBuffer
+   | CopyWriteBuffer
+   | DispatchIndirectBuffer
+   | DrawIndirectBuffer
+   | ElementArrayBuffer
+   | PixelPackBuffer
+   | PixelUnpackBuffer
+   | QueryBuffer
+   | ShaderStorageBuffer
+   | TextureBuffer
+   | TransformFeedbackBuffer
+   | UniformBuffer
+   deriving ( Eq, Ord, Show )
+
+marshalBufferTarget :: BufferTarget -> GLenum
+marshalBufferTarget x = case x of
+   ArrayBuffer -> GL_ARRAY_BUFFER
+   AtomicCounterBuffer -> GL_ATOMIC_COUNTER_BUFFER
+   CopyReadBuffer -> GL_COPY_READ_BUFFER
+   CopyWriteBuffer -> GL_COPY_WRITE_BUFFER
+   DispatchIndirectBuffer -> GL_DISPATCH_INDIRECT_BUFFER
+   DrawIndirectBuffer -> GL_DRAW_INDIRECT_BUFFER
+   ElementArrayBuffer -> GL_ELEMENT_ARRAY_BUFFER
+   PixelPackBuffer -> GL_PIXEL_PACK_BUFFER
+   PixelUnpackBuffer -> GL_PIXEL_UNPACK_BUFFER
+   QueryBuffer -> GL_QUERY_BUFFER
+   ShaderStorageBuffer -> GL_SHADER_STORAGE_BUFFER
+   TextureBuffer -> GL_TEXTURE_BUFFER
+   TransformFeedbackBuffer -> GL_TRANSFORM_FEEDBACK_BUFFER
+   UniformBuffer -> GL_UNIFORM_BUFFER
+
+bufferTargetToGetPName :: BufferTarget -> PName1I
+bufferTargetToGetPName x = case x of
+   ArrayBuffer -> GetArrayBufferBinding
+   AtomicCounterBuffer -> GetAtomicCounterBufferBinding
+   CopyReadBuffer -> GetCopyReadBufferBinding
+   CopyWriteBuffer -> GetCopyWriteBufferBinding
+   DispatchIndirectBuffer -> GetDispatchIndirectBufferBinding
+   DrawIndirectBuffer -> GetDrawIndirectBufferBinding
+   ElementArrayBuffer -> GetElementArrayBufferBinding
+   PixelPackBuffer -> GetPixelPackBufferBinding
+   PixelUnpackBuffer -> GetPixelUnpackBufferBinding
+   QueryBuffer -> GetQueryBufferBinding
+   ShaderStorageBuffer -> GetShaderStorageBufferBinding
+   TextureBuffer -> GetTextureBindingBuffer
+   TransformFeedbackBuffer -> GetTransformFeedbackBufferBinding
+   UniformBuffer -> GetUniformBufferBinding
+
+--------------------------------------------------------------------------------
+
+data BufferUsage =
+     StreamDraw
+   | StreamRead
+   | StreamCopy
+   | StaticDraw
+   | StaticRead
+   | StaticCopy
+   | DynamicDraw
+   | DynamicRead
+   | DynamicCopy
+   deriving ( Eq, Ord, Show )
+
+marshalBufferUsage :: BufferUsage -> GLenum
+marshalBufferUsage x = case x of
+   StreamDraw -> GL_STREAM_DRAW
+   StreamRead -> GL_STREAM_READ
+   StreamCopy -> GL_STREAM_COPY
+   StaticDraw -> GL_STATIC_DRAW
+   StaticRead -> GL_STATIC_READ
+   StaticCopy -> GL_STATIC_COPY
+   DynamicDraw -> GL_DYNAMIC_DRAW
+   DynamicRead -> GL_DYNAMIC_READ
+   DynamicCopy -> GL_DYNAMIC_COPY
+
+unmarshalBufferUsage :: GLenum -> BufferUsage
+unmarshalBufferUsage x
+   | x == GL_STREAM_DRAW = StreamDraw
+   | x == GL_STREAM_READ = StreamRead
+   | x == GL_STREAM_COPY = StreamCopy
+   | x == GL_STATIC_DRAW = StaticDraw
+   | x == GL_STATIC_READ = StaticRead
+   | x == GL_STATIC_COPY = StaticCopy
+   | x == GL_DYNAMIC_DRAW = DynamicDraw
+   | x == GL_DYNAMIC_READ = DynamicRead
+   | x == GL_DYNAMIC_COPY = DynamicCopy
+   | otherwise = error ("unmarshalBufferUsage: illegal value " ++ show x)
+
+--------------------------------------------------------------------------------
+
+data BufferAccess =
+     ReadOnly
+   | WriteOnly
+   | ReadWrite
+   deriving ( Eq, Ord, Show )
+
+marshalBufferAccess :: BufferAccess -> GLenum
+marshalBufferAccess x = case x of
+   ReadOnly -> GL_READ_ONLY
+   WriteOnly -> GL_WRITE_ONLY
+   ReadWrite -> GL_READ_WRITE
+
+unmarshalBufferAccess :: GLenum -> BufferAccess
+unmarshalBufferAccess x
+   | x == GL_READ_ONLY = ReadOnly
+   | x == GL_WRITE_ONLY = WriteOnly
+   | x == GL_READ_WRITE = ReadWrite
+   | otherwise = error ("unmarshalBufferAccess: illegal value " ++ show x)
+
+--------------------------------------------------------------------------------
+
+bindBuffer :: BufferTarget -> StateVar (Maybe BufferObject)
+bindBuffer t = makeStateVar (getBindBuffer t) (setBindBuffer t)
+
+getBindBuffer :: BufferTarget -> IO (Maybe BufferObject)
+getBindBuffer = bufferQuery bufferTargetToGetPName
+
+bufferQuery :: (a -> PName1I) -> a -> IO (Maybe BufferObject)
+bufferQuery func t = do
+   buf <- getInteger1 (BufferObject . fromIntegral) (func t)
+   return $ if buf == noBufferObject then Nothing else Just buf
+
+noBufferObject :: BufferObject
+noBufferObject = BufferObject 0
+
+setBindBuffer :: BufferTarget -> Maybe BufferObject -> IO ()
+setBindBuffer t =
+   glBindBuffer (marshalBufferTarget t) . bufferID . fromMaybe noBufferObject
+
+clientArrayTypeToGetPName :: ClientArrayType -> PName1I
+clientArrayTypeToGetPName x = case x of
+   VertexArray -> GetVertexArrayBufferBinding
+   NormalArray -> GetNormalArrayBufferBinding
+   ColorArray -> GetColorArrayBufferBinding
+   IndexArray -> GetIndexArrayBufferBinding
+   TextureCoordArray -> GetTextureCoordArrayBufferBinding
+   EdgeFlagArray -> GetEdgeFlagArrayBufferBinding
+   FogCoordArray -> GetFogCoordArrayBufferBinding
+   SecondaryColorArray -> GetSecondaryColorArrayBufferBinding
+   MatrixIndexArray -> error "clientArrayTypeToGetPName: impossible"
+
+arrayBufferBinding :: ClientArrayType -> GettableStateVar (Maybe BufferObject)
+arrayBufferBinding t =
+   makeGettableStateVar $ case t of
+      MatrixIndexArray -> do recordInvalidEnum ; return Nothing
+      _ -> bufferQuery clientArrayTypeToGetPName t
+
+
+vertexAttribArrayBufferBinding :: AttribLocation -> GettableStateVar (Maybe BufferObject)
+vertexAttribArrayBufferBinding location =
+   makeGettableStateVar $ do
+      buf <- getVertexAttribInteger1 (BufferObject . fromIntegral) location GetVertexAttribArrayBufferBinding
+      return $ if buf == noBufferObject then Nothing else Just buf
+
+--------------------------------------------------------------------------------
+
+bufferData :: BufferTarget -> StateVar (GLsizeiptr, Ptr a, BufferUsage)
+bufferData t = makeStateVar (getBufferData t) (setBufferData t)
+
+getBufferData :: BufferTarget -> IO (GLsizeiptr, Ptr a, BufferUsage)
+getBufferData t = do
+   s <- getBufferParameter t fromIntegral GetBufferSize
+   p <- getBufferPointer t
+   u <- getBufferParameter t unmarshalBufferUsage GetBufferUsage
+   return (s, p, u)
+
+setBufferData :: BufferTarget -> (GLsizeiptr, Ptr a, BufferUsage) -> IO ()
+setBufferData t (s, p, u) =
+   glBufferData (marshalBufferTarget t) s p (marshalBufferUsage u)
+
+--------------------------------------------------------------------------------
+
+data TransferDirection =
+     ReadFromBuffer
+   | WriteToBuffer
+   deriving ( Eq, Ord, Show )
+
+bufferSubData ::
+   BufferTarget -> TransferDirection -> GLintptr -> GLsizeiptr -> Ptr a -> IO ()
+bufferSubData t WriteToBuffer = glBufferSubData (marshalBufferTarget t)
+bufferSubData t ReadFromBuffer = glGetBufferSubData (marshalBufferTarget t)
+
+--------------------------------------------------------------------------------
+
+data GetBufferPName =
+     GetBufferSize
+   | GetBufferUsage
+   | GetBufferAccess
+   | GetBufferMapped
+
+marshalGetBufferPName :: GetBufferPName -> GLenum
+marshalGetBufferPName x = case x of
+   GetBufferSize -> GL_BUFFER_SIZE
+   GetBufferUsage -> GL_BUFFER_USAGE
+   GetBufferAccess -> GL_BUFFER_ACCESS
+   GetBufferMapped -> GL_BUFFER_MAPPED
+
+getBufferParameter :: BufferTarget -> (GLenum -> a) -> GetBufferPName -> IO a
+getBufferParameter t f p = with 0 $ \buf -> do
+   glGetBufferParameteriv (marshalBufferTarget t)
+                          (marshalGetBufferPName p) buf
+   peek1 (f . fromIntegral) buf
+
+--------------------------------------------------------------------------------
+
+getBufferPointer :: BufferTarget -> IO (Ptr a)
+getBufferPointer t = with nullPtr $ \buf -> do
+   glGetBufferPointerv (marshalBufferTarget t) GL_BUFFER_MAP_POINTER buf
+   peek1 id buf
+
+--------------------------------------------------------------------------------
+
+data MappingFailure =
+     MappingFailed
+   | UnmappingFailed
+   deriving ( Eq, Ord, Show )
+
+-- | Convenience function for an exception-safe combination of 'mapBuffer' and
+-- 'unmapBuffer'.
+withMappedBuffer :: BufferTarget -> BufferAccess -> (Ptr a -> IO b) -> (MappingFailure -> IO b) -> IO b
+withMappedBuffer t a action err = do
+   maybeBuf <- mapBuffer t a
+   case maybeBuf  of
+      Nothing -> err MappingFailed
+      Just buf -> do (ret, ok) <- action buf `finallyRet` unmapBuffer t
+                     if ok
+                        then return ret
+                        else err UnmappingFailed
+
+mapBuffer :: BufferTarget -> BufferAccess -> IO (Maybe (Ptr a))
+mapBuffer t = fmap (maybeNullPtr Nothing Just) . mapBuffer_ t
+
+mapBuffer_ :: BufferTarget -> BufferAccess -> IO (Ptr a)
+mapBuffer_ t = glMapBuffer (marshalBufferTarget t) . marshalBufferAccess
+
+unmapBuffer :: BufferTarget -> IO Bool
+unmapBuffer = fmap unmarshalGLboolean . glUnmapBuffer . marshalBufferTarget
+
+bufferAccess :: BufferTarget -> GettableStateVar BufferAccess
+bufferAccess t = makeGettableStateVar $
+   getBufferParameter t unmarshalBufferAccess GetBufferAccess
+
+bufferMapped :: BufferTarget -> GettableStateVar Bool
+bufferMapped t = makeGettableStateVar $
+   getBufferParameter t unmarshalGLboolean GetBufferMapped
+
+--------------------------------------------------------------------------------
+
+data MapBufferUsage =
+     Read
+   | Write
+   | InvalidateRange
+   | InvalidateBuffer
+   | FlushExplicit
+   | Unsychronized
+   deriving ( Eq, Ord, Show )
+
+type Offset = GLintptr
+type Length = GLsizeiptr
+
+marshalMapBufferUsage :: MapBufferUsage -> GLbitfield
+marshalMapBufferUsage x = case x of
+    Read -> GL_MAP_READ_BIT
+    Write -> GL_MAP_WRITE_BIT
+    InvalidateRange -> GL_MAP_INVALIDATE_RANGE_BIT
+    InvalidateBuffer -> GL_MAP_INVALIDATE_BUFFER_BIT
+    FlushExplicit -> GL_MAP_FLUSH_EXPLICIT_BIT
+    Unsychronized -> GL_MAP_FLUSH_EXPLICIT_BIT
+
+--------------------------------------------------------------------------------
+
+mapBufferRange_ ::
+   BufferTarget -> Offset -> Length -> [MapBufferUsage] -> IO (Ptr a)
+mapBufferRange_ t o l b = glMapBufferRange (marshalBufferTarget t) o l
+   (sum (map marshalMapBufferUsage b))
+
+mapBufferRange ::
+   BufferTarget -> Offset -> Length -> [MapBufferUsage] -> IO (Maybe (Ptr a))
+mapBufferRange t o l b =
+   fmap (maybeNullPtr Nothing Just) $ mapBufferRange_ t o l b
+
+flushMappedBufferRange :: BufferTarget -> Offset -> Length -> IO ()
+flushMappedBufferRange t = glFlushMappedBufferRange (marshalBufferTarget t)
+
+--------------------------------------------------------------------------------
+
+type BufferIndex = GLuint
+
+type RangeStartIndex = GLintptr
+type RangeSize = GLsizeiptr
+type BufferRange = (BufferObject, RangeStartIndex, RangeSize)
+
+data IndexedBufferTarget =
+     IndexedAtomicCounterBuffer
+   | IndexedShaderStorageBuffer
+   | IndexedTransformFeedbackBuffer
+   | IndexedUniformBuffer
+   deriving ( Eq, Ord, Show )
+
+marshalIndexedBufferTarget :: IndexedBufferTarget -> IPName1I
+marshalIndexedBufferTarget x = case x of
+   IndexedAtomicCounterBuffer -> GetAtomicCounterBuffer
+   IndexedShaderStorageBuffer -> GetShaderStorageBuffer
+   IndexedTransformFeedbackBuffer -> GetTransformFeedbackBuffer
+   IndexedUniformBuffer -> GetUniformBuffer
+
+bindBufferBase :: IndexedBufferTarget -> BufferIndex -> StateVar (Maybe BufferObject)
+bindBufferBase t i = makeStateVar (getIndexedBufferBinding t i) (setIndexedBufferBase t i)
+
+getIndexedBufferBinding :: IndexedBufferTarget -> BufferIndex -> IO (Maybe BufferObject)
+getIndexedBufferBinding t i = do
+   buf <- getInteger1i (BufferObject . fromIntegral) (marshalIndexedBufferTarget t) i
+   return $ if buf == noBufferObject then Nothing else Just buf
+
+setIndexedBufferBase :: IndexedBufferTarget -> BufferIndex -> Maybe BufferObject -> IO ()
+setIndexedBufferBase t i buf =
+   case marshalGetPName . marshalIndexedBufferTarget $ t of
+      Nothing -> recordInvalidEnum
+      Just t' -> glBindBufferBase t' i . bufferID . fromMaybe noBufferObject $ buf
+
+bindBufferRange :: IndexedBufferTarget -> BufferIndex -> StateVar (Maybe BufferRange)
+bindBufferRange t i = makeStateVar (getIndexedBufferRange t i) (setIndexedBufferRange t i)
+
+getIndexedBufferRange :: IndexedBufferTarget -> BufferIndex -> IO (Maybe BufferRange)
+getIndexedBufferRange t i = do
+  buf <- getInteger1i (BufferObject . fromIntegral) (marshalIndexedBufferTarget t) i
+  if buf == noBufferObject
+     then return Nothing
+     else do start <- get $ indexedBufferStart t i
+             size <- get $ indexedBufferSize t i
+             return $ Just (buf, start, size)
+
+setIndexedBufferRange :: IndexedBufferTarget -> BufferIndex -> Maybe BufferRange -> IO ()
+setIndexedBufferRange t i br =
+   case marshalGetPName . marshalIndexedBufferTarget $ t of
+      Nothing -> recordInvalidEnum
+      Just t' -> glBindBufferRange t' i (bufferID buf) start range
+   where (buf, start, range) = fromMaybe (noBufferObject, 0, 0) br
+
+getIndexed :: Num a => IPName1I -> BufferIndex -> GettableStateVar a
+getIndexed e i = makeGettableStateVar $ getInteger641i fromIntegral e i
+
+marshalIndexedBufferStart :: IndexedBufferTarget -> IPName1I
+marshalIndexedBufferStart x = case x of
+   IndexedAtomicCounterBuffer -> GetAtomicCounterBufferStart
+   IndexedShaderStorageBuffer -> GetShaderStorageBufferStart
+   IndexedTransformFeedbackBuffer -> GetTransformFeedbackBufferStart
+   IndexedUniformBuffer -> GetUniformBufferStart
+
+indexedBufferStart :: IndexedBufferTarget -> BufferIndex -> GettableStateVar RangeStartIndex
+indexedBufferStart = getIndexed . marshalIndexedBufferStart
+
+marshalIndexedBufferSize :: IndexedBufferTarget -> IPName1I
+marshalIndexedBufferSize x = case x of
+   IndexedAtomicCounterBuffer -> GetAtomicCounterBufferSize
+   IndexedShaderStorageBuffer -> GetShaderStorageBufferSize
+   IndexedTransformFeedbackBuffer -> GetTransformFeedbackBufferSize
+   IndexedUniformBuffer -> GetUniformBufferSize
+
+indexedBufferSize :: IndexedBufferTarget -> BufferIndex -> GettableStateVar RangeSize
+indexedBufferSize = getIndexed . marshalIndexedBufferSize
diff --git a/src/Graphics/Rendering/OpenGL/GL/ByteString.hs b/src/Graphics/Rendering/OpenGL/GL/ByteString.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/ByteString.hs
@@ -0,0 +1,70 @@
+{-# OPTIONS_HADDOCK hide #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.ByteString
+-- Copyright   :  (c) Sven Panne 2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This is a purely internal module for interfacing with ByteStrings.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.ByteString (
+   B.ByteString, stringQuery, createAndTrimByteString,
+   withByteString, withGLstring,
+   packUtf8, unpackUtf8,
+   getStringWith
+) where
+
+import Data.StateVar
+import Foreign.Ptr
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.GL
+import qualified Data.ByteString as B
+import qualified Data.ByteString.Internal as BI
+import qualified Data.ByteString.Unsafe as BU
+import qualified Data.Text as T
+import qualified Data.Text.Encoding as TE
+
+--------------------------------------------------------------------------------
+
+stringQuery :: (a -> GettableStateVar GLsizei)
+            -> (a -> GLsizei -> Ptr GLsizei -> Ptr GLchar -> IO ())
+            -> a
+            -> IO B.ByteString
+stringQuery lengthVar getStr obj = do
+   len <- get (lengthVar obj)
+   createByteString len $
+      getStr obj len nullPtr
+
+createByteString :: Integral a => a -> (Ptr GLchar -> IO ()) -> IO B.ByteString
+createByteString size act = BI.create (fromIntegral size) (act . castPtr)
+
+createAndTrimByteString ::
+   (Integral a, Integral b) => a -> (Ptr GLchar -> IO b) -> IO B.ByteString
+createAndTrimByteString maxLen act =
+   BI.createAndTrim (fromIntegral maxLen) (fmap fromIntegral . act . castPtr)
+
+withByteString :: B.ByteString -> (Ptr GLchar -> GLsizei -> IO b) -> IO b
+withByteString bs act =
+   BU.unsafeUseAsCStringLen bs $ \(ptr, size) ->
+      act (castPtr ptr) (fromIntegral size)
+
+withGLstring :: String -> (Ptr GLchar -> IO a) -> IO a
+withGLstring s act = withByteString (packUtf8 (s ++ "\0")) (const . act)
+
+packUtf8 :: String -> B.ByteString
+packUtf8 = TE.encodeUtf8 . T.pack
+
+unpackUtf8 :: B.ByteString -> String
+unpackUtf8 = T.unpack . TE.decodeUtf8
+
+getStringWith :: IO (Ptr GLubyte) -> IO String
+getStringWith getStr = getStr >>= maybeNullPtr (return "") peekGLstring
+
+peekGLstring :: Ptr GLubyte -> IO String
+peekGLstring p = fmap unpackUtf8 $ BU.unsafePackCString (castPtr p)
diff --git a/src/Graphics/Rendering/OpenGL/GL/Capability.hs b/src/Graphics/Rendering/OpenGL/GL/Capability.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/Capability.hs
@@ -0,0 +1,310 @@
+{-# OPTIONS_HADDOCK hide #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.Capability
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This is a purely internal module for handling OpenGL capabilities, i.e.
+-- boolean state variables.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.Capability (
+   Capability(..), marshalCapability, unmarshalCapability,
+   EnableCap(..), makeCapability, makeStateVarMaybe,
+
+   IndexedEnableCap(..), makeIndexedCapability,
+) where
+
+import Data.StateVar
+import Graphics.Rendering.OpenGL.GL.GLboolean
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.Rendering.OpenGL.GLU.ErrorsInternal
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+data Capability =
+     Disabled
+   | Enabled
+   deriving ( Eq, Ord, Show )
+
+--------------------------------------------------------------------------------
+
+marshalCapability :: Capability -> GLboolean
+marshalCapability = marshalGLboolean . (Enabled ==)
+
+unmarshalCapability :: GLboolean -> Capability
+unmarshalCapability x = if unmarshalGLboolean x then Enabled else Disabled
+
+--------------------------------------------------------------------------------
+
+data EnableCap =
+     CapFog
+   | CapLighting
+   | CapTexture1D
+   | CapTexture2D
+   | CapTexture2DMultisample
+   | CapTexture1DArray
+   | CapTextureRectangle
+   | CapTextureCubeMap
+   | CapTexture3D
+   | CapTexture2DArray
+   | CapTexture2DMultisampleArray
+   | CapTextureCubeMapArray
+   | CapLineStipple
+   | CapPolygonStipple
+   | CapCullFace
+   | CapAlphaTest
+   | CapBlend
+   | CapIndexLogicOp
+   | CapColorLogicOp
+   | CapDither
+   | CapStencilTest
+   | CapDepthTest
+   | CapClipPlane GLsizei
+   | CapLight GLsizei
+   | CapTextureGenS
+   | CapTextureGenT
+   | CapTextureGenR
+   | CapTextureGenQ
+   | CapMap1Vertex3
+   | CapMap1Vertex4
+   | CapMap1Color4
+   | CapMap1Index
+   | CapMap1Normal
+   | CapMap1TextureCoord1
+   | CapMap1TextureCoord2
+   | CapMap1TextureCoord3
+   | CapMap1TextureCoord4
+   | CapMap2Vertex3
+   | CapMap2Vertex4
+   | CapMap2Color4
+   | CapMap2Index
+   | CapMap2Normal
+   | CapMap2TextureCoord1
+   | CapMap2TextureCoord2
+   | CapMap2TextureCoord3
+   | CapMap2TextureCoord4
+   | CapPointSmooth
+   | CapLineSmooth
+   | CapPolygonSmooth
+   | CapScissorTest
+   | CapColorMaterial
+   | CapNormalize
+   | CapAutoNormal
+   | CapPolygonOffsetPoint
+   | CapPolygonOffsetLine
+   | CapPolygonOffsetFill
+   | CapVertexArray
+   | CapNormalArray
+   | CapColorArray
+   | CapIndexArray
+   | CapTextureCoordArray
+   | CapEdgeFlagArray
+   | CapFogCoordArray
+   | CapSecondaryColorArray
+   | CapMatrixIndexArray
+   | CapConvolution1D
+   | CapConvolution2D
+   | CapSeparable2D
+   | CapHistogram
+   | CapMinmax
+   | CapRescaleNormal
+   | CapSharedTexturePalette
+   | CapMultisample
+   | CapSampleAlphaToCoverage
+   | CapSampleAlphaToOne
+   | CapSampleCoverage
+   | CapColorTable
+   | CapPostConvolutionColorTable
+   | CapPostColorMatrixColorTable
+   | CapColorSum
+   | CapWeightSumUnity
+   | CapVertexBlend
+   | CapWeightArray
+   | CapMatrixPalette
+   | CapDepthClamp
+   | CapDepthBoundsTest
+   | CapPrimitiveRestart
+   | CapPointSprite
+   | CapStencilTestTwoSide
+   | CapRasterPositionUnclipped
+   | CapRasterizerDiscard
+   | CapTextureColorTable
+   | CapVertexProgramPointSize
+   | CapVertexProgramTwoSide
+   | CapDebugOutput
+   | CapDebugOutputSynchronous
+
+marshalEnableCap :: EnableCap -> Maybe GLenum
+marshalEnableCap x = case x of
+   CapFog -> Just GL_FOG
+   CapLighting -> Just GL_LIGHTING
+   CapTexture1D -> Just GL_TEXTURE_1D
+   CapTexture2D -> Just GL_TEXTURE_2D
+   CapTexture2DMultisample -> Just GL_TEXTURE_2D_MULTISAMPLE
+   CapTexture1DArray -> Just GL_TEXTURE_1D_ARRAY
+   CapTextureRectangle -> Just GL_TEXTURE_RECTANGLE
+   CapTextureCubeMap -> Just GL_TEXTURE_CUBE_MAP
+   CapTexture3D -> Just GL_TEXTURE_3D
+   CapTexture2DArray -> Just GL_TEXTURE_2D_ARRAY
+   CapTexture2DMultisampleArray -> Just GL_TEXTURE_2D_MULTISAMPLE_ARRAY
+   CapTextureCubeMapArray -> Just GL_TEXTURE_CUBE_MAP_ARRAY
+   CapLineStipple -> Just GL_LINE_STIPPLE
+   CapPolygonStipple -> Just GL_POLYGON_STIPPLE
+   CapCullFace -> Just GL_CULL_FACE
+   CapAlphaTest -> Just GL_ALPHA_TEST
+   CapBlend -> Just GL_BLEND
+   CapIndexLogicOp -> Just GL_INDEX_LOGIC_OP
+   CapColorLogicOp -> Just GL_COLOR_LOGIC_OP
+   CapDither -> Just GL_DITHER
+   CapStencilTest -> Just GL_STENCIL_TEST
+   CapDepthTest -> Just GL_DEPTH_TEST
+   CapClipPlane i -> clipPlaneIndexToEnum i
+   CapLight i -> lightIndexToEnum i
+   CapTextureGenS -> Just GL_TEXTURE_GEN_S
+   CapTextureGenT -> Just GL_TEXTURE_GEN_T
+   CapTextureGenR -> Just GL_TEXTURE_GEN_R
+   CapTextureGenQ -> Just GL_TEXTURE_GEN_Q
+   CapMap1Vertex3 -> Just GL_MAP1_VERTEX_3
+   CapMap1Vertex4 -> Just GL_MAP1_VERTEX_4
+   CapMap1Color4 -> Just GL_MAP1_COLOR_4
+   CapMap1Index -> Just GL_MAP1_INDEX
+   CapMap1Normal -> Just GL_MAP1_NORMAL
+   CapMap1TextureCoord1 -> Just GL_MAP1_TEXTURE_COORD_1
+   CapMap1TextureCoord2 -> Just GL_MAP1_TEXTURE_COORD_2
+   CapMap1TextureCoord3 -> Just GL_MAP1_TEXTURE_COORD_3
+   CapMap1TextureCoord4 -> Just GL_MAP1_TEXTURE_COORD_4
+   CapMap2Vertex3 -> Just GL_MAP2_VERTEX_3
+   CapMap2Vertex4 -> Just GL_MAP2_VERTEX_4
+   CapMap2Color4 -> Just GL_MAP2_COLOR_4
+   CapMap2Index -> Just GL_MAP2_INDEX
+   CapMap2Normal -> Just GL_MAP2_NORMAL
+   CapMap2TextureCoord1 -> Just GL_MAP2_TEXTURE_COORD_1
+   CapMap2TextureCoord2 -> Just GL_MAP2_TEXTURE_COORD_2
+   CapMap2TextureCoord3 -> Just GL_MAP2_TEXTURE_COORD_3
+   CapMap2TextureCoord4 -> Just GL_MAP2_TEXTURE_COORD_4
+   CapPointSmooth -> Just GL_POINT_SMOOTH
+   CapLineSmooth -> Just GL_LINE_SMOOTH
+   CapPolygonSmooth -> Just GL_POLYGON_SMOOTH
+   CapScissorTest -> Just GL_SCISSOR_TEST
+   CapColorMaterial -> Just GL_COLOR_MATERIAL
+   CapNormalize -> Just GL_NORMALIZE
+   CapAutoNormal -> Just GL_AUTO_NORMAL
+   CapPolygonOffsetPoint -> Just GL_POLYGON_OFFSET_POINT
+   CapPolygonOffsetLine -> Just GL_POLYGON_OFFSET_LINE
+   CapPolygonOffsetFill -> Just GL_POLYGON_OFFSET_FILL
+   CapVertexArray -> Just GL_VERTEX_ARRAY
+   CapNormalArray -> Just GL_NORMAL_ARRAY
+   CapColorArray -> Just GL_COLOR_ARRAY
+   CapIndexArray -> Just GL_INDEX_ARRAY
+   CapTextureCoordArray -> Just GL_TEXTURE_COORD_ARRAY
+   CapEdgeFlagArray -> Just GL_EDGE_FLAG_ARRAY
+   CapFogCoordArray -> Just GL_FOG_COORD_ARRAY
+   CapSecondaryColorArray -> Just GL_SECONDARY_COLOR_ARRAY
+   CapMatrixIndexArray -> Just GL_MATRIX_INDEX_ARRAY_ARB
+   CapConvolution1D -> Just GL_CONVOLUTION_1D
+   CapConvolution2D -> Just GL_CONVOLUTION_2D
+   CapSeparable2D -> Just GL_SEPARABLE_2D
+   CapHistogram -> Just GL_HISTOGRAM
+   CapMinmax -> Just GL_MINMAX
+   CapRescaleNormal -> Just GL_RESCALE_NORMAL
+   CapSharedTexturePalette -> Just GL_SHARED_TEXTURE_PALETTE_EXT
+   CapMultisample -> Just GL_MULTISAMPLE
+   CapSampleAlphaToCoverage -> Just GL_SAMPLE_ALPHA_TO_COVERAGE
+   CapSampleAlphaToOne -> Just GL_SAMPLE_ALPHA_TO_ONE
+   CapSampleCoverage -> Just GL_SAMPLE_COVERAGE
+   CapColorTable -> Just GL_COLOR_TABLE
+   CapPostConvolutionColorTable -> Just GL_POST_CONVOLUTION_COLOR_TABLE
+   CapPostColorMatrixColorTable -> Just GL_POST_COLOR_MATRIX_COLOR_TABLE
+   CapColorSum -> Just GL_COLOR_SUM
+   CapWeightSumUnity -> Just GL_WEIGHT_SUM_UNITY_ARB
+   CapVertexBlend -> Just GL_VERTEX_BLEND_ARB
+   CapWeightArray -> Just GL_WEIGHT_ARRAY_ARB
+   CapMatrixPalette -> Just GL_MATRIX_PALETTE_ARB
+   CapDepthClamp -> Just GL_DEPTH_CLAMP
+   CapDepthBoundsTest -> Just GL_DEPTH_BOUNDS_TEST_EXT
+   CapPrimitiveRestart -> Just GL_PRIMITIVE_RESTART
+   CapPointSprite -> Just GL_POINT_SPRITE
+   CapStencilTestTwoSide -> Just GL_STENCIL_TEST_TWO_SIDE_EXT
+   CapRasterPositionUnclipped -> Just GL_RASTER_POSITION_UNCLIPPED_IBM
+   CapRasterizerDiscard -> Just GL_RASTERIZER_DISCARD
+   CapTextureColorTable -> Just GL_TEXTURE_COLOR_TABLE_SGI
+   CapVertexProgramPointSize -> Just GL_VERTEX_PROGRAM_POINT_SIZE
+   CapVertexProgramTwoSide -> Just GL_VERTEX_PROGRAM_TWO_SIDE
+   CapDebugOutput -> Just GL_DEBUG_OUTPUT
+   CapDebugOutputSynchronous -> Just GL_DEBUG_OUTPUT_SYNCHRONOUS
+
+--------------------------------------------------------------------------------
+
+makeCapability :: EnableCap -> StateVar Capability
+makeCapability cap = makeStateVar (isEnabled cap) (enable cap)
+
+--------------------------------------------------------------------------------
+
+isEnabled :: EnableCap -> IO Capability
+isEnabled =
+   maybe (do recordInvalidEnum; return Disabled)
+         (fmap unmarshalCapability . glIsEnabled) .
+   marshalEnableCap
+
+--------------------------------------------------------------------------------
+
+enable :: EnableCap -> Capability -> IO ()
+enable cap state = maybe recordInvalidEnum (f state) (marshalEnableCap cap)
+   where f Disabled = glDisable
+         f Enabled  = glEnable
+
+--------------------------------------------------------------------------------
+
+makeStateVarMaybe :: IO EnableCap -> IO a -> (a -> IO ()) -> StateVar (Maybe a)
+makeStateVarMaybe getCap getAct setAct =
+   makeStateVar
+      (getStateVarMaybe getCap getAct)
+      (setStateVarMaybe getCap setAct)
+
+getStateVarMaybe :: IO EnableCap -> IO a -> IO (Maybe a)
+getStateVarMaybe getCap act = do
+   capability <- fmap makeCapability getCap
+   state <- get capability
+   if state == Enabled
+      then fmap Just act
+      else return Nothing
+
+setStateVarMaybe :: IO EnableCap -> (a -> IO ()) -> Maybe a -> IO ()
+setStateVarMaybe getCap act val = do
+   capability <- fmap makeCapability getCap
+   maybe (capability $= Disabled) (\x -> act x >> capability $= Enabled) val
+
+--------------------------------------------------------------------------------
+
+data IndexedEnableCap =
+   BlendI
+
+marshalIndexedEnableCap :: IndexedEnableCap -> Maybe GLenum
+marshalIndexedEnableCap x = case x of
+   BlendI -> Just GL_BLEND
+
+makeIndexedCapability ::(a -> GLuint) -> IndexedEnableCap ->  a
+   -> StateVar Capability
+makeIndexedCapability f cap val = makeStateVar
+   (isIndexedEnabled (f val) cap)
+   (\state -> enableIndexed (f val) cap state)
+
+isIndexedEnabled :: GLuint -> IndexedEnableCap -> IO Capability
+isIndexedEnabled i =
+   maybe (do recordInvalidEnum; return Disabled)
+         (\cap -> fmap unmarshalCapability $ glIsEnabledi cap i) .
+   marshalIndexedEnableCap
+
+enableIndexed :: GLuint -> IndexedEnableCap -> Capability -> IO ()
+enableIndexed i cap state =
+   maybe recordInvalidEnum (f state) (marshalIndexedEnableCap cap)
+      where f Enabled  = \c -> glEnablei c i
+            f Disabled = \c -> glDisablei c i
diff --git a/src/Graphics/Rendering/OpenGL/GL/Clipping.hs b/src/Graphics/Rendering/OpenGL/GL/Clipping.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/Clipping.hs
@@ -0,0 +1,57 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.Clipping
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 13.5 (Primitive Clipping) of the OpenGL
+-- 4.4 specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.Clipping (
+   ClipPlaneName(..), clipPlane, maxClipPlanes
+) where
+
+import Data.StateVar
+import Foreign.Marshal.Alloc
+import Foreign.Marshal.Utils
+import Foreign.Ptr
+import Foreign.Storable
+import Graphics.Rendering.OpenGL.GL.Capability
+import Graphics.Rendering.OpenGL.GL.CoordTrans
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.Rendering.OpenGL.GLU.ErrorsInternal
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+newtype ClipPlaneName = ClipPlaneName GLsizei
+   deriving ( Eq, Ord, Show )
+
+--------------------------------------------------------------------------------
+
+clipPlane :: ClipPlaneName -> StateVar (Maybe (Plane GLdouble))
+clipPlane name =
+   makeStateVarMaybe
+      (return $ nameToCap name)
+      (alloca $ \buf -> do
+          clipPlaneAction name $ flip glGetClipPlane $ castPtr buf
+          peek buf)
+      (\plane -> with plane $ clipPlaneAction name . flip glClipPlane . castPtr)
+
+nameToCap :: ClipPlaneName -> EnableCap
+nameToCap (ClipPlaneName i) = CapClipPlane i
+
+clipPlaneAction :: ClipPlaneName -> (GLenum -> IO ()) -> IO ()
+clipPlaneAction (ClipPlaneName i) act =
+   maybe recordInvalidEnum act (clipPlaneIndexToEnum i)
+
+--------------------------------------------------------------------------------
+
+maxClipPlanes :: GettableStateVar GLsizei
+maxClipPlanes = makeGettableStateVar (getSizei1 id GetMaxClipPlanes)
diff --git a/src/Graphics/Rendering/OpenGL/GL/ColorSum.hs b/src/Graphics/Rendering/OpenGL/GL/ColorSum.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/ColorSum.hs
@@ -0,0 +1,25 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.ColorSum
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+-- 
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 3.9 (Color Sum) of the OpenGL 2.1 specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.ColorSum (
+   colorSum
+) where
+
+import Data.StateVar
+import Graphics.Rendering.OpenGL.GL.Capability
+
+--------------------------------------------------------------------------------
+
+colorSum :: StateVar Capability
+colorSum = makeCapability CapColorSum
diff --git a/src/Graphics/Rendering/OpenGL/GL/Colors.hs b/src/Graphics/Rendering/OpenGL/GL/Colors.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/Colors.hs
@@ -0,0 +1,510 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.Colors
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 2.14 (Colors and Coloring) of the
+-- OpenGL 2.1 specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.Colors (
+   -- * Lighting
+   lighting, Light(..), light, maxLights,
+   FrontFaceDirection(..), frontFace,
+
+   -- * Lighting Parameter Specification
+   Face(..),
+   materialAmbient, materialDiffuse, materialAmbientAndDiffuse,
+   materialSpecular, materialEmission, materialShininess, maxShininess,
+   materialColorIndexes,
+
+   ambient, diffuse, specular,
+   position, spotDirection, spotExponent, maxSpotExponent, spotCutoff,
+   attenuation,
+
+   lightModelAmbient, lightModelLocalViewer, lightModelTwoSide,
+   vertexProgramTwoSide,
+   LightModelColorControl(..), lightModelColorControl,
+
+   -- * ColorMaterial
+   ColorMaterialParameter(..), colorMaterial,
+
+   -- * Flatshading
+   ShadingModel(..), shadeModel,
+
+   -- * Color clamping
+   ClampTarget(..), ClampMode(..),
+   clampColor,
+) where
+
+import Control.Monad
+import Data.StateVar
+import Foreign.Marshal.Alloc
+import Foreign.Marshal.Array
+import Foreign.Marshal.Utils
+import Foreign.Ptr
+import Foreign.Storable
+import Graphics.Rendering.OpenGL.GL.Tensor
+import Graphics.Rendering.OpenGL.GL.Capability
+import Graphics.Rendering.OpenGL.GL.Face
+import Graphics.Rendering.OpenGL.GL.PeekPoke
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.Rendering.OpenGL.GL.VertexSpec
+import Graphics.Rendering.OpenGL.GLU.ErrorsInternal
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+lighting :: StateVar Capability
+lighting = makeCapability CapLighting
+
+--------------------------------------------------------------------------------
+
+newtype Light = Light GLsizei
+   deriving ( Eq, Ord, Show )
+
+marshalLight :: Light -> Maybe GLenum
+marshalLight (Light l) = lightIndexToEnum l
+
+--------------------------------------------------------------------------------
+
+light :: Light -> StateVar Capability
+light (Light l) = makeCapability (CapLight l)
+
+maxLights :: GettableStateVar GLsizei
+maxLights = makeGettableStateVar (getSizei1 id GetMaxLights)
+
+--------------------------------------------------------------------------------
+
+data FrontFaceDirection =
+     CW
+   | CCW
+   deriving ( Eq, Ord, Show )
+
+marshalFrontFaceDirection :: FrontFaceDirection -> GLenum
+marshalFrontFaceDirection x = case x of
+   CW -> GL_CW
+   CCW -> GL_CCW
+
+unmarshalFrontFaceDirection :: GLenum -> FrontFaceDirection
+unmarshalFrontFaceDirection x
+   | x == GL_CW = CW
+   | x == GL_CCW = CCW
+   | otherwise = error ("unmarshalFrontFaceDirection: illegal value " ++ show x)
+
+--------------------------------------------------------------------------------
+
+frontFace :: StateVar FrontFaceDirection
+frontFace =
+   makeStateVar
+      (getEnum1 unmarshalFrontFaceDirection GetFrontFace)
+      (glFrontFace . marshalFrontFaceDirection)
+
+--------------------------------------------------------------------------------
+
+data MaterialParameter =
+     MaterialEmission
+   | MaterialShininess
+   | MaterialAmbientAndDiffuse
+   | MaterialColorIndexes
+   | MaterialAmbient
+   | MaterialDiffuse
+   | MaterialSpecular
+
+marshalMaterialParameter :: MaterialParameter -> GLenum
+marshalMaterialParameter x = case x of
+   MaterialEmission -> GL_EMISSION
+   MaterialShininess -> GL_SHININESS
+   MaterialAmbientAndDiffuse -> GL_AMBIENT_AND_DIFFUSE
+   MaterialColorIndexes -> GL_COLOR_INDEXES
+   MaterialAmbient -> GL_AMBIENT
+   MaterialDiffuse -> GL_DIFFUSE
+   MaterialSpecular -> GL_SPECULAR
+
+--------------------------------------------------------------------------------
+
+materialAmbient :: Face -> StateVar (Color4 GLfloat)
+materialAmbient =
+   makeMaterialVar glGetMaterialfvc glMaterialfvc MaterialAmbient
+
+materialDiffuse :: Face -> StateVar (Color4 GLfloat)
+materialDiffuse =
+   makeMaterialVar glGetMaterialfvc glMaterialfvc MaterialDiffuse
+
+materialAmbientAndDiffuse :: Face -> StateVar (Color4 GLfloat)
+materialAmbientAndDiffuse =
+   makeMaterialVar glGetMaterialfvc glMaterialfvc MaterialAmbientAndDiffuse
+
+materialSpecular :: Face -> StateVar (Color4 GLfloat)
+materialSpecular =
+   makeMaterialVar glGetMaterialfvc glMaterialfvc MaterialSpecular
+
+materialEmission :: Face -> StateVar (Color4 GLfloat)
+materialEmission =
+   makeMaterialVar glGetMaterialfvc glMaterialfvc MaterialEmission
+
+makeMaterialVar :: Storable a
+                => (GLenum -> GLenum -> Ptr a -> IO ())
+                -> (GLenum -> GLenum -> Ptr a -> IO ())
+                -> MaterialParameter -> Face -> StateVar a
+makeMaterialVar getter setter materialParameter face =
+   makeStateVar (alloca $ \buf -> do getter f mp buf ; peek buf)
+                (\val -> with val $ setter f mp)
+   where mp = marshalMaterialParameter materialParameter
+         f  = marshalFace face
+
+glGetMaterialfvc :: GLenum -> GLenum -> Ptr (Color4 GLfloat) -> IO ()
+glGetMaterialfvc face pname ptr = glGetMaterialfv face pname (castPtr ptr)
+
+glMaterialfvc :: GLenum -> GLenum -> Ptr (Color4 GLfloat) -> IO ()
+glMaterialfvc face pname ptr = glMaterialfv face pname (castPtr ptr)
+
+--------------------------------------------------------------------------------
+
+materialShininess :: Face -> StateVar GLfloat
+materialShininess =
+   makeMaterialVar glGetMaterialfvf glMaterialff MaterialShininess
+
+glGetMaterialfvf :: GLenum -> GLenum -> Ptr GLfloat -> IO ()
+glGetMaterialfvf face pname ptr = glGetMaterialfv face pname (castPtr ptr)
+
+glMaterialff :: GLenum -> GLenum -> Ptr GLfloat -> IO ()
+glMaterialff face pname ptr = glMaterialfv face pname (castPtr ptr)
+
+maxShininess :: GettableStateVar GLfloat
+maxShininess = makeGettableStateVar $ getFloat1 id GetMaxShininess
+
+--------------------------------------------------------------------------------
+
+-- Alas, (Index1 GLint, Index1 GLint, Index1 GLint) is not an instance of
+-- Storable...
+
+materialColorIndexes ::
+   Face -> StateVar (Index1 GLint, Index1 GLint, Index1 GLint)
+materialColorIndexes face =
+   makeStateVar (getMaterialColorIndexes face) (setMaterialColorIndexes face)
+
+getMaterialColorIndexes :: Face -> IO (Index1 GLint, Index1 GLint, Index1 GLint)
+getMaterialColorIndexes face =
+   allocaArray 3 $ \buf -> do
+      glGetMaterialiv (marshalFace face)
+                      (marshalMaterialParameter MaterialColorIndexes)
+                      buf
+      peek3 (\a d s -> (Index1 a, Index1 d, Index1 s)) buf
+
+setMaterialColorIndexes ::
+   Face -> (Index1 GLint, Index1 GLint, Index1 GLint) -> IO ()
+setMaterialColorIndexes face (Index1 a, Index1 d, Index1 s) =
+   withArray [a, d, s] $
+      glMaterialiv (marshalFace face)
+                   (marshalMaterialParameter MaterialColorIndexes)
+
+--------------------------------------------------------------------------------
+
+data LightParameter =
+     Ambient'
+   | Diffuse'
+   | Specular'
+   | Position
+   | SpotDirection
+   | SpotExponent
+   | SpotCutoff
+   | ConstantAttenuation
+   | LinearAttenuation
+   | QuadraticAttenuation
+
+marshalLightParameter :: LightParameter -> GLenum
+marshalLightParameter x = case x of
+   Ambient' -> GL_AMBIENT
+   Diffuse' -> GL_DIFFUSE
+   Specular' -> GL_SPECULAR
+   Position -> GL_POSITION
+   SpotDirection -> GL_SPOT_DIRECTION
+   SpotExponent -> GL_SPOT_EXPONENT
+   SpotCutoff -> GL_SPOT_CUTOFF
+   ConstantAttenuation -> GL_CONSTANT_ATTENUATION
+   LinearAttenuation -> GL_LINEAR_ATTENUATION
+   QuadraticAttenuation -> GL_QUADRATIC_ATTENUATION
+
+--------------------------------------------------------------------------------
+
+ambient :: Light -> StateVar (Color4 GLfloat)
+ambient = makeLightVar glGetLightfvc glLightfvc Ambient' black
+
+black :: Color4 GLfloat
+black = Color4 0 0 0 0
+
+diffuse :: Light -> StateVar (Color4 GLfloat)
+diffuse = makeLightVar glGetLightfvc glLightfvc Diffuse' black
+
+specular :: Light -> StateVar (Color4 GLfloat)
+specular = makeLightVar glGetLightfvc glLightfvc Specular' black
+
+makeLightVar :: Storable a
+             => (GLenum -> GLenum -> Ptr a -> IO ())
+             -> (GLenum -> GLenum -> Ptr a -> IO ())
+             -> LightParameter -> a -> Light -> StateVar a
+makeLightVar getter setter lightParameter defaultValue theLight =
+   makeStateVar (maybe (return defaultValue) getLightVar ml)
+                (\val -> maybe recordInvalidEnum (setLightVar val) ml)
+   where lp          = marshalLightParameter lightParameter
+         ml          = marshalLight theLight
+         getLightVar = \l -> alloca $ \buf -> do getter l lp buf ; peek buf
+         setLightVar = \val l -> with val $ setter l lp
+
+glGetLightfvc :: GLenum -> GLenum -> Ptr (Color4 GLfloat) -> IO ()
+glGetLightfvc l pname ptr = glGetLightfv l pname (castPtr ptr)
+
+glLightfvc :: GLenum -> GLenum -> Ptr (Color4 GLfloat) -> IO ()
+glLightfvc l pname ptr = glLightfv l pname (castPtr ptr)
+
+--------------------------------------------------------------------------------
+
+position :: Light -> StateVar (Vertex4 GLfloat)
+position = makeLightVar glGetLightfvv glLightfvv Position (Vertex4 0 0 0 0)
+
+glLightfvv :: GLenum -> GLenum -> Ptr (Vertex4 GLfloat) -> IO ()
+glLightfvv l pname ptr = glLightfv l pname (castPtr ptr)
+
+glGetLightfvv :: GLenum -> GLenum -> Ptr (Vertex4 GLfloat) -> IO ()
+glGetLightfvv l pname ptr = glGetLightfv l pname (castPtr ptr)
+
+--------------------------------------------------------------------------------
+
+spotDirection :: Light -> StateVar (Normal3 GLfloat)
+spotDirection =
+   makeLightVar glGetLightfvn glLightfvn SpotDirection (Normal3 0 0 0)
+
+glLightfvn :: GLenum -> GLenum -> Ptr (Normal3 GLfloat) -> IO ()
+glLightfvn l pname ptr = glLightfv l pname (castPtr ptr)
+
+glGetLightfvn :: GLenum -> GLenum -> Ptr (Normal3 GLfloat) -> IO ()
+glGetLightfvn l pname ptr = glGetLightfv l pname (castPtr ptr)
+
+--------------------------------------------------------------------------------
+
+spotExponent :: Light -> StateVar GLfloat
+spotExponent = makeLightVar glGetLightfv glLightfv SpotExponent 0
+
+maxSpotExponent :: GettableStateVar GLfloat
+maxSpotExponent = makeGettableStateVar $ getFloat1 id GetMaxSpotExponent
+
+--------------------------------------------------------------------------------
+
+spotCutoff :: Light -> StateVar GLfloat
+spotCutoff = makeLightVar glGetLightfv glLightfv SpotCutoff 0
+
+--------------------------------------------------------------------------------
+
+attenuation :: Light -> StateVar (GLfloat, GLfloat, GLfloat)
+attenuation theLight =
+   makeStateVar
+      (liftM3 (,,) (get (constantAttenuation  theLight))
+                   (get (linearAttenuation    theLight))
+                   (get (quadraticAttenuation theLight)))
+      (\(constant, linear, quadratic) -> do
+         constantAttenuation  theLight $= constant
+         linearAttenuation    theLight $= linear
+         quadraticAttenuation theLight $= quadratic)
+
+constantAttenuation :: Light -> StateVar GLfloat
+constantAttenuation = makeLightVar glGetLightfv glLightfv ConstantAttenuation 0
+
+linearAttenuation :: Light -> StateVar GLfloat
+linearAttenuation = makeLightVar glGetLightfv glLightfv LinearAttenuation 0
+
+quadraticAttenuation :: Light -> StateVar GLfloat
+quadraticAttenuation =
+   makeLightVar glGetLightfv glLightfv QuadraticAttenuation 0
+
+--------------------------------------------------------------------------------
+
+data LightModelParameter =
+     LightModelAmbient
+   | LightModelLocalViewer
+   | LightModelTwoSide
+   | LightModelColorControl
+
+marshalLightModelParameter :: LightModelParameter -> GLenum
+marshalLightModelParameter x = case x of
+   LightModelAmbient -> GL_LIGHT_MODEL_AMBIENT
+   LightModelLocalViewer -> GL_LIGHT_MODEL_LOCAL_VIEWER
+   LightModelTwoSide -> GL_LIGHT_MODEL_TWO_SIDE
+   LightModelColorControl -> GL_LIGHT_MODEL_COLOR_CONTROL
+
+--------------------------------------------------------------------------------
+
+lightModelAmbient :: StateVar (Color4 GLfloat)
+lightModelAmbient =
+   makeStateVar
+      (getFloat4 Color4 GetLightModelAmbient)
+      (\c -> with c $
+                glLightModelfv (marshalLightModelParameter LightModelAmbient) . castPtr)
+
+--------------------------------------------------------------------------------
+
+lightModelLocalViewer :: StateVar Capability
+lightModelLocalViewer =
+   makeLightModelCapVar GetLightModelLocalViewer LightModelLocalViewer
+
+makeLightModelCapVar :: PName1I -> LightModelParameter -> StateVar Capability
+makeLightModelCapVar pname lightModelParameter =
+   makeStateVar
+      (getBoolean1 unmarshalCapability pname)
+      (glLightModeli (marshalLightModelParameter lightModelParameter) .
+                     fromIntegral . marshalCapability)
+
+--------------------------------------------------------------------------------
+
+lightModelTwoSide :: StateVar Capability
+lightModelTwoSide = makeLightModelCapVar GetLightModelTwoSide LightModelTwoSide
+
+vertexProgramTwoSide :: StateVar Capability
+vertexProgramTwoSide = makeCapability CapVertexProgramTwoSide
+
+--------------------------------------------------------------------------------
+
+data LightModelColorControl =
+     SingleColor
+   | SeparateSpecularColor
+   deriving ( Eq, Ord, Show )
+
+marshalLightModelColorControl :: LightModelColorControl -> GLenum
+marshalLightModelColorControl x = case x of
+   SingleColor -> GL_SINGLE_COLOR
+   SeparateSpecularColor -> GL_SEPARATE_SPECULAR_COLOR
+
+unmarshalLightModelColorControl :: GLenum -> LightModelColorControl
+unmarshalLightModelColorControl x
+   | x == GL_SINGLE_COLOR = SingleColor
+   | x == GL_SEPARATE_SPECULAR_COLOR = SeparateSpecularColor
+   | otherwise = error ("unmarshalLightModelColorControl: illegal value " ++ show x)
+
+--------------------------------------------------------------------------------
+
+lightModelColorControl :: StateVar LightModelColorControl
+lightModelColorControl =
+   makeStateVar
+      (getEnum1 unmarshalLightModelColorControl GetLightModelColorControl)
+      (glLightModeli (marshalLightModelParameter LightModelColorControl) .
+                     fromIntegral . marshalLightModelColorControl)
+
+--------------------------------------------------------------------------------
+
+data ColorMaterialParameter =
+     Ambient
+   | Diffuse
+   | Specular
+   | Emission
+   | AmbientAndDiffuse
+   deriving ( Eq, Ord, Show )
+
+marshalColorMaterialParameter :: ColorMaterialParameter -> GLenum
+marshalColorMaterialParameter x = case x of
+   Ambient -> GL_AMBIENT
+   Diffuse -> GL_DIFFUSE
+   Specular -> GL_SPECULAR
+   Emission -> GL_EMISSION
+   AmbientAndDiffuse -> GL_AMBIENT_AND_DIFFUSE
+
+unmarshalColorMaterialParameter :: GLenum -> ColorMaterialParameter
+unmarshalColorMaterialParameter x
+   | x == GL_AMBIENT = Ambient
+   | x == GL_DIFFUSE = Diffuse
+   | x == GL_SPECULAR = Specular
+   | x == GL_EMISSION = Emission
+   | x == GL_AMBIENT_AND_DIFFUSE = AmbientAndDiffuse
+   | otherwise = error ("unmarshalColorMaterialParameter: illegal value " ++ show x)
+
+--------------------------------------------------------------------------------
+
+colorMaterial :: StateVar (Maybe (Face, ColorMaterialParameter))
+colorMaterial =
+   makeStateVarMaybe
+      (return CapColorMaterial)
+      (liftM2
+         (,)
+         (getEnum1 unmarshalFace GetColorMaterialFace)
+         (getEnum1 unmarshalColorMaterialParameter GetColorMaterialParameter))
+      (\(face, param) -> glColorMaterial (marshalFace face)
+                                         (marshalColorMaterialParameter param))
+
+--------------------------------------------------------------------------------
+
+data ShadingModel =
+     Flat
+   | Smooth
+   deriving ( Eq, Ord, Show )
+
+marshalShadingModel :: ShadingModel -> GLenum
+marshalShadingModel x = case x of
+   Flat -> GL_FLAT
+   Smooth -> GL_SMOOTH
+
+unmarshalShadingModel :: GLenum -> ShadingModel
+unmarshalShadingModel x
+   | x == GL_FLAT = Flat
+   | x == GL_SMOOTH = Smooth
+   | otherwise = error ("unmarshalShadingModel: illegal value " ++ show x)
+
+--------------------------------------------------------------------------------
+
+shadeModel :: StateVar ShadingModel
+shadeModel =
+   makeStateVar
+      (getEnum1 unmarshalShadingModel GetShadeModel)
+      (glShadeModel . marshalShadingModel)
+
+--------------------------------------------------------------------------------
+
+data ClampTarget =
+     ClampVertexColor
+   | ClampFragmentColor
+   | ClampReadColor
+   deriving ( Eq, Ord, Show )
+
+marshalClampTarget :: ClampTarget -> GLenum
+marshalClampTarget x = case x of
+   ClampVertexColor -> GL_CLAMP_VERTEX_COLOR
+   ClampFragmentColor -> GL_CLAMP_FRAGMENT_COLOR
+   ClampReadColor -> GL_CLAMP_READ_COLOR
+
+marshalClampTargetToPName :: ClampTarget -> PName1I
+marshalClampTargetToPName x = case x of
+   ClampFragmentColor -> GetFragmentColorClamp
+   ClampVertexColor -> GetVertexColorClamp
+   ClampReadColor -> GetReadColorClamp
+
+--------------------------------------------------------------------------------
+
+data ClampMode =
+     ClampOn
+   | FixedOnly
+   | ClampOff
+   deriving ( Eq, Ord, Show )
+
+marshalClampMode :: ClampMode -> GLenum
+marshalClampMode x = case x of
+   ClampOn -> fromIntegral GL_TRUE
+   FixedOnly -> GL_FIXED_ONLY
+   ClampOff -> fromIntegral GL_FALSE
+
+unmarshalClampMode :: GLenum -> ClampMode
+unmarshalClampMode x
+   | x == fromIntegral GL_TRUE = ClampOn
+   | x == GL_FIXED_ONLY = FixedOnly
+   | x == fromIntegral GL_FALSE = ClampOff
+   | otherwise = error $ "unmarshalClampMode: unknown enum value " ++ show x
+
+--------------------------------------------------------------------------------
+
+clampColor :: ClampTarget -> StateVar ClampMode
+clampColor ct = makeStateVar (getClampColor ct) (setClampColor ct)
+   where getClampColor = getEnum1 unmarshalClampMode . marshalClampTargetToPName
+         setClampColor t = glClampColor (marshalClampTarget t) . marshalClampMode
diff --git a/src/Graphics/Rendering/OpenGL/GL/ComparisonFunction.hs b/src/Graphics/Rendering/OpenGL/GL/ComparisonFunction.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/ComparisonFunction.hs
@@ -0,0 +1,57 @@
+{-# OPTIONS_HADDOCK hide #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.ComparisonFunction
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+-- 
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This is a purely internal module for (un-)marshaling ComparisonFunction.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.ComparisonFunction (
+   ComparisonFunction(..), marshalComparisonFunction,
+   unmarshalComparisonFunction
+) where
+
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+data ComparisonFunction =
+     Never
+   | Less
+   | Equal
+   | Lequal
+   | Greater
+   | Notequal
+   | Gequal
+   | Always
+   deriving ( Eq, Ord, Show )
+
+marshalComparisonFunction :: ComparisonFunction -> GLenum
+marshalComparisonFunction x = case x of
+   Never -> GL_NEVER
+   Less -> GL_LESS
+   Equal -> GL_EQUAL
+   Lequal -> GL_LEQUAL
+   Greater -> GL_GREATER
+   Notequal -> GL_NOTEQUAL
+   Gequal -> GL_GEQUAL
+   Always -> GL_ALWAYS
+
+unmarshalComparisonFunction :: GLenum -> ComparisonFunction
+unmarshalComparisonFunction x
+   | x == GL_NEVER = Never
+   | x == GL_LESS = Less
+   | x == GL_EQUAL = Equal
+   | x == GL_LEQUAL = Lequal
+   | x == GL_GREATER = Greater
+   | x == GL_NOTEQUAL = Notequal
+   | x == GL_GEQUAL = Gequal
+   | x == GL_ALWAYS = Always
+   | otherwise = error ("unmarshalComparisonFunction: illegal value " ++ show x)
diff --git a/src/Graphics/Rendering/OpenGL/GL/ConditionalRendering.hs b/src/Graphics/Rendering/OpenGL/GL/ConditionalRendering.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/ConditionalRendering.hs
@@ -0,0 +1,52 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.ConditionalRendering
+-- Copyright   :  (c) Sven Panne 2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 10.10 (Conditional Rendering) of the
+-- OpenGL 4.4 specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.ConditionalRendering (
+   ConditionalRenderMode(..),
+   beginConditionalRender, endConditionalRender, withConditionalRender
+) where
+
+import Graphics.Rendering.OpenGL.GL.Exception
+import Graphics.Rendering.OpenGL.GL.QueryObject
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+data ConditionalRenderMode =
+     QueryWait
+   | QueryNoWait
+   | QueryByRegionWait
+   | QueryByRegionNoWait
+   deriving ( Eq, Ord, Show )
+
+marshalConditionalRenderMode :: ConditionalRenderMode -> GLenum
+marshalConditionalRenderMode x = case x of
+   QueryWait -> GL_QUERY_WAIT
+   QueryNoWait -> GL_QUERY_NO_WAIT
+   QueryByRegionWait -> GL_QUERY_BY_REGION_WAIT
+   QueryByRegionNoWait -> GL_QUERY_BY_REGION_NO_WAIT
+
+--------------------------------------------------------------------------------
+
+beginConditionalRender :: QueryObject -> ConditionalRenderMode -> IO ()
+beginConditionalRender q =
+   glBeginConditionalRender (queryID q) . marshalConditionalRenderMode
+
+endConditionalRender :: IO ()
+endConditionalRender = glEndConditionalRender
+
+withConditionalRender :: QueryObject -> ConditionalRenderMode -> IO a -> IO a
+withConditionalRender q m =
+   bracket_ (beginConditionalRender q m) endConditionalRender
diff --git a/src/Graphics/Rendering/OpenGL/GL/ControlPoint.hs b/src/Graphics/Rendering/OpenGL/GL/ControlPoint.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/ControlPoint.hs
@@ -0,0 +1,162 @@
+{-# OPTIONS_HADDOCK hide #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.ControlPoint
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+-- 
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This is a purely internal module for handling control points.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.ControlPoint (
+   ControlPoint(..)
+) where
+
+import Foreign.Ptr
+import Foreign.Storable
+import Graphics.Rendering.OpenGL.GL.Tensor
+import Graphics.Rendering.OpenGL.GL.Capability
+import Graphics.Rendering.OpenGL.GL.Domain
+import Graphics.Rendering.OpenGL.GL.VertexArrays
+import Graphics.Rendering.OpenGL.GL.VertexSpec
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+class ControlPoint c where
+   map1Target       :: Domain d => c d -> GLenum
+   map2Target       :: Domain d => c d -> GLenum
+   enableCap1       :: Domain d => c d -> EnableCap
+   enableCap2       :: Domain d => c d -> EnableCap
+   numComponents    :: Domain d => c d -> Stride
+   peekControlPoint :: Domain d => Ptr (c d) -> IO (c d)
+   pokeControlPoint :: Domain d => Ptr (c d) -> (c d) -> IO ()
+
+instance ControlPoint Vertex3 where
+   map1Target       = marshalMapTarget . const Map1Vertex3
+   map2Target       = marshalMapTarget . const Map2Vertex3
+   enableCap1       = const CapMap1Vertex3
+   enableCap2       = const CapMap2Vertex3
+   numComponents    = const 3
+   peekControlPoint = peek
+   pokeControlPoint = poke
+
+instance ControlPoint Vertex4 where
+   map1Target       = marshalMapTarget . const Map1Vertex4
+   map2Target       = marshalMapTarget . const Map2Vertex4
+   enableCap1       = const CapMap1Vertex4
+   enableCap2       = const CapMap2Vertex4
+   numComponents    = const 4
+   peekControlPoint = peek
+   pokeControlPoint = poke
+
+instance ControlPoint Index1 where
+   map1Target       = marshalMapTarget . const Map1Index
+   map2Target       = marshalMapTarget . const Map2Index
+   enableCap1       = const CapMap1Index
+   enableCap2       = const CapMap2Index
+   numComponents    = const 1
+   peekControlPoint = peek
+   pokeControlPoint = poke
+
+instance ControlPoint Color4 where
+   map1Target       = marshalMapTarget . const Map1Color4
+   map2Target       = marshalMapTarget . const Map2Color4
+   enableCap1       = const CapMap1Color4
+   enableCap2       = const CapMap2Color4
+   numComponents    = const 4
+   peekControlPoint = peek
+   pokeControlPoint = poke
+
+instance ControlPoint Normal3 where
+   map1Target       = marshalMapTarget . const Map1Normal
+   map2Target       = marshalMapTarget . const Map2Normal
+   enableCap1       = const CapMap1Normal
+   enableCap2       = const CapMap2Normal
+   numComponents    = const 3
+   peekControlPoint = peek
+   pokeControlPoint = poke
+
+instance ControlPoint TexCoord1 where
+   map1Target       = marshalMapTarget . const Map1TextureCoord1
+   map2Target       = marshalMapTarget . const Map2TextureCoord1
+   enableCap1       = const CapMap1TextureCoord1
+   enableCap2       = const CapMap2TextureCoord1
+   numComponents    = const 1
+   peekControlPoint = peek
+   pokeControlPoint = poke
+
+instance ControlPoint TexCoord2 where
+   map1Target       = marshalMapTarget . const Map1TextureCoord2
+   map2Target       = marshalMapTarget . const Map2TextureCoord2
+   enableCap1       = const CapMap1TextureCoord2
+   enableCap2       = const CapMap2TextureCoord2
+   numComponents    = const 2
+   peekControlPoint = peek
+   pokeControlPoint = poke
+
+instance ControlPoint TexCoord3 where
+   map1Target       = marshalMapTarget . const Map1TextureCoord3
+   map2Target       = marshalMapTarget . const Map2TextureCoord3
+   enableCap1       = const CapMap1TextureCoord3
+   enableCap2       = const CapMap2TextureCoord3
+   numComponents    = const 3
+   peekControlPoint = peek
+   pokeControlPoint = poke
+
+instance ControlPoint TexCoord4 where
+   map1Target       = marshalMapTarget . const Map1TextureCoord4
+   map2Target       = marshalMapTarget . const Map2TextureCoord4
+   enableCap1       = const CapMap1TextureCoord4
+   enableCap2       = const CapMap2TextureCoord4
+   numComponents    = const 4
+   peekControlPoint = peek
+   pokeControlPoint = poke
+
+--------------------------------------------------------------------------------
+
+data MapTarget =
+     Map1Color4
+   | Map1Index
+   | Map1Normal
+   | Map1TextureCoord1
+   | Map1TextureCoord2
+   | Map1TextureCoord3
+   | Map1TextureCoord4
+   | Map1Vertex3
+   | Map1Vertex4
+   | Map2Color4
+   | Map2Index
+   | Map2Normal
+   | Map2TextureCoord1
+   | Map2TextureCoord2
+   | Map2TextureCoord3
+   | Map2TextureCoord4
+   | Map2Vertex3
+   | Map2Vertex4
+
+marshalMapTarget :: MapTarget -> GLenum
+marshalMapTarget x = case x of
+   Map1Color4 -> GL_MAP1_COLOR_4
+   Map1Index -> GL_MAP1_INDEX
+   Map1Normal -> GL_MAP1_NORMAL
+   Map1TextureCoord1 -> GL_MAP1_TEXTURE_COORD_1
+   Map1TextureCoord2 -> GL_MAP1_TEXTURE_COORD_2
+   Map1TextureCoord3 -> GL_MAP1_TEXTURE_COORD_3
+   Map1TextureCoord4 -> GL_MAP1_TEXTURE_COORD_4
+   Map1Vertex3 -> GL_MAP1_VERTEX_3
+   Map1Vertex4 -> GL_MAP1_VERTEX_4
+   Map2Color4 -> GL_MAP2_COLOR_4
+   Map2Index -> GL_MAP2_INDEX
+   Map2Normal -> GL_MAP2_NORMAL
+   Map2TextureCoord1 -> GL_MAP2_TEXTURE_COORD_1
+   Map2TextureCoord2 -> GL_MAP2_TEXTURE_COORD_2
+   Map2TextureCoord3 -> GL_MAP2_TEXTURE_COORD_3
+   Map2TextureCoord4 -> GL_MAP2_TEXTURE_COORD_4
+   Map2Vertex3 -> GL_MAP2_VERTEX_3
+   Map2Vertex4 -> GL_MAP2_VERTEX_4
diff --git a/src/Graphics/Rendering/OpenGL/GL/CoordTrans.hs b/src/Graphics/Rendering/OpenGL/GL/CoordTrans.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/CoordTrans.hs
@@ -0,0 +1,484 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.CoordTrans
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 2.11 (Coordinate Transformations) of the
+-- OpenGL 2.1 specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.CoordTrans (
+   -- * Controlling the Viewport
+   depthRange,
+   Position(..), Size(..), viewport, maxViewportDims,
+
+   -- * Matrices
+   MatrixMode(..), matrixMode,
+   MatrixOrder(..), MatrixComponent(rotate,translate,scale), Matrix(..),
+   matrix, multMatrix, GLmatrix, loadIdentity,
+   ortho, frustum, depthClamp,
+   activeTexture,
+   preservingMatrix, unsafePreservingMatrix,
+   stackDepth, maxStackDepth,
+
+   -- * Normal Transformation
+   rescaleNormal, normalize,
+
+   -- * Generating Texture Coordinates
+   Plane(..), TextureCoordName(..), TextureGenMode(..), textureGenMode
+) where
+
+import Data.StateVar
+import Foreign.ForeignPtr
+import Foreign.Marshal.Alloc
+import Foreign.Marshal.Array
+import Foreign.Marshal.Utils
+import Foreign.Ptr
+import Foreign.Storable
+import Graphics.Rendering.OpenGL.GL.Capability
+import Graphics.Rendering.OpenGL.GL.Exception
+import Graphics.Rendering.OpenGL.GL.MatrixComponent
+import Graphics.Rendering.OpenGL.GL.PeekPoke
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.Rendering.OpenGL.GL.Texturing.TextureUnit
+import Graphics.Rendering.OpenGL.GLU.ErrorsInternal
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+-- | After clipping and division by /w/, depth coordinates range from -1 to 1,
+-- corresponding to the near and far clipping planes. '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 'depthRange'
+-- are both clamped to this range before they are accepted.
+--
+-- The initial setting of (0, 1) maps the near plane to 0 and the far plane to
+-- 1. With this mapping, the depth buffer range is fully utilized.
+--
+-- It is not necessary that the near value be less than the far value. Reverse
+-- mappings such as (1, 0) are acceptable.
+
+depthRange :: StateVar (GLclampd, GLclampd)
+depthRange = makeStateVar (getClampd2 (,) GetDepthRange) (uncurry glDepthRange)
+
+--------------------------------------------------------------------------------
+
+-- | A 2-dimensional position, measured in pixels.
+data Position = Position !GLint !GLint
+   deriving ( Eq, Ord, Show )
+
+-- | A 2-dimensional size, measured in pixels.
+data Size = Size !GLsizei !GLsizei
+   deriving ( Eq, Ord, Show )
+
+-- | Controls the affine transformation from normalized device coordinates to
+-- window coordinates. The viewport state variable consists of the coordinates
+-- (/x/, /y/) of the lower left corner of the viewport rectangle, (in pixels,
+-- initial value (0,0)), and the size (/width/, /height/) of the viewport. When
+-- a GL context is first attached to a window, /width/ and /height/ are set to
+-- the dimensions of that window.
+--
+-- Let (/xnd/, /ynd/) be normalized device coordinates. Then the window
+-- coordinates (/xw/, /yw/) are computed as follows:
+--
+-- /xw/ = (/xnd/ + 1) (/width/  \/ 2) + /x/
+--
+-- /yw/ = (/ynd/ + 1) (/heigth/ \/ 2) + /y/
+--
+-- Viewport width and height are silently clamped to a range that depends on the
+-- implementation, see 'maxViewportDims'.
+
+viewport :: StateVar (Position, Size)
+viewport = makeStateVar (getInteger4 makeVp GetViewport)
+                        (\(Position x y, Size w h) -> glViewport x y w h)
+   where makeVp x y w h = (Position x y, Size (fromIntegral w) (fromIntegral h))
+
+-- | The implementation-dependent maximum viewport width and height.
+
+maxViewportDims :: GettableStateVar Size
+maxViewportDims = makeGettableStateVar (getSizei2 Size GetMaxViewportDims)
+
+--------------------------------------------------------------------------------
+
+-- | A matrix stack.
+
+data MatrixMode =
+     Modelview GLsizei  -- ^ The modelview matrix stack of the specified vertex unit.
+   | Projection         -- ^ The projection matrix stack.
+   | Texture            -- ^ The texture matrix stack.
+   | Color              -- ^ The color matrix stack.
+   | MatrixPalette      -- ^ The matrix palette stack.
+   deriving ( Eq, Ord, Show )
+
+marshalMatrixMode :: MatrixMode -> Maybe GLenum
+marshalMatrixMode x = case x of
+   Modelview i -> modelviewIndexToEnum i
+   Projection -> Just GL_PROJECTION
+   Texture -> Just GL_TEXTURE
+   Color -> Just GL_COLOR
+   MatrixPalette -> Just GL_MATRIX_PALETTE_ARB
+
+unmarshalMatrixMode :: GLenum -> MatrixMode
+unmarshalMatrixMode x
+   | x == GL_PROJECTION = Projection
+   | x == GL_TEXTURE = Texture
+   | x == GL_COLOR = Color
+   | x == GL_MATRIX_PALETTE_ARB = MatrixPalette
+   | otherwise =
+        case modelviewEnumToIndex x of
+           Just i -> Modelview i
+           Nothing -> error ("unmarshalMatrixMode: illegal value " ++ show x)
+
+matrixModeToGetMatrix :: MatrixMode -> PNameMatrix
+matrixModeToGetMatrix x = case x of
+   Modelview _   -> GetModelviewMatrix -- ???
+   Projection    -> GetProjectionMatrix
+   Texture       -> GetTextureMatrix
+   Color         -> GetColorMatrix
+   MatrixPalette -> GetMatrixPalette
+
+matrixModeToGetStackDepth :: MatrixMode -> PName1I
+matrixModeToGetStackDepth x =  case x of
+   Modelview _   -> GetModelviewStackDepth
+   Projection    -> GetProjectionStackDepth
+   Texture       -> GetTextureStackDepth
+   Color         -> GetColorMatrixStackDepth
+   MatrixPalette -> error "matrixModeToGetStackDepth: impossible"
+
+matrixModeToGetMaxStackDepth :: MatrixMode -> PName1I
+matrixModeToGetMaxStackDepth x = case x of
+   Modelview _    -> GetMaxModelviewStackDepth
+   Projection     -> GetMaxProjectionStackDepth
+   Texture        -> GetMaxTextureStackDepth
+   Color          -> GetMaxColorMatrixStackDepth
+   MatrixPalette  -> GetMaxMatrixPaletteStackDepth
+
+--------------------------------------------------------------------------------
+
+-- | Controls which matrix stack is the target for subsequent matrix operations.
+-- The initial value is ('Modelview' 0).
+
+matrixMode :: StateVar MatrixMode
+matrixMode =
+   makeStateVar (getEnum1 unmarshalMatrixMode GetMatrixMode)
+                (maybe recordInvalidValue glMatrixMode . marshalMatrixMode)
+
+--------------------------------------------------------------------------------
+
+data MatrixOrder = ColumnMajor | RowMajor
+   deriving ( Eq, Ord, Show )
+
+--------------------------------------------------------------------------------
+
+class Matrix m where
+   -- | Create a new matrix of the given order (containing undefined elements)
+   -- and call the action to fill it with 4x4 elements.
+   withNewMatrix ::
+      MatrixComponent c => MatrixOrder -> (Ptr c -> IO ()) -> IO (m c)
+
+   -- | Call the action with the given matrix. /Note:/ The action is /not/
+   -- allowed to modify the matrix elements!
+   withMatrix ::
+      MatrixComponent c => m c -> (MatrixOrder -> Ptr c -> IO a) -> IO a
+
+   newMatrix :: MatrixComponent c => MatrixOrder -> [c] -> IO (m c)
+   getMatrixComponents :: MatrixComponent c => MatrixOrder -> m c -> IO [c]
+
+   withNewMatrix order act =
+      allocaArray 16 $ \p -> do
+         act p
+         components <- peekArray 16 p
+         newMatrix order components
+
+   withMatrix mat act = do
+      components <- getMatrixComponents ColumnMajor mat
+      withArray components $ act ColumnMajor
+
+   newMatrix order components =
+      withNewMatrix order $ flip pokeArray (take 16 components)
+
+   getMatrixComponents desiredOrder mat =
+      withMatrix mat $ \order p ->
+        if desiredOrder == order
+           then peekArray 16 p
+           else mapM (peekElemOff p) [ 0, 4,  8, 12,
+                                       1, 5,  9, 13,
+                                       2, 6, 10, 14,
+                                       3, 7, 11, 15 ]
+
+--------------------------------------------------------------------------------
+
+matrix :: (Matrix m, MatrixComponent c) => Maybe MatrixMode -> StateVar (m c)
+matrix maybeMode =
+   makeStateVar
+      (maybe (get matrixMode) return maybeMode >>= (getMatrix' . matrixModeToGetMatrix))
+      (maybe id withMatrixMode maybeMode . setMatrix)
+
+withMatrixMode :: MatrixMode -> IO a -> IO a
+withMatrixMode mode act =
+   preservingMatrixMode $ do
+      matrixMode $= mode
+      act
+
+getMatrix' :: (Matrix m, MatrixComponent c) => PNameMatrix -> IO (m c)
+getMatrix' = withNewMatrix ColumnMajor . getMatrix
+
+setMatrix :: (Matrix m, MatrixComponent c) => m c -> IO ()
+setMatrix mat =
+   withMatrix mat $ \order ->
+      case order of
+         ColumnMajor -> loadMatrix
+         RowMajor    -> loadTransposeMatrix
+
+multMatrix :: (Matrix m, MatrixComponent c) => m c -> IO ()
+multMatrix mat =
+   withMatrix mat $ \order ->
+      case order of
+         ColumnMajor -> multMatrix_
+         RowMajor    -> multTransposeMatrix
+
+--------------------------------------------------------------------------------
+
+data GLmatrix a = GLmatrix MatrixOrder (ForeignPtr a)
+   deriving ( Eq, Ord, Show )
+
+instance Matrix GLmatrix where
+   withNewMatrix order f = do
+      fp <- mallocForeignPtrArray 16
+      withForeignPtr fp f
+      return $ GLmatrix order fp
+
+   withMatrix (GLmatrix order fp) f = withForeignPtr fp (f order)
+
+--------------------------------------------------------------------------------
+
+loadIdentity :: IO ()
+loadIdentity = glLoadIdentity
+
+--------------------------------------------------------------------------------
+
+ortho :: GLdouble -> GLdouble -> GLdouble -> GLdouble -> GLdouble -> GLdouble -> IO ()
+ortho = glOrtho
+
+frustum :: GLdouble -> GLdouble -> GLdouble -> GLdouble -> GLdouble -> GLdouble -> IO ()
+frustum = glFrustum
+
+--------------------------------------------------------------------------------
+
+depthClamp :: StateVar Capability
+depthClamp = makeCapability CapDepthClamp
+
+--------------------------------------------------------------------------------
+
+activeTexture :: StateVar TextureUnit
+activeTexture = makeStateVar (getEnum1 unmarshalTextureUnit GetActiveTexture)
+                             (glActiveTexture . marshalTextureUnit)
+
+--------------------------------------------------------------------------------
+
+-- | Push the current matrix stack down by one, duplicating the current matrix,
+-- excute the given action, and pop the current matrix stack, replacing the
+-- current matrix with the one below it on the stack (i.e. restoring it to its
+-- previous state). The returned value is that of the given action. Note that
+-- a round-trip to the server is probably required. For a more efficient
+-- version, see 'unsafePreservingMatrix'.
+
+preservingMatrix :: IO a -> IO a
+preservingMatrix = unsafePreservingMatrix . preservingMatrixMode
+
+-- performance paranoia: No (un-)marshaling by avoiding matrixMode
+preservingMatrixMode :: IO a -> IO a
+preservingMatrixMode = bracket (getEnum1 id GetMatrixMode) glMatrixMode . const
+
+-- | A more efficient, but potentially dangerous version of 'preservingMatrix':
+-- The given action is not allowed to throw an exception or change the
+-- current matrix mode permanently.
+
+unsafePreservingMatrix :: IO a -> IO a
+unsafePreservingMatrix = unsafeBracket_ glPushMatrix glPopMatrix
+
+--------------------------------------------------------------------------------
+
+stackDepth :: Maybe MatrixMode -> GettableStateVar GLsizei
+stackDepth maybeMode =
+   makeGettableStateVar $
+      case maybeMode of
+         Nothing -> getSizei1 id GetCurrentMatrixStackDepth -- only with ARB_fragment_program
+         Just MatrixPalette -> do recordInvalidEnum ; return 0
+         Just mode -> getSizei1 id (matrixModeToGetStackDepth mode)
+
+maxStackDepth :: MatrixMode -> GettableStateVar GLsizei
+maxStackDepth =
+   makeGettableStateVar . getSizei1 id . matrixModeToGetMaxStackDepth
+
+--------------------------------------------------------------------------------
+
+-- | If 'rescaleNormal' contains 'Enabled', normal vectors specified with
+-- 'Graphics.Rendering.OpenGL.GL.VertexSpec.normal' are scaled by a scaling
+-- factor derived from the modelview matrix. 'rescaleNormal' requires that the
+-- originally specified normals were of unit length, and that the modelview
+-- matrix contains only uniform scales for proper results. The initial value of
+-- 'rescaleNormal' is 'Disabled'.
+
+rescaleNormal :: StateVar Capability
+rescaleNormal = makeCapability CapRescaleNormal
+
+-- | If 'normalize' contains 'Enabled', normal vectors specified with
+-- 'Graphics.Rendering.OpenGL.GL.VertexSpec.normal' are scaled to unit length
+-- after transformation. The initial value of 'normalize' is 'Disabled'.
+
+normalize :: StateVar Capability
+normalize = makeCapability CapNormalize
+
+--------------------------------------------------------------------------------
+
+data Plane a = Plane !a !a !a !a
+   deriving ( Eq, Ord, Show )
+
+instance Storable a => Storable (Plane a) where
+   sizeOf    ~(Plane a _ _ _) = 4 * sizeOf a
+   alignment ~(Plane a _ _ _) = alignment a
+   peek                       = peek4 Plane . castPtr
+   poke ptr   (Plane a b c d) = poke4 (castPtr ptr) a b c d
+
+--------------------------------------------------------------------------------
+
+data TextureCoordName =
+     S
+   | T
+   | R
+   | Q
+   deriving ( Eq, Ord, Show )
+
+marshalTextureCoordName :: TextureCoordName -> GLenum
+marshalTextureCoordName x = case x of
+   S -> GL_S
+   T -> GL_T
+   R -> GL_R
+   Q -> GL_Q
+
+--------------------------------------------------------------------------------
+
+data TextureGenParameter =
+     TextureGenMode
+   | ObjectPlane
+   | EyePlane
+
+marshalTextureGenParameter :: TextureGenParameter -> GLenum
+marshalTextureGenParameter x = case x of
+   TextureGenMode -> GL_TEXTURE_GEN_MODE
+   ObjectPlane -> GL_OBJECT_PLANE
+   EyePlane -> GL_EYE_PLANE
+
+--------------------------------------------------------------------------------
+
+data TextureGenMode' =
+     EyeLinear'
+   | ObjectLinear'
+   | SphereMap'
+   | NormalMap'
+   | ReflectionMap'
+
+marshalTextureGenMode' :: TextureGenMode' -> GLint
+marshalTextureGenMode' x = fromIntegral $ case x of
+   EyeLinear' -> GL_EYE_LINEAR
+   ObjectLinear' -> GL_OBJECT_LINEAR
+   SphereMap' -> GL_SPHERE_MAP
+   NormalMap' -> GL_NORMAL_MAP
+   ReflectionMap' -> GL_REFLECTION_MAP
+
+unmarshalTextureGenMode' :: GLint -> TextureGenMode'
+unmarshalTextureGenMode' x
+   | y == GL_EYE_LINEAR = EyeLinear'
+   | y == GL_OBJECT_LINEAR = ObjectLinear'
+   | y == GL_SPHERE_MAP = SphereMap'
+   | y == GL_NORMAL_MAP = NormalMap'
+   | y == GL_REFLECTION_MAP = ReflectionMap'
+   | otherwise = error ("unmarshalTextureGenMode': illegal value " ++ show x)
+   where y = fromIntegral x
+
+--------------------------------------------------------------------------------
+
+data TextureGenMode =
+     EyeLinear    (Plane GLdouble)
+   | ObjectLinear (Plane GLdouble)
+   | SphereMap
+   | NormalMap
+   | ReflectionMap
+   deriving ( Eq, Ord, Show )
+
+marshalTextureGenMode :: TextureGenMode -> GLint
+marshalTextureGenMode = marshalTextureGenMode' . convertMode
+   where convertMode (EyeLinear    _) = EyeLinear'
+         convertMode (ObjectLinear _) = ObjectLinear'
+         convertMode SphereMap        = SphereMap'
+         convertMode NormalMap        = NormalMap'
+         convertMode ReflectionMap    = ReflectionMap'
+
+--------------------------------------------------------------------------------
+
+textureGenMode :: TextureCoordName -> StateVar (Maybe TextureGenMode)
+textureGenMode coord =
+   makeStateVarMaybe
+      (return $ textureCoordNameToEnableCap coord)
+      (do mode <- getMode coord
+          case mode of
+             EyeLinear'     -> fmap EyeLinear $ getPlane coord EyePlane
+             ObjectLinear'  -> fmap ObjectLinear $ getPlane coord ObjectPlane
+             SphereMap'     -> return SphereMap
+             NormalMap'     -> return NormalMap
+             ReflectionMap' -> return ReflectionMap)
+      (\mode -> do
+         setMode coord mode
+         case mode of
+            EyeLinear    plane -> setPlane coord EyePlane    plane
+            ObjectLinear plane -> setPlane coord ObjectPlane plane
+            _ -> return ())
+
+--------------------------------------------------------------------------------
+
+textureCoordNameToEnableCap :: TextureCoordName -> EnableCap
+textureCoordNameToEnableCap coord = case coord of
+   S -> CapTextureGenS
+   T -> CapTextureGenT
+   R -> CapTextureGenR
+   Q -> CapTextureGenQ
+
+--------------------------------------------------------------------------------
+
+getMode :: TextureCoordName -> IO TextureGenMode'
+getMode coord = alloca $ \buf -> do
+   glGetTexGeniv (marshalTextureCoordName coord)
+                 (marshalTextureGenParameter TextureGenMode)
+                 buf
+   peek1 unmarshalTextureGenMode' buf
+
+setMode :: TextureCoordName -> TextureGenMode -> IO ()
+setMode coord mode =
+   glTexGeni (marshalTextureCoordName coord)
+             (marshalTextureGenParameter TextureGenMode)
+             (marshalTextureGenMode mode)
+
+--------------------------------------------------------------------------------
+
+getPlane :: TextureCoordName -> TextureGenParameter -> IO (Plane GLdouble)
+getPlane coord param = alloca $ \planeBuffer -> do
+   glGetTexGendv (marshalTextureCoordName coord)
+                 (marshalTextureGenParameter param)
+                 (castPtr planeBuffer)
+   peek planeBuffer
+
+setPlane :: TextureCoordName -> TextureGenParameter -> Plane GLdouble -> IO ()
+setPlane coord param plane =
+   with plane $ \planeBuffer ->
+      glTexGendv (marshalTextureCoordName coord)
+                 (marshalTextureGenParameter param)
+                 (castPtr planeBuffer)
diff --git a/src/Graphics/Rendering/OpenGL/GL/DataType.hs b/src/Graphics/Rendering/OpenGL/GL/DataType.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/DataType.hs
@@ -0,0 +1,145 @@
+{-# OPTIONS_HADDOCK hide #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.DataType
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This is a purely internal module for (un-)marshaling DataType.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.DataType (
+   DataType(..), marshalDataType, unmarshalDataType,
+   DataRepresentation(..), unmarshalDataRepresentation
+) where
+
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+-- basically table 8.7 (pixel data type parameter) plus a few additions
+data DataType =
+     UnsignedByte
+   | Byte
+   | UnsignedShort
+   | Short
+   | UnsignedInt
+   | Int
+   | HalfFloat
+   | Float
+   | UnsignedByte332
+   | UnsignedByte233Rev
+   | UnsignedShort565
+   | UnsignedShort565Rev
+   | UnsignedShort4444
+   | UnsignedShort4444Rev
+   | UnsignedShort5551
+   | UnsignedShort1555Rev
+   | UnsignedInt8888
+   | UnsignedInt8888Rev
+   | UnsignedInt1010102
+   | UnsignedInt2101010Rev
+   | UnsignedInt248
+   | UnsignedInt10f11f11fRev
+   | UnsignedInt5999Rev
+   | Float32UnsignedInt248Rev
+   | Bitmap                    -- pixel data, deprecated in 3.1
+   | UnsignedShort88           -- MESA_ycbcr_texture/APPLE_ycbcr_422
+   | UnsignedShort88Rev        -- MESA_ycbcr_texture/APPLE_ycbcr_422
+   | Double                    -- vertex arrays (EXT_vertex_array, now core)
+   | TwoBytes                  -- CallLists
+   | ThreeBytes                -- CallLists
+   | FourBytes                 -- CallLists
+   deriving ( Eq, Ord, Show )
+
+marshalDataType :: DataType -> GLenum
+marshalDataType x = case x of
+   UnsignedByte -> GL_UNSIGNED_BYTE
+   Byte -> GL_BYTE
+   UnsignedShort -> GL_UNSIGNED_SHORT
+   Short -> GL_SHORT
+   UnsignedInt -> GL_UNSIGNED_INT
+   Int -> GL_INT
+   HalfFloat -> GL_HALF_FLOAT
+   Float -> GL_FLOAT
+   UnsignedByte332 -> GL_UNSIGNED_BYTE_3_3_2
+   UnsignedByte233Rev -> GL_UNSIGNED_BYTE_2_3_3_REV
+   UnsignedShort565 -> GL_UNSIGNED_SHORT_5_6_5
+   UnsignedShort565Rev -> GL_UNSIGNED_SHORT_5_6_5_REV
+   UnsignedShort4444 -> GL_UNSIGNED_SHORT_4_4_4_4
+   UnsignedShort4444Rev -> GL_UNSIGNED_SHORT_4_4_4_4_REV
+   UnsignedShort5551 -> GL_UNSIGNED_SHORT_5_5_5_1
+   UnsignedShort1555Rev -> GL_UNSIGNED_SHORT_1_5_5_5_REV
+   UnsignedInt8888 -> GL_UNSIGNED_INT_8_8_8_8
+   UnsignedInt8888Rev -> GL_UNSIGNED_INT_8_8_8_8_REV
+   UnsignedInt1010102 -> GL_UNSIGNED_INT_10_10_10_2
+   UnsignedInt2101010Rev -> GL_UNSIGNED_INT_2_10_10_10_REV
+   UnsignedInt248 -> GL_UNSIGNED_INT_24_8
+   UnsignedInt10f11f11fRev -> GL_UNSIGNED_INT_10F_11F_11F_REV
+   UnsignedInt5999Rev -> GL_UNSIGNED_INT_5_9_9_9_REV
+   Float32UnsignedInt248Rev -> GL_FLOAT_32_UNSIGNED_INT_24_8_REV
+   Bitmap -> GL_BITMAP
+   UnsignedShort88 -> GL_UNSIGNED_SHORT_8_8_APPLE
+   UnsignedShort88Rev -> GL_UNSIGNED_SHORT_8_8_REV_APPLE
+   Double -> GL_DOUBLE
+   TwoBytes -> GL_2_BYTES
+   ThreeBytes -> GL_3_BYTES
+   FourBytes -> GL_4_BYTES
+
+unmarshalDataType :: GLenum -> DataType
+unmarshalDataType x
+   | x == GL_UNSIGNED_BYTE = UnsignedByte
+   | x == GL_BYTE = Byte
+   | x == GL_UNSIGNED_SHORT = UnsignedShort
+   | x == GL_SHORT = Short
+   | x == GL_UNSIGNED_INT = UnsignedInt
+   | x == GL_INT = Int
+   | x == GL_HALF_FLOAT = HalfFloat
+   | x == GL_FLOAT = Float
+   | x == GL_UNSIGNED_BYTE_3_3_2 = UnsignedByte332
+   | x == GL_UNSIGNED_BYTE_2_3_3_REV = UnsignedByte233Rev
+   | x == GL_UNSIGNED_SHORT_5_6_5 = UnsignedShort565
+   | x == GL_UNSIGNED_SHORT_5_6_5_REV = UnsignedShort565Rev
+   | x == GL_UNSIGNED_SHORT_4_4_4_4 = UnsignedShort4444
+   | x == GL_UNSIGNED_SHORT_4_4_4_4_REV = UnsignedShort4444Rev
+   | x == GL_UNSIGNED_SHORT_5_5_5_1 = UnsignedShort5551
+   | x == GL_UNSIGNED_SHORT_1_5_5_5_REV = UnsignedShort1555Rev
+   | x == GL_UNSIGNED_INT_8_8_8_8 = UnsignedInt8888
+   | x == GL_UNSIGNED_INT_8_8_8_8_REV = UnsignedInt8888Rev
+   | x == GL_UNSIGNED_INT_10_10_10_2 = UnsignedInt1010102
+   | x == GL_UNSIGNED_INT_2_10_10_10_REV = UnsignedInt2101010Rev
+   | x == GL_UNSIGNED_INT_24_8 = UnsignedInt248
+   | x == GL_UNSIGNED_INT_10F_11F_11F_REV = UnsignedInt10f11f11fRev
+   | x == GL_UNSIGNED_INT_5_9_9_9_REV = UnsignedInt5999Rev
+   | x == GL_FLOAT_32_UNSIGNED_INT_24_8_REV = Float32UnsignedInt248Rev
+   | x == GL_BITMAP = Bitmap
+   | x == GL_UNSIGNED_SHORT_8_8_APPLE = UnsignedShort88
+   | x == GL_UNSIGNED_SHORT_8_8_REV_APPLE = UnsignedShort88Rev
+   | x == GL_DOUBLE = Double
+   | x == GL_2_BYTES = TwoBytes
+   | x == GL_3_BYTES = ThreeBytes
+   | x == GL_4_BYTES = FourBytes
+   | otherwise = error ("unmarshalDataType: illegal value " ++ show x)
+
+data DataRepresentation
+   = SignedNormalizedRepresentation
+   | UnsignedNormalizedRepresentation
+   | FloatRepresentation
+   | IntRepresentation
+   | UnsignedIntRepresentation
+   deriving ( Eq, Ord, Show )
+
+unmarshalDataRepresentation :: GLenum -> Maybe DataRepresentation
+unmarshalDataRepresentation x
+   | x == GL_SIGNED_NORMALIZED = Just SignedNormalizedRepresentation
+   | x == GL_UNSIGNED_NORMALIZED = Just UnsignedNormalizedRepresentation
+   | x == GL_FLOAT = Just FloatRepresentation
+   | x == GL_INT = Just IntRepresentation
+   | x == GL_UNSIGNED_INT = Just UnsignedIntRepresentation
+   | x == GL_NONE = Nothing
+   | otherwise = error $ "unmarshalDataRepresentation: illegal value " ++ show x
diff --git a/src/Graphics/Rendering/OpenGL/GL/DebugOutput.hs b/src/Graphics/Rendering/OpenGL/GL/DebugOutput.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/DebugOutput.hs
@@ -0,0 +1,327 @@
+{-# LANGUAGE CPP #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.DebugOutput
+-- Copyright   :  (c) Sven Panne 2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 20 (Debug Output) of the OpenGL 4.5
+-- specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.DebugOutput (
+  -- * Debug Messages
+  debugOutput, DebugMessage(..), DebugSource(..), DebugType(..),
+  DebugMessageID(DebugMessageID), DebugSeverity(..), maxDebugMessageLength,
+
+  -- * Debug Message Callback
+  debugMessageCallback,
+
+  -- * Debug Message Log
+  maxDebugLoggedMessages, debugLoggedMessages,
+
+  -- * Controlling Debug Messages
+  MessageGroup(..), debugMessageControl,
+
+  -- * Externally Generated Messages
+  debugMessageInsert,
+
+  -- * Debug Groups
+  DebugGroup(..), pushDebugGroup, popDebugGroup, withDebugGroup,
+  maxDebugGroupStackDepth,
+
+  -- * Debug Labels
+  CanBeLabeled(..), maxLabelLength,
+
+  -- * Asynchronous and Synchronous Debug Output
+  debugOutputSynchronous
+) where
+
+import Control.Monad ( unless, replicateM )
+import Data.StateVar
+import Foreign.C.String ( peekCStringLen, withCStringLen )
+import Foreign.Marshal.Alloc ( alloca )
+import Foreign.Marshal.Array ( allocaArray, withArrayLen )
+import Foreign.Ptr (
+  nullPtr, castPtrToFunPtr, FunPtr, nullFunPtr, freeHaskellFunPtr )
+import Graphics.Rendering.OpenGL.GL.Capability
+import Graphics.Rendering.OpenGL.GL.Exception
+import Graphics.Rendering.OpenGL.GL.PeekPoke
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+debugOutput :: StateVar Capability
+debugOutput = makeCapability CapDebugOutput
+
+--------------------------------------------------------------------------------
+
+data DebugMessage =
+  DebugMessage DebugSource DebugType DebugMessageID DebugSeverity String
+  deriving ( Eq, Ord, Show )
+
+--------------------------------------------------------------------------------
+
+data DebugSource =
+    DebugSourceAPI
+  | DebugSourceShaderCompiler
+  | DebugSourceWindowSystem
+  | DebugSourceThirdParty
+  | DebugSourceApplication
+  | DebugSourceOther
+  deriving ( Eq, Ord, Show )
+
+marshalDebugSource :: DebugSource -> GLenum
+marshalDebugSource x = case x of
+  DebugSourceAPI -> GL_DEBUG_SOURCE_API
+  DebugSourceShaderCompiler -> GL_DEBUG_SOURCE_SHADER_COMPILER
+  DebugSourceWindowSystem -> GL_DEBUG_SOURCE_WINDOW_SYSTEM
+  DebugSourceThirdParty -> GL_DEBUG_SOURCE_THIRD_PARTY
+  DebugSourceApplication -> GL_DEBUG_SOURCE_APPLICATION
+  DebugSourceOther -> GL_DEBUG_SOURCE_OTHER
+
+unmarshalDebugSource :: GLenum -> DebugSource
+unmarshalDebugSource x
+  | x == GL_DEBUG_SOURCE_API = DebugSourceAPI
+  | x == GL_DEBUG_SOURCE_SHADER_COMPILER = DebugSourceShaderCompiler
+  | x == GL_DEBUG_SOURCE_WINDOW_SYSTEM = DebugSourceWindowSystem
+  | x == GL_DEBUG_SOURCE_THIRD_PARTY = DebugSourceThirdParty
+  | x == GL_DEBUG_SOURCE_APPLICATION = DebugSourceApplication
+  | x == GL_DEBUG_SOURCE_OTHER = DebugSourceOther
+  | otherwise = error ("unmarshalDebugSource: illegal value " ++ show x)
+
+--------------------------------------------------------------------------------
+
+data DebugType =
+    DebugTypeError
+  | DebugTypeDeprecatedBehavior
+  | DebugTypeUndefinedBehavior
+  | DebugTypePerformance
+  | DebugTypePortability
+  | DebugTypeMarker
+  | DebugTypePushGroup
+  | DebugTypePopGroup
+  | DebugTypeOther
+  deriving ( Eq, Ord, Show )
+
+marshalDebugType :: DebugType -> GLenum
+marshalDebugType x = case x of
+  DebugTypeError -> GL_DEBUG_TYPE_ERROR
+  DebugTypeDeprecatedBehavior -> GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR
+  DebugTypeUndefinedBehavior -> GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR
+  DebugTypePerformance -> GL_DEBUG_TYPE_PERFORMANCE
+  DebugTypePortability -> GL_DEBUG_TYPE_PORTABILITY
+  DebugTypeMarker -> GL_DEBUG_TYPE_MARKER
+  DebugTypePushGroup -> GL_DEBUG_TYPE_PUSH_GROUP
+  DebugTypePopGroup -> GL_DEBUG_TYPE_POP_GROUP
+  DebugTypeOther -> GL_DEBUG_TYPE_OTHER
+
+unmarshalDebugType :: GLenum -> DebugType
+unmarshalDebugType x
+  | x == GL_DEBUG_TYPE_ERROR = DebugTypeError
+  | x == GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR = DebugTypeDeprecatedBehavior
+  | x == GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR = DebugTypeUndefinedBehavior
+  | x == GL_DEBUG_TYPE_PERFORMANCE = DebugTypePerformance
+  | x == GL_DEBUG_TYPE_PORTABILITY = DebugTypePortability
+  | x == GL_DEBUG_TYPE_MARKER = DebugTypeMarker
+  | x == GL_DEBUG_TYPE_PUSH_GROUP = DebugTypePushGroup
+  | x == GL_DEBUG_TYPE_POP_GROUP = DebugTypePopGroup
+  | x == GL_DEBUG_TYPE_OTHER = DebugTypeOther
+  | otherwise = error ("unmarshalDebugType: illegal value " ++ show x)
+
+--------------------------------------------------------------------------------
+
+newtype DebugMessageID = DebugMessageID { debugMessageID :: GLuint }
+   deriving ( Eq, Ord, Show )
+
+--------------------------------------------------------------------------------
+
+data DebugSeverity =
+    DebugSeverityHigh
+  | DebugSeverityMedium
+  | DebugSeverityLow
+  | DebugSeverityNotification
+  deriving ( Eq, Ord, Show )
+
+marshalDebugSeverity :: DebugSeverity -> GLenum
+marshalDebugSeverity x = case x of
+  DebugSeverityHigh -> GL_DEBUG_SEVERITY_HIGH
+  DebugSeverityMedium -> GL_DEBUG_SEVERITY_MEDIUM
+  DebugSeverityLow -> GL_DEBUG_SEVERITY_LOW
+  DebugSeverityNotification -> GL_DEBUG_SEVERITY_NOTIFICATION
+
+unmarshalDebugSeverity :: GLenum -> DebugSeverity
+unmarshalDebugSeverity x
+  | x == GL_DEBUG_SEVERITY_HIGH = DebugSeverityHigh
+  | x == GL_DEBUG_SEVERITY_MEDIUM = DebugSeverityMedium
+  | x == GL_DEBUG_SEVERITY_LOW = DebugSeverityLow
+  | x == GL_DEBUG_SEVERITY_NOTIFICATION = DebugSeverityNotification
+  | otherwise = error ("unmarshalDebugSeverity: illegal value " ++ show x)
+
+--------------------------------------------------------------------------------
+
+maxDebugMessageLength :: GettableStateVar GLsizei
+maxDebugMessageLength =
+  makeGettableStateVar (getSizei1 id GetMaxDebugMessageLength)
+
+--------------------------------------------------------------------------------
+
+debugMessageCallback :: StateVar (Maybe (DebugMessage -> IO ()))
+debugMessageCallback =
+  makeStateVar getDebugMessageCallback setDebugMessageCallback
+
+getDebugMessageCallback :: IO (Maybe (DebugMessage -> IO ()))
+getDebugMessageCallback = do
+  cb <- getDebugCallbackFunction
+  return $ if (cb == nullFunPtr)
+             then Nothing
+             else Just . toDebugProc . dyn_debugProc $ cb
+
+foreign import CALLCONV "dynamic" dyn_debugProc
+  :: FunPtr GLDEBUGPROCFunc -> GLDEBUGPROCFunc
+
+toDebugProc:: GLDEBUGPROCFunc -> DebugMessage -> IO ()
+toDebugProc debugFunc (DebugMessage source typ msgID severity message) =
+  withCStringLen message $ \(msg, len) -> do
+    debugFunc (marshalDebugSource source)
+              (marshalDebugType typ)
+              (marshalDebugSeverity severity)
+              (debugMessageID msgID)
+              (fromIntegral len)
+              msg
+              nullPtr
+
+setDebugMessageCallback :: Maybe (DebugMessage -> IO ()) -> IO ()
+setDebugMessageCallback maybeDebugProc = do
+  oldCB <- getDebugCallbackFunction
+  unless (oldCB == nullFunPtr) $
+    freeHaskellFunPtr oldCB
+  newCB <-
+    maybe (return nullFunPtr) (makeGLDEBUGPROC . fromDebugProc) maybeDebugProc
+  glDebugMessageCallbackARB newCB  nullPtr
+
+fromDebugProc:: (DebugMessage -> IO ()) -> GLDEBUGPROCFunc
+fromDebugProc debugProc source typ msgID severity len message _userParam = do
+  msg <- peekCStringLen (message, fromIntegral len)
+  debugProc (DebugMessage (unmarshalDebugSource source)
+                          (unmarshalDebugType typ)
+                          (DebugMessageID msgID)
+                          (unmarshalDebugSeverity severity)
+                          msg)
+
+getDebugCallbackFunction :: IO (FunPtr GLDEBUGPROCFunc)
+getDebugCallbackFunction =
+  castPtrToFunPtr `fmap` getPointer DebugCallbackFunction
+
+--------------------------------------------------------------------------------
+
+maxDebugLoggedMessages :: GettableStateVar GLsizei
+maxDebugLoggedMessages =
+  makeGettableStateVar (getSizei1 id GetMaxDebugLoggedMessages)
+
+debugLoggedMessages :: IO [DebugMessage]
+debugLoggedMessages = do
+  count <- getSizei1 fromIntegral GetDebugLoggedMessages
+  replicateM count debugNextLoggedMessage
+
+debugNextLoggedMessage :: IO DebugMessage
+debugNextLoggedMessage = do
+  len <- getSizei1 id GetDebugNextLoggedMessageLength
+  alloca $ \sourceBuf ->
+    alloca $ \typeBuf ->
+      alloca $ \idBuf ->
+        alloca $ \severityBuf ->
+          allocaArray (fromIntegral len) $ \messageBuf -> do
+            _ <- glGetDebugMessageLog 1 len sourceBuf typeBuf idBuf
+                                      severityBuf nullPtr messageBuf
+            source <- peek1 unmarshalDebugSource sourceBuf
+            typ <- peek1 unmarshalDebugType typeBuf
+            msgID <- peek1 DebugMessageID idBuf
+            severity <- peek1 unmarshalDebugSeverity severityBuf
+            message <- peekCStringLen (messageBuf, fromIntegral len)
+            return $ DebugMessage source typ msgID severity message
+
+--------------------------------------------------------------------------------
+
+data MessageGroup =
+    MessageGroup (Maybe DebugSource) (Maybe DebugType) (Maybe DebugSeverity)
+  | MessageGroupWithIDs DebugSource DebugType [DebugMessageID]
+  deriving ( Eq, Ord, Show )
+
+debugMessageControl :: MessageGroup -> SettableStateVar Capability
+debugMessageControl x = case x of
+  MessageGroup maybeSource maybeType maybeSeverity ->
+    doDebugMessageControl maybeSource maybeType maybeSeverity []
+  MessageGroupWithIDs source typ messageIDs ->
+    doDebugMessageControl (Just source) (Just typ) Nothing messageIDs
+
+doDebugMessageControl :: Maybe DebugSource
+                      -> Maybe DebugType
+                      -> Maybe DebugSeverity
+                      -> [DebugMessageID]
+                      -> SettableStateVar Capability
+doDebugMessageControl maybeSource maybeType maybeSeverity messageIDs =
+  makeSettableStateVar $ \cap ->
+    withArrayLen (map debugMessageID messageIDs) $ \len idsBuf ->
+      glDebugMessageControl (maybe GL_DONT_CARE marshalDebugSource maybeSource)
+                            (maybe GL_DONT_CARE marshalDebugType maybeType)
+                            (maybe GL_DONT_CARE marshalDebugSeverity maybeSeverity)
+                            (fromIntegral len)
+                            idsBuf
+                            (marshalCapability cap)
+
+--------------------------------------------------------------------------------
+
+debugMessageInsert :: DebugMessage -> IO ()
+debugMessageInsert (DebugMessage source typ msgID severity message) =
+  withCStringLen message $ \(msg, len) ->
+    glDebugMessageInsert (marshalDebugSource source)
+                         (marshalDebugType typ)
+                         (debugMessageID msgID)
+                         (marshalDebugSeverity severity)
+                         (fromIntegral len)
+                         msg
+
+--------------------------------------------------------------------------------
+
+data DebugGroup = DebugGroup DebugSource DebugMessageID String
+
+pushDebugGroup :: DebugSource -> DebugMessageID -> String -> IO ()
+pushDebugGroup source msgID message =
+  withCStringLen message $ \(msg, len) ->
+    glPushDebugGroup (marshalDebugSource source)
+                     (debugMessageID msgID)
+                     (fromIntegral len)
+                     msg
+
+popDebugGroup :: IO ()
+popDebugGroup = glPopDebugGroup
+
+withDebugGroup :: DebugSource -> DebugMessageID -> String -> IO a -> IO a
+withDebugGroup source msgID message =
+  bracket_ (pushDebugGroup source msgID message) popDebugGroup
+
+maxDebugGroupStackDepth :: GettableStateVar GLsizei
+maxDebugGroupStackDepth =
+  makeGettableStateVar (getSizei1 id GetMaxDebugGroupStackDepth)
+
+--------------------------------------------------------------------------------
+
+-- TODO: Make instances for the following features when we have them:
+--   * PROGRAM_PIPELINE / glGenProgramPipelines
+--   * SAMPLER / glGenSamplers
+--   * TRANSFORM_FEEDBACK / glGenTransformFeedbacks
+
+class CanBeLabeled a where
+  objectLabel :: a -> StateVar (Maybe String)
+
+--------------------------------------------------------------------------------
+
+debugOutputSynchronous :: StateVar Capability
+debugOutputSynchronous = makeCapability CapDebugOutputSynchronous
diff --git a/src/Graphics/Rendering/OpenGL/GL/DisplayLists.hs b/src/Graphics/Rendering/OpenGL/GL/DisplayLists.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/DisplayLists.hs
@@ -0,0 +1,131 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.DisplayLists
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 5.4 (Display Lists) of the OpenGL 2.1
+-- specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.DisplayLists (
+   -- * Defining Display Lists
+   DisplayList(DisplayList), ListMode(..), defineList, defineNewList, listIndex,
+   listMode, maxListNesting,
+
+   -- * Calling Display Lists
+   callList, callLists, listBase
+) where
+
+import Control.Monad.IO.Class
+import Data.ObjectName
+import Data.StateVar
+import Foreign.Ptr ( Ptr )
+import Graphics.Rendering.OpenGL.GL.DebugOutput
+import Graphics.Rendering.OpenGL.GL.DataType
+import Graphics.Rendering.OpenGL.GL.Exception
+import Graphics.Rendering.OpenGL.GL.GLboolean
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.Rendering.OpenGL.GLU.ErrorsInternal
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+newtype DisplayList = DisplayList { displayListID :: GLuint }
+   deriving ( Eq, Ord, Show )
+
+instance ObjectName DisplayList where
+   isObjectName = liftIO . fmap unmarshalGLboolean . glIsList . displayListID
+   deleteObjectNames =
+     liftIO . mapM_ (uncurry glDeleteLists) . combineConsecutive
+
+instance CanBeLabeled DisplayList where
+   objectLabel = objectNameLabel GL_DISPLAY_LIST . displayListID
+
+combineConsecutive :: [DisplayList] -> [(GLuint, GLsizei)]
+combineConsecutive [] = []
+combineConsecutive (z:zs) = (displayListID z, len) : combineConsecutive rest
+   where (len, rest) = run (0 :: GLsizei) z zs
+         run n x xs = case n + 1 of
+                         m -> case xs of
+                                 []                          -> (m, [])
+                                 (y:ys) | x `isFollowedBy` y -> run m y ys
+                                        | otherwise          -> (m, xs)
+         DisplayList x `isFollowedBy` DisplayList y = x + 1 == y
+
+instance GeneratableObjectName DisplayList where
+   genObjectNames n = liftIO $ do
+      first <- glGenLists (fromIntegral n)
+      if DisplayList first == noDisplayList
+         then do recordOutOfMemory
+                 return []
+         else return [ DisplayList l
+                     | l <- [ first .. first + fromIntegral n - 1 ] ]
+
+--------------------------------------------------------------------------------
+
+data ListMode =
+     Compile
+   | CompileAndExecute
+   deriving ( Eq, Ord, Show )
+
+marshalListMode :: ListMode -> GLenum
+marshalListMode x = case x of
+   Compile -> GL_COMPILE
+   CompileAndExecute -> GL_COMPILE_AND_EXECUTE
+
+unmarshalListMode :: GLenum -> ListMode
+unmarshalListMode x
+   | x == GL_COMPILE = Compile
+   | x == GL_COMPILE_AND_EXECUTE = CompileAndExecute
+   | otherwise = error ("unmarshalListMode: illegal value " ++ show x)
+
+--------------------------------------------------------------------------------
+
+defineList :: DisplayList -> ListMode -> IO a -> IO a
+defineList dl mode =
+   bracket_ (glNewList (displayListID dl) (marshalListMode mode)) glEndList
+
+defineNewList :: ListMode -> IO a -> IO DisplayList
+defineNewList mode action = do
+   lst <- genObjectName
+   _ <- defineList lst mode action
+   return lst
+
+--------------------------------------------------------------------------------
+
+listIndex :: GettableStateVar (Maybe DisplayList)
+listIndex =
+   makeGettableStateVar
+      (do l <- getEnum1 (DisplayList . fromIntegral) GetListIndex
+          return $ if l == noDisplayList then Nothing else Just l)
+
+noDisplayList :: DisplayList
+noDisplayList = DisplayList 0
+
+listMode :: GettableStateVar ListMode
+listMode = makeGettableStateVar (getEnum1 unmarshalListMode GetListMode)
+
+maxListNesting :: GettableStateVar GLsizei
+maxListNesting = makeGettableStateVar (getSizei1 id GetMaxListNesting)
+
+--------------------------------------------------------------------------------
+
+callList :: DisplayList -> IO ()
+callList = glCallList . displayListID
+
+callLists :: GLsizei -> DataType -> Ptr a -> IO ()
+callLists n = glCallLists n . marshalDataType
+
+--------------------------------------------------------------------------------
+
+listBase :: StateVar DisplayList
+listBase =
+   makeStateVar
+      (getEnum1 (DisplayList . fromIntegral) GetListBase)
+      (glListBase . displayListID)
diff --git a/src/Graphics/Rendering/OpenGL/GL/Domain.hs b/src/Graphics/Rendering/OpenGL/GL/Domain.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/Domain.hs
@@ -0,0 +1,68 @@
+{-# OPTIONS_HADDOCK hide #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.Domain
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This is a purely internal module for handling evaluator domains.
+--
+--------------------------------------------------------------------------------
+
+{-# LANGUAGE TypeSynonymInstances #-}
+
+module Graphics.Rendering.OpenGL.GL.Domain (
+   Domain(..)
+) where
+
+import Foreign.Ptr
+import Foreign.Storable
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+class Storable d => Domain d where
+   glMap1      :: GLenum -> d -> d -> GLint -> GLint -> Ptr d -> IO ()
+   glMap2      :: GLenum -> d -> d -> GLint -> GLint -> d -> d -> GLint -> GLint -> Ptr d -> IO ()
+   glGetMapv   :: GLenum -> GLenum -> Ptr d -> IO ()
+   evalCoord1  :: d -> IO ()
+   evalCoord1v :: Ptr d -> IO ()
+   evalCoord2  :: (d, d) -> IO ()
+   evalCoord2v :: Ptr d -> IO ()
+   glMapGrid1  :: GLint -> d -> d -> IO ()
+   glMapGrid2  :: GLint -> d -> d -> GLint -> d -> d -> IO ()
+   get2        :: GetPName2F p => (d -> d -> a) -> p -> IO a
+   get4        :: GetPName4F p => (d -> d -> d -> d -> a) -> p -> IO a
+
+--------------------------------------------------------------------------------
+
+instance Domain GLfloat where
+   glMap1      = glMap1f
+   glMap2      = glMap2f
+   glGetMapv   = glGetMapfv
+   evalCoord1  = glEvalCoord1f
+   evalCoord1v = glEvalCoord1fv
+   evalCoord2  = uncurry glEvalCoord2f
+   evalCoord2v = glEvalCoord2fv
+   glMapGrid1  = glMapGrid1f
+   glMapGrid2  = glMapGrid2f
+   get2        = getFloat2
+   get4        = getFloat4
+
+instance Domain GLdouble where
+   glMap1      = glMap1d
+   glMap2      = glMap2d
+   glGetMapv   = glGetMapdv
+   evalCoord1  = glEvalCoord1d
+   evalCoord1v = glEvalCoord1dv
+   evalCoord2  = uncurry glEvalCoord2d
+   evalCoord2v = glEvalCoord2dv
+   glMapGrid1  = glMapGrid1d
+   glMapGrid2  = glMapGrid2d
+   get2        = getDouble2
+   get4        = getDouble4
diff --git a/src/Graphics/Rendering/OpenGL/GL/EdgeFlag.hs b/src/Graphics/Rendering/OpenGL/GL/EdgeFlag.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/EdgeFlag.hs
@@ -0,0 +1,36 @@
+{-# OPTIONS_HADDOCK hide #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.EdgeFlag
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+-- 
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This is a purely internal module for (un-)marshaling EdgeFlag.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.EdgeFlag (
+   EdgeFlag(..), marshalEdgeFlag, unmarshalEdgeFlag
+) where
+
+import Graphics.Rendering.OpenGL.GL.GLboolean
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+-- | A vertex can begin an edge which lies in the interior of its polygon or on
+-- the polygon\'s boundary.
+
+data EdgeFlag = BeginsInteriorEdge | BeginsBoundaryEdge
+   deriving ( Eq, Ord, Show )
+
+marshalEdgeFlag :: EdgeFlag -> GLboolean
+marshalEdgeFlag = marshalGLboolean . (BeginsBoundaryEdge ==)
+
+unmarshalEdgeFlag :: GLboolean -> EdgeFlag
+unmarshalEdgeFlag f =
+   if unmarshalGLboolean f then BeginsBoundaryEdge else BeginsInteriorEdge
diff --git a/src/Graphics/Rendering/OpenGL/GL/Evaluators.hs b/src/Graphics/Rendering/OpenGL/GL/Evaluators.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/Evaluators.hs
@@ -0,0 +1,367 @@
+{-# LANGUAGE KindSignatures #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.Evaluators
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 5.1 (Evaluators) of the OpenGL 2.1 specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.Evaluators (
+   -- * Evaluator-related Types
+   Order, maxOrder, Domain, MapDescriptor(..), ControlPoint,
+
+   -- * Defining Evaluator Maps
+   -- ** One-dimensional Evaluator Maps
+   Map1(..), GLmap1, map1,
+
+   -- ** Two-dimensional Evaluator Maps
+   Map2(..), GLmap2, map2,
+
+   -- * Using Evaluator Maps
+
+   -- ** Evaluating an Arbitrary Coordinate Value
+   evalCoord1, evalCoord1v, evalCoord2, evalCoord2v,
+
+   -- ** Using Evenly Spaced Coordinate Values
+
+   -- *** Defining a Grid
+   mapGrid1, mapGrid2,
+
+   -- *** Evaluating a Whole Mesh
+   evalMesh1, evalMesh2,
+
+   -- *** Evaluating a Single Point on a Mesh
+   evalPoint1, evalPoint2,
+
+   -- * Normal Generation
+   autoNormal
+) where
+
+import Control.Monad
+import Data.List
+import Data.StateVar
+import Foreign.ForeignPtr
+import Foreign.Marshal.Array
+import Foreign.Marshal.Utils
+import Foreign.Ptr
+import Foreign.Storable
+import Graphics.Rendering.OpenGL.GL.Capability
+import Graphics.Rendering.OpenGL.GL.ControlPoint
+import Graphics.Rendering.OpenGL.GL.Domain
+import Graphics.Rendering.OpenGL.GL.PeekPoke
+import Graphics.Rendering.OpenGL.GL.PolygonMode
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.Rendering.OpenGL.GL.VertexArrays
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+type Order = GLint
+
+maxOrder :: GettableStateVar Order
+maxOrder = makeGettableStateVar (getInteger1 id GetMaxEvalOrder)
+
+--------------------------------------------------------------------------------
+
+data MapDescriptor d =
+   MapDescriptor (d, d) Stride Order NumComponents
+   deriving ( Eq, Ord, Show )
+
+totalComponents1 :: MapDescriptor d -> Int
+totalComponents1 (MapDescriptor _ stride order numComp) =
+   fromIntegral stride * (fromIntegral order - 1) + fromIntegral numComp
+
+totalComponents2 :: MapDescriptor d -> MapDescriptor d -> Int
+totalComponents2 uDescriptor vDescriptor@(MapDescriptor _ _ _ numComp) =
+   totalComponents1 uDescriptor + totalComponents1 vDescriptor - fromIntegral numComp
+
+--------------------------------------------------------------------------------
+
+peekControlPoints1 ::
+   (ControlPoint c, Domain d) => MapDescriptor d -> Ptr d -> IO [c d]
+peekControlPoints1 descriptor ptr =
+   mapM peekControlPoint (controlPointPtrs1 descriptor ptr)
+
+peekControlPoints2 ::
+      (ControlPoint c, Domain d)
+   => MapDescriptor d -> MapDescriptor d -> Ptr d -> IO [[c d]]
+peekControlPoints2 uDescriptor vDescriptor ptr =
+   mapM (mapM peekControlPoint) (controlPointPtrs2 uDescriptor vDescriptor ptr)
+
+pokeControlPoints1 ::
+   (ControlPoint c, Domain d) => MapDescriptor d -> Ptr d -> [c d] -> IO ()
+pokeControlPoints1 descriptor ptr =
+   zipWithM_ pokeControlPoint (controlPointPtrs1 descriptor ptr)
+
+pokeControlPoints2 ::
+      (ControlPoint c, Domain d)
+   => MapDescriptor d -> MapDescriptor d -> Ptr d -> [[c d]] -> IO ()
+pokeControlPoints2 uDescriptor vDescriptor ptr =
+   zipWithM_ (zipWithM_ pokeControlPoint)
+             (controlPointPtrs2 uDescriptor vDescriptor ptr)
+
+controlPointPtrs1 :: Domain d => MapDescriptor d -> Ptr d -> [Ptr a]
+controlPointPtrs1 (MapDescriptor _ stride order _) ptr =
+   [ ptr `plusPtr` (o * s) | o <- [ 0 .. fromIntegral order - 1 ] ]
+   where s = sizeOfPtr ptr * fromIntegral stride
+
+controlPointPtrs2 ::
+   Domain d => MapDescriptor d -> MapDescriptor d -> Ptr d -> [[Ptr a]]
+controlPointPtrs2 uDescriptor vDescriptor ptr =
+   [ controlPointPtrs1 vDescriptor p | p <- controlPointPtrs1 uDescriptor ptr ]
+
+sizeOfPtr :: Storable a => Ptr a -> Int
+sizeOfPtr = sizeOf . (const undefined :: Ptr a -> a)
+
+--------------------------------------------------------------------------------
+
+class Map1 m where
+   withNewMap1 :: (ControlPoint c, Domain d)
+      => MapDescriptor d -> (Ptr d -> IO ()) -> IO (m c d)
+
+   withMap1 :: (ControlPoint c, Domain d)
+      => m c d -> (MapDescriptor d -> Ptr d -> IO a) -> IO a
+
+   newMap1 :: (ControlPoint c, Domain d)
+      => (d, d) -> [c d] -> IO (m c d)
+
+   getMap1Components :: (ControlPoint c, Domain d)
+      => m c d -> IO ((d, d), [c d])
+
+   withNewMap1 descriptor@(MapDescriptor domain _ _ _) act = do
+      allocaArray (totalComponents1 descriptor) $ \ptr -> do
+         act ptr
+         controlPoints <- peekControlPoints1 descriptor ptr
+         newMap1 domain controlPoints
+
+   withMap1 m act = do
+      (domain, controlPoints) <- getMap1Components m
+      let stride = numComponents (head controlPoints)
+          order = genericLength controlPoints
+          descriptor = MapDescriptor domain stride order (fromIntegral stride)
+      allocaArray (totalComponents1 descriptor) $ \ptr -> do
+         pokeControlPoints1 descriptor ptr controlPoints
+         act descriptor ptr
+
+   newMap1 domain controlPoints = do
+      let stride = numComponents (head controlPoints)
+          order = genericLength controlPoints
+          descriptor = MapDescriptor domain stride order (fromIntegral stride)
+      withNewMap1 descriptor $ \ptr ->
+         pokeControlPoints1 descriptor ptr controlPoints
+
+   getMap1Components m =
+      withMap1 m $ \descriptor@(MapDescriptor domain _ _ _) ptr -> do
+         controlPoints <- peekControlPoints1 descriptor ptr
+         return (domain, controlPoints)
+
+--------------------------------------------------------------------------------
+
+data GLmap1 (c :: * -> *) d =
+   GLmap1 (MapDescriptor d) (ForeignPtr d)
+   deriving ( Eq, Ord, Show )
+
+instance Map1 GLmap1 where
+   withNewMap1 descriptor act = do
+      fp <- mallocForeignPtrArray (totalComponents1 descriptor)
+      withForeignPtr fp act
+      return $ GLmap1 descriptor fp
+
+   withMap1 (GLmap1 descriptor fp) act =
+      withForeignPtr fp $ act descriptor
+
+--------------------------------------------------------------------------------
+
+map1 :: (Map1 m, ControlPoint c, Domain d) => StateVar (Maybe (m c d))
+map1 = makeMap1StateVar enableCap1 getMap1 setMap1
+
+makeMap1StateVar ::
+      (c d -> EnableCap) -> (c d -> IO (m c d)) -> (c d -> m c d -> IO ())
+   -> StateVar (Maybe (m c d))
+makeMap1StateVar getCap getAct setAct =
+   makeStateVarMaybe
+      (return (getCap undefined))
+      (getAct undefined)
+      (setAct undefined)
+
+getMap1 :: (Map1 m, ControlPoint c, Domain d) => c d -> IO (m c d)
+getMap1 dummyControlPoint = do
+   let target = map1Target dummyControlPoint
+       numComp = fromIntegral (numComponents dummyControlPoint)
+   domain <- allocaArray 2 $ \ptr -> do
+      glGetMapv target (marshalGetMapQuery Domain) ptr
+      peek2 (,) ptr
+   order <- with 0 $ \ptr -> do
+      glGetMapiv target (marshalGetMapQuery Order) ptr
+      fmap fromIntegral $ peek ptr
+   withNewMap1 (MapDescriptor domain (numComponents dummyControlPoint) order numComp) $
+      glGetMapv target (marshalGetMapQuery Coeff)
+
+setMap1 :: (Map1 m, ControlPoint c, Domain d) => c d -> m c d -> IO ()
+setMap1 dummyControlPoint m =
+   withMap1 m $ \(MapDescriptor (u1, u2) stride order _) ->
+      glMap1 (map1Target dummyControlPoint) u1 u2
+             (fromIntegral stride) (fromIntegral order)
+
+--------------------------------------------------------------------------------
+
+class Map2 m where
+   withNewMap2 :: (ControlPoint c, Domain d)
+      => MapDescriptor d -> MapDescriptor d -> (Ptr d -> IO ()) -> IO (m c d)
+
+   withMap2 :: (ControlPoint c, Domain d)
+      => m c d -> (MapDescriptor d -> MapDescriptor d -> Ptr d -> IO a) -> IO a
+
+   newMap2 :: (ControlPoint c, Domain d)
+      => (d, d) -> (d, d) -> [[c d]] -> IO (m c d)
+
+   getMap2Components :: (ControlPoint c, Domain d)
+      => m c d -> IO ((d, d), (d, d), [[c d]])
+
+   withNewMap2 uDescriptor@(MapDescriptor uDomain _ _ _)
+               vDescriptor@(MapDescriptor vDomain _ _ _) act =
+      allocaArray (totalComponents2 uDescriptor vDescriptor) $ \ptr -> do
+         act ptr
+         controlPoints <- peekControlPoints2 uDescriptor vDescriptor ptr
+         newMap2 uDomain vDomain controlPoints
+
+   withMap2 m act = do
+      (uDomain, vDomain, controlPoints) <- getMap2Components m
+      let vStride = numComponents (head (head controlPoints))
+          vOrder = genericLength (head controlPoints)
+          uStride = vStride * fromIntegral vOrder
+          uOrder = genericLength controlPoints
+          numComp = fromIntegral vStride
+          uDescriptor = MapDescriptor uDomain uStride uOrder numComp
+          vDescriptor = MapDescriptor vDomain vStride vOrder numComp
+      allocaArray (totalComponents2 uDescriptor vDescriptor) $ \ptr -> do
+         pokeControlPoints2 uDescriptor vDescriptor ptr controlPoints
+         act uDescriptor vDescriptor ptr
+
+   newMap2 uDomain vDomain controlPoints = do
+      let vStride = numComponents (head (head controlPoints))
+          vOrder = genericLength (head controlPoints)
+          uStride = vStride * fromIntegral vOrder
+          uOrder = genericLength controlPoints
+          numComp = fromIntegral vStride
+          uDescriptor = MapDescriptor uDomain uStride uOrder numComp
+          vDescriptor = MapDescriptor vDomain vStride vOrder numComp
+      withNewMap2 uDescriptor vDescriptor $ \ptr ->
+         pokeControlPoints2 uDescriptor vDescriptor ptr controlPoints
+
+   getMap2Components m =
+      withMap2 m $ \uDescriptor@(MapDescriptor uDomain _ _ _)
+                    vDescriptor@(MapDescriptor vDomain _ _ _) ptr -> do
+         controlPoints <- peekControlPoints2 uDescriptor vDescriptor ptr
+         return (uDomain, vDomain, controlPoints)
+
+--------------------------------------------------------------------------------
+
+data GLmap2 (c :: * -> *) d =
+   GLmap2 (MapDescriptor d)  (MapDescriptor d) (ForeignPtr d)
+   deriving ( Eq, Ord, Show )
+
+instance Map2 GLmap2 where
+   withNewMap2 uDescriptor vDescriptor act = do
+      fp <- mallocForeignPtrArray (totalComponents2 uDescriptor vDescriptor)
+      withForeignPtr fp act
+      return $ GLmap2 uDescriptor vDescriptor fp
+
+   withMap2 (GLmap2 uDescriptor vDescriptor fp) act =
+      withForeignPtr fp $ act uDescriptor vDescriptor
+
+--------------------------------------------------------------------------------
+
+map2 :: (Map2 m, ControlPoint c, Domain d) => StateVar (Maybe (m c d))
+map2 = makeMap2StateVar enableCap2 getMap2 setMap2
+
+makeMap2StateVar ::
+      (c d -> EnableCap) -> (c d -> IO (m c d)) -> (c d -> m c d -> IO ())
+   -> StateVar (Maybe (m c d))
+makeMap2StateVar getCap getAct setAct =
+   makeStateVarMaybe
+      (return (getCap undefined))
+      (getAct undefined)
+      (setAct undefined)
+
+getMap2 :: (Map2 m, ControlPoint c, Domain d) => c d -> IO (m c d)
+getMap2 dummyControlPoint = do
+   let target = map2Target dummyControlPoint
+   (uDomain, vDomain) <- allocaArray 4 $ \ptr -> do
+      glGetMapv target (marshalGetMapQuery Domain) ptr
+      peek4 (\u1 u2 v1 v2 -> ((u1, u2), (v1, v2))) ptr
+   (uOrder, vOrder) <- withArray [0,0] $ \ptr -> do
+      glGetMapiv target (marshalGetMapQuery Order) ptr
+      peek2 (,) ptr
+   let vStride = numComponents dummyControlPoint
+       uStride = vStride * fromIntegral vOrder
+   withNewMap2 (MapDescriptor uDomain uStride uOrder (fromIntegral vStride))
+               (MapDescriptor vDomain vStride vOrder (fromIntegral vStride)) $
+      glGetMapv target (marshalGetMapQuery Coeff)
+
+setMap2 :: (Map2 m, ControlPoint c, Domain d) => c d -> m c d -> IO ()
+setMap2 dummyControlPoint m =
+   withMap2 m $ \(MapDescriptor (u1, u2) uStride uOrder _)
+                 (MapDescriptor (v1, v2) vStride vOrder _) ->
+      glMap2 (map2Target dummyControlPoint)
+             u1 u2 (fromIntegral uStride) (fromIntegral uOrder)
+             v1 v2 (fromIntegral vStride) (fromIntegral vOrder)
+
+--------------------------------------------------------------------------------
+
+data GetMapQuery =
+     Coeff
+   | Order
+   | Domain
+
+marshalGetMapQuery :: GetMapQuery -> GLenum
+marshalGetMapQuery x = case x of
+   Coeff -> GL_COEFF
+   Order -> GL_ORDER
+   Domain -> GL_DOMAIN
+
+--------------------------------------------------------------------------------
+
+mapGrid1 :: Domain d => StateVar (GLint, (d, d))
+mapGrid1 =
+   makeStateVar
+      (do n <- getInteger1 id GetMap1GridSegments
+          domain <- get2 (,) GetMap1GridDomain
+          return (n, domain))
+      (\(n, (u1, u2)) -> glMapGrid1 n u1 u2)
+
+mapGrid2 :: Domain d => StateVar ((GLint, (d, d)), (GLint, (d, d)))
+mapGrid2 =
+   makeStateVar
+      (do (un, vn) <- getInteger2 (,) GetMap2GridSegments
+          (u1, u2, v1, v2) <- get4 (,,,) GetMap2GridDomain
+          return ((un, (u1, u2)), (vn, (v1, v2))))
+      (\((un, (u1, u2)), (vn, (v1, v2))) -> glMapGrid2 un u1 u2 vn v1 v2)
+
+--------------------------------------------------------------------------------
+
+evalMesh1 :: PolygonMode -> (GLint, GLint) -> IO ()
+evalMesh1 m (p1, p2) = glEvalMesh1 (marshalPolygonMode m) p1 p2
+
+evalMesh2 :: PolygonMode -> (GLint, GLint) -> (GLint, GLint) -> IO ()
+evalMesh2 m (p1, p2) (q1, q2) = glEvalMesh2 (marshalPolygonMode m) p1 p2 q1 q2
+
+--------------------------------------------------------------------------------
+
+evalPoint1 :: GLint -> IO ()
+evalPoint1 = glEvalPoint1
+
+evalPoint2 :: (GLint, GLint) -> IO ()
+evalPoint2 = uncurry glEvalPoint2
+
+--------------------------------------------------------------------------------
+
+autoNormal :: StateVar Capability
+autoNormal = makeCapability CapAutoNormal
diff --git a/src/Graphics/Rendering/OpenGL/GL/Exception.hs b/src/Graphics/Rendering/OpenGL/GL/Exception.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/Exception.hs
@@ -0,0 +1,55 @@
+{-# LANGUAGE CPP #-}
+{-# OPTIONS_HADDOCK hide #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.Exception
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This is a purely internal module to compensate for differences between
+-- Haskell implementations.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.Exception (
+   bracket, bracket_, unsafeBracket_, finallyRet
+) where
+
+import Data.IORef ( newIORef, readIORef, writeIORef )
+
+#ifdef __NHC__
+import qualified IO ( bracket, bracket_ )
+
+{-# INLINE bracket #-}
+bracket  :: IO a -> (a -> IO b) -> (a -> IO c) -> IO c
+bracket = IO.bracket
+
+{-# INLINE bracket_ #-}
+bracket_ :: IO a -> IO b -> IO c -> IO c
+bracket_ before = IO.bracket_ before . const
+
+finally :: IO a -> IO b -> IO a
+finally = flip . bracket_ . return $ undefined
+#else
+import Control.Exception ( bracket, bracket_, finally )
+#endif
+
+{-# INLINE unsafeBracket_ #-}
+unsafeBracket_ :: IO a -> IO b -> IO c -> IO c
+unsafeBracket_ before after thing = do
+   _ <- before
+   r <- thing
+   _ <- after
+   return r
+
+{-# INLINE finallyRet #-}
+finallyRet :: IO a -> IO b -> IO (a, b)
+a `finallyRet` sequel = do
+   r2Ref <- newIORef undefined
+   r1 <- a `finally` (sequel >>= writeIORef r2Ref)
+   r2 <- readIORef r2Ref
+   return (r1, r2)
diff --git a/src/Graphics/Rendering/OpenGL/GL/Face.hs b/src/Graphics/Rendering/OpenGL/GL/Face.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/Face.hs
@@ -0,0 +1,41 @@
+{-# OPTIONS_HADDOCK hide #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.Face
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+-- 
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This is a purely internal module for (un-)marshaling Face.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.Face (
+   Face(..), marshalFace, unmarshalFace
+) where
+
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+data Face =
+     Front
+   | Back
+   | FrontAndBack
+   deriving ( Eq, Ord, Show )
+
+marshalFace :: Face -> GLenum
+marshalFace x = case x of
+   Front -> GL_FRONT
+   Back -> GL_BACK
+   FrontAndBack -> GL_FRONT_AND_BACK
+
+unmarshalFace :: GLenum -> Face
+unmarshalFace x
+   | x == GL_FRONT = Front
+   | x == GL_BACK = Back
+   | x == GL_FRONT_AND_BACK = FrontAndBack
+   | otherwise = error ("unmarshalFace: illegal value " ++ show x)
diff --git a/src/Graphics/Rendering/OpenGL/GL/Feedback.hs b/src/Graphics/Rendering/OpenGL/GL/Feedback.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/Feedback.hs
@@ -0,0 +1,196 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.Feedback
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 5.3 (Feedback) of the OpenGL 2.1 specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.Feedback (
+   FeedbackToken(..), VertexInfo(..), ColorInfo, FeedbackType(..),
+   getFeedbackTokens, PassThroughValue(..), passThrough
+) where
+
+import Control.Monad
+import Data.StateVar
+import Foreign.Marshal.Array
+import Foreign.Ptr
+import Foreign.Storable
+import Graphics.Rendering.OpenGL.GL.IOState
+import Graphics.Rendering.OpenGL.GL.RenderMode
+import Graphics.Rendering.OpenGL.GL.Tensor
+import Graphics.Rendering.OpenGL.GL.VertexSpec
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+data FeedbackToken =
+     PointToken VertexInfo
+   | LineToken VertexInfo VertexInfo
+   | LineResetToken VertexInfo VertexInfo
+   | PolygonToken [VertexInfo]
+   | BitmapToken VertexInfo
+   | DrawPixelToken VertexInfo
+   | CopyPixelToken VertexInfo
+   | PassThroughToken PassThroughValue
+   deriving ( Eq, Ord, Show )
+
+data VertexInfo =
+     Vertex2D             (Vertex2 GLfloat)
+   | Vertex3D             (Vertex3 GLfloat)
+   | Vertex3DColor        (Vertex3 GLfloat) ColorInfo
+   | Vertex3DColorTexture (Vertex3 GLfloat) ColorInfo (TexCoord4 GLfloat)
+   | Vertex4DColorTexture (Vertex4 GLfloat) ColorInfo (TexCoord4 GLfloat)
+   deriving ( Eq, Ord, Show )
+
+type ColorInfo = Either (Index1 GLint) (Color4 GLfloat)
+
+--------------------------------------------------------------------------------
+
+data FeedbackTag =
+     PointTag
+   | LineTag
+   | LineResetTag
+   | PolygonTag
+   | BitmapTag
+   | DrawPixelTag
+   | CopyPixelTag
+   | PassThroughTag
+
+unmarshalFeedbackTag :: GLenum -> FeedbackTag
+unmarshalFeedbackTag x
+   | x == GL_POINT_TOKEN = PointTag
+   | x == GL_LINE_TOKEN = LineTag
+   | x == GL_LINE_RESET_TOKEN = LineResetTag
+   | x == GL_POLYGON_TOKEN = PolygonTag
+   | x == GL_BITMAP_TOKEN = BitmapTag
+   | x == GL_DRAW_PIXEL_TOKEN = DrawPixelTag
+   | x == GL_COPY_PIXEL_TOKEN = CopyPixelTag
+   | x == GL_PASS_THROUGH_TOKEN = PassThroughTag
+   | otherwise = error ("unmarshalFeedbackTag: illegal value " ++ show x)
+
+--------------------------------------------------------------------------------
+
+data FeedbackType =
+     TwoD
+   | ThreeD
+   | ThreeDColor
+   | ThreeDColorTexture
+   | FourDColorTexture
+   deriving ( Eq, Ord, Show )
+
+marshalFeedbackType :: FeedbackType -> GLenum
+marshalFeedbackType x = case x of
+   TwoD -> GL_2D
+   ThreeD -> GL_3D
+   ThreeDColor -> GL_3D_COLOR
+   ThreeDColorTexture -> GL_3D_COLOR_TEXTURE
+   FourDColorTexture -> GL_4D_COLOR_TEXTURE
+
+--------------------------------------------------------------------------------
+
+getFeedbackTokens ::
+   GLsizei -> FeedbackType -> IO a -> IO (a, Maybe [FeedbackToken])
+getFeedbackTokens bufSize feedbackType action =
+   allocaArray (fromIntegral bufSize) $ \buf -> do
+      glFeedbackBuffer bufSize (marshalFeedbackType feedbackType) buf
+      (value, numValues) <- withRenderMode Feedback action
+      tokens <- parseFeedbackBuffer numValues buf feedbackType
+      return (value, tokens)
+
+--------------------------------------------------------------------------------
+
+parseFeedbackBuffer ::
+   GLint -> Ptr GLfloat -> FeedbackType -> IO (Maybe [FeedbackToken])
+parseFeedbackBuffer numValues buf feedbackType
+   | numValues < 0 = return Nothing
+   | otherwise     = do
+      rgba <- get rgbaMode
+      let end = buf `plusPtr`
+                  (sizeOf (undefined :: GLfloat) * fromIntegral numValues)
+          infoParser = calcInfoParser feedbackType (calcColorParser rgba)
+          loop tokens = do
+             ptr <- getIOState
+             if ptr == end
+                then return (reverse tokens)
+                else do token <- tokenParser infoParser
+                        loop (token : tokens)
+      fmap Just $ evalIOState (loop []) buf
+
+type Parser a = IOState GLfloat a
+
+tokenParser :: Parser VertexInfo -> Parser FeedbackToken
+tokenParser infoParser = do
+   tag <- parseGLenum
+   case unmarshalFeedbackTag tag of
+      PointTag -> fmap PointToken infoParser
+      LineTag -> liftM2 LineToken infoParser infoParser
+      LineResetTag -> liftM2 LineResetToken infoParser infoParser
+      PolygonTag -> do n <- parseGLint; fmap PolygonToken (nTimes n infoParser)
+      BitmapTag -> fmap BitmapToken infoParser
+      DrawPixelTag -> fmap DrawPixelToken infoParser
+      CopyPixelTag -> fmap CopyPixelToken infoParser
+      PassThroughTag -> fmap PassThroughToken parsePassThroughValue
+
+calcInfoParser :: FeedbackType -> Parser ColorInfo -> Parser VertexInfo
+calcInfoParser feedbackType colorParser = case feedbackType of
+   TwoD ->
+      fmap Vertex2D parseVertex2
+   ThreeD ->
+      fmap Vertex3D parseVertex3
+   ThreeDColor ->
+      liftM2 Vertex3DColor parseVertex3 colorParser
+   ThreeDColorTexture ->
+      liftM3 Vertex3DColorTexture parseVertex3 colorParser parseTexCoord4
+   FourDColorTexture ->
+      liftM3 Vertex4DColorTexture parseVertex4 colorParser parseTexCoord4
+
+parseVertex2 :: Parser (Vertex2 GLfloat)
+parseVertex2 = liftM2 Vertex2 parseGLfloat parseGLfloat
+
+parseVertex3 :: Parser (Vertex3 GLfloat)
+parseVertex3 = liftM3 Vertex3 parseGLfloat parseGLfloat parseGLfloat
+
+parseVertex4 :: Parser (Vertex4 GLfloat)
+parseVertex4 =
+   liftM4 Vertex4 parseGLfloat parseGLfloat parseGLfloat parseGLfloat
+
+calcColorParser :: Bool -> Parser ColorInfo
+calcColorParser False = fmap Left parseIndex1
+calcColorParser True  = fmap Right parseColor4
+
+parseIndex1 :: Parser (Index1 GLint)
+parseIndex1 = fmap Index1 parseGLint
+
+parseColor4 :: Parser (Color4 GLfloat)
+parseColor4 = liftM4 Color4 parseGLfloat parseGLfloat parseGLfloat parseGLfloat
+
+parseTexCoord4 :: Parser (TexCoord4 GLfloat)
+parseTexCoord4 =
+   liftM4 TexCoord4 parseGLfloat parseGLfloat parseGLfloat parseGLfloat
+
+parsePassThroughValue :: Parser PassThroughValue
+parsePassThroughValue = fmap PassThroughValue parseGLfloat
+
+parseGLenum :: Parser GLenum
+parseGLenum = fmap round parseGLfloat
+
+parseGLint :: Parser GLint
+parseGLint = fmap round parseGLfloat
+
+parseGLfloat :: Parser GLfloat
+parseGLfloat = peekIOState
+
+--------------------------------------------------------------------------------
+
+newtype PassThroughValue = PassThroughValue GLfloat
+   deriving ( Eq, Ord, Show )
+
+passThrough :: PassThroughValue -> IO ()
+passThrough (PassThroughValue ptv) = glPassThrough ptv
diff --git a/src/Graphics/Rendering/OpenGL/GL/FlushFinish.hs b/src/Graphics/Rendering/OpenGL/GL/FlushFinish.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/FlushFinish.hs
@@ -0,0 +1,50 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.FlushFinish
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+-- 
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 2.3.2 (Flush and Finish) of the OpenGL 4.4
+-- specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.FlushFinish (
+   flush, finish      
+) where
+
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+-- | Different GL implementations buffer commands in several different
+-- locations, including network buffers and the graphics accelerator itself.
+-- '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.
+-- 
+-- Because any GL program might be executed over a network, or on an accelerator
+-- that buffers commands, all programs should call 'flush' whenever they count
+-- on having all of their previously issued commands completed. For example,
+-- call 'flush' before waiting for user input that depends on the generated
+-- image.
+-- 
+-- Note that 'flush' can return at any time. It does not wait until the
+-- execution of all previously issued GL commands is complete.
+
+flush :: IO ()
+flush = glFlush
+
+-- | '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.
+-- 
+-- Note that 'finish' requires a round trip to the server.
+
+finish :: IO ()
+finish = glFinish
diff --git a/src/Graphics/Rendering/OpenGL/GL/Fog.hs b/src/Graphics/Rendering/OpenGL/GL/Fog.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/Fog.hs
@@ -0,0 +1,198 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.Fog
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+-- 
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 3.10 (Fog) of the OpenGL 2.1 specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.Fog (
+   fog,
+   FogMode(..), fogMode,
+   fogColor, fogIndex,
+   FogCoordSrc(..), fogCoordSrc,
+   FogDistanceMode(..), fogDistanceMode
+) where
+
+import Data.StateVar
+import Foreign.Marshal.Utils
+import Foreign.Ptr
+import Graphics.Rendering.OpenGL.GL.Capability
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.Rendering.OpenGL.GL.VertexSpec
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+fog :: StateVar Capability
+fog = makeCapability CapFog
+
+--------------------------------------------------------------------------------
+
+data FogParameter =
+     FogIndex
+   | FogDensity
+   | FogStart
+   | FogEnd
+   | FogMode
+   | FogColor
+   | FogCoordSrc
+   | FogDistanceMode
+
+marshalFogParameter :: FogParameter -> GLenum
+marshalFogParameter x = case x of
+   FogIndex -> GL_FOG_INDEX
+   FogDensity -> GL_FOG_DENSITY
+   FogStart -> GL_FOG_START
+   FogEnd -> GL_FOG_END
+   FogMode -> GL_FOG_MODE
+   FogColor -> GL_FOG_COLOR
+   FogCoordSrc -> GL_FOG_COORD_SRC
+   FogDistanceMode -> GL_FOG_DISTANCE_MODE_NV
+
+--------------------------------------------------------------------------------
+
+data FogMode' =
+     Linear'
+   | Exp'
+   | Exp2'
+
+marshalFogMode' :: FogMode' -> GLint
+marshalFogMode' x = fromIntegral $ case x of
+   Linear' -> GL_LINEAR
+   Exp' -> GL_EXP
+   Exp2' -> GL_EXP2
+
+unmarshalFogMode' :: GLint -> FogMode'
+unmarshalFogMode' x
+   | y == GL_LINEAR = Linear'
+   | y == GL_EXP = Exp'
+   | y == GL_EXP2 = Exp2'
+   | otherwise = error ("unmarshalFogMode': illegal value " ++ show x)
+   where y = fromIntegral x
+
+--------------------------------------------------------------------------------
+
+data FogMode =
+     Linear GLfloat GLfloat
+   | Exp GLfloat
+   | Exp2 GLfloat
+   deriving ( Eq, Ord, Show )
+
+--------------------------------------------------------------------------------
+
+fogMode :: StateVar FogMode
+fogMode = makeStateVar getFogMode setFogMode
+
+getFogMode :: IO FogMode
+getFogMode = do
+   mode <- getInteger1 unmarshalFogMode' GetFogMode
+   case mode of
+      Linear' -> do
+         start <- getFloat1 id GetFogStart
+         end <- getFloat1 id GetFogEnd
+         return $ Linear start end
+      Exp' -> getFloat1 Exp GetFogDensity
+      Exp2' -> getFloat1 Exp2 GetFogDensity
+
+setFogMode :: FogMode -> IO ()
+setFogMode (Linear start end) = do
+   fogi FogMode (marshalFogMode' Linear')
+   fogf FogStart start
+   fogf FogEnd end
+setFogMode (Exp density) = do
+   fogi FogMode (marshalFogMode' Exp')
+   fogf FogDensity density
+setFogMode (Exp2 density) = do
+   fogi FogMode (marshalFogMode' Exp2')
+   fogf FogDensity density
+
+--------------------------------------------------------------------------------
+
+fogi :: FogParameter -> GLint -> IO ()
+fogi = glFogi . marshalFogParameter
+
+fogf :: FogParameter -> GLfloat -> IO ()
+fogf = glFogf . marshalFogParameter
+
+fogfv :: FogParameter -> Ptr (Color4 GLfloat) -> IO ()
+fogfv param ptr = glFogfv (marshalFogParameter param) (castPtr ptr)
+
+--------------------------------------------------------------------------------
+
+fogColor :: StateVar (Color4 GLclampf)
+fogColor =
+   makeStateVar
+      (getClampf4 Color4 GetFogColor)
+      (\c -> with c $ (fogfv FogColor . castPtr))
+
+--------------------------------------------------------------------------------
+
+fogIndex :: StateVar (Index1 GLint)
+fogIndex =
+   makeStateVar
+      (getInteger1 Index1 GetFogIndex)
+      (\(Index1 i) -> fogi FogIndex i)
+
+--------------------------------------------------------------------------------
+
+data FogCoordSrc =
+     FogCoord
+   | FragmentDepth
+   deriving ( Eq, Ord, Show )
+
+marshalFogCoordSrc :: FogCoordSrc -> GLint
+marshalFogCoordSrc x = fromIntegral $ case x of
+   FogCoord -> GL_FOG_COORD
+   FragmentDepth -> GL_FRAGMENT_DEPTH
+
+unmarshalFogCoordSrc :: GLint -> FogCoordSrc
+unmarshalFogCoordSrc x
+   | y == GL_FOG_COORD = FogCoord
+   | y == GL_FRAGMENT_DEPTH = FragmentDepth
+   | otherwise = error ("unmarshalFogCoordSrc: illegal value " ++ show x)
+   where y = fromIntegral x
+
+--------------------------------------------------------------------------------
+
+fogCoordSrc :: StateVar FogCoordSrc
+fogCoordSrc =
+   makeStateVar
+      (getInteger1 unmarshalFogCoordSrc GetFogCoordSrc)
+      (fogi FogCoordSrc . marshalFogCoordSrc)
+
+--------------------------------------------------------------------------------
+
+data FogDistanceMode =
+     EyeRadial
+   | EyePlaneSigned
+   | EyePlaneAbsolute
+   deriving ( Eq, Ord, Show )
+
+marshalFogDistanceMode :: FogDistanceMode -> GLint
+marshalFogDistanceMode x = fromIntegral $ case x of
+   EyeRadial -> GL_EYE_RADIAL_NV
+   EyePlaneSigned -> GL_EYE_PLANE
+   EyePlaneAbsolute -> GL_EYE_PLANE_ABSOLUTE_NV
+
+unmarshalFogDistanceMode :: GLint -> FogDistanceMode
+unmarshalFogDistanceMode x
+   | y == GL_EYE_RADIAL_NV = EyeRadial
+   | y == GL_EYE_PLANE = EyePlaneSigned
+   | y == GL_EYE_PLANE_ABSOLUTE_NV = EyePlaneAbsolute
+   | otherwise = error ("unmarshalFogDistanceMode: illegal value " ++ show x)
+   where y = fromIntegral x
+
+--------------------------------------------------------------------------------
+
+fogDistanceMode :: StateVar FogDistanceMode
+fogDistanceMode =
+   makeStateVar
+      (getInteger1 unmarshalFogDistanceMode GetFogDistanceMode)
+      (fogi FogDistanceMode . marshalFogDistanceMode)
diff --git a/src/Graphics/Rendering/OpenGL/GL/Framebuffer.hs b/src/Graphics/Rendering/OpenGL/GL/Framebuffer.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/Framebuffer.hs
@@ -0,0 +1,557 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.Framebuffer
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 17.4 (Whole Framebuffer Operations) of the
+-- OpenGL 4.5 specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.Framebuffer (
+   -- * Selecting a Buffer for Writing
+   BufferMode(..),
+   drawBuffer, namedFramebufferDrawBuffer,
+   drawBuffers, namedFramebufferDrawBuffers,
+   DrawBufferIndex, drawBufferi,
+   maxDrawBuffers,
+
+   -- * Fine Control of Buffer Updates
+   indexMask, colorMask, colorMaski, depthMask,
+   stencilMask, stencilMaskSeparate,
+
+   -- * Clearing the Buffers
+   ClearBuffer(..), clear,
+   clearColor, clearIndex, clearDepth, clearDepthf, clearStencil, clearAccum,
+
+   ClearBufferCommand(..), clearBuffer, clearNamedFramebuffer,
+
+   -- * Invalidating Framebuffer Contents
+   invalidateSubFramebuffer, invalidateNamedFramebufferSubData,
+   invalidateFramebuffer, invalidateNamedFramebufferData,
+
+   -- * The Accumulation Buffer
+   AccumOp(..), accum,
+
+   -- * Querying the Buffer Configuration
+   auxBuffers, doubleBuffer, stereoBuffer,
+   rgbaBits, stencilBits, depthBits, accumBits, rgbaSignedComponents,
+) where
+
+import Control.Monad
+import Data.Maybe
+import Data.StateVar
+import Foreign.Marshal.Array
+import Foreign.Marshal.Utils
+import Foreign.Ptr
+import Graphics.Rendering.OpenGL.GL.BufferMode
+import Graphics.Rendering.OpenGL.GL.Capability
+import Graphics.Rendering.OpenGL.GL.CoordTrans
+import Graphics.Rendering.OpenGL.GL.Face
+import Graphics.Rendering.OpenGL.GL.FramebufferObjects.FramebufferObject
+import Graphics.Rendering.OpenGL.GL.FramebufferObjects.FramebufferObjectAttachment
+import Graphics.Rendering.OpenGL.GL.FramebufferObjects.FramebufferTarget
+import Graphics.Rendering.OpenGL.GL.GLboolean
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.Rendering.OpenGL.GL.VertexSpec
+import Graphics.Rendering.OpenGL.GLU.ErrorsInternal
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+-- | When colors are written to the framebuffer, they are written into the color
+-- buffers specified by 'drawBuffer'.
+--
+-- If more than one color buffer is selected for drawing, then blending or
+-- logical operations are computed and applied independently for each color
+-- buffer and can produce different results in each buffer.
+--
+-- Monoscopic contexts include only left buffers, and stereoscopic contexts
+-- include both left and right buffers. Likewise, single-buffered contexts
+-- include only front buffers, and double-buffered contexts include both front
+-- and back buffers. The context is selected at GL initialization.
+--
+-- The initial value is 'FrontBuffers' for single-buffered contexts, and
+-- 'BackBuffers' for double-buffered contexts.
+
+drawBuffer :: StateVar BufferMode
+drawBuffer = makeStateVar getDrawBuffer setDrawBuffer
+
+getDrawBuffer :: IO BufferMode
+getDrawBuffer = getDrawBufferi 0
+
+setDrawBuffer :: BufferMode -> IO ()
+setDrawBuffer mode =
+   withBufferModes [mode] $ \[m] ->
+      glDrawBuffer m
+
+-- | The direct-state-access version of 'drawBuffer'.
+
+namedFramebufferDrawBuffer :: FramebufferObject -> SettableStateVar BufferMode
+namedFramebufferDrawBuffer fbo =
+   makeSettableStateVar $ \mode ->
+      withBufferModes [mode] $ \[m] ->
+         glNamedFramebufferDrawBuffer (framebufferID fbo) m
+
+-- | 'drawBuffers' defines the draw buffers to which all fragment colors are
+-- written. The draw buffers being defined correspond in order to the respective
+-- fragment colors. The draw buffer for fragment colors beyond those specified
+-- is set to 'NoBuffers'.
+--
+-- Except for 'NoBuffers', a buffer may not appear more then once in the given
+-- list. Specifying a buffer more then once will result in an
+-- 'Graphics.Rendering.OpenGL.GLU.Errors.InvalidOperation'.
+--
+-- If fixed-function fragment shading is being performed, 'drawBuffers'
+-- specifies a set of draw buffers into which the fragment color is written.
+--
+-- If a fragment shader writes to @gl_FragColor@, 'drawBuffers' specifies a set
+-- of draw buffers into which the single fragment color defined by
+-- @gl_FragColor@ is written. If a fragment shader writes to @gl_FragData@,
+-- 'drawBuffers' specifies a set of draw buffers into which each of the multiple
+-- fragment colors defined by @gl_FragData@ are separately written. If a
+-- fragment shader writes to neither @gl_FragColor@ nor @gl_FragData@, the
+-- values of the fragment colors following shader execution are undefined, and
+-- may differ for each fragment color.
+
+drawBuffers :: StateVar [BufferMode]
+drawBuffers = makeStateVar getDrawBuffers setDrawBuffers
+
+getDrawBuffers :: IO [BufferMode]
+getDrawBuffers = do
+   n <- get maxDrawBuffers
+   mapM getDrawBufferi [ 0 .. n-1 ]
+
+setDrawBuffers :: [BufferMode] -> IO ()
+setDrawBuffers modes =
+   withBufferModes modes $ \ms ->
+      withArrayLen ms $ \len ->
+         glDrawBuffers (fromIntegral len)
+
+-- | The direct-state-access version of 'drawBuffers'.
+
+namedFramebufferDrawBuffers :: FramebufferObject -> SettableStateVar [BufferMode]
+namedFramebufferDrawBuffers fbo =
+   makeSettableStateVar $ \modes ->
+      withBufferModes modes $ \ms ->
+         withArrayLen ms $ \len ->
+            glNamedFramebufferDrawBuffers (framebufferID fbo) (fromIntegral len)
+
+withBufferModes :: [BufferMode] -> ([GLenum] -> IO ()) -> IO ()
+withBufferModes modes success
+   | all isJust ms = success (catMaybes ms)
+   | otherwise = recordInvalidValue
+   where ms = map marshalBufferMode modes
+
+-- | The index of the draw buffer.
+
+type DrawBufferIndex = GLuint
+
+-- | 'drawBufferi' is a fast query function. For indices in the range
+-- 0..'maxDrawBuffers'-1 its results is the same as selecting the corresponding
+-- element from the list returned by 'drawBuffers', but this function uses only
+-- one GL function call instead of 'maxDrawBuffers' ones.
+
+drawBufferi :: DrawBufferIndex -> GettableStateVar BufferMode
+drawBufferi = makeGettableStateVar . getDrawBufferi . fromIntegral
+
+getDrawBufferi :: GLsizei -> IO BufferMode
+getDrawBufferi = getEnum1 unmarshalBufferMode . GetDrawBufferN
+
+-- | Contains the maximum number of buffers that can activated via 'drawBuffers'
+-- or which can be simultaneously written into from within a fragment shader
+-- using the special output variable array @gl_FragData@. This constant
+-- effectively defines the size of the @gl_FragData@ array. The minimum legal
+-- value is 1.
+
+maxDrawBuffers :: GettableStateVar GLsizei
+maxDrawBuffers = makeGettableStateVar $ getSizei1 id GetMaxDrawBuffers
+
+--------------------------------------------------------------------------------
+
+-- | Controls the writing of individual bits in the color index buffers. The
+-- least significant /n/ bits of its value, where /n/ is the number of bits in a
+-- color index buffer, specify a mask. Where a 1 appears in the mask, it is
+-- possible to write to the corresponding bit in the color index buffer (or
+-- buffers). Where a 0 appears, the corresponding bit is write-protected.
+--
+-- This mask is used only in color index mode, and it affects only the buffers
+-- currently selected for writing (see 'drawBuffer'). Initially, all bits are
+-- enabled for writing.
+
+indexMask :: StateVar GLuint
+indexMask =
+   makeStateVar (getInteger1 fromIntegral GetIndexWritemask) glIndexMask
+
+-- | Controls whether the individual color components in the framebuffer can or
+-- cannot be written. If the red flag is 'Disabled', 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. Initially, all color
+-- components can be written.
+--
+-- Changes to individual bits of components cannot be controlled. Rather,
+-- changes are either enabled or disabled for entire color components.
+-- Furthermore, this mask is used only in RGBA mode.
+
+colorMask :: StateVar (Color4 Capability)
+colorMask =
+   makeStateVar
+      (getBoolean4 (\r g b a -> Color4 (unmarshalCapability r)
+                                       (unmarshalCapability g)
+                                       (unmarshalCapability b)
+                                       (unmarshalCapability a))
+                                       GetColorWritemask)
+      (\(Color4 r g b a) -> glColorMask (marshalCapability r)
+                                        (marshalCapability g)
+                                        (marshalCapability b)
+                                        (marshalCapability a))
+
+-- | 'colorMaski' is a version of 'colorMask' that only applies to the specified
+-- draw buffer.
+
+colorMaski :: DrawBufferIndex -> StateVar (Color4 Capability)
+colorMaski idx =
+   makeStateVar
+      (getBoolean4i (\r g b a -> Color4 (unmarshalCapability r)
+                                        (unmarshalCapability g)
+                                        (unmarshalCapability b)
+                                        (unmarshalCapability a))
+                    GetColorWritemask idx)
+      (\(Color4 r g b a) -> glColorMaski idx
+                                         (marshalCapability r)
+                                         (marshalCapability g)
+                                         (marshalCapability b)
+                                         (marshalCapability a))
+
+-- | Controls whether the depth buffer is enabled for writing. The initial state
+-- is 'Enabled'.
+
+depthMask :: StateVar Capability
+depthMask = makeStateVar (getBoolean1 unmarshalCapability GetDepthWritemask)
+                         (glDepthMask . marshalCapability)
+
+-- | Controls the writing of individual bits in the stencil planes. The least
+-- significant /n/ bits of its value, where /n/ is the number of bits in the
+-- stencil buffer, specify a mask. Where a 1 appears in the mask, it is 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.
+
+stencilMask :: StateVar GLuint
+stencilMask =
+   makeStateVar (get (stencilMaskSeparate Front)) glStencilMask
+
+-- | A per-face version of 'stencilMask'.
+
+stencilMaskSeparate :: Face -> StateVar GLuint
+stencilMaskSeparate face =
+   makeStateVar
+      (case face of
+          Front -> getInteger1 fromIntegral GetStencilWritemask
+          Back -> getInteger1 fromIntegral GetStencilBackWritemask
+          FrontAndBack -> do recordInvalidEnum; return 0)
+      (glStencilMaskSeparate (marshalFace face))
+
+--------------------------------------------------------------------------------
+
+-- | The buffers which can be cleared with 'clear'.
+
+data ClearBuffer =
+     ColorBuffer   -- ^ The buffers currently enabled for color writing.
+   | AccumBuffer   -- ^ The accumulation buffer.
+   | StencilBuffer -- ^ The stencil buffer.
+   | DepthBuffer   -- ^ The depth buffer.
+   deriving ( Eq, Ord, Show )
+
+marshalClearBuffer :: ClearBuffer -> GLbitfield
+marshalClearBuffer x = case x of
+   ColorBuffer -> GL_COLOR_BUFFER_BIT
+   AccumBuffer -> GL_ACCUM_BUFFER_BIT
+   StencilBuffer -> GL_STENCIL_BUFFER_BIT
+   DepthBuffer -> GL_DEPTH_BUFFER_BIT
+
+-- | Set the bitplane area of the window to values previously selected by
+-- 'clearColor', 'clearIndex', 'clearDepth', 'clearStencil', and 'clearAccum'.
+-- Multiple color buffers can be cleared simultaneously by selecting more than
+-- one buffer at a time using 'drawBuffer'.
+--
+-- The pixel ownership test, the scissor test, dithering, and the buffer
+-- writemasks affect the operation of 'clear'. The scissor box bounds the
+-- cleared region. Alpha function, blend function, logical operation,
+-- stenciling, texure mapping, and depth-buffering are ignored by 'clear'.
+--
+-- 'clear' takes a list of buffers, indicating which buffers are to be cleared.
+-- If a buffer is not present, then a 'clear' directed at that buffer has no
+-- effect.
+--
+-- The value to which each buffer is cleared depends on the setting of the clear
+-- value for that buffer.
+
+clear :: [ClearBuffer] -> IO ()
+clear = glClear . sum . map marshalClearBuffer
+
+-- | Controls the red, green, blue, and alpha values used by 'clear' to clear
+-- the color buffers. Initially, all values are 0.
+
+clearColor :: StateVar (Color4 GLfloat)
+clearColor = makeStateVar (getFloat4 Color4 GetColorClearValue)
+                          (\(Color4 r g b a) -> glClearColor r g b a)
+
+-- | Controls the index /c/ used by 'clear' 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 framebuffer. Initially, the value is 0.
+
+clearIndex :: StateVar (Index1 GLfloat)
+clearIndex = makeStateVar (getFloat1 Index1 GetIndexClearValue)
+                          (\(Index1 i) -> glClearIndex i)
+
+-- | Controls the depth value used by 'clear' to clear the depth buffer. The
+-- initial value is 1.
+
+clearDepth :: StateVar GLdouble
+clearDepth = makeStateVar (getDouble1 id GetDepthClearValue) glClearDepth
+
+-- | A variant of 'clearDepth' with a 'GLfloat' argument.
+
+clearDepthf :: StateVar GLfloat
+clearDepthf = makeStateVar (getFloat1 id GetDepthClearValue) glClearDepthf
+
+-- | Controls the value /s/ used by 'clear' to clear the stencil buffer. /s/ is
+-- masked with 2^/m/-1, where /m/ is the number of bits in the stencil buffer.
+-- Initially, the value is 0.
+
+clearStencil :: StateVar GLint
+clearStencil = makeStateVar (getInteger1 id GetStencilClearValue) glClearStencil
+
+-- | Controls the red, green, blue, and alpha values used by 'clear' to clear
+-- the accumulation buffer. Values written into 'clearAccum' are clamped to the
+-- range [-1, 1]. The initial values are all 0.
+
+clearAccum :: StateVar (Color4 GLfloat)
+clearAccum =
+   makeStateVar (getFloat4 Color4 GetAccumClearValue)
+                (\(Color4 r g b a) -> glClearAccum r g b a)
+
+-- | Describes which buffer(s) to clear and the value to use.
+
+data ClearBufferCommand
+   = ClearColorBufferInt DrawBufferIndex (Color4 GLint)
+   -- ^ Clear the signed integer color buffer(s) at the given index.
+   | ClearColorBufferFloat DrawBufferIndex (Color4 GLfloat)
+   -- ^ Clear the fixed- or floating-point color buffer(s) at the given index.
+   | ClearColorBufferUint DrawBufferIndex (Color4 GLuint)
+   -- ^ Clear the unsigned color buffer(s) at the given index.
+   | ClearDepthBuffer GLfloat
+   -- ^ Clear the depth buffer.
+   | ClearStencilBuffer GLint
+   -- ^ Clear the stencil buffer.
+   | ClearDepthAndStencilBuffers GLfloat GLint
+   -- ^ Clear the depth buffer and the stencil buffer.
+   deriving ( Eq, Ord, Show )
+
+-- | Clear the given buffer(s).
+
+clearBuffer :: ClearBufferCommand -> IO ()
+clearBuffer cmd = case cmd of
+   ClearColorBufferInt i c ->
+      with c $ glClearBufferiv GL_COLOR (fromIntegral i) . castPtr
+   ClearColorBufferFloat i c ->
+      with c $ glClearBufferfv GL_COLOR (fromIntegral i) . castPtr
+   ClearColorBufferUint i c ->
+      with c $ glClearBufferuiv GL_COLOR (fromIntegral i) . castPtr
+   ClearDepthBuffer d ->
+      with d $ glClearBufferfv GL_DEPTH 0
+   ClearStencilBuffer s ->
+      with s $ glClearBufferiv GL_STENCIL 0
+   ClearDepthAndStencilBuffers d s ->
+      glClearBufferfi GL_DEPTH_STENCIL 0 d s
+
+-- | The direct-state-access version of 'clearBuffer'.
+
+clearNamedFramebuffer :: FramebufferObject -> ClearBufferCommand -> IO ()
+clearNamedFramebuffer fbo cmd = case cmd of
+   ClearColorBufferInt i c ->
+      with c $ glClearNamedFramebufferiv f GL_COLOR (fromIntegral i) . castPtr
+   ClearColorBufferFloat i c ->
+      with c $ glClearNamedFramebufferfv f GL_COLOR (fromIntegral i) . castPtr
+   ClearColorBufferUint i c ->
+      with c $ glClearNamedFramebufferuiv f GL_COLOR (fromIntegral i) . castPtr
+   ClearDepthBuffer d ->
+      with d $ glClearNamedFramebufferfv f GL_DEPTH 0
+   ClearStencilBuffer s ->
+      with s $ glClearNamedFramebufferiv f GL_STENCIL 0
+   ClearDepthAndStencilBuffers d s ->
+      glClearNamedFramebufferfi f GL_DEPTH_STENCIL 0 d s
+   where f = framebufferID fbo
+
+--------------------------------------------------------------------------------
+
+-- | Invalidate a region of the attachments bound to the given target.
+
+invalidateSubFramebuffer :: FramebufferTarget -> [FramebufferObjectAttachment] -> (Position, Size) -> IO ()
+invalidateSubFramebuffer target attachments (Position x y, Size w h) =
+   withAttachments attachments $ \numAttachments atts ->
+      glInvalidateSubFramebuffer (marshalFramebufferTarget target) numAttachments atts x y w h
+
+-- | The direct-state-access version of 'invalidateSubFramebuffer'.
+
+invalidateNamedFramebufferSubData :: FramebufferObject -> [FramebufferObjectAttachment] -> (Position, Size) -> IO ()
+invalidateNamedFramebufferSubData fbo attachments (Position x y, Size w h) =
+   withAttachments attachments $ \numAttachments atts ->
+      glInvalidateNamedFramebufferSubData (framebufferID fbo) numAttachments atts x y w h
+
+-- | A version of 'invalidateSubFramebuffer' affecting the whole viewport.
+
+invalidateFramebuffer :: FramebufferTarget -> [FramebufferObjectAttachment] -> IO ()
+invalidateFramebuffer target attachments =
+   withAttachments attachments $
+      glInvalidateFramebuffer (marshalFramebufferTarget target)
+
+-- | The direct-state-access version of 'invalidateFramebuffer'.
+
+invalidateNamedFramebufferData :: FramebufferObject -> [FramebufferObjectAttachment] -> IO ()
+invalidateNamedFramebufferData fbo attachments =
+   withAttachments attachments $
+      glInvalidateNamedFramebufferData (framebufferID fbo)
+
+withAttachments :: [FramebufferObjectAttachment] -> (GLsizei -> Ptr GLenum -> IO ()) -> IO ()
+withAttachments attachments success
+   | all isJust atts = withArrayLen (catMaybes atts) $ \len buf ->
+                          success (fromIntegral len) buf
+   | otherwise = recordInvalidEnum
+   where atts = map marshalFramebufferObjectAttachment attachments
+
+--------------------------------------------------------------------------------
+
+-- | The implementation and context dependent number of auxiliary buffers.
+
+auxBuffers :: GettableStateVar GLsizei
+auxBuffers = makeGettableStateVar $ getSizei1 id GetAuxBuffers
+
+-- | 'True' if front and back buffers exist.
+
+doubleBuffer :: GettableStateVar Bool
+doubleBuffer =
+   makeGettableStateVar $ getBoolean1 unmarshalGLboolean GetDoublebuffer
+
+-- | 'True' if left and right buffers exist.
+
+stereoBuffer :: GettableStateVar Bool
+stereoBuffer =
+    makeGettableStateVar $ getBoolean1 unmarshalGLboolean GetStereo
+
+rgbaBits :: GettableStateVar (Color4 GLsizei)
+rgbaBits =
+   makeGettableStateVar $
+      liftM4 Color4 (getSizei1 id GetRedBits)
+                    (getSizei1 id GetGreenBits)
+                    (getSizei1 id GetBlueBits)
+                    (getSizei1 id GetAlphaBits)
+
+stencilBits :: GettableStateVar GLsizei
+stencilBits = makeGettableStateVar $ getSizei1 id GetStencilBits
+
+depthBits :: GettableStateVar GLsizei
+depthBits = makeGettableStateVar $ getSizei1 id GetDepthBits
+
+accumBits :: GettableStateVar (Color4 GLsizei)
+accumBits =
+   makeGettableStateVar $
+      liftM4 Color4 (getSizei1 id GetAccumRedBits)
+                    (getSizei1 id GetAccumGreenBits)
+                    (getSizei1 id GetAccumBlueBits)
+                    (getSizei1 id GetAccumAlphaBits)
+
+rgbaSignedComponents :: GettableStateVar (Color4 Bool)
+rgbaSignedComponents =
+   makeGettableStateVar $
+      getInteger4 (\r g b a -> Color4 (unmarshalGLboolean r)
+                                      (unmarshalGLboolean g)
+                                      (unmarshalGLboolean b)
+                                      (unmarshalGLboolean a))
+                  GetRGBASignedComponents
+
+--------------------------------------------------------------------------------
+
+-- | An operation on the accumulation buffer.
+
+data AccumOp =
+     Accum
+     -- ^ Obtains /R/, /G/, /B/, and /A/ values from the buffer currently
+     -- selected for reading (see
+     -- 'Graphics.Rendering.OpenGL.GL.ReadCopyPixels.readBuffer'). Each
+     -- component value is divided by 2^/n/-1, where /n/ is the number of bits
+     -- allocated to each color component in the currently selected buffer. The
+     -- result is a floating-point value in the range [0, 1], which is
+     -- multiplied by the value given to 'accum' and added to the corresponding
+     -- pixel component in the accumulation buffer, thereby updating the
+     -- accumulation buffer.
+   | Load
+     -- ^ Similar to 'Accum', except that the current value in the accumulation
+     -- buffer is not used in the calculation of the new value. That is, the
+     -- /R/, /G/, /B/, and /A/ values from the currently selected buffer are
+     -- divided by 2^/n/-1, multiplied by the value given to 'accum', and then
+     -- stored in the corresponding accumulation buffer cell, overwriting the
+     -- current value.
+   | Return
+     -- ^ Transfers accumulation buffer values to the color buffer or buffers
+     -- currently selected for writing. Each /R/, /G/, /B/, and /A/ component
+     -- is multiplied by the value given to 'accum', then multiplied by 2^/n/-1,
+     -- clamped to the range [0, 2^/n/-1], and stored in the corresponding
+     -- display buffer cell. The only fragment operations that are applied to
+     -- this transfer are pixel ownership, scissor, dithering, and color
+     -- writemasks.
+   | Mult
+     -- ^ Multiplies each /R/, /G/, /B/, and /A/ in the accumulation buffer by
+     -- the value given to 'accum' and returns the scaled component to its
+     -- corresponding accumulation buffer location.
+   | Add
+     -- ^ Adds the value given to 'accum' to each /R/, /G/, /B/, and /A/ in the
+     -- accumulation buffer.
+   deriving ( Eq, Ord, Show )
+
+marshalAccumOp :: AccumOp -> GLenum
+marshalAccumOp x = case x of
+   Accum -> GL_ACCUM
+   Load -> GL_LOAD
+   Return -> GL_RETURN
+   Mult -> GL_MULT
+   Add -> GL_ADD
+
+--------------------------------------------------------------------------------
+
+-- | 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.
+--
+-- Each pixel in the accumulation buffer consists of red, green, blue, and alpha
+-- values. The number of bits per component in the accumulation buffer depends
+-- on the implementation (see 'accumBits'). Regardless of the number of bits per
+-- component, the range of values stored by each component is [-1, 1]. The
+-- accumulation buffer pixels are mapped one-to-one with frame buffer pixels.
+--
+-- 'accum' operates on the accumulation buffer. The first argument selects an
+-- accumulation buffer operation. The second argument, is a floating-point value
+-- to be used in that operation, see 'AccumOp'.
+--
+-- All accumulation buffer operations are limited to the area of the current
+-- scissor box and applied identically to the red, green, blue, and alpha
+-- components of each pixel. If an 'accum' operation results in a value outside
+-- the range [-1, 1], the contents of an accumulation buffer pixel component
+-- are undefined.
+--
+-- To clear the accumulation buffer, use 'clearAccum' to specify the clear
+-- value, then call 'clear' with the accumulation buffer enabled.
+
+accum :: AccumOp -> GLfloat -> IO ()
+accum = glAccum . marshalAccumOp
diff --git a/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects.hs b/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects.hs
@@ -0,0 +1,25 @@
+-----------------------------------------------------------------------------
+-- |
+-- Copyright   :  (c) Sven Panne 2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- Framebuffer objects.
+--
+-----------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.FramebufferObjects (
+   module Graphics.Rendering.OpenGL.GL.FramebufferObjects.Attachments,
+   module Graphics.Rendering.OpenGL.GL.FramebufferObjects.FramebufferObjects,
+   module Graphics.Rendering.OpenGL.GL.FramebufferObjects.Queries,
+   module Graphics.Rendering.OpenGL.GL.FramebufferObjects.RenderbufferObjects
+) where
+
+
+import Graphics.Rendering.OpenGL.GL.FramebufferObjects.Attachments
+import Graphics.Rendering.OpenGL.GL.FramebufferObjects.FramebufferObjects
+import Graphics.Rendering.OpenGL.GL.FramebufferObjects.Queries
+import Graphics.Rendering.OpenGL.GL.FramebufferObjects.RenderbufferObjects
diff --git a/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/Attachments.hs b/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/Attachments.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/Attachments.hs
@@ -0,0 +1,67 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.FramebufferObjects.Attachments
+-- Copyright   :  (c) Sven Panne 2011-2019, Lars Corbijn 2011-2016
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-----------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.FramebufferObjects.Attachments (
+   FramebufferObjectAttachment(..),
+
+   fboaToBufferMode, fboaFromBufferMode,
+
+   FramebufferAttachment(..),
+
+   framebufferRenderbuffer, framebufferTexture1D, framebufferTexture2D,
+   framebufferTexture3D, framebufferTextureLayer
+) where
+
+import Graphics.Rendering.OpenGL.GL.FramebufferObjects.FramebufferObjectAttachment
+import Graphics.Rendering.OpenGL.GL.FramebufferObjects.FramebufferTarget
+import Graphics.Rendering.OpenGL.GL.FramebufferObjects.RenderbufferObject
+import Graphics.Rendering.OpenGL.GL.FramebufferObjects.RenderbufferTarget
+import Graphics.Rendering.OpenGL.GL.Texturing.Specification
+import Graphics.Rendering.OpenGL.GL.Texturing.TextureObject
+import Graphics.Rendering.OpenGL.GL.Texturing.TextureTarget
+import Graphics.Rendering.OpenGL.GLU.ErrorsInternal
+import Graphics.GL
+
+-----------------------------------------------------------------------------
+
+framebufferRenderbuffer :: FramebufferTarget -> FramebufferObjectAttachment
+   -> RenderbufferTarget -> RenderbufferObject -> IO ()
+framebufferRenderbuffer fbt fba rbt (RenderbufferObject rboi) =
+   maybe recordInvalidValue (\mfba ->  glFramebufferRenderbuffer (marshalFramebufferTarget fbt)
+      mfba (marshalRenderbufferTarget rbt) rboi) $ marshalFramebufferObjectAttachment fba
+
+framebufferTexture1D :: FramebufferTarget -> FramebufferObjectAttachment
+   -> TextureTarget1D -> TextureObject -> Level -> IO ()
+framebufferTexture1D fbt fba tt (TextureObject t) l  =  maybe recordInvalidValue
+   (\mfba -> glFramebufferTexture1D (marshalFramebufferTarget fbt) mfba
+      (marshalQueryableTextureTarget tt) t l) $ marshalFramebufferObjectAttachment fba
+
+-- Note: Typing is too permissive, no TEXTURE_1D_ARRAY allowed per 4.4. spec.
+framebufferTexture2D :: FramebufferTarget -> FramebufferObjectAttachment
+   -> TextureTarget2D -> TextureObject -> Level -> IO ()
+framebufferTexture2D fbt fba tt (TextureObject t) l = maybe recordInvalidValue
+   (\mfba -> glFramebufferTexture2D (marshalFramebufferTarget fbt) mfba
+      (marshalQueryableTextureTarget tt) t l)
+         $ marshalFramebufferObjectAttachment fba
+
+-- Note: Typing is too permissive, no TEXTURE_2D_ARRAY or TEXTURE_2D_MULTISAMPLE_ARRAY allowed per 4.4. spec.
+framebufferTexture3D :: FramebufferTarget -> FramebufferObjectAttachment
+   -> TextureTarget3D -> TextureObject -> Level -> GLint -> IO ()
+framebufferTexture3D fbt fba tt (TextureObject t) le la = maybe recordInvalidValue
+   (\mfba -> glFramebufferTexture3D (marshalFramebufferTarget fbt) mfba
+      (marshalQueryableTextureTarget tt) t le la) $ marshalFramebufferObjectAttachment fba
+
+framebufferTextureLayer :: FramebufferTarget -> FramebufferObjectAttachment
+   -> TextureObject -> Level -> GLint -> IO()
+framebufferTextureLayer fbt fba (TextureObject t) le la = maybe recordInvalidValue
+   (\mfba -> glFramebufferTextureLayer (marshalFramebufferTarget fbt)
+      mfba t le la) $ marshalFramebufferObjectAttachment fba
diff --git a/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/FramebufferObject.hs b/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/FramebufferObject.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/FramebufferObject.hs
@@ -0,0 +1,48 @@
+{-# OPTIONS_HADDOCK hide #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.FramebufferObjects.FramebufferObject
+-- Copyright   :  (c) Sven Panne 2013-2019
+-- License     :  BSD3
+-- 
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This is a purely internal module for handling FramebufferObjects.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.FramebufferObjects.FramebufferObject (
+   FramebufferObject(..)
+) where
+
+import Control.Monad.IO.Class
+import Data.ObjectName
+import Foreign.Marshal.Array ( allocaArray, peekArray, withArrayLen )
+import Graphics.Rendering.OpenGL.GL.DebugOutput
+import Graphics.Rendering.OpenGL.GL.GLboolean
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.GL
+       
+--------------------------------------------------------------------------------
+
+newtype FramebufferObject = FramebufferObject { framebufferID :: GLuint }
+   deriving ( Eq, Ord, Show )
+
+instance ObjectName FramebufferObject where
+    isObjectName =
+      liftIO . fmap unmarshalGLboolean . glIsFramebuffer . framebufferID
+
+    deleteObjectNames objs =
+       liftIO . withArrayLen (map framebufferID objs) $
+          glDeleteFramebuffers . fromIntegral
+
+instance GeneratableObjectName FramebufferObject where
+    genObjectNames n =
+       liftIO . allocaArray n $ \buf -> do
+          glGenFramebuffers (fromIntegral n) buf
+          fmap (map FramebufferObject) $ peekArray n buf
+
+instance CanBeLabeled FramebufferObject where
+   objectLabel = objectNameLabel GL_FRAMEBUFFER . framebufferID
diff --git a/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/FramebufferObjectAttachment.hs b/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/FramebufferObjectAttachment.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/FramebufferObjectAttachment.hs
@@ -0,0 +1,105 @@
+{-# OPTIONS_HADDOCK hide #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.FramebufferObjects.FramebufferObjectAttachment
+-- Copyright   :  (c) Sven Panne 2013-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This is a purely internal module for marshaling FramebufferObjectAttachments.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.FramebufferObjects.FramebufferObjectAttachment (
+   FramebufferObjectAttachment(..),
+   marshalFramebufferObjectAttachment,
+   unmarshalFramebufferObjectAttachment,
+   unmarshalFramebufferObjectAttachmentSafe,
+   fboaToBufferMode, fboaFromBufferMode,
+
+   FramebufferAttachment(..), getFBAParameteriv
+) where
+
+import Data.Maybe
+import Foreign.Marshal
+import Graphics.Rendering.OpenGL.GL.BufferMode
+import Graphics.Rendering.OpenGL.GL.FramebufferObjects.FramebufferTarget
+import Graphics.Rendering.OpenGL.GL.PeekPoke
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+data FramebufferObjectAttachment =
+     ColorAttachment !GLuint
+   | DepthAttachment
+   | StencilAttachment
+   | DepthStencilAttachment
+   deriving ( Eq, Ord, Show )
+
+marshalFramebufferObjectAttachment :: FramebufferObjectAttachment -> Maybe GLenum
+marshalFramebufferObjectAttachment x = case x of
+   ColorAttachment c -> let ec = fromIntegral c in if ec >= maxColorAttachments
+      then Nothing
+      else Just $ GL_COLOR_ATTACHMENT0 + ec
+   DepthAttachment -> Just GL_DEPTH_ATTACHMENT
+   StencilAttachment -> Just GL_STENCIL_ATTACHMENT
+   DepthStencilAttachment -> Just GL_DEPTH_STENCIL_ATTACHMENT
+
+unmarshalFramebufferObjectAttachment :: GLenum -> FramebufferObjectAttachment
+unmarshalFramebufferObjectAttachment x = maybe
+   (error $ "unmarshalFramebufferObjectAttachment: unknown enum value " ++ show x) id $
+      unmarshalFramebufferObjectAttachmentSafe x
+--unmarshalFramebufferObjectAttachment x
+--   | x == GL_DEPTH_ATTACHMENT = DepthAttachment
+--   | x == GL_STENCIL_ATTACHMENT = StencilAttachment
+--   | x == GL_DEPTH_STENCIL_ATTACHMENT = DepthStencilAttachment
+--   | x >= gl_COLOR_ATTACHMENT0 && x <= gl_COLOR_ATTACHMENT15
+--      = ColorAttachment . fromIntegral $ x - gl_COLOR_ATTACHMENT0
+--   | otherwise = error $ "unmarshalFramebufferObjectAttachment: unknown enum value " ++ show x
+
+unmarshalFramebufferObjectAttachmentSafe :: GLenum -> Maybe FramebufferObjectAttachment
+unmarshalFramebufferObjectAttachmentSafe x
+   | x == GL_DEPTH_ATTACHMENT = Just DepthAttachment
+   | x == GL_STENCIL_ATTACHMENT = Just StencilAttachment
+   | x == GL_DEPTH_STENCIL_ATTACHMENT = Just DepthStencilAttachment
+   | x >= GL_COLOR_ATTACHMENT0 && x <= GL_COLOR_ATTACHMENT0 + maxColorAttachments
+      = Just . ColorAttachment . fromIntegral $ x - GL_COLOR_ATTACHMENT0
+   | otherwise = Nothing
+
+fboaToBufferMode :: FramebufferObjectAttachment -> Maybe BufferMode
+fboaToBufferMode (ColorAttachment i) = Just . FBOColorAttachment $ fromIntegral i
+fboaToBufferMode _                   = Nothing
+
+fboaFromBufferMode :: BufferMode -> Maybe FramebufferObjectAttachment
+fboaFromBufferMode (FBOColorAttachment i) = Just . ColorAttachment $ fromIntegral i
+fboaFromBufferMode _                      = Nothing
+
+-----------------------------------------------------------------------------
+
+class Show a => FramebufferAttachment a where
+   marshalAttachment :: a -> Maybe GLenum
+   unmarshalAttachment :: GLenum -> a
+   unmarshalAttachmentSafe :: GLenum -> Maybe a
+
+instance FramebufferAttachment FramebufferObjectAttachment where
+   marshalAttachment = marshalFramebufferObjectAttachment
+   unmarshalAttachment = unmarshalFramebufferObjectAttachment
+   unmarshalAttachmentSafe = unmarshalFramebufferObjectAttachmentSafe
+
+instance FramebufferAttachment BufferMode where
+   marshalAttachment = marshalBufferMode
+   unmarshalAttachment = unmarshalBufferMode
+   unmarshalAttachmentSafe = unmarshalBufferModeSafe
+
+-----------------------------------------------------------------------------
+
+getFBAParameteriv :: FramebufferAttachment fba => FramebufferTarget -> fba
+    -> (GLint -> a) -> GLenum -> IO a
+getFBAParameteriv fbt fba f p = with 0 $ \buf -> do
+   glGetFramebufferAttachmentParameteriv (marshalFramebufferTarget fbt)
+      mfba p buf
+   peek1 f buf
+      where mfba = fromMaybe (error $ "invalid value" ++ show fba) (marshalAttachment fba)
diff --git a/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/FramebufferObjects.hs b/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/FramebufferObjects.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/FramebufferObjects.hs
@@ -0,0 +1,81 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.FramebufferObjects.FramebufferObjects
+-- Copyright   :  (c) Sven Panne 2011-2019, Lars Corbijn 2011-2016
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-----------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.FramebufferObjects.FramebufferObjects (
+   FramebufferObject, defaultFramebufferObject,
+   FramebufferTarget(..), bindFramebuffer,
+   FramebufferStatus(..), framebufferStatus,
+) where
+
+import Data.StateVar
+import Graphics.Rendering.OpenGL.GL.FramebufferObjects.FramebufferObject
+import Graphics.Rendering.OpenGL.GL.FramebufferObjects.FramebufferTarget
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.GL
+
+-----------------------------------------------------------------------------
+
+defaultFramebufferObject :: FramebufferObject
+defaultFramebufferObject = FramebufferObject 0
+
+-----------------------------------------------------------------------------
+
+bindFramebuffer :: FramebufferTarget -> StateVar FramebufferObject
+bindFramebuffer fbt =
+    makeStateVar (getBoundFramebuffer fbt) (setFramebuffer fbt)
+
+marshalFramebufferTargetBinding :: FramebufferTarget -> PName1I
+marshalFramebufferTargetBinding x = case x of
+   DrawFramebuffer -> GetDrawFramebufferBinding
+   ReadFramebuffer -> GetReadFramebufferBinding
+   Framebuffer -> GetFramebufferBinding
+
+getBoundFramebuffer :: FramebufferTarget -> IO FramebufferObject
+getBoundFramebuffer =
+   getInteger1 (FramebufferObject . fromIntegral) . marshalFramebufferTargetBinding
+
+setFramebuffer :: FramebufferTarget -> FramebufferObject -> IO ()
+setFramebuffer fbt =
+   glBindFramebuffer (marshalFramebufferTarget fbt) . framebufferID
+
+-----------------------------------------------------------------------------
+
+data FramebufferStatus =
+     Complete
+   | Undefined
+   | IncompleteMissingAttachment
+   | IncompleteDrawBuffer
+   | IncompleteReadBuffer
+   | IncompleteMultiSample
+   | Unsupported
+   deriving ( Eq, Ord, Show )
+
+unmarshalFramebufferStatus :: GLenum -> FramebufferStatus
+unmarshalFramebufferStatus x
+   | x == GL_FRAMEBUFFER_COMPLETE = Complete
+   | x == GL_FRAMEBUFFER_UNDEFINED = Undefined
+   | x == GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT
+      = IncompleteMissingAttachment
+   | x == GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER = IncompleteDrawBuffer
+   | x == GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER = IncompleteReadBuffer
+   | x == GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE = IncompleteMultiSample
+   | x == GL_FRAMEBUFFER_UNSUPPORTED = Unsupported
+   | otherwise = error $ "unmarshalFramebufferStatus: unknown value: "
+      ++ show x
+
+-----------------------------------------------------------------------------
+
+framebufferStatus :: FramebufferTarget -> GettableStateVar FramebufferStatus
+framebufferStatus t = makeGettableStateVar $ fmap unmarshalFramebufferStatus
+   . glCheckFramebufferStatus . marshalFramebufferTarget $ t
+
+-----------------------------------------------------------------------------
diff --git a/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/FramebufferTarget.hs b/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/FramebufferTarget.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/FramebufferTarget.hs
@@ -0,0 +1,34 @@
+{-# OPTIONS_HADDOCK hide #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.FramebufferObjects.FramebufferTarget
+-- Copyright   :  (c) Sven Panne 2013-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This is a purely internal module for marshaling FramebufferTargets.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.FramebufferObjects.FramebufferTarget (
+   FramebufferTarget(..), marshalFramebufferTarget
+) where
+
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+data FramebufferTarget =
+     DrawFramebuffer
+   | ReadFramebuffer
+   | Framebuffer
+   deriving ( Eq, Ord, Show )
+
+marshalFramebufferTarget :: FramebufferTarget -> GLenum
+marshalFramebufferTarget xs = case xs of
+   DrawFramebuffer -> GL_DRAW_FRAMEBUFFER
+   ReadFramebuffer -> GL_READ_FRAMEBUFFER
+   Framebuffer -> GL_FRAMEBUFFER
diff --git a/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/Queries.hs b/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/Queries.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/Queries.hs
@@ -0,0 +1,232 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.FramebufferObjects.Queries
+-- Copyright   :  (c) Sven Panne 2011-2019, Lars Corbijn 2011-2016
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-----------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.FramebufferObjects.Queries (
+   AttachmentObjectType(..), attachmentObjectType, attachmentObject,
+   attachmentTextureLayer, attachmentTextureLevel,
+   attachmentTextureTextureTargetCubeMapFace,
+
+   attachmentRedSize, attachmentBlueSize, attachmentGreenSize,
+   attachmentAlphaSize, attachmentDepthSize, attachmentStencilSize,
+
+   renderbufferWidth, renderbufferHeight,
+   renderbufferInternalFormat, renderbufferSamples,
+
+   renderbufferRedSize, renderbufferBlueSize, renderbufferGreenSize,
+   renderbufferAlphaSize, renderbufferDepthSize, renderbufferStencilSize,
+) where
+
+import Data.StateVar
+import Graphics.Rendering.OpenGL.GL.FramebufferObjects.FramebufferObjectAttachment
+import Graphics.Rendering.OpenGL.GL.FramebufferObjects.FramebufferTarget
+import Graphics.Rendering.OpenGL.GL.FramebufferObjects.RenderbufferObject
+import Graphics.Rendering.OpenGL.GL.FramebufferObjects.RenderbufferTarget
+import Graphics.Rendering.OpenGL.GL.Texturing.PixelInternalFormat
+import Graphics.Rendering.OpenGL.GL.Texturing.Specification(Level)
+import Graphics.Rendering.OpenGL.GL.Texturing.TextureObject
+import Graphics.Rendering.OpenGL.GL.Texturing.TextureTarget
+import Graphics.GL
+
+-----------------------------------------------------------------------------
+
+data GetFramebufferAttachmentPName =
+     AttachmentObjectType
+   | AttachmentObjectName
+   | AttachmentTextureLevel
+   | AttachmentTextureCubeMapFace
+   | AttachmentTextureLayer
+   | AttachmentComponentType
+   | AttachmentColorEncoding
+   | AttachmentRedSize
+   | AttachmentBlueSize
+   | AttachmentGreenSize
+   | AttachmentAlphaSize
+   | AttachmentDepthSize
+   | AttachmentStencilSize
+
+marshalGetFBAPName :: GetFramebufferAttachmentPName -> GLenum
+marshalGetFBAPName x = case x of
+   AttachmentObjectType -> GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
+   AttachmentObjectName -> GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME
+   AttachmentTextureLevel -> GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL
+   AttachmentTextureCubeMapFace -> GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE
+   AttachmentTextureLayer -> GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER
+   AttachmentComponentType -> GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE -- TODO impement usefull function
+   AttachmentColorEncoding -> GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING -- TODO impement usefull function
+   AttachmentRedSize -> GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE
+   AttachmentBlueSize -> GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE
+   AttachmentGreenSize -> GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE
+   AttachmentAlphaSize -> GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE
+   AttachmentDepthSize -> GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE
+   AttachmentStencilSize -> GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE
+
+getFBAPName :: FramebufferAttachment fba => FramebufferTarget -> fba
+    -> (GLint -> a) -> GetFramebufferAttachmentPName -> IO a
+getFBAPName fbt fba f p = getFBAParameteriv fbt fba f (marshalGetFBAPName p)
+
+-----------------------------------------------------------------------------
+
+data AttachmentObjectType =
+     DefaultFramebufferAttachment
+   | TextureAttachment
+   | RenderbufferAttachment
+   deriving ( Eq, Ord, Show )
+
+unmarshalAttachmentObjectType :: GLenum -> Maybe AttachmentObjectType
+unmarshalAttachmentObjectType x
+   | x == GL_FRAMEBUFFER_DEFAULT = Just DefaultFramebufferAttachment
+   | x == GL_TEXTURE = Just TextureAttachment
+   | x == GL_RENDERBUFFER = Just RenderbufferAttachment
+   | x == GL_NONE = Nothing
+   | otherwise = error $ "unmarshalAttachmentObject: unknown value " ++ show x
+
+attachmentObjectType :: FramebufferAttachment fba => FramebufferTarget -> fba
+   -> GettableStateVar (Maybe AttachmentObjectType)
+attachmentObjectType fbt fba = makeGettableStateVar $ getFBAPName fbt fba
+   (unmarshalAttachmentObjectType . fromIntegral) AttachmentObjectType
+
+-- | tries to retrieve the object that is bound to the attachment point of the
+-- given framebuffertarget. If the object type of it is None or the default, then
+-- `Nothing` is returned, otherwise the bound `RenderbufferObject` or `TextureObject`
+attachmentObject :: FramebufferAttachment fba => FramebufferTarget -> fba
+   -> GettableStateVar (Maybe (Either RenderbufferObject TextureObject))
+attachmentObject fbt fba = makeGettableStateVar getter
+   where getter = do
+            objT <- get $ attachmentObjectType fbt fba
+            case objT of
+               Nothing                             -> return $ Nothing
+               (Just DefaultFramebufferAttachment) -> return $ Nothing
+               (Just TextureAttachment)            -> getObjectName (Right . TextureObject)
+               (Just RenderbufferAttachment)       -> getObjectName (Left . RenderbufferObject)
+         getObjectName :: Num n => (n -> Either RenderbufferObject TextureObject) -> IO (Maybe (Either RenderbufferObject TextureObject))
+         getObjectName con = getFBAPName fbt fba (Just . con . fromIntegral) AttachmentObjectName
+
+attachmentTextureLayer :: FramebufferAttachment fba => FramebufferTarget -> fba
+   -> GettableStateVar GLint
+attachmentTextureLayer fbt fba = makeGettableStateVar $
+   getFBAPName fbt fba id AttachmentTextureLayer
+
+attachmentTextureLevel :: FramebufferAttachment fba => FramebufferTarget -> fba
+   -> GettableStateVar Level
+attachmentTextureLevel fbt fba = makeGettableStateVar $
+   getFBAPName fbt fba id AttachmentTextureLevel
+
+attachmentTextureTextureTargetCubeMapFace :: FramebufferAttachment fba => FramebufferTarget -> fba
+   -> GettableStateVar TextureTargetCubeMapFace
+attachmentTextureTextureTargetCubeMapFace fbt fba = makeGettableStateVar $
+   getFBAPName fbt fba (unmarshalTextureTargetCubeMapFace . fromIntegral) AttachmentTextureLevel
+
+-----------------------------------------------------------------------------
+
+attachmentRedSize :: FramebufferAttachment fba => FramebufferTarget -> fba
+   -> GettableStateVar GLint
+attachmentRedSize fbt fba = makeGettableStateVar $ getFBAPName fbt fba
+    id AttachmentRedSize
+
+attachmentGreenSize :: FramebufferAttachment fba => FramebufferTarget -> fba
+   -> GettableStateVar GLint
+attachmentGreenSize fbt fba = makeGettableStateVar $ getFBAPName fbt fba
+    id AttachmentGreenSize
+
+attachmentBlueSize :: FramebufferAttachment fba => FramebufferTarget -> fba
+   -> GettableStateVar GLint
+attachmentBlueSize fbt fba = makeGettableStateVar $ getFBAPName fbt fba
+    id AttachmentBlueSize
+
+attachmentAlphaSize :: FramebufferAttachment fba => FramebufferTarget -> fba
+   -> GettableStateVar GLint
+attachmentAlphaSize fbt fba = makeGettableStateVar $ getFBAPName fbt fba
+    id AttachmentAlphaSize
+
+attachmentDepthSize :: FramebufferAttachment fba => FramebufferTarget -> fba
+   -> GettableStateVar GLint
+attachmentDepthSize fbt fba = makeGettableStateVar $ getFBAPName fbt fba
+    id AttachmentDepthSize
+
+attachmentStencilSize :: FramebufferAttachment fba => FramebufferTarget -> fba
+   -> GettableStateVar GLint
+attachmentStencilSize fbt fba = makeGettableStateVar $ getFBAPName fbt fba
+    id AttachmentStencilSize
+
+-----------------------------------------------------------------------------
+
+data GetRenderbufferPName =
+     RenderbufferWidth
+   | RenderbufferHeight
+   | RenderbufferInternalFormat
+   | RenderbufferSamples
+   | RenderbufferRedSize
+   | RenderbufferBlueSize
+   | RenderbufferGreenSize
+   | RenderbufferAlphaSize
+   | RenderbufferDepthSize
+   | RenderbufferStencilSize
+
+marshalGetRBPname :: GetRenderbufferPName -> GLenum
+marshalGetRBPname x = case x of
+    RenderbufferWidth -> GL_RENDERBUFFER_WIDTH
+    RenderbufferHeight -> GL_RENDERBUFFER_HEIGHT
+    RenderbufferInternalFormat -> GL_RENDERBUFFER_INTERNAL_FORMAT
+    RenderbufferSamples -> GL_RENDERBUFFER_SAMPLES
+    RenderbufferRedSize -> GL_RENDERBUFFER_RED_SIZE
+    RenderbufferBlueSize -> GL_RENDERBUFFER_BLUE_SIZE
+    RenderbufferGreenSize -> GL_RENDERBUFFER_GREEN_SIZE
+    RenderbufferAlphaSize -> GL_RENDERBUFFER_ALPHA_SIZE
+    RenderbufferDepthSize -> GL_RENDERBUFFER_DEPTH_SIZE
+    RenderbufferStencilSize -> GL_RENDERBUFFER_STENCIL_SIZE
+
+getRBPName :: RenderbufferTarget -> (GLint -> a) ->
+   GetRenderbufferPName -> IO a
+getRBPName rbt f = getRBParameteriv rbt f . marshalGetRBPname
+
+-----------------------------------------------------------------------------
+
+renderbufferWidth :: RenderbufferTarget -> GettableStateVar GLsizei
+renderbufferWidth rbt = makeGettableStateVar $
+   getRBPName rbt fromIntegral RenderbufferWidth
+
+renderbufferHeight :: RenderbufferTarget -> GettableStateVar GLsizei
+renderbufferHeight rbt = makeGettableStateVar $
+   getRBPName rbt fromIntegral RenderbufferHeight
+
+renderbufferInternalFormat :: RenderbufferTarget
+   -> GettableStateVar PixelInternalFormat
+renderbufferInternalFormat rbt = makeGettableStateVar $
+   getRBPName rbt unmarshalPixelInternalFormat RenderbufferInternalFormat
+
+renderbufferSamples :: RenderbufferTarget -> GettableStateVar Samples
+renderbufferSamples rbt = makeGettableStateVar $
+   getRBPName rbt (Samples . fromIntegral) RenderbufferSamples
+
+renderbufferRedSize :: RenderbufferTarget -> GettableStateVar GLint
+renderbufferRedSize rbt = makeGettableStateVar $
+   getRBPName rbt id RenderbufferRedSize
+
+renderbufferGreenSize :: RenderbufferTarget -> GettableStateVar GLint
+renderbufferGreenSize rbt = makeGettableStateVar $
+   getRBPName rbt id RenderbufferGreenSize
+
+renderbufferBlueSize :: RenderbufferTarget -> GettableStateVar GLint
+renderbufferBlueSize rbt = makeGettableStateVar $
+   getRBPName rbt id RenderbufferBlueSize
+
+renderbufferAlphaSize :: RenderbufferTarget -> GettableStateVar GLint
+renderbufferAlphaSize rbt = makeGettableStateVar $
+   getRBPName rbt id RenderbufferAlphaSize
+
+renderbufferDepthSize :: RenderbufferTarget -> GettableStateVar GLint
+renderbufferDepthSize rbt = makeGettableStateVar $
+   getRBPName rbt id RenderbufferDepthSize
+
+renderbufferStencilSize :: RenderbufferTarget -> GettableStateVar GLint
+renderbufferStencilSize rbt = makeGettableStateVar $
+   getRBPName rbt id RenderbufferStencilSize
diff --git a/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/RenderbufferObject.hs b/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/RenderbufferObject.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/RenderbufferObject.hs
@@ -0,0 +1,49 @@
+{-# OPTIONS_HADDOCK hide #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.FramebufferObjects.RenderbufferObject
+-- Copyright   :  (c) Sven Panne 2019
+-- License     :  BSD3
+-- 
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This is a purely internal module for (un-)marshaling RenderBufferObjects.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.FramebufferObjects.RenderbufferObject (
+   RenderbufferObject(..)
+) where
+
+
+import Control.Monad.IO.Class
+import Data.ObjectName
+import Foreign.Marshal ( allocaArray, peekArray, withArrayLen )
+import Graphics.Rendering.OpenGL.GL.DebugOutput
+import Graphics.Rendering.OpenGL.GL.GLboolean
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.GL
+       
+--------------------------------------------------------------------------------
+
+newtype RenderbufferObject = RenderbufferObject { renderbufferID :: GLuint}
+   deriving ( Eq, Ord, Show )
+
+instance ObjectName RenderbufferObject where
+   isObjectName =
+     liftIO . fmap unmarshalGLboolean . glIsRenderbuffer . renderbufferID
+
+   deleteObjectNames objs =
+      liftIO . withArrayLen (map renderbufferID objs) $
+         glDeleteRenderbuffers . fromIntegral
+
+instance GeneratableObjectName RenderbufferObject where
+   genObjectNames n =
+      liftIO . allocaArray n $ \buf -> do
+         glGenRenderbuffers (fromIntegral n) buf
+         fmap (map RenderbufferObject) $ peekArray n buf
+
+instance CanBeLabeled RenderbufferObject where
+   objectLabel = objectNameLabel GL_RENDERBUFFER . renderbufferID
diff --git a/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/RenderbufferObjects.hs b/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/RenderbufferObjects.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/RenderbufferObjects.hs
@@ -0,0 +1,72 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.FramebufferObjects.RenderbufferObjects
+-- Copyright   :  (c) Sven Panne 2011-2019, Lars Corbijn 2011-2016
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-----------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.FramebufferObjects.RenderbufferObjects (
+   RenderbufferObject,
+   noRenderbufferObject,
+   RenderbufferTarget(..),
+   RenderbufferSize(..), Samples(..),
+
+   bindRenderbuffer,
+
+   renderbufferStorage, renderbufferStorageMultiSample,
+) where
+
+import Data.StateVar
+import Graphics.Rendering.OpenGL.GL.FramebufferObjects.RenderbufferObject
+import Graphics.Rendering.OpenGL.GL.FramebufferObjects.RenderbufferTarget
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.Rendering.OpenGL.GL.Texturing.PixelInternalFormat
+import Graphics.GL
+
+-----------------------------------------------------------------------------
+
+noRenderbufferObject :: RenderbufferObject
+noRenderbufferObject = RenderbufferObject 0
+
+-----------------------------------------------------------------------------
+
+data RenderbufferSize = RenderbufferSize !GLsizei !GLsizei
+   deriving ( Eq, Ord, Show )
+
+-----------------------------------------------------------------------------
+
+bindRenderbuffer :: RenderbufferTarget -> StateVar RenderbufferObject
+bindRenderbuffer rbt =
+    makeStateVar (getBoundRenderbuffer rbt) (setRenderbuffer rbt)
+
+marshalRenderbufferTargetBinding :: RenderbufferTarget -> PName1I
+marshalRenderbufferTargetBinding x = case x of
+    Renderbuffer -> GetRenderbufferBinding
+
+getBoundRenderbuffer :: RenderbufferTarget -> IO RenderbufferObject
+getBoundRenderbuffer =
+   getInteger1 (RenderbufferObject . fromIntegral) . marshalRenderbufferTargetBinding
+
+setRenderbuffer :: RenderbufferTarget -> RenderbufferObject -> IO ()
+setRenderbuffer rbt = glBindRenderbuffer (marshalRenderbufferTarget rbt)
+   . renderbufferID
+
+-----------------------------------------------------------------------------
+
+renderbufferStorageMultiSample :: RenderbufferTarget -> Samples
+   -> PixelInternalFormat -> RenderbufferSize -> IO ()
+renderbufferStorageMultiSample rbt (Samples s) pif (RenderbufferSize w h) =
+   glRenderbufferStorageMultisample (marshalRenderbufferTarget rbt) s
+       (marshalPixelInternalFormat' pif) w h
+
+
+renderbufferStorage :: RenderbufferTarget -> PixelInternalFormat
+   -> RenderbufferSize -> IO ()
+renderbufferStorage rbt pif (RenderbufferSize w h) =
+    glRenderbufferStorage (marshalRenderbufferTarget rbt)
+       (marshalPixelInternalFormat' pif) w h
diff --git a/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/RenderbufferTarget.hs b/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/RenderbufferTarget.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/FramebufferObjects/RenderbufferTarget.hs
@@ -0,0 +1,43 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.FramebufferObjects.RenderbufferTarget
+-- Copyright   :  (c) Sven Panne 2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This is a purely internal module for handling RenderbufferTargets.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.FramebufferObjects.RenderbufferTarget (
+   RenderbufferTarget(..), marshalRenderbufferTarget, getRBParameteriv,
+   Samples(..)
+) where
+
+import Foreign.Marshal
+import Graphics.Rendering.OpenGL.GL.PeekPoke
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+data RenderbufferTarget = Renderbuffer
+   deriving ( Eq, Ord, Show )
+
+marshalRenderbufferTarget :: RenderbufferTarget -> GLenum
+marshalRenderbufferTarget x = case x of
+    Renderbuffer -> GL_RENDERBUFFER
+
+-----------------------------------------------------------------------------
+
+getRBParameteriv :: RenderbufferTarget -> (GLint -> a) -> GLenum -> IO a
+getRBParameteriv rbt f p =
+   with 0 $ \buf -> do
+      glGetRenderbufferParameteriv (marshalRenderbufferTarget rbt) p buf
+      peek1 f buf
+-----------------------------------------------------------------------------
+
+newtype Samples = Samples GLsizei
+   deriving ( Eq, Ord, Show )
diff --git a/src/Graphics/Rendering/OpenGL/GL/GLboolean.hs b/src/Graphics/Rendering/OpenGL/GL/GLboolean.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/GLboolean.hs
@@ -0,0 +1,30 @@
+{-# OPTIONS_HADDOCK hide #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.GLboolean
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+-- 
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This is a purely internal module for (un-)marshaling GLboolean.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.GLboolean (
+   marshalGLboolean, unmarshalGLboolean
+) where
+
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+marshalGLboolean :: Num a => Bool -> a
+marshalGLboolean x = fromIntegral $ case x of
+   False -> GL_FALSE
+   True -> GL_TRUE
+
+unmarshalGLboolean :: (Eq a, Num a) => a -> Bool
+unmarshalGLboolean = (/= fromIntegral GL_FALSE)
diff --git a/src/Graphics/Rendering/OpenGL/GL/Hints.hs b/src/Graphics/Rendering/OpenGL/GL/Hints.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/Hints.hs
@@ -0,0 +1,88 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.Hints
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 5.6 (Hints) of the OpenGL 2.1 specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.Hints (
+   HintTarget(..), HintMode(..), hint
+) where
+
+import Data.StateVar
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+data HintTarget =
+     PerspectiveCorrection
+   | PointSmooth
+   | LineSmooth
+   | PolygonSmooth
+   | Fog
+   | GenerateMipmap
+   | TextureCompression
+   | PackCMYK
+   | UnpackCMYK
+   deriving ( Eq, Ord, Show )
+
+marshalHintTarget :: HintTarget -> GLenum
+marshalHintTarget x = case x of
+   PerspectiveCorrection -> GL_PERSPECTIVE_CORRECTION_HINT
+   PointSmooth -> GL_POINT_SMOOTH_HINT
+   LineSmooth -> GL_LINE_SMOOTH_HINT
+   PolygonSmooth -> GL_POLYGON_SMOOTH_HINT
+   Fog -> GL_FOG_HINT
+   GenerateMipmap -> GL_GENERATE_MIPMAP_HINT
+   TextureCompression -> GL_TEXTURE_COMPRESSION_HINT
+   PackCMYK -> GL_PACK_CMYK_HINT_EXT
+   UnpackCMYK -> GL_UNPACK_CMYK_HINT_EXT
+
+hintTargetToGetPName :: HintTarget -> PName1I
+hintTargetToGetPName x = case x of
+   PerspectiveCorrection -> GetPerspectiveCorrectionHint
+   PointSmooth -> GetPointSmoothHint
+   LineSmooth -> GetLineSmoothHint
+   PolygonSmooth -> GetPolygonSmoothHint
+   Fog -> GetFogHint
+   GenerateMipmap -> GetGenerateMipmapHint
+   TextureCompression -> GetTextureCompressionHint
+   PackCMYK -> GetPackCMYKHint
+   UnpackCMYK -> GetUnpackCMYKHint
+
+--------------------------------------------------------------------------------
+
+data HintMode =
+     DontCare
+   | Fastest
+   | Nicest
+   deriving ( Eq, Ord, Show )
+
+marshalHintMode :: HintMode -> GLenum
+marshalHintMode x = case x of
+   DontCare -> GL_DONT_CARE
+   Fastest -> GL_FASTEST
+   Nicest -> GL_NICEST
+
+unmarshalHintMode :: GLenum -> HintMode
+unmarshalHintMode x
+   | x == GL_DONT_CARE = DontCare
+   | x == GL_FASTEST = Fastest
+   | x == GL_NICEST = Nicest
+   | otherwise = error ("unmarshalHintMode: illegal value " ++ show x)
+
+--------------------------------------------------------------------------------
+
+hint ::  HintTarget -> StateVar HintMode
+hint t =
+   makeStateVar
+      (getEnum1 unmarshalHintMode (hintTargetToGetPName t))
+      (glHint (marshalHintTarget t) . marshalHintMode)
diff --git a/src/Graphics/Rendering/OpenGL/GL/IOState.hs b/src/Graphics/Rendering/OpenGL/GL/IOState.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/IOState.hs
@@ -0,0 +1,68 @@
+{-# LANGUAGE CPP #-}
+{-# OPTIONS_HADDOCK hide #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.IOState
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+-- 
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This is a purely internal module for an IO monad with a pointer as an
+-- additional state, basically a /StateT (Ptr s) IO a/.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.IOState (
+   IOState(..), getIOState, peekIOState, evalIOState, nTimes
+) where
+
+#if !MIN_VERSION_base(4,8,0)
+import Control.Applicative ( Applicative(..) )
+#endif
+import Control.Monad ( ap, liftM, replicateM )
+import Foreign.Ptr ( Ptr, plusPtr )
+import Foreign.Storable ( Storable(sizeOf,peek) )
+
+--------------------------------------------------------------------------------
+
+newtype IOState s a = IOState { runIOState :: Ptr s -> IO (a, Ptr s) }
+
+instance Applicative (IOState s) where
+   pure  = return
+   (<*>) = ap
+
+instance Functor (IOState s) where
+   fmap = liftM
+
+instance Monad (IOState s) where
+   return a = IOState $ \s -> return (a, s)
+   m >>= k  = IOState $ \s -> do (a, s') <- runIOState m s ; runIOState (k a) s'
+#if MIN_VERSION_base(4,13,0)
+instance MonadFail (IOState s) where
+#endif
+   fail str = IOState $ \_ -> fail str
+
+getIOState :: IOState s (Ptr s)
+getIOState = IOState $ \s -> return (s, s)
+
+putIOState :: Ptr s -> IOState s ()
+putIOState s = IOState $ \_ -> return ((), s)
+
+peekIOState :: Storable a => IOState a a
+peekIOState = do
+   ptr <- getIOState
+   x <- liftIOState $ peek ptr
+   putIOState (ptr `plusPtr` sizeOf x)
+   return x
+
+liftIOState :: IO a -> IOState s a
+liftIOState m = IOState $ \s -> do a <- m ; return (a, s)
+
+evalIOState :: IOState s a -> Ptr s -> IO a
+evalIOState m s = do (a, _) <- runIOState m s ; return a
+
+nTimes :: Integral a => a -> IOState b c -> IOState b [c]
+nTimes n = replicateM (fromIntegral n)
diff --git a/src/Graphics/Rendering/OpenGL/GL/LineSegments.hs b/src/Graphics/Rendering/OpenGL/GL/LineSegments.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/LineSegments.hs
@@ -0,0 +1,150 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.LineSegments
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+-- 
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 3.4 (Line Segments) of the OpenGL 2.1
+-- specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.LineSegments (
+   -- * Line Rasterization
+   lineWidth,
+
+   -- * Line Stipple
+   lineStipple,
+
+   -- * Line Antialiasing
+  lineSmooth,
+
+   -- * Implementation-Dependent Limits
+   aliasedLineWidthRange, smoothLineWidthRange, smoothLineWidthGranularity
+) where
+
+import Control.Monad
+import Data.StateVar
+import Graphics.Rendering.OpenGL.GL.Capability
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+-- | 'lineWidth' contains the rasterized width of both aliased and antialiased
+-- lines. The initial value is 1. Using a line width other than 1 has different
+-- effects, depending on whether line antialiasing is enabled (see
+-- 'lineSmooth'). Line antialiasing is initially disabled.
+--
+-- If line antialiasing is disabled, the actual width is determined by rounding
+-- the supplied width to the nearest integer. (If the rounding results in the
+-- value 0, it is as if the line width were 1.) If /delta x/ >= /delta y/, /i/
+-- pixels are filled in each column that is rasterized, where /i/ is the
+-- rounded value of 'lineWidth'. Otherwise, /i/ pixels are filled in each row
+-- that is rasterized.
+--
+-- If antialiasing is enabled, line rasterization produces a fragment for each
+-- pixel square that intersects the region lying within the rectangle having
+-- width equal to the current line width, length equal to the actual length of
+-- the line, and centered on the mathematical line segment. The coverage value
+-- for each fragment is the window coordinate area of the intersection of the
+-- rectangular region with the corresponding pixel square. This value is saved
+-- and used in the final rasterization step.
+--
+-- Not all widths can be supported when line antialiasing is enabled. If an
+-- unsupported width is requested, the nearest supported width is used. Only
+-- width 1 is guaranteed to be supported; others depend on the implementation.
+--  Likewise, there is a range for aliased line widths as well. To query the
+-- range of supported widths of antialiased lines and the size difference
+-- between supported widths within the range, query 'smoothLineWidthRange' and
+-- 'smoothLineWidthGranularity', respectively. For aliased lines, query the
+-- supported range with 'aliasedLineWidthRange'.
+--
+-- The line width specified when 'lineWidth' is set is always returned when it
+-- is queried. Clamping and rounding for aliased and antialiased lines have no
+-- effect on the specified value.
+--
+-- A non-antialiased line width may be clamped to an implementation-dependent
+-- maximum.  Query 'aliasedLineWidthRange' to determine the maximum width.
+--
+-- An 'Graphics.Rendering.OpenGL.GLU.Errors.InvalidValue' is generated if
+-- 'lineWidth' is set to a value less than or equal to zero.
+--
+-- An 'Graphics.Rendering.OpenGL.GLU.Errors.InvalidOperation' is generated if
+-- 'lineWidth' is set during
+-- 'Graphics.Rendering.OpenGL.GL.BeginEnd.renderPrimitive'.
+
+lineWidth :: StateVar GLfloat
+lineWidth = makeStateVar (getFloat1 id GetLineWidth) glLineWidth
+
+--------------------------------------------------------------------------------
+
+-- | Line stippling masks out certain fragments produced by rasterization; those
+-- fragments will not be drawn. The masking is achieved by using three
+-- parameters: the repeat count (1st element of the 'lineStipple' pair, clamped
+-- to the range [ 1 .. 256 ]), the 16-bit line stipple pattern (2nd element),
+-- and an integer stipple counter /s/.
+--
+-- The counter /s/ is reset to 0 at before the first action during
+-- 'Graphics.Rendering.OpenGL.GL.BeginEnd.renderPrimitive' is called and before
+-- each line segment during
+-- 'Graphics.Rendering.OpenGL.GL.BeginEnd.renderPrimitive' is generated. It is
+-- incremented after each fragment of a unit width aliased line segment is
+-- generated or after each /i/ fragments of an /i/ width line segment are
+-- generated. The /i/ fragments associated with count /s/ are masked out if
+-- @'Data.Bits.testBit' /pattern/ (( /s/ \/ /factor/ ) /mod/ 16)@ is 'False',
+-- otherwise these fragments are sent to the frame buffer. Bit zero of the
+-- pattern is the least significant bit, i.e. it is used first.
+--
+-- Antialiased lines are treated as a sequence of rectangles of height 1 for
+-- purposes of stippling. Whether rectangle /s/ is rasterized or not depends on
+-- the fragment rule described for aliased lines, counting rectangles rather
+-- than groups of fragments.
+--
+-- The initial value of 'lineStipple' is 'Nothing', i.e. line stippling is
+-- disabled.
+--
+-- An 'Graphics.Rendering.OpenGL.GLU.Errors.InvalidOperation' is generated if
+-- 'lineStipple' is set during
+-- 'Graphics.Rendering.OpenGL.GL.BeginEnd.renderPrimitive'.
+
+lineStipple :: StateVar (Maybe (GLint, GLushort))
+lineStipple =
+   makeStateVarMaybe
+      (return CapLineStipple)
+      (liftM2 (,) (getInteger1 id GetLineStippleRepeat)
+                  (getInteger1 fromIntegral GetLineStipplePattern))
+      (uncurry glLineStipple)
+
+--------------------------------------------------------------------------------
+
+-- | Controls whether line antialiasing is enabled. The initial state is
+-- 'Graphics.Rendering.OpenGL.GL.Capability.Disabled'.
+
+lineSmooth :: StateVar Capability
+lineSmooth = makeCapability CapLineSmooth
+
+--------------------------------------------------------------------------------
+
+-- | The smallest and largest supported width of aliased lines.
+
+aliasedLineWidthRange :: GettableStateVar (GLfloat, GLfloat)
+aliasedLineWidthRange =
+   makeGettableStateVar $ getFloat2 (,) GetAliasedLineWidthRange
+
+-- | The smallest and largest supported width of antialiased lines.
+
+smoothLineWidthRange :: GettableStateVar (GLfloat, GLfloat)
+smoothLineWidthRange =
+   makeGettableStateVar $ getFloat2 (,) GetSmoothLineWidthRange
+
+-- | The antialiased line width granularity, i.e. the size difference between
+-- supported widths.
+
+smoothLineWidthGranularity :: GettableStateVar GLfloat
+smoothLineWidthGranularity =
+   makeGettableStateVar $ getFloat1 id GetSmoothLineWidthGranularity
diff --git a/src/Graphics/Rendering/OpenGL/GL/MatrixComponent.hs b/src/Graphics/Rendering/OpenGL/GL/MatrixComponent.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/MatrixComponent.hs
@@ -0,0 +1,61 @@
+{-# LANGUAGE TypeSynonymInstances #-}
+{-# OPTIONS_HADDOCK hide #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.CoordTrans
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This is a purely internal module for handling matrix components.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.MatrixComponent where
+
+import Foreign.Ptr
+import Foreign.Storable
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.Rendering.OpenGL.GL.Tensor
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+class Storable c => MatrixComponent c where
+   getMatrix :: GetPNameMatrix p => p -> Ptr c -> IO ()
+   loadMatrix :: Ptr c -> IO ()
+   loadTransposeMatrix :: Ptr c -> IO ()
+   multMatrix_ :: Ptr c -> IO ()
+   multTransposeMatrix :: Ptr c -> IO ()
+   getUniformv :: GLuint -> GLint -> Ptr c -> IO ()
+   uniformMatrix4v :: GLint -> GLsizei -> GLboolean -> Ptr c -> IO ()
+   rotate :: c -> Vector3 c -> IO ()
+   translate :: Vector3 c -> IO ()
+   scale :: c -> c -> c -> IO ()
+
+instance MatrixComponent GLfloat where
+   getMatrix = getMatrixf
+   loadMatrix = glLoadMatrixf
+   loadTransposeMatrix = glLoadTransposeMatrixf
+   multMatrix_ = glMultMatrixf
+   multTransposeMatrix = glMultTransposeMatrixf
+   getUniformv = glGetUniformfv
+   uniformMatrix4v = glUniformMatrix4fv
+   rotate a (Vector3 x y z) = glRotatef a x y z
+   translate (Vector3 x y z) = glTranslatef x y z
+   scale = glScalef
+
+instance MatrixComponent GLdouble where
+   getMatrix = getMatrixd
+   loadMatrix = glLoadMatrixd
+   loadTransposeMatrix = glLoadTransposeMatrixd
+   multMatrix_ = glMultMatrixd
+   multTransposeMatrix = glMultTransposeMatrixd
+   getUniformv = glGetUniformdv
+   uniformMatrix4v = glUniformMatrix4dv
+   rotate a (Vector3 x y z) = glRotated a x y z
+   translate (Vector3 x y z) = glTranslated x y z
+   scale = glScaled
diff --git a/src/Graphics/Rendering/OpenGL/GL/PeekPoke.hs b/src/Graphics/Rendering/OpenGL/GL/PeekPoke.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/PeekPoke.hs
@@ -0,0 +1,107 @@
+{-# OPTIONS_HADDOCK hide #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.PeekPoke
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+-- 
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This is a purely internal module with peek- and poke-related utilities.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.PeekPoke (
+   poke1, poke2, poke3, poke4,
+   peek1, peek2, peek3, peek4,
+   peek1M, peek2M, peek3M, peek4M
+) where
+
+import Foreign.Ptr
+import Foreign.Storable
+
+--------------------------------------------------------------------------------
+-- The implementation is little bit verbose/redundant, but seems to generate
+-- better code than mapM/zipWithM_.
+
+--------------------------------------------------------------------------------
+
+{-# INLINE poke1 #-}
+poke1 :: Storable a => Ptr a -> a -> IO ()
+poke1 ptr x =
+   pokeElemOff ptr 0 x
+
+{-# INLINE poke2 #-}
+poke2 :: Storable a => Ptr a -> a -> a -> IO ()
+poke2 ptr x y = do
+   pokeElemOff ptr 0 x
+   pokeElemOff ptr 1 y
+
+{-# INLINE poke3 #-}
+poke3 :: Storable a => Ptr a -> a -> a -> a -> IO ()
+poke3 ptr x y z = do
+   pokeElemOff ptr 0 x
+   pokeElemOff ptr 1 y
+   pokeElemOff ptr 2 z
+
+{-# INLINE poke4 #-}
+poke4 :: Storable a => Ptr a -> a -> a -> a -> a -> IO ()
+poke4 ptr x y z w = do
+   pokeElemOff ptr 0 x
+   pokeElemOff ptr 1 y
+   pokeElemOff ptr 2 z
+   pokeElemOff ptr 3 w
+
+--------------------------------------------------------------------------------
+
+{-# INLINE peek1 #-}
+peek1 :: Storable a => (a -> b) -> Ptr a -> IO b
+peek1 f ptr = do
+   x <- peekElemOff ptr 0
+   return $ f x
+
+{-# INLINE peek2 #-}
+peek2 :: Storable a => (a -> a -> b) -> Ptr a -> IO b
+peek2 f = peek2M $ \x y -> return (f x y)
+
+{-# INLINE peek3 #-}
+peek3 :: Storable a => (a -> a -> a -> b) -> Ptr a -> IO b
+peek3 f = peek3M $ \x y z -> return (f x y z)
+
+{-# INLINE peek4 #-}
+peek4 :: Storable a => (a -> a -> a -> a -> b) -> Ptr a -> IO b
+peek4 f = peek4M $ \x y z w -> return (f x y z w)
+
+--------------------------------------------------------------------------------
+
+{-# INLINE peek1M #-}
+peek1M :: Storable a => (a -> IO b) -> Ptr a -> IO b
+peek1M f ptr = do
+   x <- peekElemOff ptr 0
+   f x
+
+{-# INLINE peek2M #-}
+peek2M :: Storable a => (a -> a -> IO b) -> Ptr a -> IO b
+peek2M f ptr = do
+   x <- peekElemOff ptr 0
+   y <- peekElemOff ptr 1
+   f x y
+
+{-# INLINE peek3M #-}
+peek3M :: Storable a => (a -> a -> a -> IO b) -> Ptr a -> IO b
+peek3M f ptr = do
+   x <- peekElemOff ptr 0
+   y <- peekElemOff ptr 1
+   z <- peekElemOff ptr 2
+   f x y z
+
+{-# INLINE peek4M #-}
+peek4M :: Storable a => (a -> a -> a -> a -> IO b) -> Ptr a -> IO b
+peek4M f ptr = do
+   x <- peekElemOff ptr 0
+   y <- peekElemOff ptr 1
+   z <- peekElemOff ptr 2
+   w <- peekElemOff ptr 3
+   f x y z w
diff --git a/src/Graphics/Rendering/OpenGL/GL/PerFragment.hs b/src/Graphics/Rendering/OpenGL/GL/PerFragment.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/PerFragment.hs
@@ -0,0 +1,400 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.PerFragment
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 4.1 (Per-Fragment Operations) of the
+-- OpenGL 2.1 specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.PerFragment (
+   -- * Discarding Primitives Before Rasterization
+   rasterizerDiscard, discardingRasterizer,
+
+   -- * Scissor Test
+   scissor,
+
+   -- * Multisample Fragment Operations
+   sampleAlphaToCoverage,  sampleAlphaToOne, sampleCoverage,
+
+   -- * Depth Bounds Test
+   depthBounds,
+
+   -- * Alpha Test
+   ComparisonFunction(..), alphaFunc,
+
+   -- * Stencil Test
+   stencilTest, stencilFunc, stencilFuncSeparate, StencilOp(..), stencilOp,
+   stencilOpSeparate, activeStencilFace,
+
+   -- * Depth Buffer Test
+   depthFunc,
+
+   -- * Blending
+   blend, blendBuffer, BlendEquation(..), blendEquation, blendEquationSeparate,
+   BlendingFactor(..), blendFuncSeparate, blendFunc, blendColor,
+
+   -- * Dithering
+   dither,
+
+   -- * Logical Operation
+   LogicOp(..), logicOp
+) where
+
+import Control.Monad
+import Data.StateVar
+import Graphics.Rendering.OpenGL.GL.BlendingFactor
+import Graphics.Rendering.OpenGL.GL.Capability
+import Graphics.Rendering.OpenGL.GL.ComparisonFunction
+import Graphics.Rendering.OpenGL.GL.CoordTrans
+import Graphics.Rendering.OpenGL.GL.Exception
+import Graphics.Rendering.OpenGL.GL.Face
+import Graphics.Rendering.OpenGL.GL.Framebuffer
+import Graphics.Rendering.OpenGL.GL.GLboolean
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.Rendering.OpenGL.GL.VertexSpec
+import Graphics.Rendering.OpenGL.GLU.ErrorsInternal
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+rasterizerDiscard :: StateVar Capability
+rasterizerDiscard = makeCapability CapRasterizerDiscard
+
+discardingRasterizer :: IO a -> IO a
+discardingRasterizer act = do
+   r <- get rasterizerDiscard
+   bracket_ (rasterizerDiscard $= Enabled) (rasterizerDiscard $= r) act
+
+--------------------------------------------------------------------------------
+
+scissor :: StateVar (Maybe (Position, Size))
+scissor =
+   makeStateVarMaybe
+      (return CapScissorTest)
+      (getInteger4 makeSB GetScissorBox)
+      (\(Position x y, Size w h) -> glScissor x y w h)
+   where makeSB x y w h = (Position x y, Size (fromIntegral w) (fromIntegral h))
+
+--------------------------------------------------------------------------------
+
+sampleAlphaToCoverage :: StateVar Capability
+sampleAlphaToCoverage = makeCapability CapSampleAlphaToCoverage
+
+sampleAlphaToOne :: StateVar Capability
+sampleAlphaToOne = makeCapability CapSampleAlphaToOne
+
+sampleCoverage :: StateVar (Maybe (GLclampf, Bool))
+sampleCoverage =
+   makeStateVarMaybe
+      (return CapSampleCoverage)
+      (liftM2 (,) (getClampf1 id GetSampleCoverageValue)
+                  (getBoolean1 unmarshalGLboolean GetSampleCoverageInvert))
+      (\(value, invert) -> glSampleCoverage value (marshalGLboolean invert))
+
+--------------------------------------------------------------------------------
+
+depthBounds :: StateVar (Maybe (GLclampd, GLclampd))
+depthBounds =
+   makeStateVarMaybe
+      (return CapDepthBoundsTest)
+      (getClampd2 (,) GetDepthBounds)
+      (uncurry glDepthBoundsEXT)
+
+--------------------------------------------------------------------------------
+
+alphaFunc :: StateVar (Maybe (ComparisonFunction, GLclampf))
+alphaFunc =
+   makeStateVarMaybe
+      (return CapAlphaTest)
+      (liftM2 (,) (getEnum1 unmarshalComparisonFunction GetAlphaTestFunc)
+                  (getClampf1 id GetAlphaTestRef))
+      (uncurry (glAlphaFunc . marshalComparisonFunction))
+
+--------------------------------------------------------------------------------
+
+stencilTest :: StateVar Capability
+stencilTest = makeCapability CapStencilTest
+
+--------------------------------------------------------------------------------
+
+stencilFunc :: StateVar (ComparisonFunction, GLint, GLuint)
+stencilFunc =
+   makeStateVar
+      (get (stencilFuncSeparate Front))
+      (\(func, ref, mask) ->
+         glStencilFunc (marshalComparisonFunction func) ref mask)
+
+stencilFuncSeparate :: Face -> StateVar (ComparisonFunction, GLint, GLuint)
+stencilFuncSeparate face =
+   makeStateVar
+      (case face of
+          Front -> getStencilFunc GetStencilFunc
+                                  GetStencilRef
+                                  GetStencilValueMask
+          Back -> getStencilFunc GetStencilBackFunc
+                                 GetStencilBackRef
+                                 GetStencilBackValueMask
+          FrontAndBack -> do recordInvalidEnum; return (Never, 0, 0))
+      (\(func, ref, mask) ->
+         glStencilFuncSeparate (marshalFace face)
+                               (marshalComparisonFunction func) ref mask)
+   where getStencilFunc func ref mask =
+            liftM3 (,,) (getEnum1 unmarshalComparisonFunction func)
+                        (getInteger1 id ref)
+                        (getInteger1 fromIntegral mask)
+
+--------------------------------------------------------------------------------
+
+data StencilOp =
+     OpZero
+   | OpKeep
+   | OpReplace
+   | OpIncr
+   | OpIncrWrap
+   | OpDecr
+   | OpDecrWrap
+   | OpInvert
+   deriving ( Eq, Ord, Show )
+
+marshalStencilOp :: StencilOp -> GLenum
+marshalStencilOp x = case x of
+   OpZero -> GL_ZERO
+   OpKeep -> GL_KEEP
+   OpReplace -> GL_REPLACE
+   OpIncr -> GL_INCR
+   OpIncrWrap -> GL_INCR_WRAP
+   OpDecr -> GL_DECR
+   OpDecrWrap -> GL_DECR_WRAP
+   OpInvert -> GL_INVERT
+
+unmarshalStencilOp :: GLenum -> StencilOp
+unmarshalStencilOp x
+   | x == GL_ZERO = OpZero
+   | x == GL_KEEP = OpKeep
+   | x == GL_REPLACE = OpReplace
+   | x == GL_INCR = OpIncr
+   | x == GL_INCR_WRAP = OpIncrWrap
+   | x == GL_DECR = OpDecr
+   | x == GL_DECR_WRAP = OpDecrWrap
+   | x == GL_INVERT = OpInvert
+   | otherwise = error ("unmarshalStencilOp: illegal value " ++ show x)
+
+--------------------------------------------------------------------------------
+
+stencilOp :: StateVar (StencilOp, StencilOp, StencilOp)
+stencilOp =
+   makeStateVar
+      (get (stencilOpSeparate Front))
+      (\(sf, spdf, spdp) -> glStencilOp (marshalStencilOp sf)
+                                        (marshalStencilOp spdf)
+                                        (marshalStencilOp spdp))
+
+stencilOpSeparate :: Face -> StateVar (StencilOp, StencilOp, StencilOp)
+stencilOpSeparate face =
+   makeStateVar
+      (case face of
+          Front -> getStencilOp GetStencilFail
+                                GetStencilPassDepthFail
+                                GetStencilPassDepthPass
+          Back ->  getStencilOp GetStencilBackFail
+                                GetStencilBackPassDepthFail
+                                GetStencilBackPassDepthPass
+          FrontAndBack -> do recordInvalidEnum
+                             return (OpZero, OpZero, OpZero))
+      (\(sf, spdf, spdp) -> glStencilOpSeparate (marshalFace face)
+                                                (marshalStencilOp sf)
+                                                (marshalStencilOp spdf)
+                                                (marshalStencilOp spdp))
+   where getStencilOp sf spdf spdp =
+            (liftM3 (,,) (getEnum1 unmarshalStencilOp sf)
+                         (getEnum1 unmarshalStencilOp spdf)
+                         (getEnum1 unmarshalStencilOp spdp))
+
+
+--------------------------------------------------------------------------------
+
+activeStencilFace :: StateVar (Maybe Face)
+activeStencilFace =
+   makeStateVarMaybe
+      (return CapStencilTestTwoSide)
+      (getEnum1 unmarshalFace GetActiveStencilFace)
+      (glActiveStencilFaceEXT . marshalFace)
+
+--------------------------------------------------------------------------------
+
+depthFunc :: StateVar (Maybe ComparisonFunction)
+depthFunc =
+   makeStateVarMaybe
+      (return CapDepthTest)
+      (getEnum1 unmarshalComparisonFunction GetDepthFunc)
+      (glDepthFunc . marshalComparisonFunction)
+
+--------------------------------------------------------------------------------
+
+blend :: StateVar Capability
+blend = makeCapability CapBlend
+
+-- | enable or disable blending based on the buffer bound to the /i/'th drawBuffer
+-- that is the buffer fmap (!! i) (get drawBuffers)
+blendBuffer :: DrawBufferIndex -> StateVar Capability
+blendBuffer = makeIndexedCapability ((fromIntegral GL_DRAW_BUFFER0) +) BlendI
+
+--------------------------------------------------------------------------------
+
+data BlendEquation =
+     FuncAdd
+   | FuncSubtract
+   | FuncReverseSubtract
+   | Min
+   | Max
+   | LogicOp
+   deriving ( Eq, Ord, Show )
+
+marshalBlendEquation :: BlendEquation -> GLenum
+marshalBlendEquation x = case x of
+   FuncAdd -> GL_FUNC_ADD
+   FuncSubtract -> GL_FUNC_SUBTRACT
+   FuncReverseSubtract -> GL_FUNC_REVERSE_SUBTRACT
+   Min -> GL_MIN
+   Max -> GL_MAX
+   LogicOp -> GL_INDEX_LOGIC_OP
+
+unmarshalBlendEquation :: GLenum -> BlendEquation
+unmarshalBlendEquation x
+   | x == GL_FUNC_ADD = FuncAdd
+   | x == GL_FUNC_SUBTRACT = FuncSubtract
+   | x == GL_FUNC_REVERSE_SUBTRACT = FuncReverseSubtract
+   | x == GL_MIN = Min
+   | x == GL_MAX = Max
+   | x == GL_INDEX_LOGIC_OP = LogicOp
+   | otherwise = error ("unmarshalBlendEquation: illegal value " ++ show x)
+
+--------------------------------------------------------------------------------
+
+blendEquation :: StateVar BlendEquation
+blendEquation =
+   makeStateVar
+      (getEnum1 unmarshalBlendEquation GetBlendEquation)
+      (glBlendEquation . marshalBlendEquation)
+
+blendEquationSeparate :: StateVar (BlendEquation,BlendEquation)
+blendEquationSeparate =
+   makeStateVar
+      (liftM2 (,) (getEnum1 unmarshalBlendEquation GetBlendEquation)
+                  (getEnum1 unmarshalBlendEquation GetBlendEquationAlpha))
+      (\(funcRGB, funcAlpha) ->
+          glBlendEquationSeparate (marshalBlendEquation funcRGB)
+                                  (marshalBlendEquation funcAlpha))
+
+--------------------------------------------------------------------------------
+
+blendFuncSeparate ::
+   StateVar ((BlendingFactor, BlendingFactor), (BlendingFactor, BlendingFactor))
+blendFuncSeparate =
+   makeStateVar
+      (do srcRGB   <- getEnum1 unmarshalBlendingFactor GetBlendSrcRGB
+          srcAlpha <- getEnum1 unmarshalBlendingFactor GetBlendSrcAlpha
+          dstRGB   <- getEnum1 unmarshalBlendingFactor GetBlendDstRGB
+          dstAlpha <- getEnum1 unmarshalBlendingFactor GetBlendDstAlpha
+          return ((srcRGB, srcAlpha), (dstRGB, dstAlpha)))
+      (\((srcRGB, srcAlpha), (dstRGB, dstAlpha)) ->
+         glBlendFuncSeparate (marshalBlendingFactor srcRGB)
+                             (marshalBlendingFactor srcAlpha)
+                             (marshalBlendingFactor dstRGB)
+                             (marshalBlendingFactor dstAlpha))
+
+blendFunc :: StateVar (BlendingFactor, BlendingFactor)
+blendFunc =
+   makeStateVar
+      (liftM2 (,) (getEnum1 unmarshalBlendingFactor GetBlendSrc)
+                  (getEnum1 unmarshalBlendingFactor GetBlendDst))
+      (\(s, d) ->
+         glBlendFunc (marshalBlendingFactor s) (marshalBlendingFactor d))
+
+blendColor :: StateVar (Color4 GLclampf)
+blendColor =
+   makeStateVar
+      (getClampf4 Color4 GetBlendColor)
+      (\(Color4 r g b a) -> glBlendColor r g b a)
+
+--------------------------------------------------------------------------------
+
+dither :: StateVar Capability
+dither = makeCapability CapDither
+
+--------------------------------------------------------------------------------
+
+data LogicOp =
+     Clear
+   | And
+   | AndReverse
+   | Copy
+   | AndInverted
+   | Noop
+   | Xor
+   | Or
+   | Nor
+   | Equiv
+   | Invert
+   | OrReverse
+   | CopyInverted
+   | OrInverted
+   | Nand
+   | Set
+   deriving ( Eq, Ord, Show )
+
+marshalLogicOp :: LogicOp -> GLenum
+marshalLogicOp x = case x of
+   Clear -> GL_CLEAR
+   And -> GL_AND
+   AndReverse -> GL_AND_REVERSE
+   Copy -> GL_COPY
+   AndInverted -> GL_AND_INVERTED
+   Noop -> GL_NOOP
+   Xor -> GL_XOR
+   Or -> GL_OR
+   Nor -> GL_NOR
+   Equiv -> GL_EQUIV
+   Invert -> GL_INVERT
+   OrReverse -> GL_OR_REVERSE
+   CopyInverted -> GL_COPY_INVERTED
+   OrInverted -> GL_OR_INVERTED
+   Nand -> GL_NAND
+   Set -> GL_SET
+
+unmarshalLogicOp :: GLenum -> LogicOp
+unmarshalLogicOp x
+   | x == GL_CLEAR = Clear
+   | x == GL_AND = And
+   | x == GL_AND_REVERSE = AndReverse
+   | x == GL_COPY = Copy
+   | x == GL_AND_INVERTED = AndInverted
+   | x == GL_NOOP = Noop
+   | x == GL_XOR = Xor
+   | x == GL_OR = Or
+   | x == GL_NOR = Nor
+   | x == GL_EQUIV = Equiv
+   | x == GL_INVERT = Invert
+   | x == GL_OR_REVERSE = OrReverse
+   | x == GL_COPY_INVERTED = CopyInverted
+   | x == GL_OR_INVERTED = OrInverted
+   | x == GL_NAND = Nand
+   | x == GL_SET = Set
+   | otherwise = error ("unmarshalLogicOp: illegal value " ++ show x)
+
+--------------------------------------------------------------------------------
+
+logicOp :: StateVar (Maybe LogicOp)
+logicOp =
+   makeStateVarMaybe
+      (do rgba <- get rgbaMode
+          return $ if rgba then CapColorLogicOp else CapIndexLogicOp)
+      (getEnum1 unmarshalLogicOp GetLogicOpMode)
+      (glLogicOp . marshalLogicOp)
diff --git a/src/Graphics/Rendering/OpenGL/GL/PixelData.hs b/src/Graphics/Rendering/OpenGL/GL/PixelData.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/PixelData.hs
@@ -0,0 +1,32 @@
+{-# OPTIONS_HADDOCK hide #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.PixelData
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+-- 
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This is a purely internal helper module.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.PixelData (
+   PixelData(..), withPixelData
+) where
+
+import Foreign.Ptr
+import Graphics.Rendering.OpenGL.GL.DataType
+import Graphics.Rendering.OpenGL.GL.PixelFormat
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+data PixelData a = PixelData PixelFormat DataType (Ptr a)
+   deriving ( Eq, Ord, Show )
+
+withPixelData :: PixelData a -> (GLenum -> GLenum -> Ptr a -> b) -> b
+withPixelData (PixelData pixelFormat dataType ptr) f =
+   f (marshalPixelFormat pixelFormat) (marshalDataType dataType) ptr
diff --git a/src/Graphics/Rendering/OpenGL/GL/PixelFormat.hs b/src/Graphics/Rendering/OpenGL/GL/PixelFormat.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/PixelFormat.hs
@@ -0,0 +1,128 @@
+{-# OPTIONS_HADDOCK hide #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.PixelFormat
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This is a purely internal module for (un-)marshaling PixelFormat.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.PixelFormat (
+   PixelFormat(..), marshalPixelFormat, unmarshalPixelFormat
+) where
+
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+data PixelFormat =
+     ColorIndex
+   | StencilIndex
+   | DepthComponent
+   | DepthStencil
+   | Red
+   | Green
+   | Blue
+   | Alpha
+   | RG
+   | RGB
+   | RGBA
+   | Luminance
+   | LuminanceAlpha
+   | RedInteger
+   | GreenInteger
+   | BlueInteger
+   | AlphaInteger
+   | RGInteger
+   | RGBInteger
+   | RGBAInteger
+   | BGRInteger
+   | BGRAInteger
+   | ABGR
+   | BGR
+   | BGRA
+   | CMYK
+   | CMYKA
+   | FourTwoTwo
+   | FourTwoTwoRev
+   | FourTwoTwoAverage
+   | FourTwoTwoRevAverage
+   | YCBCR422
+   deriving ( Eq, Ord, Show )
+
+marshalPixelFormat :: PixelFormat -> GLenum
+marshalPixelFormat x = case x of
+   ColorIndex -> GL_COLOR_INDEX
+   StencilIndex -> GL_STENCIL_INDEX
+   DepthComponent -> GL_DEPTH_COMPONENT
+   Red -> GL_RED
+   Green -> GL_GREEN
+   Blue -> GL_BLUE
+   Alpha -> GL_ALPHA
+   RG -> GL_RG
+   RGB -> GL_RGB
+   RGBA -> GL_RGBA
+   Luminance -> GL_LUMINANCE
+   LuminanceAlpha -> GL_LUMINANCE_ALPHA
+   RedInteger -> GL_RED_INTEGER
+   GreenInteger -> GL_GREEN_INTEGER
+   BlueInteger -> GL_BLUE_INTEGER
+   AlphaInteger -> GL_ALPHA_INTEGER
+   RGInteger -> GL_RG_INTEGER
+   RGBInteger -> GL_RGB_INTEGER
+   RGBAInteger -> GL_RGBA_INTEGER
+   BGRInteger -> GL_BGR_INTEGER
+   BGRAInteger -> GL_BGRA_INTEGER
+   ABGR -> GL_ABGR_EXT
+   BGR -> GL_BGR
+   BGRA -> GL_BGRA
+   CMYK -> GL_CMYK_EXT
+   CMYKA -> GL_CMYKA_EXT
+   FourTwoTwo -> GL_422_EXT
+   FourTwoTwoRev -> GL_422_REV_EXT
+   FourTwoTwoAverage -> GL_422_AVERAGE_EXT
+   FourTwoTwoRevAverage -> GL_422_REV_AVERAGE_EXT
+   YCBCR422 -> GL_YCBCR_422_APPLE
+   DepthStencil -> GL_DEPTH_STENCIL
+
+unmarshalPixelFormat :: GLenum -> PixelFormat
+unmarshalPixelFormat x
+   | x == GL_COLOR_INDEX = ColorIndex
+   | x == GL_STENCIL_INDEX = StencilIndex
+   | x == GL_DEPTH_COMPONENT = DepthComponent
+   | x == GL_RED = Red
+   | x == GL_GREEN = Green
+   | x == GL_BLUE = Blue
+   | x == GL_ALPHA = Alpha
+   | x == GL_RG = RG
+   | x == GL_RGB = RGB
+   | x == GL_RGBA = RGBA
+   | x == GL_LUMINANCE = Luminance
+   | x == GL_LUMINANCE_ALPHA = LuminanceAlpha
+   | x == GL_RED_INTEGER = RedInteger
+   | x == GL_GREEN_INTEGER = GreenInteger
+   | x == GL_BLUE_INTEGER = BlueInteger
+   | x == GL_ALPHA_INTEGER = AlphaInteger
+   | x == GL_RG_INTEGER = RGInteger
+   | x == GL_RGB_INTEGER = RGBInteger
+   | x == GL_RGBA_INTEGER = RGBAInteger
+   | x == GL_BGR_INTEGER = BGRInteger
+   | x == GL_BGRA_INTEGER = BGRAInteger
+   | x == GL_ABGR_EXT = ABGR
+   | x == GL_BGR = BGR
+   | x == GL_BGRA = BGRA
+   | x == GL_CMYK_EXT = CMYK
+   | x == GL_CMYKA_EXT = CMYKA
+   | x == GL_422_EXT = FourTwoTwo
+   | x == GL_422_REV_EXT = FourTwoTwoRev
+   | x == GL_422_AVERAGE_EXT = FourTwoTwoAverage
+   | x == GL_422_REV_AVERAGE_EXT = FourTwoTwoRevAverage
+   | x == GL_YCBCR_422_APPLE = YCBCR422
+   | x == GL_DEPTH_STENCIL = DepthStencil
+   | otherwise = error ("unmarshalPixelFormat: illegal value " ++ show x)
diff --git a/src/Graphics/Rendering/OpenGL/GL/PixelRectangles.hs b/src/Graphics/Rendering/OpenGL/GL/PixelRectangles.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/PixelRectangles.hs
@@ -0,0 +1,34 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.PixelRectangles
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+-- 
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 3.6 (Pixel Rectangles) of the OpenGL 2.1
+-- specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.PixelRectangles (
+   module Graphics.Rendering.OpenGL.GL.PixelRectangles.PixelStorage,
+   module Graphics.Rendering.OpenGL.GL.PixelRectangles.PixelTransfer,
+   module Graphics.Rendering.OpenGL.GL.PixelRectangles.PixelMap,
+   module Graphics.Rendering.OpenGL.GL.PixelRectangles.ColorTable,
+   module Graphics.Rendering.OpenGL.GL.PixelRectangles.Convolution,
+   module Graphics.Rendering.OpenGL.GL.PixelRectangles.Histogram,
+   module Graphics.Rendering.OpenGL.GL.PixelRectangles.Minmax,
+   module Graphics.Rendering.OpenGL.GL.PixelRectangles.Rasterization
+) where
+
+import Graphics.Rendering.OpenGL.GL.PixelRectangles.PixelStorage
+import Graphics.Rendering.OpenGL.GL.PixelRectangles.PixelTransfer
+import Graphics.Rendering.OpenGL.GL.PixelRectangles.PixelMap
+import Graphics.Rendering.OpenGL.GL.PixelRectangles.ColorTable
+import Graphics.Rendering.OpenGL.GL.PixelRectangles.Convolution
+import Graphics.Rendering.OpenGL.GL.PixelRectangles.Histogram
+import Graphics.Rendering.OpenGL.GL.PixelRectangles.Minmax
+import Graphics.Rendering.OpenGL.GL.PixelRectangles.Rasterization
diff --git a/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/ColorTable.hs b/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/ColorTable.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/ColorTable.hs
@@ -0,0 +1,247 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.PixelRectangles.ColorTable
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to a part of section 3.6.1 (Pixel Storage Modes) of
+-- the OpenGL 2.1 specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.PixelRectangles.ColorTable (
+   ColorTableStage(..), colorTableStage,
+   Proxy(..), ColorTable(..), PixelInternalFormat(..),
+   colorTable, getColorTable, copyColorTable, colorSubTable, copyColorSubTable,
+   colorTableScale, colorTableBias, colorTableFormat, colorTableWidth,
+   colorTableRGBASizes, colorTableLuminanceSize, colorTableIntesitySize,
+) where
+
+import Data.StateVar
+import Foreign.Marshal.Alloc
+import Foreign.Marshal.Utils
+import Foreign.Ptr
+import Foreign.Storable
+import Graphics.Rendering.OpenGL.GL.Capability
+import Graphics.Rendering.OpenGL.GL.CoordTrans
+import Graphics.Rendering.OpenGL.GL.PeekPoke
+import Graphics.Rendering.OpenGL.GL.PixelData
+import Graphics.Rendering.OpenGL.GL.Texturing.PixelInternalFormat
+import Graphics.Rendering.OpenGL.GL.VertexSpec
+import Graphics.Rendering.OpenGL.GLU.ErrorsInternal
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+data ColorTableStage =
+     ColorTableStage
+   | PostConvolutionColorTableStage
+   | PostColorMatrixColorTableStage
+   | TextureColorTableStage
+   deriving ( Eq, Ord, Show )
+
+colorTableStageToColorTable :: ColorTableStage -> ColorTable
+colorTableStageToColorTable x = case x of
+   ColorTableStage -> ColorTable
+   PostConvolutionColorTableStage -> PostConvolutionColorTable
+   PostColorMatrixColorTableStage -> PostColorMatrixColorTable
+   TextureColorTableStage -> TextureColorTable
+
+colorTableStageToEnableCap :: ColorTableStage -> EnableCap
+colorTableStageToEnableCap x = case x of
+   ColorTableStage -> CapColorTable
+   PostConvolutionColorTableStage -> CapPostConvolutionColorTable
+   PostColorMatrixColorTableStage -> CapPostColorMatrixColorTable
+   TextureColorTableStage -> CapTextureColorTable
+
+--------------------------------------------------------------------------------
+
+colorTableStage :: ColorTableStage -> StateVar Capability
+colorTableStage = makeCapability . colorTableStageToEnableCap
+
+--------------------------------------------------------------------------------
+
+data ColorTable =
+     ColorTable
+   | PostConvolutionColorTable
+   | PostColorMatrixColorTable
+   | Texture1DColorTable
+   | Texture2DColorTable
+   | Texture3DColorTable
+   | TextureCubeMapColorTable
+   | TextureColorTable
+   | SharedTexturePalette
+   deriving ( Eq, Ord, Show )
+
+marshalColorTable :: ColorTable -> GLenum
+marshalColorTable x = case x of
+   ColorTable -> GL_COLOR_TABLE
+   PostConvolutionColorTable -> GL_POST_CONVOLUTION_COLOR_TABLE
+   PostColorMatrixColorTable -> GL_POST_COLOR_MATRIX_COLOR_TABLE
+   Texture1DColorTable -> GL_TEXTURE_1D
+   Texture2DColorTable -> GL_TEXTURE_2D
+   Texture3DColorTable -> GL_TEXTURE_3D
+   TextureCubeMapColorTable -> GL_TEXTURE_CUBE_MAP
+   TextureColorTable -> GL_TEXTURE_COLOR_TABLE_SGI
+   SharedTexturePalette -> GL_SHARED_TEXTURE_PALETTE_EXT
+
+--------------------------------------------------------------------------------
+
+data Proxy =
+     NoProxy
+   | Proxy
+   deriving ( Eq, Ord, Show )
+
+--------------------------------------------------------------------------------
+
+marshalProxyColorTable :: Proxy -> ColorTable -> Maybe GLenum
+marshalProxyColorTable NoProxy x = Just (marshalColorTable x)
+marshalProxyColorTable Proxy   x = case x of
+   ColorTable -> Just GL_PROXY_COLOR_TABLE
+   PostConvolutionColorTable -> Just GL_PROXY_POST_CONVOLUTION_COLOR_TABLE
+   PostColorMatrixColorTable -> Just GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE
+   Texture1DColorTable -> Just GL_PROXY_TEXTURE_1D
+   Texture2DColorTable -> Just GL_PROXY_TEXTURE_2D
+   Texture3DColorTable -> Just GL_PROXY_TEXTURE_3D
+   TextureCubeMapColorTable -> Just GL_PROXY_TEXTURE_CUBE_MAP
+   TextureColorTable -> Just GL_TEXTURE_COLOR_TABLE_SGI
+   SharedTexturePalette -> Nothing
+
+--------------------------------------------------------------------------------
+
+colorTable ::
+   Proxy -> ColorTable -> PixelInternalFormat -> GLsizei -> PixelData a -> IO ()
+colorTable proxy ct int w pd =
+   maybe recordInvalidEnum
+         (\target -> withPixelData pd $
+            glColorTable target (marshalPixelInternalFormat' int) w)
+         (marshalProxyColorTable proxy ct)
+
+--------------------------------------------------------------------------------
+
+getColorTable :: ColorTable -> PixelData a -> IO ()
+getColorTable ct pd =
+   withPixelData pd $ glGetColorTable (marshalColorTable ct)
+
+--------------------------------------------------------------------------------
+
+copyColorTable :: ColorTable -> PixelInternalFormat -> Position -> GLsizei -> IO ()
+copyColorTable ct int (Position x y) =
+   glCopyColorTable (marshalColorTable ct) (marshalPixelInternalFormat' int) x y
+
+--------------------------------------------------------------------------------
+
+colorSubTable :: ColorTable -> GLsizei -> GLsizei -> PixelData a -> IO ()
+colorSubTable ct start count pd =
+   withPixelData pd $ glColorSubTable (marshalColorTable ct) start count
+
+--------------------------------------------------------------------------------
+
+copyColorSubTable :: ColorTable -> GLsizei -> Position -> GLsizei -> IO ()
+copyColorSubTable ct start (Position x y) =
+   glCopyColorSubTable (marshalColorTable ct) start x y
+
+--------------------------------------------------------------------------------
+
+data ColorTablePName =
+     ColorTableScale
+   | ColorTableBias
+   | ColorTableFormat
+   | ColorTableWidth
+   | ColorTableRedSize
+   | ColorTableGreenSize
+   | ColorTableBlueSize
+   | ColorTableAlphaSize
+   | ColorTableLuminanceSize
+   | ColorTableIntensitySize
+
+marshalColorTablePName :: ColorTablePName -> GLenum
+marshalColorTablePName x = case x of
+   ColorTableScale -> GL_COLOR_TABLE_SCALE
+   ColorTableBias -> GL_COLOR_TABLE_BIAS
+   ColorTableFormat -> GL_COLOR_TABLE_FORMAT
+   ColorTableWidth -> GL_COLOR_TABLE_WIDTH
+   ColorTableRedSize -> GL_COLOR_TABLE_RED_SIZE
+   ColorTableGreenSize -> GL_COLOR_TABLE_GREEN_SIZE
+   ColorTableBlueSize -> GL_COLOR_TABLE_BLUE_SIZE
+   ColorTableAlphaSize -> GL_COLOR_TABLE_ALPHA_SIZE
+   ColorTableLuminanceSize -> GL_COLOR_TABLE_LUMINANCE_SIZE
+   ColorTableIntensitySize -> GL_COLOR_TABLE_INTENSITY_SIZE
+
+--------------------------------------------------------------------------------
+
+colorTableScale :: ColorTableStage -> StateVar (Color4 GLfloat)
+colorTableScale = colorTableScaleBias ColorTableScale
+
+colorTableBias :: ColorTableStage -> StateVar (Color4 GLfloat)
+colorTableBias = colorTableScaleBias ColorTableBias
+
+colorTableScaleBias ::
+   ColorTablePName -> ColorTableStage -> StateVar (Color4 GLfloat)
+colorTableScaleBias p s =
+   makeStateVar (getColorTableParameterC4f ct p) (colorTableParameterC4f ct p)
+   where ct = colorTableStageToColorTable s
+
+getColorTableParameterC4f ::
+   ColorTable -> ColorTablePName -> IO (Color4 GLfloat)
+getColorTableParameterC4f ct p =
+   alloca $ \buf -> do
+      glGetColorTableParameterfv
+         (marshalColorTable ct)
+         (marshalColorTablePName p)
+         (castPtr buf)
+      peek buf
+
+colorTableParameterC4f ::
+   ColorTable -> ColorTablePName -> Color4 GLfloat -> IO ()
+colorTableParameterC4f ct p c =
+   with c $ \ptr ->
+      glColorTableParameterfv (marshalColorTable ct) (marshalColorTablePName p) (castPtr ptr)
+
+--------------------------------------------------------------------------------
+
+colorTableFormat :: ColorTable -> GettableStateVar PixelInternalFormat
+colorTableFormat ct =
+   makeGettableStateVar $
+      getColorTableParameteri unmarshalPixelInternalFormat ct ColorTableFormat
+
+getColorTableParameteri :: (GLint -> a) -> ColorTable -> ColorTablePName -> IO a
+getColorTableParameteri f ct p =
+   with 0 $ \buf -> do
+      glGetColorTableParameteriv
+         (marshalColorTable ct)
+         (marshalColorTablePName p)
+         buf
+      peek1 f buf
+
+--------------------------------------------------------------------------------
+
+colorTableWidth :: ColorTable -> GettableStateVar GLsizei
+colorTableWidth ct =
+   makeGettableStateVar $
+      getColorTableParameteri fromIntegral ct ColorTableWidth
+
+--------------------------------------------------------------------------------
+
+colorTableRGBASizes :: ColorTable -> GettableStateVar (Color4 GLsizei)
+colorTableRGBASizes ct =
+   makeGettableStateVar $ do
+      r <- getColorTableParameteri fromIntegral ct ColorTableRedSize
+      g <- getColorTableParameteri fromIntegral ct ColorTableGreenSize
+      b <- getColorTableParameteri fromIntegral ct ColorTableBlueSize
+      a <- getColorTableParameteri fromIntegral ct ColorTableAlphaSize
+      return $ Color4 r g b a
+
+colorTableLuminanceSize :: ColorTable -> GettableStateVar GLsizei
+colorTableLuminanceSize ct =
+   makeGettableStateVar $
+      getColorTableParameteri fromIntegral ct ColorTableLuminanceSize
+
+colorTableIntesitySize :: ColorTable -> GettableStateVar GLsizei
+colorTableIntesitySize ct =
+   makeGettableStateVar $
+      getColorTableParameteri fromIntegral ct ColorTableIntensitySize
diff --git a/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/Convolution.hs b/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/Convolution.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/Convolution.hs
@@ -0,0 +1,281 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.PixelRectangles.Convolution
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to a part of section 3.6.1 (Pixel Storage Modes) of
+-- the OpenGL 2.1 specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.PixelRectangles.Convolution (
+   ConvolutionTarget(..), convolution,
+   convolutionFilter1D, getConvolutionFilter1D,
+   convolutionFilter2D, getConvolutionFilter2D,
+   separableFilter2D, getSeparableFilter2D,
+   copyConvolutionFilter1D, copyConvolutionFilter2D,
+   convolutionWidth, convolutionHeight,
+   maxConvolutionWidth, maxConvolutionHeight,
+   ConvolutionBorderMode(..), convolutionBorderMode,
+   convolutionFilterScale, convolutionFilterBias,
+) where
+
+import Data.StateVar
+import Foreign.Marshal.Alloc
+import Foreign.Marshal.Utils
+import Foreign.Ptr
+import Foreign.Storable
+import Graphics.Rendering.OpenGL.GL.Capability
+import Graphics.Rendering.OpenGL.GL.CoordTrans
+import Graphics.Rendering.OpenGL.GL.PeekPoke
+import Graphics.Rendering.OpenGL.GL.PixelData
+import Graphics.Rendering.OpenGL.GL.Texturing.PixelInternalFormat
+import Graphics.Rendering.OpenGL.GL.VertexSpec
+import Graphics.Rendering.OpenGL.GLU.ErrorsInternal
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+data ConvolutionTarget =
+     Convolution1D
+   | Convolution2D
+   | Separable2D
+   deriving ( Eq, Ord, Show )
+
+marshalConvolutionTarget :: ConvolutionTarget -> GLenum
+marshalConvolutionTarget x = case x of
+   Convolution1D -> GL_CONVOLUTION_1D
+   Convolution2D -> GL_CONVOLUTION_2D
+   Separable2D -> GL_SEPARABLE_2D
+
+convolutionTargetToEnableCap :: ConvolutionTarget -> EnableCap
+convolutionTargetToEnableCap x = case x of
+   Convolution1D -> CapConvolution1D
+   Convolution2D -> CapConvolution2D
+   Separable2D -> CapSeparable2D
+
+--------------------------------------------------------------------------------
+
+convolution :: ConvolutionTarget -> StateVar Capability
+convolution = makeCapability . convolutionTargetToEnableCap
+
+--------------------------------------------------------------------------------
+
+convolutionFilter1D :: PixelInternalFormat -> GLsizei -> PixelData a -> IO ()
+convolutionFilter1D int w pd =
+   withPixelData pd $
+      glConvolutionFilter1D
+         (marshalConvolutionTarget Convolution1D)
+         (marshalPixelInternalFormat' int) w
+
+--------------------------------------------------------------------------------
+
+getConvolutionFilter1D :: PixelData a -> IO ()
+getConvolutionFilter1D = getConvolutionFilter Convolution1D
+
+getConvolutionFilter :: ConvolutionTarget -> PixelData a -> IO ()
+getConvolutionFilter t pd =
+   withPixelData pd $ glGetConvolutionFilter (marshalConvolutionTarget t)
+
+--------------------------------------------------------------------------------
+
+convolutionFilter2D :: PixelInternalFormat -> Size -> PixelData a -> IO ()
+convolutionFilter2D int (Size w h) pd =
+   withPixelData pd $
+      glConvolutionFilter2D
+         (marshalConvolutionTarget Convolution2D)
+         (marshalPixelInternalFormat' int) w h
+
+--------------------------------------------------------------------------------
+
+getConvolutionFilter2D :: PixelData a -> IO ()
+getConvolutionFilter2D = getConvolutionFilter Convolution2D
+
+--------------------------------------------------------------------------------
+
+separableFilter2D ::
+   PixelInternalFormat -> Size -> PixelData a -> PixelData a -> IO ()
+separableFilter2D int (Size w h) pdRow pdCol =
+   withPixelData pdRow $ \f1 d1 p1 ->
+      withPixelData pdCol $ \f2 d2 p2 ->
+         if f1 == f2 && d1 == d2
+            then glSeparableFilter2D
+                    (marshalConvolutionTarget Separable2D)
+                    (marshalPixelInternalFormat' int) w h f1 d1 p1 p2
+            else recordInvalidValue
+
+--------------------------------------------------------------------------------
+
+getSeparableFilter2D :: PixelData a -> PixelData a -> IO ()
+getSeparableFilter2D pdRow pdCol =
+   withPixelData pdRow $ \f1 d1 p1 ->
+      withPixelData pdCol $ \f2 d2 p2 ->
+         if f1 == f2 && d1 == d2
+            then glGetSeparableFilter
+                    (marshalConvolutionTarget Separable2D) f1 d1 p1 p2 nullPtr
+            else recordInvalidValue
+
+--------------------------------------------------------------------------------
+
+copyConvolutionFilter1D :: PixelInternalFormat -> Position -> GLsizei -> IO ()
+copyConvolutionFilter1D int (Position x y) =
+   glCopyConvolutionFilter1D
+      (marshalConvolutionTarget Convolution1D) (marshalPixelInternalFormat' int)
+      x y
+
+--------------------------------------------------------------------------------
+
+copyConvolutionFilter2D :: PixelInternalFormat -> Position -> Size -> IO ()
+copyConvolutionFilter2D int (Position x y) (Size w h) =
+   glCopyConvolutionFilter2D
+      (marshalConvolutionTarget Convolution2D) (marshalPixelInternalFormat' int)
+      x y w h
+
+--------------------------------------------------------------------------------
+
+data ConvolutionParameter =
+     ConvolutionBorderColor
+   | ConvolutionBorderMode
+   | ConvolutionFilterScale
+   | ConvolutionFilterBias
+   | ConvolutionFormat
+   | ConvolutionWidth
+   | ConvolutionHeight
+   | MaxConvolutionWidth
+   | MaxConvolutionHeight
+   deriving ( Eq, Ord, Show )
+
+marshalConvolutionParameter :: ConvolutionParameter -> GLenum
+marshalConvolutionParameter x = case x of
+   ConvolutionBorderColor -> GL_CONVOLUTION_BORDER_COLOR
+   ConvolutionBorderMode -> GL_CONVOLUTION_BORDER_MODE
+   ConvolutionFilterScale -> GL_CONVOLUTION_FILTER_SCALE
+   ConvolutionFilterBias -> GL_CONVOLUTION_FILTER_BIAS
+   ConvolutionFormat -> GL_CONVOLUTION_FORMAT
+   ConvolutionWidth -> GL_CONVOLUTION_WIDTH
+   ConvolutionHeight -> GL_CONVOLUTION_HEIGHT
+   MaxConvolutionWidth -> GL_MAX_CONVOLUTION_WIDTH
+   MaxConvolutionHeight -> GL_MAX_CONVOLUTION_HEIGHT
+
+--------------------------------------------------------------------------------
+
+convolutionWidth :: ConvolutionTarget -> GettableStateVar GLsizei
+convolutionWidth t = convolutionParameteri t ConvolutionWidth
+
+convolutionHeight :: ConvolutionTarget -> GettableStateVar GLsizei
+convolutionHeight t = convolutionParameteri t ConvolutionHeight
+
+maxConvolutionWidth :: ConvolutionTarget -> GettableStateVar GLsizei
+maxConvolutionWidth t = convolutionParameteri t MaxConvolutionWidth
+
+maxConvolutionHeight :: ConvolutionTarget -> GettableStateVar GLsizei
+maxConvolutionHeight t = convolutionParameteri t MaxConvolutionHeight
+
+convolutionParameteri ::
+   ConvolutionTarget -> ConvolutionParameter -> GettableStateVar GLsizei
+convolutionParameteri t p =
+   makeGettableStateVar (getConvolutionParameteri fromIntegral t p)
+
+getConvolutionParameteri ::
+   (GLint -> a) -> ConvolutionTarget -> ConvolutionParameter -> IO a
+getConvolutionParameteri f t p =
+   with 0 $ \buf -> do
+      glGetConvolutionParameteriv
+         (marshalConvolutionTarget t) (marshalConvolutionParameter p) buf
+      peek1 f buf
+
+--------------------------------------------------------------------------------
+
+data ConvolutionBorderMode' =
+     Reduce'
+   | ConstantBorder'
+   | ReplicateBorder'
+
+marshalConvolutionBorderMode' :: ConvolutionBorderMode' -> GLint
+marshalConvolutionBorderMode' x = fromIntegral $ case x of
+   Reduce' -> GL_REDUCE
+   ConstantBorder' -> GL_CONSTANT_BORDER
+   ReplicateBorder' -> GL_REPLICATE_BORDER
+
+unmarshalConvolutionBorderMode' :: GLint -> ConvolutionBorderMode'
+unmarshalConvolutionBorderMode' x
+   | y == GL_REDUCE = Reduce'
+   | y == GL_CONSTANT_BORDER = ConstantBorder'
+   | y == GL_REPLICATE_BORDER = ReplicateBorder'
+   | otherwise = error ("unmarshalConvolutionBorderMode': illegal value " ++ show x)
+   where y = fromIntegral x
+
+--------------------------------------------------------------------------------
+
+data ConvolutionBorderMode =
+     Reduce
+   | ConstantBorder (Color4 GLfloat)
+   | ReplicateBorder
+   deriving ( Eq, Ord, Show )
+
+--------------------------------------------------------------------------------
+
+convolutionBorderMode :: ConvolutionTarget -> StateVar ConvolutionBorderMode
+convolutionBorderMode t =
+   makeStateVar (getConvolutionBorderMode t) (setConvolutionBorderMode t)
+
+getConvolutionBorderMode :: ConvolutionTarget -> IO ConvolutionBorderMode
+getConvolutionBorderMode t = do
+   mode <- getConvolutionParameteri
+              unmarshalConvolutionBorderMode' t ConvolutionBorderMode
+   case mode of
+      Reduce' -> return Reduce
+      ConstantBorder' -> do
+         c <- getConvolutionParameterC4f t ConvolutionBorderColor
+         return $ ConstantBorder c
+      ReplicateBorder' -> return ReplicateBorder
+
+setConvolutionBorderMode :: ConvolutionTarget -> ConvolutionBorderMode -> IO ()
+setConvolutionBorderMode t mode = do
+   let setBM = setConvolutionParameteri
+                  marshalConvolutionBorderMode' t ConvolutionBorderMode
+   case mode of
+      Reduce -> setBM Reduce'
+      ConstantBorder c -> do
+         setBM ConstantBorder'
+         convolutionParameterC4f t ConvolutionBorderColor c
+      ReplicateBorder -> setBM ReplicateBorder'
+
+setConvolutionParameteri ::
+   (a -> GLint) -> ConvolutionTarget -> ConvolutionParameter -> a -> IO ()
+setConvolutionParameteri f t p x =
+   glConvolutionParameteri
+      (marshalConvolutionTarget t) (marshalConvolutionParameter p) (f x)
+
+--------------------------------------------------------------------------------
+
+convolutionFilterScale :: ConvolutionTarget -> StateVar (Color4 GLfloat)
+convolutionFilterScale = convolutionC4f ConvolutionFilterScale
+
+convolutionFilterBias :: ConvolutionTarget -> StateVar (Color4 GLfloat)
+convolutionFilterBias = convolutionC4f ConvolutionFilterBias
+
+convolutionC4f ::
+   ConvolutionParameter -> ConvolutionTarget -> StateVar (Color4 GLfloat)
+convolutionC4f p t =
+   makeStateVar (getConvolutionParameterC4f t p) (convolutionParameterC4f t p)
+
+getConvolutionParameterC4f ::
+   ConvolutionTarget -> ConvolutionParameter -> IO (Color4 GLfloat)
+getConvolutionParameterC4f t p =
+   alloca $ \buf -> do
+      glGetConvolutionParameterfv
+         (marshalConvolutionTarget t) (marshalConvolutionParameter p) (castPtr buf)
+      peek buf
+
+convolutionParameterC4f ::
+   ConvolutionTarget -> ConvolutionParameter -> Color4 GLfloat -> IO ()
+convolutionParameterC4f t p c =
+   with c $ \ptr ->
+      glConvolutionParameterfv
+         (marshalConvolutionTarget t) (marshalConvolutionParameter p) (castPtr ptr)
diff --git a/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/Histogram.hs b/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/Histogram.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/Histogram.hs
@@ -0,0 +1,132 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.PixelRectangles.Histogram
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to a part of section 3.6.1 (Pixel Storage Modes) of
+-- the OpenGL 2.1 specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.PixelRectangles.Histogram (
+   Sink(..), histogram, Reset(..), getHistogram, resetHistogram,
+   histogramRGBASizes, histogramLuminanceSize
+) where
+
+import Data.StateVar
+import Foreign.Marshal.Utils
+import Graphics.Rendering.OpenGL.GL.Capability
+import Graphics.Rendering.OpenGL.GL.PeekPoke
+import Graphics.Rendering.OpenGL.GL.PixelData
+import Graphics.Rendering.OpenGL.GL.PixelRectangles.ColorTable
+import Graphics.Rendering.OpenGL.GL.PixelRectangles.Reset
+import Graphics.Rendering.OpenGL.GL.PixelRectangles.Sink
+import Graphics.Rendering.OpenGL.GL.Texturing.PixelInternalFormat
+import Graphics.Rendering.OpenGL.GL.VertexSpec
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+data HistogramTarget =
+     Histogram
+   | ProxyHistogram
+
+marshalHistogramTarget :: HistogramTarget -> GLenum
+marshalHistogramTarget x = case x of
+   Histogram -> GL_HISTOGRAM
+   ProxyHistogram -> GL_PROXY_HISTOGRAM
+
+proxyToHistogramTarget :: Proxy -> HistogramTarget
+proxyToHistogramTarget x = case x of
+   NoProxy -> Histogram
+   Proxy -> ProxyHistogram
+
+--------------------------------------------------------------------------------
+
+histogram :: Proxy -> StateVar (Maybe (GLsizei, PixelInternalFormat, Sink))
+histogram proxy =
+   makeStateVarMaybe
+      (return CapHistogram) (getHistogram' proxy) (setHistogram proxy)
+
+getHistogram' :: Proxy -> IO (GLsizei, PixelInternalFormat, Sink)
+getHistogram' proxy = do
+   w <- getHistogramParameteri fromIntegral proxy HistogramWidth
+   f <- getHistogramParameteri unmarshalPixelInternalFormat proxy HistogramFormat
+   s <- getHistogramParameteri unmarshalSink proxy HistogramSink
+   return (w, f, s)
+
+getHistogramParameteri ::
+   (GLint -> a) -> Proxy -> GetHistogramParameterPName -> IO a
+getHistogramParameteri f proxy p =
+   with 0 $ \buf -> do
+      glGetHistogramParameteriv
+         (marshalHistogramTarget (proxyToHistogramTarget proxy))
+         (marshalGetHistogramParameterPName p)
+         buf
+      peek1 f buf
+
+setHistogram :: Proxy -> (GLsizei, PixelInternalFormat, Sink) -> IO ()
+setHistogram proxy (w, int, sink) =
+   glHistogram
+      (marshalHistogramTarget (proxyToHistogramTarget proxy))
+      w
+      (marshalPixelInternalFormat' int)
+      (marshalSink sink)
+
+--------------------------------------------------------------------------------
+
+getHistogram :: Reset -> PixelData a -> IO ()
+getHistogram reset pd =
+   withPixelData pd $
+      glGetHistogram
+         (marshalHistogramTarget Histogram)
+         (marshalReset reset)
+
+--------------------------------------------------------------------------------
+
+resetHistogram :: IO ()
+resetHistogram = glResetHistogram (marshalHistogramTarget Histogram)
+
+--------------------------------------------------------------------------------
+
+data GetHistogramParameterPName =
+     HistogramWidth
+   | HistogramFormat
+   | HistogramRedSize
+   | HistogramGreenSize
+   | HistogramBlueSize
+   | HistogramAlphaSize
+   | HistogramLuminanceSize
+   | HistogramSink
+
+marshalGetHistogramParameterPName :: GetHistogramParameterPName -> GLenum
+marshalGetHistogramParameterPName x = case x of
+   HistogramWidth -> GL_HISTOGRAM_WIDTH
+   HistogramFormat -> GL_HISTOGRAM_FORMAT
+   HistogramRedSize -> GL_HISTOGRAM_RED_SIZE
+   HistogramGreenSize -> GL_HISTOGRAM_GREEN_SIZE
+   HistogramBlueSize -> GL_HISTOGRAM_BLUE_SIZE
+   HistogramAlphaSize -> GL_HISTOGRAM_ALPHA_SIZE
+   HistogramLuminanceSize -> GL_HISTOGRAM_LUMINANCE_SIZE
+   HistogramSink -> GL_HISTOGRAM_SINK
+
+--------------------------------------------------------------------------------
+
+histogramRGBASizes :: Proxy -> GettableStateVar (Color4 GLsizei)
+histogramRGBASizes proxy =
+   makeGettableStateVar $ do
+      r <- getHistogramParameteri fromIntegral proxy HistogramRedSize
+      g <- getHistogramParameteri fromIntegral proxy HistogramGreenSize
+      b <- getHistogramParameteri fromIntegral proxy HistogramBlueSize
+      a <- getHistogramParameteri fromIntegral proxy HistogramAlphaSize
+      return $ Color4 r g b a
+
+histogramLuminanceSize :: Proxy -> GettableStateVar GLsizei
+histogramLuminanceSize proxy =
+   makeGettableStateVar $
+      getHistogramParameteri fromIntegral proxy HistogramLuminanceSize
diff --git a/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/Minmax.hs b/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/Minmax.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/Minmax.hs
@@ -0,0 +1,89 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.PixelRectangles.Minmax
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to a part of section 3.6.1 (Pixel Storage Modes) of
+-- the OpenGL 2.1 specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.PixelRectangles.Minmax (
+   minmax, getMinmax, resetMinmax
+) where
+
+import Data.StateVar
+import Foreign.Marshal.Utils
+import Graphics.Rendering.OpenGL.GL.Capability
+import Graphics.Rendering.OpenGL.GL.PeekPoke
+import Graphics.Rendering.OpenGL.GL.PixelData
+import Graphics.Rendering.OpenGL.GL.PixelRectangles.Reset
+import Graphics.Rendering.OpenGL.GL.PixelRectangles.Sink
+import Graphics.Rendering.OpenGL.GL.Texturing.PixelInternalFormat
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+data MinmaxTarget =
+     Minmax
+
+marshalMinmaxTarget :: MinmaxTarget -> GLenum
+marshalMinmaxTarget x = case x of
+   Minmax -> GL_MINMAX
+
+--------------------------------------------------------------------------------
+
+minmax :: StateVar (Maybe (PixelInternalFormat, Sink))
+minmax = makeStateVarMaybe (return CapMinmax) getMinmax' setMinmax
+
+getMinmax' :: IO (PixelInternalFormat, Sink)
+getMinmax' = do
+   f <- getMinmaxParameteri unmarshalPixelInternalFormat MinmaxFormat
+   s <- getMinmaxParameteri unmarshalSink MinmaxSink
+   return (f, s)
+
+setMinmax :: (PixelInternalFormat, Sink) -> IO ()
+setMinmax (int, sink) =
+   glMinmax
+      (marshalMinmaxTarget Minmax)
+      (marshalPixelInternalFormat' int)
+      (marshalSink sink)
+
+--------------------------------------------------------------------------------
+
+getMinmax :: Reset -> PixelData a -> IO ()
+getMinmax reset pd =
+   withPixelData pd $
+      glGetMinmax (marshalMinmaxTarget Minmax) (marshalReset reset)
+
+--------------------------------------------------------------------------------
+
+resetMinmax :: IO ()
+resetMinmax = glResetMinmax (marshalMinmaxTarget Minmax)
+
+--------------------------------------------------------------------------------
+
+data GetMinmaxParameterPName =
+     MinmaxFormat
+   | MinmaxSink
+
+marshalGetMinmaxParameterPName :: GetMinmaxParameterPName -> GLenum
+marshalGetMinmaxParameterPName x = case x of
+   MinmaxFormat -> GL_MINMAX_FORMAT
+   MinmaxSink -> GL_MINMAX_SINK
+
+--------------------------------------------------------------------------------
+
+getMinmaxParameteri :: (GLint -> a) -> GetMinmaxParameterPName -> IO a
+getMinmaxParameteri f p =
+   with 0 $ \buf -> do
+      glGetMinmaxParameteriv
+         (marshalMinmaxTarget Minmax)
+         (marshalGetMinmaxParameterPName p)
+         buf
+      peek1 f buf
diff --git a/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/PixelMap.hs b/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/PixelMap.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/PixelMap.hs
@@ -0,0 +1,209 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.PixelRectangles.PixelMap
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to a part of section 3.6.1 (Pixel Storage Modes) of
+-- the OpenGL 2.1 specs.
+--
+--------------------------------------------------------------------------------
+
+{-# LANGUAGE TypeSynonymInstances #-}
+
+module Graphics.Rendering.OpenGL.GL.PixelRectangles.PixelMap (
+   PixelMapTarget(..), PixelMapComponent, PixelMap(..), GLpixelmap,
+   maxPixelMapTable, pixelMap, pixelMapIToRGBA, pixelMapRGBAToRGBA,
+) where
+
+import Data.List
+import Data.StateVar
+import Foreign.ForeignPtr
+import Foreign.Marshal.Array
+import Foreign.Ptr
+import Foreign.Storable
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.Rendering.OpenGL.GL.VertexSpec
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+data PixelMapTarget =
+     IToI
+   | SToS
+   | IToR
+   | IToG
+   | IToB
+   | IToA
+   | RToR
+   | GToG
+   | BToB
+   | AToA
+   deriving ( Eq, Ord, Show )
+
+marshalPixelMapTarget :: PixelMapTarget -> GLenum
+marshalPixelMapTarget x = case x of
+   IToI -> GL_PIXEL_MAP_I_TO_I
+   SToS -> GL_PIXEL_MAP_S_TO_S
+   IToR -> GL_PIXEL_MAP_I_TO_R
+   IToG -> GL_PIXEL_MAP_I_TO_G
+   IToB -> GL_PIXEL_MAP_I_TO_B
+   IToA -> GL_PIXEL_MAP_I_TO_A
+   RToR -> GL_PIXEL_MAP_R_TO_R
+   GToG -> GL_PIXEL_MAP_G_TO_G
+   BToB -> GL_PIXEL_MAP_B_TO_B
+   AToA -> GL_PIXEL_MAP_A_TO_A
+
+pixelMapTargetToGetPName :: PixelMapTarget -> PName1I
+pixelMapTargetToGetPName x = case x of
+   IToI -> GetPixelMapIToISize
+   SToS -> GetPixelMapSToSSize
+   IToR -> GetPixelMapIToRSize
+   IToG -> GetPixelMapIToGSize
+   IToB -> GetPixelMapIToBSize
+   IToA -> GetPixelMapIToASize
+   RToR -> GetPixelMapRToRSize
+   GToG -> GetPixelMapGToGSize
+   BToB -> GetPixelMapBToBSize
+   AToA -> GetPixelMapAToASize
+
+--------------------------------------------------------------------------------
+
+maxPixelMapTable :: GettableStateVar GLsizei
+maxPixelMapTable = makeGettableStateVar $ getSizei1 id GetMaxPixelMapTable
+
+--------------------------------------------------------------------------------
+
+class Storable c => PixelMapComponent c where
+   getPixelMapv :: GLenum -> Ptr c -> IO ()
+   pixelMapv :: GLenum -> GLsizei -> Ptr c -> IO ()
+
+instance PixelMapComponent GLushort where
+   getPixelMapv = glGetPixelMapusv
+   pixelMapv = glPixelMapusv
+
+instance PixelMapComponent GLuint where
+   getPixelMapv = glGetPixelMapuiv
+   pixelMapv = glPixelMapuiv
+
+instance PixelMapComponent GLfloat where
+   getPixelMapv = glGetPixelMapfv
+   pixelMapv = glPixelMapfv
+
+--------------------------------------------------------------------------------
+
+class PixelMap m where
+   withNewPixelMap ::
+      PixelMapComponent c => Int -> (Ptr c -> IO ()) -> IO (m c)
+   withPixelMap ::
+      PixelMapComponent c => m c -> (Int -> Ptr c -> IO a) -> IO a
+   newPixelMap :: PixelMapComponent c => [c] -> IO (m c)
+   getPixelMapComponents :: PixelMapComponent c => m c -> IO [c]
+
+   withNewPixelMap size act =
+      allocaArray size $ \p -> do
+         act p
+         components <- peekArray size p
+         newPixelMap components
+
+   withPixelMap m act = do
+      components <- getPixelMapComponents m
+      withArrayLen components act
+
+   newPixelMap elements =
+      withNewPixelMap (length elements) $ flip pokeArray elements
+
+   getPixelMapComponents m =
+      withPixelMap m peekArray
+
+--------------------------------------------------------------------------------
+
+data GLpixelmap a = GLpixelmap Int (ForeignPtr a)
+   deriving ( Eq, Ord, Show )
+
+instance PixelMap GLpixelmap where
+   withNewPixelMap size f = do
+      fp <- mallocForeignPtrArray size
+      withForeignPtr fp f
+      return $ GLpixelmap size fp
+
+   withPixelMap (GLpixelmap size fp) f = withForeignPtr fp (f size)
+
+--------------------------------------------------------------------------------
+
+pixelMap :: (PixelMap m, PixelMapComponent c) => PixelMapTarget -> StateVar (m c)
+pixelMap pm =
+   makeStateVar
+      (do size <- pixelMapSize pm
+          withNewPixelMap size $ getPixelMapv (marshalPixelMapTarget pm))
+      (\theMap -> withPixelMap theMap $ pixelMapv (marshalPixelMapTarget pm) . fromIntegral)
+
+pixelMapSize :: PixelMapTarget -> IO Int
+pixelMapSize = getInteger1 fromIntegral . pixelMapTargetToGetPName
+
+--------------------------------------------------------------------------------
+
+-- | Convenience state variable
+
+pixelMapIToRGBA :: PixelMapComponent c => StateVar [Color4 c]
+pixelMapIToRGBA = pixelMapXToY (IToR, IToG, IToB, IToA)
+
+-- | Convenience state variable
+
+pixelMapRGBAToRGBA :: PixelMapComponent c => StateVar [Color4 c]
+pixelMapRGBAToRGBA = pixelMapXToY (RToR, GToG, BToB, AToA)
+
+pixelMapXToY :: PixelMapComponent c =>
+      (PixelMapTarget, PixelMapTarget, PixelMapTarget, PixelMapTarget)
+   -> StateVar [Color4 c]
+pixelMapXToY targets =
+   makeStateVar (getPixelMapXToY targets) (setPixelMapXToY targets)
+
+getPixelMapXToY :: PixelMapComponent c
+   => (PixelMapTarget, PixelMapTarget, PixelMapTarget, PixelMapTarget)
+   -> IO [Color4 c]
+getPixelMapXToY (toR, toG, toB, toA) = do
+   withPixelMapFor toR $ \sizeR bufR ->
+      withPixelMapFor toG $ \sizeG bufG ->
+         withPixelMapFor toB $ \sizeB bufB ->
+            withPixelMapFor toA $ \sizeA bufA -> do
+               let maxSize = sizeR `max` sizeG `max` sizeB `max` sizeA
+               r <- sample sizeR bufR maxSize
+               g <- sample sizeR bufG maxSize
+               b <- sample sizeR bufB maxSize
+               a <- sample sizeR bufA maxSize
+               return $ zipWith4 Color4 r g b a
+
+withPixelMapFor ::
+    PixelMapComponent c => PixelMapTarget -> (Int -> Ptr c -> IO a) -> IO a
+withPixelMapFor target f = do
+    theMap <- get (pixelMap target)
+    withGLpixelmap theMap f
+
+withGLpixelmap :: PixelMapComponent c
+               => GLpixelmap c -> (Int -> Ptr c -> IO a) -> IO a
+withGLpixelmap = withPixelMap
+
+sample :: Storable a => Int -> Ptr a -> Int -> IO [a]
+sample len ptr newLen = f (fromIntegral (newLen - 1)) []
+   where scale :: Float
+         scale = fromIntegral len / fromIntegral newLen
+         f l acc | l < 0     = return acc
+                 | otherwise = do e <- peekElemOff ptr (truncate (l * scale))
+                                  f (l - 1) (e : acc)
+
+setPixelMapXToY :: PixelMapComponent c
+   => (PixelMapTarget, PixelMapTarget, PixelMapTarget, PixelMapTarget)
+   -> [Color4 c] -> IO ()
+setPixelMapXToY (toR, toG, toB, toA) colors = do
+   (pixelMap toR $=) =<< newGLpixelmap [ r | Color4 r _ _ _ <- colors ]
+   (pixelMap toG $=) =<< newGLpixelmap [ g | Color4 _ g _ _ <- colors ]
+   (pixelMap toB $=) =<< newGLpixelmap [ b | Color4 _ _ b _ <- colors ]
+   (pixelMap toA $=) =<< newGLpixelmap [ a | Color4 _ _ _ a <- colors ]
+
+newGLpixelmap :: PixelMapComponent c => [c] -> IO (GLpixelmap c)
+newGLpixelmap = newPixelMap
diff --git a/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/PixelStorage.hs b/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/PixelStorage.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/PixelStorage.hs
@@ -0,0 +1,118 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.PixelRectangles.PixelStorage
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 3.6.1 (Pixel Storage Modes) of the
+-- OpenGL 2.1 specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.PixelRectangles.PixelStorage (
+   PixelStoreDirection(..), swapBytes, lsbFirst, rowLength, skipRows,
+   skipPixels, rowAlignment, imageHeight, skipImages
+) where
+
+import Data.StateVar
+import Graphics.Rendering.OpenGL.GL.GLboolean
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+data PixelStoreDirection =
+     Pack
+   | Unpack
+   deriving ( Eq, Ord, Show )
+
+--------------------------------------------------------------------------------
+
+data PixelStore =
+     UnpackSwapBytes
+   | UnpackLSBFirst
+   | UnpackRowLength
+   | UnpackSkipRows
+   | UnpackSkipPixels
+   | UnpackAlignment
+   | PackSwapBytes
+   | PackLSBFirst
+   | PackRowLength
+   | PackSkipRows
+   | PackSkipPixels
+   | PackAlignment
+   | PackSkipImages
+   | PackImageHeight
+   | UnpackSkipImages
+   | UnpackImageHeight
+
+marshalPixelStore :: PixelStore -> GLenum
+marshalPixelStore x = case x of
+   UnpackSwapBytes -> GL_UNPACK_SWAP_BYTES
+   UnpackLSBFirst -> GL_UNPACK_LSB_FIRST
+   UnpackRowLength -> GL_UNPACK_ROW_LENGTH
+   UnpackSkipRows -> GL_UNPACK_SKIP_ROWS
+   UnpackSkipPixels -> GL_UNPACK_SKIP_PIXELS
+   UnpackAlignment -> GL_UNPACK_ALIGNMENT
+   PackSwapBytes -> GL_PACK_SWAP_BYTES
+   PackLSBFirst -> GL_PACK_LSB_FIRST
+   PackRowLength -> GL_PACK_ROW_LENGTH
+   PackSkipRows -> GL_PACK_SKIP_ROWS
+   PackSkipPixels -> GL_PACK_SKIP_PIXELS
+   PackAlignment -> GL_PACK_ALIGNMENT
+   PackSkipImages -> GL_PACK_SKIP_IMAGES
+   PackImageHeight -> GL_PACK_IMAGE_HEIGHT
+   UnpackSkipImages -> GL_UNPACK_SKIP_IMAGES
+   UnpackImageHeight -> GL_UNPACK_IMAGE_HEIGHT
+
+--------------------------------------------------------------------------------
+
+swapBytes :: PixelStoreDirection -> StateVar Bool
+swapBytes Pack   = pixelStoreb GetPackSwapBytes PackSwapBytes
+swapBytes Unpack = pixelStoreb GetUnpackSwapBytes UnpackSwapBytes
+
+lsbFirst :: PixelStoreDirection -> StateVar Bool
+lsbFirst Pack   = pixelStoreb GetPackLSBFirst PackLSBFirst
+lsbFirst Unpack = pixelStoreb GetUnpackLSBFirst UnpackLSBFirst
+
+rowLength :: PixelStoreDirection -> StateVar GLint
+rowLength Pack   = pixelStorei GetPackRowLength PackRowLength
+rowLength Unpack = pixelStorei GetUnpackRowLength UnpackRowLength
+
+skipRows :: PixelStoreDirection -> StateVar GLint
+skipRows Pack   = pixelStorei GetPackSkipRows PackSkipRows
+skipRows Unpack = pixelStorei GetUnpackSkipRows UnpackSkipRows
+
+skipPixels :: PixelStoreDirection -> StateVar GLint
+skipPixels Pack   = pixelStorei GetPackSkipPixels PackSkipPixels
+skipPixels Unpack = pixelStorei GetUnpackSkipPixels UnpackSkipPixels
+
+rowAlignment :: PixelStoreDirection -> StateVar GLint
+rowAlignment Pack   = pixelStorei GetPackAlignment PackAlignment
+rowAlignment Unpack = pixelStorei GetUnpackAlignment UnpackAlignment
+
+imageHeight :: PixelStoreDirection -> StateVar GLint
+imageHeight Pack   = pixelStorei GetPackImageHeight PackImageHeight
+imageHeight Unpack = pixelStorei GetUnpackImageHeight UnpackImageHeight
+
+skipImages :: PixelStoreDirection -> StateVar GLint
+skipImages Pack   = pixelStorei GetPackSkipImages PackSkipImages
+skipImages Unpack = pixelStorei GetUnpackSkipImages UnpackSkipImages
+
+--------------------------------------------------------------------------------
+
+pixelStoreb :: PName1I -> PixelStore -> StateVar Bool
+pixelStoreb pn ps =
+   makeStateVar
+      (getBoolean1 unmarshalGLboolean pn)
+      (glPixelStorei (marshalPixelStore ps) . marshalGLboolean)
+
+pixelStorei :: PName1I -> PixelStore -> StateVar GLint
+pixelStorei pn ps =
+   makeStateVar
+      (getInteger1 id pn)
+      (glPixelStorei (marshalPixelStore ps))
diff --git a/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/PixelTransfer.hs b/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/PixelTransfer.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/PixelTransfer.hs
@@ -0,0 +1,233 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.PixelRectangles.PixelTransfer
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to a part of section 3.6.1 (Pixel Storage Modes) of
+-- the OpenGL 2.1 specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.PixelRectangles.PixelTransfer (
+   PixelTransferStage(..),
+   mapColor, mapStencil, indexShift, indexOffset, depthScale, depthBias,
+   rgbaScale, rgbaBias
+) where
+
+import Data.StateVar
+import Graphics.Rendering.OpenGL.GL.Capability
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.Rendering.OpenGL.GL.VertexSpec
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+data PixelTransfer =
+     MapColor
+   | MapStencil
+   | IndexShift
+   | IndexOffset
+   | RedScale
+   | RedBias
+   | GreenScale
+   | GreenBias
+   | BlueScale
+   | BlueBias
+   | AlphaScale
+   | AlphaBias
+   | DepthScale
+   | DepthBias
+   | PostConvolutionRedScale
+   | PostConvolutionGreenScale
+   | PostConvolutionBlueScale
+   | PostConvolutionAlphaScale
+   | PostConvolutionRedBias
+   | PostConvolutionGreenBias
+   | PostConvolutionBlueBias
+   | PostConvolutionAlphaBias
+   | PostColorMatrixRedScale
+   | PostColorMatrixGreenScale
+   | PostColorMatrixBlueScale
+   | PostColorMatrixAlphaScale
+   | PostColorMatrixRedBias
+   | PostColorMatrixGreenBias
+   | PostColorMatrixBlueBias
+   | PostColorMatrixAlphaBias
+
+marshalPixelTransfer :: PixelTransfer -> GLenum
+marshalPixelTransfer x = case x of
+   MapColor -> GL_MAP_COLOR
+   MapStencil -> GL_MAP_STENCIL
+   IndexShift -> GL_INDEX_SHIFT
+   IndexOffset -> GL_INDEX_OFFSET
+   RedScale -> GL_RED_SCALE
+   RedBias -> GL_RED_BIAS
+   GreenScale -> GL_GREEN_SCALE
+   GreenBias -> GL_GREEN_BIAS
+   BlueScale -> GL_BLUE_SCALE
+   BlueBias -> GL_BLUE_BIAS
+   AlphaScale -> GL_ALPHA_SCALE
+   AlphaBias -> GL_ALPHA_BIAS
+   DepthScale -> GL_DEPTH_SCALE
+   DepthBias -> GL_DEPTH_BIAS
+   PostConvolutionRedScale -> GL_POST_CONVOLUTION_RED_SCALE
+   PostConvolutionGreenScale -> GL_POST_CONVOLUTION_GREEN_SCALE
+   PostConvolutionBlueScale -> GL_POST_CONVOLUTION_BLUE_SCALE
+   PostConvolutionAlphaScale -> GL_POST_CONVOLUTION_ALPHA_SCALE
+   PostConvolutionRedBias -> GL_POST_CONVOLUTION_RED_BIAS
+   PostConvolutionGreenBias -> GL_POST_CONVOLUTION_GREEN_BIAS
+   PostConvolutionBlueBias -> GL_POST_CONVOLUTION_BLUE_BIAS
+   PostConvolutionAlphaBias -> GL_POST_CONVOLUTION_ALPHA_BIAS
+   PostColorMatrixRedScale -> GL_POST_COLOR_MATRIX_RED_SCALE
+   PostColorMatrixGreenScale -> GL_POST_COLOR_MATRIX_GREEN_SCALE
+   PostColorMatrixBlueScale -> GL_POST_COLOR_MATRIX_BLUE_SCALE
+   PostColorMatrixAlphaScale -> GL_POST_COLOR_MATRIX_ALPHA_SCALE
+   PostColorMatrixRedBias -> GL_POST_COLOR_MATRIX_RED_BIAS
+   PostColorMatrixGreenBias -> GL_POST_COLOR_MATRIX_GREEN_BIAS
+   PostColorMatrixBlueBias -> GL_POST_COLOR_MATRIX_BLUE_BIAS
+   PostColorMatrixAlphaBias -> GL_POST_COLOR_MATRIX_ALPHA_BIAS
+
+--------------------------------------------------------------------------------
+
+data PixelTransferStage =
+     PreConvolution
+   | PostConvolution
+   | PostColorMatrix
+   deriving ( Eq, Ord, Show )
+
+stageToGetScales ::
+      PixelTransferStage
+   -> (PName1F, PName1F, PName1F, PName1F)
+stageToGetScales s = case s of
+   PreConvolution  -> (GetRedScale,
+                       GetGreenScale,
+                       GetBlueScale,
+                       GetAlphaScale)
+   PostConvolution -> (GetPostConvolutionRedScale,
+                       GetPostConvolutionGreenScale,
+                       GetPostConvolutionBlueScale,
+                       GetPostConvolutionAlphaScale)
+   PostColorMatrix -> (GetPostColorMatrixRedScale,
+                       GetPostColorMatrixGreenScale,
+                       GetPostColorMatrixBlueScale,
+                       GetPostColorMatrixAlphaScale)
+
+stageToSetScales ::
+      PixelTransferStage
+   -> (PixelTransfer, PixelTransfer, PixelTransfer, PixelTransfer)
+stageToSetScales s = case s of
+   PreConvolution  -> (RedScale,
+                       GreenScale,
+                       BlueScale,
+                       AlphaScale)
+   PostConvolution -> (PostConvolutionRedScale,
+                       PostConvolutionGreenScale,
+                       PostConvolutionBlueScale,
+                       PostConvolutionAlphaScale)
+   PostColorMatrix -> (PostColorMatrixRedScale,
+                       PostColorMatrixGreenScale,
+                       PostColorMatrixBlueScale,
+                       PostColorMatrixAlphaScale)
+
+stageToGetBiases ::
+      PixelTransferStage
+   -> (PName1F, PName1F, PName1F, PName1F)
+stageToGetBiases s = case s of
+   PreConvolution  -> (GetRedBias,
+                       GetGreenBias,
+                       GetBlueBias,
+                       GetAlphaBias)
+   PostConvolution -> (GetPostConvolutionRedBias,
+                       GetPostConvolutionGreenBias,
+                       GetPostConvolutionBlueBias,
+                       GetPostConvolutionAlphaBias)
+   PostColorMatrix -> (GetPostColorMatrixRedBias,
+                       GetPostColorMatrixGreenBias,
+                       GetPostColorMatrixBlueBias,
+                       GetPostColorMatrixAlphaBias)
+
+stageToSetBiases ::
+      PixelTransferStage
+   -> (PixelTransfer, PixelTransfer, PixelTransfer, PixelTransfer)
+stageToSetBiases s = case s of
+   PreConvolution  -> (RedBias,
+                       GreenBias,
+                       BlueBias,
+                       AlphaBias)
+   PostConvolution -> (PostConvolutionRedBias,
+                       PostConvolutionGreenBias,
+                       PostConvolutionBlueBias,
+                       PostConvolutionAlphaBias)
+   PostColorMatrix -> (PostColorMatrixRedBias,
+                       PostColorMatrixGreenBias,
+                       PostColorMatrixBlueBias,
+                       PostColorMatrixAlphaBias)
+
+--------------------------------------------------------------------------------
+
+mapColor :: StateVar Capability
+mapColor = pixelTransferb GetMapColor MapColor
+
+mapStencil :: StateVar Capability
+mapStencil = pixelTransferb GetMapStencil MapStencil
+
+indexShift :: StateVar GLint
+indexShift = pixelTransferi GetIndexShift IndexShift
+
+indexOffset :: StateVar GLint
+indexOffset = pixelTransferi GetIndexOffset IndexOffset
+
+depthScale :: StateVar GLfloat
+depthScale = pixelTransferf GetDepthScale DepthScale
+
+depthBias :: StateVar GLfloat
+depthBias = pixelTransferf GetDepthBias DepthBias
+
+rgbaScale :: PixelTransferStage -> StateVar (Color4 GLfloat)
+rgbaScale s = pixelTransfer4f (stageToGetScales s) (stageToSetScales s)
+
+rgbaBias :: PixelTransferStage -> StateVar (Color4 GLfloat)
+rgbaBias s = pixelTransfer4f (stageToGetBiases s) (stageToSetBiases s)
+
+--------------------------------------------------------------------------------
+
+pixelTransferb :: GetPName1I p => p -> PixelTransfer -> StateVar Capability
+pixelTransferb pn pt =
+   makeStateVar
+      (getBoolean1 unmarshalCapability pn)
+      (glPixelTransferi (marshalPixelTransfer pt) .
+       fromIntegral . marshalCapability)
+
+pixelTransferi :: GetPName1I p => p -> PixelTransfer -> StateVar GLint
+pixelTransferi pn pt =
+   makeStateVar
+      (getInteger1 id pn)
+      (glPixelTransferi (marshalPixelTransfer pt))
+
+pixelTransferf :: GetPName1F p => p -> PixelTransfer -> StateVar GLfloat
+pixelTransferf pn pt =
+   makeStateVar
+      (getFloat1 id pn)
+      (glPixelTransferf (marshalPixelTransfer pt))
+
+pixelTransfer4f :: GetPName1F p =>
+      (p, p, p, p)
+   -> (PixelTransfer, PixelTransfer, PixelTransfer, PixelTransfer)
+   -> StateVar (Color4 GLfloat)
+pixelTransfer4f (pr, pg, pb, pa) (tr, tg, tb, ta) = makeStateVar get4f set4f
+   where get4f = do
+            r <- getFloat1 id pr
+            g <- getFloat1 id pg
+            b <- getFloat1 id pb
+            a <- getFloat1 id pa
+            return $ Color4 r g b a
+         set4f (Color4 r g b a) = do
+            glPixelTransferf (marshalPixelTransfer tr) r
+            glPixelTransferf (marshalPixelTransfer tg) g
+            glPixelTransferf (marshalPixelTransfer tb) b
+            glPixelTransferf (marshalPixelTransfer ta) a
diff --git a/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/Rasterization.hs b/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/Rasterization.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/Rasterization.hs
@@ -0,0 +1,39 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.PixelRectangles.Rasterization
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+-- 
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to a part of section 3.6.4 (Rasterization of Pixel
+-- Rectangles) of the OpenGL 2.1 specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.PixelRectangles.Rasterization (
+   PixelData(..), PixelFormat(..), drawPixels, pixelZoom
+) where
+
+import Control.Monad
+import Data.StateVar
+import Graphics.Rendering.OpenGL.GL.CoordTrans
+import Graphics.Rendering.OpenGL.GL.PixelData
+import Graphics.Rendering.OpenGL.GL.PixelFormat
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+drawPixels :: Size -> PixelData a -> IO ()
+drawPixels (Size w h) pd = withPixelData pd $ glDrawPixels w h
+
+--------------------------------------------------------------------------------
+
+pixelZoom :: StateVar (GLfloat, GLfloat)
+pixelZoom =
+   makeStateVar
+      (liftM2 (,) (getFloat1 id GetZoomX) (getFloat1 id GetZoomY))
+      (uncurry glPixelZoom)
diff --git a/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/Reset.hs b/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/Reset.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/Reset.hs
@@ -0,0 +1,31 @@
+{-# OPTIONS_HADDOCK hide #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.PixelRectangles.Reset
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+-- 
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This is a purely internal module for (un-)marshaling Reset.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.PixelRectangles.Reset (
+   Reset(..), marshalReset
+) where
+
+import Graphics.Rendering.OpenGL.GL.GLboolean
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+data Reset =
+     NoReset
+   | Reset
+   deriving ( Eq, Ord, Show )
+
+marshalReset :: Reset -> GLboolean
+marshalReset x = marshalGLboolean (x == Reset)
diff --git a/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/Sink.hs b/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/Sink.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/PixelRectangles/Sink.hs
@@ -0,0 +1,34 @@
+{-# OPTIONS_HADDOCK hide #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.PixelRectangles.Sink
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+-- 
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This is a purely internal module for (un-)marshaling Sink.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.PixelRectangles.Sink (
+   Sink(..), marshalSink, unmarshalSink
+) where
+
+import Graphics.Rendering.OpenGL.GL.GLboolean
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+data Sink =
+     PassThrough
+   | Sink
+   deriving ( Eq, Ord, Show )
+
+marshalSink :: Sink -> GLboolean
+marshalSink x = marshalGLboolean (x == Sink)
+
+unmarshalSink :: GLint -> Sink
+unmarshalSink s = if unmarshalGLboolean s then Sink else PassThrough
diff --git a/src/Graphics/Rendering/OpenGL/GL/PixellikeObject.hs b/src/Graphics/Rendering/OpenGL/GL/PixellikeObject.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/PixellikeObject.hs
@@ -0,0 +1,82 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.PixellikeObject
+-- Copyright   :  (c) Sven Panne 2011-2019, Lars Corbijn 2011-2016
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-----------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.PixellikeObject (
+  PixellikeObjectGetPName(..),
+  PixellikeObjectTarget(pixellikeObjTarParam),
+) where
+
+import Data.StateVar
+import Foreign.Marshal.Utils
+import Graphics.Rendering.OpenGL.GL.FramebufferObjects.FramebufferObjectAttachment
+import Graphics.Rendering.OpenGL.GL.FramebufferObjects.FramebufferTarget
+import Graphics.Rendering.OpenGL.GL.FramebufferObjects.RenderbufferTarget
+import Graphics.Rendering.OpenGL.GL.PeekPoke
+import Graphics.Rendering.OpenGL.GL.Texturing.Specification
+import Graphics.Rendering.OpenGL.GL.Texturing.TextureTarget
+import Graphics.GL
+
+-----------------------------------------------------------------------------
+
+data PixellikeObjectGetPName =
+     RedSize
+   | BlueSize
+   | GreenSize
+   | AlphaSize
+   | DepthSize
+   | StencilSize
+
+class PixellikeObjectTarget t where
+   --dummy t to include it in the type class
+   marshalPixellikeOT :: t -> PixellikeObjectGetPName -> GLenum
+   pixObjTarQueryFunc :: t -> GLenum -> IO GLint
+   pixellikeObjTarParam :: t -> PixellikeObjectGetPName -> GettableStateVar GLint
+   pixellikeObjTarParam t p = makeGettableStateVar (pixObjTarQueryFunc t $ marshalPixellikeOT t p)
+
+instance PixellikeObjectTarget RenderbufferTarget where
+   marshalPixellikeOT _ x = case x of
+      RedSize -> GL_RENDERBUFFER_RED_SIZE
+      BlueSize -> GL_RENDERBUFFER_BLUE_SIZE
+      GreenSize -> GL_RENDERBUFFER_GREEN_SIZE
+      AlphaSize -> GL_RENDERBUFFER_ALPHA_SIZE
+      DepthSize -> GL_RENDERBUFFER_DEPTH_SIZE
+      StencilSize -> GL_RENDERBUFFER_STENCIL_SIZE
+   pixObjTarQueryFunc t = getRBParameteriv t id
+
+data FramebufferTargetAttachment =
+    FramebufferTargetAttachment FramebufferTarget FramebufferObjectAttachment
+
+instance PixellikeObjectTarget FramebufferTargetAttachment where
+   marshalPixellikeOT _ x = case x of
+      RedSize -> GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE
+      BlueSize -> GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE
+      GreenSize -> GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE
+      AlphaSize -> GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE
+      DepthSize -> GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE
+      StencilSize -> GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE
+   pixObjTarQueryFunc (FramebufferTargetAttachment fbt fba) =
+      getFBAParameteriv fbt fba id
+
+data TextureTargetFull t = TextureTargetFull t Level
+
+instance QueryableTextureTarget t => PixellikeObjectTarget (TextureTargetFull t) where
+   marshalPixellikeOT _ x = case x of
+      RedSize -> GL_TEXTURE_RED_SIZE
+      BlueSize -> GL_TEXTURE_BLUE_SIZE
+      GreenSize -> GL_TEXTURE_GREEN_SIZE
+      AlphaSize -> GL_TEXTURE_ALPHA_SIZE
+      DepthSize -> GL_TEXTURE_DEPTH_SIZE
+      StencilSize -> GL_TEXTURE_STENCIL_SIZE
+   pixObjTarQueryFunc (TextureTargetFull t level) p =
+      with 0 $ \buf -> do
+      glGetTexLevelParameteriv (marshalQueryableTextureTarget t) level p buf
+      peek1 id buf
diff --git a/src/Graphics/Rendering/OpenGL/GL/PointParameter.hs b/src/Graphics/Rendering/OpenGL/GL/PointParameter.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/PointParameter.hs
@@ -0,0 +1,44 @@
+{-# OPTIONS_HADDOCK hide #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.PointParameter
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+-- 
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This is a purely internal module for setting point parameters.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.PointParameter (
+   PointParameter(..), pointParameterf, pointParameterfv
+) where
+
+import Foreign.Ptr
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+data PointParameter =
+     PointSizeMin
+   | PointSizeMax
+   | PointFadeThresholdSize
+   | PointDistanceAttenuation
+
+marshalPointParameter :: PointParameter -> GLenum
+marshalPointParameter x = case x of
+   PointSizeMin -> GL_POINT_SIZE_MIN
+   PointSizeMax -> GL_POINT_SIZE_MAX
+   PointFadeThresholdSize -> GL_POINT_FADE_THRESHOLD_SIZE
+   PointDistanceAttenuation -> GL_POINT_DISTANCE_ATTENUATION
+
+--------------------------------------------------------------------------------
+
+pointParameterf :: PointParameter -> GLfloat -> IO ()
+pointParameterf = glPointParameterf . marshalPointParameter
+
+pointParameterfv :: PointParameter -> Ptr GLfloat -> IO ()
+pointParameterfv = glPointParameterfv . marshalPointParameter
diff --git a/src/Graphics/Rendering/OpenGL/GL/Points.hs b/src/Graphics/Rendering/OpenGL/GL/Points.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/Points.hs
@@ -0,0 +1,217 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.Points
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+-- 
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 3.3 (Points) of the OpenGL 2.1 specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.Points (
+   -- * Point Rasterization
+   pointSize, vertexProgramPointSize,
+
+   -- * Controlling the Derived Size
+   pointSizeRange, pointDistanceAttenuation,
+
+   -- * Fading Points
+   pointFadeThresholdSize,
+
+   -- * Point Antialiasing
+   pointSmooth,
+
+   -- * Point Sprites
+   pointSprite,
+
+   -- * Implementation-Dependent Limits
+   aliasedPointSizeRange, smoothPointSizeRange, smoothPointSizeGranularity
+) where
+
+import Control.Monad
+import Data.StateVar
+import Foreign.Marshal.Array
+import Graphics.Rendering.OpenGL.GL.Capability
+import Graphics.Rendering.OpenGL.GL.PointParameter
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+-- | 'pointSize' contains the rasterized diameter of both aliased and
+-- antialiased points. The initial value is 1. Using a point size other than 1
+-- has different effects, depending on whether point antialiasing is enabled
+-- (see 'pointSmooth') or point sprites are enabled (see 'pointSprite'). Both
+-- are initially disabled.
+--
+-- The specified point size is multiplied with a distance attenuation factor
+-- and clamped to the specified 'pointSizeRange', and further clamped to the
+-- implementation-dependent point size range to produce the derived point size
+-- using
+--
+-- @   /derivedSize/ = /clamp/ (/size/ * /sqrt/ (1 \/ (/a/ + /b/ * /d/ + /c/ * /d/^2)))@
+--
+-- where /d/ is the eye-coordinate distance from the eye to the vertex, and /a/,
+-- /b/, and /c/ are the distance attenuation coefficients (see
+-- 'pointDistanceAttenuation').
+--
+-- If multisampling is disabled, the computed point size is used as the point\'s
+-- width.
+--
+-- If multisampling is enabled, the point may be faded by modifying the point
+-- alpha value (see 'Graphics.Rendering.OpenGL.GL.PerFragment.sampleCoverage')
+-- instead of allowing the point width to go below a given
+-- 'pointFadeThresholdSize'. In this case, the width is further modified in
+-- the following manner:
+--
+-- @   /width/ = if /derivedSize/ >= /threshold/ then /derivedSize/ else /threshold/@
+--
+-- The point alpha value is modified by computing:
+--
+-- @   /alpha/ = if /derivedSize/ >= /threshold/ then 1 else (/derivedSize/ \/ /threshold/)^2@
+--
+-- If point antialiasing is disabled, the actual size is determined by rounding
+-- the supplied size to the nearest integer. (If the rounding results in the
+-- value 0, it is as if the point size were 1.) If the rounded size is odd,
+-- then the center point (/x/, /y/) of the pixel fragment that represents
+-- the point is computed as
+--
+-- @   (/x/, /y/) = (/floor/ /xw/ + 0.5, /floor/ /yw/ + 0.5)@
+--
+-- where /xw/ and /yw/ indicate window coordinates. All pixels that lie within
+-- the square grid of the rounded size centered at (/x/, /y/) make up the
+-- fragment. If the size is even, the center point is
+--
+-- @   (/x/, /y/) = (/floor/ (/xw/ + 0.5), /floor/ (/yw/ + 0.5))@
+--
+-- and the rasterized fragment\'s centers are the half-integer window
+-- coordinates within the square of the rounded size centered at (/x/, /y/). All
+-- pixel fragments produced in rasterizing a nonantialiased point are assigned
+-- the same associated data, that of the vertex corresponding to the point.
+--
+-- If antialiasing is enabled, then point rasterization produces a fragment for
+-- each pixel square that intersects the region lying within the circle having
+-- diameter equal to the current point size and centered at the point\'s
+-- (/xw/, /yw/). The coverage value for each fragment is the window coordinate
+-- area of the intersection of the circular region with the corresponding pixel
+-- square. This value is saved and used in the final rasterization step. The
+-- data associated with each fragment is the data associated with the point
+-- being rasterized.
+--
+-- Not all sizes are supported when point antialiasing is enabled. If an
+-- unsupported size is requested, the nearest supported size is used.  Only size
+-- 1 is guaranteed to be supported; others depend on the implementation. To
+-- query the range of supported sizes for antialiased points and the size
+-- difference between supported sizes within the range, query
+-- 'smoothPointSizeRange' and 'smoothPointSizeGranularity', respectively. For
+-- aliased points, query the supported range with 'aliasedPointSizeRange'.
+--
+-- The point size specified when 'pointSize' is set is always returned when it
+-- is queried. Clamping and rounding for aliased and antialiased points have no
+-- effect on the specified value.
+--
+-- A non-antialiased point size may be clamped to an implementation-dependent
+-- maximum. Although this maximum cannot be queried, it must be no less than the
+-- maximum value for antialiased points, rounded to the nearest integer value.
+--
+-- An 'Graphics.Rendering.OpenGL.GLU.Errors.InvalidValue' is generated if
+-- 'pointSize' is set to a value less than or equal to zero.
+--
+-- An 'Graphics.Rendering.OpenGL.GLU.Errors.InvalidOperation' is generated if
+-- 'pointSize' is set during
+-- 'Graphics.Rendering.OpenGL.GL.BeginEnd.renderPrimitive'.
+
+pointSize :: StateVar GLfloat
+pointSize = makeStateVar (getFloat1 id GetPointSize) glPointSize
+
+--------------------------------------------------------------------------------
+
+vertexProgramPointSize :: StateVar Capability
+vertexProgramPointSize = makeCapability CapVertexProgramPointSize
+
+--------------------------------------------------------------------------------
+
+-- | The range to which the derived point size is clamped, see 'pointSize'. Note
+-- that the size is further clamped to the implementation-dependent limits, see
+-- 'aliasedPointSizeRange' and 'smoothPointSizeRange'. The initial range is
+-- (0, 1).
+--
+-- An 'Graphics.Rendering.OpenGL.GLU.Errors.InvalidValue' is generated if the
+-- lower or upper bound of the range is set to a value less than zero. If the
+-- lower bound is greater than the upper bound, the point size after clamping is
+-- undefined, but no error is generated.
+
+pointSizeRange :: StateVar (GLfloat, GLfloat)
+pointSizeRange =
+   makeStateVar
+   (liftM2 (,) (getFloat1 id GetPointSizeMin) (getFloat1 id GetPointSizeMax))
+   (\(sizeMin, sizeMax) -> do pointParameterf PointSizeMin sizeMin
+                              pointParameterf PointSizeMax sizeMax)
+
+--------------------------------------------------------------------------------
+
+-- | The  constant, linear, and quadratic distance attenuation coefficients, see
+-- 'pointSize'. The initial coefficients are (1, 0, 0).
+
+pointDistanceAttenuation :: StateVar (GLfloat, GLfloat, GLfloat)
+pointDistanceAttenuation =
+   makeStateVar
+      (getFloat3 (,,) GetPointDistanceAttenuation)
+      (\(a, b, c) -> withArray [a, b, c] $
+                        pointParameterfv PointDistanceAttenuation)
+
+--------------------------------------------------------------------------------
+
+-- | The threshold for alpha attenuation of points when multisampling is used,
+-- see 'pointSize'. The initial threshold is 1.
+--
+-- An 'Graphics.Rendering.OpenGL.GLU.Errors.InvalidValue' is generated if the
+-- threshold is set to a value less than zero.
+
+pointFadeThresholdSize :: StateVar GLfloat
+pointFadeThresholdSize =
+   makeStateVar
+      (getFloat1 id GetPointFadeThresholdSize)
+      (pointParameterf PointFadeThresholdSize)
+
+--------------------------------------------------------------------------------
+
+-- | Controls whether point antialiasing is enabled. The initial state is
+-- 'Graphics.Rendering.OpenGL.GL.Capability.Disabled'.
+
+pointSmooth :: StateVar Capability
+pointSmooth = makeCapability CapPointSmooth
+
+--------------------------------------------------------------------------------
+
+-- | Controls whether point sprites are enabled. The initial state is
+-- 'Graphics.Rendering.OpenGL.GL.Capability.Disabled'. When point sprites are
+-- enabled, the state of point antialiasing (i.e. 'pointSmooth') is ignored.
+
+pointSprite :: StateVar Capability
+pointSprite = makeCapability CapPointSprite
+
+--------------------------------------------------------------------------------
+
+-- | The smallest and largest supported size of aliased points.
+
+aliasedPointSizeRange :: GettableStateVar (GLfloat, GLfloat)
+aliasedPointSizeRange =
+   makeGettableStateVar $ getFloat2 (,) GetAliasedPointSizeRange
+
+-- | The smallest and largest supported size of antialiased points.
+
+smoothPointSizeRange :: GettableStateVar (GLfloat, GLfloat)
+smoothPointSizeRange =
+   makeGettableStateVar $ getFloat2 (,) GetSmoothPointSizeRange
+
+-- | The antialiased point size granularity, i.e. the size difference between
+-- supported sizes.
+
+smoothPointSizeGranularity :: GettableStateVar GLfloat
+smoothPointSizeGranularity =
+   makeGettableStateVar $ getFloat1 id GetSmoothPointSizeGranularity
diff --git a/src/Graphics/Rendering/OpenGL/GL/PolygonMode.hs b/src/Graphics/Rendering/OpenGL/GL/PolygonMode.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/PolygonMode.hs
@@ -0,0 +1,41 @@
+{-# OPTIONS_HADDOCK hide #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.PolygonMode
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+-- 
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This is a purely internal module for (un-)marshaling PolygonMode.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.PolygonMode (
+   PolygonMode(..), marshalPolygonMode, unmarshalPolygonMode
+) where
+
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+data PolygonMode =
+     Point
+   | Line
+   | Fill
+   deriving ( Eq, Ord, Show )
+
+marshalPolygonMode :: PolygonMode -> GLenum
+marshalPolygonMode x = case x of
+   Point -> GL_POINT
+   Line -> GL_LINE
+   Fill -> GL_FILL
+
+unmarshalPolygonMode :: GLenum -> PolygonMode
+unmarshalPolygonMode x
+   | x == GL_POINT = Point
+   | x == GL_LINE = Line
+   | x == GL_FILL = Fill
+   | otherwise = error ("unmarshalPolygonMode: illegal value " ++ show x)
diff --git a/src/Graphics/Rendering/OpenGL/GL/Polygons.hs b/src/Graphics/Rendering/OpenGL/GL/Polygons.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/Polygons.hs
@@ -0,0 +1,139 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.Polygons
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+-- 
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 3.5 (Polygons) of the OpenGL 2.1 specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.Polygons (
+   polygonSmooth, cullFace,
+   PolygonStipple(..), GLpolygonstipple, polygonStipple,
+   PolygonMode(..), polygonMode, polygonOffset,
+   polygonOffsetPoint, polygonOffsetLine, polygonOffsetFill
+) where
+
+import Control.Monad
+import Data.StateVar
+import Foreign.ForeignPtr
+import Foreign.Marshal.Array
+import Foreign.Ptr
+import Graphics.Rendering.OpenGL.GL.Capability
+import Graphics.Rendering.OpenGL.GL.Face
+import Graphics.Rendering.OpenGL.GL.PixelRectangles
+import Graphics.Rendering.OpenGL.GL.PolygonMode
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.Rendering.OpenGL.GL.SavingState
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+polygonSmooth :: StateVar Capability
+polygonSmooth = makeCapability CapPolygonSmooth
+
+--------------------------------------------------------------------------------
+
+cullFace :: StateVar (Maybe Face)
+cullFace = makeStateVarMaybe (return CapCullFace)
+                             (getEnum1 unmarshalFace GetCullFaceMode)
+                             (glCullFace . marshalFace)
+
+--------------------------------------------------------------------------------
+
+numPolygonStippleBytes :: Int
+numPolygonStippleBytes = 128   -- 32x32 bits divided into GLubytes
+
+class PolygonStipple s where
+   withNewPolygonStipple :: (Ptr GLubyte -> IO ()) -> IO s
+   withPolygonStipple :: s -> (Ptr GLubyte -> IO a) -> IO a
+   newPolygonStipple :: [GLubyte] -> IO s
+   getPolygonStippleComponents :: s -> IO [GLubyte]
+
+   withNewPolygonStipple act =
+      allocaArray numPolygonStippleBytes $ \p -> do
+         act p
+         components <- peekArray numPolygonStippleBytes p
+         newPolygonStipple components
+
+   withPolygonStipple s act = do
+      components <- getPolygonStippleComponents s
+      withArray components act
+
+   newPolygonStipple components =
+      withNewPolygonStipple $
+         flip pokeArray (take numPolygonStippleBytes components)
+
+   getPolygonStippleComponents s =
+      withPolygonStipple s $ peekArray numPolygonStippleBytes
+
+--------------------------------------------------------------------------------
+
+data GLpolygonstipple = GLpolygonstipple (ForeignPtr GLubyte)
+   deriving ( Eq, Ord, Show )
+
+instance PolygonStipple GLpolygonstipple where
+   withNewPolygonStipple f = do
+      fp <- mallocForeignPtrArray numPolygonStippleBytes
+      withForeignPtr fp f
+      return $ GLpolygonstipple fp
+
+   withPolygonStipple (GLpolygonstipple fp) = withForeignPtr fp
+
+--------------------------------------------------------------------------------
+
+polygonStipple :: PolygonStipple s => StateVar (Maybe s)
+polygonStipple =
+   makeStateVarMaybe (return CapPolygonStipple)
+      (withoutGaps Pack $ withNewPolygonStipple glGetPolygonStipple)
+      (\s -> withoutGaps Unpack $ withPolygonStipple s glPolygonStipple)
+
+-- Note: No need to set rowAlignment, our memory allocator always returns a
+-- region which is at least 8-byte aligned (the maximum)
+withoutGaps :: PixelStoreDirection -> IO a -> IO a
+withoutGaps direction action =
+   preservingClientAttrib [ PixelStoreAttributes ] $ do
+      rowLength  direction $= 0
+      skipRows   direction $= 0
+      skipPixels direction $= 0
+      action
+
+--------------------------------------------------------------------------------
+
+polygonMode :: StateVar (PolygonMode, PolygonMode)
+polygonMode = makeStateVar getPolygonMode setPolygonMode
+
+getPolygonMode :: IO (PolygonMode, PolygonMode)
+getPolygonMode = getInteger2 (\front back -> (un front, un back)) GetPolygonMode
+   where un = unmarshalPolygonMode . fromIntegral
+
+setPolygonMode :: (PolygonMode, PolygonMode) -> IO ()
+setPolygonMode (front, back)
+   -- OpenGL 3 deprecated separate polygon draw modes, so try to avoid them.
+   | front == back = setPM FrontAndBack front
+   | otherwise = do setPM Front front; setPM Back back
+   where setPM f m = glPolygonMode (marshalFace f) (marshalPolygonMode m)
+
+--------------------------------------------------------------------------------
+
+polygonOffset :: StateVar (GLfloat, GLfloat)
+polygonOffset =
+   makeStateVar (liftM2 (,) (getFloat1 id GetPolygonOffsetFactor)
+                            (getFloat1 id GetPolygonOffsetUnits))
+                (uncurry glPolygonOffset)
+
+--------------------------------------------------------------------------------
+
+polygonOffsetPoint :: StateVar Capability
+polygonOffsetPoint = makeCapability CapPolygonOffsetPoint
+
+polygonOffsetLine :: StateVar Capability
+polygonOffsetLine = makeCapability CapPolygonOffsetLine
+
+polygonOffsetFill :: StateVar Capability
+polygonOffsetFill = makeCapability CapPolygonOffsetFill
diff --git a/src/Graphics/Rendering/OpenGL/GL/PrimitiveMode.hs b/src/Graphics/Rendering/OpenGL/GL/PrimitiveMode.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/PrimitiveMode.hs
@@ -0,0 +1,123 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.PrimitiveMode
+-- Copyright   :  (c) Sven Panne 2002-2019, Tobias Markus 2016
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 10.1 (Primitive Types) of the OpenGL 4.4
+-- specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.PrimitiveMode (
+   -- * Primitive Modes
+   PrimitiveMode(..),
+   -- * Patches (Tessellation)
+   patchVertices, maxPatchVertices,
+   patchDefaultOuterLevel, patchDefaultInnerLevel, maxTessGenLevel
+) where
+
+import Data.StateVar
+import Foreign.Marshal.Array
+import Graphics.Rendering.OpenGL.GL.PeekPoke
+import Graphics.Rendering.OpenGL.GL.QueryUtils.PName
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+-- | Specification of the way the vertices given during 'renderPrimitive' are
+-- interpreted. In the description of the constructors, /n/ is an integer count
+-- starting at one, and /N/ is the total number of vertices specified.
+
+data PrimitiveMode =
+     Points
+     -- ^ Treats each vertex as a single point. Vertex /n/ defines point /n/.
+     -- /N/ points are drawn.
+   | Lines
+     -- ^ Treats each pair of vertices as an independent line segment. Vertices
+     -- 2/n/-1 and 2/n/ define line /n/. /N/\/2 lines are drawn.
+   | LineLoop
+     -- ^ Draws a connected group of line segments from the first vertex to the
+     -- last, then back to the first. Vertices /n/ and /n/+1 define line /n/.
+     -- The last line, however, is defined by vertices /N/ and 1. /N/ lines
+     -- are drawn.
+   | LineStrip
+     -- ^ Draws a connected group of line  segments from the first vertex to the
+     -- last. Vertices /n/ and /n/+1 define line /n/. /N/-1 lines are drawn.
+   | Triangles
+     -- ^ Treats each triplet of vertices as an independent triangle. Vertices
+     -- /3n-2/, /3n-1/, and /3n/ define triangle /n/. /N\/3/ triangles are drawn.
+   | TriangleStrip
+     -- ^ Draws a connected group of triangles. One triangle is defined for each
+     -- vertex presented after the first two vertices. For odd /n/, vertices
+     -- /n/, /n/+1, and /n/+2 define triangle /n/. For even /n/, vertices /n/+1,
+     -- /n/, and /n/+2 define triangle /n/. /N/-2 triangles are drawn.
+   | TriangleFan
+     -- ^ Draws a connected group of triangles. One triangle is defined for each
+     -- vertex presented after the first two vertices. Vertices 1, /n/+1, and
+     -- /n/+2 define triangle /n/. /N/-2 triangles are drawn.
+   | Quads
+     -- ^ Treats each group of four vertices as an independent quadrilateral.
+     -- Vertices 4/n/-3, 4/n/-2, 4/n/-1, and 4/n/ define quadrilateral /n/.
+     -- /N/\/4 quadrilaterals are drawn.
+   | QuadStrip
+     -- ^ Draws a connected group of quadrilaterals. One quadrilateral is
+     --defined for each pair of vertices presented after the first pair.
+     -- Vertices 2/n/-1, 2/n/, 2/n/+2, and 2/n/+1 define quadrilateral /n/.
+     -- /N/\/2-1 quadrilaterals are drawn. Note that the order in which vertices
+     -- are used to construct a quadrilateral from strip data is different from
+     -- that used with independent data.
+   | Polygon
+     -- ^ Draws a single, convex polygon. Vertices 1 through /N/ define this
+     -- polygon.
+   | Patches
+     -- ^ Only used in conjunction with tessellation. The number of vertices per
+     -- patch can be set with 'patchVertices'.
+   deriving ( Eq, Ord, Show )
+
+-- | 'patchVertices' is the number of vertices per patch primitive.
+--
+-- An 'Graphics.Rendering.OpenGL.GLU.Errors.InvalidValue' is generated if
+-- 'patchVertices' is set to a value less than or equal to zero or greater
+-- than the implementation-dependent maximum value 'maxPatchVertices'.
+
+patchVertices :: StateVar GLsizei
+patchVertices =
+  makeStateVar (getSizei1 id GetPatchVertices)
+               (glPatchParameteri GL_PATCH_VERTICES . fromIntegral)
+
+-- | Contains the maximumum number of vertices in a single patch.
+
+maxPatchVertices :: GettableStateVar GLsizei
+maxPatchVertices = makeGettableStateVar $ getSizei1 id GetMaxPatchVertices
+
+-- | Contains the four default outer tessellation levels to be used when no
+-- tessellation control shader is present.
+
+patchDefaultOuterLevel :: StateVar (GLfloat, GLfloat, GLfloat, GLfloat)
+patchDefaultOuterLevel =
+  makeStateVar
+    (getFloat4 (,,,) GetPatchDefaultOuterLevel)
+    (\(l0, l1, l2, l3) -> allocaArray 4 $ \ptr -> do
+                            poke4 ptr l0 l1 l2 l3
+                            glPatchParameterfv GL_PATCH_DEFAULT_OUTER_LEVEL ptr)
+
+-- | Contains the two default inner tessellation levels to be used when no
+-- tessellation control shader is present.
+
+patchDefaultInnerLevel :: StateVar (GLfloat, GLfloat)
+patchDefaultInnerLevel =
+  makeStateVar
+    (getFloat2 (,) GetPatchDefaultInnerLevel)
+    (\(l0, l1) -> allocaArray 2 $ \ptr -> do
+                    poke2 ptr l0 l1
+                    glPatchParameterfv GL_PATCH_DEFAULT_INNER_LEVEL ptr)
+
+-- | Contains the maximum allowed tessellation level.
+
+maxTessGenLevel :: GettableStateVar GLsizei
+maxTessGenLevel = makeGettableStateVar $ getSizei1 id GetMaxTessGenLevel
diff --git a/src/Graphics/Rendering/OpenGL/GL/PrimitiveModeInternal.hs b/src/Graphics/Rendering/OpenGL/GL/PrimitiveModeInternal.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/PrimitiveModeInternal.hs
@@ -0,0 +1,52 @@
+{-# OPTIONS_HADDOCK hide #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.PrimitiveModeInternal
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This is a purely internal module for (un-)marshaling PrimitiveMode.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.PrimitiveModeInternal (
+   marshalPrimitiveMode, unmarshalPrimitiveMode
+) where
+
+import Graphics.GL
+import Graphics.Rendering.OpenGL.GL.PrimitiveMode
+
+--------------------------------------------------------------------------------
+
+marshalPrimitiveMode :: PrimitiveMode -> GLenum
+marshalPrimitiveMode x = case x of
+   Points -> GL_POINTS
+   Lines -> GL_LINES
+   LineLoop -> GL_LINE_LOOP
+   LineStrip -> GL_LINE_STRIP
+   Triangles -> GL_TRIANGLES
+   TriangleStrip -> GL_TRIANGLE_STRIP
+   TriangleFan -> GL_TRIANGLE_FAN
+   Quads -> GL_QUADS
+   QuadStrip -> GL_QUAD_STRIP
+   Polygon -> GL_POLYGON
+   Patches -> GL_PATCHES
+
+unmarshalPrimitiveMode :: GLenum -> PrimitiveMode
+unmarshalPrimitiveMode x
+   | x == GL_POINTS = Points
+   | x == GL_LINES = Lines
+   | x == GL_LINE_LOOP = LineLoop
+   | x == GL_LINE_STRIP = LineStrip
+   | x == GL_TRIANGLES = Triangles
+   | x == GL_TRIANGLE_STRIP = TriangleStrip
+   | x == GL_TRIANGLE_FAN = TriangleFan
+   | x == GL_QUADS = Quads
+   | x == GL_QUAD_STRIP = QuadStrip
+   | x == GL_POLYGON = Polygon
+   | x == GL_PATCHES = Patches
+   | otherwise = error ("unmarshalPrimitiveMode: illegal value " ++ show x)
diff --git a/src/Graphics/Rendering/OpenGL/GL/QueryObject.hs b/src/Graphics/Rendering/OpenGL/GL/QueryObject.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/QueryObject.hs
@@ -0,0 +1,52 @@
+{-# OPTIONS_HADDOCK hide #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.QueryObject
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This is a purely internal module for handling QueryObjects.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.QueryObject (
+   QueryObject(..), noQueryObject
+) where
+
+import Control.Monad.IO.Class
+import Data.ObjectName
+import Foreign.Marshal.Array ( allocaArray, peekArray, withArrayLen )
+import Graphics.Rendering.OpenGL.GL.DebugOutput
+import Graphics.Rendering.OpenGL.GL.GLboolean
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+newtype QueryObject = QueryObject { queryID :: GLuint }
+   deriving ( Eq, Ord, Show )
+
+noQueryObject :: QueryObject
+noQueryObject = QueryObject 0
+
+--------------------------------------------------------------------------------
+
+instance ObjectName QueryObject where
+   isObjectName = liftIO . fmap unmarshalGLboolean . glIsQuery . queryID
+
+   deleteObjectNames queryObjects =
+      liftIO . withArrayLen (map queryID queryObjects) $
+         glDeleteQueries . fromIntegral
+
+instance GeneratableObjectName QueryObject where
+   genObjectNames n =
+      liftIO . allocaArray n $ \buf -> do
+        glGenQueries (fromIntegral n) buf
+        fmap (map QueryObject) $ peekArray n buf
+
+instance CanBeLabeled QueryObject where
+   objectLabel = objectNameLabel GL_QUERY . queryID
diff --git a/src/Graphics/Rendering/OpenGL/GL/QueryObjects.hs b/src/Graphics/Rendering/OpenGL/GL/QueryObjects.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/QueryObjects.hs
@@ -0,0 +1,175 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.QueryObjects
+-- Copyright   :  (c) Sven Panne 2004-2019, Lars Corbijn 2004-2016
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 4.2 (Query Objects and Asynchronous
+-- Queries) of the OpenGL 4.4 specs.
+--
+-----------------------------------------------------------------------------
+
+{-# LANGUAGE TypeSynonymInstances #-}
+
+module Graphics.Rendering.OpenGL.GL.QueryObjects (
+   -- * Creating and Delimiting Queries
+   QueryObject, QueryIndex, maxVertexStreams, QueryTarget(..),
+   beginQuery, endQuery, withQuery,
+
+   -- * Query Target Queries
+   currentQuery, queryCounterBits,
+
+   -- * Query Object Queries
+   queryResultAvailable, QueryResult, queryResult,
+
+   -- * Time Queries
+   timestampQuery, timestamp
+) where
+
+import Data.StateVar
+import Foreign.Marshal.Alloc
+import Foreign.Marshal.Utils
+import Foreign.Ptr
+import Foreign.Storable
+import Graphics.Rendering.OpenGL.GL.Exception
+import Graphics.Rendering.OpenGL.GL.GLboolean
+import Graphics.Rendering.OpenGL.GL.PeekPoke
+import Graphics.Rendering.OpenGL.GL.QueryObject
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+type QueryIndex = GLuint
+
+maxVertexStreams :: GettableStateVar QueryIndex
+maxVertexStreams =
+   makeGettableStateVar (getInteger1 fromIntegral GetMaxVertexStreams)
+
+--------------------------------------------------------------------------------
+
+data QueryTarget =
+     SamplesPassed
+   | AnySamplesPassed
+   | AnySamplesPassedConservative
+   | TimeElapsed
+   | PrimitivesGenerated QueryIndex
+   | TransformFeedbackPrimitivesWritten QueryIndex
+   deriving ( Eq, Ord, Show )
+
+marshalQueryTarget :: QueryTarget -> (GLenum, QueryIndex)
+marshalQueryTarget x = case x of
+   SamplesPassed -> (GL_SAMPLES_PASSED, 0)
+   AnySamplesPassed -> (GL_ANY_SAMPLES_PASSED, 0)
+   AnySamplesPassedConservative -> (GL_ANY_SAMPLES_PASSED_CONSERVATIVE, 0)
+   TimeElapsed -> (GL_TIME_ELAPSED, 0)
+   PrimitivesGenerated n -> (GL_PRIMITIVES_GENERATED, n)
+   TransformFeedbackPrimitivesWritten n ->
+      (GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, n)
+
+--------------------------------------------------------------------------------
+
+beginQuery :: QueryTarget -> QueryObject -> IO ()
+beginQuery target = case marshalQueryTarget target of
+   (t, 0) -> glBeginQuery t . queryID
+   (t, n) -> glBeginQueryIndexed t n . queryID
+
+endQuery :: QueryTarget -> IO ()
+endQuery target = case marshalQueryTarget target of
+   (t, 0) -> glEndQuery t
+   (t, n) -> glEndQueryIndexed t n
+
+-- | Convenience function for an exception-safe combination of 'beginQuery' and
+-- 'endQuery'.
+withQuery :: QueryTarget -> QueryObject -> IO a -> IO a
+withQuery t q = bracket_ (beginQuery t q) (endQuery t)
+
+--------------------------------------------------------------------------------
+
+data GetQueryPName =
+     QueryCounterBits
+   | CurrentQuery
+
+marshalGetQueryPName :: GetQueryPName -> GLenum
+marshalGetQueryPName x = case x of
+   QueryCounterBits -> GL_QUERY_COUNTER_BITS
+   CurrentQuery -> GL_CURRENT_QUERY
+
+--------------------------------------------------------------------------------
+
+currentQuery :: QueryTarget -> GettableStateVar (Maybe QueryObject)
+currentQuery = getQueryi (toMaybeQueryObject . toQueryObject) CurrentQuery
+   where toQueryObject = QueryObject . fromIntegral
+         toMaybeQueryObject q = if q == noQueryObject then Nothing else Just q
+
+queryCounterBits :: QueryTarget -> GettableStateVar GLsizei
+queryCounterBits = getQueryi fromIntegral QueryCounterBits
+
+getQueryi :: (GLint -> a) -> GetQueryPName -> QueryTarget -> GettableStateVar a
+getQueryi f p t =
+   makeGettableStateVar $
+      with 0 $ \buf -> do
+         getQueryiv' t p buf
+         peek1 f buf
+
+getQueryiv' :: QueryTarget -> GetQueryPName -> Ptr GLint -> IO ()
+getQueryiv' target = case marshalQueryTarget target of
+   (t, 0) -> glGetQueryiv t . marshalGetQueryPName
+   (t, n) -> glGetQueryIndexediv t n . marshalGetQueryPName
+
+--------------------------------------------------------------------------------
+
+data GetQueryObjectPName =
+     QueryResultAvailable
+   | QueryResult
+
+marshalGetQueryObjectPName :: GetQueryObjectPName -> GLenum
+marshalGetQueryObjectPName x = case x of
+   QueryResultAvailable -> GL_QUERY_RESULT_AVAILABLE
+   QueryResult -> GL_QUERY_RESULT
+
+--------------------------------------------------------------------------------
+
+queryResultAvailable :: QueryObject -> GettableStateVar Bool
+queryResultAvailable =
+   getQueryObject (unmarshalGLboolean :: GLuint -> Bool) QueryResultAvailable
+
+queryResult :: QueryResult a => QueryObject -> GettableStateVar a
+queryResult = getQueryObject id QueryResult
+
+class Storable a => QueryResult a where
+   getQueryObjectv :: GLuint -> GLenum -> Ptr a -> IO ()
+
+instance QueryResult GLint where getQueryObjectv = glGetQueryObjectiv
+instance QueryResult GLuint where getQueryObjectv = glGetQueryObjectuiv
+instance QueryResult GLint64 where getQueryObjectv = glGetQueryObjecti64v
+instance QueryResult GLuint64 where getQueryObjectv = glGetQueryObjectui64v
+
+getQueryObject :: (QueryResult a)
+               => (a -> b)
+               -> GetQueryObjectPName
+               -> QueryObject
+               -> GettableStateVar b
+getQueryObject f p q =
+   makeGettableStateVar $
+      alloca $ \buf -> do
+         getQueryObjectv (queryID q) (marshalGetQueryObjectPName p) buf
+         peek1 f buf
+
+--------------------------------------------------------------------------------
+
+-- | Record the time after all previous commands on the GL client and server
+-- state and the framebuffer have been fully realized
+
+timestampQuery :: QueryObject -> IO ()
+timestampQuery q = glQueryCounter (queryID q) GL_TIMESTAMP
+
+-- | Contains the GL time after all previous commands have reached the GL server
+-- but have not yet necessarily executed.
+
+timestamp :: GettableStateVar GLuint64
+timestamp = makeGettableStateVar (getInteger64 fromIntegral GetTimestamp)
diff --git a/src/Graphics/Rendering/OpenGL/GL/QueryUtils.hs b/src/Graphics/Rendering/OpenGL/GL/QueryUtils.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/QueryUtils.hs
@@ -0,0 +1,106 @@
+{-# OPTIONS_HADDOCK hide #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.QueryUtils
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This is a purely internal module with utilities to query OpenGL state.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.QueryUtils (
+   module Graphics.Rendering.OpenGL.GL.QueryUtils.PName,
+   module Graphics.Rendering.OpenGL.GL.QueryUtils.VertexAttrib,
+
+   lightIndexToEnum,
+   modelviewIndexToEnum, modelviewEnumToIndex,
+
+   maybeNullPtr,
+
+   objectNameLabel, objectPtrLabel, maxLabelLength
+) where
+
+import Data.StateVar
+import Foreign.C.String ( peekCStringLen, withCStringLen )
+import Foreign.Ptr ( Ptr, nullPtr )
+import Foreign.Marshal.Alloc ( alloca )
+import Foreign.Marshal.Array ( allocaArray )
+import Graphics.Rendering.OpenGL.GL.PeekPoke
+import Graphics.Rendering.OpenGL.GL.QueryUtils.PName
+import Graphics.Rendering.OpenGL.GL.QueryUtils.VertexAttrib
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+-- 0x4000 through 0x4FFF are reserved for light numbers
+
+lightIndexToEnum :: GLsizei -> Maybe GLenum
+lightIndexToEnum i
+   | 0 <= i && i <= maxLightIndex = Just (GL_LIGHT0 + fromIntegral i)
+   | otherwise = Nothing
+
+maxLightIndex :: GLsizei
+maxLightIndex = 0xFFF
+
+--------------------------------------------------------------------------------
+
+-- 0x1700, 0x850a, and 0x8722 through 0x873f are reserved for modelview matrices
+
+modelviewIndexToEnum :: GLsizei -> Maybe GLenum
+modelviewIndexToEnum 0 = Just GL_MODELVIEW
+modelviewIndexToEnum 1 = Just GL_MODELVIEW1_ARB
+modelviewIndexToEnum i
+   | 2 <= i && i <= 31 = Just (GL_MODELVIEW2_ARB - 2 + fromIntegral i)
+   | otherwise = Nothing
+
+modelviewEnumToIndex :: GLenum -> Maybe GLsizei
+modelviewEnumToIndex x
+   | x == GL_MODELVIEW = Just 0
+   | x == GL_MODELVIEW1_ARB = Just 1
+   | GL_MODELVIEW2_ARB <= x && x <= GL_MODELVIEW31_ARB = Just (fromIntegral (x - (GL_MODELVIEW2_ARB - 2)))
+   | otherwise = Nothing
+
+--------------------------------------------------------------------------------
+
+maybeNullPtr :: b -> (Ptr a -> b) -> Ptr a -> b
+maybeNullPtr n f ptr | ptr == nullPtr = n
+                     | otherwise      = f ptr
+
+--------------------------------------------------------------------------------
+
+objectNameLabel :: GLuint -> GLenum -> StateVar (Maybe String)
+objectNameLabel name ident =
+ makeStateVar
+   (getObjectLabelWith (glGetObjectLabel ident name))
+   (setObjectLabelWith (glObjectLabel ident name))
+
+objectPtrLabel :: Ptr () -> StateVar (Maybe String)
+objectPtrLabel ptr =
+  makeStateVar
+    (getObjectLabelWith (glGetObjectPtrLabel ptr))
+    (setObjectLabelWith (glObjectPtrLabel ptr))
+
+getObjectLabelWith :: (GLsizei -> Ptr GLsizei -> Ptr GLchar -> IO ())
+                   -> IO (Maybe String)
+getObjectLabelWith getLabel = do
+  maxLen <- get maxLabelLength
+  alloca $ \lenBuf ->
+    allocaArray (fromIntegral maxLen) $ \labelBuf -> do
+      getLabel maxLen lenBuf labelBuf
+      actualLen <- peek1 fromIntegral lenBuf
+      label <- peekCStringLen (labelBuf, actualLen)
+      return $ if label == "" then Nothing else Just label
+
+setObjectLabelWith :: (GLsizei -> Ptr GLchar -> IO ()) -> Maybe String -> IO ()
+setObjectLabelWith setLabel =
+  maybe (set (nullPtr, (0 :: Int))) (flip withCStringLen set)
+  where set (labelBuf, len) = setLabel (fromIntegral len) labelBuf
+
+maxLabelLength :: GettableStateVar GLsizei
+maxLabelLength =
+  makeGettableStateVar (getSizei1 id GetMaxLabelLength)
diff --git a/src/Graphics/Rendering/OpenGL/GL/QueryUtils/PName.hs b/src/Graphics/Rendering/OpenGL/GL/QueryUtils/PName.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/QueryUtils/PName.hs
@@ -0,0 +1,1278 @@
+{-# OPTIONS_HADDOCK hide #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.QueryUtils.PName
+-- Copyright   :  (c) Sven Panne 2002-2019, Lars Corbijn 2013
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>, Jason Dagit <dagitj@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-----------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.QueryUtils.PName (
+    GetPName(..),
+    GetPName1I(..), GetPName1F(..), GetIPName1I(..),
+    GetPName2I(..), GetPName2F(..),
+    GetPName3I(..), GetPName3F(..),
+    GetPName4I(..), GetPName4F(..), GetIPName4I(..),
+    GetPNameNI(..),
+
+    PName1I(..), PName1F(..), IPName1I(..),
+    PName2I(..), PName2F(..),
+    PName3F(..),
+    PName4I(..), PName4F(..), PName4ISemiIndexed(..),
+    PNameNI(..),
+
+    GetPNameMatrix(..),
+    PNameMatrix(..),
+
+    clipPlaneIndexToEnum,
+
+    GetPointervPName(..), getPointer
+) where
+
+import Foreign.Marshal.Alloc ( alloca )
+import Foreign.Marshal.Array ( allocaArray, peekArray )
+import Foreign.Marshal.Utils ( with )
+import Foreign.Ptr ( Ptr, nullPtr, castPtr )
+import Foreign.Storable ( Storable(peek) )
+import Graphics.Rendering.OpenGL.GL.PeekPoke
+import Graphics.Rendering.OpenGL.GLU.ErrorsInternal
+import Graphics.GL
+
+-----------------------------------------------------------------------------
+
+class GetPName p where
+    marshalGetPName :: p -> Maybe GLenum
+
+-----------------------------------------------------------------------------
+
+getBooleanv :: GetPName p => p-> Ptr GLboolean -> IO ()
+getBooleanv = makeGetter glGetBooleanv
+
+getIntegerv :: GetPName p => p -> Ptr GLint -> IO ()
+getIntegerv = makeGetter glGetIntegerv
+
+getInteger64v :: GetPName p => p -> Ptr GLint64 -> IO ()
+getInteger64v = makeGetter glGetInteger64v
+
+getFloatv :: GetPName p => p -> Ptr GLfloat -> IO ()
+getFloatv = makeGetter glGetFloatv
+
+getDoublev :: GetPName p => p -> Ptr GLdouble -> IO ()
+getDoublev = makeGetter glGetDoublev
+
+-----------------------------------------------------------------------------
+
+getBooleaniv :: GetPName p => p -> GLuint -> Ptr GLboolean -> IO ()
+getBooleaniv p i = makeGetter (\e -> glGetBooleani_v e i) p
+
+getIntegeriv :: GetPName p => p -> GLuint -> Ptr GLint -> IO ()
+getIntegeriv p i =  makeGetter (\e -> glGetIntegeri_v e i) p
+
+getInteger64iv :: GetPName p => p -> GLuint -> Ptr GLint64 -> IO ()
+getInteger64iv p i =  makeGetter (\e -> glGetInteger64i_v e i) p
+
+-----------------------------------------------------------------------------
+
+{-# INLINE makeGetter #-}
+makeGetter :: GetPName p => (GLenum -> Ptr a -> IO ()) -> p -> Ptr a -> IO ()
+makeGetter f = maybe (const recordInvalidEnum) f . marshalGetPName
+
+-----------------------------------------------------------------------------
+
+class GetPName p => GetPName1I p where
+    getBoolean1 :: (GLboolean -> a) -> p -> IO a
+    getBoolean1 = get1 getBooleanv
+
+    getInteger1 :: (GLint -> a) -> p -> IO a
+    getInteger1 = get1 getIntegerv
+
+    getEnum1 :: (GLenum -> a) -> p -> IO a
+    getEnum1 = get1 getIntegerv
+
+    getSizei1 :: (GLsizei -> a) -> p -> IO a
+    getSizei1 = get1 getIntegerv
+
+    getInteger64 :: (GLint64 -> a) -> p -> IO a
+    getInteger64 = get1 getInteger64v
+
+class GetPName p => GetPName1F p where
+    getFloat1 :: (GLfloat -> a) -> p -> IO a
+    getFloat1 = get1 getFloatv
+
+    getClampf1 :: (GLclampf -> a) -> p -> IO a
+    getClampf1 = get1 getFloatv
+
+    getDouble1 :: (GLdouble -> a) -> p -> IO a
+    getDouble1 = get1 getDoublev
+
+    getClampd1 :: (GLclampd -> a) -> p -> IO a
+    getClampd1 = get1 getDoublev
+
+-- | Helper function for the get*1 functions.
+get1 :: (Storable b, Storable c)
+    => (p -> Ptr c -> IO ())
+    -> (b -> a) -- ^ Conversion from the casted value to the return value
+    -> p -> IO a
+get1 g f n = alloca $ \buf -> do
+    g n buf
+    peek1 f (castPtr buf)
+
+class GetPName p => GetIPName1I p where
+    getBoolean1i :: (GLboolean -> a) -> p -> GLuint -> IO a
+    getBoolean1i = get1i getBooleaniv
+
+    getInteger1i :: (GLint -> a) -> p -> GLuint -> IO a
+    getInteger1i = get1i getIntegeriv
+
+    getEnum1i :: (GLenum -> a) -> p -> GLuint -> IO a
+    getEnum1i = get1i getIntegeriv
+
+    getSizei1i :: (GLsizei -> a) -> p -> GLuint -> IO a
+    getSizei1i = get1i getIntegeriv
+
+    getInteger641i :: (GLint64 -> a) -> p -> GLuint -> IO a
+    getInteger641i = get1i getInteger64iv
+
+-- Indexed helper
+get1i :: (Storable b, Storable c)
+    => (p -> GLuint -> Ptr c -> IO ())
+    -> (b -> a) -- ^ Conversion from the casted value to the return value
+    -> p -> GLuint -> IO a
+get1i g f n i = alloca $ \buf -> do
+    g n i buf
+    peek1 f (castPtr buf)
+
+-----------------------------------------------------------------------------
+
+class GetPName p => GetPName2I p where
+    getBoolean2 :: (GLboolean -> GLboolean -> a) -> p -> IO a
+    getBoolean2 = get2 getBooleanv
+
+    getInteger2 :: (GLint -> GLint -> a) -> p -> IO a
+    getInteger2 = get2 getIntegerv
+
+    getEnum2 :: (GLenum -> GLenum -> a) -> p -> IO a
+    getEnum2 = get2 getIntegerv
+
+    getSizei2 :: (GLsizei -> GLsizei -> a) -> p -> IO a
+    getSizei2 = get2 getIntegerv
+
+class GetPName p => GetPName2F p where
+    getFloat2 :: (GLfloat -> GLfloat -> a) -> p -> IO a
+    getFloat2 = get2 getFloatv
+
+    getClampf2 :: (GLclampf -> GLclampf -> a) -> p -> IO a
+    getClampf2 = get2 getFloatv
+
+    getDouble2 :: (GLdouble -> GLdouble -> a) -> p -> IO a
+    getDouble2 = get2 getDoublev
+
+    getClampd2 :: (GLclampd -> GLclampd -> a) -> p -> IO a
+    getClampd2 = get2 getDoublev
+
+-- | Helper function for the get*2 functions.
+get2 :: (Storable b, Storable c)
+    => (p -> Ptr c -> IO ())
+    -> (b -> b -> a) -- ^ Conversion from the casted value to the return value
+    -> p -> IO a
+get2 g f n = allocaArray 2 $ \buf -> do
+    g n buf
+    peek2 f (castPtr buf)
+
+-----------------------------------------------------------------------------
+
+class GetPName p => GetPName3I p where
+    getBoolean3 :: (GLboolean -> GLboolean -> GLboolean -> a) -> p -> IO a
+    getBoolean3 = get3 getBooleanv
+
+    getInteger3 :: (GLint -> GLint -> GLint -> a) -> p -> IO a
+    getInteger3 = get3 getIntegerv
+
+    getEnum3 :: (GLenum -> GLenum -> GLenum -> a) -> p -> IO a
+    getEnum3 = get3 getIntegerv
+
+    getSizei3 :: (GLsizei -> GLsizei -> GLsizei -> a) -> p -> IO a
+    getSizei3 = get3 getIntegerv
+
+class GetPName p => GetPName3F p where
+    getFloat3 :: (GLfloat -> GLfloat -> GLfloat -> a) -> p -> IO a
+    getFloat3 = get3 getFloatv
+
+    getClampf3 :: (GLclampf -> GLclampf -> GLclampf -> a) -> p -> IO a
+    getClampf3 = get3 getFloatv
+
+    getDouble3 :: (GLdouble -> GLdouble -> GLdouble -> a) -> p -> IO a
+    getDouble3 = get3 getDoublev
+
+    getClampd3 :: (GLclampd -> GLclampd -> GLclampd -> a) -> p -> IO a
+    getClampd3 = get3 getDoublev
+
+-- | Helper function for the get*3 functions.
+get3 :: (Storable b, Storable c)
+    => (p -> Ptr c -> IO ())
+    -> (b -> b -> b -> a) -- ^ Conversion from the casted value to the return value
+    -> p -> IO a
+get3 g f n = allocaArray 3 $ \buf -> do
+    g n buf
+    peek3 f (castPtr buf)
+
+-----------------------------------------------------------------------------
+
+class GetPName p => GetPName4I p where
+    getBoolean4 :: (GLboolean -> GLboolean -> GLboolean -> GLboolean -> a) -> p -> IO a
+    getBoolean4 = get4 getBooleanv
+
+    getInteger4 :: (GLint -> GLint -> GLint -> GLint -> a) -> p -> IO a
+    getInteger4 = get4 getIntegerv
+
+    getEnum4 :: (GLenum -> GLenum -> GLenum -> GLenum -> a) -> p -> IO a
+    getEnum4 = get4 getIntegerv
+
+    getSizei4 :: (GLsizei -> GLsizei -> GLsizei -> GLsizei -> a) -> p -> IO a
+    getSizei4 = get4 getIntegerv
+
+class GetPName p => GetPName4F p where
+    getFloat4 :: (GLfloat -> GLfloat -> GLfloat -> GLfloat -> a) -> p -> IO a
+    getFloat4 = get4 getFloatv
+
+    getClampf4 :: (GLclampf -> GLclampf -> GLclampf -> GLclampf -> a) -> p -> IO a
+    getClampf4 = get4 getFloatv
+
+    getDouble4 :: (GLdouble -> GLdouble -> GLdouble -> GLdouble -> a) -> p -> IO a
+    getDouble4 = get4 getDoublev
+
+    getClampd4 :: (GLclampd -> GLclampd -> GLclampd -> GLclampd -> a) -> p -> IO a
+    getClampd4 = get4 getDoublev
+
+-- | Helper function for the get*4 functions.
+get4 :: (Storable b, Storable c)
+    => (p -> Ptr c -> IO ())
+    -> (b -> b -> b -> b -> a) -- ^ Conversion from the casted value to the return value
+    -> p -> IO a
+get4 g f n = allocaArray 4 $ \buf -> do
+    g n buf
+    peek4 f (castPtr buf)
+
+class GetPName p => GetIPName4I p where
+    getBoolean4i :: (GLboolean -> GLboolean -> GLboolean -> GLboolean -> a) -> p -> GLuint -> IO a
+    getBoolean4i = get4i getBooleaniv
+
+    getInteger4i :: (GLint -> GLint -> GLint -> GLint -> a) -> p -> GLuint -> IO a
+    getInteger4i = get4i getIntegeriv
+
+    getEnum4i :: (GLenum -> GLenum -> GLenum -> GLenum -> a) -> p -> GLuint -> IO a
+    getEnum4i = get4i getIntegeriv
+
+    getSizei4i :: (GLsizei -> GLsizei -> GLsizei -> GLsizei -> a) -> p -> GLuint -> IO a
+    getSizei4i = get4i getIntegeriv
+
+-- | Helper function for the get*4 functions.
+get4i :: (Storable b, Storable c)
+    => (p -> GLuint -> Ptr c -> IO ())
+    -> (b -> b -> b -> b -> a) -- ^ Conversion from the casted value to the return value
+    -> p -> GLuint -> IO a
+get4i g f n i = allocaArray 4 $ \buf -> do
+    g n i buf
+    peek4 f (castPtr buf)
+
+class GetPName p => GetPNameNI p where
+   getEnumN :: (GLenum -> a) -> p -> Int -> IO [a]
+   getEnumN f p n =
+      allocaArray n $ \buf -> do
+         getIntegerv p buf
+         (map (f . fromIntegral)) `fmap` peekArray n buf
+
+-----------------------------------------------------------------------------
+
+class GetPName p => GetPNameMatrix p where
+    getMatrixf :: p -> Ptr GLfloat -> IO ()
+    getMatrixf = getFloatv
+    getMatrixd :: p -> Ptr GLdouble -> IO ()
+    getMatrixd = getDoublev
+
+-----------------------------------------------------------------------------
+
+data PName1I
+    = GetEdgeFlag           -- ^ bool
+    | GetRGBAMode           -- ^ enum
+    | GetCurrentIndex       -- ^ int
+    | GetMaxTextureUnits    -- ^ enum
+    -- displaylist
+    | GetListIndex          -- ^ enum
+    | GetListMode           -- ^ enum
+    | GetMaxListNesting     -- ^ sizei
+    | GetListBase           -- ^ enum
+    -- rendermode
+    | GetRenderMode         -- ^ enum
+    -- framebufferbinding
+    | GetDrawFramebufferBinding -- ^ int
+    | GetReadFramebufferBinding -- ^ int
+    | GetFramebufferBinding     -- ^ int
+    -- renderbufferbinding
+    | GetRenderbufferBinding    -- ^ int
+    -- hint
+    | GetPerspectiveCorrectionHint -- ^ enum
+    | GetPointSmoothHint        -- ^ enum
+    | GetLineSmoothHint         -- ^ enum
+    | GetPolygonSmoothHint      -- ^ enum
+    | GetFogHint                -- ^ enum
+    | GetGenerateMipmapHint     -- ^ enum
+    | GetTextureCompressionHint -- ^ enum
+    | GetPackCMYKHint           -- ^ enum
+    | GetUnpackCMYKHint         -- ^ enum
+    -- vertexarray
+    | GetVertexArrayBinding     -- ^ int
+    -- Selction?
+    | GetMaxNameStackDepth      -- ^ int
+    | GetNameStackDepth         -- ^ int
+    -- ContextProfile
+    | GetContextProfileMask     -- ^ enum
+    -- pixelStorage
+    | GetPackSwapBytes      -- ^ bool
+    | GetUnpackSwapBytes    -- ^ bool
+    | GetPackLSBFirst       -- ^ bool
+    | GetUnpackLSBFirst     -- ^ bool
+    | GetPackRowLength      -- ^ int
+    | GetUnpackRowLength    -- ^ int
+    | GetPackSkipRows       -- ^ int
+    | GetUnpackSkipRows     -- ^ int
+    | GetPackSkipPixels     -- ^ int
+    | GetUnpackSkipPixels   -- ^ int
+    | GetPackAlignment      -- ^ int
+    | GetUnpackAlignment    -- ^ int
+    | GetPackImageHeight    -- ^ int
+    | GetUnpackImageHeight  -- ^ int
+    | GetPackSkipImages     -- ^ int
+    | GetUnpackSkipImages   -- ^ int
+    -- pixel map
+    | GetPixelMapIToISize   -- ^ int
+    | GetPixelMapSToSSize   -- ^ int
+    | GetPixelMapIToRSize   -- ^ int
+    | GetPixelMapIToGSize   -- ^ int
+    | GetPixelMapIToBSize   -- ^ int
+    | GetPixelMapIToASize   -- ^ int
+    | GetPixelMapRToRSize   -- ^ int
+    | GetPixelMapGToGSize   -- ^ int
+    | GetPixelMapBToBSize   -- ^ int
+    | GetPixelMapAToASize   -- ^ int
+    | GetMaxPixelMapTable   -- ^ sizei
+    -- shader limits
+    | GetMaxVertexTextureImageUnits     -- ^ sizei
+    | GetMaxTextureImageUnits           -- ^ sizei
+    | GetMaxCombinedTextureImageUnits   -- ^ sizei
+    | GetMaxTextureCoords               -- ^ sizei
+    | GetMaxVertexUniformComponents     -- ^ sizei
+    | GetMaxFragmentUniformComponents   -- ^ sizei
+    | GetMaxVertexAttribs               -- ^ sizei
+    | GetMaxVaryingFloats               -- ^ sizei
+    -- tessellation
+    | GetPatchVertices                  -- ^ sizei
+    | GetMaxPatchVertices               -- ^ sizei
+    | GetMaxTessGenLevel                -- ^ sizei
+    -- coordtrans
+    | GetMatrixMode                 -- ^ enum
+    | GetModelviewStackDepth        -- ^ sizei
+    | GetProjectionStackDepth       -- ^ sizei
+    | GetTextureStackDepth          -- ^ sizei
+    | GetColorMatrixStackDepth      -- ^ sizei
+    | GetMaxModelviewStackDepth     -- ^ sizei
+    | GetMaxProjectionStackDepth    -- ^ sizei
+    | GetMaxTextureStackDepth       -- ^ sizei
+    | GetMaxColorMatrixStackDepth   -- ^ sizei
+    | GetMaxMatrixPaletteStackDepth -- ^ sizei
+    | GetCurrentMatrixStackDepth    -- ^ sizei
+    | GetActiveTexture              -- ^ enum
+    -- VertexArrays
+    | GetVertexArraySize    -- ^ int
+    | GetVertexArrayType    -- ^ enum
+    | GetVertexArrayStride  -- ^ int
+    | GetNormalArrayType    -- ^ enum
+    | GetNormalArrayStride  -- ^ int
+    | GetColorArraySize     -- ^ int
+    | GetColorArrayType     -- ^ enum
+    | GetColorArrayStride   -- ^ int
+    | GetIndexArrayType     -- ^ enum
+    | GetIndexArrayStride   -- ^ int
+    | GetTextureCoordArraySize      -- ^ int
+    | GetTextureCoordArrayType      -- ^ enum
+    | GetTextureCoordArrayStride    -- ^ int
+    | GetEdgeFlagArrayStride        -- ^ int
+    | GetFogCoordArrayType          -- ^ enum
+    | GetFogCoordArrayStride        -- ^ int
+    | GetSecondaryColorArraySize    -- ^ int
+    | GetSecondaryColorArrayType    -- ^ enum
+    | GetSecondaryColorArrayStride  -- ^ int
+    | GetArrayElementLockCount      -- ^ int
+    | GetArrayElementLockFirst      -- ^ int
+    | GetClientActiveTexture        -- ^ enum
+    | GetMaxElementsVertices        -- ^ sizei
+    | GetMaxElementsIndices         -- ^ sizei
+    | GetPrimitiveRestartIndex      -- ^ int
+    | GetPrimitiveRestartNV         -- ^ bool
+    | GetPrimitiveRestartIndexNV    -- ^ int
+    -- bufferObjects
+    | GetArrayBufferBinding         -- ^ int
+    | GetAtomicCounterBufferBinding -- ^ int
+    | GetCopyReadBufferBinding      -- ^ int
+    | GetCopyWriteBufferBinding     -- ^ int
+    | GetDispatchIndirectBufferBinding -- ^ int
+    | GetDrawIndirectBufferBinding  -- ^ int
+    | GetElementArrayBufferBinding  -- ^ int
+    | GetPixelPackBufferBinding     -- ^ int
+    | GetPixelUnpackBufferBinding   -- ^ int
+    | GetQueryBufferBinding         -- ^ int
+    | GetShaderStorageBufferBinding -- ^ int
+    | GetTransformFeedbackBufferBinding -- ^ int
+    | GetUniformBufferBinding       -- ^ int
+
+    | GetVertexArrayBufferBinding   -- ^ int
+    | GetNormalArrayBufferBinding   -- ^ int
+    | GetColorArrayBufferBinding    -- ^ int
+    | GetIndexArrayBufferBinding    -- ^ int
+    | GetTextureCoordArrayBufferBinding -- ^ int
+    | GetEdgeFlagArrayBufferBinding -- ^ int
+    | GetSecondaryColorArrayBufferBinding   -- ^ int
+    | GetFogCoordArrayBufferBinding -- ^ int
+    -- clipping
+    | GetMaxClipPlanes          -- ^ sizei
+    -- Colors
+    | GetMaxLights              -- ^ sizei
+    | GetFrontFace              -- ^ enum
+    | GetLightModelLocalViewer  -- ^ bool
+    | GetLightModelTwoSide      -- ^ bool
+    | GetLightModelColorControl -- ^ enum
+    | GetColorMaterialFace      -- ^ enum
+    | GetColorMaterialParameter -- ^ enum
+    | GetShadeModel             -- ^ enum
+    | GetFragmentColorClamp     -- ^ enum
+    | GetVertexColorClamp       -- ^ enum
+    | GetReadColorClamp         -- ^ enum
+    -- Evaluators
+    | GetMaxEvalOrder       -- ^ int
+    | GetMap1GridSegments   -- ^ int
+    -- Fog
+    | GetFogMode            -- ^ int => enum
+    | GetFogIndex           -- ^ int
+    | GetFogCoordSrc        -- ^ int
+    | GetFogDistanceMode    -- ^ int => enum
+    -- Framebuffer
+    | GetAuxBuffers         -- ^ sizei
+    | GetDoublebuffer       -- ^ bool
+    | GetStereo             -- ^ bool
+    | GetRedBits            -- ^ sizei
+    | GetGreenBits          -- ^ sizei
+    | GetBlueBits           -- ^ sizei
+    | GetAlphaBits          -- ^ sizei
+    | GetStencilBits        -- ^ sizei
+    | GetDepthBits          -- ^ sizei
+    | GetAccumRedBits       -- ^ sizei
+    | GetAccumGreenBits     -- ^ sizei
+    | GetAccumBlueBits      -- ^ sizei
+    | GetAccumAlphaBits     -- ^ sizei
+    | GetDrawBuffer         -- ^ enum
+    | GetDrawBufferN GLsizei -- enum
+    | GetMaxDrawBuffers     -- ^ sizei
+    | GetIndexWritemask     -- ^ int
+    | GetDepthWritemask     -- ^ bool
+    | GetStencilWritemask   -- ^ bool
+    | GetStencilBackWritemask   -- ^ bool
+    | GetStencilClearValue  -- ^ int
+    -- Program
+    | GetCurrentProgram     -- ^ int
+    -- Transformfeedback
+    | GetMaxTransformFeedbackSeparateAttribs        -- ^ int
+    | GetMaxTransformFeedbackInterleavedComponents  -- ^ int
+    | GetMaxTransformFeedbackSeparateComponents     -- ^ int
+    | GetCurrentRasterIndex         -- ^ int
+    | GetCurrentRasterPositionValid -- ^ bool
+    -- LineSegment
+    | GetLineStippleRepeat          -- ^ int
+    | GetLineStipplePattern         -- ^ int
+    -- PerFragment
+    | GetSampleCoverageInvert       -- ^ bool
+    | GetAlphaTestFunc              -- ^ enum
+    | GetStencilFunc                -- ^ enum
+    | GetStencilBackFunc            -- ^ enum
+    | GetStencilValueMask           -- ^ int
+    | GetStencilBackValueMask       -- ^ int
+    | GetStencilRef                 -- ^ int
+    | GetStencilBackRef             -- ^ int
+    | GetStencilFail                -- ^ enum
+    | GetStencilBackFail            -- ^ enum
+    | GetStencilPassDepthFail       -- ^ enum
+    | GetStencilBackPassDepthFail   -- ^ enum
+    | GetStencilPassDepthPass       -- ^ enum
+    | GetStencilBackPassDepthPass   -- ^ enum
+    | GetActiveStencilFace          -- ^ enum
+    | GetLogicOpMode                -- ^ enum
+    | GetBlendDst                   -- ^ enum
+    | GetBlendSrc                   -- ^ enum
+    | GetBlendSrcRGB                -- ^ enum
+    | GetBlendSrcAlpha              -- ^ enum
+    | GetBlendDstRGB                -- ^ enum
+    | GetBlendDstAlpha              -- ^ enum
+    | GetBlendEquation              -- ^ enum
+    | GetBlendEquationAlpha         -- ^ enum
+    | GetDepthFunc                  -- ^ enum
+    | GetMapColor                   -- ^ bool
+    | GetMapStencil                 -- ^ bool
+    | GetIndexShift                 -- ^ int
+    | GetIndexOffset                -- ^ int
+    -- Polygons                     -- ^ enum
+    | GetCullFaceMode
+    -- TextureSpecification
+    | GetNumCompressedTextureFormats    -- ^ int
+    | GetMaxTextureSize                 -- ^ int
+    | GetMax3DTextureSize               -- ^ int
+    | GetMaxCubeMapTextureSize          -- ^ int
+    | GetMaxRectangleTextureSize        -- ^ int
+    | GetMaxArrayTextureLayers          -- ^ int
+    | GetMaxSampleMaskWords             -- ^ int
+    | GetMaxColorTextureSamples         -- ^ int
+    | GetMaxDepthTextureSamples         -- ^ int
+    | GetMaxIntegerSamples              -- ^ int
+    -- ReadCopyPixels
+    | GetReadBuffer                 -- ^ enum
+    -- Texture Objects
+    | GetTextureBinding1D           -- ^ int\/enum
+    | GetTextureBinding2D           -- ^ int\/enum
+    | GetTextureBinding3D           -- ^ int\/enum
+    | GetTextureBinding1DArray      -- ^ int\/enum
+    | GetTextureBinding2DArray      -- ^ int\/enum
+    | GetTextureBindingCubeMapArray -- ^ int\/enum
+    | GetTextureBindingRectangle    -- ^ int\/enum
+    | GetTextureBindingBuffer       -- ^ int\/enum
+    | GetTextureBindingCubeMap      -- ^ int\/enum
+    | GetTextureBinding2DMultisample -- ^ int\/enum
+    | GetTextureBinding2DMultisampleArray -- ^ int\/enum
+    -- Antialiasing
+    | GetSubpixelBits               -- ^ sizei
+    | GetSamples                    -- ^ sizei
+    | GetSampleBuffers              -- ^ sizei
+    -- Sync Objects
+    | GetMaxServerWaitTimeout       -- ^ int
+    -- Query Objects
+    | GetMaxVertexStreams           -- ^ int
+    -- GL Time
+    | GetTimestamp                  -- ^ int
+    -- Shader
+    | GetShaderCompiler             -- ^ bool
+    | GetNumShaderBinaryFormats     -- ^ int
+    | GetNumProgramBinaryFormats    -- ^ int
+    -- Debug Output
+    | GetMaxDebugMessageLength        -- ^ int
+    | GetMaxDebugLoggedMessages       -- ^ int
+    | GetDebugLoggedMessages          -- ^ int
+    | GetDebugNextLoggedMessageLength -- ^ int
+    | GetMaxDebugGroupStackDepth      -- ^ int
+    | GetMaxLabelLength               -- ^ int
+    -- Extensions
+    | GetNumExtensions     -- ^ uint
+
+instance GetPName1I PName1I where
+
+instance GetPName PName1I where
+    marshalGetPName pn = case pn of
+        GetEdgeFlag -> Just GL_EDGE_FLAG
+        GetRGBAMode -> Just GL_RGBA_MODE
+        GetCurrentIndex -> Just GL_CURRENT_INDEX
+        GetMaxTextureUnits -> Just GL_MAX_TEXTURE_UNITS
+        -- displaylist
+        GetListIndex -> Just GL_LIST_INDEX
+        GetListMode -> Just GL_LIST_MODE
+        GetMaxListNesting -> Just GL_MAX_LIST_NESTING
+        GetListBase -> Just GL_LIST_BASE
+        -- rendermode
+        GetRenderMode -> Just GL_RENDER_MODE
+        -- framebufferbinding
+        GetDrawFramebufferBinding -> Just GL_DRAW_FRAMEBUFFER_BINDING
+        GetReadFramebufferBinding -> Just GL_READ_FRAMEBUFFER_BINDING
+        GetFramebufferBinding -> Just GL_FRAMEBUFFER_BINDING
+        -- renderbufferbinding
+        GetRenderbufferBinding -> Just GL_RENDERBUFFER_BINDING
+        -- hint
+        GetPerspectiveCorrectionHint -> Just GL_PERSPECTIVE_CORRECTION_HINT
+        GetPointSmoothHint -> Just GL_POINT_SMOOTH_HINT
+        GetLineSmoothHint -> Just GL_LINE_SMOOTH_HINT
+        GetPolygonSmoothHint -> Just GL_POLYGON_SMOOTH_HINT
+        GetFogHint -> Just GL_FOG_HINT
+        GetGenerateMipmapHint -> Just GL_GENERATE_MIPMAP_HINT
+        GetTextureCompressionHint -> Just GL_TEXTURE_COMPRESSION_HINT
+        GetPackCMYKHint -> Just GL_PACK_CMYK_HINT_EXT
+        GetUnpackCMYKHint -> Just GL_UNPACK_CMYK_HINT_EXT
+        GetVertexArrayBinding -> Just GL_VERTEX_ARRAY_BINDING
+        -- Selection ?
+        GetMaxNameStackDepth -> Just GL_MAX_NAME_STACK_DEPTH
+        GetNameStackDepth -> Just GL_NAME_STACK_DEPTH
+        -- ContextProfile
+        GetContextProfileMask -> Just GL_CONTEXT_PROFILE_MASK
+        --pixel storage
+        GetPackSwapBytes -> Just GL_PACK_SWAP_BYTES
+        GetUnpackSwapBytes -> Just GL_UNPACK_SWAP_BYTES
+        GetPackLSBFirst -> Just GL_PACK_LSB_FIRST
+        GetUnpackLSBFirst -> Just GL_UNPACK_LSB_FIRST
+        GetPackRowLength -> Just GL_PACK_ROW_LENGTH
+        GetUnpackRowLength -> Just GL_UNPACK_ROW_LENGTH
+        GetPackSkipRows -> Just GL_PACK_SKIP_ROWS
+        GetUnpackSkipRows -> Just GL_UNPACK_SKIP_ROWS
+        GetPackSkipPixels -> Just GL_PACK_SKIP_PIXELS
+        GetUnpackSkipPixels -> Just GL_UNPACK_SKIP_PIXELS
+        GetPackAlignment -> Just GL_PACK_ALIGNMENT
+        GetUnpackAlignment -> Just GL_UNPACK_ALIGNMENT
+        GetPackSkipImages -> Just GL_PACK_SKIP_IMAGES
+        GetUnpackSkipImages -> Just GL_UNPACK_SKIP_IMAGES
+        GetPackImageHeight -> Just GL_PACK_IMAGE_HEIGHT
+        GetUnpackImageHeight -> Just GL_UNPACK_IMAGE_HEIGHT
+        -- pixelmap
+        GetPixelMapIToISize -> Just GL_PIXEL_MAP_I_TO_I_SIZE
+        GetPixelMapSToSSize -> Just GL_PIXEL_MAP_S_TO_S_SIZE
+        GetPixelMapIToRSize -> Just GL_PIXEL_MAP_I_TO_R_SIZE
+        GetPixelMapIToGSize -> Just GL_PIXEL_MAP_I_TO_G_SIZE
+        GetPixelMapIToBSize -> Just GL_PIXEL_MAP_I_TO_B_SIZE
+        GetPixelMapIToASize -> Just GL_PIXEL_MAP_I_TO_A_SIZE
+        GetPixelMapRToRSize -> Just GL_PIXEL_MAP_R_TO_R_SIZE
+        GetPixelMapGToGSize -> Just GL_PIXEL_MAP_G_TO_G_SIZE
+        GetPixelMapBToBSize -> Just GL_PIXEL_MAP_B_TO_B_SIZE
+        GetPixelMapAToASize -> Just GL_PIXEL_MAP_A_TO_A_SIZE
+        GetMaxPixelMapTable -> Just GL_MAX_PIXEL_MAP_TABLE
+        -- shader limits
+        GetMaxVertexTextureImageUnits -> Just GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS
+        GetMaxTextureImageUnits -> Just GL_MAX_TEXTURE_IMAGE_UNITS
+        GetMaxCombinedTextureImageUnits -> Just GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS
+        GetMaxTextureCoords -> Just GL_MAX_TEXTURE_COORDS
+        GetMaxVertexUniformComponents -> Just GL_MAX_VERTEX_UNIFORM_COMPONENTS
+        GetMaxFragmentUniformComponents -> Just GL_MAX_FRAGMENT_UNIFORM_COMPONENTS
+        GetMaxVaryingFloats -> Just GL_MAX_VARYING_COMPONENTS
+        GetMaxVertexAttribs -> Just GL_MAX_VERTEX_ATTRIBS
+        -- tessellation
+        GetPatchVertices -> Just GL_PATCH_VERTICES
+        GetMaxPatchVertices -> Just GL_MAX_PATCH_VERTICES
+        GetMaxTessGenLevel -> Just GL_MAX_TESS_GEN_LEVEL
+        -- coordtrans
+        GetMatrixMode -> Just GL_MATRIX_MODE
+        GetModelviewStackDepth -> Just GL_MODELVIEW_STACK_DEPTH
+        GetProjectionStackDepth -> Just GL_PROJECTION_STACK_DEPTH
+        GetTextureStackDepth -> Just GL_TEXTURE_STACK_DEPTH
+        GetColorMatrixStackDepth -> Just GL_COLOR_MATRIX_STACK_DEPTH
+        GetMaxModelviewStackDepth -> Just GL_MAX_MODELVIEW_STACK_DEPTH
+        GetMaxProjectionStackDepth -> Just GL_MAX_PROJECTION_STACK_DEPTH
+        GetMaxTextureStackDepth -> Just GL_MAX_TEXTURE_STACK_DEPTH
+        GetMaxColorMatrixStackDepth -> Just GL_MAX_COLOR_MATRIX_STACK_DEPTH
+        GetMaxMatrixPaletteStackDepth -> Just GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB
+        GetCurrentMatrixStackDepth -> Just GL_CURRENT_MATRIX_STACK_DEPTH_ARB
+        GetActiveTexture -> Just GL_ACTIVE_TEXTURE
+        -- vertexarrays
+        GetVertexArraySize -> Just GL_VERTEX_ARRAY_SIZE
+        GetVertexArrayType -> Just GL_VERTEX_ARRAY_TYPE
+        GetVertexArrayStride -> Just GL_VERTEX_ARRAY_STRIDE
+        GetNormalArrayType -> Just GL_NORMAL_ARRAY_TYPE
+        GetNormalArrayStride -> Just GL_NORMAL_ARRAY_STRIDE
+        GetColorArraySize -> Just GL_COLOR_ARRAY_SIZE
+        GetColorArrayType -> Just GL_COLOR_ARRAY_TYPE
+        GetColorArrayStride -> Just GL_COLOR_ARRAY_STRIDE
+        GetIndexArrayType -> Just GL_INDEX_ARRAY_TYPE
+        GetIndexArrayStride -> Just GL_INDEX_ARRAY_STRIDE
+        GetTextureCoordArraySize -> Just GL_TEXTURE_COORD_ARRAY_SIZE
+        GetTextureCoordArrayType -> Just GL_TEXTURE_COORD_ARRAY_TYPE
+        GetTextureCoordArrayStride -> Just GL_TEXTURE_COORD_ARRAY_STRIDE
+        GetEdgeFlagArrayStride -> Just GL_EDGE_FLAG_ARRAY_STRIDE
+        GetFogCoordArrayType -> Just GL_FOG_COORD_ARRAY_TYPE
+        GetFogCoordArrayStride -> Just GL_FOG_COORD_ARRAY_STRIDE
+        GetSecondaryColorArraySize -> Just GL_SECONDARY_COLOR_ARRAY_SIZE
+        GetSecondaryColorArrayType -> Just GL_SECONDARY_COLOR_ARRAY_TYPE
+        GetSecondaryColorArrayStride -> Just GL_SECONDARY_COLOR_ARRAY_STRIDE
+        GetArrayElementLockCount -> Just GL_ARRAY_ELEMENT_LOCK_COUNT_EXT
+        GetArrayElementLockFirst -> Just GL_ARRAY_ELEMENT_LOCK_FIRST_EXT
+        GetClientActiveTexture -> Just GL_CLIENT_ACTIVE_TEXTURE
+        GetMaxElementsVertices -> Just GL_MAX_ELEMENTS_VERTICES
+        GetMaxElementsIndices -> Just GL_MAX_ELEMENTS_INDICES
+        GetPrimitiveRestartIndex -> Just GL_PRIMITIVE_RESTART_INDEX
+        GetPrimitiveRestartNV -> Just GL_PRIMITIVE_RESTART_NV
+        GetPrimitiveRestartIndexNV -> Just GL_PRIMITIVE_RESTART_INDEX_NV
+        -- bufferobjects
+        GetArrayBufferBinding -> Just GL_ARRAY_BUFFER_BINDING
+        GetAtomicCounterBufferBinding -> Just GL_ATOMIC_COUNTER_BUFFER_BINDING
+        GetCopyReadBufferBinding -> Just GL_COPY_READ_BUFFER_BINDING
+        GetCopyWriteBufferBinding -> Just GL_COPY_WRITE_BUFFER_BINDING
+        GetDispatchIndirectBufferBinding -> Just GL_DISPATCH_INDIRECT_BUFFER_BINDING
+        GetDrawIndirectBufferBinding -> Just GL_DRAW_INDIRECT_BUFFER_BINDING
+        GetElementArrayBufferBinding -> Just GL_ELEMENT_ARRAY_BUFFER_BINDING
+        GetPixelPackBufferBinding -> Just GL_PIXEL_PACK_BUFFER_BINDING
+        GetPixelUnpackBufferBinding -> Just GL_PIXEL_UNPACK_BUFFER_BINDING
+        GetQueryBufferBinding -> Just GL_QUERY_BUFFER_BINDING
+        GetShaderStorageBufferBinding -> Just GL_SHADER_STORAGE_BUFFER_BINDING
+        GetTransformFeedbackBufferBinding -> Just GL_TRANSFORM_FEEDBACK_BUFFER_BINDING
+        GetUniformBufferBinding -> Just GL_UNIFORM_BUFFER_BINDING
+
+        GetVertexArrayBufferBinding -> Just GL_VERTEX_ARRAY_BUFFER_BINDING
+        GetNormalArrayBufferBinding -> Just GL_NORMAL_ARRAY_BUFFER_BINDING
+        GetColorArrayBufferBinding -> Just GL_COLOR_ARRAY_BUFFER_BINDING
+        GetIndexArrayBufferBinding -> Just GL_INDEX_ARRAY_BUFFER_BINDING
+        GetTextureCoordArrayBufferBinding -> Just GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING
+        GetEdgeFlagArrayBufferBinding -> Just GL_EDGE_FLAG_ARRAY_BUFFER_BINDING
+        GetSecondaryColorArrayBufferBinding -> Just GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING
+        GetFogCoordArrayBufferBinding -> Just GL_FOG_COORD_ARRAY_BUFFER_BINDING
+        -- clipping
+        GetMaxClipPlanes -> Just GL_MAX_CLIP_DISTANCES
+        -- Colors
+        GetMaxLights -> Just GL_MAX_LIGHTS
+        GetFrontFace -> Just GL_FRONT_FACE
+        GetLightModelLocalViewer -> Just GL_LIGHT_MODEL_LOCAL_VIEWER
+        GetLightModelTwoSide -> Just GL_LIGHT_MODEL_TWO_SIDE
+        GetLightModelColorControl -> Just GL_LIGHT_MODEL_COLOR_CONTROL
+        GetColorMaterialFace -> Just GL_COLOR_MATERIAL_FACE
+        GetColorMaterialParameter -> Just GL_COLOR_MATERIAL_PARAMETER
+        GetShadeModel -> Just GL_SHADE_MODEL
+        GetVertexColorClamp -> Just GL_CLAMP_VERTEX_COLOR
+        GetFragmentColorClamp -> Just GL_CLAMP_FRAGMENT_COLOR
+        GetReadColorClamp -> Just GL_CLAMP_READ_COLOR
+        -- Evaluators
+        GetMaxEvalOrder -> Just GL_MAX_EVAL_ORDER
+        GetMap1GridSegments -> Just GL_MAP1_GRID_SEGMENTS
+        -- Fog
+        GetFogMode -> Just GL_FOG_MODE
+        GetFogIndex -> Just GL_FOG_INDEX
+        GetFogCoordSrc -> Just GL_FOG_COORD_SRC
+        GetFogDistanceMode -> Just GL_FOG_DISTANCE_MODE_NV
+        -- Framebuffer
+        GetAuxBuffers -> Just GL_AUX_BUFFERS
+        GetDoublebuffer -> Just GL_DOUBLEBUFFER
+        GetStereo -> Just GL_STEREO
+        GetRedBits -> Just GL_RED_BITS
+        GetGreenBits -> Just GL_GREEN_BITS
+        GetBlueBits -> Just GL_BLUE_BITS
+        GetAlphaBits -> Just GL_ALPHA_BITS
+        GetDepthBits -> Just GL_DEPTH_BITS
+        GetStencilBits -> Just GL_STENCIL_BITS
+        GetAccumRedBits -> Just GL_ACCUM_RED_BITS
+        GetAccumGreenBits -> Just GL_ACCUM_GREEN_BITS
+        GetAccumBlueBits -> Just GL_ACCUM_BLUE_BITS
+        GetAccumAlphaBits -> Just GL_ACCUM_ALPHA_BITS
+        GetDrawBuffer -> Just GL_DRAW_BUFFER
+        GetDrawBufferN i -> drawBufferIndexToEnum i
+        GetMaxDrawBuffers -> Just GL_MAX_DRAW_BUFFERS
+        GetIndexWritemask -> Just GL_INDEX_WRITEMASK
+        GetDepthWritemask -> Just GL_DEPTH_WRITEMASK
+        GetStencilWritemask -> Just GL_STENCIL_WRITEMASK
+        GetStencilBackWritemask -> Just GL_STENCIL_BACK_WRITEMASK
+        GetStencilClearValue -> Just GL_STENCIL_CLEAR_VALUE
+        -- Program
+        GetCurrentProgram -> Just GL_CURRENT_PROGRAM
+        -- Transformfeedback
+        GetMaxTransformFeedbackSeparateAttribs -> Just GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS
+        GetMaxTransformFeedbackSeparateComponents -> Just GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS
+        GetMaxTransformFeedbackInterleavedComponents -> Just GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS
+        -- RasterPos
+        GetCurrentRasterIndex -> Just GL_CURRENT_RASTER_INDEX
+        GetCurrentRasterPositionValid -> Just GL_CURRENT_RASTER_POSITION_VALID
+        -- LineSegment
+        GetLineStipplePattern -> Just GL_LINE_STIPPLE_PATTERN
+        GetLineStippleRepeat -> Just GL_LINE_STIPPLE_REPEAT
+        -- PerFragment
+        GetSampleCoverageInvert -> Just GL_SAMPLE_COVERAGE_INVERT
+        GetAlphaTestFunc -> Just GL_ALPHA_TEST_FUNC
+        GetStencilFunc -> Just GL_STENCIL_FUNC
+        GetStencilBackFunc -> Just GL_STENCIL_BACK_FUNC
+        GetStencilValueMask -> Just GL_STENCIL_VALUE_MASK
+        GetStencilBackValueMask -> Just GL_STENCIL_BACK_VALUE_MASK
+        GetStencilRef -> Just GL_STENCIL_REF
+        GetStencilBackRef -> Just GL_STENCIL_BACK_REF
+        GetStencilFail -> Just GL_STENCIL_FAIL
+        GetStencilBackFail -> Just GL_STENCIL_BACK_FAIL
+        GetStencilPassDepthFail -> Just GL_STENCIL_PASS_DEPTH_FAIL
+        GetStencilBackPassDepthFail -> Just GL_STENCIL_BACK_PASS_DEPTH_FAIL
+        GetStencilPassDepthPass -> Just GL_STENCIL_PASS_DEPTH_PASS
+        GetStencilBackPassDepthPass -> Just GL_STENCIL_BACK_PASS_DEPTH_PASS
+        GetActiveStencilFace -> Just GL_ACTIVE_STENCIL_FACE_EXT
+        GetLogicOpMode -> Just GL_LOGIC_OP_MODE
+        GetBlendDst -> Just GL_BLEND_DST
+        GetBlendSrc -> Just GL_BLEND_SRC
+        GetBlendDstRGB -> Just GL_BLEND_DST_RGB
+        GetBlendSrcRGB -> Just GL_BLEND_SRC_RGB
+        GetBlendDstAlpha -> Just GL_BLEND_DST_ALPHA
+        GetBlendSrcAlpha -> Just GL_BLEND_SRC_ALPHA
+        GetBlendEquation -> Just GL_BLEND_EQUATION_RGB
+        GetBlendEquationAlpha -> Just GL_BLEND_EQUATION_ALPHA
+        GetDepthFunc -> Just GL_DEPTH_FUNC
+        GetMapColor -> Just GL_MAP_COLOR
+        GetMapStencil -> Just GL_MAP_STENCIL
+        GetIndexShift -> Just GL_INDEX_SHIFT
+        GetIndexOffset -> Just GL_INDEX_OFFSET
+        -- Polygons
+        GetCullFaceMode -> Just GL_CULL_FACE_MODE
+        -- Texture specification
+        GetNumCompressedTextureFormats -> Just GL_NUM_COMPRESSED_TEXTURE_FORMATS
+        GetMaxTextureSize -> Just GL_MAX_TEXTURE_SIZE
+        GetMax3DTextureSize -> Just GL_MAX_3D_TEXTURE_SIZE
+        GetMaxCubeMapTextureSize -> Just GL_MAX_CUBE_MAP_TEXTURE_SIZE
+        GetMaxRectangleTextureSize -> Just GL_MAX_RECTANGLE_TEXTURE_SIZE
+        GetMaxArrayTextureLayers -> Just GL_MAX_ARRAY_TEXTURE_LAYERS
+        GetMaxSampleMaskWords -> Just GL_MAX_SAMPLE_MASK_WORDS
+        GetMaxColorTextureSamples -> Just GL_MAX_COLOR_TEXTURE_SAMPLES
+        GetMaxDepthTextureSamples -> Just GL_MAX_DEPTH_TEXTURE_SAMPLES
+        GetMaxIntegerSamples -> Just GL_MAX_INTEGER_SAMPLES
+        -- ReadCopyPixels
+        GetReadBuffer -> Just GL_READ_BUFFER
+        -- Texture Objects
+        GetTextureBinding1D -> Just GL_TEXTURE_BINDING_1D
+        GetTextureBinding2D -> Just GL_TEXTURE_BINDING_2D
+        GetTextureBinding3D -> Just GL_TEXTURE_BINDING_3D
+        GetTextureBinding1DArray -> Just GL_TEXTURE_BINDING_1D_ARRAY
+        GetTextureBinding2DArray -> Just GL_TEXTURE_BINDING_2D_ARRAY
+        GetTextureBindingCubeMapArray -> Just GL_TEXTURE_BINDING_CUBE_MAP_ARRAY
+        GetTextureBindingRectangle -> Just GL_TEXTURE_BINDING_RECTANGLE
+        GetTextureBindingBuffer -> Just GL_TEXTURE_BINDING_BUFFER
+        GetTextureBindingCubeMap -> Just GL_TEXTURE_BINDING_CUBE_MAP
+        GetTextureBinding2DMultisample -> Just GL_TEXTURE_BINDING_2D_MULTISAMPLE
+        GetTextureBinding2DMultisampleArray -> Just GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY
+        -- Antialiasing
+        GetSubpixelBits -> Just GL_SUBPIXEL_BITS
+        GetSampleBuffers -> Just GL_SAMPLE_BUFFERS
+        GetSamples -> Just GL_SAMPLES
+         -- Sync Objects
+        GetMaxServerWaitTimeout -> Just GL_MAX_SERVER_WAIT_TIMEOUT
+        -- Query Objects
+        GetMaxVertexStreams -> Just GL_MAX_VERTEX_STREAMS
+        -- GL Time
+        GetTimestamp -> Just GL_TIMESTAMP
+        -- Shader
+        GetShaderCompiler -> Just GL_SHADER_COMPILER
+        GetNumShaderBinaryFormats -> Just GL_NUM_SHADER_BINARY_FORMATS
+        GetNumProgramBinaryFormats -> Just GL_NUM_PROGRAM_BINARY_FORMATS
+        -- Debug Output
+        GetMaxDebugMessageLength -> Just GL_MAX_DEBUG_MESSAGE_LENGTH
+        GetMaxDebugLoggedMessages -> Just GL_MAX_DEBUG_LOGGED_MESSAGES
+        GetDebugLoggedMessages -> Just GL_DEBUG_LOGGED_MESSAGES
+        GetDebugNextLoggedMessageLength -> Just GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH
+        GetMaxDebugGroupStackDepth -> Just GL_MAX_DEBUG_GROUP_STACK_DEPTH
+        GetMaxLabelLength -> Just GL_MAX_LABEL_LENGTH
+        GetNumExtensions -> Just GL_NUM_EXTENSIONS
+
+-- 0x8825 through 0x8834 are reserved for draw buffers
+
+drawBufferIndexToEnum :: GLsizei -> Maybe GLenum
+drawBufferIndexToEnum i
+   | 0 <= i && i <= maxDrawBufferIndex = Just (GL_DRAW_BUFFER0 + fromIntegral i)
+   | otherwise = Nothing
+
+maxDrawBufferIndex :: GLsizei
+maxDrawBufferIndex = fromIntegral (GL_DRAW_BUFFER15 - GL_DRAW_BUFFER0)
+
+
+-----------------------------------------------------------------------------
+
+data PName1F
+    = GetCurrentFogCoord    -- ^ Float1
+    -- Rasterization
+    | GetZoomX              -- ^ Float
+    | GetZoomY              -- ^ Float
+    -- Colors
+    | GetMaxShininess       -- ^ Float
+    | GetMaxSpotExponent    -- ^ Float
+    -- Fog
+    | GetFogStart           -- ^ float
+    | GetFogEnd             -- ^ float
+    | GetFogDensity         -- ^ float
+    -- Framebuffer
+    | GetDepthClearValue    -- ^ clampf
+    | GetIndexClearValue    -- ^ float
+    -- RasterPos
+    | GetCurrentRasterDistance -- ^ float
+    -- Point
+    | GetPointSizeMin               -- ^ float
+    | GetPointSizeMax               -- ^ float
+    | GetPointFadeThresholdSize     -- ^ float
+    | GetSmoothPointSizeGranularity -- ^ float
+    | GetPointSize                  -- ^ float
+    -- LineSegment
+    | GetLineWidth                  -- ^ float
+    | GetSmoothLineWidthGranularity -- ^ float
+    -- PerFragment
+    | GetSampleCoverageValue        -- ^ clampf
+    | GetAlphaTestRef               -- ^ clampf
+    -- PixelTransfer
+    | GetRedScale                   -- ^ float
+    | GetGreenScale                 -- ^ float
+    | GetBlueScale                  -- ^ float
+    | GetAlphaScale                 -- ^ float
+    | GetPostConvolutionRedScale    -- ^ float
+    | GetPostConvolutionGreenScale  -- ^ float
+    | GetPostConvolutionBlueScale   -- ^ float
+    | GetPostConvolutionAlphaScale  -- ^ float
+    | GetPostColorMatrixRedScale    -- ^ float
+    | GetPostColorMatrixGreenScale  -- ^ float
+    | GetPostColorMatrixBlueScale   -- ^ float
+    | GetPostColorMatrixAlphaScale  -- ^ float
+    | GetRedBias                    -- ^ float
+    | GetGreenBias                  -- ^ float
+    | GetBlueBias                   -- ^ float
+    | GetAlphaBias                  -- ^ float
+    | GetPostConvolutionRedBias     -- ^ float
+    | GetPostConvolutionGreenBias   -- ^ float
+    | GetPostConvolutionBlueBias    -- ^ float
+    | GetPostConvolutionAlphaBias   -- ^ float
+    | GetPostColorMatrixRedBias     -- ^ float
+    | GetPostColorMatrixGreenBias   -- ^ float
+    | GetPostColorMatrixBlueBias    -- ^ float
+    | GetPostColorMatrixAlphaBias   -- ^ float
+    | GetDepthScale                 -- ^ float
+    | GetDepthBias                  -- ^ float
+    -- Polygons
+    | GetPolygonOffsetFactor        -- ^ float
+    | GetPolygonOffsetUnits         -- ^ float
+    -- Texture parameters
+    | GetMaxTextureMaxAnisotropy    -- ^ float
+    | GetMaxTextureLODBias          -- ^ float
+
+instance GetPName1F PName1F where
+
+instance GetPName PName1F where
+    marshalGetPName pn = case pn of
+        GetCurrentFogCoord -> Just GL_CURRENT_FOG_COORD
+        -- Rasterization
+        GetZoomX -> Just GL_ZOOM_X
+        GetZoomY -> Just GL_ZOOM_Y
+        -- Colors
+        GetMaxShininess -> Just GL_MAX_SHININESS_NV
+        GetMaxSpotExponent -> Just GL_MAX_SPOT_EXPONENT_NV
+        -- Fog
+        GetFogStart -> Just GL_FOG_START
+        GetFogEnd -> Just GL_FOG_END
+        GetFogDensity -> Just GL_FOG_DENSITY
+        -- Framebuffer
+        GetDepthClearValue -> Just GL_DEPTH_CLEAR_VALUE
+        GetIndexClearValue -> Just GL_INDEX_CLEAR_VALUE
+        -- RasterPos
+        GetCurrentRasterDistance -> Just GL_CURRENT_RASTER_DISTANCE
+        -- Point
+        GetPointSizeMin -> Just GL_POINT_SIZE_MIN
+        GetPointSizeMax -> Just GL_POINT_SIZE_MAX
+        GetPointFadeThresholdSize -> Just GL_POINT_FADE_THRESHOLD_SIZE
+        GetSmoothPointSizeGranularity -> Just GL_POINT_SIZE_GRANULARITY
+        GetPointSize -> Just GL_POINT_SIZE
+        -- LineSegment
+        GetSmoothLineWidthGranularity -> Just GL_SMOOTH_LINE_WIDTH_GRANULARITY
+        GetLineWidth -> Just GL_LINE_WIDTH
+        -- PerFragment
+        GetSampleCoverageValue -> Just GL_SAMPLE_COVERAGE_VALUE
+        GetAlphaTestRef -> Just GL_ALPHA_TEST_REF
+        -- PixelTransfer
+        GetRedScale -> Just GL_RED_SCALE
+        GetRedBias -> Just GL_RED_BIAS
+        GetGreenScale -> Just GL_GREEN_SCALE
+        GetGreenBias -> Just GL_GREEN_BIAS
+        GetBlueScale -> Just GL_BLUE_SCALE
+        GetBlueBias -> Just GL_BLUE_BIAS
+        GetAlphaScale -> Just GL_ALPHA_SCALE
+        GetAlphaBias -> Just GL_ALPHA_BIAS
+        GetPostConvolutionRedScale -> Just GL_POST_CONVOLUTION_RED_SCALE
+        GetPostConvolutionGreenScale -> Just GL_POST_CONVOLUTION_GREEN_SCALE
+        GetPostConvolutionBlueScale -> Just GL_POST_CONVOLUTION_BLUE_SCALE
+        GetPostConvolutionAlphaScale -> Just GL_POST_CONVOLUTION_ALPHA_SCALE
+        GetPostConvolutionRedBias -> Just GL_POST_CONVOLUTION_RED_BIAS
+        GetPostConvolutionGreenBias -> Just GL_POST_CONVOLUTION_GREEN_BIAS
+        GetPostConvolutionBlueBias -> Just GL_POST_CONVOLUTION_BLUE_BIAS
+        GetPostConvolutionAlphaBias -> Just GL_POST_CONVOLUTION_ALPHA_BIAS
+        GetPostColorMatrixRedScale -> Just GL_POST_COLOR_MATRIX_RED_SCALE
+        GetPostColorMatrixGreenScale -> Just GL_POST_COLOR_MATRIX_GREEN_SCALE
+        GetPostColorMatrixBlueScale -> Just GL_POST_COLOR_MATRIX_BLUE_SCALE
+        GetPostColorMatrixAlphaScale -> Just GL_POST_COLOR_MATRIX_ALPHA_SCALE
+        GetPostColorMatrixRedBias -> Just GL_POST_COLOR_MATRIX_RED_BIAS
+        GetPostColorMatrixGreenBias -> Just GL_POST_COLOR_MATRIX_GREEN_BIAS
+        GetPostColorMatrixBlueBias -> Just GL_POST_COLOR_MATRIX_BLUE_BIAS
+        GetPostColorMatrixAlphaBias -> Just GL_POST_COLOR_MATRIX_ALPHA_BIAS
+        GetDepthScale -> Just GL_DEPTH_SCALE
+        GetDepthBias -> Just GL_DEPTH_BIAS
+        -- Polygons
+        GetPolygonOffsetFactor -> Just GL_POLYGON_OFFSET_FACTOR
+        GetPolygonOffsetUnits -> Just GL_POLYGON_OFFSET_UNITS
+        -- Texture parameters
+        GetMaxTextureMaxAnisotropy -> Just GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT
+        GetMaxTextureLODBias -> Just GL_MAX_TEXTURE_LOD_BIAS
+
+-----------------------------------------------------------------------------
+
+data IPName1I =
+      GetAtomicCounterBuffer
+    | GetAtomicCounterBufferStart
+    | GetAtomicCounterBufferSize
+    | GetShaderStorageBuffer
+    | GetShaderStorageBufferStart
+    | GetShaderStorageBufferSize
+    | GetTransformFeedbackBuffer
+    | GetTransformFeedbackBufferStart
+    | GetTransformFeedbackBufferSize
+    | GetUniformBuffer
+    | GetUniformBufferStart
+    | GetUniformBufferSize
+
+instance GetIPName1I IPName1I where
+
+instance GetPName IPName1I where
+    marshalGetPName pn = case pn of
+        GetAtomicCounterBuffer -> Just GL_ATOMIC_COUNTER_BUFFER
+        GetAtomicCounterBufferStart -> Just GL_ATOMIC_COUNTER_BUFFER_START
+        GetAtomicCounterBufferSize -> Just GL_ATOMIC_COUNTER_BUFFER_SIZE
+        GetShaderStorageBuffer -> Just GL_SHADER_STORAGE_BUFFER
+        GetShaderStorageBufferStart -> Just GL_SHADER_STORAGE_BUFFER_START
+        GetShaderStorageBufferSize -> Just GL_SHADER_STORAGE_BUFFER_SIZE
+        GetTransformFeedbackBuffer -> Just GL_TRANSFORM_FEEDBACK_BUFFER
+        GetTransformFeedbackBufferStart -> Just GL_TRANSFORM_FEEDBACK_BUFFER_START
+        GetTransformFeedbackBufferSize -> Just GL_TRANSFORM_FEEDBACK_BUFFER_SIZE
+        GetUniformBuffer -> Just GL_UNIFORM_BUFFER
+        GetUniformBufferStart -> Just GL_UNIFORM_BUFFER_START
+        GetUniformBufferSize -> Just GL_UNIFORM_BUFFER_SIZE
+
+-----------------------------------------------------------------------------
+
+data PName2I
+    -- coordtrans
+    = GetMaxViewportDims -- ^ sizei
+    -- Evaluators
+    | GetMap2GridSegments
+    -- Polygons
+    | GetPolygonMode
+
+instance GetPName2I PName2I where
+
+instance GetPName PName2I where
+    marshalGetPName pn = case pn of
+        -- coordtrans
+        GetMaxViewportDims -> Just GL_MAX_VIEWPORT_DIMS
+        -- Evaluators
+        GetMap2GridSegments -> Just GL_MAP2_GRID_SEGMENTS
+        -- Polygons
+        GetPolygonMode -> Just GL_POLYGON_MODE
+
+-----------------------------------------------------------------------------
+
+data PName2F
+    -- coordtrans
+    = GetDepthRange -- ^ clamp
+    -- Evaluators
+    | GetMap1GridDomain -- ^ float2?
+    -- Point
+    | GetAliasedPointSizeRange  -- ^ float
+    | GetSmoothPointSizeRange   -- ^ float
+    -- LineSegments
+    | GetAliasedLineWidthRange  -- ^ float
+    | GetSmoothLineWidthRange   -- ^ float
+    -- PerFragment
+    | GetDepthBounds            -- ^ clampd
+    -- Tessellation
+    | GetPatchDefaultInnerLevel -- ^ float
+
+instance GetPName2F PName2F where
+
+instance GetPName PName2F where
+    marshalGetPName pn = case pn of
+        -- coord trans
+        GetDepthRange -> Just GL_DEPTH_RANGE
+        -- Evaluators
+        GetMap1GridDomain -> Just GL_MAP1_GRID_DOMAIN
+        -- Point
+        GetAliasedPointSizeRange -> Just GL_ALIASED_POINT_SIZE_RANGE
+        GetSmoothPointSizeRange -> Just GL_POINT_SIZE_RANGE
+        -- LineSegments
+        GetAliasedLineWidthRange -> Just GL_ALIASED_LINE_WIDTH_RANGE
+        GetSmoothLineWidthRange -> Just GL_SMOOTH_LINE_WIDTH_RANGE
+        -- PerFragment
+        GetDepthBounds -> Just GL_DEPTH_BOUNDS_EXT
+        -- Tessellation
+        GetPatchDefaultInnerLevel -> Just GL_PATCH_DEFAULT_INNER_LEVEL
+
+-----------------------------------------------------------------------------
+
+data PName3F
+    = GetCurrentNormal -- ^ Float3
+    -- Point
+    | GetPointDistanceAttenuation -- ^ float
+
+instance GetPName3F PName3F where
+
+instance GetPName PName3F where
+    marshalGetPName pn = case pn of
+        GetCurrentNormal -> Just GL_CURRENT_NORMAL
+        -- Point
+        GetPointDistanceAttenuation -> Just GL_POINT_DISTANCE_ATTENUATION
+
+-----------------------------------------------------------------------------
+
+data PName4I
+    -- coordtrans
+    = GetViewport               -- ^ int
+    -- Framebuffer
+    | GetRGBASignedComponents   -- ^ int
+    -- PerFragment
+    | GetScissorBox             -- ^ int
+
+
+instance GetPName4I PName4I where
+
+instance GetPName PName4I where
+    marshalGetPName pn = case pn of
+        -- coordtrans
+        GetViewport -> Just GL_VIEWPORT
+        -- Framebuffer
+        GetRGBASignedComponents -> Just GL_RGBA_SIGNED_COMPONENTS_EXT
+        -- PerFragement
+        GetScissorBox -> Just GL_SCISSOR_BOX
+
+
+-- | Both indexed and unindexed
+data PName4ISemiIndexed
+    = GetColorWritemask         -- ^ bool
+
+instance GetPName4I  PName4ISemiIndexed where
+
+instance GetIPName4I PName4ISemiIndexed where
+
+instance GetPName PName4ISemiIndexed where
+    marshalGetPName pn = case pn of
+        GetColorWritemask -> Just GL_COLOR_WRITEMASK
+
+-----------------------------------------------------------------------------
+
+data PName4F
+    = GetCurrentColor -- ^ ?
+    | GetCurrentTextureCoords   -- ^ Float
+    | GetCurrentSecondaryColor  -- ^ Float
+    -- Colors
+    | GetLightModelAmbient  -- ^ float
+    -- Evaluators
+    | GetMap2GridDomain     -- ^ float?
+    -- Fog
+    | GetFogColor           -- ^ clampf
+    -- Framebuffer
+    | GetColorClearValue    -- ^ clampf
+    | GetAccumClearValue    -- ^ float
+    -- RasterPos
+    | GetCurrentRasterColor             -- ^ float
+    | GetCurrentRasterSecondaryColor    -- ^ float
+    | GetCurrentRasterTextureCoords     -- ^ float
+    | GetCurrentRasterPosition          -- ^ float
+    -- PerFragment
+    | GetBlendColor                     -- ^ clampf
+    -- Tessellation
+    | GetPatchDefaultOuterLevel         -- ^ float
+
+instance GetPName4F PName4F where
+
+instance GetPName PName4F where
+    marshalGetPName pn = case pn of
+        GetCurrentColor -> Just GL_CURRENT_COLOR
+        GetCurrentTextureCoords -> Just GL_CURRENT_TEXTURE_COORDS
+        GetCurrentSecondaryColor -> Just GL_CURRENT_SECONDARY_COLOR
+        -- Colors
+        GetLightModelAmbient -> Just GL_LIGHT_MODEL_AMBIENT
+        -- Evaluators
+        GetMap2GridDomain -> Just GL_MAP2_GRID_DOMAIN
+        -- Fog
+        GetFogColor -> Just GL_FOG_COLOR
+        -- Framebuffer
+        GetColorClearValue -> Just GL_COLOR_CLEAR_VALUE
+        GetAccumClearValue -> Just GL_ACCUM_CLEAR_VALUE
+        -- RasterPos
+        GetCurrentRasterColor -> Just GL_CURRENT_RASTER_COLOR
+        GetCurrentRasterSecondaryColor -> Just GL_CURRENT_RASTER_SECONDARY_COLOR
+        GetCurrentRasterTextureCoords -> Just GL_CURRENT_RASTER_TEXTURE_COORDS
+        GetCurrentRasterPosition -> Just GL_CURRENT_RASTER_POSITION
+        -- PerFragment
+        GetBlendColor -> Just GL_BLEND_COLOR
+        -- Tessellation
+        GetPatchDefaultOuterLevel -> Just GL_PATCH_DEFAULT_OUTER_LEVEL
+
+-- 0x3000 through 0x3FFF are reserved for clip planes
+clipPlaneIndexToEnum :: GLsizei -> Maybe GLenum
+clipPlaneIndexToEnum i
+   | 0 <= i && i <= maxClipPlaneIndex = Just (GL_CLIP_DISTANCE0 + fromIntegral i)
+   | otherwise = Nothing
+
+maxClipPlaneIndex :: GLsizei
+maxClipPlaneIndex = 0xFFF
+
+-----------------------------------------------------------------------------
+
+data PNameNI
+    = GetCompressedTextureFormats
+    | GetShaderBinaryFormats
+    | GetProgramBinaryFormats
+
+instance GetPNameNI PNameNI where
+
+instance GetPName   PNameNI where
+   marshalGetPName pn = case pn of
+      GetCompressedTextureFormats -> Just GL_COMPRESSED_TEXTURE_FORMATS
+      GetShaderBinaryFormats -> Just GL_SHADER_BINARY_FORMATS
+      GetProgramBinaryFormats -> Just GL_PROGRAM_BINARY_FORMATS
+
+-----------------------------------------------------------------------------
+
+data PNameMatrix
+    -- coordtrans
+    = GetModelviewMatrix
+    | GetProjectionMatrix
+    | GetTextureMatrix
+    | GetColorMatrix
+    | GetMatrixPalette
+
+instance GetPNameMatrix PNameMatrix where
+
+instance GetPName PNameMatrix where
+    marshalGetPName pn = case pn of
+        -- coordtrans
+        GetModelviewMatrix -> Just GL_MODELVIEW_MATRIX
+        GetProjectionMatrix -> Just GL_PROJECTION_MATRIX
+        GetTextureMatrix -> Just GL_TEXTURE_MATRIX
+        GetColorMatrix -> Just GL_COLOR_MATRIX
+        GetMatrixPalette -> Just GL_MATRIX_PALETTE_ARB
+
+--------------------------------------------------------------------------------
+
+data GetPointervPName =
+   -- core profile
+     DebugCallbackFunction
+   | DebugCallbackUserParam
+   -- compatibility profile
+   | SelectionBufferPointer
+   | FeedbackBufferPointer
+   | VertexArrayPointer
+   | NormalArrayPointer
+   | ColorArrayPointer
+   | SecondaryColorArrayPointer
+   | IndexArrayPointer
+   | TextureCoordArrayPointer
+   | FogCoordArrayPointer
+   | EdgeFlagArrayPointer
+   -- GL_ARB_vertex_blend
+   | WeightArrayPointer
+   -- GL_ARB_matrix_palette
+   | MatrixIndexArrayPointer
+
+marshalGetPointervPName :: GetPointervPName -> GLenum
+marshalGetPointervPName x = case x of
+   DebugCallbackFunction -> GL_DEBUG_CALLBACK_FUNCTION
+   DebugCallbackUserParam -> GL_DEBUG_CALLBACK_USER_PARAM
+   SelectionBufferPointer -> GL_SELECTION_BUFFER_POINTER
+   FeedbackBufferPointer -> GL_FEEDBACK_BUFFER_POINTER
+   VertexArrayPointer -> GL_VERTEX_ARRAY_POINTER
+   NormalArrayPointer -> GL_NORMAL_ARRAY_POINTER
+   ColorArrayPointer -> GL_COLOR_ARRAY_POINTER
+   SecondaryColorArrayPointer -> GL_SECONDARY_COLOR_ARRAY_POINTER
+   IndexArrayPointer -> GL_INDEX_ARRAY_POINTER
+   TextureCoordArrayPointer -> GL_TEXTURE_COORD_ARRAY_POINTER
+   FogCoordArrayPointer -> GL_FOG_COORD_ARRAY_POINTER
+   EdgeFlagArrayPointer -> GL_EDGE_FLAG_ARRAY_POINTER
+   WeightArrayPointer -> GL_WEIGHT_ARRAY_POINTER_ARB
+   MatrixIndexArrayPointer -> GL_MATRIX_INDEX_ARRAY_POINTER_ARB
+
+--------------------------------------------------------------------------------
+
+getPointer :: GetPointervPName -> IO (Ptr a)
+getPointer n = with nullPtr $ \buf -> do
+   glGetPointerv (marshalGetPointervPName n) buf
+   peek buf
diff --git a/src/Graphics/Rendering/OpenGL/GL/QueryUtils/VertexAttrib.hs b/src/Graphics/Rendering/OpenGL/GL/QueryUtils/VertexAttrib.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/QueryUtils/VertexAttrib.hs
@@ -0,0 +1,98 @@
+{-# OPTIONS_HADDOCK hide #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.QueryUtils.VertexAttrib
+-- Copyright   :  (c) Sven Panne 2009-2019, Lars Corbijn 2009-2016
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>, Jason Dagit <dagitj@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-----------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.QueryUtils.VertexAttrib (
+    AttribLocation(..), GetVertexAttribPName(..),
+    getVertexAttribInteger1, getVertexAttribEnum1, getVertexAttribBoolean1,
+    getVertexAttribFloat4, getVertexAttribIInteger4, getVertexAttribIuInteger4,
+    GetVertexAttribPointerPName(..), getVertexAttribPointer
+) where
+
+import Foreign.Marshal.Alloc
+import Foreign.Marshal.Utils
+import Foreign.Ptr
+import Foreign.Storable
+import Graphics.Rendering.OpenGL.GL.PeekPoke
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+newtype AttribLocation = AttribLocation GLuint
+   deriving ( Eq, Ord, Show )
+
+--------------------------------------------------------------------------------
+
+data GetVertexAttribPName =
+     GetVertexAttribArrayEnabled
+   | GetVertexAttribArraySize
+   | GetVertexAttribArrayStride
+   | GetVertexAttribArrayType
+   | GetVertexAttribArrayNormalized
+   | GetCurrentVertexAttrib
+   | GetVertexAttribArrayBufferBinding
+   | GetVertexAttribArrayInteger
+
+marshalGetVertexAttribPName :: GetVertexAttribPName -> GLenum
+marshalGetVertexAttribPName x = case x of
+   GetVertexAttribArrayEnabled -> GL_VERTEX_ATTRIB_ARRAY_ENABLED
+   GetVertexAttribArraySize -> GL_VERTEX_ATTRIB_ARRAY_SIZE
+   GetVertexAttribArrayStride -> GL_VERTEX_ATTRIB_ARRAY_STRIDE
+   GetVertexAttribArrayType -> GL_VERTEX_ATTRIB_ARRAY_TYPE
+   GetVertexAttribArrayNormalized -> GL_VERTEX_ATTRIB_ARRAY_NORMALIZED
+   GetCurrentVertexAttrib -> GL_CURRENT_VERTEX_ATTRIB
+   GetVertexAttribArrayBufferBinding -> GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING
+   GetVertexAttribArrayInteger -> GL_VERTEX_ATTRIB_ARRAY_INTEGER
+
+--------------------------------------------------------------------------------
+
+getVertexAttribInteger1 :: (GLint -> b) -> AttribLocation -> GetVertexAttribPName -> IO b
+getVertexAttribInteger1 f (AttribLocation location) n = with 0 $ \buf -> do
+   glGetVertexAttribiv location (marshalGetVertexAttribPName n) buf
+   peek1 f buf
+
+getVertexAttribEnum1 :: (GLenum -> b) -> AttribLocation -> GetVertexAttribPName -> IO b
+getVertexAttribEnum1 f = getVertexAttribInteger1 (f . fromIntegral)
+
+getVertexAttribBoolean1 :: (GLboolean -> b) -> AttribLocation -> GetVertexAttribPName -> IO b
+getVertexAttribBoolean1 f = getVertexAttribInteger1 (f . fromIntegral)
+
+getVertexAttribFloat4 :: (GLfloat -> GLfloat -> GLfloat -> GLfloat -> b) -> AttribLocation -> GetVertexAttribPName -> IO b
+getVertexAttribFloat4 f (AttribLocation location) n = alloca $ \buf -> do
+   glGetVertexAttribfv location (marshalGetVertexAttribPName n) buf
+   peek4 f buf
+
+getVertexAttribIInteger4 :: (GLint -> GLint -> GLint -> GLint -> b) -> AttribLocation -> GetVertexAttribPName -> IO b
+getVertexAttribIInteger4 f (AttribLocation location) n = alloca $ \buf -> do
+   glGetVertexAttribIiv location (marshalGetVertexAttribPName n) buf
+   peek4 f buf
+
+getVertexAttribIuInteger4 :: (GLuint -> GLuint -> GLuint -> GLuint -> b) -> AttribLocation -> GetVertexAttribPName -> IO b
+getVertexAttribIuInteger4 f (AttribLocation location) n = alloca $ \buf -> do
+   glGetVertexAttribIuiv location (marshalGetVertexAttribPName n) buf
+   peek4 f buf
+
+--------------------------------------------------------------------------------
+
+data GetVertexAttribPointerPName =
+   VertexAttribArrayPointer
+
+marshalGetVertexAttribPointerPName :: GetVertexAttribPointerPName -> GLenum
+marshalGetVertexAttribPointerPName x = case x of
+   VertexAttribArrayPointer -> GL_VERTEX_ATTRIB_ARRAY_POINTER
+
+--------------------------------------------------------------------------------
+
+getVertexAttribPointer :: AttribLocation -> GetVertexAttribPointerPName -> IO (Ptr a)
+getVertexAttribPointer (AttribLocation location) n = with nullPtr $ \buf -> do
+   glGetVertexAttribPointerv location (marshalGetVertexAttribPointerPName n) buf
+   peek buf
diff --git a/src/Graphics/Rendering/OpenGL/GL/RasterPos.hs b/src/Graphics/Rendering/OpenGL/GL/RasterPos.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/RasterPos.hs
@@ -0,0 +1,187 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.RasterPos
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 2.13 (Current Raster Position) of the
+-- OpenGL 2.1 specs.
+--
+--------------------------------------------------------------------------------
+
+{-# LANGUAGE TypeSynonymInstances #-}
+
+module Graphics.Rendering.OpenGL.GL.RasterPos (
+   currentRasterPosition, RasterPosComponent, RasterPos(..),
+   WindowPosComponent, WindowPos(..),
+   currentRasterDistance, currentRasterColor, currentRasterSecondaryColor,
+   currentRasterIndex, currentRasterTexCoords, currentRasterPositionValid,
+   rasterPositionUnclipped
+) where
+
+import Data.StateVar
+import Foreign.Ptr
+import Graphics.Rendering.OpenGL.GL.Capability
+import Graphics.Rendering.OpenGL.GL.GLboolean
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.Rendering.OpenGL.GL.Tensor
+import Graphics.Rendering.OpenGL.GL.VertexSpec
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+currentRasterPosition :: StateVar (Vertex4 GLfloat)
+currentRasterPosition =
+   makeStateVar (getFloat4 Vertex4 GetCurrentRasterPosition) rasterPos
+
+--------------------------------------------------------------------------------
+
+class RasterPosComponent a where
+   rasterPos2 :: a -> a -> IO ()
+   rasterPos3 :: a -> a -> a -> IO ()
+   rasterPos4 :: a -> a -> a -> a -> IO ()
+
+   rasterPos2v :: Ptr a -> IO ()
+   rasterPos3v :: Ptr a -> IO ()
+   rasterPos4v :: Ptr a -> IO ()
+
+instance RasterPosComponent GLshort where
+   rasterPos2 = glRasterPos2s
+   rasterPos3 = glRasterPos3s
+   rasterPos4 = glRasterPos4s
+
+   rasterPos2v = glRasterPos2sv
+   rasterPos3v = glRasterPos3sv
+   rasterPos4v = glRasterPos4sv
+
+instance RasterPosComponent GLint where
+   rasterPos2 = glRasterPos2i
+   rasterPos3 = glRasterPos3i
+   rasterPos4 = glRasterPos4i
+
+   rasterPos2v = glRasterPos2iv
+   rasterPos3v = glRasterPos3iv
+   rasterPos4v = glRasterPos4iv
+
+instance RasterPosComponent GLfloat where
+   rasterPos2 = glRasterPos2f
+   rasterPos3 = glRasterPos3f
+   rasterPos4 = glRasterPos4f
+
+   rasterPos2v = glRasterPos2fv
+   rasterPos3v = glRasterPos3fv
+   rasterPos4v = glRasterPos4fv
+
+instance RasterPosComponent GLdouble where
+   rasterPos2 = glRasterPos2d
+   rasterPos3 = glRasterPos3d
+   rasterPos4 = glRasterPos4d
+
+   rasterPos2v = glRasterPos2dv
+   rasterPos3v = glRasterPos3dv
+   rasterPos4v = glRasterPos4dv
+
+--------------------------------------------------------------------------------
+
+class RasterPos a where
+   rasterPos  ::     a -> IO ()
+   rasterPosv :: Ptr a -> IO ()
+
+instance RasterPosComponent a => RasterPos (Vertex2 a) where
+   rasterPos (Vertex2 x y) = rasterPos2 x y
+   rasterPosv = rasterPos2v . (castPtr :: Ptr (Vertex2 b) -> Ptr b)
+
+instance RasterPosComponent a => RasterPos (Vertex3 a) where
+   rasterPos (Vertex3 x y z) = rasterPos3 x y z
+   rasterPosv = rasterPos3v . (castPtr :: Ptr (Vertex3 b) -> Ptr b)
+
+instance RasterPosComponent a => RasterPos (Vertex4 a) where
+   rasterPos (Vertex4 x y z w) = rasterPos4 x y z w
+   rasterPosv = rasterPos4v . (castPtr :: Ptr (Vertex4 b) -> Ptr b)
+
+--------------------------------------------------------------------------------
+
+class WindowPosComponent a where
+   windowPos2 :: a -> a -> IO ()
+   windowPos3 :: a -> a -> a -> IO ()
+
+   windowPos2v :: Ptr a -> IO ()
+   windowPos3v :: Ptr a -> IO ()
+
+instance WindowPosComponent GLshort where
+   windowPos2 = glWindowPos2s
+   windowPos3 = glWindowPos3s
+
+   windowPos2v = glWindowPos2sv
+   windowPos3v = glWindowPos3sv
+
+instance WindowPosComponent GLint where
+   windowPos2 = glWindowPos2i
+   windowPos3 = glWindowPos3i
+
+   windowPos2v = glWindowPos2iv
+   windowPos3v = glWindowPos3iv
+
+instance WindowPosComponent GLfloat where
+   windowPos2 = glWindowPos2f
+   windowPos3 = glWindowPos3f
+
+   windowPos2v = glWindowPos2fv
+   windowPos3v = glWindowPos3fv
+
+instance WindowPosComponent GLdouble where
+   windowPos2 = glWindowPos2d
+   windowPos3 = glWindowPos3d
+
+   windowPos2v = glWindowPos2dv
+   windowPos3v = glWindowPos3dv
+
+--------------------------------------------------------------------------------
+
+class WindowPos a where
+   windowPos  ::     a -> IO ()
+   windowPosv :: Ptr a -> IO ()
+
+instance WindowPosComponent a => WindowPos (Vertex2 a) where
+   windowPos (Vertex2 x y) = windowPos2 x y
+   windowPosv = windowPos2v . (castPtr :: Ptr (Vertex2 b) -> Ptr b)
+
+instance WindowPosComponent a => WindowPos (Vertex3 a) where
+   windowPos (Vertex3 x y z) = windowPos3 x y z
+   windowPosv = windowPos3v . (castPtr :: Ptr (Vertex3 b) -> Ptr b)
+
+--------------------------------------------------------------------------------
+
+currentRasterDistance :: GettableStateVar GLfloat
+currentRasterDistance =
+   makeGettableStateVar (getFloat1 id GetCurrentRasterDistance)
+
+currentRasterColor :: GettableStateVar (Color4 GLfloat)
+currentRasterColor =
+   makeGettableStateVar (getFloat4 Color4 GetCurrentRasterColor)
+
+currentRasterSecondaryColor :: GettableStateVar (Color4 GLfloat)
+currentRasterSecondaryColor =
+   makeGettableStateVar (getFloat4 Color4 GetCurrentRasterSecondaryColor)
+
+currentRasterIndex :: GettableStateVar (Index1 GLint)
+currentRasterIndex =
+   makeGettableStateVar (getInteger1 Index1 GetCurrentRasterIndex)
+
+currentRasterTexCoords :: GettableStateVar (TexCoord4 GLfloat)
+currentRasterTexCoords =
+   makeGettableStateVar (getFloat4 TexCoord4 GetCurrentRasterTextureCoords)
+
+currentRasterPositionValid :: GettableStateVar Bool
+currentRasterPositionValid =
+   makeGettableStateVar
+      (getBoolean1 unmarshalGLboolean GetCurrentRasterPositionValid)
+
+--------------------------------------------------------------------------------
+
+rasterPositionUnclipped :: StateVar Capability
+rasterPositionUnclipped = makeCapability CapRasterPositionUnclipped
diff --git a/src/Graphics/Rendering/OpenGL/GL/ReadCopyPixels.hs b/src/Graphics/Rendering/OpenGL/GL/ReadCopyPixels.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/ReadCopyPixels.hs
@@ -0,0 +1,103 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.ReadCopyPixels
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 4.3 (Drawing, Reading, and Copying Pixels)
+-- of the OpenGL 2.1 specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.ReadCopyPixels (
+   -- * Reading Pixels
+   readPixels, readBuffer,
+
+   -- * Copying Pixels
+   PixelCopyType(..), copyPixels,
+
+   -- * Copying Pixels for framebuffers
+   BlitBuffer(..), blitFramebuffer
+) where
+
+import Data.StateVar
+import Graphics.Rendering.OpenGL.GL.BufferMode
+import Graphics.Rendering.OpenGL.GL.CoordTrans
+import Graphics.Rendering.OpenGL.GL.PixelData
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.Rendering.OpenGL.GL.Texturing.Filter
+import Graphics.Rendering.OpenGL.GLU.ErrorsInternal
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+readPixels :: Position -> Size -> PixelData a -> IO ()
+readPixels (Position x y) (Size w h) pd =
+   withPixelData pd $ glReadPixels x y w h
+
+--------------------------------------------------------------------------------
+
+readBuffer :: StateVar BufferMode
+readBuffer =
+   makeStateVar
+      (getEnum1 unmarshalBufferMode GetReadBuffer)
+      (maybe recordInvalidValue glReadBuffer . marshalBufferMode)
+
+--------------------------------------------------------------------------------
+
+data PixelCopyType =
+     CopyColor
+   | CopyDepth
+   | CopyStencil
+   deriving ( Eq, Ord, Show )
+
+marshalPixelCopyType :: PixelCopyType -> GLenum
+marshalPixelCopyType x = case x of
+   CopyColor -> GL_COLOR
+   CopyDepth -> GL_DEPTH
+   CopyStencil -> GL_STENCIL
+
+--------------------------------------------------------------------------------
+
+copyPixels :: Position -> Size -> PixelCopyType -> IO ()
+copyPixels (Position x y) (Size w h) t =
+   glCopyPixels x y w h (marshalPixelCopyType t)
+
+--------------------------------------------------------------------------------
+
+-- | The buffers which can be copied with 'blitFramebuffer'.
+
+data BlitBuffer =
+     ColorBuffer'
+   | StencilBuffer'
+   | DepthBuffer'
+   deriving ( Eq, Ord, Show )
+
+marshalBlitBuffer :: BlitBuffer -> GLbitfield
+marshalBlitBuffer x = case x of
+   ColorBuffer' -> GL_COLOR_BUFFER_BIT
+   StencilBuffer' -> GL_STENCIL_BUFFER_BIT
+   DepthBuffer' -> GL_DEPTH_BUFFER_BIT
+
+--------------------------------------------------------------------------------
+
+blitFramebuffer :: Position
+                -> Position
+                -> Position
+                -> Position
+                -> [BlitBuffer]
+                -> TextureFilter
+                -> IO ()
+blitFramebuffer (Position sx0 sy0)
+                (Position sx1 sy1)
+                (Position dx0 dy0)
+                (Position dx1 dy1)
+                buffers
+                filt =
+   glBlitFramebuffer sx0 sy0 sx1 sy1 dx0 dy0 dx1 dy1
+                     (sum (map marshalBlitBuffer buffers))
+                     (fromIntegral (marshalMagnificationFilter filt))
diff --git a/src/Graphics/Rendering/OpenGL/GL/Rectangles.hs b/src/Graphics/Rendering/OpenGL/GL/Rectangles.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/Rectangles.hs
@@ -0,0 +1,65 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.Rectangles
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+-- 
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 10.9 (Rectangles) of the OpenGL 4.4 specs.
+--
+--------------------------------------------------------------------------------
+
+{-# LANGUAGE TypeSynonymInstances #-}
+
+module Graphics.Rendering.OpenGL.GL.Rectangles (
+   Rect(..)
+) where
+
+import Foreign.Ptr
+import Graphics.Rendering.OpenGL.GL.Tensor
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+-- | 'rect' and 'rectv' support 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.
+--
+-- @'rect' ('Vertex2' x1 y1) ('Vertex2' x2, y2)@ is exactly equivalent to the
+-- following sequence:
+--
+-- @
+--    'Graphics.Rendering.OpenGL.GL.BeginEnd.renderPrimitive' 'Graphics.Rendering.OpenGL.GL.BeginEnd.Polygon' $ do
+--        'Graphics.Rendering.OpenGL.GL.VertexSpec.vertex' ('Vertex2' x1 y1)
+--        'Graphics.Rendering.OpenGL.GL.VertexSpec.vertex' ('Vertex2' x2 y1)
+--        'Graphics.Rendering.OpenGL.GL.VertexSpec.vertex' ('Vertex2' x2 y2)
+--        'Graphics.Rendering.OpenGL.GL.VertexSpec.vertex' ('Vertex2' x1 y2)
+-- @
+--
+-- Note that if the second vertex is above and to the right of the first vertex,
+-- the rectangle is constructed with a counterclockwise winding.
+
+class Rect a where
+   rect  :: Vertex2 a -> Vertex2 a -> IO ()
+   rectv :: Ptr     a -> Ptr     a -> IO ()
+
+instance Rect GLshort where
+   rect (Vertex2 x1 y1) (Vertex2 x2 y2) = glRects x1 y1 x2 y2
+   rectv ptr1 ptr2 = glRectsv ptr1 ptr2
+
+instance Rect GLint where
+   rect (Vertex2 x1 y1) (Vertex2 x2 y2) = glRecti x1 y1 x2 y2
+   rectv ptr1 ptr2 = glRectiv ptr1 ptr2
+
+instance Rect GLfloat where
+   rect (Vertex2 x1 y1) (Vertex2 x2 y2) = glRectf x1 y1 x2 y2
+   rectv ptr1 ptr2 = glRectfv ptr1 ptr2
+
+instance Rect GLdouble where
+   rect (Vertex2 x1 y1) (Vertex2 x2 y2) = glRectd x1 y1 x2 y2
+   rectv ptr1 ptr2 = glRectdv ptr1 ptr2
diff --git a/src/Graphics/Rendering/OpenGL/GL/RenderMode.hs b/src/Graphics/Rendering/OpenGL/GL/RenderMode.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/RenderMode.hs
@@ -0,0 +1,60 @@
+{-# OPTIONS_HADDOCK hide #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.RenderMode
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This is a purely internal module related to the current render mode.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.RenderMode (
+   RenderMode(..), withRenderMode, renderMode
+) where
+
+import Data.StateVar
+import Graphics.Rendering.OpenGL.GL.Exception
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+data RenderMode =
+     Render
+   | Feedback
+   | Select
+   deriving ( Eq, Ord, Show )
+
+marshalRenderMode :: RenderMode -> GLenum
+marshalRenderMode x = case x of
+   Render -> GL_RENDER
+   Feedback -> GL_FEEDBACK
+   Select -> GL_SELECT
+
+unmarshalRenderMode :: GLenum -> RenderMode
+unmarshalRenderMode x
+   | x == GL_RENDER = Render
+   | x == GL_FEEDBACK = Feedback
+   | x == GL_SELECT = Select
+   | otherwise = error ("unmarshalRenderMode: illegal value " ++ show x)
+
+--------------------------------------------------------------------------------
+
+withRenderMode :: RenderMode -> IO a -> IO (a, GLint)
+withRenderMode newMode action = do
+   oldMode <- get renderMode
+   _ <- setRenderMode newMode
+   action `finallyRet` setRenderMode oldMode
+
+setRenderMode :: RenderMode -> IO GLint
+setRenderMode = glRenderMode . marshalRenderMode
+
+--------------------------------------------------------------------------------
+
+renderMode :: GettableStateVar RenderMode
+renderMode = makeGettableStateVar $ getEnum1 unmarshalRenderMode GetRenderMode
diff --git a/src/Graphics/Rendering/OpenGL/GL/SavingState.hs b/src/Graphics/Rendering/OpenGL/GL/SavingState.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/SavingState.hs
@@ -0,0 +1,105 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.SavingState
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+-- 
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 6.1.14 (Saving and Restoring State) of the
+-- OpenGL 2.1 specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.SavingState (
+   ServerAttributeGroup(..), preservingAttrib,
+   ClientAttributeGroup(..), preservingClientAttrib
+) where
+
+import Graphics.Rendering.OpenGL.GL.Exception ( bracket_ )
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+data ServerAttributeGroup =
+     CurrentAttributes
+   | PointAttributes
+   | LineAttributes
+   | PolygonAttributes
+   | PolygonStippleAttributes
+   | PixelModeAttributes
+   | LightingAttributes
+   | FogAttributes
+   | DepthBufferAttributes
+   | AccumBufferAttributes
+   | StencilBufferAttributes
+   | ViewportAttributes
+   | TransformAttributes
+   | EnableAttributes
+   | ColorBufferAttributes
+   | HintAttributes
+   | EvalAttributes
+   | ListAttributes
+   | TextureAttributes
+   | ScissorAttributes
+   | MultisampleAttributes
+   | AllServerAttributes
+   deriving ( Eq, Ord, Show )
+
+marshalServerAttributeGroup :: ServerAttributeGroup -> GLbitfield
+marshalServerAttributeGroup x = case x of
+   CurrentAttributes -> GL_CURRENT_BIT
+   PointAttributes -> GL_POINT_BIT
+   LineAttributes -> GL_LINE_BIT
+   PolygonAttributes -> GL_POLYGON_BIT
+   PolygonStippleAttributes -> GL_POLYGON_STIPPLE_BIT
+   PixelModeAttributes -> GL_PIXEL_MODE_BIT
+   LightingAttributes -> GL_LIGHTING_BIT
+   FogAttributes -> GL_FOG_BIT
+   DepthBufferAttributes -> GL_DEPTH_BUFFER_BIT
+   AccumBufferAttributes -> GL_ACCUM_BUFFER_BIT
+   StencilBufferAttributes -> GL_STENCIL_BUFFER_BIT
+   ViewportAttributes -> GL_VIEWPORT_BIT
+   TransformAttributes -> GL_TRANSFORM_BIT
+   EnableAttributes -> GL_ENABLE_BIT
+   ColorBufferAttributes -> GL_COLOR_BUFFER_BIT
+   HintAttributes -> GL_HINT_BIT
+   EvalAttributes -> GL_EVAL_BIT
+   ListAttributes -> GL_LIST_BIT
+   TextureAttributes -> GL_TEXTURE_BIT
+   ScissorAttributes -> GL_SCISSOR_BIT
+   MultisampleAttributes -> GL_MULTISAMPLE_BIT
+   AllServerAttributes -> GL_ALL_ATTRIB_BITS
+
+--------------------------------------------------------------------------------
+
+preservingAttrib :: [ServerAttributeGroup] -> IO a -> IO a
+preservingAttrib groups = bracket_ (pushAttrib groups) glPopAttrib
+
+pushAttrib :: [ServerAttributeGroup] -> IO ()
+pushAttrib = glPushAttrib . sum . map marshalServerAttributeGroup
+
+--------------------------------------------------------------------------------
+
+data ClientAttributeGroup =
+     PixelStoreAttributes
+   | VertexArrayAttributes
+   | AllClientAttributes
+   deriving ( Eq, Ord, Show )
+
+marshalClientAttributeGroup :: ClientAttributeGroup -> GLbitfield
+marshalClientAttributeGroup x = case x of
+   PixelStoreAttributes -> GL_CLIENT_PIXEL_STORE_BIT
+   VertexArrayAttributes -> GL_CLIENT_VERTEX_ARRAY_BIT
+   AllClientAttributes -> GL_CLIENT_ALL_ATTRIB_BITS
+
+--------------------------------------------------------------------------------
+
+preservingClientAttrib :: [ClientAttributeGroup] -> IO a -> IO a
+preservingClientAttrib groups =
+   bracket_ (pushClientAttrib groups) glPopClientAttrib
+
+pushClientAttrib :: [ClientAttributeGroup] -> IO ()
+pushClientAttrib = glPushClientAttrib . sum . map marshalClientAttributeGroup
diff --git a/src/Graphics/Rendering/OpenGL/GL/Selection.hs b/src/Graphics/Rendering/OpenGL/GL/Selection.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/Selection.hs
@@ -0,0 +1,88 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.Selection
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+-- 
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 5.2 (Selection) of the OpenGL 2.1 specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.Selection (
+   HitRecord(..), getHitRecords,
+   Name(..), withName, loadName, maxNameStackDepth, nameStackDepth,
+   RenderMode(..), renderMode
+) where
+
+import Data.StateVar
+import Foreign.Marshal.Array
+import Foreign.Ptr
+import Graphics.Rendering.OpenGL.GL.Exception
+import Graphics.Rendering.OpenGL.GL.IOState
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.Rendering.OpenGL.GL.RenderMode
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+data HitRecord = HitRecord GLfloat GLfloat [Name]
+   deriving ( Eq, Ord, Show )
+
+--------------------------------------------------------------------------------
+
+getHitRecords :: GLsizei -> IO a -> IO (a, Maybe [HitRecord])
+getHitRecords bufSize action =
+   allocaArray (fromIntegral bufSize) $ \buf -> do
+      glSelectBuffer bufSize buf
+      (value, numHits) <- withRenderMode Select $ do
+         glInitNames
+         action
+      hits <- parseSelectionBuffer numHits buf
+      return (value, hits)
+
+--------------------------------------------------------------------------------
+
+parseSelectionBuffer :: GLint -> Ptr GLuint -> IO (Maybe [HitRecord])
+parseSelectionBuffer numHits buf
+   | numHits < 0 = return Nothing
+   | otherwise = fmap Just $ evalIOState (nTimes numHits parseSelectionHit) buf
+
+type Parser a = IOState GLuint a
+
+parseSelectionHit :: Parser HitRecord
+parseSelectionHit = do
+   numNames <- parseGLuint
+   minZ <- parseGLfloat
+   maxZ <- parseGLfloat
+   nameStack <- nTimes numNames parseName
+   return $ HitRecord minZ maxZ nameStack
+
+parseGLuint :: Parser GLuint
+parseGLuint = peekIOState
+
+parseGLfloat :: Parser GLfloat
+parseGLfloat = fmap (\x -> fromIntegral x / 0xffffffff) parseGLuint
+
+parseName :: Parser Name
+parseName = fmap Name parseGLuint
+
+--------------------------------------------------------------------------------
+
+newtype Name = Name GLuint
+   deriving ( Eq, Ord, Show )
+
+withName :: Name -> IO a -> IO a
+withName (Name name) = bracket_ (glPushName name) glPopName
+
+loadName :: Name -> IO ()
+loadName (Name n) = glLoadName n
+
+maxNameStackDepth :: GettableStateVar GLsizei
+maxNameStackDepth = makeGettableStateVar (getSizei1 id GetMaxNameStackDepth)
+
+nameStackDepth :: GettableStateVar GLsizei
+nameStackDepth = makeGettableStateVar (getSizei1 id GetNameStackDepth)
diff --git a/src/Graphics/Rendering/OpenGL/GL/Shaders.hs b/src/Graphics/Rendering/OpenGL/GL/Shaders.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/Shaders.hs
@@ -0,0 +1,32 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.Shaders
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 7 (Programs and Shaders) of the OpenGL 4.4
+-- specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.Shaders (
+   module Graphics.Rendering.OpenGL.GL.Shaders.ShaderObjects,
+   module Graphics.Rendering.OpenGL.GL.Shaders.ShaderBinaries,
+   module Graphics.Rendering.OpenGL.GL.Shaders.ProgramObjects,
+   module Graphics.Rendering.OpenGL.GL.Shaders.ProgramBinaries,
+   module Graphics.Rendering.OpenGL.GL.Shaders.Attribs,
+   module Graphics.Rendering.OpenGL.GL.Shaders.Uniform,
+   module Graphics.Rendering.OpenGL.GL.Shaders.Limits
+) where
+
+import Graphics.Rendering.OpenGL.GL.Shaders.ShaderObjects
+import Graphics.Rendering.OpenGL.GL.Shaders.ShaderBinaries
+import Graphics.Rendering.OpenGL.GL.Shaders.ProgramObjects
+import Graphics.Rendering.OpenGL.GL.Shaders.ProgramBinaries
+import Graphics.Rendering.OpenGL.GL.Shaders.Attribs
+import Graphics.Rendering.OpenGL.GL.Shaders.Uniform
+import Graphics.Rendering.OpenGL.GL.Shaders.Limits
diff --git a/src/Graphics/Rendering/OpenGL/GL/Shaders/Attribs.hs b/src/Graphics/Rendering/OpenGL/GL/Shaders/Attribs.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/Shaders/Attribs.hs
@@ -0,0 +1,61 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.Shaders.Attribs
+-- Copyright   :  (c) Sven Panne 2006-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module contains functions related to shader attributes, corresponding
+-- to section 2.20.3 of the OpenGL 3.1 spec (Shader Variables).
+--
+-----------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.Shaders.Attribs (
+   attribLocation, VariableType(..), activeAttribs,
+) where
+
+import Data.StateVar
+import Graphics.Rendering.OpenGL.GL.ByteString
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.Rendering.OpenGL.GL.Shaders.Program
+import Graphics.Rendering.OpenGL.GL.Shaders.Variables
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+activeAttributes :: Program -> GettableStateVar GLuint
+activeAttributes = programVar1 fromIntegral ActiveAttributes
+
+activeAttributeMaxLength :: Program -> GettableStateVar GLsizei
+activeAttributeMaxLength = programVar1 fromIntegral ActiveAttributeMaxLength
+
+--------------------------------------------------------------------------------
+
+attribLocation :: Program -> String -> StateVar AttribLocation
+attribLocation program name =
+   makeStateVar (getAttribLocation program name)
+                (\location -> bindAttribLocation program location name)
+
+getAttribLocation :: Program -> String -> IO AttribLocation
+getAttribLocation (Program program) name =
+   fmap (AttribLocation . fromIntegral) $
+      withGLstring name $
+         glGetAttribLocation program
+
+bindAttribLocation :: Program -> AttribLocation -> String -> IO ()
+bindAttribLocation (Program program) (AttribLocation location) name =
+   withGLstring name $
+      glBindAttribLocation program location
+
+--------------------------------------------------------------------------------
+
+activeAttribs :: Program -> GettableStateVar [(GLint,VariableType,String)]
+activeAttribs =
+   activeVars
+      activeAttributes
+      activeAttributeMaxLength
+      glGetActiveAttrib
+      unmarshalVariableType
diff --git a/src/Graphics/Rendering/OpenGL/GL/Shaders/Limits.hs b/src/Graphics/Rendering/OpenGL/GL/Shaders/Limits.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/Shaders/Limits.hs
@@ -0,0 +1,80 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.Shaders.Limits
+-- Copyright   :  (c) Sven Panne 2006-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module contains functions related to shader limits.
+--
+-----------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.Shaders.Limits (
+   maxVertexTextureImageUnits, maxTextureImageUnits,
+   maxCombinedTextureImageUnits, maxTextureCoords, maxVertexUniformComponents,
+   maxFragmentUniformComponents, maxVertexAttribs, maxVaryingFloats
+) where
+
+import Data.StateVar
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.GL
+
+-----------------------------------------------------------------------------
+
+-- | Contains the number of hardware units that can be used to access texture
+-- maps from the vertex processor. The minimum legal value is 0.
+
+maxVertexTextureImageUnits :: GettableStateVar GLsizei
+maxVertexTextureImageUnits = getLimit GetMaxVertexTextureImageUnits
+
+-- | Contains the total number of hardware units that can be used to access
+-- texture maps from the fragment processor. The minimum legal value is 2.
+
+maxTextureImageUnits :: GettableStateVar GLsizei
+maxTextureImageUnits = getLimit GetMaxTextureImageUnits
+
+-- | Contains the total number of hardware units that can be used to access
+-- texture maps from the vertex processor and the fragment processor combined.
+-- Note: If the vertex shader and the fragment processing stage access the same
+-- texture image unit, then that counts as using two texture image units. The
+-- minimum legal value is 2.
+
+maxCombinedTextureImageUnits :: GettableStateVar GLsizei
+maxCombinedTextureImageUnits = getLimit GetMaxCombinedTextureImageUnits
+
+-- | Contains the number of texture coordinate sets that are available. The
+-- minimum legal value is 2.
+
+maxTextureCoords :: GettableStateVar GLsizei
+maxTextureCoords = getLimit GetMaxTextureCoords
+
+-- | Contains the number of individual components (i.e., floating-point, integer
+-- or boolean values) that are available for vertex shader uniform variables.
+-- The minimum legal value is 512.
+maxVertexUniformComponents :: GettableStateVar GLsizei
+maxVertexUniformComponents = getLimit GetMaxVertexUniformComponents
+
+-- | Contains the number of individual components (i.e., floating-point, integer
+-- or boolean values) that are available for fragment shader uniform variables.
+-- The minimum legal value is 64.
+
+maxFragmentUniformComponents :: GettableStateVar GLsizei
+maxFragmentUniformComponents = getLimit GetMaxFragmentUniformComponents
+
+-- | Contains the number of active vertex attributes that are available. The
+-- minimum legal value is 16.
+
+maxVertexAttribs :: GettableStateVar GLsizei
+maxVertexAttribs = getLimit GetMaxVertexAttribs
+
+-- | Contains the number of individual floating-point values available for
+-- varying variables. The minimum legal value is 32.
+
+maxVaryingFloats :: GettableStateVar GLsizei
+maxVaryingFloats = getLimit GetMaxVaryingFloats
+
+getLimit :: PName1I -> GettableStateVar GLsizei
+getLimit = makeGettableStateVar . getSizei1 id
diff --git a/src/Graphics/Rendering/OpenGL/GL/Shaders/Program.hs b/src/Graphics/Rendering/OpenGL/GL/Shaders/Program.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/Shaders/Program.hs
@@ -0,0 +1,120 @@
+{-# OPTIONS_HADDOCK hide #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.Shaders.Program
+-- Copyright   :  (c) Sven Panne 2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This is a purely internal module for handling program objects and related
+-- queries.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.Shaders.Program (
+   Program(..),
+   GetProgramPName(..), marshalGetProgramPName,
+   programVar1, programVar3
+) where
+
+import Control.Monad.IO.Class
+import Data.ObjectName
+import Data.StateVar
+import Foreign.Marshal.Utils ( with )
+import Foreign.Ptr ( Ptr )
+import Graphics.Rendering.OpenGL.GL.DebugOutput
+import Graphics.Rendering.OpenGL.GL.GLboolean
+import Graphics.Rendering.OpenGL.GL.PeekPoke
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+newtype Program = Program { programID :: GLuint }
+   deriving ( Eq, Ord, Show )
+
+instance ObjectName Program where
+   isObjectName = liftIO . fmap unmarshalGLboolean . glIsProgram . programID
+   deleteObjectName = liftIO . glDeleteProgram . programID
+
+instance CanBeLabeled Program where
+   objectLabel = objectNameLabel GL_PROGRAM . programID
+
+--------------------------------------------------------------------------------
+
+data GetProgramPName =
+     ProgramDeleteStatus
+   | LinkStatus
+   | ValidateStatus
+   | ProgramInfoLogLength
+   | AttachedShaders
+   | ActiveAttributes
+   | ActiveAttributeMaxLength
+   | ActiveUniforms
+   | ActiveUniformMaxLength
+   | TransformFeedbackBufferMode
+   | TransformFeedbackVaryings
+   | TransformFeedbackVaryingMaxLength
+   | ActiveUniformBlocks
+   | ActiveUniformBlockMaxNameLength
+   | GeometryVerticesOut
+   | GeometryInputType
+   | GeometryOutputType
+   | GeometryShaderInvocations
+   | TessControlOutputVertices
+   | TessGenMode
+   | TessGenSpacing
+   | TessGenVertexOrder
+   | TessGenPointMode
+   | ComputeWorkGroupSize  -- 3 integers!
+   | ProgramSeparable
+   | ProgramBinaryRetrievableHint
+   | ActiveAtomicCounterBuffers
+   | ProgramBinaryLength
+
+marshalGetProgramPName :: GetProgramPName -> GLenum
+marshalGetProgramPName x = case x of
+   ProgramDeleteStatus -> GL_DELETE_STATUS
+   LinkStatus -> GL_LINK_STATUS
+   ValidateStatus -> GL_VALIDATE_STATUS
+   ProgramInfoLogLength -> GL_INFO_LOG_LENGTH
+   AttachedShaders -> GL_ATTACHED_SHADERS
+   ActiveAttributes -> GL_ACTIVE_ATTRIBUTES
+   ActiveAttributeMaxLength -> GL_ACTIVE_ATTRIBUTE_MAX_LENGTH
+   ActiveUniforms -> GL_ACTIVE_UNIFORMS
+   ActiveUniformMaxLength -> GL_ACTIVE_UNIFORM_MAX_LENGTH
+   TransformFeedbackBufferMode -> GL_TRANSFORM_FEEDBACK_BUFFER_MODE
+   TransformFeedbackVaryings -> GL_TRANSFORM_FEEDBACK_VARYINGS
+   TransformFeedbackVaryingMaxLength -> GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH
+   ActiveUniformBlocks -> GL_ACTIVE_UNIFORM_BLOCKS
+   ActiveUniformBlockMaxNameLength -> GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH
+   GeometryVerticesOut -> GL_GEOMETRY_VERTICES_OUT
+   GeometryInputType -> GL_GEOMETRY_INPUT_TYPE
+   GeometryOutputType -> GL_GEOMETRY_OUTPUT_TYPE
+   GeometryShaderInvocations -> GL_GEOMETRY_SHADER_INVOCATIONS
+   TessControlOutputVertices -> GL_TESS_CONTROL_OUTPUT_VERTICES
+   TessGenMode -> GL_TESS_GEN_MODE
+   TessGenSpacing -> GL_TESS_GEN_SPACING
+   TessGenVertexOrder -> GL_TESS_GEN_VERTEX_ORDER
+   TessGenPointMode -> GL_TESS_GEN_POINT_MODE
+   ComputeWorkGroupSize -> GL_COMPUTE_WORK_GROUP_SIZE
+   ProgramSeparable -> GL_PROGRAM_SEPARABLE
+   ProgramBinaryRetrievableHint -> GL_PROGRAM_BINARY_RETRIEVABLE_HINT
+   ActiveAtomicCounterBuffers -> GL_ACTIVE_ATOMIC_COUNTER_BUFFERS
+   ProgramBinaryLength -> GL_PROGRAM_BINARY_LENGTH
+
+programVar1 :: (GLint -> a) -> GetProgramPName -> Program -> GettableStateVar a
+programVar1 = programVarN . peek1
+
+programVar3 :: (GLint -> GLint -> GLint -> a) -> GetProgramPName -> Program -> GettableStateVar a
+programVar3 = programVarN . peek3
+
+programVarN :: (Ptr GLint -> IO a) -> GetProgramPName -> Program -> GettableStateVar a
+programVarN f p program =
+   makeGettableStateVar $
+      with 0 $ \buf -> do
+         glGetProgramiv (programID program) (marshalGetProgramPName p) buf
+         f buf
diff --git a/src/Graphics/Rendering/OpenGL/GL/Shaders/ProgramBinaries.hs b/src/Graphics/Rendering/OpenGL/GL/Shaders/ProgramBinaries.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/Shaders/ProgramBinaries.hs
@@ -0,0 +1,63 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.Shaders.ProgramBinaries
+-- Copyright   :  (c) Sven Panne 2006-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 7.5 (Program Binaries) of the OpenGL 4.4
+-- spec.
+--
+-----------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.Shaders.ProgramBinaries (
+   ProgramBinaryFormat(..), programBinaryFormats,
+   ProgramBinary(..), programBinary
+) where
+
+import Data.StateVar
+import Foreign.Marshal.Alloc
+import Graphics.Rendering.OpenGL.GL.ByteString
+import Graphics.Rendering.OpenGL.GL.PeekPoke
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.Rendering.OpenGL.GL.Shaders.Program
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+newtype ProgramBinaryFormat = ProgramBinaryFormat GLenum
+   deriving ( Eq, Ord, Show )
+
+programBinaryFormats :: GettableStateVar [ProgramBinaryFormat]
+programBinaryFormats =
+   makeGettableStateVar $ do
+      n <- getInteger1 fromIntegral GetNumProgramBinaryFormats
+      getEnumN ProgramBinaryFormat GetProgramBinaryFormats n
+
+data ProgramBinary = ProgramBinary ProgramBinaryFormat ByteString
+   deriving ( Eq, Ord, Show )
+
+programBinary :: Program -> StateVar ProgramBinary
+programBinary program =
+   makeStateVar (getProgramBinary program) (setProgramBinary program)
+
+getProgramBinary :: Program -> IO ProgramBinary
+getProgramBinary program =
+   alloca $ \formatBuf -> do
+      let getBin = bind4th formatBuf (glGetProgramBinary . programID)
+      bs <- stringQuery programBinaryLength getBin program
+      format <- peek1 ProgramBinaryFormat formatBuf
+      return $ ProgramBinary format bs
+
+bind4th :: d -> (a -> b -> c -> d -> e) -> (a -> b -> c -> e)
+bind4th x = ((.) . (.) . (.)) ($ x)
+
+setProgramBinary :: Program -> ProgramBinary -> IO ()
+setProgramBinary program (ProgramBinary (ProgramBinaryFormat format) bs) = do
+   withByteString bs $ glProgramBinary (programID program) format
+
+programBinaryLength :: Program -> GettableStateVar GLsizei
+programBinaryLength = programVar1 fromIntegral ProgramBinaryLength
diff --git a/src/Graphics/Rendering/OpenGL/GL/Shaders/ProgramObjects.hs b/src/Graphics/Rendering/OpenGL/GL/Shaders/ProgramObjects.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/Shaders/ProgramObjects.hs
@@ -0,0 +1,163 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.Shaders.ProgramObjects
+-- Copyright   :  (c) Sven Panne 2006-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 7.3 (Program Objects) of the OpenGL 4.4
+-- spec.
+--
+-----------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.Shaders.ProgramObjects (
+   -- * Program Objects
+   Program, createProgram, programDeleteStatus,
+   attachShader, detachShader, attachedShaders,
+   linkProgram, linkStatus,
+   validateProgram, validateStatus,
+   programInfoLog,
+   currentProgram,
+   programSeparable, programBinaryRetrievableHint,
+
+   -- TODOs:
+   --    glCreateShaderProgramv
+   --    ProgramInterface type (from 7.3.1)
+   --    glGetProgramInterfaceiv
+   --    glGetProgramResourceIndex
+   --    glGetProgramResourceName
+   --    glGetProgramResourceiv
+   --    glGetProgramResourceLocation
+   --    glGetProgramResourceLocationIndex
+
+   -- * Fragment Data
+   bindFragDataLocation, getFragDataLocation
+) where
+
+import Data.List
+import Data.Maybe
+import Data.StateVar
+import Foreign.Marshal.Array
+import Foreign.Ptr
+import Graphics.Rendering.OpenGL.GL.ByteString
+import Graphics.Rendering.OpenGL.GL.Framebuffer
+import Graphics.Rendering.OpenGL.GL.GLboolean
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.Rendering.OpenGL.GL.Shaders.Program
+import Graphics.Rendering.OpenGL.GL.Shaders.Shader
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+createProgram :: IO Program
+createProgram = fmap Program glCreateProgram
+
+--------------------------------------------------------------------------------
+
+attachShader :: Program -> Shader -> IO ()
+attachShader p s = glAttachShader (programID p) (shaderID s)
+
+detachShader :: Program -> Shader -> IO ()
+detachShader p s = glDetachShader (programID p) (shaderID s)
+
+attachedShaders :: Program -> StateVar [Shader]
+attachedShaders program =
+   makeStateVar (getAttachedShaders program) (setAttachedShaders program)
+
+getAttachedShaders :: Program -> IO [Shader]
+getAttachedShaders program = do
+   numShaders <- get (numAttachedShaders program)
+   ids <- allocaArray (fromIntegral numShaders) $ \buf -> do
+      glGetAttachedShaders (programID program) numShaders nullPtr buf
+      peekArray (fromIntegral numShaders) buf
+   return $ map Shader ids
+
+setAttachedShaders :: Program -> [Shader] -> IO ()
+setAttachedShaders program newShaders = do
+   currentShaders <- getAttachedShaders program
+   mapM_ (attachShader program) (newShaders \\ currentShaders)
+   mapM_ (detachShader program) (currentShaders \\ newShaders)
+
+--------------------------------------------------------------------------------
+
+linkProgram :: Program -> IO ()
+linkProgram = glLinkProgram . programID
+
+currentProgram :: StateVar (Maybe Program)
+currentProgram =
+   makeStateVar
+      (do p <- fmap Program $ getInteger1 fromIntegral GetCurrentProgram
+          return $ if p == noProgram then Nothing else Just p)
+      (glUseProgram . programID . fromMaybe noProgram)
+
+noProgram :: Program
+noProgram = Program 0
+
+validateProgram :: Program -> IO ()
+validateProgram = glValidateProgram . programID
+
+programInfoLog :: Program -> GettableStateVar String
+programInfoLog =
+   makeGettableStateVar .
+      fmap unpackUtf8 .
+         stringQuery programInfoLogLength (glGetProgramInfoLog . programID)
+
+--------------------------------------------------------------------------------
+
+programSeparable :: Program -> StateVar Bool
+programSeparable = programStateVarBool ProgramSeparable
+
+programBinaryRetrievableHint :: Program -> StateVar Bool
+programBinaryRetrievableHint = programStateVarBool ProgramBinaryRetrievableHint
+
+programStateVarBool :: GetProgramPName -> Program -> StateVar Bool
+programStateVarBool pname program =
+   makeStateVar
+      (get (programVar1 unmarshalGLboolean pname program))
+      (glProgramParameteri (programID program)
+                           (marshalGetProgramPName pname) . marshalGLboolean)
+
+--------------------------------------------------------------------------------
+
+programDeleteStatus :: Program -> GettableStateVar Bool
+programDeleteStatus = programVar1 unmarshalGLboolean ProgramDeleteStatus
+
+linkStatus :: Program -> GettableStateVar Bool
+linkStatus = programVar1 unmarshalGLboolean LinkStatus
+
+validateStatus :: Program -> GettableStateVar Bool
+validateStatus = programVar1 unmarshalGLboolean ValidateStatus
+
+programInfoLogLength :: Program -> GettableStateVar GLsizei
+programInfoLogLength = programVar1 fromIntegral ProgramInfoLogLength
+
+numAttachedShaders :: Program -> GettableStateVar GLsizei
+numAttachedShaders = programVar1 fromIntegral AttachedShaders
+
+--------------------------------------------------------------------------------
+
+-- | 'bindFragDataLocation' binds a varying variable, specified by program and name, to a
+-- drawbuffer. The effects only take place after succesfull linking of the program.
+-- invalid arguments and conditions are
+-- - an index larger than maxDrawBufferIndex
+-- - names starting with 'gl_'
+-- linking failure will ocure when
+-- - one of the arguments was invalid
+-- - more than one varying varuable name is bound to the same index
+-- It's not an error to specify unused variables, those will be ingored.
+bindFragDataLocation :: Program -> String -> SettableStateVar DrawBufferIndex
+bindFragDataLocation (Program program) varName = makeSettableStateVar $ \ind ->
+   withGLstring varName $ glBindFragDataLocation program ind
+
+-- | query the binding of a given variable, specified by program and name. The program has to be
+-- linked. The result is Nothing if an error occures or the name is not a name of a varying
+-- variable. If the program hasn't been linked an 'InvalidOperation' error is generated.
+getFragDataLocation :: Program -> String -> IO (Maybe DrawBufferIndex)
+getFragDataLocation (Program program) varName = do
+   r <- withGLstring varName $ glGetFragDataLocation program
+   if r < 0
+    then return Nothing
+    else return . Just $ fromIntegral r
diff --git a/src/Graphics/Rendering/OpenGL/GL/Shaders/Shader.hs b/src/Graphics/Rendering/OpenGL/GL/Shaders/Shader.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/Shaders/Shader.hs
@@ -0,0 +1,37 @@
+{-# OPTIONS_HADDOCK hide #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.Shaders.Shader
+-- Copyright   :  (c) Sven Panne 2019
+-- License     :  BSD3
+-- 
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This is a purely internal module for handling shader objects.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.Shaders.Shader (
+   Shader(..)
+) where
+
+import Control.Monad.IO.Class
+import Data.ObjectName
+import Graphics.Rendering.OpenGL.GL.DebugOutput
+import Graphics.Rendering.OpenGL.GL.GLboolean
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+newtype Shader = Shader { shaderID :: GLuint }
+   deriving ( Eq, Ord, Show )
+
+instance ObjectName Shader where
+   isObjectName = liftIO . fmap unmarshalGLboolean . glIsShader . shaderID
+   deleteObjectName = liftIO . glDeleteShader . shaderID
+
+instance CanBeLabeled Shader where
+   objectLabel = objectNameLabel GL_SHADER . shaderID
diff --git a/src/Graphics/Rendering/OpenGL/GL/Shaders/ShaderBinaries.hs b/src/Graphics/Rendering/OpenGL/GL/Shaders/ShaderBinaries.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/Shaders/ShaderBinaries.hs
@@ -0,0 +1,47 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.Shaders.ShaderBinaries
+-- Copyright   :  (c) Sven Panne 2006-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 7.2 (Shader Binaries) of the OpenGL 4.4
+-- spec.
+--
+-----------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.Shaders.ShaderBinaries (
+   ShaderBinaryFormat(..), shaderBinaryFormats,
+   ShaderBinary(..), shaderBinary,
+) where
+
+import Data.StateVar
+import Foreign.Marshal.Array
+import Graphics.Rendering.OpenGL.GL.ByteString
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.Rendering.OpenGL.GL.Shaders.Shader
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+newtype ShaderBinaryFormat = ShaderBinaryFormat GLenum
+   deriving ( Eq, Ord, Show )
+
+shaderBinaryFormats :: GettableStateVar [ShaderBinaryFormat]
+shaderBinaryFormats =
+   makeGettableStateVar $ do
+      n <- getInteger1 fromIntegral GetNumShaderBinaryFormats
+      getEnumN ShaderBinaryFormat GetShaderBinaryFormats n
+
+data ShaderBinary = ShaderBinary ShaderBinaryFormat ByteString
+   deriving ( Eq, Ord, Show )
+
+shaderBinary :: [Shader] -> SettableStateVar ShaderBinary
+shaderBinary shaders =
+   makeSettableStateVar $ \(ShaderBinary (ShaderBinaryFormat format) bs) ->
+      withArrayLen (map shaderID shaders) $ \numShaders shadersBuf ->
+         withByteString bs $
+            glShaderBinary (fromIntegral numShaders) shadersBuf format
diff --git a/src/Graphics/Rendering/OpenGL/GL/Shaders/ShaderObjects.hs b/src/Graphics/Rendering/OpenGL/GL/Shaders/ShaderObjects.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/Shaders/ShaderObjects.hs
@@ -0,0 +1,196 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.Shaders.ShaderObjects
+-- Copyright   :  (c) Sven Panne 2006-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 7.1 (Shader Objects) and 7.13 (Shader,
+-- Program, and Program Pipeline Queries) of the OpenGL 4.4 spec.
+--
+-----------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.Shaders.ShaderObjects (
+   -- * Shader Objects
+   shaderCompiler,
+   ShaderType(..), Shader, createShader,
+   shaderSourceBS, shaderSource, compileShader, releaseShaderCompiler,
+
+   -- * Shader Queries
+   shaderType, shaderDeleteStatus, compileStatus, shaderInfoLog,
+   PrecisionType, shaderPrecisionFormat,
+
+   -- * Bytestring utilities
+   packUtf8, unpackUtf8
+) where
+
+import Control.Monad
+import Data.StateVar
+import Foreign.Marshal.Alloc
+import Foreign.Marshal.Array
+import Foreign.Marshal.Utils
+import Foreign.Storable
+import Graphics.Rendering.OpenGL.GL.ByteString
+import Graphics.Rendering.OpenGL.GL.GLboolean
+import Graphics.Rendering.OpenGL.GL.PeekPoke
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.Rendering.OpenGL.GL.Shaders.Shader
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+shaderCompiler :: GettableStateVar Bool
+shaderCompiler =
+   makeGettableStateVar (getBoolean1 unmarshalGLboolean GetShaderCompiler)
+
+--------------------------------------------------------------------------------
+
+data ShaderType =
+     VertexShader
+   | TessControlShader
+   | TessEvaluationShader
+   | GeometryShader
+   | FragmentShader
+   | ComputeShader
+   deriving ( Eq, Ord, Show )
+
+marshalShaderType :: ShaderType -> GLenum
+marshalShaderType x = case x of
+   VertexShader -> GL_VERTEX_SHADER
+   TessControlShader -> GL_TESS_CONTROL_SHADER
+   TessEvaluationShader -> GL_TESS_EVALUATION_SHADER
+   GeometryShader -> GL_GEOMETRY_SHADER
+   FragmentShader -> GL_FRAGMENT_SHADER
+   ComputeShader -> GL_COMPUTE_SHADER
+
+unmarshalShaderType :: GLenum -> ShaderType
+unmarshalShaderType x
+   | x == GL_VERTEX_SHADER = VertexShader
+   | x == GL_TESS_CONTROL_SHADER = TessControlShader
+   | x == GL_TESS_EVALUATION_SHADER = TessEvaluationShader
+   | x == GL_GEOMETRY_SHADER = GeometryShader
+   | x == GL_FRAGMENT_SHADER = FragmentShader
+   | x == GL_COMPUTE_SHADER = ComputeShader
+   | otherwise = error ("unmarshalShaderType: illegal value " ++ show x)
+
+--------------------------------------------------------------------------------
+
+createShader :: ShaderType -> IO Shader
+createShader = fmap Shader . glCreateShader . marshalShaderType
+
+--------------------------------------------------------------------------------
+
+-- | UTF8 encoded.
+shaderSourceBS :: Shader -> StateVar ByteString
+shaderSourceBS shader =
+   makeStateVar (getShaderSource shader) (setShaderSource shader)
+
+getShaderSource :: Shader -> IO ByteString
+getShaderSource = stringQuery shaderSourceLength (glGetShaderSource . shaderID)
+
+shaderSourceLength :: Shader -> GettableStateVar GLsizei
+shaderSourceLength = shaderVar fromIntegral ShaderSourceLength
+
+setShaderSource :: Shader -> ByteString -> IO ()
+setShaderSource shader src =
+   withByteString src $ \srcPtr srcLength ->
+      with srcPtr $ \srcPtrBuf ->
+         with srcLength $ \srcLengthBuf ->
+            glShaderSource (shaderID shader) 1 srcPtrBuf srcLengthBuf
+
+{-# DEPRECATED shaderSource "Use a combination of 'shaderSourceBS' and 'packUtf8' or 'unpackUtf8' instead." #-}
+shaderSource :: Shader -> StateVar [String]
+shaderSource shader =
+   makeStateVar
+     (fmap ((:[]) . unpackUtf8) $ get (shaderSourceBS shader))
+     ((shaderSourceBS shader $=) . packUtf8 . concat)
+
+--------------------------------------------------------------------------------
+
+compileShader :: Shader -> IO ()
+compileShader = glCompileShader . shaderID
+
+releaseShaderCompiler :: IO ()
+releaseShaderCompiler = glReleaseShaderCompiler
+
+--------------------------------------------------------------------------------
+
+shaderType :: Shader -> GettableStateVar ShaderType
+shaderType = shaderVar (unmarshalShaderType . fromIntegral) ShaderType
+
+shaderDeleteStatus :: Shader -> GettableStateVar Bool
+shaderDeleteStatus = shaderVar unmarshalGLboolean ShaderDeleteStatus
+
+compileStatus :: Shader -> GettableStateVar Bool
+compileStatus = shaderVar unmarshalGLboolean CompileStatus
+
+shaderInfoLog :: Shader -> GettableStateVar String
+shaderInfoLog =
+   makeGettableStateVar .
+      fmap unpackUtf8 .
+         stringQuery shaderInfoLogLength (glGetShaderInfoLog . shaderID)
+
+shaderInfoLogLength :: Shader -> GettableStateVar GLsizei
+shaderInfoLogLength = shaderVar fromIntegral ShaderInfoLogLength
+
+--------------------------------------------------------------------------------
+
+data GetShaderPName =
+     ShaderDeleteStatus
+   | CompileStatus
+   | ShaderInfoLogLength
+   | ShaderSourceLength
+   | ShaderType
+
+marshalGetShaderPName :: GetShaderPName -> GLenum
+marshalGetShaderPName x = case x of
+   ShaderDeleteStatus -> GL_DELETE_STATUS
+   CompileStatus -> GL_COMPILE_STATUS
+   ShaderInfoLogLength -> GL_INFO_LOG_LENGTH
+   ShaderSourceLength -> GL_SHADER_SOURCE_LENGTH
+   ShaderType -> GL_SHADER_TYPE
+
+shaderVar :: (GLint -> a) -> GetShaderPName -> Shader -> GettableStateVar a
+shaderVar f p shader =
+   makeGettableStateVar $
+      with 0 $ \buf -> do
+         glGetShaderiv (shaderID shader) (marshalGetShaderPName p) buf
+         peek1 f buf
+
+--------------------------------------------------------------------------------
+
+data PrecisionType =
+     LowFloat
+   | MediumFloat
+   | HighFloat
+   | LowInt
+   | MediumInt
+   | HighInt
+   deriving ( Eq, Ord, Show )
+
+marshalPrecisionType :: PrecisionType -> GLenum
+marshalPrecisionType x = case x of
+   LowFloat -> GL_LOW_FLOAT
+   MediumFloat -> GL_MEDIUM_FLOAT
+   HighFloat -> GL_HIGH_FLOAT
+   LowInt -> GL_LOW_INT
+   MediumInt -> GL_MEDIUM_INT
+   HighInt -> GL_HIGH_INT
+
+--------------------------------------------------------------------------------
+
+shaderPrecisionFormat :: ShaderType
+                      -> PrecisionType
+                      -> GettableStateVar ((GLint,GLint),GLint)
+shaderPrecisionFormat st pt =
+   makeGettableStateVar $
+      allocaArray 2 $ \rangeBuf ->
+         alloca $ \precisionBuf -> do
+            glGetShaderPrecisionFormat (marshalShaderType st)
+                                       (marshalPrecisionType pt)
+                                       rangeBuf
+                                       precisionBuf
+            liftM2 (,) (peek2 (,) rangeBuf) (peek precisionBuf)
diff --git a/src/Graphics/Rendering/OpenGL/GL/Shaders/Uniform.hs b/src/Graphics/Rendering/OpenGL/GL/Shaders/Uniform.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/Shaders/Uniform.hs
@@ -0,0 +1,278 @@
+{-# LANGUAGE TypeSynonymInstances #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.Shaders.Uniform
+-- Copyright   :  (c) Sven Panne 2006-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module contains functions related to shader uniforms, this corresponds
+-- to section 2.20.3 of the OpenGL 3.1 spec (Shader Variables).
+--
+-----------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.Shaders.Uniform (
+   -- * Uniform variables
+   UniformLocation(..), uniformLocation, activeUniforms, Uniform(..),
+   UniformComponent,
+
+   -- TODO: glGetUniformSubroutineuiv
+) where
+
+import Data.Maybe
+import Data.StateVar
+import Foreign.Marshal.Alloc
+import Foreign.Ptr
+import Foreign.Storable
+import Graphics.Rendering.OpenGL.GL.ByteString
+import Graphics.Rendering.OpenGL.GL.CoordTrans
+import Graphics.Rendering.OpenGL.GL.GLboolean
+import Graphics.Rendering.OpenGL.GL.MatrixComponent
+import Graphics.Rendering.OpenGL.GL.Shaders.Program
+import Graphics.Rendering.OpenGL.GL.Shaders.ProgramObjects
+import Graphics.Rendering.OpenGL.GL.Shaders.Variables
+import Graphics.Rendering.OpenGL.GL.Tensor
+import Graphics.Rendering.OpenGL.GL.VertexSpec
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+numActiveUniforms :: Program -> GettableStateVar GLuint
+numActiveUniforms = programVar1 fromIntegral ActiveUniforms
+
+activeUniformMaxLength :: Program -> GettableStateVar GLsizei
+activeUniformMaxLength = programVar1 fromIntegral ActiveUniformMaxLength
+
+--------------------------------------------------------------------------------
+
+newtype UniformLocation = UniformLocation GLint
+   deriving ( Eq, Ord, Show )
+
+uniformLocation :: Program -> String -> GettableStateVar UniformLocation
+uniformLocation (Program program) name =
+   makeGettableStateVar $
+      fmap UniformLocation $
+         withGLstring name $
+            glGetUniformLocation program
+
+--------------------------------------------------------------------------------
+
+activeUniforms :: Program -> GettableStateVar [(GLint,VariableType,String)]
+activeUniforms =
+   activeVars
+      numActiveUniforms
+      activeUniformMaxLength
+      glGetActiveUniform
+      unmarshalVariableType
+
+--------------------------------------------------------------------------------
+
+class Storable a => UniformComponent a where
+   uniform1 :: UniformLocation -> a -> IO ()
+   uniform2 :: UniformLocation -> a -> a -> IO ()
+   uniform3 :: UniformLocation -> a -> a -> a -> IO ()
+   uniform4 :: UniformLocation -> a -> a -> a -> a -> IO ()
+
+   getUniform :: Storable (b a) => GLuint -> GLint -> Ptr (b a) -> IO ()
+
+   uniform1v :: UniformLocation -> GLsizei -> Ptr a -> IO ()
+   uniform2v :: UniformLocation -> GLsizei -> Ptr a -> IO ()
+   uniform3v :: UniformLocation -> GLsizei -> Ptr a -> IO ()
+   uniform4v :: UniformLocation -> GLsizei -> Ptr a -> IO ()
+
+instance UniformComponent GLint where
+   uniform1 (UniformLocation ul) = glUniform1i ul
+   uniform2 (UniformLocation ul) = glUniform2i ul
+   uniform3 (UniformLocation ul) = glUniform3i ul
+   uniform4 (UniformLocation ul) = glUniform4i ul
+
+   getUniform p ul = glGetUniformiv p ul . castPtr
+
+   uniform1v (UniformLocation ul) = glUniform1iv ul
+   uniform2v (UniformLocation ul) = glUniform2iv ul
+   uniform3v (UniformLocation ul) = glUniform3iv ul
+   uniform4v (UniformLocation ul) = glUniform4iv ul
+
+instance UniformComponent GLuint where
+   uniform1 (UniformLocation ul) = glUniform1ui ul
+   uniform2 (UniformLocation ul) = glUniform2ui ul
+   uniform3 (UniformLocation ul) = glUniform3ui ul
+   uniform4 (UniformLocation ul) = glUniform4ui ul
+
+   getUniform p ul = glGetUniformuiv p ul . castPtr
+
+   uniform1v (UniformLocation ul) = glUniform1uiv ul
+   uniform2v (UniformLocation ul) = glUniform2uiv ul
+   uniform3v (UniformLocation ul) = glUniform3uiv ul
+   uniform4v (UniformLocation ul) = glUniform4uiv ul
+
+instance UniformComponent GLfloat where
+   uniform1 (UniformLocation ul) = glUniform1f ul
+   uniform2 (UniformLocation ul) = glUniform2f ul
+   uniform3 (UniformLocation ul) = glUniform3f ul
+   uniform4 (UniformLocation ul) = glUniform4f ul
+
+   getUniform p ul = glGetUniformfv p ul . castPtr
+
+   uniform1v (UniformLocation ul) = glUniform1fv ul
+   uniform2v (UniformLocation ul) = glUniform2fv ul
+   uniform3v (UniformLocation ul) = glUniform3fv ul
+   uniform4v (UniformLocation ul) = glUniform4fv ul
+
+instance UniformComponent GLdouble where
+   uniform1 (UniformLocation ul) = glUniform1d ul
+   uniform2 (UniformLocation ul) = glUniform2d ul
+   uniform3 (UniformLocation ul) = glUniform3d ul
+   uniform4 (UniformLocation ul) = glUniform4d ul
+
+   getUniform p ul = glGetUniformdv p ul . castPtr
+
+   uniform1v (UniformLocation ul) = glUniform1dv ul
+   uniform2v (UniformLocation ul) = glUniform2dv ul
+   uniform3v (UniformLocation ul) = glUniform3dv ul
+   uniform4v (UniformLocation ul) = glUniform4dv ul
+
+--------------------------------------------------------------------------------
+
+class Uniform a where
+   uniform :: UniformLocation -> StateVar a
+   uniformv :: UniformLocation -> GLsizei -> Ptr a -> IO ()
+
+maxComponentSize :: Int
+maxComponentSize = sizeOf (undefined :: GLint) `max` sizeOf (undefined :: GLfloat)
+
+maxNumComponents :: Int
+maxNumComponents = 16
+
+maxUniformBufferSize :: Int
+maxUniformBufferSize = maxComponentSize * maxNumComponents
+
+makeUniformVar :: (UniformComponent a, Storable (b a))
+               => (UniformLocation -> b a -> IO ())
+               -> UniformLocation -> StateVar (b a)
+makeUniformVar setter location = makeStateVar getter (setter location)
+   where getter = allocaBytes maxUniformBufferSize $ \buf -> do
+                     getUniformWith getUniform location buf
+                     peek buf
+
+single :: (UniformLocation -> StateVar (Vertex1 a))
+       -> (UniformLocation -> StateVar a)
+single var location = makeStateVar (do Vertex1 x <- get (var location); return x)
+                                   (\x -> var location $= Vertex1 x)
+
+instance Uniform GLfloat where
+   uniform = single uniform
+   uniformv = uniform1v
+
+instance Uniform GLint where
+   uniform = single uniform
+   uniformv = uniform1v
+
+instance Uniform GLuint where
+   uniform = single uniform
+   uniformv = uniform1v
+
+instance Uniform GLdouble where
+   uniform = single uniform
+   uniformv = uniform1v
+
+instance UniformComponent a => Uniform (Vertex1 a) where
+   uniform = makeUniformVar $ \location (Vertex1 x) -> uniform1 location x
+   uniformv location count = uniform1v location count . (castPtr :: Ptr (Vertex1 b) -> Ptr b)
+
+instance UniformComponent a => Uniform (Vertex2 a) where
+   uniform = makeUniformVar $ \location (Vertex2 x y) -> uniform2 location x y
+   uniformv location count = uniform2v location count . (castPtr :: Ptr (Vertex2 b) -> Ptr b)
+
+instance UniformComponent a => Uniform (Vertex3 a) where
+   uniform = makeUniformVar $ \location (Vertex3 x y z) -> uniform3 location x y z
+   uniformv location count = uniform3v location count . (castPtr :: Ptr (Vertex3 b) -> Ptr b)
+
+instance UniformComponent a => Uniform (Vertex4 a) where
+   uniform = makeUniformVar $ \location (Vertex4 x y z w) -> uniform4 location x y z w
+   uniformv location count = uniform4v location count . (castPtr :: Ptr (Vertex4 b) -> Ptr b)
+
+instance UniformComponent a => Uniform (Vector1 a) where
+   uniform = makeUniformVar $ \location (Vector1 x) -> uniform1 location x
+   uniformv location count = uniform1v location count . (castPtr :: Ptr (Vector1 b) -> Ptr b)
+
+instance UniformComponent a => Uniform (Vector2 a) where
+   uniform = makeUniformVar $ \location (Vector2 x y) -> uniform2 location x y
+   uniformv location count = uniform2v location count . (castPtr :: Ptr (Vector2 b) -> Ptr b)
+
+instance UniformComponent a => Uniform (Vector3 a) where
+   uniform = makeUniformVar $ \location (Vector3 x y z) -> uniform3 location x y z
+   uniformv location count = uniform3v location count . (castPtr :: Ptr (Vector3 b) -> Ptr b)
+
+instance UniformComponent a => Uniform (Vector4 a) where
+   uniform = makeUniformVar $ \location (Vector4 x y z w) -> uniform4 location x y z w
+   uniformv location count = uniform4v location count . (castPtr :: Ptr (Vector4 b) -> Ptr b)
+
+instance UniformComponent a => Uniform (TexCoord1 a) where
+   uniform = makeUniformVar $ \location (TexCoord1 s) -> uniform1 location s
+   uniformv location count = uniform1v location count . (castPtr :: Ptr (TexCoord1 b) -> Ptr b)
+
+instance UniformComponent a => Uniform (TexCoord2 a) where
+   uniform = makeUniformVar $ \location (TexCoord2 s t) -> uniform2 location s t
+   uniformv location count = uniform2v location count . (castPtr :: Ptr (TexCoord2 b) -> Ptr b)
+
+instance UniformComponent a => Uniform (TexCoord3 a) where
+   uniform = makeUniformVar $ \location (TexCoord3 s t r) -> uniform3 location s t  r
+   uniformv location count = uniform3v location count . (castPtr :: Ptr (TexCoord3 b) -> Ptr b)
+
+instance UniformComponent a => Uniform (TexCoord4 a) where
+   uniform = makeUniformVar $ \location (TexCoord4 s t r q) -> uniform4 location s t  r q
+   uniformv location count = uniform4v location count . (castPtr :: Ptr (TexCoord4 b) -> Ptr b)
+
+instance UniformComponent a => Uniform (Normal3 a) where
+   uniform = makeUniformVar $ \location (Normal3 x y z) -> uniform3 location x y z
+   uniformv location count = uniform3v location count . (castPtr :: Ptr (Normal3 b) -> Ptr b)
+
+instance UniformComponent a => Uniform (FogCoord1 a) where
+   uniform = makeUniformVar $ \location (FogCoord1 c) -> uniform1 location c
+   uniformv location count = uniform1v location count . (castPtr :: Ptr (FogCoord1 b) -> Ptr b)
+
+instance UniformComponent a => Uniform (Color3 a) where
+   uniform = makeUniformVar $ \location (Color3 r g b) -> uniform3 location r g b
+   uniformv location count = uniform3v location count . (castPtr :: Ptr (Color3 b) -> Ptr b)
+
+instance UniformComponent a => Uniform (Color4 a) where
+   uniform = makeUniformVar $ \location (Color4 r g b a) -> uniform4 location r g b a
+   uniformv location count = uniform4v location count . (castPtr :: Ptr (Color4 b) -> Ptr b)
+
+instance UniformComponent a => Uniform (Index1 a) where
+   uniform = makeUniformVar $ \location (Index1 i) -> uniform1 location i
+   uniformv location count = uniform1v location count . (castPtr :: Ptr (Index1 b) -> Ptr b)
+
+-- Nasty instance declaration as TextureUnit is not of the form Storable (b a) as required for
+-- getUniform. Even worse is that it requires the `GLint` uniforms while it is an enum or
+-- uint.
+instance Uniform TextureUnit where
+    uniform loc = makeStateVar getter setter
+        where getter = allocaBytes (sizeOf (undefined :: GLint))  $ \buf -> do
+                          getUniformWith glGetUniformiv loc buf
+                          fmap (TextureUnit . fromIntegral) $ peek buf
+              setter (TextureUnit tu) = uniform1 loc (fromIntegral tu :: GLint)
+    uniformv location count = uniform1v location count . (castPtr :: Ptr TextureUnit -> Ptr GLint)
+
+-- | Note: 'uniformv' expects all matrices to be in 'ColumnMajor' form.
+instance MatrixComponent a => Uniform (GLmatrix a) where
+   uniform loc@(UniformLocation ul) = makeStateVar getter setter
+      where getter = withNewMatrix ColumnMajor $ getUniformWith getUniformv loc
+            setter m = withMatrix m $ uniformMatrix4v ul 1 . isRowMajor
+   uniformv (UniformLocation ul) count buf =
+      uniformMatrix4v ul count (marshalGLboolean False) (castPtr buf `asTypeOf` elemType buf)
+      where elemType = undefined :: MatrixComponent c => Ptr (GLmatrix c) -> Ptr c
+
+isRowMajor :: MatrixOrder -> GLboolean
+isRowMajor = marshalGLboolean . (RowMajor ==)
+
+getUniformWith :: (GLuint -> GLint -> Ptr a -> IO ()) -> UniformLocation -> Ptr a -> IO ()
+getUniformWith getter (UniformLocation ul) buf = do
+   program <- fmap (programID . fromJust) $ get currentProgram
+   getter program ul buf
+
+--------------------------------------------------------------------------------
diff --git a/src/Graphics/Rendering/OpenGL/GL/Shaders/Variables.hs b/src/Graphics/Rendering/OpenGL/GL/Shaders/Variables.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/Shaders/Variables.hs
@@ -0,0 +1,163 @@
+{-# OPTIONS_HADDOCK hide #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.Shaders.Variables
+-- Copyright   :  (c) Sven Panne 2006-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This internal module contains the functions and data types used by the
+-- Uniform and Attribs modules.
+--
+-----------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.Shaders.Variables (
+    VariableType(..), unmarshalVariableType, activeVars
+) where
+
+import Control.Monad
+import Data.StateVar
+import Foreign.Marshal.Utils
+import Foreign.Ptr
+import Foreign.Storable
+import Graphics.Rendering.OpenGL.GL.ByteString
+import Graphics.Rendering.OpenGL.GL.PeekPoke
+import Graphics.Rendering.OpenGL.GL.Shaders.Program
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+-- Table 2.9 of the OpenGL 3.1 spec: OpenGL Shading Language type tokens
+data VariableType =
+     Float'
+   | FloatVec2
+   | FloatVec3
+   | FloatVec4
+   | Int'
+   | IntVec2
+   | IntVec3
+   | IntVec4
+   | UnsignedInt'
+   | UnsignedIntVec2
+   | UnsignedIntVec3
+   | UnsignedIntVec4
+   | Bool
+   | BoolVec2
+   | BoolVec3
+   | BoolVec4
+   | FloatMat2
+   | FloatMat3
+   | FloatMat4
+   | FloatMat2x3
+   | FloatMat2x4
+   | FloatMat3x2
+   | FloatMat3x4
+   | FloatMat4x2
+   | FloatMat4x3
+   | Sampler1D
+   | Sampler2D
+   | Sampler3D
+   | SamplerCube
+   | Sampler1DShadow
+   | Sampler2DShadow
+   | Sampler1DArray
+   | Sampler2DArray
+   | Sampler1DArrayShadow
+   | Sampler2DArrayShadow
+   | SamplerCubeShadow
+   | Sampler2DRect
+   | Sampler2DRectShadow
+   | IntSampler1D
+   | IntSampler2D
+   | IntSampler3D
+   | IntSamplerCube
+   | IntSampler1DArray
+   | IntSampler2DArray
+   | UnsignedIntSampler1D
+   | UnsignedIntSampler2D
+   | UnsignedIntSampler3D
+   | UnsignedIntSamplerCube
+   | UnsignedIntSampler1DArray
+   | UnsignedIntSampler2DArray
+   deriving ( Eq, Ord, Show )
+
+unmarshalVariableType :: GLenum -> VariableType
+unmarshalVariableType x
+   | x == GL_FLOAT = Float'
+   | x == GL_FLOAT_VEC2 = FloatVec2
+   | x == GL_FLOAT_VEC3 = FloatVec3
+   | x == GL_FLOAT_VEC4 = FloatVec4
+   | x == GL_INT = Int'
+   | x == GL_INT_VEC2 = IntVec2
+   | x == GL_INT_VEC3 = IntVec3
+   | x == GL_INT_VEC4 = IntVec4
+   | x == GL_UNSIGNED_INT = UnsignedInt'
+   | x == GL_UNSIGNED_INT_VEC2 = UnsignedIntVec2
+   | x == GL_UNSIGNED_INT_VEC3 = UnsignedIntVec3
+   | x == GL_UNSIGNED_INT_VEC4 = UnsignedIntVec4
+   | x == GL_BOOL = Bool
+   | x == GL_BOOL_VEC2 = BoolVec2
+   | x == GL_BOOL_VEC3 = BoolVec3
+   | x == GL_BOOL_VEC4 = BoolVec4
+   | x == GL_FLOAT_MAT2 = FloatMat2
+   | x == GL_FLOAT_MAT3 = FloatMat3
+   | x == GL_FLOAT_MAT4 = FloatMat4
+   | x == GL_FLOAT_MAT2x3 = FloatMat2x3
+   | x == GL_FLOAT_MAT2x4 = FloatMat2x4
+   | x == GL_FLOAT_MAT3x2 = FloatMat3x2
+   | x == GL_FLOAT_MAT3x4 = FloatMat3x4
+   | x == GL_FLOAT_MAT4x2 = FloatMat4x2
+   | x == GL_FLOAT_MAT4x3 = FloatMat4x3
+   | x == GL_SAMPLER_1D = Sampler1D
+   | x == GL_SAMPLER_2D = Sampler2D
+   | x == GL_SAMPLER_3D = Sampler3D
+   | x == GL_SAMPLER_CUBE = SamplerCube
+   | x == GL_SAMPLER_1D_SHADOW = Sampler1DShadow
+   | x == GL_SAMPLER_2D_SHADOW = Sampler2DShadow
+   | x == GL_SAMPLER_1D_ARRAY = Sampler1DArray
+   | x == GL_SAMPLER_2D_ARRAY = Sampler2DArray
+   | x == GL_SAMPLER_1D_ARRAY_SHADOW = Sampler1DArrayShadow
+   | x == GL_SAMPLER_2D_ARRAY_SHADOW = Sampler2DArrayShadow
+   | x == GL_SAMPLER_CUBE_SHADOW = SamplerCubeShadow
+   | x == GL_SAMPLER_2D_RECT = Sampler2DRect
+   | x == GL_SAMPLER_2D_RECT_SHADOW = Sampler2DRectShadow
+   | x == GL_INT_SAMPLER_1D = IntSampler1D
+   | x == GL_INT_SAMPLER_2D = IntSampler2D
+   | x == GL_INT_SAMPLER_3D = IntSampler3D
+   | x == GL_INT_SAMPLER_CUBE = IntSamplerCube
+   | x == GL_INT_SAMPLER_1D_ARRAY = IntSampler1DArray
+   | x == GL_INT_SAMPLER_2D_ARRAY = IntSampler2DArray
+   | x == GL_UNSIGNED_INT_SAMPLER_1D = UnsignedIntSampler1D
+   | x == GL_UNSIGNED_INT_SAMPLER_2D = UnsignedIntSampler2D
+   | x == GL_UNSIGNED_INT_SAMPLER_3D = UnsignedIntSampler3D
+   | x == GL_UNSIGNED_INT_SAMPLER_CUBE = UnsignedIntSamplerCube
+   | x == GL_UNSIGNED_INT_SAMPLER_1D_ARRAY = UnsignedIntSampler1DArray
+   | x == GL_UNSIGNED_INT_SAMPLER_2D_ARRAY = UnsignedIntSampler2DArray
+   | otherwise = error ("unmarshalVariableType: illegal value " ++ show x)
+
+--------------------------------------------------------------------------------
+
+activeVars :: (Program -> GettableStateVar GLuint)
+           -> (Program -> GettableStateVar GLsizei)
+           -> (GLuint -> GLuint -> GLsizei -> Ptr GLsizei -> Ptr GLint -> Ptr GLenum -> Ptr GLchar -> IO ())
+           -> (GLenum -> a)
+           -> Program
+           -> GettableStateVar [(GLint,a,String)]
+activeVars numVars maxLength getter unmarshalType p@(Program program) =
+   makeGettableStateVar $ do
+      numActiveVars <- get (numVars p)
+      maxLen <- get (maxLength p)
+      with 0 $ \nameLengthBuf ->
+         with 0 $ \sizeBuf ->
+            with 0 $ \typeBuf ->
+               let ixs = if numActiveVars > 0 then [0 .. numActiveVars-1] else []
+               in forM ixs $ \i -> do
+                  n <- createAndTrimByteString maxLen $ \nameBuf -> do
+                     getter program i maxLen nameLengthBuf sizeBuf typeBuf nameBuf
+                     peek nameLengthBuf
+                  s <- peek1 fromIntegral sizeBuf
+                  t <- peek1 unmarshalType typeBuf
+                  return (s, t, unpackUtf8 n)
diff --git a/src/Graphics/Rendering/OpenGL/GL/StringQueries.hs b/src/Graphics/Rendering/OpenGL/GL/StringQueries.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/StringQueries.hs
@@ -0,0 +1,115 @@
+{-# LANGUAGE CPP #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.StringQueries
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+-- 
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to parts of section 6.1.5 (String Queries) of the
+-- OpenGL 3.2 specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.StringQueries (
+   vendor, renderer, glVersion, glExtensions, extensionSupported,
+   shadingLanguageVersion, majorMinor, ContextProfile'(..), contextProfile
+) where
+
+import Data.Bits
+import Data.Char
+#if !MIN_VERSION_base(4,8,0)
+import Data.Functor( (<$>), (<$) )
+#endif
+import Data.Set ( member, toList )
+import Data.StateVar as S
+import Graphics.Rendering.OpenGL.GL.ByteString
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.GL
+import Text.ParserCombinators.ReadP as R
+
+--------------------------------------------------------------------------------
+
+vendor :: GettableStateVar String
+vendor = makeStringVar GL_VENDOR
+
+renderer :: GettableStateVar String
+renderer = makeStringVar GL_RENDERER
+
+glVersion :: GettableStateVar String
+glVersion = makeStringVar GL_VERSION
+
+glExtensions :: GettableStateVar [String]
+glExtensions = makeGettableStateVar (toList <$> getExtensions)
+
+extensionSupported :: String -> GettableStateVar Bool
+extensionSupported ext =
+  makeGettableStateVar (getExtensions >>= (return . member ext))
+
+shadingLanguageVersion :: GettableStateVar String
+shadingLanguageVersion = makeStringVar GL_SHADING_LANGUAGE_VERSION
+
+--------------------------------------------------------------------------------
+
+data ContextProfile'
+   = CoreProfile'
+   | CompatibilityProfile'
+   deriving ( Eq, Ord, Show )
+
+marshalContextProfile' :: ContextProfile' -> GLbitfield
+marshalContextProfile' x = case x of
+   CoreProfile' -> GL_CONTEXT_CORE_PROFILE_BIT
+   CompatibilityProfile' -> GL_CONTEXT_COMPATIBILITY_PROFILE_BIT
+
+contextProfile :: GettableStateVar [ContextProfile']
+contextProfile = makeGettableStateVar (getInteger1 i2cps GetContextProfileMask)
+
+i2cps :: GLint -> [ContextProfile']
+i2cps bitfield =
+   [ c | c <- [ CoreProfile', CompatibilityProfile' ]
+       , (fromIntegral bitfield .&. marshalContextProfile' c) /= 0 ]
+
+--------------------------------------------------------------------------------
+
+makeStringVar :: GLenum -> GettableStateVar String
+makeStringVar = makeGettableStateVar . getStringWith . glGetString
+
+--------------------------------------------------------------------------------
+
+-- | A utility function to be used with e.g. 'glVersion' or
+-- 'shadingLanguageVersion', transforming a variable containing a string of the
+-- form /major.minor[optional rest]/ into a variable containing a numeric
+-- major\/minor version. If the string is malformed, which should never happen
+-- with a sane OpenGL implementation, it is transformed to @(-1,-1)@.
+
+majorMinor :: GettableStateVar String -> GettableStateVar (Int, Int)
+majorMinor =
+  makeGettableStateVar . (runParser parseVersion (-1, -1) <$>) . S.get
+
+--------------------------------------------------------------------------------
+-- Copy from Graphics.Rendering.OpenGL.Raw.GetProcAddress... :-/
+
+runParser :: ReadP a -> a -> String -> a
+runParser parser failed str =
+  case readP_to_S parser str of
+    [(v, "")] -> v
+    _ -> failed
+
+-- This does quite a bit more than we need for "normal" OpenGL, but at least it
+-- documents the convoluted format of the version string in detail.
+parseVersion :: ReadP (Int, Int)
+parseVersion = do
+  _prefix <-
+    -- Too lazy to define a type for the API...
+    ("CL" <$ string "OpenGL ES-CL ") <++  -- OpenGL ES 1.x Common-Lite
+    ("CM" <$ string "OpenGL ES-CM ") <++  -- OpenGL ES 1.x Common
+    ("ES" <$ string "OpenGL ES "   ) <++  -- OpenGL ES 2.x or 3.x
+    ("GL" <$ string ""             )      -- OpenGL
+  major <- read <$> munch1 isDigit
+  minor <- char '.' >> read <$> munch1 isDigit
+  _release <- (char '.' >> munch1 (/= ' ')) <++ return ""
+  _vendorStuff <- (char ' ' >> R.get `manyTill` eof) <++ ("" <$ eof)
+  return (major, minor)
diff --git a/src/Graphics/Rendering/OpenGL/GL/SyncObjects.hs b/src/Graphics/Rendering/OpenGL/GL/SyncObjects.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/SyncObjects.hs
@@ -0,0 +1,118 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.SyncObjects
+-- Copyright   :  (c) Sven Panne 2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 4.1 (Sync Objects and Fences) of the
+-- OpenGL 4.4 specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.SyncObjects (
+   -- * Sync Objects and Fences
+   SyncObject, syncGpuCommandsComplete,
+
+   -- * Waiting for Sync Objects
+   WaitTimeout, WaitFlag(..), WaitResult(..), clientWaitSync,
+   waitSync, maxServerWaitTimeout,
+
+   -- * Sync Object Queries
+   SyncStatus(..), syncStatus
+) where
+
+import Control.Monad.IO.Class
+import Data.ObjectName
+import Data.StateVar
+import Foreign.Marshal.Utils ( with )
+import Foreign.Ptr ( nullPtr )
+import Graphics.Rendering.OpenGL.GL.DebugOutput
+import Graphics.Rendering.OpenGL.GL.GLboolean
+import Graphics.Rendering.OpenGL.GL.PeekPoke
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+newtype SyncObject = SyncObject { syncID :: GLsync }
+   deriving ( Eq, Ord, Show )
+
+instance ObjectName SyncObject where
+   isObjectName = liftIO . fmap unmarshalGLboolean . glIsSync . syncID
+   deleteObjectName = liftIO . glDeleteSync . syncID
+
+instance CanBeLabeled SyncObject where
+   objectLabel = objectPtrLabel . syncID
+
+syncGpuCommandsComplete :: IO SyncObject
+syncGpuCommandsComplete =
+   fmap SyncObject $ glFenceSync GL_SYNC_GPU_COMMANDS_COMPLETE 0
+
+--------------------------------------------------------------------------------
+
+type WaitTimeout = GLuint64
+
+--------------------------------------------------------------------------------
+
+data WaitFlag = SyncFlushCommands
+   deriving ( Eq, Ord, Show )
+
+marshalWaitFlag :: WaitFlag -> GLbitfield
+marshalWaitFlag x = case x of
+   SyncFlushCommands -> GL_SYNC_FLUSH_COMMANDS_BIT
+
+--------------------------------------------------------------------------------
+
+data WaitResult =
+     AlreadySignaled
+   | TimeoutExpired
+   | ConditionSatisfied
+   | WaitFailed
+   deriving ( Eq, Ord, Show )
+
+unmarshalWaitResult :: GLenum -> WaitResult
+unmarshalWaitResult x
+   | x == GL_ALREADY_SIGNALED = AlreadySignaled
+   | x == GL_TIMEOUT_EXPIRED = TimeoutExpired
+   | x == GL_CONDITION_SATISFIED = ConditionSatisfied
+   | x == GL_WAIT_FAILED = WaitFailed
+   | otherwise = error ("unmarshalWaitResult: illegal value " ++ show x)
+
+--------------------------------------------------------------------------------
+
+clientWaitSync :: SyncObject -> [WaitFlag] -> WaitTimeout -> IO WaitResult
+clientWaitSync syncObject flags =
+   fmap unmarshalWaitResult .
+      glClientWaitSync (syncID syncObject) (sum (map marshalWaitFlag flags))
+
+waitSync :: SyncObject -> IO ()
+waitSync syncObject =
+   glWaitSync (syncID syncObject) 0 (fromIntegral GL_TIMEOUT_IGNORED)
+
+maxServerWaitTimeout :: GettableStateVar WaitTimeout
+maxServerWaitTimeout =
+   makeGettableStateVar (getInteger64 fromIntegral GetMaxServerWaitTimeout)
+
+--------------------------------------------------------------------------------
+
+data SyncStatus =
+     Unsignaled
+   | Signaled
+   deriving ( Eq, Ord, Show )
+
+unmarshalSyncStatus :: GLenum -> SyncStatus
+unmarshalSyncStatus x
+   | x == GL_UNSIGNALED = Unsignaled
+   | x == GL_SIGNALED = Signaled
+   | otherwise = error ("unmarshalSyncStatus: illegal value " ++ show x)
+
+syncStatus :: SyncObject -> GettableStateVar SyncStatus
+syncStatus syncObject =
+   makeGettableStateVar $
+      with 0 $ \buf -> do
+         glGetSynciv (syncID syncObject) GL_SYNC_STATUS 1 nullPtr buf
+         peek1 (unmarshalSyncStatus . fromIntegral) buf
diff --git a/src/Graphics/Rendering/OpenGL/GL/Tensor.hs b/src/Graphics/Rendering/OpenGL/GL/Tensor.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/Tensor.hs
@@ -0,0 +1,302 @@
+{-# LANGUAGE DeriveDataTypeable, CPP #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.Tensor
+-- Copyright   :  (c) Sven Panne 2019
+-- License     :  BSD3
+-- 
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This package contains tensor data types and their instances for some basic
+-- type classes.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.Tensor (
+   Vertex1(..), Vertex2(..), Vertex3(..), Vertex4(..),
+   Vector1(..), Vector2(..), Vector3(..), Vector4(..)
+) where
+
+#if !MIN_VERSION_base(4,8,0)
+import Control.Applicative ( Applicative(..) )
+import Data.Foldable ( Foldable(..) )
+#endif
+import Control.Monad ( ap )
+import Data.Foldable ( foldlM )
+import Data.Ix ( Ix )
+import Data.Traversable ( Traversable(..), mapAccumL )
+import Data.Typeable ( Typeable )
+import Foreign.Marshal.Array ( advancePtr )
+import Foreign.Ptr ( Ptr, plusPtr, castPtr )
+import Foreign.Storable ( Storable(..) )
+
+--------------------------------------------------------------------------------
+
+-- | A vertex with /y/=0, /z/=0 and /w/=1.
+newtype Vertex1 a = Vertex1 a
+   deriving (Eq, Ord, Ix, Bounded, Show, Read, Typeable)
+
+instance Functor Vertex1 where
+   fmap f (Vertex1 x) = Vertex1 (f x)
+
+instance Applicative Vertex1 where
+   pure a = Vertex1 a
+   Vertex1 f <*> Vertex1 x = Vertex1 (f x)
+
+instance Foldable Vertex1 where
+   foldr f a (Vertex1 x) = x `f ` a
+   foldl f a (Vertex1 x) = a `f` x
+   foldr1 _ (Vertex1 x) = x
+   foldl1 _ (Vertex1 x) = x
+
+instance Traversable Vertex1 where
+   traverse f (Vertex1 x) = pure Vertex1 <*> f x
+   sequenceA (Vertex1 x) =  pure Vertex1 <*> x
+   mapM f (Vertex1 x) = return Vertex1 `ap` f x
+   sequence (Vertex1 x) = return Vertex1 `ap` x
+
+instance Storable a => Storable (Vertex1 a) where
+   sizeOf    ~(Vertex1 s) = sizeOf s
+   alignment ~(Vertex1 s) = alignment s
+   peek = peekApplicativeTraversable
+   poke = pokeFoldable
+
+--------------------------------------------------------------------------------
+
+-- | A vertex with /z/=0 and /w/=1.
+data Vertex2 a = Vertex2 !a !a
+   deriving (Eq, Ord, Ix, Bounded, Show, Read, Typeable)
+
+instance Functor Vertex2 where
+   fmap f (Vertex2 x y) = Vertex2 (f x) (f y)
+
+instance Applicative Vertex2 where
+   pure a = Vertex2 a a
+   Vertex2 f g <*> Vertex2 x y = Vertex2 (f x) (g y)
+
+instance Foldable Vertex2 where
+   foldr f a (Vertex2 x y) = x `f ` (y `f` a)
+   foldl f a (Vertex2 x y) = (a `f` x) `f` y
+   foldr1 f (Vertex2 x y) = x `f` y
+   foldl1 f (Vertex2 x y) = x `f` y
+
+instance Traversable Vertex2 where
+   traverse f (Vertex2 x y) = pure Vertex2 <*> f x <*> f y
+   sequenceA (Vertex2 x y) =  pure Vertex2 <*> x <*> y
+   mapM f (Vertex2 x y) = return Vertex2 `ap` f x `ap` f y
+   sequence (Vertex2 x y) = return Vertex2 `ap` x `ap` y
+
+instance Storable a => Storable (Vertex2 a) where
+   sizeOf ~(Vertex2 x _) = 2 * sizeOf x
+   alignment ~(Vertex2 x _) = alignment x
+   peek = peekApplicativeTraversable
+   poke = pokeFoldable
+
+--------------------------------------------------------------------------------
+
+-- | A vertex with /w/=1.
+data Vertex3 a = Vertex3 !a !a !a
+   deriving (Eq, Ord, Ix, Bounded, Show, Read, Typeable)
+
+instance Functor Vertex3 where
+   fmap f (Vertex3 x y z) = Vertex3 (f x) (f y) (f z)
+
+instance Applicative Vertex3 where
+   pure a = Vertex3 a a a
+   Vertex3 f g h <*> Vertex3 x y z = Vertex3 (f x) (g y) (h z)
+
+instance Foldable Vertex3 where
+   foldr f a (Vertex3 x y z) = x `f ` (y `f` (z `f` a))
+   foldl f a (Vertex3 x y z) = ((a `f` x) `f` y) `f` z
+   foldr1 f (Vertex3 x y z) = x `f` (y `f` z)
+   foldl1 f (Vertex3 x y z) = (x `f` y) `f` z
+
+instance Traversable Vertex3 where
+   traverse f (Vertex3 x y z) = pure Vertex3 <*> f x <*> f y <*> f z
+   sequenceA (Vertex3 x y z) =  pure Vertex3 <*> x <*> y <*> z
+   mapM f (Vertex3 x y z) = return Vertex3 `ap` f x `ap` f y `ap` f z
+   sequence (Vertex3 x y z) = return Vertex3 `ap` x `ap` y `ap` z
+
+instance Storable a => Storable (Vertex3 a) where
+   sizeOf ~(Vertex3 x _ _) = 3 * sizeOf x
+   alignment ~(Vertex3 x _ _) = alignment x
+   peek = peekApplicativeTraversable
+   poke = pokeFoldable
+
+--------------------------------------------------------------------------------
+
+-- | A fully-fledged four-dimensional vertex.
+data Vertex4 a = Vertex4 !a !a !a !a
+   deriving (Eq, Ord, Ix, Bounded, Show, Read, Typeable)
+
+instance Functor Vertex4 where
+   fmap f (Vertex4 x y z w) = Vertex4 (f x) (f y) (f z) (f w)
+
+instance Applicative Vertex4 where
+   pure a = Vertex4 a a a a
+   Vertex4 f g h i <*> Vertex4 x y z w = Vertex4 (f x) (g y) (h z) (i w)
+
+instance Foldable Vertex4 where
+   foldr f a (Vertex4 x y z w) = x `f ` (y `f` (z `f` (w `f` a)))
+   foldl f a (Vertex4 x y z w) = (((a `f` x) `f` y) `f` z) `f` w
+   foldr1 f (Vertex4 x y z w) = x `f` (y `f` (z `f` w))
+   foldl1 f (Vertex4 x y z w) = ((x `f` y) `f` z) `f` w
+
+instance Traversable Vertex4 where
+   traverse f (Vertex4 x y z w) = pure Vertex4 <*> f x <*> f y <*> f z <*> f w
+   sequenceA (Vertex4 x y z w) =  pure Vertex4 <*> x <*> y <*> z <*> w
+   mapM f (Vertex4 x y z w) = return Vertex4 `ap` f x `ap` f y `ap` f z `ap` f w
+   sequence (Vertex4 x y z w) = return Vertex4 `ap` x `ap` y `ap` z `ap` w
+
+instance Storable a => Storable (Vertex4 a) where
+   sizeOf ~(Vertex4 x _ _ _) = 4 * sizeOf x
+   alignment ~(Vertex4 x _ _ _) = alignment x
+   peek = peekApplicativeTraversable
+   poke = pokeFoldable
+
+--------------------------------------------------------------------------------
+
+-- | A one-dimensional vector.
+newtype Vector1 a = Vector1 a
+   deriving (Eq, Ord, Ix, Bounded, Show, Read, Typeable)
+
+instance Functor Vector1 where
+   fmap f (Vector1 x) = Vector1 (f x)
+
+instance Applicative Vector1 where
+   pure a = Vector1 a
+   Vector1 f <*> Vector1 x = Vector1 (f x)
+
+instance Foldable Vector1 where
+   foldr f a (Vector1 x) = x `f ` a
+   foldl f a (Vector1 x) = a `f` x
+   foldr1 _ (Vector1 x) = x
+   foldl1 _ (Vector1 x) = x
+
+instance Traversable Vector1 where
+   traverse f (Vector1 x) = pure Vector1 <*> f x
+   sequenceA (Vector1 x) =  pure Vector1 <*> x
+   mapM f (Vector1 x) = return Vector1 `ap` f x
+   sequence (Vector1 x) = return Vector1 `ap` x
+
+instance Storable a => Storable (Vector1 a) where
+   sizeOf    ~(Vector1 s) = sizeOf s
+   alignment ~(Vector1 s) = alignment s
+   peek = peekApplicativeTraversable
+   poke = pokeFoldable
+
+--------------------------------------------------------------------------------
+
+-- | A two-dimensional vector.
+data Vector2 a = Vector2 !a !a
+   deriving (Eq, Ord, Ix, Bounded, Show, Read, Typeable)
+
+instance Functor Vector2 where
+   fmap f (Vector2 x y) = Vector2 (f x) (f y)
+
+instance Applicative Vector2 where
+   pure a = Vector2 a a
+   Vector2 f g <*> Vector2 x y = Vector2 (f x) (g y)
+
+instance Foldable Vector2 where
+   foldr f a (Vector2 x y) = x `f ` (y `f` a)
+   foldl f a (Vector2 x y) = (a `f` x) `f` y
+   foldr1 f (Vector2 x y) = x `f` y
+   foldl1 f (Vector2 x y) = x `f` y
+
+instance Traversable Vector2 where
+   traverse f (Vector2 x y) = pure Vector2 <*> f x <*> f y
+   sequenceA (Vector2 x y) =  pure Vector2 <*> x <*> y
+   mapM f (Vector2 x y) = return Vector2 `ap` f x `ap` f y
+   sequence (Vector2 x y) = return Vector2 `ap` x `ap` y
+
+instance Storable a => Storable (Vector2 a) where
+   sizeOf ~(Vector2 x _) = 2 * sizeOf x
+   alignment ~(Vector2 x _) = alignment x
+   peek = peekApplicativeTraversable
+   poke = pokeFoldable
+
+--------------------------------------------------------------------------------
+
+-- | A three-dimensional vector.
+data Vector3 a = Vector3 !a !a !a
+   deriving (Eq, Ord, Ix, Bounded, Show, Read, Typeable)
+
+instance Functor Vector3 where
+   fmap f (Vector3 x y z) = Vector3 (f x) (f y) (f z)
+
+instance Applicative Vector3 where
+   pure a = Vector3 a a a
+   Vector3 f g h <*> Vector3 x y z = Vector3 (f x) (g y) (h z)
+
+instance Foldable Vector3 where
+   foldr f a (Vector3 x y z) = x `f ` (y `f` (z `f` a))
+   foldl f a (Vector3 x y z) = ((a `f` x) `f` y) `f` z
+   foldr1 f (Vector3 x y z) = x `f` (y `f` z)
+   foldl1 f (Vector3 x y z) = (x `f` y) `f` z
+
+instance Traversable Vector3 where
+   traverse f (Vector3 x y z) = pure Vector3 <*> f x <*> f y <*> f z
+   sequenceA (Vector3 x y z) =  pure Vector3 <*> x <*> y <*> z
+   mapM f (Vector3 x y z) = return Vector3 `ap` f x `ap` f y `ap` f z
+   sequence (Vector3 x y z) = return Vector3 `ap` x `ap` y `ap` z
+
+instance Storable a => Storable (Vector3 a) where
+   sizeOf ~(Vector3 x _ _) = 3 * sizeOf x
+   alignment ~(Vector3 x _ _) = alignment x
+   peek = peekApplicativeTraversable
+   poke = pokeFoldable
+
+--------------------------------------------------------------------------------
+
+-- | A four-dimensional vector.
+data Vector4 a = Vector4 !a !a !a !a
+   deriving (Eq, Ord, Ix, Bounded, Show, Read, Typeable)
+
+instance Functor Vector4 where
+   fmap f (Vector4 x y z w) = Vector4 (f x) (f y) (f z) (f w)
+
+instance Applicative Vector4 where
+   pure a = Vector4 a a a a
+   Vector4 f g h i <*> Vector4 x y z w = Vector4 (f x) (g y) (h z) (i w)
+
+instance Foldable Vector4 where
+   foldr f a (Vector4 x y z w) = x `f ` (y `f` (z `f` (w `f` a)))
+   foldl f a (Vector4 x y z w) = (((a `f` x) `f` y) `f` z) `f` w
+   foldr1 f (Vector4 x y z w) = x `f` (y `f` (z `f` w))
+   foldl1 f (Vector4 x y z w) = ((x `f` y) `f` z) `f` w
+
+instance Traversable Vector4 where
+   traverse f (Vector4 x y z w) = pure Vector4 <*> f x <*> f y <*> f z <*> f w
+   sequenceA (Vector4 x y z w) =  pure Vector4 <*> x <*> y <*> z <*> w
+   mapM f (Vector4 x y z w) = return Vector4 `ap` f x `ap` f y `ap` f z `ap` f w
+   sequence (Vector4 x y z w) = return Vector4 `ap` x `ap` y `ap` z `ap` w
+
+instance Storable a => Storable (Vector4 a) where
+   sizeOf ~(Vector4 x _ _ _) = 4 * sizeOf x
+   alignment ~(Vector4 x _ _ _) = alignment x
+   peek = peekApplicativeTraversable
+   poke = pokeFoldable
+
+--------------------------------------------------------------------------------
+
+peekApplicativeTraversable :: (Applicative t, Traversable t, Storable a) => Ptr (t a) -> IO (t a)
+peekApplicativeTraversable = Data.Traversable.mapM peek . addresses
+
+addresses :: (Applicative t, Traversable t, Storable a) => Ptr (t a) -> t (Ptr a)
+addresses = snd . mapAccumL nextPtr 0 . pure . castPtr
+
+nextPtr :: Storable a => Int -> Ptr a -> (Int, Ptr a)
+nextPtr offset ptr = (offset + 1, advancePtr ptr offset)
+
+--------------------------------------------------------------------------------
+
+pokeFoldable :: (Foldable t, Storable a) => Ptr (t a) -> t a -> IO ()
+pokeFoldable ptr xs = foldlM pokeAndAdvance (castPtr ptr) xs >> return ()
+
+pokeAndAdvance :: Storable a => Ptr a -> a -> IO (Ptr a)
+pokeAndAdvance ptr value = do
+   poke ptr value
+   return $ ptr `plusPtr` sizeOf value
diff --git a/src/Graphics/Rendering/OpenGL/GL/Texturing.hs b/src/Graphics/Rendering/OpenGL/GL/Texturing.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/Texturing.hs
@@ -0,0 +1,29 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.Texturing
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+-- 
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 3.8 (Texturing) of the OpenGL 2.1 specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.Texturing (
+   module Graphics.Rendering.OpenGL.GL.Texturing.Specification,
+   module Graphics.Rendering.OpenGL.GL.Texturing.Parameters,
+   module Graphics.Rendering.OpenGL.GL.Texturing.Objects,
+   module Graphics.Rendering.OpenGL.GL.Texturing.Environments,
+   module Graphics.Rendering.OpenGL.GL.Texturing.Application,
+   module Graphics.Rendering.OpenGL.GL.Texturing.Queries
+) where
+
+import Graphics.Rendering.OpenGL.GL.Texturing.Specification
+import Graphics.Rendering.OpenGL.GL.Texturing.Parameters
+import Graphics.Rendering.OpenGL.GL.Texturing.Objects
+import Graphics.Rendering.OpenGL.GL.Texturing.Environments
+import Graphics.Rendering.OpenGL.GL.Texturing.Application
+import Graphics.Rendering.OpenGL.GL.Texturing.Queries
diff --git a/src/Graphics/Rendering/OpenGL/GL/Texturing/Application.hs b/src/Graphics/Rendering/OpenGL/GL/Texturing/Application.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/Texturing/Application.hs
@@ -0,0 +1,27 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.Texturing.Application
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+-- 
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 3.8.15 (Texture Application) of the
+-- OpenGL 2.1 specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.Texturing.Application (
+   texture
+) where
+
+import Data.StateVar
+import Graphics.Rendering.OpenGL.GL.Capability
+import Graphics.Rendering.OpenGL.GL.Texturing.TextureTarget
+
+--------------------------------------------------------------------------------
+
+texture :: ParameterizedTextureTarget t => t -> StateVar Capability
+texture = makeCapability . marshalParameterizedTextureTargetEnableCap
diff --git a/src/Graphics/Rendering/OpenGL/GL/Texturing/Environments.hs b/src/Graphics/Rendering/OpenGL/GL/Texturing/Environments.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/Texturing/Environments.hs
@@ -0,0 +1,354 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.Texturing.Environments
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 3.8.13 (Texture Environments and Texture
+-- Functions) of the OpenGL 2.1 specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.Texturing.Environments (
+   TextureFunction(..), textureFunction,
+   TextureCombineFunction(..), combineRGB, combineAlpha,
+   ArgNum(..), Arg(..), Src(..), argRGB, argAlpha,
+   rgbScale, alphaScale,
+   constantColor, textureUnitLODBias
+) where
+
+import Control.Monad
+import Data.StateVar
+import Foreign.Marshal.Alloc
+import Foreign.Marshal.Utils
+import Foreign.Ptr
+import Foreign.Storable
+import Graphics.Rendering.OpenGL.GL.BlendingFactor
+import Graphics.Rendering.OpenGL.GL.PeekPoke
+import Graphics.Rendering.OpenGL.GL.Texturing.Parameters
+import Graphics.Rendering.OpenGL.GL.Texturing.TextureUnit
+import Graphics.Rendering.OpenGL.GL.VertexSpec
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+data TextureEnvTarget =
+     TextureEnv
+   | TextureFilterControl   -- GL_TEXTURE_LOD_BIAS_EXT
+   | PointSprite            -- GL_COORD_REPLACE_NV
+
+marshalTextureEnvTarget :: TextureEnvTarget -> GLenum
+marshalTextureEnvTarget x = case x of
+   TextureEnv -> GL_TEXTURE_ENV
+   TextureFilterControl -> GL_TEXTURE_FILTER_CONTROL
+   PointSprite -> GL_POINT_SPRITE
+
+--------------------------------------------------------------------------------
+
+data TextureEnvParameter =
+     TexEnvParamTextureEnvMode
+   | TexEnvParamTextureEnvColor
+   | TexEnvParamCombineRGB
+   | TexEnvParamCombineAlpha
+   | TexEnvParamSrc0RGB
+   | TexEnvParamSrc1RGB
+   | TexEnvParamSrc2RGB
+   | TexEnvParamSrc3RGB
+   | TexEnvParamSrc0Alpha
+   | TexEnvParamSrc1Alpha
+   | TexEnvParamSrc2Alpha
+   | TexEnvParamSrc3Alpha
+   | TexEnvParamOperand0RGB
+   | TexEnvParamOperand1RGB
+   | TexEnvParamOperand2RGB
+   | TexEnvParamOperand3RGB
+   | TexEnvParamOperand0Alpha
+   | TexEnvParamOperand1Alpha
+   | TexEnvParamOperand2Alpha
+   | TexEnvParamOperand3Alpha
+   | TexEnvParamRGBScale
+   | TexEnvParamAlphaScale
+   | TexEnvParamLODBias
+
+marshalTextureEnvParameter :: TextureEnvParameter -> GLenum
+marshalTextureEnvParameter x = case x of
+   TexEnvParamTextureEnvMode -> GL_TEXTURE_ENV_MODE
+   TexEnvParamTextureEnvColor -> GL_TEXTURE_ENV_COLOR
+   TexEnvParamCombineRGB -> GL_COMBINE_RGB
+   TexEnvParamCombineAlpha -> GL_COMBINE_ALPHA
+   TexEnvParamSrc0RGB -> GL_SRC0_RGB
+   TexEnvParamSrc1RGB -> GL_SRC1_RGB
+   TexEnvParamSrc2RGB -> GL_SRC2_RGB
+   TexEnvParamSrc3RGB -> GL_SOURCE3_RGB_NV
+   TexEnvParamSrc0Alpha -> GL_SRC0_ALPHA
+   TexEnvParamSrc1Alpha -> GL_SRC1_ALPHA
+   TexEnvParamSrc2Alpha -> GL_SRC2_ALPHA
+   TexEnvParamSrc3Alpha -> GL_SOURCE3_ALPHA_NV
+   TexEnvParamOperand0RGB -> GL_OPERAND0_RGB
+   TexEnvParamOperand1RGB -> GL_OPERAND1_RGB
+   TexEnvParamOperand2RGB -> GL_OPERAND2_RGB
+   TexEnvParamOperand3RGB -> GL_OPERAND3_RGB_NV
+   TexEnvParamOperand0Alpha -> GL_OPERAND0_ALPHA
+   TexEnvParamOperand1Alpha -> GL_OPERAND1_ALPHA
+   TexEnvParamOperand2Alpha -> GL_OPERAND2_ALPHA
+   TexEnvParamOperand3Alpha -> GL_OPERAND3_ALPHA_NV
+   TexEnvParamRGBScale -> GL_RGB_SCALE
+   TexEnvParamAlphaScale -> GL_ALPHA_SCALE
+   TexEnvParamLODBias -> GL_TEXTURE_LOD_BIAS
+
+--------------------------------------------------------------------------------
+
+texEnv :: (GLenum -> GLenum -> b -> IO ())
+       -> (a -> (b -> IO ()) -> IO ())
+       -> TextureEnvTarget -> TextureEnvParameter -> a -> IO ()
+texEnv glTexEnv marshalAct t p x =
+   marshalAct x $
+      glTexEnv (marshalTextureEnvTarget t) (marshalTextureEnvParameter p)
+
+glTexEnvC4f :: GLenum -> GLenum -> Ptr (Color4 GLfloat) -> IO ()
+glTexEnvC4f t p ptr = glTexEnvfv t p (castPtr ptr)
+
+
+--------------------------------------------------------------------------------
+
+getTexEnv :: Storable b
+          => (GLenum -> GLenum -> Ptr b -> IO ())
+          -> (b -> a)
+          -> TextureEnvTarget -> TextureEnvParameter -> IO a
+getTexEnv glGetTexEnv unmarshal t p =
+   alloca $ \buf -> do
+     glGetTexEnv (marshalTextureEnvTarget t) (marshalTextureEnvParameter p) buf
+     peek1 unmarshal buf
+
+glGetTexEnvC4f :: GLenum -> GLenum -> Ptr (Color4 GLfloat) -> IO ()
+glGetTexEnvC4f t p ptr = glGetTexEnvfv t p (castPtr ptr)
+
+--------------------------------------------------------------------------------
+
+m2a :: (a -> b) -> a -> (b -> IO ()) -> IO ()
+m2a marshal x act = act (marshal x)
+
+texEnvi ::
+   (GLint -> a) -> (a -> GLint) -> TextureEnvTarget -> TextureEnvParameter -> StateVar a
+texEnvi unmarshal marshal t p =
+   makeStateVar
+      (getTexEnv glGetTexEnviv unmarshal     t p)
+      (texEnv    glTexEnvi     (m2a marshal) t p)
+
+texEnvf ::
+   (GLfloat -> a) -> (a -> GLfloat) -> TextureEnvTarget -> TextureEnvParameter -> StateVar a
+texEnvf unmarshal marshal t p =
+   makeStateVar
+      (getTexEnv glGetTexEnvfv unmarshal     t p)
+      (texEnv    glTexEnvf     (m2a marshal) t p)
+
+texEnvC4f :: TextureEnvTarget -> TextureEnvParameter -> StateVar (Color4 GLfloat)
+texEnvC4f t p =
+   makeStateVar
+      (getTexEnv glGetTexEnvC4f id   t p)
+      (texEnv    glTexEnvC4f    with t p)
+
+--------------------------------------------------------------------------------
+
+data TextureFunction =
+     Modulate
+   | Decal
+   | Blend
+   | Replace
+   | AddUnsigned
+   | Combine
+   | Combine4
+   deriving ( Eq, Ord, Show )
+
+marshalTextureFunction :: TextureFunction -> GLint
+marshalTextureFunction x = fromIntegral $ case x of
+   Modulate -> GL_MODULATE
+   Decal -> GL_DECAL
+   Blend -> GL_BLEND
+   Replace -> GL_REPLACE
+   AddUnsigned -> GL_ADD
+   Combine -> GL_COMBINE
+   Combine4 -> GL_COMBINE4_NV
+
+unmarshalTextureFunction :: GLint -> TextureFunction
+unmarshalTextureFunction x
+   | y == GL_MODULATE = Modulate
+   | y == GL_DECAL = Decal
+   | y == GL_BLEND = Blend
+   | y == GL_REPLACE = Replace
+   | y == GL_ADD = AddUnsigned
+   | y == GL_COMBINE = Combine
+   | y == GL_COMBINE4_NV = Combine4
+   | otherwise = error ("unmarshalTextureFunction: illegal value " ++ show x)
+   where y = fromIntegral x
+
+--------------------------------------------------------------------------------
+
+textureFunction :: StateVar TextureFunction
+textureFunction =
+   texEnvi unmarshalTextureFunction marshalTextureFunction TextureEnv TexEnvParamTextureEnvMode
+
+--------------------------------------------------------------------------------
+
+data TextureCombineFunction =
+     Replace'
+   | Modulate'
+   | AddUnsigned'
+   | AddSigned
+   | Interpolate
+   | Subtract
+   | Dot3RGB
+   | Dot3RGBA
+   deriving ( Eq, Ord, Show )
+
+marshalTextureCombineFunction :: TextureCombineFunction -> GLint
+marshalTextureCombineFunction x = fromIntegral $ case x of
+   Replace' -> GL_REPLACE
+   Modulate' -> GL_MODULATE
+   AddUnsigned' -> GL_ADD
+   AddSigned -> GL_ADD_SIGNED
+   Interpolate -> GL_INTERPOLATE
+   Subtract -> GL_SUBTRACT
+   Dot3RGB -> GL_DOT3_RGB
+   Dot3RGBA -> GL_DOT3_RGBA
+
+unmarshalTextureCombineFunction :: GLint -> TextureCombineFunction
+unmarshalTextureCombineFunction x
+   | y == GL_REPLACE = Replace'
+   | y == GL_MODULATE = Modulate'
+   | y == GL_ADD = AddUnsigned'
+   | y == GL_ADD_SIGNED = AddSigned
+   | y == GL_INTERPOLATE = Interpolate
+   | y == GL_SUBTRACT = Subtract
+   | y == GL_DOT3_RGB = Dot3RGB
+   | y == GL_DOT3_RGBA = Dot3RGBA
+   | otherwise = error ("unmarshalTextureCombineFunction: illegal value " ++ show x)
+   where y = fromIntegral x
+
+--------------------------------------------------------------------------------
+
+combineRGB :: StateVar TextureCombineFunction
+combineRGB = combine TexEnvParamCombineRGB
+
+combineAlpha :: StateVar TextureCombineFunction
+combineAlpha = combine TexEnvParamCombineAlpha
+
+combine :: TextureEnvParameter -> StateVar TextureCombineFunction
+combine =
+   texEnvi unmarshalTextureCombineFunction marshalTextureCombineFunction TextureEnv
+
+--------------------------------------------------------------------------------
+
+data ArgNum =
+     Arg0
+   | Arg1
+   | Arg2
+   | Arg3
+   deriving ( Eq, Ord, Show )
+
+argNumToOperandRGB :: ArgNum -> TextureEnvParameter
+argNumToOperandRGB x = case x of
+   Arg0 -> TexEnvParamOperand0RGB
+   Arg1 -> TexEnvParamOperand1RGB
+   Arg2 -> TexEnvParamOperand2RGB
+   Arg3 -> TexEnvParamOperand3RGB
+
+argNumToOperandAlpha :: ArgNum -> TextureEnvParameter
+argNumToOperandAlpha x = case x of
+   Arg0 -> TexEnvParamOperand0Alpha
+   Arg1 -> TexEnvParamOperand1Alpha
+   Arg2 -> TexEnvParamOperand2Alpha
+   Arg3 -> TexEnvParamOperand3Alpha
+
+argNumToSrcRGB :: ArgNum -> TextureEnvParameter
+argNumToSrcRGB x = case x of
+   Arg0 -> TexEnvParamSrc0RGB
+   Arg1 -> TexEnvParamSrc1RGB
+   Arg2 -> TexEnvParamSrc2RGB
+   Arg3 -> TexEnvParamSrc3RGB
+
+argNumToSrcAlpha :: ArgNum -> TextureEnvParameter
+argNumToSrcAlpha x = case x of
+   Arg0 -> TexEnvParamSrc0Alpha
+   Arg1 -> TexEnvParamSrc1Alpha
+   Arg2 -> TexEnvParamSrc2Alpha
+   Arg3 -> TexEnvParamSrc3Alpha
+
+--------------------------------------------------------------------------------
+
+data Arg = Arg BlendingFactor Src
+   deriving ( Eq, Ord, Show )
+
+--------------------------------------------------------------------------------
+
+data Src =
+     CurrentUnit
+   | Previous
+   | Crossbar TextureUnit
+   | Constant
+   | PrimaryColor
+   deriving ( Eq, Ord, Show )
+
+marshalSrc :: Src -> GLint
+marshalSrc x = fromIntegral $ case x of
+   CurrentUnit -> GL_TEXTURE
+   Previous -> GL_PREVIOUS
+   Crossbar u -> fromIntegral (marshalTextureUnit u)
+   Constant -> GL_CONSTANT
+   PrimaryColor -> GL_PRIMARY_COLOR
+
+unmarshalSrc :: GLint -> Src
+unmarshalSrc x
+   | y == GL_TEXTURE = CurrentUnit
+   | y == GL_PREVIOUS = Previous
+   | y == GL_CONSTANT = Constant
+   | y == GL_PRIMARY_COLOR = PrimaryColor
+   | otherwise = Crossbar (unmarshalTextureUnit (fromIntegral x))
+   where y = fromIntegral x
+
+--------------------------------------------------------------------------------
+
+argRGB :: ArgNum -> StateVar Arg
+argRGB n = arg (argNumToOperandRGB n) (argNumToSrcRGB n)
+
+argAlpha :: ArgNum -> StateVar Arg
+argAlpha n = arg (argNumToOperandAlpha n) (argNumToSrcAlpha n)
+
+arg :: TextureEnvParameter -> TextureEnvParameter -> StateVar Arg
+arg op src = combineArg (textureEnvOperand op) (textureEnvSrc src)
+   where combineArg :: StateVar BlendingFactor -> StateVar Src -> StateVar Arg
+         combineArg v w = makeStateVar
+                             (liftM2 Arg (get v) (get w))
+                             (\(Arg x y) -> do v $= x; w $= y)
+
+textureEnvOperand :: TextureEnvParameter -> StateVar BlendingFactor
+textureEnvOperand =
+   texEnvi (unmarshalBlendingFactor . fromIntegral) (fromIntegral . marshalBlendingFactor) TextureEnv
+
+textureEnvSrc :: TextureEnvParameter -> StateVar Src
+textureEnvSrc = texEnvi unmarshalSrc marshalSrc TextureEnv
+
+--------------------------------------------------------------------------------
+
+rgbScale :: StateVar GLfloat
+rgbScale = scale TexEnvParamRGBScale
+
+alphaScale :: StateVar GLfloat
+alphaScale = scale TexEnvParamAlphaScale
+
+scale :: TextureEnvParameter -> StateVar GLfloat
+scale = texEnvf id id TextureEnv
+
+--------------------------------------------------------------------------------
+
+constantColor :: StateVar (Color4 GLfloat)
+constantColor = texEnvC4f TextureEnv TexEnvParamTextureEnvColor
+
+--------------------------------------------------------------------------------
+
+textureUnitLODBias :: StateVar LOD
+textureUnitLODBias = texEnvf id id TextureFilterControl TexEnvParamLODBias
diff --git a/src/Graphics/Rendering/OpenGL/GL/Texturing/Filter.hs b/src/Graphics/Rendering/OpenGL/GL/Texturing/Filter.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/Texturing/Filter.hs
@@ -0,0 +1,67 @@
+{-# OPTIONS_HADDOCK hide #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.Texturing.Filter
+-- Copyright   :  (c) Sven Panne 2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This is a purely internal module for (un-)marshaling texture filtering modes.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.Texturing.Filter (
+   TextureFilter(..),
+   MinificationFilter, marshalMinificationFilter, unmarshalMinificationFilter,
+   MagnificationFilter, marshalMagnificationFilter, unmarshalMagnificationFilter
+) where
+
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+data TextureFilter =
+     Nearest
+   | Linear'
+   deriving ( Eq, Ord, Show )
+
+type MinificationFilter = (TextureFilter, Maybe TextureFilter)
+
+type MagnificationFilter = TextureFilter
+
+-- We treat MagnificationFilter as a degenerated case of MinificationFilter
+magToMin :: MagnificationFilter -> MinificationFilter
+magToMin magFilter = (magFilter, Nothing)
+
+minToMag :: MinificationFilter -> MagnificationFilter
+minToMag (magFilter, Nothing) = magFilter
+minToMag minFilter = error ("minToMag: illegal value " ++ show minFilter)
+
+marshalMinificationFilter :: MinificationFilter -> GLint
+marshalMinificationFilter x = fromIntegral $ case x of
+   (Nearest, Nothing     ) -> GL_NEAREST
+   (Linear', Nothing     ) -> GL_LINEAR
+   (Nearest, Just Nearest) -> GL_NEAREST_MIPMAP_NEAREST
+   (Linear', Just Nearest) -> GL_LINEAR_MIPMAP_NEAREST
+   (Nearest, Just Linear') -> GL_NEAREST_MIPMAP_LINEAR
+   (Linear', Just Linear') -> GL_LINEAR_MIPMAP_LINEAR
+
+marshalMagnificationFilter :: MagnificationFilter -> GLint
+marshalMagnificationFilter = marshalMinificationFilter . magToMin
+
+unmarshalMinificationFilter :: GLint -> MinificationFilter
+unmarshalMinificationFilter x
+   | y == GL_NEAREST = (Nearest, Nothing)
+   | y == GL_LINEAR = (Linear', Nothing)
+   | y == GL_NEAREST_MIPMAP_NEAREST = (Nearest, Just Nearest)
+   | y == GL_LINEAR_MIPMAP_NEAREST = (Linear', Just Nearest)
+   | y == GL_NEAREST_MIPMAP_LINEAR = (Nearest, Just Linear')
+   | y == GL_LINEAR_MIPMAP_LINEAR = (Linear', Just Linear')
+   | otherwise = error ("unmarshalMinificationFilter: illegal value " ++ show x)
+   where y = fromIntegral x
+
+unmarshalMagnificationFilter :: GLint -> MagnificationFilter
+unmarshalMagnificationFilter = minToMag . unmarshalMinificationFilter
diff --git a/src/Graphics/Rendering/OpenGL/GL/Texturing/Objects.hs b/src/Graphics/Rendering/OpenGL/GL/Texturing/Objects.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/Texturing/Objects.hs
@@ -0,0 +1,86 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.Texturing.Objects
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 3.8.12 (Texture Objects) of the OpenGL 2.1
+-- specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.Texturing.Objects (
+   TextureObject(TextureObject), textureBinding,
+   textureResident, areTexturesResident,
+   TexturePriority, texturePriority, prioritizeTextures,
+   generateMipmap'
+) where
+
+import Data.List
+import Data.Maybe (fromMaybe)
+import Data.StateVar
+import Foreign.Marshal.Array
+import Graphics.Rendering.OpenGL.GL.GLboolean
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.Rendering.OpenGL.GL.Texturing.TexParameter
+import Graphics.Rendering.OpenGL.GL.Texturing.TextureObject
+import Graphics.Rendering.OpenGL.GL.Texturing.TextureTarget
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+textureBinding :: BindableTextureTarget t => t -> StateVar (Maybe TextureObject)
+textureBinding t =
+   makeStateVar
+      (do o <- getEnum1 (TextureObject . fromIntegral) (marshalBindableTextureTargetPName1I t)
+          return $ if o == defaultTextureObject then Nothing else Just o)
+      (glBindTexture (marshalBindableTextureTarget t) . textureID . (fromMaybe defaultTextureObject))
+
+defaultTextureObject :: TextureObject
+defaultTextureObject = TextureObject 0
+
+--------------------------------------------------------------------------------
+
+textureResident :: ParameterizedTextureTarget t => t -> GettableStateVar Bool
+textureResident t =
+   makeGettableStateVar $
+      getTexParameteri unmarshalGLboolean t TextureResident
+
+areTexturesResident :: [TextureObject] -> IO ([TextureObject],[TextureObject])
+areTexturesResident texObjs = do
+   withArrayLen (map textureID texObjs) $ \len texObjsBuf ->
+      allocaArray len $ \residentBuf -> do
+         allResident <-
+            glAreTexturesResident (fromIntegral len) texObjsBuf residentBuf
+         if unmarshalGLboolean allResident
+            then return (texObjs, [])
+            else do
+               tr <- fmap (zip texObjs) $ peekArray len residentBuf
+               let (resident, nonResident) = partition (unmarshalGLboolean . snd) tr
+               return (map fst resident, map fst nonResident)
+
+--------------------------------------------------------------------------------
+
+type TexturePriority = GLclampf
+
+texturePriority :: ParameterizedTextureTarget t => t -> StateVar TexturePriority
+texturePriority = texParamf realToFrac realToFrac TexturePriority
+
+prioritizeTextures :: [(TextureObject,TexturePriority)] -> IO ()
+prioritizeTextures tps =
+   withArrayLen (map (textureID . fst) tps) $ \len texObjsBuf ->
+      withArray (map snd tps) $
+         glPrioritizeTextures (fromIntegral len) texObjsBuf
+
+--------------------------------------------------------------------------------
+
+-- | Generate mipmaps for the specified texture target. Note that from OpenGL
+-- 3.1 onwards you should use this function instead of the texture parameter
+-- 'Graphics.Rendering.OpenGL.GL.Texturing.Parameters.generateMipmap'.
+
+generateMipmap' :: ParameterizedTextureTarget t => t -> IO ()
+generateMipmap' = glGenerateMipmap . marshalParameterizedTextureTarget
diff --git a/src/Graphics/Rendering/OpenGL/GL/Texturing/Parameters.hs b/src/Graphics/Rendering/OpenGL/GL/Texturing/Parameters.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/Texturing/Parameters.hs
@@ -0,0 +1,234 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.Texturing.Parameters
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 3.8.4 (Texture Parameters), section 3.8.7
+-- (Texture Wrap Mode), section 3.8.8 (Texture Minification), and section 3.8.9
+-- (Texture Magnification) of the OpenGL 2.1 specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.Texturing.Parameters (
+   TextureFilter(..), MinificationFilter, MagnificationFilter, textureFilter,
+   Repetition(..), Clamping(..), textureWrapMode,
+   textureBorderColor, LOD, textureObjectLODBias, maxTextureLODBias,
+   textureLODRange, textureMaxAnisotropy, maxTextureMaxAnisotropy,
+   textureLevelRange, generateMipmap, depthTextureMode, textureCompareMode,
+   textureCompareFailValue, TextureCompareOperator(..), textureCompareOperator
+) where
+
+import Control.Monad
+import Data.StateVar
+import Graphics.Rendering.OpenGL.GL.Capability
+import Graphics.Rendering.OpenGL.GL.ComparisonFunction
+import Graphics.Rendering.OpenGL.GL.CoordTrans
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.Rendering.OpenGL.GL.Texturing.Filter
+import Graphics.Rendering.OpenGL.GL.Texturing.PixelInternalFormat
+import Graphics.Rendering.OpenGL.GL.Texturing.Specification
+import Graphics.Rendering.OpenGL.GL.Texturing.TexParameter
+import Graphics.Rendering.OpenGL.GL.VertexSpec
+import Graphics.Rendering.OpenGL.GLU.ErrorsInternal
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+textureFilter :: ParameterizedTextureTarget t => t -> StateVar (MinificationFilter, MagnificationFilter)
+textureFilter =
+   combineTexParams
+      (texParami unmarshalMinificationFilter  marshalMinificationFilter  TextureMinFilter)
+      (texParami unmarshalMagnificationFilter marshalMagnificationFilter TextureMagFilter)
+
+--------------------------------------------------------------------------------
+
+data Repetition =
+     Repeated
+   | Mirrored
+   deriving ( Eq, Ord, Show )
+
+data Clamping =
+     Clamp
+   | Repeat
+   | ClampToEdge
+   | ClampToBorder
+   deriving ( Eq, Ord, Show )
+
+marshalTextureWrapMode :: (Repetition, Clamping) -> GLint
+marshalTextureWrapMode x = fromIntegral $ case x of
+   (Repeated, Clamp) -> GL_CLAMP
+   (Repeated, Repeat) -> GL_REPEAT
+   (Repeated, ClampToEdge) -> GL_CLAMP_TO_EDGE
+   (Repeated, ClampToBorder) -> GL_CLAMP_TO_BORDER
+   (Mirrored, Clamp) -> GL_MIRROR_CLAMP_EXT
+   (Mirrored, Repeat) -> GL_MIRRORED_REPEAT
+   (Mirrored, ClampToEdge) -> GL_MIRROR_CLAMP_TO_EDGE
+   (Mirrored, ClampToBorder) -> GL_MIRROR_CLAMP_TO_BORDER_EXT
+
+unmarshalTextureWrapMode :: GLint -> (Repetition, Clamping)
+unmarshalTextureWrapMode x
+   | y == GL_CLAMP = (Repeated, Clamp)
+   | y == GL_REPEAT = (Repeated, Repeat)
+   | y == GL_CLAMP_TO_EDGE = (Repeated, ClampToEdge)
+   | y == GL_CLAMP_TO_BORDER = (Repeated, ClampToBorder)
+   | y == GL_MIRROR_CLAMP_EXT = (Mirrored, Clamp)
+   | y == GL_MIRRORED_REPEAT = (Mirrored, Repeat)
+   | y == GL_MIRROR_CLAMP_TO_EDGE = (Mirrored, ClampToEdge)
+   | y == GL_MIRROR_CLAMP_TO_BORDER_EXT = (Mirrored, ClampToBorder)
+   | otherwise = error ("unmarshalTextureWrapMode: illegal value " ++ show x)
+   where y = fromIntegral x
+
+--------------------------------------------------------------------------------
+
+textureWrapMode :: ParameterizedTextureTarget t => t -> TextureCoordName -> StateVar (Repetition,Clamping)
+textureWrapMode t coord = case coord of
+   S -> wrap TextureWrapS
+   T -> wrap TextureWrapT
+   R -> wrap TextureWrapR
+   Q -> invalidTextureCoord
+   where wrap c = texParami unmarshalTextureWrapMode marshalTextureWrapMode c t
+
+invalidTextureCoord :: StateVar (Repetition,Clamping)
+invalidTextureCoord =
+   makeStateVar
+      (do recordInvalidEnum; return (Repeated, Repeat))
+      (const recordInvalidEnum)
+
+--------------------------------------------------------------------------------
+
+textureBorderColor :: ParameterizedTextureTarget t => t -> StateVar (Color4 GLfloat)
+textureBorderColor = texParamC4f TextureBorderColor
+
+--------------------------------------------------------------------------------
+
+type LOD = GLfloat
+
+textureObjectLODBias :: ParameterizedTextureTarget t => t -> StateVar LOD
+textureObjectLODBias = texParamf id id TextureLODBias
+
+maxTextureLODBias :: GettableStateVar LOD
+maxTextureLODBias =
+   makeGettableStateVar (getFloat1 id GetMaxTextureLODBias)
+
+textureLODRange :: ParameterizedTextureTarget t => t -> StateVar (LOD,LOD)
+textureLODRange =
+   combineTexParams
+      (texParamf id id TextureMinLOD)
+      (texParamf id id TextureMaxLOD)
+
+--------------------------------------------------------------------------------
+
+textureMaxAnisotropy :: ParameterizedTextureTarget t => t -> StateVar GLfloat
+textureMaxAnisotropy = texParamf id id TextureMaxAnisotropy
+
+maxTextureMaxAnisotropy :: GettableStateVar GLfloat
+maxTextureMaxAnisotropy =
+   makeGettableStateVar (getFloat1 id GetMaxTextureMaxAnisotropy)
+
+--------------------------------------------------------------------------------
+
+textureLevelRange :: ParameterizedTextureTarget t => t -> StateVar (Level,Level)
+textureLevelRange =
+   combineTexParams
+      (texParami id id TextureBaseLevel)
+      (texParami id id TextureMaxLevel)
+
+--------------------------------------------------------------------------------
+
+-- | Note: OpenGL 3.1 deprecated this texture parameter, use
+-- 'Graphics.Rendering.OpenGL.GL.Texturing.Objects.generateMipmap'' instead.
+
+generateMipmap :: ParameterizedTextureTarget t => t -> StateVar Capability
+generateMipmap = texParami unmarshal marshal GenerateMipmap
+   where unmarshal = unmarshalCapability . fromIntegral
+         marshal = fromIntegral . marshalCapability
+
+--------------------------------------------------------------------------------
+
+-- Only Luminance', Intensity, and Alpha' allowed
+depthTextureMode :: ParameterizedTextureTarget t => t -> StateVar PixelInternalFormat
+depthTextureMode =
+   texParami unmarshalPixelInternalFormat marshalPixelInternalFormat DepthTextureMode
+
+--------------------------------------------------------------------------------
+
+marshalTextureCompareMode :: Capability -> GLint
+marshalTextureCompareMode x = fromIntegral $ case x of
+   Disabled -> GL_NONE
+   Enabled -> GL_COMPARE_REF_TO_TEXTURE
+
+unmarshalTextureCompareMode :: GLint -> Capability
+unmarshalTextureCompareMode x
+   | y == GL_NONE = Disabled
+   | y == GL_COMPARE_REF_TO_TEXTURE = Enabled
+   | otherwise = error ("unmarshalTextureCompareMode: illegal value " ++ show x)
+   where y = fromIntegral x
+
+--------------------------------------------------------------------------------
+
+textureCompareMode :: ParameterizedTextureTarget t => t -> StateVar (Maybe ComparisonFunction)
+textureCompareMode =
+   combineTexParamsMaybe
+      (texParami unmarshalTextureCompareMode marshalTextureCompareMode TextureCompareMode)
+      (texParami unmarshal marshal TextureCompareFunc)
+   where unmarshal = unmarshalComparisonFunction . fromIntegral
+         marshal = fromIntegral . marshalComparisonFunction
+
+--------------------------------------------------------------------------------
+
+textureCompareFailValue :: ParameterizedTextureTarget t => t -> StateVar GLclampf
+textureCompareFailValue = texParamf realToFrac realToFrac TextureCompareFailValue
+
+--------------------------------------------------------------------------------
+
+data TextureCompareOperator =
+     LequalR
+   | GequalR
+   deriving ( Eq, Ord, Show )
+
+marshalTextureCompareOperator :: TextureCompareOperator -> GLenum
+marshalTextureCompareOperator x = case x of
+   LequalR -> GL_TEXTURE_LEQUAL_R_SGIX
+   GequalR -> GL_TEXTURE_GEQUAL_R_SGIX
+
+unmarshalTextureCompareOperator :: GLenum -> TextureCompareOperator
+unmarshalTextureCompareOperator x
+   | x == GL_TEXTURE_LEQUAL_R_SGIX = LequalR
+   | x == GL_TEXTURE_GEQUAL_R_SGIX = GequalR
+   | otherwise = error ("unmarshalTextureCompareOperator: illegal value " ++ show x)
+
+--------------------------------------------------------------------------------
+
+textureCompareOperator :: ParameterizedTextureTarget t => t -> StateVar (Maybe TextureCompareOperator)
+textureCompareOperator =
+   combineTexParamsMaybe
+      (texParami (unmarshalCapability . fromIntegral) (fromIntegral. marshalCapability) TextureCompare)
+      (texParami (unmarshalTextureCompareOperator . fromIntegral) (fromIntegral . marshalTextureCompareOperator) TextureCompareOperator)
+
+--------------------------------------------------------------------------------
+
+combineTexParams :: (t -> StateVar a)
+                 -> (t -> StateVar b)
+                 -> (t -> StateVar (a,b))
+combineTexParams v w t =
+   makeStateVar
+      (liftM2 (,) (get (v t)) (get (w t)))
+      (\(x,y) -> do v t $= x; w t $= y)
+
+combineTexParamsMaybe :: (t -> StateVar Capability)
+                      -> (t -> StateVar a)
+                      -> (t -> StateVar (Maybe a))
+combineTexParamsMaybe enab val t =
+   makeStateVar
+      (do tcm <- get (enab t)
+          case tcm of
+             Disabled -> return Nothing
+             Enabled -> fmap Just $ get (val t))
+      (maybe (enab t $= Disabled)
+             (\tcf -> do val t $= tcf
+                         enab t $= Enabled))
diff --git a/src/Graphics/Rendering/OpenGL/GL/Texturing/PixelInternalFormat.hs b/src/Graphics/Rendering/OpenGL/GL/Texturing/PixelInternalFormat.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/Texturing/PixelInternalFormat.hs
@@ -0,0 +1,437 @@
+{-# OPTIONS_HADDOCK hide #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.Texturing.PixelInternalFormat
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This is a purely internal module for (un-)marshaling PixelInternalFormat.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.Texturing.PixelInternalFormat (
+   PixelInternalFormat(..), marshalPixelInternalFormat,
+   marshalPixelInternalFormat', unmarshalPixelInternalFormat,
+) where
+
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+data PixelInternalFormat =
+     Alpha'
+   | DepthComponent'
+   | Luminance'
+   | LuminanceAlpha'
+   | Intensity
+   | R8
+   | R16
+   | RG8
+   | RG16
+   | RGB'
+   | RGBA'
+   | SRGB
+   | SRGBAlpha
+   | SLuminance
+   | SLuminanceAlpha
+   | Alpha4
+   | Alpha8
+   | Alpha12
+   | Alpha16
+   | DepthComponent16
+   | DepthComponent24
+   | DepthComponent32
+   | Luminance4
+   | Luminance8
+   | Luminance12
+   | Luminance16
+   | Luminance4Alpha4
+   | Luminance6Alpha2
+   | Luminance8Alpha8
+   | Luminance12Alpha4
+   | Luminance12Alpha12
+   | Luminance16Alpha16
+   | Intensity4
+   | Intensity8
+   | Intensity12
+   | Intensity16
+   | R3G3B2
+   | RGB4
+   | RGB5
+   | RGB8
+   | RGB10
+   | RGB12
+   | RGB16
+   | RGBA2
+   | RGBA4
+   | RGB5A1
+   | RGBA8
+   | RGB10A2
+   | RGBA12
+   | RGBA16
+   | SRGB8
+   | SRGB8Alpha8
+   | R16F
+   | RG16F
+   | RGB16F
+   | RGBA16F
+   | R32F
+   | RG32F
+   | RGB32F
+   | RGBA32F
+   | R8I
+   | R8UI
+   | R16I
+   | R16UI
+   | R32I
+   | R32UI
+   | RG8I
+   | RG8UI
+   | RG16I
+   | RG16UI
+   | RG32I
+   | RG32UI
+   | RGB8I
+   | RGB8UI
+   | RGB16I
+   | RGB16UI
+   | RGB32I
+   | RGB32UI
+   | RGBA8I
+   | RGBA8UI
+   | RGBA16I
+   | RGBA16UI
+   | RGBA32I
+   | RGBA32UI
+   | SLuminance8
+   | SLuminance8Alpha8
+   | CompressedAlpha
+   | CompressedLuminance
+   | CompressedLuminanceAlpha
+   | CompressedIntensity
+   | CompressedRed
+   | CompressedRG
+   | CompressedRGB
+   | CompressedRGBA
+   | CompressedSRGB
+   | CompressedSRGBAlpha
+   | CompressedSLuminance
+   | CompressedSLuminanceAlpha
+   | CompressedRedRGTC1
+   | CompressedSignedRedRGTC1
+   | CompressedRG_RGTC2
+   | CompressedSignedRG_RGTC2
+   | DepthComponent32f
+   | Depth32fStencil8
+   | RGB9E5
+   | R11fG11fB10f
+   | StencilIndex1
+   | StencilIndex4
+   | StencilIndex8
+   | StencilIndex16
+   | RGBS3TC
+   | RGB4S3TC
+   | RGBAS3TC
+   | RGBA4S3TC
+   | RGBADXT5S3TC
+   | RGBA4DXT5S3TC
+   | CompressedRGBAS3TCDXT1
+   | CompressedRGBAS3TCDXT3
+   | CompressedRGBAS3TCDXT5
+   | CompressedRGBS3TCDXT1
+   | Alpha32F
+   | Intensity32F
+   | Luminance32F
+   | LuminanceAlpha32F
+   | Alpha16F
+   | Intensity16F
+   | Luminance16F
+   | LuminanceAlpha16F
+   | Depth24Stencil8
+   deriving ( Eq, Ord, Show )
+
+marshalPixelInternalFormat :: PixelInternalFormat -> GLint
+marshalPixelInternalFormat x = fromIntegral $ case x of
+   Alpha' -> GL_ALPHA
+   DepthComponent' -> GL_DEPTH_COMPONENT
+   Luminance' -> GL_LUMINANCE
+   LuminanceAlpha' -> GL_LUMINANCE_ALPHA
+   R8 -> GL_R8
+   R16 -> GL_R16
+   RG8 -> GL_RG8
+   RG16 -> GL_RG16
+   RGB' -> GL_RGB
+   RGBA' -> GL_RGBA
+   SRGB -> GL_SRGB
+   SRGBAlpha -> GL_SRGB_ALPHA
+   SLuminance -> GL_SLUMINANCE
+   SLuminanceAlpha -> GL_SLUMINANCE_ALPHA
+   Alpha4 -> GL_ALPHA4
+   Alpha8 -> GL_ALPHA8
+   Alpha12 -> GL_ALPHA12
+   Alpha16 -> GL_ALPHA16
+   DepthComponent16 -> GL_DEPTH_COMPONENT16
+   DepthComponent24 -> GL_DEPTH_COMPONENT24
+   DepthComponent32 -> GL_DEPTH_COMPONENT32
+   Luminance4 -> GL_LUMINANCE4
+   Luminance8 -> GL_LUMINANCE8
+   Luminance12 -> GL_LUMINANCE12
+   Luminance16 -> GL_LUMINANCE16
+   Luminance4Alpha4 -> GL_LUMINANCE4_ALPHA4
+   Luminance6Alpha2 -> GL_LUMINANCE6_ALPHA2
+   Luminance8Alpha8 -> GL_LUMINANCE8_ALPHA8
+   Luminance12Alpha4 -> GL_LUMINANCE12_ALPHA4
+   Luminance12Alpha12 -> GL_LUMINANCE12_ALPHA12
+   Luminance16Alpha16 -> GL_LUMINANCE16_ALPHA16
+   Intensity -> GL_INTENSITY
+   Intensity4 -> GL_INTENSITY4
+   Intensity8 -> GL_INTENSITY8
+   Intensity12 -> GL_INTENSITY12
+   Intensity16 -> GL_INTENSITY16
+   R3G3B2 -> GL_R3_G3_B2
+   RGB4 -> GL_RGB4
+   RGB5 -> GL_RGB5
+   RGB8 -> GL_RGB8
+   RGB10 -> GL_RGB10
+   RGB12 -> GL_RGB12
+   RGB16 -> GL_RGB16
+   RGBA2 -> GL_RGBA2
+   RGBA4 -> GL_RGBA4
+   RGB5A1 -> GL_RGB5_A1
+   RGBA8 -> GL_RGBA8
+   RGB10A2 -> GL_RGB10_A2
+   RGBA12 -> GL_RGBA12
+   RGBA16 -> GL_RGBA16
+   SRGB8 -> GL_SRGB8
+   SRGB8Alpha8 -> GL_SRGB8_ALPHA8
+   R16F -> GL_R16F
+   RG16F -> GL_RG16F
+   RGB16F -> GL_RGB16F
+   RGBA16F -> GL_RGBA16F
+   R32F -> GL_R32F
+   RG32F -> GL_RG32F
+   RGB32F -> GL_RGB32F
+   RGBA32F -> GL_RGBA32F
+   R8I -> GL_R8I
+   R8UI -> GL_R8UI
+   R16I -> GL_R16I
+   R16UI -> GL_R16UI
+   R32I -> GL_R32I
+   R32UI -> GL_R32UI
+   RG8I -> GL_RG8I
+   RG8UI -> GL_RG8UI
+   RG16I -> GL_RG16I
+   RG16UI -> GL_RG16UI
+   RG32I -> GL_R32I
+   RG32UI -> GL_R32UI
+   RGB8I -> GL_RGB8I
+   RGB8UI -> GL_RGB8UI
+   RGB16I -> GL_RGB16I
+   RGB16UI -> GL_RGB16UI
+   RGB32I -> GL_RGB32I
+   RGB32UI -> GL_RGB32UI
+   RGBA8I -> GL_RGBA8I
+   RGBA8UI -> GL_RGBA8UI
+   RGBA16I -> GL_RGBA16I
+   RGBA16UI -> GL_RGBA16UI
+   RGBA32I -> GL_RGBA32I
+   RGBA32UI -> GL_RGBA32UI
+   SLuminance8 -> GL_SLUMINANCE8
+   SLuminance8Alpha8 -> GL_SLUMINANCE8_ALPHA8
+   CompressedAlpha -> GL_COMPRESSED_ALPHA
+   CompressedLuminance -> GL_COMPRESSED_LUMINANCE
+   CompressedLuminanceAlpha -> GL_COMPRESSED_LUMINANCE_ALPHA
+   CompressedIntensity -> GL_COMPRESSED_INTENSITY
+   CompressedRed -> GL_COMPRESSED_RED
+   CompressedRG -> GL_COMPRESSED_RG
+   CompressedRGB -> GL_COMPRESSED_RGB
+   CompressedRGBA -> GL_COMPRESSED_RGBA
+   CompressedSRGB -> GL_COMPRESSED_SRGB
+   CompressedSRGBAlpha -> GL_COMPRESSED_SRGB_ALPHA
+   CompressedSLuminance -> GL_COMPRESSED_SLUMINANCE
+   CompressedSLuminanceAlpha -> GL_COMPRESSED_SLUMINANCE_ALPHA
+   CompressedRedRGTC1 -> GL_COMPRESSED_RED_RGTC1
+   CompressedSignedRedRGTC1 -> GL_COMPRESSED_SIGNED_RED_RGTC1
+   CompressedRG_RGTC2 -> GL_COMPRESSED_RG_RGTC2
+   CompressedSignedRG_RGTC2 -> GL_COMPRESSED_SIGNED_RG_RGTC2
+   DepthComponent32f -> GL_DEPTH_COMPONENT32F
+   Depth32fStencil8 -> GL_DEPTH32F_STENCIL8
+   RGB9E5 -> GL_RGB9_E5
+   R11fG11fB10f -> GL_R11F_G11F_B10F
+   StencilIndex1 -> GL_STENCIL_INDEX1
+   StencilIndex4 -> GL_STENCIL_INDEX4
+   StencilIndex8 -> GL_STENCIL_INDEX8
+   StencilIndex16 -> GL_STENCIL_INDEX16
+   RGBS3TC -> GL_RGB_S3TC
+   RGB4S3TC -> GL_RGB4_S3TC
+   RGBAS3TC -> GL_RGBA_S3TC
+   RGBA4S3TC -> GL_RGBA4_S3TC
+   RGBADXT5S3TC -> GL_RGBA_DXT5_S3TC
+   RGBA4DXT5S3TC -> GL_RGBA4_DXT5_S3TC
+   CompressedRGBAS3TCDXT1 -> GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
+   CompressedRGBAS3TCDXT3 -> GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
+   CompressedRGBAS3TCDXT5 -> GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
+   CompressedRGBS3TCDXT1 -> GL_COMPRESSED_RGB_S3TC_DXT1_EXT
+   Alpha32F -> GL_ALPHA32F_ARB
+   Intensity32F -> GL_INTENSITY32F_ARB
+   Luminance32F -> GL_LUMINANCE32F_ARB
+   LuminanceAlpha32F -> GL_LUMINANCE_ALPHA32F_ARB
+   Alpha16F -> GL_ALPHA16F_ARB
+   Intensity16F -> GL_INTENSITY16F_ARB
+   Luminance16F -> GL_LUMINANCE16F_ARB
+   LuminanceAlpha16F -> GL_LUMINANCE_ALPHA16F_ARB
+   Depth24Stencil8 -> GL_DEPTH24_STENCIL8_EXT
+
+-- *sigh* The OpenGL API is sometimes a bit creative in its usage of types...
+marshalPixelInternalFormat' :: PixelInternalFormat -> GLenum
+marshalPixelInternalFormat' = fromIntegral . marshalPixelInternalFormat
+
+unmarshalPixelInternalFormat :: GLint -> PixelInternalFormat
+unmarshalPixelInternalFormat x
+   | y == GL_ALPHA = Alpha'
+   | y == GL_DEPTH_COMPONENT = DepthComponent'
+   | y == GL_LUMINANCE = Luminance'
+   | y == GL_LUMINANCE_ALPHA = LuminanceAlpha'
+   | y == GL_RGB = RGB'
+   | y == GL_RGBA = RGBA'
+   | y == GL_SRGB = SRGB
+   | y == GL_SRGB_ALPHA = SRGBAlpha
+   | y == GL_SLUMINANCE = SLuminance
+   | y == GL_SLUMINANCE_ALPHA = SLuminanceAlpha
+   | y == GL_ALPHA4 = Alpha4
+   | y == GL_ALPHA8 = Alpha8
+   | y == GL_ALPHA12 = Alpha12
+   | y == GL_ALPHA16 = Alpha16
+   | y == GL_DEPTH_COMPONENT16 = DepthComponent16
+   | y == GL_DEPTH_COMPONENT24 = DepthComponent24
+   | y == GL_DEPTH_COMPONENT32 = DepthComponent32
+   | y == GL_LUMINANCE4 = Luminance4
+   | y == GL_LUMINANCE8 = Luminance8
+   | y == GL_LUMINANCE12 = Luminance12
+   | y == GL_LUMINANCE16 = Luminance16
+   | y == GL_LUMINANCE4_ALPHA4 = Luminance4Alpha4
+   | y == GL_LUMINANCE6_ALPHA2 = Luminance6Alpha2
+   | y == GL_LUMINANCE8_ALPHA8 = Luminance8Alpha8
+   | y == GL_LUMINANCE12_ALPHA4 = Luminance12Alpha4
+   | y == GL_LUMINANCE12_ALPHA12 = Luminance12Alpha12
+   | y == GL_LUMINANCE16_ALPHA16 = Luminance16Alpha16
+   | y == GL_INTENSITY = Intensity
+   | y == GL_INTENSITY4 = Intensity4
+   | y == GL_INTENSITY8 = Intensity8
+   | y == GL_INTENSITY12 = Intensity12
+   | y == GL_INTENSITY16 = Intensity16
+   | y == GL_R3_G3_B2 = R3G3B2
+   | y == GL_RGB4 = RGB4
+   | y == GL_RGB5 = RGB5
+   | y == GL_RGB8 = RGB8
+   | y == GL_RGB10 = RGB10
+   | y == GL_RGB12 = RGB12
+   | y == GL_RGB16 = RGB16
+   | y == GL_RGBA2 = RGBA2
+   | y == GL_RGBA4 = RGBA4
+   | y == GL_RGB5_A1 = RGB5A1
+   | y == GL_RGBA8 = RGBA8
+   | y == GL_RGB10_A2 = RGB10A2
+   | y == GL_RGBA12 = RGBA12
+   | y == GL_RGBA16 = RGBA16
+   | y == GL_SRGB8 = SRGB8
+   | y == GL_SRGB8_ALPHA8 = SRGB8Alpha8
+   | y == GL_R16F = R16F
+   | y == GL_RG16F = RG16F
+   | y == GL_RGB16F = RGB16F
+   | y == GL_RGBA16F = RGBA16F
+   | y == GL_R32F = R32F
+   | y == GL_RG32F = RG32F
+   | y == GL_RGB32F = RGB32F
+   | y == GL_RGBA32F = RGBA32F
+   | y == GL_R8I = R8I
+   | y == GL_R8UI = R8UI
+   | y == GL_R16I = R16I
+   | y == GL_R16UI = R16UI
+   | y == GL_R32I = R32I
+   | y == GL_R32UI = R32UI
+   | y == GL_RG8I = RG8I
+   | y == GL_RG8UI = RG8UI
+   | y == GL_RG16I = RG16I
+   | y == GL_RG16UI = RG16UI
+   | y == GL_R32I = RG32I
+   | y == GL_R32UI = RG32UI
+   | y == GL_RGB8I = RGB8I
+   | y == GL_RGB8UI = RGB8UI
+   | y == GL_RGB16I = RGB16I
+   | y == GL_RGB16UI = RGB16UI
+   | y == GL_RGB32I = RGB32I
+   | y == GL_RGB32UI = RGB32UI
+   | y == GL_RGBA8I = RGBA8I
+   | y == GL_RGBA8UI = RGBA8UI
+   | y == GL_RGBA16I = RGBA16I
+   | y == GL_RGBA16UI = RGBA16UI
+   | y == GL_RGBA32I = RGBA32I
+   | y == GL_RGBA32UI = RGBA32UI
+   | y == GL_SLUMINANCE8 = SLuminance8
+   | y == GL_SLUMINANCE8_ALPHA8 = SLuminance8Alpha8
+   | y == GL_COMPRESSED_ALPHA = CompressedAlpha
+   | y == GL_COMPRESSED_LUMINANCE = CompressedLuminance
+   | y == GL_COMPRESSED_LUMINANCE_ALPHA = CompressedLuminanceAlpha
+   | y == GL_COMPRESSED_INTENSITY = CompressedIntensity
+   | y == GL_COMPRESSED_RED = CompressedRed
+   | y == GL_COMPRESSED_RG = CompressedRG
+   | y == GL_COMPRESSED_RGB = CompressedRGB
+   | y == GL_COMPRESSED_RGBA = CompressedRGBA
+   | y == GL_COMPRESSED_SRGB = CompressedSRGB
+   | y == GL_COMPRESSED_SRGB_ALPHA = CompressedSRGBAlpha
+   | y == GL_COMPRESSED_SLUMINANCE = CompressedSLuminance
+   | y == GL_COMPRESSED_SLUMINANCE_ALPHA = CompressedSLuminanceAlpha
+   | y == GL_COMPRESSED_RED_RGTC1 = CompressedRedRGTC1
+   | y == GL_COMPRESSED_SIGNED_RED_RGTC1 = CompressedSignedRedRGTC1
+   | y == GL_COMPRESSED_RG_RGTC2 = CompressedRG_RGTC2
+   | y == GL_COMPRESSED_SIGNED_RG_RGTC2 = CompressedSignedRG_RGTC2
+   | y == GL_DEPTH_COMPONENT32F = DepthComponent32f
+   | y == GL_DEPTH32F_STENCIL8 = Depth32fStencil8
+   | y == GL_RGB9_E5 = RGB9E5
+   | y == GL_STENCIL_INDEX1 = StencilIndex1
+   | y == GL_STENCIL_INDEX4 = StencilIndex4
+   | y == GL_STENCIL_INDEX8 = StencilIndex8
+   | y == GL_STENCIL_INDEX16 = StencilIndex16
+   | y == GL_RGB_S3TC = RGBS3TC
+   | y == GL_RGB4_S3TC = RGB4S3TC
+   | y == GL_RGBA_S3TC = RGBAS3TC
+   | y == GL_RGBA4_S3TC = RGBA4S3TC
+   | y == GL_RGBA_DXT5_S3TC = RGBADXT5S3TC
+   | y == GL_RGBA4_DXT5_S3TC = RGBA4DXT5S3TC
+   | y == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT = CompressedRGBAS3TCDXT1
+   | y == GL_COMPRESSED_RGBA_S3TC_DXT3_EXT = CompressedRGBAS3TCDXT3
+   | y == GL_COMPRESSED_RGBA_S3TC_DXT5_EXT = CompressedRGBAS3TCDXT5
+   | y == GL_COMPRESSED_RGB_S3TC_DXT1_EXT = CompressedRGBS3TCDXT1
+   | y == GL_ALPHA32F_ARB = Alpha32F
+   | y == GL_INTENSITY32F_ARB = Intensity32F
+   | y == GL_LUMINANCE32F_ARB = Luminance32F
+   | y == GL_LUMINANCE_ALPHA32F_ARB = LuminanceAlpha32F
+   | y == GL_ALPHA16F_ARB = Alpha16F
+   | y == GL_INTENSITY16F_ARB = Intensity16F
+   | y == GL_LUMINANCE16F_ARB = Luminance16F
+   | y == GL_LUMINANCE_ALPHA16F_ARB = LuminanceAlpha16F
+   | y == GL_DEPTH24_STENCIL8_EXT = Depth24Stencil8
+   -- legacy values
+   | y == 1 = Luminance'
+   | y == 2 = LuminanceAlpha'
+   | y == 3 = RGB'
+   | y == 4 = RGBA'
+   | otherwise = error ("unmarshalPixelInternalFormat: illegal value " ++ show x)
+   where y = fromIntegral x
+
+-- Note: The following formats are still missing, it's a bit unclear how to
+-- handle these nicely. From the EXT_texture_sRGB spec:
+--
+--    Accepted by the <internalformat> parameter of TexImage2D, CopyTexImage2D,
+--    and CompressedTexImage2DARB and the <format> parameter of
+--    CompressedTexSubImage2DARB:
+--
+--       COMPRESSED_SRGB_S3TC_DXT1_EXT                  0x8C4C
+--       COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT            0x8C4D
+--       COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT            0x8C4E
+--       COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT            0x8C4F
diff --git a/src/Graphics/Rendering/OpenGL/GL/Texturing/Queries.hs b/src/Graphics/Rendering/OpenGL/GL/Texturing/Queries.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/Texturing/Queries.hs
@@ -0,0 +1,200 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.Texturing.Queries
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module offers various texture queries.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.Texturing.Queries (
+   TextureQuery, textureInternalFormat, textureSize1D, textureSize2D,
+   textureSize3D, textureBorder, textureRGBASizes, textureSharedSize,
+   textureIntensitySize, textureLuminanceSize, textureIndexSize,
+   textureDepthBits, textureCompressedImageSize, textureProxyOK,
+   DataRepresentation(..), textureRGBATypes, textureIntensityType,
+   textureLuminanceType, textureDepthType
+) where
+
+import Control.Monad
+import Data.StateVar
+import Foreign.Marshal.Utils
+import Graphics.Rendering.OpenGL.GL.DataType
+import Graphics.Rendering.OpenGL.GL.GLboolean
+import Graphics.Rendering.OpenGL.GL.PeekPoke
+import Graphics.Rendering.OpenGL.GL.PixelRectangles
+import Graphics.Rendering.OpenGL.GL.Texturing.PixelInternalFormat
+import Graphics.Rendering.OpenGL.GL.Texturing.Specification
+import Graphics.Rendering.OpenGL.GL.Texturing.TextureTarget
+import Graphics.Rendering.OpenGL.GL.VertexSpec
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+data TexLevelParameter =
+     TextureInternalFormat
+   | TextureWidth
+   | TextureHeight
+   | TextureDepth
+   | TextureBorder
+   | TextureRedSize
+   | TextureGreenSize
+   | TextureBlueSize
+   | TextureAlphaSize
+   | TextureIntensitySize
+   | TextureLuminanceSize
+   | TextureIndexSize
+   | DepthBits
+   | TextureCompressedImageSize
+   | TextureCompressed
+   | TextureSharedSize
+   | TextureRedType
+   | TextureGreenType
+   | TextureBlueType
+   | TextureAlphaType
+   | TextureLuminanceType
+   | TextureIntensityType
+   | TextureDepthType
+
+marshalTexLevelParameter :: TexLevelParameter -> GLenum
+marshalTexLevelParameter x = case x of
+   TextureInternalFormat -> GL_TEXTURE_INTERNAL_FORMAT
+   TextureWidth -> GL_TEXTURE_WIDTH
+   TextureHeight -> GL_TEXTURE_HEIGHT
+   TextureDepth -> GL_TEXTURE_DEPTH
+   TextureBorder -> GL_TEXTURE_BORDER
+   TextureRedSize -> GL_TEXTURE_RED_SIZE
+   TextureGreenSize -> GL_TEXTURE_GREEN_SIZE
+   TextureBlueSize -> GL_TEXTURE_BLUE_SIZE
+   TextureAlphaSize -> GL_TEXTURE_ALPHA_SIZE
+   TextureIntensitySize -> GL_TEXTURE_INTENSITY_SIZE
+   TextureLuminanceSize -> GL_TEXTURE_LUMINANCE_SIZE
+   TextureIndexSize -> GL_TEXTURE_INDEX_SIZE_EXT
+   DepthBits -> GL_DEPTH_BITS
+   TextureCompressedImageSize -> GL_TEXTURE_COMPRESSED_IMAGE_SIZE
+   TextureCompressed -> GL_TEXTURE_COMPRESSED
+   TextureSharedSize -> GL_TEXTURE_SHARED_SIZE
+   TextureRedType -> GL_TEXTURE_RED_TYPE_ARB
+   TextureGreenType -> GL_TEXTURE_GREEN_TYPE_ARB
+   TextureBlueType -> GL_TEXTURE_BLUE_TYPE_ARB
+   TextureAlphaType -> GL_TEXTURE_ALPHA_TYPE_ARB
+   TextureLuminanceType -> GL_TEXTURE_LUMINANCE_TYPE_ARB
+   TextureIntensityType -> GL_TEXTURE_INTENSITY_TYPE_ARB
+   TextureDepthType -> GL_TEXTURE_DEPTH_TYPE_ARB
+
+--------------------------------------------------------------------------------
+
+type TextureQuery t a = t -> Level -> GettableStateVar a
+
+textureInternalFormat :: QueryableTextureTarget t => TextureQuery t PixelInternalFormat
+textureInternalFormat t level =
+   makeGettableStateVar $
+      getTexLevelParameteriNoProxy unmarshalPixelInternalFormat t level TextureInternalFormat
+
+textureSize1D :: TextureQuery TextureTarget1D TextureSize1D
+textureSize1D t level =
+   makeGettableStateVar $
+      liftM TextureSize1D
+            (getTexLevelParameteriNoProxy fromIntegral t level TextureWidth)
+
+textureSize2D :: TextureQuery TextureTarget2D TextureSize2D
+textureSize2D t level =
+   makeGettableStateVar $
+      liftM2 TextureSize2D
+             (getTexLevelParameteriNoProxy fromIntegral t level TextureWidth )
+             (getTexLevelParameteriNoProxy fromIntegral t level TextureHeight)
+
+textureSize3D :: TextureQuery TextureTarget3D TextureSize3D
+textureSize3D t level =
+   makeGettableStateVar $
+      liftM3 TextureSize3D
+             (getTexLevelParameteriNoProxy fromIntegral t level TextureWidth )
+             (getTexLevelParameteriNoProxy fromIntegral t level TextureHeight)
+             (getTexLevelParameteriNoProxy fromIntegral t level TextureDepth )
+
+textureBorder :: QueryableTextureTarget t => TextureQuery t Border
+textureBorder t level =
+   makeGettableStateVar $
+      getTexLevelParameteriNoProxy fromIntegral t level TextureBorder
+
+textureRGBASizes :: QueryableTextureTarget t =>  TextureQuery t (Color4 GLsizei)
+textureRGBASizes t level =
+   makeGettableStateVar $
+      liftM4 Color4
+             (getTexLevelParameteriNoProxy fromIntegral t level TextureRedSize  )
+             (getTexLevelParameteriNoProxy fromIntegral t level TextureGreenSize)
+             (getTexLevelParameteriNoProxy fromIntegral t level TextureBlueSize )
+             (getTexLevelParameteriNoProxy fromIntegral t level TextureAlphaSize)
+
+textureSharedSize :: QueryableTextureTarget t =>  TextureQuery t GLsizei
+textureSharedSize t level =
+   makeGettableStateVar $
+      getTexLevelParameteriNoProxy fromIntegral t level TextureSharedSize
+
+textureIntensitySize :: QueryableTextureTarget t => TextureQuery t GLsizei
+textureIntensitySize t level =
+   makeGettableStateVar $
+      getTexLevelParameteriNoProxy fromIntegral t level TextureIntensitySize
+
+textureLuminanceSize :: QueryableTextureTarget t =>  TextureQuery t GLsizei
+textureLuminanceSize t level =
+   makeGettableStateVar $
+      getTexLevelParameteriNoProxy fromIntegral t level TextureLuminanceSize
+
+textureIndexSize :: QueryableTextureTarget t => TextureQuery t GLsizei
+textureIndexSize t level =
+   makeGettableStateVar $
+      getTexLevelParameteriNoProxy fromIntegral t level TextureIndexSize
+
+textureDepthBits :: QueryableTextureTarget t => TextureQuery t GLsizei
+textureDepthBits t level =
+   makeGettableStateVar $
+      getTexLevelParameteriNoProxy fromIntegral t level DepthBits
+
+textureCompressedImageSize :: QueryableTextureTarget t => TextureQuery t (Maybe GLsizei)
+textureCompressedImageSize t level =
+   makeGettableStateVar $ do
+      isCompressed <- getTexLevelParameteriNoProxy unmarshalGLboolean t level TextureCompressed
+      if isCompressed
+         then getTexLevelParameteriNoProxy (Just . fromIntegral) t level TextureCompressedImageSize
+         else return Nothing
+
+textureProxyOK :: ParameterizedTextureTarget t => TextureQuery t Bool
+textureProxyOK t level =
+   makeGettableStateVar $
+      getTexLevelParameteri unmarshalGLboolean (marshalParameterizedTextureTargetProxy t) level TextureWidth
+
+textureRGBATypes :: QueryableTextureTarget t =>  TextureQuery t (Color4 (Maybe DataRepresentation))
+textureRGBATypes t level =
+   makeGettableStateVar $
+      liftM4 Color4
+             (getDataRepr t level TextureRedType  )
+             (getDataRepr t level TextureGreenType)
+             (getDataRepr t level TextureBlueType )
+             (getDataRepr t level TextureAlphaType)
+
+getDataRepr :: QueryableTextureTarget t => t -> Level -> TexLevelParameter -> IO (Maybe DataRepresentation)
+getDataRepr = getTexLevelParameteriNoProxy (unmarshalDataRepresentation . fromIntegral)
+
+textureIntensityType :: QueryableTextureTarget t => TextureQuery t (Maybe DataRepresentation)
+textureIntensityType t level = makeGettableStateVar $ getDataRepr t level TextureIntensityType
+
+textureLuminanceType :: QueryableTextureTarget t =>  TextureQuery t (Maybe DataRepresentation)
+textureLuminanceType t level = makeGettableStateVar $ getDataRepr t level TextureLuminanceType
+
+textureDepthType :: QueryableTextureTarget t =>  TextureQuery t (Maybe DataRepresentation)
+textureDepthType t level = makeGettableStateVar $ getDataRepr t level TextureDepthType
+
+getTexLevelParameteriNoProxy :: QueryableTextureTarget t => (GLint -> a) -> t -> Level -> TexLevelParameter -> IO a
+getTexLevelParameteriNoProxy f = getTexLevelParameteri f . marshalQueryableTextureTarget
+
+getTexLevelParameteri :: (GLint -> a) -> GLenum -> Level -> TexLevelParameter -> IO a
+getTexLevelParameteri f t level p =
+   with 0 $ \buf -> do
+      glGetTexLevelParameteriv t level (marshalTexLevelParameter p) buf
+      peek1 f buf
diff --git a/src/Graphics/Rendering/OpenGL/GL/Texturing/Specification.hs b/src/Graphics/Rendering/OpenGL/GL/Texturing/Specification.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/Texturing/Specification.hs
@@ -0,0 +1,352 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.Texturing.Specification
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 3.8.1 (Texture Image Specification),
+-- section 3.8.2 (Alternate Texture Image Specification Commands), and section
+-- 3.8.3 (Compressed Texture Images) of the OpenGL 2.1 specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.Texturing.Specification (
+   -- * Texture Targets
+
+   -- ** One-Dimensional Texture Targets
+   TextureTarget1D(..),
+
+   -- ** Two-Dimensional Texture Targets
+   TextureTarget2D(..),
+   TextureTarget2DMultisample(..),
+   TextureTargetCubeMap(..),
+   TextureTargetCubeMapFace(..),
+
+   -- ** Three-Dimensional Texture Targets
+   TextureTarget3D(..),
+   TextureTarget2DMultisampleArray(..),
+
+   -- ** Texture Buffer Target
+   TextureTargetBuffer(..),
+
+   -- ** Texture Target Classification
+   BindableTextureTarget,
+   ParameterizedTextureTarget,
+   OneDimensionalTextureTarget,
+   TwoDimensionalTextureTarget,
+   ThreeDimensionalTextureTarget,
+   QueryableTextureTarget,
+   GettableTextureTarget,
+
+   -- * Texture-related Data Types
+   Level, Border,
+   TexturePosition1D(..), TexturePosition2D(..), TexturePosition3D(..),
+   TextureSize1D(..), TextureSize2D(..), TextureSize3D(..),
+
+   -- * Texture Image Specification
+   texImage1D, texImage2D, texImage3D,
+   copyTexImage1D, copyTexImage2D,
+   texSubImage1D, texSubImage2D, texSubImage3D,
+   getTexImage,
+
+   -- * Alternate Texture Image Specification Commands
+   copyTexSubImage1D, copyTexSubImage2D, copyTexSubImage3D,
+
+   -- * Compressed Texture Images
+   CompressedTextureFormat(..), compressedTextureFormats,
+   CompressedPixelData(..),
+   compressedTexImage1D, compressedTexImage2D, compressedTexImage3D,
+   compressedTexSubImage1D, compressedTexSubImage2D, compressedTexSubImage3D,
+   getCompressedTexImage,
+
+   -- * Multisample Texture Images
+   SampleLocations(..), texImage2DMultisample, texImage3DMultisample,
+
+   -- * Implementation-Dependent Limits
+   maxTextureSize, maxCubeMapTextureSize, maxRectangleTextureSize,
+   max3DTextureSize, maxArrayTextureLayers, maxSampleMaskWords,
+   maxColorTextureSamples, maxDepthTextureSamples, maxIntegerSamples
+) where
+
+import Foreign.Ptr
+import Data.StateVar
+import Graphics.Rendering.OpenGL.GL.CoordTrans
+import Graphics.Rendering.OpenGL.GL.FramebufferObjects.RenderbufferTarget
+import Graphics.Rendering.OpenGL.GL.GLboolean
+import Graphics.Rendering.OpenGL.GL.PixelData
+import Graphics.Rendering.OpenGL.GL.PixelRectangles
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.Rendering.OpenGL.GL.Texturing.PixelInternalFormat
+import Graphics.Rendering.OpenGL.GL.Texturing.TextureTarget
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+type Level = GLint
+
+type Border = GLint
+
+newtype TexturePosition1D = TexturePosition1D GLint
+   deriving ( Eq, Ord, Show )
+
+data TexturePosition2D = TexturePosition2D !GLint !GLint
+   deriving ( Eq, Ord, Show )
+
+data TexturePosition3D = TexturePosition3D !GLint !GLint !GLint
+   deriving ( Eq, Ord, Show )
+
+newtype TextureSize1D = TextureSize1D GLsizei
+   deriving ( Eq, Ord, Show )
+
+data TextureSize2D = TextureSize2D !GLsizei !GLsizei
+   deriving ( Eq, Ord, Show )
+
+data TextureSize3D = TextureSize3D !GLsizei !GLsizei !GLsizei
+   deriving ( Eq, Ord, Show )
+
+--------------------------------------------------------------------------------
+
+texImage1D :: OneDimensionalTextureTarget t => t -> Proxy -> Level -> PixelInternalFormat -> TextureSize1D -> Border -> PixelData a -> IO ()
+texImage1D target proxy level int (TextureSize1D w) border pd =
+   withPixelData pd $
+      glTexImage1D
+         (marshalOneDimensionalTextureTarget proxy target)
+         level (marshalPixelInternalFormat int) w border
+
+--------------------------------------------------------------------------------
+
+texImage2D :: TwoDimensionalTextureTarget t => t -> Proxy -> Level -> PixelInternalFormat -> TextureSize2D -> Border -> PixelData a -> IO ()
+texImage2D target proxy level int (TextureSize2D w h) border pd =
+   withPixelData pd $
+      glTexImage2D (marshalTwoDimensionalTextureTarget proxy target) level (marshalPixelInternalFormat int) w h border
+
+--------------------------------------------------------------------------------
+
+texImage3D :: ThreeDimensionalTextureTarget t => t -> Proxy -> Level -> PixelInternalFormat -> TextureSize3D -> Border -> PixelData a -> IO ()
+texImage3D target proxy level int (TextureSize3D w h d) border pd =
+   withPixelData pd $
+      glTexImage3D
+         (marshalThreeDimensionalTextureTarget proxy target)
+         level (marshalPixelInternalFormat int) w h d border
+
+--------------------------------------------------------------------------------
+
+getTexImage :: GettableTextureTarget t => t -> Level -> PixelData a -> IO ()
+getTexImage target level pd =
+   withPixelData pd $
+      glGetTexImage (marshalGettableTextureTarget target) level
+
+--------------------------------------------------------------------------------
+
+copyTexImage1D :: OneDimensionalTextureTarget t => t -> Level -> PixelInternalFormat -> Position -> TextureSize1D -> Border -> IO ()
+copyTexImage1D target level int (Position x y) (TextureSize1D w) border =
+   glCopyTexImage1D
+      (marshalOneDimensionalTextureTarget NoProxy target) level
+      (marshalPixelInternalFormat' int) x y w border
+
+--------------------------------------------------------------------------------
+
+copyTexImage2D :: TwoDimensionalTextureTarget t => t -> Level -> PixelInternalFormat -> Position -> TextureSize2D -> Border -> IO ()
+copyTexImage2D target level int (Position x y) (TextureSize2D w h) border =
+   glCopyTexImage2D
+      (marshalTwoDimensionalTextureTarget NoProxy target) level
+      (marshalPixelInternalFormat' int) x y w h border
+
+--------------------------------------------------------------------------------
+
+texSubImage1D :: OneDimensionalTextureTarget t => t -> Level -> TexturePosition1D -> TextureSize1D -> PixelData a -> IO ()
+texSubImage1D target level (TexturePosition1D xOff) (TextureSize1D w) pd =
+   withPixelData pd $
+      glTexSubImage1D (marshalOneDimensionalTextureTarget NoProxy target) level xOff w
+
+--------------------------------------------------------------------------------
+
+texSubImage2D :: TwoDimensionalTextureTarget t => t -> Level -> TexturePosition2D -> TextureSize2D -> PixelData a -> IO ()
+texSubImage2D target level (TexturePosition2D xOff yOff) (TextureSize2D w h) pd =
+   withPixelData pd $
+      glTexSubImage2D (marshalTwoDimensionalTextureTarget NoProxy target) level xOff yOff w h
+
+--------------------------------------------------------------------------------
+
+texSubImage3D :: ThreeDimensionalTextureTarget t => t -> Level -> TexturePosition3D -> TextureSize3D -> PixelData a -> IO ()
+texSubImage3D target level (TexturePosition3D xOff yOff zOff) (TextureSize3D w h d) pd =
+   withPixelData pd $
+      glTexSubImage3D (marshalThreeDimensionalTextureTarget NoProxy target) level xOff yOff zOff w h d
+
+--------------------------------------------------------------------------------
+
+copyTexSubImage1D :: OneDimensionalTextureTarget t => t -> Level -> TexturePosition1D -> Position -> TextureSize1D -> IO ()
+copyTexSubImage1D target level (TexturePosition1D xOff) (Position x y) (TextureSize1D w) =
+   glCopyTexSubImage1D (marshalOneDimensionalTextureTarget NoProxy target) level xOff x y w
+
+--------------------------------------------------------------------------------
+
+copyTexSubImage2D :: TwoDimensionalTextureTarget t => t -> Level -> TexturePosition2D -> Position -> TextureSize2D -> IO ()
+copyTexSubImage2D target level (TexturePosition2D xOff yOff) (Position x y) (TextureSize2D w h) =
+   glCopyTexSubImage2D (marshalTwoDimensionalTextureTarget NoProxy target) level xOff yOff x y w h
+
+--------------------------------------------------------------------------------
+
+copyTexSubImage3D :: ThreeDimensionalTextureTarget t => t -> Level -> TexturePosition3D -> Position -> TextureSize2D -> IO ()
+copyTexSubImage3D target level (TexturePosition3D xOff yOff zOff) (Position x y) (TextureSize2D w h) =
+   glCopyTexSubImage3D (marshalThreeDimensionalTextureTarget NoProxy target) level xOff yOff zOff x y w h
+
+--------------------------------------------------------------------------------
+
+newtype CompressedTextureFormat = CompressedTextureFormat GLenum
+   deriving ( Eq, Ord, Show )
+
+compressedTextureFormats :: GettableStateVar [CompressedTextureFormat]
+compressedTextureFormats =
+   makeGettableStateVar $ do
+      n <- getInteger1 fromIntegral GetNumCompressedTextureFormats
+      getEnumN CompressedTextureFormat GetCompressedTextureFormats n
+
+--------------------------------------------------------------------------------
+
+data CompressedPixelData a =
+     CompressedPixelData !CompressedTextureFormat GLsizei (Ptr a)
+   deriving ( Eq, Ord, Show )
+
+withCompressedPixelData ::
+   CompressedPixelData a -> (GLenum -> GLsizei -> Ptr a -> b) -> b
+withCompressedPixelData
+   (CompressedPixelData (CompressedTextureFormat fmt) size ptr) f =
+   f fmt size ptr
+
+--------------------------------------------------------------------------------
+
+compressedTexImage1D :: OneDimensionalTextureTarget t => t -> Proxy -> Level -> TextureSize1D -> Border -> CompressedPixelData a -> IO ()
+compressedTexImage1D target proxy level (TextureSize1D w) border cpd =
+   withCompressedPixelData cpd $ \fmt ->
+      glCompressedTexImage1D
+         (marshalOneDimensionalTextureTarget proxy target) level fmt w border
+
+--------------------------------------------------------------------------------
+
+-- Note that the spec currently disallows TextureRectangle, but then again the
+-- extension specification explicitly allows a relaxation in the future.
+compressedTexImage2D :: TwoDimensionalTextureTarget t => t -> Proxy -> Level -> TextureSize2D -> Border -> CompressedPixelData a -> IO ()
+compressedTexImage2D target proxy level (TextureSize2D w h) border cpd =
+   withCompressedPixelData cpd $ \fmt ->
+      glCompressedTexImage2D (marshalTwoDimensionalTextureTarget proxy target) level fmt w h border
+
+--------------------------------------------------------------------------------
+
+compressedTexImage3D :: ThreeDimensionalTextureTarget t => t -> Proxy -> Level -> TextureSize3D -> Border -> CompressedPixelData a -> IO ()
+compressedTexImage3D target proxy level (TextureSize3D w h d) border cpd =
+   withCompressedPixelData cpd $ \fmt ->
+      glCompressedTexImage3D
+         (marshalThreeDimensionalTextureTarget proxy target) level fmt w h d border
+
+--------------------------------------------------------------------------------
+
+getCompressedTexImage :: GettableTextureTarget t => t -> Level -> Ptr a -> IO ()
+getCompressedTexImage = glGetCompressedTexImage . marshalGettableTextureTarget
+
+--------------------------------------------------------------------------------
+
+compressedTexSubImage1D :: OneDimensionalTextureTarget t => t -> Level -> TexturePosition1D -> TextureSize1D -> CompressedPixelData a -> IO ()
+compressedTexSubImage1D target level (TexturePosition1D xOff) (TextureSize1D w) cpd =
+   withCompressedPixelData cpd $
+      glCompressedTexSubImage1D (marshalOneDimensionalTextureTarget NoProxy target) level xOff w
+
+--------------------------------------------------------------------------------
+
+compressedTexSubImage2D :: TwoDimensionalTextureTarget t => t -> Level -> TexturePosition2D -> TextureSize2D -> CompressedPixelData a -> IO ()
+compressedTexSubImage2D target  level (TexturePosition2D xOff yOff) (TextureSize2D w h) cpd =
+   withCompressedPixelData cpd $
+      glCompressedTexSubImage2D (marshalTwoDimensionalTextureTarget NoProxy target) level xOff yOff w h
+
+--------------------------------------------------------------------------------
+
+-- see texImage3D, but no proxies
+compressedTexSubImage3D :: ThreeDimensionalTextureTarget t => t -> Level -> TexturePosition3D -> TextureSize3D -> CompressedPixelData a -> IO ()
+compressedTexSubImage3D target level (TexturePosition3D xOff yOff zOff) (TextureSize3D w h d) cpd =
+   withCompressedPixelData cpd $
+      glCompressedTexSubImage3D (marshalThreeDimensionalTextureTarget NoProxy target) level xOff yOff zOff w h d
+
+--------------------------------------------------------------------------------
+
+data SampleLocations =
+     FlexibleSampleLocations
+   | FixedSampleLocations
+   deriving ( Eq, Ord, Show )
+
+marshalSampleLocations :: SampleLocations -> GLboolean
+marshalSampleLocations = marshalGLboolean . (FixedSampleLocations ==)
+
+{-
+unmarshalSampleLocations :: GLboolean -> SampleLocations
+unmarshalSampleLocations x =
+   if unmarshalGLboolean x
+      then FixedSampleLocations
+      else FlexibleSampleLocations
+-}
+
+--------------------------------------------------------------------------------
+
+texImage2DMultisample :: TextureTarget2DMultisample
+                      -> Proxy
+                      -> Samples
+                      -> PixelInternalFormat
+                      -> TextureSize2D
+                      -> SampleLocations
+                      -> IO ()
+texImage2DMultisample target proxy (Samples s) int (TextureSize2D w h) loc =
+   glTexImage2DMultisample
+      (marshalMultisample proxy target) s (fromIntegral (marshalPixelInternalFormat int))
+      w h (marshalSampleLocations loc)
+
+marshalMultisample :: ParameterizedTextureTarget t => Proxy -> t -> GLenum
+marshalMultisample proxy = case proxy of
+   NoProxy -> marshalParameterizedTextureTarget
+   Proxy -> marshalParameterizedTextureTargetProxy
+
+texImage3DMultisample :: TextureTarget2DMultisampleArray
+                      -> Proxy
+                      -> Samples
+                      -> PixelInternalFormat
+                      -> TextureSize3D
+                      -> SampleLocations
+                      -> IO ()
+texImage3DMultisample target proxy (Samples s) int (TextureSize3D w h d) loc =
+   glTexImage3DMultisample
+      (marshalMultisample proxy target) s (fromIntegral (marshalPixelInternalFormat int))
+      w h d (marshalSampleLocations loc)
+
+--------------------------------------------------------------------------------
+
+maxTextureSize :: GettableStateVar GLsizei
+maxTextureSize = maxTextureSizeWith GetMaxTextureSize
+
+maxCubeMapTextureSize :: GettableStateVar GLsizei
+maxCubeMapTextureSize = maxTextureSizeWith GetMaxCubeMapTextureSize
+
+maxRectangleTextureSize :: GettableStateVar GLsizei
+maxRectangleTextureSize = maxTextureSizeWith GetMaxRectangleTextureSize
+
+max3DTextureSize :: GettableStateVar GLsizei
+max3DTextureSize = maxTextureSizeWith GetMax3DTextureSize
+
+maxArrayTextureLayers :: GettableStateVar GLsizei
+maxArrayTextureLayers = maxTextureSizeWith GetMaxArrayTextureLayers
+
+maxSampleMaskWords :: GettableStateVar GLsizei
+maxSampleMaskWords = maxTextureSizeWith GetMaxSampleMaskWords
+
+maxColorTextureSamples :: GettableStateVar GLsizei
+maxColorTextureSamples = maxTextureSizeWith GetMaxColorTextureSamples
+
+maxDepthTextureSamples :: GettableStateVar GLsizei
+maxDepthTextureSamples = maxTextureSizeWith GetMaxDepthTextureSamples
+
+maxIntegerSamples :: GettableStateVar GLsizei
+maxIntegerSamples = maxTextureSizeWith GetMaxIntegerSamples
+
+maxTextureSizeWith :: PName1I -> GettableStateVar GLsizei
+maxTextureSizeWith = makeGettableStateVar . getInteger1 fromIntegral
diff --git a/src/Graphics/Rendering/OpenGL/GL/Texturing/TexParameter.hs b/src/Graphics/Rendering/OpenGL/GL/Texturing/TexParameter.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/Texturing/TexParameter.hs
@@ -0,0 +1,132 @@
+{-# OPTIONS_HADDOCK hide #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.Texturing.TexParameter
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+-- 
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This is a purely internal module for getting\/setting texture parameters.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.Texturing.TexParameter (
+   TexParameter(..), texParami, texParamf, texParamC4f, getTexParameteri
+) where
+
+import Data.StateVar
+import Foreign.Marshal.Alloc
+import Foreign.Marshal.Utils
+import Foreign.Ptr
+import Foreign.Storable
+import Graphics.Rendering.OpenGL.GL.PeekPoke
+import Graphics.Rendering.OpenGL.GL.Texturing.TextureTarget
+import Graphics.Rendering.OpenGL.GL.VertexSpec
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+data TexParameter =
+     TextureMinFilter
+   | TextureMagFilter
+   | TextureWrapS
+   | TextureWrapT
+   | TextureWrapR
+   | TextureBorderColor
+   | TextureMinLOD
+   | TextureMaxLOD
+   | TextureBaseLevel
+   | TextureMaxLevel
+   | TexturePriority
+   | TextureMaxAnisotropy
+   | TextureCompare
+   | TextureCompareOperator
+   | TextureCompareFailValue
+   | GenerateMipmap
+   | TextureCompareMode
+   | TextureCompareFunc
+   | DepthTextureMode
+   | TextureLODBias
+   | TextureResident
+
+marshalTexParameter :: TexParameter -> GLenum
+marshalTexParameter x = case x of
+   TextureMinFilter -> GL_TEXTURE_MIN_FILTER
+   TextureMagFilter -> GL_TEXTURE_MAG_FILTER
+   TextureWrapS -> GL_TEXTURE_WRAP_S
+   TextureWrapT -> GL_TEXTURE_WRAP_T
+   TextureWrapR -> GL_TEXTURE_WRAP_R
+   TextureBorderColor -> GL_TEXTURE_BORDER_COLOR
+   TextureMinLOD -> GL_TEXTURE_MIN_LOD
+   TextureMaxLOD -> GL_TEXTURE_MAX_LOD
+   TextureBaseLevel -> GL_TEXTURE_BASE_LEVEL
+   TextureMaxLevel -> GL_TEXTURE_MAX_LEVEL
+   TexturePriority -> GL_TEXTURE_PRIORITY
+   TextureMaxAnisotropy -> GL_TEXTURE_MAX_ANISOTROPY_EXT
+   TextureCompare -> GL_TEXTURE_COMPARE_SGIX
+   TextureCompareOperator -> GL_TEXTURE_COMPARE_OPERATOR_SGIX
+   TextureCompareFailValue -> GL_TEXTURE_COMPARE_FAIL_VALUE_ARB
+   GenerateMipmap -> GL_GENERATE_MIPMAP
+   TextureCompareMode -> GL_TEXTURE_COMPARE_MODE
+   TextureCompareFunc -> GL_TEXTURE_COMPARE_FUNC
+   DepthTextureMode -> GL_DEPTH_TEXTURE_MODE
+   TextureLODBias -> GL_TEXTURE_LOD_BIAS
+   TextureResident -> GL_TEXTURE_RESIDENT
+
+--------------------------------------------------------------------------------
+
+texParameter :: ParameterizedTextureTarget t
+             => (GLenum -> GLenum -> b -> IO ())
+             -> (a -> (b -> IO ()) -> IO ())
+             -> t -> TexParameter -> a -> IO ()
+texParameter glTexParameter marshalAct t p x =
+   marshalAct x $
+      glTexParameter (marshalParameterizedTextureTarget t) (marshalTexParameter p)
+
+--------------------------------------------------------------------------------
+
+getTexParameter :: (Storable b, ParameterizedTextureTarget t)
+                => (GLenum -> GLenum -> Ptr b -> IO ())
+                -> (b -> a)
+                -> t -> TexParameter -> IO a
+getTexParameter glGetTexParameter unmarshal t p =
+   alloca $ \buf -> do
+     glGetTexParameter (marshalParameterizedTextureTarget t) (marshalTexParameter p) buf
+     peek1 unmarshal buf
+
+--------------------------------------------------------------------------------
+
+m2a :: (a -> b) -> a -> (b -> IO ()) -> IO ()
+m2a marshal x act = act (marshal x)
+
+texParami :: ParameterizedTextureTarget t =>
+   (GLint -> a) -> (a -> GLint) -> TexParameter -> t -> StateVar a
+texParami unmarshal marshal p t =
+   makeStateVar
+      (getTexParameter glGetTexParameteriv unmarshal     t p)
+      (texParameter    glTexParameteri     (m2a marshal) t p)
+
+texParamf :: ParameterizedTextureTarget t =>
+   (GLfloat -> a) -> (a -> GLfloat) -> TexParameter -> t -> StateVar a
+texParamf unmarshal marshal p t =
+   makeStateVar
+      (getTexParameter glGetTexParameterfv unmarshal     t p)
+      (texParameter    glTexParameterf     (m2a marshal) t p)
+
+texParamC4f :: ParameterizedTextureTarget t => TexParameter -> t -> StateVar (Color4 GLfloat)
+texParamC4f p t =
+   makeStateVar
+      (getTexParameter glGetTexParameterC4f id   t p)
+      (texParameter    glTexParameterC4f    with t p)
+
+glTexParameterC4f :: GLenum -> GLenum -> Ptr (Color4 GLfloat) -> IO ()
+glTexParameterC4f target pname ptr = glTexParameterfv target pname (castPtr ptr)
+
+glGetTexParameterC4f :: GLenum -> GLenum -> Ptr (Color4 GLfloat) -> IO ()
+glGetTexParameterC4f target pname ptr = glGetTexParameterfv target pname (castPtr ptr)
+
+getTexParameteri :: ParameterizedTextureTarget t => (GLint -> a) -> t -> TexParameter -> IO a
+getTexParameteri = getTexParameter glGetTexParameteriv
diff --git a/src/Graphics/Rendering/OpenGL/GL/Texturing/TextureObject.hs b/src/Graphics/Rendering/OpenGL/GL/Texturing/TextureObject.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/Texturing/TextureObject.hs
@@ -0,0 +1,49 @@
+{-# OPTIONS_HADDOCK hide #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.Texturing.TextureObject
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This is a purely internal module for handling texture objects.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.Texturing.TextureObject (
+   TextureObject(..)
+) where
+
+import Control.Monad.IO.Class
+import Data.ObjectName
+import Foreign.Marshal.Array ( allocaArray, peekArray, withArrayLen )
+import Graphics.Rendering.OpenGL.GL.DebugOutput
+import Graphics.Rendering.OpenGL.GL.GLboolean
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+newtype TextureObject = TextureObject { textureID :: GLuint }
+   deriving ( Eq, Ord, Show )
+
+--------------------------------------------------------------------------------
+
+instance ObjectName TextureObject where
+   isObjectName = liftIO . fmap unmarshalGLboolean . glIsTexture . textureID
+
+   deleteObjectNames textureObjects =
+      liftIO . withArrayLen (map textureID textureObjects) $
+         glDeleteTextures . fromIntegral
+
+instance GeneratableObjectName TextureObject where
+   genObjectNames n =
+      liftIO . allocaArray n $ \buf -> do
+        glGenTextures (fromIntegral n) buf
+        fmap (map TextureObject) $ peekArray n buf
+
+instance CanBeLabeled TextureObject where
+   objectLabel = objectNameLabel GL_TEXTURE . textureID
diff --git a/src/Graphics/Rendering/OpenGL/GL/Texturing/TextureTarget.hs b/src/Graphics/Rendering/OpenGL/GL/Texturing/TextureTarget.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/Texturing/TextureTarget.hs
@@ -0,0 +1,297 @@
+{-# OPTIONS_HADDOCK hide #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.Texturing.TextureTarget
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This is a purely internal module for marshaling texture targets.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.Texturing.TextureTarget (
+   -- * Texture Target Classification
+   BindableTextureTarget(..),
+   ParameterizedTextureTarget(..),
+   OneDimensionalTextureTarget(..),
+   TwoDimensionalTextureTarget(..),
+   ThreeDimensionalTextureTarget(..),
+   QueryableTextureTarget(..),
+   GettableTextureTarget(..),
+
+   -- * One-Dimensional Texture Targets
+   TextureTarget1D(..),
+
+   -- * Two-Dimensional Texture Targets
+   TextureTarget2D(..),
+   TextureTarget2DMultisample(..),
+   TextureTargetCubeMap(..),
+   TextureTargetCubeMapFace(..),
+   unmarshalTextureTargetCubeMapFace,
+
+   -- * Three-Dimensional Texture Targets
+   TextureTarget3D(..),
+   TextureTarget2DMultisampleArray(..),
+
+   -- * Texture Buffer Target
+   TextureTargetBuffer(..)
+) where
+
+import Graphics.Rendering.OpenGL.GL.Capability
+import Graphics.Rendering.OpenGL.GL.PixelRectangles.ColorTable
+import Graphics.Rendering.OpenGL.GL.QueryUtils.PName
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+class BindableTextureTarget t where
+   marshalBindableTextureTarget :: t -> GLenum
+   marshalBindableTextureTargetPName1I :: t -> PName1I
+
+class ParameterizedTextureTarget t where
+   marshalParameterizedTextureTarget :: t -> GLenum
+   marshalParameterizedTextureTargetProxy :: t -> GLenum
+   marshalParameterizedTextureTargetEnableCap :: t -> EnableCap
+
+class OneDimensionalTextureTarget t where
+   marshalOneDimensionalTextureTarget :: Proxy -> t -> GLenum
+
+class TwoDimensionalTextureTarget t where
+   marshalTwoDimensionalTextureTarget :: Proxy -> t -> GLenum
+
+class ThreeDimensionalTextureTarget t where
+   marshalThreeDimensionalTextureTarget :: Proxy -> t -> GLenum
+
+class QueryableTextureTarget t where
+   marshalQueryableTextureTarget :: t -> GLenum
+
+class GettableTextureTarget t where
+   marshalGettableTextureTarget :: t -> GLenum
+
+--------------------------------------------------------------------------------
+
+data TextureTarget1D = Texture1D
+   deriving ( Eq, Ord, Show )
+
+instance BindableTextureTarget TextureTarget1D where
+   marshalBindableTextureTarget = marshalParameterizedTextureTarget
+   marshalBindableTextureTargetPName1I t = case t of
+      Texture1D -> GetTextureBinding1D
+
+instance ParameterizedTextureTarget TextureTarget1D where
+   marshalParameterizedTextureTarget t = case t of
+      Texture1D -> GL_TEXTURE_1D
+   marshalParameterizedTextureTargetProxy t = case t of
+      Texture1D -> GL_PROXY_TEXTURE_1D
+   marshalParameterizedTextureTargetEnableCap t = case t of
+      Texture1D -> CapTexture1D
+
+instance OneDimensionalTextureTarget TextureTarget1D where
+   marshalOneDimensionalTextureTarget p = case p of
+      NoProxy -> marshalParameterizedTextureTarget
+      Proxy -> marshalParameterizedTextureTargetProxy
+
+instance QueryableTextureTarget TextureTarget1D where
+   marshalQueryableTextureTarget = marshalParameterizedTextureTarget
+
+instance GettableTextureTarget TextureTarget1D where
+   marshalGettableTextureTarget = marshalParameterizedTextureTarget
+
+--------------------------------------------------------------------------------
+
+data TextureTarget2D =
+     Texture2D
+   | Texture1DArray
+   | TextureRectangle
+   deriving ( Eq, Ord, Show )
+
+instance BindableTextureTarget TextureTarget2D where
+   marshalBindableTextureTarget = marshalParameterizedTextureTarget
+   marshalBindableTextureTargetPName1I t = case t of
+      Texture2D -> GetTextureBinding2D
+      Texture1DArray -> GetTextureBinding1DArray
+      TextureRectangle -> GetTextureBindingRectangle
+
+instance ParameterizedTextureTarget TextureTarget2D where
+   marshalParameterizedTextureTarget t = case t of
+      Texture2D -> GL_TEXTURE_2D
+      Texture1DArray -> GL_TEXTURE_1D_ARRAY
+      TextureRectangle -> GL_TEXTURE_RECTANGLE
+   marshalParameterizedTextureTargetProxy t = case t of
+      Texture2D -> GL_PROXY_TEXTURE_2D
+      Texture1DArray -> GL_PROXY_TEXTURE_1D_ARRAY
+      TextureRectangle -> GL_PROXY_TEXTURE_RECTANGLE
+   marshalParameterizedTextureTargetEnableCap t = case t of
+      Texture2D -> CapTexture2D
+      Texture1DArray -> CapTexture1DArray
+      TextureRectangle -> CapTextureRectangle
+
+instance TwoDimensionalTextureTarget TextureTarget2D where
+   marshalTwoDimensionalTextureTarget p = case p of
+      NoProxy -> marshalParameterizedTextureTarget
+      Proxy -> marshalParameterizedTextureTargetProxy
+
+instance QueryableTextureTarget TextureTarget2D where
+   marshalQueryableTextureTarget = marshalParameterizedTextureTarget
+
+instance GettableTextureTarget TextureTarget2D where
+   marshalGettableTextureTarget = marshalParameterizedTextureTarget
+
+--------------------------------------------------------------------------------
+
+data TextureTarget2DMultisample = Texture2DMultisample
+   deriving ( Eq, Ord, Show )
+
+instance BindableTextureTarget TextureTarget2DMultisample where
+   marshalBindableTextureTarget = marshalParameterizedTextureTarget
+   marshalBindableTextureTargetPName1I t = case t of
+      Texture2DMultisample -> GetTextureBinding2DMultisample
+
+instance ParameterizedTextureTarget TextureTarget2DMultisample where
+   marshalParameterizedTextureTarget t = case t of
+      Texture2DMultisample -> GL_TEXTURE_2D_MULTISAMPLE
+   marshalParameterizedTextureTargetProxy t = case t of
+      Texture2DMultisample -> GL_PROXY_TEXTURE_2D_MULTISAMPLE
+   marshalParameterizedTextureTargetEnableCap t = case t of
+      Texture2DMultisample -> CapTexture2DMultisample
+
+instance QueryableTextureTarget TextureTarget2DMultisample where
+   marshalQueryableTextureTarget = marshalParameterizedTextureTarget
+
+--------------------------------------------------------------------------------
+
+data TextureTargetCubeMap = TextureCubeMap
+   deriving ( Eq, Ord, Show )
+
+instance BindableTextureTarget TextureTargetCubeMap where
+   marshalBindableTextureTarget = marshalParameterizedTextureTarget
+   marshalBindableTextureTargetPName1I t = case t of
+      TextureCubeMap -> GetTextureBindingCubeMap
+
+instance ParameterizedTextureTarget TextureTargetCubeMap where
+   marshalParameterizedTextureTarget t = case t of
+      TextureCubeMap -> GL_TEXTURE_CUBE_MAP
+   marshalParameterizedTextureTargetProxy t = case t of
+      TextureCubeMap -> GL_PROXY_TEXTURE_CUBE_MAP
+   marshalParameterizedTextureTargetEnableCap t = case t of
+      TextureCubeMap -> CapTextureCubeMap
+
+instance TwoDimensionalTextureTarget TextureTargetCubeMap where
+   marshalTwoDimensionalTextureTarget p = case p of
+      NoProxy -> \t -> error ("No non-proxy target for " ++ show t)
+      Proxy -> marshalParameterizedTextureTargetProxy
+
+--------------------------------------------------------------------------------
+
+data TextureTargetCubeMapFace =
+     TextureCubeMapPositiveX
+   | TextureCubeMapNegativeX
+   | TextureCubeMapPositiveY
+   | TextureCubeMapNegativeY
+   | TextureCubeMapPositiveZ
+   | TextureCubeMapNegativeZ
+   deriving ( Eq, Ord, Show )
+
+instance TwoDimensionalTextureTarget TextureTargetCubeMapFace where
+   marshalTwoDimensionalTextureTarget p = case p of
+      NoProxy -> marshalQueryableTextureTarget
+      -- We could silently map this to TextureCubeMap if we wanted.
+      Proxy -> \t -> error ("No proxy target for " ++ show t)
+
+instance QueryableTextureTarget TextureTargetCubeMapFace where
+   marshalQueryableTextureTarget t = case t of
+      TextureCubeMapPositiveX -> GL_TEXTURE_CUBE_MAP_POSITIVE_X
+      TextureCubeMapNegativeX -> GL_TEXTURE_CUBE_MAP_NEGATIVE_X
+      TextureCubeMapPositiveY -> GL_TEXTURE_CUBE_MAP_POSITIVE_Y
+      TextureCubeMapNegativeY -> GL_TEXTURE_CUBE_MAP_NEGATIVE_Y
+      TextureCubeMapPositiveZ -> GL_TEXTURE_CUBE_MAP_POSITIVE_Z
+      TextureCubeMapNegativeZ -> GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
+
+instance GettableTextureTarget TextureTargetCubeMapFace where
+   marshalGettableTextureTarget = marshalQueryableTextureTarget
+
+unmarshalTextureTargetCubeMapFace :: GLenum -> TextureTargetCubeMapFace
+unmarshalTextureTargetCubeMapFace x
+   | x == GL_TEXTURE_CUBE_MAP_POSITIVE_X = TextureCubeMapPositiveX
+   | x == GL_TEXTURE_CUBE_MAP_NEGATIVE_X = TextureCubeMapNegativeX
+   | x == GL_TEXTURE_CUBE_MAP_POSITIVE_Y = TextureCubeMapPositiveY
+   | x == GL_TEXTURE_CUBE_MAP_NEGATIVE_Y = TextureCubeMapNegativeY
+   | x == GL_TEXTURE_CUBE_MAP_POSITIVE_Z = TextureCubeMapPositiveZ
+   | x == GL_TEXTURE_CUBE_MAP_NEGATIVE_Z = TextureCubeMapNegativeZ
+   | otherwise = error $ "unmarshalTextureTargetCubeMapFace: unknown enum " ++ show x
+
+--------------------------------------------------------------------------------
+
+data TextureTarget3D =
+     Texture3D
+   | Texture2DArray
+   | TextureCubeMapArray
+   deriving ( Eq, Ord, Show )
+
+instance BindableTextureTarget TextureTarget3D where
+   marshalBindableTextureTarget = marshalParameterizedTextureTarget
+   marshalBindableTextureTargetPName1I t = case t of
+      Texture3D -> GetTextureBinding3D
+      Texture2DArray -> GetTextureBinding2DArray
+      TextureCubeMapArray -> GetTextureBindingCubeMapArray
+
+instance ParameterizedTextureTarget TextureTarget3D where
+   marshalParameterizedTextureTarget t = case t of
+      Texture3D -> GL_TEXTURE_3D
+      Texture2DArray -> GL_TEXTURE_2D_ARRAY
+      TextureCubeMapArray -> GL_TEXTURE_CUBE_MAP_ARRAY
+   marshalParameterizedTextureTargetProxy t = case t of
+      Texture3D -> GL_PROXY_TEXTURE_3D
+      Texture2DArray -> GL_PROXY_TEXTURE_2D_ARRAY
+      TextureCubeMapArray -> GL_PROXY_TEXTURE_CUBE_MAP_ARRAY
+   marshalParameterizedTextureTargetEnableCap t = case t of
+      Texture3D -> CapTexture3D
+      Texture2DArray -> CapTexture2DArray
+      TextureCubeMapArray -> CapTextureCubeMapArray
+
+instance ThreeDimensionalTextureTarget TextureTarget3D where
+   marshalThreeDimensionalTextureTarget p = case p of
+      NoProxy -> marshalParameterizedTextureTarget
+      Proxy -> marshalParameterizedTextureTargetProxy
+
+instance QueryableTextureTarget TextureTarget3D where
+   marshalQueryableTextureTarget = marshalParameterizedTextureTarget
+
+instance GettableTextureTarget TextureTarget3D where
+   marshalGettableTextureTarget = marshalParameterizedTextureTarget
+
+--------------------------------------------------------------------------------
+
+data TextureTarget2DMultisampleArray = Texture2DMultisampleArray
+   deriving ( Eq, Ord, Show )
+
+instance BindableTextureTarget TextureTarget2DMultisampleArray where
+   marshalBindableTextureTarget = marshalParameterizedTextureTarget
+   marshalBindableTextureTargetPName1I t = case t of
+      Texture2DMultisampleArray -> GetTextureBinding2DMultisampleArray
+
+instance ParameterizedTextureTarget TextureTarget2DMultisampleArray where
+   marshalParameterizedTextureTarget t = case t of
+      Texture2DMultisampleArray -> GL_TEXTURE_2D_MULTISAMPLE_ARRAY
+   marshalParameterizedTextureTargetProxy t = case t of
+      Texture2DMultisampleArray -> GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY
+   marshalParameterizedTextureTargetEnableCap t = case t of
+      Texture2DMultisampleArray -> CapTexture2DMultisampleArray
+
+instance QueryableTextureTarget TextureTarget2DMultisampleArray where
+   marshalQueryableTextureTarget = marshalParameterizedTextureTarget
+
+--------------------------------------------------------------------------------
+
+data TextureTargetBuffer = TextureBuffer'
+   deriving ( Eq, Ord, Show )
+
+instance BindableTextureTarget TextureTargetBuffer where
+   marshalBindableTextureTarget t = case t of
+      TextureBuffer' -> GL_TEXTURE_BUFFER
+   marshalBindableTextureTargetPName1I t = case t of
+      TextureBuffer' -> GetTextureBindingBuffer
diff --git a/src/Graphics/Rendering/OpenGL/GL/Texturing/TextureUnit.hs b/src/Graphics/Rendering/OpenGL/GL/Texturing/TextureUnit.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/Texturing/TextureUnit.hs
@@ -0,0 +1,50 @@
+{-# OPTIONS_HADDOCK hide #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.Texturing.TextureUnit
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This is a purely internal module for (un-)marshaling TextureUnit.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.Texturing.TextureUnit (
+   TextureUnit(..), marshalTextureUnit, unmarshalTextureUnit
+) where
+
+import Foreign.Ptr
+import Foreign.Storable
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+-- | Identifies a texture unit via its number, which must be in the range of
+-- (0 .. 'maxTextureUnit').
+
+newtype TextureUnit = TextureUnit GLuint
+   deriving ( Eq, Ord, Show )
+
+-- Internal note, when setting a sampler (TextureUnit) uniform the GLint
+-- functions should be used.
+
+instance Storable TextureUnit where
+    sizeOf _                 = sizeOf    (undefined :: GLuint)
+    alignment _              = alignment (undefined :: GLuint)
+    peek pt                  = peek (castPtr pt) >>= return . TextureUnit
+    poke pt (TextureUnit tu) = poke (castPtr pt) tu
+    peekByteOff pt off       = peekByteOff pt off >>= return . TextureUnit
+    pokeByteOff pt off (TextureUnit tu)
+                             = pokeByteOff pt off tu
+
+
+
+marshalTextureUnit :: TextureUnit -> GLenum
+marshalTextureUnit (TextureUnit x) = GL_TEXTURE0 + fromIntegral x
+
+unmarshalTextureUnit :: GLenum -> TextureUnit
+unmarshalTextureUnit x = TextureUnit (fromIntegral (x - GL_TEXTURE0))
diff --git a/src/Graphics/Rendering/OpenGL/GL/TransformFeedback.hs b/src/Graphics/Rendering/OpenGL/GL/TransformFeedback.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/TransformFeedback.hs
@@ -0,0 +1,128 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.TransformFeedback
+-- Copyright   :  (c) Sven Panne 2011-2019, Lars Corbijn 2011-2016
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-----------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.TransformFeedback (
+   -- * starting and ending
+   beginTransformFeedback, endTransformFeedback,
+
+   -- * TransformFeedbackBufferMode
+   TransformFeedbackBufferMode(..), marshalTransformFeedbackBufferMode,
+   unmarshalTransformFeedbackBufferMode,
+
+   -- * Shader related
+   transformFeedbackBufferMode,
+   transformFeedbackVaryings,
+   setTransformFeedbackVaryings,
+
+   -- * limits
+   maxTransformFeedbackSeparateAttribs,
+   maxTransformFeedbackInterleavedComponents,
+   maxTransformFeedbackSeparateComponents
+) where
+
+import Data.StateVar
+import Foreign.Marshal.Array
+import Graphics.Rendering.OpenGL.GL.ByteString
+import Graphics.Rendering.OpenGL.GL.DataType
+import Graphics.Rendering.OpenGL.GL.PrimitiveMode
+import Graphics.Rendering.OpenGL.GL.PrimitiveModeInternal
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.Rendering.OpenGL.GL.Shaders.Program
+import Graphics.Rendering.OpenGL.GL.Shaders.Variables
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+beginTransformFeedback :: PrimitiveMode -> IO ()
+beginTransformFeedback = glBeginTransformFeedback . marshalPrimitiveMode
+
+endTransformFeedback :: IO ()
+endTransformFeedback = glEndTransformFeedback
+
+--------------------------------------------------------------------------------
+
+data TransformFeedbackBufferMode =
+     InterleavedAttribs
+   | SeparateAttribs
+   | SeperateAttribs
+   deriving ( Eq, Ord, Show )
+{-# DEPRECATED SeperateAttribs "Use 'SeparateAttribs' instead." #-}
+
+marshalTransformFeedbackBufferMode :: TransformFeedbackBufferMode -> GLenum
+marshalTransformFeedbackBufferMode x = case x of
+   InterleavedAttribs -> GL_INTERLEAVED_ATTRIBS
+   SeparateAttribs -> GL_SEPARATE_ATTRIBS
+   SeperateAttribs -> GL_SEPARATE_ATTRIBS
+
+unmarshalTransformFeedbackBufferMode :: GLenum -> TransformFeedbackBufferMode
+unmarshalTransformFeedbackBufferMode x
+   | x == GL_INTERLEAVED_ATTRIBS = InterleavedAttribs
+   | x == GL_SEPARATE_ATTRIBS = SeparateAttribs
+   | otherwise = error $ "unmarshalTransformFeedbackBufferMode: illegal value " ++ show x
+
+-- limits
+-- | Max number of seprate atributes or varyings than can be captured
+-- in transformfeedback, initial value 4
+maxTransformFeedbackSeparateAttribs :: GettableStateVar GLint
+maxTransformFeedbackSeparateAttribs = makeGettableStateVar $
+   getInteger1 fromIntegral GetMaxTransformFeedbackSeparateAttribs
+
+-- | Max number of components to write to a single buffer in
+-- interleaved mod, initial value 64
+maxTransformFeedbackInterleavedComponents :: GettableStateVar GLint
+maxTransformFeedbackInterleavedComponents = makeGettableStateVar $
+   getInteger1 fromIntegral GetMaxTransformFeedbackInterleavedComponents
+
+-- | Max number of components per attribute or varying in seperate mode
+-- initial value 4
+maxTransformFeedbackSeparateComponents :: GettableStateVar GLint
+maxTransformFeedbackSeparateComponents = makeGettableStateVar $
+   getInteger1 fromIntegral GetMaxTransformFeedbackSeparateComponents
+
+--------------------------------------------------------------------------------
+
+-- | Set all the transform feedbacks varyings for this program
+-- it overwrites any previous call to this function
+setTransformFeedbackVaryings :: Program -> [String]
+   -> TransformFeedbackBufferMode -> IO ()
+setTransformFeedbackVaryings (Program program) sts tfbm = do
+   ptSts <- mapM (\x -> withGLstring x return) sts
+   stsPtrs <- newArray ptSts
+   glTransformFeedbackVaryings program (fromIntegral . length $ sts)  stsPtrs
+      (marshalTransformFeedbackBufferMode tfbm)
+
+-- | Get the currently used transformFeedbackBufferMode
+transformFeedbackBufferMode
+   :: Program -> GettableStateVar TransformFeedbackBufferMode
+transformFeedbackBufferMode = programVar1
+   (unmarshalTransformFeedbackBufferMode . fromIntegral)
+   TransformFeedbackBufferMode
+
+-- | The number of varyings that are currently recorded when in
+-- transform feedback mode
+numTransformFeedbackVaryings :: Program -> GettableStateVar GLuint
+numTransformFeedbackVaryings =
+   programVar1 fromIntegral TransformFeedbackVaryings
+
+-- | The maximum length of a varying's name for transform feedback mode
+transformFeedbackVaryingMaxLength :: Program -> GettableStateVar GLsizei
+transformFeedbackVaryingMaxLength
+   = programVar1 fromIntegral TransformFeedbackVaryingMaxLength
+
+-- | The name, datatype and size of the transform feedback varyings.
+transformFeedbackVaryings :: Program -> GettableStateVar [(GLint, DataType, String)]
+transformFeedbackVaryings =
+   activeVars
+      numTransformFeedbackVaryings
+      transformFeedbackVaryingMaxLength
+      glGetTransformFeedbackVarying
+      unmarshalDataType
diff --git a/src/Graphics/Rendering/OpenGL/GL/VertexArrayObjects.hs b/src/Graphics/Rendering/OpenGL/GL/VertexArrayObjects.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/VertexArrayObjects.hs
@@ -0,0 +1,60 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.VertexArrayObjects
+-- Copyright   :  (c) Sven Panne 2011-2019, Lars Corbijn 2011-2016
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-----------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.VertexArrayObjects (
+   VertexArrayObject,
+   bindVertexArrayObject
+) where
+
+import Control.Monad.IO.Class
+import Data.ObjectName
+import Data.StateVar
+import Foreign.Marshal.Array ( allocaArray, peekArray, withArrayLen )
+import Graphics.Rendering.OpenGL.GL.DebugOutput
+import Graphics.Rendering.OpenGL.GL.GLboolean
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.GL
+
+-----------------------------------------------------------------------------
+
+newtype VertexArrayObject = VertexArrayObject { vertexArrayID :: GLuint }
+   deriving( Eq, Ord, Show )
+
+instance ObjectName VertexArrayObject where
+   isObjectName =
+     liftIO . fmap unmarshalGLboolean . glIsVertexArray . vertexArrayID
+
+   deleteObjectNames bufferObjects =
+      liftIO . withArrayLen (map vertexArrayID bufferObjects) $
+         glDeleteVertexArrays . fromIntegral
+
+instance GeneratableObjectName VertexArrayObject where
+   genObjectNames n = liftIO . allocaArray n $ \buf -> do
+      glGenVertexArrays (fromIntegral n) buf
+      fmap (map VertexArrayObject) $ peekArray n buf
+
+instance CanBeLabeled VertexArrayObject where
+   objectLabel = objectNameLabel GL_VERTEX_ARRAY . vertexArrayID
+
+bindVertexArrayObject :: StateVar (Maybe VertexArrayObject)
+bindVertexArrayObject = makeStateVar getVAO bindVAO
+
+getVAO :: IO (Maybe VertexArrayObject)
+getVAO = do
+   vao <- getInteger1 (VertexArrayObject . fromIntegral) GetVertexArrayBinding
+   return $ if vao == noVAO then Nothing else Just vao
+
+bindVAO :: Maybe VertexArrayObject -> IO ()
+bindVAO = glBindVertexArray . vertexArrayID . maybe noVAO id
+
+noVAO :: VertexArrayObject
+noVAO = VertexArrayObject 0
diff --git a/src/Graphics/Rendering/OpenGL/GL/VertexArrays.hs b/src/Graphics/Rendering/OpenGL/GL/VertexArrays.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/VertexArrays.hs
@@ -0,0 +1,484 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.VertexArrays
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 2.8 (Vertex Arrays) of the OpenGL 2.1
+-- specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.VertexArrays (
+   -- * Describing Data for the Arrays
+   NumComponents, DataType(..), Stride, VertexArrayDescriptor(..),
+
+   -- * Specifying Data for the Arrays
+   Capability(..),
+   ClientArrayType(..), arrayPointer,
+   InterleavedArrays(..), interleavedArrays,
+
+   -- * Enabling Arrays
+   clientState, clientActiveTexture,
+
+   -- * Dereferencing and Rendering
+   ArrayIndex, NumArrayIndices, NumIndexBlocks, NumInstances,
+   BaseInstance, BaseVertex,
+   arrayElement,
+
+   drawArrays, drawArraysInstancedBaseInstance, drawArraysInstanced,
+   multiDrawArrays,
+
+   drawElements, drawElementsInstancedBaseInstance, drawElementsInstanced,
+   multiDrawElements, drawRangeElements,
+
+   drawElementsBaseVertex, drawRangeElementsBaseVertex,
+   drawElementsInstancedBaseVertex, drawElementsInstancedBaseVertexBaseInstance,
+   multiDrawElementsBaseVertex,
+
+   maxElementsVertices, maxElementsIndices, lockArrays,
+   primitiveRestartIndex, primitiveRestartIndexNV,
+
+   -- * Generic Vertex Attribute Arrays
+   vertexAttribPointer, vertexAttribArray,
+) where
+
+import Data.StateVar
+import Foreign.Ptr ( Ptr, nullPtr )
+import Graphics.Rendering.OpenGL.GL.Capability
+import Graphics.Rendering.OpenGL.GL.DataType
+import Graphics.Rendering.OpenGL.GL.GLboolean
+import Graphics.Rendering.OpenGL.GL.PrimitiveMode
+import Graphics.Rendering.OpenGL.GL.PrimitiveModeInternal
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.Rendering.OpenGL.GL.Texturing.TextureUnit
+import Graphics.Rendering.OpenGL.GL.VertexSpec
+import Graphics.Rendering.OpenGL.GLU.ErrorsInternal
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+type NumComponents = GLint
+
+type Stride = GLsizei
+
+data VertexArrayDescriptor a =
+   VertexArrayDescriptor !NumComponents !DataType !Stride !(Ptr a)
+   deriving ( Eq, Ord, Show )
+
+noVertexArrayDescriptor :: VertexArrayDescriptor a
+noVertexArrayDescriptor = VertexArrayDescriptor 0 Byte 0 nullPtr
+
+--------------------------------------------------------------------------------
+
+data ClientArrayType =
+     VertexArray
+   | NormalArray
+   | ColorArray
+   | IndexArray
+   | TextureCoordArray
+   | EdgeFlagArray
+   | FogCoordArray
+   | SecondaryColorArray
+   | MatrixIndexArray
+   deriving ( Eq, Ord, Show )
+
+marshalClientArrayType :: ClientArrayType -> GLenum
+marshalClientArrayType x = case x of
+   VertexArray -> GL_VERTEX_ARRAY
+   NormalArray -> GL_NORMAL_ARRAY
+   ColorArray -> GL_COLOR_ARRAY
+   IndexArray -> GL_INDEX_ARRAY
+   TextureCoordArray -> GL_TEXTURE_COORD_ARRAY
+   EdgeFlagArray -> GL_EDGE_FLAG_ARRAY
+   FogCoordArray -> GL_FOG_COORD_ARRAY
+   SecondaryColorArray -> GL_SECONDARY_COLOR_ARRAY
+   MatrixIndexArray -> GL_MATRIX_INDEX_ARRAY_ARB
+
+-- Hmmm...
+clientArrayTypeToEnableCap :: ClientArrayType -> EnableCap
+clientArrayTypeToEnableCap x = case x of
+   VertexArray -> CapVertexArray
+   NormalArray -> CapNormalArray
+   ColorArray -> CapColorArray
+   IndexArray -> CapIndexArray
+   TextureCoordArray -> CapTextureCoordArray
+   EdgeFlagArray -> CapEdgeFlagArray
+   FogCoordArray -> CapFogCoordArray
+   SecondaryColorArray -> CapSecondaryColorArray
+   MatrixIndexArray -> CapMatrixIndexArray
+
+--------------------------------------------------------------------------------
+
+arrayPointer :: ClientArrayType -> StateVar (VertexArrayDescriptor a)
+arrayPointer t = case t of
+   VertexArray -> vertexPointer
+   NormalArray -> normalPointer
+   ColorArray -> colorPointer
+   IndexArray -> indexPointer
+   TextureCoordArray -> texCoordPointer
+   EdgeFlagArray -> edgeFlagPointer
+   FogCoordArray -> fogCoordPointer
+   SecondaryColorArray -> secondaryColorPointer
+   MatrixIndexArray ->
+      makeStateVar
+        (do recordInvalidEnum ; return noVertexArrayDescriptor)
+        (const recordInvalidEnum)
+
+check :: Bool -> IO () -> IO ()
+check flag val = if flag then val else recordInvalidValue
+
+--------------------------------------------------------------------------------
+
+vertexPointer :: StateVar (VertexArrayDescriptor a)
+vertexPointer = makeStateVar getVertexPointer setVertexPointer
+
+getVertexPointer :: IO (VertexArrayDescriptor a)
+getVertexPointer = do
+   n <- getInteger1 id GetVertexArraySize
+   d <- getEnum1 unmarshalDataType GetVertexArrayType
+   s <- getInteger1 fromIntegral GetVertexArrayStride
+   p <- getPointer VertexArrayPointer
+   return $ VertexArrayDescriptor n d s p
+
+setVertexPointer :: VertexArrayDescriptor a -> IO ()
+setVertexPointer (VertexArrayDescriptor n d s p) =
+   glVertexPointer n (marshalDataType d) s p
+
+--------------------------------------------------------------------------------
+
+normalPointer :: StateVar (VertexArrayDescriptor a)
+normalPointer = makeStateVar getNormalPointer setNormalPointer
+
+getNormalPointer :: IO (VertexArrayDescriptor a)
+getNormalPointer = do
+   d <- getEnum1 unmarshalDataType GetNormalArrayType
+   s <- getInteger1 fromIntegral GetNormalArrayStride
+   p <- getPointer NormalArrayPointer
+   return $ VertexArrayDescriptor 3 d s p
+
+setNormalPointer :: VertexArrayDescriptor a -> IO ()
+setNormalPointer (VertexArrayDescriptor n d s p) =
+   check (n == 3) $ glNormalPointer (marshalDataType d) s p
+
+--------------------------------------------------------------------------------
+
+colorPointer :: StateVar (VertexArrayDescriptor a)
+colorPointer = makeStateVar getColorPointer setColorPointer
+
+getColorPointer :: IO (VertexArrayDescriptor a)
+getColorPointer = do
+   n <- getInteger1 id GetColorArraySize
+   d <- getEnum1 unmarshalDataType GetColorArrayType
+   s <- getInteger1 fromIntegral GetColorArrayStride
+   p <- getPointer ColorArrayPointer
+   return $ VertexArrayDescriptor n d s p
+
+setColorPointer :: VertexArrayDescriptor a -> IO ()
+setColorPointer (VertexArrayDescriptor n d s p) =
+   check (n == 3 || n == 4) $ glColorPointer n (marshalDataType d) s p
+
+--------------------------------------------------------------------------------
+
+indexPointer :: StateVar (VertexArrayDescriptor a)
+indexPointer = makeStateVar getIndexPointer setIndexPointer
+
+getIndexPointer :: IO (VertexArrayDescriptor a)
+getIndexPointer = do
+   d <- getEnum1 unmarshalDataType GetIndexArrayType
+   s <- getInteger1 fromIntegral GetIndexArrayStride
+   p <- getPointer IndexArrayPointer
+   return $ VertexArrayDescriptor 1 d s p
+
+setIndexPointer :: VertexArrayDescriptor a -> IO ()
+setIndexPointer (VertexArrayDescriptor n d s p) =
+   check (n == 1) $ glIndexPointer (marshalDataType d) s p
+
+--------------------------------------------------------------------------------
+
+texCoordPointer :: StateVar (VertexArrayDescriptor a)
+texCoordPointer = makeStateVar getTexCoordPointer setTexCoordPointer
+
+getTexCoordPointer :: IO (VertexArrayDescriptor a)
+getTexCoordPointer = do
+   n <- getInteger1 id GetTextureCoordArraySize
+   d <- getEnum1 unmarshalDataType GetTextureCoordArrayType
+   s <- getInteger1 fromIntegral GetTextureCoordArrayStride
+   p <- getPointer TextureCoordArrayPointer
+   return $ VertexArrayDescriptor n d s p
+
+setTexCoordPointer :: VertexArrayDescriptor a -> IO ()
+setTexCoordPointer (VertexArrayDescriptor n d s p) =
+   glTexCoordPointer n (marshalDataType d) s p
+
+--------------------------------------------------------------------------------
+
+edgeFlagPointer :: StateVar (VertexArrayDescriptor a)
+edgeFlagPointer = makeStateVar getEdgeFlagPointer setEdgeFlagPointer
+
+getEdgeFlagPointer :: IO (VertexArrayDescriptor a)
+getEdgeFlagPointer = do
+   s <- getInteger1 fromIntegral GetEdgeFlagArrayStride
+   p <- getPointer EdgeFlagArrayPointer
+   return $ VertexArrayDescriptor 1 UnsignedByte s p
+
+setEdgeFlagPointer :: VertexArrayDescriptor a -> IO ()
+setEdgeFlagPointer (VertexArrayDescriptor n d s p) =
+   check (n == 1 && d == UnsignedByte) $ glEdgeFlagPointer s p
+
+--------------------------------------------------------------------------------
+
+fogCoordPointer :: StateVar (VertexArrayDescriptor a)
+fogCoordPointer = makeStateVar getFogCoordPointer setFogCoordPointer
+
+getFogCoordPointer :: IO (VertexArrayDescriptor a)
+getFogCoordPointer = do
+   d <- getEnum1 unmarshalDataType GetFogCoordArrayType
+   s <- getInteger1 fromIntegral GetFogCoordArrayStride
+   p <- getPointer FogCoordArrayPointer
+   return $ VertexArrayDescriptor 1 d s p
+
+setFogCoordPointer :: VertexArrayDescriptor a -> IO ()
+setFogCoordPointer (VertexArrayDescriptor n d s p) =
+   check (n == 1) $ glFogCoordPointer (marshalDataType d) s p
+
+--------------------------------------------------------------------------------
+
+secondaryColorPointer :: StateVar (VertexArrayDescriptor a)
+secondaryColorPointer =
+   makeStateVar getSecondaryColorPointer setSecondaryColorPointer
+
+getSecondaryColorPointer :: IO (VertexArrayDescriptor a)
+getSecondaryColorPointer = do
+   n <- getInteger1 id GetSecondaryColorArraySize
+   d <- getEnum1 unmarshalDataType GetSecondaryColorArrayType
+   s <- getInteger1 fromIntegral GetSecondaryColorArrayStride
+   p <- getPointer SecondaryColorArrayPointer
+   return $ VertexArrayDescriptor n d s p
+
+setSecondaryColorPointer :: (VertexArrayDescriptor a) -> IO ()
+setSecondaryColorPointer (VertexArrayDescriptor n d s p) =
+   glSecondaryColorPointer n (marshalDataType d) s p
+
+--------------------------------------------------------------------------------
+
+data InterleavedArrays =
+     V2f
+   | V3f
+   | C4ubV2f
+   | C4ubV3f
+   | C3fV3f
+   | N3fV3f
+   | C4fN3fV3f
+   | T2fV3f
+   | T4fV4f
+   | T2fC4ubV3f
+   | T2fC3fV3f
+   | T2fN3fV3f
+   | T2fC4fN3fV3f
+   | T4fC4fN3fV4f
+   deriving ( Eq, Ord, Show )
+
+marshalInterleavedArrays :: InterleavedArrays -> GLenum
+marshalInterleavedArrays x = case x of
+   V2f -> GL_V2F
+   V3f -> GL_V3F
+   C4ubV2f -> GL_C4UB_V2F
+   C4ubV3f -> GL_C4UB_V3F
+   C3fV3f -> GL_C3F_V3F
+   N3fV3f -> GL_N3F_V3F
+   C4fN3fV3f -> GL_C4F_N3F_V3F
+   T2fV3f -> GL_T2F_V3F
+   T4fV4f -> GL_T4F_V4F
+   T2fC4ubV3f -> GL_T2F_C4UB_V3F
+   T2fC3fV3f -> GL_T2F_C3F_V3F
+   T2fN3fV3f -> GL_T2F_N3F_V3F
+   T2fC4fN3fV3f -> GL_T2F_C4F_N3F_V3F
+   T4fC4fN3fV4f -> GL_T4F_C4F_N3F_V4F
+
+--------------------------------------------------------------------------------
+
+interleavedArrays :: InterleavedArrays -> Stride -> Ptr a -> IO ()
+interleavedArrays = glInterleavedArrays . marshalInterleavedArrays
+
+--------------------------------------------------------------------------------
+
+clientState :: ClientArrayType -> StateVar Capability
+clientState arrayType =
+   makeStateVar (getClientState arrayType) (setClientState arrayType)
+
+getClientState :: ClientArrayType -> IO Capability
+getClientState arrayType = get . makeCapability . clientArrayTypeToEnableCap $ arrayType
+
+setClientState :: ClientArrayType -> Capability -> IO ()
+setClientState arrayType val =
+   (if val == Enabled then glEnableClientState else glDisableClientState)
+      (marshalClientArrayType arrayType)
+
+--------------------------------------------------------------------------------
+
+clientActiveTexture :: StateVar TextureUnit
+clientActiveTexture =
+   makeStateVar (getEnum1 unmarshalTextureUnit GetClientActiveTexture)
+                (glClientActiveTexture . marshalTextureUnit)
+
+--------------------------------------------------------------------------------
+
+type ArrayIndex = GLint
+
+type NumArrayIndices = GLsizei
+
+type NumIndexBlocks = GLsizei
+
+type NumInstances = GLsizei
+
+type BaseInstance = GLuint
+
+type BaseVertex = GLint
+
+-- TODO: The ranges (ArrayIndex, ArrayIndex) below should actually use GLuint:
+-- type RangeStart = GLuint
+-- type RangeEnd = GLuint
+
+--------------------------------------------------------------------------------
+
+arrayElement :: ArrayIndex -> IO ()
+arrayElement = glArrayElement
+
+drawArrays :: PrimitiveMode -> ArrayIndex -> NumArrayIndices -> IO ()
+drawArrays = glDrawArrays . marshalPrimitiveMode
+
+drawArraysInstancedBaseInstance :: PrimitiveMode -> ArrayIndex -> NumArrayIndices -> NumInstances -> BaseInstance -> IO ()
+drawArraysInstancedBaseInstance = glDrawArraysInstancedBaseInstance . marshalPrimitiveMode
+
+drawArraysInstanced :: PrimitiveMode -> ArrayIndex -> NumArrayIndices -> NumInstances -> IO ()
+drawArraysInstanced = glDrawArraysInstanced . marshalPrimitiveMode
+
+multiDrawArrays :: PrimitiveMode -> Ptr ArrayIndex -> Ptr NumArrayIndices -> NumIndexBlocks -> IO ()
+multiDrawArrays = glMultiDrawArrays . marshalPrimitiveMode
+
+drawElements :: PrimitiveMode -> NumArrayIndices -> DataType -> Ptr a -> IO ()
+drawElements m c = glDrawElements (marshalPrimitiveMode m) c . marshalDataType
+
+drawElementsInstancedBaseInstance :: PrimitiveMode -> NumArrayIndices -> DataType -> Ptr a -> NumInstances -> BaseInstance -> IO ()
+drawElementsInstancedBaseInstance m c = glDrawElementsInstancedBaseInstance (marshalPrimitiveMode m) c . marshalDataType
+
+drawElementsInstanced :: PrimitiveMode -> NumArrayIndices -> DataType -> Ptr a -> NumInstances -> IO ()
+drawElementsInstanced m c = glDrawElementsInstanced (marshalPrimitiveMode m) c . marshalDataType
+
+multiDrawElements :: PrimitiveMode -> Ptr NumArrayIndices -> DataType -> Ptr (Ptr a) -> NumIndexBlocks -> IO ()
+multiDrawElements m c = glMultiDrawElements (marshalPrimitiveMode m) c . marshalDataType
+
+drawRangeElements :: PrimitiveMode -> (ArrayIndex, ArrayIndex) -> NumArrayIndices -> DataType -> Ptr a -> IO ()
+drawRangeElements m (s, e) c = glDrawRangeElements (marshalPrimitiveMode m) (fromIntegral s) (fromIntegral e) c . marshalDataType
+
+drawElementsBaseVertex :: PrimitiveMode -> NumArrayIndices -> DataType -> Ptr a -> BaseVertex -> IO ()
+drawElementsBaseVertex m c = glDrawElementsBaseVertex (marshalPrimitiveMode m) c . marshalDataType
+
+drawRangeElementsBaseVertex :: PrimitiveMode -> (ArrayIndex, ArrayIndex) -> NumArrayIndices -> DataType -> Ptr a -> BaseVertex -> IO ()
+drawRangeElementsBaseVertex m (s, e) c = glDrawRangeElementsBaseVertex (marshalPrimitiveMode m) (fromIntegral s) (fromIntegral e) c . marshalDataType
+
+drawElementsInstancedBaseVertex :: PrimitiveMode -> NumArrayIndices -> DataType -> Ptr a -> NumInstances -> BaseVertex -> IO ()
+drawElementsInstancedBaseVertex m c = glDrawElementsInstancedBaseVertex (marshalPrimitiveMode m) c . marshalDataType
+
+drawElementsInstancedBaseVertexBaseInstance :: PrimitiveMode -> NumArrayIndices -> DataType -> Ptr a -> NumInstances -> BaseVertex -> BaseInstance -> IO ()
+drawElementsInstancedBaseVertexBaseInstance m c = glDrawElementsInstancedBaseVertexBaseInstance (marshalPrimitiveMode m) c . marshalDataType
+
+multiDrawElementsBaseVertex :: PrimitiveMode -> Ptr NumArrayIndices -> DataType -> Ptr (Ptr a) -> NumIndexBlocks -> Ptr BaseVertex -> IO ()
+multiDrawElementsBaseVertex m c = glMultiDrawElementsBaseVertex (marshalPrimitiveMode m) c . marshalDataType
+
+maxElementsVertices :: GettableStateVar NumArrayIndices
+maxElementsVertices = makeGettableStateVar (getSizei1 id GetMaxElementsVertices)
+
+maxElementsIndices :: GettableStateVar NumArrayIndices
+maxElementsIndices = makeGettableStateVar (getSizei1 id GetMaxElementsIndices)
+
+--------------------------------------------------------------------------------
+
+lockArrays :: StateVar (Maybe (ArrayIndex, NumArrayIndices))
+lockArrays = makeStateVar getLockArrays setLockArrays
+
+getLockArrays :: IO (Maybe (ArrayIndex, NumArrayIndices))
+getLockArrays = do
+   count <- getInteger1 fromIntegral GetArrayElementLockCount
+   if count > 0
+      then do first <- getInteger1 id GetArrayElementLockFirst
+              return $ Just (first, count)
+      else return Nothing
+
+setLockArrays :: Maybe (ArrayIndex, NumArrayIndices) -> IO ()
+setLockArrays = maybe glUnlockArraysEXT (uncurry glLockArraysEXT)
+
+--------------------------------------------------------------------------------
+
+primitiveRestartIndex :: StateVar (Maybe ArrayIndex)
+primitiveRestartIndex =
+   makeStateVarMaybe
+      (return CapPrimitiveRestart)
+      (getInteger1 id GetPrimitiveRestartIndex)
+      (glPrimitiveRestartIndex . fromIntegral)
+
+--------------------------------------------------------------------------------
+
+-- We almost could use makeStateVarMaybe below, but, alas, this is client state.
+
+primitiveRestartIndexNV :: StateVar (Maybe ArrayIndex)
+primitiveRestartIndexNV =
+   makeStateVar getPrimitiveRestartIndexNV setPrimitiveRestartIndexNV
+
+getPrimitiveRestartIndexNV :: IO (Maybe ArrayIndex)
+getPrimitiveRestartIndexNV = do
+   on <- getBoolean1 unmarshalGLboolean GetPrimitiveRestartNV
+   if on
+      then fmap Just $ getInteger1 fromIntegral GetPrimitiveRestartIndexNV
+      else return Nothing
+
+setPrimitiveRestartIndexNV :: Maybe ArrayIndex -> IO ()
+setPrimitiveRestartIndexNV maybeIdx = case maybeIdx of
+   Nothing  -> glDisableClientState GL_PRIMITIVE_RESTART_NV
+   Just idx -> do glEnableClientState GL_PRIMITIVE_RESTART_NV
+                  glPrimitiveRestartIndexNV (fromIntegral idx)
+
+--------------------------------------------------------------------------------
+
+vertexAttribPointer :: AttribLocation -> StateVar (IntegerHandling, VertexArrayDescriptor a)
+vertexAttribPointer location =
+   makeStateVar (getVertexAttribPointer_ location) (setVertexAttribPointer location)
+
+getVertexAttribPointer_ :: AttribLocation -> IO (IntegerHandling, VertexArrayDescriptor a)
+getVertexAttribPointer_ location = do
+   i <- getVertexAttribBoolean1 unmarshalGLboolean location GetVertexAttribArrayInteger
+   h <- if i
+           then return KeepIntegral
+           else do f <- getVertexAttribBoolean1 unmarshalGLboolean location GetVertexAttribArrayNormalized
+                   return $ if f then ToNormalizedFloat else ToFloat
+   n <- getVertexAttribInteger1 id location GetVertexAttribArraySize
+   d <- getVertexAttribEnum1 unmarshalDataType location GetVertexAttribArrayType
+   s <- getVertexAttribInteger1 fromIntegral location GetVertexAttribArrayStride
+   p <- getVertexAttribPointer location VertexAttribArrayPointer
+   return (h, VertexArrayDescriptor n d s p)
+
+setVertexAttribPointer :: AttribLocation -> (IntegerHandling, VertexArrayDescriptor a) -> IO ()
+setVertexAttribPointer (AttribLocation location) (h, VertexArrayDescriptor n d s p) = case h of
+   ToFloat -> glVertexAttribPointer location n md (marshalGLboolean False) s p
+   ToNormalizedFloat -> glVertexAttribPointer location n md (marshalGLboolean True) s p
+   KeepIntegral -> glVertexAttribIPointer location n md s p
+  where md = marshalDataType d
+
+--------------------------------------------------------------------------------
+
+vertexAttribArray :: AttribLocation -> StateVar Capability
+vertexAttribArray location =
+   makeStateVar (getVertexAttribArray location) (flip setVertexAttribArray location)
+
+getVertexAttribArray :: AttribLocation -> IO Capability
+getVertexAttribArray location =
+   getVertexAttribBoolean1 unmarshalCapability location GetVertexAttribArrayEnabled
+
+setVertexAttribArray :: Capability -> AttribLocation -> IO ()
+setVertexAttribArray Disabled (AttribLocation location) = glDisableVertexAttribArray location
+setVertexAttribArray Enabled (AttribLocation location) = glEnableVertexAttribArray location
diff --git a/src/Graphics/Rendering/OpenGL/GL/VertexAttributes.hs b/src/Graphics/Rendering/OpenGL/GL/VertexAttributes.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/VertexAttributes.hs
@@ -0,0 +1,334 @@
+{-# LANGUAGE DeriveDataTypeable, CPP #-}
+{-# OPTIONS_HADDOCK hide #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.VertexAttributes
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+-- 
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This is a purely internal module for auxiliary vertex attributes.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GL.VertexAttributes (
+   TexCoord1(..), TexCoord2(..), TexCoord3(..), TexCoord4(..),
+   Normal3(..),
+   FogCoord1(..),
+   Color3(..), Color4(..),
+   Index1(..)
+) where
+
+#if !MIN_VERSION_base(4,8,0)
+import Control.Applicative ( Applicative(..) )
+#endif
+import Control.Monad
+import Data.Foldable
+import Data.Ix
+import Data.Traversable
+import Data.Typeable
+import Foreign.Marshal.Array
+import Foreign.Ptr
+import Foreign.Storable
+
+--------------------------------------------------------------------------------
+
+-- | Texture coordinates with /t/=0, /r/=0, and /q/=1.
+newtype TexCoord1 a = TexCoord1 a
+   deriving (Eq, Ord, Ix, Bounded, Show, Read, Typeable)
+
+instance Functor TexCoord1 where
+   fmap f (TexCoord1 x) = TexCoord1 (f x)
+
+instance Applicative TexCoord1 where
+   pure a = TexCoord1 a
+   TexCoord1 f <*> TexCoord1 x = TexCoord1 (f x)
+
+instance Foldable TexCoord1 where
+   foldr f a (TexCoord1 x) = x `f ` a
+   foldl f a (TexCoord1 x) = a `f` x
+   foldr1 _ (TexCoord1 x) = x
+   foldl1 _ (TexCoord1 x) = x
+
+instance Traversable TexCoord1 where
+   traverse f (TexCoord1 x) = pure TexCoord1 <*> f x
+   sequenceA (TexCoord1 x) =  pure TexCoord1 <*> x
+   mapM f (TexCoord1 x) = return TexCoord1 `ap` f x
+   sequence (TexCoord1 x) = return TexCoord1 `ap` x
+
+instance Storable a => Storable (TexCoord1 a) where
+   sizeOf    ~(TexCoord1 s) = sizeOf s
+   alignment ~(TexCoord1 s) = alignment s
+   peek = peekApplicativeTraversable
+   poke = pokeFoldable
+
+--------------------------------------------------------------------------------
+
+-- | Texture coordinates with /r/=0 and /q/=1.
+data TexCoord2 a = TexCoord2 !a !a
+   deriving (Eq, Ord, Ix, Bounded, Show, Read, Typeable)
+
+instance Functor TexCoord2 where
+   fmap f (TexCoord2 x y) = TexCoord2 (f x) (f y)
+
+instance Applicative TexCoord2 where
+   pure a = TexCoord2 a a
+   TexCoord2 f g <*> TexCoord2 x y = TexCoord2 (f x) (g y)
+
+instance Foldable TexCoord2 where
+   foldr f a (TexCoord2 x y) = x `f ` (y `f` a)
+   foldl f a (TexCoord2 x y) = (a `f` x) `f` y
+   foldr1 f (TexCoord2 x y) = x `f` y
+   foldl1 f (TexCoord2 x y) = x `f` y
+
+instance Traversable TexCoord2 where
+   traverse f (TexCoord2 x y) = pure TexCoord2 <*> f x <*> f y
+   sequenceA (TexCoord2 x y) =  pure TexCoord2 <*> x <*> y
+   mapM f (TexCoord2 x y) = return TexCoord2 `ap` f x `ap` f y
+   sequence (TexCoord2 x y) = return TexCoord2 `ap` x `ap` y
+
+instance Storable a => Storable (TexCoord2 a) where
+   sizeOf ~(TexCoord2 x _) = 2 * sizeOf x
+   alignment ~(TexCoord2 x _) = alignment x
+   peek = peekApplicativeTraversable
+   poke = pokeFoldable
+
+--------------------------------------------------------------------------------
+
+-- | Texture coordinates with /q/=1.
+data TexCoord3 a = TexCoord3 !a !a !a
+   deriving (Eq, Ord, Ix, Bounded, Show, Read, Typeable)
+
+instance Functor TexCoord3 where
+   fmap f (TexCoord3 x y z) = TexCoord3 (f x) (f y) (f z)
+
+instance Applicative TexCoord3 where
+   pure a = TexCoord3 a a a
+   TexCoord3 f g h <*> TexCoord3 x y z = TexCoord3 (f x) (g y) (h z)
+
+instance Foldable TexCoord3 where
+   foldr f a (TexCoord3 x y z) = x `f ` (y `f` (z `f` a))
+   foldl f a (TexCoord3 x y z) = ((a `f` x) `f` y) `f` z
+   foldr1 f (TexCoord3 x y z) = x `f` (y `f` z)
+   foldl1 f (TexCoord3 x y z) = (x `f` y) `f` z
+
+instance Traversable TexCoord3 where
+   traverse f (TexCoord3 x y z) = pure TexCoord3 <*> f x <*> f y <*> f z
+   sequenceA (TexCoord3 x y z) =  pure TexCoord3 <*> x <*> y <*> z
+   mapM f (TexCoord3 x y z) = return TexCoord3 `ap` f x `ap` f y `ap` f z
+   sequence (TexCoord3 x y z) = return TexCoord3 `ap` x `ap` y `ap` z
+
+instance Storable a => Storable (TexCoord3 a) where
+   sizeOf ~(TexCoord3 x _ _) = 3 * sizeOf x
+   alignment ~(TexCoord3 x _ _) = alignment x
+   peek = peekApplicativeTraversable
+   poke = pokeFoldable
+
+--------------------------------------------------------------------------------
+
+-- | Fully-fledged four-dimensional texture coordinates.
+data TexCoord4 a = TexCoord4 !a !a !a !a
+   deriving (Eq, Ord, Ix, Bounded, Show, Read, Typeable)
+
+instance Functor TexCoord4 where
+   fmap f (TexCoord4 x y z w) = TexCoord4 (f x) (f y) (f z) (f w)
+
+instance Applicative TexCoord4 where
+   pure a = TexCoord4 a a a a
+   TexCoord4 f g h i <*> TexCoord4 x y z w = TexCoord4 (f x) (g y) (h z) (i w)
+
+instance Foldable TexCoord4 where
+   foldr f a (TexCoord4 x y z w) = x `f ` (y `f` (z `f` (w `f` a)))
+   foldl f a (TexCoord4 x y z w) = (((a `f` x) `f` y) `f` z) `f` w
+   foldr1 f (TexCoord4 x y z w) = x `f` (y `f` (z `f` w))
+   foldl1 f (TexCoord4 x y z w) = ((x `f` y) `f` z) `f` w
+
+instance Traversable TexCoord4 where
+   traverse f (TexCoord4 x y z w) = pure TexCoord4 <*> f x <*> f y <*> f z <*> f w
+   sequenceA (TexCoord4 x y z w) =  pure TexCoord4 <*> x <*> y <*> z <*> w
+   mapM f (TexCoord4 x y z w) = return TexCoord4 `ap` f x `ap` f y `ap` f z `ap` f w
+   sequence (TexCoord4 x y z w) = return TexCoord4 `ap` x `ap` y `ap` z `ap` w
+
+instance Storable a => Storable (TexCoord4 a) where
+   sizeOf ~(TexCoord4 x _ _ _) = 4 * sizeOf x
+   alignment ~(TexCoord4 x _ _ _) = alignment x
+   peek = peekApplicativeTraversable
+   poke = pokeFoldable
+
+--------------------------------------------------------------------------------
+
+-- A three-dimensional normal.
+data Normal3 a = Normal3 !a !a !a
+   deriving (Eq, Ord, Ix, Bounded, Show, Read, Typeable) 
+instance Functor Normal3 where
+   fmap f (Normal3 x y z) = Normal3 (f x) (f y) (f z)
+
+instance Applicative Normal3 where
+   pure a = Normal3 a a a
+   Normal3 f g h <*> Normal3 x y z = Normal3 (f x) (g y) (h z)
+
+instance Foldable Normal3 where
+   foldr f a (Normal3 x y z) = x `f ` (y `f` (z `f` a))
+   foldl f a (Normal3 x y z) = ((a `f` x) `f` y) `f` z
+   foldr1 f (Normal3 x y z) = x `f` (y `f` z)
+   foldl1 f (Normal3 x y z) = (x `f` y) `f` z
+
+instance Traversable Normal3 where
+   traverse f (Normal3 x y z) = pure Normal3 <*> f x <*> f y <*> f z
+   sequenceA (Normal3 x y z) =  pure Normal3 <*> x <*> y <*> z
+   mapM f (Normal3 x y z) = return Normal3 `ap` f x `ap` f y `ap` f z
+   sequence (Normal3 x y z) = return Normal3 `ap` x `ap` y `ap` z
+
+instance Storable a => Storable (Normal3 a) where
+   sizeOf ~(Normal3 x _ _) = 3 * sizeOf x
+   alignment ~(Normal3 x _ _) = alignment x
+   peek = peekApplicativeTraversable
+   poke = pokeFoldable
+
+--------------------------------------------------------------------------------
+
+-- | A fog coordinate.
+newtype FogCoord1 a = FogCoord1 a
+   deriving (Eq, Ord, Ix, Bounded, Show, Read, Typeable)
+
+instance Functor FogCoord1 where
+   fmap f (FogCoord1 x) = FogCoord1 (f x)
+
+instance Applicative FogCoord1 where
+   pure a = FogCoord1 a
+   FogCoord1 f <*> FogCoord1 x = FogCoord1 (f x)
+
+instance Foldable FogCoord1 where
+   foldr f a (FogCoord1 x) = x `f ` a
+   foldl f a (FogCoord1 x)  = a `f` x
+   foldr1 _ (FogCoord1 x) = x
+   foldl1 _ (FogCoord1 x) = x
+
+instance Traversable FogCoord1 where
+   traverse f (FogCoord1 x) = pure FogCoord1 <*> f x
+   sequenceA (FogCoord1 x) =  pure FogCoord1 <*> x
+   mapM f (FogCoord1 x) = return FogCoord1 `ap` f x
+   sequence (FogCoord1 x) = return FogCoord1 `ap` x
+
+instance Storable a => Storable (FogCoord1 a) where
+   sizeOf    ~(FogCoord1 s) = sizeOf s
+   alignment ~(FogCoord1 s) = alignment s
+   peek = peekApplicativeTraversable
+   poke = pokeFoldable
+
+--------------------------------------------------------------------------------
+
+-- An RGBA color with /A/=1.
+data Color3 a = Color3 !a !a !a
+   deriving (Eq, Ord, Ix, Bounded, Show, Read, Typeable)
+
+instance Functor Color3 where
+   fmap f (Color3 x y z) = Color3 (f x) (f y) (f z)
+
+instance Applicative Color3 where
+   pure a = Color3 a a a
+   Color3 f g h <*> Color3 x y z = Color3 (f x) (g y) (h z)
+
+instance Foldable Color3 where
+   foldr f a (Color3 x y z) = x `f ` (y `f` (z `f` a))
+   foldl f a (Color3 x y z) = ((a `f` x) `f` y) `f` z
+   foldr1 f (Color3 x y z) = x `f` (y `f` z)
+   foldl1 f (Color3 x y z) = (x `f` y) `f` z
+
+instance Traversable Color3 where
+   traverse f (Color3 x y z) = pure Color3 <*> f x <*> f y <*> f z
+   sequenceA (Color3 x y z) =  pure Color3 <*> x <*> y <*> z
+   mapM f (Color3 x y z) = return Color3 `ap` f x `ap` f y `ap` f z
+   sequence (Color3 x y z) = return Color3 `ap` x `ap` y `ap` z
+
+instance Storable a => Storable (Color3 a) where
+   sizeOf ~(Color3 x _ _) = 3 * sizeOf x
+   alignment ~(Color3 x _ _) = alignment x
+   peek = peekApplicativeTraversable
+   poke = pokeFoldable
+
+--------------------------------------------------------------------------------
+
+-- | A fully-fledged RGBA color.
+data Color4 a = Color4 !a !a !a !a
+   deriving (Eq, Ord, Ix, Bounded, Show, Read, Typeable)
+
+instance Functor Color4 where
+   fmap f (Color4 x y z w) = Color4 (f x) (f y) (f z) (f w)
+
+instance Applicative Color4 where
+   pure a = Color4 a a a a
+   Color4 f g h i <*> Color4 x y z w = Color4 (f x) (g y) (h z) (i w)
+
+instance Foldable Color4 where
+   foldr f a (Color4 x y z w) = x `f ` (y `f` (z `f` (w `f` a)))
+   foldl f a (Color4 x y z w) = (((a `f` x) `f` y) `f` z) `f` w
+   foldr1 f (Color4 x y z w) = x `f` (y `f` (z `f` w))
+   foldl1 f (Color4 x y z w) = ((x `f` y) `f` z) `f` w
+
+instance Traversable Color4 where
+   traverse f (Color4 x y z w) = pure Color4 <*> f x <*> f y <*> f z <*> f w
+   sequenceA (Color4 x y z w) =  pure Color4 <*> x <*> y <*> z <*> w
+   mapM f (Color4 x y z w) = return Color4 `ap` f x `ap` f y `ap` f z `ap` f w
+   sequence (Color4 x y z w) = return Color4 `ap` x `ap` y `ap` z `ap` w
+
+instance Storable a => Storable (Color4 a) where
+   sizeOf ~(Color4 x _ _ _) = 4 * sizeOf x
+   alignment ~(Color4 x _ _ _) = alignment x
+   peek = peekApplicativeTraversable
+   poke = pokeFoldable
+
+--------------------------------------------------------------------------------
+
+-- | A color index.
+newtype Index1 a = Index1 a
+   deriving (Eq, Ord, Ix, Bounded, Show, Read, Typeable)
+
+instance Functor Index1 where
+   fmap f (Index1 x) = Index1 (f x)
+
+instance Applicative Index1 where
+   pure a = Index1 a
+   Index1 f <*> Index1 x = Index1 (f x)
+
+instance Foldable Index1 where
+   foldr f a (Index1 x) = x `f ` a
+   foldl f a (Index1 x)  = a `f` x
+   foldr1 _ (Index1 x) = x
+   foldl1 _ (Index1 x) = x
+
+instance Traversable Index1 where
+   traverse f (Index1 x) = pure Index1 <*> f x
+   sequenceA (Index1 x) =  pure Index1 <*> x
+   mapM f (Index1 x) = return Index1 `ap` f x
+   sequence (Index1 x) = return Index1 `ap` x
+
+instance Storable a => Storable (Index1 a) where
+   sizeOf    ~(Index1 s) = sizeOf s
+   alignment ~(Index1 s) = alignment s
+   peek = peekApplicativeTraversable
+   poke = pokeFoldable
+
+--------------------------------------------------------------------------------
+
+peekApplicativeTraversable :: (Applicative t, Traversable t, Storable a) => Ptr (t a) -> IO (t a)
+peekApplicativeTraversable = Data.Traversable.mapM peek . addresses
+
+addresses :: (Applicative t, Traversable t, Storable a) => Ptr (t a) -> t (Ptr a)
+addresses = snd . mapAccumL nextPtr 0 . pure . castPtr
+
+nextPtr :: Storable a => Int -> Ptr a -> (Int, Ptr a)
+nextPtr offset ptr = (offset + 1, advancePtr ptr offset)
+
+--------------------------------------------------------------------------------
+
+pokeFoldable :: (Foldable t, Storable a) => Ptr (t a) -> t a -> IO ()
+pokeFoldable ptr xs = foldlM pokeAndAdvance (castPtr ptr) xs >> return ()
+
+pokeAndAdvance :: Storable a => Ptr a -> a -> IO (Ptr a)
+pokeAndAdvance ptr value = do
+   poke ptr value
+   return $ ptr `plusPtr` sizeOf value
diff --git a/src/Graphics/Rendering/OpenGL/GL/VertexSpec.hs b/src/Graphics/Rendering/OpenGL/GL/VertexSpec.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GL/VertexSpec.hs
@@ -0,0 +1,992 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GL.VertexSpec
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+-- 
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 2.7 (Vertex Specification) of the
+-- OpenGL 2.1 specs.
+--
+--------------------------------------------------------------------------------
+
+{-# LANGUAGE TypeSynonymInstances #-}
+
+module Graphics.Rendering.OpenGL.GL.VertexSpec (
+   -- * Vertex Coordinates
+   Vertex(..),
+   VertexComponent,
+
+   -- * Auxiliary Vertex Attributes
+   -- $AuxiliaryVertexAttributes
+
+   -- ** Texture Coordinates
+   currentTextureCoords, TexCoord(..),
+   TexCoordComponent,
+   TexCoord1(..), TexCoord2(..), TexCoord3(..), TexCoord4(..),
+
+   -- ** Normal
+   currentNormal, Normal(..),
+   NormalComponent,
+   Normal3(..),
+
+   -- ** Fog Coordinate
+   currentFogCoord, FogCoord(..),
+   FogCoordComponent,
+   FogCoord1(..),
+
+   -- ** Color and Secondary Color
+   rgbaMode,
+   currentColor, Color(..),
+   currentSecondaryColor, SecondaryColor(..),
+   ColorComponent,
+   Color3(..), Color4(..),
+
+   currentIndex, Index(..),
+   IndexComponent,
+   Index1(..),
+
+   -- * Generic Vertex Attributes
+   IntegerHandling(..), AttribLocation(..),
+   currentVertexAttrib, currentVertexAttribI, currentVertexAttribIu,
+   VertexAttrib(..), VertexAttribComponent(..),
+
+   -- * Texture Units
+   TextureUnit(..), maxTextureUnit
+) where
+
+import Data.StateVar
+import Foreign.Marshal.Array
+import Foreign.Ptr
+import Foreign.Storable
+import Graphics.Rendering.OpenGL.GL.GLboolean
+import Graphics.Rendering.OpenGL.GL.PeekPoke
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.Rendering.OpenGL.GL.Tensor
+import Graphics.Rendering.OpenGL.GL.Texturing.TextureUnit
+import Graphics.Rendering.OpenGL.GL.VertexAttributes
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+-- | The class of all types which can be used as a vertex coordinate.
+
+class VertexComponent a where
+   vertex2 :: a -> a -> IO ()
+   vertex3 :: a -> a -> a -> IO ()
+   vertex4 :: a -> a -> a -> a -> IO ()
+
+   vertex2v :: Ptr a -> IO ()
+   vertex3v :: Ptr a -> IO ()
+   vertex4v :: Ptr a -> IO ()
+
+instance VertexComponent GLshort where
+   vertex2 = glVertex2s
+   vertex3 = glVertex3s
+   vertex4 = glVertex4s
+
+   vertex2v = glVertex2sv
+   vertex3v = glVertex3sv
+   vertex4v = glVertex4sv
+
+instance VertexComponent GLint where
+   vertex2 = glVertex2i
+   vertex3 = glVertex3i
+   vertex4 = glVertex4i
+
+   vertex2v = glVertex2iv
+   vertex3v = glVertex3iv
+   vertex4v = glVertex4iv
+
+instance VertexComponent GLfloat where
+   vertex2 = glVertex2f
+   vertex3 = glVertex3f
+   vertex4 = glVertex4f
+
+   vertex2v = glVertex2fv
+   vertex3v = glVertex3fv
+   vertex4v = glVertex4fv
+
+instance VertexComponent GLdouble where
+   vertex2 = glVertex2d
+   vertex3 = glVertex3d
+   vertex4 = glVertex4d
+
+   vertex2v = glVertex2dv
+   vertex3v = glVertex3dv
+   vertex4v = glVertex4dv
+
+--------------------------------------------------------------------------------
+
+-- | Specify the (/x/, /y/, /z/, /w/) coordinates of a four-dimensional vertex.
+-- This must only be done during
+-- 'Graphics.Rendering.OpenGL.GL.BeginEnd.renderPrimitive', otherwise the
+-- behaviour is unspecified. The current values of the auxiliary vertex
+-- attributes are associated with the vertex.
+-- 
+-- Note that there is no such thing as a \"current vertex\" which could be
+-- retrieved.
+
+class Vertex a where
+   vertex  ::     a -> IO ()
+   vertexv :: Ptr a -> IO ()
+
+instance VertexComponent a => Vertex (Vertex2 a) where
+   vertex (Vertex2 x y) = vertex2 x y
+   vertexv = vertex2v . (castPtr :: Ptr (Vertex2 b) -> Ptr b)
+
+instance VertexComponent a => Vertex (Vertex3 a) where
+   vertex (Vertex3 x y z) = vertex3 x y z
+   vertexv = vertex3v . (castPtr :: Ptr (Vertex3 b) -> Ptr b)
+
+instance VertexComponent a => Vertex (Vertex4 a) where
+   vertex (Vertex4 x y z w) = vertex4 x y z w
+   vertexv = vertex4v . (castPtr :: Ptr (Vertex4 b) -> Ptr b)
+
+--------------------------------------------------------------------------------
+-- $AuxiliaryVertexAttributes
+-- Apart from its coordinates in four-dimensional space, every vertex has
+-- associated /auxiliary attributes/: Its texture coordinates, a normal, a
+-- fog coordinate, and a color plus a secondary color. For every attribute, the
+-- OpenGL state contains its current value, which can be changed at any time.
+--
+-- Every attribute has a \"natural\" format via which it can be manipulated
+-- directly as part of the OpenGL state, e.g. the current texture coordinates
+-- are internally handled as @'TexCoord4' 'GLfloat'@. Different formats are
+-- converted to this format, e.g. the /s/, /r/, and /t/ coordinates of a
+-- @'TexCoord3' 'GLint'@ are converted to floating point values and a /q/
+-- coordinate of 1.0 is implicitly assumed.
+--
+-- Consequently, the vast majority of classes, functions, and data types in this
+-- module are for convenience only and offer no additional functionality.
+
+--------------------------------------------------------------------------------
+
+-- | The current texture coordinates (/s/, /t/, /r/, /q/) for the current
+-- texture unit (see 'Graphics.Rendering.OpenGL.GL.CoordTrans.activeTexture').
+-- The initial value is (0,0,0,1) for all texture units.
+
+currentTextureCoords :: StateVar (TexCoord4 GLfloat)
+currentTextureCoords =
+   makeStateVar (getFloat4 TexCoord4 GetCurrentTextureCoords) texCoord
+
+--------------------------------------------------------------------------------
+
+-- | The class of all types which can be used as a texture coordinate.
+
+class TexCoordComponent a where
+   texCoord1 :: a -> IO ()
+   texCoord2 :: a -> a -> IO ()
+   texCoord3 :: a -> a -> a -> IO ()
+   texCoord4 :: a -> a -> a -> a -> IO ()
+
+   texCoord1v :: Ptr a -> IO ()
+   texCoord2v :: Ptr a -> IO ()
+   texCoord3v :: Ptr a -> IO ()
+   texCoord4v :: Ptr a -> IO ()
+
+   multiTexCoord1 :: GLenum -> a -> IO ()
+   multiTexCoord2 :: GLenum -> a -> a -> IO ()
+   multiTexCoord3 :: GLenum -> a -> a -> a -> IO ()
+   multiTexCoord4 :: GLenum -> a -> a -> a -> a -> IO ()
+
+   multiTexCoord1v :: GLenum -> Ptr a -> IO ()
+   multiTexCoord2v :: GLenum -> Ptr a -> IO ()
+   multiTexCoord3v :: GLenum -> Ptr a -> IO ()
+   multiTexCoord4v :: GLenum -> Ptr a -> IO ()
+
+instance TexCoordComponent GLshort where
+   texCoord1 = glTexCoord1s
+   texCoord2 = glTexCoord2s
+   texCoord3 = glTexCoord3s
+   texCoord4 = glTexCoord4s
+
+   texCoord1v = glTexCoord1sv
+   texCoord2v = glTexCoord2sv
+   texCoord3v = glTexCoord3sv
+   texCoord4v = glTexCoord4sv
+
+   multiTexCoord1 = glMultiTexCoord1s
+   multiTexCoord2 = glMultiTexCoord2s
+   multiTexCoord3 = glMultiTexCoord3s
+   multiTexCoord4 = glMultiTexCoord4s
+
+   multiTexCoord1v = glMultiTexCoord1sv
+   multiTexCoord2v = glMultiTexCoord2sv
+   multiTexCoord3v = glMultiTexCoord3sv
+   multiTexCoord4v = glMultiTexCoord4sv
+
+instance TexCoordComponent GLint where
+   texCoord1 = glTexCoord1i
+   texCoord2 = glTexCoord2i
+   texCoord3 = glTexCoord3i
+   texCoord4 = glTexCoord4i
+
+   texCoord1v = glTexCoord1iv
+   texCoord2v = glTexCoord2iv
+   texCoord3v = glTexCoord3iv
+   texCoord4v = glTexCoord4iv
+
+   multiTexCoord1 = glMultiTexCoord1i
+   multiTexCoord2 = glMultiTexCoord2i
+   multiTexCoord3 = glMultiTexCoord3i
+   multiTexCoord4 = glMultiTexCoord4i
+
+   multiTexCoord1v = glMultiTexCoord1iv
+   multiTexCoord2v = glMultiTexCoord2iv
+   multiTexCoord3v = glMultiTexCoord3iv
+   multiTexCoord4v = glMultiTexCoord4iv
+
+instance TexCoordComponent GLfloat where
+   texCoord1 = glTexCoord1f
+   texCoord2 = glTexCoord2f
+   texCoord3 = glTexCoord3f
+   texCoord4 = glTexCoord4f
+
+   texCoord1v = glTexCoord1fv
+   texCoord2v = glTexCoord2fv
+   texCoord3v = glTexCoord3fv
+   texCoord4v = glTexCoord4fv
+
+   multiTexCoord1 = glMultiTexCoord1f
+   multiTexCoord2 = glMultiTexCoord2f
+   multiTexCoord3 = glMultiTexCoord3f
+   multiTexCoord4 = glMultiTexCoord4f
+
+   multiTexCoord1v = glMultiTexCoord1fv
+   multiTexCoord2v = glMultiTexCoord2fv
+   multiTexCoord3v = glMultiTexCoord3fv
+   multiTexCoord4v = glMultiTexCoord4fv
+
+instance TexCoordComponent GLdouble where
+   texCoord1 = glTexCoord1d
+   texCoord2 = glTexCoord2d
+   texCoord3 = glTexCoord3d
+   texCoord4 = glTexCoord4d
+
+   texCoord1v = glTexCoord1dv
+   texCoord2v = glTexCoord2dv
+   texCoord3v = glTexCoord3dv
+   texCoord4v = glTexCoord4dv
+
+   multiTexCoord1 = glMultiTexCoord1d
+   multiTexCoord2 = glMultiTexCoord2d
+   multiTexCoord3 = glMultiTexCoord3d
+   multiTexCoord4 = glMultiTexCoord4d
+
+   multiTexCoord1v = glMultiTexCoord1dv
+   multiTexCoord2v = glMultiTexCoord2dv
+   multiTexCoord3v = glMultiTexCoord3dv
+   multiTexCoord4v = glMultiTexCoord4dv
+
+--------------------------------------------------------------------------------
+
+-- | Change the current texture coordinates of the current or given texture
+-- unit.
+
+class TexCoord a where
+   texCoord       ::                    a -> IO ()
+   texCoordv      ::                Ptr a -> IO ()
+   multiTexCoord  :: TextureUnit ->     a -> IO ()
+   multiTexCoordv :: TextureUnit -> Ptr a -> IO ()
+
+instance TexCoordComponent a => TexCoord (TexCoord1 a) where
+   texCoord (TexCoord1 s) = texCoord1 s
+   texCoordv = texCoord1v . (castPtr :: Ptr (TexCoord1 b) -> Ptr b)
+   multiTexCoord u (TexCoord1 s) =
+      multiTexCoord1 (marshalTextureUnit u) s
+   multiTexCoordv u =
+      multiTexCoord1v (marshalTextureUnit u) . (castPtr :: Ptr (TexCoord1 b) -> Ptr b)
+
+instance TexCoordComponent a => TexCoord (TexCoord2 a) where
+   texCoord (TexCoord2 s t) = texCoord2 s t
+   texCoordv = texCoord2v . (castPtr :: Ptr (TexCoord2 b) -> Ptr b)
+   multiTexCoord u (TexCoord2 s t) =
+      multiTexCoord2 (marshalTextureUnit u) s t
+   multiTexCoordv u =
+      multiTexCoord2v (marshalTextureUnit u) . (castPtr :: Ptr (TexCoord2 b) -> Ptr b)
+
+instance TexCoordComponent a => TexCoord (TexCoord3 a) where
+   texCoord (TexCoord3 s t r) = texCoord3 s t r
+   texCoordv = texCoord3v . (castPtr :: Ptr (TexCoord3 b) -> Ptr b)
+   multiTexCoord u (TexCoord3 s t r) =
+      multiTexCoord3 (marshalTextureUnit u) s t r
+   multiTexCoordv u =
+      multiTexCoord3v (marshalTextureUnit u) . (castPtr :: Ptr (TexCoord3 b) -> Ptr b)
+
+instance TexCoordComponent a => TexCoord (TexCoord4 a) where
+   texCoord (TexCoord4 s t r q) = texCoord4 s t r q
+   texCoordv = texCoord4v . (castPtr :: Ptr (TexCoord4 b) -> Ptr b)
+   multiTexCoord u (TexCoord4 s t r q) =
+      multiTexCoord4 (marshalTextureUnit u) s t r q
+   multiTexCoordv u =
+      multiTexCoord4v (marshalTextureUnit u) . (castPtr :: Ptr (TexCoord4 b) -> Ptr b)
+
+--------------------------------------------------------------------------------
+
+-- | The current normal (/x/, /y/, /z/). The initial value is the unit vector
+-- (0, 0, 1).
+
+currentNormal :: StateVar (Normal3 GLfloat)
+currentNormal = makeStateVar (getFloat3 Normal3 GetCurrentNormal) normal
+
+--------------------------------------------------------------------------------
+
+-- | The class of all types which can be used as a component of a normal.
+
+class NormalComponent a where
+   normal3 :: a -> a -> a -> IO ()
+   normal3v :: Ptr a -> IO ()
+
+instance NormalComponent GLbyte where
+   normal3 = glNormal3b
+   normal3v = glNormal3bv
+
+instance NormalComponent GLshort where
+   normal3 = glNormal3s
+   normal3v = glNormal3sv
+
+instance NormalComponent GLint where
+   normal3 = glNormal3i
+   normal3v = glNormal3iv
+
+instance NormalComponent GLfloat where
+   normal3 = glNormal3f
+   normal3v = glNormal3fv
+
+instance NormalComponent GLdouble where
+   normal3 = glNormal3d
+   normal3v = glNormal3dv
+
+--------------------------------------------------------------------------------
+
+-- | Change the current normal. Integral arguments are converted to
+-- floating-point 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.
+--
+-- Normals specified with 'normal' or 'normalv' need not have unit length.
+-- If 'Graphics.Rendering.OpenGL.GL.CoordTrans.normalize' is enabled, then
+-- normals of any length specified with 'normal' or 'normalv' are normalized
+-- after transformation. If
+-- 'Graphics.Rendering.OpenGL.GL.CoordTrans.rescaleNormal' is enabled, normals
+-- are scaled by a scaling factor derived from the modelview matrix.
+-- 'Graphics.Rendering.OpenGL.GL.CoordTrans.rescaleNormal' requires that the
+-- originally specified normals were of unit length, and that the modelview
+-- matrix contains only uniform scales for proper results. Normalization is 
+-- initially disabled.
+
+class Normal a where
+   normal  ::     a -> IO ()
+   normalv :: Ptr a -> IO ()
+
+instance NormalComponent a => Normal (Normal3 a) where
+   normal (Normal3 x y z) = normal3 x y z
+   normalv = normal3v . (castPtr :: Ptr (Normal3 b) -> Ptr b)
+
+--------------------------------------------------------------------------------
+
+-- | The current fog coordinate. The initial value is 0.
+
+currentFogCoord :: StateVar (FogCoord1 GLfloat)
+currentFogCoord =
+   makeStateVar (getFloat1 FogCoord1 GetCurrentFogCoord) fogCoord
+
+--------------------------------------------------------------------------------
+
+-- | The class of all types which can be used as the fog coordinate.
+
+class FogCoordComponent a where
+   fogCoord1 :: a -> IO ()
+   fogCoord1v :: Ptr a -> IO ()
+
+instance FogCoordComponent GLfloat where
+   fogCoord1 = glFogCoordf
+   fogCoord1v = glFogCoordfv
+
+instance FogCoordComponent GLdouble where
+   fogCoord1 = glFogCoordd
+   fogCoord1v = glFogCoorddv
+
+--------------------------------------------------------------------------------
+
+-- | Change the current fog coordinate.
+
+class FogCoord a where
+   fogCoord  ::     a -> IO ()
+   fogCoordv :: Ptr a -> IO ()
+
+instance FogCoordComponent a => FogCoord (FogCoord1 a) where
+   fogCoord (FogCoord1 c) = fogCoord1 c
+   fogCoordv = fogCoord1v . (castPtr :: Ptr (FogCoord1 b) -> Ptr b)
+
+--------------------------------------------------------------------------------
+
+-- | If 'rgbaMode' contains 'True', the color buffers store RGBA value. If
+-- color indexes are stored, it contains 'False'.
+
+rgbaMode :: GettableStateVar Bool
+rgbaMode = makeGettableStateVar (getBoolean1 unmarshalGLboolean GetRGBAMode)
+
+--------------------------------------------------------------------------------
+
+-- The current color (/R/, /G/, /B/, /A/). The initial value is (1, 1, 1, 1).
+-- Note that this state variable is significant only when the GL is in RGBA
+-- mode.
+
+currentColor :: StateVar (Color4 GLfloat)
+currentColor =
+   makeStateVar (getFloat4 Color4 GetCurrentColor) color
+
+-- The current secondary color (/R/, /G/, /B/). The initial value is (0, 0, 0).
+-- Note that this state variable is significant only when the GL is in RGBA
+-- mode.
+
+currentSecondaryColor :: StateVar (Color3 GLfloat)
+currentSecondaryColor =
+   makeStateVar
+      (do Color4 r g b _ <- getFloat4 Color4 GetCurrentSecondaryColor
+          return $ Color3 r g b)
+      secondaryColor
+
+--------------------------------------------------------------------------------
+
+-- | The class of all types which can be used as a color component.
+
+class ColorComponent a where
+   color3 :: a -> a -> a -> IO ()
+   color4 :: a -> a -> a -> a -> IO ()
+
+   color3v :: Ptr a -> IO ()
+   color4v :: Ptr a -> IO ()
+
+   secondaryColor3  :: a -> a -> a -> IO ()
+   secondaryColor3v :: Ptr a -> IO ()
+
+instance ColorComponent GLbyte where
+   color3 = glColor3b
+   color4 = glColor4b
+
+   color3v = glColor3bv
+   color4v = glColor4bv
+
+   secondaryColor3 = glSecondaryColor3b
+   secondaryColor3v = glSecondaryColor3bv
+
+instance ColorComponent GLshort where
+   color3 = glColor3s
+   color4 = glColor4s
+
+   color3v = glColor3sv
+   color4v = glColor4sv
+
+   secondaryColor3 = glSecondaryColor3s
+   secondaryColor3v = glSecondaryColor3sv
+
+instance ColorComponent GLint where
+   color3 = glColor3i
+   color4 = glColor4i
+
+   color3v = glColor3iv
+   color4v = glColor4iv
+
+   secondaryColor3 = glSecondaryColor3i
+   secondaryColor3v = glSecondaryColor3iv
+
+instance ColorComponent GLfloat where
+   color3 = glColor3f
+   color4 = glColor4f
+
+   color3v = glColor3fv
+   color4v = glColor4fv
+
+   secondaryColor3 = glSecondaryColor3f
+   secondaryColor3v = glSecondaryColor3fv
+
+instance ColorComponent GLdouble where
+   color3 = glColor3d
+   color4 = glColor4d
+
+   color3v = glColor3dv
+   color4v = glColor4dv
+
+   secondaryColor3 = glSecondaryColor3d
+   secondaryColor3v = glSecondaryColor3dv
+
+instance ColorComponent GLubyte where
+   color3 = glColor3ub
+   color4 = glColor4ub
+
+   color3v = glColor3ubv
+   color4v = glColor4ubv
+
+   secondaryColor3 = glSecondaryColor3ub
+   secondaryColor3v = glSecondaryColor3ubv
+
+instance ColorComponent GLushort where
+   color3 = glColor3us
+   color4 = glColor4us
+
+   color3v = glColor3usv
+   color4v = glColor4usv
+
+   secondaryColor3 = glSecondaryColor3us
+   secondaryColor3v = glSecondaryColor3usv
+
+instance ColorComponent GLuint where
+   color3 = glColor3ui
+   color4 = glColor4ui
+
+   color3v = glColor3uiv
+   color4v = glColor4uiv
+
+   secondaryColor3 = glSecondaryColor3ui
+   secondaryColor3v = glSecondaryColor3uiv
+
+--------------------------------------------------------------------------------
+
+-- | Change the current color.
+
+class Color a where
+   color  ::     a -> IO ()
+   colorv :: Ptr a -> IO ()
+
+instance ColorComponent a => Color (Color3 a) where
+   color (Color3 r g b) = color3 r g b
+   colorv = color3v . (castPtr :: Ptr (Color3 b) -> Ptr b)
+
+instance ColorComponent a => Color (Color4 a) where
+   color (Color4 r g b a) = color4 r g b a
+   colorv = color4v . (castPtr :: Ptr (Color4 b) -> Ptr b)
+
+--------------------------------------------------------------------------------
+
+-- | Change the current secondary color.
+
+class SecondaryColor a where
+   secondaryColor  ::     a -> IO ()
+   secondaryColorv :: Ptr a -> IO ()
+
+instance ColorComponent a => SecondaryColor (Color3 a) where
+   secondaryColor (Color3 r g b) = secondaryColor3 r g b
+   secondaryColorv = secondaryColor3v . (castPtr :: Ptr (Color3 b) -> Ptr b)
+
+--------------------------------------------------------------------------------
+
+-- The current color index. The initial value is 1. Note that this state
+-- variable is significant only when the GL is in color index mode.
+
+currentIndex :: StateVar (Index1 GLint)
+currentIndex = makeStateVar (getInteger1 Index1 GetCurrentIndex) index
+
+--------------------------------------------------------------------------------
+
+-- | The class of all types which can be used as a color index.
+
+class IndexComponent a where
+   index1 :: a -> IO ()
+   index1v :: Ptr a -> IO ()
+
+instance IndexComponent GLshort where
+   index1 = glIndexs
+   index1v = glIndexsv
+
+instance IndexComponent GLint where
+   index1 = glIndexi
+   index1v = glIndexiv
+
+instance IndexComponent GLfloat where
+   index1 = glIndexf
+   index1v = glIndexfv
+
+instance IndexComponent GLdouble where
+   index1 = glIndexd
+   index1v = glIndexdv
+
+instance IndexComponent GLubyte where
+   index1 = glIndexub
+   index1v = glIndexubv
+
+--------------------------------------------------------------------------------
+
+-- | Change the current color index.
+
+class Index a where
+   index  ::     a -> IO ()  -- Collision with Prelude.index
+   indexv :: Ptr a -> IO ()
+
+instance IndexComponent a => Index (Index1 a) where
+   index (Index1 i) = index1 i
+   indexv = index1v . (castPtr :: Ptr (Index1 b) -> Ptr b)
+
+--------------------------------------------------------------------------------
+
+data IntegerHandling =
+     ToFloat
+   | ToNormalizedFloat
+   | KeepIntegral
+   deriving ( Eq, Ord, Show )
+
+--------------------------------------------------------------------------------
+
+currentVertexAttrib :: AttribLocation -> StateVar (Vertex4 GLfloat)
+currentVertexAttrib location =
+   makeStateVar
+      (getVertexAttribFloat4 Vertex4 location GetCurrentVertexAttrib)
+      (vertexAttrib ToFloat location)
+
+currentVertexAttribI :: AttribLocation -> StateVar (Vertex4 GLint)
+currentVertexAttribI location =
+   makeStateVar
+      (getVertexAttribIInteger4 Vertex4 location GetCurrentVertexAttrib)
+      (vertexAttrib ToNormalizedFloat location)
+
+currentVertexAttribIu :: AttribLocation -> StateVar (Vertex4 GLuint)
+currentVertexAttribIu location =
+   makeStateVar
+      (getVertexAttribIuInteger4 Vertex4 location GetCurrentVertexAttrib)
+      (vertexAttrib KeepIntegral location)
+
+--------------------------------------------------------------------------------
+-- The generic vertex attribute API is not as orthogonal as we would like.
+-- Minimal methods: vertexAttrib4v and vertexAttrib4Nv and vertexAttrib4Iv
+
+-- | The class of all types which can be used as a generic vertex attribute.
+-- NOTE: Do not use the methods of this class directly, they were only exported
+-- by accident and will be hidden in future versions of this package.
+
+class (Storable a, Num a) => VertexAttribComponent a where
+   vertexAttrib1 :: AttribLocation -> a -> IO ()
+   vertexAttrib2 :: AttribLocation -> a -> a -> IO ()
+   vertexAttrib3 :: AttribLocation -> a -> a -> a -> IO ()
+   vertexAttrib4 :: AttribLocation -> a -> a -> a -> a -> IO ()
+
+   vertexAttrib1N :: AttribLocation -> a -> IO ()
+   vertexAttrib2N :: AttribLocation -> a -> a -> IO ()
+   vertexAttrib3N :: AttribLocation -> a -> a -> a -> IO ()
+   vertexAttrib4N :: AttribLocation -> a -> a -> a -> a -> IO ()
+
+   vertexAttrib1I :: AttribLocation -> a -> IO ()
+   vertexAttrib2I :: AttribLocation -> a -> a -> IO ()
+   vertexAttrib3I :: AttribLocation -> a -> a -> a -> IO ()
+   vertexAttrib4I :: AttribLocation -> a -> a -> a -> a -> IO ()
+
+   vertexAttrib1v :: AttribLocation -> Ptr a -> IO ()
+   vertexAttrib2v :: AttribLocation -> Ptr a -> IO ()
+   vertexAttrib3v :: AttribLocation -> Ptr a -> IO ()
+   vertexAttrib4v :: AttribLocation -> Ptr a -> IO ()
+
+   vertexAttrib1Nv :: AttribLocation -> Ptr a -> IO ()
+   vertexAttrib2Nv :: AttribLocation -> Ptr a -> IO ()
+   vertexAttrib3Nv :: AttribLocation -> Ptr a -> IO ()
+   vertexAttrib4Nv :: AttribLocation -> Ptr a -> IO ()
+
+   vertexAttrib1Iv :: AttribLocation -> Ptr a -> IO ()
+   vertexAttrib2Iv :: AttribLocation -> Ptr a -> IO ()
+   vertexAttrib3Iv :: AttribLocation -> Ptr a -> IO ()
+   vertexAttrib4Iv :: AttribLocation -> Ptr a -> IO ()
+
+   vertexAttrib1 location x = vertexAttrib4 location x 0 0 1
+   vertexAttrib2 location x y = vertexAttrib4 location x y 0 1
+   vertexAttrib3 location x y z = vertexAttrib4 location x y z 1
+   vertexAttrib4 location x y z w = allocaArray 4 $ \buf -> do
+                                       poke4 buf x y z w
+                                       vertexAttrib4v location buf
+
+   vertexAttrib1N location x = vertexAttrib4N location x 0 0 1
+   vertexAttrib2N location x y = vertexAttrib4N location x y 0 1
+   vertexAttrib3N location x y z = vertexAttrib4N location x y z 1
+   vertexAttrib4N location x y z w = allocaArray 4 $ \buf -> do
+                                       poke4 buf x y z w
+                                       vertexAttrib4Nv location buf
+
+   vertexAttrib1I location x = vertexAttrib4I location x 0 0 1
+   vertexAttrib2I location x y = vertexAttrib4I location x y 0 1
+   vertexAttrib3I location x y z = vertexAttrib4I location x y z 1
+   vertexAttrib4I location x y z w = allocaArray 4 $ \buf -> do
+                                       poke4 buf x y z w
+                                       vertexAttrib4Iv location buf
+
+   vertexAttrib1v location = peek1M $ vertexAttrib1 location
+   vertexAttrib2v location = peek2M $ vertexAttrib2 location
+   vertexAttrib3v location = peek3M $ vertexAttrib3 location
+
+   vertexAttrib1Nv location = peek1M $ vertexAttrib1N location
+   vertexAttrib2Nv location = peek2M $ vertexAttrib2N location
+   vertexAttrib3Nv location = peek3M $ vertexAttrib3N location
+
+   vertexAttrib1Iv location = peek1M $ vertexAttrib1I location
+   vertexAttrib2Iv location = peek2M $ vertexAttrib2I location
+   vertexAttrib3Iv location = peek3M $ vertexAttrib3I location
+
+instance VertexAttribComponent GLbyte where
+   vertexAttrib4v (AttribLocation al) = glVertexAttrib4bv al
+   vertexAttrib4Nv (AttribLocation al) = glVertexAttrib4Nbv al
+   vertexAttrib4Iv (AttribLocation al) = glVertexAttribI4bv al
+
+instance VertexAttribComponent GLubyte where
+   vertexAttrib4N (AttribLocation al) = glVertexAttrib4Nub al
+   vertexAttrib4v (AttribLocation al) = glVertexAttrib4ubv al
+   vertexAttrib4Nv (AttribLocation al) = glVertexAttrib4Nubv al
+   vertexAttrib4Iv (AttribLocation al) = glVertexAttribI4ubv al
+
+instance VertexAttribComponent GLshort where
+   vertexAttrib1 (AttribLocation al) = glVertexAttrib1s al
+   vertexAttrib2 (AttribLocation al) = glVertexAttrib2s al
+   vertexAttrib3 (AttribLocation al) = glVertexAttrib3s al
+   vertexAttrib4 (AttribLocation al) = glVertexAttrib4s al
+
+   vertexAttrib1v (AttribLocation al) = glVertexAttrib1sv al
+   vertexAttrib2v (AttribLocation al) = glVertexAttrib2sv al
+   vertexAttrib3v (AttribLocation al) = glVertexAttrib3sv al
+   vertexAttrib4v (AttribLocation al) = glVertexAttrib4sv al
+
+   vertexAttrib4Nv (AttribLocation al) = glVertexAttrib4Nsv al
+
+   vertexAttrib4Iv (AttribLocation al) = glVertexAttribI4sv al
+
+instance VertexAttribComponent GLushort where
+   vertexAttrib4v (AttribLocation al) = glVertexAttrib4usv al
+   vertexAttrib4Nv (AttribLocation al) = glVertexAttrib4Nusv al
+   vertexAttrib4Iv (AttribLocation al) = glVertexAttribI4usv al
+
+instance VertexAttribComponent GLint where
+   vertexAttrib1I (AttribLocation al) = glVertexAttribI1i al
+   vertexAttrib2I (AttribLocation al) = glVertexAttribI2i al
+   vertexAttrib3I (AttribLocation al) = glVertexAttribI3i al
+   vertexAttrib4I (AttribLocation al) = glVertexAttribI4i al
+
+   vertexAttrib4v (AttribLocation al) = glVertexAttrib4iv al
+
+   vertexAttrib4Nv (AttribLocation al) = glVertexAttrib4Niv al
+
+   vertexAttrib1Iv (AttribLocation al) = glVertexAttribI1iv al
+   vertexAttrib2Iv (AttribLocation al) = glVertexAttribI2iv al
+   vertexAttrib3Iv (AttribLocation al) = glVertexAttribI3iv al
+   vertexAttrib4Iv (AttribLocation al) = glVertexAttribI4iv al
+
+instance VertexAttribComponent GLuint where
+   vertexAttrib1I (AttribLocation al) = glVertexAttribI1ui al
+   vertexAttrib2I (AttribLocation al) = glVertexAttribI2ui al
+   vertexAttrib3I (AttribLocation al) = glVertexAttribI3ui al
+   vertexAttrib4I (AttribLocation al) = glVertexAttribI4ui al
+
+   vertexAttrib4v (AttribLocation al) = glVertexAttrib4uiv al
+
+   vertexAttrib4Nv (AttribLocation al) = glVertexAttrib4Nuiv al
+
+   vertexAttrib1Iv (AttribLocation al) = glVertexAttribI1uiv al
+   vertexAttrib2Iv (AttribLocation al) = glVertexAttribI2uiv al
+   vertexAttrib3Iv (AttribLocation al) = glVertexAttribI3uiv al
+   vertexAttrib4Iv (AttribLocation al) = glVertexAttribI4uiv al
+
+instance VertexAttribComponent GLfloat where
+   vertexAttrib1 (AttribLocation al) = glVertexAttrib1f al
+   vertexAttrib2 (AttribLocation al) = glVertexAttrib2f al
+   vertexAttrib3 (AttribLocation al) = glVertexAttrib3f al
+   vertexAttrib4 (AttribLocation al) = glVertexAttrib4f al
+
+   vertexAttrib1v (AttribLocation al) = glVertexAttrib1fv al
+   vertexAttrib2v (AttribLocation al) = glVertexAttrib2fv al
+   vertexAttrib3v (AttribLocation al) = glVertexAttrib3fv al
+   vertexAttrib4v (AttribLocation al) = glVertexAttrib4fv al
+
+   vertexAttrib4Nv = vertexAttrib4v
+
+   vertexAttrib4Iv = vertexAttrib4IvRealFrac
+
+vertexAttrib4IvRealFrac :: (Storable a, RealFrac a) => AttribLocation -> Ptr a -> IO ()
+vertexAttrib4IvRealFrac location = peek4M $ \x y z w ->
+   vertexAttrib4I location (toGLint x) (toGLint y) (toGLint z) (toGLint w)
+
+-- formula 2.6 from the OpenGL 3.1 spec
+toGLint :: RealFrac a => a -> GLint
+toGLint = truncate . (fromIntegral (maxBound :: GLint) *). clamp
+   where clamp = max (-1.0) . min 1.0
+
+instance VertexAttribComponent GLdouble where
+   vertexAttrib1 (AttribLocation al) = glVertexAttrib1d al
+   vertexAttrib2 (AttribLocation al) = glVertexAttrib2d al
+   vertexAttrib3 (AttribLocation al) = glVertexAttrib3d al
+   vertexAttrib4 (AttribLocation al) = glVertexAttrib4d al
+
+   vertexAttrib1v (AttribLocation al) = glVertexAttrib1dv al
+   vertexAttrib2v (AttribLocation al) = glVertexAttrib2dv al
+   vertexAttrib3v (AttribLocation al) = glVertexAttrib3dv al
+   vertexAttrib4v (AttribLocation al) = glVertexAttrib4dv al
+
+   vertexAttrib4Nv = vertexAttrib4v
+
+   vertexAttrib4Iv = vertexAttrib4IvRealFrac
+
+--------------------------------------------------------------------------------
+
+class VertexAttrib a where
+   vertexAttrib  :: IntegerHandling -> AttribLocation ->     a -> IO ()
+   vertexAttribv :: IntegerHandling -> AttribLocation -> Ptr a -> IO ()
+
+instance VertexAttribComponent a => VertexAttrib (Vertex1 a) where
+   vertexAttrib ToFloat location (Vertex1 i) = vertexAttrib1 location i
+   vertexAttrib ToNormalizedFloat location (Vertex1 i) = vertexAttrib1N location i
+   vertexAttrib KeepIntegral location (Vertex1 i) = vertexAttrib1I location i
+
+   vertexAttribv ToFloat location = vertexAttrib1v location . (castPtr :: Ptr (Vertex1 b) -> Ptr b)
+   vertexAttribv ToNormalizedFloat location = vertexAttrib1Nv location . (castPtr :: Ptr (Vertex1 b) -> Ptr b)
+   vertexAttribv KeepIntegral location = vertexAttrib1Iv location . (castPtr :: Ptr (Vertex1 b) -> Ptr b)
+
+instance VertexAttribComponent a => VertexAttrib (Vertex2 a) where
+   vertexAttrib ToFloat location (Vertex2 x y) = vertexAttrib2 location x y
+   vertexAttrib ToNormalizedFloat location (Vertex2 x y) = vertexAttrib2N location x y
+   vertexAttrib KeepIntegral location (Vertex2 x y) = vertexAttrib2I location x y
+
+   vertexAttribv ToFloat location = vertexAttrib2v location . (castPtr :: Ptr (Vertex2 b) -> Ptr b)
+   vertexAttribv ToNormalizedFloat location = vertexAttrib2Nv location . (castPtr :: Ptr (Vertex2 b) -> Ptr b)
+   vertexAttribv KeepIntegral location = vertexAttrib2Iv location . (castPtr :: Ptr (Vertex2 b) -> Ptr b)
+
+instance VertexAttribComponent a => VertexAttrib (Vertex3 a) where
+   vertexAttrib ToFloat location (Vertex3 x y z) = vertexAttrib3 location x y z
+   vertexAttrib ToNormalizedFloat location (Vertex3 x y z) = vertexAttrib3N location x y z
+   vertexAttrib KeepIntegral location (Vertex3 x y z) = vertexAttrib3I location x y z
+
+   vertexAttribv ToFloat location = vertexAttrib3v location . (castPtr :: Ptr (Vertex3 b) -> Ptr b)
+   vertexAttribv ToNormalizedFloat location = vertexAttrib3Nv location . (castPtr :: Ptr (Vertex3 b) -> Ptr b)
+   vertexAttribv KeepIntegral location = vertexAttrib3Iv location . (castPtr :: Ptr (Vertex3 b) -> Ptr b)
+
+instance VertexAttribComponent a => VertexAttrib (Vertex4 a) where
+   vertexAttrib ToFloat location (Vertex4 x y z w) = vertexAttrib4 location x y z w
+   vertexAttrib ToNormalizedFloat location (Vertex4 x y z w) = vertexAttrib4N location x y z w
+   vertexAttrib KeepIntegral location (Vertex4 x y z w) = vertexAttrib4I location x y z w
+
+   vertexAttribv ToFloat location = vertexAttrib4v location . (castPtr :: Ptr (Vertex4 b) -> Ptr b)
+   vertexAttribv ToNormalizedFloat location = vertexAttrib4Nv location . (castPtr :: Ptr (Vertex4 b) -> Ptr b)
+   vertexAttribv KeepIntegral location = vertexAttrib4Iv location . (castPtr :: Ptr (Vertex4 b) -> Ptr b)
+
+instance VertexAttribComponent a => VertexAttrib (Vector1 a) where
+   vertexAttrib ToFloat location (Vector1 i) = vertexAttrib1 location i
+   vertexAttrib ToNormalizedFloat location (Vector1 i) = vertexAttrib1N location i
+   vertexAttrib KeepIntegral location (Vector1 i) = vertexAttrib1I location i
+
+   vertexAttribv ToFloat location = vertexAttrib1v location . (castPtr :: Ptr (Vector1 b) -> Ptr b)
+   vertexAttribv ToNormalizedFloat location = vertexAttrib1Nv location . (castPtr :: Ptr (Vector1 b) -> Ptr b)
+   vertexAttribv KeepIntegral location = vertexAttrib1Iv location . (castPtr :: Ptr (Vector1 b) -> Ptr b)
+
+instance VertexAttribComponent a => VertexAttrib (Vector2 a) where
+   vertexAttrib ToFloat location (Vector2 x y) = vertexAttrib2 location x y
+   vertexAttrib ToNormalizedFloat location (Vector2 x y) = vertexAttrib2N location x y
+   vertexAttrib KeepIntegral location (Vector2 x y) = vertexAttrib2I location x y
+
+   vertexAttribv ToFloat location = vertexAttrib2v location . (castPtr :: Ptr (Vector2 b) -> Ptr b)
+   vertexAttribv ToNormalizedFloat location = vertexAttrib2Nv location . (castPtr :: Ptr (Vector2 b) -> Ptr b)
+   vertexAttribv KeepIntegral location = vertexAttrib2Iv location . (castPtr :: Ptr (Vector2 b) -> Ptr b)
+
+instance VertexAttribComponent a => VertexAttrib (Vector3 a) where
+   vertexAttrib ToFloat location (Vector3 x y z) = vertexAttrib3 location x y z
+   vertexAttrib ToNormalizedFloat location (Vector3 x y z) = vertexAttrib3N location x y z
+   vertexAttrib KeepIntegral location (Vector3 x y z) = vertexAttrib3I location x y z
+
+   vertexAttribv ToFloat location = vertexAttrib3v location . (castPtr :: Ptr (Vector3 b) -> Ptr b)
+   vertexAttribv ToNormalizedFloat location = vertexAttrib3Nv location . (castPtr :: Ptr (Vector3 b) -> Ptr b)
+   vertexAttribv KeepIntegral location = vertexAttrib3Iv location . (castPtr :: Ptr (Vector3 b) -> Ptr b)
+
+instance VertexAttribComponent a => VertexAttrib (Vector4 a) where
+   vertexAttrib ToFloat location (Vector4 x y z w) = vertexAttrib4 location x y z w
+   vertexAttrib ToNormalizedFloat location (Vector4 x y z w) = vertexAttrib4N location x y z w
+   vertexAttrib KeepIntegral location (Vector4 x y z w) = vertexAttrib4I location x y z w
+
+   vertexAttribv ToFloat location = vertexAttrib4v location . (castPtr :: Ptr (Vector4 b) -> Ptr b)
+   vertexAttribv ToNormalizedFloat location = vertexAttrib4Nv location . (castPtr :: Ptr (Vector4 b) -> Ptr b)
+   vertexAttribv KeepIntegral location = vertexAttrib4Iv location . (castPtr :: Ptr (Vector4 b) -> Ptr b)
+
+instance VertexAttribComponent a => VertexAttrib (TexCoord1 a) where
+   vertexAttrib ToFloat location (TexCoord1 s) = vertexAttrib1 location s
+   vertexAttrib ToNormalizedFloat location (TexCoord1 s) = vertexAttrib1N location s
+   vertexAttrib KeepIntegral location (TexCoord1 s) = vertexAttrib1I location s
+
+   vertexAttribv ToFloat location = vertexAttrib1v location . (castPtr :: Ptr (TexCoord1 b) -> Ptr b)
+   vertexAttribv ToNormalizedFloat location = vertexAttrib1Nv location . (castPtr :: Ptr (TexCoord1 b) -> Ptr b)
+   vertexAttribv KeepIntegral location = vertexAttrib1Iv location . (castPtr :: Ptr (TexCoord1 b) -> Ptr b)
+
+instance VertexAttribComponent a => VertexAttrib (TexCoord2 a) where
+   vertexAttrib ToFloat location (TexCoord2 s t) = vertexAttrib2 location s t
+   vertexAttrib ToNormalizedFloat location (TexCoord2 s t) = vertexAttrib2N location s t
+   vertexAttrib KeepIntegral location (TexCoord2 s t) = vertexAttrib2I location s t
+
+   vertexAttribv ToFloat location = vertexAttrib2v location . (castPtr :: Ptr (TexCoord2 b) -> Ptr b)
+   vertexAttribv ToNormalizedFloat location = vertexAttrib2Nv location . (castPtr :: Ptr (TexCoord2 b) -> Ptr b)
+   vertexAttribv KeepIntegral location = vertexAttrib2Iv location . (castPtr :: Ptr (TexCoord2 b) -> Ptr b)
+
+instance VertexAttribComponent a => VertexAttrib (TexCoord3 a) where
+   vertexAttrib ToFloat location (TexCoord3 s t u) = vertexAttrib3 location s t u
+   vertexAttrib ToNormalizedFloat location (TexCoord3 s t u) = vertexAttrib3N location s t u
+   vertexAttrib KeepIntegral location (TexCoord3 s t u) = vertexAttrib3I location s t u
+
+   vertexAttribv ToFloat location = vertexAttrib3v location . (castPtr :: Ptr (TexCoord3 b) -> Ptr b)
+   vertexAttribv ToNormalizedFloat location = vertexAttrib3Nv location . (castPtr :: Ptr (TexCoord3 b) -> Ptr b)
+   vertexAttribv KeepIntegral location = vertexAttrib3Iv location . (castPtr :: Ptr (TexCoord3 b) -> Ptr b)
+
+instance VertexAttribComponent a => VertexAttrib (TexCoord4 a) where
+   vertexAttrib ToFloat location (TexCoord4 s t u v) = vertexAttrib4 location s t u v
+   vertexAttrib ToNormalizedFloat location (TexCoord4 s t u v) = vertexAttrib4N location s t u v
+   vertexAttrib KeepIntegral location (TexCoord4 s t u v) = vertexAttrib4I location s t u v
+
+   vertexAttribv ToFloat location = vertexAttrib4v location . (castPtr :: Ptr (TexCoord4 b) -> Ptr b)
+   vertexAttribv ToNormalizedFloat location = vertexAttrib4Nv location . (castPtr :: Ptr (TexCoord4 b) -> Ptr b)
+   vertexAttribv KeepIntegral location = vertexAttrib4Iv location . (castPtr :: Ptr (TexCoord4 b) -> Ptr b)
+
+instance VertexAttribComponent a => VertexAttrib (Normal3 a) where
+   vertexAttrib ToFloat location (Normal3 x y z) = vertexAttrib3 location x y z
+   vertexAttrib ToNormalizedFloat location (Normal3 x y z) = vertexAttrib3N location x y z
+   vertexAttrib KeepIntegral location (Normal3 x y z) = vertexAttrib3I location x y z
+
+   vertexAttribv ToFloat location = vertexAttrib3v location . (castPtr :: Ptr (Normal3 b) -> Ptr b)
+   vertexAttribv ToNormalizedFloat location = vertexAttrib3Nv location . (castPtr :: Ptr (Normal3 b) -> Ptr b)
+   vertexAttribv KeepIntegral location = vertexAttrib3Iv location . (castPtr :: Ptr (Normal3 b) -> Ptr b)
+
+instance VertexAttribComponent a => VertexAttrib (FogCoord1 a) where
+   vertexAttrib ToFloat location (FogCoord1 c) = vertexAttrib1 location c
+   vertexAttrib ToNormalizedFloat location (FogCoord1 c) = vertexAttrib1N location c
+   vertexAttrib KeepIntegral location (FogCoord1 c) = vertexAttrib1I location c
+
+   vertexAttribv ToFloat location = vertexAttrib1v location . (castPtr :: Ptr (FogCoord1 b) -> Ptr b)
+   vertexAttribv ToNormalizedFloat location = vertexAttrib1Nv location . (castPtr :: Ptr (FogCoord1 b) -> Ptr b)
+   vertexAttribv KeepIntegral location = vertexAttrib1Iv location . (castPtr :: Ptr (FogCoord1 b) -> Ptr b)
+
+instance VertexAttribComponent a => VertexAttrib (Color3 a) where
+   vertexAttrib ToFloat location (Color3 r g b) = vertexAttrib3 location r g b
+   vertexAttrib ToNormalizedFloat location (Color3 r g b) = vertexAttrib3N location r g b
+   vertexAttrib KeepIntegral location (Color3 r g b) = vertexAttrib3I location r g b
+
+   vertexAttribv ToFloat location = vertexAttrib3v location . (castPtr :: Ptr (Color3 b) -> Ptr b)
+   vertexAttribv ToNormalizedFloat location = vertexAttrib3Nv location . (castPtr :: Ptr (Color3 b) -> Ptr b)
+   vertexAttribv KeepIntegral location = vertexAttrib3Iv location . (castPtr :: Ptr (Color3 b) -> Ptr b)
+
+instance VertexAttribComponent a => VertexAttrib (Color4 a) where
+   vertexAttrib ToFloat location (Color4 r g b a) = vertexAttrib4 location r g b a
+   vertexAttrib ToNormalizedFloat location (Color4 r g b a) = vertexAttrib4N location r g b a
+   vertexAttrib KeepIntegral location (Color4 r g b a) = vertexAttrib4I location r g b a
+
+   vertexAttribv ToFloat location = vertexAttrib4v location . (castPtr :: Ptr (Color4 b) -> Ptr b)
+   vertexAttribv ToNormalizedFloat location = vertexAttrib4Nv location . (castPtr :: Ptr (Color4 b) -> Ptr b)
+   vertexAttribv KeepIntegral location = vertexAttrib4Iv location . (castPtr :: Ptr (Color4 b) -> Ptr b)
+
+instance VertexAttribComponent a => VertexAttrib (Index1 a) where
+   vertexAttrib ToFloat location (Index1 i) = vertexAttrib1 location i
+   vertexAttrib ToNormalizedFloat location (Index1 i) = vertexAttrib1N location i
+   vertexAttrib KeepIntegral location (Index1 i) = vertexAttrib1I location i
+
+   vertexAttribv ToFloat location = vertexAttrib1v location . (castPtr :: Ptr (Index1 b) -> Ptr b)
+   vertexAttribv ToNormalizedFloat location = vertexAttrib1Nv location . (castPtr :: Ptr (Index1 b) -> Ptr b)
+   vertexAttribv KeepIntegral location = vertexAttrib1Iv location . (castPtr :: Ptr (Index1 b) -> Ptr b)
+
+--------------------------------------------------------------------------------
+
+-- | An implementation must support at least 2 texture units, but it may
+-- support up to 32 ones. This state variable can be used to query the actual
+-- implementation limit.
+
+maxTextureUnit :: GettableStateVar TextureUnit
+maxTextureUnit =
+   makeGettableStateVar (getEnum1 (TextureUnit . fromIntegral) GetMaxTextureUnits)
diff --git a/src/Graphics/Rendering/OpenGL/GLU.hs b/src/Graphics/Rendering/OpenGL/GLU.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GLU.hs
@@ -0,0 +1,31 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GLU
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+-- 
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- A Haskell binding for GLU, OpenGL\'s accompanying utility library.
+--
+-----------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GLU (
+     module Graphics.Rendering.OpenGL.GLU.Initialization,
+     module Graphics.Rendering.OpenGL.GLU.Mipmapping,
+     module Graphics.Rendering.OpenGL.GLU.Matrix,
+     module Graphics.Rendering.OpenGL.GLU.Tessellation,
+     module Graphics.Rendering.OpenGL.GLU.Quadrics,
+     module Graphics.Rendering.OpenGL.GLU.NURBS,
+     module Graphics.Rendering.OpenGL.GLU.Errors
+) where
+
+import Graphics.Rendering.OpenGL.GLU.Initialization
+import Graphics.Rendering.OpenGL.GLU.Mipmapping
+import Graphics.Rendering.OpenGL.GLU.Matrix
+import Graphics.Rendering.OpenGL.GLU.Tessellation
+import Graphics.Rendering.OpenGL.GLU.Quadrics
+import Graphics.Rendering.OpenGL.GLU.NURBS
+import Graphics.Rendering.OpenGL.GLU.Errors
diff --git a/src/Graphics/Rendering/OpenGL/GLU/Errors.hs b/src/Graphics/Rendering/OpenGL/GLU/Errors.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GLU/Errors.hs
@@ -0,0 +1,34 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GLU.Errors
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+-- 
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to section 2.5 (GL Errors) of the OpenGL 2.1 specs
+-- and chapter 8 (Errors) of the GLU specs, offering a generalized view of
+-- errors in GL and GLU.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GLU.Errors (
+   Error(..), ErrorCategory(..), errors
+) where
+
+import Data.StateVar
+import Graphics.Rendering.OpenGL.GLU.ErrorsInternal
+
+--------------------------------------------------------------------------------
+
+-- | When an error occurs, it is recorded in this state variable and no further
+-- errors are recorded. Reading 'errors' returns the currently recorded errors
+-- (there may be more than one due to a possibly distributed implementation) and
+-- resets the state variable to @[]@, re-enabling the recording of future
+-- errors. The value @[]@ means that there has been no detectable error since
+-- the last time 'errors' was read, or since the GL was initialized.
+
+errors :: GettableStateVar [Error]
+errors = makeGettableStateVar getErrors
diff --git a/src/Graphics/Rendering/OpenGL/GLU/ErrorsInternal.hs b/src/Graphics/Rendering/OpenGL/GLU/ErrorsInternal.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GLU/ErrorsInternal.hs
@@ -0,0 +1,234 @@
+{-# LANGUAGE CPP #-}
+{-# OPTIONS_GHC -fno-cse #-}
+{-# OPTIONS_HADDOCK hide #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GLU.ErrorsInternal
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This is a purely internal module corresponding to some parts of section 2.5
+-- (GL Errors) of the OpenGL 2.1 specs and chapter 8 (Errors) of the GLU specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GLU.ErrorsInternal (
+   Error(..), ErrorCategory(..), getErrors,
+   recordErrorCode, recordInvalidEnum, recordInvalidValue, recordOutOfMemory
+) where
+
+import Data.IORef ( IORef, newIORef, readIORef, writeIORef )
+import Graphics.GLU
+import Graphics.GL
+import System.IO.Unsafe ( unsafePerformIO )
+
+--------------------------------------------------------------------------------
+
+-- | GL\/GLU errors consist of a general error category and a description of
+-- what went wrong.
+
+data Error = Error ErrorCategory String
+   deriving ( Eq, Ord, Show )
+
+-- | General GL\/GLU error categories
+
+data ErrorCategory
+   = ContextLost
+   | InvalidEnum
+   | InvalidValue
+   | InvalidOperation
+   | InvalidFramebufferOperation
+   | OutOfMemory
+   | StackOverflow
+   | StackUnderflow
+   | TableTooLarge
+   | TesselatorError
+   | NURBSError
+   deriving ( Eq, Ord, Show )
+
+makeError :: GLenum -> Error
+makeError c
+   -- GL errors
+   | c == GL_CONTEXT_LOST =
+       Error ContextLost "context lost"
+   | c == GL_INVALID_ENUM =
+       Error InvalidEnum "invalid enumerant"
+   | c == GL_INVALID_VALUE =
+       Error InvalidValue  "invalid value"
+   | c == GL_INVALID_OPERATION =
+       Error InvalidOperation "invalid operation"
+   | c == GL_INVALID_FRAMEBUFFER_OPERATION =
+       Error InvalidFramebufferOperation "invalid framebuffer operation"
+   | c == GL_OUT_OF_MEMORY
+       = Error OutOfMemory "out of memory"
+   | c == GL_STACK_OVERFLOW =
+       Error StackOverflow "stack overflow"
+   | c == GL_STACK_UNDERFLOW =
+       Error StackUnderflow "stack underflow"
+   | c == GL_TABLE_TOO_LARGE =
+       Error TableTooLarge "table too large"
+   -- GLU errors
+   | c == GLU_INVALID_ENUM =
+       Error InvalidEnum "invalid enumerant"
+   | c == GLU_INVALID_VALUE =
+       Error InvalidValue  "invalid value"
+   | c == GLU_INVALID_OPERATION =
+       Error InvalidOperation "invalid operation"
+   | c == GLU_OUT_OF_MEMORY
+       = Error OutOfMemory "out of memory"
+   -- GLU tesselator error
+   | c == GLU_TESS_ERROR1 =
+       Error TesselatorError "gluTessBeginPolygon() must precede a gluTessEndPolygon()"
+   | c == GLU_TESS_ERROR2 =
+       Error TesselatorError "gluTessBeginContour() must precede a gluTessEndContour()"
+   | c == GLU_TESS_ERROR3 =
+       Error TesselatorError "gluTessEndPolygon() must follow a gluTessBeginPolygon()"
+   | c == GLU_TESS_ERROR4 =
+       Error TesselatorError "gluTessEndContour() must follow a gluTessBeginContour()"
+   | c == GLU_TESS_ERROR5 =
+       Error TesselatorError "a coordinate is too large"
+   | c == GLU_TESS_ERROR6 =
+       Error TesselatorError "need combine callback"
+   | c == GLU_TESS_ERROR7 =
+       Error TesselatorError "tesselation error 7"
+   | c == GLU_TESS_ERROR8 =
+       Error TesselatorError "tesselation error 8"
+   -- GLU NUBRS errors
+   | c == GLU_NURBS_ERROR1 =
+       Error NURBSError "spline order un-supported"
+   | c == GLU_NURBS_ERROR2 =
+       Error NURBSError "too few knots"
+   | c == GLU_NURBS_ERROR3 =
+       Error NURBSError "valid knot range is empty"
+   | c == GLU_NURBS_ERROR4 =
+       Error NURBSError "decreasing knot sequence knot"
+   | c == GLU_NURBS_ERROR5 =
+       Error NURBSError "knot multiplicity greater than order of spline"
+   | c == GLU_NURBS_ERROR6 =
+       Error NURBSError "gluEndCurve() must follow gluBeginCurve()"
+   | c == GLU_NURBS_ERROR7 =
+       Error NURBSError "gluBeginCurve() must precede gluEndCurve()"
+   | c == GLU_NURBS_ERROR8 =
+       Error NURBSError "missing or extra geometric data"
+   | c == GLU_NURBS_ERROR9 =
+       Error NURBSError "can't draw piecewise linear trimming curves"
+   | c == GLU_NURBS_ERROR10 =
+       Error NURBSError "missing or extra domain data"
+   | c == GLU_NURBS_ERROR11 =
+       Error NURBSError "missing or extra domain data"
+   | c == GLU_NURBS_ERROR12 =
+       Error NURBSError "gluEndTrim() must precede gluEndSurface()"
+   | c == GLU_NURBS_ERROR13 =
+       Error NURBSError "gluBeginSurface() must precede gluEndSurface()"
+   | c == GLU_NURBS_ERROR14 =
+       Error NURBSError "curve of improper type passed as trim curve"
+   | c == GLU_NURBS_ERROR15 =
+       Error NURBSError "gluBeginSurface() must precede gluBeginTrim()"
+   | c == GLU_NURBS_ERROR16 =
+       Error NURBSError "gluEndTrim() must follow gluBeginTrim()"
+   | c == GLU_NURBS_ERROR17 =
+       Error NURBSError "gluBeginTrim() must precede gluEndTrim()"
+   | c == GLU_NURBS_ERROR18 =
+       Error NURBSError "invalid or missing trim curve"
+   | c == GLU_NURBS_ERROR19 =
+       Error NURBSError "gluBeginTrim() must precede gluPwlCurve()"
+   | c == GLU_NURBS_ERROR20 =
+       Error NURBSError "piecewise linear trimming curve referenced twice"
+   | c == GLU_NURBS_ERROR21 =
+       Error NURBSError "piecewise linear trimming curve and nurbs curve mixed"
+   | c == GLU_NURBS_ERROR22 =
+       Error NURBSError "improper usage of trim data type"
+   | c == GLU_NURBS_ERROR23 =
+       Error NURBSError "nurbs curve referenced twice"
+   | c == GLU_NURBS_ERROR24 =
+       Error NURBSError "nurbs curve and piecewise linear trimming curve mixed"
+   | c == GLU_NURBS_ERROR25 =
+       Error NURBSError "nurbs surface referenced twice"
+   | c == GLU_NURBS_ERROR26 =
+       Error NURBSError "invalid property"
+   | c == GLU_NURBS_ERROR27 =
+       Error NURBSError "gluEndSurface() must follow gluBeginSurface()"
+   | c == GLU_NURBS_ERROR28 =
+       Error NURBSError "intersecting or misoriented trim curves"
+   | c == GLU_NURBS_ERROR29 =
+       Error NURBSError "intersecting trim curves"
+   | c == GLU_NURBS_ERROR30 =
+       Error NURBSError "UNUSED"
+   | c == GLU_NURBS_ERROR31 =
+       Error NURBSError "unconnected trim curves"
+   | c == GLU_NURBS_ERROR32 =
+       Error NURBSError "unknown knot error"
+   | c == GLU_NURBS_ERROR33 =
+       Error NURBSError "negative vertex count encountered"
+   | c == GLU_NURBS_ERROR34 =
+       Error NURBSError "negative byte-stride encounteed"
+   | c == GLU_NURBS_ERROR35 =
+       Error NURBSError "unknown type descriptor"
+   | c == GLU_NURBS_ERROR36 =
+       Error NURBSError "null control point reference"
+   | c == GLU_NURBS_ERROR37 =
+       Error NURBSError "duplicate point on piecewise linear trimming curve"
+   -- Something went terribly wrong...
+   | otherwise = error "makeError"
+
+--------------------------------------------------------------------------------
+
+-- This seems to be a common Haskell hack nowadays: A plain old global variable
+-- with an associated getter and mutator. Perhaps some language/library support
+-- is needed?
+
+{-# NOINLINE theRecordedErrors #-}
+theRecordedErrors :: IORef ([GLenum],Bool)
+theRecordedErrors = unsafePerformIO (newIORef ([], True))
+
+getRecordedErrors :: IO ([GLenum],Bool)
+getRecordedErrors =  readIORef theRecordedErrors
+
+setRecordedErrors :: ([GLenum],Bool) -> IO ()
+setRecordedErrors = writeIORef theRecordedErrors
+
+--------------------------------------------------------------------------------
+
+getGLErrors :: IO [GLenum]
+getGLErrors = getGLErrorsAux []
+   where getGLErrorsAux acc = do
+            errorCode <- glGetError
+            if isError errorCode
+               then getGLErrorsAux (errorCode : acc)
+               else return $ reverse acc
+
+isError :: GLenum -> Bool
+isError = (/= GL_NO_ERROR)
+
+--------------------------------------------------------------------------------
+
+getErrors :: IO [Error]
+getErrors = map makeError `fmap` getErrorCodesAux (const ([], True))
+
+recordErrorCode :: GLenum -> IO ()
+recordErrorCode e = do
+   -- We don't need the return value because this calls setRecordedErrors
+   _ <- getErrorCodesAux (\es -> (if null es then [e] else [], False))
+   return ()
+
+recordInvalidEnum :: IO ()
+recordInvalidEnum = recordErrorCode GL_INVALID_ENUM
+
+recordInvalidValue :: IO ()
+recordInvalidValue = recordErrorCode GL_INVALID_VALUE
+
+recordOutOfMemory :: IO ()
+recordOutOfMemory = recordErrorCode GL_OUT_OF_MEMORY
+
+-- ToDo: Make this thread-safe
+getErrorCodesAux :: ([GLenum] -> ([GLenum],Bool)) -> IO [GLenum]
+getErrorCodesAux f = do
+   (recordedErrors, useGLErrors) <- getRecordedErrors
+   glErrors <- getGLErrors
+   let es = if useGLErrors then recordedErrors ++ glErrors else recordedErrors
+   setRecordedErrors (f es)
+   return es
diff --git a/src/Graphics/Rendering/OpenGL/GLU/Initialization.hs b/src/Graphics/Rendering/OpenGL/GLU/Initialization.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GLU/Initialization.hs
@@ -0,0 +1,33 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GLU.Initialization
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+-- 
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to chapter 2 (Initialization) of the GLU specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GLU.Initialization (
+   gluVersion, gluExtensions
+) where
+
+import Data.StateVar
+import Graphics.GLU
+import Graphics.Rendering.OpenGL.GL.ByteString
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+gluVersion :: GettableStateVar String
+gluVersion = makeGettableStateVar (getString GLU_VERSION)
+
+gluExtensions :: GettableStateVar [String]
+gluExtensions = makeGettableStateVar (fmap words $ getString GLU_EXTENSIONS)
+
+getString :: GLenum -> IO String
+getString = getStringWith . gluGetString
diff --git a/src/Graphics/Rendering/OpenGL/GLU/Matrix.hs b/src/Graphics/Rendering/OpenGL/GLU/Matrix.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GLU/Matrix.hs
@@ -0,0 +1,135 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GLU.Matrix
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+-- 
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to chapter 4 (Matrix Manipulation) of the GLU specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GLU.Matrix (
+   ortho2D, perspective, lookAt, pickMatrix,
+   project, unProject, unProject4
+) where
+
+import Foreign.Marshal.Alloc
+import Foreign.Marshal.Array
+import Foreign.Ptr
+import Foreign.Storable
+import Graphics.GLU
+import Graphics.Rendering.OpenGL.GL.CoordTrans
+import Graphics.Rendering.OpenGL.GL.GLboolean
+import Graphics.Rendering.OpenGL.GL.Tensor
+import Graphics.Rendering.OpenGL.GLU.ErrorsInternal
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+-- matrix setup
+
+ortho2D :: GLdouble -> GLdouble -> GLdouble -> GLdouble -> IO ()
+ortho2D = gluOrtho2D
+
+
+perspective :: GLdouble -> GLdouble -> GLdouble -> GLdouble -> IO ()
+perspective = gluPerspective
+
+lookAt :: Vertex3 GLdouble -> Vertex3 GLdouble -> Vector3 GLdouble -> IO ()
+lookAt (Vertex3 eyeX    eyeY    eyeZ)
+       (Vertex3 centerX centerY centerZ)
+       (Vector3 upX     upY     upZ) =
+   gluLookAt eyeX eyeY eyeZ centerX centerY centerZ upX upY upZ
+
+pickMatrix ::
+   (GLdouble, GLdouble) -> (GLdouble, GLdouble) -> (Position, Size) -> IO ()
+pickMatrix (x, y) (w, h) viewPort =
+   withViewport viewPort $ gluPickMatrix x y w h
+
+--------------------------------------------------------------------------------
+-- coordinate projection
+
+project ::
+      Matrix m
+   => Vertex3 GLdouble -> m GLdouble -> m GLdouble -> (Position, Size)
+   -> IO (Vertex3 GLdouble)
+project (Vertex3 objX objY objZ) model proj viewPort =
+   withColumnMajor model $ \modelBuf ->
+   withColumnMajor proj $ \projBuf ->
+   withViewport viewPort $ \viewBuf ->
+   getVertex3 $ gluProject objX objY objZ modelBuf projBuf viewBuf
+
+unProject ::
+      Matrix m
+   => Vertex3 GLdouble -> m GLdouble -> m GLdouble -> (Position, Size)
+   -> IO (Vertex3 GLdouble)
+unProject (Vertex3 objX objY objZ) model proj viewPort =
+   withColumnMajor model $ \modelBuf ->
+   withColumnMajor proj $ \projBuf ->
+   withViewport viewPort $ \viewBuf ->
+   getVertex3 $ gluUnProject objX objY objZ modelBuf projBuf viewBuf
+
+unProject4 ::
+      Matrix m
+   => Vertex4 GLdouble -> m GLdouble -> m GLdouble -> (Position, Size)
+   -> GLclampd -> GLclampd
+   -> IO (Vertex4 GLdouble)
+unProject4 (Vertex4 objX objY objZ clipW) model proj viewPort near far =
+   withColumnMajor model $ \modelBuf ->
+   withColumnMajor proj $ \projBuf ->
+   withViewport viewPort $ \viewBuf ->
+   getVertex4 $
+      gluUnProject4 objX objY objZ clipW modelBuf projBuf viewBuf near far
+
+--------------------------------------------------------------------------------
+
+withViewport :: (Position, Size) -> (Ptr GLint -> IO a ) -> IO a
+withViewport (Position x y, Size w h) =
+   withArray [ x, y, fromIntegral w, fromIntegral h ]
+
+withColumnMajor :: (Matrix m, MatrixComponent c) => m c -> (Ptr c -> IO b) -> IO b
+withColumnMajor mat act = withMatrix mat juggle
+   where juggle ColumnMajor p = act p
+         juggle RowMajor    p = do
+            transposedElems <- mapM (peekElemOff p) [ 0, 4,  8, 12,
+                                                      1, 5,  9, 13,
+                                                      2, 6, 10, 14,
+                                                      3, 7, 11, 15 ]
+            withArray transposedElems act
+
+getVertex3 ::
+      (Ptr GLdouble -> Ptr GLdouble -> Ptr GLdouble -> IO GLint)
+   -> IO (Vertex3 GLdouble)
+getVertex3 act =
+   alloca $ \xBuf ->
+   alloca $ \yBuf ->
+   alloca $ \zBuf -> do
+   ok <- act xBuf yBuf zBuf
+   if unmarshalGLboolean ok
+      then do x <- peek xBuf
+              y <- peek yBuf
+              z <- peek zBuf
+              return $ Vertex3 x y z
+      else do recordInvalidValue
+              return $ Vertex3 0 0 0
+
+getVertex4 ::
+      (Ptr GLdouble -> Ptr GLdouble -> Ptr GLdouble -> Ptr GLdouble -> IO GLint)
+   -> IO (Vertex4 GLdouble)
+getVertex4 act =
+   alloca $ \xBuf ->
+   alloca $ \yBuf ->
+   alloca $ \zBuf ->
+   alloca $ \wBuf -> do
+   ok <- act xBuf yBuf zBuf wBuf
+   if unmarshalGLboolean ok
+      then do x <- peek xBuf
+              y <- peek yBuf
+              z <- peek zBuf
+              w <- peek wBuf
+              return $ Vertex4 x y z w
+      else do recordInvalidValue
+              return $ Vertex4 0 0 0 0
diff --git a/src/Graphics/Rendering/OpenGL/GLU/Mipmapping.hs b/src/Graphics/Rendering/OpenGL/GLU/Mipmapping.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GLU/Mipmapping.hs
@@ -0,0 +1,64 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GLU.Mipmapping
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to chapter 3 (Mipmapping) of the GLU specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GLU.Mipmapping (
+   scaleImage, build1DMipmaps, build2DMipmaps
+) where
+
+import Graphics.GLU
+import Graphics.Rendering.OpenGL.GL.CoordTrans ( Size(..) )
+import Graphics.Rendering.OpenGL.GL.Texturing.PixelInternalFormat
+import Graphics.Rendering.OpenGL.GL.PixelData ( PixelData, withPixelData )
+import Graphics.Rendering.OpenGL.GL.Texturing.TextureTarget
+import Graphics.Rendering.OpenGL.GLU.ErrorsInternal ( recordInvalidValue )
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+-- Section 3.1 (Image Scaling)
+
+scaleImage :: Size -> PixelData a -> Size -> PixelData b -> IO ()
+scaleImage (Size widthIn  heightIn)  pdIn (Size widthOut heightOut) pdOut =
+   withPixelData pdIn $ \fIn dIn pIn ->
+      withPixelData pdOut $ \fOut dOut pOut ->
+         if fIn == fOut
+            then do _ <- gluScaleImage
+                      fIn widthIn heightIn dIn pIn widthOut heightOut dOut pOut
+                    return ()   -- TODO: Should we use the return value?
+            else recordInvalidValue
+
+--------------------------------------------------------------------------------
+-- Section 3.2 (Automatic Mipmapping)
+-- Missing for GLU 1.3: gluBuild3DMipmaps, gluBuild{1,2,3}DMipmapLevels
+
+build1DMipmaps ::
+   TextureTarget1D -> PixelInternalFormat -> GLsizei -> PixelData a -> IO ()
+build1DMipmaps target internalFormat height pd = do
+   _ <- withPixelData pd $
+      gluBuild1DMipmaps
+         (marshalGettableTextureTarget target)
+         (marshalPixelInternalFormat internalFormat)
+         height
+   return ()   -- TODO: Should we use the return value?
+
+--------------------------------------------------------------------------------
+
+build2DMipmaps :: TextureTarget2D -> PixelInternalFormat -> GLsizei -> GLsizei
+               -> PixelData a -> IO ()
+build2DMipmaps target internalFormat width height pd = do
+   _ <- withPixelData pd $
+      gluBuild2DMipmaps
+         (marshalGettableTextureTarget target)
+         (marshalPixelInternalFormat internalFormat)
+         width height
+   return ()   -- TODO: Should we use the return value?
diff --git a/src/Graphics/Rendering/OpenGL/GLU/NURBS.hs b/src/Graphics/Rendering/OpenGL/GLU/NURBS.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GLU/NURBS.hs
@@ -0,0 +1,311 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GLU.NURBS
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to chapter 7 (NURBS) of the GLU specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GLU.NURBS (
+   NURBSObj, withNURBSObj,
+   NURBSBeginCallback, withNURBSBeginCallback,
+   NURBSVertexCallback, withNURBSVertexCallback,
+   NURBSNormalCallback, withNURBSNormalCallback,
+   NURBSColorCallback, withNURBSColorCallback,
+   NURBSEndCallback, withNURBSEndCallback,
+   checkForNURBSError,
+   nurbsBeginEndCurve, nurbsCurve,
+   nurbsBeginEndSurface, nurbsSurface,
+   TrimmingPoint, nurbsBeginEndTrim, pwlCurve, trimmingCurve,
+   NURBSMode(..), setNURBSMode,
+   setNURBSCulling,
+   SamplingMethod(..), setSamplingMethod,
+   loadSamplingMatrices,
+   DisplayMode'(..), setDisplayMode'
+) where
+
+import Control.Monad
+import Foreign.Marshal.Array
+import Foreign.Ptr
+import Foreign.Storable
+import Graphics.GLU hiding (
+   NURBSBeginCallback, NURBSVertexCallback, NURBSNormalCallback,
+   NURBSColorCallback, NURBSEndCallback )
+import Graphics.Rendering.OpenGL.GL.Tensor
+import Graphics.Rendering.OpenGL.GL.Capability
+import Graphics.Rendering.OpenGL.GL.ControlPoint
+import Graphics.Rendering.OpenGL.GL.CoordTrans
+import Graphics.Rendering.OpenGL.GL.Exception
+import Graphics.Rendering.OpenGL.GL.GLboolean
+import Graphics.Rendering.OpenGL.GL.PrimitiveMode
+import Graphics.Rendering.OpenGL.GL.PrimitiveModeInternal
+import Graphics.Rendering.OpenGL.GL.VertexSpec
+import Graphics.Rendering.OpenGL.GLU.ErrorsInternal
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+-- chapter 7.1: The NURBS Object
+
+-- an opaque pointer to a NURBS object
+type NURBSObj = Ptr GLUnurbs
+
+isNullNURBSObj :: NURBSObj -> Bool
+isNullNURBSObj = (nullPtr ==)
+
+withNURBSObj :: a -> (NURBSObj -> IO a) -> IO a
+withNURBSObj failureValue action =
+   bracket gluNewNurbsRenderer safeDeleteNurbsRenderer
+           (\nurbsObj -> if isNullNURBSObj nurbsObj
+                            then do recordOutOfMemory
+                                    return failureValue
+                            else action nurbsObj)
+
+safeDeleteNurbsRenderer :: NURBSObj -> IO ()
+safeDeleteNurbsRenderer nurbsObj =
+   unless (isNullNURBSObj nurbsObj) $ gluDeleteNurbsRenderer nurbsObj
+
+--------------------------------------------------------------------------------
+-- chapter 7.2: Callbacks (begin)
+
+type NURBSBeginCallback = PrimitiveMode -> IO ()
+
+withNURBSBeginCallback :: NURBSObj -> NURBSBeginCallback -> IO a -> IO a
+withNURBSBeginCallback nurbsObj beginCallback action =
+   bracket (makeNURBSBeginCallback (beginCallback . unmarshalPrimitiveMode))
+           freeHaskellFunPtr $ \callbackPtr -> do
+      gluNurbsCallback nurbsObj GLU_NURBS_BEGIN callbackPtr
+      action
+
+--------------------------------------------------------------------------------
+-- chapter 7.2: Callbacks (vertex)
+
+type NURBSVertexCallback = Vertex3 GLfloat -> IO ()
+
+withNURBSVertexCallback :: NURBSObj -> NURBSVertexCallback -> IO a -> IO a
+withNURBSVertexCallback nurbsObj vertexCallback action =
+   bracket (makeNURBSVertexCallback (\p -> peek (castPtr p) >>= vertexCallback))
+           freeHaskellFunPtr $ \callbackPtr -> do
+      gluNurbsCallback nurbsObj GLU_NURBS_VERTEX callbackPtr
+      action
+
+--------------------------------------------------------------------------------
+-- chapter 7.2: Callbacks (normal)
+
+type NURBSNormalCallback = Normal3 GLfloat -> IO ()
+
+withNURBSNormalCallback :: NURBSObj -> NURBSNormalCallback -> IO a -> IO a
+withNURBSNormalCallback nurbsObj normalCallback action =
+   bracket (makeNURBSNormalCallback (\p -> peek (castPtr p) >>= normalCallback))
+           freeHaskellFunPtr $ \callbackPtr -> do
+      gluNurbsCallback nurbsObj GLU_NURBS_NORMAL callbackPtr
+      action
+
+--------------------------------------------------------------------------------
+-- chapter 7.2: Callbacks (color)
+
+type NURBSColorCallback = Color4 GLfloat -> IO ()
+
+withNURBSColorCallback :: NURBSObj -> NURBSColorCallback -> IO a -> IO a
+withNURBSColorCallback nurbsObj colorCallback action =
+   bracket (makeNURBSColorCallback (\p -> peek (castPtr p) >>= colorCallback))
+           freeHaskellFunPtr $ \callbackPtr -> do
+      gluNurbsCallback nurbsObj GLU_NURBS_COLOR callbackPtr
+      action
+
+--------------------------------------------------------------------------------
+-- chapter 7.2: Callbacks (end)
+
+type NURBSEndCallback = IO ()
+
+withNURBSEndCallback :: NURBSObj -> NURBSEndCallback -> IO a -> IO a
+withNURBSEndCallback nurbsObj endCallback action =
+   bracket (makeNURBSEndCallback endCallback)
+           freeHaskellFunPtr $ \callbackPtr -> do
+      gluNurbsCallback nurbsObj GLU_NURBS_END callbackPtr
+      action
+
+--------------------------------------------------------------------------------
+-- chapter 7.2: Callbacks (error)
+
+type ErrorCallback = GLenum -> IO ()
+
+withErrorCallback :: NURBSObj -> ErrorCallback -> IO a -> IO a
+withErrorCallback nurbsObj errorCallback action =
+   bracket (makeNURBSErrorCallback errorCallback)
+           freeHaskellFunPtr $ \callbackPtr -> do
+      gluNurbsCallback nurbsObj GLU_NURBS_ERROR callbackPtr
+      action
+
+checkForNURBSError :: NURBSObj -> IO a -> IO a
+checkForNURBSError nurbsObj = withErrorCallback nurbsObj recordErrorCode
+
+--------------------------------------------------------------------------------
+-- chapter 7.3: NURBS Curves
+
+nurbsBeginEndCurve :: NURBSObj -> IO a -> IO a
+nurbsBeginEndCurve nurbsObj =
+   bracket_ (gluBeginCurve nurbsObj) (gluEndCurve nurbsObj)
+
+
+nurbsCurve :: ControlPoint c => NURBSObj -> GLint -> Ptr GLfloat -> GLint -> Ptr (c GLfloat) -> GLint -> IO ()
+nurbsCurve nurbsObj knotCount knots stride control order =
+   gluNurbsCurve nurbsObj knotCount knots stride (castPtr control) order (map1Target (pseudoPeek control))
+
+pseudoPeek :: Ptr (c GLfloat) -> c GLfloat
+pseudoPeek _ = undefined
+
+--------------------------------------------------------------------------------
+-- chapter 7.4: NURBS Surfaces
+
+nurbsBeginEndSurface :: NURBSObj -> IO a -> IO a
+nurbsBeginEndSurface nurbsObj =
+   bracket_ (gluBeginSurface nurbsObj) (gluEndSurface nurbsObj)
+
+
+nurbsSurface :: ControlPoint c => NURBSObj -> GLint -> Ptr GLfloat -> GLint -> Ptr GLfloat -> GLint -> GLint -> Ptr (c GLfloat) -> GLint -> GLint -> IO ()
+nurbsSurface nurbsObj sKnotCount sKnots tKnotCount tKnots sStride tStride control sOrder tOrder =
+   gluNurbsSurface nurbsObj sKnotCount sKnots tKnotCount tKnots sStride tStride (castPtr control) sOrder tOrder (map2Target (pseudoPeek control))
+
+--------------------------------------------------------------------------------
+-- chapter 7.5: Trimming
+
+class TrimmingPoint p where
+   trimmingTarget :: p GLfloat -> GLenum
+
+instance TrimmingPoint Vertex2 where
+   trimmingTarget = const GLU_MAP1_TRIM_2
+
+instance TrimmingPoint Vertex3 where
+   trimmingTarget = const GLU_MAP1_TRIM_3
+
+nurbsBeginEndTrim :: NURBSObj -> IO a -> IO a
+nurbsBeginEndTrim nurbsObj =
+   bracket_ (gluBeginTrim nurbsObj) (gluEndTrim nurbsObj)
+
+pwlCurve :: TrimmingPoint p => NURBSObj -> GLint -> Ptr (p GLfloat) -> GLint -> IO ()
+pwlCurve nurbsObj count points stride =
+   gluPwlCurve nurbsObj count (castPtr points) stride (trimmingTarget (pseudoPeek points))
+
+trimmingCurve :: TrimmingPoint c => NURBSObj -> GLint -> Ptr GLfloat -> GLint -> Ptr (c GLfloat) -> GLint -> IO ()
+trimmingCurve nurbsObj knotCount knots stride control order =
+   gluNurbsCurve nurbsObj knotCount knots stride (castPtr control) order (trimmingTarget (pseudoPeek control))
+
+--------------------------------------------------------------------------------
+
+data NURBSMode =
+     NURBSTessellator
+   | NURBSRenderer
+   deriving ( Eq, Ord, Show )
+
+marshalNURBSMode :: NURBSMode -> GLfloat
+marshalNURBSMode x = fromIntegral $ case x of
+   NURBSTessellator -> GLU_NURBS_TESSELLATOR
+   NURBSRenderer -> GLU_NURBS_RENDERER
+
+setNURBSMode :: NURBSObj -> NURBSMode -> IO ()
+setNURBSMode nurbsObj = gluNurbsProperty nurbsObj GLU_NURBS_MODE . marshalNURBSMode
+
+--------------------------------------------------------------------------------
+
+setNURBSCulling :: NURBSObj -> Capability -> IO ()
+setNURBSCulling nurbsObj = gluNurbsProperty nurbsObj GLU_CULLING . fromIntegral . marshalCapability
+
+--------------------------------------------------------------------------------
+
+data SamplingMethod' =
+     PathLength'
+   | ParametricError'
+   | DomainDistance'
+   | ObjectPathLength'
+   | ObjectParametricError'
+
+marshalSamplingMethod' :: SamplingMethod' -> GLfloat
+marshalSamplingMethod' x = fromIntegral $ case x of
+   PathLength' -> GLU_PATH_LENGTH
+   ParametricError' -> GLU_PARAMETRIC_TOLERANCE
+   DomainDistance' -> GLU_DOMAIN_DISTANCE
+   ObjectPathLength' -> GLU_OBJECT_PATH_LENGTH
+   ObjectParametricError' -> GLU_OBJECT_PARAMETRIC_ERROR
+
+setSamplingMethod' :: NURBSObj -> SamplingMethod' -> IO ()
+setSamplingMethod' nurbsObj = gluNurbsProperty nurbsObj GLU_SAMPLING_METHOD . marshalSamplingMethod'
+
+--------------------------------------------------------------------------------
+
+data SamplingMethod =
+     PathLength GLfloat
+   | ParametricError GLfloat
+   | DomainDistance GLfloat GLfloat
+   | ObjectPathLength GLfloat
+   | ObjectParametricError GLfloat
+   deriving ( Eq, Ord, Show )
+
+setSamplingMethod :: NURBSObj -> SamplingMethod -> IO ()
+setSamplingMethod nurbsObj x = case x of
+   PathLength s -> do
+      gluNurbsProperty nurbsObj GLU_SAMPLING_TOLERANCE s
+      setSamplingMethod' nurbsObj PathLength'
+   ParametricError p -> do
+      gluNurbsProperty nurbsObj GLU_PARAMETRIC_TOLERANCE p
+      setSamplingMethod' nurbsObj ParametricError'
+   DomainDistance u v -> do
+      gluNurbsProperty nurbsObj GLU_U_STEP u
+      gluNurbsProperty nurbsObj GLU_V_STEP v
+      setSamplingMethod' nurbsObj DomainDistance'
+   ObjectPathLength s -> do
+      gluNurbsProperty nurbsObj GLU_SAMPLING_TOLERANCE s
+      setSamplingMethod' nurbsObj ObjectPathLength'
+   ObjectParametricError p -> do
+      gluNurbsProperty nurbsObj GLU_PARAMETRIC_TOLERANCE p
+      setSamplingMethod' nurbsObj ObjectParametricError'
+
+--------------------------------------------------------------------------------
+
+setAutoLoadMatrix :: NURBSObj -> Bool -> IO ()
+setAutoLoadMatrix nurbsObj = gluNurbsProperty nurbsObj GLU_AUTO_LOAD_MATRIX . marshalGLboolean
+
+loadSamplingMatrices :: (Matrix m1, Matrix m2) => NURBSObj -> Maybe (m1 GLfloat, m2 GLfloat, (Position, Size)) -> IO ()
+loadSamplingMatrices nurbsObj =
+   maybe
+      (setAutoLoadMatrix nurbsObj True)
+      (\(mv, proj, (Position x y, Size w h)) -> do
+          withMatrixColumnMajor mv $ \mvBuf ->
+             withMatrixColumnMajor proj $ \projBuf ->
+                withArray [x, y, fromIntegral w, fromIntegral h] $ \viewportBuf ->
+                  gluLoadSamplingMatrices nurbsObj mvBuf projBuf viewportBuf
+          setAutoLoadMatrix nurbsObj False)
+
+withMatrixColumnMajor :: (Matrix m, MatrixComponent c) => m c -> (Ptr c -> IO a) -> IO a
+withMatrixColumnMajor mat act =
+   withMatrix mat $ \order p ->
+      if order == ColumnMajor
+         then act p
+         else do
+            elems <- mapM (peekElemOff p) [ 0, 4,  8, 12,
+                                            1, 5,  9, 13,
+                                            2, 6, 10, 14,
+                                            3, 7, 11, 15 ]
+            withArray elems act
+
+--------------------------------------------------------------------------------
+
+data DisplayMode' =
+     Fill'
+   | OutlinePolygon
+   | OutlinePatch
+   deriving ( Eq, Ord, Show )
+
+marshalDisplayMode' :: DisplayMode' -> GLfloat
+marshalDisplayMode' x = fromIntegral $ case x of
+   Fill' -> GLU_FILL
+   OutlinePolygon -> GLU_OUTLINE_POLYGON
+   OutlinePatch -> GLU_OUTLINE_PATCH
+
+setDisplayMode' :: NURBSObj -> DisplayMode' -> IO ()
+setDisplayMode' nurbsObj = gluNurbsProperty nurbsObj GLU_DISPLAY_MODE . marshalDisplayMode'
diff --git a/src/Graphics/Rendering/OpenGL/GLU/Quadrics.hs b/src/Graphics/Rendering/OpenGL/GLU/Quadrics.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GLU/Quadrics.hs
@@ -0,0 +1,155 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GLU.Quadrics
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+-- 
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to chapter 6 (Quadrics) of the GLU specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GLU.Quadrics (
+   QuadricNormal, QuadricTexture(..), QuadricOrientation(..),
+   QuadricDrawStyle(..), QuadricStyle(..),
+   Radius, Height, Angle, Slices, Stacks, Loops, QuadricPrimitive(..),
+   renderQuadric
+) where
+
+import Control.Monad ( unless )
+import Foreign.Ptr ( Ptr, nullPtr, freeHaskellFunPtr )
+import Graphics.GLU
+import Graphics.Rendering.OpenGL.GL.Colors ( ShadingModel(Smooth,Flat) )
+import Graphics.Rendering.OpenGL.GL.Exception ( bracket )
+import Graphics.Rendering.OpenGL.GL.GLboolean ( marshalGLboolean )
+import Graphics.Rendering.OpenGL.GLU.ErrorsInternal (
+   recordErrorCode, recordOutOfMemory )
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+data QuadricDrawStyle =
+     PointStyle
+   | LineStyle
+   | FillStyle
+   | SilhouetteStyle
+   deriving ( Eq, Ord, Show )
+
+marshalQuadricDrawStyle :: QuadricDrawStyle -> GLenum
+marshalQuadricDrawStyle x = case x of
+   PointStyle -> GLU_POINT
+   LineStyle -> GLU_LINE
+   FillStyle -> GLU_FILL
+   SilhouetteStyle -> GLU_SILHOUETTE
+
+--------------------------------------------------------------------------------
+
+type QuadricNormal = Maybe ShadingModel
+
+marshalQuadricNormal :: QuadricNormal -> GLenum
+marshalQuadricNormal (Just Smooth) = GLU_SMOOTH
+marshalQuadricNormal (Just Flat  ) = GLU_FLAT
+marshalQuadricNormal Nothing       = GLU_NONE
+
+--------------------------------------------------------------------------------
+
+data QuadricOrientation =
+     Outside
+   | Inside
+   deriving ( Eq, Ord, Show )
+
+marshalQuadricOrientation :: QuadricOrientation -> GLenum
+marshalQuadricOrientation x = case x of
+   Outside -> GLU_OUTSIDE
+   Inside -> GLU_INSIDE
+
+--------------------------------------------------------------------------------
+
+data QuadricTexture
+   = NoTextureCoordinates
+   | GenerateTextureCoordinates
+   deriving ( Eq,Ord )
+
+marshalQuadricTexture :: QuadricTexture -> GLboolean
+marshalQuadricTexture NoTextureCoordinates       = marshalGLboolean False
+marshalQuadricTexture GenerateTextureCoordinates = marshalGLboolean True
+
+--------------------------------------------------------------------------------
+
+data QuadricStyle
+   = QuadricStyle QuadricNormal
+                  QuadricTexture
+                  QuadricOrientation
+                  QuadricDrawStyle
+   deriving ( Eq,Ord )
+
+--------------------------------------------------------------------------------
+
+type Radius = GLdouble
+type Height = GLdouble
+type Angle  = GLdouble
+type Slices = GLint
+type Stacks = GLint
+type Loops  = GLint
+
+--------------------------------------------------------------------------------
+
+data QuadricPrimitive
+   = Sphere Radius Slices Stacks
+   | Cylinder Radius Radius Height Slices Stacks
+   | Disk Radius Radius Slices Loops
+   | PartialDisk Radius Radius Slices Loops Angle Angle
+   deriving ( Eq, Ord )
+
+--------------------------------------------------------------------------------
+
+renderQuadric :: QuadricStyle -> QuadricPrimitive -> IO ()
+renderQuadric style prim = do
+   withQuadricObj recordOutOfMemory $ \quadricObj ->
+      withErrorCallback quadricObj recordErrorCode $ do
+         setStyle quadricObj style
+         renderPrimitive quadricObj prim
+
+withQuadricObj :: IO a -> (QuadricObj -> IO a) -> IO a
+withQuadricObj failure success =
+   bracket gluNewQuadric safeDeleteQuadric
+           (\quadricObj -> if isNullQuadricObj quadricObj
+                              then failure
+                              else success quadricObj)
+
+safeDeleteQuadric :: QuadricObj -> IO ()
+safeDeleteQuadric quadricObj =
+   unless (isNullQuadricObj quadricObj) $ gluDeleteQuadric quadricObj
+
+withErrorCallback :: QuadricObj -> QuadricCallback -> IO a -> IO a
+withErrorCallback quadricObj callback action =
+   bracket (makeQuadricCallback callback) freeHaskellFunPtr $ \callbackPtr -> do
+      gluQuadricCallback quadricObj GLU_ERROR callbackPtr
+      action
+
+setStyle :: QuadricObj -> QuadricStyle -> IO ()
+setStyle quadricObj (QuadricStyle n t o d) = do
+   gluQuadricNormals     quadricObj (marshalQuadricNormal      n)
+   gluQuadricTexture     quadricObj (marshalQuadricTexture     t)
+   gluQuadricOrientation quadricObj (marshalQuadricOrientation o)
+   gluQuadricDrawStyle   quadricObj (marshalQuadricDrawStyle   d)
+
+renderPrimitive :: QuadricObj -> QuadricPrimitive -> IO ()
+renderPrimitive quadricObj (Sphere r s n) =
+   gluSphere quadricObj r s n
+renderPrimitive quadricObj (Cylinder b t h s n) =
+   gluCylinder quadricObj b t h s n
+renderPrimitive quadricObj (Disk i o s l) =
+   gluDisk quadricObj i o s l
+renderPrimitive quadricObj (PartialDisk i o s l a w) =
+   gluPartialDisk quadricObj i o s l a w
+
+--------------------------------------------------------------------------------
+
+type QuadricObj = Ptr GLUquadric
+
+isNullQuadricObj :: QuadricObj -> Bool
+isNullQuadricObj = (nullPtr ==)
diff --git a/src/Graphics/Rendering/OpenGL/GLU/Tessellation.hs b/src/Graphics/Rendering/OpenGL/GLU/Tessellation.hs
new file mode 100644
--- /dev/null
+++ b/src/Graphics/Rendering/OpenGL/GLU/Tessellation.hs
@@ -0,0 +1,521 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.Rendering.OpenGL.GLU.Tessellation
+-- Copyright   :  (c) Sven Panne 2002-2019
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This module corresponds to chapter 5 (Polygon Tessellation) of the GLU specs.
+--
+--------------------------------------------------------------------------------
+
+module Graphics.Rendering.OpenGL.GLU.Tessellation (
+   -- * Polygon description
+   AnnotatedVertex(..), ComplexContour(..), ComplexPolygon(..),
+
+   -- * Combining vertices
+   WeightedProperties(..), Combiner,
+
+   -- * Tessellation parameters
+   TessWinding(..), Tolerance,
+
+   -- * Tessellator type
+   Tessellator,
+
+   -- * Contour extraction
+   SimpleContour(..), PolygonContours(..), extractContours,
+
+   -- * Triangulation
+   TriangleVertex, Triangle(..), Triangulation(..), triangulate,
+
+   -- * Tessellation into primitives
+   Primitive(..), SimplePolygon(..), tessellate
+) where
+
+import Control.Monad ( foldM_, unless )
+import Data.IORef ( newIORef, readIORef, writeIORef, modifyIORef )
+import Data.Maybe ( fromJust, fromMaybe )
+import Foreign.Marshal.Alloc ( allocaBytes )
+import Foreign.Marshal.Array ( peekArray, pokeArray )
+import Foreign.Marshal.Pool ( Pool, withPool, pooledNew )
+import Foreign.Ptr ( Ptr, nullPtr, plusPtr, castPtr, freeHaskellFunPtr )
+import Foreign.Storable ( Storable(..) )
+import Graphics.GLU
+import Graphics.Rendering.OpenGL.GL.Tensor
+import Graphics.Rendering.OpenGL.GL.EdgeFlag ( unmarshalEdgeFlag )
+import Graphics.Rendering.OpenGL.GL.Exception ( bracket )
+import Graphics.Rendering.OpenGL.GL.GLboolean ( marshalGLboolean )
+import Graphics.Rendering.OpenGL.GL.PrimitiveMode ( PrimitiveMode )
+import Graphics.Rendering.OpenGL.GL.PrimitiveModeInternal ( unmarshalPrimitiveMode )
+import Graphics.Rendering.OpenGL.GL.BeginEnd ( EdgeFlag(BeginsInteriorEdge) )
+import Graphics.Rendering.OpenGL.GL.VertexSpec
+import Graphics.Rendering.OpenGL.GL.QueryUtils
+import Graphics.Rendering.OpenGL.GLU.ErrorsInternal
+import Graphics.GL
+
+--------------------------------------------------------------------------------
+
+data TessWinding =
+     TessWindingOdd
+   | TessWindingNonzero
+   | TessWindingPositive
+   | TessWindingNegative
+   | TessWindingAbsGeqTwo
+   deriving ( Eq, Ord, Show )
+
+marshalTessWinding :: TessWinding -> GLenum
+marshalTessWinding x = case x of
+   TessWindingOdd -> GLU_TESS_WINDING_ODD
+   TessWindingNonzero -> GLU_TESS_WINDING_NONZERO
+   TessWindingPositive -> GLU_TESS_WINDING_POSITIVE
+   TessWindingNegative -> GLU_TESS_WINDING_NEGATIVE
+   TessWindingAbsGeqTwo -> GLU_TESS_WINDING_ABS_GEQ_TWO
+
+--------------------------------------------------------------------------------
+
+-- | The basic building block in tessellation is a 3D vertex with an associated
+-- property, e.g. color, texture coordinates, etc.
+
+data AnnotatedVertex v = AnnotatedVertex (Vertex3 GLdouble) v
+   deriving ( Eq, Ord )
+
+offsetOfProperty :: Storable v => v -> Int
+offsetOfProperty v = alignOffset v (3 * sizeOf x)
+   where AnnotatedVertex (Vertex3 x _ _) _ = undefined
+
+alignOffset :: Storable a => a -> Int -> Int
+alignOffset x offset = n - (n `mod` a)
+   where a = alignment x
+         n = a + offset - 1
+
+instance Storable v => Storable (AnnotatedVertex v) where
+
+   sizeOf ~(AnnotatedVertex (Vertex3 x _ _) v) =
+      alignOffset x (sizeOf v + offsetOfProperty v)
+
+   alignment ~(AnnotatedVertex (Vertex3 x _ _) _) =
+      alignment x
+
+   peek ptr = do
+      x <- peekElemOff (castPtr ptr) 0
+      y <- peekElemOff (castPtr ptr) 1
+      z <- peekElemOff (castPtr ptr) 2
+      let dummyElement :: Ptr (AnnotatedVertex v) -> v
+          dummyElement = undefined
+      v <- peekByteOff (castPtr ptr) (offsetOfProperty (dummyElement ptr))
+      return $ AnnotatedVertex (Vertex3 x y z) v
+
+   poke ptr (AnnotatedVertex (Vertex3 x y z) v) = do
+      pokeElemOff (castPtr ptr) 0 x
+      pokeElemOff (castPtr ptr) 1 y
+      pokeElemOff (castPtr ptr) 2 z
+      pokeByteOff (castPtr ptr) (offsetOfProperty v) v
+
+--------------------------------------------------------------------------------
+
+-- | A complex contour, which can be self-intersecting and\/or concave.
+
+newtype ComplexContour v = ComplexContour [AnnotatedVertex v]
+   deriving ( Eq, Ord )
+
+sizeOfComplexContour :: Storable v => ComplexContour v -> Int
+sizeOfComplexContour (ComplexContour vs) =
+   length vs * sizeOf (head vs)
+
+pokeComplexContour ::
+   Storable v => Ptr (ComplexContour v) -> ComplexContour v -> IO ()
+pokeComplexContour ptr (ComplexContour vs) =
+   pokeArray (castPtr ptr) vs
+
+--------------------------------------------------------------------------------
+
+-- | A complex (possibly concave) polygon, represented by one or more complex
+-- and possibly intersecting contours.
+
+newtype ComplexPolygon v = ComplexPolygon [ComplexContour v]
+   deriving ( Eq, Ord )
+
+sizeOfComplexPolygon :: Storable v => ComplexPolygon v -> Int
+sizeOfComplexPolygon (ComplexPolygon complexContours) =
+   sum (map sizeOfComplexContour complexContours)
+
+pokeComplexPolygon ::
+   Storable v => Ptr (ComplexPolygon v) -> ComplexPolygon v -> IO ()
+pokeComplexPolygon ptr (ComplexPolygon complexContours) =
+   foldM_ pokeAndAdvance (castPtr ptr) complexContours >> return ()
+   where pokeAndAdvance p complexContour = do
+            pokeComplexContour p complexContour
+            return $ p `plusPtr` sizeOfComplexContour complexContour
+
+withComplexPolygon ::
+   Storable v => ComplexPolygon v -> (Ptr (ComplexPolygon v) -> IO a) -> IO a
+withComplexPolygon complexPolygon f =
+   allocaBytes (sizeOfComplexPolygon complexPolygon) $ \ptr -> do
+      pokeComplexPolygon ptr complexPolygon
+      f ptr
+
+--------------------------------------------------------------------------------
+
+-- | Four vertex properties (cf. 'AnnotatedVertex') with associated weigths
+-- summing up to 1.0.
+
+data WeightedProperties v
+   = WeightedProperties (GLfloat, v)
+                        (GLfloat, v)
+                        (GLfloat, v)
+                        (GLfloat, v)
+   deriving ( Eq, Ord )
+
+-- | A function combining given vertex properties into a property for a newly
+-- generated vertex
+
+type Combiner v
+    = Vertex3 GLdouble
+   -> WeightedProperties v
+   -> v
+
+--------------------------------------------------------------------------------
+
+-- | The relative tolerance under which two vertices can be combined (see
+-- 'Combiner'). Multiplication with the largest coordinate magnitude of all
+-- polygon vertices yields the maximum distance between two mergeable vertices.
+--
+-- Note that merging is optional and the tolerance is only a hint.
+
+type Tolerance = GLdouble
+
+--------------------------------------------------------------------------------
+
+-- | A general tessellator type.
+--
+-- Before tessellation of a complex polygon, all its vertices are projected into
+-- a plane perpendicular to the given normal. If the given normal is
+-- @Normal3 0 0 0@, a fitting plane of all vertices is used.
+
+type Tessellator p v
+   = TessWinding
+  -> Tolerance
+  -> Normal3 GLdouble
+  -> Combiner v
+  -> ComplexPolygon v
+  -> IO (p v)
+
+--------------------------------------------------------------------------------
+
+-- | A simple, non-self-intersecting contour
+
+newtype SimpleContour v = SimpleContour [AnnotatedVertex v]
+   deriving ( Eq, Ord )
+
+-- | The contours of a complex polygon, represented by one or more
+-- non-intersecting simple contours
+
+newtype PolygonContours v = PolygonContours [SimpleContour v]
+   deriving ( Eq, Ord )
+
+extractContours :: Storable v => Tessellator PolygonContours v
+extractContours windingRule tolerance theNormal combiner complexPoly = do
+
+   vertices <- newIORef []
+   let addVertex v = modifyIORef vertices (v:)
+
+   contours <- newIORef []
+   let finishContour = do
+          vs <- readIORef vertices
+          writeIORef vertices []
+          modifyIORef contours (SimpleContour (reverse vs) :)
+
+       getContours = fmap (PolygonContours . reverse) (readIORef contours)
+
+   withTessellatorObj (PolygonContours [])$ \tessObj -> do
+      setTessellatorProperties tessObj windingRule tolerance theNormal True
+      withVertexCallback tessObj addVertex $
+         withEndCallback tessObj finishContour $
+            checkForError tessObj $
+               withCombineCallback tessObj combiner $ do
+                  defineComplexPolygon tessObj complexPoly
+                  getContours
+
+--------------------------------------------------------------------------------
+
+-- | A triangle vertex with additional information about the edge it begins
+
+type TriangleVertex v = AnnotatedVertex (v,EdgeFlag)
+
+-- | A triangle, represented by three triangle vertices
+
+data Triangle v
+   = Triangle (TriangleVertex v) (TriangleVertex v) (TriangleVertex v)
+   deriving ( Eq, Ord )
+
+-- | A triangulation of a complex polygon
+
+newtype Triangulation v = Triangulation [Triangle v]
+   deriving ( Eq, Ord )
+
+triangulate :: Storable v => Tessellator Triangulation v
+triangulate windingRule tolerance theNormal combiner complexPoly = do
+
+   edgeFlagState <- newIORef BeginsInteriorEdge
+   let registerEdgeFlag = writeIORef edgeFlagState
+
+   vertices <- newIORef []
+   let addVertex (AnnotatedVertex xyz v) = do
+          ef <- readIORef edgeFlagState
+          modifyIORef vertices (AnnotatedVertex xyz (v,ef) :)
+
+       getTriangulation = do
+          vs <- readIORef vertices
+          return $ Triangulation (collectTriangles (reverse vs))
+
+   withTessellatorObj (Triangulation []) $ \tessObj -> do
+      setTessellatorProperties tessObj windingRule tolerance theNormal False
+      withEdgeFlagCallback tessObj registerEdgeFlag $
+         withVertexCallback tessObj addVertex $
+            checkForError tessObj $
+               withCombineCallback tessObj combiner $ do
+                  defineComplexPolygon tessObj complexPoly
+                  getTriangulation
+
+collectTriangles :: [TriangleVertex v] -> [Triangle v]
+collectTriangles []           = []
+collectTriangles (a:b:c:rest) = Triangle a b c : collectTriangles rest
+collectTriangles _            = error "triangles left"
+
+--------------------------------------------------------------------------------
+
+data Primitive v = Primitive PrimitiveMode [AnnotatedVertex v]
+   deriving ( Eq, Ord )
+
+newtype SimplePolygon v = SimplePolygon [Primitive v]
+   deriving ( Eq, Ord )
+
+tessellate :: Storable v => Tessellator SimplePolygon v
+tessellate windingRule tolerance theNormal combiner complexPoly = do
+
+   beginModeState <- newIORef undefined
+   let setPrimitiveMode = writeIORef beginModeState
+
+   vertices <- newIORef []
+   let addVertex v = modifyIORef vertices (v:)
+
+   primitives <- newIORef []
+   let finishPrimitive = do
+          beginMode <- readIORef beginModeState
+          vs <- readIORef vertices
+          writeIORef vertices []
+          modifyIORef primitives (Primitive beginMode (reverse vs) :)
+
+       getSimplePolygon = fmap (SimplePolygon . reverse) (readIORef primitives)
+
+   withTessellatorObj (SimplePolygon []) $ \tessObj -> do
+      setTessellatorProperties tessObj windingRule tolerance theNormal False
+      withBeginCallback tessObj setPrimitiveMode $
+         withVertexCallback tessObj addVertex $
+            withEndCallback tessObj finishPrimitive $
+               checkForError tessObj $
+                  withCombineCallback tessObj combiner $ do
+                     defineComplexPolygon tessObj complexPoly
+                     getSimplePolygon
+
+--------------------------------------------------------------------------------
+-- chapter 5.1: The Tessellation Object
+
+-- an opaque pointer to a tessellator object
+type TessellatorObj = Ptr GLUtesselator
+
+isNullTesselatorObj :: TessellatorObj -> Bool
+isNullTesselatorObj = (nullPtr ==)
+
+withTessellatorObj :: a -> (TessellatorObj -> IO a) -> IO a
+withTessellatorObj failureValue action =
+   bracket gluNewTess safeDeleteTess
+           (\tessObj -> if isNullTesselatorObj tessObj
+                           then do recordOutOfMemory
+                                   return failureValue
+                           else action tessObj)
+
+safeDeleteTess :: TessellatorObj -> IO ()
+safeDeleteTess tessObj =
+   unless (isNullTesselatorObj tessObj) $ gluDeleteTess tessObj
+
+--------------------------------------------------------------------------------
+-- chapter 5.2: Polygon Definition (polygons)
+
+defineComplexPolygon ::
+   Storable v => TessellatorObj -> ComplexPolygon v -> IO ()
+defineComplexPolygon tessObj cp@(ComplexPolygon complexContours) =
+   withComplexPolygon cp $ \ptr ->
+      tessBeginEndPolygon tessObj nullPtr $
+         let loop _ []     = return ()
+             loop p (c:cs) = do defineComplexContour tessObj (castPtr p) c
+                                loop (p `plusPtr` sizeOfComplexContour c) cs
+         in loop ptr complexContours
+
+tessBeginEndPolygon :: TessellatorObj -> Ptr p -> IO a -> IO a
+tessBeginEndPolygon tessObj ptr f = do
+   gluTessBeginPolygon tessObj ptr
+   res <- f
+   gluTessEndPolygon tessObj
+   return res
+
+--------------------------------------------------------------------------------
+-- chapter 5.2: Polygon Definition (contours)
+
+defineComplexContour ::
+   Storable v =>
+   TessellatorObj -> Ptr (ComplexContour v) -> ComplexContour v -> IO ()
+defineComplexContour tessObj ptr (ComplexContour annotatedVertices) =
+   tessBeginEndContour tessObj $
+         let loop _ []     = return ()
+             loop p (v:vs) = do defineVertex tessObj (castPtr p)
+                                loop (p `plusPtr` sizeOf v) vs
+         in loop ptr annotatedVertices
+
+tessBeginEndContour :: TessellatorObj -> IO a -> IO a
+tessBeginEndContour tessObj f = do
+   gluTessBeginContour tessObj
+   res <- f
+   gluTessEndContour tessObj
+   return res
+
+--------------------------------------------------------------------------------
+-- chapter 5.2: Polygon Definition (vertices)
+
+defineVertex :: TessellatorObj -> Ptr (AnnotatedVertex v) -> IO ()
+defineVertex tessObj ptr = gluTessVertex tessObj (castPtr ptr) ptr
+
+--------------------------------------------------------------------------------
+-- chapter 5.3: Callbacks (begin)
+
+type BeginCallback  = PrimitiveMode -> IO ()
+
+withBeginCallback :: TessellatorObj -> BeginCallback -> IO a -> IO a
+withBeginCallback tessObj beginCallback action =
+   bracket (makeTessBeginCallback (beginCallback . unmarshalPrimitiveMode))
+           freeHaskellFunPtr $ \callbackPtr -> do
+      gluTessCallback tessObj GLU_TESS_BEGIN callbackPtr
+      action
+
+--------------------------------------------------------------------------------
+-- chapter 5.3: Callbacks (edgeFlag)
+
+type EdgeFlagCallback  = EdgeFlag -> IO ()
+
+withEdgeFlagCallback :: TessellatorObj -> EdgeFlagCallback -> IO a -> IO a
+withEdgeFlagCallback tessObj edgeFlagCallback action =
+   bracket (makeTessEdgeFlagCallback (edgeFlagCallback . unmarshalEdgeFlag))
+           freeHaskellFunPtr $ \callbackPtr -> do
+      gluTessCallback tessObj GLU_TESS_EDGE_FLAG callbackPtr
+      action
+
+--------------------------------------------------------------------------------
+-- chapter 5.3: Callbacks (vertex)
+
+type VertexCallback v = AnnotatedVertex v -> IO ()
+
+withVertexCallback ::
+   Storable v => TessellatorObj -> VertexCallback v -> IO a -> IO a
+withVertexCallback tessObj vertexCallback action =
+   bracket (makeTessVertexCallback (\p -> peek p >>= vertexCallback))
+           freeHaskellFunPtr $ \callbackPtr -> do
+      gluTessCallback tessObj GLU_TESS_VERTEX callbackPtr
+      action
+
+--------------------------------------------------------------------------------
+-- chapter 5.3: Callbacks (end)
+
+type EndCallback  = IO ()
+
+withEndCallback :: TessellatorObj -> EndCallback -> IO a -> IO a
+withEndCallback tessObj endCallback action =
+   bracket (makeTessEndCallback endCallback) freeHaskellFunPtr $ \callbackPtr -> do
+      gluTessCallback tessObj GLU_TESS_END callbackPtr
+      action
+
+--------------------------------------------------------------------------------
+-- chapter 5.3: Callbacks (error)
+
+type ErrorCallback = GLenum -> IO ()
+
+withErrorCallback :: TessellatorObj -> ErrorCallback -> IO a -> IO a
+withErrorCallback tessObj errorCallback action =
+   bracket (makeTessErrorCallback errorCallback)
+           freeHaskellFunPtr $ \callbackPtr -> do
+      gluTessCallback tessObj GLU_TESS_ERROR callbackPtr
+      action
+
+checkForError :: TessellatorObj -> IO a -> IO a
+checkForError tessObj = withErrorCallback tessObj recordErrorCode
+
+--------------------------------------------------------------------------------
+-- chapter 5.3: Callbacks (combine)
+
+type CombineCallback v =
+      Ptr GLdouble
+   -> Ptr (Ptr (AnnotatedVertex v))
+   -> Ptr GLfloat
+   -> Ptr (Ptr (AnnotatedVertex v))
+   -> IO ()
+
+withCombineCallback ::
+   Storable v => TessellatorObj -> Combiner v -> IO a -> IO a
+withCombineCallback tessObj combiner action =
+   withPool $ \vertexPool ->
+      bracket (makeTessCombineCallback (combineProperties vertexPool combiner))
+              freeHaskellFunPtr $ \callbackPtr -> do
+         gluTessCallback tessObj GLU_TESS_COMBINE callbackPtr
+         action
+
+-- NOTE: SGI's tesselator has a bug, sometimes passing NULL for the last two
+-- vertices instead of valid vertex data, so we have to work around this. We
+-- just pass the first vertex in these cases, which is OK, because the
+-- corresponding weight is 0.
+combineProperties :: Storable v => Pool -> Combiner v -> CombineCallback v
+combineProperties pool combiner newVertexPtr propertyPtrs weights result = do
+   newVertex <- peek (castPtr newVertexPtr :: Ptr (Vertex3 GLdouble))
+   [v0, v1, v2, v3] <- mapM (getProperty propertyPtrs) [0..3]
+   [w0, w1, w2, w3] <- peekArray 4 weights
+   let defaultProperty = fromJust v0
+       f = fromMaybe defaultProperty
+       wp = WeightedProperties (w0, f v0) (w1, f v1) (w2, f v2) (w3, f v3)
+       av = AnnotatedVertex newVertex (combiner newVertex wp)
+   poke result =<< pooledNew pool av
+
+getProperty :: Storable v => Ptr (Ptr (AnnotatedVertex v)) -> Int -> IO (Maybe v)
+getProperty propertyPtrs n = peekElemOff propertyPtrs n >>=
+                             maybeNullPtr (return Nothing) peekProperty
+
+peekProperty :: Storable v => Ptr (AnnotatedVertex v) -> IO (Maybe v)
+peekProperty ptr = do
+   AnnotatedVertex _ v <- peek ptr
+   return (Just v)
+
+--------------------------------------------------------------------------------
+-- chapter 5.4: Control over Tessellation
+
+setTessellatorProperties ::
+    TessellatorObj -> TessWinding -> Tolerance -> Normal3 GLdouble -> Bool
+ -> IO ()
+setTessellatorProperties tessObj windingRule tolerance theNormal boundaryOnly = do
+   setWindingRule tessObj windingRule
+   setTolerance tessObj tolerance
+   setNormal tessObj theNormal
+   setBoundaryOnly tessObj boundaryOnly
+
+setWindingRule :: TessellatorObj -> TessWinding -> IO ()
+setWindingRule tessObj =
+   gluTessProperty tessObj GLU_TESS_WINDING_RULE . fromIntegral . marshalTessWinding
+
+setBoundaryOnly :: TessellatorObj -> Bool -> IO ()
+setBoundaryOnly tessObj =
+   gluTessProperty tessObj GLU_TESS_BOUNDARY_ONLY . marshalGLboolean
+
+setTolerance :: TessellatorObj -> Tolerance -> IO ()
+setTolerance tessObj = gluTessProperty tessObj GLU_TESS_TOLERANCE
+
+setNormal :: TessellatorObj -> Normal3 GLdouble -> IO ()
+setNormal tessObj (Normal3 x y z) = gluTessNormal tessObj x y z
