]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/compiler.cpp
Redesign ExpressionInliner
[libs/gl.git] / source / glsl / compiler.cpp
index 0ad41dfac46c2de102c827e17fa550b421166f3e..74eec856d86a154561669ab9a1745793236e945e 100644 (file)
@@ -12,6 +12,7 @@
 #include "output.h"
 #include "resolve.h"
 #include "resources.h"
+#include "spirv.h"
 #include "validate.h"
 
 #undef interface
@@ -78,6 +79,9 @@ void Compiler::specialize(const map<string, int> &sv)
 
 void Compiler::compile(Mode mode)
 {
+       if(specialized && mode!=PROGRAM)
+               throw invalid_operation("Compiler::compile");
+
        for(list<Stage>::iterator i=module->stages.begin(); i!=module->stages.end(); ++i)
                generate(*i);
        ConstantIdAssigner().apply(*module, features);
@@ -93,7 +97,7 @@ void Compiler::compile(Mode mode)
        if(!valid)
                throw invalid_shader_source(get_diagnostics());
 
-       if(mode==PROGRAM && specialized)
+       if(specialized)
        {
                for(list<Stage>::iterator i=module->stages.begin(); i!=module->stages.end(); ++i)
                        ConstantSpecializer().apply(*i, spec_values);
@@ -153,6 +157,15 @@ string Compiler::get_stage_glsl(Stage::Type stage_type) const
        throw key_error(Stage::get_stage_name(stage_type));
 }
 
+vector<UInt32> Compiler::get_combined_spirv() const
+{
+       if(!compiled)
+               throw invalid_operation("Compiler::get_combined_spirv");
+       SpirVGenerator gen;
+       gen.apply(*module);
+       return gen.get_code();
+}
+
 const map<string, unsigned> &Compiler::get_vertex_attributes() const
 {
        if(!compiled)
@@ -323,6 +336,7 @@ void Compiler::validate(Stage &stage)
        IdentifierValidator().apply(stage);
        ReferenceValidator().apply(stage);
        ExpressionValidator().apply(stage);
+       FlowControlValidator().apply(stage);
        StageInterfaceValidator().apply(stage);
 }
 
@@ -372,7 +386,8 @@ Compiler::OptimizeResult Compiler::optimize(Stage &stage)
 
        /* Removing variables or functions may cause things from the previous stage
        to become unused. */
-       bool any_removed = UnusedVariableRemover().apply(stage);
+       bool any_removed = UnreachableCodeRemover().apply(stage);
+       any_removed |= UnusedVariableRemover().apply(stage);
        any_removed |= UnusedFunctionRemover().apply(stage);
        any_removed |= UnusedTypeRemover().apply(stage);
 
@@ -387,6 +402,8 @@ void Compiler::finalize(Stage &stage, Mode mode)
                resolve(stage, RESOLVE_VARIABLES|RESOLVE_FUNCTIONS);
                PrecisionConverter().apply(stage);
        }
+       else if(mode==SPIRV)
+               StructOrganizer().apply(stage);
 
        // Collect bindings from all stages into the shared stage's maps
        module->shared.texture_bindings.insert(stage.texture_bindings.begin(), stage.texture_bindings.end());