4 using System.Collections.Generic;
5 using SiliconStudio.Shaders.Ast;
6 using SiliconStudio.Shaders.Visitor;
8 namespace SiliconStudio.Shaders.Convertor
15 private List<Variable> uniformReadList;
26 uniformReadList =
new List<Variable>();
27 this.UniformUsedWriteFirstList =
new List<Variable>();
28 this.UniformReadWriteList =
new List<Variable>();
34 public List<Variable> UniformUsedWriteFirstList {
get;
private set; }
39 public List<Variable> UniformReadWriteList {
get;
private set; }
43 return UniformUsedWriteFirstList.Contains(variable);
48 var variable = GetUniform(expression);
51 return IsVariableAsGlobalTemporary(variable);
56 return UniformReadWriteList.Contains(variable);
61 var variable = GetUniform(expression);
64 return IsUniformReadWrite(variable);
70 var variable = GetUniform(variableRef);
73 if (variable != null && !uniformReadList.Contains(variable))
75 uniformReadList.Add(variable);
82 while (expression != null)
86 expression = ((MemberReferenceExpression)expression).Target;
90 expression = ((IndexerExpression)expression).Target;
99 if (variableRef != null)
101 var variable = variableRef.TypeInference.Declaration as
Variable;
104 return (variable != null && shader.Declarations.Contains(variable) && !variable.Qualifiers.Contains(Ast.Hlsl.StorageQualifier.Static)
105 && !variable.Qualifiers.Contains(Ast.StorageQualifier.Const))
112 private int countReadBeforeInvoke;
117 countReadBeforeInvoke = uniformReadList.Count;
118 base.Visit(methodInvocationExpression);
126 for (
int i = 0; i < invoke.Arguments.Count; i++)
128 var arg = invoke.Arguments[i];
129 var variable = this.GetUniform(arg);
130 var parameter = method.Parameters[i];
131 if (variable != null && parameter.Qualifiers.Contains(Ast.Hlsl.ParameterQualifier.Out))
133 bool isUniformWasAlreadyUsedAsRead =
false;
134 for (
int j = 0; j < countReadBeforeInvoke; j++)
136 if (ReferenceEquals(uniformReadList[i], variable))
138 isUniformWasAlreadyUsedAsRead =
true;
145 if (!isUniformWasAlreadyUsedAsRead)
147 uniformReadList.Remove(variable);
148 if (!UniformUsedWriteFirstList.Contains(variable))
149 UniformUsedWriteFirstList.Add(variable);
154 this.VisitDynamic(method);
160 var variable = GetUniform(assignmentExpression.
Target);
161 bool isMemberExpression = assignmentExpression.Target is MemberReferenceExpression;
162 if (variable != null)
165 if (assignmentExpression.
Operator ==
AssignmentOperator.Default && !uniformReadList.Contains(variable) && !this.UniformUsedWriteFirstList.Contains(variable))
169 if (isMemberExpression)
171 var variableType = variable.Type.ResolveType();
177 var memberRef = assignmentExpression.Target as MemberReferenceExpression;
178 var numberOfMembers = memberRef.Member.Text.Length;
181 if (numberOfMembers < dim)
183 if (!uniformReadList.Contains(variable))
185 uniformReadList.Add(variable);
190 UniformUsedWriteFirstList.Add(variable);
196 UniformUsedWriteFirstList.Add(variable);
201 if (!UniformReadWriteList.Contains(variable))
202 UniformReadWriteList.Add(variable);
Base class for all vector types
Tag a visitable method with this attribute.
Expression Target
Gets or sets the target receving the assigment.
AssignmentOperator
Assignment operator used in assignment expression (a = b) or statements (a = b;)
A method definition with a body of statements.
A member reference in the form {this}.{Name}
Toplevel container of a shader parsing result.
A reference to a variable.
static int GetDimensionSize(TypeBase typeDeclaration, int dimension)
AssignmentOperator Operator
Gets or sets the operator.