module Graphics.OpenGLES.Base.Proc (glGetProcAddress) where
import Foreign
import Foreign.C.String
import GHC.Base (realWorld#)
import GHC.CString (unpackCString#)
import GHC.IO (IO (IO))
import GHC.Ptr (Ptr(..))
import System.IO.Unsafe (unsafePerformIO)
#if defined(EGL_GETPROC)
foreign import ccall unsafe "eglGetProcAddress"
getProcAddress :: CString -> IO (FunPtr a)
#elif defined(WGL_GETPROC)
foreign import ccall unsafe "wglGetProcAddress"
getProcAddress :: CString -> IO (FunPtr a)
#elif defined(GLX_GETPROC)
foreign import ccall unsafe "glXGetProcAddress"
getProcAddress :: CString -> IO (FunPtr a)
#elif defined(DLSYM_GETPROC)
foreign import ccall unsafe "dlfcn.h dlsym"
dlsym :: Ptr () -> CString -> IO (FunPtr a)
getProcAddress :: CString -> IO (FunPtr a)
getProcAddress procname = dlsym runtime_loader_default procname
where runtime_loader_default = nullPtr
#else
#error "Don't know how to retrieve OpenGL ES extension entries. try -DEGL_GETPROC"
#endif
inlinePerformIO :: IO a -> a
inlinePerformIO (IO m) = case m realWorld# of (# _, r #) -> r
glGetProcAddress :: String -> FunPtr a
glGetProcAddress procname =
unsafePerformIO $ withCString procname getProcAddress