public static StructuredProgramInfo MakeStructuredProgram(BasicBlock[] blocks) { PhiFunctions.Remove(blocks); StructuredProgramContext context = new StructuredProgramContext(blocks.Length); for (int blkIndex = 0; blkIndex < blocks.Length; blkIndex++) { BasicBlock block = blocks[blkIndex]; context.EnterBlock(block); foreach (INode node in block.Operations) { Operation operation = (Operation)node; if (IsBranchInst(operation.Inst)) { context.LeaveBlock(block, operation); } else { AddOperation(context, operation); } } } GotoElimination.Eliminate(context.GetGotos()); AstOptimizer.Optimize(context.Info); return(context.Info); }
public static StructuredProgramInfo MakeStructuredProgram(Function[] functions, ShaderConfig config) { StructuredProgramContext context = new StructuredProgramContext(config); for (int funcIndex = 0; funcIndex < functions.Length; funcIndex++) { Function function = functions[funcIndex]; BasicBlock[] blocks = function.Blocks; VariableType returnType = function.ReturnsValue ? VariableType.S32 : VariableType.None; VariableType[] inArguments = new VariableType[function.InArgumentsCount]; VariableType[] outArguments = new VariableType[function.OutArgumentsCount]; for (int i = 0; i < inArguments.Length; i++) { inArguments[i] = VariableType.S32; } for (int i = 0; i < outArguments.Length; i++) { outArguments[i] = VariableType.S32; } context.EnterFunction(blocks.Length, function.Name, returnType, inArguments, outArguments); PhiFunctions.Remove(blocks); for (int blkIndex = 0; blkIndex < blocks.Length; blkIndex++) { BasicBlock block = blocks[blkIndex]; context.EnterBlock(block); for (LinkedListNode <INode> opNode = block.Operations.First; opNode != null; opNode = opNode.Next) { Operation operation = (Operation)opNode.Value; if (IsBranchInst(operation.Inst)) { context.LeaveBlock(block, operation); } else { AddOperation(context, operation); } } } GotoElimination.Eliminate(context.GetGotos()); AstOptimizer.Optimize(context); context.LeaveFunction(); } return(context.Info); }
public static StructuredProgramInfo MakeStructuredProgram(Function[] functions, ShaderConfig config) { StructuredProgramContext context = new StructuredProgramContext(config); for (int funcIndex = 0; funcIndex < functions.Length; funcIndex++) { Function function = functions[funcIndex]; BasicBlock[] blocks = function.Blocks; VariableType returnType = function.ReturnsValue ? VariableType.S32 : VariableType.None; VariableType[] inArguments = new VariableType[function.InArgumentsCount]; VariableType[] outArguments = new VariableType[function.OutArgumentsCount]; for (int i = 0; i < inArguments.Length; i++) { inArguments[i] = VariableType.S32; } for (int i = 0; i < outArguments.Length; i++) { outArguments[i] = VariableType.S32; } context.EnterFunction(blocks.Length, function.Name, returnType, inArguments, outArguments); PhiFunctions.Remove(blocks); for (int blkIndex = 0; blkIndex < blocks.Length; blkIndex++) { BasicBlock block = blocks[blkIndex]; context.EnterBlock(block); for (LinkedListNode <INode> opNode = block.Operations.First; opNode != null; opNode = opNode.Next) { Operation operation = (Operation)opNode.Value; if (IsBranchInst(operation.Inst)) { context.LeaveBlock(block, operation); } else { AddOperation(context, operation); } } } GotoElimination.Eliminate(context.GetGotos()); AstOptimizer.Optimize(context); context.LeaveFunction(); } if (config.TransformFeedbackEnabled && config.LastInVertexPipeline) { for (int tfbIndex = 0; tfbIndex < 4; tfbIndex++) { var locations = config.GpuAccessor.QueryTransformFeedbackVaryingLocations(tfbIndex); var stride = config.GpuAccessor.QueryTransformFeedbackStride(tfbIndex); for (int j = 0; j < locations.Length; j++) { byte location = locations[j]; if (location < 0xc0) { context.Info.TransformFeedbackOutputs[location] = new TransformFeedbackOutput(tfbIndex, j * 4, stride); } } } } return(context.Info); }