private static ShaderProgram Translate(Operation[] ops, ShaderConfig config, int size) { BasicBlock[] blocks = ControlFlowGraph.MakeCfg(ops); if (blocks.Length > 0) { Dominance.FindDominators(blocks[0], blocks.Length); Dominance.FindDominanceFrontiers(blocks); Ssa.Rename(blocks); Optimizer.RunPass(blocks, config); Lowering.RunPass(blocks, config); } StructuredProgramInfo sInfo = StructuredProgram.MakeStructuredProgram(blocks, config); GlslProgram program = GlslGenerator.Generate(sInfo, config); ShaderProgramInfo spInfo = new ShaderProgramInfo( program.CBufferDescriptors, program.SBufferDescriptors, program.TextureDescriptors, program.ImageDescriptors, sInfo.UsesInstanceId); string glslCode = program.Code; return(new ShaderProgram(spInfo, config.Stage, glslCode, size)); }
private static ShaderProgram Translate(FunctionCode[] functions, ShaderConfig config, int sizeA = 0) { var cfgs = new ControlFlowGraph[functions.Length]; var frus = new RegisterUsage.FunctionRegisterUsage[functions.Length]; for (int i = 0; i < functions.Length; i++) { cfgs[i] = ControlFlowGraph.Create(functions[i].Code); if (i != 0) { frus[i] = RegisterUsage.RunPass(cfgs[i]); } } Function[] funcs = new Function[functions.Length]; for (int i = 0; i < functions.Length; i++) { var cfg = cfgs[i]; int inArgumentsCount = 0; int outArgumentsCount = 0; if (i != 0) { var fru = frus[i]; inArgumentsCount = fru.InArguments.Length; outArgumentsCount = fru.OutArguments.Length; } if (cfg.Blocks.Length != 0) { RegisterUsage.FixupCalls(cfg.Blocks, frus); Dominance.FindDominators(cfg); Dominance.FindDominanceFrontiers(cfg.Blocks); Ssa.Rename(cfg.Blocks); Optimizer.RunPass(cfg.Blocks, config); Lowering.RunPass(cfg.Blocks, config); } funcs[i] = new Function(cfg.Blocks, $"fun{i}", false, inArgumentsCount, outArgumentsCount); } StructuredProgramInfo sInfo = StructuredProgram.MakeStructuredProgram(funcs, config); GlslProgram program = GlslGenerator.Generate(sInfo, config); ShaderProgramInfo spInfo = new ShaderProgramInfo( program.CBufferDescriptors, program.SBufferDescriptors, program.TextureDescriptors, program.ImageDescriptors, sInfo.UsesInstanceId); string glslCode = program.Code; return(new ShaderProgram(spInfo, config.Stage, glslCode, config.Size, sizeA)); }