]> git.tdb.fi Git - libs/gl.git/commitdiff
Fix function inlining regressions
authorMikko Rasa <tdb@tdb.fi>
Thu, 18 Mar 2021 13:16:10 +0000 (15:16 +0200)
committerMikko Rasa <tdb@tdb.fi>
Thu, 18 Mar 2021 13:19:18 +0000 (15:19 +0200)
source/glsl/optimize.cpp
tests/glsl/function_inline_parameter_name_conflict.glsl [new file with mode: 0644]
tests/glsl/nested_function_inline.glsl [new file with mode: 0644]

index 6ac84b5b0247be7c48ffe3339ba288c1d047ab3c..7b3f8f28c8ad00007b520446ed5c2cc1180c49d0 100644 (file)
@@ -186,8 +186,11 @@ void InlineContentInjector::visit(VariableDeclaration &var)
 
        if(pass==RENAME)
        {
+               /* Check against conflicts with the other context as well as variables
+               already renamed here. */
+               bool conflict = (staging_block.variables.count(var.name) || referenced_names.count(var.name));
                staging_block.variables[var.name] = &var;
-               if(referenced_names.count(var.name))
+               if(conflict)
                {
                        string mapped_name = get_unused_variable_name(staging_block, var.name);
                        if(mapped_name!=var.name)
@@ -265,12 +268,12 @@ void FunctionInliner::visit(Block &block)
 
 void FunctionInliner::visit(FunctionCall &call)
 {
+       for(NodeArray<Expression>::iterator i=call.arguments.begin(); (!r_inlined_here && i!=call.arguments.end()); ++i)
+               visit(*i);
+
        if(r_inlined_here)
                return;
 
-       for(NodeArray<Expression>::iterator i=call.arguments.begin(); i!=call.arguments.end(); ++i)
-               visit(*i);
-
        FunctionDeclaration *def = call.declaration;
        if(def)
                def = def->definition;
diff --git a/tests/glsl/function_inline_parameter_name_conflict.glsl b/tests/glsl/function_inline_parameter_name_conflict.glsl
new file mode 100644 (file)
index 0000000..fb124f8
--- /dev/null
@@ -0,0 +1,25 @@
+uniform mat4 mvp;
+
+#pragma MSP stage(vertex)
+layout(location=0) in vec4 position;
+layout(location=1) in vec4 offset;
+vec4 transform_position(vec4 pos)
+{
+       vec4 pos_1 = offset;
+       return mvp*(pos+pos_1);
+}
+void main()
+{
+       vec4 pos = vec4(0.0);
+       gl_Position = transform_position(pos+position);
+}
+
+/* Expected output: vertex
+uniform mat4 mvp;
+layout(location=0) in vec4 position;
+layout(location=1) in vec4 offset;
+void main()
+{
+       gl_Position = mvp*(vec4(0.0)+position+offset);
+}
+*/
diff --git a/tests/glsl/nested_function_inline.glsl b/tests/glsl/nested_function_inline.glsl
new file mode 100644 (file)
index 0000000..7999ee7
--- /dev/null
@@ -0,0 +1,25 @@
+uniform mat4 mvp;
+
+#pragma MSP stage(vertex)
+layout(location=0) in vec4 position;
+vec4 get_position()
+{
+       return position;
+}
+vec4 transform_position(vec4 pos)
+{
+       return mvp*pos;
+}
+void main()
+{
+       gl_Position = transform_position(get_position());
+}
+
+/* Expected output: vertex
+uniform mat4 mvp;
+layout(location=0) in vec4 position;
+void main()
+{
+       gl_Position = mvp*position;
+}
+*/