Example #1
0
        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;
            }
        }
Example #2
0
        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("}");
        }
Example #3
0
 private void GenJmpU(ShaderProgram Program, ShaderInst3 Inst)
 {
     GenJmp(Program, GetBoolCond(Program, Inst.RegId, (Inst.Count & 1) == 0), Inst.Dest);
 }
Example #4
0
 private void GenIfU(ShaderProgram Program, ShaderInst3 Inst)
 {
     GenIf(Program, GetBoolCond(Program, Inst.RegId), Inst.Dest, Inst.Count);
 }
Example #5
0
 private void GenCallU(ShaderProgram Program, ShaderInst3 Inst)
 {
     Append($"if ({GetBoolCond(Program, Inst.RegId)}) {GetCall(Program, Inst.Dest, Inst.Count)}");
 }