2 * Mesa 3-D graphics library
4 * Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
5 * Copyright (C) 2009 VMware, Inc. All Rights Reserved.
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
21 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23 * OTHER DEALINGS IN THE SOFTWARE.
29 * glTexEnv-related functions
33 #include "main/glheader.h"
34 #include "main/context.h"
35 #include "main/blend.h"
36 #include "main/enums.h"
37 #include "main/macros.h"
38 #include "main/mtypes.h"
39 #include "main/state.h"
40 #include "main/texenv.h"
41 #include "main/texstate.h"
44 #define TE_ERROR(errCode, msg, value) \
45 _mesa_error(ctx, errCode, msg, _mesa_enum_to_string(value));
48 /** Set texture env mode */
50 set_env_mode(struct gl_context
*ctx
,
51 struct gl_fixedfunc_texture_unit
*texUnit
,
56 if (texUnit
->EnvMode
== mode
)
69 mode
= GL_REPLACE
; /* GL_REPLACE_EXT != GL_REPLACE */
73 legal
= ctx
->Extensions
.NV_texture_env_combine4
;
80 FLUSH_VERTICES(ctx
, _NEW_TEXTURE_STATE
);
81 texUnit
->EnvMode
= mode
;
84 TE_ERROR(GL_INVALID_ENUM
, "glTexEnv(param=%s)", mode
);
90 set_env_color(struct gl_context
*ctx
,
91 struct gl_fixedfunc_texture_unit
*texUnit
,
94 if (TEST_EQ_4V(color
, texUnit
->EnvColorUnclamped
))
96 FLUSH_VERTICES(ctx
, _NEW_TEXTURE_STATE
);
97 COPY_4FV(texUnit
->EnvColorUnclamped
, color
);
98 texUnit
->EnvColor
[0] = CLAMP(color
[0], 0.0F
, 1.0F
);
99 texUnit
->EnvColor
[1] = CLAMP(color
[1], 0.0F
, 1.0F
);
100 texUnit
->EnvColor
[2] = CLAMP(color
[2], 0.0F
, 1.0F
);
101 texUnit
->EnvColor
[3] = CLAMP(color
[3], 0.0F
, 1.0F
);
105 /** Set an RGB or A combiner mode/function */
107 set_combiner_mode(struct gl_context
*ctx
,
108 struct gl_fixedfunc_texture_unit
*texUnit
,
109 GLenum pname
, GLenum mode
)
122 legal
= ctx
->Extensions
.ARB_texture_env_combine
;
124 case GL_DOT3_RGB_EXT
:
125 case GL_DOT3_RGBA_EXT
:
126 legal
= (ctx
->API
== API_OPENGL_COMPAT
&&
127 ctx
->Extensions
.EXT_texture_env_dot3
&&
128 pname
== GL_COMBINE_RGB
);
132 legal
= (ctx
->Extensions
.ARB_texture_env_dot3
&&
133 pname
== GL_COMBINE_RGB
);
135 case GL_MODULATE_ADD_ATI
:
136 case GL_MODULATE_SIGNED_ADD_ATI
:
137 case GL_MODULATE_SUBTRACT_ATI
:
138 legal
= (ctx
->API
== API_OPENGL_COMPAT
&&
139 ctx
->Extensions
.ATI_texture_env_combine3
);
146 TE_ERROR(GL_INVALID_ENUM
, "glTexEnv(param=%s)", mode
);
152 if (texUnit
->Combine
.ModeRGB
== mode
)
154 FLUSH_VERTICES(ctx
, _NEW_TEXTURE_STATE
);
155 texUnit
->Combine
.ModeRGB
= mode
;
158 case GL_COMBINE_ALPHA
:
159 if (texUnit
->Combine
.ModeA
== mode
)
161 FLUSH_VERTICES(ctx
, _NEW_TEXTURE_STATE
);
162 texUnit
->Combine
.ModeA
= mode
;
165 TE_ERROR(GL_INVALID_ENUM
, "glTexEnv(pname=%s)", pname
);
174 /** Set an RGB or A combiner source term */
176 set_combiner_source(struct gl_context
*ctx
,
177 struct gl_fixedfunc_texture_unit
*texUnit
,
178 GLenum pname
, GLenum param
)
181 GLboolean alpha
, legal
;
184 * Translate pname to (term, alpha).
186 * The enums were given sequential values for a reason.
192 case GL_SOURCE3_RGB_NV
:
193 term
= pname
- GL_SOURCE0_RGB
;
196 case GL_SOURCE0_ALPHA
:
197 case GL_SOURCE1_ALPHA
:
198 case GL_SOURCE2_ALPHA
:
199 case GL_SOURCE3_ALPHA_NV
:
200 term
= pname
- GL_SOURCE0_ALPHA
;
204 TE_ERROR(GL_INVALID_ENUM
, "glTexEnv(pname=%s)", pname
);
208 if ((term
== 3) && (ctx
->API
!= API_OPENGL_COMPAT
209 || !ctx
->Extensions
.NV_texture_env_combine4
)) {
210 TE_ERROR(GL_INVALID_ENUM
, "glTexEnv(pname=%s)", pname
);
214 assert(term
< MAX_COMBINER_TERMS
);
217 * Error-check param (the source term)
222 case GL_PRIMARY_COLOR
:
234 legal
= (ctx
->Extensions
.ARB_texture_env_crossbar
&&
235 param
- GL_TEXTURE0
< ctx
->Const
.MaxTextureUnits
);
238 legal
= (ctx
->API
== API_OPENGL_COMPAT
&&
239 (ctx
->Extensions
.ATI_texture_env_combine3
||
240 ctx
->Extensions
.NV_texture_env_combine4
));
243 legal
= (ctx
->API
== API_OPENGL_COMPAT
&&
244 ctx
->Extensions
.ATI_texture_env_combine3
);
251 TE_ERROR(GL_INVALID_ENUM
, "glTexEnv(param=%s)", param
);
255 FLUSH_VERTICES(ctx
, _NEW_TEXTURE_STATE
);
258 texUnit
->Combine
.SourceA
[term
] = param
;
260 texUnit
->Combine
.SourceRGB
[term
] = param
;
266 /** Set an RGB or A combiner operand term */
268 set_combiner_operand(struct gl_context
*ctx
,
269 struct gl_fixedfunc_texture_unit
*texUnit
,
270 GLenum pname
, GLenum param
)
273 GLboolean alpha
, legal
;
275 /* The enums were given sequential values for a reason.
278 case GL_OPERAND0_RGB
:
279 case GL_OPERAND1_RGB
:
280 case GL_OPERAND2_RGB
:
281 case GL_OPERAND3_RGB_NV
:
282 term
= pname
- GL_OPERAND0_RGB
;
285 case GL_OPERAND0_ALPHA
:
286 case GL_OPERAND1_ALPHA
:
287 case GL_OPERAND2_ALPHA
:
288 case GL_OPERAND3_ALPHA_NV
:
289 term
= pname
- GL_OPERAND0_ALPHA
;
293 TE_ERROR(GL_INVALID_ENUM
, "glTexEnv(pname=%s)", pname
);
297 if ((term
== 3) && (ctx
->API
!= API_OPENGL_COMPAT
298 || !ctx
->Extensions
.NV_texture_env_combine4
)) {
299 TE_ERROR(GL_INVALID_ENUM
, "glTexEnv(pname=%s)", pname
);
303 assert(term
< MAX_COMBINER_TERMS
);
306 * Error-check param (the source operand)
310 case GL_ONE_MINUS_SRC_COLOR
:
311 /* The color input can only be used with GL_OPERAND[01]_RGB in the EXT
312 * version. In the ARB and NV versions and OpenGL ES 1.x they can be
313 * used for any RGB operand.
316 && ((term
< 2) || ctx
->Extensions
.ARB_texture_env_combine
317 || ctx
->Extensions
.NV_texture_env_combine4
);
319 case GL_ONE_MINUS_SRC_ALPHA
:
320 /* GL_ONE_MINUS_SRC_ALPHA can only be used with
321 * GL_OPERAND[01]_(RGB|ALPHA) in the EXT version. In the ARB and NV
322 * versions and OpenGL ES 1.x it can be used for any operand.
324 legal
= (term
< 2) || ctx
->Extensions
.ARB_texture_env_combine
325 || ctx
->Extensions
.NV_texture_env_combine4
;
335 TE_ERROR(GL_INVALID_ENUM
, "glTexEnv(param=%s)", param
);
339 FLUSH_VERTICES(ctx
, _NEW_TEXTURE_STATE
);
342 texUnit
->Combine
.OperandA
[term
] = param
;
344 texUnit
->Combine
.OperandRGB
[term
] = param
;
351 set_combiner_scale(struct gl_context
*ctx
,
352 struct gl_fixedfunc_texture_unit
*texUnit
,
353 GLenum pname
, GLfloat scale
)
360 else if (scale
== 2.0F
) {
363 else if (scale
== 4.0F
) {
367 _mesa_error( ctx
, GL_INVALID_VALUE
,
368 "glTexEnv(GL_RGB_SCALE not 1, 2 or 4)" );
374 if (texUnit
->Combine
.ScaleShiftRGB
== shift
)
376 FLUSH_VERTICES(ctx
, _NEW_TEXTURE_STATE
);
377 texUnit
->Combine
.ScaleShiftRGB
= shift
;
380 if (texUnit
->Combine
.ScaleShiftA
== shift
)
382 FLUSH_VERTICES(ctx
, _NEW_TEXTURE_STATE
);
383 texUnit
->Combine
.ScaleShiftA
= shift
;
386 TE_ERROR(GL_INVALID_ENUM
, "glTexEnv(pname=%s)", pname
);
395 _mesa_texenvfv_indexed( struct gl_context
* ctx
, GLuint texunit
, GLenum target
,
396 GLenum pname
, const GLfloat
*param
)
398 const GLint iparam0
= (GLint
) param
[0];
401 maxUnit
= (target
== GL_POINT_SPRITE_NV
&& pname
== GL_COORD_REPLACE_NV
)
402 ? ctx
->Const
.MaxTextureCoordUnits
: ctx
->Const
.MaxCombinedTextureImageUnits
;
403 if (texunit
>= maxUnit
) {
404 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glTexEnvfv(texunit=%d)", texunit
);
408 if (target
== GL_TEXTURE_ENV
) {
409 struct gl_fixedfunc_texture_unit
*texUnit
=
410 _mesa_get_fixedfunc_tex_unit(ctx
, texunit
);
412 /* The GL spec says that we should report an error if the unit is greater
413 * than GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, but in practice, only
414 * fixed-function units are usable. This is probably a spec bug.
415 * Ignore glTexEnv(GL_TEXTURE_ENV) calls for non-fixed-func units,
416 * because we don't want to process calls that have no effect.
422 case GL_TEXTURE_ENV_MODE
:
423 set_env_mode(ctx
, texUnit
, (GLenum
) iparam0
);
425 case GL_TEXTURE_ENV_COLOR
:
426 set_env_color(ctx
, texUnit
, param
);
429 case GL_COMBINE_ALPHA
:
430 if (!set_combiner_mode(ctx
, texUnit
, pname
, (GLenum
) iparam0
))
436 case GL_SOURCE3_RGB_NV
:
437 case GL_SOURCE0_ALPHA
:
438 case GL_SOURCE1_ALPHA
:
439 case GL_SOURCE2_ALPHA
:
440 case GL_SOURCE3_ALPHA_NV
:
441 if (!set_combiner_source(ctx
, texUnit
, pname
, (GLenum
) iparam0
))
444 case GL_OPERAND0_RGB
:
445 case GL_OPERAND1_RGB
:
446 case GL_OPERAND2_RGB
:
447 case GL_OPERAND3_RGB_NV
:
448 case GL_OPERAND0_ALPHA
:
449 case GL_OPERAND1_ALPHA
:
450 case GL_OPERAND2_ALPHA
:
451 case GL_OPERAND3_ALPHA_NV
:
452 if (!set_combiner_operand(ctx
, texUnit
, pname
, (GLenum
) iparam0
))
457 if (!set_combiner_scale(ctx
, texUnit
, pname
, param
[0]))
461 _mesa_error( ctx
, GL_INVALID_ENUM
, "glTexEnv(pname)" );
465 else if (target
== GL_TEXTURE_FILTER_CONTROL_EXT
) {
466 struct gl_texture_unit
*texUnit
=
467 _mesa_get_tex_unit(ctx
, texunit
);
469 if (pname
== GL_TEXTURE_LOD_BIAS_EXT
) {
470 if (texUnit
->LodBias
== param
[0])
472 FLUSH_VERTICES(ctx
, _NEW_TEXTURE_OBJECT
);
473 texUnit
->LodBias
= param
[0];
476 TE_ERROR(GL_INVALID_ENUM
, "glTexEnv(pname=%s)", pname
);
480 else if (target
== GL_POINT_SPRITE_NV
) {
481 /* GL_ARB_point_sprite / GL_NV_point_sprite */
482 if (!ctx
->Extensions
.NV_point_sprite
483 && !ctx
->Extensions
.ARB_point_sprite
) {
484 _mesa_error( ctx
, GL_INVALID_ENUM
, "glTexEnv(target=0x%x)", target
);
487 if (pname
== GL_COORD_REPLACE_NV
) {
488 /* It's kind of weird to set point state via glTexEnv,
489 * but that's what the spec calls for.
491 if (iparam0
== GL_TRUE
) {
492 if (ctx
->Point
.CoordReplace
& (1u << texunit
))
494 ctx
->Point
.CoordReplace
|= (1u << texunit
);
495 } else if (iparam0
== GL_FALSE
) {
496 if (~(ctx
->Point
.CoordReplace
) & (1u << texunit
))
498 ctx
->Point
.CoordReplace
&= ~(1u << texunit
);
500 _mesa_error( ctx
, GL_INVALID_VALUE
, "glTexEnv(param=0x%x)", iparam0
);
503 FLUSH_VERTICES(ctx
, _NEW_POINT
);
506 _mesa_error( ctx
, GL_INVALID_ENUM
, "glTexEnv(pname=0x%x)", pname
);
511 _mesa_error(ctx
, GL_INVALID_ENUM
, "glTexEnv(target=%s)",
512 _mesa_enum_to_string(target
));
516 if (MESA_VERBOSE
&(VERBOSE_API
|VERBOSE_TEXTURE
))
517 _mesa_debug(ctx
, "glTexEnv %s %s %.1f(%s) ...\n",
518 _mesa_enum_to_string(target
),
519 _mesa_enum_to_string(pname
),
521 _mesa_enum_to_string((GLenum
) iparam0
));
523 /* Tell device driver about the new texture environment */
524 if (ctx
->Driver
.TexEnv
) {
525 ctx
->Driver
.TexEnv(ctx
, target
, pname
, param
);
531 _mesa_TexEnvfv( GLenum target
, GLenum pname
, const GLfloat
*param
)
533 GET_CURRENT_CONTEXT(ctx
);
534 _mesa_texenvfv_indexed(ctx
, ctx
->Texture
.CurrentUnit
, target
, pname
, param
);
539 _mesa_TexEnvf( GLenum target
, GLenum pname
, GLfloat param
)
543 p
[1] = p
[2] = p
[3] = 0.0;
544 _mesa_TexEnvfv( target
, pname
, p
);
549 _mesa_TexEnvi( GLenum target
, GLenum pname
, GLint param
)
552 p
[0] = (GLfloat
) param
;
553 p
[1] = p
[2] = p
[3] = 0.0;
554 _mesa_TexEnvfv( target
, pname
, p
);
559 _mesa_TexEnviv( GLenum target
, GLenum pname
, const GLint
*param
)
562 if (pname
== GL_TEXTURE_ENV_COLOR
) {
563 p
[0] = INT_TO_FLOAT( param
[0] );
564 p
[1] = INT_TO_FLOAT( param
[1] );
565 p
[2] = INT_TO_FLOAT( param
[2] );
566 p
[3] = INT_TO_FLOAT( param
[3] );
569 p
[0] = (GLfloat
) param
[0];
570 p
[1] = p
[2] = p
[3] = 0; /* init to zero, just to be safe */
572 _mesa_TexEnvfv( target
, pname
, p
);
577 _mesa_MultiTexEnvfEXT( GLenum texunit
, GLenum target
,
578 GLenum pname
, GLfloat param
)
580 GET_CURRENT_CONTEXT(ctx
);
583 p
[1] = p
[2] = p
[3] = 0.0;
584 _mesa_texenvfv_indexed(ctx
, texunit
- GL_TEXTURE0
, target
, pname
, p
);
588 _mesa_MultiTexEnvfvEXT( GLenum texunit
, GLenum target
,
589 GLenum pname
, const GLfloat
*param
)
591 GET_CURRENT_CONTEXT(ctx
);
592 _mesa_texenvfv_indexed(ctx
, texunit
- GL_TEXTURE0
, target
, pname
, param
);
597 _mesa_MultiTexEnviEXT( GLenum texunit
, GLenum target
,
598 GLenum pname
, GLint param
)
600 GET_CURRENT_CONTEXT(ctx
);
602 p
[0] = (GLfloat
) param
;
603 p
[1] = p
[2] = p
[3] = 0.0;
604 _mesa_texenvfv_indexed( ctx
, texunit
- GL_TEXTURE0
, target
, pname
, p
);
609 _mesa_MultiTexEnvivEXT( GLenum texunit
, GLenum target
,
610 GLenum pname
, const GLint
*param
)
612 GET_CURRENT_CONTEXT(ctx
);
614 if (pname
== GL_TEXTURE_ENV_COLOR
) {
615 p
[0] = INT_TO_FLOAT( param
[0] );
616 p
[1] = INT_TO_FLOAT( param
[1] );
617 p
[2] = INT_TO_FLOAT( param
[2] );
618 p
[3] = INT_TO_FLOAT( param
[3] );
621 p
[0] = (GLfloat
) param
[0];
622 p
[1] = p
[2] = p
[3] = 0; /* init to zero, just to be safe */
624 _mesa_texenvfv_indexed( ctx
, texunit
- GL_TEXTURE0
, target
, pname
, p
);
631 * Helper for glGetTexEnvi/f()
632 * \return value of queried pname or -1 if error.
635 get_texenvi(struct gl_context
*ctx
,
636 const struct gl_fixedfunc_texture_unit
*texUnit
,
640 case GL_TEXTURE_ENV_MODE
:
641 return texUnit
->EnvMode
;
644 return texUnit
->Combine
.ModeRGB
;
645 case GL_COMBINE_ALPHA
:
646 return texUnit
->Combine
.ModeA
;
649 case GL_SOURCE2_RGB
: {
650 const unsigned rgb_idx
= pname
- GL_SOURCE0_RGB
;
651 return texUnit
->Combine
.SourceRGB
[rgb_idx
];
653 case GL_SOURCE3_RGB_NV
:
654 if (ctx
->API
== API_OPENGL_COMPAT
&& ctx
->Extensions
.NV_texture_env_combine4
) {
655 return texUnit
->Combine
.SourceRGB
[3];
658 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetTexEnvfv(pname)");
661 case GL_SOURCE0_ALPHA
:
662 case GL_SOURCE1_ALPHA
:
663 case GL_SOURCE2_ALPHA
: {
664 const unsigned alpha_idx
= pname
- GL_SOURCE0_ALPHA
;
665 return texUnit
->Combine
.SourceA
[alpha_idx
];
667 case GL_SOURCE3_ALPHA_NV
:
668 if (ctx
->API
== API_OPENGL_COMPAT
&& ctx
->Extensions
.NV_texture_env_combine4
) {
669 return texUnit
->Combine
.SourceA
[3];
672 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetTexEnvfv(pname)");
675 case GL_OPERAND0_RGB
:
676 case GL_OPERAND1_RGB
:
677 case GL_OPERAND2_RGB
: {
678 const unsigned op_rgb
= pname
- GL_OPERAND0_RGB
;
679 return texUnit
->Combine
.OperandRGB
[op_rgb
];
681 case GL_OPERAND3_RGB_NV
:
682 if (ctx
->API
== API_OPENGL_COMPAT
&& ctx
->Extensions
.NV_texture_env_combine4
) {
683 return texUnit
->Combine
.OperandRGB
[3];
686 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetTexEnvfv(pname)");
689 case GL_OPERAND0_ALPHA
:
690 case GL_OPERAND1_ALPHA
:
691 case GL_OPERAND2_ALPHA
: {
692 const unsigned op_alpha
= pname
- GL_OPERAND0_ALPHA
;
693 return texUnit
->Combine
.OperandA
[op_alpha
];
695 case GL_OPERAND3_ALPHA_NV
:
696 if (ctx
->API
== API_OPENGL_COMPAT
&& ctx
->Extensions
.NV_texture_env_combine4
) {
697 return texUnit
->Combine
.OperandA
[3];
700 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetTexEnvfv(pname)");
704 return 1 << texUnit
->Combine
.ScaleShiftRGB
;
706 return 1 << texUnit
->Combine
.ScaleShiftA
;
708 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetTexEnvfv(pname)");
712 return -1; /* error */
717 _mesa_gettexenvfv_indexed( GLuint texunit
, GLenum target
, GLenum pname
, GLfloat
*params
)
720 GET_CURRENT_CONTEXT(ctx
);
722 maxUnit
= (target
== GL_POINT_SPRITE_NV
&& pname
== GL_COORD_REPLACE_NV
)
723 ? ctx
->Const
.MaxTextureCoordUnits
: ctx
->Const
.MaxCombinedTextureImageUnits
;
724 if (texunit
>= maxUnit
) {
725 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glGetTexEnvfv(texunit=%d)", texunit
);
729 if (target
== GL_TEXTURE_ENV
) {
730 struct gl_fixedfunc_texture_unit
*texUnit
=
731 _mesa_get_fixedfunc_tex_unit(ctx
, texunit
);
733 /* The GL spec says that we should report an error if the unit is greater
734 * than GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, but in practice, only
735 * fixed-function units are usable. This is probably a spec bug.
736 * Ignore calls for non-fixed-func units, because we don't process
737 * glTexEnv for them either.
742 if (pname
== GL_TEXTURE_ENV_COLOR
) {
743 if(ctx
->NewState
& (_NEW_BUFFERS
| _NEW_FRAG_CLAMP
))
744 _mesa_update_state(ctx
);
745 if (_mesa_get_clamp_fragment_color(ctx
, ctx
->DrawBuffer
))
746 COPY_4FV( params
, texUnit
->EnvColor
);
748 COPY_4FV( params
, texUnit
->EnvColorUnclamped
);
751 GLint val
= get_texenvi(ctx
, texUnit
, pname
);
753 *params
= (GLfloat
) val
;
757 else if (target
== GL_TEXTURE_FILTER_CONTROL_EXT
) {
758 const struct gl_texture_unit
*texUnit
= _mesa_get_tex_unit(ctx
, texunit
);
760 if (pname
== GL_TEXTURE_LOD_BIAS_EXT
) {
761 *params
= texUnit
->LodBias
;
764 _mesa_error( ctx
, GL_INVALID_ENUM
, "glGetTexEnvfv(pname)" );
768 else if (target
== GL_POINT_SPRITE_NV
) {
769 /* GL_ARB_point_sprite / GL_NV_point_sprite */
770 if (!ctx
->Extensions
.NV_point_sprite
771 && !ctx
->Extensions
.ARB_point_sprite
) {
772 _mesa_error( ctx
, GL_INVALID_ENUM
, "glGetTexEnvfv(target)" );
775 if (pname
== GL_COORD_REPLACE_NV
) {
776 if (ctx
->Point
.CoordReplace
& (1u << texunit
))
782 _mesa_error( ctx
, GL_INVALID_ENUM
, "glGetTexEnvfv(pname)" );
787 _mesa_error( ctx
, GL_INVALID_ENUM
, "glGetTexEnvfv(target)" );
794 _mesa_gettexenviv_indexed( GLuint texunit
, GLenum target
,
795 GLenum pname
, GLint
*params
)
798 GET_CURRENT_CONTEXT(ctx
);
800 maxUnit
= (target
== GL_POINT_SPRITE_NV
&& pname
== GL_COORD_REPLACE_NV
)
801 ? ctx
->Const
.MaxTextureCoordUnits
: ctx
->Const
.MaxCombinedTextureImageUnits
;
802 if (texunit
>= maxUnit
) {
803 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glGetTexEnviv(texunit=%d)",
808 if (target
== GL_TEXTURE_ENV
) {
809 struct gl_fixedfunc_texture_unit
*texUnit
=
810 _mesa_get_fixedfunc_tex_unit(ctx
, texunit
);
812 /* The GL spec says that we should report an error if the unit is greater
813 * than GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, but in practice, only
814 * fixed-function units are usable. This is probably a spec bug.
815 * Ignore calls for non-fixed-func units, because we don't process
816 * glTexEnv for them either.
821 if (pname
== GL_TEXTURE_ENV_COLOR
) {
822 params
[0] = FLOAT_TO_INT( texUnit
->EnvColor
[0] );
823 params
[1] = FLOAT_TO_INT( texUnit
->EnvColor
[1] );
824 params
[2] = FLOAT_TO_INT( texUnit
->EnvColor
[2] );
825 params
[3] = FLOAT_TO_INT( texUnit
->EnvColor
[3] );
828 GLint val
= get_texenvi(ctx
, texUnit
, pname
);
834 else if (target
== GL_TEXTURE_FILTER_CONTROL_EXT
) {
835 const struct gl_texture_unit
*texUnit
= _mesa_get_tex_unit(ctx
, texunit
);
837 if (pname
== GL_TEXTURE_LOD_BIAS_EXT
) {
838 *params
= (GLint
) texUnit
->LodBias
;
841 _mesa_error( ctx
, GL_INVALID_ENUM
, "glGetTexEnviv(pname)" );
845 else if (target
== GL_POINT_SPRITE_NV
) {
846 /* GL_ARB_point_sprite / GL_NV_point_sprite */
847 if (!ctx
->Extensions
.NV_point_sprite
848 && !ctx
->Extensions
.ARB_point_sprite
) {
849 _mesa_error( ctx
, GL_INVALID_ENUM
, "glGetTexEnviv(target)" );
852 if (pname
== GL_COORD_REPLACE_NV
) {
853 if (ctx
->Point
.CoordReplace
& (1u << texunit
))
859 _mesa_error( ctx
, GL_INVALID_ENUM
, "glGetTexEnviv(pname)" );
864 _mesa_error( ctx
, GL_INVALID_ENUM
, "glGetTexEnviv(target)" );
871 _mesa_GetTexEnvfv( GLenum target
, GLenum pname
, GLfloat
*params
)
873 GET_CURRENT_CONTEXT(ctx
);
874 _mesa_gettexenvfv_indexed(ctx
->Texture
.CurrentUnit
, target
, pname
, params
);
879 _mesa_GetMultiTexEnvfvEXT( GLenum texunit
, GLenum target
,
880 GLenum pname
, GLfloat
*params
)
882 _mesa_gettexenvfv_indexed(texunit
- GL_TEXTURE0
, target
, pname
, params
);
887 _mesa_GetTexEnviv( GLenum target
, GLenum pname
, GLint
*params
)
889 GET_CURRENT_CONTEXT(ctx
);
890 _mesa_gettexenviv_indexed(ctx
->Texture
.CurrentUnit
, target
, pname
, params
);
895 _mesa_GetMultiTexEnvivEXT( GLenum texunit
, GLenum target
,
896 GLenum pname
, GLint
*params
)
898 _mesa_gettexenviv_indexed(texunit
- GL_TEXTURE0
, target
, pname
, params
);