xref: /aosp_15_r20/external/mesa3d/src/mesa/main/texenv.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Mesa 3-D graphics library
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
5*61046927SAndroid Build Coastguard Worker  * Copyright (C) 2009  VMware, Inc.  All Rights Reserved.
6*61046927SAndroid Build Coastguard Worker  *
7*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
8*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
9*61046927SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
10*61046927SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11*61046927SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
12*61046927SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
13*61046927SAndroid Build Coastguard Worker  *
14*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice shall be included
15*61046927SAndroid Build Coastguard Worker  * in all copies or substantial portions of the Software.
16*61046927SAndroid Build Coastguard Worker  *
17*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18*61046927SAndroid Build Coastguard Worker  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20*61046927SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
21*61046927SAndroid Build Coastguard Worker  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22*61046927SAndroid Build Coastguard Worker  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23*61046927SAndroid Build Coastguard Worker  * OTHER DEALINGS IN THE SOFTWARE.
24*61046927SAndroid Build Coastguard Worker  */
25*61046927SAndroid Build Coastguard Worker 
26*61046927SAndroid Build Coastguard Worker /**
27*61046927SAndroid Build Coastguard Worker  * \file texenv.c
28*61046927SAndroid Build Coastguard Worker  *
29*61046927SAndroid Build Coastguard Worker  * glTexEnv-related functions
30*61046927SAndroid Build Coastguard Worker  */
31*61046927SAndroid Build Coastguard Worker 
32*61046927SAndroid Build Coastguard Worker 
33*61046927SAndroid Build Coastguard Worker #include "util/glheader.h"
34*61046927SAndroid Build Coastguard Worker #include "main/context.h"
35*61046927SAndroid Build Coastguard Worker #include "main/blend.h"
36*61046927SAndroid Build Coastguard Worker #include "main/enums.h"
37*61046927SAndroid Build Coastguard Worker #include "main/macros.h"
38*61046927SAndroid Build Coastguard Worker #include "main/mtypes.h"
39*61046927SAndroid Build Coastguard Worker #include "main/state.h"
40*61046927SAndroid Build Coastguard Worker #include "main/texstate.h"
41*61046927SAndroid Build Coastguard Worker #include "api_exec_decl.h"
42*61046927SAndroid Build Coastguard Worker 
43*61046927SAndroid Build Coastguard Worker 
44*61046927SAndroid Build Coastguard Worker #define TE_ERROR(errCode, msg, value)				\
45*61046927SAndroid Build Coastguard Worker    _mesa_error(ctx, errCode, msg, _mesa_enum_to_string(value));
46*61046927SAndroid Build Coastguard Worker 
47*61046927SAndroid Build Coastguard Worker 
48*61046927SAndroid Build Coastguard Worker /** Set texture env mode */
49*61046927SAndroid Build Coastguard Worker static void
set_env_mode(struct gl_context * ctx,struct gl_fixedfunc_texture_unit * texUnit,GLenum mode)50*61046927SAndroid Build Coastguard Worker set_env_mode(struct gl_context *ctx,
51*61046927SAndroid Build Coastguard Worker              struct gl_fixedfunc_texture_unit *texUnit,
52*61046927SAndroid Build Coastguard Worker              GLenum mode)
53*61046927SAndroid Build Coastguard Worker {
54*61046927SAndroid Build Coastguard Worker    GLboolean legal;
55*61046927SAndroid Build Coastguard Worker 
56*61046927SAndroid Build Coastguard Worker    if (texUnit->EnvMode == mode)
57*61046927SAndroid Build Coastguard Worker       return;
58*61046927SAndroid Build Coastguard Worker 
59*61046927SAndroid Build Coastguard Worker    switch (mode) {
60*61046927SAndroid Build Coastguard Worker    case GL_MODULATE:
61*61046927SAndroid Build Coastguard Worker    case GL_BLEND:
62*61046927SAndroid Build Coastguard Worker    case GL_DECAL:
63*61046927SAndroid Build Coastguard Worker    case GL_REPLACE:
64*61046927SAndroid Build Coastguard Worker    case GL_ADD:
65*61046927SAndroid Build Coastguard Worker    case GL_COMBINE:
66*61046927SAndroid Build Coastguard Worker       legal = GL_TRUE;
67*61046927SAndroid Build Coastguard Worker       break;
68*61046927SAndroid Build Coastguard Worker    case GL_REPLACE_EXT:
69*61046927SAndroid Build Coastguard Worker       mode = GL_REPLACE; /* GL_REPLACE_EXT != GL_REPLACE */
70*61046927SAndroid Build Coastguard Worker       legal = GL_TRUE;
71*61046927SAndroid Build Coastguard Worker       break;
72*61046927SAndroid Build Coastguard Worker    case GL_COMBINE4_NV:
73*61046927SAndroid Build Coastguard Worker       legal = ctx->Extensions.NV_texture_env_combine4;
74*61046927SAndroid Build Coastguard Worker       break;
75*61046927SAndroid Build Coastguard Worker    default:
76*61046927SAndroid Build Coastguard Worker       legal = GL_FALSE;
77*61046927SAndroid Build Coastguard Worker    }
78*61046927SAndroid Build Coastguard Worker 
79*61046927SAndroid Build Coastguard Worker    if (legal) {
80*61046927SAndroid Build Coastguard Worker       FLUSH_VERTICES(ctx, _NEW_TEXTURE_STATE, GL_TEXTURE_BIT);
81*61046927SAndroid Build Coastguard Worker       texUnit->EnvMode = mode;
82*61046927SAndroid Build Coastguard Worker    }
83*61046927SAndroid Build Coastguard Worker    else {
84*61046927SAndroid Build Coastguard Worker       TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode);
85*61046927SAndroid Build Coastguard Worker    }
86*61046927SAndroid Build Coastguard Worker }
87*61046927SAndroid Build Coastguard Worker 
88*61046927SAndroid Build Coastguard Worker 
89*61046927SAndroid Build Coastguard Worker static void
set_env_color(struct gl_context * ctx,struct gl_fixedfunc_texture_unit * texUnit,const GLfloat * color)90*61046927SAndroid Build Coastguard Worker set_env_color(struct gl_context *ctx,
91*61046927SAndroid Build Coastguard Worker               struct gl_fixedfunc_texture_unit *texUnit,
92*61046927SAndroid Build Coastguard Worker               const GLfloat *color)
93*61046927SAndroid Build Coastguard Worker {
94*61046927SAndroid Build Coastguard Worker    if (TEST_EQ_4V(color, texUnit->EnvColorUnclamped))
95*61046927SAndroid Build Coastguard Worker       return;
96*61046927SAndroid Build Coastguard Worker    FLUSH_VERTICES(ctx, _NEW_TEXTURE_STATE, GL_TEXTURE_BIT);
97*61046927SAndroid Build Coastguard Worker    COPY_4FV(texUnit->EnvColorUnclamped, color);
98*61046927SAndroid Build Coastguard Worker    texUnit->EnvColor[0] = CLAMP(color[0], 0.0F, 1.0F);
99*61046927SAndroid Build Coastguard Worker    texUnit->EnvColor[1] = CLAMP(color[1], 0.0F, 1.0F);
100*61046927SAndroid Build Coastguard Worker    texUnit->EnvColor[2] = CLAMP(color[2], 0.0F, 1.0F);
101*61046927SAndroid Build Coastguard Worker    texUnit->EnvColor[3] = CLAMP(color[3], 0.0F, 1.0F);
102*61046927SAndroid Build Coastguard Worker }
103*61046927SAndroid Build Coastguard Worker 
104*61046927SAndroid Build Coastguard Worker 
105*61046927SAndroid Build Coastguard Worker /** Set an RGB or A combiner mode/function */
106*61046927SAndroid Build Coastguard Worker static bool
set_combiner_mode(struct gl_context * ctx,struct gl_fixedfunc_texture_unit * texUnit,GLenum pname,GLenum mode)107*61046927SAndroid Build Coastguard Worker set_combiner_mode(struct gl_context *ctx,
108*61046927SAndroid Build Coastguard Worker                   struct gl_fixedfunc_texture_unit *texUnit,
109*61046927SAndroid Build Coastguard Worker                   GLenum pname, GLenum mode)
110*61046927SAndroid Build Coastguard Worker {
111*61046927SAndroid Build Coastguard Worker    GLboolean legal;
112*61046927SAndroid Build Coastguard Worker 
113*61046927SAndroid Build Coastguard Worker    switch (mode) {
114*61046927SAndroid Build Coastguard Worker    case GL_REPLACE:
115*61046927SAndroid Build Coastguard Worker    case GL_MODULATE:
116*61046927SAndroid Build Coastguard Worker    case GL_ADD:
117*61046927SAndroid Build Coastguard Worker    case GL_ADD_SIGNED:
118*61046927SAndroid Build Coastguard Worker    case GL_INTERPOLATE:
119*61046927SAndroid Build Coastguard Worker    case GL_SUBTRACT:
120*61046927SAndroid Build Coastguard Worker       legal = GL_TRUE;
121*61046927SAndroid Build Coastguard Worker       break;
122*61046927SAndroid Build Coastguard Worker    case GL_DOT3_RGB_EXT:
123*61046927SAndroid Build Coastguard Worker    case GL_DOT3_RGBA_EXT:
124*61046927SAndroid Build Coastguard Worker       legal = (_mesa_is_desktop_gl_compat(ctx) &&
125*61046927SAndroid Build Coastguard Worker                ctx->Extensions.EXT_texture_env_dot3 &&
126*61046927SAndroid Build Coastguard Worker                pname == GL_COMBINE_RGB);
127*61046927SAndroid Build Coastguard Worker       break;
128*61046927SAndroid Build Coastguard Worker    case GL_DOT3_RGB:
129*61046927SAndroid Build Coastguard Worker    case GL_DOT3_RGBA:
130*61046927SAndroid Build Coastguard Worker       legal = (pname == GL_COMBINE_RGB);
131*61046927SAndroid Build Coastguard Worker       break;
132*61046927SAndroid Build Coastguard Worker    case GL_MODULATE_ADD_ATI:
133*61046927SAndroid Build Coastguard Worker    case GL_MODULATE_SIGNED_ADD_ATI:
134*61046927SAndroid Build Coastguard Worker    case GL_MODULATE_SUBTRACT_ATI:
135*61046927SAndroid Build Coastguard Worker       legal = (_mesa_is_desktop_gl_compat(ctx) &&
136*61046927SAndroid Build Coastguard Worker                ctx->Extensions.ATI_texture_env_combine3);
137*61046927SAndroid Build Coastguard Worker       break;
138*61046927SAndroid Build Coastguard Worker    default:
139*61046927SAndroid Build Coastguard Worker       legal = GL_FALSE;
140*61046927SAndroid Build Coastguard Worker    }
141*61046927SAndroid Build Coastguard Worker 
142*61046927SAndroid Build Coastguard Worker    if (!legal) {
143*61046927SAndroid Build Coastguard Worker       TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode);
144*61046927SAndroid Build Coastguard Worker       return false;
145*61046927SAndroid Build Coastguard Worker    }
146*61046927SAndroid Build Coastguard Worker 
147*61046927SAndroid Build Coastguard Worker    switch (pname) {
148*61046927SAndroid Build Coastguard Worker    case GL_COMBINE_RGB:
149*61046927SAndroid Build Coastguard Worker       if (texUnit->Combine.ModeRGB == mode)
150*61046927SAndroid Build Coastguard Worker          return true;
151*61046927SAndroid Build Coastguard Worker       FLUSH_VERTICES(ctx, _NEW_TEXTURE_STATE, GL_TEXTURE_BIT);
152*61046927SAndroid Build Coastguard Worker       texUnit->Combine.ModeRGB = mode;
153*61046927SAndroid Build Coastguard Worker       break;
154*61046927SAndroid Build Coastguard Worker 
155*61046927SAndroid Build Coastguard Worker    case GL_COMBINE_ALPHA:
156*61046927SAndroid Build Coastguard Worker       if (texUnit->Combine.ModeA == mode)
157*61046927SAndroid Build Coastguard Worker          return true;
158*61046927SAndroid Build Coastguard Worker       FLUSH_VERTICES(ctx, _NEW_TEXTURE_STATE, GL_TEXTURE_BIT);
159*61046927SAndroid Build Coastguard Worker       texUnit->Combine.ModeA = mode;
160*61046927SAndroid Build Coastguard Worker       break;
161*61046927SAndroid Build Coastguard Worker    default:
162*61046927SAndroid Build Coastguard Worker       TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
163*61046927SAndroid Build Coastguard Worker       return false;
164*61046927SAndroid Build Coastguard Worker    }
165*61046927SAndroid Build Coastguard Worker 
166*61046927SAndroid Build Coastguard Worker    return true;
167*61046927SAndroid Build Coastguard Worker }
168*61046927SAndroid Build Coastguard Worker 
169*61046927SAndroid Build Coastguard Worker 
170*61046927SAndroid Build Coastguard Worker 
171*61046927SAndroid Build Coastguard Worker /** Set an RGB or A combiner source term */
172*61046927SAndroid Build Coastguard Worker static bool
set_combiner_source(struct gl_context * ctx,struct gl_fixedfunc_texture_unit * texUnit,GLenum pname,GLenum param)173*61046927SAndroid Build Coastguard Worker set_combiner_source(struct gl_context *ctx,
174*61046927SAndroid Build Coastguard Worker                     struct gl_fixedfunc_texture_unit *texUnit,
175*61046927SAndroid Build Coastguard Worker                     GLenum pname, GLenum param)
176*61046927SAndroid Build Coastguard Worker {
177*61046927SAndroid Build Coastguard Worker    GLuint term;
178*61046927SAndroid Build Coastguard Worker    GLboolean alpha, legal;
179*61046927SAndroid Build Coastguard Worker 
180*61046927SAndroid Build Coastguard Worker    /*
181*61046927SAndroid Build Coastguard Worker     * Translate pname to (term, alpha).
182*61046927SAndroid Build Coastguard Worker     *
183*61046927SAndroid Build Coastguard Worker     * The enums were given sequential values for a reason.
184*61046927SAndroid Build Coastguard Worker     */
185*61046927SAndroid Build Coastguard Worker    switch (pname) {
186*61046927SAndroid Build Coastguard Worker    case GL_SOURCE0_RGB:
187*61046927SAndroid Build Coastguard Worker    case GL_SOURCE1_RGB:
188*61046927SAndroid Build Coastguard Worker    case GL_SOURCE2_RGB:
189*61046927SAndroid Build Coastguard Worker    case GL_SOURCE3_RGB_NV:
190*61046927SAndroid Build Coastguard Worker       term = pname - GL_SOURCE0_RGB;
191*61046927SAndroid Build Coastguard Worker       alpha = GL_FALSE;
192*61046927SAndroid Build Coastguard Worker       break;
193*61046927SAndroid Build Coastguard Worker    case GL_SOURCE0_ALPHA:
194*61046927SAndroid Build Coastguard Worker    case GL_SOURCE1_ALPHA:
195*61046927SAndroid Build Coastguard Worker    case GL_SOURCE2_ALPHA:
196*61046927SAndroid Build Coastguard Worker    case GL_SOURCE3_ALPHA_NV:
197*61046927SAndroid Build Coastguard Worker       term = pname - GL_SOURCE0_ALPHA;
198*61046927SAndroid Build Coastguard Worker       alpha = GL_TRUE;
199*61046927SAndroid Build Coastguard Worker       break;
200*61046927SAndroid Build Coastguard Worker    default:
201*61046927SAndroid Build Coastguard Worker       TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
202*61046927SAndroid Build Coastguard Worker       return false;
203*61046927SAndroid Build Coastguard Worker    }
204*61046927SAndroid Build Coastguard Worker 
205*61046927SAndroid Build Coastguard Worker    if ((term == 3) && (ctx->API != API_OPENGL_COMPAT
206*61046927SAndroid Build Coastguard Worker                        || !ctx->Extensions.NV_texture_env_combine4)) {
207*61046927SAndroid Build Coastguard Worker       TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
208*61046927SAndroid Build Coastguard Worker       return false;
209*61046927SAndroid Build Coastguard Worker    }
210*61046927SAndroid Build Coastguard Worker 
211*61046927SAndroid Build Coastguard Worker    assert(term < MAX_COMBINER_TERMS);
212*61046927SAndroid Build Coastguard Worker 
213*61046927SAndroid Build Coastguard Worker    /*
214*61046927SAndroid Build Coastguard Worker     * Error-check param (the source term)
215*61046927SAndroid Build Coastguard Worker     */
216*61046927SAndroid Build Coastguard Worker    switch (param) {
217*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE:
218*61046927SAndroid Build Coastguard Worker    case GL_CONSTANT:
219*61046927SAndroid Build Coastguard Worker    case GL_PRIMARY_COLOR:
220*61046927SAndroid Build Coastguard Worker    case GL_PREVIOUS:
221*61046927SAndroid Build Coastguard Worker       legal = GL_TRUE;
222*61046927SAndroid Build Coastguard Worker       break;
223*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE0:
224*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE1:
225*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE2:
226*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE3:
227*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE4:
228*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE5:
229*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE6:
230*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE7:
231*61046927SAndroid Build Coastguard Worker       legal = (param - GL_TEXTURE0 < ctx->Const.MaxTextureUnits);
232*61046927SAndroid Build Coastguard Worker       break;
233*61046927SAndroid Build Coastguard Worker    case GL_ZERO:
234*61046927SAndroid Build Coastguard Worker       legal = (_mesa_is_desktop_gl_compat(ctx) &&
235*61046927SAndroid Build Coastguard Worker                (ctx->Extensions.ATI_texture_env_combine3 ||
236*61046927SAndroid Build Coastguard Worker                 ctx->Extensions.NV_texture_env_combine4));
237*61046927SAndroid Build Coastguard Worker       break;
238*61046927SAndroid Build Coastguard Worker    case GL_ONE:
239*61046927SAndroid Build Coastguard Worker       legal = (_mesa_is_desktop_gl_compat(ctx) &&
240*61046927SAndroid Build Coastguard Worker                ctx->Extensions.ATI_texture_env_combine3);
241*61046927SAndroid Build Coastguard Worker       break;
242*61046927SAndroid Build Coastguard Worker    default:
243*61046927SAndroid Build Coastguard Worker       legal = GL_FALSE;
244*61046927SAndroid Build Coastguard Worker    }
245*61046927SAndroid Build Coastguard Worker 
246*61046927SAndroid Build Coastguard Worker    if (!legal) {
247*61046927SAndroid Build Coastguard Worker       TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", param);
248*61046927SAndroid Build Coastguard Worker       return false;
249*61046927SAndroid Build Coastguard Worker    }
250*61046927SAndroid Build Coastguard Worker 
251*61046927SAndroid Build Coastguard Worker    FLUSH_VERTICES(ctx, _NEW_TEXTURE_STATE, GL_TEXTURE_BIT);
252*61046927SAndroid Build Coastguard Worker 
253*61046927SAndroid Build Coastguard Worker    if (alpha)
254*61046927SAndroid Build Coastguard Worker       texUnit->Combine.SourceA[term] = param;
255*61046927SAndroid Build Coastguard Worker    else
256*61046927SAndroid Build Coastguard Worker       texUnit->Combine.SourceRGB[term] = param;
257*61046927SAndroid Build Coastguard Worker 
258*61046927SAndroid Build Coastguard Worker    return true;
259*61046927SAndroid Build Coastguard Worker }
260*61046927SAndroid Build Coastguard Worker 
261*61046927SAndroid Build Coastguard Worker 
262*61046927SAndroid Build Coastguard Worker /** Set an RGB or A combiner operand term */
263*61046927SAndroid Build Coastguard Worker static bool
set_combiner_operand(struct gl_context * ctx,struct gl_fixedfunc_texture_unit * texUnit,GLenum pname,GLenum param)264*61046927SAndroid Build Coastguard Worker set_combiner_operand(struct gl_context *ctx,
265*61046927SAndroid Build Coastguard Worker                      struct gl_fixedfunc_texture_unit *texUnit,
266*61046927SAndroid Build Coastguard Worker                      GLenum pname, GLenum param)
267*61046927SAndroid Build Coastguard Worker {
268*61046927SAndroid Build Coastguard Worker    GLuint term;
269*61046927SAndroid Build Coastguard Worker    GLboolean alpha, legal;
270*61046927SAndroid Build Coastguard Worker 
271*61046927SAndroid Build Coastguard Worker    /* The enums were given sequential values for a reason.
272*61046927SAndroid Build Coastguard Worker     */
273*61046927SAndroid Build Coastguard Worker    switch (pname) {
274*61046927SAndroid Build Coastguard Worker    case GL_OPERAND0_RGB:
275*61046927SAndroid Build Coastguard Worker    case GL_OPERAND1_RGB:
276*61046927SAndroid Build Coastguard Worker    case GL_OPERAND2_RGB:
277*61046927SAndroid Build Coastguard Worker    case GL_OPERAND3_RGB_NV:
278*61046927SAndroid Build Coastguard Worker       term = pname - GL_OPERAND0_RGB;
279*61046927SAndroid Build Coastguard Worker       alpha = GL_FALSE;
280*61046927SAndroid Build Coastguard Worker       break;
281*61046927SAndroid Build Coastguard Worker    case GL_OPERAND0_ALPHA:
282*61046927SAndroid Build Coastguard Worker    case GL_OPERAND1_ALPHA:
283*61046927SAndroid Build Coastguard Worker    case GL_OPERAND2_ALPHA:
284*61046927SAndroid Build Coastguard Worker    case GL_OPERAND3_ALPHA_NV:
285*61046927SAndroid Build Coastguard Worker       term = pname - GL_OPERAND0_ALPHA;
286*61046927SAndroid Build Coastguard Worker       alpha = GL_TRUE;
287*61046927SAndroid Build Coastguard Worker       break;
288*61046927SAndroid Build Coastguard Worker    default:
289*61046927SAndroid Build Coastguard Worker       TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
290*61046927SAndroid Build Coastguard Worker       return false;
291*61046927SAndroid Build Coastguard Worker    }
292*61046927SAndroid Build Coastguard Worker 
293*61046927SAndroid Build Coastguard Worker    if ((term == 3) && (ctx->API != API_OPENGL_COMPAT
294*61046927SAndroid Build Coastguard Worker                        || !ctx->Extensions.NV_texture_env_combine4)) {
295*61046927SAndroid Build Coastguard Worker       TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
296*61046927SAndroid Build Coastguard Worker       return false;
297*61046927SAndroid Build Coastguard Worker    }
298*61046927SAndroid Build Coastguard Worker 
299*61046927SAndroid Build Coastguard Worker    assert(term < MAX_COMBINER_TERMS);
300*61046927SAndroid Build Coastguard Worker 
301*61046927SAndroid Build Coastguard Worker    /*
302*61046927SAndroid Build Coastguard Worker     * Error-check param (the source operand)
303*61046927SAndroid Build Coastguard Worker     */
304*61046927SAndroid Build Coastguard Worker    switch (param) {
305*61046927SAndroid Build Coastguard Worker    case GL_SRC_COLOR:
306*61046927SAndroid Build Coastguard Worker    case GL_ONE_MINUS_SRC_COLOR:
307*61046927SAndroid Build Coastguard Worker       legal = !alpha;
308*61046927SAndroid Build Coastguard Worker       break;
309*61046927SAndroid Build Coastguard Worker    case GL_ONE_MINUS_SRC_ALPHA:
310*61046927SAndroid Build Coastguard Worker    case GL_SRC_ALPHA:
311*61046927SAndroid Build Coastguard Worker       legal = GL_TRUE;
312*61046927SAndroid Build Coastguard Worker       break;
313*61046927SAndroid Build Coastguard Worker    default:
314*61046927SAndroid Build Coastguard Worker       legal = GL_FALSE;
315*61046927SAndroid Build Coastguard Worker    }
316*61046927SAndroid Build Coastguard Worker 
317*61046927SAndroid Build Coastguard Worker    if (!legal) {
318*61046927SAndroid Build Coastguard Worker       TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", param);
319*61046927SAndroid Build Coastguard Worker       return false;
320*61046927SAndroid Build Coastguard Worker    }
321*61046927SAndroid Build Coastguard Worker 
322*61046927SAndroid Build Coastguard Worker    FLUSH_VERTICES(ctx, _NEW_TEXTURE_STATE, GL_TEXTURE_BIT);
323*61046927SAndroid Build Coastguard Worker 
324*61046927SAndroid Build Coastguard Worker    if (alpha)
325*61046927SAndroid Build Coastguard Worker       texUnit->Combine.OperandA[term] = param;
326*61046927SAndroid Build Coastguard Worker    else
327*61046927SAndroid Build Coastguard Worker       texUnit->Combine.OperandRGB[term] = param;
328*61046927SAndroid Build Coastguard Worker 
329*61046927SAndroid Build Coastguard Worker    return true;
330*61046927SAndroid Build Coastguard Worker }
331*61046927SAndroid Build Coastguard Worker 
332*61046927SAndroid Build Coastguard Worker 
333*61046927SAndroid Build Coastguard Worker static bool
set_combiner_scale(struct gl_context * ctx,struct gl_fixedfunc_texture_unit * texUnit,GLenum pname,GLfloat scale)334*61046927SAndroid Build Coastguard Worker set_combiner_scale(struct gl_context *ctx,
335*61046927SAndroid Build Coastguard Worker                    struct gl_fixedfunc_texture_unit *texUnit,
336*61046927SAndroid Build Coastguard Worker                    GLenum pname, GLfloat scale)
337*61046927SAndroid Build Coastguard Worker {
338*61046927SAndroid Build Coastguard Worker    GLuint shift;
339*61046927SAndroid Build Coastguard Worker 
340*61046927SAndroid Build Coastguard Worker    if (scale == 1.0F) {
341*61046927SAndroid Build Coastguard Worker       shift = 0;
342*61046927SAndroid Build Coastguard Worker    }
343*61046927SAndroid Build Coastguard Worker    else if (scale == 2.0F) {
344*61046927SAndroid Build Coastguard Worker       shift = 1;
345*61046927SAndroid Build Coastguard Worker    }
346*61046927SAndroid Build Coastguard Worker    else if (scale == 4.0F) {
347*61046927SAndroid Build Coastguard Worker       shift = 2;
348*61046927SAndroid Build Coastguard Worker    }
349*61046927SAndroid Build Coastguard Worker    else {
350*61046927SAndroid Build Coastguard Worker       _mesa_error( ctx, GL_INVALID_VALUE,
351*61046927SAndroid Build Coastguard Worker                    "glTexEnv(GL_RGB_SCALE not 1, 2 or 4)" );
352*61046927SAndroid Build Coastguard Worker       return false;
353*61046927SAndroid Build Coastguard Worker    }
354*61046927SAndroid Build Coastguard Worker 
355*61046927SAndroid Build Coastguard Worker    switch (pname) {
356*61046927SAndroid Build Coastguard Worker    case GL_RGB_SCALE:
357*61046927SAndroid Build Coastguard Worker       if (texUnit->Combine.ScaleShiftRGB == shift)
358*61046927SAndroid Build Coastguard Worker          return true;
359*61046927SAndroid Build Coastguard Worker       FLUSH_VERTICES(ctx, _NEW_TEXTURE_STATE, GL_TEXTURE_BIT);
360*61046927SAndroid Build Coastguard Worker       texUnit->Combine.ScaleShiftRGB = shift;
361*61046927SAndroid Build Coastguard Worker       break;
362*61046927SAndroid Build Coastguard Worker    case GL_ALPHA_SCALE:
363*61046927SAndroid Build Coastguard Worker       if (texUnit->Combine.ScaleShiftA == shift)
364*61046927SAndroid Build Coastguard Worker          return true;
365*61046927SAndroid Build Coastguard Worker       FLUSH_VERTICES(ctx, _NEW_TEXTURE_STATE, GL_TEXTURE_BIT);
366*61046927SAndroid Build Coastguard Worker       texUnit->Combine.ScaleShiftA = shift;
367*61046927SAndroid Build Coastguard Worker       break;
368*61046927SAndroid Build Coastguard Worker    default:
369*61046927SAndroid Build Coastguard Worker       TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
370*61046927SAndroid Build Coastguard Worker       return false;
371*61046927SAndroid Build Coastguard Worker    }
372*61046927SAndroid Build Coastguard Worker 
373*61046927SAndroid Build Coastguard Worker    return true;
374*61046927SAndroid Build Coastguard Worker }
375*61046927SAndroid Build Coastguard Worker 
376*61046927SAndroid Build Coastguard Worker 
377*61046927SAndroid Build Coastguard Worker static void
_mesa_texenvfv_indexed(struct gl_context * ctx,GLuint texunit,GLenum target,GLenum pname,const GLfloat * param)378*61046927SAndroid Build Coastguard Worker _mesa_texenvfv_indexed( struct gl_context* ctx, GLuint texunit, GLenum target,
379*61046927SAndroid Build Coastguard Worker                         GLenum pname, const GLfloat *param )
380*61046927SAndroid Build Coastguard Worker {
381*61046927SAndroid Build Coastguard Worker    const GLint iparam0 = (GLint) param[0];
382*61046927SAndroid Build Coastguard Worker    GLuint maxUnit;
383*61046927SAndroid Build Coastguard Worker 
384*61046927SAndroid Build Coastguard Worker    maxUnit = (target == GL_POINT_SPRITE && pname == GL_COORD_REPLACE)
385*61046927SAndroid Build Coastguard Worker       ? ctx->Const.MaxTextureCoordUnits : ctx->Const.MaxCombinedTextureImageUnits;
386*61046927SAndroid Build Coastguard Worker    if (texunit >= maxUnit) {
387*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION, "glTexEnvfv(texunit=%d)", texunit);
388*61046927SAndroid Build Coastguard Worker       return;
389*61046927SAndroid Build Coastguard Worker    }
390*61046927SAndroid Build Coastguard Worker 
391*61046927SAndroid Build Coastguard Worker    if (target == GL_TEXTURE_ENV) {
392*61046927SAndroid Build Coastguard Worker       struct gl_fixedfunc_texture_unit *texUnit =
393*61046927SAndroid Build Coastguard Worker          _mesa_get_fixedfunc_tex_unit(ctx, texunit);
394*61046927SAndroid Build Coastguard Worker 
395*61046927SAndroid Build Coastguard Worker       /* The GL spec says that we should report an error if the unit is greater
396*61046927SAndroid Build Coastguard Worker        * than GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, but in practice, only
397*61046927SAndroid Build Coastguard Worker        * fixed-function units are usable. This is probably a spec bug.
398*61046927SAndroid Build Coastguard Worker        * Ignore glTexEnv(GL_TEXTURE_ENV) calls for non-fixed-func units,
399*61046927SAndroid Build Coastguard Worker        * because we don't want to process calls that have no effect.
400*61046927SAndroid Build Coastguard Worker        */
401*61046927SAndroid Build Coastguard Worker       if (!texUnit)
402*61046927SAndroid Build Coastguard Worker          return;
403*61046927SAndroid Build Coastguard Worker 
404*61046927SAndroid Build Coastguard Worker       switch (pname) {
405*61046927SAndroid Build Coastguard Worker       case GL_TEXTURE_ENV_MODE:
406*61046927SAndroid Build Coastguard Worker          set_env_mode(ctx, texUnit, (GLenum) iparam0);
407*61046927SAndroid Build Coastguard Worker          break;
408*61046927SAndroid Build Coastguard Worker       case GL_TEXTURE_ENV_COLOR:
409*61046927SAndroid Build Coastguard Worker          set_env_color(ctx, texUnit, param);
410*61046927SAndroid Build Coastguard Worker          break;
411*61046927SAndroid Build Coastguard Worker       case GL_COMBINE_RGB:
412*61046927SAndroid Build Coastguard Worker       case GL_COMBINE_ALPHA:
413*61046927SAndroid Build Coastguard Worker          if (!set_combiner_mode(ctx, texUnit, pname, (GLenum) iparam0))
414*61046927SAndroid Build Coastguard Worker             return;
415*61046927SAndroid Build Coastguard Worker 	 break;
416*61046927SAndroid Build Coastguard Worker       case GL_SOURCE0_RGB:
417*61046927SAndroid Build Coastguard Worker       case GL_SOURCE1_RGB:
418*61046927SAndroid Build Coastguard Worker       case GL_SOURCE2_RGB:
419*61046927SAndroid Build Coastguard Worker       case GL_SOURCE3_RGB_NV:
420*61046927SAndroid Build Coastguard Worker       case GL_SOURCE0_ALPHA:
421*61046927SAndroid Build Coastguard Worker       case GL_SOURCE1_ALPHA:
422*61046927SAndroid Build Coastguard Worker       case GL_SOURCE2_ALPHA:
423*61046927SAndroid Build Coastguard Worker       case GL_SOURCE3_ALPHA_NV:
424*61046927SAndroid Build Coastguard Worker          if (!set_combiner_source(ctx, texUnit, pname, (GLenum) iparam0))
425*61046927SAndroid Build Coastguard Worker             return;
426*61046927SAndroid Build Coastguard Worker 	 break;
427*61046927SAndroid Build Coastguard Worker       case GL_OPERAND0_RGB:
428*61046927SAndroid Build Coastguard Worker       case GL_OPERAND1_RGB:
429*61046927SAndroid Build Coastguard Worker       case GL_OPERAND2_RGB:
430*61046927SAndroid Build Coastguard Worker       case GL_OPERAND3_RGB_NV:
431*61046927SAndroid Build Coastguard Worker       case GL_OPERAND0_ALPHA:
432*61046927SAndroid Build Coastguard Worker       case GL_OPERAND1_ALPHA:
433*61046927SAndroid Build Coastguard Worker       case GL_OPERAND2_ALPHA:
434*61046927SAndroid Build Coastguard Worker       case GL_OPERAND3_ALPHA_NV:
435*61046927SAndroid Build Coastguard Worker          if (!set_combiner_operand(ctx, texUnit, pname, (GLenum) iparam0))
436*61046927SAndroid Build Coastguard Worker             return;
437*61046927SAndroid Build Coastguard Worker 	 break;
438*61046927SAndroid Build Coastguard Worker       case GL_RGB_SCALE:
439*61046927SAndroid Build Coastguard Worker       case GL_ALPHA_SCALE:
440*61046927SAndroid Build Coastguard Worker          if (!set_combiner_scale(ctx, texUnit, pname, param[0]))
441*61046927SAndroid Build Coastguard Worker             return;
442*61046927SAndroid Build Coastguard Worker 	 break;
443*61046927SAndroid Build Coastguard Worker       default:
444*61046927SAndroid Build Coastguard Worker 	 _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(pname)" );
445*61046927SAndroid Build Coastguard Worker 	 return;
446*61046927SAndroid Build Coastguard Worker       }
447*61046927SAndroid Build Coastguard Worker    }
448*61046927SAndroid Build Coastguard Worker    else if (target == GL_TEXTURE_FILTER_CONTROL_EXT) {
449*61046927SAndroid Build Coastguard Worker       struct gl_texture_unit *texUnit =
450*61046927SAndroid Build Coastguard Worker          _mesa_get_tex_unit(ctx, texunit);
451*61046927SAndroid Build Coastguard Worker 
452*61046927SAndroid Build Coastguard Worker       if (pname == GL_TEXTURE_LOD_BIAS_EXT) {
453*61046927SAndroid Build Coastguard Worker 	 if (texUnit->LodBias == param[0])
454*61046927SAndroid Build Coastguard Worker 	    return;
455*61046927SAndroid Build Coastguard Worker 	 FLUSH_VERTICES(ctx, _NEW_TEXTURE_OBJECT, GL_TEXTURE_BIT);
456*61046927SAndroid Build Coastguard Worker          texUnit->LodBias = param[0];
457*61046927SAndroid Build Coastguard Worker          texUnit->LodBiasQuantized = util_quantize_lod_bias(param[0]);
458*61046927SAndroid Build Coastguard Worker       }
459*61046927SAndroid Build Coastguard Worker       else {
460*61046927SAndroid Build Coastguard Worker          TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
461*61046927SAndroid Build Coastguard Worker 	 return;
462*61046927SAndroid Build Coastguard Worker       }
463*61046927SAndroid Build Coastguard Worker    }
464*61046927SAndroid Build Coastguard Worker    else if (target == GL_POINT_SPRITE) {
465*61046927SAndroid Build Coastguard Worker       if (pname == GL_COORD_REPLACE) {
466*61046927SAndroid Build Coastguard Worker          /* It's kind of weird to set point state via glTexEnv,
467*61046927SAndroid Build Coastguard Worker           * but that's what the spec calls for.
468*61046927SAndroid Build Coastguard Worker           */
469*61046927SAndroid Build Coastguard Worker          if (iparam0 == GL_TRUE) {
470*61046927SAndroid Build Coastguard Worker             if (ctx->Point.CoordReplace & (1u << texunit))
471*61046927SAndroid Build Coastguard Worker                return;
472*61046927SAndroid Build Coastguard Worker             FLUSH_VERTICES(ctx, _NEW_POINT | _NEW_FF_VERT_PROGRAM,
473*61046927SAndroid Build Coastguard Worker                            GL_POINT_BIT);
474*61046927SAndroid Build Coastguard Worker             ctx->Point.CoordReplace |= (1u << texunit);
475*61046927SAndroid Build Coastguard Worker          } else if (iparam0 == GL_FALSE) {
476*61046927SAndroid Build Coastguard Worker             if (~(ctx->Point.CoordReplace) & (1u << texunit))
477*61046927SAndroid Build Coastguard Worker                return;
478*61046927SAndroid Build Coastguard Worker             FLUSH_VERTICES(ctx, _NEW_POINT | _NEW_FF_VERT_PROGRAM,
479*61046927SAndroid Build Coastguard Worker                            GL_POINT_BIT);
480*61046927SAndroid Build Coastguard Worker             ctx->Point.CoordReplace &= ~(1u << texunit);
481*61046927SAndroid Build Coastguard Worker          } else {
482*61046927SAndroid Build Coastguard Worker             _mesa_error( ctx, GL_INVALID_VALUE, "glTexEnv(param=0x%x)", iparam0);
483*61046927SAndroid Build Coastguard Worker             return;
484*61046927SAndroid Build Coastguard Worker          }
485*61046927SAndroid Build Coastguard Worker       }
486*61046927SAndroid Build Coastguard Worker       else {
487*61046927SAndroid Build Coastguard Worker          _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(pname=0x%x)", pname );
488*61046927SAndroid Build Coastguard Worker          return;
489*61046927SAndroid Build Coastguard Worker       }
490*61046927SAndroid Build Coastguard Worker    }
491*61046927SAndroid Build Coastguard Worker    else {
492*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_ENUM, "glTexEnv(target=%s)",
493*61046927SAndroid Build Coastguard Worker                   _mesa_enum_to_string(target));
494*61046927SAndroid Build Coastguard Worker       return;
495*61046927SAndroid Build Coastguard Worker    }
496*61046927SAndroid Build Coastguard Worker 
497*61046927SAndroid Build Coastguard Worker    if (MESA_VERBOSE&(VERBOSE_API|VERBOSE_TEXTURE))
498*61046927SAndroid Build Coastguard Worker       _mesa_debug(ctx, "glTexEnv %s %s %.1f(%s) ...\n",
499*61046927SAndroid Build Coastguard Worker                   _mesa_enum_to_string(target),
500*61046927SAndroid Build Coastguard Worker                   _mesa_enum_to_string(pname),
501*61046927SAndroid Build Coastguard Worker                   *param,
502*61046927SAndroid Build Coastguard Worker                   _mesa_enum_to_string((GLenum) iparam0));
503*61046927SAndroid Build Coastguard Worker }
504*61046927SAndroid Build Coastguard Worker 
505*61046927SAndroid Build Coastguard Worker 
506*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_TexEnvfv(GLenum target,GLenum pname,const GLfloat * param)507*61046927SAndroid Build Coastguard Worker _mesa_TexEnvfv( GLenum target, GLenum pname, const GLfloat *param )
508*61046927SAndroid Build Coastguard Worker {
509*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
510*61046927SAndroid Build Coastguard Worker    _mesa_texenvfv_indexed(ctx, ctx->Texture.CurrentUnit, target, pname, param);
511*61046927SAndroid Build Coastguard Worker }
512*61046927SAndroid Build Coastguard Worker 
513*61046927SAndroid Build Coastguard Worker 
514*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_TexEnvf(GLenum target,GLenum pname,GLfloat param)515*61046927SAndroid Build Coastguard Worker _mesa_TexEnvf( GLenum target, GLenum pname, GLfloat param )
516*61046927SAndroid Build Coastguard Worker {
517*61046927SAndroid Build Coastguard Worker    GLfloat p[4];
518*61046927SAndroid Build Coastguard Worker    p[0] = param;
519*61046927SAndroid Build Coastguard Worker    p[1] = p[2] = p[3] = 0.0;
520*61046927SAndroid Build Coastguard Worker    _mesa_TexEnvfv( target, pname, p );
521*61046927SAndroid Build Coastguard Worker }
522*61046927SAndroid Build Coastguard Worker 
523*61046927SAndroid Build Coastguard Worker 
524*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_TexEnvi(GLenum target,GLenum pname,GLint param)525*61046927SAndroid Build Coastguard Worker _mesa_TexEnvi( GLenum target, GLenum pname, GLint param )
526*61046927SAndroid Build Coastguard Worker {
527*61046927SAndroid Build Coastguard Worker    GLfloat p[4];
528*61046927SAndroid Build Coastguard Worker    p[0] = (GLfloat) param;
529*61046927SAndroid Build Coastguard Worker    p[1] = p[2] = p[3] = 0.0;
530*61046927SAndroid Build Coastguard Worker    _mesa_TexEnvfv( target, pname, p );
531*61046927SAndroid Build Coastguard Worker }
532*61046927SAndroid Build Coastguard Worker 
533*61046927SAndroid Build Coastguard Worker 
534*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_TexEnviv(GLenum target,GLenum pname,const GLint * param)535*61046927SAndroid Build Coastguard Worker _mesa_TexEnviv( GLenum target, GLenum pname, const GLint *param )
536*61046927SAndroid Build Coastguard Worker {
537*61046927SAndroid Build Coastguard Worker    GLfloat p[4];
538*61046927SAndroid Build Coastguard Worker    if (pname == GL_TEXTURE_ENV_COLOR) {
539*61046927SAndroid Build Coastguard Worker       p[0] = INT_TO_FLOAT( param[0] );
540*61046927SAndroid Build Coastguard Worker       p[1] = INT_TO_FLOAT( param[1] );
541*61046927SAndroid Build Coastguard Worker       p[2] = INT_TO_FLOAT( param[2] );
542*61046927SAndroid Build Coastguard Worker       p[3] = INT_TO_FLOAT( param[3] );
543*61046927SAndroid Build Coastguard Worker    }
544*61046927SAndroid Build Coastguard Worker    else {
545*61046927SAndroid Build Coastguard Worker       p[0] = (GLfloat) param[0];
546*61046927SAndroid Build Coastguard Worker       p[1] = p[2] = p[3] = 0;  /* init to zero, just to be safe */
547*61046927SAndroid Build Coastguard Worker    }
548*61046927SAndroid Build Coastguard Worker    _mesa_TexEnvfv( target, pname, p );
549*61046927SAndroid Build Coastguard Worker }
550*61046927SAndroid Build Coastguard Worker 
551*61046927SAndroid Build Coastguard Worker 
552*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_MultiTexEnvfEXT(GLenum texunit,GLenum target,GLenum pname,GLfloat param)553*61046927SAndroid Build Coastguard Worker _mesa_MultiTexEnvfEXT( GLenum texunit, GLenum target,
554*61046927SAndroid Build Coastguard Worker                        GLenum pname, GLfloat param )
555*61046927SAndroid Build Coastguard Worker {
556*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
557*61046927SAndroid Build Coastguard Worker    GLfloat p[4];
558*61046927SAndroid Build Coastguard Worker    p[0] = param;
559*61046927SAndroid Build Coastguard Worker    p[1] = p[2] = p[3] = 0.0;
560*61046927SAndroid Build Coastguard Worker    _mesa_texenvfv_indexed(ctx, texunit - GL_TEXTURE0, target, pname, p);
561*61046927SAndroid Build Coastguard Worker }
562*61046927SAndroid Build Coastguard Worker 
563*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_MultiTexEnvfvEXT(GLenum texunit,GLenum target,GLenum pname,const GLfloat * param)564*61046927SAndroid Build Coastguard Worker _mesa_MultiTexEnvfvEXT( GLenum texunit, GLenum target,
565*61046927SAndroid Build Coastguard Worker                         GLenum pname, const GLfloat *param )
566*61046927SAndroid Build Coastguard Worker {
567*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
568*61046927SAndroid Build Coastguard Worker    _mesa_texenvfv_indexed(ctx, texunit - GL_TEXTURE0, target, pname, param);
569*61046927SAndroid Build Coastguard Worker }
570*61046927SAndroid Build Coastguard Worker 
571*61046927SAndroid Build Coastguard Worker 
572*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_MultiTexEnviEXT(GLenum texunit,GLenum target,GLenum pname,GLint param)573*61046927SAndroid Build Coastguard Worker _mesa_MultiTexEnviEXT( GLenum texunit, GLenum target,
574*61046927SAndroid Build Coastguard Worker                        GLenum pname, GLint param )
575*61046927SAndroid Build Coastguard Worker {
576*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
577*61046927SAndroid Build Coastguard Worker    GLfloat p[4];
578*61046927SAndroid Build Coastguard Worker    p[0] = (GLfloat) param;
579*61046927SAndroid Build Coastguard Worker    p[1] = p[2] = p[3] = 0.0;
580*61046927SAndroid Build Coastguard Worker    _mesa_texenvfv_indexed( ctx, texunit - GL_TEXTURE0, target, pname, p );
581*61046927SAndroid Build Coastguard Worker }
582*61046927SAndroid Build Coastguard Worker 
583*61046927SAndroid Build Coastguard Worker 
584*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_MultiTexEnvivEXT(GLenum texunit,GLenum target,GLenum pname,const GLint * param)585*61046927SAndroid Build Coastguard Worker _mesa_MultiTexEnvivEXT( GLenum texunit, GLenum target,
586*61046927SAndroid Build Coastguard Worker                         GLenum pname, const GLint *param )
587*61046927SAndroid Build Coastguard Worker {
588*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
589*61046927SAndroid Build Coastguard Worker    GLfloat p[4];
590*61046927SAndroid Build Coastguard Worker    if (pname == GL_TEXTURE_ENV_COLOR) {
591*61046927SAndroid Build Coastguard Worker       p[0] = INT_TO_FLOAT( param[0] );
592*61046927SAndroid Build Coastguard Worker       p[1] = INT_TO_FLOAT( param[1] );
593*61046927SAndroid Build Coastguard Worker       p[2] = INT_TO_FLOAT( param[2] );
594*61046927SAndroid Build Coastguard Worker       p[3] = INT_TO_FLOAT( param[3] );
595*61046927SAndroid Build Coastguard Worker    }
596*61046927SAndroid Build Coastguard Worker    else {
597*61046927SAndroid Build Coastguard Worker       p[0] = (GLfloat) param[0];
598*61046927SAndroid Build Coastguard Worker       p[1] = p[2] = p[3] = 0;  /* init to zero, just to be safe */
599*61046927SAndroid Build Coastguard Worker    }
600*61046927SAndroid Build Coastguard Worker    _mesa_texenvfv_indexed( ctx, texunit - GL_TEXTURE0, target, pname, p );
601*61046927SAndroid Build Coastguard Worker }
602*61046927SAndroid Build Coastguard Worker 
603*61046927SAndroid Build Coastguard Worker 
604*61046927SAndroid Build Coastguard Worker 
605*61046927SAndroid Build Coastguard Worker 
606*61046927SAndroid Build Coastguard Worker /**
607*61046927SAndroid Build Coastguard Worker  * Helper for glGetTexEnvi/f()
608*61046927SAndroid Build Coastguard Worker  * \return  value of queried pname or -1 if error.
609*61046927SAndroid Build Coastguard Worker  */
610*61046927SAndroid Build Coastguard Worker static GLint
get_texenvi(struct gl_context * ctx,const struct gl_fixedfunc_texture_unit * texUnit,GLenum pname)611*61046927SAndroid Build Coastguard Worker get_texenvi(struct gl_context *ctx,
612*61046927SAndroid Build Coastguard Worker             const struct gl_fixedfunc_texture_unit *texUnit,
613*61046927SAndroid Build Coastguard Worker             GLenum pname)
614*61046927SAndroid Build Coastguard Worker {
615*61046927SAndroid Build Coastguard Worker    switch (pname) {
616*61046927SAndroid Build Coastguard Worker    case GL_TEXTURE_ENV_MODE:
617*61046927SAndroid Build Coastguard Worker       return texUnit->EnvMode;
618*61046927SAndroid Build Coastguard Worker       break;
619*61046927SAndroid Build Coastguard Worker    case GL_COMBINE_RGB:
620*61046927SAndroid Build Coastguard Worker       return texUnit->Combine.ModeRGB;
621*61046927SAndroid Build Coastguard Worker    case GL_COMBINE_ALPHA:
622*61046927SAndroid Build Coastguard Worker       return texUnit->Combine.ModeA;
623*61046927SAndroid Build Coastguard Worker    case GL_SOURCE0_RGB:
624*61046927SAndroid Build Coastguard Worker    case GL_SOURCE1_RGB:
625*61046927SAndroid Build Coastguard Worker    case GL_SOURCE2_RGB: {
626*61046927SAndroid Build Coastguard Worker       const unsigned rgb_idx = pname - GL_SOURCE0_RGB;
627*61046927SAndroid Build Coastguard Worker       return texUnit->Combine.SourceRGB[rgb_idx];
628*61046927SAndroid Build Coastguard Worker    }
629*61046927SAndroid Build Coastguard Worker    case GL_SOURCE3_RGB_NV:
630*61046927SAndroid Build Coastguard Worker       if (_mesa_is_desktop_gl_compat(ctx) && ctx->Extensions.NV_texture_env_combine4) {
631*61046927SAndroid Build Coastguard Worker          return texUnit->Combine.SourceRGB[3];
632*61046927SAndroid Build Coastguard Worker       }
633*61046927SAndroid Build Coastguard Worker       else {
634*61046927SAndroid Build Coastguard Worker          _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
635*61046927SAndroid Build Coastguard Worker       }
636*61046927SAndroid Build Coastguard Worker       break;
637*61046927SAndroid Build Coastguard Worker    case GL_SOURCE0_ALPHA:
638*61046927SAndroid Build Coastguard Worker    case GL_SOURCE1_ALPHA:
639*61046927SAndroid Build Coastguard Worker    case GL_SOURCE2_ALPHA: {
640*61046927SAndroid Build Coastguard Worker       const unsigned alpha_idx = pname - GL_SOURCE0_ALPHA;
641*61046927SAndroid Build Coastguard Worker       return texUnit->Combine.SourceA[alpha_idx];
642*61046927SAndroid Build Coastguard Worker    }
643*61046927SAndroid Build Coastguard Worker    case GL_SOURCE3_ALPHA_NV:
644*61046927SAndroid Build Coastguard Worker       if (_mesa_is_desktop_gl_compat(ctx) && ctx->Extensions.NV_texture_env_combine4) {
645*61046927SAndroid Build Coastguard Worker          return texUnit->Combine.SourceA[3];
646*61046927SAndroid Build Coastguard Worker       }
647*61046927SAndroid Build Coastguard Worker       else {
648*61046927SAndroid Build Coastguard Worker          _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
649*61046927SAndroid Build Coastguard Worker       }
650*61046927SAndroid Build Coastguard Worker       break;
651*61046927SAndroid Build Coastguard Worker    case GL_OPERAND0_RGB:
652*61046927SAndroid Build Coastguard Worker    case GL_OPERAND1_RGB:
653*61046927SAndroid Build Coastguard Worker    case GL_OPERAND2_RGB: {
654*61046927SAndroid Build Coastguard Worker       const unsigned op_rgb = pname - GL_OPERAND0_RGB;
655*61046927SAndroid Build Coastguard Worker       return texUnit->Combine.OperandRGB[op_rgb];
656*61046927SAndroid Build Coastguard Worker    }
657*61046927SAndroid Build Coastguard Worker    case GL_OPERAND3_RGB_NV:
658*61046927SAndroid Build Coastguard Worker       if (_mesa_is_desktop_gl_compat(ctx) && ctx->Extensions.NV_texture_env_combine4) {
659*61046927SAndroid Build Coastguard Worker          return texUnit->Combine.OperandRGB[3];
660*61046927SAndroid Build Coastguard Worker       }
661*61046927SAndroid Build Coastguard Worker       else {
662*61046927SAndroid Build Coastguard Worker          _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
663*61046927SAndroid Build Coastguard Worker       }
664*61046927SAndroid Build Coastguard Worker       break;
665*61046927SAndroid Build Coastguard Worker    case GL_OPERAND0_ALPHA:
666*61046927SAndroid Build Coastguard Worker    case GL_OPERAND1_ALPHA:
667*61046927SAndroid Build Coastguard Worker    case GL_OPERAND2_ALPHA: {
668*61046927SAndroid Build Coastguard Worker       const unsigned op_alpha = pname - GL_OPERAND0_ALPHA;
669*61046927SAndroid Build Coastguard Worker       return texUnit->Combine.OperandA[op_alpha];
670*61046927SAndroid Build Coastguard Worker    }
671*61046927SAndroid Build Coastguard Worker    case GL_OPERAND3_ALPHA_NV:
672*61046927SAndroid Build Coastguard Worker       if (_mesa_is_desktop_gl_compat(ctx) && ctx->Extensions.NV_texture_env_combine4) {
673*61046927SAndroid Build Coastguard Worker          return texUnit->Combine.OperandA[3];
674*61046927SAndroid Build Coastguard Worker       }
675*61046927SAndroid Build Coastguard Worker       else {
676*61046927SAndroid Build Coastguard Worker          _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
677*61046927SAndroid Build Coastguard Worker       }
678*61046927SAndroid Build Coastguard Worker       break;
679*61046927SAndroid Build Coastguard Worker    case GL_RGB_SCALE:
680*61046927SAndroid Build Coastguard Worker       return 1 << texUnit->Combine.ScaleShiftRGB;
681*61046927SAndroid Build Coastguard Worker    case GL_ALPHA_SCALE:
682*61046927SAndroid Build Coastguard Worker       return 1 << texUnit->Combine.ScaleShiftA;
683*61046927SAndroid Build Coastguard Worker    default:
684*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
685*61046927SAndroid Build Coastguard Worker       break;
686*61046927SAndroid Build Coastguard Worker    }
687*61046927SAndroid Build Coastguard Worker 
688*61046927SAndroid Build Coastguard Worker    return -1; /* error */
689*61046927SAndroid Build Coastguard Worker }
690*61046927SAndroid Build Coastguard Worker 
691*61046927SAndroid Build Coastguard Worker 
692*61046927SAndroid Build Coastguard Worker static void
_mesa_gettexenvfv_indexed(GLuint texunit,GLenum target,GLenum pname,GLfloat * params)693*61046927SAndroid Build Coastguard Worker _mesa_gettexenvfv_indexed( GLuint texunit, GLenum target, GLenum pname, GLfloat *params )
694*61046927SAndroid Build Coastguard Worker {
695*61046927SAndroid Build Coastguard Worker    GLuint maxUnit;
696*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
697*61046927SAndroid Build Coastguard Worker 
698*61046927SAndroid Build Coastguard Worker    maxUnit = (target == GL_POINT_SPRITE && pname == GL_COORD_REPLACE)
699*61046927SAndroid Build Coastguard Worker       ? ctx->Const.MaxTextureCoordUnits : ctx->Const.MaxCombinedTextureImageUnits;
700*61046927SAndroid Build Coastguard Worker    if (texunit >= maxUnit) {
701*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexEnvfv(texunit=%d)", texunit);
702*61046927SAndroid Build Coastguard Worker       return;
703*61046927SAndroid Build Coastguard Worker    }
704*61046927SAndroid Build Coastguard Worker 
705*61046927SAndroid Build Coastguard Worker    if (target == GL_TEXTURE_ENV) {
706*61046927SAndroid Build Coastguard Worker       struct gl_fixedfunc_texture_unit *texUnit =
707*61046927SAndroid Build Coastguard Worker          _mesa_get_fixedfunc_tex_unit(ctx, texunit);
708*61046927SAndroid Build Coastguard Worker 
709*61046927SAndroid Build Coastguard Worker       /* The GL spec says that we should report an error if the unit is greater
710*61046927SAndroid Build Coastguard Worker        * than GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, but in practice, only
711*61046927SAndroid Build Coastguard Worker        * fixed-function units are usable. This is probably a spec bug.
712*61046927SAndroid Build Coastguard Worker        * Ignore calls for non-fixed-func units, because we don't process
713*61046927SAndroid Build Coastguard Worker        * glTexEnv for them either.
714*61046927SAndroid Build Coastguard Worker        */
715*61046927SAndroid Build Coastguard Worker       if (!texUnit)
716*61046927SAndroid Build Coastguard Worker          return;
717*61046927SAndroid Build Coastguard Worker 
718*61046927SAndroid Build Coastguard Worker       if (pname == GL_TEXTURE_ENV_COLOR) {
719*61046927SAndroid Build Coastguard Worker          if (_mesa_get_clamp_fragment_color(ctx, ctx->DrawBuffer))
720*61046927SAndroid Build Coastguard Worker             COPY_4FV( params, texUnit->EnvColor );
721*61046927SAndroid Build Coastguard Worker          else
722*61046927SAndroid Build Coastguard Worker             COPY_4FV( params, texUnit->EnvColorUnclamped );
723*61046927SAndroid Build Coastguard Worker       }
724*61046927SAndroid Build Coastguard Worker       else {
725*61046927SAndroid Build Coastguard Worker          GLint val = get_texenvi(ctx, texUnit, pname);
726*61046927SAndroid Build Coastguard Worker          if (val >= 0) {
727*61046927SAndroid Build Coastguard Worker             *params = (GLfloat) val;
728*61046927SAndroid Build Coastguard Worker          }
729*61046927SAndroid Build Coastguard Worker       }
730*61046927SAndroid Build Coastguard Worker    }
731*61046927SAndroid Build Coastguard Worker    else if (target == GL_TEXTURE_FILTER_CONTROL_EXT) {
732*61046927SAndroid Build Coastguard Worker       const struct gl_texture_unit *texUnit = _mesa_get_tex_unit(ctx, texunit);
733*61046927SAndroid Build Coastguard Worker 
734*61046927SAndroid Build Coastguard Worker       if (pname == GL_TEXTURE_LOD_BIAS_EXT) {
735*61046927SAndroid Build Coastguard Worker          *params = texUnit->LodBias;
736*61046927SAndroid Build Coastguard Worker       }
737*61046927SAndroid Build Coastguard Worker       else {
738*61046927SAndroid Build Coastguard Worker          _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)" );
739*61046927SAndroid Build Coastguard Worker 	 return;
740*61046927SAndroid Build Coastguard Worker       }
741*61046927SAndroid Build Coastguard Worker    }
742*61046927SAndroid Build Coastguard Worker    else if (target == GL_POINT_SPRITE) {
743*61046927SAndroid Build Coastguard Worker       if (pname == GL_COORD_REPLACE) {
744*61046927SAndroid Build Coastguard Worker          if (ctx->Point.CoordReplace & (1u << texunit))
745*61046927SAndroid Build Coastguard Worker             *params = 1.0f;
746*61046927SAndroid Build Coastguard Worker          else
747*61046927SAndroid Build Coastguard Worker             *params = 0.0f;
748*61046927SAndroid Build Coastguard Worker       }
749*61046927SAndroid Build Coastguard Worker       else {
750*61046927SAndroid Build Coastguard Worker          _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)" );
751*61046927SAndroid Build Coastguard Worker          return;
752*61046927SAndroid Build Coastguard Worker       }
753*61046927SAndroid Build Coastguard Worker    }
754*61046927SAndroid Build Coastguard Worker    else {
755*61046927SAndroid Build Coastguard Worker       _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(target)" );
756*61046927SAndroid Build Coastguard Worker       return;
757*61046927SAndroid Build Coastguard Worker    }
758*61046927SAndroid Build Coastguard Worker }
759*61046927SAndroid Build Coastguard Worker 
760*61046927SAndroid Build Coastguard Worker 
761*61046927SAndroid Build Coastguard Worker static void
_mesa_gettexenviv_indexed(GLuint texunit,GLenum target,GLenum pname,GLint * params)762*61046927SAndroid Build Coastguard Worker _mesa_gettexenviv_indexed( GLuint texunit, GLenum target,
763*61046927SAndroid Build Coastguard Worker                            GLenum pname, GLint *params )
764*61046927SAndroid Build Coastguard Worker {
765*61046927SAndroid Build Coastguard Worker    GLuint maxUnit;
766*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
767*61046927SAndroid Build Coastguard Worker 
768*61046927SAndroid Build Coastguard Worker    maxUnit = (target == GL_POINT_SPRITE && pname == GL_COORD_REPLACE)
769*61046927SAndroid Build Coastguard Worker       ? ctx->Const.MaxTextureCoordUnits : ctx->Const.MaxCombinedTextureImageUnits;
770*61046927SAndroid Build Coastguard Worker    if (texunit >= maxUnit) {
771*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexEnviv(texunit=%d)",
772*61046927SAndroid Build Coastguard Worker                   texunit);
773*61046927SAndroid Build Coastguard Worker       return;
774*61046927SAndroid Build Coastguard Worker    }
775*61046927SAndroid Build Coastguard Worker 
776*61046927SAndroid Build Coastguard Worker    if (target == GL_TEXTURE_ENV) {
777*61046927SAndroid Build Coastguard Worker       struct gl_fixedfunc_texture_unit *texUnit =
778*61046927SAndroid Build Coastguard Worker          _mesa_get_fixedfunc_tex_unit(ctx, texunit);
779*61046927SAndroid Build Coastguard Worker 
780*61046927SAndroid Build Coastguard Worker       /* The GL spec says that we should report an error if the unit is greater
781*61046927SAndroid Build Coastguard Worker        * than GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, but in practice, only
782*61046927SAndroid Build Coastguard Worker        * fixed-function units are usable. This is probably a spec bug.
783*61046927SAndroid Build Coastguard Worker        * Ignore calls for non-fixed-func units, because we don't process
784*61046927SAndroid Build Coastguard Worker        * glTexEnv for them either.
785*61046927SAndroid Build Coastguard Worker        */
786*61046927SAndroid Build Coastguard Worker       if (!texUnit)
787*61046927SAndroid Build Coastguard Worker          return;
788*61046927SAndroid Build Coastguard Worker 
789*61046927SAndroid Build Coastguard Worker       if (pname == GL_TEXTURE_ENV_COLOR) {
790*61046927SAndroid Build Coastguard Worker          params[0] = FLOAT_TO_INT( texUnit->EnvColor[0] );
791*61046927SAndroid Build Coastguard Worker          params[1] = FLOAT_TO_INT( texUnit->EnvColor[1] );
792*61046927SAndroid Build Coastguard Worker          params[2] = FLOAT_TO_INT( texUnit->EnvColor[2] );
793*61046927SAndroid Build Coastguard Worker          params[3] = FLOAT_TO_INT( texUnit->EnvColor[3] );
794*61046927SAndroid Build Coastguard Worker       }
795*61046927SAndroid Build Coastguard Worker       else {
796*61046927SAndroid Build Coastguard Worker          GLint val = get_texenvi(ctx, texUnit, pname);
797*61046927SAndroid Build Coastguard Worker          if (val >= 0) {
798*61046927SAndroid Build Coastguard Worker             *params = val;
799*61046927SAndroid Build Coastguard Worker          }
800*61046927SAndroid Build Coastguard Worker       }
801*61046927SAndroid Build Coastguard Worker    }
802*61046927SAndroid Build Coastguard Worker    else if (target == GL_TEXTURE_FILTER_CONTROL_EXT) {
803*61046927SAndroid Build Coastguard Worker       const struct gl_texture_unit *texUnit = _mesa_get_tex_unit(ctx, texunit);
804*61046927SAndroid Build Coastguard Worker 
805*61046927SAndroid Build Coastguard Worker       if (pname == GL_TEXTURE_LOD_BIAS_EXT) {
806*61046927SAndroid Build Coastguard Worker          *params = (GLint) texUnit->LodBias;
807*61046927SAndroid Build Coastguard Worker       }
808*61046927SAndroid Build Coastguard Worker       else {
809*61046927SAndroid Build Coastguard Worker          _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)" );
810*61046927SAndroid Build Coastguard Worker 	 return;
811*61046927SAndroid Build Coastguard Worker       }
812*61046927SAndroid Build Coastguard Worker    }
813*61046927SAndroid Build Coastguard Worker    else if (target == GL_POINT_SPRITE) {
814*61046927SAndroid Build Coastguard Worker       if (pname == GL_COORD_REPLACE) {
815*61046927SAndroid Build Coastguard Worker          if (ctx->Point.CoordReplace & (1u << texunit))
816*61046927SAndroid Build Coastguard Worker             *params = GL_TRUE;
817*61046927SAndroid Build Coastguard Worker          else
818*61046927SAndroid Build Coastguard Worker             *params = GL_FALSE;
819*61046927SAndroid Build Coastguard Worker       }
820*61046927SAndroid Build Coastguard Worker       else {
821*61046927SAndroid Build Coastguard Worker          _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)" );
822*61046927SAndroid Build Coastguard Worker          return;
823*61046927SAndroid Build Coastguard Worker       }
824*61046927SAndroid Build Coastguard Worker    }
825*61046927SAndroid Build Coastguard Worker    else {
826*61046927SAndroid Build Coastguard Worker       _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(target)" );
827*61046927SAndroid Build Coastguard Worker       return;
828*61046927SAndroid Build Coastguard Worker    }
829*61046927SAndroid Build Coastguard Worker }
830*61046927SAndroid Build Coastguard Worker 
831*61046927SAndroid Build Coastguard Worker 
832*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetTexEnvfv(GLenum target,GLenum pname,GLfloat * params)833*61046927SAndroid Build Coastguard Worker _mesa_GetTexEnvfv( GLenum target, GLenum pname, GLfloat *params )
834*61046927SAndroid Build Coastguard Worker {
835*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
836*61046927SAndroid Build Coastguard Worker    _mesa_gettexenvfv_indexed(ctx->Texture.CurrentUnit, target, pname, params);
837*61046927SAndroid Build Coastguard Worker }
838*61046927SAndroid Build Coastguard Worker 
839*61046927SAndroid Build Coastguard Worker 
840*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetMultiTexEnvfvEXT(GLenum texunit,GLenum target,GLenum pname,GLfloat * params)841*61046927SAndroid Build Coastguard Worker _mesa_GetMultiTexEnvfvEXT( GLenum texunit, GLenum target,
842*61046927SAndroid Build Coastguard Worker                            GLenum pname, GLfloat *params )
843*61046927SAndroid Build Coastguard Worker {
844*61046927SAndroid Build Coastguard Worker    _mesa_gettexenvfv_indexed(texunit - GL_TEXTURE0, target, pname, params);
845*61046927SAndroid Build Coastguard Worker }
846*61046927SAndroid Build Coastguard Worker 
847*61046927SAndroid Build Coastguard Worker 
848*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetTexEnviv(GLenum target,GLenum pname,GLint * params)849*61046927SAndroid Build Coastguard Worker _mesa_GetTexEnviv( GLenum target, GLenum pname, GLint *params )
850*61046927SAndroid Build Coastguard Worker {
851*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
852*61046927SAndroid Build Coastguard Worker    _mesa_gettexenviv_indexed(ctx->Texture.CurrentUnit, target, pname, params);
853*61046927SAndroid Build Coastguard Worker }
854*61046927SAndroid Build Coastguard Worker 
855*61046927SAndroid Build Coastguard Worker 
856*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetMultiTexEnvivEXT(GLenum texunit,GLenum target,GLenum pname,GLint * params)857*61046927SAndroid Build Coastguard Worker _mesa_GetMultiTexEnvivEXT( GLenum texunit, GLenum target,
858*61046927SAndroid Build Coastguard Worker                            GLenum pname, GLint *params )
859*61046927SAndroid Build Coastguard Worker {
860*61046927SAndroid Build Coastguard Worker    _mesa_gettexenviv_indexed(texunit - GL_TEXTURE0, target, pname, params);
861*61046927SAndroid Build Coastguard Worker }
862