| 1 | #ifndef _INST_H | 
|---|
| 2 | #define _INST_H | 
|---|
| 3 |  | 
|---|
| 4 | #define TSP_MAX_ARGS 7 | 
|---|
| 5 | #define TSP_NUM_TEXTURE_UNITS 4 | 
|---|
| 6 |  | 
|---|
| 7 | #ifdef _WIN32 | 
|---|
| 8 | # define BYTE_ORDER !BIG_ENDIAN | 
|---|
| 9 | #endif | 
|---|
| 10 | #include <stdlib.h>   | 
|---|
| 11 |  | 
|---|
| 12 | typedef union _InstructionEnum { | 
|---|
| 13 |   struct { | 
|---|
| 14 | #if BYTE_ORDER != BIG_ENDIAN | 
|---|
| 15 |     unsigned int instruction   :10; // instruction id | 
|---|
| 16 |     unsigned int stage         : 4; // stage number | 
|---|
| 17 |     unsigned int dependent     : 1; // dependent operation | 
|---|
| 18 |     unsigned int noOutput      : 1; // no RGBA output | 
|---|
| 19 | #else | 
|---|
| 20 |     unsigned int noOutput      : 1; | 
|---|
| 21 |     unsigned int dependent     : 1; | 
|---|
| 22 |     unsigned int stage         : 4; | 
|---|
| 23 |     unsigned int instruction   :10; | 
|---|
| 24 | #endif | 
|---|
| 25 |   } bits; | 
|---|
| 26 |   unsigned int word; | 
|---|
| 27 | } InstructionEnum; | 
|---|
| 28 |  | 
|---|
| 29 | // WARNING:  Don't monkey with the above structure or this macro | 
|---|
| 30 | // unless you're absolutely sure of what you're doing! | 
|---|
| 31 | // This constant allocation makes validation *much* cleaner. | 
|---|
| 32 | #define TSP_SET_INSTRUCTION_ENUM(inst, st, dep, noout) \ | 
|---|
| 33 |          ((noout << 15) | (dep << 14) | (st << 10) | inst) | 
|---|
| 34 |  | 
|---|
| 35 | #define TSP_NOP                                 TSP_SET_INSTRUCTION_ENUM(0, 0, 0, 1) | 
|---|
| 36 | #define TSP_TEXTURE_1D                  TSP_SET_INSTRUCTION_ENUM(1, 0, 0, 0) | 
|---|
| 37 | #define TSP_TEXTURE_2D                  TSP_SET_INSTRUCTION_ENUM(2, 0, 0, 0) | 
|---|
| 38 | #define TSP_TEXTURE_RECTANGLE   TSP_SET_INSTRUCTION_ENUM(3, 0, 0, 0) | 
|---|
| 39 | #define TSP_TEXTURE_3D                  TSP_SET_INSTRUCTION_ENUM(4, 0, 0, 0) | 
|---|
| 40 | #define TSP_TEXTURE_CUBE_MAP    TSP_SET_INSTRUCTION_ENUM(5, 0, 0, 0) | 
|---|
| 41 | #define TSP_CULL_FRAGMENT               TSP_SET_INSTRUCTION_ENUM(6, 0, 0, 1) | 
|---|
| 42 | #define TSP_PASS_THROUGH                TSP_SET_INSTRUCTION_ENUM(7, 0, 0, 0) | 
|---|
| 43 | #define TSP_DEPENDENT_AR                TSP_SET_INSTRUCTION_ENUM(8, 0, 1, 0) | 
|---|
| 44 | #define TSP_DEPENDENT_GB                TSP_SET_INSTRUCTION_ENUM(9, 0, 1, 0) | 
|---|
| 45 | #define TSP_OFFSET_2D                   TSP_SET_INSTRUCTION_ENUM(10, 0, 1, 0) | 
|---|
| 46 | #define TSP_OFFSET_2D_SCALE             TSP_SET_INSTRUCTION_ENUM(11, 0, 1, 0) | 
|---|
| 47 | #define TSP_OFFSET_RECTANGLE                    TSP_SET_INSTRUCTION_ENUM(12, 0, 1, 0) | 
|---|
| 48 | #define TSP_OFFSET_RECTANGLE_SCALE              TSP_SET_INSTRUCTION_ENUM(13, 0, 1, 0) | 
|---|
| 49 |  | 
|---|
| 50 | #define TSP_DOT_PRODUCT_2D_1_OF_2                               TSP_SET_INSTRUCTION_ENUM(14, 0, 1, 1) | 
|---|
| 51 | #define TSP_DOT_PRODUCT_2D_2_OF_2                               TSP_SET_INSTRUCTION_ENUM(14, 1, 1, 0) | 
|---|
| 52 |  | 
|---|
| 53 | #define TSP_DOT_PRODUCT_RECTANGLE_1_OF_2                                TSP_SET_INSTRUCTION_ENUM(15, 0, 1, 1) | 
|---|
| 54 | #define TSP_DOT_PRODUCT_RECTANGLE_2_OF_2                                TSP_SET_INSTRUCTION_ENUM(15, 1, 1, 0) | 
|---|
| 55 |  | 
|---|
| 56 | #define TSP_DOT_PRODUCT_DEPTH_REPLACE_1_OF_2    TSP_SET_INSTRUCTION_ENUM(16, 0, 1, 1) | 
|---|
| 57 | #define TSP_DOT_PRODUCT_DEPTH_REPLACE_2_OF_2    TSP_SET_INSTRUCTION_ENUM(16, 1, 1, 0) | 
|---|
| 58 |  | 
|---|
| 59 | #define TSP_DOT_PRODUCT_3D_1_OF_3               TSP_SET_INSTRUCTION_ENUM(17, 0, 1, 1) | 
|---|
| 60 | #define TSP_DOT_PRODUCT_3D_2_OF_3               TSP_SET_INSTRUCTION_ENUM(17, 1, 1, 1) | 
|---|
| 61 | #define TSP_DOT_PRODUCT_3D_3_OF_3               TSP_SET_INSTRUCTION_ENUM(17, 2, 1, 0) | 
|---|
| 62 |  | 
|---|
| 63 | #define TSP_DOT_PRODUCT_CUBE_MAP_1_OF_3 TSP_SET_INSTRUCTION_ENUM(18, 0, 1, 1) | 
|---|
| 64 | #define TSP_DOT_PRODUCT_CUBE_MAP_2_OF_3 TSP_SET_INSTRUCTION_ENUM(18, 1, 1, 1) | 
|---|
| 65 | #define TSP_DOT_PRODUCT_CUBE_MAP_3_OF_3 TSP_SET_INSTRUCTION_ENUM(18, 2, 1, 0) | 
|---|
| 66 |  | 
|---|
| 67 | #define TSP_DOT_PRODUCT_REFLECT_CUBE_MAP_EYE_FROM_QS_1_OF_3     TSP_SET_INSTRUCTION_ENUM(19, 0, 1, 1) | 
|---|
| 68 | #define TSP_DOT_PRODUCT_REFLECT_CUBE_MAP_EYE_FROM_QS_2_OF_3     TSP_SET_INSTRUCTION_ENUM(19, 1, 1, 1) | 
|---|
| 69 | #define TSP_DOT_PRODUCT_REFLECT_CUBE_MAP_EYE_FROM_QS_3_OF_3     TSP_SET_INSTRUCTION_ENUM(19, 2, 1, 0) | 
|---|
| 70 |  | 
|---|
| 71 | #define TSP_DOT_PRODUCT_REFLECT_CUBE_MAP_CONST_EYE_1_OF_3       TSP_SET_INSTRUCTION_ENUM(20, 0, 1, 1) | 
|---|
| 72 | #define TSP_DOT_PRODUCT_REFLECT_CUBE_MAP_CONST_EYE_2_OF_3       TSP_SET_INSTRUCTION_ENUM(20, 1, 1, 1) | 
|---|
| 73 | #define TSP_DOT_PRODUCT_REFLECT_CUBE_MAP_CONST_EYE_3_OF_3       TSP_SET_INSTRUCTION_ENUM(20, 2, 1, 0) | 
|---|
| 74 |  | 
|---|
| 75 | #define TSP_DOT_PRODUCT_CUBE_MAP_AND_REFLECT_CUBE_MAP_EYE_FROM_QS_1_OF_3        TSP_SET_INSTRUCTION_ENUM(21, 0, 1, 1) | 
|---|
| 76 | #define TSP_DOT_PRODUCT_CUBE_MAP_AND_REFLECT_CUBE_MAP_EYE_FROM_QS_2_OF_3        TSP_SET_INSTRUCTION_ENUM(21, 1, 1, 0) | 
|---|
| 77 | #define TSP_DOT_PRODUCT_CUBE_MAP_AND_REFLECT_CUBE_MAP_EYE_FROM_QS_3_OF_3        TSP_SET_INSTRUCTION_ENUM(21, 2, 1, 0) | 
|---|
| 78 |  | 
|---|
| 79 | #define TSP_DOT_PRODUCT_CUBE_MAP_AND_REFLECT_CUBE_MAP_CONST_EYE_1_OF_3          TSP_SET_INSTRUCTION_ENUM(22, 0, 1, 1) | 
|---|
| 80 | #define TSP_DOT_PRODUCT_CUBE_MAP_AND_REFLECT_CUBE_MAP_CONST_EYE_2_OF_3          TSP_SET_INSTRUCTION_ENUM(22, 1, 1, 0) | 
|---|
| 81 | #define TSP_DOT_PRODUCT_CUBE_MAP_AND_REFLECT_CUBE_MAP_CONST_EYE_3_OF_3          TSP_SET_INSTRUCTION_ENUM(22, 2, 1, 0) | 
|---|
| 82 |  | 
|---|
| 83 | typedef struct _MappedVariable { | 
|---|
| 84 |         float var; | 
|---|
| 85 |         int expand; | 
|---|
| 86 | } MappedVariable, *MappedVariablePtr; | 
|---|
| 87 |  | 
|---|
| 88 | typedef class Inst { | 
|---|
| 89 | public: | 
|---|
| 90 |         Inst(int inst, float arg0 = 0., float arg1 = 0., float arg2 = 0., float arg3 = 0., float arg4 = 0., float arg5 = 0., float arg6 = 0.); | 
|---|
| 91 |         Inst(int inst, MappedVariablePtr arg0, float arg1 = 0., float arg2 = 0., float arg3 = 0., float arg4 = 0., float arg5 = 0., float arg6 = 0.); | 
|---|
| 92 |         void Invoke(); | 
|---|
| 93 |         InstructionEnum opcode; | 
|---|
| 94 |         float args[TSP_MAX_ARGS]; | 
|---|
| 95 | private: | 
|---|
| 96 |         int expand; | 
|---|
| 97 | } *InstPtr; | 
|---|
| 98 |  | 
|---|
| 99 | #ifdef TEST_BIT_FIELDS | 
|---|
| 100 |  | 
|---|
| 101 | #include <stdio.h> | 
|---|
| 102 |  | 
|---|
| 103 | class InstructionEnumTest { | 
|---|
| 104 |   public: | 
|---|
| 105 |     InstructionEnumTest() | 
|---|
| 106 |     { | 
|---|
| 107 |       InstructionEnum inst; | 
|---|
| 108 |       bool error = false; | 
|---|
| 109 |  | 
|---|
| 110 |       if (sizeof(inst.bits) != sizeof(inst.word)) | 
|---|
| 111 |         error = true; | 
|---|
| 112 |  | 
|---|
| 113 |       inst.word = 0; inst.bits.instruction = 0x3FF; | 
|---|
| 114 |       if (TSP_SET_INSTRUCTION_ENUM(0x3FF, 0, 0, 0) != inst.word) | 
|---|
| 115 |         error = true; | 
|---|
| 116 |  | 
|---|
| 117 |       inst.word = 0; inst.bits.stage = 0x0F; | 
|---|
| 118 |       if (TSP_SET_INSTRUCTION_ENUM(0, 0x0F, 0, 0) != inst.word)  | 
|---|
| 119 |         error = true; | 
|---|
| 120 |  | 
|---|
| 121 |       inst.word = 0; inst.bits.dependent = true; | 
|---|
| 122 |       if (TSP_SET_INSTRUCTION_ENUM(0, 0, 1, 0) != inst.word)  | 
|---|
| 123 |         error = true; | 
|---|
| 124 |  | 
|---|
| 125 |       inst.word = 0; inst.bits.noOutput = true; | 
|---|
| 126 |       if (TSP_SET_INSTRUCTION_ENUM(0, 0, 0, 1) != inst.word)  | 
|---|
| 127 |         error = true; | 
|---|
| 128 |  | 
|---|
| 129 |       if (error) { | 
|---|
| 130 |         fprintf(stderr, "ERROR: Bit Fields were not compiled correctly in " __FILE__ "!\n"); | 
|---|
| 131 |         exit(1); | 
|---|
| 132 |       } | 
|---|
| 133 |     } | 
|---|
| 134 | }; | 
|---|
| 135 |  | 
|---|
| 136 | static InstructionEnumTest instructionEnumTest; | 
|---|
| 137 |  | 
|---|
| 138 | #endif /* TEST_BIT_FIELDS */ | 
|---|
| 139 |  | 
|---|
| 140 | #endif | 
|---|