Exemple #1
0
        private void GenInst1u(ShaderProgram Program, uint InstOp)
        {
            ShaderOpCode OpCode = (ShaderOpCode)(InstOp >> 26);

            ShaderInst1 Inst = new ShaderInst1(InstOp);

            string Dest = GetDstReg(Program, Inst.Dest);
            string Src1 = GetSrcReg(Program, Inst.Src1, Inst.Idx1);

            SHBin.GetSwizzles(
                Inst.Desc,
                out string SDst,
                out string[] SSrc,
                out string[] SSrcM);

            string[] Signs = SHBin.GetSrcSigns(Inst.Desc);

            Src1 = Signs[0] + Src1;

            switch (OpCode)
            {
            case ShaderOpCode.Ex2:
                Append($"{Dest}.{SDst} = exp2({Src1}.{SSrcM[0]});");
                break;

            case ShaderOpCode.Lg2:
                Append($"{Dest}.{SDst} = log2({Src1}.{SSrcM[0]});");
                break;

            case ShaderOpCode.LitP:
                GenLitP(Src1, Dest);
                break;

            case ShaderOpCode.Flr:
                Append($"{Dest}.{SDst} = floor({Src1}.{SSrcM[0]});");
                break;

            case ShaderOpCode.Rcp:
                Append($"{Dest}.{SDst} = {GetVecCtor("1", SDst.Length)} / {Src1}.{SSrcM[0]};");
                break;

            case ShaderOpCode.RSq:
                Append($"{Dest}.{SDst} = inversesqrt({Src1}.{SSrcM[0]});");
                break;

            case ShaderOpCode.MovA:
                GenMovA(Src1, SSrcM[0], SDst);
                break;

            case ShaderOpCode.Mov:
                Append($"{Dest}.{SDst} = {Src1}.{SSrcM[0]};");
                break;
            }
        }
Exemple #2
0
        private void GenInst1(ShaderProgram Program, uint InstOp)
        {
            ShaderOpCode OpCode = (ShaderOpCode)(InstOp >> 26);

            ShaderInst1 Inst = new ShaderInst1(InstOp);

            string Dest = GetDstReg(Program, Inst.Dest);
            string Src1 = GetSrcReg(Program, Inst.Src1, Inst.Idx1);
            string Src2 = GetSrcReg(Program, Inst.Src2);

            SHBin.GetSwizzles(
                Inst.Desc,
                out string SDst,
                out string[] SSrc,
                out string[] SSrcM);

            string[] Signs = SHBin.GetSrcSigns(Inst.Desc);

            Src1 = Signs[0] + Src1;
            Src2 = Signs[1] + Src2;

            switch (OpCode)
            {
            case ShaderOpCode.Add:
                Append($"{Dest}.{SDst} = {Src1}.{SSrcM[0]} + {Src2}.{SSrcM[1]};");
                break;

            case ShaderOpCode.DP3:
                GenDP3(Src1, Src2, SSrc[0], SSrc[1], Dest, SDst);
                break;

            case ShaderOpCode.DP4:
                Append($"{Dest}.{SDst} = {GetVecCtor($"dot({Src1}.{SSrc[0]}, {Src2}.{SSrc[1]})", SDst.Length)};");
                break;

            case ShaderOpCode.DPH:
                GenDPH(Src1, Src2, SSrc[0], SSrc[1], Dest, SDst);
                break;

            case ShaderOpCode.Dst:
                Append($"{Dest} = vec4(1, {Src1}.y * {Src1}.y, {Src1}.z, {Src2}.w);");
                break;

            case ShaderOpCode.Mul:
                Append($"{Dest}.{SDst} = {Src1}.{SSrcM[0]} * {Src2}.{SSrcM[1]};");
                break;

            case ShaderOpCode.SGE:
                GenSGE(Src1, Src1, SSrcM[0], SSrcM[1], Dest, SDst);
                break;

            case ShaderOpCode.SLT:
                GenSLT(Src1, Src1, SSrcM[0], SSrcM[1], Dest, SDst);
                break;

            case ShaderOpCode.Max:
                Append($"{Dest}.{SDst} = max({Src1}.{SSrcM[0]}, {Src2}.{SSrcM[1]});");
                break;

            case ShaderOpCode.Min:
                Append($"{Dest}.{SDst} = min({Src1}.{SSrcM[0]}, {Src2}.{SSrcM[1]});");
                break;
            }
        }