private void WriteAst(HlslAst ast) { var compiler = new NodeCompiler(_registers); var rootGroups = ast.Roots.GroupBy(r => r.Key.RegisterKey); if (_registers.MethodOutputRegisters.Count == 1) { var rootGroup = rootGroups.Single(); var registerKey = rootGroup.Key; var roots = rootGroup.OrderBy(r => r.Key.ComponentIndex).Select(r => r.Value).ToList(); string statement = compiler.Compile(roots, 4); WriteLine($"return {statement};"); } else { foreach (var rootGroup in rootGroups) { var registerKey = rootGroup.Key; var roots = rootGroup.OrderBy(r => r.Key.ComponentIndex).Select(r => r.Value).ToList(); RegisterDeclaration outputRegister = _registers.MethodOutputRegisters[registerKey]; string statement = compiler.Compile(roots, roots.Count); WriteLine($"o.{outputRegister.Name} = {statement};"); } WriteLine(); WriteLine($"return o;"); } }
protected override void Write() { if (_shader.Type == ShaderType.Expression) { Write($"// Writing expression"); WriteExpression(_shader); return; } _registers = new RegisterState(_shader); WriteConstantDeclarations(); if (_shader.Preshader != null) { WriteExpression(_shader.Preshader.Shader); } if (_registers.MethodInputRegisters.Count > 1) { WriteInputStructureDeclaration(); } if (_registers.MethodOutputRegisters.Count > 1) { WriteOutputStructureDeclaration(); } string methodReturnType = GetMethodReturnType(); string methodParameters = GetMethodParameters(); string methodSemantic = GetMethodSemantic(); WriteLine("{0} {1}({2}){3}", methodReturnType, _entryPoint, methodParameters, methodSemantic); WriteLine("{"); Indent++; if (_registers.MethodOutputRegisters.Count > 1) { var outputStructType = _shader.Type == ShaderType.Pixel ? "PS_OUT" : "VS_OUT"; WriteIndent(); WriteLine($"{outputStructType} o;"); } else { var output = _registers.MethodOutputRegisters.First().Value; WriteIndent(); WriteLine("{0} {1};", methodReturnType, _registers.GetRegisterName(output.RegisterKey)); } WriteTemps(); HlslAst ast = null; if (_doAstAnalysis) { var parser = new BytecodeParser(); ast = parser.Parse(_shader); ast.ReduceTree(); WriteAst(ast); } else { WriteInstructionList(); if (_registers.MethodOutputRegisters.Count > 1) { WriteIndent(); WriteLine($"return o;"); } else { var output = _registers.MethodOutputRegisters.First().Value; WriteIndent(); WriteLine($"return {_registers.GetRegisterName(output.RegisterKey)};"); } } Indent--; WriteLine("}"); }