packages feed

glsl-0.0.0.1: src/Language/GLSL/Optimizer.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE StrictData        #-}
module Language.GLSL.Optimizer where

import           Control.Monad                    (when)
import           Data.Attoparsec.ByteString.Char8 (Parser)
import qualified Data.Text.Lazy                   as LT
import qualified Data.Text.Lazy.IO                as IO
import qualified Language.GLSL.Optimizer.Deinline as Deinline
import qualified Language.GLSL.Optimizer.Liveness as Liveness
import           Language.GLSL.Types              (Annot, GLSL, parseGLSL,
                                                   parseShader, parseTest,
                                                   printShader)


optimizeShader :: LT.Text -> Either String LT.Text
-- optimizeShader = fmap printShader . parse
optimizeShader = fmap (printShader . optimize) . parse


parse :: LT.Text -> Either String (GLSL ())
parse = parseShader

optimize :: Annot a => GLSL a -> GLSL a
optimize = (`const` id)
  -- . foldr (.) id (replicate 20 $ Deinline.pass Deinline.defaultConfig{Deinline.windowSize=5})
  -- . foldr (.) id (replicate 30 $ Deinline.pass Deinline.defaultConfig{Deinline.windowSize=10})
  . Deinline.pass Deinline.defaultConfig{Deinline.windowSize=10}


main :: IO ()
main = do
  putStrLn "Loading shader source..."
  -- inText <- IO.readFile "../large-shaders/lambdacnc.frag"
  -- inText <- IO.readFile "../large-shaders/lambdacnc.vert"
  -- inText <- IO.readFile "../large-shaders/lambdaray.frag"
  -- inText <- IO.readFile "../large-shaders/xax.frag"
  inText <- IO.readFile "../large-shaders/xax.vert"
  -- inText <- IO.readFile "../large-shaders/small.vert"
  when False $ parseTest (parseGLSL :: Parser (GLSL ())) inText
  putStrLn "Parsing shader source..."
  case parse inText of
    Left err -> writeFile "../opt.glsl" $ "// Error\n" <> err
    Right ok -> do
      putStrLn "Computing liveness..."
      let ls = Liveness.computeLiveness ok
      putStrLn "Optimizing shader..."
      IO.writeFile "../opt.glsl" $ printShader $ optimize ls