]> git.tdb.fi Git - libs/gl.git/blobdiff - source/programcompiler.cpp
Recognize #version directive in GLSL
[libs/gl.git] / source / programcompiler.cpp
index bb77e0ea911e205c192c68cd88462f6affdf1ff6..f30ccfa6233ad6b6dc8115488210c7f1dbd4c7a5 100644 (file)
@@ -4,6 +4,7 @@
 #include <msp/gl/extensions/arb_gpu_shader5.h>
 #include <msp/gl/extensions/arb_uniform_buffer_object.h>
 #include <msp/gl/extensions/ext_gpu_shader4.h>
+#include <msp/gl/extensions/ext_texture_array.h>
 #include <msp/strings/format.h>
 #include <msp/strings/regex.h>
 #include <msp/strings/utils.h>
@@ -208,6 +209,8 @@ void ProgramCompiler::append_stage(Stage &stage)
                target = &*i;
        }
 
+       if(stage.required_version>target->required_version)
+               target->required_version = stage.required_version;
        for(NodeList<Statement>::iterator i=stage.content.body.begin(); i!=stage.content.body.end(); ++i)
                target->content.body.push_back(*i);
        apply<DeclarationCombiner>(*target);
@@ -244,6 +247,8 @@ void ProgramCompiler::import(const string &name)
 
 void ProgramCompiler::generate(Stage &stage)
 {
+       if(module->shared.required_version>stage.required_version)
+               stage.required_version = module->shared.required_version;
        inject_block(stage.content, module->shared.content);
 
        apply<DeclarationReorderer>(stage);
@@ -989,7 +994,7 @@ bool ProgramCompiler::InterfaceGenerator::generate_interface(VariableDeclaration
        return true;
 }
 
-void ProgramCompiler::InterfaceGenerator::insert_assignment(const string &left, ProgramSyntax::Expression *right)
+ExpressionStatement &ProgramCompiler::InterfaceGenerator::insert_assignment(const string &left, ProgramSyntax::Expression *right)
 {
        Assignment *assign = new Assignment;
        VariableReference *ref = new VariableReference;
@@ -1002,6 +1007,8 @@ void ProgramCompiler::InterfaceGenerator::insert_assignment(const string &left,
        stmt->expression = assign;
        stmt->visit(*this);
        insert_nodes.push_back(stmt);
+
+       return *stmt;
 }
 
 void ProgramCompiler::InterfaceGenerator::visit(VariableReference &var)
@@ -1033,7 +1040,9 @@ void ProgramCompiler::InterfaceGenerator::visit(VariableDeclaration &var)
                        remove_node = true;
                        if(var.init_expression)
                        {
-                               insert_assignment(var.name, var.init_expression->clone());
+                               ExpressionStatement &stmt = insert_assignment(var.name, var.init_expression->clone());
+                               stmt.source = var.source;
+                               stmt.line = var.line;
                                return;
                        }
                }
@@ -1944,10 +1953,32 @@ void ProgramCompiler::LegacyConverter::visit(FunctionCall &call)
                                call.name = "texture2D";
                        else if(type=="sampler3D")
                                call.name = "texture3D";
+                       else if(type=="samplerCube")
+                               call.name = "textureCube";
                        else if(type=="sampler1DShadow")
                                call.name = "shadow1D";
                        else if(type=="sampler2DShadow")
                                call.name = "shadow2D";
+                       else if(type=="sampler1DArray")
+                       {
+                               check_extension(EXT_texture_array);
+                               call.name = "texture1DArray";
+                       }
+                       else if(type=="sampler2DArray")
+                       {
+                               check_extension(EXT_texture_array);
+                               call.name = "texture2DArray";
+                       }
+                       else if(type=="sampler1DArrayShadow")
+                       {
+                               check_extension(EXT_texture_array);
+                               call.name = "shadow1DArray";
+                       }
+                       else if(type=="sampler2DArrayShadow")
+                       {
+                               check_extension(EXT_texture_array);
+                               call.name = "shadow2DArray";
+                       }
 
                        for(; i!=call.arguments.end(); ++i)
                                (*i)->visit(*this);