module Vivant.Shader (createProgram) where import Control.Monad (unless) import qualified Data.ByteString as BS import qualified Graphics.Rendering.OpenGL as GL import Paths_vivant (getDataDir) import SDL (($=)) import System.Exit (exitFailure) import System.IO (hPutStrLn, stderr) createProgram :: IO GL.Program createProgram = 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 log <- GL.shaderInfoLog vs hPutStrLn stderr ("Error in vertex shader\n" <> log) 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 log <- GL.shaderInfoLog fs hPutStrLn stderr ("Error in fragment shader\n" <> log) exitFailure program <- GL.createProgram GL.attachShader program vs GL.attachShader program fs 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