texenv.c revision ad338c14c2aca87199da7ec1ae08ceb5062a9954
111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul/* 211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul * Mesa 3-D graphics library 30a40033047373d9c16039cff9e63130478e78e0fBrian Paul * Version: 7.5 411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul * 511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. 60a40033047373d9c16039cff9e63130478e78e0fBrian Paul * Copyright (C) 2009 VMware, Inc. All Rights Reserved. 711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul * 811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul * Permission is hereby granted, free of charge, to any person obtaining a 911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul * copy of this software and associated documentation files (the "Software"), 1011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul * to deal in the Software without restriction, including without limitation 1111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul * the rights to use, copy, modify, merge, publish, distribute, sublicense, 1211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul * and/or sell copies of the Software, and to permit persons to whom the 1311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul * Software is furnished to do so, subject to the following conditions: 1411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul * 1511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul * The above copyright notice and this permission notice shall be included 1611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul * in all copies or substantial portions of the Software. 1711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul * 1811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 1911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 2011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 2111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 2211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 2311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul */ 2511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 2611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul/** 2711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul * \file texenv.c 2811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul * 2911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul * glTexEnv-related functions 3011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul */ 3111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 3211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 3311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul#include "main/glheader.h" 3411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul#include "main/context.h" 3511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul#include "main/enums.h" 3611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul#include "main/macros.h" 3711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul#include "main/texenv.h" 3811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul#include "math/m_xform.h" 3911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 4011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 410a40033047373d9c16039cff9e63130478e78e0fBrian Paul#define TE_ERROR(errCode, msg, value) \ 420a40033047373d9c16039cff9e63130478e78e0fBrian Paul _mesa_error(ctx, errCode, msg, _mesa_lookup_enum_by_nr(value)); 430a40033047373d9c16039cff9e63130478e78e0fBrian Paul 440a40033047373d9c16039cff9e63130478e78e0fBrian Paul 450a40033047373d9c16039cff9e63130478e78e0fBrian Paul/** Set texture env mode */ 460a40033047373d9c16039cff9e63130478e78e0fBrian Paulstatic void 470a40033047373d9c16039cff9e63130478e78e0fBrian Paulset_env_mode(GLcontext *ctx, 480a40033047373d9c16039cff9e63130478e78e0fBrian Paul struct gl_texture_unit *texUnit, 490a40033047373d9c16039cff9e63130478e78e0fBrian Paul GLenum mode) 500a40033047373d9c16039cff9e63130478e78e0fBrian Paul{ 510a40033047373d9c16039cff9e63130478e78e0fBrian Paul GLboolean legal; 520a40033047373d9c16039cff9e63130478e78e0fBrian Paul 530a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (texUnit->EnvMode == mode) 540a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 550a40033047373d9c16039cff9e63130478e78e0fBrian Paul 560a40033047373d9c16039cff9e63130478e78e0fBrian Paul switch (mode) { 570a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_MODULATE: 580a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_BLEND: 590a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_DECAL: 600a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_REPLACE: 610a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = GL_TRUE; 620a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 630a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_REPLACE_EXT: 640a40033047373d9c16039cff9e63130478e78e0fBrian Paul mode = GL_REPLACE; /* GL_REPLACE_EXT != GL_REPLACE */ 650a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = GL_TRUE; 660a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 670a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_ADD: 680a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = ctx->Extensions.EXT_texture_env_add; 690a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 700a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_COMBINE: 710a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = (ctx->Extensions.EXT_texture_env_combine || 720a40033047373d9c16039cff9e63130478e78e0fBrian Paul ctx->Extensions.ARB_texture_env_combine); 730a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 740a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_COMBINE4_NV: 750a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = ctx->Extensions.NV_texture_env_combine4; 760a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 770a40033047373d9c16039cff9e63130478e78e0fBrian Paul default: 780a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = GL_FALSE; 790a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 800a40033047373d9c16039cff9e63130478e78e0fBrian Paul 810a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (legal) { 820a40033047373d9c16039cff9e63130478e78e0fBrian Paul FLUSH_VERTICES(ctx, _NEW_TEXTURE); 830a40033047373d9c16039cff9e63130478e78e0fBrian Paul texUnit->EnvMode = mode; 840a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 850a40033047373d9c16039cff9e63130478e78e0fBrian Paul else { 860a40033047373d9c16039cff9e63130478e78e0fBrian Paul TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode); 870a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 880a40033047373d9c16039cff9e63130478e78e0fBrian Paul} 890a40033047373d9c16039cff9e63130478e78e0fBrian Paul 900a40033047373d9c16039cff9e63130478e78e0fBrian Paul 910a40033047373d9c16039cff9e63130478e78e0fBrian Paulstatic void 920a40033047373d9c16039cff9e63130478e78e0fBrian Paulset_env_color(GLcontext *ctx, 930a40033047373d9c16039cff9e63130478e78e0fBrian Paul struct gl_texture_unit *texUnit, 940a40033047373d9c16039cff9e63130478e78e0fBrian Paul const GLfloat *color) 950a40033047373d9c16039cff9e63130478e78e0fBrian Paul{ 960a40033047373d9c16039cff9e63130478e78e0fBrian Paul GLfloat tmp[4]; 970a40033047373d9c16039cff9e63130478e78e0fBrian Paul tmp[0] = CLAMP(color[0], 0.0F, 1.0F); 980a40033047373d9c16039cff9e63130478e78e0fBrian Paul tmp[1] = CLAMP(color[1], 0.0F, 1.0F); 990a40033047373d9c16039cff9e63130478e78e0fBrian Paul tmp[2] = CLAMP(color[2], 0.0F, 1.0F); 1000a40033047373d9c16039cff9e63130478e78e0fBrian Paul tmp[3] = CLAMP(color[3], 0.0F, 1.0F); 1010a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (TEST_EQ_4V(tmp, texUnit->EnvColor)) 1020a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 1030a40033047373d9c16039cff9e63130478e78e0fBrian Paul FLUSH_VERTICES(ctx, _NEW_TEXTURE); 1040a40033047373d9c16039cff9e63130478e78e0fBrian Paul COPY_4FV(texUnit->EnvColor, tmp); 1050a40033047373d9c16039cff9e63130478e78e0fBrian Paul} 1060a40033047373d9c16039cff9e63130478e78e0fBrian Paul 1070a40033047373d9c16039cff9e63130478e78e0fBrian Paul 1080a40033047373d9c16039cff9e63130478e78e0fBrian Paul/** Set an RGB or A combiner mode/function */ 1090a40033047373d9c16039cff9e63130478e78e0fBrian Paulstatic void 1100a40033047373d9c16039cff9e63130478e78e0fBrian Paulset_combiner_mode(GLcontext *ctx, 1110a40033047373d9c16039cff9e63130478e78e0fBrian Paul struct gl_texture_unit *texUnit, 1120a40033047373d9c16039cff9e63130478e78e0fBrian Paul GLenum pname, GLenum mode) 1130a40033047373d9c16039cff9e63130478e78e0fBrian Paul{ 1140a40033047373d9c16039cff9e63130478e78e0fBrian Paul GLboolean legal; 1150a40033047373d9c16039cff9e63130478e78e0fBrian Paul 1160a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (!ctx->Extensions.EXT_texture_env_combine && 1170a40033047373d9c16039cff9e63130478e78e0fBrian Paul !ctx->Extensions.ARB_texture_env_combine) { 1180a40033047373d9c16039cff9e63130478e78e0fBrian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glTexEnv(pname)"); 1190a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 1200a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 1210a40033047373d9c16039cff9e63130478e78e0fBrian Paul 1220a40033047373d9c16039cff9e63130478e78e0fBrian Paul switch (mode) { 1230a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_REPLACE: 1240a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_MODULATE: 1250a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_ADD: 1260a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_ADD_SIGNED: 1270a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_INTERPOLATE: 1280a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = GL_TRUE; 1290a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 1300a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_SUBTRACT: 1310a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = ctx->Extensions.ARB_texture_env_combine; 1320a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 1330a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_DOT3_RGB_EXT: 1340a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_DOT3_RGBA_EXT: 1350a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = (ctx->Extensions.EXT_texture_env_dot3 && 1360a40033047373d9c16039cff9e63130478e78e0fBrian Paul pname == GL_COMBINE_RGB); 1370a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 1380a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_DOT3_RGB: 1390a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_DOT3_RGBA: 1400a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = (ctx->Extensions.ARB_texture_env_dot3 && 1410a40033047373d9c16039cff9e63130478e78e0fBrian Paul pname == GL_COMBINE_RGB); 1420a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 1430a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_MODULATE_ADD_ATI: 1440a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_MODULATE_SIGNED_ADD_ATI: 1450a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_MODULATE_SUBTRACT_ATI: 1460a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal =ctx->Extensions.ATI_texture_env_combine3; 1470a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 1480a40033047373d9c16039cff9e63130478e78e0fBrian Paul default: 1490a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = GL_FALSE; 1500a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 1510a40033047373d9c16039cff9e63130478e78e0fBrian Paul 1520a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (!legal) { 1530a40033047373d9c16039cff9e63130478e78e0fBrian Paul TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode); 1540a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 1550a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 1560a40033047373d9c16039cff9e63130478e78e0fBrian Paul 1570a40033047373d9c16039cff9e63130478e78e0fBrian Paul switch (pname) { 1580a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_COMBINE_RGB: 1590a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (texUnit->Combine.ModeRGB == mode) 1600a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 1610a40033047373d9c16039cff9e63130478e78e0fBrian Paul FLUSH_VERTICES(ctx, _NEW_TEXTURE); 1620a40033047373d9c16039cff9e63130478e78e0fBrian Paul texUnit->Combine.ModeRGB = mode; 1630a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 1640a40033047373d9c16039cff9e63130478e78e0fBrian Paul 1650a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_COMBINE_ALPHA: 1660a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (texUnit->Combine.ModeA == mode) 1670a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 1680a40033047373d9c16039cff9e63130478e78e0fBrian Paul FLUSH_VERTICES(ctx, _NEW_TEXTURE); 1690a40033047373d9c16039cff9e63130478e78e0fBrian Paul texUnit->Combine.ModeA = mode; 1700a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 1710a40033047373d9c16039cff9e63130478e78e0fBrian Paul default: 1720a40033047373d9c16039cff9e63130478e78e0fBrian Paul TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname); 1730a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 1740a40033047373d9c16039cff9e63130478e78e0fBrian Paul} 1750a40033047373d9c16039cff9e63130478e78e0fBrian Paul 1760a40033047373d9c16039cff9e63130478e78e0fBrian Paul 1770a40033047373d9c16039cff9e63130478e78e0fBrian Paul 1780a40033047373d9c16039cff9e63130478e78e0fBrian Paul/** Set an RGB or A combiner source term */ 1790a40033047373d9c16039cff9e63130478e78e0fBrian Paulstatic void 1800a40033047373d9c16039cff9e63130478e78e0fBrian Paulset_combiner_source(GLcontext *ctx, 1810a40033047373d9c16039cff9e63130478e78e0fBrian Paul struct gl_texture_unit *texUnit, 1820a40033047373d9c16039cff9e63130478e78e0fBrian Paul GLenum pname, GLenum param) 1830a40033047373d9c16039cff9e63130478e78e0fBrian Paul{ 1840a40033047373d9c16039cff9e63130478e78e0fBrian Paul GLuint src; 1850a40033047373d9c16039cff9e63130478e78e0fBrian Paul GLboolean alpha, legal; 1860a40033047373d9c16039cff9e63130478e78e0fBrian Paul 1870a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (!ctx->Extensions.EXT_texture_env_combine && 1880a40033047373d9c16039cff9e63130478e78e0fBrian Paul !ctx->Extensions.ARB_texture_env_combine) { 1890a40033047373d9c16039cff9e63130478e78e0fBrian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glTexEnv(pname)"); 1900a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 1910a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 1920a40033047373d9c16039cff9e63130478e78e0fBrian Paul 1930a40033047373d9c16039cff9e63130478e78e0fBrian Paul /* 1940a40033047373d9c16039cff9e63130478e78e0fBrian Paul * Translate pname to (src, alpha). 1950a40033047373d9c16039cff9e63130478e78e0fBrian Paul */ 1960a40033047373d9c16039cff9e63130478e78e0fBrian Paul switch (pname) { 1970a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_SOURCE0_RGB: 1980a40033047373d9c16039cff9e63130478e78e0fBrian Paul src = 0; 1990a40033047373d9c16039cff9e63130478e78e0fBrian Paul alpha = GL_FALSE; 2000a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 2010a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_SOURCE1_RGB: 2020a40033047373d9c16039cff9e63130478e78e0fBrian Paul src = 1; 2030a40033047373d9c16039cff9e63130478e78e0fBrian Paul alpha = GL_FALSE; 2040a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 2050a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_SOURCE2_RGB: 2060a40033047373d9c16039cff9e63130478e78e0fBrian Paul src = 2; 2070a40033047373d9c16039cff9e63130478e78e0fBrian Paul alpha = GL_FALSE; 2080a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 2090a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_SOURCE0_ALPHA: 2100a40033047373d9c16039cff9e63130478e78e0fBrian Paul src = 0; 2110a40033047373d9c16039cff9e63130478e78e0fBrian Paul alpha = GL_TRUE; 2120a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 2130a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_SOURCE1_ALPHA: 2140a40033047373d9c16039cff9e63130478e78e0fBrian Paul src = 1; 2150a40033047373d9c16039cff9e63130478e78e0fBrian Paul alpha = GL_TRUE; 2160a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 2170a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_SOURCE2_ALPHA: 2180a40033047373d9c16039cff9e63130478e78e0fBrian Paul src = 2; 2190a40033047373d9c16039cff9e63130478e78e0fBrian Paul alpha = GL_TRUE; 2200a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 2210a40033047373d9c16039cff9e63130478e78e0fBrian Paul default: 2220a40033047373d9c16039cff9e63130478e78e0fBrian Paul TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname); 2230a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 2240a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 2250a40033047373d9c16039cff9e63130478e78e0fBrian Paul 2260a40033047373d9c16039cff9e63130478e78e0fBrian Paul /* 2270a40033047373d9c16039cff9e63130478e78e0fBrian Paul * Error-check param (the source term) 2280a40033047373d9c16039cff9e63130478e78e0fBrian Paul */ 2290a40033047373d9c16039cff9e63130478e78e0fBrian Paul switch (param) { 2300a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_TEXTURE: 2310a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_CONSTANT: 2320a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_PRIMARY_COLOR: 2330a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_PREVIOUS: 2340a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = GL_TRUE; 2350a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 2360a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_TEXTURE0: 2370a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_TEXTURE1: 2380a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_TEXTURE2: 2390a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_TEXTURE3: 2400a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_TEXTURE4: 2410a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_TEXTURE5: 2420a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_TEXTURE6: 2430a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_TEXTURE7: 2440a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = (ctx->Extensions.ARB_texture_env_crossbar && 2450a40033047373d9c16039cff9e63130478e78e0fBrian Paul param - GL_TEXTURE0 < ctx->Const.MaxTextureUnits); 2460a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 2470a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_ZERO: 2480a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_ONE: 2490a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = ctx->Extensions.ATI_texture_env_combine3; 2500a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 2510a40033047373d9c16039cff9e63130478e78e0fBrian Paul default: 2520a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = GL_FALSE; 2530a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 2540a40033047373d9c16039cff9e63130478e78e0fBrian Paul 2550a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (!legal) { 2560a40033047373d9c16039cff9e63130478e78e0fBrian Paul TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", param); 2570a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 2580a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 2590a40033047373d9c16039cff9e63130478e78e0fBrian Paul 2600a40033047373d9c16039cff9e63130478e78e0fBrian Paul FLUSH_VERTICES(ctx, _NEW_TEXTURE); 2610a40033047373d9c16039cff9e63130478e78e0fBrian Paul 2620a40033047373d9c16039cff9e63130478e78e0fBrian Paul assert(src < 4); 2630a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (alpha) 2640a40033047373d9c16039cff9e63130478e78e0fBrian Paul texUnit->Combine.SourceA[src] = param; 2650a40033047373d9c16039cff9e63130478e78e0fBrian Paul else 2660a40033047373d9c16039cff9e63130478e78e0fBrian Paul texUnit->Combine.SourceRGB[src] = param; 2670a40033047373d9c16039cff9e63130478e78e0fBrian Paul} 2680a40033047373d9c16039cff9e63130478e78e0fBrian Paul 2690a40033047373d9c16039cff9e63130478e78e0fBrian Paul 2700a40033047373d9c16039cff9e63130478e78e0fBrian Paul/** Set an RGB or A combiner operand term */ 2710a40033047373d9c16039cff9e63130478e78e0fBrian Paulstatic void 2720a40033047373d9c16039cff9e63130478e78e0fBrian Paulset_combiner_operand(GLcontext *ctx, 2730a40033047373d9c16039cff9e63130478e78e0fBrian Paul struct gl_texture_unit *texUnit, 2740a40033047373d9c16039cff9e63130478e78e0fBrian Paul GLenum pname, GLenum param) 2750a40033047373d9c16039cff9e63130478e78e0fBrian Paul{ 2760a40033047373d9c16039cff9e63130478e78e0fBrian Paul GLuint op; 2770a40033047373d9c16039cff9e63130478e78e0fBrian Paul GLboolean alpha, legal; 2780a40033047373d9c16039cff9e63130478e78e0fBrian Paul 2790a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (!ctx->Extensions.EXT_texture_env_combine && 2800a40033047373d9c16039cff9e63130478e78e0fBrian Paul !ctx->Extensions.ARB_texture_env_combine) { 2810a40033047373d9c16039cff9e63130478e78e0fBrian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glTexEnv(pname)"); 2820a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 2830a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 2840a40033047373d9c16039cff9e63130478e78e0fBrian Paul 2850a40033047373d9c16039cff9e63130478e78e0fBrian Paul switch (pname) { 2860a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_OPERAND0_RGB: 2870a40033047373d9c16039cff9e63130478e78e0fBrian Paul op = 0; 2880a40033047373d9c16039cff9e63130478e78e0fBrian Paul alpha = GL_FALSE; 2890a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 2900a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_OPERAND1_RGB: 2910a40033047373d9c16039cff9e63130478e78e0fBrian Paul op = 1; 2920a40033047373d9c16039cff9e63130478e78e0fBrian Paul alpha = GL_FALSE; 2930a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 2940a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_OPERAND2_RGB: 2950a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (ctx->Extensions.ARB_texture_env_combine) { 2960a40033047373d9c16039cff9e63130478e78e0fBrian Paul op = 2; 2970a40033047373d9c16039cff9e63130478e78e0fBrian Paul alpha = GL_FALSE; 2980a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 2990a40033047373d9c16039cff9e63130478e78e0fBrian Paul else { 3000a40033047373d9c16039cff9e63130478e78e0fBrian Paul TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname); 3010a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 3020a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 3030a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 3040a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_OPERAND0_ALPHA: 3050a40033047373d9c16039cff9e63130478e78e0fBrian Paul op = 0; 3060a40033047373d9c16039cff9e63130478e78e0fBrian Paul alpha = GL_TRUE; 3070a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 3080a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_OPERAND1_ALPHA: 3090a40033047373d9c16039cff9e63130478e78e0fBrian Paul op = 1; 3100a40033047373d9c16039cff9e63130478e78e0fBrian Paul alpha = GL_TRUE; 3110a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 3120a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_OPERAND2_ALPHA: 3130a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (ctx->Extensions.ARB_texture_env_combine) { 3140a40033047373d9c16039cff9e63130478e78e0fBrian Paul op = 2; 3150a40033047373d9c16039cff9e63130478e78e0fBrian Paul alpha = GL_TRUE; 3160a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 3170a40033047373d9c16039cff9e63130478e78e0fBrian Paul else { 3180a40033047373d9c16039cff9e63130478e78e0fBrian Paul TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname); 3190a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 3200a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 3210a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 3220a40033047373d9c16039cff9e63130478e78e0fBrian Paul default: 3230a40033047373d9c16039cff9e63130478e78e0fBrian Paul TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname); 3240a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 3250a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 3260a40033047373d9c16039cff9e63130478e78e0fBrian Paul 3270a40033047373d9c16039cff9e63130478e78e0fBrian Paul /* 3280a40033047373d9c16039cff9e63130478e78e0fBrian Paul * Error-check param (the source operand) 3290a40033047373d9c16039cff9e63130478e78e0fBrian Paul */ 3300a40033047373d9c16039cff9e63130478e78e0fBrian Paul switch (param) { 3310a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_SRC_COLOR: 3320a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_ONE_MINUS_SRC_COLOR: 3330a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = !alpha; 3340a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 3350a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_SRC_ALPHA: 3360a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_ONE_MINUS_SRC_ALPHA: 3370a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = GL_TRUE; 3380a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 3390a40033047373d9c16039cff9e63130478e78e0fBrian Paul default: 3400a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = GL_FALSE; 3410a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 3420a40033047373d9c16039cff9e63130478e78e0fBrian Paul 3430a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (!legal) { 3440a40033047373d9c16039cff9e63130478e78e0fBrian Paul TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", param); 3450a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 3460a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 3470a40033047373d9c16039cff9e63130478e78e0fBrian Paul 3480a40033047373d9c16039cff9e63130478e78e0fBrian Paul FLUSH_VERTICES(ctx, _NEW_TEXTURE); 3490a40033047373d9c16039cff9e63130478e78e0fBrian Paul 3500a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (alpha) 3510a40033047373d9c16039cff9e63130478e78e0fBrian Paul texUnit->Combine.OperandA[op] = param; 3520a40033047373d9c16039cff9e63130478e78e0fBrian Paul else 3530a40033047373d9c16039cff9e63130478e78e0fBrian Paul texUnit->Combine.OperandRGB[op] = param; 3540a40033047373d9c16039cff9e63130478e78e0fBrian Paul} 3550a40033047373d9c16039cff9e63130478e78e0fBrian Paul 3560a40033047373d9c16039cff9e63130478e78e0fBrian Paul 3570a40033047373d9c16039cff9e63130478e78e0fBrian Paulstatic void 3580a40033047373d9c16039cff9e63130478e78e0fBrian Paulset_combiner_scale(GLcontext *ctx, 3590a40033047373d9c16039cff9e63130478e78e0fBrian Paul struct gl_texture_unit *texUnit, 3600a40033047373d9c16039cff9e63130478e78e0fBrian Paul GLenum pname, GLfloat scale) 3610a40033047373d9c16039cff9e63130478e78e0fBrian Paul{ 3620a40033047373d9c16039cff9e63130478e78e0fBrian Paul GLuint shift; 3630a40033047373d9c16039cff9e63130478e78e0fBrian Paul 3640a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (!ctx->Extensions.EXT_texture_env_combine && 3650a40033047373d9c16039cff9e63130478e78e0fBrian Paul !ctx->Extensions.ARB_texture_env_combine) { 3660a40033047373d9c16039cff9e63130478e78e0fBrian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glTexEnv(pname)"); 3670a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 3680a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 3690a40033047373d9c16039cff9e63130478e78e0fBrian Paul 3700a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (scale == 1.0F) { 3710a40033047373d9c16039cff9e63130478e78e0fBrian Paul shift = 0; 3720a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 3730a40033047373d9c16039cff9e63130478e78e0fBrian Paul else if (scale == 2.0F) { 3740a40033047373d9c16039cff9e63130478e78e0fBrian Paul shift = 1; 3750a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 3760a40033047373d9c16039cff9e63130478e78e0fBrian Paul else if (scale == 4.0F) { 3770a40033047373d9c16039cff9e63130478e78e0fBrian Paul shift = 2; 3780a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 3790a40033047373d9c16039cff9e63130478e78e0fBrian Paul else { 3800a40033047373d9c16039cff9e63130478e78e0fBrian Paul _mesa_error( ctx, GL_INVALID_VALUE, 3810a40033047373d9c16039cff9e63130478e78e0fBrian Paul "glTexEnv(GL_RGB_SCALE not 1, 2 or 4)" ); 3820a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 3830a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 3840a40033047373d9c16039cff9e63130478e78e0fBrian Paul 3850a40033047373d9c16039cff9e63130478e78e0fBrian Paul switch (pname) { 3860a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_RGB_SCALE: 3870a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (texUnit->Combine.ScaleShiftRGB == shift) 3880a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 3890a40033047373d9c16039cff9e63130478e78e0fBrian Paul FLUSH_VERTICES(ctx, _NEW_TEXTURE); 3900a40033047373d9c16039cff9e63130478e78e0fBrian Paul texUnit->Combine.ScaleShiftRGB = shift; 3910a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 3920a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_ALPHA_SCALE: 3930a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (texUnit->Combine.ScaleShiftA == shift) 3940a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 3950a40033047373d9c16039cff9e63130478e78e0fBrian Paul FLUSH_VERTICES(ctx, _NEW_TEXTURE); 3960a40033047373d9c16039cff9e63130478e78e0fBrian Paul texUnit->Combine.ScaleShiftA = shift; 3970a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 3980a40033047373d9c16039cff9e63130478e78e0fBrian Paul default: 3990a40033047373d9c16039cff9e63130478e78e0fBrian Paul TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname); 4000a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 4010a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 4020a40033047373d9c16039cff9e63130478e78e0fBrian Paul} 4030a40033047373d9c16039cff9e63130478e78e0fBrian Paul 4040a40033047373d9c16039cff9e63130478e78e0fBrian Paul 40511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 40611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paulvoid GLAPIENTRY 40711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul_mesa_TexEnvfv( GLenum target, GLenum pname, const GLfloat *param ) 40811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul{ 40911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul GLuint maxUnit; 41011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul GET_CURRENT_CONTEXT(ctx); 41111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul struct gl_texture_unit *texUnit; 41211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 41311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 41411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul maxUnit = (target == GL_POINT_SPRITE_NV && pname == GL_COORD_REPLACE_NV) 41511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul ? ctx->Const.MaxTextureCoordUnits : ctx->Const.MaxTextureImageUnits; 41611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (ctx->Texture.CurrentUnit >= maxUnit) { 41711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error(ctx, GL_INVALID_OPERATION, "glTexEnvfv(current unit)"); 41811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 41911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 42011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 42111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 42211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 42311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (target == GL_TEXTURE_ENV) { 42411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul switch (pname) { 42511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_TEXTURE_ENV_MODE: 4260a40033047373d9c16039cff9e63130478e78e0fBrian Paul set_env_mode(ctx, texUnit, (GLenum) (GLint) param[0]); 42711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul break; 42811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_TEXTURE_ENV_COLOR: 4290a40033047373d9c16039cff9e63130478e78e0fBrian Paul set_env_color(ctx, texUnit, param); 43011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul break; 43111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_COMBINE_RGB: 43211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_COMBINE_ALPHA: 4330a40033047373d9c16039cff9e63130478e78e0fBrian Paul set_combiner_mode(ctx, texUnit, pname, (GLenum) (GLint) param[0]); 43411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul break; 43511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_SOURCE0_RGB: 43611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_SOURCE1_RGB: 43711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_SOURCE2_RGB: 43811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_SOURCE0_ALPHA: 43911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_SOURCE1_ALPHA: 44011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_SOURCE2_ALPHA: 4410a40033047373d9c16039cff9e63130478e78e0fBrian Paul set_combiner_source(ctx, texUnit, pname, (GLenum) (GLint) param[0]); 44211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul break; 44311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_OPERAND0_RGB: 44411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_OPERAND1_RGB: 4450a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_OPERAND2_RGB: 44611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_OPERAND0_ALPHA: 44711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_OPERAND1_ALPHA: 44811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_OPERAND2_ALPHA: 4490a40033047373d9c16039cff9e63130478e78e0fBrian Paul set_combiner_operand(ctx, texUnit, pname, (GLenum) (GLint) param[0]); 45011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul break; 45111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_RGB_SCALE: 45211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_ALPHA_SCALE: 4530a40033047373d9c16039cff9e63130478e78e0fBrian Paul set_combiner_scale(ctx, texUnit, pname, param[0]); 45411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul break; 45511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul default: 45611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(pname)" ); 45711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 45811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 45911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 46011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else if (target == GL_TEXTURE_FILTER_CONTROL_EXT) { 46111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul /* GL_EXT_texture_lod_bias */ 46211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (!ctx->Extensions.EXT_texture_lod_bias) { 46311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(target=0x%x)", target ); 46411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 46511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 46611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (pname == GL_TEXTURE_LOD_BIAS_EXT) { 46711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (texUnit->LodBias == param[0]) 46811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 46911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul FLUSH_VERTICES(ctx, _NEW_TEXTURE); 47011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul texUnit->LodBias = param[0]; 47111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 47211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else { 47311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname); 47411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 47511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 47611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 47711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else if (target == GL_POINT_SPRITE_NV) { 47811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul /* GL_ARB_point_sprite / GL_NV_point_sprite */ 47911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (!ctx->Extensions.NV_point_sprite 48011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul && !ctx->Extensions.ARB_point_sprite) { 48111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(target=0x%x)", target ); 48211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 48311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 48411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (pname == GL_COORD_REPLACE_NV) { 48511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul const GLenum value = (GLenum) param[0]; 48611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (value == GL_TRUE || value == GL_FALSE) { 48711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul /* It's kind of weird to set point state via glTexEnv, 48811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul * but that's what the spec calls for. 48911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul */ 49011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul const GLboolean state = (GLboolean) value; 49111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (ctx->Point.CoordReplace[ctx->Texture.CurrentUnit] == state) 49211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 49311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul FLUSH_VERTICES(ctx, _NEW_POINT); 49411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul ctx->Point.CoordReplace[ctx->Texture.CurrentUnit] = state; 49511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 49611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else { 49711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_VALUE, "glTexEnv(param=0x%x)", value); 49811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 49911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 50011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 50111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else { 50211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(pname=0x%x)", pname ); 50311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 50411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 50511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 50611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else { 50711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(target=0x%x)",target ); 50811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 50911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 51011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 51111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (MESA_VERBOSE&(VERBOSE_API|VERBOSE_TEXTURE)) 51211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_debug(ctx, "glTexEnv %s %s %.1f(%s) ...\n", 51311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_lookup_enum_by_nr(target), 51411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_lookup_enum_by_nr(pname), 51511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul *param, 51611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_lookup_enum_by_nr((GLenum) (GLint) *param)); 51711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 51811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul /* Tell device driver about the new texture environment */ 51911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (ctx->Driver.TexEnv) { 52011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul (*ctx->Driver.TexEnv)( ctx, target, pname, param ); 52111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 52211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul} 52311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 52411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 52511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paulvoid GLAPIENTRY 52611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul_mesa_TexEnvf( GLenum target, GLenum pname, GLfloat param ) 52711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul{ 52811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_TexEnvfv( target, pname, ¶m ); 52911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul} 53011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 53111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 53211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 53311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paulvoid GLAPIENTRY 53411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul_mesa_TexEnvi( GLenum target, GLenum pname, GLint param ) 53511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul{ 53611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul GLfloat p[4]; 53711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul p[0] = (GLfloat) param; 53811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul p[1] = p[2] = p[3] = 0.0; 53911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_TexEnvfv( target, pname, p ); 54011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul} 54111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 54211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 54311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paulvoid GLAPIENTRY 54411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul_mesa_TexEnviv( GLenum target, GLenum pname, const GLint *param ) 54511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul{ 54611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul GLfloat p[4]; 54711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (pname == GL_TEXTURE_ENV_COLOR) { 54811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul p[0] = INT_TO_FLOAT( param[0] ); 54911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul p[1] = INT_TO_FLOAT( param[1] ); 55011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul p[2] = INT_TO_FLOAT( param[2] ); 55111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul p[3] = INT_TO_FLOAT( param[3] ); 55211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 55311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else { 55411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul p[0] = (GLfloat) param[0]; 55511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul p[1] = p[2] = p[3] = 0; /* init to zero, just to be safe */ 55611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 55711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_TexEnvfv( target, pname, p ); 55811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul} 55911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 56011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 561ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul 562ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul/** 563ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul * Helper for glGetTexEnvi/f() 564ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul * \return value of queried pname or -1 if error. 565ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul */ 566ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paulstatic GLint 567ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paulget_texenvi(GLcontext *ctx, const struct gl_texture_unit *texUnit, 568ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul GLenum pname) 569ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul{ 570ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul switch (pname) { 571ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_TEXTURE_ENV_MODE: 572ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul return texUnit->EnvMode; 573ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul break; 574ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_COMBINE_RGB: 575ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul if (ctx->Extensions.EXT_texture_env_combine || 576ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul ctx->Extensions.ARB_texture_env_combine) { 577ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul return texUnit->Combine.ModeRGB; 578ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 579ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul else { 580ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); 581ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 582ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul break; 583ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_COMBINE_ALPHA: 584ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul if (ctx->Extensions.EXT_texture_env_combine || 585ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul ctx->Extensions.ARB_texture_env_combine) { 586ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul return texUnit->Combine.ModeA; 587ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 588ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul else { 589ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); 590ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 591ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul break; 592ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_SOURCE0_RGB: 593ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_SOURCE1_RGB: 594ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_SOURCE2_RGB: 595ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul if (ctx->Extensions.EXT_texture_env_combine || 596ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul ctx->Extensions.ARB_texture_env_combine) { 597ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul const unsigned rgb_idx = pname - GL_SOURCE0_RGB; 598ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul return texUnit->Combine.SourceRGB[rgb_idx]; 599ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 600ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul else { 601ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); 602ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 603ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul break; 604ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_SOURCE0_ALPHA: 605ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_SOURCE1_ALPHA: 606ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_SOURCE2_ALPHA: 607ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul if (ctx->Extensions.EXT_texture_env_combine || 608ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul ctx->Extensions.ARB_texture_env_combine) { 609ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul const unsigned alpha_idx = pname - GL_SOURCE0_ALPHA; 610ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul return texUnit->Combine.SourceA[alpha_idx]; 611ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 612ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul else { 613ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); 614ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 615ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul break; 616ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_OPERAND0_RGB: 617ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_OPERAND1_RGB: 618ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_OPERAND2_RGB: 619ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul if (ctx->Extensions.EXT_texture_env_combine || 620ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul ctx->Extensions.ARB_texture_env_combine) { 621ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul const unsigned op_rgb = pname - GL_OPERAND0_RGB; 622ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul return texUnit->Combine.OperandRGB[op_rgb]; 623ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 624ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul else { 625ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); 626ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 627ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul break; 628ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_OPERAND0_ALPHA: 629ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_OPERAND1_ALPHA: 630ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_OPERAND2_ALPHA: 631ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul if (ctx->Extensions.EXT_texture_env_combine || 632ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul ctx->Extensions.ARB_texture_env_combine) { 633ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul const unsigned op_alpha = pname - GL_OPERAND0_ALPHA; 634ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul return texUnit->Combine.OperandA[op_alpha]; 635ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 636ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul else { 637ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); 638ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 639ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul break; 640ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_RGB_SCALE: 641ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul if (ctx->Extensions.EXT_texture_env_combine || 642ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul ctx->Extensions.ARB_texture_env_combine) { 643ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul return 1 << texUnit->Combine.ScaleShiftRGB; 644ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 645ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul else { 646ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); 647ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 648ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul break; 649ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_ALPHA_SCALE: 650ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul if (ctx->Extensions.EXT_texture_env_combine || 651ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul ctx->Extensions.ARB_texture_env_combine) { 652ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul return 1 << texUnit->Combine.ScaleShiftA; 653ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 654ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul else { 655ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); 656ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 657ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul break; 658ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul default: 659ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul ; 660ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 661ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul 662ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul return -1; /* error */ 663ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul} 664ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul 665ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul 666ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul 66711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paulvoid GLAPIENTRY 66811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul_mesa_GetTexEnvfv( GLenum target, GLenum pname, GLfloat *params ) 66911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul{ 67011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul GLuint maxUnit; 67111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul const struct gl_texture_unit *texUnit; 67211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul GET_CURRENT_CONTEXT(ctx); 67311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 67411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 67511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul maxUnit = (target == GL_POINT_SPRITE_NV && pname == GL_COORD_REPLACE_NV) 67611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul ? ctx->Const.MaxTextureCoordUnits : ctx->Const.MaxTextureImageUnits; 67711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (ctx->Texture.CurrentUnit >= maxUnit) { 67811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexEnvfv(current unit)"); 67911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 68011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 68111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 68211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 68311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 68411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (target == GL_TEXTURE_ENV) { 685ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul if (pname == GL_TEXTURE_ENV_COLOR) { 686ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul COPY_4FV( params, texUnit->EnvColor ); 687ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 688ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul else { 689ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul GLint val = get_texenvi(ctx, texUnit, pname); 690ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul if (val >= 0) { 691ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul *params = (GLfloat) val; 692ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 69311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 69411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 69511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else if (target == GL_TEXTURE_FILTER_CONTROL_EXT) { 69611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul /* GL_EXT_texture_lod_bias */ 69711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (!ctx->Extensions.EXT_texture_lod_bias) { 69811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(target)" ); 69911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 70011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 70111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (pname == GL_TEXTURE_LOD_BIAS_EXT) { 70211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul *params = texUnit->LodBias; 70311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 70411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else { 70511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)" ); 70611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 70711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 70811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 70911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else if (target == GL_POINT_SPRITE_NV) { 71011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul /* GL_ARB_point_sprite / GL_NV_point_sprite */ 71111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (!ctx->Extensions.NV_point_sprite 71211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul && !ctx->Extensions.ARB_point_sprite) { 71311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(target)" ); 71411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 71511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 71611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (pname == GL_COORD_REPLACE_NV) { 71711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul *params = (GLfloat) ctx->Point.CoordReplace[ctx->Texture.CurrentUnit]; 71811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 71911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else { 72011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)" ); 72111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 72211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 72311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 72411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else { 72511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(target)" ); 72611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 72711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 72811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul} 72911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 73011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 73111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paulvoid GLAPIENTRY 73211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul_mesa_GetTexEnviv( GLenum target, GLenum pname, GLint *params ) 73311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul{ 73411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul GLuint maxUnit; 73511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul const struct gl_texture_unit *texUnit; 73611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul GET_CURRENT_CONTEXT(ctx); 73711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 73811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 73911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul maxUnit = (target == GL_POINT_SPRITE_NV && pname == GL_COORD_REPLACE_NV) 74011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul ? ctx->Const.MaxTextureCoordUnits : ctx->Const.MaxTextureImageUnits; 74111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (ctx->Texture.CurrentUnit >= maxUnit) { 74211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexEnviv(current unit)"); 74311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 74411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 74511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 74611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 74711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 74811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (target == GL_TEXTURE_ENV) { 749ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul if (pname == GL_TEXTURE_ENV_COLOR) { 750ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul params[0] = FLOAT_TO_INT( texUnit->EnvColor[0] ); 751ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul params[1] = FLOAT_TO_INT( texUnit->EnvColor[1] ); 752ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul params[2] = FLOAT_TO_INT( texUnit->EnvColor[2] ); 753ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul params[3] = FLOAT_TO_INT( texUnit->EnvColor[3] ); 754ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 755ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul else { 756ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul GLint val = get_texenvi(ctx, texUnit, pname); 757ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul if (val >= 0) { 758ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul *params = val; 759ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 76011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 76111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 76211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else if (target == GL_TEXTURE_FILTER_CONTROL_EXT) { 76311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul /* GL_EXT_texture_lod_bias */ 76411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (!ctx->Extensions.EXT_texture_lod_bias) { 76511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(target)" ); 76611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 76711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 76811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (pname == GL_TEXTURE_LOD_BIAS_EXT) { 76911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul *params = (GLint) texUnit->LodBias; 77011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 77111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else { 77211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)" ); 77311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 77411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 77511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 77611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else if (target == GL_POINT_SPRITE_NV) { 77711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul /* GL_ARB_point_sprite / GL_NV_point_sprite */ 77811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (!ctx->Extensions.NV_point_sprite 77911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul && !ctx->Extensions.ARB_point_sprite) { 78011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(target)" ); 78111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 78211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 78311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (pname == GL_COORD_REPLACE_NV) { 78411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul *params = (GLint) ctx->Point.CoordReplace[ctx->Texture.CurrentUnit]; 78511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 78611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else { 78711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)" ); 78811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 78911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 79011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 79111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else { 79211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(target)" ); 79311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 79411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 79511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul} 79611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 79711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 798