1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Version:  7.5
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 2009  VMware, Inc.  All Rights Reserved.
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"),
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions:
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software.
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \file texenv.c
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * glTexEnv-related functions
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/glheader.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/context.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/enums.h"
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/macros.h"
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/mtypes.h"
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/state.h"
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/texenv.h"
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/texstate.h"
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define TE_ERROR(errCode, msg, value)				\
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_error(ctx, errCode, msg, _mesa_lookup_enum_by_nr(value));
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Set texture env mode */
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgset_env_mode(struct gl_context *ctx,
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             struct gl_texture_unit *texUnit,
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             GLenum mode)
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean legal;
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (texUnit->EnvMode == mode)
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (mode) {
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_MODULATE:
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_BLEND:
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_DECAL:
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_REPLACE:
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ADD:
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COMBINE:
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      legal = GL_TRUE;
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_REPLACE_EXT:
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mode = GL_REPLACE; /* GL_REPLACE_EXT != GL_REPLACE */
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      legal = GL_TRUE;
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COMBINE4_NV:
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      legal = ctx->Extensions.NV_texture_env_combine4;
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      legal = GL_FALSE;
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (legal) {
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FLUSH_VERTICES(ctx, _NEW_TEXTURE);
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      texUnit->EnvMode = mode;
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode);
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgset_env_color(struct gl_context *ctx,
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              struct gl_texture_unit *texUnit,
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              const GLfloat *color)
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (TEST_EQ_4V(color, texUnit->EnvColorUnclamped))
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FLUSH_VERTICES(ctx, _NEW_TEXTURE);
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   COPY_4FV(texUnit->EnvColorUnclamped, color);
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texUnit->EnvColor[0] = CLAMP(color[0], 0.0F, 1.0F);
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texUnit->EnvColor[1] = CLAMP(color[1], 0.0F, 1.0F);
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texUnit->EnvColor[2] = CLAMP(color[2], 0.0F, 1.0F);
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texUnit->EnvColor[3] = CLAMP(color[3], 0.0F, 1.0F);
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Set an RGB or A combiner mode/function */
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgset_combiner_mode(struct gl_context *ctx,
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  struct gl_texture_unit *texUnit,
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  GLenum pname, GLenum mode)
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean legal;
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (mode) {
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_REPLACE:
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_MODULATE:
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ADD:
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ADD_SIGNED:
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_INTERPOLATE:
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      legal = GL_TRUE;
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_SUBTRACT:
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      legal = ctx->Extensions.ARB_texture_env_combine;
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_DOT3_RGB_EXT:
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_DOT3_RGBA_EXT:
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      legal = (ctx->API == API_OPENGL &&
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               ctx->Extensions.EXT_texture_env_dot3 &&
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               pname == GL_COMBINE_RGB);
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_DOT3_RGB:
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_DOT3_RGBA:
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      legal = (ctx->Extensions.ARB_texture_env_dot3 &&
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               pname == GL_COMBINE_RGB);
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_MODULATE_ADD_ATI:
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_MODULATE_SIGNED_ADD_ATI:
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_MODULATE_SUBTRACT_ATI:
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      legal = (ctx->API == API_OPENGL &&
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               ctx->Extensions.ATI_texture_env_combine3);
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_BUMP_ENVMAP_ATI:
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      legal = (ctx->API == API_OPENGL &&
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               ctx->Extensions.ATI_envmap_bumpmap &&
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               pname == GL_COMBINE_RGB);
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      legal = GL_FALSE;
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!legal) {
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode);
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (pname) {
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COMBINE_RGB:
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (texUnit->Combine.ModeRGB == mode)
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return;
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FLUSH_VERTICES(ctx, _NEW_TEXTURE);
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      texUnit->Combine.ModeRGB = mode;
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COMBINE_ALPHA:
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (texUnit->Combine.ModeA == mode)
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return;
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FLUSH_VERTICES(ctx, _NEW_TEXTURE);
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      texUnit->Combine.ModeA = mode;
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Set an RGB or A combiner source term */
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgset_combiner_source(struct gl_context *ctx,
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    struct gl_texture_unit *texUnit,
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    GLenum pname, GLenum param)
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint term;
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean alpha, legal;
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Translate pname to (term, alpha).
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * The enums were given sequential values for a reason.
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (pname) {
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_SOURCE0_RGB:
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_SOURCE1_RGB:
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_SOURCE2_RGB:
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_SOURCE3_RGB_NV:
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      term = pname - GL_SOURCE0_RGB;
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      alpha = GL_FALSE;
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_SOURCE0_ALPHA:
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_SOURCE1_ALPHA:
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_SOURCE2_ALPHA:
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_SOURCE3_ALPHA_NV:
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      term = pname - GL_SOURCE0_ALPHA;
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      alpha = GL_TRUE;
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if ((term == 3) && (ctx->API != API_OPENGL
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       || !ctx->Extensions.NV_texture_env_combine4)) {
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(term < MAX_COMBINER_TERMS);
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Error-check param (the source term)
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (param) {
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE:
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_CONSTANT:
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PRIMARY_COLOR:
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_PREVIOUS:
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      legal = GL_TRUE;
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE0:
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE1:
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE2:
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE3:
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE4:
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE5:
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE6:
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE7:
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      legal = (ctx->Extensions.ARB_texture_env_crossbar &&
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               param - GL_TEXTURE0 < ctx->Const.MaxTextureUnits);
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ZERO:
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      legal = (ctx->API == API_OPENGL &&
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               (ctx->Extensions.ATI_texture_env_combine3 ||
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                ctx->Extensions.NV_texture_env_combine4));
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ONE:
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      legal = (ctx->API == API_OPENGL &&
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               ctx->Extensions.ATI_texture_env_combine3);
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      legal = GL_FALSE;
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!legal) {
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", param);
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FLUSH_VERTICES(ctx, _NEW_TEXTURE);
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (alpha)
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      texUnit->Combine.SourceA[term] = param;
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      texUnit->Combine.SourceRGB[term] = param;
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Set an RGB or A combiner operand term */
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgset_combiner_operand(struct gl_context *ctx,
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     struct gl_texture_unit *texUnit,
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     GLenum pname, GLenum param)
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint term;
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean alpha, legal;
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* The enums were given sequential values for a reason.
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (pname) {
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_OPERAND0_RGB:
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_OPERAND1_RGB:
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_OPERAND2_RGB:
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_OPERAND3_RGB_NV:
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      term = pname - GL_OPERAND0_RGB;
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      alpha = GL_FALSE;
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_OPERAND0_ALPHA:
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_OPERAND1_ALPHA:
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_OPERAND2_ALPHA:
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_OPERAND3_ALPHA_NV:
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      term = pname - GL_OPERAND0_ALPHA;
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      alpha = GL_TRUE;
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if ((term == 3) && (ctx->API != API_OPENGL
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       || !ctx->Extensions.NV_texture_env_combine4)) {
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(term < MAX_COMBINER_TERMS);
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Error-check param (the source operand)
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (param) {
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_SRC_COLOR:
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ONE_MINUS_SRC_COLOR:
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* The color input can only be used with GL_OPERAND[01]_RGB in the EXT
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * version.  In the ARB and NV versions and OpenGL ES 1.x they can be
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * used for any RGB operand.
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      legal = !alpha
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 && ((term < 2) || ctx->Extensions.ARB_texture_env_combine
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     || ctx->Extensions.NV_texture_env_combine4);
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ONE_MINUS_SRC_ALPHA:
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* GL_ONE_MINUS_SRC_ALPHA can only be used with
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * GL_OPERAND[01]_(RGB|ALPHA) in the EXT version.  In the ARB and NV
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * versions and OpenGL ES 1.x it can be used for any operand.
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      legal = (term < 2) || ctx->Extensions.ARB_texture_env_combine
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 || ctx->Extensions.NV_texture_env_combine4;
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_SRC_ALPHA:
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      legal = GL_TRUE;
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      legal = GL_FALSE;
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!legal) {
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", param);
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FLUSH_VERTICES(ctx, _NEW_TEXTURE);
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (alpha)
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      texUnit->Combine.OperandA[term] = param;
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      texUnit->Combine.OperandRGB[term] = param;
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgset_combiner_scale(struct gl_context *ctx,
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   struct gl_texture_unit *texUnit,
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   GLenum pname, GLfloat scale)
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint shift;
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (scale == 1.0F) {
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      shift = 0;
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (scale == 2.0F) {
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      shift = 1;
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (scale == 4.0F) {
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      shift = 2;
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error( ctx, GL_INVALID_VALUE,
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   "glTexEnv(GL_RGB_SCALE not 1, 2 or 4)" );
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (pname) {
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGB_SCALE:
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (texUnit->Combine.ScaleShiftRGB == shift)
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return;
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FLUSH_VERTICES(ctx, _NEW_TEXTURE);
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      texUnit->Combine.ScaleShiftRGB = shift;
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ALPHA_SCALE:
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (texUnit->Combine.ScaleShiftA == shift)
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return;
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FLUSH_VERTICES(ctx, _NEW_TEXTURE);
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      texUnit->Combine.ScaleShiftA = shift;
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_TexEnvfv( GLenum target, GLenum pname, const GLfloat *param )
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLint iparam0 = (GLint) param[0];
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_texture_unit *texUnit;
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint maxUnit;
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END(ctx);
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   maxUnit = (target == GL_POINT_SPRITE_NV && pname == GL_COORD_REPLACE_NV)
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ? ctx->Const.MaxTextureCoordUnits : ctx->Const.MaxCombinedTextureImageUnits;
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Texture.CurrentUnit >= maxUnit) {
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_OPERATION, "glTexEnvfv(current unit)");
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texUnit = _mesa_get_current_tex_unit(ctx);
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (target == GL_TEXTURE_ENV) {
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (pname) {
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_TEXTURE_ENV_MODE:
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         set_env_mode(ctx, texUnit, (GLenum) iparam0);
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_TEXTURE_ENV_COLOR:
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         set_env_color(ctx, texUnit, param);
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMBINE_RGB:
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_COMBINE_ALPHA:
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         set_combiner_mode(ctx, texUnit, pname, (GLenum) iparam0);
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_SOURCE0_RGB:
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_SOURCE1_RGB:
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_SOURCE2_RGB:
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_SOURCE3_RGB_NV:
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_SOURCE0_ALPHA:
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_SOURCE1_ALPHA:
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_SOURCE2_ALPHA:
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_SOURCE3_ALPHA_NV:
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         set_combiner_source(ctx, texUnit, pname, (GLenum) iparam0);
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_OPERAND0_RGB:
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_OPERAND1_RGB:
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_OPERAND2_RGB:
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_OPERAND3_RGB_NV:
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_OPERAND0_ALPHA:
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_OPERAND1_ALPHA:
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_OPERAND2_ALPHA:
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_OPERAND3_ALPHA_NV:
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         set_combiner_operand(ctx, texUnit, pname, (GLenum) iparam0);
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_RGB_SCALE:
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_ALPHA_SCALE:
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         set_combiner_scale(ctx, texUnit, pname, param[0]);
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_BUMP_TARGET_ATI:
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (ctx->API != API_OPENGL || !ctx->Extensions.ATI_envmap_bumpmap) {
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(pname=0x%x)", pname );
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    return;
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if ((iparam0 < GL_TEXTURE0) ||
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             (iparam0 > GL_TEXTURE31)) {
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    /* spec doesn't say this but it seems logical */
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(param=0x%x)", iparam0);
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    return;
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (!((1 << (iparam0 - GL_TEXTURE0)) & ctx->Const.SupportedBumpUnits)) {
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    _mesa_error( ctx, GL_INVALID_VALUE, "glTexEnv(param=0x%x)", iparam0);
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    return;
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 else {
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    FLUSH_VERTICES(ctx, _NEW_TEXTURE);
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    texUnit->BumpTarget = iparam0;
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(pname)" );
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return;
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (target == GL_TEXTURE_FILTER_CONTROL_EXT) {
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (pname == GL_TEXTURE_LOD_BIAS_EXT) {
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (texUnit->LodBias == param[0])
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    return;
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 FLUSH_VERTICES(ctx, _NEW_TEXTURE);
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         texUnit->LodBias = param[0];
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return;
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (target == GL_POINT_SPRITE_NV) {
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* GL_ARB_point_sprite / GL_NV_point_sprite */
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!ctx->Extensions.NV_point_sprite
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  && !ctx->Extensions.ARB_point_sprite) {
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(target=0x%x)", target );
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return;
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (pname == GL_COORD_REPLACE_NV) {
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (iparam0 == GL_TRUE || iparam0 == GL_FALSE) {
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            /* It's kind of weird to set point state via glTexEnv,
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             * but that's what the spec calls for.
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             */
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            const GLboolean state = (GLboolean) iparam0;
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (ctx->Point.CoordReplace[ctx->Texture.CurrentUnit] == state)
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return;
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            FLUSH_VERTICES(ctx, _NEW_POINT);
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ctx->Point.CoordReplace[ctx->Texture.CurrentUnit] = state;
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else {
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            _mesa_error( ctx, GL_INVALID_VALUE, "glTexEnv(param=0x%x)", iparam0);
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return;
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(pname=0x%x)", pname );
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return;
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(target=0x%x)",target );
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (MESA_VERBOSE&(VERBOSE_API|VERBOSE_TEXTURE))
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_debug(ctx, "glTexEnv %s %s %.1f(%s) ...\n",
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  _mesa_lookup_enum_by_nr(target),
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  _mesa_lookup_enum_by_nr(pname),
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  *param,
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  _mesa_lookup_enum_by_nr((GLenum) iparam0));
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Tell device driver about the new texture environment */
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Driver.TexEnv) {
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (*ctx->Driver.TexEnv)( ctx, target, pname, param );
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_TexEnvf( GLenum target, GLenum pname, GLfloat param )
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLfloat p[4];
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   p[0] = param;
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   p[1] = p[2] = p[3] = 0.0;
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_TexEnvfv( target, pname, p );
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_TexEnvi( GLenum target, GLenum pname, GLint param )
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLfloat p[4];
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   p[0] = (GLfloat) param;
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   p[1] = p[2] = p[3] = 0.0;
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_TexEnvfv( target, pname, p );
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_TexEnviv( GLenum target, GLenum pname, const GLint *param )
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLfloat p[4];
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (pname == GL_TEXTURE_ENV_COLOR) {
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      p[0] = INT_TO_FLOAT( param[0] );
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      p[1] = INT_TO_FLOAT( param[1] );
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      p[2] = INT_TO_FLOAT( param[2] );
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      p[3] = INT_TO_FLOAT( param[3] );
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      p[0] = (GLfloat) param[0];
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      p[1] = p[2] = p[3] = 0;  /* init to zero, just to be safe */
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_TexEnvfv( target, pname, p );
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Helper for glGetTexEnvi/f()
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return  value of queried pname or -1 if error.
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLint
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgget_texenvi(struct gl_context *ctx, const struct gl_texture_unit *texUnit,
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            GLenum pname)
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (pname) {
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_ENV_MODE:
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return texUnit->EnvMode;
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COMBINE_RGB:
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return texUnit->Combine.ModeRGB;
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COMBINE_ALPHA:
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return texUnit->Combine.ModeA;
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_SOURCE0_RGB:
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_SOURCE1_RGB:
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_SOURCE2_RGB: {
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const unsigned rgb_idx = pname - GL_SOURCE0_RGB;
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return texUnit->Combine.SourceRGB[rgb_idx];
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_SOURCE3_RGB_NV:
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->API == API_OPENGL && ctx->Extensions.NV_texture_env_combine4) {
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return texUnit->Combine.SourceRGB[3];
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_SOURCE0_ALPHA:
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_SOURCE1_ALPHA:
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_SOURCE2_ALPHA: {
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const unsigned alpha_idx = pname - GL_SOURCE0_ALPHA;
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return texUnit->Combine.SourceA[alpha_idx];
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_SOURCE3_ALPHA_NV:
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->API == API_OPENGL && ctx->Extensions.NV_texture_env_combine4) {
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return texUnit->Combine.SourceA[3];
607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_OPERAND0_RGB:
613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_OPERAND1_RGB:
614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_OPERAND2_RGB: {
615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const unsigned op_rgb = pname - GL_OPERAND0_RGB;
616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return texUnit->Combine.OperandRGB[op_rgb];
617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_OPERAND3_RGB_NV:
619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->API == API_OPENGL && ctx->Extensions.NV_texture_env_combine4) {
620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return texUnit->Combine.OperandRGB[3];
621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_OPERAND0_ALPHA:
627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_OPERAND1_ALPHA:
628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_OPERAND2_ALPHA: {
629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const unsigned op_alpha = pname - GL_OPERAND0_ALPHA;
630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return texUnit->Combine.OperandA[op_alpha];
631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_OPERAND3_ALPHA_NV:
633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->API == API_OPENGL && ctx->Extensions.NV_texture_env_combine4) {
634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return texUnit->Combine.OperandA[3];
635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGB_SCALE:
641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 1 << texUnit->Combine.ScaleShiftRGB;
642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ALPHA_SCALE:
643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 1 << texUnit->Combine.ScaleShiftA;
644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_BUMP_TARGET_ATI:
645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* spec doesn't say so, but I think this should be queryable */
646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->API == API_OPENGL && ctx->Extensions.ATI_envmap_bumpmap) {
647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return texUnit->BumpTarget;
648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return -1; /* error */
660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_GetTexEnvfv( GLenum target, GLenum pname, GLfloat *params )
666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint maxUnit;
668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct gl_texture_unit *texUnit;
669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END(ctx);
671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   maxUnit = (target == GL_POINT_SPRITE_NV && pname == GL_COORD_REPLACE_NV)
673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ? ctx->Const.MaxTextureCoordUnits : ctx->Const.MaxCombinedTextureImageUnits;
674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Texture.CurrentUnit >= maxUnit) {
675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexEnvfv(current unit)");
676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texUnit = _mesa_get_current_tex_unit(ctx);
680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (target == GL_TEXTURE_ENV) {
682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (pname == GL_TEXTURE_ENV_COLOR) {
683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if(ctx->NewState & (_NEW_BUFFERS | _NEW_FRAG_CLAMP))
684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            _mesa_update_state(ctx);
685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if(ctx->Color._ClampFragmentColor)
686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            COPY_4FV( params, texUnit->EnvColor );
687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else
688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            COPY_4FV( params, texUnit->EnvColorUnclamped );
689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLint val = get_texenvi(ctx, texUnit, pname);
692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (val >= 0) {
693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            *params = (GLfloat) val;
694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (target == GL_TEXTURE_FILTER_CONTROL_EXT) {
698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (pname == GL_TEXTURE_LOD_BIAS_EXT) {
699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *params = texUnit->LodBias;
700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)" );
703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return;
704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (target == GL_POINT_SPRITE_NV) {
707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* GL_ARB_point_sprite / GL_NV_point_sprite */
708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!ctx->Extensions.NV_point_sprite
709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  && !ctx->Extensions.ARB_point_sprite) {
710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(target)" );
711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return;
712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (pname == GL_COORD_REPLACE_NV) {
714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *params = (GLfloat) ctx->Point.CoordReplace[ctx->Texture.CurrentUnit];
715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)" );
718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return;
719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(target)" );
723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_GetTexEnviv( GLenum target, GLenum pname, GLint *params )
730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint maxUnit;
732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct gl_texture_unit *texUnit;
733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END(ctx);
735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   maxUnit = (target == GL_POINT_SPRITE_NV && pname == GL_COORD_REPLACE_NV)
737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ? ctx->Const.MaxTextureCoordUnits : ctx->Const.MaxCombinedTextureImageUnits;
738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Texture.CurrentUnit >= maxUnit) {
739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexEnviv(current unit)");
740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texUnit = _mesa_get_current_tex_unit(ctx);
744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (target == GL_TEXTURE_ENV) {
746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (pname == GL_TEXTURE_ENV_COLOR) {
747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         params[0] = FLOAT_TO_INT( texUnit->EnvColor[0] );
748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         params[1] = FLOAT_TO_INT( texUnit->EnvColor[1] );
749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         params[2] = FLOAT_TO_INT( texUnit->EnvColor[2] );
750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         params[3] = FLOAT_TO_INT( texUnit->EnvColor[3] );
751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLint val = get_texenvi(ctx, texUnit, pname);
754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (val >= 0) {
755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            *params = val;
756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (target == GL_TEXTURE_FILTER_CONTROL_EXT) {
760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (pname == GL_TEXTURE_LOD_BIAS_EXT) {
761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *params = (GLint) texUnit->LodBias;
762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)" );
765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return;
766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (target == GL_POINT_SPRITE_NV) {
769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* GL_ARB_point_sprite / GL_NV_point_sprite */
770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!ctx->Extensions.NV_point_sprite
771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  && !ctx->Extensions.ARB_point_sprite) {
772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(target)" );
773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return;
774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (pname == GL_COORD_REPLACE_NV) {
776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *params = (GLint) ctx->Point.CoordReplace[ctx->Texture.CurrentUnit];
777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)" );
780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return;
781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(target)" );
785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Why does ATI_envmap_bumpmap require new entrypoints? Should just
792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * reuse TexEnv ones...
793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_TexBumpParameterivATI( GLenum pname, const GLint *param )
796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLfloat p[4];
798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END(ctx);
800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ctx->Extensions.ATI_envmap_bumpmap) {
802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* This isn't an "official" error case, but let's tell the user
803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * that something's wrong.
804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_OPERATION, "glTexBumpParameterivATI");
806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (pname == GL_BUMP_ROT_MATRIX_ATI) {
810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* hope that conversion is correct here */
811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      p[0] = INT_TO_FLOAT( param[0] );
812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      p[1] = INT_TO_FLOAT( param[1] );
813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      p[2] = INT_TO_FLOAT( param[2] );
814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      p[3] = INT_TO_FLOAT( param[3] );
815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      p[0] = (GLfloat) param[0];
818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      p[1] = p[2] = p[3] = 0.0F;  /* init to zero, just to be safe */
819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_TexBumpParameterfvATI( pname, p );
821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_TexBumpParameterfvATI( GLenum pname, const GLfloat *param )
826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_texture_unit *texUnit;
828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END(ctx);
830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ctx->Extensions.ATI_envmap_bumpmap) {
832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_OPERATION, "glTexBumpParameterfvATI");
833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texUnit = _mesa_get_current_tex_unit(ctx);
837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (pname == GL_BUMP_ROT_MATRIX_ATI) {
839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (TEST_EQ_4V(param, texUnit->RotMatrix))
840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return;
841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FLUSH_VERTICES(ctx, _NEW_TEXTURE);
842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      COPY_4FV(texUnit->RotMatrix, param);
843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error( ctx, GL_INVALID_ENUM, "glTexBumpParameter(pname)" );
846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Drivers might want to know about this, instead of dedicated function
849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      just shove it into TexEnv where it really belongs anyway */
850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Driver.TexEnv) {
851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (*ctx->Driver.TexEnv)( ctx, 0, pname, param );
852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_GetTexBumpParameterivATI( GLenum pname, GLint *param )
858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct gl_texture_unit *texUnit;
860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint i;
861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END(ctx);
863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ctx->Extensions.ATI_envmap_bumpmap) {
865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexBumpParameterivATI");
866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texUnit = _mesa_get_current_tex_unit(ctx);
870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (pname == GL_BUMP_ROT_MATRIX_SIZE_ATI) {
872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* spec leaves open to support larger matrices.
873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         Don't think anyone would ever want to use it
874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         (and apps almost certainly would not understand it and
875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         thus fail to submit matrices correctly) so hardcode this. */
876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *param = 4;
877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (pname == GL_BUMP_ROT_MATRIX_ATI) {
879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* hope that conversion is correct here */
880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      param[0] = FLOAT_TO_INT(texUnit->RotMatrix[0]);
881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      param[1] = FLOAT_TO_INT(texUnit->RotMatrix[1]);
882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      param[2] = FLOAT_TO_INT(texUnit->RotMatrix[2]);
883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      param[3] = FLOAT_TO_INT(texUnit->RotMatrix[3]);
884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (pname == GL_BUMP_NUM_TEX_UNITS_ATI) {
886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint count = 0;
887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < ctx->Const.MaxTextureImageUnits; i++) {
888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (ctx->Const.SupportedBumpUnits & (1 << i)) {
889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            count++;
890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *param = count;
893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (pname == GL_BUMP_TEX_UNITS_ATI) {
895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < ctx->Const.MaxTextureImageUnits; i++) {
896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (ctx->Const.SupportedBumpUnits & (1 << i)) {
897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            *param++ = i + GL_TEXTURE0;
898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexBumpParameter(pname)" );
903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_GetTexBumpParameterfvATI( GLenum pname, GLfloat *param )
910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct gl_texture_unit *texUnit;
912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint i;
913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END(ctx);
915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ctx->Extensions.ATI_envmap_bumpmap) {
917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexBumpParameterfvATI");
918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texUnit = _mesa_get_current_tex_unit(ctx);
922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (pname == GL_BUMP_ROT_MATRIX_SIZE_ATI) {
924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* spec leaves open to support larger matrices.
925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         Don't think anyone would ever want to use it
926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         (and apps might not understand it) so hardcode this. */
927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *param = 4.0F;
928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (pname == GL_BUMP_ROT_MATRIX_ATI) {
930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      param[0] = texUnit->RotMatrix[0];
931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      param[1] = texUnit->RotMatrix[1];
932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      param[2] = texUnit->RotMatrix[2];
933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      param[3] = texUnit->RotMatrix[3];
934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (pname == GL_BUMP_NUM_TEX_UNITS_ATI) {
936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint count = 0;
937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < ctx->Const.MaxTextureImageUnits; i++) {
938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (ctx->Const.SupportedBumpUnits & (1 << i)) {
939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            count++;
940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *param = (GLfloat) count;
943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (pname == GL_BUMP_TEX_UNITS_ATI) {
945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < ctx->Const.MaxTextureImageUnits; i++) {
946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (ctx->Const.SupportedBumpUnits & (1 << i)) {
947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            *param++ = (GLfloat) (i + GL_TEXTURE0);
948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexBumpParameter(pname)" );
953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
956