aboutsummaryrefslogtreecommitdiffstats
path: root/src/Vivant/Shader.hs
blob: 503d1b753a634dce35744d4a0be065c7e7047a2a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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)