aboutsummaryrefslogtreecommitdiffstats
path: root/src/Vivant/Shader.hs
blob: c2df31466236f870f8d49415b813f07df929b656 (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
50
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