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 |
---|