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