1 /*
2  * Copyright (C) 2007-2010 The Nouveau Project.
3  * All Rights Reserved.
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining
6  * a copy of this software and associated documentation files (the
7  * "Software"), to deal in the Software without restriction, including
8  * without limitation the rights to use, copy, modify, merge, publish,
9  * distribute, sublicense, and/or sell copies of the Software, and to
10  * permit persons to whom the Software is furnished to do so, subject to
11  * the following conditions:
12  *
13  * The above copyright notice and this permission notice (including the
14  * next paragraph) shall be included in all copies or substantial
15  * portions of the Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20  * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
21  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24  *
25  */
26 
27 #ifndef __NOUVEAU_GLDEFS_H__
28 #define __NOUVEAU_GLDEFS_H__
29 
30 static inline unsigned
nvgl_blend_func(unsigned func)31 nvgl_blend_func(unsigned func)
32 {
33 	switch (func) {
34 	case GL_ZERO:
35 		return 0x0000;
36 	case GL_ONE:
37 		return 0x0001;
38 	case GL_SRC_COLOR:
39 		return 0x0300;
40 	case GL_ONE_MINUS_SRC_COLOR:
41 		return 0x0301;
42 	case GL_SRC_ALPHA:
43 		return 0x0302;
44 	case GL_ONE_MINUS_SRC_ALPHA:
45 		return 0x0303;
46 	case GL_DST_ALPHA:
47 		return 0x0304;
48 	case GL_ONE_MINUS_DST_ALPHA:
49 		return 0x0305;
50 	case GL_DST_COLOR:
51 		return 0x0306;
52 	case GL_ONE_MINUS_DST_COLOR:
53 		return 0x0307;
54 	case GL_SRC_ALPHA_SATURATE:
55 		return 0x0308;
56 	case GL_CONSTANT_COLOR:
57 		return 0x8001;
58 	case GL_ONE_MINUS_CONSTANT_COLOR:
59 		return 0x8002;
60 	case GL_CONSTANT_ALPHA:
61 		return 0x8003;
62 	case GL_ONE_MINUS_CONSTANT_ALPHA:
63 		return 0x8004;
64 	default:
65 		assert(0);
66 	}
67 }
68 
69 static inline unsigned
nvgl_blend_eqn(unsigned eqn)70 nvgl_blend_eqn(unsigned eqn)
71 {
72 	switch (eqn) {
73 	case GL_FUNC_ADD:
74 		return 0x8006;
75 	case GL_MIN:
76 		return 0x8007;
77 	case GL_MAX:
78 		return 0x8008;
79 	case GL_FUNC_SUBTRACT:
80 		return 0x800a;
81 	case GL_FUNC_REVERSE_SUBTRACT:
82 		return 0x800b;
83 	default:
84 		assert(0);
85 	}
86 }
87 
88 static inline unsigned
nvgl_comparison_op(unsigned op)89 nvgl_comparison_op(unsigned op)
90 {
91 	switch (op) {
92 	case GL_NEVER:
93 		return 0x0200;
94 	case GL_LESS:
95 		return 0x0201;
96 	case GL_EQUAL:
97 		return 0x0202;
98 	case GL_LEQUAL:
99 		return 0x0203;
100 	case GL_GREATER:
101 		return 0x0204;
102 	case GL_NOTEQUAL:
103 		return 0x0205;
104 	case GL_GEQUAL:
105 		return 0x0206;
106 	case GL_ALWAYS:
107 		return 0x0207;
108 	default:
109 		assert(0);
110 	}
111 }
112 
113 static inline unsigned
nvgl_polygon_mode(unsigned mode)114 nvgl_polygon_mode(unsigned mode)
115 {
116 	switch (mode) {
117 	case GL_POINT:
118 		return 0x1b00;
119 	case GL_LINE:
120 		return 0x1b01;
121 	case GL_FILL:
122 		return 0x1b02;
123 	default:
124 		assert(0);
125 	}
126 }
127 
128 static inline unsigned
nvgl_stencil_op(unsigned op)129 nvgl_stencil_op(unsigned op)
130 {
131 	switch (op) {
132 	case GL_ZERO:
133 		return 0x0000;
134 	case GL_INVERT:
135 		return 0x150a;
136 	case GL_KEEP:
137 		return 0x1e00;
138 	case GL_REPLACE:
139 		return 0x1e01;
140 	case GL_INCR:
141 		return 0x1e02;
142 	case GL_DECR:
143 		return 0x1e03;
144 	case GL_INCR_WRAP_EXT:
145 		return 0x8507;
146 	case GL_DECR_WRAP_EXT:
147 		return 0x8508;
148 	default:
149 		assert(0);
150 	}
151 }
152 
153 static inline unsigned
nvgl_primitive(unsigned prim)154 nvgl_primitive(unsigned prim)
155 {
156 	switch (prim) {
157 	case GL_POINTS:
158 		return 0x0001;
159 	case GL_LINES:
160 		return 0x0002;
161 	case GL_LINE_LOOP:
162 		return 0x0003;
163 	case GL_LINE_STRIP:
164 		return 0x0004;
165 	case GL_TRIANGLES:
166 		return 0x0005;
167 	case GL_TRIANGLE_STRIP:
168 		return 0x0006;
169 	case GL_TRIANGLE_FAN:
170 		return 0x0007;
171 	case GL_QUADS:
172 		return 0x0008;
173 	case GL_QUAD_STRIP:
174 		return 0x0009;
175 	case GL_POLYGON:
176 		return 0x000a;
177 	default:
178 		assert(0);
179 	}
180 }
181 
182 static inline unsigned
nvgl_wrap_mode(unsigned wrap)183 nvgl_wrap_mode(unsigned wrap)
184 {
185 	switch (wrap) {
186 	case GL_REPEAT:
187 		return 0x1;
188 	case GL_MIRRORED_REPEAT:
189 		return 0x2;
190 	case GL_CLAMP:
191 	case GL_CLAMP_TO_EDGE:
192 		return 0x3;
193 	case GL_CLAMP_TO_BORDER:
194 		return 0x4;
195 	default:
196 		assert(0);
197 	}
198 }
199 
200 static inline unsigned
nvgl_wrap_mode_nv20(unsigned wrap)201 nvgl_wrap_mode_nv20(unsigned wrap)
202 {
203 	switch (wrap) {
204 	case GL_REPEAT:
205 		return 0x1;
206 	case GL_MIRRORED_REPEAT:
207 		return 0x2;
208 	case GL_CLAMP:
209 		return 0x5;
210 	case GL_CLAMP_TO_EDGE:
211 		return 0x3;
212 	case GL_CLAMP_TO_BORDER:
213 		return 0x4;
214 	default:
215 		unreachable("Bad GL texture wrap mode");
216 	}
217 }
218 
219 static inline unsigned
nvgl_filter_mode(unsigned filter)220 nvgl_filter_mode(unsigned filter)
221 {
222 	switch (filter) {
223 	case GL_NEAREST:
224 		return 0x1;
225 	case GL_LINEAR:
226 		return 0x2;
227 	case GL_NEAREST_MIPMAP_NEAREST:
228 		return 0x3;
229 	case GL_LINEAR_MIPMAP_NEAREST:
230 		return 0x4;
231 	case GL_NEAREST_MIPMAP_LINEAR:
232 		return 0x5;
233 	case GL_LINEAR_MIPMAP_LINEAR:
234 		return 0x6;
235 	default:
236 		assert(0);
237 	}
238 }
239 
240 static inline unsigned
nvgl_texgen_mode(unsigned mode)241 nvgl_texgen_mode(unsigned mode)
242 {
243 	switch (mode) {
244 	case GL_EYE_LINEAR:
245 		return 0x2400;
246 	case GL_OBJECT_LINEAR:
247 		return 0x2401;
248 	case GL_SPHERE_MAP:
249 		return 0x2402;
250 	case GL_NORMAL_MAP:
251 		return 0x8511;
252 	case GL_REFLECTION_MAP:
253 		return 0x8512;
254 	default:
255 		assert(0);
256 	}
257 }
258 
259 #endif
260