module Graphics.Rendering.OpenGL.Raw.Extensions (
Invoker, getExtensionEntry,
FunPtr, unsafePerformIO
) where
import Foreign.Marshal.Error
import Foreign.Ptr
import Graphics.Rendering.OpenGL.Raw.GetProcAddress
import System.IO.Unsafe
type Invoker a = FunPtr a -> a
getExtensionEntry :: String -> String -> IO (FunPtr a)
getExtensionEntry extensionNameString extensionEntry =
throwIfNullFunPtr ("unknown OpenGL extension entry " ++ extensionEntry ++
", check for " ++ extensionNameString) $
getProcAddressWithSuffixes extensionEntry extensionSuffixes
throwIfNullFunPtr :: String -> IO (FunPtr a) -> IO (FunPtr a)
throwIfNullFunPtr = throwIf (== nullFunPtr) . const
extensionSuffixes :: [String]
extensionSuffixes = [
"", "ARB", "EXT", "NV", "SGIX", "SGIS", "ATI", "APPLE", "SUN", "OES", "IBM",
"MESA", "HP", "SGI", "OML", "AMD", "3DFX", "WIN", "PGI", "INTEL", "INGR",
"GREMEDY", "SUNX", "S3", "REND", "MESAX" ]