Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: downloads/RenderSystems/GL/src/nvparse/rc1.0_register.h @ 3

Last change on this file since 3 was 3, checked in by anonymous, 17 years ago

=update

File size: 8.7 KB
Line 
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
14typedef 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
98typedef 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
123class MappedRegisterStruct {
124public:
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
165class 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
198static RegisterEnumTest registerEnumTest;
199#endif
200
201#endif
Note: See TracBrowser for help on using the repository browser.