blob: 34b6addb9b0ea40fcf9d4a9a405c1bc94e40e8f6 [file] [log] [blame]
Brian Paulae1fdc12008-06-11 20:05:53 -06001/*
2 * Mesa 3-D graphics library
Brian Paul318e53a2009-01-27 11:07:21 -07003 * Version: 7.5
Brian Paulae1fdc12008-06-11 20:05:53 -06004 *
5 * Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
Brian Paulaad3f542009-02-09 13:58:32 -07006 * Copyright (C) 2009 VMware, Inc. All Rights Reserved.
Brian Paulae1fdc12008-06-11 20:05:53 -06007 *
8 * Permission is hereby granted, free of charge, to any person obtaining a
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice shall be included
16 * in all copies or substantial portions of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
22 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
23 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24 */
25
26/**
27 * \file texparam.c
28 *
29 * glTexParameter-related functions
30 */
31
32
33#include "main/glheader.h"
Brian Paulb64d4782009-09-27 19:38:21 -060034#include "main/colormac.h"
Brian Paulae1fdc12008-06-11 20:05:53 -060035#include "main/context.h"
Brian Paul0f6b8e22011-01-25 18:27:44 -070036#include "main/enums.h"
Brian Paulb64d4782009-09-27 19:38:21 -060037#include "main/formats.h"
Brian Paulae1fdc12008-06-11 20:05:53 -060038#include "main/macros.h"
Vinson Leedb61b9c2011-01-07 00:08:24 -080039#include "main/mfeatures.h"
Vinson Lee0117da42011-01-05 23:11:54 -080040#include "main/mtypes.h"
Marek Olšáke5c6a922011-02-15 23:30:23 +010041#include "main/state.h"
Brian Paulae1fdc12008-06-11 20:05:53 -060042#include "main/texcompress.h"
43#include "main/texparam.h"
44#include "main/teximage.h"
Brian Paul6aa7a032009-08-13 09:55:34 -060045#include "main/texstate.h"
Dave Airlieedc2dd82011-01-13 12:12:21 +100046#include "main/texfetch.h"
Brian Paulec2b92f2010-06-10 23:02:41 -060047#include "program/prog_instruction.h"
Brian Paulae1fdc12008-06-11 20:05:53 -060048
49
Brian Paulae1fdc12008-06-11 20:05:53 -060050/**
51 * Check if a coordinate wrap mode is supported for the texture target.
52 * \return GL_TRUE if legal, GL_FALSE otherwise
53 */
54static GLboolean
Kristian Høgsbergf9995b32010-10-12 12:26:10 -040055validate_texture_wrap_mode(struct gl_context * ctx, GLenum target, GLenum wrap)
Brian Paulae1fdc12008-06-11 20:05:53 -060056{
57 const struct gl_extensions * const e = & ctx->Extensions;
58
59 if (wrap == GL_CLAMP || wrap == GL_CLAMP_TO_EDGE ||
60 (wrap == GL_CLAMP_TO_BORDER && e->ARB_texture_border_clamp)) {
61 /* any texture target */
62 return GL_TRUE;
63 }
64 else if (target != GL_TEXTURE_RECTANGLE_NV &&
65 (wrap == GL_REPEAT ||
66 (wrap == GL_MIRRORED_REPEAT &&
67 e->ARB_texture_mirrored_repeat) ||
68 (wrap == GL_MIRROR_CLAMP_EXT &&
69 (e->ATI_texture_mirror_once || e->EXT_texture_mirror_clamp)) ||
70 (wrap == GL_MIRROR_CLAMP_TO_EDGE_EXT &&
71 (e->ATI_texture_mirror_once || e->EXT_texture_mirror_clamp)) ||
72 (wrap == GL_MIRROR_CLAMP_TO_BORDER_EXT &&
73 (e->EXT_texture_mirror_clamp)))) {
74 /* non-rectangle texture */
75 return GL_TRUE;
76 }
77
Vinson Lee0fa16922009-09-11 08:04:37 -060078 _mesa_error( ctx, GL_INVALID_ENUM, "glTexParameter(param=0x%x)", wrap );
Brian Paulae1fdc12008-06-11 20:05:53 -060079 return GL_FALSE;
80}
81
82
Brian Paul318e53a2009-01-27 11:07:21 -070083/**
84 * Get current texture object for given target.
Brian Paul32b99832010-01-04 19:20:33 -070085 * Return NULL if any error (and record the error).
Brian Paul644d8fd2009-10-31 08:08:19 -060086 * Note that this is different from _mesa_select_tex_object() in that proxy
87 * targets are not accepted.
Brian Paul32b99832010-01-04 19:20:33 -070088 * Only the glGetTexLevelParameter() functions accept proxy targets.
Brian Paul318e53a2009-01-27 11:07:21 -070089 */
90static struct gl_texture_object *
Kristian Høgsbergf9995b32010-10-12 12:26:10 -040091get_texobj(struct gl_context *ctx, GLenum target, GLboolean get)
Brian Paulae1fdc12008-06-11 20:05:53 -060092{
Brian Paulae1fdc12008-06-11 20:05:53 -060093 struct gl_texture_unit *texUnit;
Brian Paulae1fdc12008-06-11 20:05:53 -060094
Brian Paulb2a30492010-02-03 15:47:44 -070095 if (ctx->Texture.CurrentUnit >= ctx->Const.MaxCombinedTextureImageUnits) {
Brian Paul32b99832010-01-04 19:20:33 -070096 _mesa_error(ctx, GL_INVALID_OPERATION,
97 "gl%sTexParameter(current unit)", get ? "Get" : "");
Brian Paul318e53a2009-01-27 11:07:21 -070098 return NULL;
Brian Paulae1fdc12008-06-11 20:05:53 -060099 }
100
Brian Paul6aa7a032009-08-13 09:55:34 -0600101 texUnit = _mesa_get_current_tex_unit(ctx);
Brian Paulae1fdc12008-06-11 20:05:53 -0600102
103 switch (target) {
Brian Paul318e53a2009-01-27 11:07:21 -0700104 case GL_TEXTURE_1D:
Brian Paul98187342009-02-21 14:53:25 -0700105 return texUnit->CurrentTex[TEXTURE_1D_INDEX];
Brian Paul318e53a2009-01-27 11:07:21 -0700106 case GL_TEXTURE_2D:
Brian Paul98187342009-02-21 14:53:25 -0700107 return texUnit->CurrentTex[TEXTURE_2D_INDEX];
Brian Paul318e53a2009-01-27 11:07:21 -0700108 case GL_TEXTURE_3D:
Brian Paul98187342009-02-21 14:53:25 -0700109 return texUnit->CurrentTex[TEXTURE_3D_INDEX];
Brian Paul318e53a2009-01-27 11:07:21 -0700110 case GL_TEXTURE_CUBE_MAP:
111 if (ctx->Extensions.ARB_texture_cube_map) {
Brian Paul98187342009-02-21 14:53:25 -0700112 return texUnit->CurrentTex[TEXTURE_CUBE_INDEX];
Brian Paul318e53a2009-01-27 11:07:21 -0700113 }
114 break;
115 case GL_TEXTURE_RECTANGLE_NV:
116 if (ctx->Extensions.NV_texture_rectangle) {
Brian Paul98187342009-02-21 14:53:25 -0700117 return texUnit->CurrentTex[TEXTURE_RECT_INDEX];
Brian Paul318e53a2009-01-27 11:07:21 -0700118 }
119 break;
120 case GL_TEXTURE_1D_ARRAY_EXT:
Brian Paulf2dd1182011-01-25 18:07:45 -0700121 if (ctx->Extensions.MESA_texture_array ||
122 ctx->Extensions.EXT_texture_array) {
Brian Paul98187342009-02-21 14:53:25 -0700123 return texUnit->CurrentTex[TEXTURE_1D_ARRAY_INDEX];
Brian Paul318e53a2009-01-27 11:07:21 -0700124 }
125 break;
126 case GL_TEXTURE_2D_ARRAY_EXT:
Brian Paulf2dd1182011-01-25 18:07:45 -0700127 if (ctx->Extensions.MESA_texture_array ||
128 ctx->Extensions.EXT_texture_array) {
Brian Paul98187342009-02-21 14:53:25 -0700129 return texUnit->CurrentTex[TEXTURE_2D_ARRAY_INDEX];
Brian Paul318e53a2009-01-27 11:07:21 -0700130 }
131 break;
132 default:
133 ;
Brian Paulae1fdc12008-06-11 20:05:53 -0600134 }
135
Brian Paul32b99832010-01-04 19:20:33 -0700136 _mesa_error(ctx, GL_INVALID_ENUM,
137 "gl%sTexParameter(target)", get ? "Get" : "");
Brian Paul318e53a2009-01-27 11:07:21 -0700138 return NULL;
139}
Brian Paulae1fdc12008-06-11 20:05:53 -0600140
Brian Paul318e53a2009-01-27 11:07:21 -0700141
Brian Paul4a89e512009-01-28 10:27:33 -0700142/**
143 * Convert GL_RED/GREEN/BLUE/ALPHA/ZERO/ONE to SWIZZLE_X/Y/Z/W/ZERO/ONE.
144 * \return -1 if error.
145 */
146static GLint
147comp_to_swizzle(GLenum comp)
148{
149 switch (comp) {
150 case GL_RED:
151 return SWIZZLE_X;
152 case GL_GREEN:
153 return SWIZZLE_Y;
154 case GL_BLUE:
155 return SWIZZLE_Z;
156 case GL_ALPHA:
157 return SWIZZLE_W;
158 case GL_ZERO:
159 return SWIZZLE_ZERO;
160 case GL_ONE:
161 return SWIZZLE_ONE;
162 default:
163 return -1;
164 }
165}
166
167
168static void
169set_swizzle_component(GLuint *swizzle, GLuint comp, GLuint swz)
170{
171 ASSERT(comp < 4);
172 ASSERT(swz <= SWIZZLE_NIL);
173 {
174 GLuint mask = 0x7 << (3 * comp);
175 GLuint s = (*swizzle & ~mask) | (swz << (3 * comp));
176 *swizzle = s;
177 }
178}
179
180
Brian Paulaad3f542009-02-09 13:58:32 -0700181/**
Brian Paulf4dc24a2011-01-23 09:10:35 -0700182 * This is called just prior to changing any texture object state which
183 * will not effect texture completeness.
184 */
185static INLINE void
186flush(struct gl_context *ctx)
187{
188 FLUSH_VERTICES(ctx, _NEW_TEXTURE);
189}
190
191
192/**
193 * This is called just prior to changing any texture object state which
194 * can effect texture completeness (texture base level, max level,
195 * minification filter).
Brian Paulaad3f542009-02-09 13:58:32 -0700196 * Any pending rendering will be flushed out, we'll set the _NEW_TEXTURE
197 * state flag and then mark the texture object as 'incomplete' so that any
198 * per-texture derived state gets recomputed.
199 */
200static INLINE void
Brian Paulf4dc24a2011-01-23 09:10:35 -0700201incomplete(struct gl_context *ctx, struct gl_texture_object *texObj)
Brian Paulaad3f542009-02-09 13:58:32 -0700202{
203 FLUSH_VERTICES(ctx, _NEW_TEXTURE);
204 texObj->_Complete = GL_FALSE;
205}
206
207
Roland Scheideggerebc14782009-04-02 23:38:34 +0200208/**
209 * Set an integer-valued texture parameter
210 * \return GL_TRUE if legal AND the value changed, GL_FALSE otherwise
211 */
212static GLboolean
Kristian Høgsbergf9995b32010-10-12 12:26:10 -0400213set_tex_parameteri(struct gl_context *ctx,
Brian Paul318e53a2009-01-27 11:07:21 -0700214 struct gl_texture_object *texObj,
215 GLenum pname, const GLint *params)
216{
217 switch (pname) {
218 case GL_TEXTURE_MIN_FILTER:
219 if (texObj->MinFilter == params[0])
Roland Scheideggerebc14782009-04-02 23:38:34 +0200220 return GL_FALSE;
Brian Paul318e53a2009-01-27 11:07:21 -0700221 switch (params[0]) {
222 case GL_NEAREST:
223 case GL_LINEAR:
Brian Paulf4dc24a2011-01-23 09:10:35 -0700224 incomplete(ctx, texObj);
Brian Paul318e53a2009-01-27 11:07:21 -0700225 texObj->MinFilter = params[0];
Roland Scheideggerebc14782009-04-02 23:38:34 +0200226 return GL_TRUE;
Brian Paul318e53a2009-01-27 11:07:21 -0700227 case GL_NEAREST_MIPMAP_NEAREST:
228 case GL_LINEAR_MIPMAP_NEAREST:
229 case GL_NEAREST_MIPMAP_LINEAR:
230 case GL_LINEAR_MIPMAP_LINEAR:
231 if (texObj->Target != GL_TEXTURE_RECTANGLE_NV) {
Brian Paulf4dc24a2011-01-23 09:10:35 -0700232 incomplete(ctx, texObj);
Brian Paul318e53a2009-01-27 11:07:21 -0700233 texObj->MinFilter = params[0];
Roland Scheideggerebc14782009-04-02 23:38:34 +0200234 return GL_TRUE;
Brian Paulae1fdc12008-06-11 20:05:53 -0600235 }
Brian Paul318e53a2009-01-27 11:07:21 -0700236 /* fall-through */
237 default:
Brian Paul0f6b8e22011-01-25 18:27:44 -0700238 goto invalid_param;
Brian Paul318e53a2009-01-27 11:07:21 -0700239 }
Roland Scheideggerebc14782009-04-02 23:38:34 +0200240 return GL_FALSE;
Brian Paul318e53a2009-01-27 11:07:21 -0700241
242 case GL_TEXTURE_MAG_FILTER:
243 if (texObj->MagFilter == params[0])
Roland Scheideggerebc14782009-04-02 23:38:34 +0200244 return GL_FALSE;
Brian Paul318e53a2009-01-27 11:07:21 -0700245 switch (params[0]) {
246 case GL_NEAREST:
247 case GL_LINEAR:
Brian Paulf4dc24a2011-01-23 09:10:35 -0700248 flush(ctx); /* does not effect completeness */
Brian Paul318e53a2009-01-27 11:07:21 -0700249 texObj->MagFilter = params[0];
Roland Scheideggerebc14782009-04-02 23:38:34 +0200250 return GL_TRUE;
Brian Paul318e53a2009-01-27 11:07:21 -0700251 default:
Brian Paul0f6b8e22011-01-25 18:27:44 -0700252 goto invalid_param;
Brian Paul318e53a2009-01-27 11:07:21 -0700253 }
Roland Scheideggerebc14782009-04-02 23:38:34 +0200254 return GL_FALSE;
Brian Paul318e53a2009-01-27 11:07:21 -0700255
256 case GL_TEXTURE_WRAP_S:
257 if (texObj->WrapS == params[0])
Roland Scheideggerebc14782009-04-02 23:38:34 +0200258 return GL_FALSE;
Brian Paul318e53a2009-01-27 11:07:21 -0700259 if (validate_texture_wrap_mode(ctx, texObj->Target, params[0])) {
Brian Paulf4dc24a2011-01-23 09:10:35 -0700260 flush(ctx);
Brian Paul318e53a2009-01-27 11:07:21 -0700261 texObj->WrapS = params[0];
Roland Scheideggerebc14782009-04-02 23:38:34 +0200262 return GL_TRUE;
Brian Paul318e53a2009-01-27 11:07:21 -0700263 }
Roland Scheideggerebc14782009-04-02 23:38:34 +0200264 return GL_FALSE;
Brian Paul318e53a2009-01-27 11:07:21 -0700265
266 case GL_TEXTURE_WRAP_T:
267 if (texObj->WrapT == params[0])
Roland Scheideggerebc14782009-04-02 23:38:34 +0200268 return GL_FALSE;
Brian Paul318e53a2009-01-27 11:07:21 -0700269 if (validate_texture_wrap_mode(ctx, texObj->Target, params[0])) {
Brian Paulf4dc24a2011-01-23 09:10:35 -0700270 flush(ctx);
Brian Paul318e53a2009-01-27 11:07:21 -0700271 texObj->WrapT = params[0];
Roland Scheideggerebc14782009-04-02 23:38:34 +0200272 return GL_TRUE;
Brian Paul318e53a2009-01-27 11:07:21 -0700273 }
Roland Scheideggerebc14782009-04-02 23:38:34 +0200274 return GL_FALSE;
Brian Paul318e53a2009-01-27 11:07:21 -0700275
276 case GL_TEXTURE_WRAP_R:
277 if (texObj->WrapR == params[0])
Roland Scheideggerebc14782009-04-02 23:38:34 +0200278 return GL_FALSE;
Brian Paul318e53a2009-01-27 11:07:21 -0700279 if (validate_texture_wrap_mode(ctx, texObj->Target, params[0])) {
Brian Paulf4dc24a2011-01-23 09:10:35 -0700280 flush(ctx);
Brian Paul318e53a2009-01-27 11:07:21 -0700281 texObj->WrapR = params[0];
Roland Scheideggerebc14782009-04-02 23:38:34 +0200282 return GL_TRUE;
Brian Paul318e53a2009-01-27 11:07:21 -0700283 }
Roland Scheideggerebc14782009-04-02 23:38:34 +0200284 return GL_FALSE;
Brian Paul318e53a2009-01-27 11:07:21 -0700285
286 case GL_TEXTURE_BASE_LEVEL:
287 if (texObj->BaseLevel == params[0])
Roland Scheideggerebc14782009-04-02 23:38:34 +0200288 return GL_FALSE;
Brian Paul318e53a2009-01-27 11:07:21 -0700289 if (params[0] < 0 ||
290 (texObj->Target == GL_TEXTURE_RECTANGLE_ARB && params[0] != 0)) {
Brian Paul1d003992009-04-23 17:54:34 -0600291 _mesa_error(ctx, GL_INVALID_VALUE,
292 "glTexParameter(param=%d)", params[0]);
Roland Scheideggerebc14782009-04-02 23:38:34 +0200293 return GL_FALSE;
Brian Paul318e53a2009-01-27 11:07:21 -0700294 }
Brian Paulf4dc24a2011-01-23 09:10:35 -0700295 incomplete(ctx, texObj);
Brian Paul318e53a2009-01-27 11:07:21 -0700296 texObj->BaseLevel = params[0];
Roland Scheideggerebc14782009-04-02 23:38:34 +0200297 return GL_TRUE;
Brian Paul318e53a2009-01-27 11:07:21 -0700298
299 case GL_TEXTURE_MAX_LEVEL:
300 if (texObj->MaxLevel == params[0])
Roland Scheideggerebc14782009-04-02 23:38:34 +0200301 return GL_FALSE;
Brian Paul318e53a2009-01-27 11:07:21 -0700302 if (params[0] < 0 || texObj->Target == GL_TEXTURE_RECTANGLE_ARB) {
Brian Paul1d003992009-04-23 17:54:34 -0600303 _mesa_error(ctx, GL_INVALID_OPERATION,
304 "glTexParameter(param=%d)", params[0]);
Roland Scheideggerebc14782009-04-02 23:38:34 +0200305 return GL_FALSE;
Brian Paul318e53a2009-01-27 11:07:21 -0700306 }
Brian Paulf4dc24a2011-01-23 09:10:35 -0700307 incomplete(ctx, texObj);
Brian Paul318e53a2009-01-27 11:07:21 -0700308 texObj->MaxLevel = params[0];
Roland Scheideggerebc14782009-04-02 23:38:34 +0200309 return GL_TRUE;
Brian Paul318e53a2009-01-27 11:07:21 -0700310
Brian Paul318e53a2009-01-27 11:07:21 -0700311 case GL_GENERATE_MIPMAP_SGIS:
Ian Romanick7f11d472010-09-27 14:55:52 -0700312 if (texObj->GenerateMipmap != params[0]) {
Brian Paulf4dc24a2011-01-23 09:10:35 -0700313 /* no flush() */
Ian Romanick7f11d472010-09-27 14:55:52 -0700314 texObj->GenerateMipmap = params[0] ? GL_TRUE : GL_FALSE;
315 return GL_TRUE;
Brian Paul318e53a2009-01-27 11:07:21 -0700316 }
Roland Scheideggerebc14782009-04-02 23:38:34 +0200317 return GL_FALSE;
Brian Paul318e53a2009-01-27 11:07:21 -0700318
319 case GL_TEXTURE_COMPARE_MODE_ARB:
Brian Paul0f6b8e22011-01-25 18:27:44 -0700320 if (ctx->Extensions.ARB_shadow) {
321 if (texObj->CompareMode == params[0])
322 return GL_FALSE;
323 if (params[0] == GL_NONE ||
324 params[0] == GL_COMPARE_R_TO_TEXTURE_ARB) {
Brian Paulf4dc24a2011-01-23 09:10:35 -0700325 flush(ctx);
Brian Paul37c768b2009-02-09 13:50:36 -0700326 texObj->CompareMode = params[0];
Roland Scheideggerebc14782009-04-02 23:38:34 +0200327 return GL_TRUE;
Brian Paul37c768b2009-02-09 13:50:36 -0700328 }
Brian Paul0f6b8e22011-01-25 18:27:44 -0700329 goto invalid_param;
Brian Paul318e53a2009-01-27 11:07:21 -0700330 }
Brian Paul0f6b8e22011-01-25 18:27:44 -0700331 goto invalid_pname;
Brian Paul318e53a2009-01-27 11:07:21 -0700332
333 case GL_TEXTURE_COMPARE_FUNC_ARB:
334 if (ctx->Extensions.ARB_shadow) {
Brian Paul37c768b2009-02-09 13:50:36 -0700335 if (texObj->CompareFunc == params[0])
Roland Scheideggerebc14782009-04-02 23:38:34 +0200336 return GL_FALSE;
Brian Paul318e53a2009-01-27 11:07:21 -0700337 switch (params[0]) {
338 case GL_LEQUAL:
339 case GL_GEQUAL:
Brian Paulf4dc24a2011-01-23 09:10:35 -0700340 flush(ctx);
Brian Paul318e53a2009-01-27 11:07:21 -0700341 texObj->CompareFunc = params[0];
Roland Scheideggerebc14782009-04-02 23:38:34 +0200342 return GL_TRUE;
Brian Paul318e53a2009-01-27 11:07:21 -0700343 case GL_EQUAL:
344 case GL_NOTEQUAL:
345 case GL_LESS:
346 case GL_GREATER:
347 case GL_ALWAYS:
348 case GL_NEVER:
349 if (ctx->Extensions.EXT_shadow_funcs) {
Brian Paulf4dc24a2011-01-23 09:10:35 -0700350 flush(ctx);
Brian Paul318e53a2009-01-27 11:07:21 -0700351 texObj->CompareFunc = params[0];
Roland Scheideggerebc14782009-04-02 23:38:34 +0200352 return GL_TRUE;
Brian Paulae1fdc12008-06-11 20:05:53 -0600353 }
Brian Paul318e53a2009-01-27 11:07:21 -0700354 /* fall-through */
355 default:
Brian Paul0f6b8e22011-01-25 18:27:44 -0700356 goto invalid_param;
Brian Paulae1fdc12008-06-11 20:05:53 -0600357 }
Brian Paul318e53a2009-01-27 11:07:21 -0700358 }
Brian Paul0f6b8e22011-01-25 18:27:44 -0700359 goto invalid_pname;
Brian Paul318e53a2009-01-27 11:07:21 -0700360
361 case GL_DEPTH_TEXTURE_MODE_ARB:
Brian Paul0f6b8e22011-01-25 18:27:44 -0700362 if (ctx->Extensions.ARB_depth_texture) {
363 if (texObj->DepthMode == params[0])
364 return GL_FALSE;
365 if (params[0] == GL_LUMINANCE ||
366 params[0] == GL_INTENSITY ||
367 params[0] == GL_ALPHA ||
368 (ctx->Extensions.ARB_texture_rg && params[0] == GL_RED)) {
Brian Paulf4dc24a2011-01-23 09:10:35 -0700369 flush(ctx);
Brian Paul37c768b2009-02-09 13:50:36 -0700370 texObj->DepthMode = params[0];
Roland Scheideggerebc14782009-04-02 23:38:34 +0200371 return GL_TRUE;
Brian Paul37c768b2009-02-09 13:50:36 -0700372 }
Brian Paul0f6b8e22011-01-25 18:27:44 -0700373 goto invalid_param;
Brian Paul318e53a2009-01-27 11:07:21 -0700374 }
Brian Paul0f6b8e22011-01-25 18:27:44 -0700375 goto invalid_pname;
Brian Paul318e53a2009-01-27 11:07:21 -0700376
Chia-I Wu066477a2010-03-30 13:13:20 +0800377#if FEATURE_OES_draw_texture
Brian Paul318e53a2009-01-27 11:07:21 -0700378 case GL_TEXTURE_CROP_RECT_OES:
379 texObj->CropRect[0] = params[0];
380 texObj->CropRect[1] = params[1];
381 texObj->CropRect[2] = params[2];
382 texObj->CropRect[3] = params[3];
Roland Scheideggerebc14782009-04-02 23:38:34 +0200383 return GL_TRUE;
Brian Paul1b7e9092008-08-12 17:41:57 -0600384#endif
Brian Paulae1fdc12008-06-11 20:05:53 -0600385
Brian Paul4a89e512009-01-28 10:27:33 -0700386 case GL_TEXTURE_SWIZZLE_R_EXT:
387 case GL_TEXTURE_SWIZZLE_G_EXT:
388 case GL_TEXTURE_SWIZZLE_B_EXT:
389 case GL_TEXTURE_SWIZZLE_A_EXT:
390 if (ctx->Extensions.EXT_texture_swizzle) {
391 const GLuint comp = pname - GL_TEXTURE_SWIZZLE_R_EXT;
392 const GLint swz = comp_to_swizzle(params[0]);
Brian Paul72f0b4a2009-01-28 10:44:04 -0700393 if (swz < 0) {
394 _mesa_error(ctx, GL_INVALID_OPERATION,
395 "glTexParameter(swizzle 0x%x)", params[0]);
Roland Scheideggerebc14782009-04-02 23:38:34 +0200396 return GL_FALSE;
Brian Paul72f0b4a2009-01-28 10:44:04 -0700397 }
Brian Paul4a89e512009-01-28 10:27:33 -0700398 ASSERT(comp < 4);
399 if (swz >= 0) {
Brian Paulf4dc24a2011-01-23 09:10:35 -0700400 flush(ctx);
Brian Paul4a89e512009-01-28 10:27:33 -0700401 texObj->Swizzle[comp] = params[0];
402 set_swizzle_component(&texObj->_Swizzle, comp, swz);
Roland Scheideggerebc14782009-04-02 23:38:34 +0200403 return GL_TRUE;
Brian Paul4a89e512009-01-28 10:27:33 -0700404 }
405 }
Brian Paul0f6b8e22011-01-25 18:27:44 -0700406 goto invalid_pname;
Brian Paul4a89e512009-01-28 10:27:33 -0700407
408 case GL_TEXTURE_SWIZZLE_RGBA_EXT:
409 if (ctx->Extensions.EXT_texture_swizzle) {
410 GLuint comp;
Brian Paulf4dc24a2011-01-23 09:10:35 -0700411 flush(ctx);
Brian Paul4a89e512009-01-28 10:27:33 -0700412 for (comp = 0; comp < 4; comp++) {
413 const GLint swz = comp_to_swizzle(params[comp]);
414 if (swz >= 0) {
415 texObj->Swizzle[comp] = params[comp];
416 set_swizzle_component(&texObj->_Swizzle, comp, swz);
417 }
418 else {
Brian Paul72f0b4a2009-01-28 10:44:04 -0700419 _mesa_error(ctx, GL_INVALID_OPERATION,
420 "glTexParameter(swizzle 0x%x)", params[comp]);
Roland Scheideggerebc14782009-04-02 23:38:34 +0200421 return GL_FALSE;
Brian Paul4a89e512009-01-28 10:27:33 -0700422 }
423 }
Roland Scheideggerebc14782009-04-02 23:38:34 +0200424 return GL_TRUE;
Brian Paul4a89e512009-01-28 10:27:33 -0700425 }
Brian Paul0f6b8e22011-01-25 18:27:44 -0700426 goto invalid_pname;
427
Dave Airlieedc2dd82011-01-13 12:12:21 +1000428 case GL_TEXTURE_SRGB_DECODE_EXT:
429 if (ctx->Extensions.EXT_texture_sRGB_decode) {
430 GLenum decode = params[0];
431 if (decode == GL_DECODE_EXT || decode == GL_SKIP_DECODE_EXT) {
432 if (texObj->sRGBDecode != decode) {
Brian Paulf4dc24a2011-01-23 09:10:35 -0700433 flush(ctx);
Dave Airlieedc2dd82011-01-13 12:12:21 +1000434 texObj->sRGBDecode = decode;
435 _mesa_update_fetch_functions(texObj);
436 }
437 return GL_TRUE;
438 }
439 }
Brian Paul0f6b8e22011-01-25 18:27:44 -0700440 goto invalid_pname;
441
Brian Paul318e53a2009-01-27 11:07:21 -0700442 default:
Brian Paul0f6b8e22011-01-25 18:27:44 -0700443 goto invalid_pname;
Brian Paul318e53a2009-01-27 11:07:21 -0700444 }
Brian Paul0f6b8e22011-01-25 18:27:44 -0700445
446invalid_pname:
447 _mesa_error(ctx, GL_INVALID_ENUM, "glTexParameter(pname=%s)",
448 _mesa_lookup_enum_by_nr(pname));
449 return GL_FALSE;
450
451invalid_param:
452 _mesa_error(ctx, GL_INVALID_ENUM, "glTexParameter(param=%s)",
453 _mesa_lookup_enum_by_nr(params[0]));
Roland Scheideggerebc14782009-04-02 23:38:34 +0200454 return GL_FALSE;
Brian Paul318e53a2009-01-27 11:07:21 -0700455}
456
457
Roland Scheideggerebc14782009-04-02 23:38:34 +0200458/**
459 * Set a float-valued texture parameter
460 * \return GL_TRUE if legal AND the value changed, GL_FALSE otherwise
461 */
462static GLboolean
Kristian Høgsbergf9995b32010-10-12 12:26:10 -0400463set_tex_parameterf(struct gl_context *ctx,
Brian Paul318e53a2009-01-27 11:07:21 -0700464 struct gl_texture_object *texObj,
465 GLenum pname, const GLfloat *params)
466{
467 switch (pname) {
468 case GL_TEXTURE_MIN_LOD:
469 if (texObj->MinLod == params[0])
Roland Scheideggerebc14782009-04-02 23:38:34 +0200470 return GL_FALSE;
Brian Paulf4dc24a2011-01-23 09:10:35 -0700471 flush(ctx);
Brian Paul318e53a2009-01-27 11:07:21 -0700472 texObj->MinLod = params[0];
Roland Scheideggerebc14782009-04-02 23:38:34 +0200473 return GL_TRUE;
Brian Paul318e53a2009-01-27 11:07:21 -0700474
475 case GL_TEXTURE_MAX_LOD:
476 if (texObj->MaxLod == params[0])
Roland Scheideggerebc14782009-04-02 23:38:34 +0200477 return GL_FALSE;
Brian Paulf4dc24a2011-01-23 09:10:35 -0700478 flush(ctx);
Brian Paul318e53a2009-01-27 11:07:21 -0700479 texObj->MaxLod = params[0];
Roland Scheideggerebc14782009-04-02 23:38:34 +0200480 return GL_TRUE;
Brian Paul318e53a2009-01-27 11:07:21 -0700481
482 case GL_TEXTURE_PRIORITY:
Brian Paulf4dc24a2011-01-23 09:10:35 -0700483 flush(ctx);
Brian Paul318e53a2009-01-27 11:07:21 -0700484 texObj->Priority = CLAMP(params[0], 0.0F, 1.0F);
Roland Scheideggerebc14782009-04-02 23:38:34 +0200485 return GL_TRUE;
Brian Paul318e53a2009-01-27 11:07:21 -0700486
487 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
488 if (ctx->Extensions.EXT_texture_filter_anisotropic) {
Brian Paul37c768b2009-02-09 13:50:36 -0700489 if (texObj->MaxAnisotropy == params[0])
Roland Scheideggerebc14782009-04-02 23:38:34 +0200490 return GL_FALSE;
Brian Paul318e53a2009-01-27 11:07:21 -0700491 if (params[0] < 1.0) {
492 _mesa_error(ctx, GL_INVALID_VALUE, "glTexParameter(param)" );
Roland Scheideggerebc14782009-04-02 23:38:34 +0200493 return GL_FALSE;
Brian Paul318e53a2009-01-27 11:07:21 -0700494 }
Brian Paulf4dc24a2011-01-23 09:10:35 -0700495 flush(ctx);
Brian Paul318e53a2009-01-27 11:07:21 -0700496 /* clamp to max, that's what NVIDIA does */
497 texObj->MaxAnisotropy = MIN2(params[0],
498 ctx->Const.MaxTextureMaxAnisotropy);
Roland Scheideggerebc14782009-04-02 23:38:34 +0200499 return GL_TRUE;
Brian Paul318e53a2009-01-27 11:07:21 -0700500 }
501 else {
Brian Paul74bec422009-05-06 09:01:47 -0600502 static GLuint count = 0;
503 if (count++ < 10)
504 _mesa_error(ctx, GL_INVALID_ENUM,
505 "glTexParameter(pname=GL_TEXTURE_MAX_ANISOTROPY_EXT)");
Brian Paul318e53a2009-01-27 11:07:21 -0700506 }
Roland Scheideggerebc14782009-04-02 23:38:34 +0200507 return GL_FALSE;
Brian Paul318e53a2009-01-27 11:07:21 -0700508
Brian Paul26da28c2009-01-28 16:49:28 -0700509 case GL_TEXTURE_COMPARE_FAIL_VALUE_ARB:
510 if (ctx->Extensions.ARB_shadow_ambient) {
Brian Paul37c768b2009-02-09 13:50:36 -0700511 if (texObj->CompareFailValue != params[0]) {
Brian Paulf4dc24a2011-01-23 09:10:35 -0700512 flush(ctx);
Brian Paul37c768b2009-02-09 13:50:36 -0700513 texObj->CompareFailValue = CLAMP(params[0], 0.0F, 1.0F);
Roland Scheideggerebc14782009-04-02 23:38:34 +0200514 return GL_TRUE;
Brian Paul37c768b2009-02-09 13:50:36 -0700515 }
Brian Paul318e53a2009-01-27 11:07:21 -0700516 }
517 else {
518 _mesa_error(ctx, GL_INVALID_ENUM,
Brian Paul26da28c2009-01-28 16:49:28 -0700519 "glTexParameter(pname=GL_TEXTURE_COMPARE_FAIL_VALUE_ARB)");
Brian Paul318e53a2009-01-27 11:07:21 -0700520 }
Roland Scheideggerebc14782009-04-02 23:38:34 +0200521 return GL_FALSE;
Brian Paul318e53a2009-01-27 11:07:21 -0700522
523 case GL_TEXTURE_LOD_BIAS:
524 /* NOTE: this is really part of OpenGL 1.4, not EXT_texture_lod_bias */
525 if (ctx->Extensions.EXT_texture_lod_bias) {
526 if (texObj->LodBias != params[0]) {
Brian Paulf4dc24a2011-01-23 09:10:35 -0700527 flush(ctx);
Brian Paul318e53a2009-01-27 11:07:21 -0700528 texObj->LodBias = params[0];
Roland Scheideggerebc14782009-04-02 23:38:34 +0200529 return GL_TRUE;
Brian Paul318e53a2009-01-27 11:07:21 -0700530 }
Roland Scheideggerebc14782009-04-02 23:38:34 +0200531 return GL_FALSE;
Brian Paul318e53a2009-01-27 11:07:21 -0700532 }
533 break;
534
535 case GL_TEXTURE_BORDER_COLOR:
Brian Paulf4dc24a2011-01-23 09:10:35 -0700536 flush(ctx);
Marek Olšáke28fe8f2011-03-26 13:06:22 +0100537 /* ARB_texture_float disables clamping */
538 if (ctx->Extensions.ARB_texture_float) {
539 texObj->BorderColor.f[RCOMP] = params[0];
540 texObj->BorderColor.f[GCOMP] = params[1];
541 texObj->BorderColor.f[BCOMP] = params[2];
542 texObj->BorderColor.f[ACOMP] = params[3];
543 } else {
544 texObj->BorderColor.f[RCOMP] = CLAMP(params[0], 0.0F, 1.0F);
545 texObj->BorderColor.f[GCOMP] = CLAMP(params[1], 0.0F, 1.0F);
546 texObj->BorderColor.f[BCOMP] = CLAMP(params[2], 0.0F, 1.0F);
547 texObj->BorderColor.f[ACOMP] = CLAMP(params[3], 0.0F, 1.0F);
548 }
Roland Scheideggerebc14782009-04-02 23:38:34 +0200549 return GL_TRUE;
Brian Paul318e53a2009-01-27 11:07:21 -0700550
551 default:
552 _mesa_error(ctx, GL_INVALID_ENUM, "glTexParameter(pname=0x%x)", pname);
553 }
Roland Scheideggerebc14782009-04-02 23:38:34 +0200554 return GL_FALSE;
Brian Paul318e53a2009-01-27 11:07:21 -0700555}
556
557
558void GLAPIENTRY
559_mesa_TexParameterf(GLenum target, GLenum pname, GLfloat param)
560{
Roland Scheideggerebc14782009-04-02 23:38:34 +0200561 GLboolean need_update;
Brian Paul318e53a2009-01-27 11:07:21 -0700562 struct gl_texture_object *texObj;
563 GET_CURRENT_CONTEXT(ctx);
564 ASSERT_OUTSIDE_BEGIN_END(ctx);
565
Brian Paul32b99832010-01-04 19:20:33 -0700566 texObj = get_texobj(ctx, target, GL_FALSE);
Brian Paul318e53a2009-01-27 11:07:21 -0700567 if (!texObj)
568 return;
569
570 switch (pname) {
571 case GL_TEXTURE_MIN_FILTER:
572 case GL_TEXTURE_MAG_FILTER:
573 case GL_TEXTURE_WRAP_S:
574 case GL_TEXTURE_WRAP_T:
575 case GL_TEXTURE_WRAP_R:
576 case GL_TEXTURE_BASE_LEVEL:
577 case GL_TEXTURE_MAX_LEVEL:
Brian Paul318e53a2009-01-27 11:07:21 -0700578 case GL_GENERATE_MIPMAP_SGIS:
579 case GL_TEXTURE_COMPARE_MODE_ARB:
580 case GL_TEXTURE_COMPARE_FUNC_ARB:
581 case GL_DEPTH_TEXTURE_MODE_ARB:
Dave Airlieedc2dd82011-01-13 12:12:21 +1000582 case GL_TEXTURE_SRGB_DECODE_EXT:
Brian Paul318e53a2009-01-27 11:07:21 -0700583 {
584 /* convert float param to int */
Vinson Leea201dfb2009-11-29 18:18:23 -0500585 GLint p[4];
586 p[0] = (GLint) param;
587 p[1] = p[2] = p[3] = 0;
588 need_update = set_tex_parameteri(ctx, texObj, pname, p);
Brian Paul318e53a2009-01-27 11:07:21 -0700589 }
Roland Scheideggerebc14782009-04-02 23:38:34 +0200590 break;
Brian Paul318e53a2009-01-27 11:07:21 -0700591 default:
Vinson Lee270d36d2009-11-29 21:17:44 -0500592 {
593 /* this will generate an error if pname is illegal */
594 GLfloat p[4];
595 p[0] = param;
596 p[1] = p[2] = p[3] = 0.0F;
597 need_update = set_tex_parameterf(ctx, texObj, pname, p);
598 }
Brian Paulae1fdc12008-06-11 20:05:53 -0600599 }
600
Roland Scheideggerebc14782009-04-02 23:38:34 +0200601 if (ctx->Driver.TexParameter && need_update) {
Brian Paul318e53a2009-01-27 11:07:21 -0700602 ctx->Driver.TexParameter(ctx, target, texObj, pname, &param);
Brian Paulae1fdc12008-06-11 20:05:53 -0600603 }
604}
605
606
607void GLAPIENTRY
Brian Paul318e53a2009-01-27 11:07:21 -0700608_mesa_TexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
Brian Paulae1fdc12008-06-11 20:05:53 -0600609{
Roland Scheideggerebc14782009-04-02 23:38:34 +0200610 GLboolean need_update;
Brian Paul318e53a2009-01-27 11:07:21 -0700611 struct gl_texture_object *texObj;
612 GET_CURRENT_CONTEXT(ctx);
613 ASSERT_OUTSIDE_BEGIN_END(ctx);
614
Brian Paul32b99832010-01-04 19:20:33 -0700615 texObj = get_texobj(ctx, target, GL_FALSE);
Brian Paul318e53a2009-01-27 11:07:21 -0700616 if (!texObj)
617 return;
618
619 switch (pname) {
620 case GL_TEXTURE_MIN_FILTER:
621 case GL_TEXTURE_MAG_FILTER:
622 case GL_TEXTURE_WRAP_S:
623 case GL_TEXTURE_WRAP_T:
624 case GL_TEXTURE_WRAP_R:
625 case GL_TEXTURE_BASE_LEVEL:
626 case GL_TEXTURE_MAX_LEVEL:
Brian Paul318e53a2009-01-27 11:07:21 -0700627 case GL_GENERATE_MIPMAP_SGIS:
628 case GL_TEXTURE_COMPARE_MODE_ARB:
629 case GL_TEXTURE_COMPARE_FUNC_ARB:
630 case GL_DEPTH_TEXTURE_MODE_ARB:
Dave Airlieedc2dd82011-01-13 12:12:21 +1000631 case GL_TEXTURE_SRGB_DECODE_EXT:
Brian Paul318e53a2009-01-27 11:07:21 -0700632 {
633 /* convert float param to int */
Vinson Leed88f3b92009-12-08 14:31:38 -0800634 GLint p[4];
635 p[0] = (GLint) params[0];
636 p[1] = p[2] = p[3] = 0;
637 need_update = set_tex_parameteri(ctx, texObj, pname, p);
Brian Paul318e53a2009-01-27 11:07:21 -0700638 }
639 break;
640
Chia-I Wu066477a2010-03-30 13:13:20 +0800641#if FEATURE_OES_draw_texture
Brian Paul318e53a2009-01-27 11:07:21 -0700642 case GL_TEXTURE_CROP_RECT_OES:
643 {
644 /* convert float params to int */
645 GLint iparams[4];
646 iparams[0] = (GLint) params[0];
647 iparams[1] = (GLint) params[1];
648 iparams[2] = (GLint) params[2];
649 iparams[3] = (GLint) params[3];
Chia-I Wu9927d7f2009-10-02 15:32:04 +0800650 need_update = set_tex_parameteri(ctx, texObj, pname, iparams);
Brian Paul318e53a2009-01-27 11:07:21 -0700651 }
652 break;
653#endif
654
655 default:
656 /* this will generate an error if pname is illegal */
Roland Scheideggerebc14782009-04-02 23:38:34 +0200657 need_update = set_tex_parameterf(ctx, texObj, pname, params);
Brian Paul318e53a2009-01-27 11:07:21 -0700658 }
659
Roland Scheideggerebc14782009-04-02 23:38:34 +0200660 if (ctx->Driver.TexParameter && need_update) {
Brian Paul318e53a2009-01-27 11:07:21 -0700661 ctx->Driver.TexParameter(ctx, target, texObj, pname, params);
662 }
Brian Paulae1fdc12008-06-11 20:05:53 -0600663}
664
665
666void GLAPIENTRY
Brian Paul318e53a2009-01-27 11:07:21 -0700667_mesa_TexParameteri(GLenum target, GLenum pname, GLint param)
Brian Paulae1fdc12008-06-11 20:05:53 -0600668{
Roland Scheideggerebc14782009-04-02 23:38:34 +0200669 GLboolean need_update;
Brian Paul318e53a2009-01-27 11:07:21 -0700670 struct gl_texture_object *texObj;
671 GET_CURRENT_CONTEXT(ctx);
672 ASSERT_OUTSIDE_BEGIN_END(ctx);
673
Brian Paul32b99832010-01-04 19:20:33 -0700674 texObj = get_texobj(ctx, target, GL_FALSE);
Brian Paul318e53a2009-01-27 11:07:21 -0700675 if (!texObj)
676 return;
677
678 switch (pname) {
679 case GL_TEXTURE_MIN_LOD:
680 case GL_TEXTURE_MAX_LOD:
681 case GL_TEXTURE_PRIORITY:
682 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
683 case GL_TEXTURE_LOD_BIAS:
Brian Paul26da28c2009-01-28 16:49:28 -0700684 case GL_TEXTURE_COMPARE_FAIL_VALUE_ARB:
Brian Paul318e53a2009-01-27 11:07:21 -0700685 {
Vinson Leea1d46fb2009-12-08 15:42:13 -0800686 GLfloat fparam[4];
687 fparam[0] = (GLfloat) param;
688 fparam[1] = fparam[2] = fparam[3] = 0.0F;
Brian Paul318e53a2009-01-27 11:07:21 -0700689 /* convert int param to float */
Vinson Leea1d46fb2009-12-08 15:42:13 -0800690 need_update = set_tex_parameterf(ctx, texObj, pname, fparam);
Brian Paul318e53a2009-01-27 11:07:21 -0700691 }
692 break;
693 default:
694 /* this will generate an error if pname is illegal */
Vinson Lee3f7c2ac2009-12-08 17:25:05 -0800695 {
696 GLint iparam[4];
697 iparam[0] = param;
698 iparam[1] = iparam[2] = iparam[3] = 0;
699 need_update = set_tex_parameteri(ctx, texObj, pname, iparam);
700 }
Brian Paulae1fdc12008-06-11 20:05:53 -0600701 }
Brian Paul318e53a2009-01-27 11:07:21 -0700702
Roland Scheideggerebc14782009-04-02 23:38:34 +0200703 if (ctx->Driver.TexParameter && need_update) {
Brian Paul318e53a2009-01-27 11:07:21 -0700704 GLfloat fparam = (GLfloat) param;
705 ctx->Driver.TexParameter(ctx, target, texObj, pname, &fparam);
Brian Paul1b7e9092008-08-12 17:41:57 -0600706 }
Brian Paul318e53a2009-01-27 11:07:21 -0700707}
708
709
710void GLAPIENTRY
711_mesa_TexParameteriv(GLenum target, GLenum pname, const GLint *params)
712{
Roland Scheideggerebc14782009-04-02 23:38:34 +0200713 GLboolean need_update;
Brian Paul318e53a2009-01-27 11:07:21 -0700714 struct gl_texture_object *texObj;
715 GET_CURRENT_CONTEXT(ctx);
716 ASSERT_OUTSIDE_BEGIN_END(ctx);
717
Brian Paul32b99832010-01-04 19:20:33 -0700718 texObj = get_texobj(ctx, target, GL_FALSE);
Brian Paul318e53a2009-01-27 11:07:21 -0700719 if (!texObj)
720 return;
721
722 switch (pname) {
723 case GL_TEXTURE_BORDER_COLOR:
724 {
725 /* convert int params to float */
726 GLfloat fparams[4];
727 fparams[0] = INT_TO_FLOAT(params[0]);
728 fparams[1] = INT_TO_FLOAT(params[1]);
729 fparams[2] = INT_TO_FLOAT(params[2]);
730 fparams[3] = INT_TO_FLOAT(params[3]);
Roland Scheideggerebc14782009-04-02 23:38:34 +0200731 need_update = set_tex_parameterf(ctx, texObj, pname, fparams);
Brian Paul318e53a2009-01-27 11:07:21 -0700732 }
733 break;
734 case GL_TEXTURE_MIN_LOD:
735 case GL_TEXTURE_MAX_LOD:
736 case GL_TEXTURE_PRIORITY:
737 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
738 case GL_TEXTURE_LOD_BIAS:
Brian Paul26da28c2009-01-28 16:49:28 -0700739 case GL_TEXTURE_COMPARE_FAIL_VALUE_ARB:
Brian Paul318e53a2009-01-27 11:07:21 -0700740 {
741 /* convert int param to float */
Vinson Leedcb4a372009-12-10 12:11:09 -0800742 GLfloat fparams[4];
743 fparams[0] = (GLfloat) params[0];
744 fparams[1] = fparams[2] = fparams[3] = 0.0F;
745 need_update = set_tex_parameterf(ctx, texObj, pname, fparams);
Brian Paul318e53a2009-01-27 11:07:21 -0700746 }
747 break;
748 default:
749 /* this will generate an error if pname is illegal */
Roland Scheideggerebc14782009-04-02 23:38:34 +0200750 need_update = set_tex_parameteri(ctx, texObj, pname, params);
Brian Paulae1fdc12008-06-11 20:05:53 -0600751 }
Brian Paul318e53a2009-01-27 11:07:21 -0700752
Roland Scheideggerebc14782009-04-02 23:38:34 +0200753 if (ctx->Driver.TexParameter && need_update) {
Brian Paul318e53a2009-01-27 11:07:21 -0700754 GLfloat fparams[4];
755 fparams[0] = INT_TO_FLOAT(params[0]);
756 if (pname == GL_TEXTURE_BORDER_COLOR ||
757 pname == GL_TEXTURE_CROP_RECT_OES) {
758 fparams[1] = INT_TO_FLOAT(params[1]);
759 fparams[2] = INT_TO_FLOAT(params[2]);
760 fparams[3] = INT_TO_FLOAT(params[3]);
761 }
762 ctx->Driver.TexParameter(ctx, target, texObj, pname, fparams);
763 }
Brian Paulae1fdc12008-06-11 20:05:53 -0600764}
765
766
Brian Paul7836a962010-01-04 20:00:00 -0700767/**
768 * Set tex parameter to integer value(s). Primarily intended to set
769 * integer-valued texture border color (for integer-valued textures).
770 * New in GL 3.0.
771 */
772void GLAPIENTRY
773_mesa_TexParameterIiv(GLenum target, GLenum pname, const GLint *params)
774{
775 struct gl_texture_object *texObj;
776 GET_CURRENT_CONTEXT(ctx);
777 ASSERT_OUTSIDE_BEGIN_END(ctx);
778
779 texObj = get_texobj(ctx, target, GL_FALSE);
780 if (!texObj)
781 return;
782
783 switch (pname) {
784 case GL_TEXTURE_BORDER_COLOR:
785 FLUSH_VERTICES(ctx, _NEW_TEXTURE);
786 /* set the integer-valued border color */
787 COPY_4V(texObj->BorderColor.i, params);
788 break;
789 default:
790 _mesa_TexParameteriv(target, pname, params);
791 break;
792 }
793 /* XXX no driver hook for TexParameterIiv() yet */
794}
795
796
797/**
798 * Set tex parameter to unsigned integer value(s). Primarily intended to set
799 * uint-valued texture border color (for integer-valued textures).
800 * New in GL 3.0
801 */
802void GLAPIENTRY
803_mesa_TexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
804{
805 struct gl_texture_object *texObj;
806 GET_CURRENT_CONTEXT(ctx);
807 ASSERT_OUTSIDE_BEGIN_END(ctx);
808
809 texObj = get_texobj(ctx, target, GL_FALSE);
810 if (!texObj)
811 return;
812
813 switch (pname) {
814 case GL_TEXTURE_BORDER_COLOR:
815 FLUSH_VERTICES(ctx, _NEW_TEXTURE);
816 /* set the unsigned integer-valued border color */
817 COPY_4V(texObj->BorderColor.ui, params);
818 break;
819 default:
820 _mesa_TexParameteriv(target, pname, (const GLint *) params);
821 break;
822 }
823 /* XXX no driver hook for TexParameterIuiv() yet */
824}
825
826
827
828
Brian Paulae1fdc12008-06-11 20:05:53 -0600829void GLAPIENTRY
830_mesa_GetTexLevelParameterfv( GLenum target, GLint level,
831 GLenum pname, GLfloat *params )
832{
833 GLint iparam;
834 _mesa_GetTexLevelParameteriv( target, level, pname, &iparam );
835 *params = (GLfloat) iparam;
836}
837
838
Brian Paulae1fdc12008-06-11 20:05:53 -0600839void GLAPIENTRY
840_mesa_GetTexLevelParameteriv( GLenum target, GLint level,
841 GLenum pname, GLint *params )
842{
843 const struct gl_texture_unit *texUnit;
844 struct gl_texture_object *texObj;
845 const struct gl_texture_image *img = NULL;
Brian Paulae1fdc12008-06-11 20:05:53 -0600846 GLint maxLevels;
Brian Paulaf0adb52009-09-27 20:56:04 -0600847 gl_format texFormat;
Brian Paulae1fdc12008-06-11 20:05:53 -0600848 GET_CURRENT_CONTEXT(ctx);
849 ASSERT_OUTSIDE_BEGIN_END(ctx);
850
Brian Paulb2a30492010-02-03 15:47:44 -0700851 if (ctx->Texture.CurrentUnit >= ctx->Const.MaxCombinedTextureImageUnits) {
Brian Paulae1fdc12008-06-11 20:05:53 -0600852 _mesa_error(ctx, GL_INVALID_OPERATION,
853 "glGetTexLevelParameteriv(current unit)");
854 return;
855 }
856
Brian Paul6aa7a032009-08-13 09:55:34 -0600857 texUnit = _mesa_get_current_tex_unit(ctx);
Brian Paulae1fdc12008-06-11 20:05:53 -0600858
859 /* this will catch bad target values */
Brian Paulae1fdc12008-06-11 20:05:53 -0600860 maxLevels = _mesa_max_texture_levels(ctx, target);
861 if (maxLevels == 0) {
Brian Paul8a9795e2009-08-13 10:18:50 -0600862 _mesa_error(ctx, GL_INVALID_ENUM,
863 "glGetTexLevelParameter[if]v(target=0x%x)", target);
Brian Paulae1fdc12008-06-11 20:05:53 -0600864 return;
865 }
866
867 if (level < 0 || level >= maxLevels) {
868 _mesa_error( ctx, GL_INVALID_VALUE, "glGetTexLevelParameter[if]v" );
869 return;
870 }
871
872 texObj = _mesa_select_tex_object(ctx, texUnit, target);
Brian Paulae1fdc12008-06-11 20:05:53 -0600873
874 img = _mesa_select_tex_image(ctx, texObj, target, level);
875 if (!img || !img->TexFormat) {
876 /* undefined texture image */
877 if (pname == GL_TEXTURE_COMPONENTS)
878 *params = 1;
879 else
880 *params = 0;
Brian Paulf3224002011-01-25 18:42:53 -0700881 return;
Brian Paulae1fdc12008-06-11 20:05:53 -0600882 }
883
Brian Paul1f7c9142009-09-30 20:28:45 -0600884 texFormat = img->TexFormat;
Brian Paulaf0adb52009-09-27 20:56:04 -0600885
Brian Paulae1fdc12008-06-11 20:05:53 -0600886 switch (pname) {
887 case GL_TEXTURE_WIDTH:
888 *params = img->Width;
889 break;
890 case GL_TEXTURE_HEIGHT:
891 *params = img->Height;
892 break;
893 case GL_TEXTURE_DEPTH:
894 *params = img->Depth;
895 break;
896 case GL_TEXTURE_INTERNAL_FORMAT:
Brian Paul365f6582011-01-25 18:44:11 -0700897 if (_mesa_is_format_compressed(texFormat)) {
Brian Paulcd62b4f2009-10-23 14:40:40 -0600898 /* need to return the actual compressed format */
Brian Paul365f6582011-01-25 18:44:11 -0700899 *params = _mesa_compressed_format_to_glenum(ctx, texFormat);
Brian Paulcd62b4f2009-10-23 14:40:40 -0600900 }
901 else {
902 /* return the user's requested internal format */
903 *params = img->InternalFormat;
904 }
Brian Paulae1fdc12008-06-11 20:05:53 -0600905 break;
906 case GL_TEXTURE_BORDER:
907 *params = img->Border;
908 break;
909 case GL_TEXTURE_RED_SIZE:
Ian Romanickcc6f13d2010-09-28 11:17:27 -0700910 if (img->_BaseFormat == GL_RED) {
911 *params = _mesa_get_format_bits(texFormat, pname);
912 break;
913 }
914 /* FALLTHROUGH */
Brian Paulae1fdc12008-06-11 20:05:53 -0600915 case GL_TEXTURE_GREEN_SIZE:
Ian Romanickcc6f13d2010-09-28 11:17:27 -0700916 if (img->_BaseFormat == GL_RG) {
917 *params = _mesa_get_format_bits(texFormat, pname);
918 break;
919 }
920 /* FALLTHROUGH */
Brian Paulae1fdc12008-06-11 20:05:53 -0600921 case GL_TEXTURE_BLUE_SIZE:
922 if (img->_BaseFormat == GL_RGB || img->_BaseFormat == GL_RGBA)
Brian Paulaf0adb52009-09-27 20:56:04 -0600923 *params = _mesa_get_format_bits(texFormat, pname);
Brian Paulae1fdc12008-06-11 20:05:53 -0600924 else
925 *params = 0;
926 break;
927 case GL_TEXTURE_ALPHA_SIZE:
928 if (img->_BaseFormat == GL_ALPHA ||
929 img->_BaseFormat == GL_LUMINANCE_ALPHA ||
930 img->_BaseFormat == GL_RGBA)
Brian Paulaf0adb52009-09-27 20:56:04 -0600931 *params = _mesa_get_format_bits(texFormat, pname);
Brian Paulae1fdc12008-06-11 20:05:53 -0600932 else
933 *params = 0;
934 break;
935 case GL_TEXTURE_INTENSITY_SIZE:
936 if (img->_BaseFormat != GL_INTENSITY)
937 *params = 0;
Brian Paulb64d4782009-09-27 19:38:21 -0600938 else {
Brian Paulaf0adb52009-09-27 20:56:04 -0600939 *params = _mesa_get_format_bits(texFormat, pname);
Brian Paulb64d4782009-09-27 19:38:21 -0600940 if (*params == 0) {
941 /* intensity probably stored as rgb texture */
Brian Paulaf0adb52009-09-27 20:56:04 -0600942 *params = MIN2(_mesa_get_format_bits(texFormat, GL_TEXTURE_RED_SIZE),
943 _mesa_get_format_bits(texFormat, GL_TEXTURE_GREEN_SIZE));
Brian Paulb64d4782009-09-27 19:38:21 -0600944 }
945 }
Brian Paulae1fdc12008-06-11 20:05:53 -0600946 break;
947 case GL_TEXTURE_LUMINANCE_SIZE:
948 if (img->_BaseFormat != GL_LUMINANCE &&
949 img->_BaseFormat != GL_LUMINANCE_ALPHA)
950 *params = 0;
Brian Paulb64d4782009-09-27 19:38:21 -0600951 else {
Brian Paulaf0adb52009-09-27 20:56:04 -0600952 *params = _mesa_get_format_bits(texFormat, pname);
Brian Paul5767a672009-09-27 20:59:28 -0600953 if (*params == 0) {
Brian Paulb64d4782009-09-27 19:38:21 -0600954 /* luminance probably stored as rgb texture */
Brian Paulaf0adb52009-09-27 20:56:04 -0600955 *params = MIN2(_mesa_get_format_bits(texFormat, GL_TEXTURE_RED_SIZE),
956 _mesa_get_format_bits(texFormat, GL_TEXTURE_GREEN_SIZE));
Brian Paulb64d4782009-09-27 19:38:21 -0600957 }
958 }
Brian Paulae1fdc12008-06-11 20:05:53 -0600959 break;
960 case GL_TEXTURE_INDEX_SIZE_EXT:
961 if (img->_BaseFormat == GL_COLOR_INDEX)
Brian Paulaf0adb52009-09-27 20:56:04 -0600962 *params = _mesa_get_format_bits(texFormat, pname);
Brian Paulae1fdc12008-06-11 20:05:53 -0600963 else
964 *params = 0;
965 break;
966 case GL_TEXTURE_DEPTH_SIZE_ARB:
Ian Romanick4741dbc2008-10-01 15:51:56 -0700967 if (ctx->Extensions.ARB_depth_texture)
Brian Paulaf0adb52009-09-27 20:56:04 -0600968 *params = _mesa_get_format_bits(texFormat, pname);
Brian Paulae1fdc12008-06-11 20:05:53 -0600969 else
Brian Paulf3224002011-01-25 18:42:53 -0700970 goto invalid_pname;
Brian Paulae1fdc12008-06-11 20:05:53 -0600971 break;
972 case GL_TEXTURE_STENCIL_SIZE_EXT:
Brian Paulf44638f2009-06-29 15:12:36 -0600973 if (ctx->Extensions.EXT_packed_depth_stencil ||
974 ctx->Extensions.ARB_framebuffer_object) {
Brian Paulaf0adb52009-09-27 20:56:04 -0600975 *params = _mesa_get_format_bits(texFormat, pname);
Brian Paulae1fdc12008-06-11 20:05:53 -0600976 }
977 else {
Brian Paulf3224002011-01-25 18:42:53 -0700978 goto invalid_pname;
Brian Paulae1fdc12008-06-11 20:05:53 -0600979 }
980 break;
Brian Paul61753c42010-03-20 12:04:52 -0600981 case GL_TEXTURE_SHARED_SIZE:
982 if (ctx->VersionMajor >= 3) {
983 /* XXX return number of exponent bits for shared exponent texture
984 * formats, like GL_RGB9_E5.
985 */
986 *params = 0;
987 }
988 else {
Brian Paulf3224002011-01-25 18:42:53 -0700989 goto invalid_pname;
Brian Paul61753c42010-03-20 12:04:52 -0600990 }
991 break;
Brian Paulae1fdc12008-06-11 20:05:53 -0600992
993 /* GL_ARB_texture_compression */
994 case GL_TEXTURE_COMPRESSED_IMAGE_SIZE:
Brian Paul0bfd1742011-01-25 18:45:44 -0700995 if (_mesa_is_format_compressed(texFormat) &&
996 !_mesa_is_proxy_texture(target)) {
Brian Pauld6ee86c2009-10-24 16:49:57 -0600997 *params = _mesa_format_image_size(texFormat, img->Width,
998 img->Height, img->Depth);
Ian Romanick33fa5e42009-01-27 17:36:03 -0800999 }
1000 else {
1001 _mesa_error(ctx, GL_INVALID_OPERATION,
1002 "glGetTexLevelParameter[if]v(pname)");
1003 }
Brian Paulae1fdc12008-06-11 20:05:53 -06001004 break;
1005 case GL_TEXTURE_COMPRESSED:
Brian Paul365f6582011-01-25 18:44:11 -07001006 *params = (GLint) _mesa_is_format_compressed(texFormat);
Brian Paulae1fdc12008-06-11 20:05:53 -06001007 break;
1008
1009 /* GL_ARB_texture_float */
1010 case GL_TEXTURE_RED_TYPE_ARB:
1011 if (ctx->Extensions.ARB_texture_float) {
Brian Paulaf0adb52009-09-27 20:56:04 -06001012 *params = _mesa_get_format_bits(texFormat, GL_TEXTURE_RED_SIZE) ?
1013 _mesa_get_format_datatype(texFormat) : GL_NONE;
Brian Paulae1fdc12008-06-11 20:05:53 -06001014 }
1015 else {
Brian Paulf3224002011-01-25 18:42:53 -07001016 goto invalid_pname;
Brian Paulae1fdc12008-06-11 20:05:53 -06001017 }
1018 break;
1019 case GL_TEXTURE_GREEN_TYPE_ARB:
1020 if (ctx->Extensions.ARB_texture_float) {
Brian Paulaf0adb52009-09-27 20:56:04 -06001021 *params = _mesa_get_format_bits(texFormat, GL_TEXTURE_GREEN_SIZE) ?
1022 _mesa_get_format_datatype(texFormat) : GL_NONE;
Brian Paulae1fdc12008-06-11 20:05:53 -06001023 }
1024 else {
Brian Paulf3224002011-01-25 18:42:53 -07001025 goto invalid_pname;
Brian Paulae1fdc12008-06-11 20:05:53 -06001026 }
1027 break;
1028 case GL_TEXTURE_BLUE_TYPE_ARB:
1029 if (ctx->Extensions.ARB_texture_float) {
Brian Paulaf0adb52009-09-27 20:56:04 -06001030 *params = _mesa_get_format_bits(texFormat, GL_TEXTURE_BLUE_SIZE) ?
1031 _mesa_get_format_datatype(texFormat) : GL_NONE;
Brian Paulae1fdc12008-06-11 20:05:53 -06001032 }
1033 else {
Brian Paulf3224002011-01-25 18:42:53 -07001034 goto invalid_pname;
Brian Paulae1fdc12008-06-11 20:05:53 -06001035 }
1036 break;
1037 case GL_TEXTURE_ALPHA_TYPE_ARB:
1038 if (ctx->Extensions.ARB_texture_float) {
Brian Paulaf0adb52009-09-27 20:56:04 -06001039 *params = _mesa_get_format_bits(texFormat, GL_TEXTURE_ALPHA_SIZE) ?
1040 _mesa_get_format_datatype(texFormat) : GL_NONE;
Brian Paulae1fdc12008-06-11 20:05:53 -06001041 }
1042 else {
Brian Paulf3224002011-01-25 18:42:53 -07001043 goto invalid_pname;
Brian Paulae1fdc12008-06-11 20:05:53 -06001044 }
1045 break;
1046 case GL_TEXTURE_LUMINANCE_TYPE_ARB:
1047 if (ctx->Extensions.ARB_texture_float) {
Brian Paulaf0adb52009-09-27 20:56:04 -06001048 *params = _mesa_get_format_bits(texFormat, GL_TEXTURE_LUMINANCE_SIZE) ?
1049 _mesa_get_format_datatype(texFormat) : GL_NONE;
Brian Paulae1fdc12008-06-11 20:05:53 -06001050 }
1051 else {
Brian Paulf3224002011-01-25 18:42:53 -07001052 goto invalid_pname;
Brian Paulae1fdc12008-06-11 20:05:53 -06001053 }
1054 break;
1055 case GL_TEXTURE_INTENSITY_TYPE_ARB:
1056 if (ctx->Extensions.ARB_texture_float) {
Brian Paulaf0adb52009-09-27 20:56:04 -06001057 *params = _mesa_get_format_bits(texFormat, GL_TEXTURE_INTENSITY_SIZE) ?
1058 _mesa_get_format_datatype(texFormat) : GL_NONE;
Brian Paulae1fdc12008-06-11 20:05:53 -06001059 }
1060 else {
Brian Paulf3224002011-01-25 18:42:53 -07001061 goto invalid_pname;
Brian Paulae1fdc12008-06-11 20:05:53 -06001062 }
1063 break;
1064 case GL_TEXTURE_DEPTH_TYPE_ARB:
1065 if (ctx->Extensions.ARB_texture_float) {
Brian Paulaf0adb52009-09-27 20:56:04 -06001066 *params = _mesa_get_format_bits(texFormat, GL_TEXTURE_DEPTH_SIZE) ?
1067 _mesa_get_format_datatype(texFormat) : GL_NONE;
Brian Paulae1fdc12008-06-11 20:05:53 -06001068 }
1069 else {
Brian Paulf3224002011-01-25 18:42:53 -07001070 goto invalid_pname;
Brian Paulae1fdc12008-06-11 20:05:53 -06001071 }
1072 break;
1073
1074 default:
Brian Paulf3224002011-01-25 18:42:53 -07001075 goto invalid_pname;
Brian Paulae1fdc12008-06-11 20:05:53 -06001076 }
1077
Brian Paulf3224002011-01-25 18:42:53 -07001078 /* no error if we get here */
1079 return;
1080
1081invalid_pname:
1082 _mesa_error(ctx, GL_INVALID_ENUM,
1083 "glGetTexLevelParameter[if]v(pname=%s)",
1084 _mesa_lookup_enum_by_nr(pname));
Brian Paulae1fdc12008-06-11 20:05:53 -06001085}
1086
1087
1088
1089void GLAPIENTRY
1090_mesa_GetTexParameterfv( GLenum target, GLenum pname, GLfloat *params )
1091{
Brian Paulae1fdc12008-06-11 20:05:53 -06001092 struct gl_texture_object *obj;
1093 GLboolean error = GL_FALSE;
1094 GET_CURRENT_CONTEXT(ctx);
1095 ASSERT_OUTSIDE_BEGIN_END(ctx);
1096
Brian Paul32b99832010-01-04 19:20:33 -07001097 obj = get_texobj(ctx, target, GL_TRUE);
1098 if (!obj)
Brian Paulae1fdc12008-06-11 20:05:53 -06001099 return;
Brian Paulae1fdc12008-06-11 20:05:53 -06001100
1101 _mesa_lock_texture(ctx, obj);
1102 switch (pname) {
1103 case GL_TEXTURE_MAG_FILTER:
1104 *params = ENUM_TO_FLOAT(obj->MagFilter);
1105 break;
1106 case GL_TEXTURE_MIN_FILTER:
1107 *params = ENUM_TO_FLOAT(obj->MinFilter);
1108 break;
1109 case GL_TEXTURE_WRAP_S:
1110 *params = ENUM_TO_FLOAT(obj->WrapS);
1111 break;
1112 case GL_TEXTURE_WRAP_T:
1113 *params = ENUM_TO_FLOAT(obj->WrapT);
1114 break;
1115 case GL_TEXTURE_WRAP_R:
1116 *params = ENUM_TO_FLOAT(obj->WrapR);
1117 break;
1118 case GL_TEXTURE_BORDER_COLOR:
Marek Olšáke5c6a922011-02-15 23:30:23 +01001119 if(ctx->NewState & (_NEW_BUFFERS | _NEW_FRAG_CLAMP))
1120 _mesa_update_state_locked(ctx);
1121 if(ctx->Color._ClampFragmentColor)
1122 {
1123 params[0] = CLAMP(obj->BorderColor.f[0], 0.0F, 1.0F);
1124 params[1] = CLAMP(obj->BorderColor.f[1], 0.0F, 1.0F);
1125 params[2] = CLAMP(obj->BorderColor.f[2], 0.0F, 1.0F);
1126 params[3] = CLAMP(obj->BorderColor.f[3], 0.0F, 1.0F);
1127 }
1128 else
1129 {
1130 params[0] = obj->BorderColor.f[0];
1131 params[1] = obj->BorderColor.f[1];
1132 params[2] = obj->BorderColor.f[2];
1133 params[3] = obj->BorderColor.f[3];
1134 }
Brian Paulae1fdc12008-06-11 20:05:53 -06001135 break;
1136 case GL_TEXTURE_RESIDENT:
1137 {
1138 GLboolean resident;
1139 if (ctx->Driver.IsTextureResident)
1140 resident = ctx->Driver.IsTextureResident(ctx, obj);
1141 else
1142 resident = GL_TRUE;
1143 *params = ENUM_TO_FLOAT(resident);
1144 }
1145 break;
1146 case GL_TEXTURE_PRIORITY:
1147 *params = obj->Priority;
1148 break;
1149 case GL_TEXTURE_MIN_LOD:
1150 *params = obj->MinLod;
1151 break;
1152 case GL_TEXTURE_MAX_LOD:
1153 *params = obj->MaxLod;
1154 break;
1155 case GL_TEXTURE_BASE_LEVEL:
1156 *params = (GLfloat) obj->BaseLevel;
1157 break;
1158 case GL_TEXTURE_MAX_LEVEL:
1159 *params = (GLfloat) obj->MaxLevel;
1160 break;
1161 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
1162 if (ctx->Extensions.EXT_texture_filter_anisotropic) {
1163 *params = obj->MaxAnisotropy;
1164 }
1165 else
Brian Paul4a89e512009-01-28 10:27:33 -07001166 error = GL_TRUE;
Brian Paulae1fdc12008-06-11 20:05:53 -06001167 break;
Brian Paul26da28c2009-01-28 16:49:28 -07001168 case GL_TEXTURE_COMPARE_FAIL_VALUE_ARB:
1169 if (ctx->Extensions.ARB_shadow_ambient) {
1170 *params = obj->CompareFailValue;
Brian Paulae1fdc12008-06-11 20:05:53 -06001171 }
1172 else
Brian Paul4a89e512009-01-28 10:27:33 -07001173 error = GL_TRUE;
Brian Paulae1fdc12008-06-11 20:05:53 -06001174 break;
1175 case GL_GENERATE_MIPMAP_SGIS:
Ian Romanick7f11d472010-09-27 14:55:52 -07001176 *params = (GLfloat) obj->GenerateMipmap;
Brian Paulae1fdc12008-06-11 20:05:53 -06001177 break;
1178 case GL_TEXTURE_COMPARE_MODE_ARB:
1179 if (ctx->Extensions.ARB_shadow) {
1180 *params = (GLfloat) obj->CompareMode;
1181 }
1182 else
Brian Paul4a89e512009-01-28 10:27:33 -07001183 error = GL_TRUE;
Brian Paulae1fdc12008-06-11 20:05:53 -06001184 break;
1185 case GL_TEXTURE_COMPARE_FUNC_ARB:
1186 if (ctx->Extensions.ARB_shadow) {
1187 *params = (GLfloat) obj->CompareFunc;
1188 }
1189 else
Brian Paul4a89e512009-01-28 10:27:33 -07001190 error = GL_TRUE;
Brian Paulae1fdc12008-06-11 20:05:53 -06001191 break;
1192 case GL_DEPTH_TEXTURE_MODE_ARB:
1193 if (ctx->Extensions.ARB_depth_texture) {
1194 *params = (GLfloat) obj->DepthMode;
1195 }
1196 else
Brian Paul4a89e512009-01-28 10:27:33 -07001197 error = GL_TRUE;
Brian Paulae1fdc12008-06-11 20:05:53 -06001198 break;
1199 case GL_TEXTURE_LOD_BIAS:
1200 if (ctx->Extensions.EXT_texture_lod_bias) {
1201 *params = obj->LodBias;
1202 }
1203 else
Brian Paul4a89e512009-01-28 10:27:33 -07001204 error = GL_TRUE;
Brian Paulae1fdc12008-06-11 20:05:53 -06001205 break;
Chia-I Wu066477a2010-03-30 13:13:20 +08001206#if FEATURE_OES_draw_texture
Brian Paul1b7e9092008-08-12 17:41:57 -06001207 case GL_TEXTURE_CROP_RECT_OES:
1208 params[0] = obj->CropRect[0];
Brad Kingee80c642008-09-26 07:40:05 -06001209 params[1] = obj->CropRect[1];
1210 params[2] = obj->CropRect[2];
1211 params[3] = obj->CropRect[3];
Brian Paul1b7e9092008-08-12 17:41:57 -06001212 break;
1213#endif
Brian Paul4a89e512009-01-28 10:27:33 -07001214
1215 case GL_TEXTURE_SWIZZLE_R_EXT:
1216 case GL_TEXTURE_SWIZZLE_G_EXT:
1217 case GL_TEXTURE_SWIZZLE_B_EXT:
1218 case GL_TEXTURE_SWIZZLE_A_EXT:
1219 if (ctx->Extensions.EXT_texture_swizzle) {
1220 GLuint comp = pname - GL_TEXTURE_SWIZZLE_R_EXT;
1221 *params = (GLfloat) obj->Swizzle[comp];
1222 }
1223 else {
1224 error = GL_TRUE;
1225 }
1226 break;
1227
1228 case GL_TEXTURE_SWIZZLE_RGBA_EXT:
1229 if (ctx->Extensions.EXT_texture_swizzle) {
1230 GLuint comp;
1231 for (comp = 0; comp < 4; comp++) {
1232 params[comp] = (GLfloat) obj->Swizzle[comp];
1233 }
1234 }
1235 else {
1236 error = GL_TRUE;
1237 }
1238 break;
1239
Brian Paulae1fdc12008-06-11 20:05:53 -06001240 default:
Brian Paul4a89e512009-01-28 10:27:33 -07001241 error = GL_TRUE;
Brian Paulae1fdc12008-06-11 20:05:53 -06001242 break;
1243 }
Brian Paul4a89e512009-01-28 10:27:33 -07001244
Brian Paulae1fdc12008-06-11 20:05:53 -06001245 if (error)
1246 _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexParameterfv(pname=0x%x)",
1247 pname);
1248
1249 _mesa_unlock_texture(ctx, obj);
1250}
1251
1252
1253void GLAPIENTRY
1254_mesa_GetTexParameteriv( GLenum target, GLenum pname, GLint *params )
1255{
Brian Paulae1fdc12008-06-11 20:05:53 -06001256 struct gl_texture_object *obj;
Brian Paul4a89e512009-01-28 10:27:33 -07001257 GLboolean error = GL_FALSE;
Brian Paulae1fdc12008-06-11 20:05:53 -06001258 GET_CURRENT_CONTEXT(ctx);
1259 ASSERT_OUTSIDE_BEGIN_END(ctx);
1260
Brian Paul32b99832010-01-04 19:20:33 -07001261 obj = get_texobj(ctx, target, GL_TRUE);
1262 if (!obj)
1263 return;
Brian Paulae1fdc12008-06-11 20:05:53 -06001264
Brian Paul6d845802010-01-04 19:05:31 -07001265 _mesa_lock_texture(ctx, obj);
Brian Paulae1fdc12008-06-11 20:05:53 -06001266 switch (pname) {
1267 case GL_TEXTURE_MAG_FILTER:
1268 *params = (GLint) obj->MagFilter;
Brian Paul4a89e512009-01-28 10:27:33 -07001269 break;;
Brian Paulae1fdc12008-06-11 20:05:53 -06001270 case GL_TEXTURE_MIN_FILTER:
1271 *params = (GLint) obj->MinFilter;
Brian Paul4a89e512009-01-28 10:27:33 -07001272 break;;
Brian Paulae1fdc12008-06-11 20:05:53 -06001273 case GL_TEXTURE_WRAP_S:
1274 *params = (GLint) obj->WrapS;
Brian Paul4a89e512009-01-28 10:27:33 -07001275 break;;
Brian Paulae1fdc12008-06-11 20:05:53 -06001276 case GL_TEXTURE_WRAP_T:
1277 *params = (GLint) obj->WrapT;
Brian Paul4a89e512009-01-28 10:27:33 -07001278 break;;
Brian Paulae1fdc12008-06-11 20:05:53 -06001279 case GL_TEXTURE_WRAP_R:
1280 *params = (GLint) obj->WrapR;
Brian Paul4a89e512009-01-28 10:27:33 -07001281 break;;
Brian Paulae1fdc12008-06-11 20:05:53 -06001282 case GL_TEXTURE_BORDER_COLOR:
1283 {
1284 GLfloat b[4];
Brian Paulf6c2d1f2010-01-04 19:53:28 -07001285 b[0] = CLAMP(obj->BorderColor.f[0], 0.0F, 1.0F);
1286 b[1] = CLAMP(obj->BorderColor.f[1], 0.0F, 1.0F);
1287 b[2] = CLAMP(obj->BorderColor.f[2], 0.0F, 1.0F);
1288 b[3] = CLAMP(obj->BorderColor.f[3], 0.0F, 1.0F);
Brian Paulae1fdc12008-06-11 20:05:53 -06001289 params[0] = FLOAT_TO_INT(b[0]);
1290 params[1] = FLOAT_TO_INT(b[1]);
1291 params[2] = FLOAT_TO_INT(b[2]);
1292 params[3] = FLOAT_TO_INT(b[3]);
1293 }
Brian Paul4a89e512009-01-28 10:27:33 -07001294 break;;
Brian Paulae1fdc12008-06-11 20:05:53 -06001295 case GL_TEXTURE_RESIDENT:
1296 {
1297 GLboolean resident;
1298 if (ctx->Driver.IsTextureResident)
1299 resident = ctx->Driver.IsTextureResident(ctx, obj);
1300 else
1301 resident = GL_TRUE;
1302 *params = (GLint) resident;
1303 }
Brian Paul4a89e512009-01-28 10:27:33 -07001304 break;;
Brian Paulae1fdc12008-06-11 20:05:53 -06001305 case GL_TEXTURE_PRIORITY:
1306 *params = FLOAT_TO_INT(obj->Priority);
Brian Paul4a89e512009-01-28 10:27:33 -07001307 break;;
Brian Paulae1fdc12008-06-11 20:05:53 -06001308 case GL_TEXTURE_MIN_LOD:
1309 *params = (GLint) obj->MinLod;
Brian Paul4a89e512009-01-28 10:27:33 -07001310 break;;
Brian Paulae1fdc12008-06-11 20:05:53 -06001311 case GL_TEXTURE_MAX_LOD:
1312 *params = (GLint) obj->MaxLod;
Brian Paul4a89e512009-01-28 10:27:33 -07001313 break;;
Brian Paulae1fdc12008-06-11 20:05:53 -06001314 case GL_TEXTURE_BASE_LEVEL:
1315 *params = obj->BaseLevel;
Brian Paul4a89e512009-01-28 10:27:33 -07001316 break;;
Brian Paulae1fdc12008-06-11 20:05:53 -06001317 case GL_TEXTURE_MAX_LEVEL:
1318 *params = obj->MaxLevel;
Brian Paul4a89e512009-01-28 10:27:33 -07001319 break;;
Brian Paulae1fdc12008-06-11 20:05:53 -06001320 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
1321 if (ctx->Extensions.EXT_texture_filter_anisotropic) {
1322 *params = (GLint) obj->MaxAnisotropy;
Brian Paul4a89e512009-01-28 10:27:33 -07001323 }
1324 else {
1325 error = GL_TRUE;
Brian Paulae1fdc12008-06-11 20:05:53 -06001326 }
1327 break;
Brian Paul26da28c2009-01-28 16:49:28 -07001328 case GL_TEXTURE_COMPARE_FAIL_VALUE_ARB:
1329 if (ctx->Extensions.ARB_shadow_ambient) {
1330 *params = (GLint) FLOAT_TO_INT(obj->CompareFailValue);
Brian Paul4a89e512009-01-28 10:27:33 -07001331 }
1332 else {
1333 error = GL_TRUE;
Brian Paulae1fdc12008-06-11 20:05:53 -06001334 }
1335 break;
1336 case GL_GENERATE_MIPMAP_SGIS:
Ian Romanick7f11d472010-09-27 14:55:52 -07001337 *params = (GLint) obj->GenerateMipmap;
Brian Paulae1fdc12008-06-11 20:05:53 -06001338 break;
1339 case GL_TEXTURE_COMPARE_MODE_ARB:
1340 if (ctx->Extensions.ARB_shadow) {
1341 *params = (GLint) obj->CompareMode;
Brian Paul4a89e512009-01-28 10:27:33 -07001342 }
1343 else {
1344 error = GL_TRUE;
Brian Paulae1fdc12008-06-11 20:05:53 -06001345 }
1346 break;
1347 case GL_TEXTURE_COMPARE_FUNC_ARB:
1348 if (ctx->Extensions.ARB_shadow) {
1349 *params = (GLint) obj->CompareFunc;
Brian Paul4a89e512009-01-28 10:27:33 -07001350 }
1351 else {
1352 error = GL_TRUE;
Brian Paulae1fdc12008-06-11 20:05:53 -06001353 }
1354 break;
1355 case GL_DEPTH_TEXTURE_MODE_ARB:
1356 if (ctx->Extensions.ARB_depth_texture) {
1357 *params = (GLint) obj->DepthMode;
Brian Paul4a89e512009-01-28 10:27:33 -07001358 }
1359 else {
1360 error = GL_TRUE;
Brian Paulae1fdc12008-06-11 20:05:53 -06001361 }
1362 break;
1363 case GL_TEXTURE_LOD_BIAS:
1364 if (ctx->Extensions.EXT_texture_lod_bias) {
1365 *params = (GLint) obj->LodBias;
Brian Paul4a89e512009-01-28 10:27:33 -07001366 }
1367 else {
1368 error = GL_TRUE;
Brian Paulae1fdc12008-06-11 20:05:53 -06001369 }
1370 break;
Chia-I Wu066477a2010-03-30 13:13:20 +08001371#if FEATURE_OES_draw_texture
Brian Paul1b7e9092008-08-12 17:41:57 -06001372 case GL_TEXTURE_CROP_RECT_OES:
1373 params[0] = obj->CropRect[0];
Brad Kingee80c642008-09-26 07:40:05 -06001374 params[1] = obj->CropRect[1];
1375 params[2] = obj->CropRect[2];
1376 params[3] = obj->CropRect[3];
Brian Paul1b7e9092008-08-12 17:41:57 -06001377 break;
1378#endif
Brian Paul4a89e512009-01-28 10:27:33 -07001379 case GL_TEXTURE_SWIZZLE_R_EXT:
1380 case GL_TEXTURE_SWIZZLE_G_EXT:
1381 case GL_TEXTURE_SWIZZLE_B_EXT:
1382 case GL_TEXTURE_SWIZZLE_A_EXT:
1383 if (ctx->Extensions.EXT_texture_swizzle) {
1384 GLuint comp = pname - GL_TEXTURE_SWIZZLE_R_EXT;
1385 *params = obj->Swizzle[comp];
1386 }
1387 else {
1388 error = GL_TRUE;
1389 }
1390 break;
1391
1392 case GL_TEXTURE_SWIZZLE_RGBA_EXT:
1393 if (ctx->Extensions.EXT_texture_swizzle) {
1394 COPY_4V(params, obj->Swizzle);
1395 }
1396 else {
1397 error = GL_TRUE;
1398 }
1399 break;
1400
Brian Paulae1fdc12008-06-11 20:05:53 -06001401 default:
1402 ; /* silence warnings */
1403 }
Brian Paul4a89e512009-01-28 10:27:33 -07001404
1405 if (error)
1406 _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexParameteriv(pname=0x%x)",
1407 pname);
1408
1409 _mesa_unlock_texture(ctx, obj);
Brian Paulae1fdc12008-06-11 20:05:53 -06001410}
Brian Paul7836a962010-01-04 20:00:00 -07001411
1412
1413/** New in GL 3.0 */
1414void GLAPIENTRY
1415_mesa_GetTexParameterIiv(GLenum target, GLenum pname, GLint *params)
1416{
1417 struct gl_texture_object *texObj;
1418 GET_CURRENT_CONTEXT(ctx);
1419 ASSERT_OUTSIDE_BEGIN_END(ctx);
1420
1421 texObj = get_texobj(ctx, target, GL_TRUE);
1422
1423 switch (pname) {
1424 case GL_TEXTURE_BORDER_COLOR:
1425 COPY_4V(params, texObj->BorderColor.i);
1426 break;
1427 default:
1428 _mesa_GetTexParameteriv(target, pname, params);
1429 }
1430}
1431
1432
1433/** New in GL 3.0 */
1434void GLAPIENTRY
1435_mesa_GetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params)
1436{
1437 struct gl_texture_object *texObj;
1438 GET_CURRENT_CONTEXT(ctx);
1439 ASSERT_OUTSIDE_BEGIN_END(ctx);
1440
1441 texObj = get_texobj(ctx, target, GL_TRUE);
1442
1443 switch (pname) {
1444 case GL_TEXTURE_BORDER_COLOR:
1445 COPY_4V(params, texObj->BorderColor.i);
1446 break;
1447 default:
1448 {
1449 GLint ip[4];
1450 _mesa_GetTexParameteriv(target, pname, ip);
1451 params[0] = ip[0];
1452 if (pname == GL_TEXTURE_SWIZZLE_RGBA_EXT ||
1453 pname == GL_TEXTURE_CROP_RECT_OES) {
1454 params[1] = ip[1];
1455 params[2] = ip[2];
1456 params[3] = ip[3];
1457 }
1458 }
1459 }
1460}