MSL: Fix regression with Private parameter declaration.

If we compile multiple times due to forced_recompile, we had
deferred_declaration = true while emitting function prototypes which
broke an assumption. Fix this by clearing out stale state before leaving
a function.
This commit is contained in:
Hans-Kristian Arntzen 2019-06-13 10:31:37 +02:00
parent 95053ea4bc
commit d81bfc5b58
4 changed files with 84 additions and 0 deletions

View File

@ -0,0 +1,17 @@
#include <metal_stdlib>
#include <simd/simd.h>
using namespace metal;
struct main0_out
{
float3 FragColor [[color(0)]];
};
fragment main0_out main0()
{
main0_out out = {};
out.FragColor = float3(1.0);
return out;
}

View File

@ -0,0 +1,39 @@
#pragma clang diagnostic ignored "-Wmissing-prototypes"
#include <metal_stdlib>
#include <simd/simd.h>
using namespace metal;
struct AStruct
{
float4 foobar;
};
struct main0_out
{
float3 FragColor [[color(0)]];
};
void someFunction(thread AStruct& s)
{
s.foobar = float4(1.0);
}
void otherFunction(thread float3& global_variable)
{
global_variable = float3(1.0);
}
fragment main0_out main0()
{
main0_out out = {};
AStruct param;
someFunction(param);
AStruct inputs = param;
float3 global_variable;
otherFunction(global_variable);
out.FragColor = global_variable;
return out;
}

View File

@ -0,0 +1,20 @@
#version 450
struct AStruct { vec4 foobar; };
void someFunction(out AStruct s) { s.foobar = vec4(1.0); }
highp vec3 global_variable;
void otherFunction() {
global_variable = vec3(1.0);
}
layout(location = 0) out vec3 FragColor;
void main() {
AStruct inputs;
someFunction(inputs);
otherFunction();
FragColor = global_variable;
}

View File

@ -10660,6 +10660,14 @@ void CompilerGLSL::emit_function(SPIRFunction &func, const Bitset &return_flags)
end_scope(); end_scope();
processing_entry_point = false; processing_entry_point = false;
statement(""); statement("");
// Make sure deferred declaration state for local variables is cleared when we are done with function.
// We risk declaring Private/Workgroup variables in places we are not supposed to otherwise.
for (auto &v : func.local_variables)
{
auto &var = get<SPIRVariable>(v);
var.deferred_declaration = false;
}
} }
void CompilerGLSL::emit_fixup() void CompilerGLSL::emit_fixup()