private void GenInst3(ShaderProgram Program, uint InstOp) { ShaderOpCode OpCode = (ShaderOpCode)(InstOp >> 26); ShaderInst3 Inst = new ShaderInst3(InstOp); switch (OpCode) { case ShaderOpCode.IfU: GenIfU(Program, Inst); break; case ShaderOpCode.CallU: GenCallU(Program, Inst); break; case ShaderOpCode.Loop: GenLoop(Program, Inst); break; case ShaderOpCode.JmpU: GenJmpU(Program, Inst); break; } }
private void GenLoop(ShaderProgram Program, ShaderInst3 Inst) { ShaderUniformVec4 Uniform = Program.IVec4Uniforms[Inst.RegId & 3]; string IUName = IVec4UniformNames[Inst.RegId & 3]; string ALStart; string ALCond; string ALInc; if (Uniform.IsConstant) { ALStart = $"{ALRegName} = {(byte)Uniform.Constant.Y}"; ALCond = $"{ALRegName} <= {(byte)Uniform.Constant.X}"; ALInc = $"{ALRegName} += {(byte)Uniform.Constant.Z}"; } else { ALStart = $"{ALRegName} = {IUName}.y"; ALCond = $"{ALRegName} <= {IUName}.x"; ALInc = $"{ALRegName} += {IUName}.z"; } Append($"for ({ALStart}; {ALCond}; {ALInc}) {{"); string OldIdent = Ident; Ident += "\t"; while (IP + 1 <= Inst.Dest) { GenInst(Program, SHBin.Executable[++IP]); } Ident = OldIdent; Append("}"); }
private void GenJmpU(ShaderProgram Program, ShaderInst3 Inst) { GenJmp(Program, GetBoolCond(Program, Inst.RegId, (Inst.Count & 1) == 0), Inst.Dest); }
private void GenIfU(ShaderProgram Program, ShaderInst3 Inst) { GenIf(Program, GetBoolCond(Program, Inst.RegId), Inst.Dest, Inst.Count); }
private void GenCallU(ShaderProgram Program, ShaderInst3 Inst) { Append($"if ({GetBoolCond(Program, Inst.RegId)}) {GetCall(Program, Inst.Dest, Inst.Count)}"); }