]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/compiler.cpp
Further refactor the resolving process in SL::Compiler
[libs/gl.git] / source / glsl / compiler.cpp
index 66a487fbccd4b7a63f2575295ecc03fcbfcddf5a..7dbb501c777bd177b53e9ba37229913e5f07fd92 100644 (file)
@@ -240,22 +240,46 @@ void Compiler::generate(Stage &stage, Mode mode)
                inject_block(stage.content, builtins->content);
 
        // Initial resolving pass
-       BlockHierarchyResolver().apply(stage);
-       TypeResolver().apply(stage);
-       FunctionResolver().apply(stage);
-       VariableResolver().apply(stage);
+       resolve(stage);
 
        /* All variables local to a stage have been resolved.  Resolve non-local
        variables through interfaces. */
        InterfaceGenerator().apply(stage);
-       TypeResolver().apply(stage);
-       VariableResolver().apply(stage);
-       ExpressionResolver().apply(stage);
+       resolve(stage, RESOLVE_BLOCKS|RESOLVE_TYPES|RESOLVE_VARIABLES);
 
-       FunctionResolver().apply(stage);
        ConstantSpecializer().apply(stage, (mode==PROGRAM && specialized ? &spec_values : 0));
        if(mode==PROGRAM)
+       {
                LegacyConverter().apply(stage, features);
+               resolve(stage, RESOLVE_VARIABLES|RESOLVE_FUNCTIONS);
+       }
+}
+
+template<typename T>
+bool Compiler::resolve(Stage &stage, unsigned &flags, unsigned bit)
+{
+       if(!(flags&bit))
+               return false;
+
+       flags &= ~bit;
+       return T().apply(stage);
+}
+
+void Compiler::resolve(Stage &stage, unsigned flags)
+{
+       while(flags)
+       {
+               if(resolve<BlockHierarchyResolver>(stage, flags, RESOLVE_BLOCKS))
+                       ;
+               else if(resolve<TypeResolver>(stage, flags, RESOLVE_TYPES))
+                       flags |= RESOLVE_VARIABLES|RESOLVE_EXPRESSIONS;
+               else if(resolve<VariableResolver>(stage, flags, RESOLVE_VARIABLES))
+                       flags |= RESOLVE_EXPRESSIONS;
+               else if(resolve<FunctionResolver>(stage, flags, RESOLVE_FUNCTIONS))
+                       flags |= RESOLVE_EXPRESSIONS;
+               else if(resolve<ExpressionResolver>(stage, flags, RESOLVE_EXPRESSIONS))
+                       flags |= RESOLVE_VARIABLES;
+       }
 }
 
 bool Compiler::validate(Stage &stage)
@@ -276,14 +300,16 @@ Compiler::OptimizeResult Compiler::optimize(Stage &stage)
 {
        ConstantConditionEliminator().apply(stage);
 
-       bool any_inlined = FunctionInliner().apply(stage);
-       any_inlined |= ExpressionInliner().apply(stage);
-       if(any_inlined)
+       bool any_inlined = false;
+       if(FunctionInliner().apply(stage))
+       {
+               resolve(stage, RESOLVE_TYPES|RESOLVE_VARIABLES|RESOLVE_EXPRESSIONS);
+               any_inlined = true;
+       }
+       if(ExpressionInliner().apply(stage))
        {
-               TypeResolver().apply(stage);
-               VariableResolver().apply(stage);
-               FunctionResolver().apply(stage);
-               ExpressionResolver().apply(stage);
+               resolve(stage, RESOLVE_VARIABLES|RESOLVE_EXPRESSIONS);
+               any_inlined = true;
        }
 
        /* Removing variables or functions may cause things from the previous stage