Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
55 | pj | 1 | /* $Id: texstate.c,v 1.1 2003-02-28 11:42:05 pj Exp $ */ |
2 | |||
3 | /* |
||
4 | * Mesa 3-D graphics library |
||
5 | * Version: 5.0 |
||
6 | * |
||
7 | * Copyright (C) 1999-2002 Brian Paul All Rights Reserved. |
||
8 | * |
||
9 | * Permission is hereby granted, free of charge, to any person obtaining a |
||
10 | * copy of this software and associated documentation files (the "Software"), |
||
11 | * to deal in the Software without restriction, including without limitation |
||
12 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
||
13 | * and/or sell copies of the Software, and to permit persons to whom the |
||
14 | * Software is furnished to do so, subject to the following conditions: |
||
15 | * |
||
16 | * The above copyright notice and this permission notice shall be included |
||
17 | * in all copies or substantial portions of the Software. |
||
18 | * |
||
19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
||
20 | * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||
21 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
||
22 | * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN |
||
23 | * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
||
24 | * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
||
25 | */ |
||
26 | |||
27 | |||
28 | #include "glheader.h" |
||
29 | #include "colormac.h" |
||
30 | #include "context.h" |
||
31 | #include "enums.h" |
||
32 | #include "extensions.h" |
||
33 | #include "macros.h" |
||
34 | #include "texobj.h" |
||
35 | #include "teximage.h" |
||
36 | #include "texstate.h" |
||
37 | #include "mtypes.h" |
||
38 | #include "math/m_xform.h" |
||
39 | #include "math/m_matrix.h" |
||
40 | |||
41 | |||
42 | |||
43 | #ifdef SPECIALCAST |
||
44 | /* Needed for an Amiga compiler */ |
||
45 | #define ENUM_TO_FLOAT(X) ((GLfloat)(GLint)(X)) |
||
46 | #define ENUM_TO_DOUBLE(X) ((GLdouble)(GLint)(X)) |
||
47 | #else |
||
48 | /* all other compilers */ |
||
49 | #define ENUM_TO_FLOAT(X) ((GLfloat)(X)) |
||
50 | #define ENUM_TO_DOUBLE(X) ((GLdouble)(X)) |
||
51 | #endif |
||
52 | |||
53 | |||
54 | |||
55 | void |
||
56 | _mesa_copy_texture_state( const GLcontext *src, GLcontext *dst ) |
||
57 | { |
||
58 | GLuint i; |
||
59 | |||
60 | ASSERT(src); |
||
61 | ASSERT(dst); |
||
62 | |||
63 | dst->Texture.CurrentUnit = src->Texture.CurrentUnit; |
||
64 | dst->Texture._GenFlags = src->Texture._GenFlags; |
||
65 | dst->Texture._TexGenEnabled = src->Texture._TexGenEnabled; |
||
66 | dst->Texture._TexMatEnabled = src->Texture._TexMatEnabled; |
||
67 | dst->Texture.SharedPalette = src->Texture.SharedPalette; |
||
68 | |||
69 | /* per-unit state */ |
||
70 | for (i = 0; i < src->Const.MaxTextureUnits; i++) { |
||
71 | dst->Texture.Unit[i].Enabled = src->Texture.Unit[i].Enabled; |
||
72 | dst->Texture.Unit[i].EnvMode = src->Texture.Unit[i].EnvMode; |
||
73 | COPY_4V(dst->Texture.Unit[i].EnvColor, src->Texture.Unit[i].EnvColor); |
||
74 | dst->Texture.Unit[i].TexGenEnabled = src->Texture.Unit[i].TexGenEnabled; |
||
75 | dst->Texture.Unit[i].GenModeS = src->Texture.Unit[i].GenModeS; |
||
76 | dst->Texture.Unit[i].GenModeT = src->Texture.Unit[i].GenModeT; |
||
77 | dst->Texture.Unit[i].GenModeR = src->Texture.Unit[i].GenModeR; |
||
78 | dst->Texture.Unit[i].GenModeQ = src->Texture.Unit[i].GenModeQ; |
||
79 | dst->Texture.Unit[i]._GenBitS = src->Texture.Unit[i]._GenBitS; |
||
80 | dst->Texture.Unit[i]._GenBitT = src->Texture.Unit[i]._GenBitT; |
||
81 | dst->Texture.Unit[i]._GenBitR = src->Texture.Unit[i]._GenBitR; |
||
82 | dst->Texture.Unit[i]._GenBitQ = src->Texture.Unit[i]._GenBitQ; |
||
83 | dst->Texture.Unit[i]._GenFlags = src->Texture.Unit[i]._GenFlags; |
||
84 | COPY_4V(dst->Texture.Unit[i].ObjectPlaneS, src->Texture.Unit[i].ObjectPlaneS); |
||
85 | COPY_4V(dst->Texture.Unit[i].ObjectPlaneT, src->Texture.Unit[i].ObjectPlaneT); |
||
86 | COPY_4V(dst->Texture.Unit[i].ObjectPlaneR, src->Texture.Unit[i].ObjectPlaneR); |
||
87 | COPY_4V(dst->Texture.Unit[i].ObjectPlaneQ, src->Texture.Unit[i].ObjectPlaneQ); |
||
88 | COPY_4V(dst->Texture.Unit[i].EyePlaneS, src->Texture.Unit[i].EyePlaneS); |
||
89 | COPY_4V(dst->Texture.Unit[i].EyePlaneT, src->Texture.Unit[i].EyePlaneT); |
||
90 | COPY_4V(dst->Texture.Unit[i].EyePlaneR, src->Texture.Unit[i].EyePlaneR); |
||
91 | COPY_4V(dst->Texture.Unit[i].EyePlaneQ, src->Texture.Unit[i].EyePlaneQ); |
||
92 | dst->Texture.Unit[i].LodBias = src->Texture.Unit[i].LodBias; |
||
93 | |||
94 | /* GL_EXT_texture_env_combine */ |
||
95 | dst->Texture.Unit[i].CombineModeRGB = src->Texture.Unit[i].CombineModeRGB; |
||
96 | dst->Texture.Unit[i].CombineModeA = src->Texture.Unit[i].CombineModeA; |
||
97 | COPY_3V(dst->Texture.Unit[i].CombineSourceRGB, src->Texture.Unit[i].CombineSourceRGB); |
||
98 | COPY_3V(dst->Texture.Unit[i].CombineSourceA, src->Texture.Unit[i].CombineSourceA); |
||
99 | COPY_3V(dst->Texture.Unit[i].CombineOperandRGB, src->Texture.Unit[i].CombineOperandRGB); |
||
100 | COPY_3V(dst->Texture.Unit[i].CombineOperandA, src->Texture.Unit[i].CombineOperandA); |
||
101 | dst->Texture.Unit[i].CombineScaleShiftRGB = src->Texture.Unit[i].CombineScaleShiftRGB; |
||
102 | dst->Texture.Unit[i].CombineScaleShiftA = src->Texture.Unit[i].CombineScaleShiftA; |
||
103 | |||
104 | /* texture object state */ |
||
105 | _mesa_copy_texture_object(dst->Texture.Unit[i].Current1D, |
||
106 | src->Texture.Unit[i].Current1D); |
||
107 | _mesa_copy_texture_object(dst->Texture.Unit[i].Current2D, |
||
108 | src->Texture.Unit[i].Current2D); |
||
109 | _mesa_copy_texture_object(dst->Texture.Unit[i].Current3D, |
||
110 | src->Texture.Unit[i].Current3D); |
||
111 | _mesa_copy_texture_object(dst->Texture.Unit[i].CurrentCubeMap, |
||
112 | src->Texture.Unit[i].CurrentCubeMap); |
||
113 | _mesa_copy_texture_object(dst->Texture.Unit[i].CurrentRect, |
||
114 | src->Texture.Unit[i].CurrentRect); |
||
115 | } |
||
116 | } |
||
117 | |||
118 | |||
119 | /**********************************************************************/ |
||
120 | /* Texture Environment */ |
||
121 | /**********************************************************************/ |
||
122 | |||
123 | |||
124 | void |
||
125 | _mesa_TexEnvfv( GLenum target, GLenum pname, const GLfloat *param ) |
||
126 | { |
||
127 | GET_CURRENT_CONTEXT(ctx); |
||
128 | struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; |
||
129 | ASSERT_OUTSIDE_BEGIN_END(ctx); |
||
130 | |||
131 | #define TE_ERROR(errCode, msg, value) \ |
||
132 | _mesa_error(ctx, errCode, msg, _mesa_lookup_enum_by_nr(value)); |
||
133 | |||
134 | if (target == GL_TEXTURE_ENV) { |
||
135 | switch (pname) { |
||
136 | case GL_TEXTURE_ENV_MODE: |
||
137 | { |
||
138 | const GLenum mode = (GLenum) (GLint) *param; |
||
139 | if (mode == GL_MODULATE || |
||
140 | mode == GL_BLEND || |
||
141 | mode == GL_DECAL || |
||
142 | mode == GL_REPLACE || |
||
143 | (mode == GL_ADD && ctx->Extensions.EXT_texture_env_add) || |
||
144 | (mode == GL_COMBINE_EXT && |
||
145 | (ctx->Extensions.EXT_texture_env_combine || |
||
146 | ctx->Extensions.ARB_texture_env_combine))) { |
||
147 | /* legal */ |
||
148 | if (texUnit->EnvMode == mode) |
||
149 | return; |
||
150 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
151 | texUnit->EnvMode = mode; |
||
152 | } |
||
153 | else { |
||
154 | TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode); |
||
155 | return; |
||
156 | } |
||
157 | } |
||
158 | break; |
||
159 | case GL_TEXTURE_ENV_COLOR: |
||
160 | { |
||
161 | GLfloat tmp[4]; |
||
162 | tmp[0] = CLAMP( param[0], 0.0F, 1.0F ); |
||
163 | tmp[1] = CLAMP( param[1], 0.0F, 1.0F ); |
||
164 | tmp[2] = CLAMP( param[2], 0.0F, 1.0F ); |
||
165 | tmp[3] = CLAMP( param[3], 0.0F, 1.0F ); |
||
166 | if (TEST_EQ_4V(tmp, texUnit->EnvColor)) |
||
167 | return; |
||
168 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
169 | COPY_4FV(texUnit->EnvColor, tmp); |
||
170 | } |
||
171 | break; |
||
172 | case GL_COMBINE_RGB_EXT: |
||
173 | if (ctx->Extensions.EXT_texture_env_combine || |
||
174 | ctx->Extensions.ARB_texture_env_combine) { |
||
175 | const GLenum mode = (GLenum) (GLint) *param; |
||
176 | switch (mode) { |
||
177 | case GL_REPLACE: |
||
178 | case GL_MODULATE: |
||
179 | case GL_ADD: |
||
180 | case GL_ADD_SIGNED_EXT: |
||
181 | case GL_INTERPOLATE_EXT: |
||
182 | /* OK */ |
||
183 | break; |
||
184 | case GL_SUBTRACT_ARB: |
||
185 | if (!ctx->Extensions.ARB_texture_env_combine) { |
||
186 | TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode); |
||
187 | return; |
||
188 | } |
||
189 | break; |
||
190 | case GL_DOT3_RGB_EXT: |
||
191 | case GL_DOT3_RGBA_EXT: |
||
192 | if (!ctx->Extensions.EXT_texture_env_dot3) { |
||
193 | TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode); |
||
194 | return; |
||
195 | } |
||
196 | break; |
||
197 | case GL_DOT3_RGB_ARB: |
||
198 | case GL_DOT3_RGBA_ARB: |
||
199 | if (!ctx->Extensions.ARB_texture_env_dot3) { |
||
200 | TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode); |
||
201 | return; |
||
202 | } |
||
203 | break; |
||
204 | default: |
||
205 | TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode); |
||
206 | return; |
||
207 | } |
||
208 | if (texUnit->CombineModeRGB == mode) |
||
209 | return; |
||
210 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
211 | texUnit->CombineModeRGB = mode; |
||
212 | } |
||
213 | else { |
||
214 | TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname); |
||
215 | return; |
||
216 | } |
||
217 | break; |
||
218 | case GL_COMBINE_ALPHA_EXT: |
||
219 | if (ctx->Extensions.EXT_texture_env_combine || |
||
220 | ctx->Extensions.ARB_texture_env_combine) { |
||
221 | const GLenum mode = (GLenum) (GLint) *param; |
||
222 | if (mode == GL_REPLACE || |
||
223 | mode == GL_MODULATE || |
||
224 | mode == GL_ADD || |
||
225 | mode == GL_ADD_SIGNED_EXT || |
||
226 | mode == GL_INTERPOLATE_EXT || |
||
227 | (mode == GL_SUBTRACT_ARB && |
||
228 | ctx->Extensions.ARB_texture_env_combine)) { |
||
229 | /* legal */ |
||
230 | if (texUnit->CombineModeA == mode) |
||
231 | return; |
||
232 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
233 | texUnit->CombineModeA = mode; |
||
234 | } |
||
235 | else { |
||
236 | TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode); |
||
237 | return; |
||
238 | } |
||
239 | } |
||
240 | else { |
||
241 | TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname); |
||
242 | return; |
||
243 | } |
||
244 | break; |
||
245 | case GL_SOURCE0_RGB_EXT: |
||
246 | case GL_SOURCE1_RGB_EXT: |
||
247 | case GL_SOURCE2_RGB_EXT: |
||
248 | if (ctx->Extensions.EXT_texture_env_combine || |
||
249 | ctx->Extensions.ARB_texture_env_combine) { |
||
250 | const GLenum source = (GLenum) (GLint) *param; |
||
251 | const GLuint s = pname - GL_SOURCE0_RGB_EXT; |
||
252 | if (source == GL_TEXTURE || |
||
253 | source == GL_CONSTANT_EXT || |
||
254 | source == GL_PRIMARY_COLOR_EXT || |
||
255 | source == GL_PREVIOUS_EXT || |
||
256 | (ctx->Extensions.ARB_texture_env_crossbar && |
||
257 | source >= GL_TEXTURE0_ARB && |
||
258 | source < GL_TEXTURE0_ARB + ctx->Const.MaxTextureUnits)) { |
||
259 | /* legal */ |
||
260 | if (texUnit->CombineSourceRGB[s] == source) |
||
261 | return; |
||
262 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
263 | texUnit->CombineSourceRGB[s] = source; |
||
264 | } |
||
265 | else { |
||
266 | TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", source); |
||
267 | return; |
||
268 | } |
||
269 | } |
||
270 | else { |
||
271 | TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname); |
||
272 | return; |
||
273 | } |
||
274 | break; |
||
275 | case GL_SOURCE0_ALPHA_EXT: |
||
276 | case GL_SOURCE1_ALPHA_EXT: |
||
277 | case GL_SOURCE2_ALPHA_EXT: |
||
278 | if (ctx->Extensions.EXT_texture_env_combine || |
||
279 | ctx->Extensions.ARB_texture_env_combine) { |
||
280 | const GLenum source = (GLenum) (GLint) *param; |
||
281 | const GLuint s = pname - GL_SOURCE0_ALPHA_EXT; |
||
282 | if (source == GL_TEXTURE || |
||
283 | source == GL_CONSTANT_EXT || |
||
284 | source == GL_PRIMARY_COLOR_EXT || |
||
285 | source == GL_PREVIOUS_EXT || |
||
286 | (ctx->Extensions.ARB_texture_env_crossbar && |
||
287 | source >= GL_TEXTURE0_ARB && |
||
288 | source < GL_TEXTURE0_ARB + ctx->Const.MaxTextureUnits)) { |
||
289 | /* legal */ |
||
290 | if (texUnit->CombineSourceA[s] == source) |
||
291 | return; |
||
292 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
293 | texUnit->CombineSourceA[s] = source; |
||
294 | } |
||
295 | else { |
||
296 | TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", source); |
||
297 | return; |
||
298 | } |
||
299 | } |
||
300 | else { |
||
301 | TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname); |
||
302 | return; |
||
303 | } |
||
304 | break; |
||
305 | case GL_OPERAND0_RGB_EXT: |
||
306 | case GL_OPERAND1_RGB_EXT: |
||
307 | if (ctx->Extensions.EXT_texture_env_combine || |
||
308 | ctx->Extensions.ARB_texture_env_combine) { |
||
309 | const GLenum operand = (GLenum) (GLint) *param; |
||
310 | const GLuint s = pname - GL_OPERAND0_RGB_EXT; |
||
311 | switch (operand) { |
||
312 | case GL_SRC_COLOR: |
||
313 | case GL_ONE_MINUS_SRC_COLOR: |
||
314 | case GL_SRC_ALPHA: |
||
315 | case GL_ONE_MINUS_SRC_ALPHA: |
||
316 | if (texUnit->CombineOperandRGB[s] == operand) |
||
317 | return; |
||
318 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
319 | texUnit->CombineOperandRGB[s] = operand; |
||
320 | break; |
||
321 | default: |
||
322 | TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", operand); |
||
323 | return; |
||
324 | } |
||
325 | } |
||
326 | else { |
||
327 | TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname); |
||
328 | return; |
||
329 | } |
||
330 | break; |
||
331 | case GL_OPERAND0_ALPHA_EXT: |
||
332 | case GL_OPERAND1_ALPHA_EXT: |
||
333 | if (ctx->Extensions.EXT_texture_env_combine || |
||
334 | ctx->Extensions.ARB_texture_env_combine) { |
||
335 | const GLenum operand = (GLenum) (GLint) *param; |
||
336 | switch (operand) { |
||
337 | case GL_SRC_ALPHA: |
||
338 | case GL_ONE_MINUS_SRC_ALPHA: |
||
339 | if (texUnit->CombineOperandA[pname-GL_OPERAND0_ALPHA_EXT] == |
||
340 | operand) |
||
341 | return; |
||
342 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
343 | texUnit->CombineOperandA[pname-GL_OPERAND0_ALPHA_EXT] = operand; |
||
344 | break; |
||
345 | default: |
||
346 | TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", operand); |
||
347 | return; |
||
348 | } |
||
349 | } |
||
350 | else { |
||
351 | TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname); |
||
352 | return; |
||
353 | } |
||
354 | break; |
||
355 | case GL_OPERAND2_RGB_EXT: |
||
356 | if (ctx->Extensions.EXT_texture_env_combine || |
||
357 | ctx->Extensions.ARB_texture_env_combine) { |
||
358 | const GLenum operand = (GLenum) (GLint) *param; |
||
359 | switch (operand) { |
||
360 | case GL_SRC_COLOR: /* ARB combine only */ |
||
361 | case GL_ONE_MINUS_SRC_COLOR: /* ARB combine only */ |
||
362 | case GL_SRC_ALPHA: |
||
363 | case GL_ONE_MINUS_SRC_ALPHA: /* ARB combine only */ |
||
364 | if (texUnit->CombineOperandRGB[2] == operand) |
||
365 | return; |
||
366 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
367 | texUnit->CombineOperandRGB[2] = operand; |
||
368 | default: |
||
369 | TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", operand); |
||
370 | return; |
||
371 | } |
||
372 | } |
||
373 | else { |
||
374 | TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname); |
||
375 | return; |
||
376 | } |
||
377 | break; |
||
378 | case GL_OPERAND2_ALPHA_EXT: |
||
379 | if (ctx->Extensions.EXT_texture_env_combine || |
||
380 | ctx->Extensions.ARB_texture_env_combine) { |
||
381 | const GLenum operand = (GLenum) (GLint) *param; |
||
382 | switch (operand) { |
||
383 | case GL_SRC_ALPHA: |
||
384 | case GL_ONE_MINUS_SRC_ALPHA: /* ARB combine only */ |
||
385 | if (texUnit->CombineOperandA[2] == operand) |
||
386 | return; |
||
387 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
388 | texUnit->CombineOperandA[2] = operand; |
||
389 | break; |
||
390 | default: |
||
391 | TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", operand); |
||
392 | return; |
||
393 | } |
||
394 | } |
||
395 | else { |
||
396 | TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname); |
||
397 | return; |
||
398 | } |
||
399 | break; |
||
400 | case GL_RGB_SCALE_EXT: |
||
401 | if (ctx->Extensions.EXT_texture_env_combine || |
||
402 | ctx->Extensions.ARB_texture_env_combine) { |
||
403 | GLuint newshift; |
||
404 | if (*param == 1.0) { |
||
405 | newshift = 0; |
||
406 | } |
||
407 | else if (*param == 2.0) { |
||
408 | newshift = 1; |
||
409 | } |
||
410 | else if (*param == 4.0) { |
||
411 | newshift = 2; |
||
412 | } |
||
413 | else { |
||
414 | _mesa_error( ctx, GL_INVALID_VALUE, |
||
415 | "glTexEnv(GL_RGB_SCALE not 1, 2 or 4)" ); |
||
416 | return; |
||
417 | } |
||
418 | if (texUnit->CombineScaleShiftRGB == newshift) |
||
419 | return; |
||
420 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
421 | texUnit->CombineScaleShiftRGB = newshift; |
||
422 | } |
||
423 | else { |
||
424 | TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname); |
||
425 | return; |
||
426 | } |
||
427 | break; |
||
428 | case GL_ALPHA_SCALE: |
||
429 | if (ctx->Extensions.EXT_texture_env_combine || |
||
430 | ctx->Extensions.ARB_texture_env_combine) { |
||
431 | GLuint newshift; |
||
432 | if (*param == 1.0) { |
||
433 | newshift = 0; |
||
434 | } |
||
435 | else if (*param == 2.0) { |
||
436 | newshift = 1; |
||
437 | } |
||
438 | else if (*param == 4.0) { |
||
439 | newshift = 2; |
||
440 | } |
||
441 | else { |
||
442 | _mesa_error( ctx, GL_INVALID_VALUE, |
||
443 | "glTexEnv(GL_ALPHA_SCALE not 1, 2 or 4)" ); |
||
444 | return; |
||
445 | } |
||
446 | if (texUnit->CombineScaleShiftA == newshift) |
||
447 | return; |
||
448 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
449 | texUnit->CombineScaleShiftA = newshift; |
||
450 | } |
||
451 | else { |
||
452 | TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname); |
||
453 | return; |
||
454 | } |
||
455 | break; |
||
456 | default: |
||
457 | _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(pname)" ); |
||
458 | return; |
||
459 | } |
||
460 | } |
||
461 | else if (target == GL_TEXTURE_FILTER_CONTROL_EXT) { |
||
462 | /* GL_EXT_texture_lod_bias */ |
||
463 | if (!ctx->Extensions.EXT_texture_lod_bias) { |
||
464 | _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(target=0x%x)", target ); |
||
465 | return; |
||
466 | } |
||
467 | if (pname == GL_TEXTURE_LOD_BIAS_EXT) { |
||
468 | if (texUnit->LodBias == param[0]) |
||
469 | return; |
||
470 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
471 | texUnit->LodBias = CLAMP(param[0], -ctx->Const.MaxTextureLodBias, |
||
472 | ctx->Const.MaxTextureLodBias); |
||
473 | } |
||
474 | else { |
||
475 | TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname); |
||
476 | return; |
||
477 | } |
||
478 | } |
||
479 | else if (target == GL_POINT_SPRITE_NV) { |
||
480 | /* GL_NV_point_sprite */ |
||
481 | if (!ctx->Extensions.NV_point_sprite) { |
||
482 | _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(target=0x%x)", target ); |
||
483 | return; |
||
484 | } |
||
485 | if (pname == GL_COORD_REPLACE_NV) { |
||
486 | const GLenum value = (GLenum) param[0]; |
||
487 | if (value == GL_TRUE || value == GL_FALSE) { |
||
488 | /* It's kind of weird to set point state via glTexEnv, |
||
489 | * but that's what the spec calls for. |
||
490 | */ |
||
491 | const GLboolean state = (GLboolean) value; |
||
492 | if (ctx->Point.CoordReplace[ctx->Texture.CurrentUnit] == state) |
||
493 | return; |
||
494 | FLUSH_VERTICES(ctx, _NEW_POINT); |
||
495 | ctx->Point.CoordReplace[ctx->Texture.CurrentUnit] = state; |
||
496 | } |
||
497 | else { |
||
498 | _mesa_error( ctx, GL_INVALID_VALUE, "glTexEnv(param=0x%x)", value); |
||
499 | return; |
||
500 | } |
||
501 | } |
||
502 | else { |
||
503 | _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(pname=0x%x)", pname ); |
||
504 | return; |
||
505 | } |
||
506 | } |
||
507 | else { |
||
508 | _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(target=0x%x)",target ); |
||
509 | return; |
||
510 | } |
||
511 | |||
512 | if (MESA_VERBOSE&(VERBOSE_API|VERBOSE_TEXTURE)) |
||
513 | _mesa_debug(ctx, "glTexEnv %s %s %.1f(%s) ...\n", |
||
514 | _mesa_lookup_enum_by_nr(target), |
||
515 | _mesa_lookup_enum_by_nr(pname), |
||
516 | *param, |
||
517 | _mesa_lookup_enum_by_nr((GLenum) (GLint) *param)); |
||
518 | |||
519 | /* Tell device driver about the new texture environment */ |
||
520 | if (ctx->Driver.TexEnv) { |
||
521 | (*ctx->Driver.TexEnv)( ctx, target, pname, param ); |
||
522 | } |
||
523 | } |
||
524 | |||
525 | |||
526 | void |
||
527 | _mesa_TexEnvf( GLenum target, GLenum pname, GLfloat param ) |
||
528 | { |
||
529 | _mesa_TexEnvfv( target, pname, ¶m ); |
||
530 | } |
||
531 | |||
532 | |||
533 | |||
534 | void |
||
535 | _mesa_TexEnvi( GLenum target, GLenum pname, GLint param ) |
||
536 | { |
||
537 | GLfloat p[4]; |
||
538 | p[0] = (GLfloat) param; |
||
539 | p[1] = p[2] = p[3] = 0.0; |
||
540 | _mesa_TexEnvfv( target, pname, p ); |
||
541 | } |
||
542 | |||
543 | |||
544 | void |
||
545 | _mesa_TexEnviv( GLenum target, GLenum pname, const GLint *param ) |
||
546 | { |
||
547 | GLfloat p[4]; |
||
548 | if (pname == GL_TEXTURE_ENV_COLOR) { |
||
549 | p[0] = INT_TO_FLOAT( param[0] ); |
||
550 | p[1] = INT_TO_FLOAT( param[1] ); |
||
551 | p[2] = INT_TO_FLOAT( param[2] ); |
||
552 | p[3] = INT_TO_FLOAT( param[3] ); |
||
553 | } |
||
554 | else { |
||
555 | p[0] = (GLfloat) param[0]; |
||
556 | p[1] = p[2] = p[3] = 0; /* init to zero, just to be safe */ |
||
557 | } |
||
558 | _mesa_TexEnvfv( target, pname, p ); |
||
559 | } |
||
560 | |||
561 | |||
562 | void |
||
563 | _mesa_GetTexEnvfv( GLenum target, GLenum pname, GLfloat *params ) |
||
564 | { |
||
565 | GET_CURRENT_CONTEXT(ctx); |
||
566 | const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; |
||
567 | ASSERT_OUTSIDE_BEGIN_END(ctx); |
||
568 | |||
569 | if (target == GL_TEXTURE_ENV) { |
||
570 | switch (pname) { |
||
571 | case GL_TEXTURE_ENV_MODE: |
||
572 | *params = ENUM_TO_FLOAT(texUnit->EnvMode); |
||
573 | break; |
||
574 | case GL_TEXTURE_ENV_COLOR: |
||
575 | COPY_4FV( params, texUnit->EnvColor ); |
||
576 | break; |
||
577 | case GL_COMBINE_RGB_EXT: |
||
578 | if (ctx->Extensions.EXT_texture_env_combine || |
||
579 | ctx->Extensions.ARB_texture_env_combine) { |
||
580 | *params = (GLfloat) texUnit->CombineModeRGB; |
||
581 | } |
||
582 | else { |
||
583 | _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); |
||
584 | } |
||
585 | break; |
||
586 | case GL_COMBINE_ALPHA_EXT: |
||
587 | if (ctx->Extensions.EXT_texture_env_combine || |
||
588 | ctx->Extensions.ARB_texture_env_combine) { |
||
589 | *params = (GLfloat) texUnit->CombineModeA; |
||
590 | } |
||
591 | else { |
||
592 | _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); |
||
593 | } |
||
594 | break; |
||
595 | case GL_SOURCE0_RGB_EXT: |
||
596 | if (ctx->Extensions.EXT_texture_env_combine || |
||
597 | ctx->Extensions.ARB_texture_env_combine) { |
||
598 | *params = (GLfloat) texUnit->CombineSourceRGB[0]; |
||
599 | } |
||
600 | else { |
||
601 | _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); |
||
602 | } |
||
603 | break; |
||
604 | case GL_SOURCE1_RGB_EXT: |
||
605 | if (ctx->Extensions.EXT_texture_env_combine || |
||
606 | ctx->Extensions.ARB_texture_env_combine) { |
||
607 | *params = (GLfloat) texUnit->CombineSourceRGB[1]; |
||
608 | } |
||
609 | else { |
||
610 | _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); |
||
611 | } |
||
612 | break; |
||
613 | case GL_SOURCE2_RGB_EXT: |
||
614 | if (ctx->Extensions.EXT_texture_env_combine || |
||
615 | ctx->Extensions.ARB_texture_env_combine) { |
||
616 | *params = (GLfloat) texUnit->CombineSourceRGB[2]; |
||
617 | } |
||
618 | else { |
||
619 | _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); |
||
620 | } |
||
621 | break; |
||
622 | case GL_SOURCE0_ALPHA_EXT: |
||
623 | if (ctx->Extensions.EXT_texture_env_combine || |
||
624 | ctx->Extensions.ARB_texture_env_combine) { |
||
625 | *params = (GLfloat) texUnit->CombineSourceA[0]; |
||
626 | } |
||
627 | else { |
||
628 | _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); |
||
629 | } |
||
630 | break; |
||
631 | case GL_SOURCE1_ALPHA_EXT: |
||
632 | if (ctx->Extensions.EXT_texture_env_combine || |
||
633 | ctx->Extensions.ARB_texture_env_combine) { |
||
634 | *params = (GLfloat) texUnit->CombineSourceA[1]; |
||
635 | } |
||
636 | else { |
||
637 | _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); |
||
638 | } |
||
639 | break; |
||
640 | case GL_SOURCE2_ALPHA_EXT: |
||
641 | if (ctx->Extensions.EXT_texture_env_combine || |
||
642 | ctx->Extensions.ARB_texture_env_combine) { |
||
643 | *params = (GLfloat) texUnit->CombineSourceA[2]; |
||
644 | } |
||
645 | else { |
||
646 | _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); |
||
647 | } |
||
648 | break; |
||
649 | case GL_OPERAND0_RGB_EXT: |
||
650 | if (ctx->Extensions.EXT_texture_env_combine || |
||
651 | ctx->Extensions.ARB_texture_env_combine) { |
||
652 | *params = (GLfloat) texUnit->CombineOperandRGB[0]; |
||
653 | } |
||
654 | else { |
||
655 | _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); |
||
656 | } |
||
657 | break; |
||
658 | case GL_OPERAND1_RGB_EXT: |
||
659 | if (ctx->Extensions.EXT_texture_env_combine || |
||
660 | ctx->Extensions.ARB_texture_env_combine) { |
||
661 | *params = (GLfloat) texUnit->CombineOperandRGB[1]; |
||
662 | } |
||
663 | else { |
||
664 | _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); |
||
665 | } |
||
666 | break; |
||
667 | case GL_OPERAND2_RGB_EXT: |
||
668 | if (ctx->Extensions.EXT_texture_env_combine || |
||
669 | ctx->Extensions.ARB_texture_env_combine) { |
||
670 | *params = (GLfloat) texUnit->CombineOperandRGB[2]; |
||
671 | } |
||
672 | else { |
||
673 | _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); |
||
674 | } |
||
675 | break; |
||
676 | case GL_OPERAND0_ALPHA_EXT: |
||
677 | if (ctx->Extensions.EXT_texture_env_combine || |
||
678 | ctx->Extensions.ARB_texture_env_combine) { |
||
679 | *params = (GLfloat) texUnit->CombineOperandA[0]; |
||
680 | } |
||
681 | else { |
||
682 | _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); |
||
683 | } |
||
684 | break; |
||
685 | case GL_OPERAND1_ALPHA_EXT: |
||
686 | if (ctx->Extensions.EXT_texture_env_combine || |
||
687 | ctx->Extensions.ARB_texture_env_combine) { |
||
688 | *params = (GLfloat) texUnit->CombineOperandA[1]; |
||
689 | } |
||
690 | else { |
||
691 | _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); |
||
692 | } |
||
693 | break; |
||
694 | case GL_OPERAND2_ALPHA_EXT: |
||
695 | if (ctx->Extensions.EXT_texture_env_combine || |
||
696 | ctx->Extensions.ARB_texture_env_combine) { |
||
697 | *params = (GLfloat) texUnit->CombineOperandA[2]; |
||
698 | } |
||
699 | else { |
||
700 | _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); |
||
701 | } |
||
702 | break; |
||
703 | case GL_RGB_SCALE_EXT: |
||
704 | if (ctx->Extensions.EXT_texture_env_combine || |
||
705 | ctx->Extensions.ARB_texture_env_combine) { |
||
706 | if (texUnit->CombineScaleShiftRGB == 0) |
||
707 | *params = 1.0; |
||
708 | else if (texUnit->CombineScaleShiftRGB == 1) |
||
709 | *params = 2.0; |
||
710 | else |
||
711 | *params = 4.0; |
||
712 | } |
||
713 | else { |
||
714 | _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); |
||
715 | return; |
||
716 | } |
||
717 | break; |
||
718 | case GL_ALPHA_SCALE: |
||
719 | if (ctx->Extensions.EXT_texture_env_combine || |
||
720 | ctx->Extensions.ARB_texture_env_combine) { |
||
721 | if (texUnit->CombineScaleShiftA == 0) |
||
722 | *params = 1.0; |
||
723 | else if (texUnit->CombineScaleShiftA == 1) |
||
724 | *params = 2.0; |
||
725 | else |
||
726 | *params = 4.0; |
||
727 | } |
||
728 | else { |
||
729 | _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); |
||
730 | return; |
||
731 | } |
||
732 | break; |
||
733 | default: |
||
734 | _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)" ); |
||
735 | } |
||
736 | } |
||
737 | else if (target == GL_TEXTURE_FILTER_CONTROL_EXT) { |
||
738 | /* GL_EXT_texture_lod_bias */ |
||
739 | if (!ctx->Extensions.EXT_texture_lod_bias) { |
||
740 | _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(target)" ); |
||
741 | return; |
||
742 | } |
||
743 | if (pname == GL_TEXTURE_LOD_BIAS_EXT) { |
||
744 | *params = texUnit->LodBias; |
||
745 | } |
||
746 | else { |
||
747 | _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)" ); |
||
748 | return; |
||
749 | } |
||
750 | } |
||
751 | else if (target == GL_POINT_SPRITE_NV) { |
||
752 | /* GL_NV_point_sprite */ |
||
753 | if (!ctx->Extensions.NV_point_sprite) { |
||
754 | _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(target)" ); |
||
755 | return; |
||
756 | } |
||
757 | if (pname == GL_COORD_REPLACE_NV) { |
||
758 | *params = (GLfloat) ctx->Point.CoordReplace[ctx->Texture.CurrentUnit]; |
||
759 | } |
||
760 | else { |
||
761 | _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)" ); |
||
762 | return; |
||
763 | } |
||
764 | } |
||
765 | else { |
||
766 | _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(target)" ); |
||
767 | return; |
||
768 | } |
||
769 | } |
||
770 | |||
771 | |||
772 | void |
||
773 | _mesa_GetTexEnviv( GLenum target, GLenum pname, GLint *params ) |
||
774 | { |
||
775 | GET_CURRENT_CONTEXT(ctx); |
||
776 | const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; |
||
777 | ASSERT_OUTSIDE_BEGIN_END(ctx); |
||
778 | |||
779 | if (target == GL_TEXTURE_ENV) { |
||
780 | switch (pname) { |
||
781 | case GL_TEXTURE_ENV_MODE: |
||
782 | *params = (GLint) texUnit->EnvMode; |
||
783 | break; |
||
784 | case GL_TEXTURE_ENV_COLOR: |
||
785 | params[0] = FLOAT_TO_INT( texUnit->EnvColor[0] ); |
||
786 | params[1] = FLOAT_TO_INT( texUnit->EnvColor[1] ); |
||
787 | params[2] = FLOAT_TO_INT( texUnit->EnvColor[2] ); |
||
788 | params[3] = FLOAT_TO_INT( texUnit->EnvColor[3] ); |
||
789 | break; |
||
790 | case GL_COMBINE_RGB_EXT: |
||
791 | if (ctx->Extensions.EXT_texture_env_combine || |
||
792 | ctx->Extensions.ARB_texture_env_combine) { |
||
793 | *params = (GLint) texUnit->CombineModeRGB; |
||
794 | } |
||
795 | else { |
||
796 | _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)"); |
||
797 | } |
||
798 | break; |
||
799 | case GL_COMBINE_ALPHA_EXT: |
||
800 | if (ctx->Extensions.EXT_texture_env_combine || |
||
801 | ctx->Extensions.ARB_texture_env_combine) { |
||
802 | *params = (GLint) texUnit->CombineModeA; |
||
803 | } |
||
804 | else { |
||
805 | _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)"); |
||
806 | } |
||
807 | break; |
||
808 | case GL_SOURCE0_RGB_EXT: |
||
809 | if (ctx->Extensions.EXT_texture_env_combine || |
||
810 | ctx->Extensions.ARB_texture_env_combine) { |
||
811 | *params = (GLint) texUnit->CombineSourceRGB[0]; |
||
812 | } |
||
813 | else { |
||
814 | _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)"); |
||
815 | } |
||
816 | break; |
||
817 | case GL_SOURCE1_RGB_EXT: |
||
818 | if (ctx->Extensions.EXT_texture_env_combine || |
||
819 | ctx->Extensions.ARB_texture_env_combine) { |
||
820 | *params = (GLint) texUnit->CombineSourceRGB[1]; |
||
821 | } |
||
822 | else { |
||
823 | _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)"); |
||
824 | } |
||
825 | break; |
||
826 | case GL_SOURCE2_RGB_EXT: |
||
827 | if (ctx->Extensions.EXT_texture_env_combine || |
||
828 | ctx->Extensions.ARB_texture_env_combine) { |
||
829 | *params = (GLint) texUnit->CombineSourceRGB[2]; |
||
830 | } |
||
831 | else { |
||
832 | _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)"); |
||
833 | } |
||
834 | break; |
||
835 | case GL_SOURCE0_ALPHA_EXT: |
||
836 | if (ctx->Extensions.EXT_texture_env_combine || |
||
837 | ctx->Extensions.ARB_texture_env_combine) { |
||
838 | *params = (GLint) texUnit->CombineSourceA[0]; |
||
839 | } |
||
840 | else { |
||
841 | _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)"); |
||
842 | } |
||
843 | break; |
||
844 | case GL_SOURCE1_ALPHA_EXT: |
||
845 | if (ctx->Extensions.EXT_texture_env_combine || |
||
846 | ctx->Extensions.ARB_texture_env_combine) { |
||
847 | *params = (GLint) texUnit->CombineSourceA[1]; |
||
848 | } |
||
849 | else { |
||
850 | _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)"); |
||
851 | } |
||
852 | break; |
||
853 | case GL_SOURCE2_ALPHA_EXT: |
||
854 | if (ctx->Extensions.EXT_texture_env_combine || |
||
855 | ctx->Extensions.ARB_texture_env_combine) { |
||
856 | *params = (GLint) texUnit->CombineSourceA[2]; |
||
857 | } |
||
858 | else { |
||
859 | _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)"); |
||
860 | } |
||
861 | break; |
||
862 | case GL_OPERAND0_RGB_EXT: |
||
863 | if (ctx->Extensions.EXT_texture_env_combine || |
||
864 | ctx->Extensions.ARB_texture_env_combine) { |
||
865 | *params = (GLint) texUnit->CombineOperandRGB[0]; |
||
866 | } |
||
867 | else { |
||
868 | _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)"); |
||
869 | } |
||
870 | break; |
||
871 | case GL_OPERAND1_RGB_EXT: |
||
872 | if (ctx->Extensions.EXT_texture_env_combine || |
||
873 | ctx->Extensions.ARB_texture_env_combine) { |
||
874 | *params = (GLint) texUnit->CombineOperandRGB[1]; |
||
875 | } |
||
876 | else { |
||
877 | _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)"); |
||
878 | } |
||
879 | break; |
||
880 | case GL_OPERAND2_RGB_EXT: |
||
881 | if (ctx->Extensions.EXT_texture_env_combine || |
||
882 | ctx->Extensions.ARB_texture_env_combine) { |
||
883 | *params = (GLint) texUnit->CombineOperandRGB[2]; |
||
884 | } |
||
885 | else { |
||
886 | _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)"); |
||
887 | } |
||
888 | break; |
||
889 | case GL_OPERAND0_ALPHA_EXT: |
||
890 | if (ctx->Extensions.EXT_texture_env_combine || |
||
891 | ctx->Extensions.ARB_texture_env_combine) { |
||
892 | *params = (GLint) texUnit->CombineOperandA[0]; |
||
893 | } |
||
894 | else { |
||
895 | _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)"); |
||
896 | } |
||
897 | break; |
||
898 | case GL_OPERAND1_ALPHA_EXT: |
||
899 | if (ctx->Extensions.EXT_texture_env_combine || |
||
900 | ctx->Extensions.ARB_texture_env_combine) { |
||
901 | *params = (GLint) texUnit->CombineOperandA[1]; |
||
902 | } |
||
903 | else { |
||
904 | _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)"); |
||
905 | } |
||
906 | break; |
||
907 | case GL_OPERAND2_ALPHA_EXT: |
||
908 | if (ctx->Extensions.EXT_texture_env_combine || |
||
909 | ctx->Extensions.ARB_texture_env_combine) { |
||
910 | *params = (GLint) texUnit->CombineOperandA[2]; |
||
911 | } |
||
912 | else { |
||
913 | _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)"); |
||
914 | } |
||
915 | break; |
||
916 | case GL_RGB_SCALE_EXT: |
||
917 | if (ctx->Extensions.EXT_texture_env_combine || |
||
918 | ctx->Extensions.ARB_texture_env_combine) { |
||
919 | if (texUnit->CombineScaleShiftRGB == 0) |
||
920 | *params = 1; |
||
921 | else if (texUnit->CombineScaleShiftRGB == 1) |
||
922 | *params = 2; |
||
923 | else |
||
924 | *params = 4; |
||
925 | } |
||
926 | else { |
||
927 | _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)"); |
||
928 | return; |
||
929 | } |
||
930 | break; |
||
931 | case GL_ALPHA_SCALE: |
||
932 | if (ctx->Extensions.EXT_texture_env_combine || |
||
933 | ctx->Extensions.ARB_texture_env_combine) { |
||
934 | if (texUnit->CombineScaleShiftA == 0) |
||
935 | *params = 1; |
||
936 | else if (texUnit->CombineScaleShiftA == 1) |
||
937 | *params = 2; |
||
938 | else |
||
939 | *params = 4; |
||
940 | } |
||
941 | else { |
||
942 | _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)"); |
||
943 | return; |
||
944 | } |
||
945 | break; |
||
946 | default: |
||
947 | _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)" ); |
||
948 | } |
||
949 | } |
||
950 | else if (target == GL_TEXTURE_FILTER_CONTROL_EXT) { |
||
951 | /* GL_EXT_texture_lod_bias */ |
||
952 | if (!ctx->Extensions.EXT_texture_lod_bias) { |
||
953 | _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(target)" ); |
||
954 | return; |
||
955 | } |
||
956 | if (pname == GL_TEXTURE_LOD_BIAS_EXT) { |
||
957 | *params = (GLint) texUnit->LodBias; |
||
958 | } |
||
959 | else { |
||
960 | _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)" ); |
||
961 | return; |
||
962 | } |
||
963 | } |
||
964 | else if (target == GL_POINT_SPRITE_NV) { |
||
965 | /* GL_NV_point_sprite */ |
||
966 | if (!ctx->Extensions.NV_point_sprite) { |
||
967 | _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(target)" ); |
||
968 | return; |
||
969 | } |
||
970 | if (pname == GL_COORD_REPLACE_NV) { |
||
971 | *params = (GLint) ctx->Point.CoordReplace[ctx->Texture.CurrentUnit]; |
||
972 | } |
||
973 | else { |
||
974 | _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)" ); |
||
975 | return; |
||
976 | } |
||
977 | } |
||
978 | else { |
||
979 | _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(target)" ); |
||
980 | return; |
||
981 | } |
||
982 | } |
||
983 | |||
984 | |||
985 | |||
986 | |||
987 | /**********************************************************************/ |
||
988 | /* Texture Parameters */ |
||
989 | /**********************************************************************/ |
||
990 | |||
991 | |||
992 | void |
||
993 | _mesa_TexParameterf( GLenum target, GLenum pname, GLfloat param ) |
||
994 | { |
||
995 | _mesa_TexParameterfv(target, pname, ¶m); |
||
996 | } |
||
997 | |||
998 | |||
999 | void |
||
1000 | _mesa_TexParameterfv( GLenum target, GLenum pname, const GLfloat *params ) |
||
1001 | { |
||
1002 | GET_CURRENT_CONTEXT(ctx); |
||
1003 | struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; |
||
1004 | GLenum eparam = (GLenum) (GLint) params[0]; |
||
1005 | struct gl_texture_object *texObj; |
||
1006 | ASSERT_OUTSIDE_BEGIN_END(ctx); |
||
1007 | |||
1008 | if (MESA_VERBOSE&(VERBOSE_API|VERBOSE_TEXTURE)) |
||
1009 | _mesa_debug(ctx, "texPARAM %s %s %d...\n", |
||
1010 | _mesa_lookup_enum_by_nr(target), |
||
1011 | _mesa_lookup_enum_by_nr(pname), |
||
1012 | eparam); |
||
1013 | |||
1014 | |||
1015 | switch (target) { |
||
1016 | case GL_TEXTURE_1D: |
||
1017 | texObj = texUnit->Current1D; |
||
1018 | break; |
||
1019 | case GL_TEXTURE_2D: |
||
1020 | texObj = texUnit->Current2D; |
||
1021 | break; |
||
1022 | case GL_TEXTURE_3D_EXT: |
||
1023 | texObj = texUnit->Current3D; |
||
1024 | break; |
||
1025 | case GL_TEXTURE_CUBE_MAP_ARB: |
||
1026 | if (!ctx->Extensions.ARB_texture_cube_map) { |
||
1027 | _mesa_error( ctx, GL_INVALID_ENUM, "glTexParameter(target)" ); |
||
1028 | return; |
||
1029 | } |
||
1030 | texObj = texUnit->CurrentCubeMap; |
||
1031 | break; |
||
1032 | case GL_TEXTURE_RECTANGLE_NV: |
||
1033 | if (!ctx->Extensions.NV_texture_rectangle) { |
||
1034 | _mesa_error( ctx, GL_INVALID_ENUM, "glTexParameter(target)" ); |
||
1035 | return; |
||
1036 | } |
||
1037 | texObj = texUnit->CurrentRect; |
||
1038 | break; |
||
1039 | default: |
||
1040 | _mesa_error( ctx, GL_INVALID_ENUM, "glTexParameter(target)" ); |
||
1041 | return; |
||
1042 | } |
||
1043 | |||
1044 | switch (pname) { |
||
1045 | case GL_TEXTURE_MIN_FILTER: |
||
1046 | /* A small optimization */ |
||
1047 | if (texObj->MinFilter == eparam) |
||
1048 | return; |
||
1049 | if (eparam==GL_NEAREST || eparam==GL_LINEAR) { |
||
1050 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
1051 | texObj->MinFilter = eparam; |
||
1052 | } |
||
1053 | else if ((eparam==GL_NEAREST_MIPMAP_NEAREST || |
||
1054 | eparam==GL_LINEAR_MIPMAP_NEAREST || |
||
1055 | eparam==GL_NEAREST_MIPMAP_LINEAR || |
||
1056 | eparam==GL_LINEAR_MIPMAP_LINEAR) && |
||
1057 | texObj->Target != GL_TEXTURE_RECTANGLE_NV) { |
||
1058 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
1059 | texObj->MinFilter = eparam; |
||
1060 | } |
||
1061 | else { |
||
1062 | _mesa_error( ctx, GL_INVALID_VALUE, "glTexParameter(param)" ); |
||
1063 | return; |
||
1064 | } |
||
1065 | break; |
||
1066 | case GL_TEXTURE_MAG_FILTER: |
||
1067 | /* A small optimization */ |
||
1068 | if (texObj->MagFilter == eparam) |
||
1069 | return; |
||
1070 | |||
1071 | if (eparam==GL_NEAREST || eparam==GL_LINEAR) { |
||
1072 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
1073 | texObj->MagFilter = eparam; |
||
1074 | } |
||
1075 | else { |
||
1076 | _mesa_error( ctx, GL_INVALID_VALUE, "glTexParameter(param)" ); |
||
1077 | return; |
||
1078 | } |
||
1079 | break; |
||
1080 | case GL_TEXTURE_WRAP_S: |
||
1081 | if (texObj->WrapS == eparam) |
||
1082 | return; |
||
1083 | if (eparam == GL_CLAMP || eparam == GL_CLAMP_TO_EDGE || |
||
1084 | (eparam == GL_CLAMP_TO_BORDER_ARB && |
||
1085 | ctx->Extensions.ARB_texture_border_clamp)) { |
||
1086 | /* any texture target */ |
||
1087 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
1088 | texObj->WrapS = eparam; |
||
1089 | } |
||
1090 | else if (texObj->Target != GL_TEXTURE_RECTANGLE_NV && |
||
1091 | (eparam == GL_REPEAT || |
||
1092 | (eparam == GL_MIRRORED_REPEAT_ARB && |
||
1093 | ctx->Extensions.ARB_texture_mirrored_repeat) || |
||
1094 | (eparam == GL_MIRROR_CLAMP_ATI && |
||
1095 | ctx->Extensions.ATI_texture_mirror_once) || |
||
1096 | (eparam == GL_MIRROR_CLAMP_TO_EDGE_ATI && |
||
1097 | ctx->Extensions.ATI_texture_mirror_once))) { |
||
1098 | /* non-rectangle texture */ |
||
1099 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
1100 | texObj->WrapS = eparam; |
||
1101 | } |
||
1102 | else { |
||
1103 | _mesa_error( ctx, GL_INVALID_VALUE, "glTexParameter(param)" ); |
||
1104 | return; |
||
1105 | } |
||
1106 | break; |
||
1107 | case GL_TEXTURE_WRAP_T: |
||
1108 | if (texObj->WrapT == eparam) |
||
1109 | return; |
||
1110 | if (eparam == GL_CLAMP || eparam == GL_CLAMP_TO_EDGE || |
||
1111 | (eparam == GL_CLAMP_TO_BORDER_ARB && |
||
1112 | ctx->Extensions.ARB_texture_border_clamp)) { |
||
1113 | /* any texture target */ |
||
1114 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
1115 | texObj->WrapT = eparam; |
||
1116 | } |
||
1117 | else if (texObj->Target != GL_TEXTURE_RECTANGLE_NV && |
||
1118 | (eparam == GL_REPEAT || |
||
1119 | (eparam == GL_MIRRORED_REPEAT_ARB && |
||
1120 | ctx->Extensions.ARB_texture_mirrored_repeat) || |
||
1121 | (eparam == GL_MIRROR_CLAMP_ATI && |
||
1122 | ctx->Extensions.ATI_texture_mirror_once) || |
||
1123 | (eparam == GL_MIRROR_CLAMP_TO_EDGE_ATI && |
||
1124 | ctx->Extensions.ATI_texture_mirror_once))) { |
||
1125 | /* non-rectangle texture */ |
||
1126 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
1127 | texObj->WrapT = eparam; |
||
1128 | } |
||
1129 | else { |
||
1130 | _mesa_error( ctx, GL_INVALID_VALUE, "glTexParameter(param)" ); |
||
1131 | return; |
||
1132 | } |
||
1133 | break; |
||
1134 | case GL_TEXTURE_WRAP_R_EXT: |
||
1135 | if (texObj->WrapR == eparam) |
||
1136 | return; |
||
1137 | if (eparam == GL_CLAMP || eparam == GL_CLAMP_TO_EDGE || |
||
1138 | (eparam == GL_CLAMP_TO_BORDER_ARB && |
||
1139 | ctx->Extensions.ARB_texture_border_clamp)) { |
||
1140 | /* any texture target */ |
||
1141 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
1142 | texObj->WrapR = eparam; |
||
1143 | } |
||
1144 | else if (texObj->Target != GL_TEXTURE_RECTANGLE_NV && |
||
1145 | (eparam == GL_REPEAT || |
||
1146 | (eparam == GL_MIRRORED_REPEAT_ARB && |
||
1147 | ctx->Extensions.ARB_texture_mirrored_repeat) || |
||
1148 | (eparam == GL_MIRROR_CLAMP_ATI && |
||
1149 | ctx->Extensions.ATI_texture_mirror_once) || |
||
1150 | (eparam == GL_MIRROR_CLAMP_TO_EDGE_ATI && |
||
1151 | ctx->Extensions.ATI_texture_mirror_once))) { |
||
1152 | /* non-rectangle texture */ |
||
1153 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
1154 | texObj->WrapR = eparam; |
||
1155 | } |
||
1156 | else { |
||
1157 | _mesa_error( ctx, GL_INVALID_VALUE, "glTexParameter(param)" ); |
||
1158 | } |
||
1159 | break; |
||
1160 | case GL_TEXTURE_BORDER_COLOR: |
||
1161 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
1162 | texObj->BorderColor[RCOMP] = params[0]; |
||
1163 | texObj->BorderColor[GCOMP] = params[1]; |
||
1164 | texObj->BorderColor[BCOMP] = params[2]; |
||
1165 | texObj->BorderColor[ACOMP] = params[3]; |
||
1166 | UNCLAMPED_FLOAT_TO_CHAN(texObj->_BorderChan[RCOMP], params[0]); |
||
1167 | UNCLAMPED_FLOAT_TO_CHAN(texObj->_BorderChan[GCOMP], params[1]); |
||
1168 | UNCLAMPED_FLOAT_TO_CHAN(texObj->_BorderChan[BCOMP], params[2]); |
||
1169 | UNCLAMPED_FLOAT_TO_CHAN(texObj->_BorderChan[ACOMP], params[3]); |
||
1170 | break; |
||
1171 | case GL_TEXTURE_MIN_LOD: |
||
1172 | if (texObj->MinLod == params[0]) |
||
1173 | return; |
||
1174 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
1175 | texObj->MinLod = params[0]; |
||
1176 | break; |
||
1177 | case GL_TEXTURE_MAX_LOD: |
||
1178 | if (texObj->MaxLod == params[0]) |
||
1179 | return; |
||
1180 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
1181 | texObj->MaxLod = params[0]; |
||
1182 | break; |
||
1183 | case GL_TEXTURE_BASE_LEVEL: |
||
1184 | if (params[0] < 0.0) { |
||
1185 | _mesa_error(ctx, GL_INVALID_VALUE, "glTexParameter(param)" ); |
||
1186 | return; |
||
1187 | } |
||
1188 | if (target == GL_TEXTURE_RECTANGLE_NV && params[0] != 0.0) { |
||
1189 | _mesa_error(ctx, GL_INVALID_VALUE, "glTexParameter(param)" ); |
||
1190 | return; |
||
1191 | } |
||
1192 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
1193 | texObj->BaseLevel = (GLint) params[0]; |
||
1194 | break; |
||
1195 | case GL_TEXTURE_MAX_LEVEL: |
||
1196 | if (params[0] < 0.0) { |
||
1197 | _mesa_error(ctx, GL_INVALID_VALUE, "glTexParameter(param)" ); |
||
1198 | return; |
||
1199 | } |
||
1200 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
1201 | texObj->MaxLevel = (GLint) params[0]; |
||
1202 | break; |
||
1203 | case GL_TEXTURE_PRIORITY: |
||
1204 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
1205 | texObj->Priority = CLAMP( params[0], 0.0F, 1.0F ); |
||
1206 | break; |
||
1207 | case GL_TEXTURE_MAX_ANISOTROPY_EXT: |
||
1208 | if (ctx->Extensions.EXT_texture_filter_anisotropic) { |
||
1209 | if (params[0] < 1.0) { |
||
1210 | _mesa_error(ctx, GL_INVALID_VALUE, "glTexParameter(param)" ); |
||
1211 | return; |
||
1212 | } |
||
1213 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
1214 | texObj->MaxAnisotropy = params[0]; |
||
1215 | } |
||
1216 | else { |
||
1217 | _mesa_error(ctx, GL_INVALID_ENUM, |
||
1218 | "glTexParameter(pname=GL_TEXTURE_MAX_ANISOTROPY_EXT)"); |
||
1219 | return; |
||
1220 | } |
||
1221 | break; |
||
1222 | case GL_TEXTURE_COMPARE_SGIX: |
||
1223 | if (ctx->Extensions.SGIX_shadow) { |
||
1224 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
1225 | texObj->CompareFlag = params[0] ? GL_TRUE : GL_FALSE; |
||
1226 | } |
||
1227 | else { |
||
1228 | _mesa_error(ctx, GL_INVALID_ENUM, |
||
1229 | "glTexParameter(pname=GL_TEXTURE_COMPARE_SGIX)"); |
||
1230 | return; |
||
1231 | } |
||
1232 | break; |
||
1233 | case GL_TEXTURE_COMPARE_OPERATOR_SGIX: |
||
1234 | if (ctx->Extensions.SGIX_shadow) { |
||
1235 | GLenum op = (GLenum) params[0]; |
||
1236 | if (op == GL_TEXTURE_LEQUAL_R_SGIX || |
||
1237 | op == GL_TEXTURE_GEQUAL_R_SGIX) { |
||
1238 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
1239 | texObj->CompareOperator = op; |
||
1240 | } |
||
1241 | else { |
||
1242 | _mesa_error(ctx, GL_INVALID_ENUM, "glTexParameter(param)"); |
||
1243 | } |
||
1244 | } |
||
1245 | else { |
||
1246 | _mesa_error(ctx, GL_INVALID_ENUM, |
||
1247 | "glTexParameter(pname=GL_TEXTURE_COMPARE_OPERATOR_SGIX)"); |
||
1248 | return; |
||
1249 | } |
||
1250 | break; |
||
1251 | case GL_SHADOW_AMBIENT_SGIX: /* aka GL_TEXTURE_COMPARE_FAIL_VALUE_ARB */ |
||
1252 | if (ctx->Extensions.SGIX_shadow_ambient) { |
||
1253 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
1254 | texObj->ShadowAmbient = CLAMP(params[0], 0.0F, 1.0F); |
||
1255 | } |
||
1256 | else { |
||
1257 | _mesa_error(ctx, GL_INVALID_ENUM, |
||
1258 | "glTexParameter(pname=GL_SHADOW_AMBIENT_SGIX)"); |
||
1259 | return; |
||
1260 | } |
||
1261 | break; |
||
1262 | case GL_GENERATE_MIPMAP_SGIS: |
||
1263 | if (ctx->Extensions.SGIS_generate_mipmap) { |
||
1264 | texObj->GenerateMipmap = params[0] ? GL_TRUE : GL_FALSE; |
||
1265 | } |
||
1266 | else { |
||
1267 | _mesa_error(ctx, GL_INVALID_ENUM, |
||
1268 | "glTexParameter(pname=GL_GENERATE_MIPMAP_SGIS)"); |
||
1269 | return; |
||
1270 | } |
||
1271 | break; |
||
1272 | case GL_TEXTURE_COMPARE_MODE_ARB: |
||
1273 | if (ctx->Extensions.ARB_shadow) { |
||
1274 | const GLenum mode = (GLenum) params[0]; |
||
1275 | if (mode == GL_NONE || mode == GL_COMPARE_R_TO_TEXTURE_ARB) { |
||
1276 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
1277 | texObj->CompareMode = mode; |
||
1278 | } |
||
1279 | else { |
||
1280 | _mesa_error(ctx, GL_INVALID_ENUM, |
||
1281 | "glTexParameter(bad GL_TEXTURE_COMPARE_MODE_ARB)"); |
||
1282 | return; |
||
1283 | } |
||
1284 | } |
||
1285 | else { |
||
1286 | _mesa_error(ctx, GL_INVALID_ENUM, |
||
1287 | "glTexParameter(pname=GL_TEXTURE_COMPARE_MODE_ARB)"); |
||
1288 | return; |
||
1289 | } |
||
1290 | break; |
||
1291 | case GL_TEXTURE_COMPARE_FUNC_ARB: |
||
1292 | if (ctx->Extensions.ARB_shadow) { |
||
1293 | const GLenum func = (GLenum) params[0]; |
||
1294 | if (func == GL_LEQUAL || func == GL_GEQUAL) { |
||
1295 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
1296 | texObj->CompareFunc = func; |
||
1297 | } |
||
1298 | else if (ctx->Extensions.EXT_shadow_funcs && |
||
1299 | (func == GL_EQUAL || |
||
1300 | func == GL_NOTEQUAL || |
||
1301 | func == GL_LESS || |
||
1302 | func == GL_GREATER || |
||
1303 | func == GL_ALWAYS || |
||
1304 | func == GL_NEVER)) { |
||
1305 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
1306 | texObj->CompareFunc = func; |
||
1307 | } |
||
1308 | else { |
||
1309 | _mesa_error(ctx, GL_INVALID_ENUM, |
||
1310 | "glTexParameter(bad GL_TEXTURE_COMPARE_FUNC_ARB)"); |
||
1311 | return; |
||
1312 | } |
||
1313 | } |
||
1314 | else { |
||
1315 | _mesa_error(ctx, GL_INVALID_ENUM, |
||
1316 | "glTexParameter(pname=GL_TEXTURE_COMPARE_FUNC_ARB)"); |
||
1317 | return; |
||
1318 | } |
||
1319 | break; |
||
1320 | case GL_DEPTH_TEXTURE_MODE_ARB: |
||
1321 | if (ctx->Extensions.ARB_depth_texture) { |
||
1322 | const GLenum result = (GLenum) params[0]; |
||
1323 | if (result == GL_LUMINANCE || result == GL_INTENSITY |
||
1324 | || result == GL_ALPHA) { |
||
1325 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
1326 | texObj->DepthMode = result; |
||
1327 | } |
||
1328 | else { |
||
1329 | _mesa_error(ctx, GL_INVALID_ENUM, |
||
1330 | "glTexParameter(bad GL_DEPTH_TEXTURE_MODE_ARB)"); |
||
1331 | return; |
||
1332 | } |
||
1333 | } |
||
1334 | else { |
||
1335 | _mesa_error(ctx, GL_INVALID_ENUM, |
||
1336 | "glTexParameter(pname=GL_DEPTH_TEXTURE_MODE_ARB)"); |
||
1337 | return; |
||
1338 | } |
||
1339 | break; |
||
1340 | |||
1341 | default: |
||
1342 | _mesa_error(ctx, GL_INVALID_ENUM, |
||
1343 | "glTexParameter(pname=0x%x)", pname); |
||
1344 | return; |
||
1345 | } |
||
1346 | |||
1347 | texObj->Complete = GL_FALSE; |
||
1348 | |||
1349 | if (ctx->Driver.TexParameter) { |
||
1350 | (*ctx->Driver.TexParameter)( ctx, target, texObj, pname, params ); |
||
1351 | } |
||
1352 | } |
||
1353 | |||
1354 | |||
1355 | void |
||
1356 | _mesa_TexParameteri( GLenum target, GLenum pname, GLint param ) |
||
1357 | { |
||
1358 | GLfloat fparam[4]; |
||
1359 | fparam[0] = (GLfloat) param; |
||
1360 | fparam[1] = fparam[2] = fparam[3] = 0.0; |
||
1361 | _mesa_TexParameterfv(target, pname, fparam); |
||
1362 | } |
||
1363 | |||
1364 | |||
1365 | void |
||
1366 | _mesa_TexParameteriv( GLenum target, GLenum pname, const GLint *params ) |
||
1367 | { |
||
1368 | GLfloat fparam[4]; |
||
1369 | if (pname == GL_TEXTURE_BORDER_COLOR) { |
||
1370 | fparam[0] = INT_TO_FLOAT(params[0]); |
||
1371 | fparam[1] = INT_TO_FLOAT(params[1]); |
||
1372 | fparam[2] = INT_TO_FLOAT(params[2]); |
||
1373 | fparam[3] = INT_TO_FLOAT(params[3]); |
||
1374 | } |
||
1375 | else { |
||
1376 | fparam[0] = (GLfloat) params[0]; |
||
1377 | fparam[1] = fparam[2] = fparam[3] = 0.0F; |
||
1378 | } |
||
1379 | _mesa_TexParameterfv(target, pname, fparam); |
||
1380 | } |
||
1381 | |||
1382 | |||
1383 | void |
||
1384 | _mesa_GetTexLevelParameterfv( GLenum target, GLint level, |
||
1385 | GLenum pname, GLfloat *params ) |
||
1386 | { |
||
1387 | GLint iparam; |
||
1388 | _mesa_GetTexLevelParameteriv( target, level, pname, &iparam ); |
||
1389 | *params = (GLfloat) iparam; |
||
1390 | } |
||
1391 | |||
1392 | |||
1393 | static GLuint |
||
1394 | tex_image_dimensions(GLcontext *ctx, GLenum target) |
||
1395 | { |
||
1396 | switch (target) { |
||
1397 | case GL_TEXTURE_1D: |
||
1398 | case GL_PROXY_TEXTURE_1D: |
||
1399 | return 1; |
||
1400 | case GL_TEXTURE_2D: |
||
1401 | case GL_PROXY_TEXTURE_2D: |
||
1402 | return 2; |
||
1403 | case GL_TEXTURE_3D: |
||
1404 | case GL_PROXY_TEXTURE_3D: |
||
1405 | return 3; |
||
1406 | case GL_TEXTURE_CUBE_MAP_ARB: |
||
1407 | case GL_PROXY_TEXTURE_CUBE_MAP_ARB: |
||
1408 | case GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB: |
||
1409 | case GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB: |
||
1410 | case GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB: |
||
1411 | case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB: |
||
1412 | case GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB: |
||
1413 | case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB: |
||
1414 | return ctx->Extensions.ARB_texture_cube_map ? 2 : 0; |
||
1415 | case GL_TEXTURE_RECTANGLE_NV: |
||
1416 | case GL_PROXY_TEXTURE_RECTANGLE_NV: |
||
1417 | return ctx->Extensions.NV_texture_rectangle ? 2 : 0; |
||
1418 | default: |
||
1419 | _mesa_problem(ctx, "bad target in _mesa_tex_target_dimensions()"); |
||
1420 | return 0; |
||
1421 | } |
||
1422 | } |
||
1423 | |||
1424 | |||
1425 | void |
||
1426 | _mesa_GetTexLevelParameteriv( GLenum target, GLint level, |
||
1427 | GLenum pname, GLint *params ) |
||
1428 | { |
||
1429 | GET_CURRENT_CONTEXT(ctx); |
||
1430 | const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; |
||
1431 | const struct gl_texture_image *img = NULL; |
||
1432 | GLuint dimensions; |
||
1433 | GLboolean isProxy; |
||
1434 | GLint maxLevels; |
||
1435 | ASSERT_OUTSIDE_BEGIN_END(ctx); |
||
1436 | |||
1437 | /* this will catch bad target values */ |
||
1438 | dimensions = tex_image_dimensions(ctx, target); /* 1, 2 or 3 */ |
||
1439 | if (dimensions == 0) { |
||
1440 | _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexLevelParameter[if]v(target)"); |
||
1441 | return; |
||
1442 | } |
||
1443 | |||
1444 | switch (target) { |
||
1445 | case GL_TEXTURE_1D: |
||
1446 | case GL_PROXY_TEXTURE_1D: |
||
1447 | case GL_TEXTURE_2D: |
||
1448 | case GL_PROXY_TEXTURE_2D: |
||
1449 | maxLevels = ctx->Const.MaxTextureLevels; |
||
1450 | break; |
||
1451 | case GL_TEXTURE_3D: |
||
1452 | case GL_PROXY_TEXTURE_3D: |
||
1453 | maxLevels = ctx->Const.Max3DTextureLevels; |
||
1454 | break; |
||
1455 | case GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB: |
||
1456 | case GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB: |
||
1457 | case GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB: |
||
1458 | case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB: |
||
1459 | case GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB: |
||
1460 | case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB: |
||
1461 | case GL_PROXY_TEXTURE_CUBE_MAP_ARB: |
||
1462 | maxLevels = ctx->Const.MaxCubeTextureLevels; |
||
1463 | break; |
||
1464 | case GL_TEXTURE_RECTANGLE_NV: |
||
1465 | case GL_PROXY_TEXTURE_RECTANGLE_NV: |
||
1466 | maxLevels = 1; |
||
1467 | break; |
||
1468 | default: |
||
1469 | _mesa_problem(ctx, "switch in _mesa_GetTexLevelParameter"); |
||
1470 | return; |
||
1471 | } |
||
1472 | |||
1473 | if (level < 0 || level >= maxLevels) { |
||
1474 | _mesa_error( ctx, GL_INVALID_VALUE, "glGetTexLevelParameter[if]v" ); |
||
1475 | return; |
||
1476 | } |
||
1477 | |||
1478 | img = _mesa_select_tex_image(ctx, texUnit, target, level); |
||
1479 | if (!img || !img->TexFormat) { |
||
1480 | /* undefined texture image */ |
||
1481 | if (pname == GL_TEXTURE_COMPONENTS) |
||
1482 | *params = 1; |
||
1483 | else |
||
1484 | *params = 0; |
||
1485 | return; |
||
1486 | } |
||
1487 | |||
1488 | isProxy = (target == GL_PROXY_TEXTURE_1D) || |
||
1489 | (target == GL_PROXY_TEXTURE_2D) || |
||
1490 | (target == GL_PROXY_TEXTURE_3D) || |
||
1491 | (target == GL_PROXY_TEXTURE_CUBE_MAP_ARB) || |
||
1492 | (target == GL_PROXY_TEXTURE_RECTANGLE_NV); |
||
1493 | |||
1494 | switch (pname) { |
||
1495 | case GL_TEXTURE_WIDTH: |
||
1496 | *params = img->Width; |
||
1497 | return; |
||
1498 | case GL_TEXTURE_HEIGHT: |
||
1499 | *params = img->Height; |
||
1500 | return; |
||
1501 | case GL_TEXTURE_DEPTH: |
||
1502 | *params = img->Depth; |
||
1503 | return; |
||
1504 | case GL_TEXTURE_INTERNAL_FORMAT: |
||
1505 | *params = img->IntFormat; |
||
1506 | return; |
||
1507 | case GL_TEXTURE_BORDER: |
||
1508 | *params = img->Border; |
||
1509 | return; |
||
1510 | case GL_TEXTURE_RED_SIZE: |
||
1511 | if (img->Format == GL_RGB || img->Format == GL_RGBA) |
||
1512 | *params = img->TexFormat->RedBits; |
||
1513 | else |
||
1514 | *params = 0; |
||
1515 | return; |
||
1516 | case GL_TEXTURE_GREEN_SIZE: |
||
1517 | if (img->Format == GL_RGB || img->Format == GL_RGBA) |
||
1518 | *params = img->TexFormat->GreenBits; |
||
1519 | else |
||
1520 | *params = 0; |
||
1521 | return; |
||
1522 | case GL_TEXTURE_BLUE_SIZE: |
||
1523 | if (img->Format == GL_RGB || img->Format == GL_RGBA) |
||
1524 | *params = img->TexFormat->BlueBits; |
||
1525 | else |
||
1526 | *params = 0; |
||
1527 | return; |
||
1528 | case GL_TEXTURE_ALPHA_SIZE: |
||
1529 | if (img->Format == GL_ALPHA || img->Format == GL_LUMINANCE_ALPHA || |
||
1530 | img->Format == GL_RGBA) |
||
1531 | *params = img->TexFormat->AlphaBits; |
||
1532 | else |
||
1533 | *params = 0; |
||
1534 | return; |
||
1535 | case GL_TEXTURE_INTENSITY_SIZE: |
||
1536 | if (img->Format != GL_INTENSITY) |
||
1537 | *params = 0; |
||
1538 | else if (img->TexFormat->IntensityBits > 0) |
||
1539 | *params = img->TexFormat->IntensityBits; |
||
1540 | else /* intensity probably stored as rgb texture */ |
||
1541 | *params = MIN2(img->TexFormat->RedBits, img->TexFormat->GreenBits); |
||
1542 | return; |
||
1543 | case GL_TEXTURE_LUMINANCE_SIZE: |
||
1544 | if (img->Format != GL_LUMINANCE && |
||
1545 | img->Format != GL_LUMINANCE_ALPHA) |
||
1546 | *params = 0; |
||
1547 | else if (img->TexFormat->LuminanceBits > 0) |
||
1548 | *params = img->TexFormat->LuminanceBits; |
||
1549 | else /* luminance probably stored as rgb texture */ |
||
1550 | *params = MIN2(img->TexFormat->RedBits, img->TexFormat->GreenBits); |
||
1551 | return; |
||
1552 | case GL_TEXTURE_INDEX_SIZE_EXT: |
||
1553 | if (img->Format == GL_COLOR_INDEX) |
||
1554 | *params = img->TexFormat->IndexBits; |
||
1555 | else |
||
1556 | *params = 0; |
||
1557 | return; |
||
1558 | case GL_DEPTH_BITS: |
||
1559 | /* XXX this isn't in the GL_SGIX_depth_texture spec |
||
1560 | * but seems appropriate. |
||
1561 | */ |
||
1562 | if (ctx->Extensions.SGIX_depth_texture) |
||
1563 | *params = img->TexFormat->DepthBits; |
||
1564 | else |
||
1565 | _mesa_error(ctx, GL_INVALID_ENUM, |
||
1566 | "glGetTexLevelParameter[if]v(pname)"); |
||
1567 | return; |
||
1568 | |||
1569 | /* GL_ARB_texture_compression */ |
||
1570 | case GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB: |
||
1571 | if (ctx->Extensions.ARB_texture_compression) { |
||
1572 | if (img->IsCompressed && !isProxy) |
||
1573 | *params = img->CompressedSize; |
||
1574 | else |
||
1575 | _mesa_error(ctx, GL_INVALID_OPERATION, |
||
1576 | "glGetTexLevelParameter[if]v(pname)"); |
||
1577 | } |
||
1578 | else { |
||
1579 | _mesa_error(ctx, GL_INVALID_ENUM, |
||
1580 | "glGetTexLevelParameter[if]v(pname)"); |
||
1581 | } |
||
1582 | return; |
||
1583 | case GL_TEXTURE_COMPRESSED_ARB: |
||
1584 | if (ctx->Extensions.ARB_texture_compression) { |
||
1585 | *params = (GLint) img->IsCompressed; |
||
1586 | } |
||
1587 | else { |
||
1588 | _mesa_error(ctx, GL_INVALID_ENUM, |
||
1589 | "glGetTexLevelParameter[if]v(pname)"); |
||
1590 | } |
||
1591 | return; |
||
1592 | |||
1593 | default: |
||
1594 | _mesa_error(ctx, GL_INVALID_ENUM, |
||
1595 | "glGetTexLevelParameter[if]v(pname)"); |
||
1596 | } |
||
1597 | } |
||
1598 | |||
1599 | |||
1600 | |||
1601 | void |
||
1602 | _mesa_GetTexParameterfv( GLenum target, GLenum pname, GLfloat *params ) |
||
1603 | { |
||
1604 | GET_CURRENT_CONTEXT(ctx); |
||
1605 | struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; |
||
1606 | struct gl_texture_object *obj; |
||
1607 | ASSERT_OUTSIDE_BEGIN_END(ctx); |
||
1608 | |||
1609 | obj = _mesa_select_tex_object(ctx, texUnit, target); |
||
1610 | if (!obj) { |
||
1611 | _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexParameterfv(target)"); |
||
1612 | return; |
||
1613 | } |
||
1614 | |||
1615 | switch (pname) { |
||
1616 | case GL_TEXTURE_MAG_FILTER: |
||
1617 | *params = ENUM_TO_FLOAT(obj->MagFilter); |
||
1618 | return; |
||
1619 | case GL_TEXTURE_MIN_FILTER: |
||
1620 | *params = ENUM_TO_FLOAT(obj->MinFilter); |
||
1621 | return; |
||
1622 | case GL_TEXTURE_WRAP_S: |
||
1623 | *params = ENUM_TO_FLOAT(obj->WrapS); |
||
1624 | return; |
||
1625 | case GL_TEXTURE_WRAP_T: |
||
1626 | *params = ENUM_TO_FLOAT(obj->WrapT); |
||
1627 | return; |
||
1628 | case GL_TEXTURE_WRAP_R_EXT: |
||
1629 | *params = ENUM_TO_FLOAT(obj->WrapR); |
||
1630 | return; |
||
1631 | case GL_TEXTURE_BORDER_COLOR: |
||
1632 | params[0] = CLAMP(obj->BorderColor[0], 0.0F, 1.0F); |
||
1633 | params[1] = CLAMP(obj->BorderColor[1], 0.0F, 1.0F); |
||
1634 | params[2] = CLAMP(obj->BorderColor[2], 0.0F, 1.0F); |
||
1635 | params[3] = CLAMP(obj->BorderColor[3], 0.0F, 1.0F); |
||
1636 | return; |
||
1637 | case GL_TEXTURE_RESIDENT: |
||
1638 | { |
||
1639 | GLboolean resident; |
||
1640 | if (ctx->Driver.IsTextureResident) |
||
1641 | resident = ctx->Driver.IsTextureResident(ctx, obj); |
||
1642 | else |
||
1643 | resident = GL_TRUE; |
||
1644 | *params = ENUM_TO_FLOAT(resident); |
||
1645 | } |
||
1646 | return; |
||
1647 | case GL_TEXTURE_PRIORITY: |
||
1648 | *params = obj->Priority; |
||
1649 | return; |
||
1650 | case GL_TEXTURE_MIN_LOD: |
||
1651 | *params = obj->MinLod; |
||
1652 | return; |
||
1653 | case GL_TEXTURE_MAX_LOD: |
||
1654 | *params = obj->MaxLod; |
||
1655 | return; |
||
1656 | case GL_TEXTURE_BASE_LEVEL: |
||
1657 | *params = (GLfloat) obj->BaseLevel; |
||
1658 | return; |
||
1659 | case GL_TEXTURE_MAX_LEVEL: |
||
1660 | *params = (GLfloat) obj->MaxLevel; |
||
1661 | return; |
||
1662 | case GL_TEXTURE_MAX_ANISOTROPY_EXT: |
||
1663 | if (ctx->Extensions.EXT_texture_filter_anisotropic) { |
||
1664 | *params = obj->MaxAnisotropy; |
||
1665 | return; |
||
1666 | } |
||
1667 | break; |
||
1668 | case GL_TEXTURE_COMPARE_SGIX: |
||
1669 | if (ctx->Extensions.SGIX_shadow) { |
||
1670 | *params = (GLfloat) obj->CompareFlag; |
||
1671 | return; |
||
1672 | } |
||
1673 | break; |
||
1674 | case GL_TEXTURE_COMPARE_OPERATOR_SGIX: |
||
1675 | if (ctx->Extensions.SGIX_shadow) { |
||
1676 | *params = (GLfloat) obj->CompareOperator; |
||
1677 | return; |
||
1678 | } |
||
1679 | break; |
||
1680 | case GL_SHADOW_AMBIENT_SGIX: /* aka GL_TEXTURE_COMPARE_FAIL_VALUE_ARB */ |
||
1681 | if (ctx->Extensions.SGIX_shadow_ambient) { |
||
1682 | *params = obj->ShadowAmbient; |
||
1683 | return; |
||
1684 | } |
||
1685 | break; |
||
1686 | case GL_GENERATE_MIPMAP_SGIS: |
||
1687 | if (ctx->Extensions.SGIS_generate_mipmap) { |
||
1688 | *params = (GLfloat) obj->GenerateMipmap; |
||
1689 | return; |
||
1690 | } |
||
1691 | break; |
||
1692 | case GL_TEXTURE_COMPARE_MODE_ARB: |
||
1693 | if (ctx->Extensions.ARB_shadow) { |
||
1694 | *params = (GLfloat) obj->CompareMode; |
||
1695 | return; |
||
1696 | } |
||
1697 | break; |
||
1698 | case GL_TEXTURE_COMPARE_FUNC_ARB: |
||
1699 | if (ctx->Extensions.ARB_shadow) { |
||
1700 | *params = (GLfloat) obj->CompareFunc; |
||
1701 | return; |
||
1702 | } |
||
1703 | break; |
||
1704 | case GL_DEPTH_TEXTURE_MODE_ARB: |
||
1705 | if (ctx->Extensions.ARB_depth_texture) { |
||
1706 | *params = (GLfloat) obj->DepthMode; |
||
1707 | return; |
||
1708 | } |
||
1709 | break; |
||
1710 | default: |
||
1711 | ; /* silence warnings */ |
||
1712 | } |
||
1713 | /* If we get here, pname was an unrecognized enum */ |
||
1714 | _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexParameterfv(pname)" ); |
||
1715 | } |
||
1716 | |||
1717 | |||
1718 | void |
||
1719 | _mesa_GetTexParameteriv( GLenum target, GLenum pname, GLint *params ) |
||
1720 | { |
||
1721 | GET_CURRENT_CONTEXT(ctx); |
||
1722 | struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; |
||
1723 | struct gl_texture_object *obj; |
||
1724 | ASSERT_OUTSIDE_BEGIN_END(ctx); |
||
1725 | |||
1726 | obj = _mesa_select_tex_object(ctx, texUnit, target); |
||
1727 | if (!obj) { |
||
1728 | _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexParameteriv(target)"); |
||
1729 | return; |
||
1730 | } |
||
1731 | |||
1732 | switch (pname) { |
||
1733 | case GL_TEXTURE_MAG_FILTER: |
||
1734 | *params = (GLint) obj->MagFilter; |
||
1735 | return; |
||
1736 | case GL_TEXTURE_MIN_FILTER: |
||
1737 | *params = (GLint) obj->MinFilter; |
||
1738 | return; |
||
1739 | case GL_TEXTURE_WRAP_S: |
||
1740 | *params = (GLint) obj->WrapS; |
||
1741 | return; |
||
1742 | case GL_TEXTURE_WRAP_T: |
||
1743 | *params = (GLint) obj->WrapT; |
||
1744 | return; |
||
1745 | case GL_TEXTURE_WRAP_R_EXT: |
||
1746 | *params = (GLint) obj->WrapR; |
||
1747 | return; |
||
1748 | case GL_TEXTURE_BORDER_COLOR: |
||
1749 | { |
||
1750 | GLfloat b[4]; |
||
1751 | b[0] = CLAMP(obj->BorderColor[0], 0.0F, 1.0F); |
||
1752 | b[1] = CLAMP(obj->BorderColor[1], 0.0F, 1.0F); |
||
1753 | b[2] = CLAMP(obj->BorderColor[2], 0.0F, 1.0F); |
||
1754 | b[3] = CLAMP(obj->BorderColor[3], 0.0F, 1.0F); |
||
1755 | params[0] = FLOAT_TO_INT(b[0]); |
||
1756 | params[1] = FLOAT_TO_INT(b[1]); |
||
1757 | params[2] = FLOAT_TO_INT(b[2]); |
||
1758 | params[3] = FLOAT_TO_INT(b[3]); |
||
1759 | } |
||
1760 | return; |
||
1761 | case GL_TEXTURE_RESIDENT: |
||
1762 | { |
||
1763 | GLboolean resident; |
||
1764 | if (ctx->Driver.IsTextureResident) |
||
1765 | resident = ctx->Driver.IsTextureResident(ctx, obj); |
||
1766 | else |
||
1767 | resident = GL_TRUE; |
||
1768 | *params = (GLint) resident; |
||
1769 | } |
||
1770 | return; |
||
1771 | case GL_TEXTURE_PRIORITY: |
||
1772 | *params = (GLint) obj->Priority; |
||
1773 | return; |
||
1774 | case GL_TEXTURE_MIN_LOD: |
||
1775 | *params = (GLint) obj->MinLod; |
||
1776 | return; |
||
1777 | case GL_TEXTURE_MAX_LOD: |
||
1778 | *params = (GLint) obj->MaxLod; |
||
1779 | return; |
||
1780 | case GL_TEXTURE_BASE_LEVEL: |
||
1781 | *params = obj->BaseLevel; |
||
1782 | return; |
||
1783 | case GL_TEXTURE_MAX_LEVEL: |
||
1784 | *params = obj->MaxLevel; |
||
1785 | return; |
||
1786 | case GL_TEXTURE_MAX_ANISOTROPY_EXT: |
||
1787 | if (ctx->Extensions.EXT_texture_filter_anisotropic) { |
||
1788 | *params = (GLint) obj->MaxAnisotropy; |
||
1789 | return; |
||
1790 | } |
||
1791 | break; |
||
1792 | case GL_TEXTURE_COMPARE_SGIX: |
||
1793 | if (ctx->Extensions.SGIX_shadow) { |
||
1794 | *params = (GLint) obj->CompareFlag; |
||
1795 | return; |
||
1796 | } |
||
1797 | break; |
||
1798 | case GL_TEXTURE_COMPARE_OPERATOR_SGIX: |
||
1799 | if (ctx->Extensions.SGIX_shadow) { |
||
1800 | *params = (GLint) obj->CompareOperator; |
||
1801 | return; |
||
1802 | } |
||
1803 | break; |
||
1804 | case GL_SHADOW_AMBIENT_SGIX: /* aka GL_TEXTURE_COMPARE_FAIL_VALUE_ARB */ |
||
1805 | if (ctx->Extensions.SGIX_shadow_ambient) { |
||
1806 | *params = (GLint) FLOAT_TO_INT(obj->ShadowAmbient); |
||
1807 | return; |
||
1808 | } |
||
1809 | break; |
||
1810 | case GL_GENERATE_MIPMAP_SGIS: |
||
1811 | if (ctx->Extensions.SGIS_generate_mipmap) { |
||
1812 | *params = (GLint) obj->GenerateMipmap; |
||
1813 | return; |
||
1814 | } |
||
1815 | break; |
||
1816 | case GL_TEXTURE_COMPARE_MODE_ARB: |
||
1817 | if (ctx->Extensions.ARB_shadow) { |
||
1818 | *params = (GLint) obj->CompareMode; |
||
1819 | return; |
||
1820 | } |
||
1821 | break; |
||
1822 | case GL_TEXTURE_COMPARE_FUNC_ARB: |
||
1823 | if (ctx->Extensions.ARB_shadow) { |
||
1824 | *params = (GLint) obj->CompareFunc; |
||
1825 | return; |
||
1826 | } |
||
1827 | break; |
||
1828 | case GL_DEPTH_TEXTURE_MODE_ARB: |
||
1829 | if (ctx->Extensions.ARB_depth_texture) { |
||
1830 | *params = (GLint) obj->DepthMode; |
||
1831 | return; |
||
1832 | } |
||
1833 | break; |
||
1834 | default: |
||
1835 | ; /* silence warnings */ |
||
1836 | } |
||
1837 | /* If we get here, pname was an unrecognized enum */ |
||
1838 | _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexParameteriv(pname)" ); |
||
1839 | } |
||
1840 | |||
1841 | |||
1842 | |||
1843 | |||
1844 | /**********************************************************************/ |
||
1845 | /* Texture Coord Generation */ |
||
1846 | /**********************************************************************/ |
||
1847 | |||
1848 | |||
1849 | void |
||
1850 | _mesa_TexGenfv( GLenum coord, GLenum pname, const GLfloat *params ) |
||
1851 | { |
||
1852 | GET_CURRENT_CONTEXT(ctx); |
||
1853 | GLuint tUnit = ctx->Texture.CurrentUnit; |
||
1854 | struct gl_texture_unit *texUnit = &ctx->Texture.Unit[tUnit]; |
||
1855 | ASSERT_OUTSIDE_BEGIN_END(ctx); |
||
1856 | |||
1857 | if (MESA_VERBOSE&(VERBOSE_API|VERBOSE_TEXTURE)) |
||
1858 | _mesa_debug(ctx, "texGEN %s %s %x...\n", |
||
1859 | _mesa_lookup_enum_by_nr(coord), |
||
1860 | _mesa_lookup_enum_by_nr(pname), |
||
1861 | *(int *)params); |
||
1862 | |||
1863 | switch (coord) { |
||
1864 | case GL_S: |
||
1865 | if (pname==GL_TEXTURE_GEN_MODE) { |
||
1866 | GLenum mode = (GLenum) (GLint) *params; |
||
1867 | GLuint bits; |
||
1868 | switch (mode) { |
||
1869 | case GL_OBJECT_LINEAR: |
||
1870 | bits = TEXGEN_OBJ_LINEAR; |
||
1871 | break; |
||
1872 | case GL_EYE_LINEAR: |
||
1873 | bits = TEXGEN_EYE_LINEAR; |
||
1874 | break; |
||
1875 | case GL_REFLECTION_MAP_NV: |
||
1876 | bits = TEXGEN_REFLECTION_MAP_NV; |
||
1877 | break; |
||
1878 | case GL_NORMAL_MAP_NV: |
||
1879 | bits = TEXGEN_NORMAL_MAP_NV; |
||
1880 | break; |
||
1881 | case GL_SPHERE_MAP: |
||
1882 | bits = TEXGEN_SPHERE_MAP; |
||
1883 | break; |
||
1884 | default: |
||
1885 | _mesa_error( ctx, GL_INVALID_ENUM, "glTexGenfv(param)" ); |
||
1886 | return; |
||
1887 | } |
||
1888 | if (texUnit->GenModeS == mode) |
||
1889 | return; |
||
1890 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
1891 | texUnit->GenModeS = mode; |
||
1892 | texUnit->_GenBitS = bits; |
||
1893 | } |
||
1894 | else if (pname==GL_OBJECT_PLANE) { |
||
1895 | if (TEST_EQ_4V(texUnit->ObjectPlaneS, params)) |
||
1896 | return; |
||
1897 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
1898 | texUnit->ObjectPlaneS[0] = params[0]; |
||
1899 | texUnit->ObjectPlaneS[1] = params[1]; |
||
1900 | texUnit->ObjectPlaneS[2] = params[2]; |
||
1901 | texUnit->ObjectPlaneS[3] = params[3]; |
||
1902 | } |
||
1903 | else if (pname==GL_EYE_PLANE) { |
||
1904 | GLfloat tmp[4]; |
||
1905 | |||
1906 | /* Transform plane equation by the inverse modelview matrix */ |
||
1907 | if (ctx->ModelviewMatrixStack.Top->flags & MAT_DIRTY_INVERSE) { |
||
1908 | _math_matrix_analyse( ctx->ModelviewMatrixStack.Top ); |
||
1909 | } |
||
1910 | _mesa_transform_vector( tmp, params, ctx->ModelviewMatrixStack.Top->inv ); |
||
1911 | if (TEST_EQ_4V(texUnit->EyePlaneS, tmp)) |
||
1912 | return; |
||
1913 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
1914 | COPY_4FV(texUnit->EyePlaneS, tmp); |
||
1915 | } |
||
1916 | else { |
||
1917 | _mesa_error( ctx, GL_INVALID_ENUM, "glTexGenfv(pname)" ); |
||
1918 | return; |
||
1919 | } |
||
1920 | break; |
||
1921 | case GL_T: |
||
1922 | if (pname==GL_TEXTURE_GEN_MODE) { |
||
1923 | GLenum mode = (GLenum) (GLint) *params; |
||
1924 | GLuint bitt; |
||
1925 | switch (mode) { |
||
1926 | case GL_OBJECT_LINEAR: |
||
1927 | bitt = TEXGEN_OBJ_LINEAR; |
||
1928 | break; |
||
1929 | case GL_EYE_LINEAR: |
||
1930 | bitt = TEXGEN_EYE_LINEAR; |
||
1931 | break; |
||
1932 | case GL_REFLECTION_MAP_NV: |
||
1933 | bitt = TEXGEN_REFLECTION_MAP_NV; |
||
1934 | break; |
||
1935 | case GL_NORMAL_MAP_NV: |
||
1936 | bitt = TEXGEN_NORMAL_MAP_NV; |
||
1937 | break; |
||
1938 | case GL_SPHERE_MAP: |
||
1939 | bitt = TEXGEN_SPHERE_MAP; |
||
1940 | break; |
||
1941 | default: |
||
1942 | _mesa_error( ctx, GL_INVALID_ENUM, "glTexGenfv(param)" ); |
||
1943 | return; |
||
1944 | } |
||
1945 | if (texUnit->GenModeT == mode) |
||
1946 | return; |
||
1947 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
1948 | texUnit->GenModeT = mode; |
||
1949 | texUnit->_GenBitT = bitt; |
||
1950 | } |
||
1951 | else if (pname==GL_OBJECT_PLANE) { |
||
1952 | if (TEST_EQ_4V(texUnit->ObjectPlaneT, params)) |
||
1953 | return; |
||
1954 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
1955 | texUnit->ObjectPlaneT[0] = params[0]; |
||
1956 | texUnit->ObjectPlaneT[1] = params[1]; |
||
1957 | texUnit->ObjectPlaneT[2] = params[2]; |
||
1958 | texUnit->ObjectPlaneT[3] = params[3]; |
||
1959 | } |
||
1960 | else if (pname==GL_EYE_PLANE) { |
||
1961 | GLfloat tmp[4]; |
||
1962 | /* Transform plane equation by the inverse modelview matrix */ |
||
1963 | if (ctx->ModelviewMatrixStack.Top->flags & MAT_DIRTY_INVERSE) { |
||
1964 | _math_matrix_analyse( ctx->ModelviewMatrixStack.Top ); |
||
1965 | } |
||
1966 | _mesa_transform_vector( tmp, params, ctx->ModelviewMatrixStack.Top->inv ); |
||
1967 | if (TEST_EQ_4V(texUnit->EyePlaneT, tmp)) |
||
1968 | return; |
||
1969 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
1970 | COPY_4FV(texUnit->EyePlaneT, tmp); |
||
1971 | } |
||
1972 | else { |
||
1973 | _mesa_error( ctx, GL_INVALID_ENUM, "glTexGenfv(pname)" ); |
||
1974 | return; |
||
1975 | } |
||
1976 | break; |
||
1977 | case GL_R: |
||
1978 | if (pname==GL_TEXTURE_GEN_MODE) { |
||
1979 | GLenum mode = (GLenum) (GLint) *params; |
||
1980 | GLuint bitr; |
||
1981 | switch (mode) { |
||
1982 | case GL_OBJECT_LINEAR: |
||
1983 | bitr = TEXGEN_OBJ_LINEAR; |
||
1984 | break; |
||
1985 | case GL_REFLECTION_MAP_NV: |
||
1986 | bitr = TEXGEN_REFLECTION_MAP_NV; |
||
1987 | break; |
||
1988 | case GL_NORMAL_MAP_NV: |
||
1989 | bitr = TEXGEN_NORMAL_MAP_NV; |
||
1990 | break; |
||
1991 | case GL_EYE_LINEAR: |
||
1992 | bitr = TEXGEN_EYE_LINEAR; |
||
1993 | break; |
||
1994 | default: |
||
1995 | _mesa_error( ctx, GL_INVALID_ENUM, "glTexGenfv(param)" ); |
||
1996 | return; |
||
1997 | } |
||
1998 | if (texUnit->GenModeR == mode) |
||
1999 | return; |
||
2000 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
2001 | texUnit->GenModeR = mode; |
||
2002 | texUnit->_GenBitR = bitr; |
||
2003 | } |
||
2004 | else if (pname==GL_OBJECT_PLANE) { |
||
2005 | if (TEST_EQ_4V(texUnit->ObjectPlaneR, params)) |
||
2006 | return; |
||
2007 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
2008 | texUnit->ObjectPlaneR[0] = params[0]; |
||
2009 | texUnit->ObjectPlaneR[1] = params[1]; |
||
2010 | texUnit->ObjectPlaneR[2] = params[2]; |
||
2011 | texUnit->ObjectPlaneR[3] = params[3]; |
||
2012 | } |
||
2013 | else if (pname==GL_EYE_PLANE) { |
||
2014 | GLfloat tmp[4]; |
||
2015 | /* Transform plane equation by the inverse modelview matrix */ |
||
2016 | if (ctx->ModelviewMatrixStack.Top->flags & MAT_DIRTY_INVERSE) { |
||
2017 | _math_matrix_analyse( ctx->ModelviewMatrixStack.Top ); |
||
2018 | } |
||
2019 | _mesa_transform_vector( tmp, params, ctx->ModelviewMatrixStack.Top->inv ); |
||
2020 | if (TEST_EQ_4V(texUnit->EyePlaneR, tmp)) |
||
2021 | return; |
||
2022 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
2023 | COPY_4FV(texUnit->EyePlaneR, tmp); |
||
2024 | } |
||
2025 | else { |
||
2026 | _mesa_error( ctx, GL_INVALID_ENUM, "glTexGenfv(pname)" ); |
||
2027 | return; |
||
2028 | } |
||
2029 | break; |
||
2030 | case GL_Q: |
||
2031 | if (pname==GL_TEXTURE_GEN_MODE) { |
||
2032 | GLenum mode = (GLenum) (GLint) *params; |
||
2033 | GLuint bitq; |
||
2034 | switch (mode) { |
||
2035 | case GL_OBJECT_LINEAR: |
||
2036 | bitq = TEXGEN_OBJ_LINEAR; |
||
2037 | break; |
||
2038 | case GL_EYE_LINEAR: |
||
2039 | bitq = TEXGEN_EYE_LINEAR; |
||
2040 | break; |
||
2041 | default: |
||
2042 | _mesa_error( ctx, GL_INVALID_ENUM, "glTexGenfv(param)" ); |
||
2043 | return; |
||
2044 | } |
||
2045 | if (texUnit->GenModeQ == mode) |
||
2046 | return; |
||
2047 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
2048 | texUnit->GenModeQ = mode; |
||
2049 | texUnit->_GenBitQ = bitq; |
||
2050 | } |
||
2051 | else if (pname==GL_OBJECT_PLANE) { |
||
2052 | if (TEST_EQ_4V(texUnit->ObjectPlaneQ, params)) |
||
2053 | return; |
||
2054 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
2055 | texUnit->ObjectPlaneQ[0] = params[0]; |
||
2056 | texUnit->ObjectPlaneQ[1] = params[1]; |
||
2057 | texUnit->ObjectPlaneQ[2] = params[2]; |
||
2058 | texUnit->ObjectPlaneQ[3] = params[3]; |
||
2059 | } |
||
2060 | else if (pname==GL_EYE_PLANE) { |
||
2061 | GLfloat tmp[4]; |
||
2062 | /* Transform plane equation by the inverse modelview matrix */ |
||
2063 | if (ctx->ModelviewMatrixStack.Top->flags & MAT_DIRTY_INVERSE) { |
||
2064 | _math_matrix_analyse( ctx->ModelviewMatrixStack.Top ); |
||
2065 | } |
||
2066 | _mesa_transform_vector( tmp, params, ctx->ModelviewMatrixStack.Top->inv ); |
||
2067 | if (TEST_EQ_4V(texUnit->EyePlaneQ, tmp)) |
||
2068 | return; |
||
2069 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
2070 | COPY_4FV(texUnit->EyePlaneQ, tmp); |
||
2071 | } |
||
2072 | else { |
||
2073 | _mesa_error( ctx, GL_INVALID_ENUM, "glTexGenfv(pname)" ); |
||
2074 | return; |
||
2075 | } |
||
2076 | break; |
||
2077 | default: |
||
2078 | _mesa_error( ctx, GL_INVALID_ENUM, "glTexGenfv(coord)" ); |
||
2079 | return; |
||
2080 | } |
||
2081 | |||
2082 | if (ctx->Driver.TexGen) |
||
2083 | ctx->Driver.TexGen( ctx, coord, pname, params ); |
||
2084 | } |
||
2085 | |||
2086 | |||
2087 | void |
||
2088 | _mesa_TexGeniv(GLenum coord, GLenum pname, const GLint *params ) |
||
2089 | { |
||
2090 | GLfloat p[4]; |
||
2091 | p[0] = (GLfloat) params[0]; |
||
2092 | p[1] = (GLfloat) params[1]; |
||
2093 | p[2] = (GLfloat) params[2]; |
||
2094 | p[3] = (GLfloat) params[3]; |
||
2095 | _mesa_TexGenfv(coord, pname, p); |
||
2096 | } |
||
2097 | |||
2098 | |||
2099 | void |
||
2100 | _mesa_TexGend(GLenum coord, GLenum pname, GLdouble param ) |
||
2101 | { |
||
2102 | GLfloat p = (GLfloat) param; |
||
2103 | _mesa_TexGenfv( coord, pname, &p ); |
||
2104 | } |
||
2105 | |||
2106 | |||
2107 | void |
||
2108 | _mesa_TexGendv(GLenum coord, GLenum pname, const GLdouble *params ) |
||
2109 | { |
||
2110 | GLfloat p[4]; |
||
2111 | p[0] = (GLfloat) params[0]; |
||
2112 | p[1] = (GLfloat) params[1]; |
||
2113 | p[2] = (GLfloat) params[2]; |
||
2114 | p[3] = (GLfloat) params[3]; |
||
2115 | _mesa_TexGenfv( coord, pname, p ); |
||
2116 | } |
||
2117 | |||
2118 | |||
2119 | void |
||
2120 | _mesa_TexGenf( GLenum coord, GLenum pname, GLfloat param ) |
||
2121 | { |
||
2122 | _mesa_TexGenfv(coord, pname, ¶m); |
||
2123 | } |
||
2124 | |||
2125 | |||
2126 | void |
||
2127 | _mesa_TexGeni( GLenum coord, GLenum pname, GLint param ) |
||
2128 | { |
||
2129 | _mesa_TexGeniv( coord, pname, ¶m ); |
||
2130 | } |
||
2131 | |||
2132 | |||
2133 | |||
2134 | void |
||
2135 | _mesa_GetTexGendv( GLenum coord, GLenum pname, GLdouble *params ) |
||
2136 | { |
||
2137 | GET_CURRENT_CONTEXT(ctx); |
||
2138 | GLuint tUnit = ctx->Texture.CurrentUnit; |
||
2139 | struct gl_texture_unit *texUnit = &ctx->Texture.Unit[tUnit]; |
||
2140 | ASSERT_OUTSIDE_BEGIN_END(ctx); |
||
2141 | |||
2142 | switch (coord) { |
||
2143 | case GL_S: |
||
2144 | if (pname==GL_TEXTURE_GEN_MODE) { |
||
2145 | params[0] = ENUM_TO_DOUBLE(texUnit->GenModeS); |
||
2146 | } |
||
2147 | else if (pname==GL_OBJECT_PLANE) { |
||
2148 | COPY_4V( params, texUnit->ObjectPlaneS ); |
||
2149 | } |
||
2150 | else if (pname==GL_EYE_PLANE) { |
||
2151 | COPY_4V( params, texUnit->EyePlaneS ); |
||
2152 | } |
||
2153 | else { |
||
2154 | _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGendv(pname)" ); |
||
2155 | return; |
||
2156 | } |
||
2157 | break; |
||
2158 | case GL_T: |
||
2159 | if (pname==GL_TEXTURE_GEN_MODE) { |
||
2160 | params[0] = ENUM_TO_DOUBLE(texUnit->GenModeT); |
||
2161 | } |
||
2162 | else if (pname==GL_OBJECT_PLANE) { |
||
2163 | COPY_4V( params, texUnit->ObjectPlaneT ); |
||
2164 | } |
||
2165 | else if (pname==GL_EYE_PLANE) { |
||
2166 | COPY_4V( params, texUnit->EyePlaneT ); |
||
2167 | } |
||
2168 | else { |
||
2169 | _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGendv(pname)" ); |
||
2170 | return; |
||
2171 | } |
||
2172 | break; |
||
2173 | case GL_R: |
||
2174 | if (pname==GL_TEXTURE_GEN_MODE) { |
||
2175 | params[0] = ENUM_TO_DOUBLE(texUnit->GenModeR); |
||
2176 | } |
||
2177 | else if (pname==GL_OBJECT_PLANE) { |
||
2178 | COPY_4V( params, texUnit->ObjectPlaneR ); |
||
2179 | } |
||
2180 | else if (pname==GL_EYE_PLANE) { |
||
2181 | COPY_4V( params, texUnit->EyePlaneR ); |
||
2182 | } |
||
2183 | else { |
||
2184 | _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGendv(pname)" ); |
||
2185 | return; |
||
2186 | } |
||
2187 | break; |
||
2188 | case GL_Q: |
||
2189 | if (pname==GL_TEXTURE_GEN_MODE) { |
||
2190 | params[0] = ENUM_TO_DOUBLE(texUnit->GenModeQ); |
||
2191 | } |
||
2192 | else if (pname==GL_OBJECT_PLANE) { |
||
2193 | COPY_4V( params, texUnit->ObjectPlaneQ ); |
||
2194 | } |
||
2195 | else if (pname==GL_EYE_PLANE) { |
||
2196 | COPY_4V( params, texUnit->EyePlaneQ ); |
||
2197 | } |
||
2198 | else { |
||
2199 | _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGendv(pname)" ); |
||
2200 | return; |
||
2201 | } |
||
2202 | break; |
||
2203 | default: |
||
2204 | _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGendv(coord)" ); |
||
2205 | return; |
||
2206 | } |
||
2207 | } |
||
2208 | |||
2209 | |||
2210 | |||
2211 | void |
||
2212 | _mesa_GetTexGenfv( GLenum coord, GLenum pname, GLfloat *params ) |
||
2213 | { |
||
2214 | GET_CURRENT_CONTEXT(ctx); |
||
2215 | GLuint tUnit = ctx->Texture.CurrentUnit; |
||
2216 | struct gl_texture_unit *texUnit = &ctx->Texture.Unit[tUnit]; |
||
2217 | ASSERT_OUTSIDE_BEGIN_END(ctx); |
||
2218 | |||
2219 | switch (coord) { |
||
2220 | case GL_S: |
||
2221 | if (pname==GL_TEXTURE_GEN_MODE) { |
||
2222 | params[0] = ENUM_TO_FLOAT(texUnit->GenModeS); |
||
2223 | } |
||
2224 | else if (pname==GL_OBJECT_PLANE) { |
||
2225 | COPY_4V( params, texUnit->ObjectPlaneS ); |
||
2226 | } |
||
2227 | else if (pname==GL_EYE_PLANE) { |
||
2228 | COPY_4V( params, texUnit->EyePlaneS ); |
||
2229 | } |
||
2230 | else { |
||
2231 | _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGenfv(pname)" ); |
||
2232 | return; |
||
2233 | } |
||
2234 | break; |
||
2235 | case GL_T: |
||
2236 | if (pname==GL_TEXTURE_GEN_MODE) { |
||
2237 | params[0] = ENUM_TO_FLOAT(texUnit->GenModeT); |
||
2238 | } |
||
2239 | else if (pname==GL_OBJECT_PLANE) { |
||
2240 | COPY_4V( params, texUnit->ObjectPlaneT ); |
||
2241 | } |
||
2242 | else if (pname==GL_EYE_PLANE) { |
||
2243 | COPY_4V( params, texUnit->EyePlaneT ); |
||
2244 | } |
||
2245 | else { |
||
2246 | _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGenfv(pname)" ); |
||
2247 | return; |
||
2248 | } |
||
2249 | break; |
||
2250 | case GL_R: |
||
2251 | if (pname==GL_TEXTURE_GEN_MODE) { |
||
2252 | params[0] = ENUM_TO_FLOAT(texUnit->GenModeR); |
||
2253 | } |
||
2254 | else if (pname==GL_OBJECT_PLANE) { |
||
2255 | COPY_4V( params, texUnit->ObjectPlaneR ); |
||
2256 | } |
||
2257 | else if (pname==GL_EYE_PLANE) { |
||
2258 | COPY_4V( params, texUnit->EyePlaneR ); |
||
2259 | } |
||
2260 | else { |
||
2261 | _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGenfv(pname)" ); |
||
2262 | return; |
||
2263 | } |
||
2264 | break; |
||
2265 | case GL_Q: |
||
2266 | if (pname==GL_TEXTURE_GEN_MODE) { |
||
2267 | params[0] = ENUM_TO_FLOAT(texUnit->GenModeQ); |
||
2268 | } |
||
2269 | else if (pname==GL_OBJECT_PLANE) { |
||
2270 | COPY_4V( params, texUnit->ObjectPlaneQ ); |
||
2271 | } |
||
2272 | else if (pname==GL_EYE_PLANE) { |
||
2273 | COPY_4V( params, texUnit->EyePlaneQ ); |
||
2274 | } |
||
2275 | else { |
||
2276 | _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGenfv(pname)" ); |
||
2277 | return; |
||
2278 | } |
||
2279 | break; |
||
2280 | default: |
||
2281 | _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGenfv(coord)" ); |
||
2282 | return; |
||
2283 | } |
||
2284 | } |
||
2285 | |||
2286 | |||
2287 | |||
2288 | void |
||
2289 | _mesa_GetTexGeniv( GLenum coord, GLenum pname, GLint *params ) |
||
2290 | { |
||
2291 | GET_CURRENT_CONTEXT(ctx); |
||
2292 | GLuint tUnit = ctx->Texture.CurrentUnit; |
||
2293 | struct gl_texture_unit *texUnit = &ctx->Texture.Unit[tUnit]; |
||
2294 | ASSERT_OUTSIDE_BEGIN_END(ctx); |
||
2295 | |||
2296 | switch (coord) { |
||
2297 | case GL_S: |
||
2298 | if (pname==GL_TEXTURE_GEN_MODE) { |
||
2299 | params[0] = texUnit->GenModeS; |
||
2300 | } |
||
2301 | else if (pname==GL_OBJECT_PLANE) { |
||
2302 | params[0] = (GLint) texUnit->ObjectPlaneS[0]; |
||
2303 | params[1] = (GLint) texUnit->ObjectPlaneS[1]; |
||
2304 | params[2] = (GLint) texUnit->ObjectPlaneS[2]; |
||
2305 | params[3] = (GLint) texUnit->ObjectPlaneS[3]; |
||
2306 | } |
||
2307 | else if (pname==GL_EYE_PLANE) { |
||
2308 | params[0] = (GLint) texUnit->EyePlaneS[0]; |
||
2309 | params[1] = (GLint) texUnit->EyePlaneS[1]; |
||
2310 | params[2] = (GLint) texUnit->EyePlaneS[2]; |
||
2311 | params[3] = (GLint) texUnit->EyePlaneS[3]; |
||
2312 | } |
||
2313 | else { |
||
2314 | _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGeniv(pname)" ); |
||
2315 | return; |
||
2316 | } |
||
2317 | break; |
||
2318 | case GL_T: |
||
2319 | if (pname==GL_TEXTURE_GEN_MODE) { |
||
2320 | params[0] = texUnit->GenModeT; |
||
2321 | } |
||
2322 | else if (pname==GL_OBJECT_PLANE) { |
||
2323 | params[0] = (GLint) texUnit->ObjectPlaneT[0]; |
||
2324 | params[1] = (GLint) texUnit->ObjectPlaneT[1]; |
||
2325 | params[2] = (GLint) texUnit->ObjectPlaneT[2]; |
||
2326 | params[3] = (GLint) texUnit->ObjectPlaneT[3]; |
||
2327 | } |
||
2328 | else if (pname==GL_EYE_PLANE) { |
||
2329 | params[0] = (GLint) texUnit->EyePlaneT[0]; |
||
2330 | params[1] = (GLint) texUnit->EyePlaneT[1]; |
||
2331 | params[2] = (GLint) texUnit->EyePlaneT[2]; |
||
2332 | params[3] = (GLint) texUnit->EyePlaneT[3]; |
||
2333 | } |
||
2334 | else { |
||
2335 | _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGeniv(pname)" ); |
||
2336 | return; |
||
2337 | } |
||
2338 | break; |
||
2339 | case GL_R: |
||
2340 | if (pname==GL_TEXTURE_GEN_MODE) { |
||
2341 | params[0] = texUnit->GenModeR; |
||
2342 | } |
||
2343 | else if (pname==GL_OBJECT_PLANE) { |
||
2344 | params[0] = (GLint) texUnit->ObjectPlaneR[0]; |
||
2345 | params[1] = (GLint) texUnit->ObjectPlaneR[1]; |
||
2346 | params[2] = (GLint) texUnit->ObjectPlaneR[2]; |
||
2347 | params[3] = (GLint) texUnit->ObjectPlaneR[3]; |
||
2348 | } |
||
2349 | else if (pname==GL_EYE_PLANE) { |
||
2350 | params[0] = (GLint) texUnit->EyePlaneR[0]; |
||
2351 | params[1] = (GLint) texUnit->EyePlaneR[1]; |
||
2352 | params[2] = (GLint) texUnit->EyePlaneR[2]; |
||
2353 | params[3] = (GLint) texUnit->EyePlaneR[3]; |
||
2354 | } |
||
2355 | else { |
||
2356 | _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGeniv(pname)" ); |
||
2357 | return; |
||
2358 | } |
||
2359 | break; |
||
2360 | case GL_Q: |
||
2361 | if (pname==GL_TEXTURE_GEN_MODE) { |
||
2362 | params[0] = texUnit->GenModeQ; |
||
2363 | } |
||
2364 | else if (pname==GL_OBJECT_PLANE) { |
||
2365 | params[0] = (GLint) texUnit->ObjectPlaneQ[0]; |
||
2366 | params[1] = (GLint) texUnit->ObjectPlaneQ[1]; |
||
2367 | params[2] = (GLint) texUnit->ObjectPlaneQ[2]; |
||
2368 | params[3] = (GLint) texUnit->ObjectPlaneQ[3]; |
||
2369 | } |
||
2370 | else if (pname==GL_EYE_PLANE) { |
||
2371 | params[0] = (GLint) texUnit->EyePlaneQ[0]; |
||
2372 | params[1] = (GLint) texUnit->EyePlaneQ[1]; |
||
2373 | params[2] = (GLint) texUnit->EyePlaneQ[2]; |
||
2374 | params[3] = (GLint) texUnit->EyePlaneQ[3]; |
||
2375 | } |
||
2376 | else { |
||
2377 | _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGeniv(pname)" ); |
||
2378 | return; |
||
2379 | } |
||
2380 | break; |
||
2381 | default: |
||
2382 | _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGeniv(coord)" ); |
||
2383 | return; |
||
2384 | } |
||
2385 | } |
||
2386 | |||
2387 | |||
2388 | /* GL_ARB_multitexture */ |
||
2389 | void |
||
2390 | _mesa_ActiveTextureARB( GLenum target ) |
||
2391 | { |
||
2392 | GET_CURRENT_CONTEXT(ctx); |
||
2393 | GLuint texUnit = target - GL_TEXTURE0_ARB; |
||
2394 | ASSERT_OUTSIDE_BEGIN_END(ctx); |
||
2395 | |||
2396 | if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE)) |
||
2397 | _mesa_debug(ctx, "glActiveTexture %s\n", |
||
2398 | _mesa_lookup_enum_by_nr(target)); |
||
2399 | |||
2400 | if (texUnit > ctx->Const.MaxTextureUnits) { |
||
2401 | _mesa_error(ctx, GL_INVALID_ENUM, "glActiveTextureARB(target)"); |
||
2402 | return; |
||
2403 | } |
||
2404 | |||
2405 | FLUSH_VERTICES(ctx, _NEW_TEXTURE); |
||
2406 | ctx->Texture.CurrentUnit = texUnit; |
||
2407 | if (ctx->Driver.ActiveTexture) { |
||
2408 | (*ctx->Driver.ActiveTexture)( ctx, (GLuint) texUnit ); |
||
2409 | } |
||
2410 | } |
||
2411 | |||
2412 | |||
2413 | /* GL_ARB_multitexture */ |
||
2414 | void |
||
2415 | _mesa_ClientActiveTextureARB( GLenum target ) |
||
2416 | { |
||
2417 | GET_CURRENT_CONTEXT(ctx); |
||
2418 | GLuint texUnit = target - GL_TEXTURE0_ARB; |
||
2419 | ASSERT_OUTSIDE_BEGIN_END(ctx); |
||
2420 | |||
2421 | if (texUnit > ctx->Const.MaxTextureUnits) { |
||
2422 | _mesa_error(ctx, GL_INVALID_ENUM, "glClientActiveTextureARB(target)"); |
||
2423 | return; |
||
2424 | } |
||
2425 | |||
2426 | FLUSH_VERTICES(ctx, _NEW_ARRAY); |
||
2427 | ctx->Array.ActiveTexture = texUnit; |
||
2428 | } |
||
2429 | |||
2430 | |||
2431 | |||
2432 | /**********************************************************************/ |
||
2433 | /* Pixel Texgen Extensions */ |
||
2434 | /**********************************************************************/ |
||
2435 | |||
2436 | void |
||
2437 | _mesa_PixelTexGenSGIX(GLenum mode) |
||
2438 | { |
||
2439 | GLenum newRgbSource, newAlphaSource; |
||
2440 | GET_CURRENT_CONTEXT(ctx); |
||
2441 | ASSERT_OUTSIDE_BEGIN_END(ctx); |
||
2442 | |||
2443 | switch (mode) { |
||
2444 | case GL_NONE: |
||
2445 | newRgbSource = GL_PIXEL_GROUP_COLOR_SGIS; |
||
2446 | newAlphaSource = GL_PIXEL_GROUP_COLOR_SGIS; |
||
2447 | break; |
||
2448 | case GL_ALPHA: |
||
2449 | newRgbSource = GL_PIXEL_GROUP_COLOR_SGIS; |
||
2450 | newAlphaSource = GL_CURRENT_RASTER_COLOR; |
||
2451 | break; |
||
2452 | case GL_RGB: |
||
2453 | newRgbSource = GL_CURRENT_RASTER_COLOR; |
||
2454 | newAlphaSource = GL_PIXEL_GROUP_COLOR_SGIS; |
||
2455 | break; |
||
2456 | case GL_RGBA: |
||
2457 | newRgbSource = GL_CURRENT_RASTER_COLOR; |
||
2458 | newAlphaSource = GL_CURRENT_RASTER_COLOR; |
||
2459 | break; |
||
2460 | default: |
||
2461 | _mesa_error(ctx, GL_INVALID_ENUM, "glPixelTexGenSGIX(mode)"); |
||
2462 | return; |
||
2463 | } |
||
2464 | |||
2465 | if (newRgbSource == ctx->Pixel.FragmentRgbSource && |
||
2466 | newAlphaSource == ctx->Pixel.FragmentAlphaSource) |
||
2467 | return; |
||
2468 | |||
2469 | FLUSH_VERTICES(ctx, _NEW_PIXEL); |
||
2470 | ctx->Pixel.FragmentRgbSource = newRgbSource; |
||
2471 | ctx->Pixel.FragmentAlphaSource = newAlphaSource; |
||
2472 | } |
||
2473 | |||
2474 | |||
2475 | void |
||
2476 | _mesa_PixelTexGenParameterfSGIS(GLenum target, GLfloat value) |
||
2477 | { |
||
2478 | _mesa_PixelTexGenParameteriSGIS(target, (GLint) value); |
||
2479 | } |
||
2480 | |||
2481 | |||
2482 | void |
||
2483 | _mesa_PixelTexGenParameterfvSGIS(GLenum target, const GLfloat *value) |
||
2484 | { |
||
2485 | _mesa_PixelTexGenParameteriSGIS(target, (GLint) *value); |
||
2486 | } |
||
2487 | |||
2488 | |||
2489 | void |
||
2490 | _mesa_PixelTexGenParameteriSGIS(GLenum target, GLint value) |
||
2491 | { |
||
2492 | GET_CURRENT_CONTEXT(ctx); |
||
2493 | ASSERT_OUTSIDE_BEGIN_END(ctx); |
||
2494 | |||
2495 | if (value != GL_CURRENT_RASTER_COLOR && value != GL_PIXEL_GROUP_COLOR_SGIS) { |
||
2496 | _mesa_error(ctx, GL_INVALID_ENUM, "glPixelTexGenParameterSGIS(value)"); |
||
2497 | return; |
||
2498 | } |
||
2499 | |||
2500 | switch (target) { |
||
2501 | case GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS: |
||
2502 | if (ctx->Pixel.FragmentRgbSource == (GLenum) value) |
||
2503 | return; |
||
2504 | FLUSH_VERTICES(ctx, _NEW_PIXEL); |
||
2505 | ctx->Pixel.FragmentRgbSource = (GLenum) value; |
||
2506 | break; |
||
2507 | case GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS: |
||
2508 | if (ctx->Pixel.FragmentAlphaSource == (GLenum) value) |
||
2509 | return; |
||
2510 | FLUSH_VERTICES(ctx, _NEW_PIXEL); |
||
2511 | ctx->Pixel.FragmentAlphaSource = (GLenum) value; |
||
2512 | break; |
||
2513 | default: |
||
2514 | _mesa_error(ctx, GL_INVALID_ENUM, "glPixelTexGenParameterSGIS(target)"); |
||
2515 | return; |
||
2516 | } |
||
2517 | } |
||
2518 | |||
2519 | |||
2520 | void |
||
2521 | _mesa_PixelTexGenParameterivSGIS(GLenum target, const GLint *value) |
||
2522 | { |
||
2523 | _mesa_PixelTexGenParameteriSGIS(target, *value); |
||
2524 | } |
||
2525 | |||
2526 | |||
2527 | void |
||
2528 | _mesa_GetPixelTexGenParameterfvSGIS(GLenum target, GLfloat *value) |
||
2529 | { |
||
2530 | GET_CURRENT_CONTEXT(ctx); |
||
2531 | ASSERT_OUTSIDE_BEGIN_END(ctx); |
||
2532 | |||
2533 | if (target == GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS) { |
||
2534 | *value = (GLfloat) ctx->Pixel.FragmentRgbSource; |
||
2535 | } |
||
2536 | else if (target == GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS) { |
||
2537 | *value = (GLfloat) ctx->Pixel.FragmentAlphaSource; |
||
2538 | } |
||
2539 | else { |
||
2540 | _mesa_error(ctx, GL_INVALID_ENUM, "glGetPixelTexGenParameterfvSGIS(target)"); |
||
2541 | } |
||
2542 | } |
||
2543 | |||
2544 | |||
2545 | void |
||
2546 | _mesa_GetPixelTexGenParameterivSGIS(GLenum target, GLint *value) |
||
2547 | { |
||
2548 | GET_CURRENT_CONTEXT(ctx); |
||
2549 | ASSERT_OUTSIDE_BEGIN_END(ctx); |
||
2550 | |||
2551 | if (target == GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS) { |
||
2552 | *value = (GLint) ctx->Pixel.FragmentRgbSource; |
||
2553 | } |
||
2554 | else if (target == GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS) { |
||
2555 | *value = (GLint) ctx->Pixel.FragmentAlphaSource; |
||
2556 | } |
||
2557 | else { |
||
2558 | _mesa_error(ctx, GL_INVALID_ENUM, "glGetPixelTexGenParameterivSGIS(target)"); |
||
2559 | } |
||
2560 | } |