2
* Mesa 3-D graphics library
5
* Copyright (C) 1999-2007 Brian Paul 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
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28
* Texture state handling.
37
#include "texcompress.h"
41
#include "texenvprogram.h"
43
#include "math/m_xform.h"
46
#define ENUM_TO_FLOAT(X) ((GLfloat)(GLint)(X))
47
#define ENUM_TO_DOUBLE(X) ((GLdouble)(GLint)(X))
51
* Default texture combine environment state. This is used to initialize
52
* a context's texture units and as the basis for converting "classic"
53
* texture environmnets to ARB_texture_env_combine style values.
55
static const struct gl_tex_env_combine_state default_combine_state = {
56
GL_MODULATE, GL_MODULATE,
57
{ GL_TEXTURE, GL_PREVIOUS, GL_CONSTANT },
58
{ GL_TEXTURE, GL_PREVIOUS, GL_CONSTANT },
59
{ GL_SRC_COLOR, GL_SRC_COLOR, GL_SRC_ALPHA },
60
{ GL_SRC_ALPHA, GL_SRC_ALPHA, GL_SRC_ALPHA },
68
* Used by glXCopyContext to copy texture state from one context to another.
71
_mesa_copy_texture_state( const GLcontext *src, GLcontext *dst )
78
dst->Texture.CurrentUnit = src->Texture.CurrentUnit;
79
dst->Texture._GenFlags = src->Texture._GenFlags;
80
dst->Texture._TexGenEnabled = src->Texture._TexGenEnabled;
81
dst->Texture._TexMatEnabled = src->Texture._TexMatEnabled;
82
dst->Texture.SharedPalette = src->Texture.SharedPalette;
85
for (i = 0; i < src->Const.MaxTextureUnits; i++) {
86
dst->Texture.Unit[i].Enabled = src->Texture.Unit[i].Enabled;
87
dst->Texture.Unit[i].EnvMode = src->Texture.Unit[i].EnvMode;
88
COPY_4V(dst->Texture.Unit[i].EnvColor, src->Texture.Unit[i].EnvColor);
89
dst->Texture.Unit[i].TexGenEnabled = src->Texture.Unit[i].TexGenEnabled;
90
dst->Texture.Unit[i].GenModeS = src->Texture.Unit[i].GenModeS;
91
dst->Texture.Unit[i].GenModeT = src->Texture.Unit[i].GenModeT;
92
dst->Texture.Unit[i].GenModeR = src->Texture.Unit[i].GenModeR;
93
dst->Texture.Unit[i].GenModeQ = src->Texture.Unit[i].GenModeQ;
94
dst->Texture.Unit[i]._GenBitS = src->Texture.Unit[i]._GenBitS;
95
dst->Texture.Unit[i]._GenBitT = src->Texture.Unit[i]._GenBitT;
96
dst->Texture.Unit[i]._GenBitR = src->Texture.Unit[i]._GenBitR;
97
dst->Texture.Unit[i]._GenBitQ = src->Texture.Unit[i]._GenBitQ;
98
dst->Texture.Unit[i]._GenFlags = src->Texture.Unit[i]._GenFlags;
99
COPY_4V(dst->Texture.Unit[i].ObjectPlaneS, src->Texture.Unit[i].ObjectPlaneS);
100
COPY_4V(dst->Texture.Unit[i].ObjectPlaneT, src->Texture.Unit[i].ObjectPlaneT);
101
COPY_4V(dst->Texture.Unit[i].ObjectPlaneR, src->Texture.Unit[i].ObjectPlaneR);
102
COPY_4V(dst->Texture.Unit[i].ObjectPlaneQ, src->Texture.Unit[i].ObjectPlaneQ);
103
COPY_4V(dst->Texture.Unit[i].EyePlaneS, src->Texture.Unit[i].EyePlaneS);
104
COPY_4V(dst->Texture.Unit[i].EyePlaneT, src->Texture.Unit[i].EyePlaneT);
105
COPY_4V(dst->Texture.Unit[i].EyePlaneR, src->Texture.Unit[i].EyePlaneR);
106
COPY_4V(dst->Texture.Unit[i].EyePlaneQ, src->Texture.Unit[i].EyePlaneQ);
107
dst->Texture.Unit[i].LodBias = src->Texture.Unit[i].LodBias;
109
/* GL_EXT_texture_env_combine */
110
dst->Texture.Unit[i].Combine.ModeRGB = src->Texture.Unit[i].Combine.ModeRGB;
111
dst->Texture.Unit[i].Combine.ModeA = src->Texture.Unit[i].Combine.ModeA;
112
COPY_3V(dst->Texture.Unit[i].Combine.SourceRGB, src->Texture.Unit[i].Combine.SourceRGB);
113
COPY_3V(dst->Texture.Unit[i].Combine.SourceA, src->Texture.Unit[i].Combine.SourceA);
114
COPY_3V(dst->Texture.Unit[i].Combine.OperandRGB, src->Texture.Unit[i].Combine.OperandRGB);
115
COPY_3V(dst->Texture.Unit[i].Combine.OperandA, src->Texture.Unit[i].Combine.OperandA);
116
dst->Texture.Unit[i].Combine.ScaleShiftRGB = src->Texture.Unit[i].Combine.ScaleShiftRGB;
117
dst->Texture.Unit[i].Combine.ScaleShiftA = src->Texture.Unit[i].Combine.ScaleShiftA;
119
/* copy texture object bindings, not contents of texture objects */
120
_mesa_lock_context_textures(dst);
122
_mesa_reference_texobj(&dst->Texture.Unit[i].Current1D,
123
src->Texture.Unit[i].Current1D);
124
_mesa_reference_texobj(&dst->Texture.Unit[i].Current2D,
125
src->Texture.Unit[i].Current2D);
126
_mesa_reference_texobj(&dst->Texture.Unit[i].Current3D,
127
src->Texture.Unit[i].Current3D);
128
_mesa_reference_texobj(&dst->Texture.Unit[i].CurrentCubeMap,
129
src->Texture.Unit[i].CurrentCubeMap);
130
_mesa_reference_texobj(&dst->Texture.Unit[i].CurrentRect,
131
src->Texture.Unit[i].CurrentRect);
133
_mesa_unlock_context_textures(dst);
142
_mesa_print_texunit_state( GLcontext *ctx, GLuint unit )
144
const struct gl_texture_unit *texUnit = ctx->Texture.Unit + unit;
145
_mesa_printf("Texture Unit %d\n", unit);
146
_mesa_printf(" GL_TEXTURE_ENV_MODE = %s\n", _mesa_lookup_enum_by_nr(texUnit->EnvMode));
147
_mesa_printf(" GL_COMBINE_RGB = %s\n", _mesa_lookup_enum_by_nr(texUnit->Combine.ModeRGB));
148
_mesa_printf(" GL_COMBINE_ALPHA = %s\n", _mesa_lookup_enum_by_nr(texUnit->Combine.ModeA));
149
_mesa_printf(" GL_SOURCE0_RGB = %s\n", _mesa_lookup_enum_by_nr(texUnit->Combine.SourceRGB[0]));
150
_mesa_printf(" GL_SOURCE1_RGB = %s\n", _mesa_lookup_enum_by_nr(texUnit->Combine.SourceRGB[1]));
151
_mesa_printf(" GL_SOURCE2_RGB = %s\n", _mesa_lookup_enum_by_nr(texUnit->Combine.SourceRGB[2]));
152
_mesa_printf(" GL_SOURCE0_ALPHA = %s\n", _mesa_lookup_enum_by_nr(texUnit->Combine.SourceA[0]));
153
_mesa_printf(" GL_SOURCE1_ALPHA = %s\n", _mesa_lookup_enum_by_nr(texUnit->Combine.SourceA[1]));
154
_mesa_printf(" GL_SOURCE2_ALPHA = %s\n", _mesa_lookup_enum_by_nr(texUnit->Combine.SourceA[2]));
155
_mesa_printf(" GL_OPERAND0_RGB = %s\n", _mesa_lookup_enum_by_nr(texUnit->Combine.OperandRGB[0]));
156
_mesa_printf(" GL_OPERAND1_RGB = %s\n", _mesa_lookup_enum_by_nr(texUnit->Combine.OperandRGB[1]));
157
_mesa_printf(" GL_OPERAND2_RGB = %s\n", _mesa_lookup_enum_by_nr(texUnit->Combine.OperandRGB[2]));
158
_mesa_printf(" GL_OPERAND0_ALPHA = %s\n", _mesa_lookup_enum_by_nr(texUnit->Combine.OperandA[0]));
159
_mesa_printf(" GL_OPERAND1_ALPHA = %s\n", _mesa_lookup_enum_by_nr(texUnit->Combine.OperandA[1]));
160
_mesa_printf(" GL_OPERAND2_ALPHA = %s\n", _mesa_lookup_enum_by_nr(texUnit->Combine.OperandA[2]));
161
_mesa_printf(" GL_RGB_SCALE = %d\n", 1 << texUnit->Combine.ScaleShiftRGB);
162
_mesa_printf(" GL_ALPHA_SCALE = %d\n", 1 << texUnit->Combine.ScaleShiftA);
163
_mesa_printf(" GL_TEXTURE_ENV_COLOR = (%f, %f, %f, %f)\n", texUnit->EnvColor[0], texUnit->EnvColor[1], texUnit->EnvColor[2], texUnit->EnvColor[3]);
168
/**********************************************************************/
169
/* Texture Environment */
170
/**********************************************************************/
173
* Convert "classic" texture environment to ARB_texture_env_combine style
176
* \param state texture_env_combine state vector to be filled-in.
177
* \param mode Classic texture environment mode (i.e., \c GL_REPLACE,
178
* \c GL_BLEND, \c GL_DECAL, etc.).
179
* \param texBaseFormat Base format of the texture associated with the
183
calculate_derived_texenv( struct gl_tex_env_combine_state *state,
184
GLenum mode, GLenum texBaseFormat )
189
*state = default_combine_state;
191
switch (texBaseFormat) {
193
state->SourceRGB[0] = GL_PREVIOUS;
196
case GL_LUMINANCE_ALPHA:
204
state->SourceA[0] = GL_PREVIOUS;
208
_mesa_problem(NULL, "Invalid texBaseFormat in calculate_derived_texenv");
215
mode_rgb = (texBaseFormat == GL_ALPHA) ? GL_REPLACE : mode;
220
mode_rgb = GL_INTERPOLATE;
223
state->SourceA[0] = GL_PREVIOUS;
225
/* Having alpha / luminance / intensity textures replace using the
226
* incoming fragment color matches the definition in NV_texture_shader.
227
* The 1.5 spec simply marks these as "undefined".
229
switch (texBaseFormat) {
232
case GL_LUMINANCE_ALPHA:
234
state->SourceRGB[0] = GL_PREVIOUS;
238
mode_rgb = GL_REPLACE;
241
state->SourceRGB[2] = GL_TEXTURE;
247
mode_rgb = GL_INTERPOLATE;
248
mode_a = GL_MODULATE;
250
switch (texBaseFormat) {
252
mode_rgb = GL_REPLACE;
255
mode_a = GL_INTERPOLATE;
256
state->SourceA[0] = GL_CONSTANT;
257
state->OperandA[2] = GL_SRC_ALPHA;
261
case GL_LUMINANCE_ALPHA:
264
state->SourceRGB[2] = GL_TEXTURE;
265
state->SourceA[2] = GL_TEXTURE;
266
state->SourceRGB[0] = GL_CONSTANT;
267
state->OperandRGB[2] = GL_SRC_COLOR;
273
mode_rgb = (texBaseFormat == GL_ALPHA) ? GL_REPLACE : GL_ADD;
274
mode_a = (texBaseFormat == GL_INTENSITY) ? GL_ADD : GL_MODULATE;
279
"Invalid texture env mode in calculate_derived_texenv");
283
state->ModeRGB = (state->SourceRGB[0] != GL_PREVIOUS)
284
? mode_rgb : GL_REPLACE;
285
state->ModeA = (state->SourceA[0] != GL_PREVIOUS)
286
? mode_a : GL_REPLACE;
291
_mesa_TexEnvfv( GLenum target, GLenum pname, const GLfloat *param )
294
GET_CURRENT_CONTEXT(ctx);
295
struct gl_texture_unit *texUnit;
296
ASSERT_OUTSIDE_BEGIN_END(ctx);
298
maxUnit = (target == GL_POINT_SPRITE_NV && pname == GL_COORD_REPLACE_NV)
299
? ctx->Const.MaxTextureCoordUnits : ctx->Const.MaxTextureImageUnits;
300
if (ctx->Texture.CurrentUnit >= maxUnit) {
301
_mesa_error(ctx, GL_INVALID_OPERATION, "glTexEnvfv(current unit)");
305
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
307
#define TE_ERROR(errCode, msg, value) \
308
_mesa_error(ctx, errCode, msg, _mesa_lookup_enum_by_nr(value));
310
if (target == GL_TEXTURE_ENV) {
312
case GL_TEXTURE_ENV_MODE:
314
const GLenum mode = (GLenum) (GLint) *param;
315
if (texUnit->EnvMode == mode)
317
if (mode == GL_MODULATE ||
320
mode == GL_REPLACE ||
321
(mode == GL_ADD && ctx->Extensions.EXT_texture_env_add) ||
322
(mode == GL_COMBINE &&
323
(ctx->Extensions.EXT_texture_env_combine ||
324
ctx->Extensions.ARB_texture_env_combine))) {
326
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
327
texUnit->EnvMode = mode;
330
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode);
335
case GL_TEXTURE_ENV_COLOR:
338
tmp[0] = CLAMP( param[0], 0.0F, 1.0F );
339
tmp[1] = CLAMP( param[1], 0.0F, 1.0F );
340
tmp[2] = CLAMP( param[2], 0.0F, 1.0F );
341
tmp[3] = CLAMP( param[3], 0.0F, 1.0F );
342
if (TEST_EQ_4V(tmp, texUnit->EnvColor))
344
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
345
COPY_4FV(texUnit->EnvColor, tmp);
349
if (ctx->Extensions.EXT_texture_env_combine ||
350
ctx->Extensions.ARB_texture_env_combine) {
351
const GLenum mode = (GLenum) (GLint) *param;
352
if (texUnit->Combine.ModeRGB == mode)
363
if (!ctx->Extensions.ARB_texture_env_combine) {
364
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode);
368
case GL_DOT3_RGB_EXT:
369
case GL_DOT3_RGBA_EXT:
370
if (!ctx->Extensions.EXT_texture_env_dot3) {
371
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode);
377
if (!ctx->Extensions.ARB_texture_env_dot3) {
378
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode);
382
case GL_MODULATE_ADD_ATI:
383
case GL_MODULATE_SIGNED_ADD_ATI:
384
case GL_MODULATE_SUBTRACT_ATI:
385
if (!ctx->Extensions.ATI_texture_env_combine3) {
386
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode);
391
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode);
394
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
395
texUnit->Combine.ModeRGB = mode;
398
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
402
case GL_COMBINE_ALPHA:
403
if (ctx->Extensions.EXT_texture_env_combine ||
404
ctx->Extensions.ARB_texture_env_combine) {
405
const GLenum mode = (GLenum) (GLint) *param;
406
if (texUnit->Combine.ModeA == mode)
417
if (!ctx->Extensions.ARB_texture_env_combine) {
418
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode);
422
case GL_MODULATE_ADD_ATI:
423
case GL_MODULATE_SIGNED_ADD_ATI:
424
case GL_MODULATE_SUBTRACT_ATI:
425
if (!ctx->Extensions.ATI_texture_env_combine3) {
426
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode);
431
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode);
434
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
435
texUnit->Combine.ModeA = mode;
438
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
445
if (ctx->Extensions.EXT_texture_env_combine ||
446
ctx->Extensions.ARB_texture_env_combine) {
447
const GLenum source = (GLenum) (GLint) *param;
448
const GLuint s = pname - GL_SOURCE0_RGB;
449
if (texUnit->Combine.SourceRGB[s] == source)
451
if (source == GL_TEXTURE ||
452
source == GL_CONSTANT ||
453
source == GL_PRIMARY_COLOR ||
454
source == GL_PREVIOUS ||
455
(ctx->Extensions.ARB_texture_env_crossbar &&
456
source >= GL_TEXTURE0 &&
457
source < GL_TEXTURE0 + ctx->Const.MaxTextureUnits) ||
458
(ctx->Extensions.ATI_texture_env_combine3 &&
459
(source == GL_ZERO || source == GL_ONE))) {
461
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
462
texUnit->Combine.SourceRGB[s] = source;
465
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", source);
470
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
474
case GL_SOURCE0_ALPHA:
475
case GL_SOURCE1_ALPHA:
476
case GL_SOURCE2_ALPHA:
477
if (ctx->Extensions.EXT_texture_env_combine ||
478
ctx->Extensions.ARB_texture_env_combine) {
479
const GLenum source = (GLenum) (GLint) *param;
480
const GLuint s = pname - GL_SOURCE0_ALPHA;
481
if (texUnit->Combine.SourceA[s] == source)
483
if (source == GL_TEXTURE ||
484
source == GL_CONSTANT ||
485
source == GL_PRIMARY_COLOR ||
486
source == GL_PREVIOUS ||
487
(ctx->Extensions.ARB_texture_env_crossbar &&
488
source >= GL_TEXTURE0 &&
489
source < GL_TEXTURE0 + ctx->Const.MaxTextureUnits) ||
490
(ctx->Extensions.ATI_texture_env_combine3 &&
491
(source == GL_ZERO || source == GL_ONE))) {
493
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
494
texUnit->Combine.SourceA[s] = source;
497
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", source);
502
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
506
case GL_OPERAND0_RGB:
507
case GL_OPERAND1_RGB:
508
if (ctx->Extensions.EXT_texture_env_combine ||
509
ctx->Extensions.ARB_texture_env_combine) {
510
const GLenum operand = (GLenum) (GLint) *param;
511
const GLuint s = pname - GL_OPERAND0_RGB;
512
if (texUnit->Combine.OperandRGB[s] == operand)
516
case GL_ONE_MINUS_SRC_COLOR:
518
case GL_ONE_MINUS_SRC_ALPHA:
519
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
520
texUnit->Combine.OperandRGB[s] = operand;
523
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", operand);
528
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
532
case GL_OPERAND0_ALPHA:
533
case GL_OPERAND1_ALPHA:
534
if (ctx->Extensions.EXT_texture_env_combine ||
535
ctx->Extensions.ARB_texture_env_combine) {
536
const GLenum operand = (GLenum) (GLint) *param;
537
if (texUnit->Combine.OperandA[pname-GL_OPERAND0_ALPHA] == operand)
541
case GL_ONE_MINUS_SRC_ALPHA:
542
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
543
texUnit->Combine.OperandA[pname-GL_OPERAND0_ALPHA] = operand;
546
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", operand);
551
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
555
case GL_OPERAND2_RGB:
556
if (ctx->Extensions.ARB_texture_env_combine) {
557
const GLenum operand = (GLenum) (GLint) *param;
558
if (texUnit->Combine.OperandRGB[2] == operand)
561
case GL_SRC_COLOR: /* ARB combine only */
562
case GL_ONE_MINUS_SRC_COLOR: /* ARB combine only */
564
case GL_ONE_MINUS_SRC_ALPHA: /* ARB combine only */
565
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
566
texUnit->Combine.OperandRGB[2] = operand;
569
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", operand);
573
else if (ctx->Extensions.EXT_texture_env_combine) {
574
const GLenum operand = (GLenum) (GLint) *param;
575
if (texUnit->Combine.OperandRGB[2] == operand)
577
/* operand must be GL_SRC_ALPHA which is the initial value - thus
578
don't need to actually compare the operand to the possible value */
580
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", operand);
585
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
589
case GL_OPERAND2_ALPHA:
590
if (ctx->Extensions.ARB_texture_env_combine) {
591
const GLenum operand = (GLenum) (GLint) *param;
592
if (texUnit->Combine.OperandA[2] == operand)
596
case GL_ONE_MINUS_SRC_ALPHA: /* ARB combine only */
597
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
598
texUnit->Combine.OperandA[2] = operand;
601
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", operand);
605
else if (ctx->Extensions.EXT_texture_env_combine) {
606
const GLenum operand = (GLenum) (GLint) *param;
607
if (texUnit->Combine.OperandA[2] == operand)
609
/* operand must be GL_SRC_ALPHA which is the initial value - thus
610
don't need to actually compare the operand to the possible value */
612
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", operand);
617
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
622
if (ctx->Extensions.EXT_texture_env_combine ||
623
ctx->Extensions.ARB_texture_env_combine) {
628
else if (*param == 2.0) {
631
else if (*param == 4.0) {
635
_mesa_error( ctx, GL_INVALID_VALUE,
636
"glTexEnv(GL_RGB_SCALE not 1, 2 or 4)" );
639
if (texUnit->Combine.ScaleShiftRGB == newshift)
641
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
642
texUnit->Combine.ScaleShiftRGB = newshift;
645
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
650
if (ctx->Extensions.EXT_texture_env_combine ||
651
ctx->Extensions.ARB_texture_env_combine) {
656
else if (*param == 2.0) {
659
else if (*param == 4.0) {
663
_mesa_error( ctx, GL_INVALID_VALUE,
664
"glTexEnv(GL_ALPHA_SCALE not 1, 2 or 4)" );
667
if (texUnit->Combine.ScaleShiftA == newshift)
669
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
670
texUnit->Combine.ScaleShiftA = newshift;
673
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
678
_mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(pname)" );
682
else if (target == GL_TEXTURE_FILTER_CONTROL_EXT) {
683
/* GL_EXT_texture_lod_bias */
684
if (!ctx->Extensions.EXT_texture_lod_bias) {
685
_mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(target=0x%x)", target );
688
if (pname == GL_TEXTURE_LOD_BIAS_EXT) {
689
if (texUnit->LodBias == param[0])
691
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
692
texUnit->LodBias = param[0];
695
TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
699
else if (target == GL_POINT_SPRITE_NV) {
700
/* GL_ARB_point_sprite / GL_NV_point_sprite */
701
if (!ctx->Extensions.NV_point_sprite
702
&& !ctx->Extensions.ARB_point_sprite) {
703
_mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(target=0x%x)", target );
706
if (pname == GL_COORD_REPLACE_NV) {
707
const GLenum value = (GLenum) param[0];
708
if (value == GL_TRUE || value == GL_FALSE) {
709
/* It's kind of weird to set point state via glTexEnv,
710
* but that's what the spec calls for.
712
const GLboolean state = (GLboolean) value;
713
if (ctx->Point.CoordReplace[ctx->Texture.CurrentUnit] == state)
715
FLUSH_VERTICES(ctx, _NEW_POINT);
716
ctx->Point.CoordReplace[ctx->Texture.CurrentUnit] = state;
719
_mesa_error( ctx, GL_INVALID_VALUE, "glTexEnv(param=0x%x)", value);
724
_mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(pname=0x%x)", pname );
729
_mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(target=0x%x)",target );
733
if (MESA_VERBOSE&(VERBOSE_API|VERBOSE_TEXTURE))
734
_mesa_debug(ctx, "glTexEnv %s %s %.1f(%s) ...\n",
735
_mesa_lookup_enum_by_nr(target),
736
_mesa_lookup_enum_by_nr(pname),
738
_mesa_lookup_enum_by_nr((GLenum) (GLint) *param));
740
/* Tell device driver about the new texture environment */
741
if (ctx->Driver.TexEnv) {
742
(*ctx->Driver.TexEnv)( ctx, target, pname, param );
748
_mesa_TexEnvf( GLenum target, GLenum pname, GLfloat param )
750
_mesa_TexEnvfv( target, pname, ¶m );
756
_mesa_TexEnvi( GLenum target, GLenum pname, GLint param )
759
p[0] = (GLfloat) param;
760
p[1] = p[2] = p[3] = 0.0;
761
_mesa_TexEnvfv( target, pname, p );
766
_mesa_TexEnviv( GLenum target, GLenum pname, const GLint *param )
769
if (pname == GL_TEXTURE_ENV_COLOR) {
770
p[0] = INT_TO_FLOAT( param[0] );
771
p[1] = INT_TO_FLOAT( param[1] );
772
p[2] = INT_TO_FLOAT( param[2] );
773
p[3] = INT_TO_FLOAT( param[3] );
776
p[0] = (GLfloat) param[0];
777
p[1] = p[2] = p[3] = 0; /* init to zero, just to be safe */
779
_mesa_TexEnvfv( target, pname, p );
784
_mesa_GetTexEnvfv( GLenum target, GLenum pname, GLfloat *params )
787
const struct gl_texture_unit *texUnit;
788
GET_CURRENT_CONTEXT(ctx);
789
ASSERT_OUTSIDE_BEGIN_END(ctx);
791
maxUnit = (target == GL_POINT_SPRITE_NV && pname == GL_COORD_REPLACE_NV)
792
? ctx->Const.MaxTextureCoordUnits : ctx->Const.MaxTextureImageUnits;
793
if (ctx->Texture.CurrentUnit >= maxUnit) {
794
_mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexEnvfv(current unit)");
798
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
800
if (target == GL_TEXTURE_ENV) {
802
case GL_TEXTURE_ENV_MODE:
803
*params = ENUM_TO_FLOAT(texUnit->EnvMode);
805
case GL_TEXTURE_ENV_COLOR:
806
COPY_4FV( params, texUnit->EnvColor );
809
if (ctx->Extensions.EXT_texture_env_combine ||
810
ctx->Extensions.ARB_texture_env_combine) {
811
*params = (GLfloat) texUnit->Combine.ModeRGB;
814
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
817
case GL_COMBINE_ALPHA:
818
if (ctx->Extensions.EXT_texture_env_combine ||
819
ctx->Extensions.ARB_texture_env_combine) {
820
*params = (GLfloat) texUnit->Combine.ModeA;
823
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
829
if (ctx->Extensions.EXT_texture_env_combine ||
830
ctx->Extensions.ARB_texture_env_combine) {
831
const unsigned rgb_idx = pname - GL_SOURCE0_RGB;
832
*params = (GLfloat) texUnit->Combine.SourceRGB[rgb_idx];
835
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
838
case GL_SOURCE0_ALPHA:
839
case GL_SOURCE1_ALPHA:
840
case GL_SOURCE2_ALPHA:
841
if (ctx->Extensions.EXT_texture_env_combine ||
842
ctx->Extensions.ARB_texture_env_combine) {
843
const unsigned alpha_idx = pname - GL_SOURCE0_ALPHA;
844
*params = (GLfloat) texUnit->Combine.SourceA[alpha_idx];
847
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
850
case GL_OPERAND0_RGB:
851
case GL_OPERAND1_RGB:
852
case GL_OPERAND2_RGB:
853
if (ctx->Extensions.EXT_texture_env_combine ||
854
ctx->Extensions.ARB_texture_env_combine) {
855
const unsigned op_rgb = pname - GL_OPERAND0_RGB;
856
*params = (GLfloat) texUnit->Combine.OperandRGB[op_rgb];
859
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
862
case GL_OPERAND0_ALPHA:
863
case GL_OPERAND1_ALPHA:
864
case GL_OPERAND2_ALPHA:
865
if (ctx->Extensions.EXT_texture_env_combine ||
866
ctx->Extensions.ARB_texture_env_combine) {
867
const unsigned op_alpha = pname - GL_OPERAND0_ALPHA;
868
*params = (GLfloat) texUnit->Combine.OperandA[op_alpha];
871
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
875
if (ctx->Extensions.EXT_texture_env_combine ||
876
ctx->Extensions.ARB_texture_env_combine) {
877
if (texUnit->Combine.ScaleShiftRGB == 0)
879
else if (texUnit->Combine.ScaleShiftRGB == 1)
885
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
890
if (ctx->Extensions.EXT_texture_env_combine ||
891
ctx->Extensions.ARB_texture_env_combine) {
892
if (texUnit->Combine.ScaleShiftA == 0)
894
else if (texUnit->Combine.ScaleShiftA == 1)
900
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
905
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname=0x%x)", pname);
908
else if (target == GL_TEXTURE_FILTER_CONTROL_EXT) {
909
/* GL_EXT_texture_lod_bias */
910
if (!ctx->Extensions.EXT_texture_lod_bias) {
911
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(target)" );
914
if (pname == GL_TEXTURE_LOD_BIAS_EXT) {
915
*params = texUnit->LodBias;
918
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)" );
922
else if (target == GL_POINT_SPRITE_NV) {
923
/* GL_ARB_point_sprite / GL_NV_point_sprite */
924
if (!ctx->Extensions.NV_point_sprite
925
&& !ctx->Extensions.ARB_point_sprite) {
926
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(target)" );
929
if (pname == GL_COORD_REPLACE_NV) {
930
*params = (GLfloat) ctx->Point.CoordReplace[ctx->Texture.CurrentUnit];
933
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)" );
938
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(target)" );
945
_mesa_GetTexEnviv( GLenum target, GLenum pname, GLint *params )
948
const struct gl_texture_unit *texUnit;
949
GET_CURRENT_CONTEXT(ctx);
950
ASSERT_OUTSIDE_BEGIN_END(ctx);
952
maxUnit = (target == GL_POINT_SPRITE_NV && pname == GL_COORD_REPLACE_NV)
953
? ctx->Const.MaxTextureCoordUnits : ctx->Const.MaxTextureImageUnits;
954
if (ctx->Texture.CurrentUnit >= maxUnit) {
955
_mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexEnviv(current unit)");
959
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
961
if (target == GL_TEXTURE_ENV) {
963
case GL_TEXTURE_ENV_MODE:
964
*params = (GLint) texUnit->EnvMode;
966
case GL_TEXTURE_ENV_COLOR:
967
params[0] = FLOAT_TO_INT( texUnit->EnvColor[0] );
968
params[1] = FLOAT_TO_INT( texUnit->EnvColor[1] );
969
params[2] = FLOAT_TO_INT( texUnit->EnvColor[2] );
970
params[3] = FLOAT_TO_INT( texUnit->EnvColor[3] );
973
if (ctx->Extensions.EXT_texture_env_combine ||
974
ctx->Extensions.ARB_texture_env_combine) {
975
*params = (GLint) texUnit->Combine.ModeRGB;
978
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)");
981
case GL_COMBINE_ALPHA:
982
if (ctx->Extensions.EXT_texture_env_combine ||
983
ctx->Extensions.ARB_texture_env_combine) {
984
*params = (GLint) texUnit->Combine.ModeA;
987
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)");
993
if (ctx->Extensions.EXT_texture_env_combine ||
994
ctx->Extensions.ARB_texture_env_combine) {
995
const unsigned rgb_idx = pname - GL_SOURCE0_RGB;
996
*params = (GLint) texUnit->Combine.SourceRGB[rgb_idx];
999
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)");
1002
case GL_SOURCE0_ALPHA:
1003
case GL_SOURCE1_ALPHA:
1004
case GL_SOURCE2_ALPHA:
1005
if (ctx->Extensions.EXT_texture_env_combine ||
1006
ctx->Extensions.ARB_texture_env_combine) {
1007
const unsigned alpha_idx = pname - GL_SOURCE0_ALPHA;
1008
*params = (GLint) texUnit->Combine.SourceA[alpha_idx];
1011
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)");
1014
case GL_OPERAND0_RGB:
1015
case GL_OPERAND1_RGB:
1016
case GL_OPERAND2_RGB:
1017
if (ctx->Extensions.EXT_texture_env_combine ||
1018
ctx->Extensions.ARB_texture_env_combine) {
1019
const unsigned op_rgb = pname - GL_OPERAND0_RGB;
1020
*params = (GLint) texUnit->Combine.OperandRGB[op_rgb];
1023
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)");
1026
case GL_OPERAND0_ALPHA:
1027
case GL_OPERAND1_ALPHA:
1028
case GL_OPERAND2_ALPHA:
1029
if (ctx->Extensions.EXT_texture_env_combine ||
1030
ctx->Extensions.ARB_texture_env_combine) {
1031
const unsigned op_alpha = pname - GL_OPERAND0_ALPHA;
1032
*params = (GLint) texUnit->Combine.OperandA[op_alpha];
1035
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)");
1039
if (ctx->Extensions.EXT_texture_env_combine ||
1040
ctx->Extensions.ARB_texture_env_combine) {
1041
if (texUnit->Combine.ScaleShiftRGB == 0)
1043
else if (texUnit->Combine.ScaleShiftRGB == 1)
1049
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)");
1053
case GL_ALPHA_SCALE:
1054
if (ctx->Extensions.EXT_texture_env_combine ||
1055
ctx->Extensions.ARB_texture_env_combine) {
1056
if (texUnit->Combine.ScaleShiftA == 0)
1058
else if (texUnit->Combine.ScaleShiftA == 1)
1064
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)");
1069
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname=0x%x)",
1073
else if (target == GL_TEXTURE_FILTER_CONTROL_EXT) {
1074
/* GL_EXT_texture_lod_bias */
1075
if (!ctx->Extensions.EXT_texture_lod_bias) {
1076
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(target)" );
1079
if (pname == GL_TEXTURE_LOD_BIAS_EXT) {
1080
*params = (GLint) texUnit->LodBias;
1083
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)" );
1087
else if (target == GL_POINT_SPRITE_NV) {
1088
/* GL_ARB_point_sprite / GL_NV_point_sprite */
1089
if (!ctx->Extensions.NV_point_sprite
1090
&& !ctx->Extensions.ARB_point_sprite) {
1091
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(target)" );
1094
if (pname == GL_COORD_REPLACE_NV) {
1095
*params = (GLint) ctx->Point.CoordReplace[ctx->Texture.CurrentUnit];
1098
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)" );
1103
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(target)" );
1111
/**********************************************************************/
1112
/* Texture Parameters */
1113
/**********************************************************************/
1116
_mesa_validate_texture_wrap_mode(GLcontext * ctx,
1117
GLenum target, GLenum eparam)
1119
const struct gl_extensions * const e = & ctx->Extensions;
1121
if (eparam == GL_CLAMP || eparam == GL_CLAMP_TO_EDGE ||
1122
(eparam == GL_CLAMP_TO_BORDER && e->ARB_texture_border_clamp)) {
1123
/* any texture target */
1126
else if (target != GL_TEXTURE_RECTANGLE_NV &&
1127
(eparam == GL_REPEAT ||
1128
(eparam == GL_MIRRORED_REPEAT &&
1129
e->ARB_texture_mirrored_repeat) ||
1130
(eparam == GL_MIRROR_CLAMP_EXT &&
1131
(e->ATI_texture_mirror_once || e->EXT_texture_mirror_clamp)) ||
1132
(eparam == GL_MIRROR_CLAMP_TO_EDGE_EXT &&
1133
(e->ATI_texture_mirror_once || e->EXT_texture_mirror_clamp)) ||
1134
(eparam == GL_MIRROR_CLAMP_TO_BORDER_EXT &&
1135
(e->EXT_texture_mirror_clamp)))) {
1136
/* non-rectangle texture */
1140
_mesa_error( ctx, GL_INVALID_VALUE, "glTexParameter(param)" );
1146
_mesa_TexParameterf( GLenum target, GLenum pname, GLfloat param )
1148
_mesa_TexParameterfv(target, pname, ¶m);
1153
_mesa_TexParameterfv( GLenum target, GLenum pname, const GLfloat *params )
1155
const GLenum eparam = (GLenum) (GLint) params[0];
1156
struct gl_texture_unit *texUnit;
1157
struct gl_texture_object *texObj;
1158
GET_CURRENT_CONTEXT(ctx);
1159
ASSERT_OUTSIDE_BEGIN_END(ctx);
1161
if (MESA_VERBOSE&(VERBOSE_API|VERBOSE_TEXTURE))
1162
_mesa_debug(ctx, "glTexParameter %s %s %.1f(%s)...\n",
1163
_mesa_lookup_enum_by_nr(target),
1164
_mesa_lookup_enum_by_nr(pname),
1166
_mesa_lookup_enum_by_nr(eparam));
1168
if (ctx->Texture.CurrentUnit >= ctx->Const.MaxTextureImageUnits) {
1169
_mesa_error(ctx, GL_INVALID_OPERATION, "glTexParameterfv(current unit)");
1173
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
1177
texObj = texUnit->Current1D;
1180
texObj = texUnit->Current2D;
1183
texObj = texUnit->Current3D;
1185
case GL_TEXTURE_CUBE_MAP:
1186
if (!ctx->Extensions.ARB_texture_cube_map) {
1187
_mesa_error( ctx, GL_INVALID_ENUM, "glTexParameter(target)" );
1190
texObj = texUnit->CurrentCubeMap;
1192
case GL_TEXTURE_RECTANGLE_NV:
1193
if (!ctx->Extensions.NV_texture_rectangle) {
1194
_mesa_error( ctx, GL_INVALID_ENUM, "glTexParameter(target)" );
1197
texObj = texUnit->CurrentRect;
1200
_mesa_error( ctx, GL_INVALID_ENUM, "glTexParameter(target)" );
1205
case GL_TEXTURE_MIN_FILTER:
1206
/* A small optimization */
1207
if (texObj->MinFilter == eparam)
1209
if (eparam==GL_NEAREST || eparam==GL_LINEAR) {
1210
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
1211
texObj->MinFilter = eparam;
1213
else if ((eparam==GL_NEAREST_MIPMAP_NEAREST ||
1214
eparam==GL_LINEAR_MIPMAP_NEAREST ||
1215
eparam==GL_NEAREST_MIPMAP_LINEAR ||
1216
eparam==GL_LINEAR_MIPMAP_LINEAR) &&
1217
texObj->Target != GL_TEXTURE_RECTANGLE_NV) {
1218
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
1219
texObj->MinFilter = eparam;
1222
_mesa_error( ctx, GL_INVALID_VALUE, "glTexParameter(param)" );
1226
case GL_TEXTURE_MAG_FILTER:
1227
/* A small optimization */
1228
if (texObj->MagFilter == eparam)
1231
if (eparam==GL_NEAREST || eparam==GL_LINEAR) {
1232
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
1233
texObj->MagFilter = eparam;
1236
_mesa_error( ctx, GL_INVALID_VALUE, "glTexParameter(param)" );
1240
case GL_TEXTURE_WRAP_S:
1241
if (texObj->WrapS == eparam)
1243
if (_mesa_validate_texture_wrap_mode(ctx, texObj->Target, eparam)) {
1244
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
1245
texObj->WrapS = eparam;
1251
case GL_TEXTURE_WRAP_T:
1252
if (texObj->WrapT == eparam)
1254
if (_mesa_validate_texture_wrap_mode(ctx, texObj->Target, eparam)) {
1255
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
1256
texObj->WrapT = eparam;
1262
case GL_TEXTURE_WRAP_R:
1263
if (texObj->WrapR == eparam)
1265
if (_mesa_validate_texture_wrap_mode(ctx, texObj->Target, eparam)) {
1266
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
1267
texObj->WrapR = eparam;
1273
case GL_TEXTURE_BORDER_COLOR:
1274
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
1275
texObj->BorderColor[RCOMP] = params[0];
1276
texObj->BorderColor[GCOMP] = params[1];
1277
texObj->BorderColor[BCOMP] = params[2];
1278
texObj->BorderColor[ACOMP] = params[3];
1279
UNCLAMPED_FLOAT_TO_CHAN(texObj->_BorderChan[RCOMP], params[0]);
1280
UNCLAMPED_FLOAT_TO_CHAN(texObj->_BorderChan[GCOMP], params[1]);
1281
UNCLAMPED_FLOAT_TO_CHAN(texObj->_BorderChan[BCOMP], params[2]);
1282
UNCLAMPED_FLOAT_TO_CHAN(texObj->_BorderChan[ACOMP], params[3]);
1284
case GL_TEXTURE_MIN_LOD:
1285
if (texObj->MinLod == params[0])
1287
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
1288
texObj->MinLod = params[0];
1290
case GL_TEXTURE_MAX_LOD:
1291
if (texObj->MaxLod == params[0])
1293
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
1294
texObj->MaxLod = params[0];
1296
case GL_TEXTURE_BASE_LEVEL:
1297
if (params[0] < 0.0) {
1298
_mesa_error(ctx, GL_INVALID_VALUE, "glTexParameter(param)");
1301
if (target == GL_TEXTURE_RECTANGLE_ARB && params[0] != 0.0) {
1302
_mesa_error(ctx, GL_INVALID_VALUE, "glTexParameter(param)");
1305
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
1306
texObj->BaseLevel = (GLint) params[0];
1308
case GL_TEXTURE_MAX_LEVEL:
1309
if (params[0] < 0.0) {
1310
_mesa_error(ctx, GL_INVALID_VALUE, "glTexParameter(param)");
1313
if (target == GL_TEXTURE_RECTANGLE_ARB) {
1314
_mesa_error(ctx, GL_INVALID_OPERATION, "glTexParameter(param)");
1317
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
1318
texObj->MaxLevel = (GLint) params[0];
1320
case GL_TEXTURE_PRIORITY:
1321
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
1322
texObj->Priority = CLAMP( params[0], 0.0F, 1.0F );
1324
case GL_TEXTURE_MAX_ANISOTROPY_EXT:
1325
if (ctx->Extensions.EXT_texture_filter_anisotropic) {
1326
if (params[0] < 1.0) {
1327
_mesa_error(ctx, GL_INVALID_VALUE, "glTexParameter(param)" );
1330
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
1331
/* clamp to max, that's what NVIDIA does */
1332
texObj->MaxAnisotropy = MIN2(params[0],
1333
ctx->Const.MaxTextureMaxAnisotropy);
1336
_mesa_error(ctx, GL_INVALID_ENUM,
1337
"glTexParameter(pname=GL_TEXTURE_MAX_ANISOTROPY_EXT)");
1341
case GL_TEXTURE_COMPARE_SGIX:
1342
if (ctx->Extensions.SGIX_shadow) {
1343
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
1344
texObj->CompareFlag = params[0] ? GL_TRUE : GL_FALSE;
1347
_mesa_error(ctx, GL_INVALID_ENUM,
1348
"glTexParameter(pname=GL_TEXTURE_COMPARE_SGIX)");
1352
case GL_TEXTURE_COMPARE_OPERATOR_SGIX:
1353
if (ctx->Extensions.SGIX_shadow) {
1354
GLenum op = (GLenum) params[0];
1355
if (op == GL_TEXTURE_LEQUAL_R_SGIX ||
1356
op == GL_TEXTURE_GEQUAL_R_SGIX) {
1357
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
1358
texObj->CompareOperator = op;
1361
_mesa_error(ctx, GL_INVALID_ENUM, "glTexParameter(param)");
1365
_mesa_error(ctx, GL_INVALID_ENUM,
1366
"glTexParameter(pname=GL_TEXTURE_COMPARE_OPERATOR_SGIX)");
1370
case GL_SHADOW_AMBIENT_SGIX: /* aka GL_TEXTURE_COMPARE_FAIL_VALUE_ARB */
1371
if (ctx->Extensions.SGIX_shadow_ambient) {
1372
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
1373
texObj->ShadowAmbient = CLAMP(params[0], 0.0F, 1.0F);
1376
_mesa_error(ctx, GL_INVALID_ENUM,
1377
"glTexParameter(pname=GL_SHADOW_AMBIENT_SGIX)");
1381
case GL_GENERATE_MIPMAP_SGIS:
1382
if (ctx->Extensions.SGIS_generate_mipmap) {
1383
texObj->GenerateMipmap = params[0] ? GL_TRUE : GL_FALSE;
1386
_mesa_error(ctx, GL_INVALID_ENUM,
1387
"glTexParameter(pname=GL_GENERATE_MIPMAP_SGIS)");
1391
case GL_TEXTURE_COMPARE_MODE_ARB:
1392
if (ctx->Extensions.ARB_shadow) {
1393
const GLenum mode = (GLenum) params[0];
1394
if (mode == GL_NONE || mode == GL_COMPARE_R_TO_TEXTURE_ARB) {
1395
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
1396
texObj->CompareMode = mode;
1399
_mesa_error(ctx, GL_INVALID_ENUM,
1400
"glTexParameter(bad GL_TEXTURE_COMPARE_MODE_ARB: 0x%x)", mode);
1405
_mesa_error(ctx, GL_INVALID_ENUM,
1406
"glTexParameter(pname=GL_TEXTURE_COMPARE_MODE_ARB)");
1410
case GL_TEXTURE_COMPARE_FUNC_ARB:
1411
if (ctx->Extensions.ARB_shadow) {
1412
const GLenum func = (GLenum) params[0];
1413
if (func == GL_LEQUAL || func == GL_GEQUAL) {
1414
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
1415
texObj->CompareFunc = func;
1417
else if (ctx->Extensions.EXT_shadow_funcs &&
1418
(func == GL_EQUAL ||
1419
func == GL_NOTEQUAL ||
1421
func == GL_GREATER ||
1422
func == GL_ALWAYS ||
1423
func == GL_NEVER)) {
1424
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
1425
texObj->CompareFunc = func;
1428
_mesa_error(ctx, GL_INVALID_ENUM,
1429
"glTexParameter(bad GL_TEXTURE_COMPARE_FUNC_ARB)");
1434
_mesa_error(ctx, GL_INVALID_ENUM,
1435
"glTexParameter(pname=GL_TEXTURE_COMPARE_FUNC_ARB)");
1439
case GL_DEPTH_TEXTURE_MODE_ARB:
1440
if (ctx->Extensions.ARB_depth_texture) {
1441
const GLenum result = (GLenum) params[0];
1442
if (result == GL_LUMINANCE || result == GL_INTENSITY
1443
|| result == GL_ALPHA) {
1444
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
1445
texObj->DepthMode = result;
1448
_mesa_error(ctx, GL_INVALID_ENUM,
1449
"glTexParameter(bad GL_DEPTH_TEXTURE_MODE_ARB)");
1454
_mesa_error(ctx, GL_INVALID_ENUM,
1455
"glTexParameter(pname=GL_DEPTH_TEXTURE_MODE_ARB)");
1459
case GL_TEXTURE_LOD_BIAS:
1460
/* NOTE: this is really part of OpenGL 1.4, not EXT_texture_lod_bias*/
1461
if (ctx->Extensions.EXT_texture_lod_bias) {
1462
if (texObj->LodBias != params[0]) {
1463
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
1464
texObj->LodBias = params[0];
1470
_mesa_error(ctx, GL_INVALID_ENUM,
1471
"glTexParameter(pname=0x%x)", pname);
1475
texObj->Complete = GL_FALSE;
1477
if (ctx->Driver.TexParameter) {
1478
(*ctx->Driver.TexParameter)( ctx, target, texObj, pname, params );
1484
_mesa_TexParameteri( GLenum target, GLenum pname, GLint param )
1487
if (pname == GL_TEXTURE_PRIORITY)
1488
fparam[0] = INT_TO_FLOAT(param);
1490
fparam[0] = (GLfloat) param;
1491
fparam[1] = fparam[2] = fparam[3] = 0.0;
1492
_mesa_TexParameterfv(target, pname, fparam);
1497
_mesa_TexParameteriv( GLenum target, GLenum pname, const GLint *params )
1500
if (pname == GL_TEXTURE_BORDER_COLOR) {
1501
fparam[0] = INT_TO_FLOAT(params[0]);
1502
fparam[1] = INT_TO_FLOAT(params[1]);
1503
fparam[2] = INT_TO_FLOAT(params[2]);
1504
fparam[3] = INT_TO_FLOAT(params[3]);
1507
if (pname == GL_TEXTURE_PRIORITY)
1508
fparam[0] = INT_TO_FLOAT(params[0]);
1510
fparam[0] = (GLfloat) params[0];
1511
fparam[1] = fparam[2] = fparam[3] = 0.0F;
1513
_mesa_TexParameterfv(target, pname, fparam);
1518
_mesa_GetTexLevelParameterfv( GLenum target, GLint level,
1519
GLenum pname, GLfloat *params )
1522
_mesa_GetTexLevelParameteriv( target, level, pname, &iparam );
1523
*params = (GLfloat) iparam;
1528
tex_image_dimensions(GLcontext *ctx, GLenum target)
1532
case GL_PROXY_TEXTURE_1D:
1535
case GL_PROXY_TEXTURE_2D:
1538
case GL_PROXY_TEXTURE_3D:
1540
case GL_TEXTURE_CUBE_MAP:
1541
case GL_PROXY_TEXTURE_CUBE_MAP:
1542
case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1543
case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1544
case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1545
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1546
case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1547
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1548
return ctx->Extensions.ARB_texture_cube_map ? 2 : 0;
1549
case GL_TEXTURE_RECTANGLE_NV:
1550
case GL_PROXY_TEXTURE_RECTANGLE_NV:
1551
return ctx->Extensions.NV_texture_rectangle ? 2 : 0;
1553
_mesa_problem(ctx, "bad target in _mesa_tex_target_dimensions()");
1560
_mesa_GetTexLevelParameteriv( GLenum target, GLint level,
1561
GLenum pname, GLint *params )
1563
const struct gl_texture_unit *texUnit;
1564
struct gl_texture_object *texObj;
1565
const struct gl_texture_image *img = NULL;
1569
GET_CURRENT_CONTEXT(ctx);
1570
ASSERT_OUTSIDE_BEGIN_END(ctx);
1572
if (ctx->Texture.CurrentUnit >= ctx->Const.MaxTextureImageUnits) {
1573
_mesa_error(ctx, GL_INVALID_OPERATION,
1574
"glGetTexLevelParameteriv(current unit)");
1578
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
1580
/* this will catch bad target values */
1581
dimensions = tex_image_dimensions(ctx, target); /* 1, 2 or 3 */
1582
if (dimensions == 0) {
1583
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexLevelParameter[if]v(target)");
1587
maxLevels = _mesa_max_texture_levels(ctx, target);
1588
if (maxLevels == 0) {
1589
/* should not happen since <target> was just checked above */
1590
_mesa_problem(ctx, "maxLevels=0 in _mesa_GetTexLevelParameter");
1594
if (level < 0 || level >= maxLevels) {
1595
_mesa_error( ctx, GL_INVALID_VALUE, "glGetTexLevelParameter[if]v" );
1599
texObj = _mesa_select_tex_object(ctx, texUnit, target);
1600
_mesa_lock_texture(ctx, texObj);
1602
img = _mesa_select_tex_image(ctx, texObj, target, level);
1603
if (!img || !img->TexFormat) {
1604
/* undefined texture image */
1605
if (pname == GL_TEXTURE_COMPONENTS)
1612
isProxy = _mesa_is_proxy_texture(target);
1615
case GL_TEXTURE_WIDTH:
1616
*params = img->Width;
1618
case GL_TEXTURE_HEIGHT:
1619
*params = img->Height;
1621
case GL_TEXTURE_DEPTH:
1622
*params = img->Depth;
1624
case GL_TEXTURE_INTERNAL_FORMAT:
1625
*params = img->InternalFormat;
1627
case GL_TEXTURE_BORDER:
1628
*params = img->Border;
1630
case GL_TEXTURE_RED_SIZE:
1631
if (img->_BaseFormat == GL_RGB || img->_BaseFormat == GL_RGBA)
1632
*params = img->TexFormat->RedBits;
1636
case GL_TEXTURE_GREEN_SIZE:
1637
if (img->_BaseFormat == GL_RGB || img->_BaseFormat == GL_RGBA)
1638
*params = img->TexFormat->GreenBits;
1642
case GL_TEXTURE_BLUE_SIZE:
1643
if (img->_BaseFormat == GL_RGB || img->_BaseFormat == GL_RGBA)
1644
*params = img->TexFormat->BlueBits;
1648
case GL_TEXTURE_ALPHA_SIZE:
1649
if (img->_BaseFormat == GL_ALPHA ||
1650
img->_BaseFormat == GL_LUMINANCE_ALPHA ||
1651
img->_BaseFormat == GL_RGBA)
1652
*params = img->TexFormat->AlphaBits;
1656
case GL_TEXTURE_INTENSITY_SIZE:
1657
if (img->_BaseFormat != GL_INTENSITY)
1659
else if (img->TexFormat->IntensityBits > 0)
1660
*params = img->TexFormat->IntensityBits;
1661
else /* intensity probably stored as rgb texture */
1662
*params = MIN2(img->TexFormat->RedBits, img->TexFormat->GreenBits);
1664
case GL_TEXTURE_LUMINANCE_SIZE:
1665
if (img->_BaseFormat != GL_LUMINANCE &&
1666
img->_BaseFormat != GL_LUMINANCE_ALPHA)
1668
else if (img->TexFormat->LuminanceBits > 0)
1669
*params = img->TexFormat->LuminanceBits;
1670
else /* luminance probably stored as rgb texture */
1671
*params = MIN2(img->TexFormat->RedBits, img->TexFormat->GreenBits);
1673
case GL_TEXTURE_INDEX_SIZE_EXT:
1674
if (img->_BaseFormat == GL_COLOR_INDEX)
1675
*params = img->TexFormat->IndexBits;
1679
case GL_TEXTURE_DEPTH_SIZE_ARB:
1680
if (ctx->Extensions.SGIX_depth_texture ||
1681
ctx->Extensions.ARB_depth_texture)
1682
*params = img->TexFormat->DepthBits;
1684
_mesa_error(ctx, GL_INVALID_ENUM,
1685
"glGetTexLevelParameter[if]v(pname)");
1687
case GL_TEXTURE_STENCIL_SIZE_EXT:
1688
if (ctx->Extensions.EXT_packed_depth_stencil) {
1689
*params = img->TexFormat->StencilBits;
1692
_mesa_error(ctx, GL_INVALID_ENUM,
1693
"glGetTexLevelParameter[if]v(pname)");
1697
/* GL_ARB_texture_compression */
1698
case GL_TEXTURE_COMPRESSED_IMAGE_SIZE:
1699
if (ctx->Extensions.ARB_texture_compression) {
1700
if (img->IsCompressed && !isProxy) {
1701
/* Don't use ctx->Driver.CompressedTextureSize() since that
1702
* may returned a padded hardware size.
1704
*params = _mesa_compressed_texture_size(ctx, img->Width,
1705
img->Height, img->Depth,
1706
img->TexFormat->MesaFormat);
1709
_mesa_error(ctx, GL_INVALID_OPERATION,
1710
"glGetTexLevelParameter[if]v(pname)");
1714
_mesa_error(ctx, GL_INVALID_ENUM,
1715
"glGetTexLevelParameter[if]v(pname)");
1718
case GL_TEXTURE_COMPRESSED:
1719
if (ctx->Extensions.ARB_texture_compression) {
1720
*params = (GLint) img->IsCompressed;
1723
_mesa_error(ctx, GL_INVALID_ENUM,
1724
"glGetTexLevelParameter[if]v(pname)");
1728
/* GL_ARB_texture_float */
1729
case GL_TEXTURE_RED_TYPE_ARB:
1730
if (ctx->Extensions.ARB_texture_float) {
1731
*params = img->TexFormat->RedBits ? img->TexFormat->DataType : GL_NONE;
1734
_mesa_error(ctx, GL_INVALID_ENUM,
1735
"glGetTexLevelParameter[if]v(pname)");
1738
case GL_TEXTURE_GREEN_TYPE_ARB:
1739
if (ctx->Extensions.ARB_texture_float) {
1740
*params = img->TexFormat->GreenBits ? img->TexFormat->DataType : GL_NONE;
1743
_mesa_error(ctx, GL_INVALID_ENUM,
1744
"glGetTexLevelParameter[if]v(pname)");
1747
case GL_TEXTURE_BLUE_TYPE_ARB:
1748
if (ctx->Extensions.ARB_texture_float) {
1749
*params = img->TexFormat->BlueBits ? img->TexFormat->DataType : GL_NONE;
1752
_mesa_error(ctx, GL_INVALID_ENUM,
1753
"glGetTexLevelParameter[if]v(pname)");
1756
case GL_TEXTURE_ALPHA_TYPE_ARB:
1757
if (ctx->Extensions.ARB_texture_float) {
1758
*params = img->TexFormat->AlphaBits ? img->TexFormat->DataType : GL_NONE;
1761
_mesa_error(ctx, GL_INVALID_ENUM,
1762
"glGetTexLevelParameter[if]v(pname)");
1765
case GL_TEXTURE_LUMINANCE_TYPE_ARB:
1766
if (ctx->Extensions.ARB_texture_float) {
1767
*params = img->TexFormat->LuminanceBits ? img->TexFormat->DataType : GL_NONE;
1770
_mesa_error(ctx, GL_INVALID_ENUM,
1771
"glGetTexLevelParameter[if]v(pname)");
1774
case GL_TEXTURE_INTENSITY_TYPE_ARB:
1775
if (ctx->Extensions.ARB_texture_float) {
1776
*params = img->TexFormat->IntensityBits ? img->TexFormat->DataType : GL_NONE;
1779
_mesa_error(ctx, GL_INVALID_ENUM,
1780
"glGetTexLevelParameter[if]v(pname)");
1783
case GL_TEXTURE_DEPTH_TYPE_ARB:
1784
if (ctx->Extensions.ARB_texture_float) {
1785
*params = img->TexFormat->DepthBits ? img->TexFormat->DataType : GL_NONE;
1788
_mesa_error(ctx, GL_INVALID_ENUM,
1789
"glGetTexLevelParameter[if]v(pname)");
1794
_mesa_error(ctx, GL_INVALID_ENUM,
1795
"glGetTexLevelParameter[if]v(pname)");
1799
_mesa_unlock_texture(ctx, texObj);
1805
_mesa_GetTexParameterfv( GLenum target, GLenum pname, GLfloat *params )
1807
struct gl_texture_unit *texUnit;
1808
struct gl_texture_object *obj;
1809
GLboolean error = GL_FALSE;
1810
GET_CURRENT_CONTEXT(ctx);
1811
ASSERT_OUTSIDE_BEGIN_END(ctx);
1813
if (ctx->Texture.CurrentUnit >= ctx->Const.MaxTextureImageUnits) {
1814
_mesa_error(ctx, GL_INVALID_OPERATION,
1815
"glGetTexParameterfv(current unit)");
1819
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
1821
obj = _mesa_select_tex_object(ctx, texUnit, target);
1823
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexParameterfv(target)");
1827
_mesa_lock_texture(ctx, obj);
1829
case GL_TEXTURE_MAG_FILTER:
1830
*params = ENUM_TO_FLOAT(obj->MagFilter);
1832
case GL_TEXTURE_MIN_FILTER:
1833
*params = ENUM_TO_FLOAT(obj->MinFilter);
1835
case GL_TEXTURE_WRAP_S:
1836
*params = ENUM_TO_FLOAT(obj->WrapS);
1838
case GL_TEXTURE_WRAP_T:
1839
*params = ENUM_TO_FLOAT(obj->WrapT);
1841
case GL_TEXTURE_WRAP_R:
1842
*params = ENUM_TO_FLOAT(obj->WrapR);
1844
case GL_TEXTURE_BORDER_COLOR:
1845
params[0] = CLAMP(obj->BorderColor[0], 0.0F, 1.0F);
1846
params[1] = CLAMP(obj->BorderColor[1], 0.0F, 1.0F);
1847
params[2] = CLAMP(obj->BorderColor[2], 0.0F, 1.0F);
1848
params[3] = CLAMP(obj->BorderColor[3], 0.0F, 1.0F);
1850
case GL_TEXTURE_RESIDENT:
1853
if (ctx->Driver.IsTextureResident)
1854
resident = ctx->Driver.IsTextureResident(ctx, obj);
1857
*params = ENUM_TO_FLOAT(resident);
1860
case GL_TEXTURE_PRIORITY:
1861
*params = obj->Priority;
1863
case GL_TEXTURE_MIN_LOD:
1864
*params = obj->MinLod;
1866
case GL_TEXTURE_MAX_LOD:
1867
*params = obj->MaxLod;
1869
case GL_TEXTURE_BASE_LEVEL:
1870
*params = (GLfloat) obj->BaseLevel;
1872
case GL_TEXTURE_MAX_LEVEL:
1873
*params = (GLfloat) obj->MaxLevel;
1875
case GL_TEXTURE_MAX_ANISOTROPY_EXT:
1876
if (ctx->Extensions.EXT_texture_filter_anisotropic) {
1877
*params = obj->MaxAnisotropy;
1882
case GL_TEXTURE_COMPARE_SGIX:
1883
if (ctx->Extensions.SGIX_shadow) {
1884
*params = (GLfloat) obj->CompareFlag;
1889
case GL_TEXTURE_COMPARE_OPERATOR_SGIX:
1890
if (ctx->Extensions.SGIX_shadow) {
1891
*params = (GLfloat) obj->CompareOperator;
1896
case GL_SHADOW_AMBIENT_SGIX: /* aka GL_TEXTURE_COMPARE_FAIL_VALUE_ARB */
1897
if (ctx->Extensions.SGIX_shadow_ambient) {
1898
*params = obj->ShadowAmbient;
1903
case GL_GENERATE_MIPMAP_SGIS:
1904
if (ctx->Extensions.SGIS_generate_mipmap) {
1905
*params = (GLfloat) obj->GenerateMipmap;
1910
case GL_TEXTURE_COMPARE_MODE_ARB:
1911
if (ctx->Extensions.ARB_shadow) {
1912
*params = (GLfloat) obj->CompareMode;
1917
case GL_TEXTURE_COMPARE_FUNC_ARB:
1918
if (ctx->Extensions.ARB_shadow) {
1919
*params = (GLfloat) obj->CompareFunc;
1924
case GL_DEPTH_TEXTURE_MODE_ARB:
1925
if (ctx->Extensions.ARB_depth_texture) {
1926
*params = (GLfloat) obj->DepthMode;
1931
case GL_TEXTURE_LOD_BIAS:
1932
if (ctx->Extensions.EXT_texture_lod_bias) {
1933
*params = obj->LodBias;
1943
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexParameterfv(pname=0x%x)",
1946
_mesa_unlock_texture(ctx, obj);
1951
_mesa_GetTexParameteriv( GLenum target, GLenum pname, GLint *params )
1953
struct gl_texture_unit *texUnit;
1954
struct gl_texture_object *obj;
1955
GET_CURRENT_CONTEXT(ctx);
1956
ASSERT_OUTSIDE_BEGIN_END(ctx);
1958
if (ctx->Texture.CurrentUnit >= ctx->Const.MaxTextureImageUnits) {
1959
_mesa_error(ctx, GL_INVALID_OPERATION,
1960
"glGetTexParameteriv(current unit)");
1964
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
1966
obj = _mesa_select_tex_object(ctx, texUnit, target);
1968
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexParameteriv(target)");
1973
case GL_TEXTURE_MAG_FILTER:
1974
*params = (GLint) obj->MagFilter;
1976
case GL_TEXTURE_MIN_FILTER:
1977
*params = (GLint) obj->MinFilter;
1979
case GL_TEXTURE_WRAP_S:
1980
*params = (GLint) obj->WrapS;
1982
case GL_TEXTURE_WRAP_T:
1983
*params = (GLint) obj->WrapT;
1985
case GL_TEXTURE_WRAP_R:
1986
*params = (GLint) obj->WrapR;
1988
case GL_TEXTURE_BORDER_COLOR:
1991
b[0] = CLAMP(obj->BorderColor[0], 0.0F, 1.0F);
1992
b[1] = CLAMP(obj->BorderColor[1], 0.0F, 1.0F);
1993
b[2] = CLAMP(obj->BorderColor[2], 0.0F, 1.0F);
1994
b[3] = CLAMP(obj->BorderColor[3], 0.0F, 1.0F);
1995
params[0] = FLOAT_TO_INT(b[0]);
1996
params[1] = FLOAT_TO_INT(b[1]);
1997
params[2] = FLOAT_TO_INT(b[2]);
1998
params[3] = FLOAT_TO_INT(b[3]);
2001
case GL_TEXTURE_RESIDENT:
2004
if (ctx->Driver.IsTextureResident)
2005
resident = ctx->Driver.IsTextureResident(ctx, obj);
2008
*params = (GLint) resident;
2011
case GL_TEXTURE_PRIORITY:
2012
*params = FLOAT_TO_INT(obj->Priority);
2014
case GL_TEXTURE_MIN_LOD:
2015
*params = (GLint) obj->MinLod;
2017
case GL_TEXTURE_MAX_LOD:
2018
*params = (GLint) obj->MaxLod;
2020
case GL_TEXTURE_BASE_LEVEL:
2021
*params = obj->BaseLevel;
2023
case GL_TEXTURE_MAX_LEVEL:
2024
*params = obj->MaxLevel;
2026
case GL_TEXTURE_MAX_ANISOTROPY_EXT:
2027
if (ctx->Extensions.EXT_texture_filter_anisotropic) {
2028
*params = (GLint) obj->MaxAnisotropy;
2032
case GL_TEXTURE_COMPARE_SGIX:
2033
if (ctx->Extensions.SGIX_shadow) {
2034
*params = (GLint) obj->CompareFlag;
2038
case GL_TEXTURE_COMPARE_OPERATOR_SGIX:
2039
if (ctx->Extensions.SGIX_shadow) {
2040
*params = (GLint) obj->CompareOperator;
2044
case GL_SHADOW_AMBIENT_SGIX: /* aka GL_TEXTURE_COMPARE_FAIL_VALUE_ARB */
2045
if (ctx->Extensions.SGIX_shadow_ambient) {
2046
*params = (GLint) FLOAT_TO_INT(obj->ShadowAmbient);
2050
case GL_GENERATE_MIPMAP_SGIS:
2051
if (ctx->Extensions.SGIS_generate_mipmap) {
2052
*params = (GLint) obj->GenerateMipmap;
2056
case GL_TEXTURE_COMPARE_MODE_ARB:
2057
if (ctx->Extensions.ARB_shadow) {
2058
*params = (GLint) obj->CompareMode;
2062
case GL_TEXTURE_COMPARE_FUNC_ARB:
2063
if (ctx->Extensions.ARB_shadow) {
2064
*params = (GLint) obj->CompareFunc;
2068
case GL_DEPTH_TEXTURE_MODE_ARB:
2069
if (ctx->Extensions.ARB_depth_texture) {
2070
*params = (GLint) obj->DepthMode;
2074
case GL_TEXTURE_LOD_BIAS:
2075
if (ctx->Extensions.EXT_texture_lod_bias) {
2076
*params = (GLint) obj->LodBias;
2081
; /* silence warnings */
2083
/* If we get here, pname was an unrecognized enum */
2084
_mesa_error(ctx, GL_INVALID_ENUM, "glGetTexParameteriv(pname=0x%x)", pname);
2090
/**********************************************************************/
2091
/* Texture Coord Generation */
2092
/**********************************************************************/
2096
_mesa_TexGenfv( GLenum coord, GLenum pname, const GLfloat *params )
2098
GET_CURRENT_CONTEXT(ctx);
2099
struct gl_texture_unit *texUnit;
2100
ASSERT_OUTSIDE_BEGIN_END(ctx);
2102
if (MESA_VERBOSE&(VERBOSE_API|VERBOSE_TEXTURE))
2103
_mesa_debug(ctx, "glTexGen %s %s %.1f(%s)...\n",
2104
_mesa_lookup_enum_by_nr(coord),
2105
_mesa_lookup_enum_by_nr(pname),
2107
_mesa_lookup_enum_by_nr((GLenum) (GLint) *params));
2109
if (ctx->Texture.CurrentUnit >= ctx->Const.MaxTextureCoordUnits) {
2110
_mesa_error(ctx, GL_INVALID_OPERATION, "glTexGen(current unit)");
2114
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
2118
if (pname==GL_TEXTURE_GEN_MODE) {
2119
GLenum mode = (GLenum) (GLint) *params;
2122
case GL_OBJECT_LINEAR:
2123
bits = TEXGEN_OBJ_LINEAR;
2126
bits = TEXGEN_EYE_LINEAR;
2128
case GL_REFLECTION_MAP_NV:
2129
bits = TEXGEN_REFLECTION_MAP_NV;
2131
case GL_NORMAL_MAP_NV:
2132
bits = TEXGEN_NORMAL_MAP_NV;
2135
bits = TEXGEN_SPHERE_MAP;
2138
_mesa_error( ctx, GL_INVALID_ENUM, "glTexGenfv(param)" );
2141
if (texUnit->GenModeS == mode)
2143
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
2144
texUnit->GenModeS = mode;
2145
texUnit->_GenBitS = bits;
2147
else if (pname==GL_OBJECT_PLANE) {
2148
if (TEST_EQ_4V(texUnit->ObjectPlaneS, params))
2150
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
2151
COPY_4FV(texUnit->ObjectPlaneS, params);
2153
else if (pname==GL_EYE_PLANE) {
2155
/* Transform plane equation by the inverse modelview matrix */
2156
if (_math_matrix_is_dirty(ctx->ModelviewMatrixStack.Top)) {
2157
_math_matrix_analyse( ctx->ModelviewMatrixStack.Top );
2159
_mesa_transform_vector( tmp, params, ctx->ModelviewMatrixStack.Top->inv );
2160
if (TEST_EQ_4V(texUnit->EyePlaneS, tmp))
2162
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
2163
COPY_4FV(texUnit->EyePlaneS, tmp);
2166
_mesa_error( ctx, GL_INVALID_ENUM, "glTexGenfv(pname)" );
2171
if (pname==GL_TEXTURE_GEN_MODE) {
2172
GLenum mode = (GLenum) (GLint) *params;
2175
case GL_OBJECT_LINEAR:
2176
bitt = TEXGEN_OBJ_LINEAR;
2179
bitt = TEXGEN_EYE_LINEAR;
2181
case GL_REFLECTION_MAP_NV:
2182
bitt = TEXGEN_REFLECTION_MAP_NV;
2184
case GL_NORMAL_MAP_NV:
2185
bitt = TEXGEN_NORMAL_MAP_NV;
2188
bitt = TEXGEN_SPHERE_MAP;
2191
_mesa_error( ctx, GL_INVALID_ENUM, "glTexGenfv(param)" );
2194
if (texUnit->GenModeT == mode)
2196
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
2197
texUnit->GenModeT = mode;
2198
texUnit->_GenBitT = bitt;
2200
else if (pname==GL_OBJECT_PLANE) {
2201
if (TEST_EQ_4V(texUnit->ObjectPlaneT, params))
2203
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
2204
COPY_4FV(texUnit->ObjectPlaneT, params);
2206
else if (pname==GL_EYE_PLANE) {
2208
/* Transform plane equation by the inverse modelview matrix */
2209
if (_math_matrix_is_dirty(ctx->ModelviewMatrixStack.Top)) {
2210
_math_matrix_analyse( ctx->ModelviewMatrixStack.Top );
2212
_mesa_transform_vector( tmp, params, ctx->ModelviewMatrixStack.Top->inv );
2213
if (TEST_EQ_4V(texUnit->EyePlaneT, tmp))
2215
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
2216
COPY_4FV(texUnit->EyePlaneT, tmp);
2219
_mesa_error( ctx, GL_INVALID_ENUM, "glTexGenfv(pname)" );
2224
if (pname==GL_TEXTURE_GEN_MODE) {
2225
GLenum mode = (GLenum) (GLint) *params;
2228
case GL_OBJECT_LINEAR:
2229
bitr = TEXGEN_OBJ_LINEAR;
2231
case GL_REFLECTION_MAP_NV:
2232
bitr = TEXGEN_REFLECTION_MAP_NV;
2234
case GL_NORMAL_MAP_NV:
2235
bitr = TEXGEN_NORMAL_MAP_NV;
2238
bitr = TEXGEN_EYE_LINEAR;
2241
_mesa_error( ctx, GL_INVALID_ENUM, "glTexGenfv(param)" );
2244
if (texUnit->GenModeR == mode)
2246
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
2247
texUnit->GenModeR = mode;
2248
texUnit->_GenBitR = bitr;
2250
else if (pname==GL_OBJECT_PLANE) {
2251
if (TEST_EQ_4V(texUnit->ObjectPlaneR, params))
2253
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
2254
COPY_4FV(texUnit->ObjectPlaneR, params);
2256
else if (pname==GL_EYE_PLANE) {
2258
/* Transform plane equation by the inverse modelview matrix */
2259
if (_math_matrix_is_dirty(ctx->ModelviewMatrixStack.Top)) {
2260
_math_matrix_analyse( ctx->ModelviewMatrixStack.Top );
2262
_mesa_transform_vector( tmp, params, ctx->ModelviewMatrixStack.Top->inv );
2263
if (TEST_EQ_4V(texUnit->EyePlaneR, tmp))
2265
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
2266
COPY_4FV(texUnit->EyePlaneR, tmp);
2269
_mesa_error( ctx, GL_INVALID_ENUM, "glTexGenfv(pname)" );
2274
if (pname==GL_TEXTURE_GEN_MODE) {
2275
GLenum mode = (GLenum) (GLint) *params;
2278
case GL_OBJECT_LINEAR:
2279
bitq = TEXGEN_OBJ_LINEAR;
2282
bitq = TEXGEN_EYE_LINEAR;
2285
_mesa_error( ctx, GL_INVALID_ENUM, "glTexGenfv(param)" );
2288
if (texUnit->GenModeQ == mode)
2290
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
2291
texUnit->GenModeQ = mode;
2292
texUnit->_GenBitQ = bitq;
2294
else if (pname==GL_OBJECT_PLANE) {
2295
if (TEST_EQ_4V(texUnit->ObjectPlaneQ, params))
2297
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
2298
COPY_4FV(texUnit->ObjectPlaneQ, params);
2300
else if (pname==GL_EYE_PLANE) {
2302
/* Transform plane equation by the inverse modelview matrix */
2303
if (_math_matrix_is_dirty(ctx->ModelviewMatrixStack.Top)) {
2304
_math_matrix_analyse( ctx->ModelviewMatrixStack.Top );
2306
_mesa_transform_vector( tmp, params, ctx->ModelviewMatrixStack.Top->inv );
2307
if (TEST_EQ_4V(texUnit->EyePlaneQ, tmp))
2309
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
2310
COPY_4FV(texUnit->EyePlaneQ, tmp);
2313
_mesa_error( ctx, GL_INVALID_ENUM, "glTexGenfv(pname)" );
2318
_mesa_error( ctx, GL_INVALID_ENUM, "glTexGenfv(coord)" );
2322
if (ctx->Driver.TexGen)
2323
ctx->Driver.TexGen( ctx, coord, pname, params );
2328
_mesa_TexGeniv(GLenum coord, GLenum pname, const GLint *params )
2331
p[0] = (GLfloat) params[0];
2332
if (pname == GL_TEXTURE_GEN_MODE) {
2333
p[1] = p[2] = p[3] = 0.0F;
2336
p[1] = (GLfloat) params[1];
2337
p[2] = (GLfloat) params[2];
2338
p[3] = (GLfloat) params[3];
2340
_mesa_TexGenfv(coord, pname, p);
2345
_mesa_TexGend(GLenum coord, GLenum pname, GLdouble param )
2347
GLfloat p = (GLfloat) param;
2348
_mesa_TexGenfv( coord, pname, &p );
2353
_mesa_TexGendv(GLenum coord, GLenum pname, const GLdouble *params )
2356
p[0] = (GLfloat) params[0];
2357
if (pname == GL_TEXTURE_GEN_MODE) {
2358
p[1] = p[2] = p[3] = 0.0F;
2361
p[1] = (GLfloat) params[1];
2362
p[2] = (GLfloat) params[2];
2363
p[3] = (GLfloat) params[3];
2365
_mesa_TexGenfv( coord, pname, p );
2370
_mesa_TexGenf( GLenum coord, GLenum pname, GLfloat param )
2372
_mesa_TexGenfv(coord, pname, ¶m);
2377
_mesa_TexGeni( GLenum coord, GLenum pname, GLint param )
2379
_mesa_TexGeniv( coord, pname, ¶m );
2385
_mesa_GetTexGendv( GLenum coord, GLenum pname, GLdouble *params )
2387
const struct gl_texture_unit *texUnit;
2388
GET_CURRENT_CONTEXT(ctx);
2389
ASSERT_OUTSIDE_BEGIN_END(ctx);
2391
if (ctx->Texture.CurrentUnit >= ctx->Const.MaxTextureCoordUnits) {
2392
_mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexGendv(current unit)");
2396
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
2400
if (pname==GL_TEXTURE_GEN_MODE) {
2401
params[0] = ENUM_TO_DOUBLE(texUnit->GenModeS);
2403
else if (pname==GL_OBJECT_PLANE) {
2404
COPY_4V( params, texUnit->ObjectPlaneS );
2406
else if (pname==GL_EYE_PLANE) {
2407
COPY_4V( params, texUnit->EyePlaneS );
2410
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGendv(pname)" );
2415
if (pname==GL_TEXTURE_GEN_MODE) {
2416
params[0] = ENUM_TO_DOUBLE(texUnit->GenModeT);
2418
else if (pname==GL_OBJECT_PLANE) {
2419
COPY_4V( params, texUnit->ObjectPlaneT );
2421
else if (pname==GL_EYE_PLANE) {
2422
COPY_4V( params, texUnit->EyePlaneT );
2425
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGendv(pname)" );
2430
if (pname==GL_TEXTURE_GEN_MODE) {
2431
params[0] = ENUM_TO_DOUBLE(texUnit->GenModeR);
2433
else if (pname==GL_OBJECT_PLANE) {
2434
COPY_4V( params, texUnit->ObjectPlaneR );
2436
else if (pname==GL_EYE_PLANE) {
2437
COPY_4V( params, texUnit->EyePlaneR );
2440
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGendv(pname)" );
2445
if (pname==GL_TEXTURE_GEN_MODE) {
2446
params[0] = ENUM_TO_DOUBLE(texUnit->GenModeQ);
2448
else if (pname==GL_OBJECT_PLANE) {
2449
COPY_4V( params, texUnit->ObjectPlaneQ );
2451
else if (pname==GL_EYE_PLANE) {
2452
COPY_4V( params, texUnit->EyePlaneQ );
2455
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGendv(pname)" );
2460
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGendv(coord)" );
2468
_mesa_GetTexGenfv( GLenum coord, GLenum pname, GLfloat *params )
2470
const struct gl_texture_unit *texUnit;
2471
GET_CURRENT_CONTEXT(ctx);
2472
ASSERT_OUTSIDE_BEGIN_END(ctx);
2474
if (ctx->Texture.CurrentUnit >= ctx->Const.MaxTextureCoordUnits) {
2475
_mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexGenfv(current unit)");
2479
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
2483
if (pname==GL_TEXTURE_GEN_MODE) {
2484
params[0] = ENUM_TO_FLOAT(texUnit->GenModeS);
2486
else if (pname==GL_OBJECT_PLANE) {
2487
COPY_4V( params, texUnit->ObjectPlaneS );
2489
else if (pname==GL_EYE_PLANE) {
2490
COPY_4V( params, texUnit->EyePlaneS );
2493
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGenfv(pname)" );
2498
if (pname==GL_TEXTURE_GEN_MODE) {
2499
params[0] = ENUM_TO_FLOAT(texUnit->GenModeT);
2501
else if (pname==GL_OBJECT_PLANE) {
2502
COPY_4V( params, texUnit->ObjectPlaneT );
2504
else if (pname==GL_EYE_PLANE) {
2505
COPY_4V( params, texUnit->EyePlaneT );
2508
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGenfv(pname)" );
2513
if (pname==GL_TEXTURE_GEN_MODE) {
2514
params[0] = ENUM_TO_FLOAT(texUnit->GenModeR);
2516
else if (pname==GL_OBJECT_PLANE) {
2517
COPY_4V( params, texUnit->ObjectPlaneR );
2519
else if (pname==GL_EYE_PLANE) {
2520
COPY_4V( params, texUnit->EyePlaneR );
2523
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGenfv(pname)" );
2528
if (pname==GL_TEXTURE_GEN_MODE) {
2529
params[0] = ENUM_TO_FLOAT(texUnit->GenModeQ);
2531
else if (pname==GL_OBJECT_PLANE) {
2532
COPY_4V( params, texUnit->ObjectPlaneQ );
2534
else if (pname==GL_EYE_PLANE) {
2535
COPY_4V( params, texUnit->EyePlaneQ );
2538
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGenfv(pname)" );
2543
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGenfv(coord)" );
2551
_mesa_GetTexGeniv( GLenum coord, GLenum pname, GLint *params )
2553
const struct gl_texture_unit *texUnit;
2554
GET_CURRENT_CONTEXT(ctx);
2555
ASSERT_OUTSIDE_BEGIN_END(ctx);
2557
if (ctx->Texture.CurrentUnit >= ctx->Const.MaxTextureCoordUnits) {
2558
_mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexGeniv(current unit)");
2562
texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
2566
if (pname==GL_TEXTURE_GEN_MODE) {
2567
params[0] = texUnit->GenModeS;
2569
else if (pname==GL_OBJECT_PLANE) {
2570
params[0] = (GLint) texUnit->ObjectPlaneS[0];
2571
params[1] = (GLint) texUnit->ObjectPlaneS[1];
2572
params[2] = (GLint) texUnit->ObjectPlaneS[2];
2573
params[3] = (GLint) texUnit->ObjectPlaneS[3];
2575
else if (pname==GL_EYE_PLANE) {
2576
params[0] = (GLint) texUnit->EyePlaneS[0];
2577
params[1] = (GLint) texUnit->EyePlaneS[1];
2578
params[2] = (GLint) texUnit->EyePlaneS[2];
2579
params[3] = (GLint) texUnit->EyePlaneS[3];
2582
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGeniv(pname)" );
2587
if (pname==GL_TEXTURE_GEN_MODE) {
2588
params[0] = texUnit->GenModeT;
2590
else if (pname==GL_OBJECT_PLANE) {
2591
params[0] = (GLint) texUnit->ObjectPlaneT[0];
2592
params[1] = (GLint) texUnit->ObjectPlaneT[1];
2593
params[2] = (GLint) texUnit->ObjectPlaneT[2];
2594
params[3] = (GLint) texUnit->ObjectPlaneT[3];
2596
else if (pname==GL_EYE_PLANE) {
2597
params[0] = (GLint) texUnit->EyePlaneT[0];
2598
params[1] = (GLint) texUnit->EyePlaneT[1];
2599
params[2] = (GLint) texUnit->EyePlaneT[2];
2600
params[3] = (GLint) texUnit->EyePlaneT[3];
2603
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGeniv(pname)" );
2608
if (pname==GL_TEXTURE_GEN_MODE) {
2609
params[0] = texUnit->GenModeR;
2611
else if (pname==GL_OBJECT_PLANE) {
2612
params[0] = (GLint) texUnit->ObjectPlaneR[0];
2613
params[1] = (GLint) texUnit->ObjectPlaneR[1];
2614
params[2] = (GLint) texUnit->ObjectPlaneR[2];
2615
params[3] = (GLint) texUnit->ObjectPlaneR[3];
2617
else if (pname==GL_EYE_PLANE) {
2618
params[0] = (GLint) texUnit->EyePlaneR[0];
2619
params[1] = (GLint) texUnit->EyePlaneR[1];
2620
params[2] = (GLint) texUnit->EyePlaneR[2];
2621
params[3] = (GLint) texUnit->EyePlaneR[3];
2624
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGeniv(pname)" );
2629
if (pname==GL_TEXTURE_GEN_MODE) {
2630
params[0] = texUnit->GenModeQ;
2632
else if (pname==GL_OBJECT_PLANE) {
2633
params[0] = (GLint) texUnit->ObjectPlaneQ[0];
2634
params[1] = (GLint) texUnit->ObjectPlaneQ[1];
2635
params[2] = (GLint) texUnit->ObjectPlaneQ[2];
2636
params[3] = (GLint) texUnit->ObjectPlaneQ[3];
2638
else if (pname==GL_EYE_PLANE) {
2639
params[0] = (GLint) texUnit->EyePlaneQ[0];
2640
params[1] = (GLint) texUnit->EyePlaneQ[1];
2641
params[2] = (GLint) texUnit->EyePlaneQ[2];
2642
params[3] = (GLint) texUnit->EyePlaneQ[3];
2645
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGeniv(pname)" );
2650
_mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGeniv(coord)" );
2657
/* GL_ARB_multitexture */
2659
_mesa_ActiveTextureARB(GLenum texture)
2661
GET_CURRENT_CONTEXT(ctx);
2662
const GLuint texUnit = texture - GL_TEXTURE0;
2663
ASSERT_OUTSIDE_BEGIN_END(ctx);
2665
if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE))
2666
_mesa_debug(ctx, "glActiveTexture %s\n",
2667
_mesa_lookup_enum_by_nr(texture));
2669
/* XXX error-check against max(coordunits, imageunits) */
2670
if (texUnit >= ctx->Const.MaxTextureUnits) {
2671
_mesa_error(ctx, GL_INVALID_ENUM, "glActiveTexture(texture)");
2675
if (ctx->Texture.CurrentUnit == texUnit)
2678
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
2680
ctx->Texture.CurrentUnit = texUnit;
2681
if (ctx->Transform.MatrixMode == GL_TEXTURE) {
2682
/* update current stack pointer */
2683
ctx->CurrentStack = &ctx->TextureMatrixStack[texUnit];
2686
if (ctx->Driver.ActiveTexture) {
2687
(*ctx->Driver.ActiveTexture)( ctx, (GLuint) texUnit );
2692
/* GL_ARB_multitexture */
2694
_mesa_ClientActiveTextureARB(GLenum texture)
2696
GET_CURRENT_CONTEXT(ctx);
2697
GLuint texUnit = texture - GL_TEXTURE0;
2698
ASSERT_OUTSIDE_BEGIN_END(ctx);
2700
if (texUnit >= ctx->Const.MaxTextureCoordUnits) {
2701
_mesa_error(ctx, GL_INVALID_ENUM, "glClientActiveTexture(texture)");
2705
FLUSH_VERTICES(ctx, _NEW_ARRAY);
2706
ctx->Array.ActiveTexture = texUnit;
2711
/**********************************************************************/
2712
/***** State management *****/
2713
/**********************************************************************/
2717
* \note This routine refers to derived texture attribute values to
2718
* compute the ENABLE_TEXMAT flags, but is only called on
2719
* _NEW_TEXTURE_MATRIX. On changes to _NEW_TEXTURE, the ENABLE_TEXMAT
2720
* flags are updated by _mesa_update_textures(), below.
2722
* \param ctx GL context.
2725
update_texture_matrices( GLcontext *ctx )
2729
ctx->Texture._TexMatEnabled = 0;
2731
for (i=0; i < ctx->Const.MaxTextureUnits; i++) {
2732
if (_math_matrix_is_dirty(ctx->TextureMatrixStack[i].Top)) {
2733
_math_matrix_analyse( ctx->TextureMatrixStack[i].Top );
2735
if (ctx->Texture.Unit[i]._ReallyEnabled &&
2736
ctx->TextureMatrixStack[i].Top->type != MATRIX_IDENTITY)
2737
ctx->Texture._TexMatEnabled |= ENABLE_TEXMAT(i);
2739
if (ctx->Driver.TextureMatrix)
2740
ctx->Driver.TextureMatrix( ctx, i, ctx->TextureMatrixStack[i].Top);
2747
* Helper function for determining which texture object (1D, 2D, cube, etc)
2748
* should actually be used.
2751
texture_override(GLcontext *ctx,
2752
struct gl_texture_unit *texUnit, GLbitfield enableBits,
2753
struct gl_texture_object *texObj, GLuint textureBit)
2755
if (!texUnit->_ReallyEnabled && (enableBits & textureBit)) {
2756
if (!texObj->Complete) {
2757
_mesa_test_texobj_completeness(ctx, texObj);
2759
if (texObj->Complete) {
2760
texUnit->_ReallyEnabled = textureBit;
2761
texUnit->_Current = texObj;
2768
* \note This routine refers to derived texture matrix values to
2769
* compute the ENABLE_TEXMAT flags, but is only called on
2770
* _NEW_TEXTURE. On changes to _NEW_TEXTURE_MATRIX, the ENABLE_TEXMAT
2771
* flags are updated by _mesa_update_texture_matrices, above.
2773
* \param ctx GL context.
2776
update_texture_state( GLcontext *ctx )
2779
struct gl_fragment_program *fprog = NULL;
2780
struct gl_vertex_program *vprog = NULL;
2782
if (ctx->Shader.CurrentProgram &&
2783
ctx->Shader.CurrentProgram->LinkStatus) {
2784
fprog = ctx->Shader.CurrentProgram->FragmentProgram;
2785
vprog = ctx->Shader.CurrentProgram->VertexProgram;
2788
if (ctx->FragmentProgram._Enabled) {
2789
fprog = ctx->FragmentProgram.Current;
2791
if (ctx->VertexProgram._Enabled) {
2792
/* XXX enable this if/when non-shader vertex programs get
2794
vprog = ctx->VertexProgram.Current;
2799
ctx->NewState |= _NEW_TEXTURE; /* TODO: only set this if there are
2803
ctx->Texture._EnabledUnits = 0;
2804
ctx->Texture._GenFlags = 0;
2805
ctx->Texture._TexMatEnabled = 0;
2806
ctx->Texture._TexGenEnabled = 0;
2809
* Update texture unit state.
2811
for (unit = 0; unit < ctx->Const.MaxTextureUnits; unit++) {
2812
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
2813
GLbitfield enableBits;
2815
texUnit->_Current = NULL;
2816
texUnit->_ReallyEnabled = 0;
2817
texUnit->_GenFlags = 0;
2819
/* Get the bitmask of texture enables.
2820
* enableBits will be a mask of the TEXTURE_*_BIT flags indicating
2821
* which texture targets are enabled (fixed function) or referenced
2822
* by a fragment shader/program. When multiple flags are set, we'll
2823
* settle on the one with highest priority (see texture_override below).
2825
if (fprog || vprog) {
2828
enableBits |= fprog->Base.TexturesUsed[unit];
2830
enableBits |= vprog->Base.TexturesUsed[unit];
2833
if (!texUnit->Enabled)
2835
enableBits = texUnit->Enabled;
2838
/* Look for the highest-priority texture target that's enabled and
2839
* complete. That's the one we'll use for texturing. If we're using
2840
* a fragment program we're guaranteed that bitcount(enabledBits) <= 1.
2842
texture_override(ctx, texUnit, enableBits,
2843
texUnit->CurrentCubeMap, TEXTURE_CUBE_BIT);
2844
texture_override(ctx, texUnit, enableBits,
2845
texUnit->Current3D, TEXTURE_3D_BIT);
2846
texture_override(ctx, texUnit, enableBits,
2847
texUnit->CurrentRect, TEXTURE_RECT_BIT);
2848
texture_override(ctx, texUnit, enableBits,
2849
texUnit->Current2D, TEXTURE_2D_BIT);
2850
texture_override(ctx, texUnit, enableBits,
2851
texUnit->Current1D, TEXTURE_1D_BIT);
2853
if (!texUnit->_ReallyEnabled) {
2857
if (texUnit->_ReallyEnabled)
2858
ctx->Texture._EnabledUnits |= (1 << unit);
2860
if (texUnit->EnvMode == GL_COMBINE) {
2861
texUnit->_CurrentCombine = & texUnit->Combine;
2864
const struct gl_texture_object *texObj = texUnit->_Current;
2865
GLenum format = texObj->Image[0][texObj->BaseLevel]->_BaseFormat;
2866
if (format == GL_COLOR_INDEX) {
2867
format = GL_RGBA; /* a bit of a hack */
2869
else if (format == GL_DEPTH_COMPONENT
2870
|| format == GL_DEPTH_STENCIL_EXT) {
2871
format = texObj->DepthMode;
2873
calculate_derived_texenv(&texUnit->_EnvMode, texUnit->EnvMode, format);
2874
texUnit->_CurrentCombine = & texUnit->_EnvMode;
2877
switch (texUnit->_CurrentCombine->ModeRGB) {
2879
texUnit->_CurrentCombine->_NumArgsRGB = 1;
2887
case GL_DOT3_RGB_EXT:
2888
case GL_DOT3_RGBA_EXT:
2889
texUnit->_CurrentCombine->_NumArgsRGB = 2;
2891
case GL_INTERPOLATE:
2892
case GL_MODULATE_ADD_ATI:
2893
case GL_MODULATE_SIGNED_ADD_ATI:
2894
case GL_MODULATE_SUBTRACT_ATI:
2895
texUnit->_CurrentCombine->_NumArgsRGB = 3;
2898
texUnit->_CurrentCombine->_NumArgsRGB = 0;
2899
_mesa_problem(ctx, "invalid RGB combine mode in update_texture_state");
2903
switch (texUnit->_CurrentCombine->ModeA) {
2905
texUnit->_CurrentCombine->_NumArgsA = 1;
2911
texUnit->_CurrentCombine->_NumArgsA = 2;
2913
case GL_INTERPOLATE:
2914
case GL_MODULATE_ADD_ATI:
2915
case GL_MODULATE_SIGNED_ADD_ATI:
2916
case GL_MODULATE_SUBTRACT_ATI:
2917
texUnit->_CurrentCombine->_NumArgsA = 3;
2920
texUnit->_CurrentCombine->_NumArgsA = 0;
2921
_mesa_problem(ctx, "invalid Alpha combine mode in update_texture_state");
2925
if (texUnit->TexGenEnabled) {
2926
if (texUnit->TexGenEnabled & S_BIT) {
2927
texUnit->_GenFlags |= texUnit->_GenBitS;
2929
if (texUnit->TexGenEnabled & T_BIT) {
2930
texUnit->_GenFlags |= texUnit->_GenBitT;
2932
if (texUnit->TexGenEnabled & Q_BIT) {
2933
texUnit->_GenFlags |= texUnit->_GenBitQ;
2935
if (texUnit->TexGenEnabled & R_BIT) {
2936
texUnit->_GenFlags |= texUnit->_GenBitR;
2939
ctx->Texture._TexGenEnabled |= ENABLE_TEXGEN(unit);
2940
ctx->Texture._GenFlags |= texUnit->_GenFlags;
2943
if (ctx->TextureMatrixStack[unit].Top->type != MATRIX_IDENTITY)
2944
ctx->Texture._TexMatEnabled |= ENABLE_TEXMAT(unit);
2947
/* Determine which texture coordinate sets are actually needed */
2949
const GLuint coordMask = (1 << MAX_TEXTURE_COORD_UNITS) - 1;
2950
ctx->Texture._EnabledCoordUnits
2951
= (fprog->Base.InputsRead >> FRAG_ATTRIB_TEX0) & coordMask;
2954
ctx->Texture._EnabledCoordUnits = ctx->Texture._EnabledUnits;
2960
* Update texture-related derived state.
2963
_mesa_update_texture( GLcontext *ctx, GLuint new_state )
2965
if (new_state & _NEW_TEXTURE_MATRIX)
2966
update_texture_matrices( ctx );
2968
if (new_state & (_NEW_TEXTURE | _NEW_PROGRAM))
2969
update_texture_state( ctx );
2973
/**********************************************************************/
2974
/***** Initialization *****/
2975
/**********************************************************************/
2978
* Allocate the proxy textures for the given context.
2980
* \param ctx the context to allocate proxies for.
2982
* \return GL_TRUE on success, or GL_FALSE on failure
2984
* If run out of memory part way through the allocations, clean up and return
2988
alloc_proxy_textures( GLcontext *ctx )
2990
ctx->Texture.Proxy1D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_1D);
2991
if (!ctx->Texture.Proxy1D)
2994
ctx->Texture.Proxy2D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_2D);
2995
if (!ctx->Texture.Proxy2D)
2998
ctx->Texture.Proxy3D = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_3D);
2999
if (!ctx->Texture.Proxy3D)
3002
ctx->Texture.ProxyCubeMap = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_CUBE_MAP_ARB);
3003
if (!ctx->Texture.ProxyCubeMap)
3006
ctx->Texture.ProxyRect = (*ctx->Driver.NewTextureObject)(ctx, 0, GL_TEXTURE_RECTANGLE_NV);
3007
if (!ctx->Texture.ProxyRect)
3010
assert(ctx->Texture.Proxy1D->RefCount == 1);
3015
if (ctx->Texture.Proxy1D)
3016
(ctx->Driver.DeleteTexture)(ctx, ctx->Texture.Proxy1D);
3017
if (ctx->Texture.Proxy2D)
3018
(ctx->Driver.DeleteTexture)(ctx, ctx->Texture.Proxy2D);
3019
if (ctx->Texture.Proxy3D)
3020
(ctx->Driver.DeleteTexture)(ctx, ctx->Texture.Proxy3D);
3021
if (ctx->Texture.ProxyCubeMap)
3022
(ctx->Driver.DeleteTexture)(ctx, ctx->Texture.ProxyCubeMap);
3023
if (ctx->Texture.ProxyRect)
3024
(ctx->Driver.DeleteTexture)(ctx, ctx->Texture.ProxyRect);
3030
* Initialize a texture unit.
3032
* \param ctx GL context.
3033
* \param unit texture unit number to be initialized.
3036
init_texture_unit( GLcontext *ctx, GLuint unit )
3038
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
3040
texUnit->EnvMode = GL_MODULATE;
3041
ASSIGN_4V( texUnit->EnvColor, 0.0, 0.0, 0.0, 0.0 );
3043
texUnit->Combine = default_combine_state;
3044
texUnit->_EnvMode = default_combine_state;
3045
texUnit->_CurrentCombine = & texUnit->_EnvMode;
3047
texUnit->TexGenEnabled = 0;
3048
texUnit->GenModeS = GL_EYE_LINEAR;
3049
texUnit->GenModeT = GL_EYE_LINEAR;
3050
texUnit->GenModeR = GL_EYE_LINEAR;
3051
texUnit->GenModeQ = GL_EYE_LINEAR;
3052
texUnit->_GenBitS = TEXGEN_EYE_LINEAR;
3053
texUnit->_GenBitT = TEXGEN_EYE_LINEAR;
3054
texUnit->_GenBitR = TEXGEN_EYE_LINEAR;
3055
texUnit->_GenBitQ = TEXGEN_EYE_LINEAR;
3057
/* Yes, these plane coefficients are correct! */
3058
ASSIGN_4V( texUnit->ObjectPlaneS, 1.0, 0.0, 0.0, 0.0 );
3059
ASSIGN_4V( texUnit->ObjectPlaneT, 0.0, 1.0, 0.0, 0.0 );
3060
ASSIGN_4V( texUnit->ObjectPlaneR, 0.0, 0.0, 0.0, 0.0 );
3061
ASSIGN_4V( texUnit->ObjectPlaneQ, 0.0, 0.0, 0.0, 0.0 );
3062
ASSIGN_4V( texUnit->EyePlaneS, 1.0, 0.0, 0.0, 0.0 );
3063
ASSIGN_4V( texUnit->EyePlaneT, 0.0, 1.0, 0.0, 0.0 );
3064
ASSIGN_4V( texUnit->EyePlaneR, 0.0, 0.0, 0.0, 0.0 );
3065
ASSIGN_4V( texUnit->EyePlaneQ, 0.0, 0.0, 0.0, 0.0 );
3067
/* initialize current texture object ptrs to the shared default objects */
3068
_mesa_reference_texobj(&texUnit->Current1D, ctx->Shared->Default1D);
3069
_mesa_reference_texobj(&texUnit->Current2D, ctx->Shared->Default2D);
3070
_mesa_reference_texobj(&texUnit->Current3D, ctx->Shared->Default3D);
3071
_mesa_reference_texobj(&texUnit->CurrentCubeMap, ctx->Shared->DefaultCubeMap);
3072
_mesa_reference_texobj(&texUnit->CurrentRect, ctx->Shared->DefaultRect);
3077
* Initialize texture state for the given context.
3080
_mesa_init_texture(GLcontext *ctx)
3084
assert(MAX_TEXTURE_LEVELS >= MAX_3D_TEXTURE_LEVELS);
3085
assert(MAX_TEXTURE_LEVELS >= MAX_CUBE_TEXTURE_LEVELS);
3088
ctx->Texture.CurrentUnit = 0; /* multitexture */
3089
ctx->Texture._EnabledUnits = 0;
3090
ctx->Texture.SharedPalette = GL_FALSE;
3091
_mesa_init_colortable(&ctx->Texture.Palette);
3093
for (i = 0; i < MAX_TEXTURE_UNITS; i++)
3094
init_texture_unit( ctx, i );
3096
/* After we're done initializing the context's texture state the default
3097
* texture objects' refcounts should be at least MAX_TEXTURE_UNITS + 1.
3099
assert(ctx->Shared->Default1D->RefCount >= MAX_TEXTURE_UNITS + 1);
3101
_mesa_TexEnvProgramCacheInit( ctx );
3103
/* Allocate proxy textures */
3104
if (!alloc_proxy_textures( ctx ))
3112
* Free dynamically-allocated texture data attached to the given context.
3115
_mesa_free_texture_data(GLcontext *ctx)
3119
/* unreference current textures */
3120
for (u = 0; u < MAX_TEXTURE_IMAGE_UNITS; u++) {
3121
struct gl_texture_unit *unit = ctx->Texture.Unit + u;
3122
_mesa_reference_texobj(&unit->Current1D, NULL);
3123
_mesa_reference_texobj(&unit->Current2D, NULL);
3124
_mesa_reference_texobj(&unit->Current3D, NULL);
3125
_mesa_reference_texobj(&unit->CurrentCubeMap, NULL);
3126
_mesa_reference_texobj(&unit->CurrentRect, NULL);
3129
/* Free proxy texture objects */
3130
(ctx->Driver.DeleteTexture)(ctx, ctx->Texture.Proxy1D );
3131
(ctx->Driver.DeleteTexture)(ctx, ctx->Texture.Proxy2D );
3132
(ctx->Driver.DeleteTexture)(ctx, ctx->Texture.Proxy3D );
3133
(ctx->Driver.DeleteTexture)(ctx, ctx->Texture.ProxyCubeMap );
3134
(ctx->Driver.DeleteTexture)(ctx, ctx->Texture.ProxyRect );
3136
for (u = 0; u < MAX_TEXTURE_IMAGE_UNITS; u++)
3137
_mesa_free_colortable_data( &ctx->Texture.Unit[u].ColorTable );
3139
_mesa_TexEnvProgramCacheDestroy( ctx );