Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygentexparam.c
Go to the documentation of this file.
00001 /* 00002 * Mesa 3-D graphics library 00003 * Version: 7.5 00004 * 00005 * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. 00006 * Copyright (C) 2009 VMware, Inc. All Rights Reserved. 00007 * 00008 * Permission is hereby granted, free of charge, to any person obtaining a 00009 * copy of this software and associated documentation files (the "Software"), 00010 * to deal in the Software without restriction, including without limitation 00011 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 00012 * and/or sell copies of the Software, and to permit persons to whom the 00013 * Software is furnished to do so, subject to the following conditions: 00014 * 00015 * The above copyright notice and this permission notice shall be included 00016 * in all copies or substantial portions of the Software. 00017 * 00018 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 00019 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 00020 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 00021 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 00022 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 00023 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 00024 */ 00025 00033 #include "main/glheader.h" 00034 #include "main/context.h" 00035 #include "main/enums.h" 00036 #include "main/colormac.h" 00037 #include "main/macros.h" 00038 #include "main/texcompress.h" 00039 #include "main/texparam.h" 00040 #include "main/teximage.h" 00041 00042 00047 static GLboolean 00048 validate_texture_wrap_mode(GLcontext * ctx, GLenum target, GLenum wrap) 00049 { 00050 const struct gl_extensions * const e = & ctx->Extensions; 00051 00052 if (wrap == GL_CLAMP || wrap == GL_CLAMP_TO_EDGE || 00053 (wrap == GL_CLAMP_TO_BORDER && e->ARB_texture_border_clamp)) { 00054 /* any texture target */ 00055 return GL_TRUE; 00056 } 00057 else if (target != GL_TEXTURE_RECTANGLE_NV && 00058 (wrap == GL_REPEAT || 00059 (wrap == GL_MIRRORED_REPEAT && 00060 e->ARB_texture_mirrored_repeat) || 00061 (wrap == GL_MIRROR_CLAMP_EXT && 00062 (e->ATI_texture_mirror_once || e->EXT_texture_mirror_clamp)) || 00063 (wrap == GL_MIRROR_CLAMP_TO_EDGE_EXT && 00064 (e->ATI_texture_mirror_once || e->EXT_texture_mirror_clamp)) || 00065 (wrap == GL_MIRROR_CLAMP_TO_BORDER_EXT && 00066 (e->EXT_texture_mirror_clamp)))) { 00067 /* non-rectangle texture */ 00068 return GL_TRUE; 00069 } 00070 00071 _mesa_error( ctx, GL_INVALID_VALUE, "glTexParameter(param)" ); 00072 return GL_FALSE; 00073 } 00074 00075 00080 static struct gl_texture_object * 00081 get_texobj(GLcontext *ctx, GLenum target) 00082 { 00083 struct gl_texture_unit *texUnit; 00084 00085 if (ctx->Texture.CurrentUnit >= ctx->Const.MaxTextureImageUnits) { 00086 _mesa_error(ctx, GL_INVALID_OPERATION, "glTexParameter(current unit)"); 00087 return NULL; 00088 } 00089 00090 texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 00091 00092 switch (target) { 00093 case GL_TEXTURE_1D: 00094 return texUnit->CurrentTex[TEXTURE_1D_INDEX]; 00095 case GL_TEXTURE_2D: 00096 return texUnit->CurrentTex[TEXTURE_2D_INDEX]; 00097 case GL_TEXTURE_3D: 00098 return texUnit->CurrentTex[TEXTURE_3D_INDEX]; 00099 case GL_TEXTURE_CUBE_MAP: 00100 if (ctx->Extensions.ARB_texture_cube_map) { 00101 return texUnit->CurrentTex[TEXTURE_CUBE_INDEX]; 00102 } 00103 break; 00104 case GL_TEXTURE_RECTANGLE_NV: 00105 if (ctx->Extensions.NV_texture_rectangle) { 00106 return texUnit->CurrentTex[TEXTURE_RECT_INDEX]; 00107 } 00108 break; 00109 case GL_TEXTURE_1D_ARRAY_EXT: 00110 if (ctx->Extensions.MESA_texture_array) { 00111 return texUnit->CurrentTex[TEXTURE_1D_ARRAY_INDEX]; 00112 } 00113 break; 00114 case GL_TEXTURE_2D_ARRAY_EXT: 00115 if (ctx->Extensions.MESA_texture_array) { 00116 return texUnit->CurrentTex[TEXTURE_2D_ARRAY_INDEX]; 00117 } 00118 break; 00119 default: 00120 ; 00121 } 00122 00123 _mesa_error(ctx, GL_INVALID_ENUM, "glTexParameter(target)"); 00124 return NULL; 00125 } 00126 00127 00134 static INLINE void 00135 flush(GLcontext *ctx, struct gl_texture_object *texObj) 00136 { 00137 FLUSH_VERTICES(ctx, _NEW_TEXTURE); 00138 texObj->_Complete = GL_FALSE; 00139 } 00140 00141 00143 static void 00144 set_tex_parameteri(GLcontext *ctx, 00145 struct gl_texture_object *texObj, 00146 GLenum pname, const GLint *params) 00147 { 00148 switch (pname) { 00149 case GL_TEXTURE_MIN_FILTER: 00150 if (texObj->MinFilter == params[0]) 00151 return; 00152 switch (params[0]) { 00153 case GL_NEAREST: 00154 case GL_LINEAR: 00155 flush(ctx, texObj); 00156 texObj->MinFilter = params[0]; 00157 return; 00158 case GL_NEAREST_MIPMAP_NEAREST: 00159 case GL_LINEAR_MIPMAP_NEAREST: 00160 case GL_NEAREST_MIPMAP_LINEAR: 00161 case GL_LINEAR_MIPMAP_LINEAR: 00162 if (texObj->Target != GL_TEXTURE_RECTANGLE_NV) { 00163 flush(ctx, texObj); 00164 texObj->MinFilter = params[0]; 00165 return; 00166 } 00167 /* fall-through */ 00168 default: 00169 _mesa_error( ctx, GL_INVALID_VALUE, "glTexParameter(param)" ); 00170 } 00171 return; 00172 00173 case GL_TEXTURE_MAG_FILTER: 00174 if (texObj->MagFilter == params[0]) 00175 return; 00176 switch (params[0]) { 00177 case GL_NEAREST: 00178 case GL_LINEAR: 00179 flush(ctx, texObj); 00180 texObj->MagFilter = params[0]; 00181 return; 00182 default: 00183 _mesa_error( ctx, GL_INVALID_VALUE, "glTexParameter(param)" ); 00184 } 00185 return; 00186 00187 case GL_TEXTURE_WRAP_S: 00188 if (texObj->WrapS == params[0]) 00189 return; 00190 if (validate_texture_wrap_mode(ctx, texObj->Target, params[0])) { 00191 flush(ctx, texObj); 00192 texObj->WrapS = params[0]; 00193 } 00194 return; 00195 00196 case GL_TEXTURE_WRAP_T: 00197 if (texObj->WrapT == params[0]) 00198 return; 00199 if (validate_texture_wrap_mode(ctx, texObj->Target, params[0])) { 00200 flush(ctx, texObj); 00201 texObj->WrapT = params[0]; 00202 } 00203 return; 00204 00205 case GL_TEXTURE_WRAP_R: 00206 if (texObj->WrapR == params[0]) 00207 return; 00208 if (validate_texture_wrap_mode(ctx, texObj->Target, params[0])) { 00209 flush(ctx, texObj); 00210 texObj->WrapR = params[0]; 00211 } 00212 return; 00213 00214 case GL_TEXTURE_BASE_LEVEL: 00215 if (texObj->BaseLevel == params[0]) 00216 return; 00217 if (params[0] < 0 || 00218 (texObj->Target == GL_TEXTURE_RECTANGLE_ARB && params[0] != 0)) { 00219 _mesa_error(ctx, GL_INVALID_VALUE, "glTexParameter(param)"); 00220 return; 00221 } 00222 flush(ctx, texObj); 00223 texObj->BaseLevel = params[0]; 00224 return; 00225 00226 case GL_TEXTURE_MAX_LEVEL: 00227 if (texObj->MaxLevel == params[0]) 00228 return; 00229 if (params[0] < 0 || texObj->Target == GL_TEXTURE_RECTANGLE_ARB) { 00230 _mesa_error(ctx, GL_INVALID_OPERATION, "glTexParameter(param)"); 00231 return; 00232 } 00233 flush(ctx, texObj); 00234 texObj->MaxLevel = params[0]; 00235 return; 00236 00237 case GL_TEXTURE_COMPARE_SGIX: 00238 if (ctx->Extensions.SGIX_shadow) { 00239 FLUSH_VERTICES(ctx, _NEW_TEXTURE); 00240 texObj->CompareFlag = params[0] ? GL_TRUE : GL_FALSE; 00241 } 00242 else { 00243 _mesa_error(ctx, GL_INVALID_ENUM, 00244 "glTexParameter(pname=GL_TEXTURE_COMPARE_SGIX)"); 00245 } 00246 return; 00247 00248 case GL_TEXTURE_COMPARE_OPERATOR_SGIX: 00249 if (ctx->Extensions.SGIX_shadow && 00250 (params[0] == GL_TEXTURE_LEQUAL_R_SGIX || 00251 params[0] == GL_TEXTURE_GEQUAL_R_SGIX)) { 00252 FLUSH_VERTICES(ctx, _NEW_TEXTURE); 00253 texObj->CompareOperator = params[0]; 00254 } 00255 else { 00256 _mesa_error(ctx, GL_INVALID_ENUM, 00257 "glTexParameter(GL_TEXTURE_COMPARE_OPERATOR_SGIX)"); 00258 } 00259 return; 00260 00261 case GL_GENERATE_MIPMAP_SGIS: 00262 if (ctx->Extensions.SGIS_generate_mipmap) { 00263 if (texObj->GenerateMipmap != params[0]) { 00264 flush(ctx, texObj); 00265 texObj->GenerateMipmap = params[0] ? GL_TRUE : GL_FALSE; 00266 } 00267 } 00268 else { 00269 _mesa_error(ctx, GL_INVALID_ENUM, 00270 "glTexParameter(pname=GL_GENERATE_MIPMAP_SGIS)"); 00271 } 00272 return; 00273 00274 case GL_TEXTURE_COMPARE_MODE_ARB: 00275 if (ctx->Extensions.ARB_shadow && 00276 (params[0] == GL_NONE || 00277 params[0] == GL_COMPARE_R_TO_TEXTURE_ARB)) { 00278 if (texObj->CompareMode != params[0]) { 00279 flush(ctx, texObj); 00280 texObj->CompareMode = params[0]; 00281 } 00282 } 00283 else { 00284 _mesa_error(ctx, GL_INVALID_ENUM, 00285 "glTexParameter(GL_TEXTURE_COMPARE_MODE_ARB)"); 00286 } 00287 return; 00288 00289 case GL_TEXTURE_COMPARE_FUNC_ARB: 00290 if (ctx->Extensions.ARB_shadow) { 00291 if (texObj->CompareFunc == params[0]) 00292 return; 00293 switch (params[0]) { 00294 case GL_LEQUAL: 00295 case GL_GEQUAL: 00296 flush(ctx, texObj); 00297 texObj->CompareFunc = params[0]; 00298 return; 00299 case GL_EQUAL: 00300 case GL_NOTEQUAL: 00301 case GL_LESS: 00302 case GL_GREATER: 00303 case GL_ALWAYS: 00304 case GL_NEVER: 00305 if (ctx->Extensions.EXT_shadow_funcs) { 00306 flush(ctx, texObj); 00307 texObj->CompareFunc = params[0]; 00308 return; 00309 } 00310 /* fall-through */ 00311 default: 00312 _mesa_error(ctx, GL_INVALID_ENUM, 00313 "glTexParameter(GL_TEXTURE_COMPARE_FUNC_ARB)"); 00314 } 00315 } 00316 else { 00317 _mesa_error(ctx, GL_INVALID_ENUM, "glTexParameter(param)"); 00318 } 00319 return; 00320 00321 case GL_DEPTH_TEXTURE_MODE_ARB: 00322 if (ctx->Extensions.ARB_depth_texture && 00323 (params[0] == GL_LUMINANCE || 00324 params[0] == GL_INTENSITY || 00325 params[0] == GL_ALPHA)) { 00326 if (texObj->DepthMode != params[0]) { 00327 flush(ctx, texObj); 00328 texObj->DepthMode = params[0]; 00329 } 00330 } 00331 else { 00332 _mesa_error(ctx, GL_INVALID_ENUM, 00333 "glTexParameter(GL_DEPTH_TEXTURE_MODE_ARB)"); 00334 } 00335 return; 00336 00337 #ifdef FEATURE_OES_draw_texture 00338 case GL_TEXTURE_CROP_RECT_OES: 00339 texObj->CropRect[0] = params[0]; 00340 texObj->CropRect[1] = params[1]; 00341 texObj->CropRect[2] = params[2]; 00342 texObj->CropRect[3] = params[3]; 00343 break; 00344 #endif 00345 00346 default: 00347 _mesa_error(ctx, GL_INVALID_ENUM, "glTexParameter(pname=0x%x)", pname); 00348 } 00349 } 00350 00351 00353 static void 00354 set_tex_parameterf(GLcontext *ctx, 00355 struct gl_texture_object *texObj, 00356 GLenum pname, const GLfloat *params) 00357 { 00358 switch (pname) { 00359 case GL_TEXTURE_MIN_LOD: 00360 if (texObj->MinLod == params[0]) 00361 return; 00362 flush(ctx, texObj); 00363 texObj->MinLod = params[0]; 00364 return; 00365 00366 case GL_TEXTURE_MAX_LOD: 00367 if (texObj->MaxLod == params[0]) 00368 return; 00369 flush(ctx, texObj); 00370 texObj->MaxLod = params[0]; 00371 return; 00372 00373 case GL_TEXTURE_PRIORITY: 00374 flush(ctx, texObj); 00375 texObj->Priority = CLAMP(params[0], 0.0F, 1.0F); 00376 return; 00377 00378 case GL_TEXTURE_MAX_ANISOTROPY_EXT: 00379 if (ctx->Extensions.EXT_texture_filter_anisotropic) { 00380 if (texObj->MaxAnisotropy == params[0]) 00381 return; 00382 if (params[0] < 1.0) { 00383 _mesa_error(ctx, GL_INVALID_VALUE, "glTexParameter(param)" ); 00384 return; 00385 } 00386 flush(ctx, texObj); 00387 /* clamp to max, that's what NVIDIA does */ 00388 texObj->MaxAnisotropy = MIN2(params[0], 00389 ctx->Const.MaxTextureMaxAnisotropy); 00390 } 00391 else { 00392 _mesa_error(ctx, GL_INVALID_ENUM, 00393 "glTexParameter(pname=GL_TEXTURE_MAX_ANISOTROPY_EXT)"); 00394 } 00395 return; 00396 00397 case GL_TEXTURE_COMPARE_FAIL_VALUE_ARB: 00398 if (ctx->Extensions.SGIX_shadow_ambient) { 00399 if (texObj->ShadowAmbient != params[0]) { 00400 flush(ctx, texObj); 00401 texObj->ShadowAmbient = CLAMP(params[0], 0.0F, 1.0F); 00402 } 00403 } 00404 else { 00405 _mesa_error(ctx, GL_INVALID_ENUM, 00406 "glTexParameter(pname=GL_SHADOW_AMBIENT_SGIX)"); 00407 } 00408 return; 00409 00410 case GL_TEXTURE_LOD_BIAS: 00411 /* NOTE: this is really part of OpenGL 1.4, not EXT_texture_lod_bias */ 00412 if (ctx->Extensions.EXT_texture_lod_bias) { 00413 if (texObj->LodBias != params[0]) { 00414 flush(ctx, texObj); 00415 texObj->LodBias = params[0]; 00416 } 00417 } 00418 break; 00419 00420 case GL_TEXTURE_BORDER_COLOR: 00421 flush(ctx, texObj); 00422 texObj->BorderColor[RCOMP] = params[0]; 00423 texObj->BorderColor[GCOMP] = params[1]; 00424 texObj->BorderColor[BCOMP] = params[2]; 00425 texObj->BorderColor[ACOMP] = params[3]; 00426 UNCLAMPED_FLOAT_TO_CHAN(texObj->_BorderChan[RCOMP], params[0]); 00427 UNCLAMPED_FLOAT_TO_CHAN(texObj->_BorderChan[GCOMP], params[1]); 00428 UNCLAMPED_FLOAT_TO_CHAN(texObj->_BorderChan[BCOMP], params[2]); 00429 UNCLAMPED_FLOAT_TO_CHAN(texObj->_BorderChan[ACOMP], params[3]); 00430 return; 00431 00432 default: 00433 _mesa_error(ctx, GL_INVALID_ENUM, "glTexParameter(pname=0x%x)", pname); 00434 } 00435 } 00436 00437 00438 void GLAPIENTRY 00439 _mesa_TexParameterf(GLenum target, GLenum pname, GLfloat param) 00440 { 00441 struct gl_texture_object *texObj; 00442 GET_CURRENT_CONTEXT(ctx); 00443 ASSERT_OUTSIDE_BEGIN_END(ctx); 00444 00445 texObj = get_texobj(ctx, target); 00446 if (!texObj) 00447 return; 00448 00449 switch (pname) { 00450 case GL_TEXTURE_MIN_FILTER: 00451 case GL_TEXTURE_MAG_FILTER: 00452 case GL_TEXTURE_WRAP_S: 00453 case GL_TEXTURE_WRAP_T: 00454 case GL_TEXTURE_WRAP_R: 00455 case GL_TEXTURE_BASE_LEVEL: 00456 case GL_TEXTURE_MAX_LEVEL: 00457 case GL_TEXTURE_COMPARE_SGIX: 00458 case GL_TEXTURE_COMPARE_OPERATOR_SGIX: 00459 case GL_GENERATE_MIPMAP_SGIS: 00460 case GL_TEXTURE_COMPARE_MODE_ARB: 00461 case GL_TEXTURE_COMPARE_FUNC_ARB: 00462 case GL_DEPTH_TEXTURE_MODE_ARB: 00463 { 00464 /* convert float param to int */ 00465 GLint p = (GLint) param; 00466 set_tex_parameteri(ctx, texObj, pname, &p); 00467 } 00468 return; 00469 default: 00470 /* this will generate an error if pname is illegal */ 00471 set_tex_parameterf(ctx, texObj, pname, ¶m); 00472 } 00473 00474 if (ctx->Driver.TexParameter && ctx->ErrorValue == GL_NO_ERROR) { 00475 ctx->Driver.TexParameter(ctx, target, texObj, pname, ¶m); 00476 } 00477 } 00478 00479 00480 void GLAPIENTRY 00481 _mesa_TexParameterfv(GLenum target, GLenum pname, const GLfloat *params) 00482 { 00483 struct gl_texture_object *texObj; 00484 GET_CURRENT_CONTEXT(ctx); 00485 ASSERT_OUTSIDE_BEGIN_END(ctx); 00486 00487 texObj = get_texobj(ctx, target); 00488 if (!texObj) 00489 return; 00490 00491 switch (pname) { 00492 case GL_TEXTURE_MIN_FILTER: 00493 case GL_TEXTURE_MAG_FILTER: 00494 case GL_TEXTURE_WRAP_S: 00495 case GL_TEXTURE_WRAP_T: 00496 case GL_TEXTURE_WRAP_R: 00497 case GL_TEXTURE_BASE_LEVEL: 00498 case GL_TEXTURE_MAX_LEVEL: 00499 case GL_TEXTURE_COMPARE_SGIX: 00500 case GL_TEXTURE_COMPARE_OPERATOR_SGIX: 00501 case GL_GENERATE_MIPMAP_SGIS: 00502 case GL_TEXTURE_COMPARE_MODE_ARB: 00503 case GL_TEXTURE_COMPARE_FUNC_ARB: 00504 case GL_DEPTH_TEXTURE_MODE_ARB: 00505 { 00506 /* convert float param to int */ 00507 GLint p = (GLint) params[0]; 00508 set_tex_parameteri(ctx, texObj, pname, &p); 00509 } 00510 break; 00511 00512 #ifdef FEATURE_OES_draw_texture 00513 case GL_TEXTURE_CROP_RECT_OES: 00514 { 00515 /* convert float params to int */ 00516 GLint iparams[4]; 00517 iparams[0] = (GLint) params[0]; 00518 iparams[1] = (GLint) params[1]; 00519 iparams[2] = (GLint) params[2]; 00520 iparams[3] = (GLint) params[3]; 00521 set_tex_parameteri(ctx, target, iparams); 00522 } 00523 break; 00524 #endif 00525 00526 default: 00527 /* this will generate an error if pname is illegal */ 00528 set_tex_parameterf(ctx, texObj, pname, params); 00529 } 00530 00531 if (ctx->Driver.TexParameter && ctx->ErrorValue == GL_NO_ERROR) { 00532 ctx->Driver.TexParameter(ctx, target, texObj, pname, params); 00533 } 00534 } 00535 00536 00537 void GLAPIENTRY 00538 _mesa_TexParameteri(GLenum target, GLenum pname, GLint param) 00539 { 00540 struct gl_texture_object *texObj; 00541 GET_CURRENT_CONTEXT(ctx); 00542 ASSERT_OUTSIDE_BEGIN_END(ctx); 00543 00544 texObj = get_texobj(ctx, target); 00545 if (!texObj) 00546 return; 00547 00548 switch (pname) { 00549 case GL_TEXTURE_MIN_LOD: 00550 case GL_TEXTURE_MAX_LOD: 00551 case GL_TEXTURE_PRIORITY: 00552 case GL_TEXTURE_MAX_ANISOTROPY_EXT: 00553 case GL_TEXTURE_LOD_BIAS: 00554 case GL_SHADOW_AMBIENT_SGIX: /* aka GL_TEXTURE_COMPARE_FAIL_VALUE_ARB */ 00555 { 00556 GLfloat fparam = (GLfloat) param; 00557 /* convert int param to float */ 00558 set_tex_parameterf(ctx, texObj, pname, &fparam); 00559 } 00560 break; 00561 default: 00562 /* this will generate an error if pname is illegal */ 00563 set_tex_parameteri(ctx, texObj, pname, ¶m); 00564 } 00565 00566 if (ctx->Driver.TexParameter && ctx->ErrorValue == GL_NO_ERROR) { 00567 GLfloat fparam = (GLfloat) param; 00568 ctx->Driver.TexParameter(ctx, target, texObj, pname, &fparam); 00569 } 00570 } 00571 00572 00573 void GLAPIENTRY 00574 _mesa_TexParameteriv(GLenum target, GLenum pname, const GLint *params) 00575 { 00576 struct gl_texture_object *texObj; 00577 GET_CURRENT_CONTEXT(ctx); 00578 ASSERT_OUTSIDE_BEGIN_END(ctx); 00579 00580 texObj = get_texobj(ctx, target); 00581 if (!texObj) 00582 return; 00583 00584 switch (pname) { 00585 case GL_TEXTURE_BORDER_COLOR: 00586 { 00587 /* convert int params to float */ 00588 GLfloat fparams[4]; 00589 fparams[0] = INT_TO_FLOAT(params[0]); 00590 fparams[1] = INT_TO_FLOAT(params[1]); 00591 fparams[2] = INT_TO_FLOAT(params[2]); 00592 fparams[3] = INT_TO_FLOAT(params[3]); 00593 set_tex_parameterf(ctx, texObj, pname, fparams); 00594 } 00595 break; 00596 case GL_TEXTURE_MIN_LOD: 00597 case GL_TEXTURE_MAX_LOD: 00598 case GL_TEXTURE_PRIORITY: 00599 case GL_TEXTURE_MAX_ANISOTROPY_EXT: 00600 case GL_TEXTURE_LOD_BIAS: 00601 case GL_SHADOW_AMBIENT_SGIX: /* aka GL_TEXTURE_COMPARE_FAIL_VALUE_ARB */ 00602 { 00603 /* convert int param to float */ 00604 GLfloat fparam = (GLfloat) params[0]; 00605 set_tex_parameterf(ctx, texObj, pname, &fparam); 00606 } 00607 break; 00608 default: 00609 /* this will generate an error if pname is illegal */ 00610 set_tex_parameteri(ctx, texObj, pname, params); 00611 } 00612 00613 if (ctx->Driver.TexParameter && ctx->ErrorValue == GL_NO_ERROR) { 00614 GLfloat fparams[4]; 00615 fparams[0] = INT_TO_FLOAT(params[0]); 00616 if (pname == GL_TEXTURE_BORDER_COLOR || 00617 pname == GL_TEXTURE_CROP_RECT_OES) { 00618 fparams[1] = INT_TO_FLOAT(params[1]); 00619 fparams[2] = INT_TO_FLOAT(params[2]); 00620 fparams[3] = INT_TO_FLOAT(params[3]); 00621 } 00622 ctx->Driver.TexParameter(ctx, target, texObj, pname, fparams); 00623 } 00624 } 00625 00626 00627 void GLAPIENTRY 00628 _mesa_GetTexLevelParameterfv( GLenum target, GLint level, 00629 GLenum pname, GLfloat *params ) 00630 { 00631 GLint iparam; 00632 _mesa_GetTexLevelParameteriv( target, level, pname, &iparam ); 00633 *params = (GLfloat) iparam; 00634 } 00635 00636 00637 static GLuint 00638 tex_image_dimensions(GLcontext *ctx, GLenum target) 00639 { 00640 switch (target) { 00641 case GL_TEXTURE_1D: 00642 case GL_PROXY_TEXTURE_1D: 00643 return 1; 00644 case GL_TEXTURE_2D: 00645 case GL_PROXY_TEXTURE_2D: 00646 return 2; 00647 case GL_TEXTURE_3D: 00648 case GL_PROXY_TEXTURE_3D: 00649 return 3; 00650 case GL_TEXTURE_CUBE_MAP: 00651 case GL_PROXY_TEXTURE_CUBE_MAP: 00652 case GL_TEXTURE_CUBE_MAP_POSITIVE_X: 00653 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: 00654 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: 00655 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: 00656 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: 00657 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: 00658 return ctx->Extensions.ARB_texture_cube_map ? 2 : 0; 00659 case GL_TEXTURE_RECTANGLE_NV: 00660 case GL_PROXY_TEXTURE_RECTANGLE_NV: 00661 return ctx->Extensions.NV_texture_rectangle ? 2 : 0; 00662 case GL_TEXTURE_1D_ARRAY_EXT: 00663 case GL_PROXY_TEXTURE_1D_ARRAY_EXT: 00664 return ctx->Extensions.MESA_texture_array ? 2 : 0; 00665 case GL_TEXTURE_2D_ARRAY_EXT: 00666 case GL_PROXY_TEXTURE_2D_ARRAY_EXT: 00667 return ctx->Extensions.MESA_texture_array ? 3 : 0; 00668 default: 00669 _mesa_problem(ctx, "bad target in _mesa_tex_target_dimensions()"); 00670 return 0; 00671 } 00672 } 00673 00674 00675 void GLAPIENTRY 00676 _mesa_GetTexLevelParameteriv( GLenum target, GLint level, 00677 GLenum pname, GLint *params ) 00678 { 00679 const struct gl_texture_unit *texUnit; 00680 struct gl_texture_object *texObj; 00681 const struct gl_texture_image *img = NULL; 00682 GLuint dimensions; 00683 GLboolean isProxy; 00684 GLint maxLevels; 00685 GET_CURRENT_CONTEXT(ctx); 00686 ASSERT_OUTSIDE_BEGIN_END(ctx); 00687 00688 if (ctx->Texture.CurrentUnit >= ctx->Const.MaxTextureImageUnits) { 00689 _mesa_error(ctx, GL_INVALID_OPERATION, 00690 "glGetTexLevelParameteriv(current unit)"); 00691 return; 00692 } 00693 00694 texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 00695 00696 /* this will catch bad target values */ 00697 dimensions = tex_image_dimensions(ctx, target); /* 1, 2 or 3 */ 00698 if (dimensions == 0) { 00699 _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexLevelParameter[if]v(target)"); 00700 return; 00701 } 00702 00703 maxLevels = _mesa_max_texture_levels(ctx, target); 00704 if (maxLevels == 0) { 00705 /* should not happen since <target> was just checked above */ 00706 _mesa_problem(ctx, "maxLevels=0 in _mesa_GetTexLevelParameter"); 00707 return; 00708 } 00709 00710 if (level < 0 || level >= maxLevels) { 00711 _mesa_error( ctx, GL_INVALID_VALUE, "glGetTexLevelParameter[if]v" ); 00712 return; 00713 } 00714 00715 texObj = _mesa_select_tex_object(ctx, texUnit, target); 00716 _mesa_lock_texture(ctx, texObj); 00717 00718 img = _mesa_select_tex_image(ctx, texObj, target, level); 00719 if (!img || !img->TexFormat) { 00720 /* undefined texture image */ 00721 if (pname == GL_TEXTURE_COMPONENTS) 00722 *params = 1; 00723 else 00724 *params = 0; 00725 goto out; 00726 } 00727 00728 isProxy = _mesa_is_proxy_texture(target); 00729 00730 switch (pname) { 00731 case GL_TEXTURE_WIDTH: 00732 *params = img->Width; 00733 break; 00734 case GL_TEXTURE_HEIGHT: 00735 *params = img->Height; 00736 break; 00737 case GL_TEXTURE_DEPTH: 00738 *params = img->Depth; 00739 break; 00740 case GL_TEXTURE_INTERNAL_FORMAT: 00741 *params = img->InternalFormat; 00742 break; 00743 case GL_TEXTURE_BORDER: 00744 *params = img->Border; 00745 break; 00746 case GL_TEXTURE_RED_SIZE: 00747 if (img->_BaseFormat == GL_RGB || img->_BaseFormat == GL_RGBA) 00748 *params = img->TexFormat->RedBits; 00749 else 00750 *params = 0; 00751 break; 00752 case GL_TEXTURE_GREEN_SIZE: 00753 if (img->_BaseFormat == GL_RGB || img->_BaseFormat == GL_RGBA) 00754 *params = img->TexFormat->GreenBits; 00755 else 00756 *params = 0; 00757 break; 00758 case GL_TEXTURE_BLUE_SIZE: 00759 if (img->_BaseFormat == GL_RGB || img->_BaseFormat == GL_RGBA) 00760 *params = img->TexFormat->BlueBits; 00761 else 00762 *params = 0; 00763 break; 00764 case GL_TEXTURE_ALPHA_SIZE: 00765 if (img->_BaseFormat == GL_ALPHA || 00766 img->_BaseFormat == GL_LUMINANCE_ALPHA || 00767 img->_BaseFormat == GL_RGBA) 00768 *params = img->TexFormat->AlphaBits; 00769 else 00770 *params = 0; 00771 break; 00772 case GL_TEXTURE_INTENSITY_SIZE: 00773 if (img->_BaseFormat != GL_INTENSITY) 00774 *params = 0; 00775 else if (img->TexFormat->IntensityBits > 0) 00776 *params = img->TexFormat->IntensityBits; 00777 else /* intensity probably stored as rgb texture */ 00778 *params = MIN2(img->TexFormat->RedBits, img->TexFormat->GreenBits); 00779 break; 00780 case GL_TEXTURE_LUMINANCE_SIZE: 00781 if (img->_BaseFormat != GL_LUMINANCE && 00782 img->_BaseFormat != GL_LUMINANCE_ALPHA) 00783 *params = 0; 00784 else if (img->TexFormat->LuminanceBits > 0) 00785 *params = img->TexFormat->LuminanceBits; 00786 else /* luminance probably stored as rgb texture */ 00787 *params = MIN2(img->TexFormat->RedBits, img->TexFormat->GreenBits); 00788 break; 00789 case GL_TEXTURE_INDEX_SIZE_EXT: 00790 if (img->_BaseFormat == GL_COLOR_INDEX) 00791 *params = img->TexFormat->IndexBits; 00792 else 00793 *params = 0; 00794 break; 00795 case GL_TEXTURE_DEPTH_SIZE_ARB: 00796 if (ctx->Extensions.ARB_depth_texture) 00797 *params = img->TexFormat->DepthBits; 00798 else 00799 _mesa_error(ctx, GL_INVALID_ENUM, 00800 "glGetTexLevelParameter[if]v(pname)"); 00801 break; 00802 case GL_TEXTURE_STENCIL_SIZE_EXT: 00803 if (ctx->Extensions.EXT_packed_depth_stencil) { 00804 *params = img->TexFormat->StencilBits; 00805 } 00806 else { 00807 _mesa_error(ctx, GL_INVALID_ENUM, 00808 "glGetTexLevelParameter[if]v(pname)"); 00809 } 00810 break; 00811 00812 /* GL_ARB_texture_compression */ 00813 case GL_TEXTURE_COMPRESSED_IMAGE_SIZE: 00814 if (ctx->Extensions.ARB_texture_compression) { 00815 if (img->IsCompressed && !isProxy) { 00816 /* Don't use ctx->Driver.CompressedTextureSize() since that 00817 * may returned a padded hardware size. 00818 */ 00819 *params = _mesa_compressed_texture_size(ctx, img->Width, 00820 img->Height, img->Depth, 00821 img->TexFormat->MesaFormat); 00822 } 00823 else { 00824 _mesa_error(ctx, GL_INVALID_OPERATION, 00825 "glGetTexLevelParameter[if]v(pname)"); 00826 } 00827 } 00828 else { 00829 _mesa_error(ctx, GL_INVALID_ENUM, 00830 "glGetTexLevelParameter[if]v(pname)"); 00831 } 00832 break; 00833 case GL_TEXTURE_COMPRESSED: 00834 if (ctx->Extensions.ARB_texture_compression) { 00835 *params = (GLint) img->IsCompressed; 00836 } 00837 else { 00838 _mesa_error(ctx, GL_INVALID_ENUM, 00839 "glGetTexLevelParameter[if]v(pname)"); 00840 } 00841 break; 00842 00843 /* GL_ARB_texture_float */ 00844 case GL_TEXTURE_RED_TYPE_ARB: 00845 if (ctx->Extensions.ARB_texture_float) { 00846 *params = img->TexFormat->RedBits ? img->TexFormat->DataType : GL_NONE; 00847 } 00848 else { 00849 _mesa_error(ctx, GL_INVALID_ENUM, 00850 "glGetTexLevelParameter[if]v(pname)"); 00851 } 00852 break; 00853 case GL_TEXTURE_GREEN_TYPE_ARB: 00854 if (ctx->Extensions.ARB_texture_float) { 00855 *params = img->TexFormat->GreenBits ? img->TexFormat->DataType : GL_NONE; 00856 } 00857 else { 00858 _mesa_error(ctx, GL_INVALID_ENUM, 00859 "glGetTexLevelParameter[if]v(pname)"); 00860 } 00861 break; 00862 case GL_TEXTURE_BLUE_TYPE_ARB: 00863 if (ctx->Extensions.ARB_texture_float) { 00864 *params = img->TexFormat->BlueBits ? img->TexFormat->DataType : GL_NONE; 00865 } 00866 else { 00867 _mesa_error(ctx, GL_INVALID_ENUM, 00868 "glGetTexLevelParameter[if]v(pname)"); 00869 } 00870 break; 00871 case GL_TEXTURE_ALPHA_TYPE_ARB: 00872 if (ctx->Extensions.ARB_texture_float) { 00873 *params = img->TexFormat->AlphaBits ? img->TexFormat->DataType : GL_NONE; 00874 } 00875 else { 00876 _mesa_error(ctx, GL_INVALID_ENUM, 00877 "glGetTexLevelParameter[if]v(pname)"); 00878 } 00879 break; 00880 case GL_TEXTURE_LUMINANCE_TYPE_ARB: 00881 if (ctx->Extensions.ARB_texture_float) { 00882 *params = img->TexFormat->LuminanceBits ? img->TexFormat->DataType : GL_NONE; 00883 } 00884 else { 00885 _mesa_error(ctx, GL_INVALID_ENUM, 00886 "glGetTexLevelParameter[if]v(pname)"); 00887 } 00888 break; 00889 case GL_TEXTURE_INTENSITY_TYPE_ARB: 00890 if (ctx->Extensions.ARB_texture_float) { 00891 *params = img->TexFormat->IntensityBits ? img->TexFormat->DataType : GL_NONE; 00892 } 00893 else { 00894 _mesa_error(ctx, GL_INVALID_ENUM, 00895 "glGetTexLevelParameter[if]v(pname)"); 00896 } 00897 break; 00898 case GL_TEXTURE_DEPTH_TYPE_ARB: 00899 if (ctx->Extensions.ARB_texture_float) { 00900 *params = img->TexFormat->DepthBits ? img->TexFormat->DataType : GL_NONE; 00901 } 00902 else { 00903 _mesa_error(ctx, GL_INVALID_ENUM, 00904 "glGetTexLevelParameter[if]v(pname)"); 00905 } 00906 break; 00907 00908 default: 00909 _mesa_error(ctx, GL_INVALID_ENUM, 00910 "glGetTexLevelParameter[if]v(pname)"); 00911 } 00912 00913 out: 00914 _mesa_unlock_texture(ctx, texObj); 00915 } 00916 00917 00918 00919 void GLAPIENTRY 00920 _mesa_GetTexParameterfv( GLenum target, GLenum pname, GLfloat *params ) 00921 { 00922 struct gl_texture_unit *texUnit; 00923 struct gl_texture_object *obj; 00924 GLboolean error = GL_FALSE; 00925 GET_CURRENT_CONTEXT(ctx); 00926 ASSERT_OUTSIDE_BEGIN_END(ctx); 00927 00928 if (ctx->Texture.CurrentUnit >= ctx->Const.MaxTextureImageUnits) { 00929 _mesa_error(ctx, GL_INVALID_OPERATION, 00930 "glGetTexParameterfv(current unit)"); 00931 return; 00932 } 00933 00934 texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 00935 00936 obj = _mesa_select_tex_object(ctx, texUnit, target); 00937 if (!obj) { 00938 _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexParameterfv(target)"); 00939 return; 00940 } 00941 00942 _mesa_lock_texture(ctx, obj); 00943 switch (pname) { 00944 case GL_TEXTURE_MAG_FILTER: 00945 *params = ENUM_TO_FLOAT(obj->MagFilter); 00946 break; 00947 case GL_TEXTURE_MIN_FILTER: 00948 *params = ENUM_TO_FLOAT(obj->MinFilter); 00949 break; 00950 case GL_TEXTURE_WRAP_S: 00951 *params = ENUM_TO_FLOAT(obj->WrapS); 00952 break; 00953 case GL_TEXTURE_WRAP_T: 00954 *params = ENUM_TO_FLOAT(obj->WrapT); 00955 break; 00956 case GL_TEXTURE_WRAP_R: 00957 *params = ENUM_TO_FLOAT(obj->WrapR); 00958 break; 00959 case GL_TEXTURE_BORDER_COLOR: 00960 params[0] = CLAMP(obj->BorderColor[0], 0.0F, 1.0F); 00961 params[1] = CLAMP(obj->BorderColor[1], 0.0F, 1.0F); 00962 params[2] = CLAMP(obj->BorderColor[2], 0.0F, 1.0F); 00963 params[3] = CLAMP(obj->BorderColor[3], 0.0F, 1.0F); 00964 break; 00965 case GL_TEXTURE_RESIDENT: 00966 { 00967 GLboolean resident; 00968 if (ctx->Driver.IsTextureResident) 00969 resident = ctx->Driver.IsTextureResident(ctx, obj); 00970 else 00971 resident = GL_TRUE; 00972 *params = ENUM_TO_FLOAT(resident); 00973 } 00974 break; 00975 case GL_TEXTURE_PRIORITY: 00976 *params = obj->Priority; 00977 break; 00978 case GL_TEXTURE_MIN_LOD: 00979 *params = obj->MinLod; 00980 break; 00981 case GL_TEXTURE_MAX_LOD: 00982 *params = obj->MaxLod; 00983 break; 00984 case GL_TEXTURE_BASE_LEVEL: 00985 *params = (GLfloat) obj->BaseLevel; 00986 break; 00987 case GL_TEXTURE_MAX_LEVEL: 00988 *params = (GLfloat) obj->MaxLevel; 00989 break; 00990 case GL_TEXTURE_MAX_ANISOTROPY_EXT: 00991 if (ctx->Extensions.EXT_texture_filter_anisotropic) { 00992 *params = obj->MaxAnisotropy; 00993 } 00994 else 00995 error = 1; 00996 break; 00997 case GL_TEXTURE_COMPARE_SGIX: 00998 if (ctx->Extensions.SGIX_shadow) { 00999 *params = (GLfloat) obj->CompareFlag; 01000 } 01001 else 01002 error = 1; 01003 break; 01004 case GL_TEXTURE_COMPARE_OPERATOR_SGIX: 01005 if (ctx->Extensions.SGIX_shadow) { 01006 *params = (GLfloat) obj->CompareOperator; 01007 } 01008 else 01009 error = 1; 01010 break; 01011 case GL_SHADOW_AMBIENT_SGIX: /* aka GL_TEXTURE_COMPARE_FAIL_VALUE_ARB */ 01012 if (ctx->Extensions.SGIX_shadow_ambient) { 01013 *params = obj->ShadowAmbient; 01014 } 01015 else 01016 error = 1; 01017 break; 01018 case GL_GENERATE_MIPMAP_SGIS: 01019 if (ctx->Extensions.SGIS_generate_mipmap) { 01020 *params = (GLfloat) obj->GenerateMipmap; 01021 } 01022 else 01023 error = 1; 01024 break; 01025 case GL_TEXTURE_COMPARE_MODE_ARB: 01026 if (ctx->Extensions.ARB_shadow) { 01027 *params = (GLfloat) obj->CompareMode; 01028 } 01029 else 01030 error = 1; 01031 break; 01032 case GL_TEXTURE_COMPARE_FUNC_ARB: 01033 if (ctx->Extensions.ARB_shadow) { 01034 *params = (GLfloat) obj->CompareFunc; 01035 } 01036 else 01037 error = 1; 01038 break; 01039 case GL_DEPTH_TEXTURE_MODE_ARB: 01040 if (ctx->Extensions.ARB_depth_texture) { 01041 *params = (GLfloat) obj->DepthMode; 01042 } 01043 else 01044 error = 1; 01045 break; 01046 case GL_TEXTURE_LOD_BIAS: 01047 if (ctx->Extensions.EXT_texture_lod_bias) { 01048 *params = obj->LodBias; 01049 } 01050 else 01051 error = 1; 01052 break; 01053 #ifdef FEATURE_OES_draw_texture 01054 case GL_TEXTURE_CROP_RECT_OES: 01055 params[0] = obj->CropRect[0]; 01056 params[1] = obj->CropRect[1]; 01057 params[2] = obj->CropRect[2]; 01058 params[3] = obj->CropRect[3]; 01059 break; 01060 #endif 01061 default: 01062 error = 1; 01063 break; 01064 } 01065 if (error) 01066 _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexParameterfv(pname=0x%x)", 01067 pname); 01068 01069 _mesa_unlock_texture(ctx, obj); 01070 } 01071 01072 01073 void GLAPIENTRY 01074 _mesa_GetTexParameteriv( GLenum target, GLenum pname, GLint *params ) 01075 { 01076 struct gl_texture_unit *texUnit; 01077 struct gl_texture_object *obj; 01078 GET_CURRENT_CONTEXT(ctx); 01079 ASSERT_OUTSIDE_BEGIN_END(ctx); 01080 01081 if (ctx->Texture.CurrentUnit >= ctx->Const.MaxTextureImageUnits) { 01082 _mesa_error(ctx, GL_INVALID_OPERATION, 01083 "glGetTexParameteriv(current unit)"); 01084 return; 01085 } 01086 01087 texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 01088 01089 obj = _mesa_select_tex_object(ctx, texUnit, target); 01090 if (!obj) { 01091 _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexParameteriv(target)"); 01092 return; 01093 } 01094 01095 switch (pname) { 01096 case GL_TEXTURE_MAG_FILTER: 01097 *params = (GLint) obj->MagFilter; 01098 return; 01099 case GL_TEXTURE_MIN_FILTER: 01100 *params = (GLint) obj->MinFilter; 01101 return; 01102 case GL_TEXTURE_WRAP_S: 01103 *params = (GLint) obj->WrapS; 01104 return; 01105 case GL_TEXTURE_WRAP_T: 01106 *params = (GLint) obj->WrapT; 01107 return; 01108 case GL_TEXTURE_WRAP_R: 01109 *params = (GLint) obj->WrapR; 01110 return; 01111 case GL_TEXTURE_BORDER_COLOR: 01112 { 01113 GLfloat b[4]; 01114 b[0] = CLAMP(obj->BorderColor[0], 0.0F, 1.0F); 01115 b[1] = CLAMP(obj->BorderColor[1], 0.0F, 1.0F); 01116 b[2] = CLAMP(obj->BorderColor[2], 0.0F, 1.0F); 01117 b[3] = CLAMP(obj->BorderColor[3], 0.0F, 1.0F); 01118 params[0] = FLOAT_TO_INT(b[0]); 01119 params[1] = FLOAT_TO_INT(b[1]); 01120 params[2] = FLOAT_TO_INT(b[2]); 01121 params[3] = FLOAT_TO_INT(b[3]); 01122 } 01123 return; 01124 case GL_TEXTURE_RESIDENT: 01125 { 01126 GLboolean resident; 01127 if (ctx->Driver.IsTextureResident) 01128 resident = ctx->Driver.IsTextureResident(ctx, obj); 01129 else 01130 resident = GL_TRUE; 01131 *params = (GLint) resident; 01132 } 01133 return; 01134 case GL_TEXTURE_PRIORITY: 01135 *params = FLOAT_TO_INT(obj->Priority); 01136 return; 01137 case GL_TEXTURE_MIN_LOD: 01138 *params = (GLint) obj->MinLod; 01139 return; 01140 case GL_TEXTURE_MAX_LOD: 01141 *params = (GLint) obj->MaxLod; 01142 return; 01143 case GL_TEXTURE_BASE_LEVEL: 01144 *params = obj->BaseLevel; 01145 return; 01146 case GL_TEXTURE_MAX_LEVEL: 01147 *params = obj->MaxLevel; 01148 return; 01149 case GL_TEXTURE_MAX_ANISOTROPY_EXT: 01150 if (ctx->Extensions.EXT_texture_filter_anisotropic) { 01151 *params = (GLint) obj->MaxAnisotropy; 01152 return; 01153 } 01154 break; 01155 case GL_TEXTURE_COMPARE_SGIX: 01156 if (ctx->Extensions.SGIX_shadow) { 01157 *params = (GLint) obj->CompareFlag; 01158 return; 01159 } 01160 break; 01161 case GL_TEXTURE_COMPARE_OPERATOR_SGIX: 01162 if (ctx->Extensions.SGIX_shadow) { 01163 *params = (GLint) obj->CompareOperator; 01164 return; 01165 } 01166 break; 01167 case GL_SHADOW_AMBIENT_SGIX: /* aka GL_TEXTURE_COMPARE_FAIL_VALUE_ARB */ 01168 if (ctx->Extensions.SGIX_shadow_ambient) { 01169 *params = (GLint) FLOAT_TO_INT(obj->ShadowAmbient); 01170 return; 01171 } 01172 break; 01173 case GL_GENERATE_MIPMAP_SGIS: 01174 if (ctx->Extensions.SGIS_generate_mipmap) { 01175 *params = (GLint) obj->GenerateMipmap; 01176 return; 01177 } 01178 break; 01179 case GL_TEXTURE_COMPARE_MODE_ARB: 01180 if (ctx->Extensions.ARB_shadow) { 01181 *params = (GLint) obj->CompareMode; 01182 return; 01183 } 01184 break; 01185 case GL_TEXTURE_COMPARE_FUNC_ARB: 01186 if (ctx->Extensions.ARB_shadow) { 01187 *params = (GLint) obj->CompareFunc; 01188 return; 01189 } 01190 break; 01191 case GL_DEPTH_TEXTURE_MODE_ARB: 01192 if (ctx->Extensions.ARB_depth_texture) { 01193 *params = (GLint) obj->DepthMode; 01194 return; 01195 } 01196 break; 01197 case GL_TEXTURE_LOD_BIAS: 01198 if (ctx->Extensions.EXT_texture_lod_bias) { 01199 *params = (GLint) obj->LodBias; 01200 return; 01201 } 01202 break; 01203 #ifdef FEATURE_OES_draw_texture 01204 case GL_TEXTURE_CROP_RECT_OES: 01205 params[0] = obj->CropRect[0]; 01206 params[1] = obj->CropRect[1]; 01207 params[2] = obj->CropRect[2]; 01208 params[3] = obj->CropRect[3]; 01209 break; 01210 #endif 01211 default: 01212 ; /* silence warnings */ 01213 } 01214 /* If we get here, pname was an unrecognized enum */ 01215 _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexParameteriv(pname=0x%x)", pname); 01216 } Generated on Sat May 26 2012 04:19:15 for ReactOS by
1.7.6.1
|