v/]E      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} ~  *(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 A sampling configuration type. Class of all textures. 0Size of a texture. This is an associated type   type family?  because the dimensionality of a texture relies on its type. }In order to index regions of texels in texture, we need another associated type  for the same dimensionality reason as for  . kFor textures that might require depth comparison, that type defines all the possible cases for comparison.Sampling filter. C will sample the nearest texel at the sampling coordinates whilst : will perform linear interpolation with the texels nearby.Wrap texture parameter. Such an object is used to tell how to sampling is performed when going out of the texture coordinates.D will clamp the texture coordinates between in '[0,1]'. If you pass '1.1' or '31.456'#, in both cases you ll end up with '1',. Same thing for negative values clamped to '0'.4 will clamp the texture in '[0,1]' after applying a fract6 on the value, yielding a a repeated '[0,1]' pattern. ClampToBorder*'createTexture w h levels sampling' a new 'w'*'h' texture with levels- levels. The format is set through the type.Default  for convenience.  defaultSampling = Sampling { samplingWrapS = ClampToEdge , samplingWrapT = ClampToEdge , samplingWrapR = ClampToEdge , samplingMinFilter = Linear , samplingMagFilter = Linear , samplingCompareFunction = Nothing }  tex offset size autolvl texelsp uploads data to a subpart of the texture s storage. The offset is given with origin at upper-left corner, and size( is the size of the area to upload to. autolvl is a 4 that can be used to automatically generate mipmaps.;Fill a subpart of the texture s storage with a given value.4 4   (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.0/Readable typeclass, for types that admit reads. ,-./0,-./0 ,-./0(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNV1Get the OpenGL vendor .2Get the OpenGL renderer .3Get the OpenGL version .4Get the GLSL version .50Retrieve all the supported OpenGL extensions as s.123451234512345(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNV >A pixel format.@A depth channel.B$Red, green, blue and alpha channels.DRed, green and blue channels.FRd and green channels.HA red channel only.JChannels are floating values.L&Channels are unsigned integral values.NChannels are integral values.QA 32-bit channel.SA 16-bit channel.UA 8-bit channel.86789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVW     (6789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVW&6789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVW     (C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNVX A cubemap.[ Face of a X.XYZ[\]^_`a XYZ[\]^_`aXYZ[\]^_`a(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNVbA cubemap array.bcdbcdbcd(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNVe A 1D texture.e !f"e !fe !f"(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNVgA 1D texture array.g#$h%g#$hg#$h%(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNVi A 2D texture.i&'jk(i&'jki&'jk((C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNVlA 2D texture array.l)*m+,l)*m+l)*m+,(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNVn A 3D texture.n-.opq/n-.opqn-.opq/(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNVrA shader uniform. r aw doesn t hold any value. It s more like a mapping between the host code and the shader the uniform was retrieved from.r? is contravariant in its argument. That means that you can use 0 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 rX with different types. That can be useful to build a uniform type by gluing its fields.*Another interesting part is the fact that r 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 ('()').sClass 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 rq documentation for further information about how to augment the scope of the types you can send down to shaders.Pr12s3456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~r12s3456Mr12s3456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNVrssr(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNV tTypes that can handle v  read as, have .vShader 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.yShader program.{Create a new shader y.That function takes a list of $9s and a uniform interface builder function and yields a y 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 x.In the end, you get the new y 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.|A simpler version of {V. That function assumes you don t need a uniform interface and then just returns the y.Is a shader program linked?!Shader program link log s length.Shader program link log. Either map a  or  to a uniform.tuvwxyz{|tuvwxyz{| tuvwxyz{|(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNV tuvwxyz{| yzz{|vwxtu (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}Convenient type to build ~s.aSize 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. 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  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 .}~}~}~"(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 =  src dst, represents the following blending equation:  blended =  src dst #(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  (,,). If you pass , blendingT is disabled for that draw command. If you want to enable it, you have to pass  (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  and disabled with .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 enabled(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNV9 XYZ[\]^_`abcdefghijklmnopqE  effghhijkjklmmnopqopqXYZ[\]^_`aYZbcdcd$(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNV !"#$%&'()*+rstuvwxyz{|(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNV,-./00./-, (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>CFIKLNV1234512345(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNV"6789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVW"WUVSTQRPNOLMJKHIFGDEBC@A>?7=<;:986 (C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNV#A tuple of types, right-associated.The 0 instance is used for foreign packing on 32-bit.%(C) 2015 Dimitri SabadieBSD3+Dimitri Sabadie <dimitri.sabadie@gmail.com> experimentalportableNone!"'(*-/3457>CFIKLNV $Mask for framebuffer blit operation.Framebuffer output.Given a >, inject it into a i to handle it.Framebuffer representation of ., - and ,.FTypeclass used to implement read/write operation per color attachment.4Typeclass of possible framebuffer depth attachments.4Typeclass of possible framebuffer color attachments.A 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 70 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  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).0&! (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>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. Create a new  2. Create a new  3. Create a new  4.  (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>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 ;indexed geometryS: requires indices to know how to connect and share vertices between each other.*This function is the single one to create  . It takes a ' type of vertices used to provide the  with vertices and might take a  of indices (). If you don t pass indices (), 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. O (n log n)Turn direct geometry data into  indirect datak. This function removes duplicate vertices from the data you pass in and registers indices in consequence.(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 Abstract  over uniform interface.Shader y batch. Such a batch is used to share a y between several . It also gathers a uniform r 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.Run a .Share a ( between several shader program batches. Abstract . Create a new . Create a new  with no uniform interface. )(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}~~} (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[\]^_`abcdefghijklmnopqrstuvwxyz{|}~+,-../0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijjkkllmmnnooppqqrrsttuuvvwxyz{|}~!!!!!!!!!!!!!!!""""""""""""""""""####   %%%%%%%%%%%%%%%%%%%%%%&&&&&'''''''((((((())))     PXYZ !"#$%&'()*+,-./01234x56789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~    !!!!!!!!!!!!!!!!"""##%%%%%%%%%%%%%%%%%%%%%%%%%%&&&&&&&&+,+,+,+,+,+,+,+,+,+,-''''''''(((((((((((()lumin_0W1079DWGT67MHN4JqJV2RGraphics.Luminance.VertexGraphics.Luminance.TextureGraphics.Luminance.Shader.StageGraphics.Luminance.RWGraphics.Luminance.QueryGraphics.Luminance.Pixel!Graphics.Luminance.Shader.Uniform!Graphics.Luminance.Shader.ProgramGraphics.Luminance.BufferGraphics.Luminance.BlendingGraphics.Luminance.RenderCmdGraphics.Luminance.Core.TupleGraphics.Luminance.FramebufferGraphics.Luminance.GeometryGraphics.Luminance.BatchGraphics.Luminance.CmdGraphics.Luminance.Core.DebugGraphics.Luminance.Core.Texture$Graphics.Luminance.Core.Shader.StageGraphics.Luminance.Core.RWGraphics.Luminance.Core.QueryGraphics.Luminance.Core.PixelGraphics.Luminance.Core.Cubemap$Graphics.Luminance.Core.CubemapArray!Graphics.Luminance.Core.Texture1D&Graphics.Luminance.Core.Texture1DArray!Graphics.Luminance.Core.Texture2D&Graphics.Luminance.Core.Texture2DArray!Graphics.Luminance.Core.Texture3D&Graphics.Luminance.Core.Shader.Uniform&Graphics.Luminance.Core.Shader.Program$Graphics.Luminance.Core.RenderbufferGraphics.Luminance.Core.Buffer Graphics.Luminance.Core.Blending!Graphics.Luminance.Core.RenderCmdGraphics.Luminance.Shader#Graphics.Luminance.Core.FramebufferGraphics.Luminance.Core.Vertex Graphics.Luminance.Core.GeometryGraphics.Luminance.Core.BatchGraphics.Luminance.Core.CmdGraphics.Luminancelinea_CEQvqzdiUHJGXbNCRjpfM4Linear.VVSampling samplingWrapS samplingWrapT samplingWrapRsamplingMinFiltersamplingMagFiltersamplingCompareFunctionTexture TextureSize TextureOffset CompareFuncNeverLessEqual LessOrEqualGreaterGreaterOrEqualNotEqualAlwaysFilterNearestLinearWrap ClampToEdgeRepeatMirroredRepeat createTexturedefaultSampling uploadSubfillSub HasStageErrorfromStageError StageErrorCompilationFailedStagestageIDcreateTessCtrlShadercreateTessEvalShadercreateVertexShadercreateGeometryShadercreateFragmentShadercreateComputeShaderRWWRWritableReadable getGLVendor getGLRenderer getGLVersiongetGLSLVersiongetGLExtensions ColorPixelPixelDepth32FRGBA32FRGB32FRGBA8FRGBA8UIRGB8UIFormatCDepthCRGBACRGBCRGCRCFloatsCUIntsCInts ChannelTypeC32C16C8 ChannelSizeCubemapcubemapWcubemapHCubeFace PositiveX NegativeX PositiveY NegativeY PositiveZ NegativeZ CubemapArray cubemapArrayW cubemapArrayH Texture1D texture1DWTexture1DArraytexture1DArrayW Texture2D texture2DW texture2DHTexture2DArraytexture2DArrayW Texture3D texture3DW texture3DH texture3DDUUniformHasProgramErrorfromProgramError ProgramError LinkFailedInactiveUniformProgram programID createProgramcreateProgram_ BuildRegionRegionBufferRWBufferbufferID createBuffer createBuffer_ newRegion readWhole writeWholefill@?@!writeAtwriteAt'BlendingFactorOneZeroSrcColorNegativeSrcColor DestColorNegativeDestColorSrcAlphaNegativeSrcAlphaDstAlphaNegativeDstAlphaSrcAlphaSaturate BlendingModeAdditiveSubtractReverseSubtractMinMax RenderCmd renderCmd stdRenderCmd stdRenderCmd_:. $fStorable:.HasFramebufferErrorfromFramebufferErrorFramebufferErrorIncompleteFramebufferFramebufferBlitMask BlitColor BlitDepthBlitBothOutputTexturizeFormatFramebufferTargetFramebufferColorRWFramebufferDepthAttachmentFramebufferColorAttachmentDepthFramebufferColorFramebuffer Framebuffer framebufferIDframebufferOutputcreateFramebufferdefaultFramebufferVertexVertexAttributevec2vec3vec4 GeometryModePointLineTriangleGeometrycreateGeometry nubDirect AnySPBatchSPBatchFBBatchframebufferBatch anySPBatchshaderProgramBatchshaderProgramBatch_CmdrunCmddrawblitGLErrordebugGLbaseGHC.BaseString InvalidEnum InvalidValueInvalidOperationInvalidFramebufferOperation OutOfMemoryStackUnderflow StackOverflow clearGLError fromGLError toGLErrorghc-prim GHC.TypesBoolSampler samplerID BaseTexture baseTextureIDbaseTextureHndfromBaseTexture toBaseTexturetextureTypeEnum textureSizetextureStoragetransferTexelsSubfillTextureSubfromWrap fromFilterfromCompareFunc setSamplingsetTextureSamplingsetSamplerSampling createSamplermkShader 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*C8 cubemapBase fromCubeFace$fTextureCubemapcubemapArrayBase$fTextureCubemapArray texture1DBase$fTextureTexture1Dtexture1DArrayBase$fTextureTexture1DArray texture2DBase$fTextureTexture2Dtexture2DArrayBasetexture2DArrayH$fTextureTexture2DArray texture3DBase$fTextureTexture3Dcontr_9AvIwlmHJZeLdZWNGrVu0CData.Functor.Contravariant contramaprunUtoUunPairunTripleunQuad$fUniformCubemap$fUniformTexture3D$fUniformTexture2D$fUniformTexture1D $fUniform[] $fUniformV4 $fUniform[]0 $fUniform[]1 $fUniform[]2 $fUniform[]3 $fUniform[]4 $fUniform[]5 $fUniform[]6 $fUniform[]7 $fUniform[]8 $fUniform[]9 $fUniformV $fUniformV40$fUniform(,,,) $fUniformV0 $fUniformV3 $fUniform(,,) $fUniformV1 $fUniformV2 $fUniform(,)$fUniformFloat $fUniform[]10 $fUniform[]11 $fUniform[]12 $fUniform[]13 $fUniform[]14 $fUniform[]15 $fUniform[]16 $fUniform[]17 $fUniform[]18 $fUniform[]19 $fUniformV5 $fUniformV41$fUniform(,,,)0 $fUniformV6 $fUniformV30$fUniform(,,)0 $fUniformV7 $fUniformV20 $fUniform(,)0$fUniformWord32 $fUniform[]20 $fUniform[]21 $fUniform[]22 $fUniform[]23 $fUniform[]24 $fUniform[]25 $fUniform[]26 $fUniform[]27 $fUniform[]28 $fUniform[]29 $fUniformV8 $fUniformV42$fUniform(,,,)1 $fUniformV9 $fUniformV31$fUniform(,,)1 $fUniformV10 $fUniformV21 $fUniform(,)1$fUniformInt32 $fUniform() $fSemigroupU $fMonoidU $fDivisibleU $fDecidableU$fContravariantU GHC.NaturalNaturalisLinked ifaceWith RenderbufferrenderbufferIDcreateRenderbuffer RegionSizemkBufferWithRegionsNothingrunBuildRegion regionPtr regionSizebufferFlagsFromRWmkBuffer createStoragebytesOfR $fBufferRWW $fBufferRWRW $fBufferRWR GHC.ClassesminmaxfromBlendingModefromBlendingFactor setBlendingMaybeJustTrueFalse$fFunctorRenderCmdForeign.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 fromVector reifyVectorreifyDimreifyVectorNat reifyDimNatdim reflectDimDimtoVectorrefle_2R8D1icnYri0V2GprJlDMFData.Reflectionint Data.FoldableFoldableGHC.WordWord32DirectGeometryIndexedGeometry VertexArray vertexArrayIDvertexArrayModevertexArrayCountfromGeometryMode runFBBatchspBatchShaderProgramspBatchUniformspBatchUniformValuespBatchGeometriesfbBatchFramebufferfbBatchSPBatch runSPBatch drawGeometry