]> git.tdb.fi Git - libs/gl.git/commitdiff
Don't add both location and binding to the same uniform
authorMikko Rasa <tdb@tdb.fi>
Thu, 28 Dec 2023 19:08:39 +0000 (21:08 +0200)
committerMikko Rasa <tdb@tdb.fi>
Fri, 29 Dec 2023 07:32:39 +0000 (09:32 +0200)
It's unclear from the GLSL spec if this is allowed or not, but Intel
driver refuses to compile such shaders and it causes weird behaviour
on AMD too.

source/glsl/finalize.cpp
tests/glsl/arithmetic_assignment.glsl
tests/glsl/constructors.glsl
tests/glsl/function_overloading.glsl
tests/glsl/parentheses.glsl
tests/glsl/uniform_location_allocation.glsl

index e26b7b26a849456d7734fe7105f54787d4ab8c13..afe0f7fa8b41227117cb6c73884d8330f5663d45 100644 (file)
@@ -214,8 +214,11 @@ void LocationAllocator::visit(VariableDeclaration &var)
        if(!var.name.compare(0, 3, "gl_"))
                return;
 
+       bool has_location = false;
+       bool needs_location = false;
        if(!var.interface.empty() && !var.block_declaration)
        {
+               needs_location = true;
                int location = get_layout_value(var.layout.get(), "location");
 
                if(location<0 && var.linked_declaration && var.linked_declaration->layout)
@@ -227,31 +230,43 @@ void LocationAllocator::visit(VariableDeclaration &var)
 
                if(location>=0)
                {
+                       has_location = true;
                        unsigned size = LocationCounter().apply(var);
                        for(unsigned i=0; i<size; ++i)
                                used_locations[var.interface].insert(location+i);
                        if(var.interface=="uniform")
                                uniforms[var.name].location = location;
                }
-               else
-                       unplaced_variables.push_back(&var);
        }
 
+       bool has_binding = false;
+       bool needs_binding = false;
+       bool is_texture = false;
        if(var.interface=="uniform" || var.interface=="buffer")
        {
                if(var.block_declaration)
                {
-                       bool push_constant = has_layout_qualifier(var.layout.get(), "push_constant");
-                       if(!push_constant && !visit_uniform(var.block_declaration->block_name, var.layout))
-                               unbound_blocks.push_back(&var);
+                       if(!has_layout_qualifier(var.layout.get(), "push_constant"))
+                       {
+                               needs_binding = true;
+                               has_binding = visit_uniform(var.block_declaration->block_name, var.layout);
+                       }
                }
-               else
+               else if(dynamic_cast<const ImageTypeDeclaration *>(get_ultimate_base_type(var.type_declaration)))
                {
-                       const TypeDeclaration *base_type = get_ultimate_base_type(var.type_declaration);
-                       if(dynamic_cast<const ImageTypeDeclaration *>(base_type) && !visit_uniform(var.name, var.layout))
-                               unbound_textures.push_back(&var);
+                       needs_binding = true;
+                       is_texture = true;
+                       has_binding = visit_uniform(var.name, var.layout);
                }
        }
+
+       if(needs_binding && !has_location)
+       {
+               if(!has_binding)
+                       (is_texture ? unbound_textures : unbound_blocks).push_back(&var);
+       }
+       else if(needs_location && !has_location)
+               unplaced_variables.push_back(&var);
 }
 
 
index d0898fbeb61c2b8c3f3eecbd2f199e0102c28648..1f7bfcf57aedf76c5d23d96d2bbfc0fe24fa82a8 100644 (file)
@@ -44,9 +44,9 @@ void main()
 */
 
 /* Expected output: fragment
-layout(location=4, binding=71) uniform sampler2D tex;
-layout(location=5) uniform vec3 tint;
-layout(location=6) uniform vec3 ambient;
+layout(binding=71) uniform sampler2D tex;
+layout(location=4) uniform vec3 tint;
+layout(location=5) uniform vec3 ambient;
 layout(location=0) out vec4 frag_color;
 layout(location=1) in vec2 _vs_out_texcoord;
 layout(location=0) in float light;
index 151ee5ef6f26bd088020c74cb4142bbd579db72d..2977c4a2db75eb61f887786954f34e4b694feb52 100644 (file)
@@ -50,7 +50,7 @@ void main()
 */
 
 /* Expected output: fragment
-layout(location=9, binding=25) uniform sampler2D normalmap;
+layout(binding=25) uniform sampler2D normalmap;
 layout(location=0) out vec4 frag_color;
 layout(location=1) in vec2 _vs_out_texcoord;
 layout(location=0) in vec3 tbn_light_dir;
index 411776b648392921dc486c425bb56358925ebe77..3ffa8cc980c0542c848c70ad5e37107aedd52c70 100644 (file)
@@ -45,7 +45,7 @@ void main()
 */
 
 /* Expected output: fragment
-layout(location=4, binding=71) uniform sampler2D tex;
+layout(binding=71) uniform sampler2D tex;
 layout(location=0) out vec4 frag_color;
 layout(location=0) in vec2 _vs_out_texcoord;
 void main()
index 7eb6512b2ae5f125711b493f2d1604c7b70fffc3..ebf217127cd859265fe63ba4cf22c65dc1ad5b00 100644 (file)
@@ -61,7 +61,7 @@ struct LightParams
 };
 layout(location=5) uniform LightParams light;
 layout(location=9) uniform vec3 material_color;
-layout(location=10, binding=83) uniform sampler2D occlusion_map;
+layout(binding=83) uniform sampler2D occlusion_map;
 layout(location=0) out vec4 frag_color;
 layout(location=1) in vec2 _vs_out_texcoord;
 layout(location=0) in vec3 _vs_out_normal;
index 65321047b7748ffa0d86f39d2233bf7caaa88340..8323144d3aec1f2c82d3cb1f53fea73451671eee 100644 (file)
@@ -1,46 +1,60 @@
 #pragma MSP stage(vertex)
-uniform mat4 mvp;
-uniform sampler2D heightmap;
-layout(location=0) in vec2 position;
-layout(location=1) in vec2 texcoord;
+uniform mat4 model;
+uniform mat4 viewproj;
+uniform vec4 light_pos;
+layout(location=0) in vec3 position;
+layout(location=1) in vec3 normal;
 void main()
 {
-       gl_Position = mvp*vec4(position, texture(heightmap, texcoord).r, 1.0);
-       passthrough;
+       vec4 world_pos = model*vec4(position, 1.0);
+       out vec3 world_normal = mat3(model)*normal;
+       out vec3 light_dir = light_pos.xyz-world_pos.xyz*light_pos.w;
+       gl_Position = viewproj*world_pos;
 }
 
 #pragma MSP stage(fragment)
-layout(location=0) uniform sampler2D heightmap;
+layout(location=2) uniform vec4 light_pos;
 uniform vec4 color;
 out vec4 frag_color;
 void main()
 {
-       frag_color = color*vec4(texture(heightmap, texcoord).rrr, 1.0);
+       float intensity = max(dot(normalize(light_dir), normalize(world_normal)), 0.0);
+       if(light_pos.w>0)
+               intensity *= 1.0/(0.1+length(light_dir));
+       frag_color = color*vec4(vec3(intensity), 1.0);
 }
 
 // Target API: OpenGL
 
 /* Expected output: vertex
-layout(location=1) uniform mat4 mvp;
-layout(location=0, binding=16) uniform sampler2D heightmap;
-layout(location=0) in vec2 position;
-layout(location=1) in vec2 texcoord;
-layout(location=0) out vec2 _vs_out_texcoord;
+layout(location=3) uniform mat4 model;
+layout(location=7) uniform mat4 viewproj;
+layout(location=2) uniform vec4 light_pos;
+layout(location=0) in vec3 position;
+layout(location=1) in vec3 normal;
+layout(location=0) out vec3 world_normal;
+layout(location=1) out vec3 light_dir;
 void main()
 {
-  gl_Position = mvp*vec4(position, texture(heightmap, texcoord).r, 1.0);
-  _vs_out_texcoord = texcoord;
+  vec4 world_pos = model*vec4(position, 1.0);
+  world_normal = mat3(model[0].xyz, model[1].xyz, model[2].xyz)*normal;
+  light_dir = light_pos.xyz-world_pos.xyz*light_pos.w;
+  gl_Position = viewproj*world_pos;
   gl_Position.z = gl_Position.z*2.0-gl_Position.w;
 }
 */
 
 /* Expected output: fragment
-layout(location=0, binding=16) uniform sampler2D heightmap;
-layout(location=5) uniform vec4 color;
+layout(location=2) uniform vec4 light_pos;
+layout(location=11) uniform vec4 color;
 layout(location=0) out vec4 frag_color;
-layout(location=0) in vec2 _vs_out_texcoord;
+layout(location=1) in vec3 light_dir;
+layout(location=0) in vec3 world_normal;
 void main()
 {
-  frag_color = color*vec4(texture(heightmap, _vs_out_texcoord).rrr, 1.0);
+  float intensity = max(dot(normalize(light_dir), normalize(world_normal)), 0.0);
+  if(light_pos.w>0.0)
+    intensity *= 1.0/(0.1+length(light_dir));
+  frag_color = color*vec4(vec3(intensity), 1.0);
 }
 */