/// <summary> /// Check that methods with streams are not called across several stages. /// </summary> /// <param name="shaderStage">The current shader stage to check.</param> /// <param name="methodsWithStreams">The list of methods that need streams in that stage.</param> private void CheckCrossStageMethodCall(XkShaderStage shaderStage, List<MethodDeclaration> methodsWithStreams) { foreach (var stageList in methodsPerShaderStage) { var stage = stageList.Key; if (stage != shaderStage) // should always be true { foreach (var method in methodsWithStreams) { if (stageList.Value.Contains(method)) { errorWarningLog.Error(XenkoMessageCode.ErrorCrossStageMethodCall, method.Span, method, stage, shaderStage); } } } } methodsPerShaderStage.Add(shaderStage, methodsWithStreams); }
/// <summary> /// Get the streams usage for this entrypoint /// </summary> /// <param name="moduleMixin">the current module mixin</param> /// <param name="entryPoint">the entrypoint method</param> /// <returns>a StreamStageUsage containing the streams usages</returns> private StreamStageUsage StreamAnalysisPerShader(ModuleMixin moduleMixin, MethodDeclaration entryPoint, XkShaderStage shaderStage) { var visitedMethods = new List<MethodDeclaration>(); var streamStageUsage = new StreamStageUsage { ShaderStage = shaderStage }; FindStreamsUsage(entryPoint, streamStageUsage.InStreamList, streamStageUsage.OutStreamList, visitedMethods); visitedMethods.Clear(); return streamStageUsage; }