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