summaryrefslogtreecommitdiff
path: root/src/LambdaCube/Compiler
diff options
context:
space:
mode:
authorPéter Diviánszky <divipp@gmail.com>2016-02-10 06:48:19 +0100
committerPéter Diviánszky <divipp@gmail.com>2016-02-10 06:48:19 +0100
commit18326ac543a3c438be021e1478547d268647624e (patch)
tree1f73d0dea645db8444b98bd31e001243f4f452ef /src/LambdaCube/Compiler
parent602222207f6df52324e68abe3b6afb30d18e2ec2 (diff)
remove patterns
Diffstat (limited to 'src/LambdaCube/Compiler')
-rw-r--r--src/LambdaCube/Compiler/CoreToIR.hs100
1 files changed, 43 insertions, 57 deletions
diff --git a/src/LambdaCube/Compiler/CoreToIR.hs b/src/LambdaCube/Compiler/CoreToIR.hs
index 461be397..514fbf96 100644
--- a/src/LambdaCube/Compiler/CoreToIR.hs
+++ b/src/LambdaCube/Compiler/CoreToIR.hs
@@ -186,10 +186,10 @@ addProgramToSlot prgName (IR.RenderStream streamName) = do
186getFragFilter (Prim2 "map" (EtaPrim2 "filterFragment" p) x) = (Just p, x) 186getFragFilter (Prim2 "map" (EtaPrim2 "filterFragment" p) x) = (Just p, x)
187getFragFilter x = (Nothing, x) 187getFragFilter x = (Nothing, x)
188 188
189getVertexShader (Prim2 "map" (EtaPrim2 "mapPrimitive" f) x) = (f, x) 189getVertexShader (Prim2 "map" (EtaPrim2 "mapPrimitive" f@(etaRed -> Just (_, o))) x) = ((Just f, tyOf o), x)
190getVertexShader x = (idFun $ getPrim' $ tyOf x, x) 190getVertexShader x = ((Nothing, getPrim' $ tyOf x), x)
191 191
192getFragmentShader (Prim2 "map" (EtaPrim2 "mapFragment" f@(etaRed -> ELam _ frago)) x) = ((Just f, tyOf frago), x) 192getFragmentShader (Prim2 "map" (EtaPrim2 "mapFragment" f@(etaRed -> Just (_, frago))) x) = ((Just f, tyOf frago), x)
193getFragmentShader x = ((Nothing, getPrim'' $ tyOf x), x) 193getFragmentShader x = ((Nothing, getPrim'' $ tyOf x), x)
194 194
195removeDepthHandler (Prim2 "map" (EtaPrim1 "noDepth") x) = x 195removeDepthHandler (Prim2 "map" (EtaPrim1 "noDepth") x) = x
@@ -514,14 +514,12 @@ mangleIdent n = '_': concatMap encodeChar n
514 c -> '$' : show (ord c) 514 c -> '$' : show (ord c)
515-} 515-}
516 516
517idFun t = Lam Visible (PVar t) t (Var 0 t) -- todo: remove
518
519genGLSLs backend 517genGLSLs backend
520 rp -- program point size 518 rp -- program point size
521 ints -- interpolations 519 ints -- interpolations
522 vert@(etaRed -> ELam verti (eTuple -> verts@(pos: verto))) -- vertex shader 520 (vert, tvert) -- vertex shader
523 (frag, tfrag) -- fragment shader 521 (frag, tfrag) -- fragment shader
524 ffilter -- fragment filter 522 ffilter -- fragment filter
525 = ( -- vertex input 523 = ( -- vertex input
526 vertIn 524 vertIn
527 525
@@ -531,7 +529,7 @@ genGLSLs backend
531 , -- vertex shader code 529 , -- vertex shader code
532 shaderHeader backend 530 shaderHeader backend
533 <> [unwords ["uniform", t, n, ";"] | (n, t) <- Map.toList $ snd . snd <$> vertUniforms] 531 <> [unwords ["uniform", t, n, ";"] | (n, t) <- Map.toList $ snd . snd <$> vertUniforms]
534 <> [unwords [inputDef backend, toGLSLType "3" t, n, ";"] | (n, PVar t) <- zip vertIn $ getPVars verti] 532 <> [unwords [inputDef backend, toGLSLType "3" t, n, ";"] | (n, t) <- zip vertIn verti]
535 <> [unwords $ varyingOut backend i ++ [t, n, ";"] | (n, (i, t)) <- zip vertOut'' vertOut] 533 <> [unwords $ varyingOut backend i ++ [t, n, ";"] | (n, (i, t)) <- zip vertOut'' vertOut]
536 <> ["void main() {"] 534 <> ["void main() {"]
537 <> [n <> " = " <> x <> ";" | (n, x) <- zip vertOut'' vertGLSL] 535 <> [n <> " = " <> x <> ";" | (n, x) <- zip vertOut'' vertGLSL]
@@ -549,28 +547,33 @@ genGLSLs backend
549 <> ["}"] 547 <> ["}"]
550 ) 548 )
551 where 549 where
550 (verti, verts) = case vert of
551 Just (etaRed -> Just (verti, verts)) -> (verti, eTuple verts)
552 Nothing -> ([], [Var 0 tvert])
553
552 freshTypeVars = map (("s" ++) . show) [0..] 554 freshTypeVars = map (("s" ++) . show) [0..]
553 555
554 (((vertGLSL, ptGLSL), vertUniforms), ((filtGLSL, fragGLSL), fragUniforms)) = flip evalState freshTypeVars $ (,) 556 (((vertGLSL, ptGLSL), vertUniforms), ((filtGLSL, fragGLSL), fragUniforms)) = flip evalState freshTypeVars $ (,)
555 <$> (runWriterT $ (,) 557 <$> (runWriterT $ (,)
556 <$> traverse (genGLSL' vertIn . ELam verti) verts 558 <$> traverse (genGLSL' vertIn . (,) verti) verts
557 <*> traverse (genGLSL' vertOut'') rp) 559 <*> traverse (genGLSL' vertOut'' . red) rp)
558 <*> (runWriterT $ (,) 560 <*> (runWriterT $ (,)
559 <$> traverse (genGLSL' (tail vertOut'')) ffilter 561 <$> traverse (genGLSL' (tail vertOut'') . red) ffilter
560 <*> traverse (genGLSL' (tail vertOut'')) frag) 562 <*> traverse (genGLSL' (tail vertOut'') . red) frag)
561 563
562 vertOut'' = "gl_Position": map (("vo" ++) . show) [1..length vertOut] 564 vertOut'' = "gl_Position": map (("vo" ++) . show) [1..length vertOut]
563 565
564 vertIn = map (("vi" ++) . show) [1..length $ getPVars verti] 566 vertIn = map (("vi" ++) . show) [1..length verti]
565 567
566 genGLSL' vertOut (etaRed -> ELam i@(getPVars -> ps) o) 568 red (etaRed -> Just (ps, o)) = (ps, o)
569 genGLSL' vertOut (ps, o)
567 | length ps == length vertOut = show <$> genGLSL (reverse vertOut) o 570 | length ps == length vertOut = show <$> genGLSL (reverse vertOut) o
568 | otherwise = error $ "makeSubst illegal input " ++ show i ++ "\n" ++ show vertOut 571 | otherwise = error $ "makeSubst illegal input " ++ show ps ++ "\n" ++ show vertOut
569 572
570 noUnit TUnit = False 573 noUnit TUnit = False
571 noUnit _ = True 574 noUnit _ = True
572 575
573 vertOut = zipWith go (eTuple ints) verto 576 vertOut = zipWith go (eTuple ints) $ tail verts
574 where 577 where
575 go (A0 n) e = (interpName n, toGLSLType "3" $ tyOf e) 578 go (A0 n) e = (interpName n, toGLSLType "3" $ tyOf e)
576 579
@@ -600,17 +603,9 @@ genGLSLs backend
600 603
601genGLSLs _ _ _ _ _ _ = error $ "genGLSLs " -- ++ show e --ppShow e 604genGLSLs _ _ _ _ _ _ = error $ "genGLSLs " -- ++ show e --ppShow e
602 605
603ptuple (AN (tupName -> Just _) xs) = PTuple [ptuple t | t <- xs]
604ptuple t = PVar t
605
606eTuple (ETuple l) = l 606eTuple (ETuple l) = l
607eTuple x = [x] 607eTuple x = [x]
608 608
609getPVars = \case
610 PTuple l -> l
611 PVar TUnit -> []
612 x -> [x]
613
614parens a = "(" <+> a <+> ")" 609parens a = "(" <+> a <+> ")"
615 610
616data Uniform 611data Uniform
@@ -830,12 +825,11 @@ remaining differences:
830- type in Var 825- type in Var
831- type in Lam 826- type in Lam
832- no erasure 827- no erasure
833- tuple patterns
834-} 828-}
835 829
836data Exp_ a 830data Exp_ a
837 = Pi_ Visibility a a 831 = Pi_ Visibility a a
838 | Lam_ Visibility Pat a a 832 | Lam_ Visibility a a
839 | Con_ SName a [a] 833 | Con_ SName a [a]
840 | ELit_ Lit 834 | ELit_ Lit
841 | Fun_ SName a [a] (Maybe a) 835 | Fun_ SName a [a] (Maybe a)
@@ -851,17 +845,15 @@ instance PShow Exp where
851 ELit a -> text $ show a 845 ELit a -> text $ show a
852 AN n ps -> pApps p (text n) ps 846 AN n ps -> pApps p (text n) ps
853 PrimN n ps -> pApps p (text n) ps 847 PrimN n ps -> pApps p (text n) ps
854-- Con n t ps -> pApps p (text n) ps
855-- Fun n t ps -> pApps p (text n) ps
856 App a b -> pApp p a b 848 App a b -> pApp p a b
857 Lam h n t e -> pParens True $ "\\" <> showVis h <> pShow n </> "->" <+> pShow e 849 Lam h t e -> pParens True $ "\\" <> showVis h </> "->" <+> pShow e
858 Pi h t e -> pParens True $ showVis h </> "->" <+> pShow e 850 Pi h t e -> pParens True $ showVis h </> "->" <+> pShow e
859 where 851 where
860 showVis Visible = "" 852 showVis Visible = ""
861 showVis Hidden = "@" 853 showVis Hidden = "@"
862 854
863pattern Pi h a b = Exp (Pi_ h a b) 855pattern Pi h a b = Exp (Pi_ h a b)
864pattern Lam h n a b = Exp (Lam_ h n a b) 856pattern Lam h a b = Exp (Lam_ h a b)
865pattern Con n a b = Exp (Con_ (UntickName n) a b) 857pattern Con n a b = Exp (Con_ (UntickName n) a b)
866pattern ELit a = Exp (ELit_ a) 858pattern ELit a = Exp (ELit_ a)
867pattern Fun n a b md = Exp (Fun_ (UntickName n) a b md) 859pattern Fun n a b md = Exp (Fun_ (UntickName n) a b md)
@@ -873,7 +865,7 @@ instance Up Exp where
873 up_ n = f where 865 up_ n = f where
874 f i e = case e of 866 f i e = case e of
875 Var k b -> Var (if k >= i then k+n else k) $ f i b 867 Var k b -> Var (if k >= i then k+n else k) $ f i b
876 Lam h n t e -> Lam h n (f i t) (f (i+1) e) 868 Lam h t e -> Lam h (f i t) (f (i+1) e)
877 Pi h t e -> Pi h (f i t) (f (i+1) e) 869 Pi h t e -> Pi h (f i t) (f (i+1) e)
878 Fun n t xs mx -> Fun n (f i t) (f i <$> xs) (f i <$> mx) 870 Fun n t xs mx -> Fun n (f i t) (f i <$> xs) (f i <$> mx)
879 Con n t xs -> Con n (f i t) (f i <$> xs) 871 Con n t xs -> Con n (f i t) (f i <$> xs)
@@ -885,7 +877,7 @@ instance I.Subst Exp Exp where
885 subst i0 x = f i0 877 subst i0 x = f i0
886 where 878 where
887 f i e = case e of 879 f i e = case e of
888 Lam h n a b -> Lam h n (f i a) (f (i+1) b) 880 Lam h a b -> Lam h (f i a) (f (i+1) b)
889 Pi h a b -> Pi h (f i a) (f (i+1) b) 881 Pi h a b -> Pi h (f i a) (f (i+1) b)
890 Con n t xs -> Con n (f i t) (f i <$> xs) 882 Con n t xs -> Con n (f i t) (f i <$> xs)
891 Fun n t xs mx -> Fun n (f i t) (f i <$> xs) (f i <$> mx) 883 Fun n t xs mx -> Fun n (f i t) (f i <$> xs) (f i <$> mx)
@@ -896,7 +888,7 @@ instance I.Subst Exp Exp where
896 888
897tyApp (Pi _ a b) x = I.subst 0 x b 889tyApp (Pi _ a b) x = I.subst 0 x b
898 890
899app' (Lam _ (PVarr) _ x) b = I.subst 0 b x 891app' (Lam _ _ x) b = I.subst 0 b x
900app' a b = App a b 892app' a b = App a b
901 893
902pattern UntickName n <- (untick -> n) where UntickName = untick 894pattern UntickName n <- (untick -> n) where UntickName = untick
@@ -925,7 +917,7 @@ toExp = f_ []
925 I.Lam y -> case et of 917 I.Lam y -> case et of
926 I.Pi b x yt -> let 918 I.Pi b x yt -> let
927 t = f_ vs (x, I.TType) 919 t = f_ vs (x, I.TType)
928 in Lam b (PVar t) t $ f_ ((Var 0 t, x): vs) (y, yt) 920 in Lam b t $ f_ ((Var 0 t, x): vs) (y, yt)
929 I.Con s n xs -> Con (show s) (f_ vs (t, I.TType)) $ chain "con" vs [] t (I.mkConPars n et ++ xs) 921 I.Con s n xs -> Con (show s) (f_ vs (t, I.TType)) $ chain "con" vs [] t (I.mkConPars n et ++ xs)
930 where t = I.conType et s 922 where t = I.conType et s
931 I.TyCon s xs -> Con (show s) (f_ vs (I.nType s, I.TType)) $ chain "tycon" vs [] (I.nType s) xs 923 I.TyCon s xs -> Con (show s) (f_ vs (I.nType s, I.TType)) $ chain "tycon" vs [] (I.nType s) xs
@@ -968,7 +960,7 @@ freeVars = \case
968 Fun _ _ xs md -> foldMap freeVars xs <> foldMap freeVars md 960 Fun _ _ xs md -> foldMap freeVars xs <> foldMap freeVars md
969 App a b -> freeVars a <> freeVars b 961 App a b -> freeVars a <> freeVars b
970 Pi _ a b -> freeVars a <> (lower $ freeVars b) 962 Pi _ a b -> freeVars a <> (lower $ freeVars b)
971 Lam _ PVarr a b -> freeVars a <> (lower $ freeVars b) 963 Lam _ a b -> freeVars a <> (lower $ freeVars b)
972 TType -> mempty 964 TType -> mempty
973 where 965 where
974 lower = Set.map (+(-1)) . Set.filter (>0) 966 lower = Set.map (+(-1)) . Set.filter (>0)
@@ -977,7 +969,7 @@ type Ty = Exp
977 969
978tyOf :: Exp -> Ty 970tyOf :: Exp -> Ty
979tyOf = \case 971tyOf = \case
980 Lam h (PVarr) t x -> Pi h t $ tyOf x 972 Lam h t x -> Pi h t $ tyOf x
981 App f x -> tyApp (tyOf f) x 973 App f x -> tyApp (tyOf f) x
982 Var _ t -> t 974 Var _ t -> t
983 Pi{} -> TType 975 Pi{} -> TType
@@ -989,22 +981,16 @@ tyOf = \case
989 981
990-------------------------------------------------------------------------------- Exp conversion -- TODO: remove 982-------------------------------------------------------------------------------- Exp conversion -- TODO: remove
991 983
992data Pat
993 = PVar Exp
994 | PTuple [Pat]
995 deriving (Eq, Show)
996
997instance PShow Pat where
998 pShowPrec p = \case
999 PVar t -> text "?"
1000 PTuple ps -> tupled $ map pShow ps
1001
1002pattern PVarr <- PVar _
1003
1004-- workaround for backward compatibility 984-- workaround for backward compatibility
1005etaRed (ELam (PVarr) (App f (EVar' 0))) | 0 `Set.notMember` freeVars f = downE f 985etaRed (ELam _ (App f (EVar' 0))) | 0 `Set.notMember` freeVars f = etaRed $ downE f
1006etaRed (ELam (PVarr) (Prim3 (tupCaseName -> Just k) _ x (EVar' 0))) | 0 `Set.notMember` freeVars x = uncurry (\ps e -> ELam (PTuple ps) e) $ getPats k $ downE x 986etaRed (ELam _ (Prim3 (tupCaseName -> Just k) _ x (EVar' 0))) | 0 `Set.notMember` freeVars x
1007etaRed x = x 987 = uncurry (\ps e -> Just (ps, e)) $ getPats k $ downE x
988etaRed (ELam p i) = Just (getPVars p, i)
989etaRed x = Nothing
990
991getPVars = \case
992 TUnit -> []
993 t -> [t]
1008 994
1009getPats 0 e = ([], e) 995getPats 0 e = ([], e)
1010getPats i (ELam p e) = first (p:) $ getPats (i-1) e 996getPats i (ELam p e) = first (p:) $ getPats (i-1) e
@@ -1018,10 +1004,10 @@ pattern EtaPrim4 s x1 x2 x3 <- (getEtaPrim -> Just (s, [x1, x2, x3]))
1018pattern EtaPrim5 s x1 x2 x3 x4 <- (getEtaPrim -> Just (s, [x1, x2, x3, x4])) 1004pattern EtaPrim5 s x1 x2 x3 x4 <- (getEtaPrim -> Just (s, [x1, x2, x3, x4]))
1019pattern EtaPrim2_2 s <- (getEtaPrim2 -> Just (s, [])) 1005pattern EtaPrim2_2 s <- (getEtaPrim2 -> Just (s, []))
1020 1006
1021getEtaPrim (ELam (PVarr) (PrimN s (initLast -> Just (xs, EVar' 0)))) | all (Set.notMember 0 . freeVars) xs = Just (s, I.subst 0 (error "impossible" :: Exp) <$> xs) 1007getEtaPrim (ELam _ (PrimN s (initLast -> Just (xs, EVar' 0)))) | all (Set.notMember 0 . freeVars) xs = Just (s, I.subst 0 (error "impossible" :: Exp) <$> xs)
1022getEtaPrim _ = Nothing 1008getEtaPrim _ = Nothing
1023 1009
1024getEtaPrim2 (ELam (PVarr) (ELam (PVarr) (PrimN s (initLast -> Just (initLast -> Just (xs, EVar' 0), EVar' 0))))) | all (\x -> all (`Set.notMember` freeVars x) [0, 1]) xs = Just (s, I.subst 0 (error "impossible" :: Exp) . I.subst 0 (error "impossible" :: Exp) <$> xs) 1010getEtaPrim2 (ELam _ (ELam _ (PrimN s (initLast -> Just (initLast -> Just (xs, EVar' 0), EVar' 0))))) | all (\x -> all (`Set.notMember` freeVars x) [0, 1]) xs = Just (s, I.subst 0 (error "impossible" :: Exp) . I.subst 0 (error "impossible" :: Exp) <$> xs)
1025getEtaPrim2 _ = Nothing 1011getEtaPrim2 _ = Nothing
1026 1012
1027initLast [] = Nothing 1013initLast [] = Nothing
@@ -1039,7 +1025,7 @@ tupCaseName _ = Nothing
1039 1025
1040pattern EVar' n <- Var n _ 1026pattern EVar' n <- Var n _
1041 1027
1042pattern ELam n b <- Lam Visible n _ b where ELam n b = Lam Visible n (tyOf b) b 1028pattern ELam t b <- Lam Visible t b where ELam t b = Lam Visible t b
1043 1029
1044pattern PrimN n xs <- Fun n t (filterRelevant t -> xs) _ 1030pattern PrimN n xs <- Fun n t (filterRelevant t -> xs) _
1045pattern Prim0 n <- PrimN n [] 1031pattern Prim0 n <- PrimN n []