]> git.tdb.fi Git - libs/gl.git/blobdiff - source/programcompiler.cpp
Check for maximum number of samples
[libs/gl.git] / source / programcompiler.cpp
index c54a33d6b6fbf0147fe21dd069db9f391d42cc16..b004b08bee6f533e437f09051ca28d9bfdb22fbb 100644 (file)
@@ -1,4 +1,5 @@
 #include <msp/core/raii.h>
+#include <msp/gl/extensions/ext_gpu_shader4.h>
 #include <msp/strings/format.h>
 #include <msp/strings/utils.h>
 #include "error.h"
@@ -71,8 +72,11 @@ void ProgramCompiler::add_shaders(Program &program)
                else if(i->type==FRAGMENT)
                {
                        program.attach_shader_owned(new FragmentShader(apply<Formatter>(*i)));
-                       for(map<string, unsigned>::iterator j=i->locations.begin(); j!=i->locations.end(); ++j)
-                               program.bind_fragment_data(j->second, j->first);
+                       if(EXT_gpu_shader4)
+                       {
+                               for(map<string, unsigned>::iterator j=i->locations.begin(); j!=i->locations.end(); ++j)
+                                       program.bind_fragment_data(j->second, j->first);
+                       }
                }
        }
 }
@@ -230,6 +234,38 @@ void ProgramCompiler::Visitor::apply(Stage &s)
 }
 
 
+ProgramCompiler::BlockModifier::BlockModifier():
+       remove_node(false)
+{ }
+
+void ProgramCompiler::BlockModifier::flatten_block(Block &block)
+{
+       insert_nodes.insert(insert_nodes.end(), block.body.begin(), block.body.end());
+       remove_node = true;
+}
+
+void ProgramCompiler::BlockModifier::apply_and_increment(Block &block, list<RefPtr<Node> >::iterator &i)
+{
+       block.body.insert(i, insert_nodes.begin(), insert_nodes.end());
+       insert_nodes.clear();
+
+       if(remove_node)
+               block.body.erase(i++);
+       else
+               ++i;
+       remove_node = false;
+}
+
+void ProgramCompiler::BlockModifier::visit(Block &block)
+{
+       for(list<RefPtr<Node> >::iterator i=block.body.begin(); i!=block.body.end(); )
+       {
+               (*i)->visit(*this);
+               apply_and_increment(block, i);
+       }
+}
+
+
 ProgramCompiler::Formatter::Formatter():
        indent(0),
        parameter_list(false),
@@ -496,8 +532,7 @@ void ProgramCompiler::Formatter::visit(Jump &jump)
 
 
 ProgramCompiler::DeclarationCombiner::DeclarationCombiner():
-       toplevel(true),
-       remove_node(false)
+       toplevel(true)
 { }
 
 void ProgramCompiler::DeclarationCombiner::visit(Block &block)
@@ -506,15 +541,7 @@ void ProgramCompiler::DeclarationCombiner::visit(Block &block)
                return;
 
        SetForScope<bool> set(toplevel, false);
-       for(list<RefPtr<Node> >::iterator i=block.body.begin(); i!=block.body.end(); )
-       {
-               remove_node = false;
-               (*i)->visit(*this);
-               if(remove_node)
-                       block.body.erase(i++);
-               else
-                       ++i;
-       }
+       BlockModifier::visit(block);
 }
 
 void ProgramCompiler::DeclarationCombiner::visit(FunctionDeclaration &func)
@@ -714,38 +741,6 @@ void ProgramCompiler::FunctionResolver::visit(FunctionDeclaration &func)
 }
 
 
-ProgramCompiler::BlockModifier::BlockModifier():
-       remove_node(false)
-{ }
-
-void ProgramCompiler::BlockModifier::flatten_block(Block &block)
-{
-       insert_nodes.insert(insert_nodes.end(), block.body.begin(), block.body.end());
-       remove_node = true;
-}
-
-void ProgramCompiler::BlockModifier::apply_and_increment(Block &block, list<RefPtr<Node> >::iterator &i)
-{
-       block.body.insert(i, insert_nodes.begin(), insert_nodes.end());
-       insert_nodes.clear();
-
-       if(remove_node)
-               block.body.erase(i++);
-       else
-               ++i;
-       remove_node = false;
-}
-
-void ProgramCompiler::BlockModifier::visit(Block &block)
-{
-       for(list<RefPtr<Node> >::iterator i=block.body.begin(); i!=block.body.end(); )
-       {
-               (*i)->visit(*this);
-               apply_and_increment(block, i);
-       }
-}
-
-
 ProgramCompiler::InterfaceGenerator::InterfaceGenerator():
        scope_level(0)
 { }
@@ -1687,6 +1682,8 @@ void ProgramCompiler::LegacyConverter::visit(VariableDeclaration &var)
                        }
                        else if(stage->type==FRAGMENT && var.interface=="out")
                        {
+                               if(location!=0)
+                                       static Require _req(EXT_gpu_shader4);
                                stage->locations[var.name] = location;
                                var.layout->qualifiers.erase(i);
                        }