Typesafe functional GPU graphics programming

Version on this page:2.2.3
LTS Haskell 11.22:2.2.3
Stackage Nightly 2018-03-12:2.2.3
Latest on Hackage:2.2.5

See all snapshots GPipe appears in

MIT licensed and maintained by Tobias Bexelius
This version can be pinned in stack with:GPipe-2.2.3@sha256:c27f67e04ca4e1b1be0d751ff264b483a7db7e9766872b1e1b2afacbaaa1d014,2798

A typesafe API based on the conceptual model of OpenGl, but without the imperative state machine. Aims to be as close to the raw OpenGl performance as possible, without compromising type safety or functional style. Includes DSL for shaders to provide type safety even when crossing into that domain. Uses OpenGl 3.3 core profile under the hood.



  • Removing an unnecessary optimization that was broken since 2.2


  • Support for GHC 8.2.1 (#52)
  • Fixing errors with hidden contexts
  • Fixing GLSL link error on subtracting a negative constant (#55)
  • Fixing GLSL ambiguous overload with “clamp” (#51)
  • Adding atan2’ (#44)


  • Render monad would crash if using deleted windows, when that should be a no-op. (#41).
  • Manually deleting last visible window causes objects to be deleted (#42).


  • Windows are now explicit objects dynamically created and deleted with newWindow and deleteWindow, and are sent as parameter to drawWindowColor et al. (#18)
  • Each window created can now take their own window manager specific parameters (#19)
  • Update to GHC 8.0.2 and gl-0.8.0 (#38)


  • Update dependencies to make it build with stack resolver nightly-2016-09-24


  • Runtime optimizations (Use BaseVertex for glDraw* instead of offsetting each attribute)


  • Adding support for normal Floats, Int32s and Word32s in PrimitiveStreams
  • Runtime optimizations


  • Fixed bug in clear where masks weren’t set
  • Added up to 7-tuple instances


  • Fixed bug in dropVertices and dropIndices (#16)
  • Added withPointSize (#15)


  • Fixed bug in clearImage


  • Fixed bug when nesting while, ifThen, ifThenElse or ifThenElse’.


  • Made ifB use ifThenElse’ instead to avoid unwanted strictness
  • Fixed bug where ShaderBaseType for () wasn’t lazy enough, causing error in ifThenElse’
  • Added missing () instances


  • Making dangling finalizers work with shared and unshared contexts (#10)
  • Moved orphan instances to separate module (#11)
  • Fixing a bug introduced in 2.0.2 when using multiple uniforms
  • Fixing exception when using conditionals in the shader (#12)


  • Linear bumped to 1.20
  • Running contextSwap and contextFrameBufferSize on right thread (#7)
  • render now throws if rendering to an image from a texture thats used for sampling (#8)
  • Added GPipe class instances for all linear types (#9)


  • Fixed runtime error in simple fragment program when not all uniforms where used (#5)


  • Initial release of GPipe 2