protected override void ProcessMethodInvocation(MethodInvocationExpression invoke, MethodDefinition method) { // Handle the case where a parameter can be out // If this is the case, we need to check that for (int i = 0; i < invoke.Arguments.Count; i++) { var arg = invoke.Arguments[i]; var variable = this.GetUniform(arg); var parameter = method.Parameters[i]; if (variable != null && parameter.Qualifiers.Contains(ParameterQualifier.Out)) { bool isUniformWasAlreadyUsedAsRead = false; for (int j = 0; j < countReadBeforeInvoke; j++) { if (ReferenceEquals(uniformReadList[i], variable)) { isUniformWasAlreadyUsedAsRead = true; break; } } // If this is a out parameter, and the variable was not already used as a read, then // we can remove it from the uniform read list if (!isUniformWasAlreadyUsedAsRead) { uniformReadList.Remove(variable); if (!UniformUsedWriteFirstList.Contains(variable)) { UniformUsedWriteFirstList.Add(variable); } } } } this.VisitDynamic(method); }
public bool IsVariableAsGlobalTemporary(Variable variable) { return(UniformUsedWriteFirstList.Contains(variable)); }