From 4fb346536bfefd612635a248f558b1f1471deae6 Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Thu, 18 Mar 2021 15:16:10 +0200 Subject: [PATCH] Fix function inlining regressions --- source/glsl/optimize.cpp | 11 +++++--- ...nction_inline_parameter_name_conflict.glsl | 25 +++++++++++++++++++ tests/glsl/nested_function_inline.glsl | 25 +++++++++++++++++++ 3 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 tests/glsl/function_inline_parameter_name_conflict.glsl create mode 100644 tests/glsl/nested_function_inline.glsl diff --git a/source/glsl/optimize.cpp b/source/glsl/optimize.cpp index 6ac84b5b..7b3f8f28 100644 --- a/source/glsl/optimize.cpp +++ b/source/glsl/optimize.cpp @@ -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::iterator i=call.arguments.begin(); (!r_inlined_here && i!=call.arguments.end()); ++i) + visit(*i); + if(r_inlined_here) return; - for(NodeArray::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 index 00000000..fb124f87 --- /dev/null +++ b/tests/glsl/function_inline_parameter_name_conflict.glsl @@ -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 index 00000000..7999ee73 --- /dev/null +++ b/tests/glsl/nested_function_inline.glsl @@ -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; +} +*/ -- 2.43.0