module Vivant.Shader (initShaders) where import SDL (($=)) import qualified Graphics.Rendering.OpenGL as GL import qualified Data.ByteString as BS import System.Exit (exitFailure) import System.IO (stderr, hPutStrLn) import Control.Monad (unless) import Paths_vivant (getDataDir) initShaders :: IO (GL.Program, GL.AttribLocation) initShaders = do datadir <- getDataDir -- compile vertex shader vs <- GL.createShader GL.VertexShader vsSource <- BS.readFile $ datadir <> "/shaders/triangle.vert" GL.shaderSourceBS vs $= vsSource GL.compileShader vs vsOK <- GL.get $ GL.compileStatus vs unless vsOK $ do hPutStrLn stderr "Error in vertex shader\n" exitFailure -- Do it again for the fragment shader fs <- GL.createShader GL.FragmentShader fsSource <- BS.readFile $ datadir <> "/shaders/triangle.frag" GL.shaderSourceBS fs $= fsSource GL.compileShader fs fsOK <- GL.get $ GL.compileStatus fs unless fsOK $ do hPutStrLn stderr "Error in fragment shader\n" exitFailure program <- GL.createProgram GL.attachShader program vs GL.attachShader program fs GL.attribLocation program "coord2d" $= GL.AttribLocation 0 GL.linkProgram program linkOK <- GL.get $ GL.linkStatus program GL.validateProgram program status <- GL.get $ GL.validateStatus program unless (linkOK && status) $ do hPutStrLn stderr "GL.linkProgram error" plog <- GL.get $ GL.programInfoLog program putStrLn plog exitFailure GL.currentProgram $= Just program return (program, GL.AttribLocation 0)