Wed May 28 15:33:56 CEST 2008 Balazs Komuves * fixes the withCAStringLen bug in Shaders.hs Sat Oct 25 14:33:52 CEST 2008 Balazs Komuves * initial Vertex Attributes support in Vertex Arrays (untested) Wed Dec 3 21:50:20 CET 2008 Balazs Komuves * initial FBO support (EXT_framebuffer_object) Wed Dec 17 13:04:54 CET 2008 Balazs Komuves * more FBO support/fixes New patches: [fixes the withCAStringLen bug in Shaders.hs Balazs Komuves **20080528133356] { hunk ./Graphics/Rendering/OpenGL/GL/Shaders.hs 42 import Control.Monad.Fix ( MonadFix(..) ) import Data.Int import Data.List ( genericLength, (\\) ) -import Foreign.C.String ( peekCAStringLen, withCAStringLen ) +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 ) hunk ./Graphics/Rendering/OpenGL/GL/Shaders.hs 86 withCAStringLen s $ \(p,len) -> act (castPtr p, fromIntegral len) +withGLString :: String -> (Ptr GLchar -> IO a) -> IO a +withGLString s act = + withCAString s $ \p -> + act (castPtr p) + -------------------------------------------------------------------------------- newtype VertexShader = VertexShader { vertexShaderID :: GLuint } hunk ./Graphics/Rendering/OpenGL/GL/Shaders.hs 400 getAttribLocation :: Program -> String -> IO AttribLocation getAttribLocation program name = - withGLStringLen name $ \(buf,_) -> + withGLString name $ \buf -> fmap (AttribLocation . fromIntegral) $ glGetAttribLocation program buf hunk ./Graphics/Rendering/OpenGL/GL/Shaders.hs 408 bindAttribLocation :: Program -> AttribLocation -> String -> IO () bindAttribLocation program location name = - withGLStringLen name $ \(buf,_) -> + withGLString name $ \buf -> glBindAttribLocation program location buf EXTENSION_ENTRY("OpenGL 2.0",glBindAttribLocation,Program -> AttribLocation -> Ptr GLchar -> IO ()) hunk ./Graphics/Rendering/OpenGL/GL/Shaders.hs 499 uniformLocation :: Program -> String -> GettableStateVar UniformLocation uniformLocation program name = makeGettableStateVar $ - withGLStringLen name $ \(buf,_) -> + withGLString name $ \buf -> fmap UniformLocation $ glGetUniformLocation program buf } [initial Vertex Attributes support in Vertex Arrays (untested) Balazs Komuves **20081025123352] { hunk ./Graphics/Rendering/OpenGL/GL/QueryUtils.hs 25 getEnum1, getSizei1, getFloat1, getFloat2, getFloat3, getFloat4, getFloatv, - getDouble1, getDouble2, getDouble4, getDoublev + getDouble1, getDouble2, getDouble4, getDoublev, + getVertexAttribInteger1, getVertexAttribIntegerv, + getVertexAttribEnum1, getVertexAttribBoolean1 ) where import Foreign.Marshal.Alloc ( alloca ) hunk ./Graphics/Rendering/OpenGL/GL/QueryUtils.hs 34 import Foreign.Marshal.Array ( allocaArray ) import Foreign.Ptr ( Ptr ) import Graphics.Rendering.OpenGL.GL.BasicTypes ( - GLboolean, GLenum, GLint, GLsizei, GLfloat, GLdouble ) + GLboolean, GLuint, GLenum, GLint, GLsizei, GLfloat, GLdouble ) import Graphics.Rendering.OpenGL.GL.PeekPoke ( peek1, peek2, peek3, peek4 ) import Graphics.Rendering.OpenGL.GLU.ErrorsInternal ( recordInvalidEnum ) hunk ./Graphics/Rendering/OpenGL/GL/QueryUtils.hs 37 +import Graphics.Rendering.OpenGL.GL.Extensions ( + FunPtr, unsafePerformIO, Invoker, getProcAddress ) + +-------------------------------------------------------------------------------- + +#include "HsOpenGLExt.h" -------------------------------------------------------------------------------- hunk ./Graphics/Rendering/OpenGL/GL/QueryUtils.hs 296 | GetMatrixIndexArraySize | GetMatrixIndexArrayType | GetMatrixIndexArrayStride + + | GetVertexAttributeArrayEnabled + | GetVertexAttributeArraySize + | GetVertexAttributeArrayType + | GetVertexAttributeArrayStride + | GetVertexAttributeArrayNormalized -- these are client state, except CurrentVertexAttribute + | GetCurrentVertexAttribute + | GetClipPlane GLsizei | GetLight GLsizei | GetTransposeModelviewMatrix hunk ./Graphics/Rendering/OpenGL/GL/QueryUtils.hs 686 GetMatrixIndexArraySize -> Just 0x8846 GetMatrixIndexArrayType -> Just 0x8847 GetMatrixIndexArrayStride -> Just 0x8848 + + GetVertexAttributeArrayEnabled -> Just 0x8622 + GetVertexAttributeArraySize -> Just 0x8623 + GetVertexAttributeArrayType -> Just 0x8625 + GetVertexAttributeArrayStride -> Just 0x8624 + GetVertexAttributeArrayNormalized -> Just 0x886a + GetCurrentVertexAttribute -> Just 0x8626 + GetClipPlane i -> clipPlaneIndexToEnum i GetLight i -> lightIndexToEnum i GetTransposeModelviewMatrix -> Just 0x84e3 hunk ./Graphics/Rendering/OpenGL/GL/QueryUtils.hs 976 foreign import CALLCONV unsafe "glGetDoublev" glGetDoublev :: GLenum -> Ptr GLdouble -> IO () + +-------------------------------------------------------------------------------- + +getVertexAttribInteger1 :: (GLint -> a) -> GLuint -> GetPName -> IO a +getVertexAttribInteger1 f index n = alloca $ \buf -> do + getVertexAttribIntegerv index n buf + peek1 f buf + +getVertexAttribEnum1 :: (GLenum -> a) -> GLuint -> GetPName -> IO a +getVertexAttribEnum1 f = getVertexAttribInteger1 (f . fromIntegral) + +getVertexAttribBoolean1 :: (GLboolean -> a) -> GLuint -> GetPName -> IO a +getVertexAttribBoolean1 f = getVertexAttribInteger1 (f . fromIntegral) + +getVertexAttribIntegerv :: GLuint -> GetPName -> Ptr GLint -> IO () +getVertexAttribIntegerv index = maybe (const recordInvalidEnum) (glGetVertexAttribiv index) . marshalGetPName + +EXTENSION_ENTRY("OpenGL 2.0",glGetVertexAttribdv,GLuint -> GLenum -> Ptr GLdouble -> IO ()) +EXTENSION_ENTRY("OpenGL 2.0",glGetVertexAttribfv,GLuint -> GLenum -> Ptr GLfloat -> IO ()) +EXTENSION_ENTRY("OpenGL 2.0",glGetVertexAttribiv,GLuint -> GLenum -> Ptr GLint -> IO ()) + hunk ./Graphics/Rendering/OpenGL/GL/VertexArrays.hs 41 EnableCap(CapVertexArray,CapNormalArray,CapColorArray,CapIndexArray, CapTextureCoordArray,CapEdgeFlagArray,CapFogCoordArray, CapSecondaryColorArray,CapMatrixIndexArray,CapPrimitiveRestart), - makeCapability ) + makeCapability, unmarshalCapability ) import Graphics.Rendering.OpenGL.GL.BasicTypes ( hunk ./Graphics/Rendering/OpenGL/GL/VertexArrays.hs 43 - GLboolean, GLenum, GLint, GLuint, GLsizei, Capability(Enabled) ) + GLboolean, GLenum, GLint, GLuint, GLsizei, Capability(..) ) import Graphics.Rendering.OpenGL.GL.DataType ( DataType(..), marshalDataType, unmarshalDataType ) import Graphics.Rendering.OpenGL.GL.Extensions ( hunk ./Graphics/Rendering/OpenGL/GL/VertexArrays.hs 57 GetFogCoordArrayType,GetFogCoordArrayStride, GetTextureCoordArraySize,GetTextureCoordArrayType, GetTextureCoordArrayStride,GetEdgeFlagArrayStride, + GetVertexAttributeArrayEnabled,GetVertexAttributeArrayNormalized, + GetVertexAttributeArraySize,GetVertexAttributeArrayType, + GetVertexAttributeArrayStride,GetCurrentVertexAttribute, GetMaxElementsVertices,GetMaxElementsIndices, GetClientActiveTexture,GetArrayElementLockFirst, GetArrayElementLockCount,GetPrimitiveRestartIndex), hunk ./Graphics/Rendering/OpenGL/GL/VertexArrays.hs 63 - getInteger1, getEnum1, getSizei1 ) + getInteger1, getEnum1, getSizei1, + getVertexAttribInteger1, getVertexAttribBoolean1, + getVertexAttribEnum1 ) import Graphics.Rendering.OpenGL.GL.PrimitiveMode ( marshalPrimitiveMode ) import Graphics.Rendering.OpenGL.GL.BeginEnd ( PrimitiveMode ) import Graphics.Rendering.OpenGL.GL.StateVar ( hunk ./Graphics/Rendering/OpenGL/GL/VertexArrays.hs 70 HasGetter(get), - GettableStateVar, makeGettableStateVar, StateVar, makeStateVar ) + GettableStateVar, makeGettableStateVar, StateVar, makeStateVar ) import Graphics.Rendering.OpenGL.GL.Texturing.TextureUnit ( TextureUnit, marshalTextureUnit, unmarshalTextureUnit ) import Graphics.Rendering.OpenGL.GLU.ErrorsInternal ( hunk ./Graphics/Rendering/OpenGL/GL/VertexArrays.hs 75 recordInvalidEnum, recordInvalidValue ) +import Graphics.Rendering.OpenGL.GL.VertexSpec ( AttribLocation(..) ) -------------------------------------------------------------------------------- hunk ./Graphics/Rendering/OpenGL/GL/VertexArrays.hs 113 | FogCoordArray | SecondaryColorArray | MatrixIndexArray + | VertexAttributeArray AttribLocation deriving ( Eq, Ord, Show ) marshalClientArrayType :: ClientArrayType -> GLenum hunk ./Graphics/Rendering/OpenGL/GL/VertexArrays.hs 127 FogCoordArray -> 0x8457 SecondaryColorArray -> 0x845e MatrixIndexArray -> 0x8844 + VertexAttributeArray _ -> error "marshalClientArrayType: VertexAttributeArray - this shouldn't happen" -- Hmmm... clientArrayTypeToEnableCap :: ClientArrayType -> EnableCap hunk ./Graphics/Rendering/OpenGL/GL/VertexArrays.hs 141 FogCoordArray -> CapFogCoordArray SecondaryColorArray -> CapSecondaryColorArray MatrixIndexArray -> CapMatrixIndexArray - + VertexAttributeArray _ -> error "clientArrayTypeToEnableCap: VertexAttributeArray - this shouldn't happen" + -------------------------------------------------------------------------------- arrayPointer :: ClientArrayType -> StateVar (VertexArrayDescriptor a) hunk ./Graphics/Rendering/OpenGL/GL/VertexArrays.hs 159 makeStateVar (do recordInvalidEnum ; return noVertexArrayDescriptor) (const recordInvalidEnum) + VertexAttributeArray loc -> vertexAttributePointer loc check :: Bool -> IO () -> IO () check flag val = if flag then val else recordInvalidValue hunk ./Graphics/Rendering/OpenGL/GL/VertexArrays.hs 320 -------------------------------------------------------------------------------- +vertexAttributePointer :: AttribLocation ->StateVar (VertexArrayDescriptor a) +vertexAttributePointer loc = makeStateVar (getVertexAttributePointer loc) (setVertexAttributePointer loc) + +getVertexAttributePointer :: AttribLocation -> IO (VertexArrayDescriptor a) +getVertexAttributePointer loc@(AttribLocation index) = do + n <- getVertexAttribInteger1 id index GetVertexAttributeArraySize + d <- getVertexAttribEnum1 unmarshalDataType index GetVertexAttributeArrayType + s <- getVertexAttribInteger1 fromIntegral index GetVertexAttributeArrayStride + p <- getPointer (VertexAttributeArrayPointer loc) + return $ VertexArrayDescriptor n d s p + +setVertexAttributePointer :: AttribLocation -> VertexArrayDescriptor a -> IO () +setVertexAttributePointer (AttribLocation index) (VertexArrayDescriptor n d s p) = + glVertexAttribPointer index n (marshalDataType d) (error "setVertexAttributePointer: normalized") s p + EXTENSION_ENTRY("OpenGL 2.0",glVertexAttribPointer,GLuint -> GLint -> GLenum -> GLboolean -> GLsizei -> Ptr a -> IO ()) EXTENSION_ENTRY("OpenGL 2.0",glDisableVertexAttribArray,GLuint -> IO ()) EXTENSION_ENTRY("OpenGL 2.0",glEnableVertexAttribArray,GLuint -> IO ()) hunk ./Graphics/Rendering/OpenGL/GL/VertexArrays.hs 391 makeStateVar (getClientState arrayType) (setClientState arrayType) getClientState :: ClientArrayType -> IO Capability -getClientState = get . makeCapability . clientArrayTypeToEnableCap +getClientState (VertexAttributeArray loc@(AttribLocation index)) = + getVertexAttribBoolean1 unmarshalCapability index GetVertexAttributeArrayEnabled +getClientState arrayType = ( get . makeCapability . clientArrayTypeToEnableCap ) arrayType setClientState :: ClientArrayType -> Capability -> IO () hunk ./Graphics/Rendering/OpenGL/GL/VertexArrays.hs 396 +setClientState (VertexAttributeArray (AttribLocation index)) val = + if val == Enabled then glEnableVertexAttribArray index else glDisableVertexAttribArray index setClientState arrayType val = (if val == Enabled then glEnableClientState else glDisableClientState) (marshalClientArrayType arrayType) hunk ./Graphics/Rendering/OpenGL/GL/VertexArrays.hs 532 | SelectionBufferPointer | WeightArrayPointer | MatrixIndexArrayPointer + | VertexAttributeArrayPointer AttribLocation marshalGetPointervPName :: GetPointervPName -> GLenum marshalGetPointervPName x = case x of hunk ./Graphics/Rendering/OpenGL/GL/VertexArrays.hs 548 SelectionBufferPointer -> 0xdf3 WeightArrayPointer -> 0x86ac MatrixIndexArrayPointer -> 0x8849 - + VertexAttributeArrayPointer _ -> 0x8645 + -------------------------------------------------------------------------------- getPointer :: GetPointervPName -> IO (Ptr a) hunk ./Graphics/Rendering/OpenGL/GL/VertexArrays.hs 553 +getPointer n@(VertexAttributeArrayPointer (AttribLocation index)) = alloca $ \buf -> do + glGetVertexAttribPointerv index (marshalGetPointervPName n) buf + peek buf getPointer n = alloca $ \buf -> do glGetPointerv (marshalGetPointervPName n) buf peek buf } [initial FBO support (EXT_framebuffer_object) Balazs Komuves **20081203205020] { hunk ./Graphics/Rendering/OpenGL/GL.hs 45 module Graphics.Rendering.OpenGL.GL.PerFragment, module Graphics.Rendering.OpenGL.GL.Framebuffer, module Graphics.Rendering.OpenGL.GL.ReadCopyPixels, + module Graphics.Rendering.OpenGL.GL.FBO, -- * Special Functions module Graphics.Rendering.OpenGL.GL.Evaluators, hunk ./Graphics/Rendering/OpenGL/GL.hs 86 import Graphics.Rendering.OpenGL.GL.PerFragment import Graphics.Rendering.OpenGL.GL.Framebuffer import Graphics.Rendering.OpenGL.GL.ReadCopyPixels +import Graphics.Rendering.OpenGL.GL.FBO import Graphics.Rendering.OpenGL.GL.Evaluators import Graphics.Rendering.OpenGL.GL.Selection hunk ./Graphics/Rendering/OpenGL/GL/BufferMode.hs 62 -- front left color buffer is selected. | AuxBuffer GLsizei -- ^ Only the given auxiliary color buffer no. /i/ is selected. + | ColorAttachment' GLsizei + -- ^ Output fragment color to image attached at color attachment point /i/. + -- To be used only with the FBO (framebuffer objects) extension. + | DepthAttachment' + | StencilAttachment' deriving ( Eq, Ord, Show ) marshalBufferMode :: BufferMode -> Maybe GLenum hunk ./Graphics/Rendering/OpenGL/GL/BufferMode.hs 84 AuxBuffer i | i <= 246 -> Just (0x409 + fromIntegral i) | otherwise -> Nothing - + ColorAttachment' i + | i <= 15 -> Just (0x8CE0 + fromIntegral i) + | otherwise -> Nothing + DepthAttachment' -> Just 0x8D00 + StencilAttachment' -> Just 0x8D20 + unmarshalBufferMode :: GLenum -> BufferMode unmarshalBufferMode x | x == 0x0 = NoBuffers hunk ./Graphics/Rendering/OpenGL/GL/BufferMode.hs 103 | x == 0x407 = RightBuffers | x == 0x408 = FrontAndBackBuffers | 0x409 <= x && x <= 0x4ff = AuxBuffer (fromIntegral x - 0x409) + | 0x8CE0 <= x && x <= 0x8CEF = ColorAttachment' (fromIntegral x - 0x8CE0) + | x == 0x8D00 = DepthAttachment' + | x == 0x8D20 = StencilAttachment' | otherwise = error ("unmarshalBufferMode: illegal value " ++ show x) addfile ./Graphics/Rendering/OpenGL/GL/FBO.hs hunk ./Graphics/Rendering/OpenGL/GL/FBO.hs 1 +-------------------------------------------------------------------------------- +-- | +-- Module : Graphics.Rendering.OpenGL.GL.FBO +-- Copyright : (c) Balazs Komuves 2008 +-- License : BSD-style (see the file libraries/OpenGL/LICENSE) +-- +-- Maintainer : bkomuves(plus)hopengl(at)gmail(dot)com +-- Stability : experimental +-- Portability : portable +-- +-- This module corresponds to the @EXT_framebuffer_object@ OpenGL extension. +-- See . +-- +-------------------------------------------------------------------------------- + +module Graphics.Rendering.OpenGL.GL.FBO ( + areFBOsSupported, + FramebufferAttachment(..), + Renderbuffer(..), renderbufferBinding, defaultRenderbuffer, + Framebuffer(..), framebufferBinding, defaultFramebuffer, + FramebufferTexture2DTarget(..), + framebufferTexture1D, framebufferTexture2D, + framebufferTexture3D, framebufferRenderbuffer, + RenderbufferPixelBits(..), renderbufferPixelBits, + getFramebufferAttachmentParameterInteger1, + getFramebufferAttachmentParameterEnum1, + FramebufferStatus(..), checkFramebufferStatus +) where + +import Foreign.Marshal ( alloca ) +import Foreign.Marshal.Array ( withArray, withArrayLen, peekArray, allocaArray ) +import Foreign.Ptr ( Ptr ) +import Graphics.Rendering.OpenGL.GL.BasicTypes ( + GLboolean, GLenum, GLint, GLintptr, GLuint, GLsizei, GLsizeiptr ) +import Graphics.Rendering.OpenGL.GL.BufferMode +import Graphics.Rendering.OpenGL.GL.BufferObjects ( ObjectName(..) ) +import Graphics.Rendering.OpenGL.GL.CoordTrans ( Position(..) , Size(..) ) +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(..), marshalGetPName, getInteger1 ) +import Graphics.Rendering.OpenGL.GL.StateVar ( + get, GettableStateVar, makeGettableStateVar, StateVar, makeStateVar ) +import Graphics.Rendering.OpenGL.GL.StringQueries ( glExtensions ) +import Graphics.Rendering.OpenGL.GL.Texturing.Objects ( TextureObject(..), textureID ) +import Graphics.Rendering.OpenGL.GL.Texturing.PixelInternalFormat +import Graphics.Rendering.OpenGL.GL.Texturing.Specification ( Level ) +import Graphics.Rendering.OpenGL.GL.Texturing.TextureTarget ( + TextureTarget(..), marshalTextureTarget, + CubeMapTarget, marshalCubeMapTarget) +import Graphics.Rendering.OpenGL.GLU.ErrorsInternal ( recordInvalidEnum ) + +-------------------------------------------------------------------------------- + +#include "HsOpenGLExt.h" + +#define GL_FRAMEBUFFER_EXT 0x8D40 +#define GL_RENDERBUFFER_EXT 0x8D41 + +-------------------------------------------------------------------------------- + +-- | Framebuffer objects (FBOs) are an OpenGL extension, which means +-- that they are not universally supported. +areFBOsSupported :: IO Bool +areFBOsSupported = do + exts <- get glExtensions + return $ elem "EXT_framebuffer_object" exts + +-------------------------------------------------------------------------------- + +newtype Renderbuffer = Renderbuffer { renderbufferID :: GLuint } + deriving ( Eq, Ord, Show ) + +newtype Framebuffer = Framebuffer { framebufferID :: GLuint } + deriving ( Eq, Ord, Show ) + +-------------------------------------------------------------------------------- + +data FramebufferAttachment = + ColorAttachment GLsizei + | DepthAttachment + | StencilAttachment + deriving (Eq,Show) + +marshalFramebufferAttachment :: FramebufferAttachment -> GLenum +marshalFramebufferAttachment attch = case attch of + ColorAttachment i + | i <= 15 -> (0x8CE0 + fromIntegral i) + | otherwise -> error "marshalFramebufferAttachment: ColorAttachment index too large" + DepthAttachment -> 0x8D00 + StencilAttachment -> 0x8D20 + +-------------------------------------------------------------------------------- + +instance ObjectName Renderbuffer where + genObjectNames n = + allocaArray n $ \buf -> do + glGenRenderbuffersEXT (fromIntegral n) buf + fmap (map Renderbuffer) $ peekArray n buf + + deleteObjectNames renderbuffers = + withArrayLen (map renderbufferID renderbuffers) $ + glDeleteRenderbuffersEXT . fromIntegral + + isObjectName = fmap unmarshalGLboolean . glIsRenderbufferEXT . renderbufferID + +renderbufferBinding :: StateVar (Maybe Renderbuffer) +renderbufferBinding = + makeStateVar + (do o <- getInteger1 (Renderbuffer . fromIntegral) GetRenderbufferBinding + return $ if o == defaultRenderbuffer then Nothing else Just o) + (glBindFramebufferEXT (GL_RENDERBUFFER_EXT) . renderbufferID . (maybe defaultRenderbuffer id)) + +defaultRenderbuffer :: Renderbuffer +defaultRenderbuffer = Renderbuffer 0 + +EXTENSION_ENTRY("GL_EXT_framebuffer_object",glIsRenderbufferEXT,GLuint -> IO GLboolean) +EXTENSION_ENTRY("GL_EXT_framebuffer_object",glBindRenderbufferEXT,GLenum -> GLuint -> IO ()) +EXTENSION_ENTRY("GL_EXT_framebuffer_object",glDeleteRenderbuffersEXT,GLsizei -> Ptr GLuint -> IO ()) +EXTENSION_ENTRY("GL_EXT_framebuffer_object",glGenRenderbuffersEXT,GLsizei -> Ptr GLuint -> IO ()) + +-------------------------------------------------------------------------------- + +renderbufferStorage :: StateVar (PixelInternalFormat, Size) +renderbufferStorage = makeStateVar getter setter where + getter = do + ifmt <- getRenderbufferParameterInteger1 + (unmarshalPixelInternalFormat . fromIntegral) + GetRenderbufferInternalFormat + sx <- getRenderbufferParameterInteger1 fromIntegral GetRenderbufferWidth + sy <- getRenderbufferParameterInteger1 fromIntegral GetRenderbufferHeight + return ( ifmt , Size sx sy ) + setter (ifmt , Size sx sy) = do + glRenderbufferStorageEXT + GL_RENDERBUFFER_EXT + (fromIntegral $ marshalPixelInternalFormat ifmt) + sx sy + +EXTENSION_ENTRY("GL_EXT_framebuffer_object",glRenderbufferStorageEXT,GLenum -> GLenum -> GLsizei -> GLsizei -> IO ()) + +-------------------------------------------------------------------------------- + +data RenderbufferPixelBits = RenderbufferPixelBits { + renderbufferRedBits :: GLuint + , renderbufferGreenBits :: GLuint + , renderbufferBlueBits :: GLuint + , renderbufferAlphaBits :: GLuint + , renderbufferDepthBits :: GLuint + , renderbufferStencilBits :: GLuint + } + deriving (Eq,Show) + +renderbufferPixelBits :: GettableStateVar RenderbufferPixelBits +renderbufferPixelBits = makeGettableStateVar $ do + red <- getRenderbufferParameterInteger1 fromIntegral GetRenderbufferRedSize + green <- getRenderbufferParameterInteger1 fromIntegral GetRenderbufferGreenSize + blue <- getRenderbufferParameterInteger1 fromIntegral GetRenderbufferBlueSize + alpha <- getRenderbufferParameterInteger1 fromIntegral GetRenderbufferAlphaSize + depth <- getRenderbufferParameterInteger1 fromIntegral GetRenderbufferDepthSize + stencil <- getRenderbufferParameterInteger1 fromIntegral GetRenderbufferStencilSize + return $ RenderbufferPixelBits red green blue alpha depth stencil + +-------------------------------------------------------------------------------- + +getRenderbufferParameterInteger1 :: (GLint -> a) -> GetPName -> IO a +getRenderbufferParameterInteger1 f n = alloca $ \buf -> do + getRenderbufferParameterIntegerv n buf + peek1 f buf + +getRenderbufferParameterEnum1 :: (GLenum -> a) -> GetPName -> IO a +getRenderbufferParameterEnum1 f = getRenderbufferParameterInteger1 (f . fromIntegral) + +getRenderbufferParameterBoolean1 :: (GLboolean -> a) -> GetPName -> IO a +getRenderbufferParameterBoolean1 f = getRenderbufferParameterInteger1 (f . fromIntegral) + +getRenderbufferParameterIntegerv :: GetPName -> Ptr GLint -> IO () +getRenderbufferParameterIntegerv = maybe (const recordInvalidEnum) + (glGetRenderbufferParameterivEXT GL_RENDERBUFFER_EXT) . marshalGetPName + +EXTENSION_ENTRY("GL_EXT_framebuffer_object",glGetRenderbufferParameterivEXT,GLenum -> GLenum -> Ptr GLint -> IO ()) + +-------------------------------------------------------------------------------- + +instance ObjectName Framebuffer where + genObjectNames n = + allocaArray n $ \buf -> do + glGenFramebuffersEXT (fromIntegral n) buf + fmap (map Framebuffer) $ peekArray n buf + + deleteObjectNames framebuffers = + withArrayLen (map framebufferID framebuffers) $ + glDeleteFramebuffersEXT . fromIntegral + + isObjectName = fmap unmarshalGLboolean . glIsFramebufferEXT . framebufferID + +framebufferBinding :: StateVar (Maybe Framebuffer) +framebufferBinding = + makeStateVar + (do o <- getInteger1 (Framebuffer . fromIntegral) GetFramebufferBinding + return $ if o == defaultFramebuffer then Nothing else Just o) + (glBindFramebufferEXT (GL_FRAMEBUFFER_EXT) . framebufferID . (maybe defaultFramebuffer id)) + +defaultFramebuffer :: Framebuffer +defaultFramebuffer = Framebuffer 0 + +EXTENSION_ENTRY("GL_EXT_framebuffer_object",glIsFramebufferEXT,GLuint -> IO GLboolean) +EXTENSION_ENTRY("GL_EXT_framebuffer_object",glBindFramebufferEXT,GLenum -> GLuint -> IO ()) +EXTENSION_ENTRY("GL_EXT_framebuffer_object",glDeleteFramebuffersEXT,GLsizei -> Ptr GLuint -> IO ()) +EXTENSION_ENTRY("GL_EXT_framebuffer_object",glGenFramebuffersEXT,GLsizei -> Ptr GLuint -> IO ()) + +-------------------------------------------------------------------------------- + +data FramebufferStatus = + FramebufferComplete + | FramebufferIncomplete FramebufferIncomplete + | FramebufferUnsupported + deriving (Eq,Show) + +data FramebufferIncomplete = + IncompleteAttachment + | IncompleteMissingAttachment + | IncompleteDimensions + | IncompleteFormats + | IncompleteDrawBuffer + | IncompleteReadBuffer + deriving (Eq,Show) + +checkFramebufferStatus :: IO FramebufferStatus +checkFramebufferStatus = do + i <- glCheckFramebufferStatusEXT GL_FRAMEBUFFER_EXT + return $ case unmarshalFramebufferStatus i of + Just fbs -> fbs + Nothing -> error "checkFramebufferStatus: should not happen" + +marshalFramebufferStatus :: FramebufferStatus -> GLenum +marshalFramebufferStatus fbs = case fbs of + FramebufferComplete -> 0x8CD5 + FramebufferIncomplete fbi -> marshalFramebufferIncomplete fbi + FramebufferUnsupported -> 0x8CDD + +marshalFramebufferIncomplete :: FramebufferIncomplete -> GLenum +marshalFramebufferIncomplete fbi = case fbi of + IncompleteAttachment -> 0x8CD6 + IncompleteMissingAttachment -> 0x8CD7 + IncompleteDimensions -> 0x8CD9 + IncompleteFormats -> 0x8CDA + IncompleteDrawBuffer -> 0x8CDB + IncompleteReadBuffer -> 0x8CDC + +unmarshalFramebufferStatus :: GLenum -> Maybe FramebufferStatus +unmarshalFramebufferStatus i = case i of + 0x8CD5 -> Just FramebufferComplete + 0x8CD6 -> Just $ FramebufferIncomplete IncompleteAttachment + 0x8CD7 -> Just $ FramebufferIncomplete IncompleteMissingAttachment + 0x8CD9 -> Just $ FramebufferIncomplete IncompleteDimensions + 0x8CDA -> Just $ FramebufferIncomplete IncompleteFormats + 0x8CDB -> Just $ FramebufferIncomplete IncompleteDrawBuffer + 0x8CDC -> Just $ FramebufferIncomplete IncompleteReadBuffer + 0x8CDD -> Just FramebufferUnsupported + _ -> Nothing + +EXTENSION_ENTRY("GL_EXT_framebuffer_object",glCheckFramebufferStatusEXT,GLenum -> IO GLenum) + +-------------------------------------------------------------------------------- + +framebufferTexture1D + :: FramebufferAttachment -- ^ should be one of 'ColorAttachment i', 'DepthAttachment' and 'StencilAttachment' + -> Maybe TextureObject -- ^ should be a 1D texture object + -> Level -- ^ mipmap level + -> IO FramebufferStatus +framebufferTexture1D attch texobj level = do + glFramebufferTexture1DEXT + GL_FRAMEBUFFER_EXT + (marshalFramebufferAttachment attch) + (marshalTextureTarget Texture1D) + (maybe 0 textureID texobj) + level + checkFramebufferStatus + +data FramebufferTexture2DTarget = + Texture2D' + | TextureRectangle' + | TextureCubeMap' CubeMapTarget + deriving (Eq,Show) + +marshalFramebufferTexture2DTarget :: FramebufferTexture2DTarget -> GLenum +marshalFramebufferTexture2DTarget tgt = case tgt of + Texture2D' -> marshalTextureTarget Texture2D + TextureRectangle' -> marshalTextureTarget TextureRectangle + TextureCubeMap' cubemaptgt -> marshalCubeMapTarget cubemaptgt + +framebufferTexture2D + :: FramebufferAttachment -- ^ should be one of 'ColorAttachment i', 'DepthAttachment' and 'StencilAttachment' + -> FramebufferTexture2DTarget -- Maybe CubeMapTarget + -> Maybe TextureObject + -> Level -- ^ mipmap level + -> IO FramebufferStatus +framebufferTexture2D attch target texobj level = do + glFramebufferTexture2DEXT + GL_FRAMEBUFFER_EXT + (marshalFramebufferAttachment attch) + -- (maybe (marshalTextureTarget Texture2D) marshalCubeMapTarget cubemaptarget) + (marshalFramebufferTexture2DTarget target) + (maybe 0 textureID texobj) + level + checkFramebufferStatus + +framebufferTexture3D + :: FramebufferAttachment -- ^ should be one of 'ColorAttachment i', 'DepthAttachment' and 'StencilAttachment' + -> Maybe TextureObject -- ^ should be 3D texture object + -> Level -- ^ mipmap level + -> GLint -- ^ z offset + -> IO FramebufferStatus +framebufferTexture3D attch texobj level zoffset = do + glFramebufferTexture3DEXT + GL_FRAMEBUFFER_EXT + (marshalFramebufferAttachment attch) + (marshalTextureTarget Texture3D) + (maybe 0 textureID texobj) + level + zoffset + checkFramebufferStatus + +EXTENSION_ENTRY("GL_EXT_framebuffer_object",glFramebufferTexture1DEXT,GLenum -> GLenum -> GLenum -> GLuint -> GLint -> IO ()) + +EXTENSION_ENTRY("GL_EXT_framebuffer_object",glFramebufferTexture2DEXT,GLenum -> GLenum -> GLenum -> GLuint -> GLint -> IO ()) + +EXTENSION_ENTRY("GL_EXT_framebuffer_object",glFramebufferTexture3DEXT,GLenum -> GLenum -> GLenum -> GLuint -> GLint -> GLint -> IO ()) + +-------------------------------------------------------------------------------- + +framebufferRenderbuffer + :: FramebufferAttachment + -> Maybe Renderbuffer + -> IO FramebufferStatus +framebufferRenderbuffer attch renderbuffer = do + glFramebufferRenderbufferEXT + GL_FRAMEBUFFER_EXT + (marshalFramebufferAttachment attch) + GL_RENDERBUFFER_EXT + (maybe 0 renderbufferID renderbuffer) + checkFramebufferStatus + +EXTENSION_ENTRY("GL_EXT_framebuffer_object",glFramebufferRenderbufferEXT,GLenum -> GLenum -> GLenum -> GLuint -> IO ()) + +-------------------------------------------------------------------------------- + +getFramebufferAttachmentParameterInteger1 :: FramebufferAttachment -> (GLint -> a) -> GetPName -> IO a +getFramebufferAttachmentParameterInteger1 attch f n = alloca $ \buf -> do + getFramebufferAttachmentParameterIntegerv attch n buf + peek1 f buf + +getFramebufferAttachmentParameterEnum1 :: FramebufferAttachment -> (GLenum -> a) -> GetPName -> IO a +getFramebufferAttachmentParameterEnum1 attch f = + getFramebufferAttachmentParameterInteger1 attch (f . fromIntegral) + +getFramebufferAttachmentParameterBoolean1 :: FramebufferAttachment -> (GLboolean -> a) -> GetPName -> IO a +getFramebufferAttachmentParameterBoolean1 attch f = + getFramebufferAttachmentParameterInteger1 attch (f . fromIntegral) + +getFramebufferAttachmentParameterIntegerv :: FramebufferAttachment -> GetPName -> Ptr GLint -> IO () +getFramebufferAttachmentParameterIntegerv attch = maybe (const recordInvalidEnum) + (glGetFramebufferAttachmentParameterivEXT GL_FRAMEBUFFER_EXT (marshalFramebufferAttachment attch)) . marshalGetPName + +EXTENSION_ENTRY("GL_EXT_framebuffer_object",glGetFramebufferAttachmentParameterivEXT,GLenum -> GLenum -> GLenum -> Ptr GLint -> IO ()) + +-------------------------------------------------------------------------------- + +{- +EXTENSION_ENTRY("GL_EXT_framebuffer_object",glGenerateMipmapEXT,GLenum -> IO ()) +-} + +-------------------------------------------------------------------------------- + + hunk ./Graphics/Rendering/OpenGL/GL/QueryUtils.hs 27 getFloat1, getFloat2, getFloat3, getFloat4, getFloatv, getDouble1, getDouble2, getDouble4, getDoublev, getVertexAttribInteger1, getVertexAttribIntegerv, - getVertexAttribEnum1, getVertexAttribBoolean1 + getVertexAttribEnum1, getVertexAttribBoolean1, + marshalGetPName ) where import Foreign.Marshal.Alloc ( alloca ) hunk ./Graphics/Rendering/OpenGL/GL/QueryUtils.hs 435 | GetDrawBufferN GLsizei -- GetWeightArrayBufferBinding -- GetVertexAttribArrayBufferBinding + + | GetFramebufferBinding + | GetRenderbufferBinding + | GetMaxColorAttachments + | GetMaxRenderbufferSize + | GetRenderbufferWidth + | GetRenderbufferHeight + | GetRenderbufferInternalFormat + | GetRenderbufferRedSize + | GetRenderbufferGreenSize + | GetRenderbufferBlueSize + | GetRenderbufferAlphaSize + | GetRenderbufferDepthSize + | GetRenderbufferStencilSize + | GetFramebufferAttachmentType + | GetFramebufferAttachmentName + | GetFramebufferAttachmentTextureLevel + | GetFramebufferAttachmentTextureCubemapFace + | GetFramebufferAttachmentTexture3DZOffset marshalGetPName :: GetPName -> Maybe GLenum marshalGetPName x = case x of hunk ./Graphics/Rendering/OpenGL/GL/QueryUtils.hs 845 -- GetWeightArrayBufferBinding -> Just 0x889e -- GetVertexAttribArrayBufferBinding -> Just 0x889f + GetFramebufferBinding -> Just 0x8CA6 -- use with 'getInteger1' + GetRenderbufferBinding -> Just 0x8CA7 + GetMaxColorAttachments -> Just 0x8CDF + GetMaxRenderbufferSize -> Just 0x84E8 + GetRenderbufferWidth -> Just 0x8D42 -- use with 'getRenderbufferParameter*' + GetRenderbufferHeight -> Just 0x8D43 + GetRenderbufferInternalFormat -> Just 0x8D44 + GetRenderbufferRedSize -> Just 0x8D50 + GetRenderbufferGreenSize -> Just 0x8D51 + GetRenderbufferBlueSize -> Just 0x8D52 + GetRenderbufferAlphaSize -> Just 0x8D53 + GetRenderbufferDepthSize -> Just 0x8D54 + GetRenderbufferStencilSize -> Just 0x8D55 + GetFramebufferAttachmentType -> Just 0x8CD0 -- use with 'getFramebufferAttachmentParameter*' + GetFramebufferAttachmentName -> Just 0x8CD1 + GetFramebufferAttachmentTextureLevel -> Just 0x8CD2 + GetFramebufferAttachmentTextureCubemapFace -> Just 0x8CD3 + GetFramebufferAttachmentTexture3DZOffset -> Just 0x8CD4 + -------------------------------------------------------------------------------- -- 0x3000 through 0x3FFF are reserved for clip planes hunk ./Graphics/Rendering/OpenGL/GL/QueryUtils.hs 1036 EXTENSION_ENTRY("OpenGL 2.0",glGetVertexAttribfv,GLuint -> GLenum -> Ptr GLfloat -> IO ()) EXTENSION_ENTRY("OpenGL 2.0",glGetVertexAttribiv,GLuint -> GLenum -> Ptr GLint -> IO ()) +-------------------------------------------------------------------------------- + hunk ./Graphics/Rendering/OpenGL/GL/Texturing/Objects.hs 17 -------------------------------------------------------------------------------- module Graphics.Rendering.OpenGL.GL.Texturing.Objects ( - TextureObject(TextureObject), textureBinding, + TextureObject(TextureObject), textureID, textureBinding, textureResident, areTexturesResident, TexturePriority, texturePriority, prioritizeTextures ) where hunk ./Graphics/Rendering/OpenGL/GL/Texturing/PixelInternalFormat.hs 86 | CompressedSRGBAlpha | CompressedSLuminance | CompressedSLuminanceAlpha + | StencilIndex1 + | StencilIndex4 + | StencilIndex8 + | StencilIndex16 deriving ( Eq, Ord, Show ) marshalPixelInternalFormat :: PixelInternalFormat -> GLint hunk ./Graphics/Rendering/OpenGL/GL/Texturing/PixelInternalFormat.hs 154 CompressedSRGBAlpha -> 0x8c49 CompressedSLuminance -> 0x8c4a CompressedSLuminanceAlpha -> 0x8c4b + StencilIndex1 -> 0x8D46 -- used with Framebuffer Objects + StencilIndex4 -> 0x8D47 + StencilIndex8 -> 0x8D48 + StencilIndex16 -> 0x8D49 -- *sigh* The OpenGL API is sometimes a bit creative in its usage of types... marshalPixelInternalFormat' :: PixelInternalFormat -> GLenum hunk ./Graphics/Rendering/OpenGL/GL/Texturing/PixelInternalFormat.hs 225 | x == 0x8c49 = CompressedSRGBAlpha | x == 0x8c4a = CompressedSLuminance | x == 0x8c4b = CompressedSLuminanceAlpha + -- stencil for framebuffer objects + | x == 0x8D46 = StencilIndex1 + | x == 0x8D47 = StencilIndex4 + | x == 0x8D48 = StencilIndex8 + | x == 0x8D49 = StencilIndex16 -- legacy values | x == 1 = Luminance' | x == 2 = LuminanceAlpha' hunk ./Graphics/Rendering/OpenGL/GLU/ErrorsInternal.hs 43 | GL_StackUnderflow | GL_OutOfMemory | GL_TableTooLarge + | GL_InvalidFramebufferOperation gl_marshalErrorCode :: GL_ErrorCode -> GLenum gl_marshalErrorCode x = case x of hunk ./Graphics/Rendering/OpenGL/GLU/ErrorsInternal.hs 55 GL_StackUnderflow -> 0x504 GL_OutOfMemory -> 0x505 GL_TableTooLarge -> 0x8031 + GL_InvalidFramebufferOperation -> 0x506 -------------------------------------------------------------------------------- -- See comment above hunk ./Graphics/Rendering/OpenGL/GLU/ErrorsInternal.hs 119 | TableTooLarge | TesselatorError | NURBSError + | InvalidFramebufferOperation deriving ( Eq, Ord, Show ) unmarshalErrorCategory :: GLenum -> ErrorCategory hunk ./Graphics/Rendering/OpenGL/GLU/ErrorsInternal.hs 133 | isTableTooLarge c = TableTooLarge | isTesselatorError c = TesselatorError | isNURBSError c = NURBSError + | isInvalidFramebufferOperation c = InvalidFramebufferOperation | otherwise = error "unmarshalErrorCategory" isInvalidEnum :: GLenum -> Bool hunk ./Graphics/Rendering/OpenGL/GLU/ErrorsInternal.hs 178 marshalNurbsError NurbsError1 <= c && c <= marshalNurbsError NurbsError37 +isInvalidFramebufferOperation :: GLenum -> Bool +isInvalidFramebufferOperation c = + c == gl_marshalErrorCode GL_InvalidFramebufferOperation + -------------------------------------------------------------------------------- -- The returned error string is statically allocated, so peekCString hunk ./OpenGL.cabal 39 Graphics.Rendering.OpenGL.GL.DisplayLists, Graphics.Rendering.OpenGL.GL.Evaluators, Graphics.Rendering.OpenGL.GL.Feedback, + Graphics.Rendering.OpenGL.GL.FBO, Graphics.Rendering.OpenGL.GL.FlushFinish, Graphics.Rendering.OpenGL.GL.Fog, Graphics.Rendering.OpenGL.GL.Framebuffer, } [more FBO support/fixes Balazs Komuves **20081217120454] { hunk ./Graphics/Rendering/OpenGL/GL/FBO.hs 18 module Graphics.Rendering.OpenGL.GL.FBO ( areFBOsSupported, - FramebufferAttachment(..), - Renderbuffer(..), renderbufferBinding, defaultRenderbuffer, + FramebufferAttachment(..), maxColorAttachments, + Renderbuffer(..), renderbufferBinding, renderbufferStorage, + defaultRenderbuffer, maxRenderbufferSize, Framebuffer(..), framebufferBinding, defaultFramebuffer, FramebufferTexture2DTarget(..), framebufferTexture1D, framebufferTexture2D, hunk ./Graphics/Rendering/OpenGL/GL/FBO.hs 25 framebufferTexture3D, framebufferRenderbuffer, + framebufferAttachment, FramebufferAttachment'(..), + framebufferAttachmentTextureLevel, + framebufferAttachmentTextureCubeMapFace, + framebufferAttachmentTexture3DZOffset, RenderbufferPixelBits(..), renderbufferPixelBits, hunk ./Graphics/Rendering/OpenGL/GL/FBO.hs 30 - getFramebufferAttachmentParameterInteger1, - getFramebufferAttachmentParameterEnum1, FramebufferStatus(..), checkFramebufferStatus ) where hunk ./Graphics/Rendering/OpenGL/GL/FBO.hs 54 import Graphics.Rendering.OpenGL.GL.Texturing.Specification ( Level ) import Graphics.Rendering.OpenGL.GL.Texturing.TextureTarget ( TextureTarget(..), marshalTextureTarget, - CubeMapTarget, marshalCubeMapTarget) + CubeMapTarget, marshalCubeMapTarget, unmarshalCubeMapTarget ) import Graphics.Rendering.OpenGL.GLU.ErrorsInternal ( recordInvalidEnum ) -------------------------------------------------------------------------------- hunk ./Graphics/Rendering/OpenGL/GL/FBO.hs 84 -------------------------------------------------------------------------------- data FramebufferAttachment = - ColorAttachment GLsizei + ColorAttachment GLenum | DepthAttachment | StencilAttachment deriving (Eq,Show) hunk ./Graphics/Rendering/OpenGL/GL/FBO.hs 97 DepthAttachment -> 0x8D00 StencilAttachment -> 0x8D20 +-- | The largest 'ColorAttachment' value allowed is @n-1@, where +-- @n = get maxColorAttachments$ +maxColorAttachments :: GettableStateVar GLuint +maxColorAttachments = makeGettableStateVar $ do + getInteger1 fromIntegral GetMaxColorAttachments + -------------------------------------------------------------------------------- instance ObjectName Renderbuffer where hunk ./Graphics/Rendering/OpenGL/GL/FBO.hs 122 makeStateVar (do o <- getInteger1 (Renderbuffer . fromIntegral) GetRenderbufferBinding return $ if o == defaultRenderbuffer then Nothing else Just o) - (glBindFramebufferEXT (GL_RENDERBUFFER_EXT) . renderbufferID . (maybe defaultRenderbuffer id)) + (glBindRenderbufferEXT (GL_RENDERBUFFER_EXT) . renderbufferID . (maybe defaultRenderbuffer id)) defaultRenderbuffer :: Renderbuffer defaultRenderbuffer = Renderbuffer 0 hunk ./Graphics/Rendering/OpenGL/GL/FBO.hs 127 +maxRenderbufferSize :: GettableStateVar GLsizei +maxRenderbufferSize = makeGettableStateVar $ do + getInteger1 fromIntegral GetMaxRenderbufferSize + EXTENSION_ENTRY("GL_EXT_framebuffer_object",glIsRenderbufferEXT,GLuint -> IO GLboolean) EXTENSION_ENTRY("GL_EXT_framebuffer_object",glBindRenderbufferEXT,GLenum -> GLuint -> IO ()) EXTENSION_ENTRY("GL_EXT_framebuffer_object",glDeleteRenderbuffersEXT,GLsizei -> Ptr GLuint -> IO ()) hunk ./Graphics/Rendering/OpenGL/GL/FBO.hs 184 getRenderbufferParameterIntegerv n buf peek1 f buf +{- getRenderbufferParameterEnum1 :: (GLenum -> a) -> GetPName -> IO a getRenderbufferParameterEnum1 f = getRenderbufferParameterInteger1 (f . fromIntegral) hunk ./Graphics/Rendering/OpenGL/GL/FBO.hs 190 getRenderbufferParameterBoolean1 :: (GLboolean -> a) -> GetPName -> IO a getRenderbufferParameterBoolean1 f = getRenderbufferParameterInteger1 (f . fromIntegral) +-} getRenderbufferParameterIntegerv :: GetPName -> Ptr GLint -> IO () getRenderbufferParameterIntegerv = maybe (const recordInvalidEnum) hunk ./Graphics/Rendering/OpenGL/GL/FBO.hs 282 -------------------------------------------------------------------------------- +data FramebufferAttachment' = + None' + | TextureObject' TextureObject + | Renderbuffer' Renderbuffer + deriving (Eq,Show) + +framebufferAttachment :: GettableStateVar FramebufferAttachment' +framebufferAttachment = makeGettableStateVar $ do + typ <- getInteger1 fromIntegral GetFramebufferAttachmentObjectType + nam <- getInteger1 fromIntegral GetFramebufferAttachmentObjectName + return $ case typ of + 0 -> None' + 0x1702 -> TextureObject' (TextureObject nam) -- 0x1702 = GL_TEXTURE + GL_RENDERBUFFER_EXT -> Renderbuffer' (Renderbuffer nam) + +framebufferAttachmentTextureLevel :: GettableStateVar GLuint +framebufferAttachmentTextureLevel = makeGettableStateVar $ do + getInteger1 fromIntegral GetFramebufferAttachmentTextureLevel + +framebufferAttachmentTextureCubeMapFace :: GettableStateVar CubeMapTarget +framebufferAttachmentTextureCubeMapFace = makeGettableStateVar $ do + getInteger1 + (unmarshalCubeMapTarget . fromIntegral) + GetFramebufferAttachmentTextureCubeMapFace + +framebufferAttachmentTexture3DZOffset :: GettableStateVar GLuint +framebufferAttachmentTexture3DZOffset = makeGettableStateVar $ do + getInteger1 fromIntegral GetFramebufferAttachmentTexture3DZOffset + +-------------------------------------------------------------------------------- + framebufferTexture1D :: FramebufferAttachment -- ^ should be one of 'ColorAttachment i', 'DepthAttachment' and 'StencilAttachment' -> Maybe TextureObject -- ^ should be a 1D texture object hunk ./Graphics/Rendering/OpenGL/GL/FBO.hs 400 getFramebufferAttachmentParameterIntegerv attch n buf peek1 f buf +{- getFramebufferAttachmentParameterEnum1 :: FramebufferAttachment -> (GLenum -> a) -> GetPName -> IO a getFramebufferAttachmentParameterEnum1 attch f = getFramebufferAttachmentParameterInteger1 attch (f . fromIntegral) hunk ./Graphics/Rendering/OpenGL/GL/FBO.hs 408 getFramebufferAttachmentParameterBoolean1 :: FramebufferAttachment -> (GLboolean -> a) -> GetPName -> IO a getFramebufferAttachmentParameterBoolean1 attch f = getFramebufferAttachmentParameterInteger1 attch (f . fromIntegral) +-} getFramebufferAttachmentParameterIntegerv :: FramebufferAttachment -> GetPName -> Ptr GLint -> IO () getFramebufferAttachmentParameterIntegerv attch = maybe (const recordInvalidEnum) hunk ./Graphics/Rendering/OpenGL/GL/QueryUtils.hs 449 | GetRenderbufferAlphaSize | GetRenderbufferDepthSize | GetRenderbufferStencilSize - | GetFramebufferAttachmentType - | GetFramebufferAttachmentName + | GetFramebufferAttachmentObjectType + | GetFramebufferAttachmentObjectName | GetFramebufferAttachmentTextureLevel hunk ./Graphics/Rendering/OpenGL/GL/QueryUtils.hs 452 - | GetFramebufferAttachmentTextureCubemapFace + | GetFramebufferAttachmentTextureCubeMapFace | GetFramebufferAttachmentTexture3DZOffset marshalGetPName :: GetPName -> Maybe GLenum hunk ./Graphics/Rendering/OpenGL/GL/QueryUtils.hs 858 GetRenderbufferAlphaSize -> Just 0x8D53 GetRenderbufferDepthSize -> Just 0x8D54 GetRenderbufferStencilSize -> Just 0x8D55 - GetFramebufferAttachmentType -> Just 0x8CD0 -- use with 'getFramebufferAttachmentParameter*' - GetFramebufferAttachmentName -> Just 0x8CD1 + GetFramebufferAttachmentObjectType -> Just 0x8CD0 -- use with 'getFramebufferAttachmentParameter*' + GetFramebufferAttachmentObjectName -> Just 0x8CD1 GetFramebufferAttachmentTextureLevel -> Just 0x8CD2 hunk ./Graphics/Rendering/OpenGL/GL/QueryUtils.hs 861 - GetFramebufferAttachmentTextureCubemapFace -> Just 0x8CD3 + GetFramebufferAttachmentTextureCubeMapFace -> Just 0x8CD3 GetFramebufferAttachmentTexture3DZOffset -> Just 0x8CD4 -------------------------------------------------------------------------------- hunk ./Graphics/Rendering/OpenGL/GL/Texturing/TextureTarget.hs 18 module Graphics.Rendering.OpenGL.GL.Texturing.TextureTarget ( TextureTarget(..), marshalTextureTarget, marshalProxyTextureTarget, - CubeMapTarget(..), marshalCubeMapTarget + CubeMapTarget(..), marshalCubeMapTarget, unmarshalCubeMapTarget ) where import Graphics.Rendering.OpenGL.GL.BasicTypes ( GLenum ) hunk ./Graphics/Rendering/OpenGL/GL/Texturing/TextureTarget.hs 70 TextureCubeMapNegativeY -> 0x8518 TextureCubeMapPositiveZ -> 0x8519 TextureCubeMapNegativeZ -> 0x851a + +unmarshalCubeMapTarget :: GLenum -> CubeMapTarget +unmarshalCubeMapTarget x = case x of + 0x8515 -> TextureCubeMapPositiveX + 0x8516 -> TextureCubeMapNegativeX + 0x8517 -> TextureCubeMapPositiveY + 0x8518 -> TextureCubeMapNegativeY + 0x8519 -> TextureCubeMapPositiveZ + 0x851a -> TextureCubeMapNegativeZ } Context: [TAG GHC 6.8.1 release Ian Lynagh **20071110011104] [TAG 2.2.1.1 release Ian Lynagh **20071110010954] [Bump version number Ian Lynagh **20071027124805] [Specify build-type: Configure Duncan Coutts **20071018173137] [--configure-option and --ghc-option are now provided by Cabal Ross Paterson **20070604115936] [Remove Makefile and package.conf.in (used in the old GHC build system) Ian Lynagh **20070524145614] [add includes: field Simon Marlow **20070517094912] [Make configure fail if the package cannot be built Ian Lynagh **20070430111732] [TAG GHC 6.6.1 release Ian Lynagh **20070428195851] [TAG 2.2.1 release Ian Lynagh **20070428195655] [TAG GHC 6.6.1 release Ian Lynagh **20070424113929] [TAG Version 2.2.1 Ian Lynagh **20070424113831] [Bump version to 2.2.1 Ian Lynagh **20070422195057] [Follow Cabal changes in Setup.*hs Ian Lynagh **20070418121330] [Fix -Wall warnings Ian Lynagh **20070411012221] [Make Setup.hs suitable for building in a GHC tree Ian Lynagh **20070407174116] [Importing hs_OpenGL_getProcAddres must use ccall instead of CALLCONV sven.panne@aedion.de**20070313174609 Patch provided by shelarcy@gmail.com ] [README about building from darcs Ross Paterson **20070218110200] [Note that we support OpenGL 2.1 now sven.panne@aedion.de**20070101125021] [Completed implementation of drawBuffers sven.panne@aedion.de**20061130133951] [Made drawBuffers a full-blown StateVar (getter not yet implemented) sven.panne@aedion.de**20061130132401] [Refactored (un)marshalling of modelview indices, fixing an off-by-two bug on the way sven.panne@aedion.de**20061130132135] [Changed the type of a few implementation limits to GLsizei for consistency reasons sven.panne@aedion.de**20061130123956] [Added current raster secondary color query sven.panne@aedion.de**20061129125402] [Added sRGB textures sven.panne@aedion.de**20061129121705] [Added pixel buffer objects sven.panne@aedion.de**20061129093054] [Made 'uniform' a 'StateVar' to allow queries, too sven.panne@aedion.de**20061122130106] [Added missing Storable instance for FogCoord1 sven.panne@aedion.de**20061122123656] [Added vertexProgramTwoSide and vertexProgramPointSize sven.panne@aedion.de**20061121120200] [Do not return trailing NUL in shader string queries sven.panne@aedion.de**20061115151908] [Make Eq/Ord/Show/ObjectName superclasses of Shader sven.panne@aedion.de**20061112140430] [Added utility function 'majorMinor' to easily parse OpenGL's version strings sven.panne@aedion.de**20061112131225] [Extended the set of possible types for vertex attributes and uniform variables sven.panne@aedion.de**20061110131951] [Distributed shader-related stuff to the right modules sven.panne@aedion.de**20061110122648] [Updated Haddock module headers (now OpenGL 2.1 support, API is stable) sven.panne@aedion.de**20061110101454] [Partial implementation of vertex attributes/uniform variables sven.panne@aedion.de**20061109143842] [Added a few missing OpenGL 2.0 features and prepared GLSL variable access sven.panne@aedion.de**20061108144500] [Added Haddock comments for GLSL implementation limits sven.panne@aedion.de**20061107140514] [Completed handling of shaders and programs sven.panne@aedion.de**20061106151311] [Implement almost all shader/program related API entries sven.panne@aedion.de**20061103141002] [More GLSL functionality, mainly queries plus some cleanup sven.panne@aedion.de**20061102134107] [Added shading-related queries sven.panne@aedion.de**20061102133821] [Added missing import sven.panne@aedion.de**20061102094212] [Added basic Shader/Program functionality sven.panne@aedion.de**20061101210232] [First steps towards GLSL support sven.panne@aedion.de**20061101193753] [Added autoconf magic for GLchar/GLintptr/GLsizeiptr sven.panne@aedion.de**20061101183122] [Slightly improved the NURBS API sven.panne@aedion.de**20061012114037] [includes -> install-includes Ross Paterson **20060829123744] [exclude Setup.hs even if not building package Ross Paterson **20060825222701] [exclude Setup.hs from build Ross Paterson **20060824183533] [add boilerplate Setup.hs Ross Paterson **20060824115102] [add files used by configure Ross Paterson **20060518174356] [TAG Initial conversion from CVS complete John Goerzen **20060112154136] Patch bundle hash: ba3ba67c931bccd977a97544c9743c3fe8cdd24e