2 * Mesa 3-D graphics library
5 * Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
6 * Copyright (C) 2009 VMware, Inc. All Rights Reserved.
8 * Permission is hereby granted, free of charge, to any person obtaining a
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
15 * The above copyright notice and this permission notice shall be included
16 * in all copies or substantial portions of the Software.
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
22 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
23 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 * glTexEnv-related functions
33 #include "main/glheader.h"
34 #include "main/context.h"
35 #include "main/enums.h"
36 #include "main/macros.h"
37 #include "main/mtypes.h"
38 #include "main/state.h"
39 #include "main/texenv.h"
40 #include "main/texstate.h"
43 #define TE_ERROR(errCode, msg, value) \
44 _mesa_error(ctx, errCode, msg, _mesa_lookup_enum_by_nr(value));
47 /** Set texture env mode */
49 set_env_mode(struct gl_context
*ctx
,
50 struct gl_texture_unit
*texUnit
,
55 if (texUnit
->EnvMode
== mode
)
66 mode
= GL_REPLACE
; /* GL_REPLACE_EXT != GL_REPLACE */
70 legal
= ctx
->Extensions
.EXT_texture_env_add
;
73 legal
= (ctx
->Extensions
.EXT_texture_env_combine
||
74 ctx
->Extensions
.ARB_texture_env_combine
);
77 legal
= ctx
->Extensions
.NV_texture_env_combine4
;
84 FLUSH_VERTICES(ctx
, _NEW_TEXTURE
);
85 texUnit
->EnvMode
= mode
;
88 TE_ERROR(GL_INVALID_ENUM
, "glTexEnv(param=%s)", mode
);
94 set_env_color(struct gl_context
*ctx
,
95 struct gl_texture_unit
*texUnit
,
98 if (TEST_EQ_4V(color
, texUnit
->EnvColorUnclamped
))
100 FLUSH_VERTICES(ctx
, _NEW_TEXTURE
);
101 COPY_4FV(texUnit
->EnvColorUnclamped
, color
);
102 texUnit
->EnvColor
[0] = CLAMP(color
[0], 0.0F
, 1.0F
);
103 texUnit
->EnvColor
[1] = CLAMP(color
[1], 0.0F
, 1.0F
);
104 texUnit
->EnvColor
[2] = CLAMP(color
[2], 0.0F
, 1.0F
);
105 texUnit
->EnvColor
[3] = CLAMP(color
[3], 0.0F
, 1.0F
);
109 /** Set an RGB or A combiner mode/function */
111 set_combiner_mode(struct gl_context
*ctx
,
112 struct gl_texture_unit
*texUnit
,
113 GLenum pname
, GLenum mode
)
117 if (!ctx
->Extensions
.EXT_texture_env_combine
&&
118 !ctx
->Extensions
.ARB_texture_env_combine
) {
119 _mesa_error(ctx
, GL_INVALID_ENUM
, "glTexEnv(pname)");
132 legal
= ctx
->Extensions
.ARB_texture_env_combine
;
134 case GL_DOT3_RGB_EXT
:
135 case GL_DOT3_RGBA_EXT
:
136 legal
= (ctx
->Extensions
.EXT_texture_env_dot3
&&
137 pname
== GL_COMBINE_RGB
);
141 legal
= (ctx
->Extensions
.ARB_texture_env_dot3
&&
142 pname
== GL_COMBINE_RGB
);
144 case GL_MODULATE_ADD_ATI
:
145 case GL_MODULATE_SIGNED_ADD_ATI
:
146 case GL_MODULATE_SUBTRACT_ATI
:
147 legal
= ctx
->Extensions
.ATI_texture_env_combine3
;
149 case GL_BUMP_ENVMAP_ATI
:
150 legal
= (ctx
->Extensions
.ATI_envmap_bumpmap
&&
151 pname
== GL_COMBINE_RGB
);
158 TE_ERROR(GL_INVALID_ENUM
, "glTexEnv(param=%s)", mode
);
164 if (texUnit
->Combine
.ModeRGB
== mode
)
166 FLUSH_VERTICES(ctx
, _NEW_TEXTURE
);
167 texUnit
->Combine
.ModeRGB
= mode
;
170 case GL_COMBINE_ALPHA
:
171 if (texUnit
->Combine
.ModeA
== mode
)
173 FLUSH_VERTICES(ctx
, _NEW_TEXTURE
);
174 texUnit
->Combine
.ModeA
= mode
;
177 TE_ERROR(GL_INVALID_ENUM
, "glTexEnv(pname=%s)", pname
);
183 /** Set an RGB or A combiner source term */
185 set_combiner_source(struct gl_context
*ctx
,
186 struct gl_texture_unit
*texUnit
,
187 GLenum pname
, GLenum param
)
190 GLboolean alpha
, legal
;
192 if (!ctx
->Extensions
.EXT_texture_env_combine
&&
193 !ctx
->Extensions
.ARB_texture_env_combine
) {
194 _mesa_error(ctx
, GL_INVALID_ENUM
, "glTexEnv(pname)");
199 * Translate pname to (term, alpha).
201 * The enums were given sequential values for a reason.
207 case GL_SOURCE3_RGB_NV
:
208 term
= pname
- GL_SOURCE0_RGB
;
211 case GL_SOURCE0_ALPHA
:
212 case GL_SOURCE1_ALPHA
:
213 case GL_SOURCE2_ALPHA
:
214 case GL_SOURCE3_ALPHA_NV
:
215 term
= pname
- GL_SOURCE0_ALPHA
;
219 TE_ERROR(GL_INVALID_ENUM
, "glTexEnv(pname=%s)", pname
);
223 if ((term
== 3) && !ctx
->Extensions
.NV_texture_env_combine4
) {
224 TE_ERROR(GL_INVALID_ENUM
, "glTexEnv(pname=%s)", pname
);
228 assert(term
< MAX_COMBINER_TERMS
);
231 * Error-check param (the source term)
236 case GL_PRIMARY_COLOR
:
248 legal
= (ctx
->Extensions
.ARB_texture_env_crossbar
&&
249 param
- GL_TEXTURE0
< ctx
->Const
.MaxTextureUnits
);
252 legal
= (ctx
->Extensions
.ATI_texture_env_combine3
||
253 ctx
->Extensions
.NV_texture_env_combine4
);
256 legal
= ctx
->Extensions
.ATI_texture_env_combine3
;
263 TE_ERROR(GL_INVALID_ENUM
, "glTexEnv(param=%s)", param
);
267 FLUSH_VERTICES(ctx
, _NEW_TEXTURE
);
270 texUnit
->Combine
.SourceA
[term
] = param
;
272 texUnit
->Combine
.SourceRGB
[term
] = param
;
276 /** Set an RGB or A combiner operand term */
278 set_combiner_operand(struct gl_context
*ctx
,
279 struct gl_texture_unit
*texUnit
,
280 GLenum pname
, GLenum param
)
283 GLboolean alpha
, legal
;
285 if (!ctx
->Extensions
.EXT_texture_env_combine
&&
286 !ctx
->Extensions
.ARB_texture_env_combine
) {
287 _mesa_error(ctx
, GL_INVALID_ENUM
, "glTexEnv(pname)");
291 /* The enums were given sequential values for a reason.
294 case GL_OPERAND0_RGB
:
295 case GL_OPERAND1_RGB
:
296 case GL_OPERAND2_RGB
:
297 case GL_OPERAND3_RGB_NV
:
298 term
= pname
- GL_OPERAND0_RGB
;
301 case GL_OPERAND0_ALPHA
:
302 case GL_OPERAND1_ALPHA
:
303 case GL_OPERAND2_ALPHA
:
304 case GL_OPERAND3_ALPHA_NV
:
305 term
= pname
- GL_OPERAND0_ALPHA
;
309 TE_ERROR(GL_INVALID_ENUM
, "glTexEnv(pname=%s)", pname
);
313 if ((term
== 3) && !ctx
->Extensions
.NV_texture_env_combine4
) {
314 TE_ERROR(GL_INVALID_ENUM
, "glTexEnv(pname=%s)", pname
);
318 assert(term
< MAX_COMBINER_TERMS
);
321 * Error-check param (the source operand)
325 case GL_ONE_MINUS_SRC_COLOR
:
326 /* The color input can only be used with GL_OPERAND[01]_RGB in the EXT
327 * version. In the ARB and NV versions they can be used for any RGB
331 && ((term
< 2) || ctx
->Extensions
.ARB_texture_env_combine
332 || ctx
->Extensions
.NV_texture_env_combine4
);
334 case GL_ONE_MINUS_SRC_ALPHA
:
335 /* GL_ONE_MINUS_SRC_ALPHA can only be used with
336 * GL_OPERAND[01]_(RGB|ALPHA) in the EXT version. In the ARB and NV
337 * versions it can be used for any operand.
339 legal
= (term
< 2) || ctx
->Extensions
.ARB_texture_env_combine
340 || ctx
->Extensions
.NV_texture_env_combine4
;
350 TE_ERROR(GL_INVALID_ENUM
, "glTexEnv(param=%s)", param
);
354 FLUSH_VERTICES(ctx
, _NEW_TEXTURE
);
357 texUnit
->Combine
.OperandA
[term
] = param
;
359 texUnit
->Combine
.OperandRGB
[term
] = param
;
364 set_combiner_scale(struct gl_context
*ctx
,
365 struct gl_texture_unit
*texUnit
,
366 GLenum pname
, GLfloat scale
)
370 if (!ctx
->Extensions
.EXT_texture_env_combine
&&
371 !ctx
->Extensions
.ARB_texture_env_combine
) {
372 _mesa_error(ctx
, GL_INVALID_ENUM
, "glTexEnv(pname)");
379 else if (scale
== 2.0F
) {
382 else if (scale
== 4.0F
) {
386 _mesa_error( ctx
, GL_INVALID_VALUE
,
387 "glTexEnv(GL_RGB_SCALE not 1, 2 or 4)" );
393 if (texUnit
->Combine
.ScaleShiftRGB
== shift
)
395 FLUSH_VERTICES(ctx
, _NEW_TEXTURE
);
396 texUnit
->Combine
.ScaleShiftRGB
= shift
;
399 if (texUnit
->Combine
.ScaleShiftA
== shift
)
401 FLUSH_VERTICES(ctx
, _NEW_TEXTURE
);
402 texUnit
->Combine
.ScaleShiftA
= shift
;
405 TE_ERROR(GL_INVALID_ENUM
, "glTexEnv(pname=%s)", pname
);
412 _mesa_TexEnvfv( GLenum target
, GLenum pname
, const GLfloat
*param
)
414 const GLint iparam0
= (GLint
) param
[0];
415 struct gl_texture_unit
*texUnit
;
418 GET_CURRENT_CONTEXT(ctx
);
419 ASSERT_OUTSIDE_BEGIN_END(ctx
);
421 maxUnit
= (target
== GL_POINT_SPRITE_NV
&& pname
== GL_COORD_REPLACE_NV
)
422 ? ctx
->Const
.MaxTextureCoordUnits
: ctx
->Const
.MaxCombinedTextureImageUnits
;
423 if (ctx
->Texture
.CurrentUnit
>= maxUnit
) {
424 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glTexEnvfv(current unit)");
428 texUnit
= _mesa_get_current_tex_unit(ctx
);
430 if (target
== GL_TEXTURE_ENV
) {
432 case GL_TEXTURE_ENV_MODE
:
433 set_env_mode(ctx
, texUnit
, (GLenum
) iparam0
);
435 case GL_TEXTURE_ENV_COLOR
:
436 set_env_color(ctx
, texUnit
, param
);
439 case GL_COMBINE_ALPHA
:
440 set_combiner_mode(ctx
, texUnit
, pname
, (GLenum
) iparam0
);
445 case GL_SOURCE3_RGB_NV
:
446 case GL_SOURCE0_ALPHA
:
447 case GL_SOURCE1_ALPHA
:
448 case GL_SOURCE2_ALPHA
:
449 case GL_SOURCE3_ALPHA_NV
:
450 set_combiner_source(ctx
, texUnit
, pname
, (GLenum
) iparam0
);
452 case GL_OPERAND0_RGB
:
453 case GL_OPERAND1_RGB
:
454 case GL_OPERAND2_RGB
:
455 case GL_OPERAND3_RGB_NV
:
456 case GL_OPERAND0_ALPHA
:
457 case GL_OPERAND1_ALPHA
:
458 case GL_OPERAND2_ALPHA
:
459 case GL_OPERAND3_ALPHA_NV
:
460 set_combiner_operand(ctx
, texUnit
, pname
, (GLenum
) iparam0
);
464 set_combiner_scale(ctx
, texUnit
, pname
, param
[0]);
466 case GL_BUMP_TARGET_ATI
:
467 if (!ctx
->Extensions
.ATI_envmap_bumpmap
) {
468 _mesa_error( ctx
, GL_INVALID_ENUM
, "glTexEnv(pname=0x%x)", pname
);
471 if ((iparam0
< GL_TEXTURE0
) ||
472 (iparam0
> GL_TEXTURE31
)) {
473 /* spec doesn't say this but it seems logical */
474 _mesa_error( ctx
, GL_INVALID_ENUM
, "glTexEnv(param=0x%x)", iparam0
);
477 if (!((1 << (iparam0
- GL_TEXTURE0
)) & ctx
->Const
.SupportedBumpUnits
)) {
478 _mesa_error( ctx
, GL_INVALID_VALUE
, "glTexEnv(param=0x%x)", iparam0
);
482 FLUSH_VERTICES(ctx
, _NEW_TEXTURE
);
483 texUnit
->BumpTarget
= iparam0
;
487 _mesa_error( ctx
, GL_INVALID_ENUM
, "glTexEnv(pname)" );
491 else if (target
== GL_TEXTURE_FILTER_CONTROL_EXT
) {
492 /* GL_EXT_texture_lod_bias */
493 if (!ctx
->Extensions
.EXT_texture_lod_bias
) {
494 _mesa_error( ctx
, GL_INVALID_ENUM
, "glTexEnv(target=0x%x)", target
);
497 if (pname
== GL_TEXTURE_LOD_BIAS_EXT
) {
498 if (texUnit
->LodBias
== param
[0])
500 FLUSH_VERTICES(ctx
, _NEW_TEXTURE
);
501 texUnit
->LodBias
= param
[0];
504 TE_ERROR(GL_INVALID_ENUM
, "glTexEnv(pname=%s)", pname
);
508 else if (target
== GL_POINT_SPRITE_NV
) {
509 /* GL_ARB_point_sprite / GL_NV_point_sprite */
510 if (!ctx
->Extensions
.NV_point_sprite
511 && !ctx
->Extensions
.ARB_point_sprite
) {
512 _mesa_error( ctx
, GL_INVALID_ENUM
, "glTexEnv(target=0x%x)", target
);
515 if (pname
== GL_COORD_REPLACE_NV
) {
516 if (iparam0
== GL_TRUE
|| iparam0
== GL_FALSE
) {
517 /* It's kind of weird to set point state via glTexEnv,
518 * but that's what the spec calls for.
520 const GLboolean state
= (GLboolean
) iparam0
;
521 if (ctx
->Point
.CoordReplace
[ctx
->Texture
.CurrentUnit
] == state
)
523 FLUSH_VERTICES(ctx
, _NEW_POINT
);
524 ctx
->Point
.CoordReplace
[ctx
->Texture
.CurrentUnit
] = state
;
527 _mesa_error( ctx
, GL_INVALID_VALUE
, "glTexEnv(param=0x%x)", iparam0
);
532 _mesa_error( ctx
, GL_INVALID_ENUM
, "glTexEnv(pname=0x%x)", pname
);
537 _mesa_error( ctx
, GL_INVALID_ENUM
, "glTexEnv(target=0x%x)",target
);
541 if (MESA_VERBOSE
&(VERBOSE_API
|VERBOSE_TEXTURE
))
542 _mesa_debug(ctx
, "glTexEnv %s %s %.1f(%s) ...\n",
543 _mesa_lookup_enum_by_nr(target
),
544 _mesa_lookup_enum_by_nr(pname
),
546 _mesa_lookup_enum_by_nr((GLenum
) iparam0
));
548 /* Tell device driver about the new texture environment */
549 if (ctx
->Driver
.TexEnv
) {
550 (*ctx
->Driver
.TexEnv
)( ctx
, target
, pname
, param
);
556 _mesa_TexEnvf( GLenum target
, GLenum pname
, GLfloat param
)
560 p
[1] = p
[2] = p
[3] = 0.0;
561 _mesa_TexEnvfv( target
, pname
, p
);
567 _mesa_TexEnvi( GLenum target
, GLenum pname
, GLint param
)
570 p
[0] = (GLfloat
) param
;
571 p
[1] = p
[2] = p
[3] = 0.0;
572 _mesa_TexEnvfv( target
, pname
, p
);
577 _mesa_TexEnviv( GLenum target
, GLenum pname
, const GLint
*param
)
580 if (pname
== GL_TEXTURE_ENV_COLOR
) {
581 p
[0] = INT_TO_FLOAT( param
[0] );
582 p
[1] = INT_TO_FLOAT( param
[1] );
583 p
[2] = INT_TO_FLOAT( param
[2] );
584 p
[3] = INT_TO_FLOAT( param
[3] );
587 p
[0] = (GLfloat
) param
[0];
588 p
[1] = p
[2] = p
[3] = 0; /* init to zero, just to be safe */
590 _mesa_TexEnvfv( target
, pname
, p
);
596 * Helper for glGetTexEnvi/f()
597 * \return value of queried pname or -1 if error.
600 get_texenvi(struct gl_context
*ctx
, const struct gl_texture_unit
*texUnit
,
604 case GL_TEXTURE_ENV_MODE
:
605 return texUnit
->EnvMode
;
608 if (ctx
->Extensions
.EXT_texture_env_combine
||
609 ctx
->Extensions
.ARB_texture_env_combine
) {
610 return texUnit
->Combine
.ModeRGB
;
613 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetTexEnvfv(pname)");
616 case GL_COMBINE_ALPHA
:
617 if (ctx
->Extensions
.EXT_texture_env_combine
||
618 ctx
->Extensions
.ARB_texture_env_combine
) {
619 return texUnit
->Combine
.ModeA
;
622 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetTexEnvfv(pname)");
628 if (ctx
->Extensions
.EXT_texture_env_combine
||
629 ctx
->Extensions
.ARB_texture_env_combine
) {
630 const unsigned rgb_idx
= pname
- GL_SOURCE0_RGB
;
631 return texUnit
->Combine
.SourceRGB
[rgb_idx
];
634 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetTexEnvfv(pname)");
637 case GL_SOURCE3_RGB_NV
:
638 if (ctx
->Extensions
.NV_texture_env_combine4
) {
639 return texUnit
->Combine
.SourceRGB
[3];
642 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetTexEnvfv(pname)");
645 case GL_SOURCE0_ALPHA
:
646 case GL_SOURCE1_ALPHA
:
647 case GL_SOURCE2_ALPHA
:
648 if (ctx
->Extensions
.EXT_texture_env_combine
||
649 ctx
->Extensions
.ARB_texture_env_combine
) {
650 const unsigned alpha_idx
= pname
- GL_SOURCE0_ALPHA
;
651 return texUnit
->Combine
.SourceA
[alpha_idx
];
654 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetTexEnvfv(pname)");
657 case GL_SOURCE3_ALPHA_NV
:
658 if (ctx
->Extensions
.NV_texture_env_combine4
) {
659 return texUnit
->Combine
.SourceA
[3];
662 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetTexEnvfv(pname)");
665 case GL_OPERAND0_RGB
:
666 case GL_OPERAND1_RGB
:
667 case GL_OPERAND2_RGB
:
668 if (ctx
->Extensions
.EXT_texture_env_combine
||
669 ctx
->Extensions
.ARB_texture_env_combine
) {
670 const unsigned op_rgb
= pname
- GL_OPERAND0_RGB
;
671 return texUnit
->Combine
.OperandRGB
[op_rgb
];
674 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetTexEnvfv(pname)");
677 case GL_OPERAND3_RGB_NV
:
678 if (ctx
->Extensions
.NV_texture_env_combine4
) {
679 return texUnit
->Combine
.OperandRGB
[3];
682 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetTexEnvfv(pname)");
685 case GL_OPERAND0_ALPHA
:
686 case GL_OPERAND1_ALPHA
:
687 case GL_OPERAND2_ALPHA
:
688 if (ctx
->Extensions
.EXT_texture_env_combine
||
689 ctx
->Extensions
.ARB_texture_env_combine
) {
690 const unsigned op_alpha
= pname
- GL_OPERAND0_ALPHA
;
691 return texUnit
->Combine
.OperandA
[op_alpha
];
694 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetTexEnvfv(pname)");
697 case GL_OPERAND3_ALPHA_NV
:
698 if (ctx
->Extensions
.NV_texture_env_combine4
) {
699 return texUnit
->Combine
.OperandA
[3];
702 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetTexEnvfv(pname)");
706 if (ctx
->Extensions
.EXT_texture_env_combine
||
707 ctx
->Extensions
.ARB_texture_env_combine
) {
708 return 1 << texUnit
->Combine
.ScaleShiftRGB
;
711 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetTexEnvfv(pname)");
715 if (ctx
->Extensions
.EXT_texture_env_combine
||
716 ctx
->Extensions
.ARB_texture_env_combine
) {
717 return 1 << texUnit
->Combine
.ScaleShiftA
;
720 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetTexEnvfv(pname)");
723 case GL_BUMP_TARGET_ATI
:
724 /* spec doesn't say so, but I think this should be queryable */
725 if (ctx
->Extensions
.ATI_envmap_bumpmap
) {
726 return texUnit
->BumpTarget
;
729 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetTexEnvfv(pname)");
737 return -1; /* error */
743 _mesa_GetTexEnvfv( GLenum target
, GLenum pname
, GLfloat
*params
)
746 const struct gl_texture_unit
*texUnit
;
747 GET_CURRENT_CONTEXT(ctx
);
748 ASSERT_OUTSIDE_BEGIN_END(ctx
);
750 maxUnit
= (target
== GL_POINT_SPRITE_NV
&& pname
== GL_COORD_REPLACE_NV
)
751 ? ctx
->Const
.MaxTextureCoordUnits
: ctx
->Const
.MaxCombinedTextureImageUnits
;
752 if (ctx
->Texture
.CurrentUnit
>= maxUnit
) {
753 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glGetTexEnvfv(current unit)");
757 texUnit
= _mesa_get_current_tex_unit(ctx
);
759 if (target
== GL_TEXTURE_ENV
) {
760 if (pname
== GL_TEXTURE_ENV_COLOR
) {
761 if(ctx
->NewState
& (_NEW_BUFFERS
| _NEW_FRAG_CLAMP
))
762 _mesa_update_state(ctx
);
763 if(ctx
->Color
._ClampFragmentColor
)
764 COPY_4FV( params
, texUnit
->EnvColor
);
766 COPY_4FV( params
, texUnit
->EnvColorUnclamped
);
769 GLint val
= get_texenvi(ctx
, texUnit
, pname
);
771 *params
= (GLfloat
) val
;
775 else if (target
== GL_TEXTURE_FILTER_CONTROL_EXT
) {
776 /* GL_EXT_texture_lod_bias */
777 if (!ctx
->Extensions
.EXT_texture_lod_bias
) {
778 _mesa_error( ctx
, GL_INVALID_ENUM
, "glGetTexEnvfv(target)" );
781 if (pname
== GL_TEXTURE_LOD_BIAS_EXT
) {
782 *params
= texUnit
->LodBias
;
785 _mesa_error( ctx
, GL_INVALID_ENUM
, "glGetTexEnvfv(pname)" );
789 else if (target
== GL_POINT_SPRITE_NV
) {
790 /* GL_ARB_point_sprite / GL_NV_point_sprite */
791 if (!ctx
->Extensions
.NV_point_sprite
792 && !ctx
->Extensions
.ARB_point_sprite
) {
793 _mesa_error( ctx
, GL_INVALID_ENUM
, "glGetTexEnvfv(target)" );
796 if (pname
== GL_COORD_REPLACE_NV
) {
797 *params
= (GLfloat
) ctx
->Point
.CoordReplace
[ctx
->Texture
.CurrentUnit
];
800 _mesa_error( ctx
, GL_INVALID_ENUM
, "glGetTexEnvfv(pname)" );
805 _mesa_error( ctx
, GL_INVALID_ENUM
, "glGetTexEnvfv(target)" );
812 _mesa_GetTexEnviv( GLenum target
, GLenum pname
, GLint
*params
)
815 const struct gl_texture_unit
*texUnit
;
816 GET_CURRENT_CONTEXT(ctx
);
817 ASSERT_OUTSIDE_BEGIN_END(ctx
);
819 maxUnit
= (target
== GL_POINT_SPRITE_NV
&& pname
== GL_COORD_REPLACE_NV
)
820 ? ctx
->Const
.MaxTextureCoordUnits
: ctx
->Const
.MaxCombinedTextureImageUnits
;
821 if (ctx
->Texture
.CurrentUnit
>= maxUnit
) {
822 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glGetTexEnviv(current unit)");
826 texUnit
= _mesa_get_current_tex_unit(ctx
);
828 if (target
== GL_TEXTURE_ENV
) {
829 if (pname
== GL_TEXTURE_ENV_COLOR
) {
830 params
[0] = FLOAT_TO_INT( texUnit
->EnvColor
[0] );
831 params
[1] = FLOAT_TO_INT( texUnit
->EnvColor
[1] );
832 params
[2] = FLOAT_TO_INT( texUnit
->EnvColor
[2] );
833 params
[3] = FLOAT_TO_INT( texUnit
->EnvColor
[3] );
836 GLint val
= get_texenvi(ctx
, texUnit
, pname
);
842 else if (target
== GL_TEXTURE_FILTER_CONTROL_EXT
) {
843 /* GL_EXT_texture_lod_bias */
844 if (!ctx
->Extensions
.EXT_texture_lod_bias
) {
845 _mesa_error( ctx
, GL_INVALID_ENUM
, "glGetTexEnviv(target)" );
848 if (pname
== GL_TEXTURE_LOD_BIAS_EXT
) {
849 *params
= (GLint
) texUnit
->LodBias
;
852 _mesa_error( ctx
, GL_INVALID_ENUM
, "glGetTexEnviv(pname)" );
856 else if (target
== GL_POINT_SPRITE_NV
) {
857 /* GL_ARB_point_sprite / GL_NV_point_sprite */
858 if (!ctx
->Extensions
.NV_point_sprite
859 && !ctx
->Extensions
.ARB_point_sprite
) {
860 _mesa_error( ctx
, GL_INVALID_ENUM
, "glGetTexEnviv(target)" );
863 if (pname
== GL_COORD_REPLACE_NV
) {
864 *params
= (GLint
) ctx
->Point
.CoordReplace
[ctx
->Texture
.CurrentUnit
];
867 _mesa_error( ctx
, GL_INVALID_ENUM
, "glGetTexEnviv(pname)" );
872 _mesa_error( ctx
, GL_INVALID_ENUM
, "glGetTexEnviv(target)" );
879 * Why does ATI_envmap_bumpmap require new entrypoints? Should just
880 * reuse TexEnv ones...
883 _mesa_TexBumpParameterivATI( GLenum pname
, const GLint
*param
)
886 GET_CURRENT_CONTEXT(ctx
);
887 ASSERT_OUTSIDE_BEGIN_END(ctx
);
889 if (!ctx
->Extensions
.ATI_envmap_bumpmap
) {
890 /* This isn't an "official" error case, but let's tell the user
891 * that something's wrong.
893 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glTexBumpParameterivATI");
897 if (pname
== GL_BUMP_ROT_MATRIX_ATI
) {
898 /* hope that conversion is correct here */
899 p
[0] = INT_TO_FLOAT( param
[0] );
900 p
[1] = INT_TO_FLOAT( param
[1] );
901 p
[2] = INT_TO_FLOAT( param
[2] );
902 p
[3] = INT_TO_FLOAT( param
[3] );
905 p
[0] = (GLfloat
) param
[0];
906 p
[1] = p
[2] = p
[3] = 0.0F
; /* init to zero, just to be safe */
908 _mesa_TexBumpParameterfvATI( pname
, p
);
913 _mesa_TexBumpParameterfvATI( GLenum pname
, const GLfloat
*param
)
915 struct gl_texture_unit
*texUnit
;
916 GET_CURRENT_CONTEXT(ctx
);
917 ASSERT_OUTSIDE_BEGIN_END(ctx
);
919 if (!ctx
->Extensions
.ATI_envmap_bumpmap
) {
920 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glTexBumpParameterfvATI");
924 texUnit
= _mesa_get_current_tex_unit(ctx
);
926 if (pname
== GL_BUMP_ROT_MATRIX_ATI
) {
927 if (TEST_EQ_4V(param
, texUnit
->RotMatrix
))
929 FLUSH_VERTICES(ctx
, _NEW_TEXTURE
);
930 COPY_4FV(texUnit
->RotMatrix
, param
);
933 _mesa_error( ctx
, GL_INVALID_ENUM
, "glTexBumpParameter(pname)" );
936 /* Drivers might want to know about this, instead of dedicated function
937 just shove it into TexEnv where it really belongs anyway */
938 if (ctx
->Driver
.TexEnv
) {
939 (*ctx
->Driver
.TexEnv
)( ctx
, 0, pname
, param
);
945 _mesa_GetTexBumpParameterivATI( GLenum pname
, GLint
*param
)
947 const struct gl_texture_unit
*texUnit
;
949 GET_CURRENT_CONTEXT(ctx
);
950 ASSERT_OUTSIDE_BEGIN_END(ctx
);
952 if (!ctx
->Extensions
.ATI_envmap_bumpmap
) {
953 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glGetTexBumpParameterivATI");
957 texUnit
= _mesa_get_current_tex_unit(ctx
);
959 if (pname
== GL_BUMP_ROT_MATRIX_SIZE_ATI
) {
960 /* spec leaves open to support larger matrices.
961 Don't think anyone would ever want to use it
962 (and apps almost certainly would not understand it and
963 thus fail to submit matrices correctly) so hardcode this. */
966 else if (pname
== GL_BUMP_ROT_MATRIX_ATI
) {
967 /* hope that conversion is correct here */
968 param
[0] = FLOAT_TO_INT(texUnit
->RotMatrix
[0]);
969 param
[1] = FLOAT_TO_INT(texUnit
->RotMatrix
[1]);
970 param
[2] = FLOAT_TO_INT(texUnit
->RotMatrix
[2]);
971 param
[3] = FLOAT_TO_INT(texUnit
->RotMatrix
[3]);
973 else if (pname
== GL_BUMP_NUM_TEX_UNITS_ATI
) {
975 for (i
= 0; i
< ctx
->Const
.MaxTextureImageUnits
; i
++) {
976 if (ctx
->Const
.SupportedBumpUnits
& (1 << i
)) {
982 else if (pname
== GL_BUMP_TEX_UNITS_ATI
) {
983 for (i
= 0; i
< ctx
->Const
.MaxTextureImageUnits
; i
++) {
984 if (ctx
->Const
.SupportedBumpUnits
& (1 << i
)) {
985 *param
++ = i
+ GL_TEXTURE0
;
990 _mesa_error( ctx
, GL_INVALID_ENUM
, "glGetTexBumpParameter(pname)" );
997 _mesa_GetTexBumpParameterfvATI( GLenum pname
, GLfloat
*param
)
999 const struct gl_texture_unit
*texUnit
;
1001 GET_CURRENT_CONTEXT(ctx
);
1002 ASSERT_OUTSIDE_BEGIN_END(ctx
);
1004 if (!ctx
->Extensions
.ATI_envmap_bumpmap
) {
1005 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glGetTexBumpParameterfvATI");
1009 texUnit
= _mesa_get_current_tex_unit(ctx
);
1011 if (pname
== GL_BUMP_ROT_MATRIX_SIZE_ATI
) {
1012 /* spec leaves open to support larger matrices.
1013 Don't think anyone would ever want to use it
1014 (and apps might not understand it) so hardcode this. */
1017 else if (pname
== GL_BUMP_ROT_MATRIX_ATI
) {
1018 param
[0] = texUnit
->RotMatrix
[0];
1019 param
[1] = texUnit
->RotMatrix
[1];
1020 param
[2] = texUnit
->RotMatrix
[2];
1021 param
[3] = texUnit
->RotMatrix
[3];
1023 else if (pname
== GL_BUMP_NUM_TEX_UNITS_ATI
) {
1025 for (i
= 0; i
< ctx
->Const
.MaxTextureImageUnits
; i
++) {
1026 if (ctx
->Const
.SupportedBumpUnits
& (1 << i
)) {
1030 *param
= (GLfloat
) count
;
1032 else if (pname
== GL_BUMP_TEX_UNITS_ATI
) {
1033 for (i
= 0; i
< ctx
->Const
.MaxTextureImageUnits
; i
++) {
1034 if (ctx
->Const
.SupportedBumpUnits
& (1 << i
)) {
1035 *param
++ = (GLfloat
) (i
+ GL_TEXTURE0
);
1040 _mesa_error( ctx
, GL_INVALID_ENUM
, "glGetTexBumpParameter(pname)" );