texenv.c revision 5c4f914f9a883be67a93a78c853de103bb6a2d2a
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" 370117da40cd7edd3d165bb28569c289b37eca12b9Vinson Lee#include "main/mtypes.h" 38e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák#include "main/state.h" 3911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul#include "main/texenv.h" 406aa7a03d856f4cfdbed493c976387b2164a0c922Brian Paul#include "main/texstate.h" 4111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 4211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 430a40033047373d9c16039cff9e63130478e78e0fBrian Paul#define TE_ERROR(errCode, msg, value) \ 440a40033047373d9c16039cff9e63130478e78e0fBrian Paul _mesa_error(ctx, errCode, msg, _mesa_lookup_enum_by_nr(value)); 450a40033047373d9c16039cff9e63130478e78e0fBrian Paul 460a40033047373d9c16039cff9e63130478e78e0fBrian Paul 470a40033047373d9c16039cff9e63130478e78e0fBrian Paul/** Set texture env mode */ 480a40033047373d9c16039cff9e63130478e78e0fBrian Paulstatic void 49f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergset_env_mode(struct gl_context *ctx, 500a40033047373d9c16039cff9e63130478e78e0fBrian Paul struct gl_texture_unit *texUnit, 510a40033047373d9c16039cff9e63130478e78e0fBrian Paul GLenum mode) 520a40033047373d9c16039cff9e63130478e78e0fBrian Paul{ 530a40033047373d9c16039cff9e63130478e78e0fBrian Paul GLboolean legal; 540a40033047373d9c16039cff9e63130478e78e0fBrian Paul 550a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (texUnit->EnvMode == mode) 560a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 570a40033047373d9c16039cff9e63130478e78e0fBrian Paul 580a40033047373d9c16039cff9e63130478e78e0fBrian Paul switch (mode) { 590a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_MODULATE: 600a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_BLEND: 610a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_DECAL: 620a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_REPLACE: 635c4f914f9a883be67a93a78c853de103bb6a2d2aIan Romanick case GL_ADD: 640a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = GL_TRUE; 650a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 660a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_REPLACE_EXT: 670a40033047373d9c16039cff9e63130478e78e0fBrian Paul mode = GL_REPLACE; /* GL_REPLACE_EXT != GL_REPLACE */ 680a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = GL_TRUE; 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 92f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergset_env_color(struct gl_context *ctx, 930a40033047373d9c16039cff9e63130478e78e0fBrian Paul struct gl_texture_unit *texUnit, 940a40033047373d9c16039cff9e63130478e78e0fBrian Paul const GLfloat *color) 950a40033047373d9c16039cff9e63130478e78e0fBrian Paul{ 96e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák if (TEST_EQ_4V(color, texUnit->EnvColorUnclamped)) 970a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 980a40033047373d9c16039cff9e63130478e78e0fBrian Paul FLUSH_VERTICES(ctx, _NEW_TEXTURE); 99e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák COPY_4FV(texUnit->EnvColorUnclamped, color); 100e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák texUnit->EnvColor[0] = CLAMP(color[0], 0.0F, 1.0F); 101e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák texUnit->EnvColor[1] = CLAMP(color[1], 0.0F, 1.0F); 102e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák texUnit->EnvColor[2] = CLAMP(color[2], 0.0F, 1.0F); 103e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák texUnit->EnvColor[3] = CLAMP(color[3], 0.0F, 1.0F); 1040a40033047373d9c16039cff9e63130478e78e0fBrian Paul} 1050a40033047373d9c16039cff9e63130478e78e0fBrian Paul 1060a40033047373d9c16039cff9e63130478e78e0fBrian Paul 1070a40033047373d9c16039cff9e63130478e78e0fBrian Paul/** Set an RGB or A combiner mode/function */ 1080a40033047373d9c16039cff9e63130478e78e0fBrian Paulstatic void 109f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergset_combiner_mode(struct gl_context *ctx, 1100a40033047373d9c16039cff9e63130478e78e0fBrian Paul struct gl_texture_unit *texUnit, 1110a40033047373d9c16039cff9e63130478e78e0fBrian Paul GLenum pname, GLenum mode) 1120a40033047373d9c16039cff9e63130478e78e0fBrian Paul{ 1130a40033047373d9c16039cff9e63130478e78e0fBrian Paul GLboolean legal; 1140a40033047373d9c16039cff9e63130478e78e0fBrian Paul 1150a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (!ctx->Extensions.EXT_texture_env_combine && 1160a40033047373d9c16039cff9e63130478e78e0fBrian Paul !ctx->Extensions.ARB_texture_env_combine) { 1170a40033047373d9c16039cff9e63130478e78e0fBrian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glTexEnv(pname)"); 1180a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 1190a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 1200a40033047373d9c16039cff9e63130478e78e0fBrian Paul 1210a40033047373d9c16039cff9e63130478e78e0fBrian Paul switch (mode) { 1220a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_REPLACE: 1230a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_MODULATE: 1240a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_ADD: 1250a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_ADD_SIGNED: 1260a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_INTERPOLATE: 1270a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = GL_TRUE; 1280a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 1290a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_SUBTRACT: 1300a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = ctx->Extensions.ARB_texture_env_combine; 1310a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 1320a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_DOT3_RGB_EXT: 1330a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_DOT3_RGBA_EXT: 1340a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = (ctx->Extensions.EXT_texture_env_dot3 && 1350a40033047373d9c16039cff9e63130478e78e0fBrian Paul pname == GL_COMBINE_RGB); 1360a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 1370a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_DOT3_RGB: 1380a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_DOT3_RGBA: 1390a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = (ctx->Extensions.ARB_texture_env_dot3 && 1400a40033047373d9c16039cff9e63130478e78e0fBrian Paul pname == GL_COMBINE_RGB); 1410a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 1420a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_MODULATE_ADD_ATI: 1430a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_MODULATE_SIGNED_ADD_ATI: 1440a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_MODULATE_SUBTRACT_ATI: 145114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger legal = ctx->Extensions.ATI_texture_env_combine3; 146114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger break; 147114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger case GL_BUMP_ENVMAP_ATI: 148114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger legal = (ctx->Extensions.ATI_envmap_bumpmap && 149114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger pname == GL_COMBINE_RGB); 1500a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 1510a40033047373d9c16039cff9e63130478e78e0fBrian Paul default: 1520a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = GL_FALSE; 1530a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 1540a40033047373d9c16039cff9e63130478e78e0fBrian Paul 1550a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (!legal) { 1560a40033047373d9c16039cff9e63130478e78e0fBrian Paul TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode); 1570a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 1580a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 1590a40033047373d9c16039cff9e63130478e78e0fBrian Paul 1600a40033047373d9c16039cff9e63130478e78e0fBrian Paul switch (pname) { 1610a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_COMBINE_RGB: 1620a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (texUnit->Combine.ModeRGB == mode) 1630a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 1640a40033047373d9c16039cff9e63130478e78e0fBrian Paul FLUSH_VERTICES(ctx, _NEW_TEXTURE); 1650a40033047373d9c16039cff9e63130478e78e0fBrian Paul texUnit->Combine.ModeRGB = mode; 1660a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 1670a40033047373d9c16039cff9e63130478e78e0fBrian Paul 1680a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_COMBINE_ALPHA: 1690a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (texUnit->Combine.ModeA == mode) 1700a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 1710a40033047373d9c16039cff9e63130478e78e0fBrian Paul FLUSH_VERTICES(ctx, _NEW_TEXTURE); 1720a40033047373d9c16039cff9e63130478e78e0fBrian Paul texUnit->Combine.ModeA = mode; 1730a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 1740a40033047373d9c16039cff9e63130478e78e0fBrian Paul default: 1750a40033047373d9c16039cff9e63130478e78e0fBrian Paul TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname); 1760a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 1770a40033047373d9c16039cff9e63130478e78e0fBrian Paul} 1780a40033047373d9c16039cff9e63130478e78e0fBrian Paul 1790a40033047373d9c16039cff9e63130478e78e0fBrian Paul 1800a40033047373d9c16039cff9e63130478e78e0fBrian Paul 1810a40033047373d9c16039cff9e63130478e78e0fBrian Paul/** Set an RGB or A combiner source term */ 1820a40033047373d9c16039cff9e63130478e78e0fBrian Paulstatic void 183f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergset_combiner_source(struct gl_context *ctx, 1840a40033047373d9c16039cff9e63130478e78e0fBrian Paul struct gl_texture_unit *texUnit, 1850a40033047373d9c16039cff9e63130478e78e0fBrian Paul GLenum pname, GLenum param) 1860a40033047373d9c16039cff9e63130478e78e0fBrian Paul{ 187bd9b2be8284fda3f8aac235908ded118b5648a38Brian Paul GLuint term; 1880a40033047373d9c16039cff9e63130478e78e0fBrian Paul GLboolean alpha, legal; 1890a40033047373d9c16039cff9e63130478e78e0fBrian Paul 1900a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (!ctx->Extensions.EXT_texture_env_combine && 1910a40033047373d9c16039cff9e63130478e78e0fBrian Paul !ctx->Extensions.ARB_texture_env_combine) { 1920a40033047373d9c16039cff9e63130478e78e0fBrian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glTexEnv(pname)"); 1930a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 1940a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 1950a40033047373d9c16039cff9e63130478e78e0fBrian Paul 1960a40033047373d9c16039cff9e63130478e78e0fBrian Paul /* 197bd9b2be8284fda3f8aac235908ded118b5648a38Brian Paul * Translate pname to (term, alpha). 198de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick * 199de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick * The enums were given sequential values for a reason. 2000a40033047373d9c16039cff9e63130478e78e0fBrian Paul */ 2010a40033047373d9c16039cff9e63130478e78e0fBrian Paul switch (pname) { 2020a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_SOURCE0_RGB: 2030a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_SOURCE1_RGB: 2040a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_SOURCE2_RGB: 20508fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul case GL_SOURCE3_RGB_NV: 206de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick term = pname - GL_SOURCE0_RGB; 207de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick alpha = GL_FALSE; 20808fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul break; 2090a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_SOURCE0_ALPHA: 2100a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_SOURCE1_ALPHA: 2110a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_SOURCE2_ALPHA: 21208fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul case GL_SOURCE3_ALPHA_NV: 213de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick term = pname - GL_SOURCE0_ALPHA; 214de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick alpha = GL_TRUE; 21508fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul break; 2160a40033047373d9c16039cff9e63130478e78e0fBrian Paul default: 2170a40033047373d9c16039cff9e63130478e78e0fBrian Paul TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname); 2180a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 2190a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 2200a40033047373d9c16039cff9e63130478e78e0fBrian Paul 221de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick if ((term == 3) && !ctx->Extensions.NV_texture_env_combine4) { 222de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname); 223de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick return; 224de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick } 225de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick 226bd9b2be8284fda3f8aac235908ded118b5648a38Brian Paul assert(term < MAX_COMBINER_TERMS); 22708fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul 2280a40033047373d9c16039cff9e63130478e78e0fBrian Paul /* 2290a40033047373d9c16039cff9e63130478e78e0fBrian Paul * Error-check param (the source term) 2300a40033047373d9c16039cff9e63130478e78e0fBrian Paul */ 2310a40033047373d9c16039cff9e63130478e78e0fBrian Paul switch (param) { 2320a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_TEXTURE: 2330a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_CONSTANT: 2340a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_PRIMARY_COLOR: 2350a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_PREVIOUS: 2360a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = GL_TRUE; 2370a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 2380a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_TEXTURE0: 2390a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_TEXTURE1: 2400a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_TEXTURE2: 2410a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_TEXTURE3: 2420a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_TEXTURE4: 2430a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_TEXTURE5: 2440a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_TEXTURE6: 2450a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_TEXTURE7: 2460a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = (ctx->Extensions.ARB_texture_env_crossbar && 2470a40033047373d9c16039cff9e63130478e78e0fBrian Paul param - GL_TEXTURE0 < ctx->Const.MaxTextureUnits); 2480a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 2490a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_ZERO: 25008fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul legal = (ctx->Extensions.ATI_texture_env_combine3 || 25108fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul ctx->Extensions.NV_texture_env_combine4); 25208fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul break; 2530a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_ONE: 2540a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = ctx->Extensions.ATI_texture_env_combine3; 2550a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 2560a40033047373d9c16039cff9e63130478e78e0fBrian Paul default: 2570a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = GL_FALSE; 2580a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 2590a40033047373d9c16039cff9e63130478e78e0fBrian Paul 2600a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (!legal) { 2610a40033047373d9c16039cff9e63130478e78e0fBrian Paul TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", param); 2620a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 2630a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 2640a40033047373d9c16039cff9e63130478e78e0fBrian Paul 2650a40033047373d9c16039cff9e63130478e78e0fBrian Paul FLUSH_VERTICES(ctx, _NEW_TEXTURE); 2660a40033047373d9c16039cff9e63130478e78e0fBrian Paul 2670a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (alpha) 268bd9b2be8284fda3f8aac235908ded118b5648a38Brian Paul texUnit->Combine.SourceA[term] = param; 2690a40033047373d9c16039cff9e63130478e78e0fBrian Paul else 270bd9b2be8284fda3f8aac235908ded118b5648a38Brian Paul texUnit->Combine.SourceRGB[term] = param; 2710a40033047373d9c16039cff9e63130478e78e0fBrian Paul} 2720a40033047373d9c16039cff9e63130478e78e0fBrian Paul 2730a40033047373d9c16039cff9e63130478e78e0fBrian Paul 2740a40033047373d9c16039cff9e63130478e78e0fBrian Paul/** Set an RGB or A combiner operand term */ 2750a40033047373d9c16039cff9e63130478e78e0fBrian Paulstatic void 276f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergset_combiner_operand(struct gl_context *ctx, 2770a40033047373d9c16039cff9e63130478e78e0fBrian Paul struct gl_texture_unit *texUnit, 2780a40033047373d9c16039cff9e63130478e78e0fBrian Paul GLenum pname, GLenum param) 2790a40033047373d9c16039cff9e63130478e78e0fBrian Paul{ 280bd9b2be8284fda3f8aac235908ded118b5648a38Brian Paul GLuint term; 2810a40033047373d9c16039cff9e63130478e78e0fBrian Paul GLboolean alpha, legal; 2820a40033047373d9c16039cff9e63130478e78e0fBrian Paul 2830a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (!ctx->Extensions.EXT_texture_env_combine && 2840a40033047373d9c16039cff9e63130478e78e0fBrian Paul !ctx->Extensions.ARB_texture_env_combine) { 2850a40033047373d9c16039cff9e63130478e78e0fBrian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glTexEnv(pname)"); 2860a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 2870a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 2880a40033047373d9c16039cff9e63130478e78e0fBrian Paul 289de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick /* The enums were given sequential values for a reason. 290de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick */ 2910a40033047373d9c16039cff9e63130478e78e0fBrian Paul switch (pname) { 2920a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_OPERAND0_RGB: 2930a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_OPERAND1_RGB: 2940a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_OPERAND2_RGB: 29508fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul case GL_OPERAND3_RGB_NV: 296de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick term = pname - GL_OPERAND0_RGB; 297de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick alpha = GL_FALSE; 29808fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul break; 2990a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_OPERAND0_ALPHA: 3000a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_OPERAND1_ALPHA: 3010a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_OPERAND2_ALPHA: 30208fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul case GL_OPERAND3_ALPHA_NV: 303de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick term = pname - GL_OPERAND0_ALPHA; 304de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick alpha = GL_TRUE; 30508fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul break; 3060a40033047373d9c16039cff9e63130478e78e0fBrian Paul default: 3070a40033047373d9c16039cff9e63130478e78e0fBrian Paul TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname); 3080a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 3090a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 3100a40033047373d9c16039cff9e63130478e78e0fBrian Paul 311de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick if ((term == 3) && !ctx->Extensions.NV_texture_env_combine4) { 312de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname); 313de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick return; 314de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick } 315de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick 316bd9b2be8284fda3f8aac235908ded118b5648a38Brian Paul assert(term < MAX_COMBINER_TERMS); 31708fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul 3180a40033047373d9c16039cff9e63130478e78e0fBrian Paul /* 3190a40033047373d9c16039cff9e63130478e78e0fBrian Paul * Error-check param (the source operand) 3200a40033047373d9c16039cff9e63130478e78e0fBrian Paul */ 3210a40033047373d9c16039cff9e63130478e78e0fBrian Paul switch (param) { 3220a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_SRC_COLOR: 3230a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_ONE_MINUS_SRC_COLOR: 3241a2d498b4164f457c48e9fde9ae8bbadfcf7fa72Ian Romanick /* The color input can only be used with GL_OPERAND[01]_RGB in the EXT 3251a2d498b4164f457c48e9fde9ae8bbadfcf7fa72Ian Romanick * version. In the ARB and NV versions they can be used for any RGB 3261a2d498b4164f457c48e9fde9ae8bbadfcf7fa72Ian Romanick * operand. 3271a2d498b4164f457c48e9fde9ae8bbadfcf7fa72Ian Romanick */ 3281a2d498b4164f457c48e9fde9ae8bbadfcf7fa72Ian Romanick legal = !alpha 3291a2d498b4164f457c48e9fde9ae8bbadfcf7fa72Ian Romanick && ((term < 2) || ctx->Extensions.ARB_texture_env_combine 3301a2d498b4164f457c48e9fde9ae8bbadfcf7fa72Ian Romanick || ctx->Extensions.NV_texture_env_combine4); 3310a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 3320a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_ONE_MINUS_SRC_ALPHA: 3331a2d498b4164f457c48e9fde9ae8bbadfcf7fa72Ian Romanick /* GL_ONE_MINUS_SRC_ALPHA can only be used with 3341a2d498b4164f457c48e9fde9ae8bbadfcf7fa72Ian Romanick * GL_OPERAND[01]_(RGB|ALPHA) in the EXT version. In the ARB and NV 3351a2d498b4164f457c48e9fde9ae8bbadfcf7fa72Ian Romanick * versions it can be used for any operand. 3361a2d498b4164f457c48e9fde9ae8bbadfcf7fa72Ian Romanick */ 3371a2d498b4164f457c48e9fde9ae8bbadfcf7fa72Ian Romanick legal = (term < 2) || ctx->Extensions.ARB_texture_env_combine 3381a2d498b4164f457c48e9fde9ae8bbadfcf7fa72Ian Romanick || ctx->Extensions.NV_texture_env_combine4; 3391a2d498b4164f457c48e9fde9ae8bbadfcf7fa72Ian Romanick break; 3401a2d498b4164f457c48e9fde9ae8bbadfcf7fa72Ian Romanick case GL_SRC_ALPHA: 3410a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = GL_TRUE; 3420a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 3430a40033047373d9c16039cff9e63130478e78e0fBrian Paul default: 3440a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = GL_FALSE; 3450a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 3460a40033047373d9c16039cff9e63130478e78e0fBrian Paul 3470a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (!legal) { 3480a40033047373d9c16039cff9e63130478e78e0fBrian Paul TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", param); 3490a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 3500a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 3510a40033047373d9c16039cff9e63130478e78e0fBrian Paul 3520a40033047373d9c16039cff9e63130478e78e0fBrian Paul FLUSH_VERTICES(ctx, _NEW_TEXTURE); 3530a40033047373d9c16039cff9e63130478e78e0fBrian Paul 3540a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (alpha) 355bd9b2be8284fda3f8aac235908ded118b5648a38Brian Paul texUnit->Combine.OperandA[term] = param; 3560a40033047373d9c16039cff9e63130478e78e0fBrian Paul else 357bd9b2be8284fda3f8aac235908ded118b5648a38Brian Paul texUnit->Combine.OperandRGB[term] = param; 3580a40033047373d9c16039cff9e63130478e78e0fBrian Paul} 3590a40033047373d9c16039cff9e63130478e78e0fBrian Paul 3600a40033047373d9c16039cff9e63130478e78e0fBrian Paul 3610a40033047373d9c16039cff9e63130478e78e0fBrian Paulstatic void 362f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergset_combiner_scale(struct gl_context *ctx, 3630a40033047373d9c16039cff9e63130478e78e0fBrian Paul struct gl_texture_unit *texUnit, 3640a40033047373d9c16039cff9e63130478e78e0fBrian Paul GLenum pname, GLfloat scale) 3650a40033047373d9c16039cff9e63130478e78e0fBrian Paul{ 3660a40033047373d9c16039cff9e63130478e78e0fBrian Paul GLuint shift; 3670a40033047373d9c16039cff9e63130478e78e0fBrian Paul 3680a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (!ctx->Extensions.EXT_texture_env_combine && 3690a40033047373d9c16039cff9e63130478e78e0fBrian Paul !ctx->Extensions.ARB_texture_env_combine) { 3700a40033047373d9c16039cff9e63130478e78e0fBrian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glTexEnv(pname)"); 3710a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 3720a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 3730a40033047373d9c16039cff9e63130478e78e0fBrian Paul 3740a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (scale == 1.0F) { 3750a40033047373d9c16039cff9e63130478e78e0fBrian Paul shift = 0; 3760a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 3770a40033047373d9c16039cff9e63130478e78e0fBrian Paul else if (scale == 2.0F) { 3780a40033047373d9c16039cff9e63130478e78e0fBrian Paul shift = 1; 3790a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 3800a40033047373d9c16039cff9e63130478e78e0fBrian Paul else if (scale == 4.0F) { 3810a40033047373d9c16039cff9e63130478e78e0fBrian Paul shift = 2; 3820a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 3830a40033047373d9c16039cff9e63130478e78e0fBrian Paul else { 3840a40033047373d9c16039cff9e63130478e78e0fBrian Paul _mesa_error( ctx, GL_INVALID_VALUE, 3850a40033047373d9c16039cff9e63130478e78e0fBrian Paul "glTexEnv(GL_RGB_SCALE not 1, 2 or 4)" ); 3860a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 3870a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 3880a40033047373d9c16039cff9e63130478e78e0fBrian Paul 3890a40033047373d9c16039cff9e63130478e78e0fBrian Paul switch (pname) { 3900a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_RGB_SCALE: 3910a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (texUnit->Combine.ScaleShiftRGB == shift) 3920a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 3930a40033047373d9c16039cff9e63130478e78e0fBrian Paul FLUSH_VERTICES(ctx, _NEW_TEXTURE); 3940a40033047373d9c16039cff9e63130478e78e0fBrian Paul texUnit->Combine.ScaleShiftRGB = shift; 3950a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 3960a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_ALPHA_SCALE: 3970a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (texUnit->Combine.ScaleShiftA == shift) 3980a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 3990a40033047373d9c16039cff9e63130478e78e0fBrian Paul FLUSH_VERTICES(ctx, _NEW_TEXTURE); 4000a40033047373d9c16039cff9e63130478e78e0fBrian Paul texUnit->Combine.ScaleShiftA = shift; 4010a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 4020a40033047373d9c16039cff9e63130478e78e0fBrian Paul default: 4030a40033047373d9c16039cff9e63130478e78e0fBrian Paul TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname); 4040a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 4050a40033047373d9c16039cff9e63130478e78e0fBrian Paul} 4060a40033047373d9c16039cff9e63130478e78e0fBrian Paul 4070a40033047373d9c16039cff9e63130478e78e0fBrian Paul 40811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 40911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paulvoid GLAPIENTRY 41011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul_mesa_TexEnvfv( GLenum target, GLenum pname, const GLfloat *param ) 41111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul{ 4125b902a08c1919d1bc4666d3e3b8e3f7933b7974bBrian Paul const GLint iparam0 = (GLint) param[0]; 4135b902a08c1919d1bc4666d3e3b8e3f7933b7974bBrian Paul struct gl_texture_unit *texUnit; 41411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul GLuint maxUnit; 4155b902a08c1919d1bc4666d3e3b8e3f7933b7974bBrian Paul 41611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul GET_CURRENT_CONTEXT(ctx); 41711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 41811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 41911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul maxUnit = (target == GL_POINT_SPRITE_NV && pname == GL_COORD_REPLACE_NV) 420bfe284fd26e96b71c7cf46e6365b3697d68cde83Henri Verbeet ? ctx->Const.MaxTextureCoordUnits : ctx->Const.MaxCombinedTextureImageUnits; 42111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (ctx->Texture.CurrentUnit >= maxUnit) { 42211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error(ctx, GL_INVALID_OPERATION, "glTexEnvfv(current unit)"); 42311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 42411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 42511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 4266aa7a03d856f4cfdbed493c976387b2164a0c922Brian Paul texUnit = _mesa_get_current_tex_unit(ctx); 42711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 42811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (target == GL_TEXTURE_ENV) { 42911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul switch (pname) { 43011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_TEXTURE_ENV_MODE: 4315b902a08c1919d1bc4666d3e3b8e3f7933b7974bBrian Paul set_env_mode(ctx, texUnit, (GLenum) iparam0); 43211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul break; 43311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_TEXTURE_ENV_COLOR: 4340a40033047373d9c16039cff9e63130478e78e0fBrian Paul set_env_color(ctx, texUnit, param); 43511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul break; 43611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_COMBINE_RGB: 43711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_COMBINE_ALPHA: 4385b902a08c1919d1bc4666d3e3b8e3f7933b7974bBrian Paul set_combiner_mode(ctx, texUnit, pname, (GLenum) iparam0); 43911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul break; 44011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_SOURCE0_RGB: 44111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_SOURCE1_RGB: 44211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_SOURCE2_RGB: 44308fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul case GL_SOURCE3_RGB_NV: 44411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_SOURCE0_ALPHA: 44511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_SOURCE1_ALPHA: 44611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_SOURCE2_ALPHA: 44708fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul case GL_SOURCE3_ALPHA_NV: 4485b902a08c1919d1bc4666d3e3b8e3f7933b7974bBrian Paul set_combiner_source(ctx, texUnit, pname, (GLenum) iparam0); 44911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul break; 45011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_OPERAND0_RGB: 45111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_OPERAND1_RGB: 4520a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_OPERAND2_RGB: 45308fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul case GL_OPERAND3_RGB_NV: 45411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_OPERAND0_ALPHA: 45511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_OPERAND1_ALPHA: 45611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_OPERAND2_ALPHA: 45708fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul case GL_OPERAND3_ALPHA_NV: 4585b902a08c1919d1bc4666d3e3b8e3f7933b7974bBrian Paul set_combiner_operand(ctx, texUnit, pname, (GLenum) iparam0); 45911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul break; 46011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_RGB_SCALE: 46111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_ALPHA_SCALE: 4620a40033047373d9c16039cff9e63130478e78e0fBrian Paul set_combiner_scale(ctx, texUnit, pname, param[0]); 46311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul break; 464114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger case GL_BUMP_TARGET_ATI: 465114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger if (!ctx->Extensions.ATI_envmap_bumpmap) { 466114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(pname=0x%x)", pname ); 467114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger return; 468114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 4695b902a08c1919d1bc4666d3e3b8e3f7933b7974bBrian Paul if ((iparam0 < GL_TEXTURE0) || 4705b902a08c1919d1bc4666d3e3b8e3f7933b7974bBrian Paul (iparam0 > GL_TEXTURE31)) { 471114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger /* spec doesn't say this but it seems logical */ 4725b902a08c1919d1bc4666d3e3b8e3f7933b7974bBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(param=0x%x)", iparam0); 473114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger return; 474114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 4755b902a08c1919d1bc4666d3e3b8e3f7933b7974bBrian Paul if (!((1 << (iparam0 - GL_TEXTURE0)) & ctx->Const.SupportedBumpUnits)) { 4765b902a08c1919d1bc4666d3e3b8e3f7933b7974bBrian Paul _mesa_error( ctx, GL_INVALID_VALUE, "glTexEnv(param=0x%x)", iparam0); 477114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger return; 478114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 479114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger else { 480114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger FLUSH_VERTICES(ctx, _NEW_TEXTURE); 4815b902a08c1919d1bc4666d3e3b8e3f7933b7974bBrian Paul texUnit->BumpTarget = iparam0; 482114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 483114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger break; 48411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul default: 48511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(pname)" ); 48611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 48711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 48811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 48911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else if (target == GL_TEXTURE_FILTER_CONTROL_EXT) { 49011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul /* GL_EXT_texture_lod_bias */ 49111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (!ctx->Extensions.EXT_texture_lod_bias) { 49211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(target=0x%x)", target ); 49311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 49411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 49511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (pname == GL_TEXTURE_LOD_BIAS_EXT) { 49611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (texUnit->LodBias == param[0]) 49711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 49811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul FLUSH_VERTICES(ctx, _NEW_TEXTURE); 49911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul texUnit->LodBias = param[0]; 50011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 50111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else { 50211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname); 50311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 50411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 50511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 50611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else if (target == GL_POINT_SPRITE_NV) { 50711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul /* GL_ARB_point_sprite / GL_NV_point_sprite */ 50811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (!ctx->Extensions.NV_point_sprite 50911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul && !ctx->Extensions.ARB_point_sprite) { 51011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(target=0x%x)", target ); 51111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 51211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 51311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (pname == GL_COORD_REPLACE_NV) { 5145b902a08c1919d1bc4666d3e3b8e3f7933b7974bBrian Paul if (iparam0 == GL_TRUE || iparam0 == GL_FALSE) { 51511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul /* It's kind of weird to set point state via glTexEnv, 51611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul * but that's what the spec calls for. 51711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul */ 5185b902a08c1919d1bc4666d3e3b8e3f7933b7974bBrian Paul const GLboolean state = (GLboolean) iparam0; 51911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (ctx->Point.CoordReplace[ctx->Texture.CurrentUnit] == state) 52011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 52111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul FLUSH_VERTICES(ctx, _NEW_POINT); 52211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul ctx->Point.CoordReplace[ctx->Texture.CurrentUnit] = state; 52311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 52411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else { 5255b902a08c1919d1bc4666d3e3b8e3f7933b7974bBrian Paul _mesa_error( ctx, GL_INVALID_VALUE, "glTexEnv(param=0x%x)", iparam0); 52611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 52711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 52811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 52911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else { 53011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(pname=0x%x)", pname ); 53111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 53211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 53311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 53411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else { 53511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(target=0x%x)",target ); 53611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 53711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 53811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 53911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (MESA_VERBOSE&(VERBOSE_API|VERBOSE_TEXTURE)) 54011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_debug(ctx, "glTexEnv %s %s %.1f(%s) ...\n", 54111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_lookup_enum_by_nr(target), 54211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_lookup_enum_by_nr(pname), 54311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul *param, 5445b902a08c1919d1bc4666d3e3b8e3f7933b7974bBrian Paul _mesa_lookup_enum_by_nr((GLenum) iparam0)); 54511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 54611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul /* Tell device driver about the new texture environment */ 54711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (ctx->Driver.TexEnv) { 54811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul (*ctx->Driver.TexEnv)( ctx, target, pname, param ); 54911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 55011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul} 55111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 55211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 55311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paulvoid GLAPIENTRY 55411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul_mesa_TexEnvf( GLenum target, GLenum pname, GLfloat param ) 55511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul{ 556a11d60d14caf8efc07f70af63b57b33273f8cf9bVinson Lee GLfloat p[4]; 557a11d60d14caf8efc07f70af63b57b33273f8cf9bVinson Lee p[0] = param; 558a11d60d14caf8efc07f70af63b57b33273f8cf9bVinson Lee p[1] = p[2] = p[3] = 0.0; 559a11d60d14caf8efc07f70af63b57b33273f8cf9bVinson Lee _mesa_TexEnvfv( target, pname, p ); 56011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul} 56111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 56211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 56311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 56411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paulvoid GLAPIENTRY 56511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul_mesa_TexEnvi( GLenum target, GLenum pname, GLint param ) 56611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul{ 56711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul GLfloat p[4]; 56811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul p[0] = (GLfloat) param; 56911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul p[1] = p[2] = p[3] = 0.0; 57011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_TexEnvfv( target, pname, p ); 57111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul} 57211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 57311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 57411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paulvoid GLAPIENTRY 57511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul_mesa_TexEnviv( GLenum target, GLenum pname, const GLint *param ) 57611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul{ 57711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul GLfloat p[4]; 57811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (pname == GL_TEXTURE_ENV_COLOR) { 57911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul p[0] = INT_TO_FLOAT( param[0] ); 58011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul p[1] = INT_TO_FLOAT( param[1] ); 58111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul p[2] = INT_TO_FLOAT( param[2] ); 58211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul p[3] = INT_TO_FLOAT( param[3] ); 58311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 58411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else { 58511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul p[0] = (GLfloat) param[0]; 58611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul p[1] = p[2] = p[3] = 0; /* init to zero, just to be safe */ 58711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 58811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_TexEnvfv( target, pname, p ); 58911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul} 59011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 59111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 592ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul 593ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul/** 594ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul * Helper for glGetTexEnvi/f() 595ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul * \return value of queried pname or -1 if error. 596ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul */ 597ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paulstatic GLint 598f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergget_texenvi(struct gl_context *ctx, const struct gl_texture_unit *texUnit, 599ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul GLenum pname) 600ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul{ 601ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul switch (pname) { 602ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_TEXTURE_ENV_MODE: 603ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul return texUnit->EnvMode; 604ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul break; 605ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_COMBINE_RGB: 606ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul if (ctx->Extensions.EXT_texture_env_combine || 607ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul ctx->Extensions.ARB_texture_env_combine) { 608ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul return texUnit->Combine.ModeRGB; 609ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 610ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul else { 611ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); 612ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 613ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul break; 614ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_COMBINE_ALPHA: 615ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul if (ctx->Extensions.EXT_texture_env_combine || 616ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul ctx->Extensions.ARB_texture_env_combine) { 617ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul return texUnit->Combine.ModeA; 618ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 619ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul else { 620ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); 621ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 622ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul break; 623ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_SOURCE0_RGB: 624ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_SOURCE1_RGB: 625ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_SOURCE2_RGB: 626ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul if (ctx->Extensions.EXT_texture_env_combine || 627ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul ctx->Extensions.ARB_texture_env_combine) { 628ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul const unsigned rgb_idx = pname - GL_SOURCE0_RGB; 629ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul return texUnit->Combine.SourceRGB[rgb_idx]; 630ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 631ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul else { 632ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); 633ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 634ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul break; 63508fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul case GL_SOURCE3_RGB_NV: 63608fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul if (ctx->Extensions.NV_texture_env_combine4) { 63708fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul return texUnit->Combine.SourceRGB[3]; 63808fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul } 63908fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul else { 64008fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); 64108fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul } 64208fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul break; 643ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_SOURCE0_ALPHA: 644ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_SOURCE1_ALPHA: 645ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_SOURCE2_ALPHA: 646ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul if (ctx->Extensions.EXT_texture_env_combine || 647ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul ctx->Extensions.ARB_texture_env_combine) { 648ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul const unsigned alpha_idx = pname - GL_SOURCE0_ALPHA; 649ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul return texUnit->Combine.SourceA[alpha_idx]; 650ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 651ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul else { 652ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); 653ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 654ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul break; 65508fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul case GL_SOURCE3_ALPHA_NV: 65608fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul if (ctx->Extensions.NV_texture_env_combine4) { 65708fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul return texUnit->Combine.SourceA[3]; 65808fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul } 65908fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul else { 66008fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); 66108fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul } 66208fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul break; 663ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_OPERAND0_RGB: 664ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_OPERAND1_RGB: 665ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_OPERAND2_RGB: 666ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul if (ctx->Extensions.EXT_texture_env_combine || 667ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul ctx->Extensions.ARB_texture_env_combine) { 668ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul const unsigned op_rgb = pname - GL_OPERAND0_RGB; 669ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul return texUnit->Combine.OperandRGB[op_rgb]; 670ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 671ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul else { 672ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); 673ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 674ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul break; 67508fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul case GL_OPERAND3_RGB_NV: 67608fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul if (ctx->Extensions.NV_texture_env_combine4) { 67708fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul return texUnit->Combine.OperandRGB[3]; 67808fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul } 67908fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul else { 68008fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); 68108fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul } 68208fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul break; 683ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_OPERAND0_ALPHA: 684ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_OPERAND1_ALPHA: 685ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_OPERAND2_ALPHA: 686ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul if (ctx->Extensions.EXT_texture_env_combine || 687ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul ctx->Extensions.ARB_texture_env_combine) { 688ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul const unsigned op_alpha = pname - GL_OPERAND0_ALPHA; 689ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul return texUnit->Combine.OperandA[op_alpha]; 690ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 691ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul else { 692ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); 693ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 694ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul break; 69508fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul case GL_OPERAND3_ALPHA_NV: 69608fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul if (ctx->Extensions.NV_texture_env_combine4) { 69708fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul return texUnit->Combine.OperandA[3]; 69808fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul } 69908fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul else { 70008fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); 70108fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul } 70208fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul break; 703ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_RGB_SCALE: 704ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul if (ctx->Extensions.EXT_texture_env_combine || 705ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul ctx->Extensions.ARB_texture_env_combine) { 706ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul return 1 << texUnit->Combine.ScaleShiftRGB; 707ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 708ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul else { 709ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); 710ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 711ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul break; 712ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_ALPHA_SCALE: 713ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul if (ctx->Extensions.EXT_texture_env_combine || 714ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul ctx->Extensions.ARB_texture_env_combine) { 715ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul return 1 << texUnit->Combine.ScaleShiftA; 716ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 717ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul else { 718ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); 719ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 720ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul break; 721114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger case GL_BUMP_TARGET_ATI: 722114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger /* spec doesn't say so, but I think this should be queryable */ 723114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger if (ctx->Extensions.ATI_envmap_bumpmap) { 724114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger return texUnit->BumpTarget; 725114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 726114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger else { 727114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); 728114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 729114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger break; 730114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 731ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul default: 732b020b111a82266743d2cc501195defe687657e96Yuanhan Liu _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); 733b020b111a82266743d2cc501195defe687657e96Yuanhan Liu break; 734ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 735ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul 736ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul return -1; /* error */ 737ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul} 738ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul 739ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul 740ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul 74111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paulvoid GLAPIENTRY 74211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul_mesa_GetTexEnvfv( GLenum target, GLenum pname, GLfloat *params ) 74311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul{ 74411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul GLuint maxUnit; 74511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul const struct gl_texture_unit *texUnit; 74611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul GET_CURRENT_CONTEXT(ctx); 74711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 74811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 74911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul maxUnit = (target == GL_POINT_SPRITE_NV && pname == GL_COORD_REPLACE_NV) 750bfe284fd26e96b71c7cf46e6365b3697d68cde83Henri Verbeet ? ctx->Const.MaxTextureCoordUnits : ctx->Const.MaxCombinedTextureImageUnits; 75111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (ctx->Texture.CurrentUnit >= maxUnit) { 75211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexEnvfv(current unit)"); 75311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 75411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 75511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 7566aa7a03d856f4cfdbed493c976387b2164a0c922Brian Paul texUnit = _mesa_get_current_tex_unit(ctx); 75711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 75811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (target == GL_TEXTURE_ENV) { 759ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul if (pname == GL_TEXTURE_ENV_COLOR) { 760e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák if(ctx->NewState & (_NEW_BUFFERS | _NEW_FRAG_CLAMP)) 761e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák _mesa_update_state(ctx); 762e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák if(ctx->Color._ClampFragmentColor) 763e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák COPY_4FV( params, texUnit->EnvColor ); 764e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák else 765e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák COPY_4FV( params, texUnit->EnvColorUnclamped ); 766ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 767ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul else { 768ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul GLint val = get_texenvi(ctx, texUnit, pname); 769ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul if (val >= 0) { 770ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul *params = (GLfloat) val; 771ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 77211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 77311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 77411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else if (target == GL_TEXTURE_FILTER_CONTROL_EXT) { 77511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul /* GL_EXT_texture_lod_bias */ 77611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (!ctx->Extensions.EXT_texture_lod_bias) { 77711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(target)" ); 77811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 77911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 78011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (pname == GL_TEXTURE_LOD_BIAS_EXT) { 78111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul *params = texUnit->LodBias; 78211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 78311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else { 78411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)" ); 78511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 78611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 78711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 78811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else if (target == GL_POINT_SPRITE_NV) { 78911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul /* GL_ARB_point_sprite / GL_NV_point_sprite */ 79011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (!ctx->Extensions.NV_point_sprite 79111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul && !ctx->Extensions.ARB_point_sprite) { 79211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(target)" ); 79311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 79411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 79511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (pname == GL_COORD_REPLACE_NV) { 79611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul *params = (GLfloat) ctx->Point.CoordReplace[ctx->Texture.CurrentUnit]; 79711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 79811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else { 79911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)" ); 80011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 80111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 80211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 80311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else { 80411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(target)" ); 80511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 80611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 80711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul} 80811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 80911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 81011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paulvoid GLAPIENTRY 81111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul_mesa_GetTexEnviv( GLenum target, GLenum pname, GLint *params ) 81211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul{ 81311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul GLuint maxUnit; 81411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul const struct gl_texture_unit *texUnit; 81511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul GET_CURRENT_CONTEXT(ctx); 81611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 81711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 81811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul maxUnit = (target == GL_POINT_SPRITE_NV && pname == GL_COORD_REPLACE_NV) 819bfe284fd26e96b71c7cf46e6365b3697d68cde83Henri Verbeet ? ctx->Const.MaxTextureCoordUnits : ctx->Const.MaxCombinedTextureImageUnits; 82011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (ctx->Texture.CurrentUnit >= maxUnit) { 82111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexEnviv(current unit)"); 82211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 82311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 82411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 8256aa7a03d856f4cfdbed493c976387b2164a0c922Brian Paul texUnit = _mesa_get_current_tex_unit(ctx); 82611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 82711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (target == GL_TEXTURE_ENV) { 828ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul if (pname == GL_TEXTURE_ENV_COLOR) { 829ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul params[0] = FLOAT_TO_INT( texUnit->EnvColor[0] ); 830ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul params[1] = FLOAT_TO_INT( texUnit->EnvColor[1] ); 831ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul params[2] = FLOAT_TO_INT( texUnit->EnvColor[2] ); 832ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul params[3] = FLOAT_TO_INT( texUnit->EnvColor[3] ); 833ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 834ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul else { 835ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul GLint val = get_texenvi(ctx, texUnit, pname); 836ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul if (val >= 0) { 837ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul *params = val; 838ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 83911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 84011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 84111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else if (target == GL_TEXTURE_FILTER_CONTROL_EXT) { 84211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul /* GL_EXT_texture_lod_bias */ 84311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (!ctx->Extensions.EXT_texture_lod_bias) { 84411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(target)" ); 84511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 84611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 84711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (pname == GL_TEXTURE_LOD_BIAS_EXT) { 84811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul *params = (GLint) texUnit->LodBias; 84911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 85011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else { 85111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)" ); 85211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 85311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 85411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 85511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else if (target == GL_POINT_SPRITE_NV) { 85611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul /* GL_ARB_point_sprite / GL_NV_point_sprite */ 85711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (!ctx->Extensions.NV_point_sprite 85811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul && !ctx->Extensions.ARB_point_sprite) { 85911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(target)" ); 86011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 86111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 86211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (pname == GL_COORD_REPLACE_NV) { 86311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul *params = (GLint) ctx->Point.CoordReplace[ctx->Texture.CurrentUnit]; 86411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 86511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else { 86611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)" ); 86711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 86811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 86911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 87011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else { 87111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(target)" ); 87211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 87311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 87411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul} 87511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 87647a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul 87747a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul/** 87847a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul * Why does ATI_envmap_bumpmap require new entrypoints? Should just 87947a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul * reuse TexEnv ones... 88047a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul */ 881114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheideggervoid GLAPIENTRY 882114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger_mesa_TexBumpParameterivATI( GLenum pname, const GLint *param ) 883114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger{ 884114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GLfloat p[4]; 88547a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul GET_CURRENT_CONTEXT(ctx); 88647a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 88747a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul 88847a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul if (!ctx->Extensions.ATI_envmap_bumpmap) { 88947a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul /* This isn't an "official" error case, but let's tell the user 89047a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul * that something's wrong. 89147a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul */ 89247a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, "glTexBumpParameterivATI"); 89347a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul return; 89447a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul } 89547a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul 896114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger if (pname == GL_BUMP_ROT_MATRIX_ATI) { 897114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger /* hope that conversion is correct here */ 898114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger p[0] = INT_TO_FLOAT( param[0] ); 899114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger p[1] = INT_TO_FLOAT( param[1] ); 900114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger p[2] = INT_TO_FLOAT( param[2] ); 901114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger p[3] = INT_TO_FLOAT( param[3] ); 902114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 903114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger else { 904114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger p[0] = (GLfloat) param[0]; 90547a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul p[1] = p[2] = p[3] = 0.0F; /* init to zero, just to be safe */ 906114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 907114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger _mesa_TexBumpParameterfvATI( pname, p ); 908114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger} 909114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 91047a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul 911114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheideggervoid GLAPIENTRY 912114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger_mesa_TexBumpParameterfvATI( GLenum pname, const GLfloat *param ) 913114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger{ 914114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger struct gl_texture_unit *texUnit; 915114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GET_CURRENT_CONTEXT(ctx); 916114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger ASSERT_OUTSIDE_BEGIN_END(ctx); 917114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 91847a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul if (!ctx->Extensions.ATI_envmap_bumpmap) { 91947a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, "glTexBumpParameterfvATI"); 92047a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul return; 92147a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul } 9226aa7a03d856f4cfdbed493c976387b2164a0c922Brian Paul 9236aa7a03d856f4cfdbed493c976387b2164a0c922Brian Paul texUnit = _mesa_get_current_tex_unit(ctx); 924114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 925114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger if (pname == GL_BUMP_ROT_MATRIX_ATI) { 926114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger if (TEST_EQ_4V(param, texUnit->RotMatrix)) 927114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger return; 928114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger FLUSH_VERTICES(ctx, _NEW_TEXTURE); 929114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger COPY_4FV(texUnit->RotMatrix, param); 930114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 931114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger else { 932114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger _mesa_error( ctx, GL_INVALID_ENUM, "glTexBumpParameter(pname)" ); 933114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger return; 934114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 935114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger /* Drivers might want to know about this, instead of dedicated function 936114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger just shove it into TexEnv where it really belongs anyway */ 937114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger if (ctx->Driver.TexEnv) { 938114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger (*ctx->Driver.TexEnv)( ctx, 0, pname, param ); 939114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 940114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger} 941114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 94247a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul 943114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheideggervoid GLAPIENTRY 944114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger_mesa_GetTexBumpParameterivATI( GLenum pname, GLint *param ) 945114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger{ 946114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger const struct gl_texture_unit *texUnit; 94737f2117cd132527ebf89f9294b2f35db87326460José Fonseca GLuint i; 948114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GET_CURRENT_CONTEXT(ctx); 949114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger ASSERT_OUTSIDE_BEGIN_END(ctx); 950114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 95147a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul if (!ctx->Extensions.ATI_envmap_bumpmap) { 95247a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexBumpParameterivATI"); 95347a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul return; 95447a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul } 9556aa7a03d856f4cfdbed493c976387b2164a0c922Brian Paul 9566aa7a03d856f4cfdbed493c976387b2164a0c922Brian Paul texUnit = _mesa_get_current_tex_unit(ctx); 957114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 958114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger if (pname == GL_BUMP_ROT_MATRIX_SIZE_ATI) { 959114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger /* spec leaves open to support larger matrices. 960114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger Don't think anyone would ever want to use it 961114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger (and apps almost certainly would not understand it and 962114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger thus fail to submit matrices correctly) so hardcode this. */ 963114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger *param = 4; 964114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 965114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger else if (pname == GL_BUMP_ROT_MATRIX_ATI) { 966114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger /* hope that conversion is correct here */ 967114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger param[0] = FLOAT_TO_INT(texUnit->RotMatrix[0]); 968114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger param[1] = FLOAT_TO_INT(texUnit->RotMatrix[1]); 969114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger param[2] = FLOAT_TO_INT(texUnit->RotMatrix[2]); 970114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger param[3] = FLOAT_TO_INT(texUnit->RotMatrix[3]); 971114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 972114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger else if (pname == GL_BUMP_NUM_TEX_UNITS_ATI) { 97347a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul GLint count = 0; 974114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger for (i = 0; i < ctx->Const.MaxTextureImageUnits; i++) { 975114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger if (ctx->Const.SupportedBumpUnits & (1 << i)) { 97647a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul count++; 977114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 978114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 97947a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul *param = count; 980114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 981114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger else if (pname == GL_BUMP_TEX_UNITS_ATI) { 982114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger for (i = 0; i < ctx->Const.MaxTextureImageUnits; i++) { 983114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger if (ctx->Const.SupportedBumpUnits & (1 << i)) { 984114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger *param++ = i + GL_TEXTURE0; 985114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 986114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 987114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 988114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger else { 989114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexBumpParameter(pname)" ); 990114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger return; 991114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 992114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger} 993114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 99447a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul 995114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheideggervoid GLAPIENTRY 996114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger_mesa_GetTexBumpParameterfvATI( GLenum pname, GLfloat *param ) 997114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger{ 998114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger const struct gl_texture_unit *texUnit; 99937f2117cd132527ebf89f9294b2f35db87326460José Fonseca GLuint i; 1000114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GET_CURRENT_CONTEXT(ctx); 1001114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger ASSERT_OUTSIDE_BEGIN_END(ctx); 1002114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 100347a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul if (!ctx->Extensions.ATI_envmap_bumpmap) { 100447a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexBumpParameterfvATI"); 100547a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul return; 100647a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul } 10076aa7a03d856f4cfdbed493c976387b2164a0c922Brian Paul 10086aa7a03d856f4cfdbed493c976387b2164a0c922Brian Paul texUnit = _mesa_get_current_tex_unit(ctx); 1009114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 1010114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger if (pname == GL_BUMP_ROT_MATRIX_SIZE_ATI) { 1011114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger /* spec leaves open to support larger matrices. 1012114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger Don't think anyone would ever want to use it 1013114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger (and apps might not understand it) so hardcode this. */ 101447a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul *param = 4.0F; 1015114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 1016114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger else if (pname == GL_BUMP_ROT_MATRIX_ATI) { 1017114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger param[0] = texUnit->RotMatrix[0]; 1018114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger param[1] = texUnit->RotMatrix[1]; 1019114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger param[2] = texUnit->RotMatrix[2]; 1020114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger param[3] = texUnit->RotMatrix[3]; 1021114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 1022114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger else if (pname == GL_BUMP_NUM_TEX_UNITS_ATI) { 102347a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul GLint count = 0; 1024114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger for (i = 0; i < ctx->Const.MaxTextureImageUnits; i++) { 1025114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger if (ctx->Const.SupportedBumpUnits & (1 << i)) { 102647a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul count++; 1027114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 1028114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 102947a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul *param = (GLfloat) count; 1030114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 1031114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger else if (pname == GL_BUMP_TEX_UNITS_ATI) { 1032114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger for (i = 0; i < ctx->Const.MaxTextureImageUnits; i++) { 1033114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger if (ctx->Const.SupportedBumpUnits & (1 << i)) { 1034114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger *param++ = (GLfloat) (i + GL_TEXTURE0); 1035114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 1036114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 1037114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 1038114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger else { 1039114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexBumpParameter(pname)" ); 1040114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger return; 1041114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 1042114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger} 1043