コード例 #1
0
        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;");
            }
        }
コード例 #2
0
        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("}");
        }