packages feed

caramia-0.4.0.0: demos/gl-info/Main.hs

module Main ( main ) where

import Prelude hiding (init )
import Graphics.UI.SDL
import Graphics.Rendering.OpenGL.Raw
import Data.Bits
import Control.Applicative
import Control.Monad
import Foreign.C.String
import Foreign.Storable
import Foreign.Marshal.Alloc
import Foreign.Ptr

main :: IO ()
main =
    withCString "gl-test" $ \cstr -> do
        let errCheck s x = unless (x == 0) $ error s
        errCheck "Can't initialize SDL" =<< init initFlagVideo
        errCheck "Can't set major version" =<< glSetAttribute glAttrContextMajorVersion 3
        errCheck "Can't set minor version" =<< glSetAttribute glAttrContextMinorVersion 3
        errCheck "Can't set profile mask" =<< glSetAttribute glAttrContextProfileMask glProfileCore
        window <- createWindow cstr windowPosUndefined windowPosUndefined
                                    500 500
                                    (windowFlagOpenGL .|.
                                     windowFlagShown)
        c <- glCreateContext window
        _ <- glMakeCurrent window c
        (major1, minor1) <- alloca $ \major_ptr -> alloca $ \minor_ptr -> do
            -- in case glGetIntegerv is completely broken, set initial values for
            -- major and minor pointers
            poke major_ptr 0
            poke minor_ptr 0
            glGetIntegerv gl_MAJOR_VERSION major_ptr
            glGetIntegerv gl_MINOR_VERSION minor_ptr
            (,) <$> peek major_ptr <*> peek minor_ptr
        putStrLn $ "glGetIntegerv gl_*_VERSION: " ++ show major1 ++ "." ++ show minor1
        ver_raw <- castPtr `fmap` glGetString gl_VERSION
        ver_cptr <- peekCString ver_raw
        putStrLn $ "glGetString gl_VERSION: " ++ ver_cptr