diff options
author | Péter Diviánszky <divipp@gmail.com> | 2016-02-10 06:48:19 +0100 |
---|---|---|
committer | Péter Diviánszky <divipp@gmail.com> | 2016-02-10 06:48:19 +0100 |
commit | 18326ac543a3c438be021e1478547d268647624e (patch) | |
tree | 1f73d0dea645db8444b98bd31e001243f4f452ef /src/LambdaCube/Compiler | |
parent | 602222207f6df52324e68abe3b6afb30d18e2ec2 (diff) |
remove patterns
Diffstat (limited to 'src/LambdaCube/Compiler')
-rw-r--r-- | src/LambdaCube/Compiler/CoreToIR.hs | 100 |
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 | |||
186 | getFragFilter (Prim2 "map" (EtaPrim2 "filterFragment" p) x) = (Just p, x) | 186 | getFragFilter (Prim2 "map" (EtaPrim2 "filterFragment" p) x) = (Just p, x) |
187 | getFragFilter x = (Nothing, x) | 187 | getFragFilter x = (Nothing, x) |
188 | 188 | ||
189 | getVertexShader (Prim2 "map" (EtaPrim2 "mapPrimitive" f) x) = (f, x) | 189 | getVertexShader (Prim2 "map" (EtaPrim2 "mapPrimitive" f@(etaRed -> Just (_, o))) x) = ((Just f, tyOf o), x) |
190 | getVertexShader x = (idFun $ getPrim' $ tyOf x, x) | 190 | getVertexShader x = ((Nothing, getPrim' $ tyOf x), x) |
191 | 191 | ||
192 | getFragmentShader (Prim2 "map" (EtaPrim2 "mapFragment" f@(etaRed -> ELam _ frago)) x) = ((Just f, tyOf frago), x) | 192 | getFragmentShader (Prim2 "map" (EtaPrim2 "mapFragment" f@(etaRed -> Just (_, frago))) x) = ((Just f, tyOf frago), x) |
193 | getFragmentShader x = ((Nothing, getPrim'' $ tyOf x), x) | 193 | getFragmentShader x = ((Nothing, getPrim'' $ tyOf x), x) |
194 | 194 | ||
195 | removeDepthHandler (Prim2 "map" (EtaPrim1 "noDepth") x) = x | 195 | removeDepthHandler (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 | ||
517 | idFun t = Lam Visible (PVar t) t (Var 0 t) -- todo: remove | ||
518 | |||
519 | genGLSLs backend | 517 | genGLSLs 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 | ||
601 | genGLSLs _ _ _ _ _ _ = error $ "genGLSLs " -- ++ show e --ppShow e | 604 | genGLSLs _ _ _ _ _ _ = error $ "genGLSLs " -- ++ show e --ppShow e |
602 | 605 | ||
603 | ptuple (AN (tupName -> Just _) xs) = PTuple [ptuple t | t <- xs] | ||
604 | ptuple t = PVar t | ||
605 | |||
606 | eTuple (ETuple l) = l | 606 | eTuple (ETuple l) = l |
607 | eTuple x = [x] | 607 | eTuple x = [x] |
608 | 608 | ||
609 | getPVars = \case | ||
610 | PTuple l -> l | ||
611 | PVar TUnit -> [] | ||
612 | x -> [x] | ||
613 | |||
614 | parens a = "(" <+> a <+> ")" | 609 | parens a = "(" <+> a <+> ")" |
615 | 610 | ||
616 | data Uniform | 611 | data 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 | ||
836 | data Exp_ a | 830 | data 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 | ||
863 | pattern Pi h a b = Exp (Pi_ h a b) | 855 | pattern Pi h a b = Exp (Pi_ h a b) |
864 | pattern Lam h n a b = Exp (Lam_ h n a b) | 856 | pattern Lam h a b = Exp (Lam_ h a b) |
865 | pattern Con n a b = Exp (Con_ (UntickName n) a b) | 857 | pattern Con n a b = Exp (Con_ (UntickName n) a b) |
866 | pattern ELit a = Exp (ELit_ a) | 858 | pattern ELit a = Exp (ELit_ a) |
867 | pattern Fun n a b md = Exp (Fun_ (UntickName n) a b md) | 859 | pattern 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 | ||
897 | tyApp (Pi _ a b) x = I.subst 0 x b | 889 | tyApp (Pi _ a b) x = I.subst 0 x b |
898 | 890 | ||
899 | app' (Lam _ (PVarr) _ x) b = I.subst 0 b x | 891 | app' (Lam _ _ x) b = I.subst 0 b x |
900 | app' a b = App a b | 892 | app' a b = App a b |
901 | 893 | ||
902 | pattern UntickName n <- (untick -> n) where UntickName = untick | 894 | pattern 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 | ||
978 | tyOf :: Exp -> Ty | 970 | tyOf :: Exp -> Ty |
979 | tyOf = \case | 971 | tyOf = \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 | ||
992 | data Pat | ||
993 | = PVar Exp | ||
994 | | PTuple [Pat] | ||
995 | deriving (Eq, Show) | ||
996 | |||
997 | instance PShow Pat where | ||
998 | pShowPrec p = \case | ||
999 | PVar t -> text "?" | ||
1000 | PTuple ps -> tupled $ map pShow ps | ||
1001 | |||
1002 | pattern PVarr <- PVar _ | ||
1003 | |||
1004 | -- workaround for backward compatibility | 984 | -- workaround for backward compatibility |
1005 | etaRed (ELam (PVarr) (App f (EVar' 0))) | 0 `Set.notMember` freeVars f = downE f | 985 | etaRed (ELam _ (App f (EVar' 0))) | 0 `Set.notMember` freeVars f = etaRed $ downE f |
1006 | etaRed (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 | 986 | etaRed (ELam _ (Prim3 (tupCaseName -> Just k) _ x (EVar' 0))) | 0 `Set.notMember` freeVars x |
1007 | etaRed x = x | 987 | = uncurry (\ps e -> Just (ps, e)) $ getPats k $ downE x |
988 | etaRed (ELam p i) = Just (getPVars p, i) | ||
989 | etaRed x = Nothing | ||
990 | |||
991 | getPVars = \case | ||
992 | TUnit -> [] | ||
993 | t -> [t] | ||
1008 | 994 | ||
1009 | getPats 0 e = ([], e) | 995 | getPats 0 e = ([], e) |
1010 | getPats i (ELam p e) = first (p:) $ getPats (i-1) e | 996 | getPats 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])) | |||
1018 | pattern EtaPrim5 s x1 x2 x3 x4 <- (getEtaPrim -> Just (s, [x1, x2, x3, x4])) | 1004 | pattern EtaPrim5 s x1 x2 x3 x4 <- (getEtaPrim -> Just (s, [x1, x2, x3, x4])) |
1019 | pattern EtaPrim2_2 s <- (getEtaPrim2 -> Just (s, [])) | 1005 | pattern EtaPrim2_2 s <- (getEtaPrim2 -> Just (s, [])) |
1020 | 1006 | ||
1021 | getEtaPrim (ELam (PVarr) (PrimN s (initLast -> Just (xs, EVar' 0)))) | all (Set.notMember 0 . freeVars) xs = Just (s, I.subst 0 (error "impossible" :: Exp) <$> xs) | 1007 | getEtaPrim (ELam _ (PrimN s (initLast -> Just (xs, EVar' 0)))) | all (Set.notMember 0 . freeVars) xs = Just (s, I.subst 0 (error "impossible" :: Exp) <$> xs) |
1022 | getEtaPrim _ = Nothing | 1008 | getEtaPrim _ = Nothing |
1023 | 1009 | ||
1024 | getEtaPrim2 (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) | 1010 | getEtaPrim2 (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) |
1025 | getEtaPrim2 _ = Nothing | 1011 | getEtaPrim2 _ = Nothing |
1026 | 1012 | ||
1027 | initLast [] = Nothing | 1013 | initLast [] = Nothing |
@@ -1039,7 +1025,7 @@ tupCaseName _ = Nothing | |||
1039 | 1025 | ||
1040 | pattern EVar' n <- Var n _ | 1026 | pattern EVar' n <- Var n _ |
1041 | 1027 | ||
1042 | pattern ELam n b <- Lam Visible n _ b where ELam n b = Lam Visible n (tyOf b) b | 1028 | pattern ELam t b <- Lam Visible t b where ELam t b = Lam Visible t b |
1043 | 1029 | ||
1044 | pattern PrimN n xs <- Fun n t (filterRelevant t -> xs) _ | 1030 | pattern PrimN n xs <- Fun n t (filterRelevant t -> xs) _ |
1045 | pattern Prim0 n <- PrimN n [] | 1031 | pattern Prim0 n <- PrimN n [] |