{-# OPTIONS_HADDOCK hide #-} -------------------------------------------------------------------------------- -- | -- Module : Graphics.Rendering.OpenGL.GL.Shaders.Program -- Copyright : (c) Sven Panne 2013 -- License : BSD3 -- -- Maintainer : Sven Panne -- 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 Foreign.Marshal.Alloc import Foreign.Ptr import Graphics.Rendering.OpenGL.GL.GLboolean import Graphics.Rendering.OpenGL.GL.ObjectName import Graphics.Rendering.OpenGL.GL.PeekPoke import Graphics.Rendering.OpenGL.GL.StateVar import Graphics.Rendering.OpenGL.Raw -------------------------------------------------------------------------------- newtype Program = Program { programID :: GLuint } deriving ( Eq, Ord, Show ) instance ObjectName Program where isObjectName = fmap unmarshalGLboolean . glIsProgram . programID deleteObjectName = glDeleteProgram . 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 | ComputeLocalWorkSize -- 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 ComputeLocalWorkSize -> gl_COMPUTE_LOCAL_WORK_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 $ alloca $ \buf -> do glGetProgramiv (programID program) (marshalGetProgramPName p) buf f buf