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