Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
5237b3e
added Conditional rendering
Laar May 8, 2011
00539ad
added mapping a buffer range, as in sec 2.9 of the 3.0 spec
Laar May 8, 2011
d823187
added 3 _<- bindings to suppres warnings
Laar May 8, 2011
02d06a7
Add indexed quering and indexed buffers
Laar May 13, 2011
abb2c80
Add part of implementation of transformfeedbackbuffers
Laar May 13, 2011
f6c592d
adds TFB to shaderprograms and documents TFB's
Laar May 22, 2011
76cc265
Adds PrimitivesGenerated as query target
Laar May 22, 2011
4160ef4
adds starting work on FramebufferObjects
Laar May 26, 2011
8302c67
Adds binding functions for Textures to FBO's
Laar May 28, 2011
9430227
splits FBO to several files, adds querying partially
Laar May 29, 2011
d70d6df
adds PixellikeObject for quering componentsize
Laar Jun 24, 2011
b76bdc3
adds further support for FBO's
Laar Jun 24, 2011
929cafa
Adds updated tokens from Spec 3.0
Laar Jun 24, 2011
918ca06
minor fixes (im/export, unmarshal fail)
Laar Jun 24, 2011
39986d5
adds lots of format enums (3.0), RasterizerDiscard
Laar Jun 24, 2011
25b3699
adds indexed capabilities and per buffer blending
Laar Jun 28, 2011
9aee901
Adds support for fragDataLocation
Laar Jun 28, 2011
b4c4187
adds improvements to BufferModes and FBOAs
Laar Jun 28, 2011
f4e54e2
fixes blendBuffer to use gl_DRAW_BUFFERi
Laar Jun 29, 2011
addf526
adds colorMaski, (and the used getBoolean{4i v})
Laar Jun 29, 2011
1a25ec8
add support for color clamping
Laar Jul 1, 2011
413001d
fixes a wrong offset in Colormaski ( added in addf52)
Laar Jul 1, 2011
06b18fe
Adds support for VertexArrayObjects
Laar Aug 13, 2011
c153e62
relocated VertexArrayObjects to it's own module
Laar Aug 18, 2011
399af19
Adds extra query options for RenderbufferTarget
Laar Aug 28, 2011
cbf51c4
adds extra querying for getFBAPName
Laar Aug 31, 2011
fcb804e
Adds DataTypeType,
Laar Aug 31, 2011
2ccfa14
relocate all pixellikeObject code to it's own file.
Laar Aug 31, 2011
4491f13
fix a bug with unmarshaling edgeflags
Laar Aug 31, 2011
297a883
Changes some code in response to hlint output.
Laar Aug 31, 2011
1b88868
Adds TextureUnit isntances for Uniform and Storable
Laar Sep 1, 2011
598e306
Adds blitFrameBuffer.
Laar Sep 1, 2011
0317578
Splits Shaders.hs in several files for maintainability
Laar Sep 1, 2011
4556591
Adding some doc, and fix unused imports for previous commit
Laar Sep 1, 2011
8b52bc1
Merge branch 'SplitShader'
Laar Sep 1, 2011
6046449
Merge branch 'master' into GL30
Laar Sep 1, 2011
ba575a2
removes a file that shouldn't have been added in 03175781
Laar Sep 1, 2011
33a010f
Merge branch 'SplitShader'
Laar Sep 1, 2011
130cbf6
Merge branch 'master' into GL30
Laar Sep 1, 2011
8925548
Merge pull request #1 from Laar/master
Laar Oct 28, 2011
0ca002f
Merge remote branch 'hopengl/master' into develop
Laar Apr 16, 2012
c72e0da
Merge branch 'develop' into GL30
Laar Apr 16, 2012
3c9dd01
Splits the PName into parts for typesafety
Laar Apr 21, 2012
8e20360
Cleans up the imports of the new QueryUtils.PName
Laar Apr 21, 2012
6166f3c
Puts (unsafe) VertexAttrib queries in a module.
Laar Apr 21, 2012
884a6e9
Bump version number before merging back
Laar Apr 21, 2012
284cbdc
Merge branch 'splittingPName' into develop
Laar Apr 21, 2012
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion Graphics/Rendering/OpenGL/GL.hs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
-- Module : Graphics.Rendering.OpenGL.GL
-- Copyright : (c) Sven Panne 2002-2009
-- License : BSD-style (see the file libraries/OpenGL/LICENSE)
--
--
-- Maintainer : sven.panne@aedion.de
-- Stability : stable
-- Portability : portable
Expand All @@ -19,6 +19,7 @@ module Graphics.Rendering.OpenGL.GL (
module Graphics.Rendering.OpenGL.GL.BeginEnd,
module Graphics.Rendering.OpenGL.GL.VertexSpec,
module Graphics.Rendering.OpenGL.GL.VertexArrays,
module Graphics.Rendering.OpenGL.GL.VertexArrayObjects,
module Graphics.Rendering.OpenGL.GL.BufferObjects,
module Graphics.Rendering.OpenGL.GL.Rectangles,
module Graphics.Rendering.OpenGL.GL.CoordTrans,
Expand All @@ -29,6 +30,7 @@ module Graphics.Rendering.OpenGL.GL (

-- * Rasterization
module Graphics.Rendering.OpenGL.GL.Antialiasing,
module Graphics.Rendering.OpenGL.GL.FramebufferObjects,
module Graphics.Rendering.OpenGL.GL.Points,
module Graphics.Rendering.OpenGL.GL.LineSegments,
module Graphics.Rendering.OpenGL.GL.Polygons,
Expand All @@ -50,6 +52,10 @@ module Graphics.Rendering.OpenGL.GL (
module Graphics.Rendering.OpenGL.GL.DisplayLists,
module Graphics.Rendering.OpenGL.GL.FlushFinish,
module Graphics.Rendering.OpenGL.GL.Hints,
module Graphics.Rendering.OpenGL.GL.PixellikeObject,
module Graphics.Rendering.OpenGL.GL.TransformFeedback,
-- is exported through PerFragment for backwards compatibility reasons
-- module Graphics.Rendering.OpenGL.GL.QueryObjects,

-- * State and State Requests
module Data.StateVar,
Expand All @@ -65,6 +71,7 @@ import Graphics.Rendering.OpenGL.Raw.Core31 (
import Graphics.Rendering.OpenGL.GL.BeginEnd
import Graphics.Rendering.OpenGL.GL.VertexSpec
import Graphics.Rendering.OpenGL.GL.VertexArrays
import Graphics.Rendering.OpenGL.GL.VertexArrayObjects
import Graphics.Rendering.OpenGL.GL.BufferObjects
import Graphics.Rendering.OpenGL.GL.Rectangles
import Graphics.Rendering.OpenGL.GL.CoordTrans
Expand All @@ -74,6 +81,7 @@ import Graphics.Rendering.OpenGL.GL.Colors
import Graphics.Rendering.OpenGL.GL.Shaders

import Graphics.Rendering.OpenGL.GL.Antialiasing
import Graphics.Rendering.OpenGL.GL.FramebufferObjects
import Graphics.Rendering.OpenGL.GL.Points
import Graphics.Rendering.OpenGL.GL.LineSegments
import Graphics.Rendering.OpenGL.GL.Polygons
Expand All @@ -93,6 +101,10 @@ import Graphics.Rendering.OpenGL.GL.Feedback
import Graphics.Rendering.OpenGL.GL.DisplayLists
import Graphics.Rendering.OpenGL.GL.FlushFinish
import Graphics.Rendering.OpenGL.GL.Hints
import Graphics.Rendering.OpenGL.GL.PixellikeObject
import Graphics.Rendering.OpenGL.GL.TransformFeedback
-- is exported through PerFragment for backwards compatibility reasons
--import Graphics.Rendering.OpenGL.GL.QueryObjects

import Data.StateVar
import Data.Tensor
Expand Down
4 changes: 2 additions & 2 deletions Graphics/Rendering/OpenGL/GL/Antialiasing.hs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
-- Module : Graphics.Rendering.OpenGL.GL.Antialiasing
-- Copyright : (c) Sven Panne 2002-2009
-- License : BSD-style (see the file libraries/OpenGL/LICENSE)
--
--
-- Maintainer : sven.panne@aedion.de
-- Stability : stable
-- Portability : portable
Expand Down Expand Up @@ -36,5 +36,5 @@ multisample = makeCapability CapMultisample
subpixelBits :: GettableStateVar GLsizei
subpixelBits = antialiasingInfo GetSubpixelBits

antialiasingInfo :: GetPName -> GettableStateVar GLsizei
antialiasingInfo :: GetPName1I p => p -> GettableStateVar GLsizei
antialiasingInfo = makeGettableStateVar . getSizei1 id
59 changes: 44 additions & 15 deletions Graphics/Rendering/OpenGL/GL/BufferMode.hs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
-- Module : Graphics.Rendering.OpenGL.GL.BufferMode
-- Copyright : (c) Sven Panne 2002-2009
-- License : BSD-style (see the file libraries/OpenGL/LICENSE)
--
--
-- Maintainer : sven.panne@aedion.de
-- Stability : stable
-- Portability : portable
Expand All @@ -14,7 +14,8 @@
--------------------------------------------------------------------------------

module Graphics.Rendering.OpenGL.GL.BufferMode (
BufferMode(..), marshalBufferMode, unmarshalBufferMode
BufferMode(..), marshalBufferMode, unmarshalBufferMode, unmarshalBufferModeSafe,
maxColorAttachments,
) where

import Graphics.Rendering.OpenGL.Raw.Core31
Expand Down Expand Up @@ -60,6 +61,9 @@ data BufferMode =
-- front left color buffer is selected.
| AuxBuffer GLsizei
-- ^ Only the given auxiliary color buffer no. /i/ is selected.
| FBOColorAttachment GLsizei
-- ^ Only the given color attachment of the bound framebufferobject is selected for reading
-- or writing.
deriving ( Eq, Ord, Show )

marshalBufferMode :: BufferMode -> Maybe GLenum
Expand All @@ -77,21 +81,46 @@ marshalBufferMode x = case x of
AuxBuffer i
| fromIntegral i <= maxAuxBuffer -> Just (gl_AUX0 + fromIntegral i)
| otherwise -> Nothing
FBOColorAttachment i
| fromIntegral i <= maxColorAttachments -> Just (gl_COLOR_ATTACHMENT0 + fromIntegral i)
| otherwise -> Nothing

unmarshalBufferMode :: GLenum -> BufferMode
unmarshalBufferMode x
| x == gl_NONE = NoBuffers
| x == gl_FRONT_LEFT = FrontLeftBuffer
| x == gl_FRONT_RIGHT = FrontRightBuffer
| x == gl_BACK_LEFT = BackLeftBuffer
| x == gl_BACK_RIGHT = BackRightBuffer
| x == gl_FRONT = FrontBuffers
| x == gl_BACK = BackBuffers
| x == gl_LEFT = LeftBuffers
| x == gl_RIGHT = RightBuffers
| x == gl_FRONT_AND_BACK = FrontAndBackBuffers
| gl_AUX0 <= x && x <= gl_AUX0 + maxAuxBuffer = AuxBuffer (fromIntegral (x - gl_AUX0))
| otherwise = error ("unmarshalBufferMode: illegal value " ++ show x)
unmarshalBufferMode x = maybe
(error ("unmarshalBufferMode: illegal value " ++ show x)) id $ unmarshalBufferModeSafe x
--unmarshalBufferMode x
-- | x == gl_NONE = NoBuffers
-- | x == gl_FRONT_LEFT = FrontLeftBuffer
-- | x == gl_FRONT_RIGHT = FrontRightBuffer
-- | x == gl_BACK_LEFT = BackLeftBuffer
-- | x == gl_BACK_RIGHT = BackRightBuffer
-- | x == gl_FRONT = FrontBuffers
-- | x == gl_BACK = BackBuffers
-- | x == gl_LEFT = LeftBuffers
-- | x == gl_RIGHT = RightBuffers
-- | x == gl_FRONT_AND_BACK = FrontAndBackBuffers
-- | gl_AUX0 <= x && x <= gl_AUX0 + maxAuxBuffer = AuxBuffer (fromIntegral (x - gl_AUX0))
-- | otherwise = error ("unmarshalBufferMode: illegal value " ++ show x)

unmarshalBufferModeSafe :: GLenum -> Maybe BufferMode
unmarshalBufferModeSafe x
| x == gl_NONE = Just NoBuffers
| x == gl_FRONT_LEFT = Just FrontLeftBuffer
| x == gl_FRONT_RIGHT = Just FrontRightBuffer
| x == gl_BACK_LEFT = Just BackLeftBuffer
| x == gl_BACK_RIGHT = Just BackRightBuffer
| x == gl_FRONT = Just FrontBuffers
| x == gl_BACK = Just BackBuffers
| x == gl_LEFT = Just LeftBuffers
| x == gl_RIGHT = Just RightBuffers
| x == gl_FRONT_AND_BACK = Just FrontAndBackBuffers
| gl_AUX0 <= x && x <= gl_AUX0 + maxAuxBuffer = Just . AuxBuffer . fromIntegral $ x - gl_AUX0
| gl_COLOR_ATTACHMENT0 <= x && x <= gl_COLOR_ATTACHMENT0 + maxColorAttachments
= Just . FBOColorAttachment . fromIntegral $ x - gl_COLOR_ATTACHMENT0
| otherwise = Nothing

maxAuxBuffer :: GLenum
maxAuxBuffer = 246

maxColorAttachments :: GLenum
maxColorAttachments = 16
137 changes: 132 additions & 5 deletions Graphics/Rendering/OpenGL/GL/BufferObjects.hs
Original file line number Diff line number Diff line change
Expand Up @@ -30,15 +30,31 @@ module Graphics.Rendering.OpenGL.GL.BufferObjects (
-- * Mapping Buffer Objects
BufferAccess(..), MappingFailure(..), withMappedBuffer,
mapBuffer, unmapBuffer,
bufferAccess, bufferMapped
bufferAccess, bufferMapped,

BufferRangeAccessBit(..), Offset, Length,
mapBufferRange, flushMappedBufferRange,

-- * Indexed Buffer manipulation
BufferIndex,
RangeStartIndex, RangeSize,
BufferRange,
IndexedBufferTarget(..),
bindBufferBase, bindBufferRange,
indexedBufferStart, indexedBufferSize
) where

import Data.ObjectName
import Data.List(foldl1')
import Data.Bits((.|.))
import Data.Maybe

import Data.StateVar
import Foreign.Marshal.Alloc
import Foreign.Marshal.Array
import Foreign.Ptr
import Foreign.Storable

import Graphics.Rendering.OpenGL.GL.Exception
import Graphics.Rendering.OpenGL.GL.GLboolean
import Graphics.Rendering.OpenGL.GL.PeekPoke
Expand Down Expand Up @@ -75,6 +91,7 @@ data BufferTarget =
| ElementArrayBuffer
| PixelPackBuffer
| PixelUnpackBuffer
| TransformFeedbackBuffer
deriving ( Eq, Ord, Show )

marshalBufferTarget :: BufferTarget -> GLenum
Expand All @@ -85,15 +102,17 @@ marshalBufferTarget x = case x of
ElementArrayBuffer -> gl_ELEMENT_ARRAY_BUFFER
PixelPackBuffer -> gl_PIXEL_PACK_BUFFER
PixelUnpackBuffer -> gl_PIXEL_UNPACK_BUFFER
TransformFeedbackBuffer -> gl_TRANSFORM_FEEDBACK_BUFFER

bufferTargetToGetPName :: BufferTarget -> GetPName
bufferTargetToGetPName :: BufferTarget -> PName1I
bufferTargetToGetPName x = case x of
ArrayBuffer -> GetArrayBufferBinding
ElementArrayBuffer -> GetElementArrayBufferBinding
CopyReadBuffer -> GetCopyReadBuffer
CopyWriteBuffer -> GetCopyWriteBuffer
PixelPackBuffer -> GetPixelPackBufferBinding
PixelUnpackBuffer -> GetPixelUnpackBufferBinding
TransformFeedbackBuffer -> GetTransformFeedbackBufferBinding

--------------------------------------------------------------------------------

Expand Down Expand Up @@ -163,7 +182,7 @@ bindBuffer t = makeStateVar (getBindBuffer t) (setBindBuffer t)
getBindBuffer :: BufferTarget -> IO (Maybe BufferObject)
getBindBuffer = bufferQuery bufferTargetToGetPName

bufferQuery :: (a -> GetPName) -> a -> IO (Maybe BufferObject)
bufferQuery :: (a -> PName1I) -> a -> IO (Maybe BufferObject)
bufferQuery func t = do
buf <- getInteger1 (BufferObject . fromIntegral) (func t)
return $ if buf == noBufferObject then Nothing else Just buf
Expand All @@ -173,9 +192,9 @@ noBufferObject = BufferObject 0

setBindBuffer :: BufferTarget -> Maybe BufferObject -> IO ()
setBindBuffer t =
glBindBuffer (marshalBufferTarget t) . bufferID . maybe noBufferObject id
glBindBuffer (marshalBufferTarget t) . bufferID . fromMaybe noBufferObject

clientArrayTypeToGetPName :: ClientArrayType -> GetPName
clientArrayTypeToGetPName :: ClientArrayType -> PName1I
clientArrayTypeToGetPName x = case x of
VertexArray -> GetVertexArrayBufferBinding
NormalArray -> GetNormalArrayBufferBinding
Expand Down Expand Up @@ -291,3 +310,111 @@ bufferAccess t = makeGettableStateVar $
bufferMapped :: BufferTarget -> GettableStateVar Bool
bufferMapped t = makeGettableStateVar $
getBufferParameter t unmarshalGLboolean GetBufferMapped

--------------------------------------------------------------------------------

data BufferRangeAccessBit =
ReadBit
| WriteBit
| InvalidateRangeBit
| InvalidateBufferBit
| FlushExplicitBit
| UnsychronizedBit

type Offset = GLintptr
type Length = GLsizeiptr

marshalBufferRangeAccessBit :: BufferRangeAccessBit -> GLenum
marshalBufferRangeAccessBit x = case x of
ReadBit -> gl_MAP_READ_BIT
WriteBit -> gl_MAP_WRITE_BIT
InvalidateRangeBit -> gl_MAP_INVALIDATE_RANGE_BIT
InvalidateBufferBit -> gl_MAP_INVALIDATE_BUFFER_BIT
FlushExplicitBit -> gl_MAP_FLUSH_EXPLICIT_BIT
UnsychronizedBit -> gl_MAP_FLUSH_EXPLICIT_BIT

marshalToBitfield :: [BufferRangeAccessBit] -> GLenum
marshalToBitfield b = foldl1' (.|.) $ map marshalBufferRangeAccessBit b

--------------------------------------------------------------------------------

mapBufferRange_ :: BufferTarget -> Offset -> Length ->
[BufferRangeAccessBit] -> IO (Ptr a)
mapBufferRange_ t o l b = glMapBufferRange (marshalBufferTarget t) o l
(fromIntegral $ marshalToBitfield b)

mapBufferRange :: BufferTarget -> Offset -> Length ->
[BufferRangeAccessBit] -> IO (Maybe (Ptr a))
mapBufferRange t o l b = fmap (maybeNullPtr Nothing Just) $ mapBufferRange_ t o l b

flushMappedBufferRange :: BufferTarget -> Offset -> Length -> IO()
flushMappedBufferRange t = glFlushMappedBufferRange (marshalBufferTarget t)


--------------------------------------------------------------------------------
type BufferIndex = GLuint

type RangeStartIndex = GLintptr
type RangeSize = GLsizeiptr
type BufferRange = (BufferObject, RangeStartIndex, RangeSize)

data IndexedBufferTarget =
IndexedTransformFeedBackbuffer
--marshaling
marshalIndexedBufferTarget :: IndexedBufferTarget -> IPName1I
marshalIndexedBufferTarget x = case x of
IndexedTransformFeedBackbuffer -> GetTransformFeedbackBuffer

marshalIndexedBufferStart :: IndexedBufferTarget -> IPName1I
marshalIndexedBufferStart x = case x of
IndexedTransformFeedBackbuffer -> GetTransformFeedbackBufferStart

marshalIndexedBufferSize :: IndexedBufferTarget -> IPName1I
marshalIndexedBufferSize x = case x of
IndexedTransformFeedBackbuffer -> GetTransformFeedbackBufferSize

getIndexed :: Num a => IPName1I -> BufferIndex -> GettableStateVar a
getIndexed e i = makeGettableStateVar $ getInteger1i fromIntegral e i

--buffer
bindBufferBase :: IndexedBufferTarget -> BufferIndex -> StateVar (Maybe BufferObject)
bindBufferBase t i = makeStateVar (getIndexedBufferBinding t i) (setIndexedBufferBase t i)

setIndexedBufferBase :: IndexedBufferTarget -> BufferIndex -> Maybe BufferObject -> IO ()
setIndexedBufferBase t i buf=
case marshalGetPName . marshalIndexedBufferTarget $ t of
Nothing -> recordInvalidEnum
Just t' ->
glBindBufferBase t' i . bufferID . fromMaybe noBufferObject $ buf

getIndexedBufferBinding :: IndexedBufferTarget -> BufferIndex -> IO (Maybe BufferObject)
getIndexedBufferBinding t i = do
buf <- getInteger1i (BufferObject . fromIntegral) (marshalIndexedBufferTarget t) i
return $ if buf == noBufferObject then Nothing else Just buf

bindBufferRange :: IndexedBufferTarget -> BufferIndex -> StateVar (Maybe BufferRange)
bindBufferRange t i = makeStateVar (getIndexedBufferRange t i) (setIndexedBufferRange t i)

setIndexedBufferRange :: IndexedBufferTarget -> BufferIndex -> Maybe BufferRange -> IO ()
setIndexedBufferRange t i (Just (buf, start, range)) =
case marshalGetPName . marshalIndexedBufferTarget $ t of
Nothing -> recordInvalidEnum
Just t' -> glBindBufferRange t' i (bufferID buf) start range
setIndexedBufferRange t i Nothing = setIndexedBufferBase t i Nothing

getIndexedBufferRange :: IndexedBufferTarget -> BufferIndex -> IO(Maybe BufferRange)
getIndexedBufferRange t i = do
buf <- getInteger1i (BufferObject . fromIntegral) (marshalIndexedBufferTarget t) i
if buf == noBufferObject
then return Nothing
else do
start <- get $ indexedBufferStart t i
size <- get $ indexedBufferSize t i
return $ Just (buf, start, size)


indexedBufferStart :: IndexedBufferTarget -> BufferIndex -> GettableStateVar RangeStartIndex
indexedBufferStart = getIndexed . marshalIndexedBufferStart

indexedBufferSize :: IndexedBufferTarget -> BufferIndex -> GettableStateVar RangeSize
indexedBufferSize = getIndexed . marshalIndexedBufferSize
Loading