9[%      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijk l m n o p q r s t u v w x y z { | } ~  #(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNVOpenGL error type.Given a context  and an action, that function clears the OpenGL errors in order to run the action in a sane and error-free OpenGL context. If an error has occured, print it on stderr along with the ; context. Otherwise, simply it returns the action s result.[Keep in mind that you can mute that function s implementation by disabling the cabal flag  'debug-gl', which is the default setting. (C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNV Types that can handle .Error type of shaders.J'CompilationFailed reason' occurs when a shader fails to compile, and the  reason( contains a description of the failure. A shader .0Create a new tessellation control shader from a # representation of its source code.3Create a new tessellation evaluation shader from a # representation of its source code."Create a new vertex shader from a # representation of its source code. $Create a new geometry shader from a # representation of its source code. $Create a new fragment shader from a # representation of its source code. #Create a new compute shader from a # representation of its source code.   (C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNV   (C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNV Read-write type. Write-only type.Read-only type.0Writable typeclass, for types that admit writes./Readable typeclass, for types that admit reads.    (C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNVGet the OpenGL vendor .Get the OpenGL renderer .Get the OpenGL version .Get the GLSL version .0Retrieve all the supported OpenGL extensions as s.(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNV A pixel format. A depth channel."$Red, green, blue and alpha channels.$Red, green and blue channels.&Rd and green channels.(A red channel only.*Channels are floating values.,&Channels are unsigned integral values..Channels are integral values.1A 32-bit channel.3A 16-bit channel.5A 8-bit channel.8 !"#$%&'()*+,-./01234567( !"#$%&'()*+,-./01234567& !"#$%&'()*+,-./01234567(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNV@ 2D Texture.089:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\089:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\89:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNV]A shader uniform. ] aw doesn t hold any value. It s more like a mapping between the host code and the shader the uniform was retrieved from.]? is contravariant in its argument. That means that you can use  to build more interesting uniform types. It s also a divisible contravariant functor, then you can divide structures to take advantage of divisible contravariant properties and then glue several ]X with different types. That can be useful to build a uniform type by gluing its fields.*Another interesting part is the fact that ] is also monoidal. You can accumulate several of them with '(<>)' if they have the same type. That means that you can join them so that when you pass an actual value, it gets shared inside the resulting value.OThe '()' instance doesn t do anything and doesn t even use its argument ('()').^Class of types that can be sent down to shaders. That class is closed because shaders cannot handle a lot of uniform types. However, you should have a look at the ]q documentation for further information about how to augment the scope of the types you can send down to shaders.']^     ]^$]^     (C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNV]^^](C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNV _Types that can handle a  read as, have .aShader program error.:'LinkFailed reason' happens when a program fails to link. reason contains the error message.'InactiveUniform uni' happens at linking when a uniform is inactive in the program; that is, unused or semantically set to a negative value.dShader program.fCreate a new shader d.That function takes a list of 9s and a uniform interface builder function and yields a d and the interface.kThe builder function takes a function you can use to retrieve uniforms. You can pass 'Left name' to map a = to a uniform or you can pass 'Right sem' to map a semantic  9 to a uniform. If the uniform can t be retrieved, throws c.In the end, you get the new d and a polymorphic value you can choose the type of in the function you pass as argument. You can use that value to gather uniforms for instance.gA simpler version of fV. That function assumes you don t need a uniform interface and then just returns the d.!Is a shader program linked?"!Shader program link log s length.#Shader program link log.$ Either map a  or   to a uniform._`abcd%efg!"#$_`abcd%efg!"#$ _`abcd%efg!"#$(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNV _`abcdefg deefgabc_`(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNV&'()&'()&'()(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNVh#A tuple of types, right-associated.The *0 instance is used for foreign packing on 32-bit.hijhihijhijhi(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNV o$Mask for framebuffer blit operation.sFramebuffer output.uGiven a , inject it into a @ to handle it.vFramebuffer representation of ,   and  .wFTypeclass used to implement read/write operation per color attachment.x4Typeclass of possible framebuffer depth attachments.y4Typeclass of possible framebuffer color attachments.zA| with the color8 buffer muted. Can be used to implement fast pre-passes.{A| with the depth buffer muted.|A | represents two buffers: a color buffer and depthX buffer. You can select which one you want and specify the formats to use by providing 0 types. If you want to mute a buffer, use '()'. w h mipmaps creates a new | with dimension w * h and allocating spaces for mipmapsJ level of textures. The textures are created by providing a correct type.(For the color part, you can pass either:9'()': that will mute the color buffer of the framebuffer; t cA: that will create a single texture with the wished color format;or a h b(: that will create a chain of textures; a and b cannot be '()'.(For the depth part, you can pass either:9'()': that will mute the depth buffer of the framebuffer; t cA: that will create a single texture with the wished depth format. Finally, the rw parameter can be set to ,   or  : to specify which kind of framebuffer access you ll need. The default |; represents the screen (back buffer with double buffering).0klmnopqrstuv+w,x-y./01z{|2}~3456789:;<=>?@ABCD&klmnopqrstuv+w,x-y./01z{|2}~3456789:!klmnopqrstuv+w,x-y./01z{|2}~3456789:;<=>?@ABCD(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNVA vertex has to implement  in order to be used as-is. That typeclass is closed, so you you cannot add anymore instances. However, you shouldn t need to since you can use the already provided types to build up your vertex type.]A vertex might have several attributes. The types of those attributes have to implement the 4 typeclass in order to be used as vertex attributes.EFGHIJKLMNOP EFG EFGHIJKLMNOP(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNVConvenient type to build s.QaSize of a region, in elements. You don t have to worry about bytes consideration. If you want a Region rw Float with 10 elements in it, use  RegionSize 10. That s as simple as that.A ? is a GPUtyped memory area. It can be pictured as a GPU array. s Qs can have reads and writes. That typeclass makes implements all possible cases.A  is an opaque and untyped region of abstract GPU memory. You cannot do much with it and you might even not see the type in the user interface as it s not really needed. It s shown for informational purposes only.R Create a new  using regions through the  monadic type. The & is returned as well as the computed a value in the ."Typically, the user will wrap the  in the a type. Create a new  and expose s. Through the l type, you can yield new regions and embed them in the type of your choice. The function returns that type. Create a new , by providing the number of wished elements. Read a whole .Write the whole . If value are missing, only the provided values will replace the existing ones. If there are more values than the size of the , they are ignored.Fill a  with a value.7Index getter. Bounds checking is performed and returns S if out of bounds.'Index getter. Unsafe version of '(@?)'.PIndex setter. Bounds checking is performed and nothing is done if out of bounds. Index setter. Unsafe version of .TUQVWXYZ[\]R^_`aTUQVWXYZ[\]R^TUQVWXYZ[\]R^_`a(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNVThe H is used to specify how vertices should be connected between each other.A L mode won t connect vertices at all and will leave them as a vertices cloud.A  mode will connect vertices two-by-two. You then have to provide pairs of indices to correctly connect vertices and form lines.A  mode will connect vertices three-by-three. You then have to provide triplets of indices to correctly connect vertices and form triangles.A p represents a GPU version of a mesh; that is, vertices attached with indices and a geometry mode. You can have  in two flavours:*direct geometry*: doesn t require any indices as all vertices are unique and in the right order to connect vertices between each other ;e*indexed geometry*: requires indices to know how to connect and share vertices between each other.*This function is the single one to create  . It takes a b' type of vertices used to provide the  with vertices and might take a b of indices (c). If you don t pass indices (Sn), you end up with a *direct geometry*. Otherwise, you get an *indexed geometry*. You also have to provide a E to state how you want the vertices to be connected with each other.defghijkdefghijkdefghijk(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNV Blending factors.1 * color = factor 0 * color = 0 src * color(1 - src) * color dst * color(1 - dst) * color srcA * color(1 - src) * color dstA * color(1 - dstA) * colorAll different blending modes., represents the following blending equation: !blended = src * srcK + dst * dstK, represents the following blending equation: !blended = src * srcK - dst * dstK(Because subtracting is not commutating, 8 represents the following additional blending equation: !blended = dst * dstK - src * srcK, represents the following blending equation:  blended = l src dst, represents the following blending equation:  blended = m src dstnopnop nop(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNVA GPU^ render command. That type exists to implement a stateless way to issue draw commands to the GPU5. You can set several hints for a given draw command:blending+: the blending mode is represented by q (,,). If you pass S, blendingT is disabled for that draw command. If you want to enable it, you have to pass r (mode,srcK,dstK), where mode is the  and srcK and dstK are both 1 representing the source and destination factors. depth test+: the depth test can be enabled by passing s and disabled with t.a 4per draw command uniform interface and uniform value: that is the way you can customize the draw calls. You just have to pass the uniform interface and the value to send down to the shader. Finally, a \ holds a value. That value will be consumed later by other functions. In general, it ll be Geometry.( blending depthTest uniformInterface u a constructs a new . A standard  builder.no blending depth test enabled A standard # builder with no uniform interface.no blending depth test enableduvuuv (C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNV Abstract  over uniform interface.Shader d batch. Such a batch is used to share a d between several . It also gathers a uniform ] u and a u value to send to the uniform.The u type can be used to send uniforms for the whole batch. It can be useful for cold values  that won t change very often for a given frame  like the resolution of the screen, the mouse cursor coordinates, the time, and so on and so forth.The v+ type variable is used to add uniforms per-.| batch.A  is used to expose a |6 and share it between several shader program batches.wRun a .Share a |( between several shader program batches. Abstract . Create a new . Create a new  with no uniform interface.xyz{|}~wxyz{|}~w xyz{|}~w!(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNV3Command type. Used to accumulate GPU commands. Use ) to execute the whole chain of commands.=Draw a framebuffer batch and return the framebuffer s output.jBlit a framebuffer batch onto a framebuffer and return the framebuffer s output of the write framebuffer. (C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNV(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNV%89:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\+@ABCDEFABCDEFW89:;<=>?XPQRSTUVGHIJKLMNOYZ[\"(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNV ]^_`abcdefg(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNV  (C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNV(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNV(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNV" !"#$%&'()*+,-./01234567"75634120./,-*+()&'$%"# ! (C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNV (C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNVklmnopqrstuvwxyz{|}~|}~{z}~yxwvustopqrmnkl(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNV (C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNV (C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNV(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNV#(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNV  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefgklmnopqrstuvwxyz{|}~$%&'()*+,-./0123456789:;<=>?@ABBCCDDEEFFGGHHIIJJKLLMMNNOPPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~    !!!!(012W     t !"#$%&'()*+,-./012345{66789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abc`defghijklmnopqrsstuvwxyzxy{|}~xx            !lumin_7oXuWfHPfRl8O0I88ABx3PGraphics.Luminance.Shader.StageGraphics.Luminance.RWGraphics.Luminance.QueryGraphics.Luminance.PixelGraphics.Luminance.Texture!Graphics.Luminance.Shader.Uniform!Graphics.Luminance.Shader.ProgramGraphics.Luminance.Core.TupleGraphics.Luminance.FramebufferGraphics.Luminance.VertexGraphics.Luminance.BufferGraphics.Luminance.GeometryGraphics.Luminance.BlendingGraphics.Luminance.RenderCmdGraphics.Luminance.BatchGraphics.Luminance.CmdGraphics.Luminance.Core.Debug$Graphics.Luminance.Core.Shader.StageGraphics.Luminance.Core.RWGraphics.Luminance.Core.QueryGraphics.Luminance.Core.PixelGraphics.Luminance.Core.Texture&Graphics.Luminance.Core.Shader.Uniform&Graphics.Luminance.Core.Shader.Program$Graphics.Luminance.Core.Renderbuffer#Graphics.Luminance.Core.FramebufferGraphics.Luminance.Core.VertexGraphics.Luminance.Core.Buffer Graphics.Luminance.Core.Geometry Graphics.Luminance.Core.Blending!Graphics.Luminance.Core.RenderCmdGraphics.Luminance.Core.BatchGraphics.Luminance.Core.CmdGraphics.Luminance.ShaderGraphics.Luminance HasStageErrorfromStageError StageErrorCompilationFailedStagestageIDcreateTessCtrlShadercreateTessEvalShadercreateVertexShadercreateGeometryShadercreateFragmentShadercreateComputeShaderRWWRWritableReadable getGLVendor getGLRenderer getGLVersiongetGLSLVersiongetGLExtensions ColorPixelPixelDepth32FRGBA32FRGB32FRGBA8FRGBA8UIRGB8UIFormatCDepthCRGBACRGBCRGCRCFloatsCUIntsCInts ChannelTypeC32C16C8 ChannelSizeSampling samplingWrapS samplingWrapT samplingWrapRsamplingMinFiltersamplingMagFiltersamplingCompareFunction Texture2D textureID textureHandletextureWtextureH textureFormat textureType CompareFuncNeverLessEqual LessOrEqualGreaterGreaterOrEqualNotEqualAlwaysFilterNearestLinearWrap ClampToEdge ClampToBorderRepeat createTexturedefaultSampling uploadWhole uploadSub fillWholefillSubUUniformHasProgramErrorfromProgramError ProgramError LinkFailedInactiveUniformProgram programID createProgramcreateProgram_:. $fStorable:.HasFramebufferErrorfromFramebufferErrorFramebufferErrorIncompleteFramebufferFramebufferBlitMask BlitColor BlitDepthBlitBothOutputTexturizeFormatFramebufferTargetFramebufferColorRWFramebufferDepthAttachmentFramebufferColorAttachmentDepthFramebufferColorFramebuffer Framebuffer framebufferIDframebufferOutputcreateFramebufferdefaultFramebufferVertexVertexAttributeVV1V2V3V4 BuildRegionRegionBufferRWBufferbufferID createBuffer createBuffer_ newRegion readWhole writeWholefill@?@!writeAtwriteAt' GeometryModePointLineTriangleGeometrycreateGeometryBlendingFactorOneZeroSrcColorNegativeSrcColor DestColorNegativeDestColorSrcAlphaNegativeSrcAlphaDstAlphaNegativeDstAlphaSrcAlphaSaturate BlendingModeAdditiveSubtractReverseSubtractMinMax RenderCmd renderCmd stdRenderCmd stdRenderCmd_ AnySPBatchSPBatchFBBatchframebufferBatch anySPBatchshaderProgramBatchshaderProgramBatch_CmdrunCmddrawblitGLErrordebugGLbaseGHC.BaseString InvalidEnum InvalidValueInvalidOperationInvalidFramebufferOperation OutOfMemoryStackUnderflow StackOverflow clearGLError fromGLError toGLErrormkShader isCompiled clogLengthclogprependGLSLPragma $fWritable*RW $fReadable*RW $fWritable*W $fReadable*R getString PixelBase pixelFormat pixelIFormat pixelType channelType channelSize$fColorPixel*Format$fColorPixel*Format0$fColorPixel*Format1$fColorPixel*Format2$fPixel*Format$fPixel*Format0$fPixel*Format1$fPixel*Format2$fPixel*Format3$fChannelType*Format$fChannelType*CFloats$fChannelType*CUInts$fChannelType*CInts$fChannelSize*C32$fChannelSize*C16$fChannelSize*C8Sampler samplerIDfromWrap fromFilterfromCompareFunc createSampler setSamplingsetTextureSamplingsetSamplerSamplingcontr_GCTo0F9BXbJ1Kd5vCffR3XData.Functor.Contravariant contramaprunUtoUunPairunTripleunQuad$fUniformTexture2D $fUniform[] $fUniform[]0 $fUniform[]1 $fUniform[]2$fUniform(,,,) $fUniform(,,) $fUniform(,)$fUniformFloat $fUniform[]3 $fUniform[]4 $fUniform[]5 $fUniform[]6$fUniform(,,,)0$fUniform(,,)0 $fUniform(,)0$fUniformWord32 $fUniform[]7 $fUniform[]8 $fUniform[]9 $fUniform[]10$fUniform(,,,)1$fUniform(,,)1 $fUniform(,)1$fUniformInt32 $fUniform() $fSemigroupU $fMonoidU $fDivisibleU $fDecidableU$fContravariantU GHC.NaturalNaturalisLinked ifaceWith RenderbufferrenderbufferIDcreateRenderbufferForeign.StorableStorableframebufferTargetsetFramebufferColorRWaddDepthOutputaddColorOutput AttachmentColorAttachmentDepthAttachmenttranslateFramebufferStatusfromAttachmentcolorAttachmentsFromMaxsetColorBufferssetDepthRenderbuffer addOutputfromFramebufferBlitMaskframebufferBlit$fFramebufferTarget*RW$fFramebufferTarget*W$fFramebufferTarget*R$fFramebufferColorRW*RW$fFramebufferColorRW*W"$fFramebufferDepthAttachmentFormat$fFramebufferDepthAttachment()$fFramebufferColorAttachment:."$fFramebufferColorAttachmentFormat$fFramebufferColorAttachment() setFormatV vertexGLTypevertexBindingIndex $fVertex*:. $fVertex*V$fVertexAttribute*Word32$fVertexAttribute*Int32$fVertexAttribute*Float $fStorableV $fStorableV0 $fStorableV1 $fStorableV2 RegionSizemkBufferWithRegionsNothingrunBuildRegion regionPtr regionSizebufferFlagsFromRWmkBuffer createStoragebytesOfR $fBufferRWW $fBufferRWRW $fBufferRWR Data.FoldableFoldableGHC.WordWord32DirectGeometryIndexedGeometry VertexArray vertexArrayIDvertexArrayModevertexArrayCountfromGeometryModeghc-prim GHC.ClassesminmaxfromBlendingModefromBlendingFactor setBlendingMaybeJust GHC.TypesTrueFalse$fFunctorRenderCmd runFBBatchspBatchShaderProgramspBatchUniformspBatchUniformValuespBatchGeometriesfbBatchFramebufferfbBatchSPBatch runSPBatch drawGeometry