@@ -20,35 +20,33 @@ module Graphics.Rendering.OpenGL.GL.StringQueries (
20
20
21
21
import Data.Bits
22
22
import Data.Char
23
- import Data.StateVar
23
+ import Data.Set ( member , toList )
24
+ import Data.StateVar as S
24
25
import Graphics.Rendering.OpenGL.GL.ByteString
25
26
import Graphics.Rendering.OpenGL.GL.QueryUtils
26
27
import Graphics.Rendering.OpenGL.Raw
28
+ import Text.ParserCombinators.ReadP as R
27
29
28
30
--------------------------------------------------------------------------------
29
31
30
32
vendor :: GettableStateVar String
31
- vendor = makeGettableStateVar (getString gl_VENDOR)
33
+ vendor = makeStringVar gl_VENDOR
32
34
33
35
renderer :: GettableStateVar String
34
- renderer = makeGettableStateVar (getString gl_RENDERER)
36
+ renderer = makeStringVar gl_RENDERER
35
37
36
38
glVersion :: GettableStateVar String
37
- glVersion = makeGettableStateVar (getString gl_VERSION)
39
+ glVersion = makeStringVar gl_VERSION
38
40
39
41
glExtensions :: GettableStateVar [String ]
40
- glExtensions = makeGettableStateVar (fmap words $ getString gl_EXTENSIONS )
42
+ glExtensions = makeGettableStateVar (toList ` fmap` getExtensions )
41
43
42
44
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))
49
47
50
48
shadingLanguageVersion :: GettableStateVar String
51
- shadingLanguageVersion = makeGettableStateVar (getString gl_SHADING_LANGUAGE_VERSION)
49
+ shadingLanguageVersion = makeStringVar gl_SHADING_LANGUAGE_VERSION
52
50
53
51
--------------------------------------------------------------------------------
54
52
@@ -72,11 +70,8 @@ i2cps bitfield =
72
70
73
71
--------------------------------------------------------------------------------
74
72
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
80
75
81
76
--------------------------------------------------------------------------------
82
77
@@ -87,12 +82,30 @@ getStringi n = getStringWith . glGetStringi n
87
82
-- with a sane OpenGL implementation, it is transformed to @(-1,-1)@.
88
83
89
84
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