1 | #ifndef _RC10_REGISTER_H
|
---|
2 | #define _RC10_REGISTER_H
|
---|
3 |
|
---|
4 | #include <stdlib.h>
|
---|
5 | #include <GL/glew.h>
|
---|
6 |
|
---|
7 | #define RCP_NUM_GENERAL_COMBINERS 8
|
---|
8 |
|
---|
9 | #define RCP_RGB 0
|
---|
10 | #define RCP_ALPHA 1
|
---|
11 | #define RCP_BLUE 2
|
---|
12 | #define RCP_NONE 3
|
---|
13 |
|
---|
14 | typedef union _RegisterEnum {
|
---|
15 | struct {
|
---|
16 | #if BYTE_ORDER != BIG_ENDIAN
|
---|
17 | unsigned int name :16; // OpenGL enum for register
|
---|
18 | unsigned int channel : 2; // RCP_RGB, RCP_ALPHA, etc
|
---|
19 | unsigned int readOnly : 1; // true or false
|
---|
20 | unsigned int finalOnly : 1; // true or false
|
---|
21 | unsigned int unused :12;
|
---|
22 | #else
|
---|
23 | unsigned int unused :12;
|
---|
24 | unsigned int finalOnly : 1; // true or false
|
---|
25 | unsigned int readOnly : 1; // true or false
|
---|
26 | unsigned int channel : 2; // RCP_RGB, RCP_ALPHA, RCP_BLUE, RCP_NONE
|
---|
27 | unsigned int name :16; // OpenGL enum for register
|
---|
28 | #endif
|
---|
29 | } bits;
|
---|
30 | unsigned int word;
|
---|
31 | } RegisterEnum;
|
---|
32 | // No need for writeOnly flag, since DISCARD is the only register in that category
|
---|
33 |
|
---|
34 | // WARNING: Don't monkey with the above structure or this macro
|
---|
35 | // unless you're absolutely sure of what you're doing!
|
---|
36 | // This constant allocation makes validation *much* cleaner.
|
---|
37 | #define RCP_SET_REGISTER_ENUM(name, channel, readonly, finalonly) \
|
---|
38 | ((finalonly << 19) | (readonly << 18) | (channel << 16) | name)
|
---|
39 |
|
---|
40 | #define RCP_FOG_RGB RCP_SET_REGISTER_ENUM(GL_FOG, RCP_RGB, 1, 0)
|
---|
41 | #define RCP_FOG_ALPHA RCP_SET_REGISTER_ENUM(GL_FOG, RCP_ALPHA, 1, 1)
|
---|
42 | #define RCP_FOG_BLUE RCP_SET_REGISTER_ENUM(GL_FOG, RCP_BLUE, 1, 0)
|
---|
43 | #define RCP_FOG RCP_SET_REGISTER_ENUM(GL_FOG, RCP_NONE, 1, 0)
|
---|
44 | #define RCP_PRIMARY_COLOR_RGB RCP_SET_REGISTER_ENUM(GL_PRIMARY_COLOR_NV, RCP_RGB, 0, 0)
|
---|
45 | #define RCP_PRIMARY_COLOR_ALPHA RCP_SET_REGISTER_ENUM(GL_PRIMARY_COLOR_NV, RCP_ALPHA, 0, 0)
|
---|
46 | #define RCP_PRIMARY_COLOR_BLUE RCP_SET_REGISTER_ENUM(GL_PRIMARY_COLOR_NV, RCP_BLUE, 0, 0)
|
---|
47 | #define RCP_PRIMARY_COLOR RCP_SET_REGISTER_ENUM(GL_PRIMARY_COLOR_NV, RCP_NONE, 0, 0)
|
---|
48 | #define RCP_SECONDARY_COLOR_RGB RCP_SET_REGISTER_ENUM(GL_SECONDARY_COLOR_NV, RCP_RGB, 0, 0)
|
---|
49 | #define RCP_SECONDARY_COLOR_ALPHA RCP_SET_REGISTER_ENUM(GL_SECONDARY_COLOR_NV, RCP_ALPHA, 0, 0)
|
---|
50 | #define RCP_SECONDARY_COLOR_BLUE RCP_SET_REGISTER_ENUM(GL_SECONDARY_COLOR_NV, RCP_BLUE, 0, 0)
|
---|
51 | #define RCP_SECONDARY_COLOR RCP_SET_REGISTER_ENUM(GL_SECONDARY_COLOR_NV, RCP_NONE, 0, 0)
|
---|
52 | #define RCP_SPARE0_RGB RCP_SET_REGISTER_ENUM(GL_SPARE0_NV, RCP_RGB, 0, 0)
|
---|
53 | #define RCP_SPARE0_ALPHA RCP_SET_REGISTER_ENUM(GL_SPARE0_NV, RCP_ALPHA, 0, 0)
|
---|
54 | #define RCP_SPARE0_BLUE RCP_SET_REGISTER_ENUM(GL_SPARE0_NV, RCP_BLUE, 0, 0)
|
---|
55 | #define RCP_SPARE0 RCP_SET_REGISTER_ENUM(GL_SPARE0_NV, RCP_NONE, 0, 0)
|
---|
56 | #define RCP_SPARE1_RGB RCP_SET_REGISTER_ENUM(GL_SPARE1_NV, RCP_RGB, 0, 0)
|
---|
57 | #define RCP_SPARE1_ALPHA RCP_SET_REGISTER_ENUM(GL_SPARE1_NV, RCP_ALPHA, 0, 0)
|
---|
58 | #define RCP_SPARE1_BLUE RCP_SET_REGISTER_ENUM(GL_SPARE1_NV, RCP_BLUE, 0, 0)
|
---|
59 | #define RCP_SPARE1 RCP_SET_REGISTER_ENUM(GL_SPARE1_NV, RCP_NONE, 0, 0)
|
---|
60 | #define RCP_TEXTURE0_RGB RCP_SET_REGISTER_ENUM(GL_TEXTURE0_ARB, RCP_RGB, 0, 0)
|
---|
61 | #define RCP_TEXTURE0_ALPHA RCP_SET_REGISTER_ENUM(GL_TEXTURE0_ARB, RCP_ALPHA, 0, 0)
|
---|
62 | #define RCP_TEXTURE0_BLUE RCP_SET_REGISTER_ENUM(GL_TEXTURE0_ARB, RCP_BLUE, 0, 0)
|
---|
63 | #define RCP_TEXTURE0 RCP_SET_REGISTER_ENUM(GL_TEXTURE0_ARB, RCP_NONE, 0, 0)
|
---|
64 | #define RCP_TEXTURE1_RGB RCP_SET_REGISTER_ENUM(GL_TEXTURE1_ARB, RCP_RGB, 0, 0)
|
---|
65 | #define RCP_TEXTURE1_ALPHA RCP_SET_REGISTER_ENUM(GL_TEXTURE1_ARB, RCP_ALPHA, 0, 0)
|
---|
66 | #define RCP_TEXTURE1_BLUE RCP_SET_REGISTER_ENUM(GL_TEXTURE1_ARB, RCP_BLUE, 0, 0)
|
---|
67 | #define RCP_TEXTURE1 RCP_SET_REGISTER_ENUM(GL_TEXTURE1_ARB, RCP_NONE, 0, 0)
|
---|
68 | #define RCP_TEXTURE2_RGB RCP_SET_REGISTER_ENUM(GL_TEXTURE2_ARB, RCP_RGB, 0, 0)
|
---|
69 | #define RCP_TEXTURE2_ALPHA RCP_SET_REGISTER_ENUM(GL_TEXTURE2_ARB, RCP_ALPHA, 0, 0)
|
---|
70 | #define RCP_TEXTURE2_BLUE RCP_SET_REGISTER_ENUM(GL_TEXTURE2_ARB, RCP_BLUE, 0, 0)
|
---|
71 | #define RCP_TEXTURE2 RCP_SET_REGISTER_ENUM(GL_TEXTURE2_ARB, RCP_NONE, 0, 0)
|
---|
72 | #define RCP_TEXTURE3_RGB RCP_SET_REGISTER_ENUM(GL_TEXTURE3_ARB, RCP_RGB, 0, 0)
|
---|
73 | #define RCP_TEXTURE3_ALPHA RCP_SET_REGISTER_ENUM(GL_TEXTURE3_ARB, RCP_ALPHA, 0, 0)
|
---|
74 | #define RCP_TEXTURE3_BLUE RCP_SET_REGISTER_ENUM(GL_TEXTURE3_ARB, RCP_BLUE, 0, 0)
|
---|
75 | #define RCP_TEXTURE3 RCP_SET_REGISTER_ENUM(GL_TEXTURE3_ARB, RCP_NONE, 0, 0)
|
---|
76 | #define RCP_CONST_COLOR0_RGB RCP_SET_REGISTER_ENUM(GL_CONSTANT_COLOR0_NV, RCP_RGB, 1, 0)
|
---|
77 | #define RCP_CONST_COLOR0_ALPHA RCP_SET_REGISTER_ENUM(GL_CONSTANT_COLOR0_NV, RCP_ALPHA, 1, 0)
|
---|
78 | #define RCP_CONST_COLOR0_BLUE RCP_SET_REGISTER_ENUM(GL_CONSTANT_COLOR0_NV, RCP_BLUE, 1, 0)
|
---|
79 | #define RCP_CONST_COLOR0 RCP_SET_REGISTER_ENUM(GL_CONSTANT_COLOR0_NV, RCP_NONE, 1, 0)
|
---|
80 | #define RCP_CONST_COLOR1_RGB RCP_SET_REGISTER_ENUM(GL_CONSTANT_COLOR1_NV, RCP_RGB, 1, 0)
|
---|
81 | #define RCP_CONST_COLOR1_ALPHA RCP_SET_REGISTER_ENUM(GL_CONSTANT_COLOR1_NV, RCP_ALPHA, 1, 0)
|
---|
82 | #define RCP_CONST_COLOR1_BLUE RCP_SET_REGISTER_ENUM(GL_CONSTANT_COLOR1_NV, RCP_BLUE, 1, 0)
|
---|
83 | #define RCP_CONST_COLOR1 RCP_SET_REGISTER_ENUM(GL_CONSTANT_COLOR1_NV, RCP_NONE, 1, 0)
|
---|
84 | #define RCP_ZERO_RGB RCP_SET_REGISTER_ENUM(GL_ZERO, RCP_RGB, 1, 0)
|
---|
85 | #define RCP_ZERO_ALPHA RCP_SET_REGISTER_ENUM(GL_ZERO, RCP_ALPHA, 1, 0)
|
---|
86 | #define RCP_ZERO_BLUE RCP_SET_REGISTER_ENUM(GL_ZERO, RCP_BLUE, 1, 0)
|
---|
87 | #define RCP_ZERO RCP_SET_REGISTER_ENUM(GL_ZERO, RCP_NONE, 1, 0)
|
---|
88 | #define RCP_ONE_RGB RCP_SET_REGISTER_ENUM(GL_ONE, RCP_RGB, 1, 0)
|
---|
89 | #define RCP_ONE_ALPHA RCP_SET_REGISTER_ENUM(GL_ONE, RCP_ALPHA, 1, 0)
|
---|
90 | #define RCP_ONE_BLUE RCP_SET_REGISTER_ENUM(GL_ONE, RCP_BLUE, 1, 0)
|
---|
91 | #define RCP_ONE RCP_SET_REGISTER_ENUM(GL_ONE, RCP_NONE, 1, 0)
|
---|
92 | #define RCP_DISCARD RCP_SET_REGISTER_ENUM(GL_DISCARD_NV, RCP_NONE, 0, 0)
|
---|
93 | #define RCP_FINAL_PRODUCT RCP_SET_REGISTER_ENUM(GL_E_TIMES_F_NV, RCP_NONE, 1, 1)
|
---|
94 | #define RCP_COLOR_SUM RCP_SET_REGISTER_ENUM(GL_SPARE0_PLUS_SECONDARY_COLOR_NV, RCP_NONE, 1, 1)
|
---|
95 |
|
---|
96 | #define MAP_CHANNEL(channel) ((RCP_RGB == (channel)) ? GL_RGB : (RCP_ALPHA == (channel) ? GL_ALPHA : GL_BLUE))
|
---|
97 |
|
---|
98 | typedef union _BiasScaleEnum {
|
---|
99 | struct {
|
---|
100 | #if BYTE_ORDER != BIG_ENDIAN
|
---|
101 | unsigned int bias :16; // OpenGL enum for bias
|
---|
102 | unsigned int scale :16; // OpenGL enum for scale
|
---|
103 | #else
|
---|
104 | unsigned int scale :16; // OpenGL enum for scale
|
---|
105 | unsigned int bias :16; // OpenGL enum for bias
|
---|
106 | #endif
|
---|
107 | } bits;
|
---|
108 | unsigned int word;
|
---|
109 | } BiasScaleEnum;
|
---|
110 |
|
---|
111 | // WARNING: Don't monkey with the above structure or this macro
|
---|
112 | // unless you're absolutely sure of what you're doing!
|
---|
113 | // This constant allocation makes validation *much* cleaner.
|
---|
114 | #define RCP_SET_BIAS_SCALE_ENUM(bias, scale) ((scale << 16) | bias)
|
---|
115 |
|
---|
116 | #define RCP_BIAS_BY_NEGATIVE_ONE_HALF_SCALE_BY_TWO RCP_SET_BIAS_SCALE_ENUM(GL_BIAS_BY_NEGATIVE_ONE_HALF_NV, GL_SCALE_BY_TWO_NV)
|
---|
117 | #define RCP_BIAS_BY_NEGATIVE_ONE_HALF RCP_SET_BIAS_SCALE_ENUM(GL_BIAS_BY_NEGATIVE_ONE_HALF_NV, GL_NONE)
|
---|
118 | #define RCP_SCALE_BY_ONE_HALF RCP_SET_BIAS_SCALE_ENUM(GL_NONE, GL_SCALE_BY_ONE_HALF_NV)
|
---|
119 | #define RCP_SCALE_BY_ONE RCP_SET_BIAS_SCALE_ENUM(GL_NONE, GL_NONE)
|
---|
120 | #define RCP_SCALE_BY_TWO RCP_SET_BIAS_SCALE_ENUM(GL_NONE, GL_SCALE_BY_TWO_NV)
|
---|
121 | #define RCP_SCALE_BY_FOUR RCP_SET_BIAS_SCALE_ENUM(GL_NONE, GL_SCALE_BY_FOUR_NV)
|
---|
122 |
|
---|
123 | class MappedRegisterStruct {
|
---|
124 | public:
|
---|
125 | void Init(RegisterEnum _reg, int _map = GL_UNSIGNED_IDENTITY_NV)
|
---|
126 | {
|
---|
127 | if (RCP_ONE == _reg.bits.name) {
|
---|
128 | _reg.bits.name = RCP_ZERO;
|
---|
129 | switch (_map) {
|
---|
130 | case GL_UNSIGNED_IDENTITY_NV:
|
---|
131 | _map = GL_UNSIGNED_INVERT_NV;
|
---|
132 | break;
|
---|
133 | case GL_UNSIGNED_INVERT_NV:
|
---|
134 | _map = GL_UNSIGNED_IDENTITY_NV;
|
---|
135 | break;
|
---|
136 | case GL_EXPAND_NORMAL_NV:
|
---|
137 | _map = GL_UNSIGNED_INVERT_NV;
|
---|
138 | break;
|
---|
139 | case GL_EXPAND_NEGATE_NV:
|
---|
140 | _map = GL_EXPAND_NORMAL_NV;
|
---|
141 | break;
|
---|
142 | case GL_HALF_BIAS_NORMAL_NV:
|
---|
143 | _map = GL_HALF_BIAS_NEGATE_NV;
|
---|
144 | break;
|
---|
145 | case GL_HALF_BIAS_NEGATE_NV:
|
---|
146 | _map = GL_HALF_BIAS_NORMAL_NV;
|
---|
147 | break;
|
---|
148 | case GL_SIGNED_IDENTITY_NV:
|
---|
149 | _map = GL_UNSIGNED_INVERT_NV;
|
---|
150 | break;
|
---|
151 | case GL_SIGNED_NEGATE_NV:
|
---|
152 | _map = GL_EXPAND_NORMAL_NV;
|
---|
153 | break;
|
---|
154 | }
|
---|
155 | }
|
---|
156 | map = _map;
|
---|
157 | reg = _reg;
|
---|
158 | }
|
---|
159 | int map;
|
---|
160 | RegisterEnum reg;
|
---|
161 | };
|
---|
162 |
|
---|
163 | #ifdef TEST_BIT_FIELDS
|
---|
164 |
|
---|
165 | class RegisterEnumTest {
|
---|
166 | public:
|
---|
167 | RegisterEnumTest()
|
---|
168 | {
|
---|
169 | RegisterEnum reg;
|
---|
170 | bool error = false;
|
---|
171 |
|
---|
172 | if (sizeof(reg.bits) != sizeof(reg.word))
|
---|
173 | error = true;
|
---|
174 |
|
---|
175 | reg.word = 0; reg.bits.name = 0xFFFF;
|
---|
176 | if (RCP_SET_REGISTER_ENUM(0xFFFF, 0, 0, 0) != reg.word)
|
---|
177 | error = true;
|
---|
178 |
|
---|
179 | reg.word = 0; reg.bits.channel = 3;
|
---|
180 | if (RCP_SET_REGISTER_ENUM(0, 3, 0, 0) != reg.word)
|
---|
181 | error = true;
|
---|
182 |
|
---|
183 | reg.word = 0; reg.bits.readOnly = true;
|
---|
184 | if (RCP_SET_REGISTER_ENUM(0, 0, 1, 0) != reg.word)
|
---|
185 | error = true;
|
---|
186 |
|
---|
187 | reg.word = 0; reg.bits.finalOnly = true;
|
---|
188 | if (RCP_SET_REGISTER_ENUM(0, 0, 0, 1) != reg.word)
|
---|
189 | error = true;
|
---|
190 |
|
---|
191 | if (error) {
|
---|
192 | fprintf(stderr, "ERROR: Bit Fields were not compiled correctly in " __FILE__ "!\n");
|
---|
193 | exit(1);
|
---|
194 | }
|
---|
195 | }
|
---|
196 | };
|
---|
197 |
|
---|
198 | static RegisterEnumTest registerEnumTest;
|
---|
199 | #endif
|
---|
200 |
|
---|
201 | #endif
|
---|