texparam.c revision 848b8605
1848b8605Smrg/* 2848b8605Smrg * Mesa 3-D graphics library 3848b8605Smrg * 4848b8605Smrg * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. 5848b8605Smrg * Copyright (C) 2009 VMware, Inc. All Rights Reserved. 6848b8605Smrg * 7848b8605Smrg * Permission is hereby granted, free of charge, to any person obtaining a 8848b8605Smrg * copy of this software and associated documentation files (the "Software"), 9848b8605Smrg * to deal in the Software without restriction, including without limitation 10848b8605Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11848b8605Smrg * and/or sell copies of the Software, and to permit persons to whom the 12848b8605Smrg * Software is furnished to do so, subject to the following conditions: 13848b8605Smrg * 14848b8605Smrg * The above copyright notice and this permission notice shall be included 15848b8605Smrg * in all copies or substantial portions of the Software. 16848b8605Smrg * 17848b8605Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18848b8605Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19848b8605Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20848b8605Smrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 21848b8605Smrg * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 22848b8605Smrg * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 23848b8605Smrg * OTHER DEALINGS IN THE SOFTWARE. 24848b8605Smrg */ 25848b8605Smrg 26848b8605Smrg/** 27848b8605Smrg * \file texparam.c 28848b8605Smrg * 29848b8605Smrg * glTexParameter-related functions 30848b8605Smrg */ 31848b8605Smrg 32848b8605Smrg#include <stdbool.h> 33848b8605Smrg#include "main/glheader.h" 34848b8605Smrg#include "main/blend.h" 35848b8605Smrg#include "main/colormac.h" 36848b8605Smrg#include "main/context.h" 37848b8605Smrg#include "main/enums.h" 38848b8605Smrg#include "main/formats.h" 39848b8605Smrg#include "main/glformats.h" 40848b8605Smrg#include "main/macros.h" 41848b8605Smrg#include "main/mtypes.h" 42848b8605Smrg#include "main/state.h" 43848b8605Smrg#include "main/texcompress.h" 44848b8605Smrg#include "main/texobj.h" 45848b8605Smrg#include "main/texparam.h" 46848b8605Smrg#include "main/teximage.h" 47848b8605Smrg#include "main/texstate.h" 48848b8605Smrg#include "program/prog_instruction.h" 49848b8605Smrg 50848b8605Smrg 51848b8605Smrg/** 52848b8605Smrg * Check if a coordinate wrap mode is supported for the texture target. 53848b8605Smrg * \return GL_TRUE if legal, GL_FALSE otherwise 54848b8605Smrg */ 55848b8605Smrgstatic GLboolean 56848b8605Smrgvalidate_texture_wrap_mode(struct gl_context * ctx, GLenum target, GLenum wrap) 57848b8605Smrg{ 58848b8605Smrg const struct gl_extensions * const e = & ctx->Extensions; 59848b8605Smrg const bool is_desktop_gl = _mesa_is_desktop_gl(ctx); 60848b8605Smrg bool supported; 61848b8605Smrg 62848b8605Smrg switch (wrap) { 63848b8605Smrg case GL_CLAMP: 64848b8605Smrg /* GL_CLAMP was removed in the core profile, and it has never existed in 65848b8605Smrg * OpenGL ES. 66848b8605Smrg */ 67848b8605Smrg supported = (ctx->API == API_OPENGL_COMPAT) 68848b8605Smrg && (target != GL_TEXTURE_EXTERNAL_OES); 69848b8605Smrg break; 70848b8605Smrg 71848b8605Smrg case GL_CLAMP_TO_EDGE: 72848b8605Smrg supported = true; 73848b8605Smrg break; 74848b8605Smrg 75848b8605Smrg case GL_CLAMP_TO_BORDER: 76848b8605Smrg supported = is_desktop_gl && e->ARB_texture_border_clamp 77848b8605Smrg && (target != GL_TEXTURE_EXTERNAL_OES); 78848b8605Smrg break; 79848b8605Smrg 80848b8605Smrg case GL_REPEAT: 81848b8605Smrg case GL_MIRRORED_REPEAT: 82848b8605Smrg supported = (target != GL_TEXTURE_RECTANGLE_NV) 83848b8605Smrg && (target != GL_TEXTURE_EXTERNAL_OES); 84848b8605Smrg break; 85848b8605Smrg 86848b8605Smrg case GL_MIRROR_CLAMP_EXT: 87848b8605Smrg supported = is_desktop_gl 88848b8605Smrg && (e->ATI_texture_mirror_once || e->EXT_texture_mirror_clamp) 89848b8605Smrg && (target != GL_TEXTURE_RECTANGLE_NV) 90848b8605Smrg && (target != GL_TEXTURE_EXTERNAL_OES); 91848b8605Smrg break; 92848b8605Smrg 93848b8605Smrg case GL_MIRROR_CLAMP_TO_EDGE_EXT: 94848b8605Smrg supported = is_desktop_gl 95848b8605Smrg && (e->ATI_texture_mirror_once || e->EXT_texture_mirror_clamp || e->ARB_texture_mirror_clamp_to_edge) 96848b8605Smrg && (target != GL_TEXTURE_RECTANGLE_NV) 97848b8605Smrg && (target != GL_TEXTURE_EXTERNAL_OES); 98848b8605Smrg break; 99848b8605Smrg 100848b8605Smrg case GL_MIRROR_CLAMP_TO_BORDER_EXT: 101848b8605Smrg supported = is_desktop_gl && e->EXT_texture_mirror_clamp 102848b8605Smrg && (target != GL_TEXTURE_RECTANGLE_NV) 103848b8605Smrg && (target != GL_TEXTURE_EXTERNAL_OES); 104848b8605Smrg break; 105848b8605Smrg 106848b8605Smrg default: 107848b8605Smrg supported = false; 108848b8605Smrg break; 109848b8605Smrg } 110848b8605Smrg 111848b8605Smrg if (!supported) 112848b8605Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glTexParameter(param=0x%x)", wrap ); 113848b8605Smrg 114848b8605Smrg return supported; 115848b8605Smrg} 116848b8605Smrg 117848b8605Smrg 118848b8605Smrg/** 119848b8605Smrg * Get current texture object for given target. 120848b8605Smrg * Return NULL if any error (and record the error). 121848b8605Smrg * Note that this is different from _mesa_get_current_tex_object() in that 122848b8605Smrg * proxy targets are not accepted. 123848b8605Smrg * Only the glGetTexLevelParameter() functions accept proxy targets. 124848b8605Smrg */ 125848b8605Smrgstatic struct gl_texture_object * 126848b8605Smrgget_texobj(struct gl_context *ctx, GLenum target, GLboolean get) 127848b8605Smrg{ 128848b8605Smrg struct gl_texture_unit *texUnit; 129848b8605Smrg int targetIndex; 130848b8605Smrg 131848b8605Smrg if (ctx->Texture.CurrentUnit >= ctx->Const.MaxCombinedTextureImageUnits) { 132848b8605Smrg _mesa_error(ctx, GL_INVALID_OPERATION, 133848b8605Smrg "gl%sTexParameter(current unit)", get ? "Get" : ""); 134848b8605Smrg return NULL; 135848b8605Smrg } 136848b8605Smrg 137848b8605Smrg texUnit = _mesa_get_current_tex_unit(ctx); 138848b8605Smrg 139848b8605Smrg targetIndex = _mesa_tex_target_to_index(ctx, target); 140848b8605Smrg if (targetIndex < 0 || targetIndex == TEXTURE_BUFFER_INDEX) { 141848b8605Smrg _mesa_error(ctx, GL_INVALID_ENUM, 142848b8605Smrg "gl%sTexParameter(target)", get ? "Get" : ""); 143848b8605Smrg return NULL; 144848b8605Smrg } 145848b8605Smrg assert(targetIndex < NUM_TEXTURE_TARGETS); 146848b8605Smrg 147848b8605Smrg return texUnit->CurrentTex[targetIndex]; 148848b8605Smrg} 149848b8605Smrg 150848b8605Smrg 151848b8605Smrg/** 152848b8605Smrg * Convert GL_RED/GREEN/BLUE/ALPHA/ZERO/ONE to SWIZZLE_X/Y/Z/W/ZERO/ONE. 153848b8605Smrg * \return -1 if error. 154848b8605Smrg */ 155848b8605Smrgstatic GLint 156848b8605Smrgcomp_to_swizzle(GLenum comp) 157848b8605Smrg{ 158848b8605Smrg switch (comp) { 159848b8605Smrg case GL_RED: 160848b8605Smrg return SWIZZLE_X; 161848b8605Smrg case GL_GREEN: 162848b8605Smrg return SWIZZLE_Y; 163848b8605Smrg case GL_BLUE: 164848b8605Smrg return SWIZZLE_Z; 165848b8605Smrg case GL_ALPHA: 166848b8605Smrg return SWIZZLE_W; 167848b8605Smrg case GL_ZERO: 168848b8605Smrg return SWIZZLE_ZERO; 169848b8605Smrg case GL_ONE: 170848b8605Smrg return SWIZZLE_ONE; 171848b8605Smrg default: 172848b8605Smrg return -1; 173848b8605Smrg } 174848b8605Smrg} 175848b8605Smrg 176848b8605Smrg 177848b8605Smrgstatic void 178848b8605Smrgset_swizzle_component(GLuint *swizzle, GLuint comp, GLuint swz) 179848b8605Smrg{ 180848b8605Smrg ASSERT(comp < 4); 181848b8605Smrg ASSERT(swz <= SWIZZLE_NIL); 182848b8605Smrg { 183848b8605Smrg GLuint mask = 0x7 << (3 * comp); 184848b8605Smrg GLuint s = (*swizzle & ~mask) | (swz << (3 * comp)); 185848b8605Smrg *swizzle = s; 186848b8605Smrg } 187848b8605Smrg} 188848b8605Smrg 189848b8605Smrg 190848b8605Smrg/** 191848b8605Smrg * This is called just prior to changing any texture object state which 192848b8605Smrg * will not effect texture completeness. 193848b8605Smrg */ 194848b8605Smrgstatic inline void 195848b8605Smrgflush(struct gl_context *ctx) 196848b8605Smrg{ 197848b8605Smrg FLUSH_VERTICES(ctx, _NEW_TEXTURE); 198848b8605Smrg} 199848b8605Smrg 200848b8605Smrg 201848b8605Smrg/** 202848b8605Smrg * This is called just prior to changing any texture object state which 203848b8605Smrg * can effect texture completeness (texture base level, max level). 204848b8605Smrg * Any pending rendering will be flushed out, we'll set the _NEW_TEXTURE 205848b8605Smrg * state flag and then mark the texture object as 'incomplete' so that any 206848b8605Smrg * per-texture derived state gets recomputed. 207848b8605Smrg */ 208848b8605Smrgstatic inline void 209848b8605Smrgincomplete(struct gl_context *ctx, struct gl_texture_object *texObj) 210848b8605Smrg{ 211848b8605Smrg FLUSH_VERTICES(ctx, _NEW_TEXTURE); 212848b8605Smrg _mesa_dirty_texobj(ctx, texObj); 213848b8605Smrg} 214848b8605Smrg 215848b8605Smrg 216848b8605Smrgstatic GLboolean 217848b8605Smrgtarget_allows_setting_sampler_parameters(GLenum target) 218848b8605Smrg{ 219848b8605Smrg switch (target) { 220848b8605Smrg case GL_TEXTURE_2D_MULTISAMPLE: 221848b8605Smrg case GL_TEXTURE_2D_MULTISAMPLE_ARRAY: 222848b8605Smrg return GL_FALSE; 223848b8605Smrg 224848b8605Smrg default: 225848b8605Smrg return GL_TRUE; 226848b8605Smrg } 227848b8605Smrg} 228848b8605Smrg 229848b8605Smrg 230848b8605Smrg/** 231848b8605Smrg * Set an integer-valued texture parameter 232848b8605Smrg * \return GL_TRUE if legal AND the value changed, GL_FALSE otherwise 233848b8605Smrg */ 234848b8605Smrgstatic GLboolean 235848b8605Smrgset_tex_parameteri(struct gl_context *ctx, 236848b8605Smrg struct gl_texture_object *texObj, 237848b8605Smrg GLenum pname, const GLint *params) 238848b8605Smrg{ 239848b8605Smrg switch (pname) { 240848b8605Smrg case GL_TEXTURE_MIN_FILTER: 241848b8605Smrg if (!target_allows_setting_sampler_parameters(texObj->Target)) 242848b8605Smrg goto invalid_operation; 243848b8605Smrg 244848b8605Smrg if (texObj->Sampler.MinFilter == params[0]) 245848b8605Smrg return GL_FALSE; 246848b8605Smrg switch (params[0]) { 247848b8605Smrg case GL_NEAREST: 248848b8605Smrg case GL_LINEAR: 249848b8605Smrg flush(ctx); 250848b8605Smrg texObj->Sampler.MinFilter = params[0]; 251848b8605Smrg return GL_TRUE; 252848b8605Smrg case GL_NEAREST_MIPMAP_NEAREST: 253848b8605Smrg case GL_LINEAR_MIPMAP_NEAREST: 254848b8605Smrg case GL_NEAREST_MIPMAP_LINEAR: 255848b8605Smrg case GL_LINEAR_MIPMAP_LINEAR: 256848b8605Smrg if (texObj->Target != GL_TEXTURE_RECTANGLE_NV && 257848b8605Smrg texObj->Target != GL_TEXTURE_EXTERNAL_OES) { 258848b8605Smrg flush(ctx); 259848b8605Smrg texObj->Sampler.MinFilter = params[0]; 260848b8605Smrg return GL_TRUE; 261848b8605Smrg } 262848b8605Smrg /* fall-through */ 263848b8605Smrg default: 264848b8605Smrg goto invalid_param; 265848b8605Smrg } 266848b8605Smrg return GL_FALSE; 267848b8605Smrg 268848b8605Smrg case GL_TEXTURE_MAG_FILTER: 269848b8605Smrg if (!target_allows_setting_sampler_parameters(texObj->Target)) 270848b8605Smrg goto invalid_operation; 271848b8605Smrg 272848b8605Smrg if (texObj->Sampler.MagFilter == params[0]) 273848b8605Smrg return GL_FALSE; 274848b8605Smrg switch (params[0]) { 275848b8605Smrg case GL_NEAREST: 276848b8605Smrg case GL_LINEAR: 277848b8605Smrg flush(ctx); /* does not effect completeness */ 278848b8605Smrg texObj->Sampler.MagFilter = params[0]; 279848b8605Smrg return GL_TRUE; 280848b8605Smrg default: 281848b8605Smrg goto invalid_param; 282848b8605Smrg } 283848b8605Smrg return GL_FALSE; 284848b8605Smrg 285848b8605Smrg case GL_TEXTURE_WRAP_S: 286848b8605Smrg if (!target_allows_setting_sampler_parameters(texObj->Target)) 287848b8605Smrg goto invalid_operation; 288848b8605Smrg 289848b8605Smrg if (texObj->Sampler.WrapS == params[0]) 290848b8605Smrg return GL_FALSE; 291848b8605Smrg if (validate_texture_wrap_mode(ctx, texObj->Target, params[0])) { 292848b8605Smrg flush(ctx); 293848b8605Smrg texObj->Sampler.WrapS = params[0]; 294848b8605Smrg return GL_TRUE; 295848b8605Smrg } 296848b8605Smrg return GL_FALSE; 297848b8605Smrg 298848b8605Smrg case GL_TEXTURE_WRAP_T: 299848b8605Smrg if (!target_allows_setting_sampler_parameters(texObj->Target)) 300848b8605Smrg goto invalid_operation; 301848b8605Smrg 302848b8605Smrg if (texObj->Sampler.WrapT == params[0]) 303848b8605Smrg return GL_FALSE; 304848b8605Smrg if (validate_texture_wrap_mode(ctx, texObj->Target, params[0])) { 305848b8605Smrg flush(ctx); 306848b8605Smrg texObj->Sampler.WrapT = params[0]; 307848b8605Smrg return GL_TRUE; 308848b8605Smrg } 309848b8605Smrg return GL_FALSE; 310848b8605Smrg 311848b8605Smrg case GL_TEXTURE_WRAP_R: 312848b8605Smrg if (!target_allows_setting_sampler_parameters(texObj->Target)) 313848b8605Smrg goto invalid_operation; 314848b8605Smrg 315848b8605Smrg if (texObj->Sampler.WrapR == params[0]) 316848b8605Smrg return GL_FALSE; 317848b8605Smrg if (validate_texture_wrap_mode(ctx, texObj->Target, params[0])) { 318848b8605Smrg flush(ctx); 319848b8605Smrg texObj->Sampler.WrapR = params[0]; 320848b8605Smrg return GL_TRUE; 321848b8605Smrg } 322848b8605Smrg return GL_FALSE; 323848b8605Smrg 324848b8605Smrg case GL_TEXTURE_BASE_LEVEL: 325848b8605Smrg if (!_mesa_is_desktop_gl(ctx) && !_mesa_is_gles3(ctx)) 326848b8605Smrg goto invalid_pname; 327848b8605Smrg 328848b8605Smrg if (texObj->BaseLevel == params[0]) 329848b8605Smrg return GL_FALSE; 330848b8605Smrg 331848b8605Smrg if ((texObj->Target == GL_TEXTURE_2D_MULTISAMPLE || 332848b8605Smrg texObj->Target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY) && params[0] != 0) 333848b8605Smrg goto invalid_operation; 334848b8605Smrg 335848b8605Smrg if (params[0] < 0 || 336848b8605Smrg (texObj->Target == GL_TEXTURE_RECTANGLE_ARB && params[0] != 0)) { 337848b8605Smrg _mesa_error(ctx, GL_INVALID_VALUE, 338848b8605Smrg "glTexParameter(param=%d)", params[0]); 339848b8605Smrg return GL_FALSE; 340848b8605Smrg } 341848b8605Smrg incomplete(ctx, texObj); 342848b8605Smrg 343848b8605Smrg /** See note about ARB_texture_storage below */ 344848b8605Smrg if (texObj->Immutable) 345848b8605Smrg texObj->BaseLevel = MIN2(texObj->ImmutableLevels - 1, params[0]); 346848b8605Smrg else 347848b8605Smrg texObj->BaseLevel = params[0]; 348848b8605Smrg 349848b8605Smrg return GL_TRUE; 350848b8605Smrg 351848b8605Smrg case GL_TEXTURE_MAX_LEVEL: 352848b8605Smrg if (texObj->MaxLevel == params[0]) 353848b8605Smrg return GL_FALSE; 354848b8605Smrg 355848b8605Smrg if (params[0] < 0 || 356848b8605Smrg (texObj->Target == GL_TEXTURE_RECTANGLE_ARB && params[0] > 0)) { 357848b8605Smrg _mesa_error(ctx, GL_INVALID_VALUE, 358848b8605Smrg "glTexParameter(param=%d)", params[0]); 359848b8605Smrg return GL_FALSE; 360848b8605Smrg } 361848b8605Smrg incomplete(ctx, texObj); 362848b8605Smrg 363848b8605Smrg /** From ARB_texture_storage: 364848b8605Smrg * However, if TEXTURE_IMMUTABLE_FORMAT is TRUE, then level_base is 365848b8605Smrg * clamped to the range [0, <levels> - 1] and level_max is then clamped to 366848b8605Smrg * the range [level_base, <levels> - 1], where <levels> is the parameter 367848b8605Smrg * passed the call to TexStorage* for the texture object. 368848b8605Smrg */ 369848b8605Smrg if (texObj->Immutable) 370848b8605Smrg texObj->MaxLevel = CLAMP(params[0], texObj->BaseLevel, 371848b8605Smrg texObj->ImmutableLevels - 1); 372848b8605Smrg else 373848b8605Smrg texObj->MaxLevel = params[0]; 374848b8605Smrg 375848b8605Smrg return GL_TRUE; 376848b8605Smrg 377848b8605Smrg case GL_GENERATE_MIPMAP_SGIS: 378848b8605Smrg if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES) 379848b8605Smrg goto invalid_pname; 380848b8605Smrg 381848b8605Smrg if (params[0] && texObj->Target == GL_TEXTURE_EXTERNAL_OES) 382848b8605Smrg goto invalid_param; 383848b8605Smrg if (texObj->GenerateMipmap != params[0]) { 384848b8605Smrg /* no flush() */ 385848b8605Smrg texObj->GenerateMipmap = params[0] ? GL_TRUE : GL_FALSE; 386848b8605Smrg return GL_TRUE; 387848b8605Smrg } 388848b8605Smrg return GL_FALSE; 389848b8605Smrg 390848b8605Smrg case GL_TEXTURE_COMPARE_MODE_ARB: 391848b8605Smrg if ((_mesa_is_desktop_gl(ctx) && ctx->Extensions.ARB_shadow) 392848b8605Smrg || _mesa_is_gles3(ctx)) { 393848b8605Smrg 394848b8605Smrg if (!target_allows_setting_sampler_parameters(texObj->Target)) 395848b8605Smrg goto invalid_operation; 396848b8605Smrg 397848b8605Smrg if (texObj->Sampler.CompareMode == params[0]) 398848b8605Smrg return GL_FALSE; 399848b8605Smrg if (params[0] == GL_NONE || 400848b8605Smrg params[0] == GL_COMPARE_R_TO_TEXTURE_ARB) { 401848b8605Smrg flush(ctx); 402848b8605Smrg texObj->Sampler.CompareMode = params[0]; 403848b8605Smrg return GL_TRUE; 404848b8605Smrg } 405848b8605Smrg goto invalid_param; 406848b8605Smrg } 407848b8605Smrg goto invalid_pname; 408848b8605Smrg 409848b8605Smrg case GL_TEXTURE_COMPARE_FUNC_ARB: 410848b8605Smrg if ((_mesa_is_desktop_gl(ctx) && ctx->Extensions.ARB_shadow) 411848b8605Smrg || _mesa_is_gles3(ctx)) { 412848b8605Smrg 413848b8605Smrg if (!target_allows_setting_sampler_parameters(texObj->Target)) 414848b8605Smrg goto invalid_operation; 415848b8605Smrg 416848b8605Smrg if (texObj->Sampler.CompareFunc == params[0]) 417848b8605Smrg return GL_FALSE; 418848b8605Smrg switch (params[0]) { 419848b8605Smrg case GL_LEQUAL: 420848b8605Smrg case GL_GEQUAL: 421848b8605Smrg case GL_EQUAL: 422848b8605Smrg case GL_NOTEQUAL: 423848b8605Smrg case GL_LESS: 424848b8605Smrg case GL_GREATER: 425848b8605Smrg case GL_ALWAYS: 426848b8605Smrg case GL_NEVER: 427848b8605Smrg flush(ctx); 428848b8605Smrg texObj->Sampler.CompareFunc = params[0]; 429848b8605Smrg return GL_TRUE; 430848b8605Smrg default: 431848b8605Smrg goto invalid_param; 432848b8605Smrg } 433848b8605Smrg } 434848b8605Smrg goto invalid_pname; 435848b8605Smrg 436848b8605Smrg case GL_DEPTH_TEXTURE_MODE_ARB: 437848b8605Smrg /* GL_DEPTH_TEXTURE_MODE_ARB is removed in core-profile and it has never 438848b8605Smrg * existed in OpenGL ES. 439848b8605Smrg */ 440848b8605Smrg if (ctx->API == API_OPENGL_COMPAT && ctx->Extensions.ARB_depth_texture) { 441848b8605Smrg if (texObj->DepthMode == params[0]) 442848b8605Smrg return GL_FALSE; 443848b8605Smrg if (params[0] == GL_LUMINANCE || 444848b8605Smrg params[0] == GL_INTENSITY || 445848b8605Smrg params[0] == GL_ALPHA || 446848b8605Smrg (ctx->Extensions.ARB_texture_rg && params[0] == GL_RED)) { 447848b8605Smrg flush(ctx); 448848b8605Smrg texObj->DepthMode = params[0]; 449848b8605Smrg return GL_TRUE; 450848b8605Smrg } 451848b8605Smrg goto invalid_param; 452848b8605Smrg } 453848b8605Smrg goto invalid_pname; 454848b8605Smrg 455848b8605Smrg case GL_DEPTH_STENCIL_TEXTURE_MODE: 456848b8605Smrg if (_mesa_is_desktop_gl(ctx) && ctx->Extensions.ARB_stencil_texturing) { 457848b8605Smrg bool stencil = params[0] == GL_STENCIL_INDEX; 458848b8605Smrg if (!stencil && params[0] != GL_DEPTH_COMPONENT) 459848b8605Smrg goto invalid_param; 460848b8605Smrg 461848b8605Smrg if (texObj->StencilSampling == stencil) 462848b8605Smrg return GL_FALSE; 463848b8605Smrg 464848b8605Smrg texObj->StencilSampling = stencil; 465848b8605Smrg return GL_TRUE; 466848b8605Smrg } 467848b8605Smrg goto invalid_pname; 468848b8605Smrg 469848b8605Smrg case GL_TEXTURE_CROP_RECT_OES: 470848b8605Smrg if (ctx->API != API_OPENGLES || !ctx->Extensions.OES_draw_texture) 471848b8605Smrg goto invalid_pname; 472848b8605Smrg 473848b8605Smrg texObj->CropRect[0] = params[0]; 474848b8605Smrg texObj->CropRect[1] = params[1]; 475848b8605Smrg texObj->CropRect[2] = params[2]; 476848b8605Smrg texObj->CropRect[3] = params[3]; 477848b8605Smrg return GL_TRUE; 478848b8605Smrg 479848b8605Smrg case GL_TEXTURE_SWIZZLE_R_EXT: 480848b8605Smrg case GL_TEXTURE_SWIZZLE_G_EXT: 481848b8605Smrg case GL_TEXTURE_SWIZZLE_B_EXT: 482848b8605Smrg case GL_TEXTURE_SWIZZLE_A_EXT: 483848b8605Smrg if ((_mesa_is_desktop_gl(ctx) && ctx->Extensions.EXT_texture_swizzle) 484848b8605Smrg || _mesa_is_gles3(ctx)) { 485848b8605Smrg const GLuint comp = pname - GL_TEXTURE_SWIZZLE_R_EXT; 486848b8605Smrg const GLint swz = comp_to_swizzle(params[0]); 487848b8605Smrg if (swz < 0) { 488848b8605Smrg _mesa_error(ctx, GL_INVALID_ENUM, 489848b8605Smrg "glTexParameter(swizzle 0x%x)", params[0]); 490848b8605Smrg return GL_FALSE; 491848b8605Smrg } 492848b8605Smrg ASSERT(comp < 4); 493848b8605Smrg 494848b8605Smrg flush(ctx); 495848b8605Smrg texObj->Swizzle[comp] = params[0]; 496848b8605Smrg set_swizzle_component(&texObj->_Swizzle, comp, swz); 497848b8605Smrg return GL_TRUE; 498848b8605Smrg } 499848b8605Smrg goto invalid_pname; 500848b8605Smrg 501848b8605Smrg case GL_TEXTURE_SWIZZLE_RGBA_EXT: 502848b8605Smrg if ((_mesa_is_desktop_gl(ctx) && ctx->Extensions.EXT_texture_swizzle) 503848b8605Smrg || _mesa_is_gles3(ctx)) { 504848b8605Smrg GLuint comp; 505848b8605Smrg flush(ctx); 506848b8605Smrg for (comp = 0; comp < 4; comp++) { 507848b8605Smrg const GLint swz = comp_to_swizzle(params[comp]); 508848b8605Smrg if (swz >= 0) { 509848b8605Smrg texObj->Swizzle[comp] = params[comp]; 510848b8605Smrg set_swizzle_component(&texObj->_Swizzle, comp, swz); 511848b8605Smrg } 512848b8605Smrg else { 513848b8605Smrg _mesa_error(ctx, GL_INVALID_ENUM, 514848b8605Smrg "glTexParameter(swizzle 0x%x)", params[comp]); 515848b8605Smrg return GL_FALSE; 516848b8605Smrg } 517848b8605Smrg } 518848b8605Smrg return GL_TRUE; 519848b8605Smrg } 520848b8605Smrg goto invalid_pname; 521848b8605Smrg 522848b8605Smrg case GL_TEXTURE_SRGB_DECODE_EXT: 523848b8605Smrg if (_mesa_is_desktop_gl(ctx) 524848b8605Smrg && ctx->Extensions.EXT_texture_sRGB_decode) { 525848b8605Smrg GLenum decode = params[0]; 526848b8605Smrg 527848b8605Smrg if (!target_allows_setting_sampler_parameters(texObj->Target)) 528848b8605Smrg goto invalid_operation; 529848b8605Smrg 530848b8605Smrg if (decode == GL_DECODE_EXT || decode == GL_SKIP_DECODE_EXT) { 531848b8605Smrg if (texObj->Sampler.sRGBDecode != decode) { 532848b8605Smrg flush(ctx); 533848b8605Smrg texObj->Sampler.sRGBDecode = decode; 534848b8605Smrg } 535848b8605Smrg return GL_TRUE; 536848b8605Smrg } 537848b8605Smrg } 538848b8605Smrg goto invalid_pname; 539848b8605Smrg 540848b8605Smrg case GL_TEXTURE_CUBE_MAP_SEAMLESS: 541848b8605Smrg if (_mesa_is_desktop_gl(ctx) 542848b8605Smrg && ctx->Extensions.AMD_seamless_cubemap_per_texture) { 543848b8605Smrg GLenum param = params[0]; 544848b8605Smrg 545848b8605Smrg if (!target_allows_setting_sampler_parameters(texObj->Target)) 546848b8605Smrg goto invalid_operation; 547848b8605Smrg 548848b8605Smrg if (param != GL_TRUE && param != GL_FALSE) { 549848b8605Smrg goto invalid_param; 550848b8605Smrg } 551848b8605Smrg if (param != texObj->Sampler.CubeMapSeamless) { 552848b8605Smrg flush(ctx); 553848b8605Smrg texObj->Sampler.CubeMapSeamless = param; 554848b8605Smrg } 555848b8605Smrg return GL_TRUE; 556848b8605Smrg } 557848b8605Smrg goto invalid_pname; 558848b8605Smrg 559848b8605Smrg default: 560848b8605Smrg goto invalid_pname; 561848b8605Smrg } 562848b8605Smrg 563848b8605Smrginvalid_pname: 564848b8605Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glTexParameter(pname=%s)", 565848b8605Smrg _mesa_lookup_enum_by_nr(pname)); 566848b8605Smrg return GL_FALSE; 567848b8605Smrg 568848b8605Smrginvalid_param: 569848b8605Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glTexParameter(param=%s)", 570848b8605Smrg _mesa_lookup_enum_by_nr(params[0])); 571848b8605Smrg return GL_FALSE; 572848b8605Smrg 573848b8605Smrginvalid_operation: 574848b8605Smrg _mesa_error(ctx, GL_INVALID_OPERATION, "glTexParameter(pname=%s)", 575848b8605Smrg _mesa_lookup_enum_by_nr(pname)); 576848b8605Smrg return GL_FALSE; 577848b8605Smrg} 578848b8605Smrg 579848b8605Smrg 580848b8605Smrg/** 581848b8605Smrg * Set a float-valued texture parameter 582848b8605Smrg * \return GL_TRUE if legal AND the value changed, GL_FALSE otherwise 583848b8605Smrg */ 584848b8605Smrgstatic GLboolean 585848b8605Smrgset_tex_parameterf(struct gl_context *ctx, 586848b8605Smrg struct gl_texture_object *texObj, 587848b8605Smrg GLenum pname, const GLfloat *params) 588848b8605Smrg{ 589848b8605Smrg switch (pname) { 590848b8605Smrg case GL_TEXTURE_MIN_LOD: 591848b8605Smrg if (!_mesa_is_desktop_gl(ctx) && !_mesa_is_gles3(ctx)) 592848b8605Smrg goto invalid_pname; 593848b8605Smrg 594848b8605Smrg if (!target_allows_setting_sampler_parameters(texObj->Target)) 595848b8605Smrg goto invalid_operation; 596848b8605Smrg 597848b8605Smrg if (texObj->Sampler.MinLod == params[0]) 598848b8605Smrg return GL_FALSE; 599848b8605Smrg flush(ctx); 600848b8605Smrg texObj->Sampler.MinLod = params[0]; 601848b8605Smrg return GL_TRUE; 602848b8605Smrg 603848b8605Smrg case GL_TEXTURE_MAX_LOD: 604848b8605Smrg if (!_mesa_is_desktop_gl(ctx) && !_mesa_is_gles3(ctx)) 605848b8605Smrg goto invalid_pname; 606848b8605Smrg 607848b8605Smrg if (!target_allows_setting_sampler_parameters(texObj->Target)) 608848b8605Smrg goto invalid_operation; 609848b8605Smrg 610848b8605Smrg if (texObj->Sampler.MaxLod == params[0]) 611848b8605Smrg return GL_FALSE; 612848b8605Smrg flush(ctx); 613848b8605Smrg texObj->Sampler.MaxLod = params[0]; 614848b8605Smrg return GL_TRUE; 615848b8605Smrg 616848b8605Smrg case GL_TEXTURE_PRIORITY: 617848b8605Smrg if (ctx->API != API_OPENGL_COMPAT) 618848b8605Smrg goto invalid_pname; 619848b8605Smrg 620848b8605Smrg flush(ctx); 621848b8605Smrg texObj->Priority = CLAMP(params[0], 0.0F, 1.0F); 622848b8605Smrg return GL_TRUE; 623848b8605Smrg 624848b8605Smrg case GL_TEXTURE_MAX_ANISOTROPY_EXT: 625848b8605Smrg if (ctx->Extensions.EXT_texture_filter_anisotropic) { 626848b8605Smrg if (!target_allows_setting_sampler_parameters(texObj->Target)) 627848b8605Smrg goto invalid_operation; 628848b8605Smrg 629848b8605Smrg if (texObj->Sampler.MaxAnisotropy == params[0]) 630848b8605Smrg return GL_FALSE; 631848b8605Smrg if (params[0] < 1.0) { 632848b8605Smrg _mesa_error(ctx, GL_INVALID_VALUE, "glTexParameter(param)" ); 633848b8605Smrg return GL_FALSE; 634848b8605Smrg } 635848b8605Smrg flush(ctx); 636848b8605Smrg /* clamp to max, that's what NVIDIA does */ 637848b8605Smrg texObj->Sampler.MaxAnisotropy = MIN2(params[0], 638848b8605Smrg ctx->Const.MaxTextureMaxAnisotropy); 639848b8605Smrg return GL_TRUE; 640848b8605Smrg } 641848b8605Smrg else { 642848b8605Smrg static GLuint count = 0; 643848b8605Smrg if (count++ < 10) 644848b8605Smrg goto invalid_pname; 645848b8605Smrg } 646848b8605Smrg return GL_FALSE; 647848b8605Smrg 648848b8605Smrg case GL_TEXTURE_LOD_BIAS: 649848b8605Smrg /* NOTE: this is really part of OpenGL 1.4, not EXT_texture_lod_bias. */ 650848b8605Smrg if (_mesa_is_gles(ctx)) 651848b8605Smrg goto invalid_pname; 652848b8605Smrg 653848b8605Smrg if (!target_allows_setting_sampler_parameters(texObj->Target)) 654848b8605Smrg goto invalid_operation; 655848b8605Smrg 656848b8605Smrg if (texObj->Sampler.LodBias != params[0]) { 657848b8605Smrg flush(ctx); 658848b8605Smrg texObj->Sampler.LodBias = params[0]; 659848b8605Smrg return GL_TRUE; 660848b8605Smrg } 661848b8605Smrg break; 662848b8605Smrg 663848b8605Smrg case GL_TEXTURE_BORDER_COLOR: 664848b8605Smrg if (!_mesa_is_desktop_gl(ctx)) 665848b8605Smrg goto invalid_pname; 666848b8605Smrg 667848b8605Smrg if (!target_allows_setting_sampler_parameters(texObj->Target)) 668848b8605Smrg goto invalid_operation; 669848b8605Smrg 670848b8605Smrg flush(ctx); 671848b8605Smrg /* ARB_texture_float disables clamping */ 672848b8605Smrg if (ctx->Extensions.ARB_texture_float) { 673848b8605Smrg texObj->Sampler.BorderColor.f[RCOMP] = params[0]; 674848b8605Smrg texObj->Sampler.BorderColor.f[GCOMP] = params[1]; 675848b8605Smrg texObj->Sampler.BorderColor.f[BCOMP] = params[2]; 676848b8605Smrg texObj->Sampler.BorderColor.f[ACOMP] = params[3]; 677848b8605Smrg } else { 678848b8605Smrg texObj->Sampler.BorderColor.f[RCOMP] = CLAMP(params[0], 0.0F, 1.0F); 679848b8605Smrg texObj->Sampler.BorderColor.f[GCOMP] = CLAMP(params[1], 0.0F, 1.0F); 680848b8605Smrg texObj->Sampler.BorderColor.f[BCOMP] = CLAMP(params[2], 0.0F, 1.0F); 681848b8605Smrg texObj->Sampler.BorderColor.f[ACOMP] = CLAMP(params[3], 0.0F, 1.0F); 682848b8605Smrg } 683848b8605Smrg return GL_TRUE; 684848b8605Smrg 685848b8605Smrg default: 686848b8605Smrg goto invalid_pname; 687848b8605Smrg } 688848b8605Smrg return GL_FALSE; 689848b8605Smrg 690848b8605Smrginvalid_pname: 691848b8605Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glTexParameter(pname=%s)", 692848b8605Smrg _mesa_lookup_enum_by_nr(pname)); 693848b8605Smrg return GL_FALSE; 694848b8605Smrg 695848b8605Smrginvalid_operation: 696848b8605Smrg _mesa_error(ctx, GL_INVALID_OPERATION, "glTexParameter(pname=%s)", 697848b8605Smrg _mesa_lookup_enum_by_nr(pname)); 698848b8605Smrg return GL_FALSE; 699848b8605Smrg} 700848b8605Smrg 701848b8605Smrg 702848b8605Smrgvoid GLAPIENTRY 703848b8605Smrg_mesa_TexParameterf(GLenum target, GLenum pname, GLfloat param) 704848b8605Smrg{ 705848b8605Smrg GLboolean need_update; 706848b8605Smrg struct gl_texture_object *texObj; 707848b8605Smrg GET_CURRENT_CONTEXT(ctx); 708848b8605Smrg 709848b8605Smrg texObj = get_texobj(ctx, target, GL_FALSE); 710848b8605Smrg if (!texObj) 711848b8605Smrg return; 712848b8605Smrg 713848b8605Smrg switch (pname) { 714848b8605Smrg case GL_TEXTURE_MIN_FILTER: 715848b8605Smrg case GL_TEXTURE_MAG_FILTER: 716848b8605Smrg case GL_TEXTURE_WRAP_S: 717848b8605Smrg case GL_TEXTURE_WRAP_T: 718848b8605Smrg case GL_TEXTURE_WRAP_R: 719848b8605Smrg case GL_TEXTURE_BASE_LEVEL: 720848b8605Smrg case GL_TEXTURE_MAX_LEVEL: 721848b8605Smrg case GL_GENERATE_MIPMAP_SGIS: 722848b8605Smrg case GL_TEXTURE_COMPARE_MODE_ARB: 723848b8605Smrg case GL_TEXTURE_COMPARE_FUNC_ARB: 724848b8605Smrg case GL_DEPTH_TEXTURE_MODE_ARB: 725848b8605Smrg case GL_DEPTH_STENCIL_TEXTURE_MODE: 726848b8605Smrg case GL_TEXTURE_SRGB_DECODE_EXT: 727848b8605Smrg case GL_TEXTURE_CUBE_MAP_SEAMLESS: 728848b8605Smrg case GL_TEXTURE_SWIZZLE_R_EXT: 729848b8605Smrg case GL_TEXTURE_SWIZZLE_G_EXT: 730848b8605Smrg case GL_TEXTURE_SWIZZLE_B_EXT: 731848b8605Smrg case GL_TEXTURE_SWIZZLE_A_EXT: 732848b8605Smrg { 733848b8605Smrg GLint p[4]; 734848b8605Smrg p[0] = (param > 0) ? 735848b8605Smrg ((param > INT_MAX) ? INT_MAX : (GLint) (param + 0.5)) : 736848b8605Smrg ((param < INT_MIN) ? INT_MIN : (GLint) (param - 0.5)); 737848b8605Smrg 738848b8605Smrg p[1] = p[2] = p[3] = 0; 739848b8605Smrg need_update = set_tex_parameteri(ctx, texObj, pname, p); 740848b8605Smrg } 741848b8605Smrg break; 742848b8605Smrg default: 743848b8605Smrg { 744848b8605Smrg /* this will generate an error if pname is illegal */ 745848b8605Smrg GLfloat p[4]; 746848b8605Smrg p[0] = param; 747848b8605Smrg p[1] = p[2] = p[3] = 0.0F; 748848b8605Smrg need_update = set_tex_parameterf(ctx, texObj, pname, p); 749848b8605Smrg } 750848b8605Smrg } 751848b8605Smrg 752848b8605Smrg if (ctx->Driver.TexParameter && need_update) { 753848b8605Smrg ctx->Driver.TexParameter(ctx, texObj, pname, ¶m); 754848b8605Smrg } 755848b8605Smrg} 756848b8605Smrg 757848b8605Smrg 758848b8605Smrgvoid GLAPIENTRY 759848b8605Smrg_mesa_TexParameterfv(GLenum target, GLenum pname, const GLfloat *params) 760848b8605Smrg{ 761848b8605Smrg GLboolean need_update; 762848b8605Smrg struct gl_texture_object *texObj; 763848b8605Smrg GET_CURRENT_CONTEXT(ctx); 764848b8605Smrg 765848b8605Smrg texObj = get_texobj(ctx, target, GL_FALSE); 766848b8605Smrg if (!texObj) 767848b8605Smrg return; 768848b8605Smrg 769848b8605Smrg switch (pname) { 770848b8605Smrg case GL_TEXTURE_MIN_FILTER: 771848b8605Smrg case GL_TEXTURE_MAG_FILTER: 772848b8605Smrg case GL_TEXTURE_WRAP_S: 773848b8605Smrg case GL_TEXTURE_WRAP_T: 774848b8605Smrg case GL_TEXTURE_WRAP_R: 775848b8605Smrg case GL_TEXTURE_BASE_LEVEL: 776848b8605Smrg case GL_TEXTURE_MAX_LEVEL: 777848b8605Smrg case GL_GENERATE_MIPMAP_SGIS: 778848b8605Smrg case GL_TEXTURE_COMPARE_MODE_ARB: 779848b8605Smrg case GL_TEXTURE_COMPARE_FUNC_ARB: 780848b8605Smrg case GL_DEPTH_TEXTURE_MODE_ARB: 781848b8605Smrg case GL_DEPTH_STENCIL_TEXTURE_MODE: 782848b8605Smrg case GL_TEXTURE_SRGB_DECODE_EXT: 783848b8605Smrg case GL_TEXTURE_CUBE_MAP_SEAMLESS: 784848b8605Smrg { 785848b8605Smrg /* convert float param to int */ 786848b8605Smrg GLint p[4]; 787848b8605Smrg p[0] = (GLint) params[0]; 788848b8605Smrg p[1] = p[2] = p[3] = 0; 789848b8605Smrg need_update = set_tex_parameteri(ctx, texObj, pname, p); 790848b8605Smrg } 791848b8605Smrg break; 792848b8605Smrg case GL_TEXTURE_CROP_RECT_OES: 793848b8605Smrg { 794848b8605Smrg /* convert float params to int */ 795848b8605Smrg GLint iparams[4]; 796848b8605Smrg iparams[0] = (GLint) params[0]; 797848b8605Smrg iparams[1] = (GLint) params[1]; 798848b8605Smrg iparams[2] = (GLint) params[2]; 799848b8605Smrg iparams[3] = (GLint) params[3]; 800848b8605Smrg need_update = set_tex_parameteri(ctx, texObj, pname, iparams); 801848b8605Smrg } 802848b8605Smrg break; 803848b8605Smrg case GL_TEXTURE_SWIZZLE_R_EXT: 804848b8605Smrg case GL_TEXTURE_SWIZZLE_G_EXT: 805848b8605Smrg case GL_TEXTURE_SWIZZLE_B_EXT: 806848b8605Smrg case GL_TEXTURE_SWIZZLE_A_EXT: 807848b8605Smrg case GL_TEXTURE_SWIZZLE_RGBA_EXT: 808848b8605Smrg { 809848b8605Smrg GLint p[4] = {0, 0, 0, 0}; 810848b8605Smrg p[0] = (GLint) params[0]; 811848b8605Smrg if (pname == GL_TEXTURE_SWIZZLE_RGBA_EXT) { 812848b8605Smrg p[1] = (GLint) params[1]; 813848b8605Smrg p[2] = (GLint) params[2]; 814848b8605Smrg p[3] = (GLint) params[3]; 815848b8605Smrg } 816848b8605Smrg need_update = set_tex_parameteri(ctx, texObj, pname, p); 817848b8605Smrg } 818848b8605Smrg break; 819848b8605Smrg default: 820848b8605Smrg /* this will generate an error if pname is illegal */ 821848b8605Smrg need_update = set_tex_parameterf(ctx, texObj, pname, params); 822848b8605Smrg } 823848b8605Smrg 824848b8605Smrg if (ctx->Driver.TexParameter && need_update) { 825848b8605Smrg ctx->Driver.TexParameter(ctx, texObj, pname, params); 826848b8605Smrg } 827848b8605Smrg} 828848b8605Smrg 829848b8605Smrg 830848b8605Smrgvoid GLAPIENTRY 831848b8605Smrg_mesa_TexParameteri(GLenum target, GLenum pname, GLint param) 832848b8605Smrg{ 833848b8605Smrg GLboolean need_update; 834848b8605Smrg struct gl_texture_object *texObj; 835848b8605Smrg GET_CURRENT_CONTEXT(ctx); 836848b8605Smrg 837848b8605Smrg texObj = get_texobj(ctx, target, GL_FALSE); 838848b8605Smrg if (!texObj) 839848b8605Smrg return; 840848b8605Smrg 841848b8605Smrg switch (pname) { 842848b8605Smrg case GL_TEXTURE_MIN_LOD: 843848b8605Smrg case GL_TEXTURE_MAX_LOD: 844848b8605Smrg case GL_TEXTURE_PRIORITY: 845848b8605Smrg case GL_TEXTURE_MAX_ANISOTROPY_EXT: 846848b8605Smrg case GL_TEXTURE_LOD_BIAS: 847848b8605Smrg case GL_TEXTURE_COMPARE_FAIL_VALUE_ARB: 848848b8605Smrg { 849848b8605Smrg GLfloat fparam[4]; 850848b8605Smrg fparam[0] = (GLfloat) param; 851848b8605Smrg fparam[1] = fparam[2] = fparam[3] = 0.0F; 852848b8605Smrg /* convert int param to float */ 853848b8605Smrg need_update = set_tex_parameterf(ctx, texObj, pname, fparam); 854848b8605Smrg } 855848b8605Smrg break; 856848b8605Smrg default: 857848b8605Smrg /* this will generate an error if pname is illegal */ 858848b8605Smrg { 859848b8605Smrg GLint iparam[4]; 860848b8605Smrg iparam[0] = param; 861848b8605Smrg iparam[1] = iparam[2] = iparam[3] = 0; 862848b8605Smrg need_update = set_tex_parameteri(ctx, texObj, pname, iparam); 863848b8605Smrg } 864848b8605Smrg } 865848b8605Smrg 866848b8605Smrg if (ctx->Driver.TexParameter && need_update) { 867848b8605Smrg GLfloat fparam = (GLfloat) param; 868848b8605Smrg ctx->Driver.TexParameter(ctx, texObj, pname, &fparam); 869848b8605Smrg } 870848b8605Smrg} 871848b8605Smrg 872848b8605Smrg 873848b8605Smrgvoid GLAPIENTRY 874848b8605Smrg_mesa_TexParameteriv(GLenum target, GLenum pname, const GLint *params) 875848b8605Smrg{ 876848b8605Smrg GLboolean need_update; 877848b8605Smrg struct gl_texture_object *texObj; 878848b8605Smrg GET_CURRENT_CONTEXT(ctx); 879848b8605Smrg 880848b8605Smrg texObj = get_texobj(ctx, target, GL_FALSE); 881848b8605Smrg if (!texObj) 882848b8605Smrg return; 883848b8605Smrg 884848b8605Smrg switch (pname) { 885848b8605Smrg case GL_TEXTURE_BORDER_COLOR: 886848b8605Smrg { 887848b8605Smrg /* convert int params to float */ 888848b8605Smrg GLfloat fparams[4]; 889848b8605Smrg fparams[0] = INT_TO_FLOAT(params[0]); 890848b8605Smrg fparams[1] = INT_TO_FLOAT(params[1]); 891848b8605Smrg fparams[2] = INT_TO_FLOAT(params[2]); 892848b8605Smrg fparams[3] = INT_TO_FLOAT(params[3]); 893848b8605Smrg need_update = set_tex_parameterf(ctx, texObj, pname, fparams); 894848b8605Smrg } 895848b8605Smrg break; 896848b8605Smrg case GL_TEXTURE_MIN_LOD: 897848b8605Smrg case GL_TEXTURE_MAX_LOD: 898848b8605Smrg case GL_TEXTURE_PRIORITY: 899848b8605Smrg case GL_TEXTURE_MAX_ANISOTROPY_EXT: 900848b8605Smrg case GL_TEXTURE_LOD_BIAS: 901848b8605Smrg case GL_TEXTURE_COMPARE_FAIL_VALUE_ARB: 902848b8605Smrg { 903848b8605Smrg /* convert int param to float */ 904848b8605Smrg GLfloat fparams[4]; 905848b8605Smrg fparams[0] = (GLfloat) params[0]; 906848b8605Smrg fparams[1] = fparams[2] = fparams[3] = 0.0F; 907848b8605Smrg need_update = set_tex_parameterf(ctx, texObj, pname, fparams); 908848b8605Smrg } 909848b8605Smrg break; 910848b8605Smrg default: 911848b8605Smrg /* this will generate an error if pname is illegal */ 912848b8605Smrg need_update = set_tex_parameteri(ctx, texObj, pname, params); 913848b8605Smrg } 914848b8605Smrg 915848b8605Smrg if (ctx->Driver.TexParameter && need_update) { 916848b8605Smrg GLfloat fparams[4]; 917848b8605Smrg fparams[0] = INT_TO_FLOAT(params[0]); 918848b8605Smrg if (pname == GL_TEXTURE_BORDER_COLOR || 919848b8605Smrg pname == GL_TEXTURE_CROP_RECT_OES) { 920848b8605Smrg fparams[1] = INT_TO_FLOAT(params[1]); 921848b8605Smrg fparams[2] = INT_TO_FLOAT(params[2]); 922848b8605Smrg fparams[3] = INT_TO_FLOAT(params[3]); 923848b8605Smrg } 924848b8605Smrg ctx->Driver.TexParameter(ctx, texObj, pname, fparams); 925848b8605Smrg } 926848b8605Smrg} 927848b8605Smrg 928848b8605Smrg 929848b8605Smrg/** 930848b8605Smrg * Set tex parameter to integer value(s). Primarily intended to set 931848b8605Smrg * integer-valued texture border color (for integer-valued textures). 932848b8605Smrg * New in GL 3.0. 933848b8605Smrg */ 934848b8605Smrgvoid GLAPIENTRY 935848b8605Smrg_mesa_TexParameterIiv(GLenum target, GLenum pname, const GLint *params) 936848b8605Smrg{ 937848b8605Smrg struct gl_texture_object *texObj; 938848b8605Smrg GET_CURRENT_CONTEXT(ctx); 939848b8605Smrg 940848b8605Smrg texObj = get_texobj(ctx, target, GL_FALSE); 941848b8605Smrg if (!texObj) 942848b8605Smrg return; 943848b8605Smrg 944848b8605Smrg switch (pname) { 945848b8605Smrg case GL_TEXTURE_BORDER_COLOR: 946848b8605Smrg FLUSH_VERTICES(ctx, _NEW_TEXTURE); 947848b8605Smrg /* set the integer-valued border color */ 948848b8605Smrg COPY_4V(texObj->Sampler.BorderColor.i, params); 949848b8605Smrg break; 950848b8605Smrg default: 951848b8605Smrg _mesa_TexParameteriv(target, pname, params); 952848b8605Smrg break; 953848b8605Smrg } 954848b8605Smrg /* XXX no driver hook for TexParameterIiv() yet */ 955848b8605Smrg} 956848b8605Smrg 957848b8605Smrg 958848b8605Smrg/** 959848b8605Smrg * Set tex parameter to unsigned integer value(s). Primarily intended to set 960848b8605Smrg * uint-valued texture border color (for integer-valued textures). 961848b8605Smrg * New in GL 3.0 962848b8605Smrg */ 963848b8605Smrgvoid GLAPIENTRY 964848b8605Smrg_mesa_TexParameterIuiv(GLenum target, GLenum pname, const GLuint *params) 965848b8605Smrg{ 966848b8605Smrg struct gl_texture_object *texObj; 967848b8605Smrg GET_CURRENT_CONTEXT(ctx); 968848b8605Smrg 969848b8605Smrg texObj = get_texobj(ctx, target, GL_FALSE); 970848b8605Smrg if (!texObj) 971848b8605Smrg return; 972848b8605Smrg 973848b8605Smrg switch (pname) { 974848b8605Smrg case GL_TEXTURE_BORDER_COLOR: 975848b8605Smrg FLUSH_VERTICES(ctx, _NEW_TEXTURE); 976848b8605Smrg /* set the unsigned integer-valued border color */ 977848b8605Smrg COPY_4V(texObj->Sampler.BorderColor.ui, params); 978848b8605Smrg break; 979848b8605Smrg default: 980848b8605Smrg _mesa_TexParameteriv(target, pname, (const GLint *) params); 981848b8605Smrg break; 982848b8605Smrg } 983848b8605Smrg /* XXX no driver hook for TexParameterIuiv() yet */ 984848b8605Smrg} 985848b8605Smrg 986848b8605Smrg 987848b8605Smrgstatic GLboolean 988848b8605Smrglegal_get_tex_level_parameter_target(struct gl_context *ctx, GLenum target) 989848b8605Smrg{ 990848b8605Smrg switch (target) { 991848b8605Smrg case GL_TEXTURE_1D: 992848b8605Smrg case GL_PROXY_TEXTURE_1D: 993848b8605Smrg case GL_TEXTURE_2D: 994848b8605Smrg case GL_PROXY_TEXTURE_2D: 995848b8605Smrg case GL_TEXTURE_3D: 996848b8605Smrg case GL_PROXY_TEXTURE_3D: 997848b8605Smrg return GL_TRUE; 998848b8605Smrg case GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB: 999848b8605Smrg case GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB: 1000848b8605Smrg case GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB: 1001848b8605Smrg case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB: 1002848b8605Smrg case GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB: 1003848b8605Smrg case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB: 1004848b8605Smrg case GL_PROXY_TEXTURE_CUBE_MAP_ARB: 1005848b8605Smrg return ctx->Extensions.ARB_texture_cube_map; 1006848b8605Smrg case GL_TEXTURE_CUBE_MAP_ARRAY_ARB: 1007848b8605Smrg case GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB: 1008848b8605Smrg return ctx->Extensions.ARB_texture_cube_map_array; 1009848b8605Smrg case GL_TEXTURE_RECTANGLE_NV: 1010848b8605Smrg case GL_PROXY_TEXTURE_RECTANGLE_NV: 1011848b8605Smrg return ctx->Extensions.NV_texture_rectangle; 1012848b8605Smrg case GL_TEXTURE_1D_ARRAY_EXT: 1013848b8605Smrg case GL_PROXY_TEXTURE_1D_ARRAY_EXT: 1014848b8605Smrg case GL_TEXTURE_2D_ARRAY_EXT: 1015848b8605Smrg case GL_PROXY_TEXTURE_2D_ARRAY_EXT: 1016848b8605Smrg return ctx->Extensions.EXT_texture_array; 1017848b8605Smrg case GL_TEXTURE_BUFFER: 1018848b8605Smrg /* GetTexLevelParameter accepts GL_TEXTURE_BUFFER in GL 3.1+ contexts, 1019848b8605Smrg * but not in earlier versions that expose ARB_texture_buffer_object. 1020848b8605Smrg * 1021848b8605Smrg * From the ARB_texture_buffer_object spec: 1022848b8605Smrg * "(7) Do buffer textures support texture parameters (TexParameter) or 1023848b8605Smrg * queries (GetTexParameter, GetTexLevelParameter, GetTexImage)? 1024848b8605Smrg * 1025848b8605Smrg * RESOLVED: No. [...] Note that the spec edits above don't add 1026848b8605Smrg * explicit error language for any of these cases. That is because 1027848b8605Smrg * each of the functions enumerate the set of valid <target> 1028848b8605Smrg * parameters. Not editing the spec to allow TEXTURE_BUFFER_ARB in 1029848b8605Smrg * these cases means that target is not legal, and an INVALID_ENUM 1030848b8605Smrg * error should be generated." 1031848b8605Smrg * 1032848b8605Smrg * From the OpenGL 3.1 spec: 1033848b8605Smrg * "target may also be TEXTURE_BUFFER, indicating the texture buffer." 1034848b8605Smrg */ 1035848b8605Smrg return ctx->API == API_OPENGL_CORE && ctx->Version >= 31; 1036848b8605Smrg case GL_TEXTURE_2D_MULTISAMPLE: 1037848b8605Smrg case GL_TEXTURE_2D_MULTISAMPLE_ARRAY: 1038848b8605Smrg case GL_PROXY_TEXTURE_2D_MULTISAMPLE: 1039848b8605Smrg case GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY: 1040848b8605Smrg return ctx->Extensions.ARB_texture_multisample; 1041848b8605Smrg default: 1042848b8605Smrg return GL_FALSE; 1043848b8605Smrg } 1044848b8605Smrg} 1045848b8605Smrg 1046848b8605Smrg 1047848b8605Smrgstatic void 1048848b8605Smrgget_tex_level_parameter_image(struct gl_context *ctx, 1049848b8605Smrg const struct gl_texture_object *texObj, 1050848b8605Smrg GLenum target, GLint level, 1051848b8605Smrg GLenum pname, GLint *params) 1052848b8605Smrg{ 1053848b8605Smrg const struct gl_texture_image *img = NULL; 1054848b8605Smrg struct gl_texture_image dummy_image; 1055848b8605Smrg mesa_format texFormat; 1056848b8605Smrg 1057848b8605Smrg img = _mesa_select_tex_image(ctx, texObj, target, level); 1058848b8605Smrg if (!img || img->TexFormat == MESA_FORMAT_NONE) { 1059848b8605Smrg /* In case of undefined texture image return the default values. 1060848b8605Smrg * 1061848b8605Smrg * From OpenGL 4.0 spec, page 398: 1062848b8605Smrg * "The initial internal format of a texel array is RGBA 1063848b8605Smrg * instead of 1. TEXTURE_COMPONENTS is deprecated; always 1064848b8605Smrg * use TEXTURE_INTERNAL_FORMAT." 1065848b8605Smrg */ 1066848b8605Smrg memset(&dummy_image, 0, sizeof(dummy_image)); 1067848b8605Smrg dummy_image.TexFormat = MESA_FORMAT_NONE; 1068848b8605Smrg dummy_image.InternalFormat = GL_RGBA; 1069848b8605Smrg dummy_image._BaseFormat = GL_NONE; 1070848b8605Smrg 1071848b8605Smrg img = &dummy_image; 1072848b8605Smrg } 1073848b8605Smrg 1074848b8605Smrg texFormat = img->TexFormat; 1075848b8605Smrg 1076848b8605Smrg switch (pname) { 1077848b8605Smrg case GL_TEXTURE_WIDTH: 1078848b8605Smrg *params = img->Width; 1079848b8605Smrg break; 1080848b8605Smrg case GL_TEXTURE_HEIGHT: 1081848b8605Smrg *params = img->Height; 1082848b8605Smrg break; 1083848b8605Smrg case GL_TEXTURE_DEPTH: 1084848b8605Smrg *params = img->Depth; 1085848b8605Smrg break; 1086848b8605Smrg case GL_TEXTURE_INTERNAL_FORMAT: 1087848b8605Smrg if (_mesa_is_format_compressed(texFormat)) { 1088848b8605Smrg /* need to return the actual compressed format */ 1089848b8605Smrg *params = _mesa_compressed_format_to_glenum(ctx, texFormat); 1090848b8605Smrg } 1091848b8605Smrg else { 1092848b8605Smrg /* If the true internal format is not compressed but the user 1093848b8605Smrg * requested a generic compressed format, we have to return the 1094848b8605Smrg * generic base format that matches. 1095848b8605Smrg * 1096848b8605Smrg * From page 119 (page 129 of the PDF) of the OpenGL 1.3 spec: 1097848b8605Smrg * 1098848b8605Smrg * "If no specific compressed format is available, 1099848b8605Smrg * internalformat is instead replaced by the corresponding base 1100848b8605Smrg * internal format." 1101848b8605Smrg * 1102848b8605Smrg * Otherwise just return the user's requested internal format 1103848b8605Smrg */ 1104848b8605Smrg const GLenum f = 1105848b8605Smrg _mesa_gl_compressed_format_base_format(img->InternalFormat); 1106848b8605Smrg 1107848b8605Smrg *params = (f != 0) ? f : img->InternalFormat; 1108848b8605Smrg } 1109848b8605Smrg break; 1110848b8605Smrg case GL_TEXTURE_BORDER: 1111848b8605Smrg if (ctx->API != API_OPENGL_COMPAT) 1112848b8605Smrg goto invalid_pname; 1113848b8605Smrg *params = img->Border; 1114848b8605Smrg break; 1115848b8605Smrg case GL_TEXTURE_RED_SIZE: 1116848b8605Smrg case GL_TEXTURE_GREEN_SIZE: 1117848b8605Smrg case GL_TEXTURE_BLUE_SIZE: 1118848b8605Smrg case GL_TEXTURE_ALPHA_SIZE: 1119848b8605Smrg if (_mesa_base_format_has_channel(img->_BaseFormat, pname)) 1120848b8605Smrg *params = _mesa_get_format_bits(texFormat, pname); 1121848b8605Smrg else 1122848b8605Smrg *params = 0; 1123848b8605Smrg break; 1124848b8605Smrg case GL_TEXTURE_INTENSITY_SIZE: 1125848b8605Smrg case GL_TEXTURE_LUMINANCE_SIZE: 1126848b8605Smrg if (ctx->API != API_OPENGL_COMPAT) 1127848b8605Smrg goto invalid_pname; 1128848b8605Smrg if (_mesa_base_format_has_channel(img->_BaseFormat, pname)) { 1129848b8605Smrg *params = _mesa_get_format_bits(texFormat, pname); 1130848b8605Smrg if (*params == 0) { 1131848b8605Smrg /* intensity or luminance is probably stored as RGB[A] */ 1132848b8605Smrg *params = MIN2(_mesa_get_format_bits(texFormat, 1133848b8605Smrg GL_TEXTURE_RED_SIZE), 1134848b8605Smrg _mesa_get_format_bits(texFormat, 1135848b8605Smrg GL_TEXTURE_GREEN_SIZE)); 1136848b8605Smrg } 1137848b8605Smrg } 1138848b8605Smrg else { 1139848b8605Smrg *params = 0; 1140848b8605Smrg } 1141848b8605Smrg break; 1142848b8605Smrg case GL_TEXTURE_DEPTH_SIZE_ARB: 1143848b8605Smrg if (!ctx->Extensions.ARB_depth_texture) 1144848b8605Smrg goto invalid_pname; 1145848b8605Smrg *params = _mesa_get_format_bits(texFormat, pname); 1146848b8605Smrg break; 1147848b8605Smrg case GL_TEXTURE_STENCIL_SIZE: 1148848b8605Smrg *params = _mesa_get_format_bits(texFormat, pname); 1149848b8605Smrg break; 1150848b8605Smrg case GL_TEXTURE_SHARED_SIZE: 1151848b8605Smrg if (ctx->Version < 30 && 1152848b8605Smrg !ctx->Extensions.EXT_texture_shared_exponent) 1153848b8605Smrg goto invalid_pname; 1154848b8605Smrg *params = texFormat == MESA_FORMAT_R9G9B9E5_FLOAT ? 5 : 0; 1155848b8605Smrg break; 1156848b8605Smrg 1157848b8605Smrg /* GL_ARB_texture_compression */ 1158848b8605Smrg case GL_TEXTURE_COMPRESSED_IMAGE_SIZE: 1159848b8605Smrg if (_mesa_is_format_compressed(texFormat) && 1160848b8605Smrg !_mesa_is_proxy_texture(target)) { 1161848b8605Smrg *params = _mesa_format_image_size(texFormat, img->Width, 1162848b8605Smrg img->Height, img->Depth); 1163848b8605Smrg } 1164848b8605Smrg else { 1165848b8605Smrg _mesa_error(ctx, GL_INVALID_OPERATION, 1166848b8605Smrg "glGetTexLevelParameter[if]v(pname)"); 1167848b8605Smrg } 1168848b8605Smrg break; 1169848b8605Smrg case GL_TEXTURE_COMPRESSED: 1170848b8605Smrg *params = (GLint) _mesa_is_format_compressed(texFormat); 1171848b8605Smrg break; 1172848b8605Smrg 1173848b8605Smrg /* GL_ARB_texture_float */ 1174848b8605Smrg case GL_TEXTURE_LUMINANCE_TYPE_ARB: 1175848b8605Smrg case GL_TEXTURE_INTENSITY_TYPE_ARB: 1176848b8605Smrg if (ctx->API != API_OPENGL_COMPAT) 1177848b8605Smrg goto invalid_pname; 1178848b8605Smrg /* FALLTHROUGH */ 1179848b8605Smrg case GL_TEXTURE_RED_TYPE_ARB: 1180848b8605Smrg case GL_TEXTURE_GREEN_TYPE_ARB: 1181848b8605Smrg case GL_TEXTURE_BLUE_TYPE_ARB: 1182848b8605Smrg case GL_TEXTURE_ALPHA_TYPE_ARB: 1183848b8605Smrg case GL_TEXTURE_DEPTH_TYPE_ARB: 1184848b8605Smrg if (!ctx->Extensions.ARB_texture_float) 1185848b8605Smrg goto invalid_pname; 1186848b8605Smrg if (_mesa_base_format_has_channel(img->_BaseFormat, pname)) 1187848b8605Smrg *params = _mesa_get_format_datatype(texFormat); 1188848b8605Smrg else 1189848b8605Smrg *params = GL_NONE; 1190848b8605Smrg break; 1191848b8605Smrg 1192848b8605Smrg /* GL_ARB_texture_multisample */ 1193848b8605Smrg case GL_TEXTURE_SAMPLES: 1194848b8605Smrg if (!ctx->Extensions.ARB_texture_multisample) 1195848b8605Smrg goto invalid_pname; 1196848b8605Smrg *params = img->NumSamples; 1197848b8605Smrg break; 1198848b8605Smrg 1199848b8605Smrg case GL_TEXTURE_FIXED_SAMPLE_LOCATIONS: 1200848b8605Smrg if (!ctx->Extensions.ARB_texture_multisample) 1201848b8605Smrg goto invalid_pname; 1202848b8605Smrg *params = img->FixedSampleLocations; 1203848b8605Smrg break; 1204848b8605Smrg 1205848b8605Smrg default: 1206848b8605Smrg goto invalid_pname; 1207848b8605Smrg } 1208848b8605Smrg 1209848b8605Smrg /* no error if we get here */ 1210848b8605Smrg return; 1211848b8605Smrg 1212848b8605Smrginvalid_pname: 1213848b8605Smrg _mesa_error(ctx, GL_INVALID_ENUM, 1214848b8605Smrg "glGetTexLevelParameter[if]v(pname=%s)", 1215848b8605Smrg _mesa_lookup_enum_by_nr(pname)); 1216848b8605Smrg} 1217848b8605Smrg 1218848b8605Smrg 1219848b8605Smrgstatic void 1220848b8605Smrgget_tex_level_parameter_buffer(struct gl_context *ctx, 1221848b8605Smrg const struct gl_texture_object *texObj, 1222848b8605Smrg GLenum pname, GLint *params) 1223848b8605Smrg{ 1224848b8605Smrg const struct gl_buffer_object *bo = texObj->BufferObject; 1225848b8605Smrg mesa_format texFormat = texObj->_BufferObjectFormat; 1226848b8605Smrg GLenum internalFormat = texObj->BufferObjectFormat; 1227848b8605Smrg GLenum baseFormat = _mesa_get_format_base_format(texFormat); 1228848b8605Smrg 1229848b8605Smrg if (!bo) { 1230848b8605Smrg /* undefined texture buffer object */ 1231848b8605Smrg *params = pname == GL_TEXTURE_COMPONENTS ? 1 : 0; 1232848b8605Smrg return; 1233848b8605Smrg } 1234848b8605Smrg 1235848b8605Smrg switch (pname) { 1236848b8605Smrg case GL_TEXTURE_BUFFER_DATA_STORE_BINDING: 1237848b8605Smrg *params = bo->Name; 1238848b8605Smrg break; 1239848b8605Smrg case GL_TEXTURE_WIDTH: 1240848b8605Smrg *params = bo->Size; 1241848b8605Smrg break; 1242848b8605Smrg case GL_TEXTURE_HEIGHT: 1243848b8605Smrg case GL_TEXTURE_DEPTH: 1244848b8605Smrg case GL_TEXTURE_BORDER: 1245848b8605Smrg case GL_TEXTURE_SHARED_SIZE: 1246848b8605Smrg case GL_TEXTURE_COMPRESSED: 1247848b8605Smrg *params = 0; 1248848b8605Smrg break; 1249848b8605Smrg case GL_TEXTURE_INTERNAL_FORMAT: 1250848b8605Smrg *params = internalFormat; 1251848b8605Smrg break; 1252848b8605Smrg case GL_TEXTURE_RED_SIZE: 1253848b8605Smrg case GL_TEXTURE_GREEN_SIZE: 1254848b8605Smrg case GL_TEXTURE_BLUE_SIZE: 1255848b8605Smrg case GL_TEXTURE_ALPHA_SIZE: 1256848b8605Smrg if (_mesa_base_format_has_channel(baseFormat, pname)) 1257848b8605Smrg *params = _mesa_get_format_bits(texFormat, pname); 1258848b8605Smrg else 1259848b8605Smrg *params = 0; 1260848b8605Smrg break; 1261848b8605Smrg case GL_TEXTURE_INTENSITY_SIZE: 1262848b8605Smrg case GL_TEXTURE_LUMINANCE_SIZE: 1263848b8605Smrg if (_mesa_base_format_has_channel(baseFormat, pname)) { 1264848b8605Smrg *params = _mesa_get_format_bits(texFormat, pname); 1265848b8605Smrg if (*params == 0) { 1266848b8605Smrg /* intensity or luminance is probably stored as RGB[A] */ 1267848b8605Smrg *params = MIN2(_mesa_get_format_bits(texFormat, 1268848b8605Smrg GL_TEXTURE_RED_SIZE), 1269848b8605Smrg _mesa_get_format_bits(texFormat, 1270848b8605Smrg GL_TEXTURE_GREEN_SIZE)); 1271848b8605Smrg } 1272848b8605Smrg } else { 1273848b8605Smrg *params = 0; 1274848b8605Smrg } 1275848b8605Smrg break; 1276848b8605Smrg case GL_TEXTURE_DEPTH_SIZE_ARB: 1277848b8605Smrg case GL_TEXTURE_STENCIL_SIZE_EXT: 1278848b8605Smrg *params = _mesa_get_format_bits(texFormat, pname); 1279848b8605Smrg break; 1280848b8605Smrg 1281848b8605Smrg /* GL_ARB_texture_buffer_range */ 1282848b8605Smrg case GL_TEXTURE_BUFFER_OFFSET: 1283848b8605Smrg if (!ctx->Extensions.ARB_texture_buffer_range) 1284848b8605Smrg goto invalid_pname; 1285848b8605Smrg *params = texObj->BufferOffset; 1286848b8605Smrg break; 1287848b8605Smrg case GL_TEXTURE_BUFFER_SIZE: 1288848b8605Smrg if (!ctx->Extensions.ARB_texture_buffer_range) 1289848b8605Smrg goto invalid_pname; 1290848b8605Smrg *params = (texObj->BufferSize == -1) ? bo->Size : texObj->BufferSize; 1291848b8605Smrg break; 1292848b8605Smrg 1293848b8605Smrg /* GL_ARB_texture_compression */ 1294848b8605Smrg case GL_TEXTURE_COMPRESSED_IMAGE_SIZE: 1295848b8605Smrg /* Always illegal for GL_TEXTURE_BUFFER */ 1296848b8605Smrg _mesa_error(ctx, GL_INVALID_OPERATION, 1297848b8605Smrg "glGetTexLevelParameter[if]v(pname)"); 1298848b8605Smrg break; 1299848b8605Smrg 1300848b8605Smrg /* GL_ARB_texture_float */ 1301848b8605Smrg case GL_TEXTURE_RED_TYPE_ARB: 1302848b8605Smrg case GL_TEXTURE_GREEN_TYPE_ARB: 1303848b8605Smrg case GL_TEXTURE_BLUE_TYPE_ARB: 1304848b8605Smrg case GL_TEXTURE_ALPHA_TYPE_ARB: 1305848b8605Smrg case GL_TEXTURE_LUMINANCE_TYPE_ARB: 1306848b8605Smrg case GL_TEXTURE_INTENSITY_TYPE_ARB: 1307848b8605Smrg case GL_TEXTURE_DEPTH_TYPE_ARB: 1308848b8605Smrg if (!ctx->Extensions.ARB_texture_float) 1309848b8605Smrg goto invalid_pname; 1310848b8605Smrg if (_mesa_base_format_has_channel(baseFormat, pname)) 1311848b8605Smrg *params = _mesa_get_format_datatype(texFormat); 1312848b8605Smrg else 1313848b8605Smrg *params = GL_NONE; 1314848b8605Smrg break; 1315848b8605Smrg 1316848b8605Smrg default: 1317848b8605Smrg goto invalid_pname; 1318848b8605Smrg } 1319848b8605Smrg 1320848b8605Smrg /* no error if we get here */ 1321848b8605Smrg return; 1322848b8605Smrg 1323848b8605Smrginvalid_pname: 1324848b8605Smrg _mesa_error(ctx, GL_INVALID_ENUM, 1325848b8605Smrg "glGetTexLevelParameter[if]v(pname=%s)", 1326848b8605Smrg _mesa_lookup_enum_by_nr(pname)); 1327848b8605Smrg} 1328848b8605Smrg 1329848b8605Smrg 1330848b8605Smrgvoid GLAPIENTRY 1331848b8605Smrg_mesa_GetTexLevelParameterfv( GLenum target, GLint level, 1332848b8605Smrg GLenum pname, GLfloat *params ) 1333848b8605Smrg{ 1334848b8605Smrg GLint iparam; 1335848b8605Smrg _mesa_GetTexLevelParameteriv( target, level, pname, &iparam ); 1336848b8605Smrg *params = (GLfloat) iparam; 1337848b8605Smrg} 1338848b8605Smrg 1339848b8605Smrg 1340848b8605Smrgvoid GLAPIENTRY 1341848b8605Smrg_mesa_GetTexLevelParameteriv( GLenum target, GLint level, 1342848b8605Smrg GLenum pname, GLint *params ) 1343848b8605Smrg{ 1344848b8605Smrg struct gl_texture_object *texObj; 1345848b8605Smrg GLint maxLevels; 1346848b8605Smrg GET_CURRENT_CONTEXT(ctx); 1347848b8605Smrg 1348848b8605Smrg if (ctx->Texture.CurrentUnit >= ctx->Const.MaxCombinedTextureImageUnits) { 1349848b8605Smrg _mesa_error(ctx, GL_INVALID_OPERATION, 1350848b8605Smrg "glGetTexLevelParameteriv(current unit)"); 1351848b8605Smrg return; 1352848b8605Smrg } 1353848b8605Smrg 1354848b8605Smrg if (!legal_get_tex_level_parameter_target(ctx, target)) { 1355848b8605Smrg _mesa_error(ctx, GL_INVALID_ENUM, 1356848b8605Smrg "glGetTexLevelParameter[if]v(target=0x%x)", target); 1357848b8605Smrg return; 1358848b8605Smrg } 1359848b8605Smrg 1360848b8605Smrg maxLevels = _mesa_max_texture_levels(ctx, target); 1361848b8605Smrg assert(maxLevels != 0); 1362848b8605Smrg 1363848b8605Smrg if (level < 0 || level >= maxLevels) { 1364848b8605Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glGetTexLevelParameter[if]v" ); 1365848b8605Smrg return; 1366848b8605Smrg } 1367848b8605Smrg 1368848b8605Smrg texObj = _mesa_get_current_tex_object(ctx, target); 1369848b8605Smrg 1370848b8605Smrg if (target == GL_TEXTURE_BUFFER) 1371848b8605Smrg get_tex_level_parameter_buffer(ctx, texObj, pname, params); 1372848b8605Smrg else 1373848b8605Smrg get_tex_level_parameter_image(ctx, texObj, target, level, pname, params); 1374848b8605Smrg} 1375848b8605Smrg 1376848b8605Smrg 1377848b8605Smrgvoid GLAPIENTRY 1378848b8605Smrg_mesa_GetTexParameterfv( GLenum target, GLenum pname, GLfloat *params ) 1379848b8605Smrg{ 1380848b8605Smrg struct gl_texture_object *obj; 1381848b8605Smrg GET_CURRENT_CONTEXT(ctx); 1382848b8605Smrg 1383848b8605Smrg obj = get_texobj(ctx, target, GL_TRUE); 1384848b8605Smrg if (!obj) 1385848b8605Smrg return; 1386848b8605Smrg 1387848b8605Smrg _mesa_lock_context_textures(ctx); 1388848b8605Smrg switch (pname) { 1389848b8605Smrg case GL_TEXTURE_MAG_FILTER: 1390848b8605Smrg *params = ENUM_TO_FLOAT(obj->Sampler.MagFilter); 1391848b8605Smrg break; 1392848b8605Smrg case GL_TEXTURE_MIN_FILTER: 1393848b8605Smrg *params = ENUM_TO_FLOAT(obj->Sampler.MinFilter); 1394848b8605Smrg break; 1395848b8605Smrg case GL_TEXTURE_WRAP_S: 1396848b8605Smrg *params = ENUM_TO_FLOAT(obj->Sampler.WrapS); 1397848b8605Smrg break; 1398848b8605Smrg case GL_TEXTURE_WRAP_T: 1399848b8605Smrg *params = ENUM_TO_FLOAT(obj->Sampler.WrapT); 1400848b8605Smrg break; 1401848b8605Smrg case GL_TEXTURE_WRAP_R: 1402848b8605Smrg *params = ENUM_TO_FLOAT(obj->Sampler.WrapR); 1403848b8605Smrg break; 1404848b8605Smrg case GL_TEXTURE_BORDER_COLOR: 1405848b8605Smrg if (!_mesa_is_desktop_gl(ctx)) 1406848b8605Smrg goto invalid_pname; 1407848b8605Smrg 1408848b8605Smrg if (ctx->NewState & (_NEW_BUFFERS | _NEW_FRAG_CLAMP)) 1409848b8605Smrg _mesa_update_state_locked(ctx); 1410848b8605Smrg if (_mesa_get_clamp_fragment_color(ctx)) { 1411848b8605Smrg params[0] = CLAMP(obj->Sampler.BorderColor.f[0], 0.0F, 1.0F); 1412848b8605Smrg params[1] = CLAMP(obj->Sampler.BorderColor.f[1], 0.0F, 1.0F); 1413848b8605Smrg params[2] = CLAMP(obj->Sampler.BorderColor.f[2], 0.0F, 1.0F); 1414848b8605Smrg params[3] = CLAMP(obj->Sampler.BorderColor.f[3], 0.0F, 1.0F); 1415848b8605Smrg } 1416848b8605Smrg else { 1417848b8605Smrg params[0] = obj->Sampler.BorderColor.f[0]; 1418848b8605Smrg params[1] = obj->Sampler.BorderColor.f[1]; 1419848b8605Smrg params[2] = obj->Sampler.BorderColor.f[2]; 1420848b8605Smrg params[3] = obj->Sampler.BorderColor.f[3]; 1421848b8605Smrg } 1422848b8605Smrg break; 1423848b8605Smrg case GL_TEXTURE_RESIDENT: 1424848b8605Smrg if (ctx->API != API_OPENGL_COMPAT) 1425848b8605Smrg goto invalid_pname; 1426848b8605Smrg 1427848b8605Smrg *params = 1.0F; 1428848b8605Smrg break; 1429848b8605Smrg case GL_TEXTURE_PRIORITY: 1430848b8605Smrg if (ctx->API != API_OPENGL_COMPAT) 1431848b8605Smrg goto invalid_pname; 1432848b8605Smrg 1433848b8605Smrg *params = obj->Priority; 1434848b8605Smrg break; 1435848b8605Smrg case GL_TEXTURE_MIN_LOD: 1436848b8605Smrg if (!_mesa_is_desktop_gl(ctx) && !_mesa_is_gles3(ctx)) 1437848b8605Smrg goto invalid_pname; 1438848b8605Smrg 1439848b8605Smrg *params = obj->Sampler.MinLod; 1440848b8605Smrg break; 1441848b8605Smrg case GL_TEXTURE_MAX_LOD: 1442848b8605Smrg if (!_mesa_is_desktop_gl(ctx) && !_mesa_is_gles3(ctx)) 1443848b8605Smrg goto invalid_pname; 1444848b8605Smrg 1445848b8605Smrg *params = obj->Sampler.MaxLod; 1446848b8605Smrg break; 1447848b8605Smrg case GL_TEXTURE_BASE_LEVEL: 1448848b8605Smrg if (!_mesa_is_desktop_gl(ctx) && !_mesa_is_gles3(ctx)) 1449848b8605Smrg goto invalid_pname; 1450848b8605Smrg 1451848b8605Smrg *params = (GLfloat) obj->BaseLevel; 1452848b8605Smrg break; 1453848b8605Smrg case GL_TEXTURE_MAX_LEVEL: 1454848b8605Smrg *params = (GLfloat) obj->MaxLevel; 1455848b8605Smrg break; 1456848b8605Smrg case GL_TEXTURE_MAX_ANISOTROPY_EXT: 1457848b8605Smrg if (!ctx->Extensions.EXT_texture_filter_anisotropic) 1458848b8605Smrg goto invalid_pname; 1459848b8605Smrg *params = obj->Sampler.MaxAnisotropy; 1460848b8605Smrg break; 1461848b8605Smrg case GL_GENERATE_MIPMAP_SGIS: 1462848b8605Smrg if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES) 1463848b8605Smrg goto invalid_pname; 1464848b8605Smrg 1465848b8605Smrg *params = (GLfloat) obj->GenerateMipmap; 1466848b8605Smrg break; 1467848b8605Smrg case GL_TEXTURE_COMPARE_MODE_ARB: 1468848b8605Smrg if ((!_mesa_is_desktop_gl(ctx) || !ctx->Extensions.ARB_shadow) 1469848b8605Smrg && !_mesa_is_gles3(ctx)) 1470848b8605Smrg goto invalid_pname; 1471848b8605Smrg *params = (GLfloat) obj->Sampler.CompareMode; 1472848b8605Smrg break; 1473848b8605Smrg case GL_TEXTURE_COMPARE_FUNC_ARB: 1474848b8605Smrg if ((!_mesa_is_desktop_gl(ctx) || !ctx->Extensions.ARB_shadow) 1475848b8605Smrg && !_mesa_is_gles3(ctx)) 1476848b8605Smrg goto invalid_pname; 1477848b8605Smrg *params = (GLfloat) obj->Sampler.CompareFunc; 1478848b8605Smrg break; 1479848b8605Smrg case GL_DEPTH_TEXTURE_MODE_ARB: 1480848b8605Smrg /* GL_DEPTH_TEXTURE_MODE_ARB is removed in core-profile and it has 1481848b8605Smrg * never existed in OpenGL ES. 1482848b8605Smrg */ 1483848b8605Smrg if (ctx->API != API_OPENGL_COMPAT || !ctx->Extensions.ARB_depth_texture) 1484848b8605Smrg goto invalid_pname; 1485848b8605Smrg *params = (GLfloat) obj->DepthMode; 1486848b8605Smrg break; 1487848b8605Smrg case GL_DEPTH_STENCIL_TEXTURE_MODE: 1488848b8605Smrg if (!_mesa_is_desktop_gl(ctx) || !ctx->Extensions.ARB_stencil_texturing) 1489848b8605Smrg goto invalid_pname; 1490848b8605Smrg *params = (GLfloat) 1491848b8605Smrg (obj->StencilSampling ? GL_STENCIL_INDEX : GL_DEPTH_COMPONENT); 1492848b8605Smrg break; 1493848b8605Smrg case GL_TEXTURE_LOD_BIAS: 1494848b8605Smrg if (_mesa_is_gles(ctx)) 1495848b8605Smrg goto invalid_pname; 1496848b8605Smrg 1497848b8605Smrg *params = obj->Sampler.LodBias; 1498848b8605Smrg break; 1499848b8605Smrg case GL_TEXTURE_CROP_RECT_OES: 1500848b8605Smrg if (ctx->API != API_OPENGLES || !ctx->Extensions.OES_draw_texture) 1501848b8605Smrg goto invalid_pname; 1502848b8605Smrg 1503848b8605Smrg params[0] = (GLfloat) obj->CropRect[0]; 1504848b8605Smrg params[1] = (GLfloat) obj->CropRect[1]; 1505848b8605Smrg params[2] = (GLfloat) obj->CropRect[2]; 1506848b8605Smrg params[3] = (GLfloat) obj->CropRect[3]; 1507848b8605Smrg break; 1508848b8605Smrg 1509848b8605Smrg case GL_TEXTURE_SWIZZLE_R_EXT: 1510848b8605Smrg case GL_TEXTURE_SWIZZLE_G_EXT: 1511848b8605Smrg case GL_TEXTURE_SWIZZLE_B_EXT: 1512848b8605Smrg case GL_TEXTURE_SWIZZLE_A_EXT: 1513848b8605Smrg if ((!_mesa_is_desktop_gl(ctx) 1514848b8605Smrg || !ctx->Extensions.EXT_texture_swizzle) 1515848b8605Smrg && !_mesa_is_gles3(ctx)) 1516848b8605Smrg goto invalid_pname; 1517848b8605Smrg *params = (GLfloat) obj->Swizzle[pname - GL_TEXTURE_SWIZZLE_R_EXT]; 1518848b8605Smrg break; 1519848b8605Smrg 1520848b8605Smrg case GL_TEXTURE_SWIZZLE_RGBA_EXT: 1521848b8605Smrg if ((!_mesa_is_desktop_gl(ctx) 1522848b8605Smrg || !ctx->Extensions.EXT_texture_swizzle) 1523848b8605Smrg && !_mesa_is_gles3(ctx)) { 1524848b8605Smrg goto invalid_pname; 1525848b8605Smrg } 1526848b8605Smrg else { 1527848b8605Smrg GLuint comp; 1528848b8605Smrg for (comp = 0; comp < 4; comp++) { 1529848b8605Smrg params[comp] = (GLfloat) obj->Swizzle[comp]; 1530848b8605Smrg } 1531848b8605Smrg } 1532848b8605Smrg break; 1533848b8605Smrg 1534848b8605Smrg case GL_TEXTURE_CUBE_MAP_SEAMLESS: 1535848b8605Smrg if (!_mesa_is_desktop_gl(ctx) 1536848b8605Smrg || !ctx->Extensions.AMD_seamless_cubemap_per_texture) 1537848b8605Smrg goto invalid_pname; 1538848b8605Smrg *params = (GLfloat) obj->Sampler.CubeMapSeamless; 1539848b8605Smrg break; 1540848b8605Smrg 1541848b8605Smrg case GL_TEXTURE_IMMUTABLE_FORMAT: 1542848b8605Smrg *params = (GLfloat) obj->Immutable; 1543848b8605Smrg break; 1544848b8605Smrg 1545848b8605Smrg case GL_TEXTURE_IMMUTABLE_LEVELS: 1546848b8605Smrg if (_mesa_is_gles3(ctx) || 1547848b8605Smrg (_mesa_is_desktop_gl(ctx) && ctx->Extensions.ARB_texture_view)) 1548848b8605Smrg *params = (GLfloat) obj->ImmutableLevels; 1549848b8605Smrg else 1550848b8605Smrg goto invalid_pname; 1551848b8605Smrg break; 1552848b8605Smrg 1553848b8605Smrg case GL_TEXTURE_VIEW_MIN_LEVEL: 1554848b8605Smrg if (!ctx->Extensions.ARB_texture_view) 1555848b8605Smrg goto invalid_pname; 1556848b8605Smrg *params = (GLfloat) obj->MinLevel; 1557848b8605Smrg break; 1558848b8605Smrg 1559848b8605Smrg case GL_TEXTURE_VIEW_NUM_LEVELS: 1560848b8605Smrg if (!ctx->Extensions.ARB_texture_view) 1561848b8605Smrg goto invalid_pname; 1562848b8605Smrg *params = (GLfloat) obj->NumLevels; 1563848b8605Smrg break; 1564848b8605Smrg 1565848b8605Smrg case GL_TEXTURE_VIEW_MIN_LAYER: 1566848b8605Smrg if (!ctx->Extensions.ARB_texture_view) 1567848b8605Smrg goto invalid_pname; 1568848b8605Smrg *params = (GLfloat) obj->MinLayer; 1569848b8605Smrg break; 1570848b8605Smrg 1571848b8605Smrg case GL_TEXTURE_VIEW_NUM_LAYERS: 1572848b8605Smrg if (!ctx->Extensions.ARB_texture_view) 1573848b8605Smrg goto invalid_pname; 1574848b8605Smrg *params = (GLfloat) obj->NumLayers; 1575848b8605Smrg break; 1576848b8605Smrg 1577848b8605Smrg case GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES: 1578848b8605Smrg if (!_mesa_is_gles(ctx) || !ctx->Extensions.OES_EGL_image_external) 1579848b8605Smrg goto invalid_pname; 1580848b8605Smrg *params = (GLfloat) obj->RequiredTextureImageUnits; 1581848b8605Smrg break; 1582848b8605Smrg 1583848b8605Smrg case GL_TEXTURE_SRGB_DECODE_EXT: 1584848b8605Smrg if (!ctx->Extensions.EXT_texture_sRGB_decode) 1585848b8605Smrg goto invalid_pname; 1586848b8605Smrg *params = (GLfloat) obj->Sampler.sRGBDecode; 1587848b8605Smrg break; 1588848b8605Smrg 1589848b8605Smrg default: 1590848b8605Smrg goto invalid_pname; 1591848b8605Smrg } 1592848b8605Smrg 1593848b8605Smrg /* no error if we get here */ 1594848b8605Smrg _mesa_unlock_context_textures(ctx); 1595848b8605Smrg return; 1596848b8605Smrg 1597848b8605Smrginvalid_pname: 1598848b8605Smrg _mesa_unlock_context_textures(ctx); 1599848b8605Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexParameterfv(pname=0x%x)", pname); 1600848b8605Smrg} 1601848b8605Smrg 1602848b8605Smrg 1603848b8605Smrgvoid GLAPIENTRY 1604848b8605Smrg_mesa_GetTexParameteriv( GLenum target, GLenum pname, GLint *params ) 1605848b8605Smrg{ 1606848b8605Smrg struct gl_texture_object *obj; 1607848b8605Smrg GET_CURRENT_CONTEXT(ctx); 1608848b8605Smrg 1609848b8605Smrg obj = get_texobj(ctx, target, GL_TRUE); 1610848b8605Smrg if (!obj) 1611848b8605Smrg return; 1612848b8605Smrg 1613848b8605Smrg _mesa_lock_texture(ctx, obj); 1614848b8605Smrg switch (pname) { 1615848b8605Smrg case GL_TEXTURE_MAG_FILTER: 1616848b8605Smrg *params = (GLint) obj->Sampler.MagFilter; 1617848b8605Smrg break; 1618848b8605Smrg case GL_TEXTURE_MIN_FILTER: 1619848b8605Smrg *params = (GLint) obj->Sampler.MinFilter; 1620848b8605Smrg break; 1621848b8605Smrg case GL_TEXTURE_WRAP_S: 1622848b8605Smrg *params = (GLint) obj->Sampler.WrapS; 1623848b8605Smrg break; 1624848b8605Smrg case GL_TEXTURE_WRAP_T: 1625848b8605Smrg *params = (GLint) obj->Sampler.WrapT; 1626848b8605Smrg break; 1627848b8605Smrg case GL_TEXTURE_WRAP_R: 1628848b8605Smrg *params = (GLint) obj->Sampler.WrapR; 1629848b8605Smrg break; 1630848b8605Smrg case GL_TEXTURE_BORDER_COLOR: 1631848b8605Smrg if (!_mesa_is_desktop_gl(ctx)) 1632848b8605Smrg goto invalid_pname; 1633848b8605Smrg 1634848b8605Smrg { 1635848b8605Smrg GLfloat b[4]; 1636848b8605Smrg b[0] = CLAMP(obj->Sampler.BorderColor.f[0], 0.0F, 1.0F); 1637848b8605Smrg b[1] = CLAMP(obj->Sampler.BorderColor.f[1], 0.0F, 1.0F); 1638848b8605Smrg b[2] = CLAMP(obj->Sampler.BorderColor.f[2], 0.0F, 1.0F); 1639848b8605Smrg b[3] = CLAMP(obj->Sampler.BorderColor.f[3], 0.0F, 1.0F); 1640848b8605Smrg params[0] = FLOAT_TO_INT(b[0]); 1641848b8605Smrg params[1] = FLOAT_TO_INT(b[1]); 1642848b8605Smrg params[2] = FLOAT_TO_INT(b[2]); 1643848b8605Smrg params[3] = FLOAT_TO_INT(b[3]); 1644848b8605Smrg } 1645848b8605Smrg break; 1646848b8605Smrg case GL_TEXTURE_RESIDENT: 1647848b8605Smrg if (ctx->API != API_OPENGL_COMPAT) 1648848b8605Smrg goto invalid_pname; 1649848b8605Smrg 1650848b8605Smrg *params = 1; 1651848b8605Smrg break; 1652848b8605Smrg case GL_TEXTURE_PRIORITY: 1653848b8605Smrg if (ctx->API != API_OPENGL_COMPAT) 1654848b8605Smrg goto invalid_pname; 1655848b8605Smrg 1656848b8605Smrg *params = FLOAT_TO_INT(obj->Priority); 1657848b8605Smrg break; 1658848b8605Smrg case GL_TEXTURE_MIN_LOD: 1659848b8605Smrg if (!_mesa_is_desktop_gl(ctx) && !_mesa_is_gles3(ctx)) 1660848b8605Smrg goto invalid_pname; 1661848b8605Smrg 1662848b8605Smrg *params = (GLint) obj->Sampler.MinLod; 1663848b8605Smrg break; 1664848b8605Smrg case GL_TEXTURE_MAX_LOD: 1665848b8605Smrg if (!_mesa_is_desktop_gl(ctx) && !_mesa_is_gles3(ctx)) 1666848b8605Smrg goto invalid_pname; 1667848b8605Smrg 1668848b8605Smrg *params = (GLint) obj->Sampler.MaxLod; 1669848b8605Smrg break; 1670848b8605Smrg case GL_TEXTURE_BASE_LEVEL: 1671848b8605Smrg if (!_mesa_is_desktop_gl(ctx) && !_mesa_is_gles3(ctx)) 1672848b8605Smrg goto invalid_pname; 1673848b8605Smrg 1674848b8605Smrg *params = obj->BaseLevel; 1675848b8605Smrg break; 1676848b8605Smrg case GL_TEXTURE_MAX_LEVEL: 1677848b8605Smrg *params = obj->MaxLevel; 1678848b8605Smrg break; 1679848b8605Smrg case GL_TEXTURE_MAX_ANISOTROPY_EXT: 1680848b8605Smrg if (!ctx->Extensions.EXT_texture_filter_anisotropic) 1681848b8605Smrg goto invalid_pname; 1682848b8605Smrg *params = (GLint) obj->Sampler.MaxAnisotropy; 1683848b8605Smrg break; 1684848b8605Smrg case GL_GENERATE_MIPMAP_SGIS: 1685848b8605Smrg if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES) 1686848b8605Smrg goto invalid_pname; 1687848b8605Smrg 1688848b8605Smrg *params = (GLint) obj->GenerateMipmap; 1689848b8605Smrg break; 1690848b8605Smrg case GL_TEXTURE_COMPARE_MODE_ARB: 1691848b8605Smrg if ((!_mesa_is_desktop_gl(ctx) || !ctx->Extensions.ARB_shadow) 1692848b8605Smrg && !_mesa_is_gles3(ctx)) 1693848b8605Smrg goto invalid_pname; 1694848b8605Smrg *params = (GLint) obj->Sampler.CompareMode; 1695848b8605Smrg break; 1696848b8605Smrg case GL_TEXTURE_COMPARE_FUNC_ARB: 1697848b8605Smrg if ((!_mesa_is_desktop_gl(ctx) || !ctx->Extensions.ARB_shadow) 1698848b8605Smrg && !_mesa_is_gles3(ctx)) 1699848b8605Smrg goto invalid_pname; 1700848b8605Smrg *params = (GLint) obj->Sampler.CompareFunc; 1701848b8605Smrg break; 1702848b8605Smrg case GL_DEPTH_TEXTURE_MODE_ARB: 1703848b8605Smrg if (ctx->API != API_OPENGL_COMPAT || !ctx->Extensions.ARB_depth_texture) 1704848b8605Smrg goto invalid_pname; 1705848b8605Smrg *params = (GLint) obj->DepthMode; 1706848b8605Smrg break; 1707848b8605Smrg case GL_DEPTH_STENCIL_TEXTURE_MODE: 1708848b8605Smrg if (!_mesa_is_desktop_gl(ctx) || !ctx->Extensions.ARB_stencil_texturing) 1709848b8605Smrg goto invalid_pname; 1710848b8605Smrg *params = (GLint) 1711848b8605Smrg (obj->StencilSampling ? GL_STENCIL_INDEX : GL_DEPTH_COMPONENT); 1712848b8605Smrg break; 1713848b8605Smrg case GL_TEXTURE_LOD_BIAS: 1714848b8605Smrg if (_mesa_is_gles(ctx)) 1715848b8605Smrg goto invalid_pname; 1716848b8605Smrg 1717848b8605Smrg /* GL spec 'Data Conversions' section specifies that floating-point 1718848b8605Smrg * value in integer Get function is rounded to nearest integer 1719848b8605Smrg */ 1720848b8605Smrg *params = IROUND(obj->Sampler.LodBias); 1721848b8605Smrg break; 1722848b8605Smrg case GL_TEXTURE_CROP_RECT_OES: 1723848b8605Smrg if (ctx->API != API_OPENGLES || !ctx->Extensions.OES_draw_texture) 1724848b8605Smrg goto invalid_pname; 1725848b8605Smrg 1726848b8605Smrg params[0] = obj->CropRect[0]; 1727848b8605Smrg params[1] = obj->CropRect[1]; 1728848b8605Smrg params[2] = obj->CropRect[2]; 1729848b8605Smrg params[3] = obj->CropRect[3]; 1730848b8605Smrg break; 1731848b8605Smrg case GL_TEXTURE_SWIZZLE_R_EXT: 1732848b8605Smrg case GL_TEXTURE_SWIZZLE_G_EXT: 1733848b8605Smrg case GL_TEXTURE_SWIZZLE_B_EXT: 1734848b8605Smrg case GL_TEXTURE_SWIZZLE_A_EXT: 1735848b8605Smrg if ((!_mesa_is_desktop_gl(ctx) 1736848b8605Smrg || !ctx->Extensions.EXT_texture_swizzle) 1737848b8605Smrg && !_mesa_is_gles3(ctx)) 1738848b8605Smrg goto invalid_pname; 1739848b8605Smrg *params = obj->Swizzle[pname - GL_TEXTURE_SWIZZLE_R_EXT]; 1740848b8605Smrg break; 1741848b8605Smrg 1742848b8605Smrg case GL_TEXTURE_SWIZZLE_RGBA_EXT: 1743848b8605Smrg if ((!_mesa_is_desktop_gl(ctx) 1744848b8605Smrg || !ctx->Extensions.EXT_texture_swizzle) 1745848b8605Smrg && !_mesa_is_gles3(ctx)) 1746848b8605Smrg goto invalid_pname; 1747848b8605Smrg COPY_4V(params, obj->Swizzle); 1748848b8605Smrg break; 1749848b8605Smrg 1750848b8605Smrg case GL_TEXTURE_CUBE_MAP_SEAMLESS: 1751848b8605Smrg if (!_mesa_is_desktop_gl(ctx) 1752848b8605Smrg || !ctx->Extensions.AMD_seamless_cubemap_per_texture) 1753848b8605Smrg goto invalid_pname; 1754848b8605Smrg *params = (GLint) obj->Sampler.CubeMapSeamless; 1755848b8605Smrg break; 1756848b8605Smrg 1757848b8605Smrg case GL_TEXTURE_IMMUTABLE_FORMAT: 1758848b8605Smrg *params = (GLint) obj->Immutable; 1759848b8605Smrg break; 1760848b8605Smrg 1761848b8605Smrg case GL_TEXTURE_IMMUTABLE_LEVELS: 1762848b8605Smrg if (_mesa_is_gles3(ctx) || 1763848b8605Smrg (_mesa_is_desktop_gl(ctx) && ctx->Extensions.ARB_texture_view)) 1764848b8605Smrg *params = obj->ImmutableLevels; 1765848b8605Smrg else 1766848b8605Smrg goto invalid_pname; 1767848b8605Smrg break; 1768848b8605Smrg 1769848b8605Smrg case GL_TEXTURE_VIEW_MIN_LEVEL: 1770848b8605Smrg if (!ctx->Extensions.ARB_texture_view) 1771848b8605Smrg goto invalid_pname; 1772848b8605Smrg *params = (GLint) obj->MinLevel; 1773848b8605Smrg break; 1774848b8605Smrg 1775848b8605Smrg case GL_TEXTURE_VIEW_NUM_LEVELS: 1776848b8605Smrg if (!ctx->Extensions.ARB_texture_view) 1777848b8605Smrg goto invalid_pname; 1778848b8605Smrg *params = (GLint) obj->NumLevels; 1779848b8605Smrg break; 1780848b8605Smrg 1781848b8605Smrg case GL_TEXTURE_VIEW_MIN_LAYER: 1782848b8605Smrg if (!ctx->Extensions.ARB_texture_view) 1783848b8605Smrg goto invalid_pname; 1784848b8605Smrg *params = (GLint) obj->MinLayer; 1785848b8605Smrg break; 1786848b8605Smrg 1787848b8605Smrg case GL_TEXTURE_VIEW_NUM_LAYERS: 1788848b8605Smrg if (!ctx->Extensions.ARB_texture_view) 1789848b8605Smrg goto invalid_pname; 1790848b8605Smrg *params = (GLint) obj->NumLayers; 1791848b8605Smrg break; 1792848b8605Smrg 1793848b8605Smrg case GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES: 1794848b8605Smrg if (!_mesa_is_gles(ctx) || !ctx->Extensions.OES_EGL_image_external) 1795848b8605Smrg goto invalid_pname; 1796848b8605Smrg *params = obj->RequiredTextureImageUnits; 1797848b8605Smrg break; 1798848b8605Smrg 1799848b8605Smrg case GL_TEXTURE_SRGB_DECODE_EXT: 1800848b8605Smrg if (!ctx->Extensions.EXT_texture_sRGB_decode) 1801848b8605Smrg goto invalid_pname; 1802848b8605Smrg *params = obj->Sampler.sRGBDecode; 1803848b8605Smrg break; 1804848b8605Smrg 1805848b8605Smrg case GL_IMAGE_FORMAT_COMPATIBILITY_TYPE: 1806848b8605Smrg if (!ctx->Extensions.ARB_shader_image_load_store) 1807848b8605Smrg goto invalid_pname; 1808848b8605Smrg *params = obj->ImageFormatCompatibilityType; 1809848b8605Smrg break; 1810848b8605Smrg 1811848b8605Smrg default: 1812848b8605Smrg goto invalid_pname; 1813848b8605Smrg } 1814848b8605Smrg 1815848b8605Smrg /* no error if we get here */ 1816848b8605Smrg _mesa_unlock_texture(ctx, obj); 1817848b8605Smrg return; 1818848b8605Smrg 1819848b8605Smrginvalid_pname: 1820848b8605Smrg _mesa_unlock_texture(ctx, obj); 1821848b8605Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexParameteriv(pname=0x%x)", pname); 1822848b8605Smrg} 1823848b8605Smrg 1824848b8605Smrg 1825848b8605Smrg/** New in GL 3.0 */ 1826848b8605Smrgvoid GLAPIENTRY 1827848b8605Smrg_mesa_GetTexParameterIiv(GLenum target, GLenum pname, GLint *params) 1828848b8605Smrg{ 1829848b8605Smrg struct gl_texture_object *texObj; 1830848b8605Smrg GET_CURRENT_CONTEXT(ctx); 1831848b8605Smrg 1832848b8605Smrg texObj = get_texobj(ctx, target, GL_TRUE); 1833848b8605Smrg if (!texObj) 1834848b8605Smrg return; 1835848b8605Smrg 1836848b8605Smrg switch (pname) { 1837848b8605Smrg case GL_TEXTURE_BORDER_COLOR: 1838848b8605Smrg COPY_4V(params, texObj->Sampler.BorderColor.i); 1839848b8605Smrg break; 1840848b8605Smrg default: 1841848b8605Smrg _mesa_GetTexParameteriv(target, pname, params); 1842848b8605Smrg } 1843848b8605Smrg} 1844848b8605Smrg 1845848b8605Smrg 1846848b8605Smrg/** New in GL 3.0 */ 1847848b8605Smrgvoid GLAPIENTRY 1848848b8605Smrg_mesa_GetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params) 1849848b8605Smrg{ 1850848b8605Smrg struct gl_texture_object *texObj; 1851848b8605Smrg GET_CURRENT_CONTEXT(ctx); 1852848b8605Smrg 1853848b8605Smrg texObj = get_texobj(ctx, target, GL_TRUE); 1854848b8605Smrg if (!texObj) 1855848b8605Smrg return; 1856848b8605Smrg 1857848b8605Smrg switch (pname) { 1858848b8605Smrg case GL_TEXTURE_BORDER_COLOR: 1859848b8605Smrg COPY_4V(params, texObj->Sampler.BorderColor.i); 1860848b8605Smrg break; 1861848b8605Smrg default: 1862848b8605Smrg { 1863848b8605Smrg GLint ip[4]; 1864848b8605Smrg _mesa_GetTexParameteriv(target, pname, ip); 1865848b8605Smrg params[0] = ip[0]; 1866848b8605Smrg if (pname == GL_TEXTURE_SWIZZLE_RGBA_EXT || 1867848b8605Smrg pname == GL_TEXTURE_CROP_RECT_OES) { 1868848b8605Smrg params[1] = ip[1]; 1869848b8605Smrg params[2] = ip[2]; 1870848b8605Smrg params[3] = ip[3]; 1871848b8605Smrg } 1872848b8605Smrg } 1873848b8605Smrg } 1874848b8605Smrg} 1875