texenv.c revision 5b902a08c1919d1bc4666d3e3b8e3f7933b7974b
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" 3811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul#include "main/texenv.h" 396aa7a03d856f4cfdbed493c976387b2164a0c922Brian Paul#include "main/texstate.h" 4011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 4111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 420a40033047373d9c16039cff9e63130478e78e0fBrian Paul#define TE_ERROR(errCode, msg, value) \ 430a40033047373d9c16039cff9e63130478e78e0fBrian Paul _mesa_error(ctx, errCode, msg, _mesa_lookup_enum_by_nr(value)); 440a40033047373d9c16039cff9e63130478e78e0fBrian Paul 450a40033047373d9c16039cff9e63130478e78e0fBrian Paul 460a40033047373d9c16039cff9e63130478e78e0fBrian Paul/** Set texture env mode */ 470a40033047373d9c16039cff9e63130478e78e0fBrian Paulstatic void 48f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergset_env_mode(struct gl_context *ctx, 490a40033047373d9c16039cff9e63130478e78e0fBrian Paul struct gl_texture_unit *texUnit, 500a40033047373d9c16039cff9e63130478e78e0fBrian Paul GLenum mode) 510a40033047373d9c16039cff9e63130478e78e0fBrian Paul{ 520a40033047373d9c16039cff9e63130478e78e0fBrian Paul GLboolean legal; 530a40033047373d9c16039cff9e63130478e78e0fBrian Paul 540a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (texUnit->EnvMode == mode) 550a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 560a40033047373d9c16039cff9e63130478e78e0fBrian Paul 570a40033047373d9c16039cff9e63130478e78e0fBrian Paul switch (mode) { 580a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_MODULATE: 590a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_BLEND: 600a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_DECAL: 610a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_REPLACE: 620a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = GL_TRUE; 630a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 640a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_REPLACE_EXT: 650a40033047373d9c16039cff9e63130478e78e0fBrian Paul mode = GL_REPLACE; /* GL_REPLACE_EXT != GL_REPLACE */ 660a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = GL_TRUE; 670a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 680a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_ADD: 690a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = ctx->Extensions.EXT_texture_env_add; 700a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 710a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_COMBINE: 720a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = (ctx->Extensions.EXT_texture_env_combine || 730a40033047373d9c16039cff9e63130478e78e0fBrian Paul ctx->Extensions.ARB_texture_env_combine); 740a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 750a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_COMBINE4_NV: 760a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = ctx->Extensions.NV_texture_env_combine4; 770a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 780a40033047373d9c16039cff9e63130478e78e0fBrian Paul default: 790a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = GL_FALSE; 800a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 810a40033047373d9c16039cff9e63130478e78e0fBrian Paul 820a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (legal) { 830a40033047373d9c16039cff9e63130478e78e0fBrian Paul FLUSH_VERTICES(ctx, _NEW_TEXTURE); 840a40033047373d9c16039cff9e63130478e78e0fBrian Paul texUnit->EnvMode = mode; 850a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 860a40033047373d9c16039cff9e63130478e78e0fBrian Paul else { 870a40033047373d9c16039cff9e63130478e78e0fBrian Paul TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode); 880a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 890a40033047373d9c16039cff9e63130478e78e0fBrian Paul} 900a40033047373d9c16039cff9e63130478e78e0fBrian Paul 910a40033047373d9c16039cff9e63130478e78e0fBrian Paul 920a40033047373d9c16039cff9e63130478e78e0fBrian Paulstatic void 93f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergset_env_color(struct gl_context *ctx, 940a40033047373d9c16039cff9e63130478e78e0fBrian Paul struct gl_texture_unit *texUnit, 950a40033047373d9c16039cff9e63130478e78e0fBrian Paul const GLfloat *color) 960a40033047373d9c16039cff9e63130478e78e0fBrian Paul{ 970a40033047373d9c16039cff9e63130478e78e0fBrian Paul GLfloat tmp[4]; 980a40033047373d9c16039cff9e63130478e78e0fBrian Paul tmp[0] = CLAMP(color[0], 0.0F, 1.0F); 990a40033047373d9c16039cff9e63130478e78e0fBrian Paul tmp[1] = CLAMP(color[1], 0.0F, 1.0F); 1000a40033047373d9c16039cff9e63130478e78e0fBrian Paul tmp[2] = CLAMP(color[2], 0.0F, 1.0F); 1010a40033047373d9c16039cff9e63130478e78e0fBrian Paul tmp[3] = CLAMP(color[3], 0.0F, 1.0F); 1020a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (TEST_EQ_4V(tmp, texUnit->EnvColor)) 1030a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 1040a40033047373d9c16039cff9e63130478e78e0fBrian Paul FLUSH_VERTICES(ctx, _NEW_TEXTURE); 1050a40033047373d9c16039cff9e63130478e78e0fBrian Paul COPY_4FV(texUnit->EnvColor, tmp); 1060a40033047373d9c16039cff9e63130478e78e0fBrian Paul} 1070a40033047373d9c16039cff9e63130478e78e0fBrian Paul 1080a40033047373d9c16039cff9e63130478e78e0fBrian Paul 1090a40033047373d9c16039cff9e63130478e78e0fBrian Paul/** Set an RGB or A combiner mode/function */ 1100a40033047373d9c16039cff9e63130478e78e0fBrian Paulstatic void 111f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergset_combiner_mode(struct gl_context *ctx, 1120a40033047373d9c16039cff9e63130478e78e0fBrian Paul struct gl_texture_unit *texUnit, 1130a40033047373d9c16039cff9e63130478e78e0fBrian Paul GLenum pname, GLenum mode) 1140a40033047373d9c16039cff9e63130478e78e0fBrian Paul{ 1150a40033047373d9c16039cff9e63130478e78e0fBrian Paul GLboolean legal; 1160a40033047373d9c16039cff9e63130478e78e0fBrian Paul 1170a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (!ctx->Extensions.EXT_texture_env_combine && 1180a40033047373d9c16039cff9e63130478e78e0fBrian Paul !ctx->Extensions.ARB_texture_env_combine) { 1190a40033047373d9c16039cff9e63130478e78e0fBrian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glTexEnv(pname)"); 1200a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 1210a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 1220a40033047373d9c16039cff9e63130478e78e0fBrian Paul 1230a40033047373d9c16039cff9e63130478e78e0fBrian Paul switch (mode) { 1240a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_REPLACE: 1250a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_MODULATE: 1260a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_ADD: 1270a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_ADD_SIGNED: 1280a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_INTERPOLATE: 1290a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = GL_TRUE; 1300a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 1310a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_SUBTRACT: 1320a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = ctx->Extensions.ARB_texture_env_combine; 1330a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 1340a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_DOT3_RGB_EXT: 1350a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_DOT3_RGBA_EXT: 1360a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = (ctx->Extensions.EXT_texture_env_dot3 && 1370a40033047373d9c16039cff9e63130478e78e0fBrian Paul pname == GL_COMBINE_RGB); 1380a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 1390a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_DOT3_RGB: 1400a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_DOT3_RGBA: 1410a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = (ctx->Extensions.ARB_texture_env_dot3 && 1420a40033047373d9c16039cff9e63130478e78e0fBrian Paul pname == GL_COMBINE_RGB); 1430a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 1440a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_MODULATE_ADD_ATI: 1450a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_MODULATE_SIGNED_ADD_ATI: 1460a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_MODULATE_SUBTRACT_ATI: 147114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger legal = ctx->Extensions.ATI_texture_env_combine3; 148114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger break; 149114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger case GL_BUMP_ENVMAP_ATI: 150114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger legal = (ctx->Extensions.ATI_envmap_bumpmap && 151114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger pname == GL_COMBINE_RGB); 1520a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 1530a40033047373d9c16039cff9e63130478e78e0fBrian Paul default: 1540a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = GL_FALSE; 1550a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 1560a40033047373d9c16039cff9e63130478e78e0fBrian Paul 1570a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (!legal) { 1580a40033047373d9c16039cff9e63130478e78e0fBrian Paul TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode); 1590a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 1600a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 1610a40033047373d9c16039cff9e63130478e78e0fBrian Paul 1620a40033047373d9c16039cff9e63130478e78e0fBrian Paul switch (pname) { 1630a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_COMBINE_RGB: 1640a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (texUnit->Combine.ModeRGB == mode) 1650a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 1660a40033047373d9c16039cff9e63130478e78e0fBrian Paul FLUSH_VERTICES(ctx, _NEW_TEXTURE); 1670a40033047373d9c16039cff9e63130478e78e0fBrian Paul texUnit->Combine.ModeRGB = mode; 1680a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 1690a40033047373d9c16039cff9e63130478e78e0fBrian Paul 1700a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_COMBINE_ALPHA: 1710a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (texUnit->Combine.ModeA == mode) 1720a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 1730a40033047373d9c16039cff9e63130478e78e0fBrian Paul FLUSH_VERTICES(ctx, _NEW_TEXTURE); 1740a40033047373d9c16039cff9e63130478e78e0fBrian Paul texUnit->Combine.ModeA = mode; 1750a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 1760a40033047373d9c16039cff9e63130478e78e0fBrian Paul default: 1770a40033047373d9c16039cff9e63130478e78e0fBrian Paul TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname); 1780a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 1790a40033047373d9c16039cff9e63130478e78e0fBrian Paul} 1800a40033047373d9c16039cff9e63130478e78e0fBrian Paul 1810a40033047373d9c16039cff9e63130478e78e0fBrian Paul 1820a40033047373d9c16039cff9e63130478e78e0fBrian Paul 1830a40033047373d9c16039cff9e63130478e78e0fBrian Paul/** Set an RGB or A combiner source term */ 1840a40033047373d9c16039cff9e63130478e78e0fBrian Paulstatic void 185f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergset_combiner_source(struct gl_context *ctx, 1860a40033047373d9c16039cff9e63130478e78e0fBrian Paul struct gl_texture_unit *texUnit, 1870a40033047373d9c16039cff9e63130478e78e0fBrian Paul GLenum pname, GLenum param) 1880a40033047373d9c16039cff9e63130478e78e0fBrian Paul{ 189bd9b2be8284fda3f8aac235908ded118b5648a38Brian Paul GLuint term; 1900a40033047373d9c16039cff9e63130478e78e0fBrian Paul GLboolean alpha, legal; 1910a40033047373d9c16039cff9e63130478e78e0fBrian Paul 1920a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (!ctx->Extensions.EXT_texture_env_combine && 1930a40033047373d9c16039cff9e63130478e78e0fBrian Paul !ctx->Extensions.ARB_texture_env_combine) { 1940a40033047373d9c16039cff9e63130478e78e0fBrian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glTexEnv(pname)"); 1950a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 1960a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 1970a40033047373d9c16039cff9e63130478e78e0fBrian Paul 1980a40033047373d9c16039cff9e63130478e78e0fBrian Paul /* 199bd9b2be8284fda3f8aac235908ded118b5648a38Brian Paul * Translate pname to (term, alpha). 200de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick * 201de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick * The enums were given sequential values for a reason. 2020a40033047373d9c16039cff9e63130478e78e0fBrian Paul */ 2030a40033047373d9c16039cff9e63130478e78e0fBrian Paul switch (pname) { 2040a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_SOURCE0_RGB: 2050a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_SOURCE1_RGB: 2060a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_SOURCE2_RGB: 20708fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul case GL_SOURCE3_RGB_NV: 208de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick term = pname - GL_SOURCE0_RGB; 209de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick alpha = GL_FALSE; 21008fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul break; 2110a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_SOURCE0_ALPHA: 2120a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_SOURCE1_ALPHA: 2130a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_SOURCE2_ALPHA: 21408fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul case GL_SOURCE3_ALPHA_NV: 215de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick term = pname - GL_SOURCE0_ALPHA; 216de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick alpha = GL_TRUE; 21708fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul break; 2180a40033047373d9c16039cff9e63130478e78e0fBrian Paul default: 2190a40033047373d9c16039cff9e63130478e78e0fBrian Paul TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname); 2200a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 2210a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 2220a40033047373d9c16039cff9e63130478e78e0fBrian Paul 223de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick if ((term == 3) && !ctx->Extensions.NV_texture_env_combine4) { 224de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname); 225de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick return; 226de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick } 227de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick 228bd9b2be8284fda3f8aac235908ded118b5648a38Brian Paul assert(term < MAX_COMBINER_TERMS); 22908fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul 2300a40033047373d9c16039cff9e63130478e78e0fBrian Paul /* 2310a40033047373d9c16039cff9e63130478e78e0fBrian Paul * Error-check param (the source term) 2320a40033047373d9c16039cff9e63130478e78e0fBrian Paul */ 2330a40033047373d9c16039cff9e63130478e78e0fBrian Paul switch (param) { 2340a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_TEXTURE: 2350a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_CONSTANT: 2360a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_PRIMARY_COLOR: 2370a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_PREVIOUS: 2380a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = GL_TRUE; 2390a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 2400a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_TEXTURE0: 2410a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_TEXTURE1: 2420a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_TEXTURE2: 2430a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_TEXTURE3: 2440a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_TEXTURE4: 2450a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_TEXTURE5: 2460a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_TEXTURE6: 2470a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_TEXTURE7: 2480a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = (ctx->Extensions.ARB_texture_env_crossbar && 2490a40033047373d9c16039cff9e63130478e78e0fBrian Paul param - GL_TEXTURE0 < ctx->Const.MaxTextureUnits); 2500a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 2510a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_ZERO: 25208fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul legal = (ctx->Extensions.ATI_texture_env_combine3 || 25308fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul ctx->Extensions.NV_texture_env_combine4); 25408fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul break; 2550a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_ONE: 2560a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = ctx->Extensions.ATI_texture_env_combine3; 2570a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 2580a40033047373d9c16039cff9e63130478e78e0fBrian Paul default: 2590a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = GL_FALSE; 2600a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 2610a40033047373d9c16039cff9e63130478e78e0fBrian Paul 2620a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (!legal) { 2630a40033047373d9c16039cff9e63130478e78e0fBrian Paul TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", param); 2640a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 2650a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 2660a40033047373d9c16039cff9e63130478e78e0fBrian Paul 2670a40033047373d9c16039cff9e63130478e78e0fBrian Paul FLUSH_VERTICES(ctx, _NEW_TEXTURE); 2680a40033047373d9c16039cff9e63130478e78e0fBrian Paul 2690a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (alpha) 270bd9b2be8284fda3f8aac235908ded118b5648a38Brian Paul texUnit->Combine.SourceA[term] = param; 2710a40033047373d9c16039cff9e63130478e78e0fBrian Paul else 272bd9b2be8284fda3f8aac235908ded118b5648a38Brian Paul texUnit->Combine.SourceRGB[term] = param; 2730a40033047373d9c16039cff9e63130478e78e0fBrian Paul} 2740a40033047373d9c16039cff9e63130478e78e0fBrian Paul 2750a40033047373d9c16039cff9e63130478e78e0fBrian Paul 2760a40033047373d9c16039cff9e63130478e78e0fBrian Paul/** Set an RGB or A combiner operand term */ 2770a40033047373d9c16039cff9e63130478e78e0fBrian Paulstatic void 278f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergset_combiner_operand(struct gl_context *ctx, 2790a40033047373d9c16039cff9e63130478e78e0fBrian Paul struct gl_texture_unit *texUnit, 2800a40033047373d9c16039cff9e63130478e78e0fBrian Paul GLenum pname, GLenum param) 2810a40033047373d9c16039cff9e63130478e78e0fBrian Paul{ 282bd9b2be8284fda3f8aac235908ded118b5648a38Brian Paul GLuint term; 2830a40033047373d9c16039cff9e63130478e78e0fBrian Paul GLboolean alpha, legal; 2840a40033047373d9c16039cff9e63130478e78e0fBrian Paul 2850a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (!ctx->Extensions.EXT_texture_env_combine && 2860a40033047373d9c16039cff9e63130478e78e0fBrian Paul !ctx->Extensions.ARB_texture_env_combine) { 2870a40033047373d9c16039cff9e63130478e78e0fBrian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glTexEnv(pname)"); 2880a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 2890a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 2900a40033047373d9c16039cff9e63130478e78e0fBrian Paul 291de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick /* The enums were given sequential values for a reason. 292de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick */ 2930a40033047373d9c16039cff9e63130478e78e0fBrian Paul switch (pname) { 2940a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_OPERAND0_RGB: 2950a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_OPERAND1_RGB: 2960a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_OPERAND2_RGB: 29708fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul case GL_OPERAND3_RGB_NV: 298de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick term = pname - GL_OPERAND0_RGB; 299de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick alpha = GL_FALSE; 30008fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul break; 3010a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_OPERAND0_ALPHA: 3020a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_OPERAND1_ALPHA: 3030a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_OPERAND2_ALPHA: 30408fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul case GL_OPERAND3_ALPHA_NV: 305de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick term = pname - GL_OPERAND0_ALPHA; 306de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick alpha = GL_TRUE; 30708fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul break; 3080a40033047373d9c16039cff9e63130478e78e0fBrian Paul default: 3090a40033047373d9c16039cff9e63130478e78e0fBrian Paul TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname); 3100a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 3110a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 3120a40033047373d9c16039cff9e63130478e78e0fBrian Paul 313de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick if ((term == 3) && !ctx->Extensions.NV_texture_env_combine4) { 314de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname); 315de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick return; 316de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick } 317de1ffd2f62257c174325d877c327d56b1a9e6cbcIan Romanick 318bd9b2be8284fda3f8aac235908ded118b5648a38Brian Paul assert(term < MAX_COMBINER_TERMS); 31908fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul 3200a40033047373d9c16039cff9e63130478e78e0fBrian Paul /* 3210a40033047373d9c16039cff9e63130478e78e0fBrian Paul * Error-check param (the source operand) 3220a40033047373d9c16039cff9e63130478e78e0fBrian Paul */ 3230a40033047373d9c16039cff9e63130478e78e0fBrian Paul switch (param) { 3240a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_SRC_COLOR: 3250a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_ONE_MINUS_SRC_COLOR: 3261a2d498b4164f457c48e9fde9ae8bbadfcf7fa72Ian Romanick /* The color input can only be used with GL_OPERAND[01]_RGB in the EXT 3271a2d498b4164f457c48e9fde9ae8bbadfcf7fa72Ian Romanick * version. In the ARB and NV versions they can be used for any RGB 3281a2d498b4164f457c48e9fde9ae8bbadfcf7fa72Ian Romanick * operand. 3291a2d498b4164f457c48e9fde9ae8bbadfcf7fa72Ian Romanick */ 3301a2d498b4164f457c48e9fde9ae8bbadfcf7fa72Ian Romanick legal = !alpha 3311a2d498b4164f457c48e9fde9ae8bbadfcf7fa72Ian Romanick && ((term < 2) || ctx->Extensions.ARB_texture_env_combine 3321a2d498b4164f457c48e9fde9ae8bbadfcf7fa72Ian Romanick || ctx->Extensions.NV_texture_env_combine4); 3330a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 3340a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_ONE_MINUS_SRC_ALPHA: 3351a2d498b4164f457c48e9fde9ae8bbadfcf7fa72Ian Romanick /* GL_ONE_MINUS_SRC_ALPHA can only be used with 3361a2d498b4164f457c48e9fde9ae8bbadfcf7fa72Ian Romanick * GL_OPERAND[01]_(RGB|ALPHA) in the EXT version. In the ARB and NV 3371a2d498b4164f457c48e9fde9ae8bbadfcf7fa72Ian Romanick * versions it can be used for any operand. 3381a2d498b4164f457c48e9fde9ae8bbadfcf7fa72Ian Romanick */ 3391a2d498b4164f457c48e9fde9ae8bbadfcf7fa72Ian Romanick legal = (term < 2) || ctx->Extensions.ARB_texture_env_combine 3401a2d498b4164f457c48e9fde9ae8bbadfcf7fa72Ian Romanick || ctx->Extensions.NV_texture_env_combine4; 3411a2d498b4164f457c48e9fde9ae8bbadfcf7fa72Ian Romanick break; 3421a2d498b4164f457c48e9fde9ae8bbadfcf7fa72Ian Romanick case GL_SRC_ALPHA: 3430a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = GL_TRUE; 3440a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 3450a40033047373d9c16039cff9e63130478e78e0fBrian Paul default: 3460a40033047373d9c16039cff9e63130478e78e0fBrian Paul legal = GL_FALSE; 3470a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 3480a40033047373d9c16039cff9e63130478e78e0fBrian Paul 3490a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (!legal) { 3500a40033047373d9c16039cff9e63130478e78e0fBrian Paul TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", param); 3510a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 3520a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 3530a40033047373d9c16039cff9e63130478e78e0fBrian Paul 3540a40033047373d9c16039cff9e63130478e78e0fBrian Paul FLUSH_VERTICES(ctx, _NEW_TEXTURE); 3550a40033047373d9c16039cff9e63130478e78e0fBrian Paul 3560a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (alpha) 357bd9b2be8284fda3f8aac235908ded118b5648a38Brian Paul texUnit->Combine.OperandA[term] = param; 3580a40033047373d9c16039cff9e63130478e78e0fBrian Paul else 359bd9b2be8284fda3f8aac235908ded118b5648a38Brian Paul texUnit->Combine.OperandRGB[term] = param; 3600a40033047373d9c16039cff9e63130478e78e0fBrian Paul} 3610a40033047373d9c16039cff9e63130478e78e0fBrian Paul 3620a40033047373d9c16039cff9e63130478e78e0fBrian Paul 3630a40033047373d9c16039cff9e63130478e78e0fBrian Paulstatic void 364f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergset_combiner_scale(struct gl_context *ctx, 3650a40033047373d9c16039cff9e63130478e78e0fBrian Paul struct gl_texture_unit *texUnit, 3660a40033047373d9c16039cff9e63130478e78e0fBrian Paul GLenum pname, GLfloat scale) 3670a40033047373d9c16039cff9e63130478e78e0fBrian Paul{ 3680a40033047373d9c16039cff9e63130478e78e0fBrian Paul GLuint shift; 3690a40033047373d9c16039cff9e63130478e78e0fBrian Paul 3700a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (!ctx->Extensions.EXT_texture_env_combine && 3710a40033047373d9c16039cff9e63130478e78e0fBrian Paul !ctx->Extensions.ARB_texture_env_combine) { 3720a40033047373d9c16039cff9e63130478e78e0fBrian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glTexEnv(pname)"); 3730a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 3740a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 3750a40033047373d9c16039cff9e63130478e78e0fBrian Paul 3760a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (scale == 1.0F) { 3770a40033047373d9c16039cff9e63130478e78e0fBrian Paul shift = 0; 3780a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 3790a40033047373d9c16039cff9e63130478e78e0fBrian Paul else if (scale == 2.0F) { 3800a40033047373d9c16039cff9e63130478e78e0fBrian Paul shift = 1; 3810a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 3820a40033047373d9c16039cff9e63130478e78e0fBrian Paul else if (scale == 4.0F) { 3830a40033047373d9c16039cff9e63130478e78e0fBrian Paul shift = 2; 3840a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 3850a40033047373d9c16039cff9e63130478e78e0fBrian Paul else { 3860a40033047373d9c16039cff9e63130478e78e0fBrian Paul _mesa_error( ctx, GL_INVALID_VALUE, 3870a40033047373d9c16039cff9e63130478e78e0fBrian Paul "glTexEnv(GL_RGB_SCALE not 1, 2 or 4)" ); 3880a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 3890a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 3900a40033047373d9c16039cff9e63130478e78e0fBrian Paul 3910a40033047373d9c16039cff9e63130478e78e0fBrian Paul switch (pname) { 3920a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_RGB_SCALE: 3930a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (texUnit->Combine.ScaleShiftRGB == shift) 3940a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 3950a40033047373d9c16039cff9e63130478e78e0fBrian Paul FLUSH_VERTICES(ctx, _NEW_TEXTURE); 3960a40033047373d9c16039cff9e63130478e78e0fBrian Paul texUnit->Combine.ScaleShiftRGB = shift; 3970a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 3980a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_ALPHA_SCALE: 3990a40033047373d9c16039cff9e63130478e78e0fBrian Paul if (texUnit->Combine.ScaleShiftA == shift) 4000a40033047373d9c16039cff9e63130478e78e0fBrian Paul return; 4010a40033047373d9c16039cff9e63130478e78e0fBrian Paul FLUSH_VERTICES(ctx, _NEW_TEXTURE); 4020a40033047373d9c16039cff9e63130478e78e0fBrian Paul texUnit->Combine.ScaleShiftA = shift; 4030a40033047373d9c16039cff9e63130478e78e0fBrian Paul break; 4040a40033047373d9c16039cff9e63130478e78e0fBrian Paul default: 4050a40033047373d9c16039cff9e63130478e78e0fBrian Paul TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname); 4060a40033047373d9c16039cff9e63130478e78e0fBrian Paul } 4070a40033047373d9c16039cff9e63130478e78e0fBrian Paul} 4080a40033047373d9c16039cff9e63130478e78e0fBrian Paul 4090a40033047373d9c16039cff9e63130478e78e0fBrian Paul 41011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 41111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paulvoid GLAPIENTRY 41211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul_mesa_TexEnvfv( GLenum target, GLenum pname, const GLfloat *param ) 41311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul{ 4145b902a08c1919d1bc4666d3e3b8e3f7933b7974bBrian Paul const GLint iparam0 = (GLint) param[0]; 4155b902a08c1919d1bc4666d3e3b8e3f7933b7974bBrian Paul struct gl_texture_unit *texUnit; 41611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul GLuint maxUnit; 4175b902a08c1919d1bc4666d3e3b8e3f7933b7974bBrian Paul 41811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul GET_CURRENT_CONTEXT(ctx); 41911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 42011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 42111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul maxUnit = (target == GL_POINT_SPRITE_NV && pname == GL_COORD_REPLACE_NV) 42211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul ? ctx->Const.MaxTextureCoordUnits : ctx->Const.MaxTextureImageUnits; 42311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (ctx->Texture.CurrentUnit >= maxUnit) { 42411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error(ctx, GL_INVALID_OPERATION, "glTexEnvfv(current unit)"); 42511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 42611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 42711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 4286aa7a03d856f4cfdbed493c976387b2164a0c922Brian Paul texUnit = _mesa_get_current_tex_unit(ctx); 42911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 43011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (target == GL_TEXTURE_ENV) { 43111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul switch (pname) { 43211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_TEXTURE_ENV_MODE: 4335b902a08c1919d1bc4666d3e3b8e3f7933b7974bBrian Paul set_env_mode(ctx, texUnit, (GLenum) iparam0); 43411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul break; 43511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_TEXTURE_ENV_COLOR: 4360a40033047373d9c16039cff9e63130478e78e0fBrian Paul set_env_color(ctx, texUnit, param); 43711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul break; 43811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_COMBINE_RGB: 43911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_COMBINE_ALPHA: 4405b902a08c1919d1bc4666d3e3b8e3f7933b7974bBrian Paul set_combiner_mode(ctx, texUnit, pname, (GLenum) iparam0); 44111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul break; 44211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_SOURCE0_RGB: 44311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_SOURCE1_RGB: 44411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_SOURCE2_RGB: 44508fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul case GL_SOURCE3_RGB_NV: 44611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_SOURCE0_ALPHA: 44711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_SOURCE1_ALPHA: 44811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_SOURCE2_ALPHA: 44908fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul case GL_SOURCE3_ALPHA_NV: 4505b902a08c1919d1bc4666d3e3b8e3f7933b7974bBrian Paul set_combiner_source(ctx, texUnit, pname, (GLenum) iparam0); 45111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul break; 45211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_OPERAND0_RGB: 45311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_OPERAND1_RGB: 4540a40033047373d9c16039cff9e63130478e78e0fBrian Paul case GL_OPERAND2_RGB: 45508fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul case GL_OPERAND3_RGB_NV: 45611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_OPERAND0_ALPHA: 45711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_OPERAND1_ALPHA: 45811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_OPERAND2_ALPHA: 45908fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul case GL_OPERAND3_ALPHA_NV: 4605b902a08c1919d1bc4666d3e3b8e3f7933b7974bBrian Paul set_combiner_operand(ctx, texUnit, pname, (GLenum) iparam0); 46111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul break; 46211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_RGB_SCALE: 46311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul case GL_ALPHA_SCALE: 4640a40033047373d9c16039cff9e63130478e78e0fBrian Paul set_combiner_scale(ctx, texUnit, pname, param[0]); 46511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul break; 466114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger case GL_BUMP_TARGET_ATI: 467114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger if (!ctx->Extensions.ATI_envmap_bumpmap) { 468114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(pname=0x%x)", pname ); 469114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger return; 470114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 4715b902a08c1919d1bc4666d3e3b8e3f7933b7974bBrian Paul if ((iparam0 < GL_TEXTURE0) || 4725b902a08c1919d1bc4666d3e3b8e3f7933b7974bBrian Paul (iparam0 > GL_TEXTURE31)) { 473114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger /* spec doesn't say this but it seems logical */ 4745b902a08c1919d1bc4666d3e3b8e3f7933b7974bBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(param=0x%x)", iparam0); 475114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger return; 476114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 4775b902a08c1919d1bc4666d3e3b8e3f7933b7974bBrian Paul if (!((1 << (iparam0 - GL_TEXTURE0)) & ctx->Const.SupportedBumpUnits)) { 4785b902a08c1919d1bc4666d3e3b8e3f7933b7974bBrian Paul _mesa_error( ctx, GL_INVALID_VALUE, "glTexEnv(param=0x%x)", iparam0); 479114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger return; 480114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 481114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger else { 482114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger FLUSH_VERTICES(ctx, _NEW_TEXTURE); 4835b902a08c1919d1bc4666d3e3b8e3f7933b7974bBrian Paul texUnit->BumpTarget = iparam0; 484114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 485114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger break; 48611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul default: 48711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(pname)" ); 48811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 48911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 49011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 49111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else if (target == GL_TEXTURE_FILTER_CONTROL_EXT) { 49211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul /* GL_EXT_texture_lod_bias */ 49311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (!ctx->Extensions.EXT_texture_lod_bias) { 49411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(target=0x%x)", target ); 49511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 49611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 49711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (pname == GL_TEXTURE_LOD_BIAS_EXT) { 49811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (texUnit->LodBias == param[0]) 49911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 50011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul FLUSH_VERTICES(ctx, _NEW_TEXTURE); 50111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul texUnit->LodBias = param[0]; 50211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 50311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else { 50411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname); 50511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 50611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 50711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 50811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else if (target == GL_POINT_SPRITE_NV) { 50911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul /* GL_ARB_point_sprite / GL_NV_point_sprite */ 51011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (!ctx->Extensions.NV_point_sprite 51111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul && !ctx->Extensions.ARB_point_sprite) { 51211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(target=0x%x)", target ); 51311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 51411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 51511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (pname == GL_COORD_REPLACE_NV) { 5165b902a08c1919d1bc4666d3e3b8e3f7933b7974bBrian Paul if (iparam0 == GL_TRUE || iparam0 == GL_FALSE) { 51711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul /* It's kind of weird to set point state via glTexEnv, 51811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul * but that's what the spec calls for. 51911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul */ 5205b902a08c1919d1bc4666d3e3b8e3f7933b7974bBrian Paul const GLboolean state = (GLboolean) iparam0; 52111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (ctx->Point.CoordReplace[ctx->Texture.CurrentUnit] == state) 52211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 52311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul FLUSH_VERTICES(ctx, _NEW_POINT); 52411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul ctx->Point.CoordReplace[ctx->Texture.CurrentUnit] = state; 52511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 52611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else { 5275b902a08c1919d1bc4666d3e3b8e3f7933b7974bBrian Paul _mesa_error( ctx, GL_INVALID_VALUE, "glTexEnv(param=0x%x)", iparam0); 52811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 52911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 53011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 53111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else { 53211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(pname=0x%x)", pname ); 53311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 53411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 53511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 53611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else { 53711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(target=0x%x)",target ); 53811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 53911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 54011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 54111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (MESA_VERBOSE&(VERBOSE_API|VERBOSE_TEXTURE)) 54211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_debug(ctx, "glTexEnv %s %s %.1f(%s) ...\n", 54311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_lookup_enum_by_nr(target), 54411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_lookup_enum_by_nr(pname), 54511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul *param, 5465b902a08c1919d1bc4666d3e3b8e3f7933b7974bBrian Paul _mesa_lookup_enum_by_nr((GLenum) iparam0)); 54711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 54811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul /* Tell device driver about the new texture environment */ 54911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (ctx->Driver.TexEnv) { 55011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul (*ctx->Driver.TexEnv)( ctx, target, pname, param ); 55111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 55211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul} 55311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 55411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 55511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paulvoid GLAPIENTRY 55611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul_mesa_TexEnvf( GLenum target, GLenum pname, GLfloat param ) 55711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul{ 558a11d60d14caf8efc07f70af63b57b33273f8cf9bVinson Lee GLfloat p[4]; 559a11d60d14caf8efc07f70af63b57b33273f8cf9bVinson Lee p[0] = param; 560a11d60d14caf8efc07f70af63b57b33273f8cf9bVinson Lee p[1] = p[2] = p[3] = 0.0; 561a11d60d14caf8efc07f70af63b57b33273f8cf9bVinson Lee _mesa_TexEnvfv( target, pname, p ); 56211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul} 56311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 56411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 56511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 56611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paulvoid GLAPIENTRY 56711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul_mesa_TexEnvi( GLenum target, GLenum pname, GLint param ) 56811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul{ 56911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul GLfloat p[4]; 57011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul p[0] = (GLfloat) param; 57111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul p[1] = p[2] = p[3] = 0.0; 57211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_TexEnvfv( target, pname, p ); 57311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul} 57411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 57511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 57611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paulvoid GLAPIENTRY 57711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul_mesa_TexEnviv( GLenum target, GLenum pname, const GLint *param ) 57811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul{ 57911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul GLfloat p[4]; 58011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (pname == GL_TEXTURE_ENV_COLOR) { 58111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul p[0] = INT_TO_FLOAT( param[0] ); 58211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul p[1] = INT_TO_FLOAT( param[1] ); 58311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul p[2] = INT_TO_FLOAT( param[2] ); 58411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul p[3] = INT_TO_FLOAT( param[3] ); 58511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 58611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else { 58711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul p[0] = (GLfloat) param[0]; 58811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul p[1] = p[2] = p[3] = 0; /* init to zero, just to be safe */ 58911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 59011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_TexEnvfv( target, pname, p ); 59111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul} 59211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 59311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 594ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul 595ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul/** 596ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul * Helper for glGetTexEnvi/f() 597ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul * \return value of queried pname or -1 if error. 598ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul */ 599ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paulstatic GLint 600f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergget_texenvi(struct gl_context *ctx, const struct gl_texture_unit *texUnit, 601ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul GLenum pname) 602ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul{ 603ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul switch (pname) { 604ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_TEXTURE_ENV_MODE: 605ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul return texUnit->EnvMode; 606ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul break; 607ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_COMBINE_RGB: 608ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul if (ctx->Extensions.EXT_texture_env_combine || 609ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul ctx->Extensions.ARB_texture_env_combine) { 610ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul return texUnit->Combine.ModeRGB; 611ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 612ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul else { 613ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); 614ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 615ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul break; 616ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_COMBINE_ALPHA: 617ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul if (ctx->Extensions.EXT_texture_env_combine || 618ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul ctx->Extensions.ARB_texture_env_combine) { 619ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul return texUnit->Combine.ModeA; 620ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 621ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul else { 622ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); 623ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 624ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul break; 625ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_SOURCE0_RGB: 626ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_SOURCE1_RGB: 627ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_SOURCE2_RGB: 628ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul if (ctx->Extensions.EXT_texture_env_combine || 629ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul ctx->Extensions.ARB_texture_env_combine) { 630ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul const unsigned rgb_idx = pname - GL_SOURCE0_RGB; 631ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul return texUnit->Combine.SourceRGB[rgb_idx]; 632ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 633ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul else { 634ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); 635ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 636ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul break; 63708fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul case GL_SOURCE3_RGB_NV: 63808fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul if (ctx->Extensions.NV_texture_env_combine4) { 63908fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul return texUnit->Combine.SourceRGB[3]; 64008fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul } 64108fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul else { 64208fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); 64308fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul } 64408fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul break; 645ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_SOURCE0_ALPHA: 646ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_SOURCE1_ALPHA: 647ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_SOURCE2_ALPHA: 648ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul if (ctx->Extensions.EXT_texture_env_combine || 649ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul ctx->Extensions.ARB_texture_env_combine) { 650ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul const unsigned alpha_idx = pname - GL_SOURCE0_ALPHA; 651ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul return texUnit->Combine.SourceA[alpha_idx]; 652ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 653ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul else { 654ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); 655ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 656ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul break; 65708fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul case GL_SOURCE3_ALPHA_NV: 65808fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul if (ctx->Extensions.NV_texture_env_combine4) { 65908fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul return texUnit->Combine.SourceA[3]; 66008fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul } 66108fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul else { 66208fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); 66308fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul } 66408fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul break; 665ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_OPERAND0_RGB: 666ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_OPERAND1_RGB: 667ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_OPERAND2_RGB: 668ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul if (ctx->Extensions.EXT_texture_env_combine || 669ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul ctx->Extensions.ARB_texture_env_combine) { 670ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul const unsigned op_rgb = pname - GL_OPERAND0_RGB; 671ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul return texUnit->Combine.OperandRGB[op_rgb]; 672ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 673ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul else { 674ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); 675ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 676ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul break; 67708fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul case GL_OPERAND3_RGB_NV: 67808fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul if (ctx->Extensions.NV_texture_env_combine4) { 67908fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul return texUnit->Combine.OperandRGB[3]; 68008fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul } 68108fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul else { 68208fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); 68308fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul } 68408fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul break; 685ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_OPERAND0_ALPHA: 686ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_OPERAND1_ALPHA: 687ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_OPERAND2_ALPHA: 688ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul if (ctx->Extensions.EXT_texture_env_combine || 689ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul ctx->Extensions.ARB_texture_env_combine) { 690ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul const unsigned op_alpha = pname - GL_OPERAND0_ALPHA; 691ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul return texUnit->Combine.OperandA[op_alpha]; 692ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 693ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul else { 694ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); 695ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 696ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul break; 69708fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul case GL_OPERAND3_ALPHA_NV: 69808fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul if (ctx->Extensions.NV_texture_env_combine4) { 69908fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul return texUnit->Combine.OperandA[3]; 70008fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul } 70108fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul else { 70208fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); 70308fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul } 70408fbbdd4dceb8ca7ac15f0ce469f59e13e0ba82bBrian Paul break; 705ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_RGB_SCALE: 706ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul if (ctx->Extensions.EXT_texture_env_combine || 707ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul ctx->Extensions.ARB_texture_env_combine) { 708ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul return 1 << texUnit->Combine.ScaleShiftRGB; 709ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 710ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul else { 711ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); 712ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 713ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul break; 714ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul case GL_ALPHA_SCALE: 715ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul if (ctx->Extensions.EXT_texture_env_combine || 716ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul ctx->Extensions.ARB_texture_env_combine) { 717ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul return 1 << texUnit->Combine.ScaleShiftA; 718ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 719ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul else { 720ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); 721ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 722ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul break; 723114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger case GL_BUMP_TARGET_ATI: 724114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger /* spec doesn't say so, but I think this should be queryable */ 725114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger if (ctx->Extensions.ATI_envmap_bumpmap) { 726114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger return texUnit->BumpTarget; 727114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 728114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger else { 729114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)"); 730114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 731114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger break; 732114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 733ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul default: 734ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul ; 735ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 736ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul 737ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul return -1; /* error */ 738ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul} 739ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul 740ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul 741ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul 74211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paulvoid GLAPIENTRY 74311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul_mesa_GetTexEnvfv( GLenum target, GLenum pname, GLfloat *params ) 74411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul{ 74511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul GLuint maxUnit; 74611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul const struct gl_texture_unit *texUnit; 74711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul GET_CURRENT_CONTEXT(ctx); 74811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 74911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 75011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul maxUnit = (target == GL_POINT_SPRITE_NV && pname == GL_COORD_REPLACE_NV) 75111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul ? ctx->Const.MaxTextureCoordUnits : ctx->Const.MaxTextureImageUnits; 75211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (ctx->Texture.CurrentUnit >= maxUnit) { 75311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexEnvfv(current unit)"); 75411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 75511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 75611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 7576aa7a03d856f4cfdbed493c976387b2164a0c922Brian Paul texUnit = _mesa_get_current_tex_unit(ctx); 75811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 75911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (target == GL_TEXTURE_ENV) { 760ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul if (pname == GL_TEXTURE_ENV_COLOR) { 761ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul COPY_4FV( params, texUnit->EnvColor ); 762ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 763ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul else { 764ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul GLint val = get_texenvi(ctx, texUnit, pname); 765ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul if (val >= 0) { 766ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul *params = (GLfloat) val; 767ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 76811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 76911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 77011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else if (target == GL_TEXTURE_FILTER_CONTROL_EXT) { 77111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul /* GL_EXT_texture_lod_bias */ 77211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (!ctx->Extensions.EXT_texture_lod_bias) { 77311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(target)" ); 77411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 77511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 77611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (pname == GL_TEXTURE_LOD_BIAS_EXT) { 77711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul *params = texUnit->LodBias; 77811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 77911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else { 78011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)" ); 78111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 78211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 78311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 78411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else if (target == GL_POINT_SPRITE_NV) { 78511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul /* GL_ARB_point_sprite / GL_NV_point_sprite */ 78611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (!ctx->Extensions.NV_point_sprite 78711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul && !ctx->Extensions.ARB_point_sprite) { 78811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(target)" ); 78911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 79011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 79111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (pname == GL_COORD_REPLACE_NV) { 79211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul *params = (GLfloat) ctx->Point.CoordReplace[ctx->Texture.CurrentUnit]; 79311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 79411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else { 79511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)" ); 79611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 79711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 79811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 79911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else { 80011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(target)" ); 80111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 80211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 80311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul} 80411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 80511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 80611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paulvoid GLAPIENTRY 80711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul_mesa_GetTexEnviv( GLenum target, GLenum pname, GLint *params ) 80811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul{ 80911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul GLuint maxUnit; 81011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul const struct gl_texture_unit *texUnit; 81111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul GET_CURRENT_CONTEXT(ctx); 81211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 81311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 81411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul maxUnit = (target == GL_POINT_SPRITE_NV && pname == GL_COORD_REPLACE_NV) 81511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul ? ctx->Const.MaxTextureCoordUnits : ctx->Const.MaxTextureImageUnits; 81611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (ctx->Texture.CurrentUnit >= maxUnit) { 81711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexEnviv(current unit)"); 81811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 81911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 82011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 8216aa7a03d856f4cfdbed493c976387b2164a0c922Brian Paul texUnit = _mesa_get_current_tex_unit(ctx); 82211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 82311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (target == GL_TEXTURE_ENV) { 824ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul if (pname == GL_TEXTURE_ENV_COLOR) { 825ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul params[0] = FLOAT_TO_INT( texUnit->EnvColor[0] ); 826ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul params[1] = FLOAT_TO_INT( texUnit->EnvColor[1] ); 827ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul params[2] = FLOAT_TO_INT( texUnit->EnvColor[2] ); 828ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul params[3] = FLOAT_TO_INT( texUnit->EnvColor[3] ); 829ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 830ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul else { 831ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul GLint val = get_texenvi(ctx, texUnit, pname); 832ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul if (val >= 0) { 833ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul *params = val; 834ad338c14c2aca87199da7ec1ae08ceb5062a9954Brian Paul } 83511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 83611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 83711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else if (target == GL_TEXTURE_FILTER_CONTROL_EXT) { 83811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul /* GL_EXT_texture_lod_bias */ 83911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (!ctx->Extensions.EXT_texture_lod_bias) { 84011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(target)" ); 84111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 84211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 84311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (pname == GL_TEXTURE_LOD_BIAS_EXT) { 84411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul *params = (GLint) texUnit->LodBias; 84511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 84611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else { 84711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)" ); 84811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 84911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 85011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 85111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else if (target == GL_POINT_SPRITE_NV) { 85211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul /* GL_ARB_point_sprite / GL_NV_point_sprite */ 85311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (!ctx->Extensions.NV_point_sprite 85411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul && !ctx->Extensions.ARB_point_sprite) { 85511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(target)" ); 85611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 85711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 85811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul if (pname == GL_COORD_REPLACE_NV) { 85911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul *params = (GLint) ctx->Point.CoordReplace[ctx->Texture.CurrentUnit]; 86011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 86111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else { 86211ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)" ); 86311ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 86411ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 86511ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 86611ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul else { 86711ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(target)" ); 86811ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul return; 86911ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul } 87011ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul} 87111ebfd22bb451f86a492254b77c90aeb011f8d9aBrian Paul 87247a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul 87347a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul/** 87447a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul * Why does ATI_envmap_bumpmap require new entrypoints? Should just 87547a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul * reuse TexEnv ones... 87647a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul */ 877114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheideggervoid GLAPIENTRY 878114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger_mesa_TexBumpParameterivATI( GLenum pname, const GLint *param ) 879114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger{ 880114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GLfloat p[4]; 88147a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul GET_CURRENT_CONTEXT(ctx); 88247a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 88347a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul 88447a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul if (!ctx->Extensions.ATI_envmap_bumpmap) { 88547a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul /* This isn't an "official" error case, but let's tell the user 88647a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul * that something's wrong. 88747a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul */ 88847a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, "glTexBumpParameterivATI"); 88947a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul return; 89047a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul } 89147a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul 892114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger if (pname == GL_BUMP_ROT_MATRIX_ATI) { 893114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger /* hope that conversion is correct here */ 894114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger p[0] = INT_TO_FLOAT( param[0] ); 895114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger p[1] = INT_TO_FLOAT( param[1] ); 896114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger p[2] = INT_TO_FLOAT( param[2] ); 897114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger p[3] = INT_TO_FLOAT( param[3] ); 898114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 899114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger else { 900114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger p[0] = (GLfloat) param[0]; 90147a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul p[1] = p[2] = p[3] = 0.0F; /* init to zero, just to be safe */ 902114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 903114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger _mesa_TexBumpParameterfvATI( pname, p ); 904114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger} 905114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 90647a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul 907114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheideggervoid GLAPIENTRY 908114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger_mesa_TexBumpParameterfvATI( GLenum pname, const GLfloat *param ) 909114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger{ 910114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger struct gl_texture_unit *texUnit; 911114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GET_CURRENT_CONTEXT(ctx); 912114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger ASSERT_OUTSIDE_BEGIN_END(ctx); 913114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 91447a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul if (!ctx->Extensions.ATI_envmap_bumpmap) { 91547a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, "glTexBumpParameterfvATI"); 91647a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul return; 91747a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul } 9186aa7a03d856f4cfdbed493c976387b2164a0c922Brian Paul 9196aa7a03d856f4cfdbed493c976387b2164a0c922Brian Paul texUnit = _mesa_get_current_tex_unit(ctx); 920114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 921114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger if (pname == GL_BUMP_ROT_MATRIX_ATI) { 922114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger if (TEST_EQ_4V(param, texUnit->RotMatrix)) 923114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger return; 924114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger FLUSH_VERTICES(ctx, _NEW_TEXTURE); 925114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger COPY_4FV(texUnit->RotMatrix, param); 926114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 927114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger else { 928114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger _mesa_error( ctx, GL_INVALID_ENUM, "glTexBumpParameter(pname)" ); 929114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger return; 930114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 931114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger /* Drivers might want to know about this, instead of dedicated function 932114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger just shove it into TexEnv where it really belongs anyway */ 933114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger if (ctx->Driver.TexEnv) { 934114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger (*ctx->Driver.TexEnv)( ctx, 0, pname, param ); 935114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 936114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger} 937114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 93847a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul 939114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheideggervoid GLAPIENTRY 940114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger_mesa_GetTexBumpParameterivATI( GLenum pname, GLint *param ) 941114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger{ 942114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger const struct gl_texture_unit *texUnit; 94337f2117cd132527ebf89f9294b2f35db87326460José Fonseca GLuint i; 944114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GET_CURRENT_CONTEXT(ctx); 945114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger ASSERT_OUTSIDE_BEGIN_END(ctx); 946114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 94747a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul if (!ctx->Extensions.ATI_envmap_bumpmap) { 94847a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexBumpParameterivATI"); 94947a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul return; 95047a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul } 9516aa7a03d856f4cfdbed493c976387b2164a0c922Brian Paul 9526aa7a03d856f4cfdbed493c976387b2164a0c922Brian Paul texUnit = _mesa_get_current_tex_unit(ctx); 953114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 954114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger if (pname == GL_BUMP_ROT_MATRIX_SIZE_ATI) { 955114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger /* spec leaves open to support larger matrices. 956114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger Don't think anyone would ever want to use it 957114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger (and apps almost certainly would not understand it and 958114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger thus fail to submit matrices correctly) so hardcode this. */ 959114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger *param = 4; 960114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 961114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger else if (pname == GL_BUMP_ROT_MATRIX_ATI) { 962114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger /* hope that conversion is correct here */ 963114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger param[0] = FLOAT_TO_INT(texUnit->RotMatrix[0]); 964114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger param[1] = FLOAT_TO_INT(texUnit->RotMatrix[1]); 965114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger param[2] = FLOAT_TO_INT(texUnit->RotMatrix[2]); 966114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger param[3] = FLOAT_TO_INT(texUnit->RotMatrix[3]); 967114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 968114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger else if (pname == GL_BUMP_NUM_TEX_UNITS_ATI) { 96947a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul GLint count = 0; 970114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger for (i = 0; i < ctx->Const.MaxTextureImageUnits; i++) { 971114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger if (ctx->Const.SupportedBumpUnits & (1 << i)) { 97247a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul count++; 973114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 974114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 97547a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul *param = count; 976114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 977114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger else if (pname == GL_BUMP_TEX_UNITS_ATI) { 978114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger for (i = 0; i < ctx->Const.MaxTextureImageUnits; i++) { 979114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger if (ctx->Const.SupportedBumpUnits & (1 << i)) { 980114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger *param++ = i + GL_TEXTURE0; 981114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 982114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 983114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 984114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger else { 985114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexBumpParameter(pname)" ); 986114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger return; 987114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 988114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger} 989114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 99047a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul 991114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheideggervoid GLAPIENTRY 992114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger_mesa_GetTexBumpParameterfvATI( GLenum pname, GLfloat *param ) 993114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger{ 994114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger const struct gl_texture_unit *texUnit; 99537f2117cd132527ebf89f9294b2f35db87326460José Fonseca GLuint i; 996114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GET_CURRENT_CONTEXT(ctx); 997114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger ASSERT_OUTSIDE_BEGIN_END(ctx); 998114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 99947a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul if (!ctx->Extensions.ATI_envmap_bumpmap) { 100047a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexBumpParameterfvATI"); 100147a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul return; 100247a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul } 10036aa7a03d856f4cfdbed493c976387b2164a0c922Brian Paul 10046aa7a03d856f4cfdbed493c976387b2164a0c922Brian Paul texUnit = _mesa_get_current_tex_unit(ctx); 1005114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 1006114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger if (pname == GL_BUMP_ROT_MATRIX_SIZE_ATI) { 1007114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger /* spec leaves open to support larger matrices. 1008114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger Don't think anyone would ever want to use it 1009114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger (and apps might not understand it) so hardcode this. */ 101047a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul *param = 4.0F; 1011114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 1012114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger else if (pname == GL_BUMP_ROT_MATRIX_ATI) { 1013114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger param[0] = texUnit->RotMatrix[0]; 1014114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger param[1] = texUnit->RotMatrix[1]; 1015114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger param[2] = texUnit->RotMatrix[2]; 1016114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger param[3] = texUnit->RotMatrix[3]; 1017114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 1018114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger else if (pname == GL_BUMP_NUM_TEX_UNITS_ATI) { 101947a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul GLint count = 0; 1020114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger for (i = 0; i < ctx->Const.MaxTextureImageUnits; i++) { 1021114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger if (ctx->Const.SupportedBumpUnits & (1 << i)) { 102247a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul count++; 1023114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 1024114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 102547a385b43be9cf2ef0d0b24b1d588dc26940dfe6Brian Paul *param = (GLfloat) count; 1026114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 1027114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger else if (pname == GL_BUMP_TEX_UNITS_ATI) { 1028114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger for (i = 0; i < ctx->Const.MaxTextureImageUnits; i++) { 1029114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger if (ctx->Const.SupportedBumpUnits & (1 << i)) { 1030114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger *param++ = (GLfloat) (i + GL_TEXTURE0); 1031114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 1032114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 1033114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 1034114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger else { 1035114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexBumpParameter(pname)" ); 1036114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger return; 1037114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 1038114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger} 1039