]> git.tdb.fi Git - libs/gl.git/commitdiff
Allocate locations to interface variables
authorMikko Rasa <tdb@tdb.fi>
Sat, 3 Apr 2021 10:56:16 +0000 (13:56 +0300)
committerMikko Rasa <tdb@tdb.fi>
Sat, 3 Apr 2021 16:40:26 +0000 (19:40 +0300)
27 files changed:
source/glsl/compiler.cpp
source/glsl/finalize.cpp
source/glsl/finalize.h
tests/glsl/alias_types.glsl
tests/glsl/arithmetic_assignment.glsl
tests/glsl/complex_constant_condition_removal.glsl
tests/glsl/conditional_multiple_emitvertex.glsl
tests/glsl/constant_last_argument.glsl
tests/glsl/constructors.glsl
tests/glsl/dead_loop_removal.glsl
tests/glsl/function_arguments_inline.glsl
tests/glsl/function_inline_parameter_name_conflict.glsl
tests/glsl/function_overloading.glsl
tests/glsl/geometry_interface_block.glsl
tests/glsl/geometry_passthrough.glsl
tests/glsl/ignore_array_in_geometry_passthrough.glsl
tests/glsl/keep_spec_constants_in_module.glsl
tests/glsl/multiple_emitvertex.glsl
tests/glsl/nested_function_inline.glsl
tests/glsl/parentheses.glsl
tests/glsl/passthrough.glsl
tests/glsl/passthrough_declaration_order.glsl
tests/glsl/referenced_but_unassigned_output.glsl
tests/glsl/specialization_constants.glsl
tests/glsl/ternary_operator.glsl
tests/glsl/uniform_location_allocation.glsl [new file with mode: 0644]
tests/glsl/variable_assignment_subscript.glsl

index e0a676065953412db77519308f28db7becd88af2..1948722a6c29b24fb3a36c92759a3dec592479d3 100644 (file)
@@ -106,6 +106,8 @@ void Compiler::compile(Mode mode)
                else if(result!=REDO_STAGE)
                        ++i;
        }
+
+       LocationAllocator().apply(*module);
        for(list<Stage>::iterator i=module->stages.begin(); i!=module->stages.end(); ++i)
                finalize(*i, mode);
 
index 0adb2960b1da3784a4554d9a97b447b12163481d..0805a29e830eb45d626970a80faa1d10ae072c3b 100644 (file)
@@ -3,6 +3,7 @@
 #include <msp/strings/lexicalcast.h>
 #include "finalize.h"
 #include "glsl_error.h"
+#include "reflect.h"
 
 using namespace std;
 
@@ -10,6 +11,113 @@ namespace Msp {
 namespace GL {
 namespace SL {
 
+void LocationAllocator::apply(Module &module)
+{
+       for(list<Stage>::iterator i=module.stages.begin(); i!=module.stages.end(); ++i)
+               apply(*i);
+       allocate_locations("uniform");
+}
+
+void LocationAllocator::apply(Stage &stage)
+{
+       swap(used_locations["in"], used_locations["out"]);
+       used_locations["out"].clear();
+
+       stage.content.visit(*this);
+
+       allocate_locations("in");
+       allocate_locations("out");
+}
+
+void LocationAllocator::allocate_locations(const string &iface)
+{
+       vector<VariableDeclaration *>::iterator write = unplaced_variables.begin();
+       unsigned next = 0;
+       for(vector<VariableDeclaration *>::const_iterator i=unplaced_variables.begin(); i!=unplaced_variables.end(); ++i)
+       {
+               if((*i)->interface!=iface)
+               {
+                       if(write!=i)
+                               *write = *i;
+                       ++write;
+                       continue;
+               }
+
+               if((*i)->interface=="uniform")
+               {
+                       map<string, unsigned>::const_iterator j = uniform_locations.find((*i)->name);
+                       if(j!=uniform_locations.end())
+                       {
+                               add_location((*i)->layout, j->second);
+                               continue;
+                       }
+               }
+
+               set<unsigned> &used = used_locations[(*i)->interface];
+
+               unsigned size = LocationCounter().apply(**i);
+               while(1)
+               {
+                       int blocking = -1;
+                       for(unsigned j=0; j<size; ++j)
+                               if(used.count(next+j))
+                                       blocking = next+j;
+                       if(blocking<0)
+                               break;
+                       next = blocking+1;
+               }
+
+               add_location((*i)->layout, next);
+               if((*i)->interface=="uniform")
+                       uniform_locations[(*i)->name] = next;
+
+               for(unsigned j=0; j<size; ++j)
+                       used.insert(next+j);
+               next += size;
+       }
+
+       unplaced_variables.erase(write, unplaced_variables.end());
+}
+
+void LocationAllocator::add_location(RefPtr<Layout> &layout, unsigned location)
+{
+       if(!layout)
+               layout = new Layout;
+
+       Layout::Qualifier qual;
+       qual.name = "location";
+       qual.has_value = true;
+       qual.value = location;
+       layout->qualifiers.push_back(qual);
+}
+
+void LocationAllocator::visit(VariableDeclaration &var)
+{
+       if(!var.interface.empty() && var.name.compare(0, 3, "gl_"))
+       {
+               int location = (var.layout ? get_layout_value(*var.layout, "location") : -1);
+
+               if(location<0 && var.linked_declaration && var.linked_declaration->layout)
+               {
+                       location = get_layout_value(*var.linked_declaration->layout, "location");
+                       if(location>=0)
+                               add_location(var.layout, location);
+               }
+
+               if(location>=0)
+               {
+                       unsigned size = LocationCounter().apply(var);
+                       for(unsigned i=0; i<size; ++i)
+                               used_locations[var.interface].insert(location+i);
+                       if(var.interface=="uniform")
+                               uniform_locations[var.name] = location;
+               }
+               else
+                       unplaced_variables.push_back(&var);
+       }
+}
+
+
 PrecisionConverter::PrecisionConverter():
        stage(0)
 { }
index 357351b476bd071500847c5653e044025a82c082..36b349125f51eb236cff061d9c08c0ad49c2a542 100644 (file)
@@ -8,6 +8,26 @@ namespace Msp {
 namespace GL {
 namespace SL {
 
+class LocationAllocator: private TraversingVisitor
+{
+private:
+       std::map<std::string, std::set<unsigned> > used_locations;
+       std::map<std::string, unsigned> uniform_locations;
+       std::vector<VariableDeclaration *> unplaced_variables;
+
+public:
+       void apply(Module &);
+private:
+       void apply(Stage &);
+
+       void allocate_locations(const std::string &);
+       void add_location(RefPtr<Layout> &, unsigned);
+
+       virtual void visit(VariableDeclaration &);
+       virtual void visit(InterfaceBlock &) { }
+       virtual void visit(FunctionDeclaration &) { }
+};
+
 /** Generates default precision declarations or removes precision declarations
 according to the requirements of the target API. */
 class PrecisionConverter: private TraversingVisitor
index 8e6e9a91172f458ce594a2cdaf9ca525f940e0c7..0fda73e30ecc5c9d6b50bf83bc0b9118559c2eaf 100644 (file)
@@ -11,7 +11,7 @@ void main()
 }
 
 /* Expected output: vertex
-uniform mat4 mvp;
+layout(location=0) uniform mat4 mvp;
 layout(location=0) in vec4 position;
 void main()
 {
index d6c48ad89152909634f027c413ac1238fc4c3a27..01e03b075a1580951d510b43a9e9653acdb6457f 100644 (file)
@@ -26,12 +26,12 @@ void main()
 }
 
 /* Expected output: vertex
-uniform mat4 mvp;
+layout(location=0) uniform mat4 mvp;
 layout(location=0) in vec4 position;
 layout(location=1) in vec3 normal;
 layout(location=2) in vec2 texcoord;
-out float light;
-out vec2 _vs_out_texcoord;
+layout(location=0) out float light;
+layout(location=1) out vec2 _vs_out_texcoord;
 void main()
 {
   light = normal.z;
@@ -41,12 +41,12 @@ void main()
 */
 
 /* Expected output: fragment
-uniform sampler2D tex;
-uniform vec3 tint;
-uniform vec3 ambient;
-out vec4 frag_color;
-in vec2 _vs_out_texcoord;
-in float light;
+layout(location=4) uniform sampler2D tex;
+layout(location=5) uniform vec3 tint;
+layout(location=6) uniform vec3 ambient;
+layout(location=0) out vec4 frag_color;
+layout(location=1) in vec2 _vs_out_texcoord;
+layout(location=0) in float light;
 void main()
 {
   vec3 color = texture(tex, _vs_out_texcoord).rgb;
index 5a2c588f07b9b76df91334be57a058ccf0198734..4f7819b9564f85b26358da86773d97e5e5fbc2f0 100644 (file)
@@ -24,7 +24,7 @@ void main()
 /* Expected output: vertex
 layout(location=0) in vec4 position;
 layout(location=1) in vec4 color;
-out vec4 _vs_out_color;
+layout(location=0) out vec4 _vs_out_color;
 void main()
 {
        gl_Position = position;
@@ -34,7 +34,7 @@ void main()
 
 /* Expected output: fragment
 layout(location=0) out vec4 frag_color;
-in vec4 _vs_out_color;
+layout(location=0) in vec4 _vs_out_color;
 void main()
 {
        frag_color = _vs_out_color;
index 375a436650c8d4fdea8bdc08bb490d562fb7b016..7a80a72b2fe7c76faa32f9dffcd507cc198449d2 100644 (file)
@@ -34,7 +34,7 @@ void main()
 
 /* Expected output: vertex
 layout(location=0) in vec4 position;
-out vec2 texcoord;
+layout(location=0) out vec2 texcoord;
 void main()
 {
        texcoord = position.xy*0.5+0.5;
@@ -43,11 +43,11 @@ void main()
 */
 
 /* Expected output: geometry
-uniform bool flag;
+layout(location=0) uniform bool flag;
 layout(triangles) in;
 layout(triangle_strip, max_vertices=3) out;
-in vec2 texcoord[];
-out vec2 _gs_out_texcoord;
+layout(location=0) in vec2 texcoord[];
+layout(location=0) out vec2 _gs_out_texcoord;
 void main()
 {
        gl_Position = gl_in[0].gl_Position;
@@ -66,9 +66,9 @@ void main()
 */
 
 /* Expected output: fragment
-uniform sampler2D tex;
+layout(location=1) uniform sampler2D tex;
 layout(location=0) out vec4 frag_color;
-in vec2 _gs_out_texcoord;
+layout(location=0) in vec2 _gs_out_texcoord;
 void main()
 {
        frag_color = texture(tex, _gs_out_texcoord);
index b73f18260c6bce2b08eb77e99470d0391e8889f5..4285b5f06889c11723cfdf48593841d3e539e4c5 100644 (file)
@@ -18,10 +18,10 @@ void main()
 }
 
 /* Expected output: vertex
-uniform mat4 mvp;
+layout(location=0) uniform mat4 mvp;
 layout(location=0) in vec4 position;
 layout(location=1) in vec2 texcoord;
-out vec2 _vs_out_texcoord;
+layout(location=0) out vec2 _vs_out_texcoord;
 void main()
 {
        gl_Position = mvp*position;
@@ -30,9 +30,9 @@ void main()
 */
 
 /* Expected output: fragment
-uniform sampler2D tex;
+layout(location=4) uniform sampler2D tex;
 layout(location=0) out vec4 frag_color;
-in vec2 _vs_out_texcoord;
+layout(location=0) in vec2 _vs_out_texcoord;
 void main()
 {
        frag_color = textureLod(tex, _vs_out_texcoord, 0.0)*0.8;
index fe7ca48ab65513ad9e2ce42eec42c0be40bddbc4..d10dacf51dce9a6a6f04be0f779a8eb9c82262ea 100644 (file)
@@ -27,16 +27,16 @@ void main()
 }
 
 /* Expected output: vertex
-uniform mat4 model;
-uniform mat4 view_projection;
-uniform vec3 light_dir;
+layout(location=0) uniform mat4 model;
+layout(location=4) uniform mat4 view_projection;
+layout(location=8) uniform vec3 light_dir;
 layout(location=0) in vec3 position;
 layout(location=1) in vec3 normal;
 layout(location=2) in vec3 tangent;
 layout(location=3) in vec3 binormal;
 layout(location=4) in vec2 texcoord;
-out vec3 tbn_light_dir;
-out vec2 _vs_out_texcoord;
+layout(location=0) out vec3 tbn_light_dir;
+layout(location=1) out vec2 _vs_out_texcoord;
 void main()
 {
   mat3 normal_matrix = mat3(model[0].xyz, model[1].xyz, model[2].xyz);
@@ -47,10 +47,10 @@ void main()
 */
 
 /* Expected output: fragment
-uniform sampler2D normalmap;
+layout(location=9) uniform sampler2D normalmap;
 layout(location=0) out vec4 frag_color;
-in vec2 _vs_out_texcoord;
-in vec3 tbn_light_dir;
+layout(location=1) in vec2 _vs_out_texcoord;
+layout(location=0) in vec3 tbn_light_dir;
 void main()
 {
   frag_color = vec4(vec3(dot(vec3(texture(normalmap, _vs_out_texcoord).xyz)*2.0-1.0, normalize(tbn_light_dir))), float(1));
index 7cfba086b23fdcc5bbb5d5af5e59391ad5806d62..ee5c0360df19cb213f478249b096ba97ce8f22a8 100644 (file)
@@ -29,8 +29,8 @@ void main()
 }
 
 /* Expected output: vertex
-uniform mat4 model_matrix;
-uniform mat4 vp_matrix;
+layout(location=0) uniform mat4 model_matrix;
+layout(location=4) uniform mat4 vp_matrix;
 layout(location=0) in vec4 position;
 void main()
 {
@@ -39,7 +39,7 @@ void main()
 */
 
 /* Expected output: fragment
-uniform vec3 ambient;
+layout(location=8) uniform vec3 ambient;
 layout(location=0) out vec4 frag_color;
 void main()
 {
index f9946c9c6541cebea2ff676028d517d19948759c..84ec1c07cdffde3aef7dc38e5fd545a05a5a0599 100644 (file)
@@ -12,7 +12,7 @@ void main()
 }
 
 /* Expected output: vertex
-uniform mat4 mvp;
+layout(location=0) uniform mat4 mvp;
 layout(location=0) in vec4 position;
 void main()
 {
index fb124f872d497a39e9d277d652374d1dfc293ab6..831858f07cf34a67b87824febee4674673023643 100644 (file)
@@ -15,7 +15,7 @@ void main()
 }
 
 /* Expected output: vertex
-uniform mat4 mvp;
+layout(location=0) uniform mat4 mvp;
 layout(location=0) in vec4 position;
 layout(location=1) in vec4 offset;
 void main()
index 6924a6286b64745b6e940f9440461acc91412445..02576cadcc5096473034123ad49b3fcef0d7c91f 100644 (file)
@@ -30,10 +30,10 @@ void main()
 }
 
 /* Expected output: vertex
-uniform mat4 mvp;
+layout(location=0) uniform mat4 mvp;
 layout(location=0) in vec4 position;
 layout(location=1) in vec2 texcoord;
-out vec2 _vs_out_texcoord;
+layout(location=0) out vec2 _vs_out_texcoord;
 void main()
 {
   _vs_out_texcoord = texcoord;
@@ -42,9 +42,9 @@ void main()
 */
 
 /* Expected output: fragment
-uniform sampler2D tex;
+layout(location=4) uniform sampler2D tex;
 layout(location=0) out vec4 frag_color;
-in vec2 _vs_out_texcoord;
+layout(location=0) in vec2 _vs_out_texcoord;
 void main()
 {
        vec4 color = texture(tex, _vs_out_texcoord);
index 9f3fae5bed1a88d8204df98b60c93227ec251344..fb9a2aa00ad53cebd6ba61028a26dbf62d2b2b62 100644 (file)
@@ -72,7 +72,7 @@ void main()
 */
 
 /* Expected output: fragment
-uniform sampler2D tex;
+layout(location=0) uniform sampler2D tex;
 layout(location=0) out vec4 frag_color;
 in GeometryOut
 {
index 9acfe83ef0303eb7c30869e1ab118e5611422661..95e5ecbdb8289a1bea57235f4faa4ec4e483757b 100644 (file)
@@ -29,7 +29,7 @@ void main()
 
 /* Expected output: vertex
 layout(location=0) in vec4 position;
-out vec2 texcoord;
+layout(location=0) out vec2 texcoord;
 void main()
 {
        texcoord = position.xy*0.5+0.5;
@@ -40,8 +40,8 @@ void main()
 /* Expected output: geometry
 layout(triangles) in;
 layout(triangle_strip, max_vertices=3) out;
-in vec2 texcoord[];
-out vec2 _gs_out_texcoord;
+layout(location=0) in vec2 texcoord[];
+layout(location=0) out vec2 _gs_out_texcoord;
 void main()
 {
        for(int i = 0; i<3; ++i)
@@ -54,9 +54,9 @@ void main()
 */
 
 /* Expected output: fragment
-uniform sampler2D tex;
+layout(location=0) uniform sampler2D tex;
 layout(location=0) out vec4 frag_color;
-in vec2 _gs_out_texcoord;
+layout(location=0) in vec2 _gs_out_texcoord;
 void main()
 {
        frag_color = texture(tex, _gs_out_texcoord);
index 62e4d7932bd6cbd78c730c9d6f1e416997faa5db..598a177c28cf066b9a537af5dc80821d97934a02 100644 (file)
@@ -32,11 +32,11 @@ void main()
 }
 
 /* Expected output: vertex
-uniform mat4 vp_matrix;
+layout(location=0) uniform mat4 vp_matrix;
 layout(location=0) in vec4 position;
 layout(location=1) in vec2 texcoord;
 layout(location=2) in vec4 instance_transform[3];
-out vec2 _vs_out_texcoord;
+layout(location=0) out vec2 _vs_out_texcoord;
 void main()
 {
   _vs_out_texcoord = texcoord;
@@ -47,8 +47,8 @@ void main()
 /* Expected output: geometry
 layout(triangles) in;
 layout(triangle_strip, max_vertices=3) out;
-in vec2 _vs_out_texcoord[];
-out vec2 _gs_out_texcoord;
+layout(location=0) in vec2 _vs_out_texcoord[];
+layout(location=0) out vec2 _gs_out_texcoord;
 void main()
 {
        for(int i = 0; i<3; ++i)
@@ -61,9 +61,9 @@ void main()
 */
 
 /* Expected output: fragment
-uniform sampler2D tex;
+layout(location=4) uniform sampler2D tex;
 layout(location=0) out vec4 frag_color;
-in vec2 _gs_out_texcoord;
+layout(location=0) in vec2 _gs_out_texcoord;
 void main()
 {
        frag_color = texture(tex, _gs_out_texcoord);
index a7feab178f41144f65ee90b9e314eda0c21df34d..674e55eced68ae333a47dcf96175cf1ba5ba4ac1 100644 (file)
@@ -27,12 +27,12 @@ void main()
 // Compile mode: module
 
 /* Expected output: vertex
-uniform mat4 mvp;
+layout(location=0) uniform mat4 mvp;
 layout(location=0) in vec4 position;
 layout(location=1) in vec4 color;
 layout(location=2) in vec2 texcoord;
-out vec4 _vs_out_color;
-out vec2 _vs_out_texcoord;
+layout(location=0) out vec4 _vs_out_color;
+layout(location=1) out vec2 _vs_out_texcoord;
 void main()
 {
        _vs_out_color = color;
@@ -44,10 +44,10 @@ void main()
 /* Expected output: fragment
 layout(constant_id=0) const bool use_texture = false;
 layout(constant_id=1) const bool use_vertex_color = false;
-uniform sampler2D tex;
+layout(location=4) uniform sampler2D tex;
 layout(location=0) out vec4 frag_color;
-in vec2 _vs_out_texcoord;
-in vec4 _vs_out_color;
+layout(location=1) in vec2 _vs_out_texcoord;
+layout(location=0) in vec4 _vs_out_color;
 void main()
 {
   frag_color = vec4(1.0);
index c0ef869972ed43aa5abeae6147392c10892c72d1..8d769e8b75e16a175743edbccadec493ba1b1a4c 100644 (file)
@@ -30,7 +30,7 @@ void main()
 
 /* Expected output: vertex
 layout(location=0) in vec4 position;
-out vec2 texcoord;
+layout(location=0) out vec2 texcoord;
 void main()
 {
        texcoord = position.xy*0.5+0.5;
@@ -41,8 +41,8 @@ void main()
 /* Expected output: geometry
 layout(triangles) in;
 layout(triangle_strip, max_vertices=3) out;
-in vec2 texcoord[];
-out vec2 _gs_out_texcoord;
+layout(location=0) in vec2 texcoord[];
+layout(location=0) out vec2 _gs_out_texcoord;
 void main()
 {
        gl_Position = gl_in[0].gl_Position;
@@ -58,9 +58,9 @@ void main()
 */
 
 /* Expected output: fragment
-uniform sampler2D tex;
+layout(location=0) uniform sampler2D tex;
 layout(location=0) out vec4 frag_color;
-in vec2 _gs_out_texcoord;
+layout(location=0) in vec2 _gs_out_texcoord;
 void main()
 {
        frag_color = texture(tex, _gs_out_texcoord);
index 7999ee735dd06c2388d21ece104b1d0c8b11ac1b..a09d3422dc5708af537def4fd73e12ade8b24fb5 100644 (file)
@@ -16,7 +16,7 @@ void main()
 }
 
 /* Expected output: vertex
-uniform mat4 mvp;
+layout(location=0) uniform mat4 mvp;
 layout(location=0) in vec4 position;
 void main()
 {
index 1dec429641b13b9abb172b7aec28c7ec36525eb3..24635017a43093d35e645fbed90a49fa69784aec 100644 (file)
@@ -33,13 +33,13 @@ void main()
 }
 
 /* Expected output: vertex
-uniform mat4 mvp;
-uniform vec3 offset;
+layout(location=0) uniform mat4 mvp;
+layout(location=4) uniform vec3 offset;
 layout(location=0) in vec4 position;
 layout(location=1) in vec3 normal;
 layout(location=2) in vec2 texcoord;
-out vec3 _vs_out_normal;
-out vec2 _vs_out_texcoord;
+layout(location=0) out vec3 _vs_out_normal;
+layout(location=1) out vec2 _vs_out_texcoord;
 void main()
 {
        gl_Position = mvp*(position+vec4(offset, 1.0));
@@ -56,12 +56,12 @@ struct LightParams
   float intensity;
   vec3 dir;
 };
-uniform LightParams light;
-uniform vec3 material_color;
-uniform sampler2D occlusion_map;
+layout(location=5) uniform LightParams light;
+layout(location=9) uniform vec3 material_color;
+layout(location=10) uniform sampler2D occlusion_map;
 layout(location=0) out vec4 frag_color;
-in vec2 _vs_out_texcoord;
-in vec3 _vs_out_normal;
+layout(location=1) in vec2 _vs_out_texcoord;
+layout(location=0) in vec3 _vs_out_normal;
 void main()
 {
        frag_color = vec4(material_color*(light.ambient+light.color*light.intensity*max(dot(light.dir, normalize(_vs_out_normal)), 0.0))*float(texture(occlusion_map, _vs_out_texcoord).x), 1.0);
index 4017e490a636249a852ea7e1ed3bccbbefa8a847..5b0482467aa6f3c33d077ed12bb8cf31dab83a1a 100644 (file)
@@ -17,7 +17,7 @@ void main()
 /* Expected output: vertex
 layout(location=0) in vec4 position;
 layout(location=1) in vec4 color;
-out vec4 _vs_out_color;
+layout(location=0) out vec4 _vs_out_color;
 void main()
 {
        gl_Position = position;
@@ -27,7 +27,7 @@ void main()
 
 /* Expected output: fragment
 layout(location=0) out vec4 frag_color;
-in vec4 _vs_out_color;
+layout(location=0) in vec4 _vs_out_color;
 void main()
 {
        frag_color = _vs_out_color;
index 52712d85056565e2fafdf2cf3fcc169e8d82bbf7..c5d1856a9396e9dacf27eb440e8fd07a4c42b3fe 100644 (file)
@@ -23,7 +23,7 @@ void main()
 /* Expected output: vertex
 layout(location=0) in vec4 position;
 layout(location=1) in vec4 color;
-out vec4 _vs_out_color;
+layout(location=0) out vec4 _vs_out_color;
 void main()
 {
        gl_Position = position;
@@ -33,7 +33,7 @@ void main()
 
 /* Expected output: fragment
 layout(location=0) out vec4 frag_color;
-in vec4 _vs_out_color;
+layout(location=0) in vec4 _vs_out_color;
 void main()
 {
        frag_color = _vs_out_color;
index aabff0892a2d4aa54b8286a026f8c969497fd18a..5b0e00d12ef959a25791d6503093ea71b72f3449 100644 (file)
@@ -22,13 +22,13 @@ void main()
 }
 
 /* Expected output: vertex
-uniform mat4 projection;
-out vec4 eye_vertex;
+layout(location=0) uniform mat4 projection;
+layout(location=0) out vec4 eye_vertex;
 out VertexOut
 {
   vec4 color;
 };
-out float alpha;
+layout(location=1) out float alpha;
 void main()
 {
   gl_Position = projection*eye_vertex;
@@ -42,7 +42,7 @@ in VertexOut
 {
   vec4 color;
 };
-in float alpha;
+layout(location=1) in float alpha;
 void main()
 {
   frag_color = vec4(color.rgb, alpha);
index b5666f2de1d37d290363d8e78932f68809790ddc..2b9eaad843fdd31874f4bc40538d1896bce5e421 100644 (file)
@@ -27,10 +27,10 @@ void main()
 // Specialize: use_texture true
 
 /* Expected output: vertex
-uniform mat4 mvp;
+layout(location=0) uniform mat4 mvp;
 layout(location=0) in vec4 position;
 layout(location=2) in vec2 texcoord;
-out vec2 _vs_out_texcoord;
+layout(location=0) out vec2 _vs_out_texcoord;
 void main()
 {
        _vs_out_texcoord = texcoord;
@@ -39,9 +39,9 @@ void main()
 */
 
 /* Expected output: fragment
-uniform sampler2D tex;
+layout(location=4) uniform sampler2D tex;
 layout(location=0) out vec4 frag_color;
-in vec2 _vs_out_texcoord;
+layout(location=0) in vec2 _vs_out_texcoord;
 void main()
 {
        frag_color = vec4(1.0);
index 1a1a09891e0997bb4ca4c44b0683db620fcbef0c..d3844af853626cd2b0ffb700e15923237fe3c4b1 100644 (file)
@@ -32,7 +32,7 @@ uniform Transform
 } transform;
 layout(location=0) in vec4 position;
 layout(location=1) in vec2 texcoord;
-out vec2 _vs_out_texcoord;
+layout(location=0) out vec2 _vs_out_texcoord;
 void main()
 {
   _vs_out_texcoord = texcoord;
@@ -46,9 +46,9 @@ uniform Colors
   vec4 color1;
   vec4 color2;
 };
-uniform sampler2D mask;
+layout(location=0) uniform sampler2D mask;
 layout(location=0) out vec4 frag_color;
-in vec2 _vs_out_texcoord;
+layout(location=0) in vec2 _vs_out_texcoord;
 void main()
 {
   frag_color = texture(mask, _vs_out_texcoord).r>0.5?color1:color2;
diff --git a/tests/glsl/uniform_location_allocation.glsl b/tests/glsl/uniform_location_allocation.glsl
new file mode 100644 (file)
index 0000000..f82a9b8
--- /dev/null
@@ -0,0 +1,43 @@
+#pragma MSP stage(vertex)
+uniform mat4 mvp;
+uniform sampler2D heightmap;
+layout(location=0) in vec2 position;
+layout(location=1) in vec2 texcoord;
+void main()
+{
+       gl_Position = mvp*vec4(position, texture(heightmap, texcoord).r, 1.0);
+       passthrough;
+}
+
+#pragma MSP stage(fragment)
+layout(location=0) uniform sampler2D heightmap;
+uniform vec4 color;
+out vec4 frag_color;
+void main()
+{
+       frag_color = color*vec4(texture(heightmap, texcoord).rrr, 1.0);
+}
+
+/* Expected output: vertex
+layout(location=1) uniform mat4 mvp;
+layout(location=0) uniform sampler2D heightmap;
+layout(location=0) in vec2 position;
+layout(location=1) in vec2 texcoord;
+layout(location=0) out vec2 _vs_out_texcoord;
+void main()
+{
+  gl_Position = mvp*vec4(position, texture(heightmap, texcoord).r, 1.0);
+  _vs_out_texcoord = texcoord;
+}
+*/
+
+/* Expected output: fragment
+layout(location=0) uniform sampler2D heightmap;
+layout(location=5) uniform vec4 color;
+layout(location=0) out vec4 frag_color;
+layout(location=0) in vec2 _vs_out_texcoord;
+void main()
+{
+  frag_color = color*vec4(texture(heightmap, _vs_out_texcoord).rrr, 1.0);
+}
+*/
index 801b82b735bc6cee597df1e7b065f87575c24052..335e631b8fa14cd2088493b3442b989b1ac94f10 100644 (file)
@@ -27,8 +27,8 @@ void main()
 }
 
 /* Expected output: vertex
-uniform mat4 mvp;
-uniform int mask_index;
+layout(location=0) uniform mat4 mvp;
+layout(location=4) uniform int mask_index;
 layout(location=0) in vec4 position;
 layout(location=1) in vec4 color;
 out VertexOut