| 1 | #ifndef _RC10_GENERAL_H |
|---|
| 2 | #define _RC10_GENERAL_H |
|---|
| 3 | |
|---|
| 4 | #include "rc1.0_register.h" |
|---|
| 5 | #include "nvparse_errors.h" |
|---|
| 6 | #include "nvparse_externs.h" |
|---|
| 7 | |
|---|
| 8 | enum { |
|---|
| 9 | RCP_MUL = 0, |
|---|
| 10 | RCP_DOT, |
|---|
| 11 | RCP_MUX, |
|---|
| 12 | RCP_SUM |
|---|
| 13 | }; |
|---|
| 14 | |
|---|
| 15 | class ConstColorStruct { |
|---|
| 16 | public: |
|---|
| 17 | void Init(RegisterEnum _reg, float _v0, float _v1, float _v2, float _v3) |
|---|
| 18 | { reg = _reg; v[0] = _v0; v[1] = _v1; v[2] = _v2; v[3] = _v3; } |
|---|
| 19 | RegisterEnum reg; |
|---|
| 20 | float v[4]; |
|---|
| 21 | }; |
|---|
| 22 | |
|---|
| 23 | class OpStruct { |
|---|
| 24 | public: |
|---|
| 25 | void Init(int _op, RegisterEnum _reg0, MappedRegisterStruct _reg1, MappedRegisterStruct _reg2) |
|---|
| 26 | { op = _op; reg[0].reg = _reg0; reg[1] = _reg1; reg[2] = _reg2; } |
|---|
| 27 | void Init(int _op, RegisterEnum _reg0) |
|---|
| 28 | { op = _op; reg[0].reg = _reg0; } |
|---|
| 29 | int op; |
|---|
| 30 | MappedRegisterStruct reg[3]; |
|---|
| 31 | void Validate(int stage, int portion); |
|---|
| 32 | }; |
|---|
| 33 | |
|---|
| 34 | class GeneralFunctionStruct { |
|---|
| 35 | public: |
|---|
| 36 | void Init(OpStruct _op0, OpStruct _op1, OpStruct _op2) { op[0] = _op0; op[1] = _op1; op[2] = _op2; numOps = 3; } |
|---|
| 37 | void Init(OpStruct _op0, OpStruct _op1) { op[0] = _op0; op[1] = _op1; numOps = 2; } |
|---|
| 38 | void Init(OpStruct _op0) { op[0] = _op0; numOps = 1; } |
|---|
| 39 | void Validate(int stage, int portion); |
|---|
| 40 | void Invoke(int stage, int portion, BiasScaleEnum bs); |
|---|
| 41 | void ZeroOut(); |
|---|
| 42 | int numOps; |
|---|
| 43 | OpStruct op[3]; |
|---|
| 44 | }; |
|---|
| 45 | |
|---|
| 46 | |
|---|
| 47 | class GeneralPortionStruct { |
|---|
| 48 | public: |
|---|
| 49 | void Init(int _designator, GeneralFunctionStruct _gf, BiasScaleEnum _bs) |
|---|
| 50 | { designator = _designator; gf = _gf; bs = _bs; } |
|---|
| 51 | |
|---|
| 52 | void Validate(int stage); |
|---|
| 53 | void Invoke(int stage); |
|---|
| 54 | void ZeroOut(); |
|---|
| 55 | int designator; |
|---|
| 56 | GeneralFunctionStruct gf; |
|---|
| 57 | BiasScaleEnum bs; |
|---|
| 58 | }; |
|---|
| 59 | |
|---|
| 60 | class GeneralCombinerStruct { |
|---|
| 61 | public: |
|---|
| 62 | void Init(GeneralPortionStruct _portion0, GeneralPortionStruct _portion1, ConstColorStruct _cc0, ConstColorStruct _cc1) |
|---|
| 63 | { portion[0] = _portion0; portion[1] = _portion1; numPortions = 2; cc[0] = _cc0; cc[1] = _cc1; numConsts = 2; } |
|---|
| 64 | void Init(GeneralPortionStruct _portion0, GeneralPortionStruct _portion1, ConstColorStruct _cc0) |
|---|
| 65 | { portion[0] = _portion0; portion[1] = _portion1; numPortions = 2; cc[0] = _cc0; numConsts = 1; } |
|---|
| 66 | void Init(GeneralPortionStruct _portion0, GeneralPortionStruct _portion1) |
|---|
| 67 | { portion[0] = _portion0; portion[1] = _portion1; numPortions = 2; numConsts = 0; } |
|---|
| 68 | |
|---|
| 69 | void Init(GeneralPortionStruct _portion0, ConstColorStruct _cc0, ConstColorStruct _cc1) |
|---|
| 70 | { portion[0] = _portion0; numPortions = 1; cc[0] = _cc0; cc[1] = _cc1; numConsts = 2; } |
|---|
| 71 | void Init(GeneralPortionStruct _portion0, ConstColorStruct _cc0) |
|---|
| 72 | { portion[0] = _portion0; numPortions = 1; cc[0] = _cc0; numConsts = 1; } |
|---|
| 73 | void Init(GeneralPortionStruct _portion0) |
|---|
| 74 | { portion[0] = _portion0; numPortions = 1; numConsts = 0; } |
|---|
| 75 | |
|---|
| 76 | void Validate(int stage); |
|---|
| 77 | void SetUnusedLocalConsts(int numGlobalConsts, ConstColorStruct *globalCCs); |
|---|
| 78 | void Invoke(int stage); |
|---|
| 79 | void ZeroOut(); |
|---|
| 80 | GeneralPortionStruct portion[2]; |
|---|
| 81 | int numPortions; |
|---|
| 82 | ConstColorStruct cc[2]; |
|---|
| 83 | int numConsts; |
|---|
| 84 | }; |
|---|
| 85 | |
|---|
| 86 | class GeneralCombinersStruct { |
|---|
| 87 | public: |
|---|
| 88 | void Init() {num = 0;} |
|---|
| 89 | void Init(GeneralCombinerStruct _gc) { num = 1; general[0] = _gc; } |
|---|
| 90 | GeneralCombinersStruct& operator+=(GeneralCombinerStruct& _gc) |
|---|
| 91 | { |
|---|
| 92 | if (num < RCP_NUM_GENERAL_COMBINERS) |
|---|
| 93 | general[num++] = _gc; |
|---|
| 94 | else |
|---|
| 95 | errors.set("Too many general combiners."); |
|---|
| 96 | return *this; |
|---|
| 97 | } |
|---|
| 98 | void Validate(int numConsts, ConstColorStruct *cc); |
|---|
| 99 | void Invoke(); |
|---|
| 100 | GeneralCombinerStruct general[RCP_NUM_GENERAL_COMBINERS]; |
|---|
| 101 | int num; |
|---|
| 102 | private: |
|---|
| 103 | int localConsts; |
|---|
| 104 | }; |
|---|
| 105 | |
|---|
| 106 | |
|---|
| 107 | #endif |
|---|