Beispiel #1
0
        //Refer https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx9-graphics-reference-asm-vs-instructions-vs-3-0
        //Refer https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx9-graphics-reference-asm-ps-instructions-ps-3-0
        public static int GetInstructionSlotCount(this InstructionToken token)
        {
            switch (token.Opcode)
            {
            case Opcode.Dcl:
            case Opcode.Def:
            case Opcode.DefB:
            case Opcode.DefI:
            case Opcode.Label:
            case Opcode.Comment:
            case Opcode.End:
                return(0);

            case Opcode.Abs:
            case Opcode.Add:
            case Opcode.Break:
            case Opcode.Dp3:
            case Opcode.Dp4:
            case Opcode.Dst:
            case Opcode.Else:
            case Opcode.Endif:
            case Opcode.Exp:
            case Opcode.Frc:
            case Opcode.Log:
            case Opcode.LogP:
            case Opcode.Mad:
            case Opcode.Max:
            case Opcode.Min:
            case Opcode.Mov:
            case Opcode.MovA:
            case Opcode.Mul:
            case Opcode.Nop:
            case Opcode.Rcp:
            case Opcode.Ret:
            case Opcode.Rsq:
            case Opcode.SetP:
            case Opcode.Sge:
            case Opcode.Slt:
            case Opcode.Sub:
            case Opcode.Cmp:
                return(1);

            case Opcode.Lrp:
                return(1);

            case Opcode.Call:
            case Opcode.Crs:
            case Opcode.EndLoop:
            case Opcode.EndRep:
            case Opcode.M3x2:
            case Opcode.DP2Add:
            case Opcode.DSX:
            case Opcode.DSY:
            case Opcode.TexKill:
                return(2);

            case Opcode.CallNZ:
            case Opcode.BreakC:
            case Opcode.Breakp:
            case Opcode.If:
            case Opcode.IfC:
            case Opcode.Lit:
            case Opcode.Loop:
            case Opcode.M3x3:
            case Opcode.M4x3:
            case Opcode.Nrm:
            case Opcode.Pow:
            case Opcode.Rep:
            case Opcode.Sgn:
            case Opcode.TexLDD:
                return(3);

            case Opcode.M3x4:
            case Opcode.M4x4:
                return(4);

            //TODO: can't find opcode
            //case Opcode.TexLdb:
            //	return 6
            case Opcode.SinCos:
                return(8);

            case Opcode.TexLDL:
            {
                var textureType = token.GetDeclSamplerTextureType();
                if (textureType == SamplerTextureType.Cube)
                {
                    return(5);
                }
                else
                {
                    return(2);
                }
            }

            //TexLD
            case Opcode.Tex:
            {
                var textureType = token.GetDeclSamplerTextureType();
                if (textureType == SamplerTextureType.Cube)
                {
                    return(4);
                }
                else
                {
                    return(1);
                }
            }

            //Guessing
            case Opcode.ExpP:
                return(1);

            default:
                throw new NotImplementedException($"Instruction not implemented {token.Opcode}");
            }
        }