Skip to content

Commit 6c0846d

Browse files
committed
Reduce calls to getProcAddress. Slightly uglier, but more efficient.
1 parent e1748d9 commit 6c0846d

File tree

1 file changed

+19
-13
lines changed

1 file changed

+19
-13
lines changed

src/Graphics/Rendering/OpenGL/Raw/GetProcAddress.hs

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
139142
getVersion :: 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

142149
runParser :: ReadP a -> a -> String -> a
143150
runParser 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

173180
foreign 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

182189
foreign 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

192198
foreign import CALLCONV "dynamic" dynGLenumPtrGLintIOVoid
193199
:: FunPtr (GLenum -> Ptr GLint -> IO ())

0 commit comments

Comments
 (0)