@@ -126,9 +126,12 @@ getExtensions = liftIO $ Data.Set.fromList <$> do
126126 -- having a entry point which looks valid doesn't guarantee that it is
127127 -- actually supported. Therefore we need to check the OpenGL version number
128128 -- directly.
129- v <- getVersion
129+ getString <- makeGetString
130+ v <- getVersionWith getString
130131 if v >= (3 , 0 )
131- then do numExtensions <- getInteger gl_NUM_EXTENSIONS
132+ then do getInteger <- makeGetInteger
133+ getStringi <- makeGetStringi
134+ numExtensions <- getInteger gl_NUM_EXTENSIONS
132135 forM [ 0 .. fromIntegral numExtensions - 1 ] $
133136 getStringi gl_EXTENSIONS
134137 else words <$> getString gl_EXTENSIONS
@@ -137,7 +140,11 @@ getExtensions = liftIO $ Data.Set.fromList <$> do
137140
138141-- | Retrieve the OpenGL version, split into major and minor version numbers.
139142getVersion :: MonadIO m => m (Int , Int )
140- getVersion = liftIO $ runParser parseVersion (- 1 , - 1 ) <$> getString gl_VERSION
143+ getVersion = liftIO $ makeGetString >>= getVersionWith
144+
145+ getVersionWith :: (GLenum -> IO String ) -> IO (Int , Int )
146+ getVersionWith getString =
147+ runParser parseVersion (- 1 , - 1 ) <$> getString gl_VERSION
141148
142149runParser :: ReadP a -> a -> String -> a
143150runParser parser failed str =
@@ -165,29 +172,28 @@ parseVersion = do
165172-- Graphics.Rendering.OpenGL.Raw.Foreign uses generated names, which are not
166173-- easily predictable, so we duplicate a few "foreign import"s below.
167174
168- getString :: GLenum -> IO String
169- getString name = do
175+ makeGetString :: IO ( GLenum -> IO String )
176+ makeGetString = do
170177 glGetString_ <- dynGLenumIOPtrGLubyte <$> getProcAddress " glGetString"
171- glGetString_ name >>= peekGLstring
178+ return $ \ name -> glGetString_ name >>= peekGLstring
172179
173180foreign import CALLCONV " dynamic" dynGLenumIOPtrGLubyte
174181 :: FunPtr (GLenum -> IO (Ptr GLubyte ))
175182 -> GLenum -> IO (Ptr GLubyte )
176183
177- getStringi :: GLenum -> GLuint -> IO String
178- getStringi name index = do
184+ makeGetStringi :: IO ( GLenum -> GLuint -> IO String )
185+ makeGetStringi = do
179186 glGetStringi_ <- dynGLenumGLuintIOPtrGLubyte <$> getProcAddress " glGetStringi"
180- glGetStringi_ name index >>= peekGLstring
187+ return $ \ name index -> glGetStringi_ name index >>= peekGLstring
181188
182189foreign import CALLCONV " dynamic" dynGLenumGLuintIOPtrGLubyte
183190 :: FunPtr (GLenum -> GLuint -> IO (Ptr GLubyte ))
184191 -> GLenum -> GLuint -> IO (Ptr GLubyte )
185192
186- getInteger :: GLenum -> IO GLint
187- getInteger name = do
193+ makeGetInteger :: IO ( GLenum -> IO GLint )
194+ makeGetInteger = do
188195 glGetIntegerv_ <- dynGLenumPtrGLintIOVoid <$> getProcAddress " glGetIntegerv"
189- alloca $ \ p ->
190- glGetIntegerv_ name p >> peek p
196+ return $ \ name -> alloca $ \ p -> glGetIntegerv_ name p >> peek p
191197
192198foreign import CALLCONV " dynamic" dynGLenumPtrGLintIOVoid
193199 :: FunPtr (GLenum -> Ptr GLint -> IO () )
0 commit comments