Skip to content

Commit 1e575bf

Browse files
committed
Use extension queries from OpenGLRaw, they are more robust.
1 parent cf589db commit 1e575bf

File tree

3 files changed

+51
-35
lines changed

3 files changed

+51
-35
lines changed

CHANGELOG.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
2.13.0.1
1+
2.13.1.0
22
--------
3+
* Added `extensionSupported`.
4+
* Relaxed upper version bound for OpenGLRaw.
35
* Added CHANGELOG.md to distribution.
46

57
2.13.0.0

OpenGL.cabal

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -148,14 +148,15 @@ library
148148
hs-source-dirs: src
149149
ghc-options: -Wall
150150
build-depends:
151-
base >= 3 && < 5,
152-
bytestring >= 0.9 && < 0.11,
153-
text >= 0.1 && < 1.3,
154-
transformers >= 0.2 && < 0.5,
155-
ObjectName >= 1.1 && < 1.2,
156-
StateVar >= 1.1 && < 1.2,
157-
OpenGLRaw >= 2.1 && < 2.6,
158-
GLURaw >= 1.3 && < 1.6
151+
base >= 3 && < 5,
152+
bytestring >= 0.9 && < 0.11,
153+
containers >= 0.3 && < 0.6,
154+
text >= 0.1 && < 1.3,
155+
transformers >= 0.2 && < 0.5,
156+
ObjectName >= 1.1 && < 1.2,
157+
StateVar >= 1.1 && < 1.2,
158+
OpenGLRaw >= 2.5.5 && < 2.7,
159+
GLURaw >= 1.3 && < 1.6
159160
default-language: Haskell2010
160161
other-extensions:
161162
CPP

src/Graphics/Rendering/OpenGL/GL/StringQueries.hs

Lines changed: 39 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -20,35 +20,33 @@ module Graphics.Rendering.OpenGL.GL.StringQueries (
2020

2121
import Data.Bits
2222
import Data.Char
23-
import Data.StateVar
23+
import Data.Set ( member, toList )
24+
import Data.StateVar as S
2425
import Graphics.Rendering.OpenGL.GL.ByteString
2526
import Graphics.Rendering.OpenGL.GL.QueryUtils
2627
import Graphics.Rendering.OpenGL.Raw
28+
import Text.ParserCombinators.ReadP as R
2729

2830
--------------------------------------------------------------------------------
2931

3032
vendor :: GettableStateVar String
31-
vendor = makeGettableStateVar (getString gl_VENDOR)
33+
vendor = makeStringVar gl_VENDOR
3234

3335
renderer :: GettableStateVar String
34-
renderer = makeGettableStateVar (getString gl_RENDERER)
36+
renderer = makeStringVar gl_RENDERER
3537

3638
glVersion :: GettableStateVar String
37-
glVersion = makeGettableStateVar (getString gl_VERSION)
39+
glVersion = makeStringVar gl_VERSION
3840

3941
glExtensions :: GettableStateVar [String]
40-
glExtensions = makeGettableStateVar (fmap words $ getString gl_EXTENSIONS)
42+
glExtensions = makeGettableStateVar (toList `fmap` getExtensions)
4143

4244
extensionSupported :: String -> GettableStateVar Bool
43-
extensionSupported ext = makeGettableStateVar $ do
44-
n <- getInteger1 fromIntegral GetNumExtensions
45-
anyM $ map isExt [ 0 .. n - 1 ]
46-
where anyM = foldr orM (return False)
47-
x `orM` y = x >>= \q -> if q then return True else y
48-
isExt = fmap (== ext) . getStringi gl_EXTENSIONS
45+
extensionSupported ext =
46+
makeGettableStateVar (getExtensions >>= (return . member ext))
4947

5048
shadingLanguageVersion :: GettableStateVar String
51-
shadingLanguageVersion = makeGettableStateVar (getString gl_SHADING_LANGUAGE_VERSION)
49+
shadingLanguageVersion = makeStringVar gl_SHADING_LANGUAGE_VERSION
5250

5351
--------------------------------------------------------------------------------
5452

@@ -72,11 +70,8 @@ i2cps bitfield =
7270

7371
--------------------------------------------------------------------------------
7472

75-
getString :: GLenum -> IO String
76-
getString = getStringWith . glGetString
77-
78-
getStringi :: GLenum -> GLuint -> IO String
79-
getStringi n = getStringWith . glGetStringi n
73+
makeStringVar :: GLenum -> GettableStateVar String
74+
makeStringVar = makeGettableStateVar . getStringWith . glGetString
8075

8176
--------------------------------------------------------------------------------
8277

@@ -87,12 +82,30 @@ getStringi n = getStringWith . glGetStringi n
8782
-- with a sane OpenGL implementation, it is transformed to @(-1,-1)@.
8883

8984
majorMinor :: GettableStateVar String -> GettableStateVar (Int, Int)
90-
majorMinor = makeGettableStateVar . fmap parse . get
91-
where defaultVersion = (-1, -1)
92-
parse str =
93-
case span isDigit str of
94-
(major@(_:_), '.':rest) ->
95-
case span isDigit rest of
96-
(minor@(_:_), _) -> (read major, read minor)
97-
_ -> defaultVersion
98-
_ -> defaultVersion
85+
majorMinor =
86+
makeGettableStateVar . fmap (runParser parseVersion (-1, -1)) . S.get
87+
88+
--------------------------------------------------------------------------------
89+
-- Copy from Graphics.Rendering.OpenGL.Raw.GetProcAddress... :-/
90+
91+
runParser :: ReadP a -> a -> String -> a
92+
runParser parser failed str =
93+
case readP_to_S parser str of
94+
[(v, "")] -> v
95+
_ -> failed
96+
97+
-- This does quite a bit more than we need for "normal" OpenGL, but at least it
98+
-- documents the convoluted format of the version string in detail.
99+
parseVersion :: ReadP (Int, Int)
100+
parseVersion = do
101+
_prefix <-
102+
-- Too lazy to define a type for the API...
103+
("CL" <$ string "OpenGL ES-CL ") <++ -- OpenGL ES 1.x Common-Lite
104+
("CM" <$ string "OpenGL ES-CM ") <++ -- OpenGL ES 1.x Common
105+
("ES" <$ string "OpenGL ES " ) <++ -- OpenGL ES 2.x or 3.x
106+
("GL" <$ string "" ) -- OpenGL
107+
major <- read <$> munch1 isDigit
108+
minor <- char '.' >> read <$> munch1 isDigit
109+
_release <- (char '.' >> munch1 (/= ' ')) <++ return ""
110+
_vendorStuff <- (char ' ' >> R.get `manyTill` eof) <++ ("" <$ eof)
111+
return (major, minor)

0 commit comments

Comments
 (0)