@@ -20,35 +20,33 @@ module Graphics.Rendering.OpenGL.GL.StringQueries (
2020
2121import Data.Bits
2222import Data.Char
23- import Data.StateVar
23+ import Data.Set ( member , toList )
24+ import Data.StateVar as S
2425import Graphics.Rendering.OpenGL.GL.ByteString
2526import Graphics.Rendering.OpenGL.GL.QueryUtils
2627import Graphics.Rendering.OpenGL.Raw
28+ import Text.ParserCombinators.ReadP as R
2729
2830--------------------------------------------------------------------------------
2931
3032vendor :: GettableStateVar String
31- vendor = makeGettableStateVar (getString gl_VENDOR)
33+ vendor = makeStringVar gl_VENDOR
3234
3335renderer :: GettableStateVar String
34- renderer = makeGettableStateVar (getString gl_RENDERER)
36+ renderer = makeStringVar gl_RENDERER
3537
3638glVersion :: GettableStateVar String
37- glVersion = makeGettableStateVar (getString gl_VERSION)
39+ glVersion = makeStringVar gl_VERSION
3840
3941glExtensions :: GettableStateVar [String ]
40- glExtensions = makeGettableStateVar (fmap words $ getString gl_EXTENSIONS )
42+ glExtensions = makeGettableStateVar (toList ` fmap` getExtensions )
4143
4244extensionSupported :: 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
5048shadingLanguageVersion :: 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
8984majorMinor :: 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