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 texparam.c
28*61046927SAndroid Build Coastguard Worker *
29*61046927SAndroid Build Coastguard Worker * glTexParameter-related functions
30*61046927SAndroid Build Coastguard Worker */
31*61046927SAndroid Build Coastguard Worker
32*61046927SAndroid Build Coastguard Worker #include <stdbool.h>
33*61046927SAndroid Build Coastguard Worker #include "util/glheader.h"
34*61046927SAndroid Build Coastguard Worker #include "main/blend.h"
35*61046927SAndroid Build Coastguard Worker #include "main/context.h"
36*61046927SAndroid Build Coastguard Worker #include "main/enums.h"
37*61046927SAndroid Build Coastguard Worker #include "main/formats.h"
38*61046927SAndroid Build Coastguard Worker #include "main/glformats.h"
39*61046927SAndroid Build Coastguard Worker #include "main/macros.h"
40*61046927SAndroid Build Coastguard Worker #include "main/mtypes.h"
41*61046927SAndroid Build Coastguard Worker #include "main/state.h"
42*61046927SAndroid Build Coastguard Worker #include "main/texcompress.h"
43*61046927SAndroid Build Coastguard Worker #include "main/texobj.h"
44*61046927SAndroid Build Coastguard Worker #include "main/texparam.h"
45*61046927SAndroid Build Coastguard Worker #include "main/teximage.h"
46*61046927SAndroid Build Coastguard Worker #include "main/texstate.h"
47*61046927SAndroid Build Coastguard Worker #include "program/prog_instruction.h"
48*61046927SAndroid Build Coastguard Worker #include "util/u_math.h"
49*61046927SAndroid Build Coastguard Worker #include "api_exec_decl.h"
50*61046927SAndroid Build Coastguard Worker
51*61046927SAndroid Build Coastguard Worker #include "state_tracker/st_cb_texture.h"
52*61046927SAndroid Build Coastguard Worker #include "state_tracker/st_sampler_view.h"
53*61046927SAndroid Build Coastguard Worker
54*61046927SAndroid Build Coastguard Worker /**
55*61046927SAndroid Build Coastguard Worker * Use macro to resolve undefined clamping behaviour when using lroundf
56*61046927SAndroid Build Coastguard Worker */
57*61046927SAndroid Build Coastguard Worker #define LCLAMPF(a, lmin, lmax) ((a) > (float)(lmin) ? ( (a) >= (float)(lmax) ? (lmax) : (lroundf(a)) ) : (lmin))
58*61046927SAndroid Build Coastguard Worker
59*61046927SAndroid Build Coastguard Worker /**
60*61046927SAndroid Build Coastguard Worker * Check if a coordinate wrap mode is supported for the texture target.
61*61046927SAndroid Build Coastguard Worker * \return GL_TRUE if legal, GL_FALSE otherwise
62*61046927SAndroid Build Coastguard Worker */
63*61046927SAndroid Build Coastguard Worker static GLboolean
validate_texture_wrap_mode(struct gl_context * ctx,GLenum target,GLenum wrap)64*61046927SAndroid Build Coastguard Worker validate_texture_wrap_mode(struct gl_context * ctx, GLenum target, GLenum wrap)
65*61046927SAndroid Build Coastguard Worker {
66*61046927SAndroid Build Coastguard Worker const struct gl_extensions * const e = & ctx->Extensions;
67*61046927SAndroid Build Coastguard Worker const bool is_desktop_gl = _mesa_is_desktop_gl(ctx);
68*61046927SAndroid Build Coastguard Worker bool supported;
69*61046927SAndroid Build Coastguard Worker
70*61046927SAndroid Build Coastguard Worker switch (wrap) {
71*61046927SAndroid Build Coastguard Worker case GL_CLAMP:
72*61046927SAndroid Build Coastguard Worker /* GL_CLAMP was removed in the core profile, and it has never existed in
73*61046927SAndroid Build Coastguard Worker * OpenGL ES.
74*61046927SAndroid Build Coastguard Worker */
75*61046927SAndroid Build Coastguard Worker supported = _mesa_is_desktop_gl_compat(ctx)
76*61046927SAndroid Build Coastguard Worker && (target != GL_TEXTURE_EXTERNAL_OES);
77*61046927SAndroid Build Coastguard Worker break;
78*61046927SAndroid Build Coastguard Worker
79*61046927SAndroid Build Coastguard Worker case GL_CLAMP_TO_EDGE:
80*61046927SAndroid Build Coastguard Worker supported = true;
81*61046927SAndroid Build Coastguard Worker break;
82*61046927SAndroid Build Coastguard Worker
83*61046927SAndroid Build Coastguard Worker case GL_CLAMP_TO_BORDER:
84*61046927SAndroid Build Coastguard Worker supported = ctx->API != API_OPENGLES
85*61046927SAndroid Build Coastguard Worker && (target != GL_TEXTURE_EXTERNAL_OES);
86*61046927SAndroid Build Coastguard Worker break;
87*61046927SAndroid Build Coastguard Worker
88*61046927SAndroid Build Coastguard Worker case GL_REPEAT:
89*61046927SAndroid Build Coastguard Worker case GL_MIRRORED_REPEAT:
90*61046927SAndroid Build Coastguard Worker supported = (target != GL_TEXTURE_RECTANGLE_NV)
91*61046927SAndroid Build Coastguard Worker && (target != GL_TEXTURE_EXTERNAL_OES);
92*61046927SAndroid Build Coastguard Worker break;
93*61046927SAndroid Build Coastguard Worker
94*61046927SAndroid Build Coastguard Worker case GL_MIRROR_CLAMP_EXT:
95*61046927SAndroid Build Coastguard Worker supported = is_desktop_gl
96*61046927SAndroid Build Coastguard Worker && (e->ATI_texture_mirror_once || e->EXT_texture_mirror_clamp)
97*61046927SAndroid Build Coastguard Worker && (target != GL_TEXTURE_RECTANGLE_NV)
98*61046927SAndroid Build Coastguard Worker && (target != GL_TEXTURE_EXTERNAL_OES);
99*61046927SAndroid Build Coastguard Worker break;
100*61046927SAndroid Build Coastguard Worker
101*61046927SAndroid Build Coastguard Worker case GL_MIRROR_CLAMP_TO_EDGE_EXT:
102*61046927SAndroid Build Coastguard Worker supported = (target != GL_TEXTURE_RECTANGLE_NV)
103*61046927SAndroid Build Coastguard Worker && (target != GL_TEXTURE_EXTERNAL_OES)
104*61046927SAndroid Build Coastguard Worker && (_mesa_has_ARB_texture_mirror_clamp_to_edge(ctx) ||
105*61046927SAndroid Build Coastguard Worker _mesa_has_EXT_texture_mirror_clamp_to_edge(ctx) ||
106*61046927SAndroid Build Coastguard Worker _mesa_has_ATI_texture_mirror_once(ctx) ||
107*61046927SAndroid Build Coastguard Worker _mesa_has_EXT_texture_mirror_clamp(ctx));
108*61046927SAndroid Build Coastguard Worker break;
109*61046927SAndroid Build Coastguard Worker
110*61046927SAndroid Build Coastguard Worker case GL_MIRROR_CLAMP_TO_BORDER_EXT:
111*61046927SAndroid Build Coastguard Worker supported = is_desktop_gl && e->EXT_texture_mirror_clamp
112*61046927SAndroid Build Coastguard Worker && (target != GL_TEXTURE_RECTANGLE_NV)
113*61046927SAndroid Build Coastguard Worker && (target != GL_TEXTURE_EXTERNAL_OES);
114*61046927SAndroid Build Coastguard Worker break;
115*61046927SAndroid Build Coastguard Worker
116*61046927SAndroid Build Coastguard Worker default:
117*61046927SAndroid Build Coastguard Worker supported = false;
118*61046927SAndroid Build Coastguard Worker break;
119*61046927SAndroid Build Coastguard Worker }
120*61046927SAndroid Build Coastguard Worker
121*61046927SAndroid Build Coastguard Worker if (!supported)
122*61046927SAndroid Build Coastguard Worker _mesa_error( ctx, GL_INVALID_ENUM, "glTexParameter(param=0x%x)", wrap );
123*61046927SAndroid Build Coastguard Worker
124*61046927SAndroid Build Coastguard Worker return supported;
125*61046927SAndroid Build Coastguard Worker }
126*61046927SAndroid Build Coastguard Worker
127*61046927SAndroid Build Coastguard Worker
128*61046927SAndroid Build Coastguard Worker static bool
is_texparameteri_target_valid(GLenum target)129*61046927SAndroid Build Coastguard Worker is_texparameteri_target_valid(GLenum target)
130*61046927SAndroid Build Coastguard Worker {
131*61046927SAndroid Build Coastguard Worker switch (target) {
132*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_1D:
133*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_1D_ARRAY:
134*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_2D:
135*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_2D_ARRAY:
136*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_2D_MULTISAMPLE:
137*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
138*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_3D:
139*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_CUBE_MAP:
140*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_CUBE_MAP_ARRAY:
141*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_RECTANGLE:
142*61046927SAndroid Build Coastguard Worker return true;
143*61046927SAndroid Build Coastguard Worker default:
144*61046927SAndroid Build Coastguard Worker return false;
145*61046927SAndroid Build Coastguard Worker }
146*61046927SAndroid Build Coastguard Worker }
147*61046927SAndroid Build Coastguard Worker
148*61046927SAndroid Build Coastguard Worker
149*61046927SAndroid Build Coastguard Worker /**
150*61046927SAndroid Build Coastguard Worker * Get current texture object for given name.
151*61046927SAndroid Build Coastguard Worker * Return NULL if any error (and record the error).
152*61046927SAndroid Build Coastguard Worker * Note that proxy targets are not accepted.
153*61046927SAndroid Build Coastguard Worker * Only the glGetTexLevelParameter() functions accept proxy targets.
154*61046927SAndroid Build Coastguard Worker */
155*61046927SAndroid Build Coastguard Worker static struct gl_texture_object *
get_texobj_by_name(struct gl_context * ctx,GLuint texture,const char * name)156*61046927SAndroid Build Coastguard Worker get_texobj_by_name(struct gl_context *ctx, GLuint texture, const char *name)
157*61046927SAndroid Build Coastguard Worker {
158*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
159*61046927SAndroid Build Coastguard Worker
160*61046927SAndroid Build Coastguard Worker texObj = _mesa_lookup_texture_err(ctx, texture, name);
161*61046927SAndroid Build Coastguard Worker if (!texObj)
162*61046927SAndroid Build Coastguard Worker return NULL;
163*61046927SAndroid Build Coastguard Worker
164*61046927SAndroid Build Coastguard Worker if (!is_texparameteri_target_valid(texObj->Target)) {
165*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_OPERATION, "%s(target)", name);
166*61046927SAndroid Build Coastguard Worker return NULL;
167*61046927SAndroid Build Coastguard Worker }
168*61046927SAndroid Build Coastguard Worker
169*61046927SAndroid Build Coastguard Worker return texObj;
170*61046927SAndroid Build Coastguard Worker }
171*61046927SAndroid Build Coastguard Worker
172*61046927SAndroid Build Coastguard Worker
173*61046927SAndroid Build Coastguard Worker /**
174*61046927SAndroid Build Coastguard Worker * Convert GL_RED/GREEN/BLUE/ALPHA/ZERO/ONE to SWIZZLE_X/Y/Z/W/ZERO/ONE.
175*61046927SAndroid Build Coastguard Worker * \return -1 if error.
176*61046927SAndroid Build Coastguard Worker */
177*61046927SAndroid Build Coastguard Worker static GLint
comp_to_swizzle(GLenum comp)178*61046927SAndroid Build Coastguard Worker comp_to_swizzle(GLenum comp)
179*61046927SAndroid Build Coastguard Worker {
180*61046927SAndroid Build Coastguard Worker switch (comp) {
181*61046927SAndroid Build Coastguard Worker case GL_RED:
182*61046927SAndroid Build Coastguard Worker return SWIZZLE_X;
183*61046927SAndroid Build Coastguard Worker case GL_GREEN:
184*61046927SAndroid Build Coastguard Worker return SWIZZLE_Y;
185*61046927SAndroid Build Coastguard Worker case GL_BLUE:
186*61046927SAndroid Build Coastguard Worker return SWIZZLE_Z;
187*61046927SAndroid Build Coastguard Worker case GL_ALPHA:
188*61046927SAndroid Build Coastguard Worker return SWIZZLE_W;
189*61046927SAndroid Build Coastguard Worker case GL_ZERO:
190*61046927SAndroid Build Coastguard Worker return SWIZZLE_ZERO;
191*61046927SAndroid Build Coastguard Worker case GL_ONE:
192*61046927SAndroid Build Coastguard Worker return SWIZZLE_ONE;
193*61046927SAndroid Build Coastguard Worker default:
194*61046927SAndroid Build Coastguard Worker return -1;
195*61046927SAndroid Build Coastguard Worker }
196*61046927SAndroid Build Coastguard Worker }
197*61046927SAndroid Build Coastguard Worker
198*61046927SAndroid Build Coastguard Worker
199*61046927SAndroid Build Coastguard Worker static void
set_swizzle_component(GLushort * swizzle,GLuint comp,GLuint swz)200*61046927SAndroid Build Coastguard Worker set_swizzle_component(GLushort *swizzle, GLuint comp, GLuint swz)
201*61046927SAndroid Build Coastguard Worker {
202*61046927SAndroid Build Coastguard Worker assert(comp < 4);
203*61046927SAndroid Build Coastguard Worker assert(swz <= SWIZZLE_NIL);
204*61046927SAndroid Build Coastguard Worker {
205*61046927SAndroid Build Coastguard Worker GLuint mask = 0x7 << (3 * comp);
206*61046927SAndroid Build Coastguard Worker GLuint s = (*swizzle & ~mask) | (swz << (3 * comp));
207*61046927SAndroid Build Coastguard Worker *swizzle = s;
208*61046927SAndroid Build Coastguard Worker }
209*61046927SAndroid Build Coastguard Worker }
210*61046927SAndroid Build Coastguard Worker
211*61046927SAndroid Build Coastguard Worker
212*61046927SAndroid Build Coastguard Worker /**
213*61046927SAndroid Build Coastguard Worker * This is called just prior to changing any texture object state which
214*61046927SAndroid Build Coastguard Worker * will not affect texture completeness.
215*61046927SAndroid Build Coastguard Worker */
216*61046927SAndroid Build Coastguard Worker static inline void
flush(struct gl_context * ctx)217*61046927SAndroid Build Coastguard Worker flush(struct gl_context *ctx)
218*61046927SAndroid Build Coastguard Worker {
219*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_TEXTURE_OBJECT, GL_TEXTURE_BIT);
220*61046927SAndroid Build Coastguard Worker }
221*61046927SAndroid Build Coastguard Worker
222*61046927SAndroid Build Coastguard Worker
223*61046927SAndroid Build Coastguard Worker /**
224*61046927SAndroid Build Coastguard Worker * This is called just prior to changing any texture object state which
225*61046927SAndroid Build Coastguard Worker * could affect texture completeness (texture base level, max level).
226*61046927SAndroid Build Coastguard Worker * Any pending rendering will be flushed out, we'll set the _NEW_TEXTURE_OBJECT
227*61046927SAndroid Build Coastguard Worker * state flag and then mark the texture object as 'incomplete' so that any
228*61046927SAndroid Build Coastguard Worker * per-texture derived state gets recomputed.
229*61046927SAndroid Build Coastguard Worker */
230*61046927SAndroid Build Coastguard Worker static inline void
incomplete(struct gl_context * ctx,struct gl_texture_object * texObj)231*61046927SAndroid Build Coastguard Worker incomplete(struct gl_context *ctx, struct gl_texture_object *texObj)
232*61046927SAndroid Build Coastguard Worker {
233*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_TEXTURE_OBJECT, GL_TEXTURE_BIT);
234*61046927SAndroid Build Coastguard Worker _mesa_dirty_texobj(ctx, texObj);
235*61046927SAndroid Build Coastguard Worker }
236*61046927SAndroid Build Coastguard Worker
237*61046927SAndroid Build Coastguard Worker
238*61046927SAndroid Build Coastguard Worker GLboolean
_mesa_target_allows_setting_sampler_parameters(GLenum target)239*61046927SAndroid Build Coastguard Worker _mesa_target_allows_setting_sampler_parameters(GLenum target)
240*61046927SAndroid Build Coastguard Worker {
241*61046927SAndroid Build Coastguard Worker switch (target) {
242*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_2D_MULTISAMPLE:
243*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
244*61046927SAndroid Build Coastguard Worker return GL_FALSE;
245*61046927SAndroid Build Coastguard Worker
246*61046927SAndroid Build Coastguard Worker default:
247*61046927SAndroid Build Coastguard Worker return GL_TRUE;
248*61046927SAndroid Build Coastguard Worker }
249*61046927SAndroid Build Coastguard Worker }
250*61046927SAndroid Build Coastguard Worker
251*61046927SAndroid Build Coastguard Worker
252*61046927SAndroid Build Coastguard Worker /**
253*61046927SAndroid Build Coastguard Worker * Set an integer-valued texture parameter
254*61046927SAndroid Build Coastguard Worker * \return GL_TRUE if legal AND the value changed, GL_FALSE otherwise
255*61046927SAndroid Build Coastguard Worker */
256*61046927SAndroid Build Coastguard Worker static GLboolean
set_tex_parameteri(struct gl_context * ctx,struct gl_texture_object * texObj,GLenum pname,const GLint * params,bool dsa)257*61046927SAndroid Build Coastguard Worker set_tex_parameteri(struct gl_context *ctx,
258*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj,
259*61046927SAndroid Build Coastguard Worker GLenum pname, const GLint *params, bool dsa)
260*61046927SAndroid Build Coastguard Worker {
261*61046927SAndroid Build Coastguard Worker const char *suffix = dsa ? "ture" : "";
262*61046927SAndroid Build Coastguard Worker
263*61046927SAndroid Build Coastguard Worker if (texObj->HandleAllocated) {
264*61046927SAndroid Build Coastguard Worker /* The ARB_bindless_texture spec says:
265*61046927SAndroid Build Coastguard Worker *
266*61046927SAndroid Build Coastguard Worker * "The error INVALID_OPERATION is generated by TexImage*, CopyTexImage*,
267*61046927SAndroid Build Coastguard Worker * CompressedTexImage*, TexBuffer*, TexParameter*, as well as other
268*61046927SAndroid Build Coastguard Worker * functions defined in terms of these, if the texture object to be
269*61046927SAndroid Build Coastguard Worker * modified is referenced by one or more texture or image handles."
270*61046927SAndroid Build Coastguard Worker */
271*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_OPERATION,
272*61046927SAndroid Build Coastguard Worker "glTex%sParameter(immutable texture)", suffix);
273*61046927SAndroid Build Coastguard Worker return GL_FALSE;
274*61046927SAndroid Build Coastguard Worker }
275*61046927SAndroid Build Coastguard Worker
276*61046927SAndroid Build Coastguard Worker switch (pname) {
277*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MIN_FILTER:
278*61046927SAndroid Build Coastguard Worker if (!_mesa_target_allows_setting_sampler_parameters(texObj->Target))
279*61046927SAndroid Build Coastguard Worker goto invalid_dsa;
280*61046927SAndroid Build Coastguard Worker
281*61046927SAndroid Build Coastguard Worker if (texObj->Sampler.Attrib.MinFilter == params[0])
282*61046927SAndroid Build Coastguard Worker return GL_FALSE;
283*61046927SAndroid Build Coastguard Worker switch (params[0]) {
284*61046927SAndroid Build Coastguard Worker case GL_NEAREST:
285*61046927SAndroid Build Coastguard Worker case GL_LINEAR:
286*61046927SAndroid Build Coastguard Worker flush(ctx);
287*61046927SAndroid Build Coastguard Worker texObj->Sampler.Attrib.MinFilter = params[0];
288*61046927SAndroid Build Coastguard Worker texObj->Sampler.Attrib.state.min_img_filter = filter_to_gallium(params[0]);
289*61046927SAndroid Build Coastguard Worker texObj->Sampler.Attrib.state.min_mip_filter = mipfilter_to_gallium(params[0]);
290*61046927SAndroid Build Coastguard Worker _mesa_lower_gl_clamp(ctx, &texObj->Sampler);
291*61046927SAndroid Build Coastguard Worker return GL_TRUE;
292*61046927SAndroid Build Coastguard Worker case GL_NEAREST_MIPMAP_NEAREST:
293*61046927SAndroid Build Coastguard Worker case GL_LINEAR_MIPMAP_NEAREST:
294*61046927SAndroid Build Coastguard Worker case GL_NEAREST_MIPMAP_LINEAR:
295*61046927SAndroid Build Coastguard Worker case GL_LINEAR_MIPMAP_LINEAR:
296*61046927SAndroid Build Coastguard Worker if (texObj->Target != GL_TEXTURE_RECTANGLE_NV &&
297*61046927SAndroid Build Coastguard Worker texObj->Target != GL_TEXTURE_EXTERNAL_OES) {
298*61046927SAndroid Build Coastguard Worker flush(ctx);
299*61046927SAndroid Build Coastguard Worker texObj->Sampler.Attrib.MinFilter = params[0];
300*61046927SAndroid Build Coastguard Worker texObj->Sampler.Attrib.state.min_img_filter = filter_to_gallium(params[0]);
301*61046927SAndroid Build Coastguard Worker texObj->Sampler.Attrib.state.min_mip_filter = mipfilter_to_gallium(params[0]);
302*61046927SAndroid Build Coastguard Worker _mesa_lower_gl_clamp(ctx, &texObj->Sampler);
303*61046927SAndroid Build Coastguard Worker return GL_TRUE;
304*61046927SAndroid Build Coastguard Worker }
305*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
306*61046927SAndroid Build Coastguard Worker default:
307*61046927SAndroid Build Coastguard Worker goto invalid_param;
308*61046927SAndroid Build Coastguard Worker }
309*61046927SAndroid Build Coastguard Worker return GL_FALSE;
310*61046927SAndroid Build Coastguard Worker
311*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAG_FILTER:
312*61046927SAndroid Build Coastguard Worker if (!_mesa_target_allows_setting_sampler_parameters(texObj->Target))
313*61046927SAndroid Build Coastguard Worker goto invalid_dsa;
314*61046927SAndroid Build Coastguard Worker
315*61046927SAndroid Build Coastguard Worker if (texObj->Sampler.Attrib.MagFilter == params[0])
316*61046927SAndroid Build Coastguard Worker return GL_FALSE;
317*61046927SAndroid Build Coastguard Worker switch (params[0]) {
318*61046927SAndroid Build Coastguard Worker case GL_NEAREST:
319*61046927SAndroid Build Coastguard Worker case GL_LINEAR:
320*61046927SAndroid Build Coastguard Worker flush(ctx); /* does not effect completeness */
321*61046927SAndroid Build Coastguard Worker texObj->Sampler.Attrib.MagFilter = params[0];
322*61046927SAndroid Build Coastguard Worker texObj->Sampler.Attrib.state.mag_img_filter = filter_to_gallium(params[0]);
323*61046927SAndroid Build Coastguard Worker _mesa_lower_gl_clamp(ctx, &texObj->Sampler);
324*61046927SAndroid Build Coastguard Worker return GL_TRUE;
325*61046927SAndroid Build Coastguard Worker default:
326*61046927SAndroid Build Coastguard Worker goto invalid_param;
327*61046927SAndroid Build Coastguard Worker }
328*61046927SAndroid Build Coastguard Worker return GL_FALSE;
329*61046927SAndroid Build Coastguard Worker
330*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_S:
331*61046927SAndroid Build Coastguard Worker if (!_mesa_target_allows_setting_sampler_parameters(texObj->Target))
332*61046927SAndroid Build Coastguard Worker goto invalid_dsa;
333*61046927SAndroid Build Coastguard Worker
334*61046927SAndroid Build Coastguard Worker if (texObj->Sampler.Attrib.WrapS == params[0])
335*61046927SAndroid Build Coastguard Worker return GL_FALSE;
336*61046927SAndroid Build Coastguard Worker if (validate_texture_wrap_mode(ctx, texObj->Target, params[0])) {
337*61046927SAndroid Build Coastguard Worker flush(ctx);
338*61046927SAndroid Build Coastguard Worker update_sampler_gl_clamp(ctx, &texObj->Sampler, is_wrap_gl_clamp(texObj->Sampler.Attrib.WrapS), is_wrap_gl_clamp(params[0]), WRAP_S);
339*61046927SAndroid Build Coastguard Worker texObj->Sampler.Attrib.WrapS = params[0];
340*61046927SAndroid Build Coastguard Worker texObj->Sampler.Attrib.state.wrap_s = wrap_to_gallium(params[0]);
341*61046927SAndroid Build Coastguard Worker _mesa_lower_gl_clamp(ctx, &texObj->Sampler);
342*61046927SAndroid Build Coastguard Worker return GL_TRUE;
343*61046927SAndroid Build Coastguard Worker }
344*61046927SAndroid Build Coastguard Worker return GL_FALSE;
345*61046927SAndroid Build Coastguard Worker
346*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_T:
347*61046927SAndroid Build Coastguard Worker if (!_mesa_target_allows_setting_sampler_parameters(texObj->Target))
348*61046927SAndroid Build Coastguard Worker goto invalid_dsa;
349*61046927SAndroid Build Coastguard Worker
350*61046927SAndroid Build Coastguard Worker if (texObj->Sampler.Attrib.WrapT == params[0])
351*61046927SAndroid Build Coastguard Worker return GL_FALSE;
352*61046927SAndroid Build Coastguard Worker if (validate_texture_wrap_mode(ctx, texObj->Target, params[0])) {
353*61046927SAndroid Build Coastguard Worker flush(ctx);
354*61046927SAndroid Build Coastguard Worker update_sampler_gl_clamp(ctx, &texObj->Sampler, is_wrap_gl_clamp(texObj->Sampler.Attrib.WrapT), is_wrap_gl_clamp(params[0]), WRAP_T);
355*61046927SAndroid Build Coastguard Worker texObj->Sampler.Attrib.WrapT = params[0];
356*61046927SAndroid Build Coastguard Worker texObj->Sampler.Attrib.state.wrap_t = wrap_to_gallium(params[0]);
357*61046927SAndroid Build Coastguard Worker _mesa_lower_gl_clamp(ctx, &texObj->Sampler);
358*61046927SAndroid Build Coastguard Worker return GL_TRUE;
359*61046927SAndroid Build Coastguard Worker }
360*61046927SAndroid Build Coastguard Worker return GL_FALSE;
361*61046927SAndroid Build Coastguard Worker
362*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_R:
363*61046927SAndroid Build Coastguard Worker if (!_mesa_target_allows_setting_sampler_parameters(texObj->Target))
364*61046927SAndroid Build Coastguard Worker goto invalid_dsa;
365*61046927SAndroid Build Coastguard Worker
366*61046927SAndroid Build Coastguard Worker if (texObj->Sampler.Attrib.WrapR == params[0])
367*61046927SAndroid Build Coastguard Worker return GL_FALSE;
368*61046927SAndroid Build Coastguard Worker if (validate_texture_wrap_mode(ctx, texObj->Target, params[0])) {
369*61046927SAndroid Build Coastguard Worker flush(ctx);
370*61046927SAndroid Build Coastguard Worker update_sampler_gl_clamp(ctx, &texObj->Sampler, is_wrap_gl_clamp(texObj->Sampler.Attrib.WrapR), is_wrap_gl_clamp(params[0]), WRAP_R);
371*61046927SAndroid Build Coastguard Worker texObj->Sampler.Attrib.WrapR = params[0];
372*61046927SAndroid Build Coastguard Worker texObj->Sampler.Attrib.state.wrap_r = wrap_to_gallium(params[0]);
373*61046927SAndroid Build Coastguard Worker _mesa_lower_gl_clamp(ctx, &texObj->Sampler);
374*61046927SAndroid Build Coastguard Worker return GL_TRUE;
375*61046927SAndroid Build Coastguard Worker }
376*61046927SAndroid Build Coastguard Worker return GL_FALSE;
377*61046927SAndroid Build Coastguard Worker
378*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BASE_LEVEL:
379*61046927SAndroid Build Coastguard Worker if (!_mesa_is_desktop_gl(ctx) && !_mesa_is_gles3(ctx))
380*61046927SAndroid Build Coastguard Worker goto invalid_pname;
381*61046927SAndroid Build Coastguard Worker
382*61046927SAndroid Build Coastguard Worker if (texObj->Attrib.BaseLevel == params[0])
383*61046927SAndroid Build Coastguard Worker return GL_FALSE;
384*61046927SAndroid Build Coastguard Worker
385*61046927SAndroid Build Coastguard Worker /* Section 8.10 (Texture Parameters) of the OpenGL 4.5 Core Profile spec
386*61046927SAndroid Build Coastguard Worker * says:
387*61046927SAndroid Build Coastguard Worker *
388*61046927SAndroid Build Coastguard Worker * An INVALID_OPERATION error is generated if the effective target is
389*61046927SAndroid Build Coastguard Worker * TEXTURE_2D_MULTISAMPLE, TEXTURE_2D_MULTISAMPLE_ARRAY, or
390*61046927SAndroid Build Coastguard Worker * TEXTURE_RECTANGLE, and pname TEXTURE_BASE_LEVEL is set to a value
391*61046927SAndroid Build Coastguard Worker * other than zero.
392*61046927SAndroid Build Coastguard Worker *
393*61046927SAndroid Build Coastguard Worker * Note that section 3.8.8 (Texture Parameters) of the OpenGL 3.3 Core
394*61046927SAndroid Build Coastguard Worker * Profile spec said:
395*61046927SAndroid Build Coastguard Worker *
396*61046927SAndroid Build Coastguard Worker * The error INVALID_VALUE is generated if TEXTURE_BASE_LEVEL is set
397*61046927SAndroid Build Coastguard Worker * to any value other than zero.
398*61046927SAndroid Build Coastguard Worker *
399*61046927SAndroid Build Coastguard Worker * We take the 4.5 language as a correction to 3.3, and we implement
400*61046927SAndroid Build Coastguard Worker * that on all GL versions.
401*61046927SAndroid Build Coastguard Worker */
402*61046927SAndroid Build Coastguard Worker if ((texObj->Target == GL_TEXTURE_2D_MULTISAMPLE ||
403*61046927SAndroid Build Coastguard Worker texObj->Target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY ||
404*61046927SAndroid Build Coastguard Worker texObj->Target == GL_TEXTURE_RECTANGLE) && params[0] != 0)
405*61046927SAndroid Build Coastguard Worker goto invalid_operation;
406*61046927SAndroid Build Coastguard Worker
407*61046927SAndroid Build Coastguard Worker if (params[0] < 0) {
408*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_VALUE,
409*61046927SAndroid Build Coastguard Worker "glTex%sParameter(param=%d)", suffix, params[0]);
410*61046927SAndroid Build Coastguard Worker return GL_FALSE;
411*61046927SAndroid Build Coastguard Worker }
412*61046927SAndroid Build Coastguard Worker incomplete(ctx, texObj);
413*61046927SAndroid Build Coastguard Worker
414*61046927SAndroid Build Coastguard Worker /** See note about ARB_texture_storage below */
415*61046927SAndroid Build Coastguard Worker if (texObj->Immutable)
416*61046927SAndroid Build Coastguard Worker texObj->Attrib.BaseLevel = MIN2(texObj->Attrib.ImmutableLevels - 1, params[0]);
417*61046927SAndroid Build Coastguard Worker else
418*61046927SAndroid Build Coastguard Worker texObj->Attrib.BaseLevel = params[0];
419*61046927SAndroid Build Coastguard Worker
420*61046927SAndroid Build Coastguard Worker _mesa_update_teximage_format_swizzle(ctx, _mesa_base_tex_image(texObj), texObj->Attrib.DepthMode);
421*61046927SAndroid Build Coastguard Worker _mesa_update_texture_object_swizzle(ctx, texObj);
422*61046927SAndroid Build Coastguard Worker
423*61046927SAndroid Build Coastguard Worker return GL_TRUE;
424*61046927SAndroid Build Coastguard Worker
425*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAX_LEVEL:
426*61046927SAndroid Build Coastguard Worker if (texObj->Attrib.MaxLevel == params[0])
427*61046927SAndroid Build Coastguard Worker return GL_FALSE;
428*61046927SAndroid Build Coastguard Worker
429*61046927SAndroid Build Coastguard Worker if (params[0] < 0 ||
430*61046927SAndroid Build Coastguard Worker (texObj->Target == GL_TEXTURE_RECTANGLE_ARB && params[0] > 0)) {
431*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_VALUE,
432*61046927SAndroid Build Coastguard Worker "glTex%sParameter(param=%d)", suffix,
433*61046927SAndroid Build Coastguard Worker params[0]);
434*61046927SAndroid Build Coastguard Worker return GL_FALSE;
435*61046927SAndroid Build Coastguard Worker }
436*61046927SAndroid Build Coastguard Worker incomplete(ctx, texObj);
437*61046927SAndroid Build Coastguard Worker
438*61046927SAndroid Build Coastguard Worker /** From ARB_texture_storage:
439*61046927SAndroid Build Coastguard Worker * However, if TEXTURE_IMMUTABLE_FORMAT is TRUE, then level_base is
440*61046927SAndroid Build Coastguard Worker * clamped to the range [0, <levels> - 1] and level_max is then clamped to
441*61046927SAndroid Build Coastguard Worker * the range [level_base, <levels> - 1], where <levels> is the parameter
442*61046927SAndroid Build Coastguard Worker * passed the call to TexStorage* for the texture object.
443*61046927SAndroid Build Coastguard Worker */
444*61046927SAndroid Build Coastguard Worker if (texObj->Immutable)
445*61046927SAndroid Build Coastguard Worker texObj->Attrib.MaxLevel = CLAMP(params[0], texObj->Attrib.BaseLevel,
446*61046927SAndroid Build Coastguard Worker texObj->Attrib.ImmutableLevels - 1);
447*61046927SAndroid Build Coastguard Worker else
448*61046927SAndroid Build Coastguard Worker texObj->Attrib.MaxLevel = params[0];
449*61046927SAndroid Build Coastguard Worker
450*61046927SAndroid Build Coastguard Worker return GL_TRUE;
451*61046927SAndroid Build Coastguard Worker
452*61046927SAndroid Build Coastguard Worker case GL_GENERATE_MIPMAP_SGIS:
453*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
454*61046927SAndroid Build Coastguard Worker goto invalid_pname;
455*61046927SAndroid Build Coastguard Worker
456*61046927SAndroid Build Coastguard Worker if (params[0] && texObj->Target == GL_TEXTURE_EXTERNAL_OES)
457*61046927SAndroid Build Coastguard Worker goto invalid_param;
458*61046927SAndroid Build Coastguard Worker if (texObj->Attrib.GenerateMipmap != params[0]) {
459*61046927SAndroid Build Coastguard Worker /* no flush() */
460*61046927SAndroid Build Coastguard Worker texObj->Attrib.GenerateMipmap = params[0] ? GL_TRUE : GL_FALSE;
461*61046927SAndroid Build Coastguard Worker return GL_TRUE;
462*61046927SAndroid Build Coastguard Worker }
463*61046927SAndroid Build Coastguard Worker return GL_FALSE;
464*61046927SAndroid Build Coastguard Worker
465*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COMPARE_MODE_ARB:
466*61046927SAndroid Build Coastguard Worker if ((_mesa_is_desktop_gl(ctx) && ctx->Extensions.ARB_shadow)
467*61046927SAndroid Build Coastguard Worker || _mesa_is_gles3(ctx)) {
468*61046927SAndroid Build Coastguard Worker
469*61046927SAndroid Build Coastguard Worker if (!_mesa_target_allows_setting_sampler_parameters(texObj->Target))
470*61046927SAndroid Build Coastguard Worker goto invalid_dsa;
471*61046927SAndroid Build Coastguard Worker
472*61046927SAndroid Build Coastguard Worker if (texObj->Sampler.Attrib.CompareMode == params[0])
473*61046927SAndroid Build Coastguard Worker return GL_FALSE;
474*61046927SAndroid Build Coastguard Worker if (params[0] == GL_NONE ||
475*61046927SAndroid Build Coastguard Worker params[0] == GL_COMPARE_R_TO_TEXTURE_ARB) {
476*61046927SAndroid Build Coastguard Worker flush(ctx);
477*61046927SAndroid Build Coastguard Worker texObj->Sampler.Attrib.CompareMode = params[0];
478*61046927SAndroid Build Coastguard Worker return GL_TRUE;
479*61046927SAndroid Build Coastguard Worker }
480*61046927SAndroid Build Coastguard Worker goto invalid_param;
481*61046927SAndroid Build Coastguard Worker }
482*61046927SAndroid Build Coastguard Worker goto invalid_pname;
483*61046927SAndroid Build Coastguard Worker
484*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COMPARE_FUNC_ARB:
485*61046927SAndroid Build Coastguard Worker if ((_mesa_is_desktop_gl(ctx) && ctx->Extensions.ARB_shadow)
486*61046927SAndroid Build Coastguard Worker || _mesa_is_gles3(ctx)) {
487*61046927SAndroid Build Coastguard Worker
488*61046927SAndroid Build Coastguard Worker if (!_mesa_target_allows_setting_sampler_parameters(texObj->Target))
489*61046927SAndroid Build Coastguard Worker goto invalid_dsa;
490*61046927SAndroid Build Coastguard Worker
491*61046927SAndroid Build Coastguard Worker if (texObj->Sampler.Attrib.CompareFunc == params[0])
492*61046927SAndroid Build Coastguard Worker return GL_FALSE;
493*61046927SAndroid Build Coastguard Worker switch (params[0]) {
494*61046927SAndroid Build Coastguard Worker case GL_LEQUAL:
495*61046927SAndroid Build Coastguard Worker case GL_GEQUAL:
496*61046927SAndroid Build Coastguard Worker case GL_EQUAL:
497*61046927SAndroid Build Coastguard Worker case GL_NOTEQUAL:
498*61046927SAndroid Build Coastguard Worker case GL_LESS:
499*61046927SAndroid Build Coastguard Worker case GL_GREATER:
500*61046927SAndroid Build Coastguard Worker case GL_ALWAYS:
501*61046927SAndroid Build Coastguard Worker case GL_NEVER:
502*61046927SAndroid Build Coastguard Worker flush(ctx);
503*61046927SAndroid Build Coastguard Worker texObj->Sampler.Attrib.CompareFunc = params[0];
504*61046927SAndroid Build Coastguard Worker texObj->Sampler.Attrib.state.compare_func = func_to_gallium(params[0]);
505*61046927SAndroid Build Coastguard Worker return GL_TRUE;
506*61046927SAndroid Build Coastguard Worker default:
507*61046927SAndroid Build Coastguard Worker goto invalid_param;
508*61046927SAndroid Build Coastguard Worker }
509*61046927SAndroid Build Coastguard Worker }
510*61046927SAndroid Build Coastguard Worker goto invalid_pname;
511*61046927SAndroid Build Coastguard Worker
512*61046927SAndroid Build Coastguard Worker case GL_DEPTH_TEXTURE_MODE_ARB:
513*61046927SAndroid Build Coastguard Worker /* GL_DEPTH_TEXTURE_MODE_ARB is removed in core-profile and it has never
514*61046927SAndroid Build Coastguard Worker * existed in OpenGL ES.
515*61046927SAndroid Build Coastguard Worker */
516*61046927SAndroid Build Coastguard Worker if (_mesa_is_desktop_gl_compat(ctx)) {
517*61046927SAndroid Build Coastguard Worker if (texObj->Attrib.DepthMode == params[0])
518*61046927SAndroid Build Coastguard Worker return GL_FALSE;
519*61046927SAndroid Build Coastguard Worker if (params[0] == GL_LUMINANCE ||
520*61046927SAndroid Build Coastguard Worker params[0] == GL_INTENSITY ||
521*61046927SAndroid Build Coastguard Worker params[0] == GL_ALPHA ||
522*61046927SAndroid Build Coastguard Worker (ctx->Extensions.ARB_texture_rg && params[0] == GL_RED)) {
523*61046927SAndroid Build Coastguard Worker flush(ctx);
524*61046927SAndroid Build Coastguard Worker texObj->Attrib.DepthMode = params[0];
525*61046927SAndroid Build Coastguard Worker _mesa_update_teximage_format_swizzle(ctx, _mesa_base_tex_image(texObj), texObj->Attrib.DepthMode);
526*61046927SAndroid Build Coastguard Worker _mesa_update_texture_object_swizzle(ctx, texObj);
527*61046927SAndroid Build Coastguard Worker return GL_TRUE;
528*61046927SAndroid Build Coastguard Worker }
529*61046927SAndroid Build Coastguard Worker goto invalid_param;
530*61046927SAndroid Build Coastguard Worker }
531*61046927SAndroid Build Coastguard Worker goto invalid_pname;
532*61046927SAndroid Build Coastguard Worker
533*61046927SAndroid Build Coastguard Worker case GL_DEPTH_STENCIL_TEXTURE_MODE:
534*61046927SAndroid Build Coastguard Worker if (_mesa_has_ARB_stencil_texturing(ctx) || _mesa_is_gles31(ctx)) {
535*61046927SAndroid Build Coastguard Worker bool stencil = params[0] == GL_STENCIL_INDEX;
536*61046927SAndroid Build Coastguard Worker if (!stencil && params[0] != GL_DEPTH_COMPONENT)
537*61046927SAndroid Build Coastguard Worker goto invalid_param;
538*61046927SAndroid Build Coastguard Worker
539*61046927SAndroid Build Coastguard Worker if (texObj->StencilSampling == stencil)
540*61046927SAndroid Build Coastguard Worker return GL_FALSE;
541*61046927SAndroid Build Coastguard Worker
542*61046927SAndroid Build Coastguard Worker /* This should not be restored by glPopAttrib. */
543*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_TEXTURE_OBJECT, 0);
544*61046927SAndroid Build Coastguard Worker texObj->StencilSampling = stencil;
545*61046927SAndroid Build Coastguard Worker return GL_TRUE;
546*61046927SAndroid Build Coastguard Worker }
547*61046927SAndroid Build Coastguard Worker goto invalid_pname;
548*61046927SAndroid Build Coastguard Worker
549*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_CROP_RECT_OES:
550*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGLES || !ctx->Extensions.OES_draw_texture)
551*61046927SAndroid Build Coastguard Worker goto invalid_pname;
552*61046927SAndroid Build Coastguard Worker
553*61046927SAndroid Build Coastguard Worker texObj->CropRect[0] = params[0];
554*61046927SAndroid Build Coastguard Worker texObj->CropRect[1] = params[1];
555*61046927SAndroid Build Coastguard Worker texObj->CropRect[2] = params[2];
556*61046927SAndroid Build Coastguard Worker texObj->CropRect[3] = params[3];
557*61046927SAndroid Build Coastguard Worker return GL_TRUE;
558*61046927SAndroid Build Coastguard Worker
559*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SWIZZLE_R_EXT:
560*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SWIZZLE_G_EXT:
561*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SWIZZLE_B_EXT:
562*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SWIZZLE_A_EXT:
563*61046927SAndroid Build Coastguard Worker if (_mesa_has_EXT_texture_swizzle(ctx) || _mesa_is_gles3(ctx)) {
564*61046927SAndroid Build Coastguard Worker const GLuint comp = pname - GL_TEXTURE_SWIZZLE_R_EXT;
565*61046927SAndroid Build Coastguard Worker const GLint swz = comp_to_swizzle(params[0]);
566*61046927SAndroid Build Coastguard Worker if (swz < 0) {
567*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM,
568*61046927SAndroid Build Coastguard Worker "glTex%sParameter(swizzle 0x%x)", suffix, params[0]);
569*61046927SAndroid Build Coastguard Worker return GL_FALSE;
570*61046927SAndroid Build Coastguard Worker }
571*61046927SAndroid Build Coastguard Worker assert(comp < 4);
572*61046927SAndroid Build Coastguard Worker
573*61046927SAndroid Build Coastguard Worker flush(ctx);
574*61046927SAndroid Build Coastguard Worker texObj->Attrib.Swizzle[comp] = params[0];
575*61046927SAndroid Build Coastguard Worker set_swizzle_component(&texObj->Attrib._Swizzle, comp, swz);
576*61046927SAndroid Build Coastguard Worker _mesa_update_texture_object_swizzle(ctx, texObj);
577*61046927SAndroid Build Coastguard Worker return GL_TRUE;
578*61046927SAndroid Build Coastguard Worker }
579*61046927SAndroid Build Coastguard Worker goto invalid_pname;
580*61046927SAndroid Build Coastguard Worker
581*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SWIZZLE_RGBA_EXT:
582*61046927SAndroid Build Coastguard Worker if (_mesa_has_EXT_texture_swizzle(ctx) || _mesa_is_gles3(ctx)) {
583*61046927SAndroid Build Coastguard Worker flush(ctx);
584*61046927SAndroid Build Coastguard Worker for (GLuint comp = 0; comp < 4; comp++) {
585*61046927SAndroid Build Coastguard Worker const GLint swz = comp_to_swizzle(params[comp]);
586*61046927SAndroid Build Coastguard Worker if (swz >= 0) {
587*61046927SAndroid Build Coastguard Worker texObj->Attrib.Swizzle[comp] = params[comp];
588*61046927SAndroid Build Coastguard Worker set_swizzle_component(&texObj->Attrib._Swizzle, comp, swz);
589*61046927SAndroid Build Coastguard Worker _mesa_update_texture_object_swizzle(ctx, texObj);
590*61046927SAndroid Build Coastguard Worker }
591*61046927SAndroid Build Coastguard Worker else {
592*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM,
593*61046927SAndroid Build Coastguard Worker "glTex%sParameter(swizzle 0x%x)",
594*61046927SAndroid Build Coastguard Worker suffix, params[comp]);
595*61046927SAndroid Build Coastguard Worker return GL_FALSE;
596*61046927SAndroid Build Coastguard Worker }
597*61046927SAndroid Build Coastguard Worker }
598*61046927SAndroid Build Coastguard Worker return GL_TRUE;
599*61046927SAndroid Build Coastguard Worker }
600*61046927SAndroid Build Coastguard Worker goto invalid_pname;
601*61046927SAndroid Build Coastguard Worker
602*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SRGB_DECODE_EXT:
603*61046927SAndroid Build Coastguard Worker if (ctx->Extensions.EXT_texture_sRGB_decode) {
604*61046927SAndroid Build Coastguard Worker GLenum decode = params[0];
605*61046927SAndroid Build Coastguard Worker
606*61046927SAndroid Build Coastguard Worker if (!_mesa_target_allows_setting_sampler_parameters(texObj->Target))
607*61046927SAndroid Build Coastguard Worker goto invalid_dsa;
608*61046927SAndroid Build Coastguard Worker
609*61046927SAndroid Build Coastguard Worker if (decode == GL_DECODE_EXT || decode == GL_SKIP_DECODE_EXT) {
610*61046927SAndroid Build Coastguard Worker if (texObj->Sampler.Attrib.sRGBDecode != decode) {
611*61046927SAndroid Build Coastguard Worker flush(ctx);
612*61046927SAndroid Build Coastguard Worker texObj->Sampler.Attrib.sRGBDecode = decode;
613*61046927SAndroid Build Coastguard Worker }
614*61046927SAndroid Build Coastguard Worker return GL_TRUE;
615*61046927SAndroid Build Coastguard Worker }
616*61046927SAndroid Build Coastguard Worker }
617*61046927SAndroid Build Coastguard Worker goto invalid_pname;
618*61046927SAndroid Build Coastguard Worker
619*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_REDUCTION_MODE_EXT:
620*61046927SAndroid Build Coastguard Worker if (ctx->Extensions.EXT_texture_filter_minmax ||
621*61046927SAndroid Build Coastguard Worker _mesa_has_ARB_texture_filter_minmax(ctx)) {
622*61046927SAndroid Build Coastguard Worker GLenum mode = params[0];
623*61046927SAndroid Build Coastguard Worker
624*61046927SAndroid Build Coastguard Worker if (!_mesa_target_allows_setting_sampler_parameters(texObj->Target))
625*61046927SAndroid Build Coastguard Worker goto invalid_dsa;
626*61046927SAndroid Build Coastguard Worker
627*61046927SAndroid Build Coastguard Worker if (mode == GL_WEIGHTED_AVERAGE_EXT || mode == GL_MIN || mode == GL_MAX) {
628*61046927SAndroid Build Coastguard Worker if (texObj->Sampler.Attrib.ReductionMode != mode) {
629*61046927SAndroid Build Coastguard Worker flush(ctx);
630*61046927SAndroid Build Coastguard Worker texObj->Sampler.Attrib.ReductionMode = mode;
631*61046927SAndroid Build Coastguard Worker texObj->Sampler.Attrib.state.reduction_mode = reduction_to_gallium(mode);
632*61046927SAndroid Build Coastguard Worker }
633*61046927SAndroid Build Coastguard Worker return GL_TRUE;
634*61046927SAndroid Build Coastguard Worker }
635*61046927SAndroid Build Coastguard Worker }
636*61046927SAndroid Build Coastguard Worker goto invalid_pname;
637*61046927SAndroid Build Coastguard Worker
638*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_CUBE_MAP_SEAMLESS:
639*61046927SAndroid Build Coastguard Worker if (_mesa_has_AMD_seamless_cubemap_per_texture(ctx)) {
640*61046927SAndroid Build Coastguard Worker GLenum param = params[0];
641*61046927SAndroid Build Coastguard Worker
642*61046927SAndroid Build Coastguard Worker if (!_mesa_target_allows_setting_sampler_parameters(texObj->Target))
643*61046927SAndroid Build Coastguard Worker goto invalid_dsa;
644*61046927SAndroid Build Coastguard Worker
645*61046927SAndroid Build Coastguard Worker if (param != GL_TRUE && param != GL_FALSE) {
646*61046927SAndroid Build Coastguard Worker goto invalid_param;
647*61046927SAndroid Build Coastguard Worker }
648*61046927SAndroid Build Coastguard Worker if (param != texObj->Sampler.Attrib.CubeMapSeamless) {
649*61046927SAndroid Build Coastguard Worker flush(ctx);
650*61046927SAndroid Build Coastguard Worker texObj->Sampler.Attrib.CubeMapSeamless = param;
651*61046927SAndroid Build Coastguard Worker texObj->Sampler.Attrib.state.seamless_cube_map = param;
652*61046927SAndroid Build Coastguard Worker }
653*61046927SAndroid Build Coastguard Worker return GL_TRUE;
654*61046927SAndroid Build Coastguard Worker }
655*61046927SAndroid Build Coastguard Worker goto invalid_pname;
656*61046927SAndroid Build Coastguard Worker
657*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_TILING_EXT:
658*61046927SAndroid Build Coastguard Worker if (ctx->Extensions.EXT_memory_object && !texObj->Immutable) {
659*61046927SAndroid Build Coastguard Worker texObj->TextureTiling = params[0];
660*61046927SAndroid Build Coastguard Worker
661*61046927SAndroid Build Coastguard Worker return GL_TRUE;
662*61046927SAndroid Build Coastguard Worker }
663*61046927SAndroid Build Coastguard Worker goto invalid_pname;
664*61046927SAndroid Build Coastguard Worker
665*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SPARSE_ARB:
666*61046927SAndroid Build Coastguard Worker case GL_VIRTUAL_PAGE_SIZE_INDEX_ARB:
667*61046927SAndroid Build Coastguard Worker if (!_mesa_has_ARB_sparse_texture(ctx))
668*61046927SAndroid Build Coastguard Worker goto invalid_pname;
669*61046927SAndroid Build Coastguard Worker
670*61046927SAndroid Build Coastguard Worker if (texObj->Immutable)
671*61046927SAndroid Build Coastguard Worker goto invalid_operation;
672*61046927SAndroid Build Coastguard Worker
673*61046927SAndroid Build Coastguard Worker if (pname == GL_TEXTURE_SPARSE_ARB) {
674*61046927SAndroid Build Coastguard Worker /* ARB_sparse_texture spec:
675*61046927SAndroid Build Coastguard Worker *
676*61046927SAndroid Build Coastguard Worker * INVALID_VALUE is generated if <pname> is TEXTURE_SPARSE_ARB, <param>
677*61046927SAndroid Build Coastguard Worker * is TRUE and <target> is not one of TEXTURE_2D, TEXTURE_2D_ARRAY,
678*61046927SAndroid Build Coastguard Worker * TEXTURE_CUBE_MAP, TEXTURE_CUBE_MAP_ARRAY, TEXTURE_3D, or
679*61046927SAndroid Build Coastguard Worker * TEXTURE_RECTANGLE.
680*61046927SAndroid Build Coastguard Worker *
681*61046927SAndroid Build Coastguard Worker * ARB_sparse_texture2 also allow TEXTURE_2D_MULTISAMPLE and
682*61046927SAndroid Build Coastguard Worker * TEXTURE_2D_MULTISAMPLE_ARRAY.
683*61046927SAndroid Build Coastguard Worker */
684*61046927SAndroid Build Coastguard Worker if (params[0] &&
685*61046927SAndroid Build Coastguard Worker texObj->Target != GL_TEXTURE_2D &&
686*61046927SAndroid Build Coastguard Worker texObj->Target != GL_TEXTURE_2D_ARRAY &&
687*61046927SAndroid Build Coastguard Worker texObj->Target != GL_TEXTURE_CUBE_MAP &&
688*61046927SAndroid Build Coastguard Worker texObj->Target != GL_TEXTURE_CUBE_MAP_ARRAY &&
689*61046927SAndroid Build Coastguard Worker texObj->Target != GL_TEXTURE_3D &&
690*61046927SAndroid Build Coastguard Worker texObj->Target != GL_TEXTURE_RECTANGLE &&
691*61046927SAndroid Build Coastguard Worker (!_mesa_has_ARB_sparse_texture2(ctx) ||
692*61046927SAndroid Build Coastguard Worker (texObj->Target != GL_TEXTURE_2D_MULTISAMPLE &&
693*61046927SAndroid Build Coastguard Worker texObj->Target != GL_TEXTURE_2D_MULTISAMPLE_ARRAY))) {
694*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_VALUE,
695*61046927SAndroid Build Coastguard Worker "glTex%sParameter(target=%d)", suffix, texObj->Target);
696*61046927SAndroid Build Coastguard Worker return GL_FALSE;
697*61046927SAndroid Build Coastguard Worker }
698*61046927SAndroid Build Coastguard Worker
699*61046927SAndroid Build Coastguard Worker texObj->IsSparse = !!params[0];
700*61046927SAndroid Build Coastguard Worker } else
701*61046927SAndroid Build Coastguard Worker texObj->VirtualPageSizeIndex = params[0];
702*61046927SAndroid Build Coastguard Worker
703*61046927SAndroid Build Coastguard Worker return GL_TRUE;
704*61046927SAndroid Build Coastguard Worker
705*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_ASTC_DECODE_PRECISION_EXT:
706*61046927SAndroid Build Coastguard Worker if (!_mesa_has_EXT_texture_compression_astc_decode_mode(ctx))
707*61046927SAndroid Build Coastguard Worker goto invalid_pname;
708*61046927SAndroid Build Coastguard Worker
709*61046927SAndroid Build Coastguard Worker if (texObj->AstcDecodePrecision == params[0])
710*61046927SAndroid Build Coastguard Worker return GL_FALSE;
711*61046927SAndroid Build Coastguard Worker
712*61046927SAndroid Build Coastguard Worker if (params[0] != GL_RGBA16F && params[0] != GL_RGBA8)
713*61046927SAndroid Build Coastguard Worker goto invalid_param;
714*61046927SAndroid Build Coastguard Worker
715*61046927SAndroid Build Coastguard Worker texObj->AstcDecodePrecision = params[0];
716*61046927SAndroid Build Coastguard Worker return GL_TRUE;
717*61046927SAndroid Build Coastguard Worker
718*61046927SAndroid Build Coastguard Worker default:
719*61046927SAndroid Build Coastguard Worker goto invalid_pname;
720*61046927SAndroid Build Coastguard Worker }
721*61046927SAndroid Build Coastguard Worker
722*61046927SAndroid Build Coastguard Worker invalid_pname:
723*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM, "glTex%sParameter(pname=%s)",
724*61046927SAndroid Build Coastguard Worker suffix, _mesa_enum_to_string(pname));
725*61046927SAndroid Build Coastguard Worker return GL_FALSE;
726*61046927SAndroid Build Coastguard Worker
727*61046927SAndroid Build Coastguard Worker invalid_param:
728*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM, "glTex%sParameter(param=%s)",
729*61046927SAndroid Build Coastguard Worker suffix, _mesa_enum_to_string(params[0]));
730*61046927SAndroid Build Coastguard Worker return GL_FALSE;
731*61046927SAndroid Build Coastguard Worker
732*61046927SAndroid Build Coastguard Worker invalid_dsa:
733*61046927SAndroid Build Coastguard Worker if (!dsa)
734*61046927SAndroid Build Coastguard Worker goto invalid_enum;
735*61046927SAndroid Build Coastguard Worker
736*61046927SAndroid Build Coastguard Worker invalid_operation:
737*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_OPERATION, "glTex%sParameter(pname=%s)",
738*61046927SAndroid Build Coastguard Worker suffix, _mesa_enum_to_string(pname));
739*61046927SAndroid Build Coastguard Worker return GL_FALSE;
740*61046927SAndroid Build Coastguard Worker
741*61046927SAndroid Build Coastguard Worker invalid_enum:
742*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM, "glTex%sParameter(pname=%s)",
743*61046927SAndroid Build Coastguard Worker suffix, _mesa_enum_to_string(pname));
744*61046927SAndroid Build Coastguard Worker return GL_FALSE;
745*61046927SAndroid Build Coastguard Worker }
746*61046927SAndroid Build Coastguard Worker
747*61046927SAndroid Build Coastguard Worker
748*61046927SAndroid Build Coastguard Worker /**
749*61046927SAndroid Build Coastguard Worker * Set a float-valued texture parameter
750*61046927SAndroid Build Coastguard Worker * \return GL_TRUE if legal AND the value changed, GL_FALSE otherwise
751*61046927SAndroid Build Coastguard Worker */
752*61046927SAndroid Build Coastguard Worker static GLboolean
set_tex_parameterf(struct gl_context * ctx,struct gl_texture_object * texObj,GLenum pname,const GLfloat * params,bool dsa)753*61046927SAndroid Build Coastguard Worker set_tex_parameterf(struct gl_context *ctx,
754*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj,
755*61046927SAndroid Build Coastguard Worker GLenum pname, const GLfloat *params, bool dsa)
756*61046927SAndroid Build Coastguard Worker {
757*61046927SAndroid Build Coastguard Worker const char *suffix = dsa ? "ture" : "";
758*61046927SAndroid Build Coastguard Worker
759*61046927SAndroid Build Coastguard Worker if (texObj->HandleAllocated) {
760*61046927SAndroid Build Coastguard Worker /* The ARB_bindless_texture spec says:
761*61046927SAndroid Build Coastguard Worker *
762*61046927SAndroid Build Coastguard Worker * "The error INVALID_OPERATION is generated by TexImage*, CopyTexImage*,
763*61046927SAndroid Build Coastguard Worker * CompressedTexImage*, TexBuffer*, TexParameter*, as well as other
764*61046927SAndroid Build Coastguard Worker * functions defined in terms of these, if the texture object to be
765*61046927SAndroid Build Coastguard Worker * modified is referenced by one or more texture or image handles."
766*61046927SAndroid Build Coastguard Worker */
767*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_OPERATION,
768*61046927SAndroid Build Coastguard Worker "glTex%sParameter(immutable texture)", suffix);
769*61046927SAndroid Build Coastguard Worker return GL_FALSE;
770*61046927SAndroid Build Coastguard Worker }
771*61046927SAndroid Build Coastguard Worker
772*61046927SAndroid Build Coastguard Worker switch (pname) {
773*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MIN_LOD:
774*61046927SAndroid Build Coastguard Worker if (!_mesa_is_desktop_gl(ctx) && !_mesa_is_gles3(ctx))
775*61046927SAndroid Build Coastguard Worker goto invalid_pname;
776*61046927SAndroid Build Coastguard Worker
777*61046927SAndroid Build Coastguard Worker if (!_mesa_target_allows_setting_sampler_parameters(texObj->Target))
778*61046927SAndroid Build Coastguard Worker goto invalid_dsa;
779*61046927SAndroid Build Coastguard Worker
780*61046927SAndroid Build Coastguard Worker if (texObj->Sampler.Attrib.MinLod == params[0])
781*61046927SAndroid Build Coastguard Worker return GL_FALSE;
782*61046927SAndroid Build Coastguard Worker flush(ctx);
783*61046927SAndroid Build Coastguard Worker texObj->Sampler.Attrib.MinLod = params[0];
784*61046927SAndroid Build Coastguard Worker texObj->Sampler.Attrib.state.min_lod = MAX2(params[0], 0.0f); /* only positive vals */
785*61046927SAndroid Build Coastguard Worker return GL_TRUE;
786*61046927SAndroid Build Coastguard Worker
787*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAX_LOD:
788*61046927SAndroid Build Coastguard Worker if (!_mesa_is_desktop_gl(ctx) && !_mesa_is_gles3(ctx))
789*61046927SAndroid Build Coastguard Worker goto invalid_pname;
790*61046927SAndroid Build Coastguard Worker
791*61046927SAndroid Build Coastguard Worker if (!_mesa_target_allows_setting_sampler_parameters(texObj->Target))
792*61046927SAndroid Build Coastguard Worker goto invalid_dsa;
793*61046927SAndroid Build Coastguard Worker
794*61046927SAndroid Build Coastguard Worker if (texObj->Sampler.Attrib.MaxLod == params[0])
795*61046927SAndroid Build Coastguard Worker return GL_FALSE;
796*61046927SAndroid Build Coastguard Worker flush(ctx);
797*61046927SAndroid Build Coastguard Worker texObj->Sampler.Attrib.MaxLod = params[0];
798*61046927SAndroid Build Coastguard Worker texObj->Sampler.Attrib.state.max_lod = params[0];
799*61046927SAndroid Build Coastguard Worker return GL_TRUE;
800*61046927SAndroid Build Coastguard Worker
801*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_PRIORITY:
802*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
803*61046927SAndroid Build Coastguard Worker goto invalid_pname;
804*61046927SAndroid Build Coastguard Worker
805*61046927SAndroid Build Coastguard Worker flush(ctx);
806*61046927SAndroid Build Coastguard Worker texObj->Attrib.Priority = CLAMP(params[0], 0.0F, 1.0F);
807*61046927SAndroid Build Coastguard Worker return GL_TRUE;
808*61046927SAndroid Build Coastguard Worker
809*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAX_ANISOTROPY_EXT:
810*61046927SAndroid Build Coastguard Worker if (ctx->Extensions.EXT_texture_filter_anisotropic) {
811*61046927SAndroid Build Coastguard Worker if (!_mesa_target_allows_setting_sampler_parameters(texObj->Target))
812*61046927SAndroid Build Coastguard Worker goto invalid_dsa;
813*61046927SAndroid Build Coastguard Worker
814*61046927SAndroid Build Coastguard Worker if (texObj->Sampler.Attrib.MaxAnisotropy == params[0])
815*61046927SAndroid Build Coastguard Worker return GL_FALSE;
816*61046927SAndroid Build Coastguard Worker if (params[0] < 1.0F) {
817*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_VALUE, "glTex%sParameter(param)",
818*61046927SAndroid Build Coastguard Worker suffix);
819*61046927SAndroid Build Coastguard Worker return GL_FALSE;
820*61046927SAndroid Build Coastguard Worker }
821*61046927SAndroid Build Coastguard Worker flush(ctx);
822*61046927SAndroid Build Coastguard Worker /* clamp to max, that's what NVIDIA does */
823*61046927SAndroid Build Coastguard Worker texObj->Sampler.Attrib.MaxAnisotropy = MIN2(params[0],
824*61046927SAndroid Build Coastguard Worker ctx->Const.MaxTextureMaxAnisotropy);
825*61046927SAndroid Build Coastguard Worker texObj->Sampler.Attrib.state.max_anisotropy =
826*61046927SAndroid Build Coastguard Worker texObj->Sampler.Attrib.MaxAnisotropy == 1 ?
827*61046927SAndroid Build Coastguard Worker 0 : texObj->Sampler.Attrib.MaxAnisotropy; /* gallium sets 0 for 1 */
828*61046927SAndroid Build Coastguard Worker return GL_TRUE;
829*61046927SAndroid Build Coastguard Worker }
830*61046927SAndroid Build Coastguard Worker else {
831*61046927SAndroid Build Coastguard Worker static GLuint count = 0;
832*61046927SAndroid Build Coastguard Worker if (count++ < 10)
833*61046927SAndroid Build Coastguard Worker goto invalid_pname;
834*61046927SAndroid Build Coastguard Worker }
835*61046927SAndroid Build Coastguard Worker return GL_FALSE;
836*61046927SAndroid Build Coastguard Worker
837*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_LOD_BIAS:
838*61046927SAndroid Build Coastguard Worker /* NOTE: this is really part of OpenGL 1.4, not EXT_texture_lod_bias. */
839*61046927SAndroid Build Coastguard Worker if (_mesa_is_gles(ctx))
840*61046927SAndroid Build Coastguard Worker goto invalid_pname;
841*61046927SAndroid Build Coastguard Worker
842*61046927SAndroid Build Coastguard Worker if (!_mesa_target_allows_setting_sampler_parameters(texObj->Target))
843*61046927SAndroid Build Coastguard Worker goto invalid_dsa;
844*61046927SAndroid Build Coastguard Worker
845*61046927SAndroid Build Coastguard Worker if (texObj->Sampler.Attrib.LodBias != params[0]) {
846*61046927SAndroid Build Coastguard Worker flush(ctx);
847*61046927SAndroid Build Coastguard Worker texObj->Sampler.Attrib.LodBias = params[0];
848*61046927SAndroid Build Coastguard Worker texObj->Sampler.Attrib.state.lod_bias = util_quantize_lod_bias(params[0]);
849*61046927SAndroid Build Coastguard Worker return GL_TRUE;
850*61046927SAndroid Build Coastguard Worker }
851*61046927SAndroid Build Coastguard Worker break;
852*61046927SAndroid Build Coastguard Worker
853*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BORDER_COLOR:
854*61046927SAndroid Build Coastguard Worker /* Border color exists in desktop OpenGL since 1.0 for GL_CLAMP. In
855*61046927SAndroid Build Coastguard Worker * OpenGL ES 2.0+, it only exists in when GL_OES_texture_border_clamp is
856*61046927SAndroid Build Coastguard Worker * enabled. It is never available in OpenGL ES 1.x.
857*61046927SAndroid Build Coastguard Worker */
858*61046927SAndroid Build Coastguard Worker if (_mesa_is_gles1(ctx))
859*61046927SAndroid Build Coastguard Worker goto invalid_pname;
860*61046927SAndroid Build Coastguard Worker
861*61046927SAndroid Build Coastguard Worker if (!_mesa_target_allows_setting_sampler_parameters(texObj->Target))
862*61046927SAndroid Build Coastguard Worker goto invalid_enum;
863*61046927SAndroid Build Coastguard Worker
864*61046927SAndroid Build Coastguard Worker flush(ctx);
865*61046927SAndroid Build Coastguard Worker /* ARB_texture_float disables clamping */
866*61046927SAndroid Build Coastguard Worker if (ctx->Extensions.ARB_texture_float) {
867*61046927SAndroid Build Coastguard Worker memcpy(texObj->Sampler.Attrib.state.border_color.f, params, 4 * sizeof(float));
868*61046927SAndroid Build Coastguard Worker } else {
869*61046927SAndroid Build Coastguard Worker texObj->Sampler.Attrib.state.border_color.f[RCOMP] = CLAMP(params[0], 0.0F, 1.0F);
870*61046927SAndroid Build Coastguard Worker texObj->Sampler.Attrib.state.border_color.f[GCOMP] = CLAMP(params[1], 0.0F, 1.0F);
871*61046927SAndroid Build Coastguard Worker texObj->Sampler.Attrib.state.border_color.f[BCOMP] = CLAMP(params[2], 0.0F, 1.0F);
872*61046927SAndroid Build Coastguard Worker texObj->Sampler.Attrib.state.border_color.f[ACOMP] = CLAMP(params[3], 0.0F, 1.0F);
873*61046927SAndroid Build Coastguard Worker }
874*61046927SAndroid Build Coastguard Worker _mesa_update_is_border_color_nonzero(&texObj->Sampler);
875*61046927SAndroid Build Coastguard Worker return GL_TRUE;
876*61046927SAndroid Build Coastguard Worker
877*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_TILING_EXT:
878*61046927SAndroid Build Coastguard Worker if (ctx->Extensions.EXT_memory_object) {
879*61046927SAndroid Build Coastguard Worker texObj->TextureTiling = params[0];
880*61046927SAndroid Build Coastguard Worker return GL_TRUE;
881*61046927SAndroid Build Coastguard Worker }
882*61046927SAndroid Build Coastguard Worker goto invalid_pname;
883*61046927SAndroid Build Coastguard Worker
884*61046927SAndroid Build Coastguard Worker default:
885*61046927SAndroid Build Coastguard Worker goto invalid_pname;
886*61046927SAndroid Build Coastguard Worker }
887*61046927SAndroid Build Coastguard Worker return GL_FALSE;
888*61046927SAndroid Build Coastguard Worker
889*61046927SAndroid Build Coastguard Worker invalid_pname:
890*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM, "glTex%sParameter(pname=%s)",
891*61046927SAndroid Build Coastguard Worker suffix, _mesa_enum_to_string(pname));
892*61046927SAndroid Build Coastguard Worker return GL_FALSE;
893*61046927SAndroid Build Coastguard Worker
894*61046927SAndroid Build Coastguard Worker invalid_dsa:
895*61046927SAndroid Build Coastguard Worker if (!dsa)
896*61046927SAndroid Build Coastguard Worker goto invalid_enum;
897*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_OPERATION, "glTex%sParameter(pname=%s)",
898*61046927SAndroid Build Coastguard Worker suffix, _mesa_enum_to_string(pname));
899*61046927SAndroid Build Coastguard Worker return GL_FALSE;
900*61046927SAndroid Build Coastguard Worker invalid_enum:
901*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM, "glTex%sParameter(pname=%s)",
902*61046927SAndroid Build Coastguard Worker suffix, _mesa_enum_to_string(pname));
903*61046927SAndroid Build Coastguard Worker return GL_FALSE;
904*61046927SAndroid Build Coastguard Worker }
905*61046927SAndroid Build Coastguard Worker
906*61046927SAndroid Build Coastguard Worker static bool
texparam_invalidates_sampler_views(GLenum pname)907*61046927SAndroid Build Coastguard Worker texparam_invalidates_sampler_views(GLenum pname)
908*61046927SAndroid Build Coastguard Worker {
909*61046927SAndroid Build Coastguard Worker switch (pname) {
910*61046927SAndroid Build Coastguard Worker /*
911*61046927SAndroid Build Coastguard Worker * Changing any of these texture parameters means we must create
912*61046927SAndroid Build Coastguard Worker * new sampler views.
913*61046927SAndroid Build Coastguard Worker */
914*61046927SAndroid Build Coastguard Worker case GL_ALL_ATTRIB_BITS: /* meaning is all pnames, internal */
915*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BASE_LEVEL:
916*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAX_LEVEL:
917*61046927SAndroid Build Coastguard Worker case GL_DEPTH_TEXTURE_MODE:
918*61046927SAndroid Build Coastguard Worker case GL_DEPTH_STENCIL_TEXTURE_MODE:
919*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SRGB_DECODE_EXT:
920*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SWIZZLE_R:
921*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SWIZZLE_G:
922*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SWIZZLE_B:
923*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SWIZZLE_A:
924*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SWIZZLE_RGBA:
925*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BUFFER_SIZE:
926*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BUFFER_OFFSET:
927*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_ASTC_DECODE_PRECISION_EXT:
928*61046927SAndroid Build Coastguard Worker return true;
929*61046927SAndroid Build Coastguard Worker default:
930*61046927SAndroid Build Coastguard Worker return false;
931*61046927SAndroid Build Coastguard Worker }
932*61046927SAndroid Build Coastguard Worker }
933*61046927SAndroid Build Coastguard Worker
934*61046927SAndroid Build Coastguard Worker static void
_mesa_texture_parameter_invalidate(struct gl_context * ctx,struct gl_texture_object * texObj,GLenum pname)935*61046927SAndroid Build Coastguard Worker _mesa_texture_parameter_invalidate(struct gl_context *ctx,
936*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj,
937*61046927SAndroid Build Coastguard Worker GLenum pname)
938*61046927SAndroid Build Coastguard Worker {
939*61046927SAndroid Build Coastguard Worker if (texparam_invalidates_sampler_views(pname))
940*61046927SAndroid Build Coastguard Worker st_texture_release_all_sampler_views(st_context(ctx), texObj);
941*61046927SAndroid Build Coastguard Worker }
942*61046927SAndroid Build Coastguard Worker
943*61046927SAndroid Build Coastguard Worker void
_mesa_texture_parameterf(struct gl_context * ctx,struct gl_texture_object * texObj,GLenum pname,GLfloat param,bool dsa)944*61046927SAndroid Build Coastguard Worker _mesa_texture_parameterf(struct gl_context *ctx,
945*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj,
946*61046927SAndroid Build Coastguard Worker GLenum pname, GLfloat param, bool dsa)
947*61046927SAndroid Build Coastguard Worker {
948*61046927SAndroid Build Coastguard Worker GLboolean need_update;
949*61046927SAndroid Build Coastguard Worker
950*61046927SAndroid Build Coastguard Worker switch (pname) {
951*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MIN_FILTER:
952*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAG_FILTER:
953*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_S:
954*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_T:
955*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_R:
956*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BASE_LEVEL:
957*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAX_LEVEL:
958*61046927SAndroid Build Coastguard Worker case GL_GENERATE_MIPMAP_SGIS:
959*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COMPARE_MODE_ARB:
960*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COMPARE_FUNC_ARB:
961*61046927SAndroid Build Coastguard Worker case GL_DEPTH_TEXTURE_MODE_ARB:
962*61046927SAndroid Build Coastguard Worker case GL_DEPTH_STENCIL_TEXTURE_MODE:
963*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SRGB_DECODE_EXT:
964*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_REDUCTION_MODE_EXT:
965*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_CUBE_MAP_SEAMLESS:
966*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SWIZZLE_R_EXT:
967*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SWIZZLE_G_EXT:
968*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SWIZZLE_B_EXT:
969*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SWIZZLE_A_EXT:
970*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SPARSE_ARB:
971*61046927SAndroid Build Coastguard Worker case GL_VIRTUAL_PAGE_SIZE_INDEX_ARB:
972*61046927SAndroid Build Coastguard Worker {
973*61046927SAndroid Build Coastguard Worker GLint p[4];
974*61046927SAndroid Build Coastguard Worker p[0] = (param > 0) ?
975*61046927SAndroid Build Coastguard Worker ((param > (float)INT32_MAX) ? INT32_MAX : (GLint) (param + 0.5)) :
976*61046927SAndroid Build Coastguard Worker ((param < (float)INT32_MIN) ? INT32_MIN : (GLint) (param - 0.5));
977*61046927SAndroid Build Coastguard Worker
978*61046927SAndroid Build Coastguard Worker p[1] = p[2] = p[3] = 0;
979*61046927SAndroid Build Coastguard Worker need_update = set_tex_parameteri(ctx, texObj, pname, p, dsa);
980*61046927SAndroid Build Coastguard Worker }
981*61046927SAndroid Build Coastguard Worker break;
982*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BORDER_COLOR:
983*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SWIZZLE_RGBA:
984*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM, "glTex%sParameterf(non-scalar pname)",
985*61046927SAndroid Build Coastguard Worker dsa ? "ture" : "");
986*61046927SAndroid Build Coastguard Worker return;
987*61046927SAndroid Build Coastguard Worker default:
988*61046927SAndroid Build Coastguard Worker {
989*61046927SAndroid Build Coastguard Worker /* this will generate an error if pname is illegal */
990*61046927SAndroid Build Coastguard Worker GLfloat p[4];
991*61046927SAndroid Build Coastguard Worker p[0] = param;
992*61046927SAndroid Build Coastguard Worker p[1] = p[2] = p[3] = 0.0F;
993*61046927SAndroid Build Coastguard Worker need_update = set_tex_parameterf(ctx, texObj, pname, p, dsa);
994*61046927SAndroid Build Coastguard Worker }
995*61046927SAndroid Build Coastguard Worker }
996*61046927SAndroid Build Coastguard Worker
997*61046927SAndroid Build Coastguard Worker if (need_update) {
998*61046927SAndroid Build Coastguard Worker _mesa_texture_parameter_invalidate(ctx, texObj, pname);
999*61046927SAndroid Build Coastguard Worker }
1000*61046927SAndroid Build Coastguard Worker }
1001*61046927SAndroid Build Coastguard Worker
1002*61046927SAndroid Build Coastguard Worker
1003*61046927SAndroid Build Coastguard Worker void
_mesa_texture_parameterfv(struct gl_context * ctx,struct gl_texture_object * texObj,GLenum pname,const GLfloat * params,bool dsa)1004*61046927SAndroid Build Coastguard Worker _mesa_texture_parameterfv(struct gl_context *ctx,
1005*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj,
1006*61046927SAndroid Build Coastguard Worker GLenum pname, const GLfloat *params, bool dsa)
1007*61046927SAndroid Build Coastguard Worker {
1008*61046927SAndroid Build Coastguard Worker GLboolean need_update;
1009*61046927SAndroid Build Coastguard Worker switch (pname) {
1010*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MIN_FILTER:
1011*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAG_FILTER:
1012*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_S:
1013*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_T:
1014*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_R:
1015*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BASE_LEVEL:
1016*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAX_LEVEL:
1017*61046927SAndroid Build Coastguard Worker case GL_GENERATE_MIPMAP_SGIS:
1018*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COMPARE_MODE_ARB:
1019*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COMPARE_FUNC_ARB:
1020*61046927SAndroid Build Coastguard Worker case GL_DEPTH_TEXTURE_MODE_ARB:
1021*61046927SAndroid Build Coastguard Worker case GL_DEPTH_STENCIL_TEXTURE_MODE:
1022*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SRGB_DECODE_EXT:
1023*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_REDUCTION_MODE_EXT:
1024*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_CUBE_MAP_SEAMLESS:
1025*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SPARSE_ARB:
1026*61046927SAndroid Build Coastguard Worker case GL_VIRTUAL_PAGE_SIZE_INDEX_ARB:
1027*61046927SAndroid Build Coastguard Worker {
1028*61046927SAndroid Build Coastguard Worker /* convert float param to int */
1029*61046927SAndroid Build Coastguard Worker GLint p[4];
1030*61046927SAndroid Build Coastguard Worker p[0] = (GLint) params[0];
1031*61046927SAndroid Build Coastguard Worker p[1] = p[2] = p[3] = 0;
1032*61046927SAndroid Build Coastguard Worker need_update = set_tex_parameteri(ctx, texObj, pname, p, dsa);
1033*61046927SAndroid Build Coastguard Worker }
1034*61046927SAndroid Build Coastguard Worker break;
1035*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_CROP_RECT_OES:
1036*61046927SAndroid Build Coastguard Worker {
1037*61046927SAndroid Build Coastguard Worker /* convert float params to int */
1038*61046927SAndroid Build Coastguard Worker GLint iparams[4];
1039*61046927SAndroid Build Coastguard Worker iparams[0] = (GLint) params[0];
1040*61046927SAndroid Build Coastguard Worker iparams[1] = (GLint) params[1];
1041*61046927SAndroid Build Coastguard Worker iparams[2] = (GLint) params[2];
1042*61046927SAndroid Build Coastguard Worker iparams[3] = (GLint) params[3];
1043*61046927SAndroid Build Coastguard Worker need_update = set_tex_parameteri(ctx, texObj, pname, iparams, dsa);
1044*61046927SAndroid Build Coastguard Worker }
1045*61046927SAndroid Build Coastguard Worker break;
1046*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SWIZZLE_R_EXT:
1047*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SWIZZLE_G_EXT:
1048*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SWIZZLE_B_EXT:
1049*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SWIZZLE_A_EXT:
1050*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SWIZZLE_RGBA_EXT:
1051*61046927SAndroid Build Coastguard Worker {
1052*61046927SAndroid Build Coastguard Worker GLint p[4] = {0, 0, 0, 0};
1053*61046927SAndroid Build Coastguard Worker p[0] = (GLint) params[0];
1054*61046927SAndroid Build Coastguard Worker if (pname == GL_TEXTURE_SWIZZLE_RGBA_EXT) {
1055*61046927SAndroid Build Coastguard Worker p[1] = (GLint) params[1];
1056*61046927SAndroid Build Coastguard Worker p[2] = (GLint) params[2];
1057*61046927SAndroid Build Coastguard Worker p[3] = (GLint) params[3];
1058*61046927SAndroid Build Coastguard Worker }
1059*61046927SAndroid Build Coastguard Worker need_update = set_tex_parameteri(ctx, texObj, pname, p, dsa);
1060*61046927SAndroid Build Coastguard Worker }
1061*61046927SAndroid Build Coastguard Worker break;
1062*61046927SAndroid Build Coastguard Worker default:
1063*61046927SAndroid Build Coastguard Worker /* this will generate an error if pname is illegal */
1064*61046927SAndroid Build Coastguard Worker need_update = set_tex_parameterf(ctx, texObj, pname, params, dsa);
1065*61046927SAndroid Build Coastguard Worker }
1066*61046927SAndroid Build Coastguard Worker
1067*61046927SAndroid Build Coastguard Worker if (need_update) {
1068*61046927SAndroid Build Coastguard Worker _mesa_texture_parameter_invalidate(ctx, texObj, pname);
1069*61046927SAndroid Build Coastguard Worker }
1070*61046927SAndroid Build Coastguard Worker }
1071*61046927SAndroid Build Coastguard Worker
1072*61046927SAndroid Build Coastguard Worker
1073*61046927SAndroid Build Coastguard Worker void
_mesa_texture_parameteri(struct gl_context * ctx,struct gl_texture_object * texObj,GLenum pname,GLint param,bool dsa)1074*61046927SAndroid Build Coastguard Worker _mesa_texture_parameteri(struct gl_context *ctx,
1075*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj,
1076*61046927SAndroid Build Coastguard Worker GLenum pname, GLint param, bool dsa)
1077*61046927SAndroid Build Coastguard Worker {
1078*61046927SAndroid Build Coastguard Worker GLboolean need_update;
1079*61046927SAndroid Build Coastguard Worker switch (pname) {
1080*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MIN_LOD:
1081*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAX_LOD:
1082*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_PRIORITY:
1083*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAX_ANISOTROPY_EXT:
1084*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_LOD_BIAS:
1085*61046927SAndroid Build Coastguard Worker {
1086*61046927SAndroid Build Coastguard Worker GLfloat fparam[4];
1087*61046927SAndroid Build Coastguard Worker fparam[0] = (GLfloat) param;
1088*61046927SAndroid Build Coastguard Worker fparam[1] = fparam[2] = fparam[3] = 0.0F;
1089*61046927SAndroid Build Coastguard Worker /* convert int param to float */
1090*61046927SAndroid Build Coastguard Worker need_update = set_tex_parameterf(ctx, texObj, pname, fparam, dsa);
1091*61046927SAndroid Build Coastguard Worker }
1092*61046927SAndroid Build Coastguard Worker break;
1093*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BORDER_COLOR:
1094*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SWIZZLE_RGBA:
1095*61046927SAndroid Build Coastguard Worker {
1096*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM,
1097*61046927SAndroid Build Coastguard Worker "glTex%sParameteri(non-scalar pname)",
1098*61046927SAndroid Build Coastguard Worker dsa ? "ture" : "");
1099*61046927SAndroid Build Coastguard Worker return;
1100*61046927SAndroid Build Coastguard Worker }
1101*61046927SAndroid Build Coastguard Worker default:
1102*61046927SAndroid Build Coastguard Worker /* this will generate an error if pname is illegal */
1103*61046927SAndroid Build Coastguard Worker {
1104*61046927SAndroid Build Coastguard Worker GLint iparam[4];
1105*61046927SAndroid Build Coastguard Worker iparam[0] = param;
1106*61046927SAndroid Build Coastguard Worker iparam[1] = iparam[2] = iparam[3] = 0;
1107*61046927SAndroid Build Coastguard Worker need_update = set_tex_parameteri(ctx, texObj, pname, iparam, dsa);
1108*61046927SAndroid Build Coastguard Worker }
1109*61046927SAndroid Build Coastguard Worker }
1110*61046927SAndroid Build Coastguard Worker
1111*61046927SAndroid Build Coastguard Worker if (need_update) {
1112*61046927SAndroid Build Coastguard Worker _mesa_texture_parameter_invalidate(ctx, texObj, pname);
1113*61046927SAndroid Build Coastguard Worker }
1114*61046927SAndroid Build Coastguard Worker }
1115*61046927SAndroid Build Coastguard Worker
1116*61046927SAndroid Build Coastguard Worker
1117*61046927SAndroid Build Coastguard Worker void
_mesa_texture_parameteriv(struct gl_context * ctx,struct gl_texture_object * texObj,GLenum pname,const GLint * params,bool dsa)1118*61046927SAndroid Build Coastguard Worker _mesa_texture_parameteriv(struct gl_context *ctx,
1119*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj,
1120*61046927SAndroid Build Coastguard Worker GLenum pname, const GLint *params, bool dsa)
1121*61046927SAndroid Build Coastguard Worker {
1122*61046927SAndroid Build Coastguard Worker GLboolean need_update;
1123*61046927SAndroid Build Coastguard Worker
1124*61046927SAndroid Build Coastguard Worker switch (pname) {
1125*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BORDER_COLOR:
1126*61046927SAndroid Build Coastguard Worker {
1127*61046927SAndroid Build Coastguard Worker /* convert int params to float */
1128*61046927SAndroid Build Coastguard Worker GLfloat fparams[4];
1129*61046927SAndroid Build Coastguard Worker fparams[0] = INT_TO_FLOAT(params[0]);
1130*61046927SAndroid Build Coastguard Worker fparams[1] = INT_TO_FLOAT(params[1]);
1131*61046927SAndroid Build Coastguard Worker fparams[2] = INT_TO_FLOAT(params[2]);
1132*61046927SAndroid Build Coastguard Worker fparams[3] = INT_TO_FLOAT(params[3]);
1133*61046927SAndroid Build Coastguard Worker need_update = set_tex_parameterf(ctx, texObj, pname, fparams, dsa);
1134*61046927SAndroid Build Coastguard Worker }
1135*61046927SAndroid Build Coastguard Worker break;
1136*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MIN_LOD:
1137*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAX_LOD:
1138*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_PRIORITY:
1139*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAX_ANISOTROPY_EXT:
1140*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_LOD_BIAS:
1141*61046927SAndroid Build Coastguard Worker {
1142*61046927SAndroid Build Coastguard Worker /* convert int param to float */
1143*61046927SAndroid Build Coastguard Worker GLfloat fparams[4];
1144*61046927SAndroid Build Coastguard Worker fparams[0] = (GLfloat) params[0];
1145*61046927SAndroid Build Coastguard Worker fparams[1] = fparams[2] = fparams[3] = 0.0F;
1146*61046927SAndroid Build Coastguard Worker need_update = set_tex_parameterf(ctx, texObj, pname, fparams, dsa);
1147*61046927SAndroid Build Coastguard Worker }
1148*61046927SAndroid Build Coastguard Worker break;
1149*61046927SAndroid Build Coastguard Worker default:
1150*61046927SAndroid Build Coastguard Worker /* this will generate an error if pname is illegal */
1151*61046927SAndroid Build Coastguard Worker need_update = set_tex_parameteri(ctx, texObj, pname, params, dsa);
1152*61046927SAndroid Build Coastguard Worker }
1153*61046927SAndroid Build Coastguard Worker
1154*61046927SAndroid Build Coastguard Worker if (need_update) {
1155*61046927SAndroid Build Coastguard Worker _mesa_texture_parameter_invalidate(ctx, texObj, pname);
1156*61046927SAndroid Build Coastguard Worker }
1157*61046927SAndroid Build Coastguard Worker }
1158*61046927SAndroid Build Coastguard Worker
1159*61046927SAndroid Build Coastguard Worker void
_mesa_texture_parameterIiv(struct gl_context * ctx,struct gl_texture_object * texObj,GLenum pname,const GLint * params,bool dsa)1160*61046927SAndroid Build Coastguard Worker _mesa_texture_parameterIiv(struct gl_context *ctx,
1161*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj,
1162*61046927SAndroid Build Coastguard Worker GLenum pname, const GLint *params, bool dsa)
1163*61046927SAndroid Build Coastguard Worker {
1164*61046927SAndroid Build Coastguard Worker switch (pname) {
1165*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BORDER_COLOR:
1166*61046927SAndroid Build Coastguard Worker if (texObj->HandleAllocated) {
1167*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_OPERATION,
1168*61046927SAndroid Build Coastguard Worker "glTextureParameterIiv(immutable texture)");
1169*61046927SAndroid Build Coastguard Worker return;
1170*61046927SAndroid Build Coastguard Worker }
1171*61046927SAndroid Build Coastguard Worker
1172*61046927SAndroid Build Coastguard Worker if (!_mesa_target_allows_setting_sampler_parameters(texObj->Target)) {
1173*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, dsa ? GL_INVALID_OPERATION : GL_INVALID_ENUM, "glTextureParameterIiv(texture)");
1174*61046927SAndroid Build Coastguard Worker return;
1175*61046927SAndroid Build Coastguard Worker }
1176*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_TEXTURE_OBJECT, GL_TEXTURE_BIT);
1177*61046927SAndroid Build Coastguard Worker /* set the integer-valued border color */
1178*61046927SAndroid Build Coastguard Worker COPY_4V(texObj->Sampler.Attrib.state.border_color.i, params);
1179*61046927SAndroid Build Coastguard Worker _mesa_update_is_border_color_nonzero(&texObj->Sampler);
1180*61046927SAndroid Build Coastguard Worker break;
1181*61046927SAndroid Build Coastguard Worker default:
1182*61046927SAndroid Build Coastguard Worker _mesa_texture_parameteriv(ctx, texObj, pname, params, dsa);
1183*61046927SAndroid Build Coastguard Worker break;
1184*61046927SAndroid Build Coastguard Worker }
1185*61046927SAndroid Build Coastguard Worker /* XXX no driver hook for TexParameterIiv() yet */
1186*61046927SAndroid Build Coastguard Worker }
1187*61046927SAndroid Build Coastguard Worker
1188*61046927SAndroid Build Coastguard Worker void
_mesa_texture_parameterIuiv(struct gl_context * ctx,struct gl_texture_object * texObj,GLenum pname,const GLuint * params,bool dsa)1189*61046927SAndroid Build Coastguard Worker _mesa_texture_parameterIuiv(struct gl_context *ctx,
1190*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj,
1191*61046927SAndroid Build Coastguard Worker GLenum pname, const GLuint *params, bool dsa)
1192*61046927SAndroid Build Coastguard Worker {
1193*61046927SAndroid Build Coastguard Worker switch (pname) {
1194*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BORDER_COLOR:
1195*61046927SAndroid Build Coastguard Worker if (texObj->HandleAllocated) {
1196*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_OPERATION,
1197*61046927SAndroid Build Coastguard Worker "glTextureParameterIuiv(immutable texture)");
1198*61046927SAndroid Build Coastguard Worker return;
1199*61046927SAndroid Build Coastguard Worker }
1200*61046927SAndroid Build Coastguard Worker
1201*61046927SAndroid Build Coastguard Worker if (!_mesa_target_allows_setting_sampler_parameters(texObj->Target)) {
1202*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, dsa ? GL_INVALID_OPERATION : GL_INVALID_ENUM, "glTextureParameterIuiv(texture)");
1203*61046927SAndroid Build Coastguard Worker return;
1204*61046927SAndroid Build Coastguard Worker }
1205*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_TEXTURE_OBJECT, GL_TEXTURE_BIT);
1206*61046927SAndroid Build Coastguard Worker /* set the unsigned integer-valued border color */
1207*61046927SAndroid Build Coastguard Worker COPY_4V(texObj->Sampler.Attrib.state.border_color.ui, params);
1208*61046927SAndroid Build Coastguard Worker _mesa_update_is_border_color_nonzero(&texObj->Sampler);
1209*61046927SAndroid Build Coastguard Worker break;
1210*61046927SAndroid Build Coastguard Worker default:
1211*61046927SAndroid Build Coastguard Worker _mesa_texture_parameteriv(ctx, texObj, pname, (const GLint *) params,
1212*61046927SAndroid Build Coastguard Worker dsa);
1213*61046927SAndroid Build Coastguard Worker break;
1214*61046927SAndroid Build Coastguard Worker }
1215*61046927SAndroid Build Coastguard Worker /* XXX no driver hook for TexParameterIuiv() yet */
1216*61046927SAndroid Build Coastguard Worker }
1217*61046927SAndroid Build Coastguard Worker
1218*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_TexParameterf(GLenum target,GLenum pname,GLfloat param)1219*61046927SAndroid Build Coastguard Worker _mesa_TexParameterf(GLenum target, GLenum pname, GLfloat param)
1220*61046927SAndroid Build Coastguard Worker {
1221*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
1222*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
1223*61046927SAndroid Build Coastguard Worker
1224*61046927SAndroid Build Coastguard Worker texObj = _mesa_get_texobj_by_target_and_texunit(ctx, target,
1225*61046927SAndroid Build Coastguard Worker ctx->Texture.CurrentUnit,
1226*61046927SAndroid Build Coastguard Worker false,
1227*61046927SAndroid Build Coastguard Worker "glTexParameterf");
1228*61046927SAndroid Build Coastguard Worker if (!texObj)
1229*61046927SAndroid Build Coastguard Worker return;
1230*61046927SAndroid Build Coastguard Worker
1231*61046927SAndroid Build Coastguard Worker _mesa_texture_parameterf(ctx, texObj, pname, param, false);
1232*61046927SAndroid Build Coastguard Worker }
1233*61046927SAndroid Build Coastguard Worker
1234*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_TexParameterfv(GLenum target,GLenum pname,const GLfloat * params)1235*61046927SAndroid Build Coastguard Worker _mesa_TexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
1236*61046927SAndroid Build Coastguard Worker {
1237*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
1238*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
1239*61046927SAndroid Build Coastguard Worker
1240*61046927SAndroid Build Coastguard Worker texObj = _mesa_get_texobj_by_target_and_texunit(ctx, target,
1241*61046927SAndroid Build Coastguard Worker ctx->Texture.CurrentUnit,
1242*61046927SAndroid Build Coastguard Worker false,
1243*61046927SAndroid Build Coastguard Worker "glTexParameterfv");
1244*61046927SAndroid Build Coastguard Worker if (!texObj)
1245*61046927SAndroid Build Coastguard Worker return;
1246*61046927SAndroid Build Coastguard Worker
1247*61046927SAndroid Build Coastguard Worker _mesa_texture_parameterfv(ctx, texObj, pname, params, false);
1248*61046927SAndroid Build Coastguard Worker }
1249*61046927SAndroid Build Coastguard Worker
1250*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_TexParameteri(GLenum target,GLenum pname,GLint param)1251*61046927SAndroid Build Coastguard Worker _mesa_TexParameteri(GLenum target, GLenum pname, GLint param)
1252*61046927SAndroid Build Coastguard Worker {
1253*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
1254*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
1255*61046927SAndroid Build Coastguard Worker
1256*61046927SAndroid Build Coastguard Worker texObj = _mesa_get_texobj_by_target_and_texunit(ctx, target,
1257*61046927SAndroid Build Coastguard Worker ctx->Texture.CurrentUnit,
1258*61046927SAndroid Build Coastguard Worker false,
1259*61046927SAndroid Build Coastguard Worker "glTexParameteri");
1260*61046927SAndroid Build Coastguard Worker if (!texObj)
1261*61046927SAndroid Build Coastguard Worker return;
1262*61046927SAndroid Build Coastguard Worker
1263*61046927SAndroid Build Coastguard Worker _mesa_texture_parameteri(ctx, texObj, pname, param, false);
1264*61046927SAndroid Build Coastguard Worker }
1265*61046927SAndroid Build Coastguard Worker
1266*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_TexParameteriv(GLenum target,GLenum pname,const GLint * params)1267*61046927SAndroid Build Coastguard Worker _mesa_TexParameteriv(GLenum target, GLenum pname, const GLint *params)
1268*61046927SAndroid Build Coastguard Worker {
1269*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
1270*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
1271*61046927SAndroid Build Coastguard Worker
1272*61046927SAndroid Build Coastguard Worker texObj = _mesa_get_texobj_by_target_and_texunit(ctx, target,
1273*61046927SAndroid Build Coastguard Worker ctx->Texture.CurrentUnit,
1274*61046927SAndroid Build Coastguard Worker false,
1275*61046927SAndroid Build Coastguard Worker "glTexParameteriv");
1276*61046927SAndroid Build Coastguard Worker if (!texObj)
1277*61046927SAndroid Build Coastguard Worker return;
1278*61046927SAndroid Build Coastguard Worker
1279*61046927SAndroid Build Coastguard Worker _mesa_texture_parameteriv(ctx, texObj, pname, params, false);
1280*61046927SAndroid Build Coastguard Worker }
1281*61046927SAndroid Build Coastguard Worker
1282*61046927SAndroid Build Coastguard Worker /**
1283*61046927SAndroid Build Coastguard Worker * Set tex parameter to integer value(s). Primarily intended to set
1284*61046927SAndroid Build Coastguard Worker * integer-valued texture border color (for integer-valued textures).
1285*61046927SAndroid Build Coastguard Worker * New in GL 3.0.
1286*61046927SAndroid Build Coastguard Worker */
1287*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_TexParameterIiv(GLenum target,GLenum pname,const GLint * params)1288*61046927SAndroid Build Coastguard Worker _mesa_TexParameterIiv(GLenum target, GLenum pname, const GLint *params)
1289*61046927SAndroid Build Coastguard Worker {
1290*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
1291*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
1292*61046927SAndroid Build Coastguard Worker
1293*61046927SAndroid Build Coastguard Worker texObj = _mesa_get_texobj_by_target_and_texunit(ctx, target,
1294*61046927SAndroid Build Coastguard Worker ctx->Texture.CurrentUnit,
1295*61046927SAndroid Build Coastguard Worker false,
1296*61046927SAndroid Build Coastguard Worker "glTexParameterIiv");
1297*61046927SAndroid Build Coastguard Worker if (!texObj)
1298*61046927SAndroid Build Coastguard Worker return;
1299*61046927SAndroid Build Coastguard Worker
1300*61046927SAndroid Build Coastguard Worker _mesa_texture_parameterIiv(ctx, texObj, pname, params, false);
1301*61046927SAndroid Build Coastguard Worker }
1302*61046927SAndroid Build Coastguard Worker
1303*61046927SAndroid Build Coastguard Worker /**
1304*61046927SAndroid Build Coastguard Worker * Set tex parameter to unsigned integer value(s). Primarily intended to set
1305*61046927SAndroid Build Coastguard Worker * uint-valued texture border color (for integer-valued textures).
1306*61046927SAndroid Build Coastguard Worker * New in GL 3.0
1307*61046927SAndroid Build Coastguard Worker */
1308*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_TexParameterIuiv(GLenum target,GLenum pname,const GLuint * params)1309*61046927SAndroid Build Coastguard Worker _mesa_TexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
1310*61046927SAndroid Build Coastguard Worker {
1311*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
1312*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
1313*61046927SAndroid Build Coastguard Worker
1314*61046927SAndroid Build Coastguard Worker texObj = _mesa_get_texobj_by_target_and_texunit(ctx, target,
1315*61046927SAndroid Build Coastguard Worker ctx->Texture.CurrentUnit,
1316*61046927SAndroid Build Coastguard Worker false,
1317*61046927SAndroid Build Coastguard Worker "glTexParameterIuiv");
1318*61046927SAndroid Build Coastguard Worker if (!texObj)
1319*61046927SAndroid Build Coastguard Worker return;
1320*61046927SAndroid Build Coastguard Worker
1321*61046927SAndroid Build Coastguard Worker _mesa_texture_parameterIuiv(ctx, texObj, pname, params, false);
1322*61046927SAndroid Build Coastguard Worker }
1323*61046927SAndroid Build Coastguard Worker
1324*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_TextureParameterfvEXT(GLuint texture,GLenum target,GLenum pname,const GLfloat * params)1325*61046927SAndroid Build Coastguard Worker _mesa_TextureParameterfvEXT(GLuint texture, GLenum target, GLenum pname, const GLfloat *params)
1326*61046927SAndroid Build Coastguard Worker {
1327*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
1328*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
1329*61046927SAndroid Build Coastguard Worker
1330*61046927SAndroid Build Coastguard Worker texObj = _mesa_lookup_or_create_texture(ctx, target, texture, false, true,
1331*61046927SAndroid Build Coastguard Worker "glTextureParameterfvEXT");
1332*61046927SAndroid Build Coastguard Worker if (!texObj)
1333*61046927SAndroid Build Coastguard Worker return;
1334*61046927SAndroid Build Coastguard Worker
1335*61046927SAndroid Build Coastguard Worker if (!is_texparameteri_target_valid(texObj->Target)) {
1336*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_OPERATION, "glTextureParameterfvEXT");
1337*61046927SAndroid Build Coastguard Worker return;
1338*61046927SAndroid Build Coastguard Worker }
1339*61046927SAndroid Build Coastguard Worker
1340*61046927SAndroid Build Coastguard Worker _mesa_texture_parameterfv(ctx, texObj, pname, params, true);
1341*61046927SAndroid Build Coastguard Worker }
1342*61046927SAndroid Build Coastguard Worker
1343*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_TextureParameterfv(GLuint texture,GLenum pname,const GLfloat * params)1344*61046927SAndroid Build Coastguard Worker _mesa_TextureParameterfv(GLuint texture, GLenum pname, const GLfloat *params)
1345*61046927SAndroid Build Coastguard Worker {
1346*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
1347*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
1348*61046927SAndroid Build Coastguard Worker
1349*61046927SAndroid Build Coastguard Worker texObj = get_texobj_by_name(ctx, texture, "glTextureParameterfv");
1350*61046927SAndroid Build Coastguard Worker if (!texObj)
1351*61046927SAndroid Build Coastguard Worker return;
1352*61046927SAndroid Build Coastguard Worker
1353*61046927SAndroid Build Coastguard Worker _mesa_texture_parameterfv(ctx, texObj, pname, params, true);
1354*61046927SAndroid Build Coastguard Worker }
1355*61046927SAndroid Build Coastguard Worker
1356*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_MultiTexParameterfvEXT(GLenum texunit,GLenum target,GLenum pname,const GLfloat * params)1357*61046927SAndroid Build Coastguard Worker _mesa_MultiTexParameterfvEXT(GLenum texunit, GLenum target, GLenum pname, const GLfloat *params)
1358*61046927SAndroid Build Coastguard Worker {
1359*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
1360*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
1361*61046927SAndroid Build Coastguard Worker
1362*61046927SAndroid Build Coastguard Worker texObj = _mesa_get_texobj_by_target_and_texunit(ctx, target,
1363*61046927SAndroid Build Coastguard Worker texunit - GL_TEXTURE0,
1364*61046927SAndroid Build Coastguard Worker false,
1365*61046927SAndroid Build Coastguard Worker "glMultiTexParameterfvEXT");
1366*61046927SAndroid Build Coastguard Worker if (!texObj)
1367*61046927SAndroid Build Coastguard Worker return;
1368*61046927SAndroid Build Coastguard Worker
1369*61046927SAndroid Build Coastguard Worker if (!is_texparameteri_target_valid(texObj->Target)) {
1370*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_OPERATION, "glMultiTexParameterifvEXT(target)");
1371*61046927SAndroid Build Coastguard Worker return;
1372*61046927SAndroid Build Coastguard Worker }
1373*61046927SAndroid Build Coastguard Worker
1374*61046927SAndroid Build Coastguard Worker _mesa_texture_parameterfv(ctx, texObj, pname, params, true);
1375*61046927SAndroid Build Coastguard Worker }
1376*61046927SAndroid Build Coastguard Worker
1377*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_TextureParameterfEXT(GLuint texture,GLenum target,GLenum pname,GLfloat param)1378*61046927SAndroid Build Coastguard Worker _mesa_TextureParameterfEXT(GLuint texture, GLenum target, GLenum pname, GLfloat param)
1379*61046927SAndroid Build Coastguard Worker {
1380*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
1381*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
1382*61046927SAndroid Build Coastguard Worker
1383*61046927SAndroid Build Coastguard Worker texObj = _mesa_lookup_or_create_texture(ctx, target, texture, false, true,
1384*61046927SAndroid Build Coastguard Worker "glTextureParameterfEXT");
1385*61046927SAndroid Build Coastguard Worker if (!texObj)
1386*61046927SAndroid Build Coastguard Worker return;
1387*61046927SAndroid Build Coastguard Worker
1388*61046927SAndroid Build Coastguard Worker if (!is_texparameteri_target_valid(texObj->Target)) {
1389*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_OPERATION, "glTextureParameterfEXT");
1390*61046927SAndroid Build Coastguard Worker return;
1391*61046927SAndroid Build Coastguard Worker }
1392*61046927SAndroid Build Coastguard Worker
1393*61046927SAndroid Build Coastguard Worker _mesa_texture_parameterf(ctx, texObj, pname, param, true);
1394*61046927SAndroid Build Coastguard Worker }
1395*61046927SAndroid Build Coastguard Worker
1396*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_MultiTexParameterfEXT(GLenum texunit,GLenum target,GLenum pname,GLfloat param)1397*61046927SAndroid Build Coastguard Worker _mesa_MultiTexParameterfEXT(GLenum texunit, GLenum target, GLenum pname,
1398*61046927SAndroid Build Coastguard Worker GLfloat param)
1399*61046927SAndroid Build Coastguard Worker {
1400*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
1401*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
1402*61046927SAndroid Build Coastguard Worker
1403*61046927SAndroid Build Coastguard Worker texObj = _mesa_get_texobj_by_target_and_texunit(ctx, target,
1404*61046927SAndroid Build Coastguard Worker texunit - GL_TEXTURE0,
1405*61046927SAndroid Build Coastguard Worker false,
1406*61046927SAndroid Build Coastguard Worker "glMultiTexParameterfEXT");
1407*61046927SAndroid Build Coastguard Worker if (!texObj)
1408*61046927SAndroid Build Coastguard Worker return;
1409*61046927SAndroid Build Coastguard Worker
1410*61046927SAndroid Build Coastguard Worker if (!is_texparameteri_target_valid(texObj->Target)) {
1411*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_OPERATION, "glMultiTexParameterfEXT");
1412*61046927SAndroid Build Coastguard Worker return;
1413*61046927SAndroid Build Coastguard Worker }
1414*61046927SAndroid Build Coastguard Worker
1415*61046927SAndroid Build Coastguard Worker _mesa_texture_parameterf(ctx, texObj, pname, param, true);
1416*61046927SAndroid Build Coastguard Worker }
1417*61046927SAndroid Build Coastguard Worker
1418*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_TextureParameterf(GLuint texture,GLenum pname,GLfloat param)1419*61046927SAndroid Build Coastguard Worker _mesa_TextureParameterf(GLuint texture, GLenum pname, GLfloat param)
1420*61046927SAndroid Build Coastguard Worker {
1421*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
1422*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
1423*61046927SAndroid Build Coastguard Worker
1424*61046927SAndroid Build Coastguard Worker texObj = get_texobj_by_name(ctx, texture, "glTextureParameterf");
1425*61046927SAndroid Build Coastguard Worker if (!texObj)
1426*61046927SAndroid Build Coastguard Worker return;
1427*61046927SAndroid Build Coastguard Worker
1428*61046927SAndroid Build Coastguard Worker _mesa_texture_parameterf(ctx, texObj, pname, param, true);
1429*61046927SAndroid Build Coastguard Worker }
1430*61046927SAndroid Build Coastguard Worker
1431*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_TextureParameteriEXT(GLuint texture,GLenum target,GLenum pname,GLint param)1432*61046927SAndroid Build Coastguard Worker _mesa_TextureParameteriEXT(GLuint texture, GLenum target, GLenum pname, GLint param)
1433*61046927SAndroid Build Coastguard Worker {
1434*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
1435*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
1436*61046927SAndroid Build Coastguard Worker
1437*61046927SAndroid Build Coastguard Worker texObj = _mesa_lookup_or_create_texture(ctx, target, texture, false, true,
1438*61046927SAndroid Build Coastguard Worker "glTextureParameteriEXT");
1439*61046927SAndroid Build Coastguard Worker if (!texObj)
1440*61046927SAndroid Build Coastguard Worker return;
1441*61046927SAndroid Build Coastguard Worker
1442*61046927SAndroid Build Coastguard Worker if (!is_texparameteri_target_valid(texObj->Target)) {
1443*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_OPERATION, "glTextureParameteriEXT(target)");
1444*61046927SAndroid Build Coastguard Worker return;
1445*61046927SAndroid Build Coastguard Worker }
1446*61046927SAndroid Build Coastguard Worker
1447*61046927SAndroid Build Coastguard Worker _mesa_texture_parameteri(ctx, texObj, pname, param, true);
1448*61046927SAndroid Build Coastguard Worker }
1449*61046927SAndroid Build Coastguard Worker
1450*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_MultiTexParameteriEXT(GLenum texunit,GLenum target,GLenum pname,GLint param)1451*61046927SAndroid Build Coastguard Worker _mesa_MultiTexParameteriEXT(GLenum texunit, GLenum target, GLenum pname,
1452*61046927SAndroid Build Coastguard Worker GLint param)
1453*61046927SAndroid Build Coastguard Worker {
1454*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
1455*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
1456*61046927SAndroid Build Coastguard Worker
1457*61046927SAndroid Build Coastguard Worker texObj = _mesa_get_texobj_by_target_and_texunit(ctx, target,
1458*61046927SAndroid Build Coastguard Worker texunit - GL_TEXTURE0,
1459*61046927SAndroid Build Coastguard Worker false,
1460*61046927SAndroid Build Coastguard Worker "glMultiTexParameteriEXT");
1461*61046927SAndroid Build Coastguard Worker if (!texObj)
1462*61046927SAndroid Build Coastguard Worker return;
1463*61046927SAndroid Build Coastguard Worker
1464*61046927SAndroid Build Coastguard Worker if (!is_texparameteri_target_valid(texObj->Target)) {
1465*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_OPERATION, "glMultiTexParameteriEXT(target)");
1466*61046927SAndroid Build Coastguard Worker return;
1467*61046927SAndroid Build Coastguard Worker }
1468*61046927SAndroid Build Coastguard Worker
1469*61046927SAndroid Build Coastguard Worker _mesa_texture_parameteri(ctx, texObj, pname, param, true);
1470*61046927SAndroid Build Coastguard Worker }
1471*61046927SAndroid Build Coastguard Worker
1472*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_TextureParameteri(GLuint texture,GLenum pname,GLint param)1473*61046927SAndroid Build Coastguard Worker _mesa_TextureParameteri(GLuint texture, GLenum pname, GLint param)
1474*61046927SAndroid Build Coastguard Worker {
1475*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
1476*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
1477*61046927SAndroid Build Coastguard Worker
1478*61046927SAndroid Build Coastguard Worker texObj = get_texobj_by_name(ctx, texture, "glTextureParameteri");
1479*61046927SAndroid Build Coastguard Worker if (!texObj)
1480*61046927SAndroid Build Coastguard Worker return;
1481*61046927SAndroid Build Coastguard Worker
1482*61046927SAndroid Build Coastguard Worker _mesa_texture_parameteri(ctx, texObj, pname, param, true);
1483*61046927SAndroid Build Coastguard Worker }
1484*61046927SAndroid Build Coastguard Worker
1485*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_TextureParameterivEXT(GLuint texture,GLenum target,GLenum pname,const GLint * params)1486*61046927SAndroid Build Coastguard Worker _mesa_TextureParameterivEXT(GLuint texture, GLenum target, GLenum pname,
1487*61046927SAndroid Build Coastguard Worker const GLint *params)
1488*61046927SAndroid Build Coastguard Worker {
1489*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
1490*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
1491*61046927SAndroid Build Coastguard Worker
1492*61046927SAndroid Build Coastguard Worker texObj = _mesa_lookup_or_create_texture(ctx, target, texture, false, true,
1493*61046927SAndroid Build Coastguard Worker "glTextureParameterivEXT");
1494*61046927SAndroid Build Coastguard Worker if (!texObj)
1495*61046927SAndroid Build Coastguard Worker return;
1496*61046927SAndroid Build Coastguard Worker
1497*61046927SAndroid Build Coastguard Worker if (!is_texparameteri_target_valid(texObj->Target)) {
1498*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_OPERATION, "glTextureParameterivEXT(target)");
1499*61046927SAndroid Build Coastguard Worker return;
1500*61046927SAndroid Build Coastguard Worker }
1501*61046927SAndroid Build Coastguard Worker
1502*61046927SAndroid Build Coastguard Worker _mesa_texture_parameteriv(ctx, texObj, pname, params, true);
1503*61046927SAndroid Build Coastguard Worker }
1504*61046927SAndroid Build Coastguard Worker
1505*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_MultiTexParameterivEXT(GLenum texunit,GLenum target,GLenum pname,const GLint * params)1506*61046927SAndroid Build Coastguard Worker _mesa_MultiTexParameterivEXT(GLenum texunit, GLenum target, GLenum pname,
1507*61046927SAndroid Build Coastguard Worker const GLint *params)
1508*61046927SAndroid Build Coastguard Worker {
1509*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
1510*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
1511*61046927SAndroid Build Coastguard Worker
1512*61046927SAndroid Build Coastguard Worker texObj = _mesa_get_texobj_by_target_and_texunit(ctx, target,
1513*61046927SAndroid Build Coastguard Worker texunit - GL_TEXTURE0,
1514*61046927SAndroid Build Coastguard Worker false,
1515*61046927SAndroid Build Coastguard Worker "glMultiTexParameterivEXT");
1516*61046927SAndroid Build Coastguard Worker if (!texObj)
1517*61046927SAndroid Build Coastguard Worker return;
1518*61046927SAndroid Build Coastguard Worker
1519*61046927SAndroid Build Coastguard Worker if (!is_texparameteri_target_valid(texObj->Target)) {
1520*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_OPERATION, "glMultiTexParameterivEXT(target)");
1521*61046927SAndroid Build Coastguard Worker return;
1522*61046927SAndroid Build Coastguard Worker }
1523*61046927SAndroid Build Coastguard Worker
1524*61046927SAndroid Build Coastguard Worker _mesa_texture_parameteriv(ctx, texObj, pname, params, true);
1525*61046927SAndroid Build Coastguard Worker }
1526*61046927SAndroid Build Coastguard Worker
1527*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_TextureParameteriv(GLuint texture,GLenum pname,const GLint * params)1528*61046927SAndroid Build Coastguard Worker _mesa_TextureParameteriv(GLuint texture, GLenum pname,
1529*61046927SAndroid Build Coastguard Worker const GLint *params)
1530*61046927SAndroid Build Coastguard Worker {
1531*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
1532*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
1533*61046927SAndroid Build Coastguard Worker
1534*61046927SAndroid Build Coastguard Worker texObj = get_texobj_by_name(ctx, texture, "glTextureParameteriv");
1535*61046927SAndroid Build Coastguard Worker if (!texObj)
1536*61046927SAndroid Build Coastguard Worker return;
1537*61046927SAndroid Build Coastguard Worker
1538*61046927SAndroid Build Coastguard Worker _mesa_texture_parameteriv(ctx, texObj, pname, params, true);
1539*61046927SAndroid Build Coastguard Worker }
1540*61046927SAndroid Build Coastguard Worker
1541*61046927SAndroid Build Coastguard Worker
1542*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_TextureParameterIiv(GLuint texture,GLenum pname,const GLint * params)1543*61046927SAndroid Build Coastguard Worker _mesa_TextureParameterIiv(GLuint texture, GLenum pname, const GLint *params)
1544*61046927SAndroid Build Coastguard Worker {
1545*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
1546*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
1547*61046927SAndroid Build Coastguard Worker
1548*61046927SAndroid Build Coastguard Worker texObj = get_texobj_by_name(ctx, texture, "glTextureParameterIiv");
1549*61046927SAndroid Build Coastguard Worker if (!texObj)
1550*61046927SAndroid Build Coastguard Worker return;
1551*61046927SAndroid Build Coastguard Worker
1552*61046927SAndroid Build Coastguard Worker _mesa_texture_parameterIiv(ctx, texObj, pname, params, true);
1553*61046927SAndroid Build Coastguard Worker }
1554*61046927SAndroid Build Coastguard Worker
1555*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_TextureParameterIivEXT(GLuint texture,GLenum target,GLenum pname,const GLint * params)1556*61046927SAndroid Build Coastguard Worker _mesa_TextureParameterIivEXT(GLuint texture, GLenum target, GLenum pname,
1557*61046927SAndroid Build Coastguard Worker const GLint *params)
1558*61046927SAndroid Build Coastguard Worker {
1559*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
1560*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
1561*61046927SAndroid Build Coastguard Worker
1562*61046927SAndroid Build Coastguard Worker texObj = _mesa_lookup_or_create_texture(ctx, target, texture, false, true,
1563*61046927SAndroid Build Coastguard Worker "glTextureParameterIivEXT");
1564*61046927SAndroid Build Coastguard Worker if (!texObj)
1565*61046927SAndroid Build Coastguard Worker return;
1566*61046927SAndroid Build Coastguard Worker
1567*61046927SAndroid Build Coastguard Worker _mesa_texture_parameterIiv(ctx, texObj, pname, params, true);
1568*61046927SAndroid Build Coastguard Worker }
1569*61046927SAndroid Build Coastguard Worker
1570*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_MultiTexParameterIivEXT(GLenum texunit,GLenum target,GLenum pname,const GLint * params)1571*61046927SAndroid Build Coastguard Worker _mesa_MultiTexParameterIivEXT(GLenum texunit, GLenum target, GLenum pname,
1572*61046927SAndroid Build Coastguard Worker const GLint *params)
1573*61046927SAndroid Build Coastguard Worker {
1574*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
1575*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
1576*61046927SAndroid Build Coastguard Worker
1577*61046927SAndroid Build Coastguard Worker texObj = _mesa_get_texobj_by_target_and_texunit(ctx, target,
1578*61046927SAndroid Build Coastguard Worker texunit - GL_TEXTURE0,
1579*61046927SAndroid Build Coastguard Worker true,
1580*61046927SAndroid Build Coastguard Worker "glMultiTexParameterIivEXT");
1581*61046927SAndroid Build Coastguard Worker if (!texObj)
1582*61046927SAndroid Build Coastguard Worker return;
1583*61046927SAndroid Build Coastguard Worker
1584*61046927SAndroid Build Coastguard Worker _mesa_texture_parameterIiv(ctx, texObj, pname, params, true);
1585*61046927SAndroid Build Coastguard Worker }
1586*61046927SAndroid Build Coastguard Worker
1587*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_TextureParameterIuiv(GLuint texture,GLenum pname,const GLuint * params)1588*61046927SAndroid Build Coastguard Worker _mesa_TextureParameterIuiv(GLuint texture, GLenum pname, const GLuint *params)
1589*61046927SAndroid Build Coastguard Worker {
1590*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
1591*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
1592*61046927SAndroid Build Coastguard Worker
1593*61046927SAndroid Build Coastguard Worker texObj = get_texobj_by_name(ctx, texture, "glTextureParameterIuiv");
1594*61046927SAndroid Build Coastguard Worker if (!texObj)
1595*61046927SAndroid Build Coastguard Worker return;
1596*61046927SAndroid Build Coastguard Worker
1597*61046927SAndroid Build Coastguard Worker _mesa_texture_parameterIuiv(ctx, texObj, pname, params, true);
1598*61046927SAndroid Build Coastguard Worker }
1599*61046927SAndroid Build Coastguard Worker
1600*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_TextureParameterIuivEXT(GLuint texture,GLenum target,GLenum pname,const GLuint * params)1601*61046927SAndroid Build Coastguard Worker _mesa_TextureParameterIuivEXT(GLuint texture, GLenum target, GLenum pname,
1602*61046927SAndroid Build Coastguard Worker const GLuint *params)
1603*61046927SAndroid Build Coastguard Worker {
1604*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
1605*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
1606*61046927SAndroid Build Coastguard Worker
1607*61046927SAndroid Build Coastguard Worker texObj = _mesa_lookup_or_create_texture(ctx, target, texture, false, true,
1608*61046927SAndroid Build Coastguard Worker "glTextureParameterIuivEXT");
1609*61046927SAndroid Build Coastguard Worker if (!texObj)
1610*61046927SAndroid Build Coastguard Worker return;
1611*61046927SAndroid Build Coastguard Worker
1612*61046927SAndroid Build Coastguard Worker _mesa_texture_parameterIuiv(ctx, texObj, pname, params, true);
1613*61046927SAndroid Build Coastguard Worker }
1614*61046927SAndroid Build Coastguard Worker
1615*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_MultiTexParameterIuivEXT(GLenum texunit,GLenum target,GLenum pname,const GLuint * params)1616*61046927SAndroid Build Coastguard Worker _mesa_MultiTexParameterIuivEXT(GLenum texunit, GLenum target, GLenum pname,
1617*61046927SAndroid Build Coastguard Worker const GLuint *params)
1618*61046927SAndroid Build Coastguard Worker {
1619*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
1620*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
1621*61046927SAndroid Build Coastguard Worker
1622*61046927SAndroid Build Coastguard Worker texObj = _mesa_get_texobj_by_target_and_texunit(ctx, target,
1623*61046927SAndroid Build Coastguard Worker texunit - GL_TEXTURE0,
1624*61046927SAndroid Build Coastguard Worker true,
1625*61046927SAndroid Build Coastguard Worker "glMultiTexParameterIuivEXT");
1626*61046927SAndroid Build Coastguard Worker if (!texObj)
1627*61046927SAndroid Build Coastguard Worker return;
1628*61046927SAndroid Build Coastguard Worker
1629*61046927SAndroid Build Coastguard Worker _mesa_texture_parameterIuiv(ctx, texObj, pname, params, true);
1630*61046927SAndroid Build Coastguard Worker }
1631*61046927SAndroid Build Coastguard Worker
1632*61046927SAndroid Build Coastguard Worker GLboolean
_mesa_legal_get_tex_level_parameter_target(struct gl_context * ctx,GLenum target,bool dsa)1633*61046927SAndroid Build Coastguard Worker _mesa_legal_get_tex_level_parameter_target(struct gl_context *ctx, GLenum target,
1634*61046927SAndroid Build Coastguard Worker bool dsa)
1635*61046927SAndroid Build Coastguard Worker {
1636*61046927SAndroid Build Coastguard Worker /* Common targets for desktop GL and GLES 3.1. */
1637*61046927SAndroid Build Coastguard Worker switch (target) {
1638*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_2D:
1639*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_3D:
1640*61046927SAndroid Build Coastguard Worker return GL_TRUE;
1641*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_2D_ARRAY_EXT:
1642*61046927SAndroid Build Coastguard Worker return ctx->Extensions.EXT_texture_array;
1643*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1644*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1645*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1646*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1647*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1648*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1649*61046927SAndroid Build Coastguard Worker return GL_TRUE;
1650*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_2D_MULTISAMPLE:
1651*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
1652*61046927SAndroid Build Coastguard Worker return ctx->Extensions.ARB_texture_multisample;
1653*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BUFFER:
1654*61046927SAndroid Build Coastguard Worker /* GetTexLevelParameter accepts GL_TEXTURE_BUFFER in GL 3.1+ contexts,
1655*61046927SAndroid Build Coastguard Worker * but not in earlier versions that expose ARB_texture_buffer_object.
1656*61046927SAndroid Build Coastguard Worker *
1657*61046927SAndroid Build Coastguard Worker * From the ARB_texture_buffer_object spec:
1658*61046927SAndroid Build Coastguard Worker * "(7) Do buffer textures support texture parameters (TexParameter) or
1659*61046927SAndroid Build Coastguard Worker * queries (GetTexParameter, GetTexLevelParameter, GetTexImage)?
1660*61046927SAndroid Build Coastguard Worker *
1661*61046927SAndroid Build Coastguard Worker * RESOLVED: No. [...] Note that the spec edits above don't add
1662*61046927SAndroid Build Coastguard Worker * explicit error language for any of these cases. That is because
1663*61046927SAndroid Build Coastguard Worker * each of the functions enumerate the set of valid <target>
1664*61046927SAndroid Build Coastguard Worker * parameters. Not editing the spec to allow TEXTURE_BUFFER_ARB in
1665*61046927SAndroid Build Coastguard Worker * these cases means that target is not legal, and an INVALID_ENUM
1666*61046927SAndroid Build Coastguard Worker * error should be generated."
1667*61046927SAndroid Build Coastguard Worker *
1668*61046927SAndroid Build Coastguard Worker * From the OpenGL 3.1 spec:
1669*61046927SAndroid Build Coastguard Worker * "target may also be TEXTURE_BUFFER, indicating the texture buffer."
1670*61046927SAndroid Build Coastguard Worker *
1671*61046927SAndroid Build Coastguard Worker * From ARB_texture_buffer_range, GL_TEXTURE is a valid target in
1672*61046927SAndroid Build Coastguard Worker * GetTexLevelParameter.
1673*61046927SAndroid Build Coastguard Worker */
1674*61046927SAndroid Build Coastguard Worker return (_mesa_is_desktop_gl(ctx) && ctx->Version >= 31) ||
1675*61046927SAndroid Build Coastguard Worker _mesa_has_OES_texture_buffer(ctx) ||
1676*61046927SAndroid Build Coastguard Worker _mesa_has_ARB_texture_buffer_range(ctx);
1677*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_CUBE_MAP_ARRAY:
1678*61046927SAndroid Build Coastguard Worker return _mesa_has_texture_cube_map_array(ctx);
1679*61046927SAndroid Build Coastguard Worker }
1680*61046927SAndroid Build Coastguard Worker
1681*61046927SAndroid Build Coastguard Worker if (!_mesa_is_desktop_gl(ctx))
1682*61046927SAndroid Build Coastguard Worker return GL_FALSE;
1683*61046927SAndroid Build Coastguard Worker
1684*61046927SAndroid Build Coastguard Worker /* Rest of the desktop GL targets. */
1685*61046927SAndroid Build Coastguard Worker switch (target) {
1686*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_1D:
1687*61046927SAndroid Build Coastguard Worker case GL_PROXY_TEXTURE_1D:
1688*61046927SAndroid Build Coastguard Worker case GL_PROXY_TEXTURE_2D:
1689*61046927SAndroid Build Coastguard Worker case GL_PROXY_TEXTURE_3D:
1690*61046927SAndroid Build Coastguard Worker case GL_PROXY_TEXTURE_CUBE_MAP:
1691*61046927SAndroid Build Coastguard Worker return GL_TRUE;
1692*61046927SAndroid Build Coastguard Worker case GL_PROXY_TEXTURE_CUBE_MAP_ARRAY:
1693*61046927SAndroid Build Coastguard Worker return ctx->Extensions.ARB_texture_cube_map_array;
1694*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_RECTANGLE_NV:
1695*61046927SAndroid Build Coastguard Worker case GL_PROXY_TEXTURE_RECTANGLE_NV:
1696*61046927SAndroid Build Coastguard Worker return ctx->Extensions.NV_texture_rectangle;
1697*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_1D_ARRAY_EXT:
1698*61046927SAndroid Build Coastguard Worker case GL_PROXY_TEXTURE_1D_ARRAY_EXT:
1699*61046927SAndroid Build Coastguard Worker case GL_PROXY_TEXTURE_2D_ARRAY_EXT:
1700*61046927SAndroid Build Coastguard Worker return ctx->Extensions.EXT_texture_array;
1701*61046927SAndroid Build Coastguard Worker case GL_PROXY_TEXTURE_2D_MULTISAMPLE:
1702*61046927SAndroid Build Coastguard Worker case GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY:
1703*61046927SAndroid Build Coastguard Worker return ctx->Extensions.ARB_texture_multisample;
1704*61046927SAndroid Build Coastguard Worker
1705*61046927SAndroid Build Coastguard Worker /* This is a valid target for dsa, but the OpenGL 4.5 core spec
1706*61046927SAndroid Build Coastguard Worker * (30.10.2014) Section 8.11 Texture Queries says:
1707*61046927SAndroid Build Coastguard Worker * "For GetTextureLevelParameter* only, texture may also be a cube
1708*61046927SAndroid Build Coastguard Worker * map texture object. In this case the query is always performed
1709*61046927SAndroid Build Coastguard Worker * for face zero (the TEXTURE_CUBE_MAP_POSITIVE_X face), since there
1710*61046927SAndroid Build Coastguard Worker * is no way to specify another face."
1711*61046927SAndroid Build Coastguard Worker */
1712*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_CUBE_MAP:
1713*61046927SAndroid Build Coastguard Worker return dsa;
1714*61046927SAndroid Build Coastguard Worker default:
1715*61046927SAndroid Build Coastguard Worker return GL_FALSE;
1716*61046927SAndroid Build Coastguard Worker }
1717*61046927SAndroid Build Coastguard Worker }
1718*61046927SAndroid Build Coastguard Worker
1719*61046927SAndroid Build Coastguard Worker
1720*61046927SAndroid Build Coastguard Worker static void
get_tex_level_parameter_image(struct gl_context * ctx,const struct gl_texture_object * texObj,GLenum target,GLint level,GLenum pname,GLint * params,bool dsa)1721*61046927SAndroid Build Coastguard Worker get_tex_level_parameter_image(struct gl_context *ctx,
1722*61046927SAndroid Build Coastguard Worker const struct gl_texture_object *texObj,
1723*61046927SAndroid Build Coastguard Worker GLenum target, GLint level,
1724*61046927SAndroid Build Coastguard Worker GLenum pname, GLint *params,
1725*61046927SAndroid Build Coastguard Worker bool dsa)
1726*61046927SAndroid Build Coastguard Worker {
1727*61046927SAndroid Build Coastguard Worker const struct gl_texture_image *img = NULL;
1728*61046927SAndroid Build Coastguard Worker struct gl_texture_image dummy_image;
1729*61046927SAndroid Build Coastguard Worker mesa_format texFormat;
1730*61046927SAndroid Build Coastguard Worker const char *suffix = dsa ? "ture" : "";
1731*61046927SAndroid Build Coastguard Worker
1732*61046927SAndroid Build Coastguard Worker img = _mesa_select_tex_image(texObj, target, level);
1733*61046927SAndroid Build Coastguard Worker if (!img || img->TexFormat == MESA_FORMAT_NONE) {
1734*61046927SAndroid Build Coastguard Worker /* In case of undefined texture image return the default values.
1735*61046927SAndroid Build Coastguard Worker *
1736*61046927SAndroid Build Coastguard Worker * From OpenGL 4.0 spec, page 398:
1737*61046927SAndroid Build Coastguard Worker * "The initial internal format of a texel array is RGBA
1738*61046927SAndroid Build Coastguard Worker * instead of 1. TEXTURE_COMPONENTS is deprecated; always
1739*61046927SAndroid Build Coastguard Worker * use TEXTURE_INTERNAL_FORMAT."
1740*61046927SAndroid Build Coastguard Worker */
1741*61046927SAndroid Build Coastguard Worker memset(&dummy_image, 0, sizeof(dummy_image));
1742*61046927SAndroid Build Coastguard Worker dummy_image.TexFormat = MESA_FORMAT_NONE;
1743*61046927SAndroid Build Coastguard Worker dummy_image.InternalFormat = GL_RGBA;
1744*61046927SAndroid Build Coastguard Worker dummy_image._BaseFormat = GL_NONE;
1745*61046927SAndroid Build Coastguard Worker dummy_image.FixedSampleLocations = GL_TRUE;
1746*61046927SAndroid Build Coastguard Worker
1747*61046927SAndroid Build Coastguard Worker img = &dummy_image;
1748*61046927SAndroid Build Coastguard Worker }
1749*61046927SAndroid Build Coastguard Worker
1750*61046927SAndroid Build Coastguard Worker texFormat = img->TexFormat;
1751*61046927SAndroid Build Coastguard Worker
1752*61046927SAndroid Build Coastguard Worker switch (pname) {
1753*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WIDTH:
1754*61046927SAndroid Build Coastguard Worker *params = img->Width;
1755*61046927SAndroid Build Coastguard Worker break;
1756*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_HEIGHT:
1757*61046927SAndroid Build Coastguard Worker *params = img->Height;
1758*61046927SAndroid Build Coastguard Worker break;
1759*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_DEPTH:
1760*61046927SAndroid Build Coastguard Worker *params = img->Depth;
1761*61046927SAndroid Build Coastguard Worker break;
1762*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_INTERNAL_FORMAT:
1763*61046927SAndroid Build Coastguard Worker if (_mesa_is_format_compressed(texFormat)) {
1764*61046927SAndroid Build Coastguard Worker /* need to return the actual compressed format */
1765*61046927SAndroid Build Coastguard Worker *params = _mesa_compressed_format_to_glenum(ctx, texFormat);
1766*61046927SAndroid Build Coastguard Worker }
1767*61046927SAndroid Build Coastguard Worker else {
1768*61046927SAndroid Build Coastguard Worker /* If the true internal format is not compressed but the user
1769*61046927SAndroid Build Coastguard Worker * requested a generic compressed format, we have to return the
1770*61046927SAndroid Build Coastguard Worker * generic base format that matches.
1771*61046927SAndroid Build Coastguard Worker *
1772*61046927SAndroid Build Coastguard Worker * From page 119 (page 129 of the PDF) of the OpenGL 1.3 spec:
1773*61046927SAndroid Build Coastguard Worker *
1774*61046927SAndroid Build Coastguard Worker * "If no specific compressed format is available,
1775*61046927SAndroid Build Coastguard Worker * internalformat is instead replaced by the corresponding base
1776*61046927SAndroid Build Coastguard Worker * internal format."
1777*61046927SAndroid Build Coastguard Worker *
1778*61046927SAndroid Build Coastguard Worker * Otherwise just return the user's requested internal format
1779*61046927SAndroid Build Coastguard Worker */
1780*61046927SAndroid Build Coastguard Worker const GLenum f =
1781*61046927SAndroid Build Coastguard Worker _mesa_gl_compressed_format_base_format(img->InternalFormat);
1782*61046927SAndroid Build Coastguard Worker
1783*61046927SAndroid Build Coastguard Worker *params = (f != 0) ? f : img->InternalFormat;
1784*61046927SAndroid Build Coastguard Worker }
1785*61046927SAndroid Build Coastguard Worker break;
1786*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BORDER:
1787*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
1788*61046927SAndroid Build Coastguard Worker goto invalid_pname;
1789*61046927SAndroid Build Coastguard Worker *params = img->Border;
1790*61046927SAndroid Build Coastguard Worker break;
1791*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_RED_SIZE:
1792*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_GREEN_SIZE:
1793*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BLUE_SIZE:
1794*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_ALPHA_SIZE:
1795*61046927SAndroid Build Coastguard Worker if (_mesa_base_format_has_channel(img->_BaseFormat, pname))
1796*61046927SAndroid Build Coastguard Worker *params = _mesa_get_format_bits(texFormat, pname);
1797*61046927SAndroid Build Coastguard Worker else
1798*61046927SAndroid Build Coastguard Worker *params = 0;
1799*61046927SAndroid Build Coastguard Worker break;
1800*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_INTENSITY_SIZE:
1801*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_LUMINANCE_SIZE:
1802*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
1803*61046927SAndroid Build Coastguard Worker goto invalid_pname;
1804*61046927SAndroid Build Coastguard Worker if (_mesa_base_format_has_channel(img->_BaseFormat, pname)) {
1805*61046927SAndroid Build Coastguard Worker *params = _mesa_get_format_bits(texFormat, pname);
1806*61046927SAndroid Build Coastguard Worker if (*params == 0) {
1807*61046927SAndroid Build Coastguard Worker /* intensity or luminance is probably stored as RGB[A] */
1808*61046927SAndroid Build Coastguard Worker *params = MIN2(_mesa_get_format_bits(texFormat,
1809*61046927SAndroid Build Coastguard Worker GL_TEXTURE_RED_SIZE),
1810*61046927SAndroid Build Coastguard Worker _mesa_get_format_bits(texFormat,
1811*61046927SAndroid Build Coastguard Worker GL_TEXTURE_GREEN_SIZE));
1812*61046927SAndroid Build Coastguard Worker }
1813*61046927SAndroid Build Coastguard Worker if (*params == 0 && pname == GL_TEXTURE_INTENSITY_SIZE) {
1814*61046927SAndroid Build Coastguard Worker /* Gallium may store intensity as LA */
1815*61046927SAndroid Build Coastguard Worker *params = _mesa_get_format_bits(texFormat,
1816*61046927SAndroid Build Coastguard Worker GL_TEXTURE_ALPHA_SIZE);
1817*61046927SAndroid Build Coastguard Worker }
1818*61046927SAndroid Build Coastguard Worker }
1819*61046927SAndroid Build Coastguard Worker else {
1820*61046927SAndroid Build Coastguard Worker *params = 0;
1821*61046927SAndroid Build Coastguard Worker }
1822*61046927SAndroid Build Coastguard Worker break;
1823*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_DEPTH_SIZE_ARB:
1824*61046927SAndroid Build Coastguard Worker *params = _mesa_get_format_bits(texFormat, pname);
1825*61046927SAndroid Build Coastguard Worker break;
1826*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_STENCIL_SIZE:
1827*61046927SAndroid Build Coastguard Worker *params = _mesa_get_format_bits(texFormat, pname);
1828*61046927SAndroid Build Coastguard Worker break;
1829*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SHARED_SIZE:
1830*61046927SAndroid Build Coastguard Worker if (ctx->Version < 30 &&
1831*61046927SAndroid Build Coastguard Worker !ctx->Extensions.EXT_texture_shared_exponent)
1832*61046927SAndroid Build Coastguard Worker goto invalid_pname;
1833*61046927SAndroid Build Coastguard Worker *params = texFormat == MESA_FORMAT_R9G9B9E5_FLOAT ? 5 : 0;
1834*61046927SAndroid Build Coastguard Worker break;
1835*61046927SAndroid Build Coastguard Worker
1836*61046927SAndroid Build Coastguard Worker /* GL_ARB_texture_compression */
1837*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COMPRESSED_IMAGE_SIZE:
1838*61046927SAndroid Build Coastguard Worker if (_mesa_is_format_compressed(texFormat) &&
1839*61046927SAndroid Build Coastguard Worker !_mesa_is_proxy_texture(target)) {
1840*61046927SAndroid Build Coastguard Worker *params = _mesa_format_image_size(texFormat, img->Width,
1841*61046927SAndroid Build Coastguard Worker img->Height, img->Depth);
1842*61046927SAndroid Build Coastguard Worker } else {
1843*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_OPERATION,
1844*61046927SAndroid Build Coastguard Worker "glGetTex%sLevelParameter[if]v(pname=%s)", suffix,
1845*61046927SAndroid Build Coastguard Worker _mesa_enum_to_string(pname));
1846*61046927SAndroid Build Coastguard Worker }
1847*61046927SAndroid Build Coastguard Worker break;
1848*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COMPRESSED:
1849*61046927SAndroid Build Coastguard Worker *params = (GLint) _mesa_is_format_compressed(texFormat);
1850*61046927SAndroid Build Coastguard Worker break;
1851*61046927SAndroid Build Coastguard Worker
1852*61046927SAndroid Build Coastguard Worker /* GL_ARB_texture_float */
1853*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_LUMINANCE_TYPE_ARB:
1854*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_INTENSITY_TYPE_ARB:
1855*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
1856*61046927SAndroid Build Coastguard Worker goto invalid_pname;
1857*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
1858*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_RED_TYPE_ARB:
1859*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_GREEN_TYPE_ARB:
1860*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BLUE_TYPE_ARB:
1861*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_ALPHA_TYPE_ARB:
1862*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_DEPTH_TYPE_ARB:
1863*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_texture_float)
1864*61046927SAndroid Build Coastguard Worker goto invalid_pname;
1865*61046927SAndroid Build Coastguard Worker if (_mesa_base_format_has_channel(img->_BaseFormat, pname))
1866*61046927SAndroid Build Coastguard Worker *params = _mesa_get_format_datatype(texFormat);
1867*61046927SAndroid Build Coastguard Worker else
1868*61046927SAndroid Build Coastguard Worker *params = GL_NONE;
1869*61046927SAndroid Build Coastguard Worker break;
1870*61046927SAndroid Build Coastguard Worker
1871*61046927SAndroid Build Coastguard Worker /* GL_ARB_texture_multisample */
1872*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SAMPLES:
1873*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_texture_multisample)
1874*61046927SAndroid Build Coastguard Worker goto invalid_pname;
1875*61046927SAndroid Build Coastguard Worker *params = img->NumSamples;
1876*61046927SAndroid Build Coastguard Worker break;
1877*61046927SAndroid Build Coastguard Worker
1878*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_FIXED_SAMPLE_LOCATIONS:
1879*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_texture_multisample)
1880*61046927SAndroid Build Coastguard Worker goto invalid_pname;
1881*61046927SAndroid Build Coastguard Worker *params = img->FixedSampleLocations;
1882*61046927SAndroid Build Coastguard Worker break;
1883*61046927SAndroid Build Coastguard Worker
1884*61046927SAndroid Build Coastguard Worker /* There is never a buffer data store here, but these pnames still have
1885*61046927SAndroid Build Coastguard Worker * to work.
1886*61046927SAndroid Build Coastguard Worker */
1887*61046927SAndroid Build Coastguard Worker
1888*61046927SAndroid Build Coastguard Worker /* GL_ARB_texture_buffer_object */
1889*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BUFFER_DATA_STORE_BINDING:
1890*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_texture_buffer_object)
1891*61046927SAndroid Build Coastguard Worker goto invalid_pname;
1892*61046927SAndroid Build Coastguard Worker *params = 0;
1893*61046927SAndroid Build Coastguard Worker break;
1894*61046927SAndroid Build Coastguard Worker
1895*61046927SAndroid Build Coastguard Worker /* GL_ARB_texture_buffer_range */
1896*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BUFFER_OFFSET:
1897*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_texture_buffer_range)
1898*61046927SAndroid Build Coastguard Worker goto invalid_pname;
1899*61046927SAndroid Build Coastguard Worker *params = 0;
1900*61046927SAndroid Build Coastguard Worker break;
1901*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BUFFER_SIZE:
1902*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_texture_buffer_range)
1903*61046927SAndroid Build Coastguard Worker goto invalid_pname;
1904*61046927SAndroid Build Coastguard Worker *params = 0;
1905*61046927SAndroid Build Coastguard Worker break;
1906*61046927SAndroid Build Coastguard Worker
1907*61046927SAndroid Build Coastguard Worker default:
1908*61046927SAndroid Build Coastguard Worker goto invalid_pname;
1909*61046927SAndroid Build Coastguard Worker }
1910*61046927SAndroid Build Coastguard Worker
1911*61046927SAndroid Build Coastguard Worker /* no error if we get here */
1912*61046927SAndroid Build Coastguard Worker return;
1913*61046927SAndroid Build Coastguard Worker
1914*61046927SAndroid Build Coastguard Worker invalid_pname:
1915*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM,
1916*61046927SAndroid Build Coastguard Worker "glGetTex%sLevelParameter[if]v(pname=%s)", suffix,
1917*61046927SAndroid Build Coastguard Worker _mesa_enum_to_string(pname));
1918*61046927SAndroid Build Coastguard Worker }
1919*61046927SAndroid Build Coastguard Worker
1920*61046927SAndroid Build Coastguard Worker
1921*61046927SAndroid Build Coastguard Worker /**
1922*61046927SAndroid Build Coastguard Worker * Handle a glGetTexLevelParamteriv() call for a texture buffer.
1923*61046927SAndroid Build Coastguard Worker */
1924*61046927SAndroid Build Coastguard Worker static void
get_tex_level_parameter_buffer(struct gl_context * ctx,const struct gl_texture_object * texObj,GLenum pname,GLint * params,bool dsa)1925*61046927SAndroid Build Coastguard Worker get_tex_level_parameter_buffer(struct gl_context *ctx,
1926*61046927SAndroid Build Coastguard Worker const struct gl_texture_object *texObj,
1927*61046927SAndroid Build Coastguard Worker GLenum pname, GLint *params, bool dsa)
1928*61046927SAndroid Build Coastguard Worker {
1929*61046927SAndroid Build Coastguard Worker const struct gl_buffer_object *bo = texObj->BufferObject;
1930*61046927SAndroid Build Coastguard Worker mesa_format texFormat = texObj->_BufferObjectFormat;
1931*61046927SAndroid Build Coastguard Worker int bytes = MAX2(1, _mesa_get_format_bytes(texFormat));
1932*61046927SAndroid Build Coastguard Worker GLenum internalFormat = texObj->BufferObjectFormat;
1933*61046927SAndroid Build Coastguard Worker GLenum baseFormat = _mesa_get_format_base_format(texFormat);
1934*61046927SAndroid Build Coastguard Worker const char *suffix = dsa ? "ture" : "";
1935*61046927SAndroid Build Coastguard Worker
1936*61046927SAndroid Build Coastguard Worker assert(texObj->Target == GL_TEXTURE_BUFFER);
1937*61046927SAndroid Build Coastguard Worker
1938*61046927SAndroid Build Coastguard Worker if (!bo) {
1939*61046927SAndroid Build Coastguard Worker /* undefined texture buffer object */
1940*61046927SAndroid Build Coastguard Worker switch (pname) {
1941*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_FIXED_SAMPLE_LOCATIONS:
1942*61046927SAndroid Build Coastguard Worker *params = GL_TRUE;
1943*61046927SAndroid Build Coastguard Worker break;
1944*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_INTERNAL_FORMAT:
1945*61046927SAndroid Build Coastguard Worker *params = internalFormat;
1946*61046927SAndroid Build Coastguard Worker break;
1947*61046927SAndroid Build Coastguard Worker default:
1948*61046927SAndroid Build Coastguard Worker *params = 0;
1949*61046927SAndroid Build Coastguard Worker break;
1950*61046927SAndroid Build Coastguard Worker }
1951*61046927SAndroid Build Coastguard Worker return;
1952*61046927SAndroid Build Coastguard Worker }
1953*61046927SAndroid Build Coastguard Worker
1954*61046927SAndroid Build Coastguard Worker switch (pname) {
1955*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BUFFER_DATA_STORE_BINDING:
1956*61046927SAndroid Build Coastguard Worker *params = bo->Name;
1957*61046927SAndroid Build Coastguard Worker break;
1958*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WIDTH:
1959*61046927SAndroid Build Coastguard Worker *params = ((texObj->BufferSize == -1) ? bo->Size : texObj->BufferSize)
1960*61046927SAndroid Build Coastguard Worker / bytes;
1961*61046927SAndroid Build Coastguard Worker break;
1962*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_HEIGHT:
1963*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_DEPTH:
1964*61046927SAndroid Build Coastguard Worker *params = 1;
1965*61046927SAndroid Build Coastguard Worker break;
1966*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BORDER:
1967*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SHARED_SIZE:
1968*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COMPRESSED:
1969*61046927SAndroid Build Coastguard Worker *params = 0;
1970*61046927SAndroid Build Coastguard Worker break;
1971*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_INTERNAL_FORMAT:
1972*61046927SAndroid Build Coastguard Worker *params = internalFormat;
1973*61046927SAndroid Build Coastguard Worker break;
1974*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_RED_SIZE:
1975*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_GREEN_SIZE:
1976*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BLUE_SIZE:
1977*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_ALPHA_SIZE:
1978*61046927SAndroid Build Coastguard Worker if (_mesa_base_format_has_channel(baseFormat, pname))
1979*61046927SAndroid Build Coastguard Worker *params = _mesa_get_format_bits(texFormat, pname);
1980*61046927SAndroid Build Coastguard Worker else
1981*61046927SAndroid Build Coastguard Worker *params = 0;
1982*61046927SAndroid Build Coastguard Worker break;
1983*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_INTENSITY_SIZE:
1984*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_LUMINANCE_SIZE:
1985*61046927SAndroid Build Coastguard Worker if (_mesa_base_format_has_channel(baseFormat, pname)) {
1986*61046927SAndroid Build Coastguard Worker *params = _mesa_get_format_bits(texFormat, pname);
1987*61046927SAndroid Build Coastguard Worker if (*params == 0) {
1988*61046927SAndroid Build Coastguard Worker /* intensity or luminance is probably stored as RGB[A] */
1989*61046927SAndroid Build Coastguard Worker *params = MIN2(_mesa_get_format_bits(texFormat,
1990*61046927SAndroid Build Coastguard Worker GL_TEXTURE_RED_SIZE),
1991*61046927SAndroid Build Coastguard Worker _mesa_get_format_bits(texFormat,
1992*61046927SAndroid Build Coastguard Worker GL_TEXTURE_GREEN_SIZE));
1993*61046927SAndroid Build Coastguard Worker }
1994*61046927SAndroid Build Coastguard Worker } else {
1995*61046927SAndroid Build Coastguard Worker *params = 0;
1996*61046927SAndroid Build Coastguard Worker }
1997*61046927SAndroid Build Coastguard Worker break;
1998*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_DEPTH_SIZE_ARB:
1999*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_STENCIL_SIZE_EXT:
2000*61046927SAndroid Build Coastguard Worker *params = _mesa_get_format_bits(texFormat, pname);
2001*61046927SAndroid Build Coastguard Worker break;
2002*61046927SAndroid Build Coastguard Worker
2003*61046927SAndroid Build Coastguard Worker /* GL_ARB_texture_buffer_range */
2004*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BUFFER_OFFSET:
2005*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_texture_buffer_range)
2006*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2007*61046927SAndroid Build Coastguard Worker *params = texObj->BufferOffset;
2008*61046927SAndroid Build Coastguard Worker break;
2009*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BUFFER_SIZE:
2010*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_texture_buffer_range)
2011*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2012*61046927SAndroid Build Coastguard Worker *params = (texObj->BufferSize == -1) ? bo->Size : texObj->BufferSize;
2013*61046927SAndroid Build Coastguard Worker break;
2014*61046927SAndroid Build Coastguard Worker
2015*61046927SAndroid Build Coastguard Worker /* GL_ARB_texture_multisample */
2016*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SAMPLES:
2017*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_texture_multisample)
2018*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2019*61046927SAndroid Build Coastguard Worker *params = 0;
2020*61046927SAndroid Build Coastguard Worker break;
2021*61046927SAndroid Build Coastguard Worker
2022*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_FIXED_SAMPLE_LOCATIONS:
2023*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_texture_multisample)
2024*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2025*61046927SAndroid Build Coastguard Worker *params = GL_TRUE;
2026*61046927SAndroid Build Coastguard Worker break;
2027*61046927SAndroid Build Coastguard Worker
2028*61046927SAndroid Build Coastguard Worker /* GL_ARB_texture_compression */
2029*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COMPRESSED_IMAGE_SIZE:
2030*61046927SAndroid Build Coastguard Worker /* Always illegal for GL_TEXTURE_BUFFER */
2031*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_OPERATION,
2032*61046927SAndroid Build Coastguard Worker "glGetTex%sLevelParameter[if]v(pname=%s)", suffix,
2033*61046927SAndroid Build Coastguard Worker _mesa_enum_to_string(pname));
2034*61046927SAndroid Build Coastguard Worker break;
2035*61046927SAndroid Build Coastguard Worker
2036*61046927SAndroid Build Coastguard Worker /* GL_ARB_texture_float */
2037*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_RED_TYPE_ARB:
2038*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_GREEN_TYPE_ARB:
2039*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BLUE_TYPE_ARB:
2040*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_ALPHA_TYPE_ARB:
2041*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_LUMINANCE_TYPE_ARB:
2042*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_INTENSITY_TYPE_ARB:
2043*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_DEPTH_TYPE_ARB:
2044*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_texture_float)
2045*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2046*61046927SAndroid Build Coastguard Worker if (_mesa_base_format_has_channel(baseFormat, pname))
2047*61046927SAndroid Build Coastguard Worker *params = _mesa_get_format_datatype(texFormat);
2048*61046927SAndroid Build Coastguard Worker else
2049*61046927SAndroid Build Coastguard Worker *params = GL_NONE;
2050*61046927SAndroid Build Coastguard Worker break;
2051*61046927SAndroid Build Coastguard Worker
2052*61046927SAndroid Build Coastguard Worker default:
2053*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2054*61046927SAndroid Build Coastguard Worker }
2055*61046927SAndroid Build Coastguard Worker
2056*61046927SAndroid Build Coastguard Worker /* no error if we get here */
2057*61046927SAndroid Build Coastguard Worker return;
2058*61046927SAndroid Build Coastguard Worker
2059*61046927SAndroid Build Coastguard Worker invalid_pname:
2060*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM,
2061*61046927SAndroid Build Coastguard Worker "glGetTex%sLevelParameter[if]v(pname=%s)", suffix,
2062*61046927SAndroid Build Coastguard Worker _mesa_enum_to_string(pname));
2063*61046927SAndroid Build Coastguard Worker }
2064*61046927SAndroid Build Coastguard Worker
2065*61046927SAndroid Build Coastguard Worker static bool
valid_tex_level_parameteriv_target(struct gl_context * ctx,GLenum target,bool dsa)2066*61046927SAndroid Build Coastguard Worker valid_tex_level_parameteriv_target(struct gl_context *ctx, GLenum target,
2067*61046927SAndroid Build Coastguard Worker bool dsa)
2068*61046927SAndroid Build Coastguard Worker {
2069*61046927SAndroid Build Coastguard Worker const char *suffix = dsa ? "ture" : "";
2070*61046927SAndroid Build Coastguard Worker if (!_mesa_legal_get_tex_level_parameter_target(ctx, target, dsa)) {
2071*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM,
2072*61046927SAndroid Build Coastguard Worker "glGetTex%sLevelParameter[if]v(target=%s)", suffix,
2073*61046927SAndroid Build Coastguard Worker _mesa_enum_to_string(target));
2074*61046927SAndroid Build Coastguard Worker return false;
2075*61046927SAndroid Build Coastguard Worker }
2076*61046927SAndroid Build Coastguard Worker return true;
2077*61046927SAndroid Build Coastguard Worker }
2078*61046927SAndroid Build Coastguard Worker
2079*61046927SAndroid Build Coastguard Worker /**
2080*61046927SAndroid Build Coastguard Worker * This isn't exposed to the rest of the driver because it is a part of the
2081*61046927SAndroid Build Coastguard Worker * OpenGL API that is rarely used.
2082*61046927SAndroid Build Coastguard Worker */
2083*61046927SAndroid Build Coastguard Worker static void
get_tex_level_parameteriv(struct gl_context * ctx,struct gl_texture_object * texObj,GLenum target,GLint level,GLenum pname,GLint * params,bool dsa)2084*61046927SAndroid Build Coastguard Worker get_tex_level_parameteriv(struct gl_context *ctx,
2085*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj,
2086*61046927SAndroid Build Coastguard Worker GLenum target, GLint level,
2087*61046927SAndroid Build Coastguard Worker GLenum pname, GLint *params,
2088*61046927SAndroid Build Coastguard Worker bool dsa)
2089*61046927SAndroid Build Coastguard Worker {
2090*61046927SAndroid Build Coastguard Worker GLint maxLevels;
2091*61046927SAndroid Build Coastguard Worker const char *suffix = dsa ? "ture" : "";
2092*61046927SAndroid Build Coastguard Worker
2093*61046927SAndroid Build Coastguard Worker /* Check for errors */
2094*61046927SAndroid Build Coastguard Worker if (ctx->Texture.CurrentUnit >= ctx->Const.MaxCombinedTextureImageUnits) {
2095*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_OPERATION,
2096*61046927SAndroid Build Coastguard Worker "glGetTex%sLevelParameter[if]v("
2097*61046927SAndroid Build Coastguard Worker "current unit >= max combined texture units)", suffix);
2098*61046927SAndroid Build Coastguard Worker return;
2099*61046927SAndroid Build Coastguard Worker }
2100*61046927SAndroid Build Coastguard Worker
2101*61046927SAndroid Build Coastguard Worker maxLevels = _mesa_max_texture_levels(ctx, target);
2102*61046927SAndroid Build Coastguard Worker assert(maxLevels != 0);
2103*61046927SAndroid Build Coastguard Worker
2104*61046927SAndroid Build Coastguard Worker if (level < 0 || level >= maxLevels) {
2105*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_VALUE,
2106*61046927SAndroid Build Coastguard Worker "glGetTex%sLevelParameter[if]v(level out of range)", suffix);
2107*61046927SAndroid Build Coastguard Worker return;
2108*61046927SAndroid Build Coastguard Worker }
2109*61046927SAndroid Build Coastguard Worker
2110*61046927SAndroid Build Coastguard Worker /* Get the level parameter */
2111*61046927SAndroid Build Coastguard Worker if (target == GL_TEXTURE_BUFFER) {
2112*61046927SAndroid Build Coastguard Worker get_tex_level_parameter_buffer(ctx, texObj, pname, params, dsa);
2113*61046927SAndroid Build Coastguard Worker }
2114*61046927SAndroid Build Coastguard Worker else {
2115*61046927SAndroid Build Coastguard Worker get_tex_level_parameter_image(ctx, texObj, target,
2116*61046927SAndroid Build Coastguard Worker level, pname, params, dsa);
2117*61046927SAndroid Build Coastguard Worker }
2118*61046927SAndroid Build Coastguard Worker }
2119*61046927SAndroid Build Coastguard Worker
2120*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetTexLevelParameterfv(GLenum target,GLint level,GLenum pname,GLfloat * params)2121*61046927SAndroid Build Coastguard Worker _mesa_GetTexLevelParameterfv( GLenum target, GLint level,
2122*61046927SAndroid Build Coastguard Worker GLenum pname, GLfloat *params )
2123*61046927SAndroid Build Coastguard Worker {
2124*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
2125*61046927SAndroid Build Coastguard Worker GLint iparam;
2126*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
2127*61046927SAndroid Build Coastguard Worker
2128*61046927SAndroid Build Coastguard Worker if (!valid_tex_level_parameteriv_target(ctx, target, false))
2129*61046927SAndroid Build Coastguard Worker return;
2130*61046927SAndroid Build Coastguard Worker
2131*61046927SAndroid Build Coastguard Worker texObj = _mesa_get_current_tex_object(ctx, target);
2132*61046927SAndroid Build Coastguard Worker if (!texObj)
2133*61046927SAndroid Build Coastguard Worker return;
2134*61046927SAndroid Build Coastguard Worker
2135*61046927SAndroid Build Coastguard Worker get_tex_level_parameteriv(ctx, texObj, target, level,
2136*61046927SAndroid Build Coastguard Worker pname, &iparam, false);
2137*61046927SAndroid Build Coastguard Worker
2138*61046927SAndroid Build Coastguard Worker *params = (GLfloat) iparam;
2139*61046927SAndroid Build Coastguard Worker }
2140*61046927SAndroid Build Coastguard Worker
2141*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetTexLevelParameteriv(GLenum target,GLint level,GLenum pname,GLint * params)2142*61046927SAndroid Build Coastguard Worker _mesa_GetTexLevelParameteriv( GLenum target, GLint level,
2143*61046927SAndroid Build Coastguard Worker GLenum pname, GLint *params )
2144*61046927SAndroid Build Coastguard Worker {
2145*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
2146*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
2147*61046927SAndroid Build Coastguard Worker
2148*61046927SAndroid Build Coastguard Worker if (!valid_tex_level_parameteriv_target(ctx, target, false))
2149*61046927SAndroid Build Coastguard Worker return;
2150*61046927SAndroid Build Coastguard Worker
2151*61046927SAndroid Build Coastguard Worker texObj = _mesa_get_current_tex_object(ctx, target);
2152*61046927SAndroid Build Coastguard Worker if (!texObj)
2153*61046927SAndroid Build Coastguard Worker return;
2154*61046927SAndroid Build Coastguard Worker
2155*61046927SAndroid Build Coastguard Worker get_tex_level_parameteriv(ctx, texObj, target, level,
2156*61046927SAndroid Build Coastguard Worker pname, params, false);
2157*61046927SAndroid Build Coastguard Worker }
2158*61046927SAndroid Build Coastguard Worker
2159*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetTextureLevelParameterfv(GLuint texture,GLint level,GLenum pname,GLfloat * params)2160*61046927SAndroid Build Coastguard Worker _mesa_GetTextureLevelParameterfv(GLuint texture, GLint level,
2161*61046927SAndroid Build Coastguard Worker GLenum pname, GLfloat *params)
2162*61046927SAndroid Build Coastguard Worker {
2163*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
2164*61046927SAndroid Build Coastguard Worker GLint iparam;
2165*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
2166*61046927SAndroid Build Coastguard Worker
2167*61046927SAndroid Build Coastguard Worker texObj = _mesa_lookup_texture_err(ctx, texture,
2168*61046927SAndroid Build Coastguard Worker "glGetTextureLevelParameterfv");
2169*61046927SAndroid Build Coastguard Worker if (!texObj)
2170*61046927SAndroid Build Coastguard Worker return;
2171*61046927SAndroid Build Coastguard Worker
2172*61046927SAndroid Build Coastguard Worker if (!valid_tex_level_parameteriv_target(ctx, texObj->Target, true))
2173*61046927SAndroid Build Coastguard Worker return;
2174*61046927SAndroid Build Coastguard Worker
2175*61046927SAndroid Build Coastguard Worker get_tex_level_parameteriv(ctx, texObj, texObj->Target, level,
2176*61046927SAndroid Build Coastguard Worker pname, &iparam, true);
2177*61046927SAndroid Build Coastguard Worker
2178*61046927SAndroid Build Coastguard Worker *params = (GLfloat) iparam;
2179*61046927SAndroid Build Coastguard Worker }
2180*61046927SAndroid Build Coastguard Worker
2181*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetTextureLevelParameterfvEXT(GLuint texture,GLenum target,GLint level,GLenum pname,GLfloat * params)2182*61046927SAndroid Build Coastguard Worker _mesa_GetTextureLevelParameterfvEXT(GLuint texture, GLenum target, GLint level,
2183*61046927SAndroid Build Coastguard Worker GLenum pname, GLfloat *params)
2184*61046927SAndroid Build Coastguard Worker {
2185*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
2186*61046927SAndroid Build Coastguard Worker GLint iparam;
2187*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
2188*61046927SAndroid Build Coastguard Worker
2189*61046927SAndroid Build Coastguard Worker texObj = _mesa_lookup_or_create_texture(ctx, target, texture, false, true,
2190*61046927SAndroid Build Coastguard Worker "glGetTextureLevelParameterfvEXT");
2191*61046927SAndroid Build Coastguard Worker if (!texObj)
2192*61046927SAndroid Build Coastguard Worker return;
2193*61046927SAndroid Build Coastguard Worker
2194*61046927SAndroid Build Coastguard Worker if (!valid_tex_level_parameteriv_target(ctx, texObj->Target, true))
2195*61046927SAndroid Build Coastguard Worker return;
2196*61046927SAndroid Build Coastguard Worker
2197*61046927SAndroid Build Coastguard Worker get_tex_level_parameteriv(ctx, texObj, texObj->Target, level,
2198*61046927SAndroid Build Coastguard Worker pname, &iparam, true);
2199*61046927SAndroid Build Coastguard Worker
2200*61046927SAndroid Build Coastguard Worker *params = (GLfloat) iparam;
2201*61046927SAndroid Build Coastguard Worker }
2202*61046927SAndroid Build Coastguard Worker
2203*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetMultiTexLevelParameterfvEXT(GLenum texunit,GLenum target,GLint level,GLenum pname,GLfloat * params)2204*61046927SAndroid Build Coastguard Worker _mesa_GetMultiTexLevelParameterfvEXT(GLenum texunit, GLenum target, GLint level,
2205*61046927SAndroid Build Coastguard Worker GLenum pname, GLfloat *params)
2206*61046927SAndroid Build Coastguard Worker {
2207*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
2208*61046927SAndroid Build Coastguard Worker GLint iparam;
2209*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
2210*61046927SAndroid Build Coastguard Worker
2211*61046927SAndroid Build Coastguard Worker texObj = _mesa_get_texobj_by_target_and_texunit(ctx, target,
2212*61046927SAndroid Build Coastguard Worker texunit - GL_TEXTURE0,
2213*61046927SAndroid Build Coastguard Worker true,
2214*61046927SAndroid Build Coastguard Worker "glGetMultiTexLevelParameterfvEXT");
2215*61046927SAndroid Build Coastguard Worker if (!texObj)
2216*61046927SAndroid Build Coastguard Worker return;
2217*61046927SAndroid Build Coastguard Worker
2218*61046927SAndroid Build Coastguard Worker if (!valid_tex_level_parameteriv_target(ctx, texObj->Target, true))
2219*61046927SAndroid Build Coastguard Worker return;
2220*61046927SAndroid Build Coastguard Worker
2221*61046927SAndroid Build Coastguard Worker get_tex_level_parameteriv(ctx, texObj, texObj->Target, level,
2222*61046927SAndroid Build Coastguard Worker pname, &iparam, true);
2223*61046927SAndroid Build Coastguard Worker
2224*61046927SAndroid Build Coastguard Worker *params = (GLfloat) iparam;
2225*61046927SAndroid Build Coastguard Worker }
2226*61046927SAndroid Build Coastguard Worker
2227*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetTextureLevelParameteriv(GLuint texture,GLint level,GLenum pname,GLint * params)2228*61046927SAndroid Build Coastguard Worker _mesa_GetTextureLevelParameteriv(GLuint texture, GLint level,
2229*61046927SAndroid Build Coastguard Worker GLenum pname, GLint *params)
2230*61046927SAndroid Build Coastguard Worker {
2231*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
2232*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
2233*61046927SAndroid Build Coastguard Worker
2234*61046927SAndroid Build Coastguard Worker texObj = _mesa_lookup_texture_err(ctx, texture,
2235*61046927SAndroid Build Coastguard Worker "glGetTextureLevelParameteriv");
2236*61046927SAndroid Build Coastguard Worker if (!texObj)
2237*61046927SAndroid Build Coastguard Worker return;
2238*61046927SAndroid Build Coastguard Worker
2239*61046927SAndroid Build Coastguard Worker if (!valid_tex_level_parameteriv_target(ctx, texObj->Target, true))
2240*61046927SAndroid Build Coastguard Worker return;
2241*61046927SAndroid Build Coastguard Worker
2242*61046927SAndroid Build Coastguard Worker get_tex_level_parameteriv(ctx, texObj, texObj->Target, level,
2243*61046927SAndroid Build Coastguard Worker pname, params, true);
2244*61046927SAndroid Build Coastguard Worker }
2245*61046927SAndroid Build Coastguard Worker
2246*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetTextureLevelParameterivEXT(GLuint texture,GLenum target,GLint level,GLenum pname,GLint * params)2247*61046927SAndroid Build Coastguard Worker _mesa_GetTextureLevelParameterivEXT(GLuint texture, GLenum target, GLint level,
2248*61046927SAndroid Build Coastguard Worker GLenum pname, GLint *params)
2249*61046927SAndroid Build Coastguard Worker {
2250*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
2251*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
2252*61046927SAndroid Build Coastguard Worker
2253*61046927SAndroid Build Coastguard Worker texObj = _mesa_lookup_or_create_texture(ctx, target, texture, false, true,
2254*61046927SAndroid Build Coastguard Worker "glGetTextureLevelParameterivEXT");
2255*61046927SAndroid Build Coastguard Worker if (!texObj)
2256*61046927SAndroid Build Coastguard Worker return;
2257*61046927SAndroid Build Coastguard Worker
2258*61046927SAndroid Build Coastguard Worker if (!valid_tex_level_parameteriv_target(ctx, texObj->Target, true))
2259*61046927SAndroid Build Coastguard Worker return;
2260*61046927SAndroid Build Coastguard Worker
2261*61046927SAndroid Build Coastguard Worker get_tex_level_parameteriv(ctx, texObj, texObj->Target, level,
2262*61046927SAndroid Build Coastguard Worker pname, params, true);
2263*61046927SAndroid Build Coastguard Worker }
2264*61046927SAndroid Build Coastguard Worker
2265*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetMultiTexLevelParameterivEXT(GLenum texunit,GLenum target,GLint level,GLenum pname,GLint * params)2266*61046927SAndroid Build Coastguard Worker _mesa_GetMultiTexLevelParameterivEXT(GLenum texunit, GLenum target, GLint level,
2267*61046927SAndroid Build Coastguard Worker GLenum pname, GLint *params)
2268*61046927SAndroid Build Coastguard Worker {
2269*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
2270*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
2271*61046927SAndroid Build Coastguard Worker
2272*61046927SAndroid Build Coastguard Worker texObj = _mesa_get_texobj_by_target_and_texunit(ctx, target,
2273*61046927SAndroid Build Coastguard Worker texunit - GL_TEXTURE0,
2274*61046927SAndroid Build Coastguard Worker true,
2275*61046927SAndroid Build Coastguard Worker "glGetMultiTexLevelParameterivEXT");
2276*61046927SAndroid Build Coastguard Worker if (!texObj)
2277*61046927SAndroid Build Coastguard Worker return;
2278*61046927SAndroid Build Coastguard Worker
2279*61046927SAndroid Build Coastguard Worker if (!valid_tex_level_parameteriv_target(ctx, texObj->Target, true))
2280*61046927SAndroid Build Coastguard Worker return;
2281*61046927SAndroid Build Coastguard Worker
2282*61046927SAndroid Build Coastguard Worker get_tex_level_parameteriv(ctx, texObj, texObj->Target, level,
2283*61046927SAndroid Build Coastguard Worker pname, params, true);
2284*61046927SAndroid Build Coastguard Worker }
2285*61046927SAndroid Build Coastguard Worker
2286*61046927SAndroid Build Coastguard Worker
2287*61046927SAndroid Build Coastguard Worker /**
2288*61046927SAndroid Build Coastguard Worker * This isn't exposed to the rest of the driver because it is a part of the
2289*61046927SAndroid Build Coastguard Worker * OpenGL API that is rarely used.
2290*61046927SAndroid Build Coastguard Worker */
2291*61046927SAndroid Build Coastguard Worker static void
get_tex_parameterfv(struct gl_context * ctx,struct gl_texture_object * obj,GLenum pname,GLfloat * params,bool dsa)2292*61046927SAndroid Build Coastguard Worker get_tex_parameterfv(struct gl_context *ctx,
2293*61046927SAndroid Build Coastguard Worker struct gl_texture_object *obj,
2294*61046927SAndroid Build Coastguard Worker GLenum pname, GLfloat *params, bool dsa)
2295*61046927SAndroid Build Coastguard Worker {
2296*61046927SAndroid Build Coastguard Worker _mesa_lock_context_textures(ctx);
2297*61046927SAndroid Build Coastguard Worker switch (pname) {
2298*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAG_FILTER:
2299*61046927SAndroid Build Coastguard Worker *params = ENUM_TO_FLOAT(obj->Sampler.Attrib.MagFilter);
2300*61046927SAndroid Build Coastguard Worker break;
2301*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MIN_FILTER:
2302*61046927SAndroid Build Coastguard Worker *params = ENUM_TO_FLOAT(obj->Sampler.Attrib.MinFilter);
2303*61046927SAndroid Build Coastguard Worker break;
2304*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_S:
2305*61046927SAndroid Build Coastguard Worker *params = ENUM_TO_FLOAT(obj->Sampler.Attrib.WrapS);
2306*61046927SAndroid Build Coastguard Worker break;
2307*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_T:
2308*61046927SAndroid Build Coastguard Worker *params = ENUM_TO_FLOAT(obj->Sampler.Attrib.WrapT);
2309*61046927SAndroid Build Coastguard Worker break;
2310*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_R:
2311*61046927SAndroid Build Coastguard Worker *params = ENUM_TO_FLOAT(obj->Sampler.Attrib.WrapR);
2312*61046927SAndroid Build Coastguard Worker break;
2313*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BORDER_COLOR:
2314*61046927SAndroid Build Coastguard Worker if (_mesa_is_gles1(ctx))
2315*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2316*61046927SAndroid Build Coastguard Worker
2317*61046927SAndroid Build Coastguard Worker if (_mesa_get_clamp_fragment_color(ctx, ctx->DrawBuffer)) {
2318*61046927SAndroid Build Coastguard Worker params[0] = CLAMP(obj->Sampler.Attrib.state.border_color.f[0], 0.0F, 1.0F);
2319*61046927SAndroid Build Coastguard Worker params[1] = CLAMP(obj->Sampler.Attrib.state.border_color.f[1], 0.0F, 1.0F);
2320*61046927SAndroid Build Coastguard Worker params[2] = CLAMP(obj->Sampler.Attrib.state.border_color.f[2], 0.0F, 1.0F);
2321*61046927SAndroid Build Coastguard Worker params[3] = CLAMP(obj->Sampler.Attrib.state.border_color.f[3], 0.0F, 1.0F);
2322*61046927SAndroid Build Coastguard Worker }
2323*61046927SAndroid Build Coastguard Worker else {
2324*61046927SAndroid Build Coastguard Worker params[0] = obj->Sampler.Attrib.state.border_color.f[0];
2325*61046927SAndroid Build Coastguard Worker params[1] = obj->Sampler.Attrib.state.border_color.f[1];
2326*61046927SAndroid Build Coastguard Worker params[2] = obj->Sampler.Attrib.state.border_color.f[2];
2327*61046927SAndroid Build Coastguard Worker params[3] = obj->Sampler.Attrib.state.border_color.f[3];
2328*61046927SAndroid Build Coastguard Worker }
2329*61046927SAndroid Build Coastguard Worker break;
2330*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_RESIDENT:
2331*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
2332*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2333*61046927SAndroid Build Coastguard Worker
2334*61046927SAndroid Build Coastguard Worker *params = 1.0F;
2335*61046927SAndroid Build Coastguard Worker break;
2336*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_PRIORITY:
2337*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
2338*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2339*61046927SAndroid Build Coastguard Worker
2340*61046927SAndroid Build Coastguard Worker *params = obj->Attrib.Priority;
2341*61046927SAndroid Build Coastguard Worker break;
2342*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MIN_LOD:
2343*61046927SAndroid Build Coastguard Worker if (!_mesa_is_desktop_gl(ctx) && !_mesa_is_gles3(ctx))
2344*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2345*61046927SAndroid Build Coastguard Worker
2346*61046927SAndroid Build Coastguard Worker *params = obj->Sampler.Attrib.MinLod;
2347*61046927SAndroid Build Coastguard Worker break;
2348*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAX_LOD:
2349*61046927SAndroid Build Coastguard Worker if (!_mesa_is_desktop_gl(ctx) && !_mesa_is_gles3(ctx))
2350*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2351*61046927SAndroid Build Coastguard Worker
2352*61046927SAndroid Build Coastguard Worker *params = obj->Sampler.Attrib.MaxLod;
2353*61046927SAndroid Build Coastguard Worker break;
2354*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BASE_LEVEL:
2355*61046927SAndroid Build Coastguard Worker if (!_mesa_is_desktop_gl(ctx) && !_mesa_is_gles3(ctx))
2356*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2357*61046927SAndroid Build Coastguard Worker
2358*61046927SAndroid Build Coastguard Worker *params = (GLfloat) obj->Attrib.BaseLevel;
2359*61046927SAndroid Build Coastguard Worker break;
2360*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAX_LEVEL:
2361*61046927SAndroid Build Coastguard Worker *params = (GLfloat) obj->Attrib.MaxLevel;
2362*61046927SAndroid Build Coastguard Worker break;
2363*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAX_ANISOTROPY_EXT:
2364*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.EXT_texture_filter_anisotropic)
2365*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2366*61046927SAndroid Build Coastguard Worker *params = obj->Sampler.Attrib.MaxAnisotropy;
2367*61046927SAndroid Build Coastguard Worker break;
2368*61046927SAndroid Build Coastguard Worker case GL_GENERATE_MIPMAP_SGIS:
2369*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
2370*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2371*61046927SAndroid Build Coastguard Worker
2372*61046927SAndroid Build Coastguard Worker *params = (GLfloat) obj->Attrib.GenerateMipmap;
2373*61046927SAndroid Build Coastguard Worker break;
2374*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COMPARE_MODE_ARB:
2375*61046927SAndroid Build Coastguard Worker if ((!_mesa_is_desktop_gl(ctx) || !ctx->Extensions.ARB_shadow)
2376*61046927SAndroid Build Coastguard Worker && !_mesa_is_gles3(ctx))
2377*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2378*61046927SAndroid Build Coastguard Worker *params = (GLfloat) obj->Sampler.Attrib.CompareMode;
2379*61046927SAndroid Build Coastguard Worker break;
2380*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COMPARE_FUNC_ARB:
2381*61046927SAndroid Build Coastguard Worker if ((!_mesa_is_desktop_gl(ctx) || !ctx->Extensions.ARB_shadow)
2382*61046927SAndroid Build Coastguard Worker && !_mesa_is_gles3(ctx))
2383*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2384*61046927SAndroid Build Coastguard Worker *params = (GLfloat) obj->Sampler.Attrib.CompareFunc;
2385*61046927SAndroid Build Coastguard Worker break;
2386*61046927SAndroid Build Coastguard Worker case GL_DEPTH_TEXTURE_MODE_ARB:
2387*61046927SAndroid Build Coastguard Worker /* GL_DEPTH_TEXTURE_MODE_ARB is removed in core-profile and it has
2388*61046927SAndroid Build Coastguard Worker * never existed in OpenGL ES.
2389*61046927SAndroid Build Coastguard Worker */
2390*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
2391*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2392*61046927SAndroid Build Coastguard Worker *params = (GLfloat) obj->Attrib.DepthMode;
2393*61046927SAndroid Build Coastguard Worker break;
2394*61046927SAndroid Build Coastguard Worker case GL_DEPTH_STENCIL_TEXTURE_MODE:
2395*61046927SAndroid Build Coastguard Worker if (!_mesa_has_ARB_stencil_texturing(ctx) && !_mesa_is_gles31(ctx))
2396*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2397*61046927SAndroid Build Coastguard Worker *params = (GLfloat)
2398*61046927SAndroid Build Coastguard Worker (obj->StencilSampling ? GL_STENCIL_INDEX : GL_DEPTH_COMPONENT);
2399*61046927SAndroid Build Coastguard Worker break;
2400*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_LOD_BIAS:
2401*61046927SAndroid Build Coastguard Worker if (_mesa_is_gles(ctx))
2402*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2403*61046927SAndroid Build Coastguard Worker
2404*61046927SAndroid Build Coastguard Worker *params = obj->Sampler.Attrib.LodBias;
2405*61046927SAndroid Build Coastguard Worker break;
2406*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_CROP_RECT_OES:
2407*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGLES || !ctx->Extensions.OES_draw_texture)
2408*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2409*61046927SAndroid Build Coastguard Worker
2410*61046927SAndroid Build Coastguard Worker params[0] = (GLfloat) obj->CropRect[0];
2411*61046927SAndroid Build Coastguard Worker params[1] = (GLfloat) obj->CropRect[1];
2412*61046927SAndroid Build Coastguard Worker params[2] = (GLfloat) obj->CropRect[2];
2413*61046927SAndroid Build Coastguard Worker params[3] = (GLfloat) obj->CropRect[3];
2414*61046927SAndroid Build Coastguard Worker break;
2415*61046927SAndroid Build Coastguard Worker
2416*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SWIZZLE_R_EXT:
2417*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SWIZZLE_G_EXT:
2418*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SWIZZLE_B_EXT:
2419*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SWIZZLE_A_EXT:
2420*61046927SAndroid Build Coastguard Worker if (!_mesa_has_EXT_texture_swizzle(ctx) && !_mesa_is_gles3(ctx))
2421*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2422*61046927SAndroid Build Coastguard Worker *params = (GLfloat) obj->Attrib.Swizzle[pname - GL_TEXTURE_SWIZZLE_R_EXT];
2423*61046927SAndroid Build Coastguard Worker break;
2424*61046927SAndroid Build Coastguard Worker
2425*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SWIZZLE_RGBA_EXT:
2426*61046927SAndroid Build Coastguard Worker if (!_mesa_has_EXT_texture_swizzle(ctx) && !_mesa_is_gles3(ctx))
2427*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2428*61046927SAndroid Build Coastguard Worker for (GLuint comp = 0; comp < 4; comp++)
2429*61046927SAndroid Build Coastguard Worker params[comp] = (GLfloat) obj->Attrib.Swizzle[comp];
2430*61046927SAndroid Build Coastguard Worker break;
2431*61046927SAndroid Build Coastguard Worker
2432*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_CUBE_MAP_SEAMLESS:
2433*61046927SAndroid Build Coastguard Worker if (!_mesa_has_AMD_seamless_cubemap_per_texture(ctx))
2434*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2435*61046927SAndroid Build Coastguard Worker *params = (GLfloat) obj->Sampler.Attrib.CubeMapSeamless;
2436*61046927SAndroid Build Coastguard Worker break;
2437*61046927SAndroid Build Coastguard Worker
2438*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_IMMUTABLE_FORMAT:
2439*61046927SAndroid Build Coastguard Worker *params = (GLfloat) obj->Immutable;
2440*61046927SAndroid Build Coastguard Worker break;
2441*61046927SAndroid Build Coastguard Worker
2442*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_IMMUTABLE_LEVELS:
2443*61046927SAndroid Build Coastguard Worker if (_mesa_is_gles3(ctx) || _mesa_has_texture_view(ctx))
2444*61046927SAndroid Build Coastguard Worker *params = (GLfloat) obj->Attrib.ImmutableLevels;
2445*61046927SAndroid Build Coastguard Worker else
2446*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2447*61046927SAndroid Build Coastguard Worker break;
2448*61046927SAndroid Build Coastguard Worker
2449*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_VIEW_MIN_LEVEL:
2450*61046927SAndroid Build Coastguard Worker if (!_mesa_has_texture_view(ctx))
2451*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2452*61046927SAndroid Build Coastguard Worker *params = (GLfloat) obj->Attrib.MinLevel;
2453*61046927SAndroid Build Coastguard Worker break;
2454*61046927SAndroid Build Coastguard Worker
2455*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_VIEW_NUM_LEVELS:
2456*61046927SAndroid Build Coastguard Worker if (!_mesa_has_texture_view(ctx))
2457*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2458*61046927SAndroid Build Coastguard Worker *params = (GLfloat) obj->Attrib.NumLevels;
2459*61046927SAndroid Build Coastguard Worker break;
2460*61046927SAndroid Build Coastguard Worker
2461*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_VIEW_MIN_LAYER:
2462*61046927SAndroid Build Coastguard Worker if (!_mesa_has_texture_view(ctx))
2463*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2464*61046927SAndroid Build Coastguard Worker *params = (GLfloat) obj->Attrib.MinLayer;
2465*61046927SAndroid Build Coastguard Worker break;
2466*61046927SAndroid Build Coastguard Worker
2467*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_VIEW_NUM_LAYERS:
2468*61046927SAndroid Build Coastguard Worker if (!_mesa_has_texture_view(ctx))
2469*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2470*61046927SAndroid Build Coastguard Worker *params = (GLfloat) obj->Attrib.NumLayers;
2471*61046927SAndroid Build Coastguard Worker break;
2472*61046927SAndroid Build Coastguard Worker
2473*61046927SAndroid Build Coastguard Worker case GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES:
2474*61046927SAndroid Build Coastguard Worker if (!_mesa_is_gles(ctx) || !ctx->Extensions.OES_EGL_image_external)
2475*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2476*61046927SAndroid Build Coastguard Worker *params = (GLfloat) obj->RequiredTextureImageUnits;
2477*61046927SAndroid Build Coastguard Worker break;
2478*61046927SAndroid Build Coastguard Worker
2479*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SRGB_DECODE_EXT:
2480*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.EXT_texture_sRGB_decode)
2481*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2482*61046927SAndroid Build Coastguard Worker *params = (GLfloat) obj->Sampler.Attrib.sRGBDecode;
2483*61046927SAndroid Build Coastguard Worker break;
2484*61046927SAndroid Build Coastguard Worker
2485*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_REDUCTION_MODE_EXT:
2486*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.EXT_texture_filter_minmax &&
2487*61046927SAndroid Build Coastguard Worker !_mesa_has_ARB_texture_filter_minmax(ctx))
2488*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2489*61046927SAndroid Build Coastguard Worker *params = (GLfloat) obj->Sampler.Attrib.ReductionMode;
2490*61046927SAndroid Build Coastguard Worker break;
2491*61046927SAndroid Build Coastguard Worker
2492*61046927SAndroid Build Coastguard Worker case GL_IMAGE_FORMAT_COMPATIBILITY_TYPE:
2493*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_shader_image_load_store &&
2494*61046927SAndroid Build Coastguard Worker !_mesa_is_gles31(ctx))
2495*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2496*61046927SAndroid Build Coastguard Worker *params = (GLfloat) obj->Attrib.ImageFormatCompatibilityType;
2497*61046927SAndroid Build Coastguard Worker break;
2498*61046927SAndroid Build Coastguard Worker
2499*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_TARGET:
2500*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_CORE)
2501*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2502*61046927SAndroid Build Coastguard Worker *params = ENUM_TO_FLOAT(obj->Target);
2503*61046927SAndroid Build Coastguard Worker break;
2504*61046927SAndroid Build Coastguard Worker
2505*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_TILING_EXT:
2506*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.EXT_memory_object)
2507*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2508*61046927SAndroid Build Coastguard Worker *params = ENUM_TO_FLOAT(obj->TextureTiling);
2509*61046927SAndroid Build Coastguard Worker break;
2510*61046927SAndroid Build Coastguard Worker
2511*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SPARSE_ARB:
2512*61046927SAndroid Build Coastguard Worker if (!_mesa_has_ARB_sparse_texture(ctx))
2513*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2514*61046927SAndroid Build Coastguard Worker *params = (GLfloat) obj->IsSparse;
2515*61046927SAndroid Build Coastguard Worker break;
2516*61046927SAndroid Build Coastguard Worker
2517*61046927SAndroid Build Coastguard Worker case GL_VIRTUAL_PAGE_SIZE_INDEX_ARB:
2518*61046927SAndroid Build Coastguard Worker if (!_mesa_has_ARB_sparse_texture(ctx))
2519*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2520*61046927SAndroid Build Coastguard Worker *params = (GLfloat) obj->VirtualPageSizeIndex;
2521*61046927SAndroid Build Coastguard Worker break;
2522*61046927SAndroid Build Coastguard Worker
2523*61046927SAndroid Build Coastguard Worker case GL_NUM_SPARSE_LEVELS_ARB:
2524*61046927SAndroid Build Coastguard Worker if (!_mesa_has_ARB_sparse_texture(ctx))
2525*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2526*61046927SAndroid Build Coastguard Worker *params = (GLfloat) obj->NumSparseLevels;
2527*61046927SAndroid Build Coastguard Worker break;
2528*61046927SAndroid Build Coastguard Worker
2529*61046927SAndroid Build Coastguard Worker default:
2530*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2531*61046927SAndroid Build Coastguard Worker }
2532*61046927SAndroid Build Coastguard Worker
2533*61046927SAndroid Build Coastguard Worker /* no error if we get here */
2534*61046927SAndroid Build Coastguard Worker _mesa_unlock_context_textures(ctx);
2535*61046927SAndroid Build Coastguard Worker return;
2536*61046927SAndroid Build Coastguard Worker
2537*61046927SAndroid Build Coastguard Worker invalid_pname:
2538*61046927SAndroid Build Coastguard Worker _mesa_unlock_context_textures(ctx);
2539*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM, "glGetTex%sParameterfv(pname=0x%x)",
2540*61046927SAndroid Build Coastguard Worker dsa ? "ture" : "", pname);
2541*61046927SAndroid Build Coastguard Worker }
2542*61046927SAndroid Build Coastguard Worker
2543*61046927SAndroid Build Coastguard Worker
2544*61046927SAndroid Build Coastguard Worker static void
get_tex_parameteriv(struct gl_context * ctx,struct gl_texture_object * obj,GLenum pname,GLint * params,bool dsa)2545*61046927SAndroid Build Coastguard Worker get_tex_parameteriv(struct gl_context *ctx,
2546*61046927SAndroid Build Coastguard Worker struct gl_texture_object *obj,
2547*61046927SAndroid Build Coastguard Worker GLenum pname, GLint *params, bool dsa)
2548*61046927SAndroid Build Coastguard Worker {
2549*61046927SAndroid Build Coastguard Worker _mesa_lock_texture(ctx, obj);
2550*61046927SAndroid Build Coastguard Worker switch (pname) {
2551*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAG_FILTER:
2552*61046927SAndroid Build Coastguard Worker *params = (GLint) obj->Sampler.Attrib.MagFilter;
2553*61046927SAndroid Build Coastguard Worker break;
2554*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MIN_FILTER:
2555*61046927SAndroid Build Coastguard Worker *params = (GLint) obj->Sampler.Attrib.MinFilter;
2556*61046927SAndroid Build Coastguard Worker break;
2557*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_S:
2558*61046927SAndroid Build Coastguard Worker *params = (GLint) obj->Sampler.Attrib.WrapS;
2559*61046927SAndroid Build Coastguard Worker break;
2560*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_T:
2561*61046927SAndroid Build Coastguard Worker *params = (GLint) obj->Sampler.Attrib.WrapT;
2562*61046927SAndroid Build Coastguard Worker break;
2563*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_R:
2564*61046927SAndroid Build Coastguard Worker *params = (GLint) obj->Sampler.Attrib.WrapR;
2565*61046927SAndroid Build Coastguard Worker break;
2566*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BORDER_COLOR:
2567*61046927SAndroid Build Coastguard Worker if (_mesa_is_gles1(ctx))
2568*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2569*61046927SAndroid Build Coastguard Worker
2570*61046927SAndroid Build Coastguard Worker {
2571*61046927SAndroid Build Coastguard Worker GLfloat b[4];
2572*61046927SAndroid Build Coastguard Worker b[0] = CLAMP(obj->Sampler.Attrib.state.border_color.f[0], 0.0F, 1.0F);
2573*61046927SAndroid Build Coastguard Worker b[1] = CLAMP(obj->Sampler.Attrib.state.border_color.f[1], 0.0F, 1.0F);
2574*61046927SAndroid Build Coastguard Worker b[2] = CLAMP(obj->Sampler.Attrib.state.border_color.f[2], 0.0F, 1.0F);
2575*61046927SAndroid Build Coastguard Worker b[3] = CLAMP(obj->Sampler.Attrib.state.border_color.f[3], 0.0F, 1.0F);
2576*61046927SAndroid Build Coastguard Worker params[0] = FLOAT_TO_INT(b[0]);
2577*61046927SAndroid Build Coastguard Worker params[1] = FLOAT_TO_INT(b[1]);
2578*61046927SAndroid Build Coastguard Worker params[2] = FLOAT_TO_INT(b[2]);
2579*61046927SAndroid Build Coastguard Worker params[3] = FLOAT_TO_INT(b[3]);
2580*61046927SAndroid Build Coastguard Worker }
2581*61046927SAndroid Build Coastguard Worker break;
2582*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_RESIDENT:
2583*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
2584*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2585*61046927SAndroid Build Coastguard Worker
2586*61046927SAndroid Build Coastguard Worker *params = 1;
2587*61046927SAndroid Build Coastguard Worker break;
2588*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_PRIORITY:
2589*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
2590*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2591*61046927SAndroid Build Coastguard Worker
2592*61046927SAndroid Build Coastguard Worker *params = FLOAT_TO_INT(obj->Attrib.Priority);
2593*61046927SAndroid Build Coastguard Worker break;
2594*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MIN_LOD:
2595*61046927SAndroid Build Coastguard Worker if (!_mesa_is_desktop_gl(ctx) && !_mesa_is_gles3(ctx))
2596*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2597*61046927SAndroid Build Coastguard Worker /* GL spec 'Data Conversions' section specifies that floating-point
2598*61046927SAndroid Build Coastguard Worker * value in integer Get function is rounded to nearest integer
2599*61046927SAndroid Build Coastguard Worker *
2600*61046927SAndroid Build Coastguard Worker * Section 2.2.2 (Data Conversions For State Query Commands) of the
2601*61046927SAndroid Build Coastguard Worker * OpenGL 4.5 spec says:
2602*61046927SAndroid Build Coastguard Worker *
2603*61046927SAndroid Build Coastguard Worker * Following these steps, if a value is so large in magnitude that
2604*61046927SAndroid Build Coastguard Worker * it cannot be represented by the returned data type, then the
2605*61046927SAndroid Build Coastguard Worker * nearest value representable using that type is returned.
2606*61046927SAndroid Build Coastguard Worker */
2607*61046927SAndroid Build Coastguard Worker *params = LCLAMPF(obj->Sampler.Attrib.MinLod, INT32_MIN, INT32_MAX);
2608*61046927SAndroid Build Coastguard Worker break;
2609*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAX_LOD:
2610*61046927SAndroid Build Coastguard Worker if (!_mesa_is_desktop_gl(ctx) && !_mesa_is_gles3(ctx))
2611*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2612*61046927SAndroid Build Coastguard Worker /* GL spec 'Data Conversions' section specifies that floating-point
2613*61046927SAndroid Build Coastguard Worker * value in integer Get function is rounded to nearest integer
2614*61046927SAndroid Build Coastguard Worker *
2615*61046927SAndroid Build Coastguard Worker * Section 2.2.2 (Data Conversions For State Query Commands) of the
2616*61046927SAndroid Build Coastguard Worker * OpenGL 4.5 spec says:
2617*61046927SAndroid Build Coastguard Worker *
2618*61046927SAndroid Build Coastguard Worker * Following these steps, if a value is so large in magnitude that
2619*61046927SAndroid Build Coastguard Worker * it cannot be represented by the returned data type, then the
2620*61046927SAndroid Build Coastguard Worker * nearest value representable using that type is returned.
2621*61046927SAndroid Build Coastguard Worker */
2622*61046927SAndroid Build Coastguard Worker *params = LCLAMPF(obj->Sampler.Attrib.MaxLod, INT32_MIN, INT32_MAX);
2623*61046927SAndroid Build Coastguard Worker break;
2624*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BASE_LEVEL:
2625*61046927SAndroid Build Coastguard Worker if (!_mesa_is_desktop_gl(ctx) && !_mesa_is_gles3(ctx))
2626*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2627*61046927SAndroid Build Coastguard Worker
2628*61046927SAndroid Build Coastguard Worker *params = obj->Attrib.BaseLevel;
2629*61046927SAndroid Build Coastguard Worker break;
2630*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAX_LEVEL:
2631*61046927SAndroid Build Coastguard Worker *params = obj->Attrib.MaxLevel;
2632*61046927SAndroid Build Coastguard Worker break;
2633*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAX_ANISOTROPY_EXT:
2634*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.EXT_texture_filter_anisotropic)
2635*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2636*61046927SAndroid Build Coastguard Worker /* GL spec 'Data Conversions' section specifies that floating-point
2637*61046927SAndroid Build Coastguard Worker * value in integer Get function is rounded to nearest integer
2638*61046927SAndroid Build Coastguard Worker *
2639*61046927SAndroid Build Coastguard Worker * Section 2.2.2 (Data Conversions For State Query Commands) of the
2640*61046927SAndroid Build Coastguard Worker * OpenGL 4.5 spec says:
2641*61046927SAndroid Build Coastguard Worker *
2642*61046927SAndroid Build Coastguard Worker * Following these steps, if a value is so large in magnitude that
2643*61046927SAndroid Build Coastguard Worker * it cannot be represented by the returned data type, then the
2644*61046927SAndroid Build Coastguard Worker * nearest value representable using that type is returned.
2645*61046927SAndroid Build Coastguard Worker */
2646*61046927SAndroid Build Coastguard Worker *params = LCLAMPF(obj->Sampler.Attrib.MaxAnisotropy, INT32_MIN, INT32_MAX);
2647*61046927SAndroid Build Coastguard Worker break;
2648*61046927SAndroid Build Coastguard Worker case GL_GENERATE_MIPMAP_SGIS:
2649*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
2650*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2651*61046927SAndroid Build Coastguard Worker
2652*61046927SAndroid Build Coastguard Worker *params = (GLint) obj->Attrib.GenerateMipmap;
2653*61046927SAndroid Build Coastguard Worker break;
2654*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COMPARE_MODE_ARB:
2655*61046927SAndroid Build Coastguard Worker if ((!_mesa_is_desktop_gl(ctx) || !ctx->Extensions.ARB_shadow)
2656*61046927SAndroid Build Coastguard Worker && !_mesa_is_gles3(ctx))
2657*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2658*61046927SAndroid Build Coastguard Worker *params = (GLint) obj->Sampler.Attrib.CompareMode;
2659*61046927SAndroid Build Coastguard Worker break;
2660*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COMPARE_FUNC_ARB:
2661*61046927SAndroid Build Coastguard Worker if ((!_mesa_is_desktop_gl(ctx) || !ctx->Extensions.ARB_shadow)
2662*61046927SAndroid Build Coastguard Worker && !_mesa_is_gles3(ctx))
2663*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2664*61046927SAndroid Build Coastguard Worker *params = (GLint) obj->Sampler.Attrib.CompareFunc;
2665*61046927SAndroid Build Coastguard Worker break;
2666*61046927SAndroid Build Coastguard Worker case GL_DEPTH_TEXTURE_MODE_ARB:
2667*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
2668*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2669*61046927SAndroid Build Coastguard Worker *params = (GLint) obj->Attrib.DepthMode;
2670*61046927SAndroid Build Coastguard Worker break;
2671*61046927SAndroid Build Coastguard Worker case GL_DEPTH_STENCIL_TEXTURE_MODE:
2672*61046927SAndroid Build Coastguard Worker if (!_mesa_has_ARB_stencil_texturing(ctx) && !_mesa_is_gles31(ctx))
2673*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2674*61046927SAndroid Build Coastguard Worker *params = (GLint)
2675*61046927SAndroid Build Coastguard Worker (obj->StencilSampling ? GL_STENCIL_INDEX : GL_DEPTH_COMPONENT);
2676*61046927SAndroid Build Coastguard Worker break;
2677*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_LOD_BIAS:
2678*61046927SAndroid Build Coastguard Worker if (_mesa_is_gles(ctx))
2679*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2680*61046927SAndroid Build Coastguard Worker
2681*61046927SAndroid Build Coastguard Worker /* GL spec 'Data Conversions' section specifies that floating-point
2682*61046927SAndroid Build Coastguard Worker * value in integer Get function is rounded to nearest integer
2683*61046927SAndroid Build Coastguard Worker *
2684*61046927SAndroid Build Coastguard Worker * Section 2.2.2 (Data Conversions For State Query Commands) of the
2685*61046927SAndroid Build Coastguard Worker * OpenGL 4.5 spec says:
2686*61046927SAndroid Build Coastguard Worker *
2687*61046927SAndroid Build Coastguard Worker * Following these steps, if a value is so large in magnitude that
2688*61046927SAndroid Build Coastguard Worker * it cannot be represented by the returned data type, then the
2689*61046927SAndroid Build Coastguard Worker * nearest value representable using that type is returned.
2690*61046927SAndroid Build Coastguard Worker */
2691*61046927SAndroid Build Coastguard Worker *params = LCLAMPF(obj->Sampler.Attrib.LodBias, INT32_MIN, INT32_MAX);
2692*61046927SAndroid Build Coastguard Worker break;
2693*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_CROP_RECT_OES:
2694*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGLES || !ctx->Extensions.OES_draw_texture)
2695*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2696*61046927SAndroid Build Coastguard Worker
2697*61046927SAndroid Build Coastguard Worker params[0] = obj->CropRect[0];
2698*61046927SAndroid Build Coastguard Worker params[1] = obj->CropRect[1];
2699*61046927SAndroid Build Coastguard Worker params[2] = obj->CropRect[2];
2700*61046927SAndroid Build Coastguard Worker params[3] = obj->CropRect[3];
2701*61046927SAndroid Build Coastguard Worker break;
2702*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SWIZZLE_R_EXT:
2703*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SWIZZLE_G_EXT:
2704*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SWIZZLE_B_EXT:
2705*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SWIZZLE_A_EXT:
2706*61046927SAndroid Build Coastguard Worker if (!_mesa_has_EXT_texture_swizzle(ctx) && !_mesa_is_gles3(ctx))
2707*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2708*61046927SAndroid Build Coastguard Worker *params = obj->Attrib.Swizzle[pname - GL_TEXTURE_SWIZZLE_R_EXT];
2709*61046927SAndroid Build Coastguard Worker break;
2710*61046927SAndroid Build Coastguard Worker
2711*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SWIZZLE_RGBA_EXT:
2712*61046927SAndroid Build Coastguard Worker if (!_mesa_has_EXT_texture_swizzle(ctx) && !_mesa_is_gles3(ctx))
2713*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2714*61046927SAndroid Build Coastguard Worker COPY_4V(params, obj->Attrib.Swizzle);
2715*61046927SAndroid Build Coastguard Worker break;
2716*61046927SAndroid Build Coastguard Worker
2717*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_CUBE_MAP_SEAMLESS:
2718*61046927SAndroid Build Coastguard Worker if (_mesa_has_AMD_seamless_cubemap_per_texture(ctx))
2719*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2720*61046927SAndroid Build Coastguard Worker *params = (GLint) obj->Sampler.Attrib.CubeMapSeamless;
2721*61046927SAndroid Build Coastguard Worker break;
2722*61046927SAndroid Build Coastguard Worker
2723*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_IMMUTABLE_FORMAT:
2724*61046927SAndroid Build Coastguard Worker *params = (GLint) obj->Immutable;
2725*61046927SAndroid Build Coastguard Worker break;
2726*61046927SAndroid Build Coastguard Worker
2727*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_IMMUTABLE_LEVELS:
2728*61046927SAndroid Build Coastguard Worker if (_mesa_has_ARB_texture_view(ctx) || _mesa_is_gles3(ctx))
2729*61046927SAndroid Build Coastguard Worker *params = obj->Attrib.ImmutableLevels;
2730*61046927SAndroid Build Coastguard Worker else
2731*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2732*61046927SAndroid Build Coastguard Worker break;
2733*61046927SAndroid Build Coastguard Worker
2734*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_VIEW_MIN_LEVEL:
2735*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_texture_view)
2736*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2737*61046927SAndroid Build Coastguard Worker *params = (GLint) obj->Attrib.MinLevel;
2738*61046927SAndroid Build Coastguard Worker break;
2739*61046927SAndroid Build Coastguard Worker
2740*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_VIEW_NUM_LEVELS:
2741*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_texture_view)
2742*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2743*61046927SAndroid Build Coastguard Worker *params = (GLint) obj->Attrib.NumLevels;
2744*61046927SAndroid Build Coastguard Worker break;
2745*61046927SAndroid Build Coastguard Worker
2746*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_VIEW_MIN_LAYER:
2747*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_texture_view)
2748*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2749*61046927SAndroid Build Coastguard Worker *params = (GLint) obj->Attrib.MinLayer;
2750*61046927SAndroid Build Coastguard Worker break;
2751*61046927SAndroid Build Coastguard Worker
2752*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_VIEW_NUM_LAYERS:
2753*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_texture_view)
2754*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2755*61046927SAndroid Build Coastguard Worker *params = (GLint) obj->Attrib.NumLayers;
2756*61046927SAndroid Build Coastguard Worker break;
2757*61046927SAndroid Build Coastguard Worker
2758*61046927SAndroid Build Coastguard Worker case GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES:
2759*61046927SAndroid Build Coastguard Worker if (!_mesa_is_gles(ctx) || !ctx->Extensions.OES_EGL_image_external)
2760*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2761*61046927SAndroid Build Coastguard Worker *params = obj->RequiredTextureImageUnits;
2762*61046927SAndroid Build Coastguard Worker break;
2763*61046927SAndroid Build Coastguard Worker
2764*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SRGB_DECODE_EXT:
2765*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.EXT_texture_sRGB_decode)
2766*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2767*61046927SAndroid Build Coastguard Worker *params = obj->Sampler.Attrib.sRGBDecode;
2768*61046927SAndroid Build Coastguard Worker break;
2769*61046927SAndroid Build Coastguard Worker
2770*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_REDUCTION_MODE_EXT:
2771*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.EXT_texture_filter_minmax &&
2772*61046927SAndroid Build Coastguard Worker !_mesa_has_ARB_texture_filter_minmax(ctx))
2773*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2774*61046927SAndroid Build Coastguard Worker *params = obj->Sampler.Attrib.ReductionMode;
2775*61046927SAndroid Build Coastguard Worker break;
2776*61046927SAndroid Build Coastguard Worker
2777*61046927SAndroid Build Coastguard Worker case GL_IMAGE_FORMAT_COMPATIBILITY_TYPE:
2778*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_shader_image_load_store &&
2779*61046927SAndroid Build Coastguard Worker !_mesa_is_gles31(ctx))
2780*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2781*61046927SAndroid Build Coastguard Worker *params = obj->Attrib.ImageFormatCompatibilityType;
2782*61046927SAndroid Build Coastguard Worker break;
2783*61046927SAndroid Build Coastguard Worker
2784*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_TARGET:
2785*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_CORE)
2786*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2787*61046927SAndroid Build Coastguard Worker *params = (GLint) obj->Target;
2788*61046927SAndroid Build Coastguard Worker break;
2789*61046927SAndroid Build Coastguard Worker
2790*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_TILING_EXT:
2791*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.EXT_memory_object)
2792*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2793*61046927SAndroid Build Coastguard Worker *params = (GLint) obj->TextureTiling;
2794*61046927SAndroid Build Coastguard Worker break;
2795*61046927SAndroid Build Coastguard Worker
2796*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SPARSE_ARB:
2797*61046927SAndroid Build Coastguard Worker if (!_mesa_has_ARB_sparse_texture(ctx))
2798*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2799*61046927SAndroid Build Coastguard Worker *params = obj->IsSparse;
2800*61046927SAndroid Build Coastguard Worker break;
2801*61046927SAndroid Build Coastguard Worker
2802*61046927SAndroid Build Coastguard Worker case GL_VIRTUAL_PAGE_SIZE_INDEX_ARB:
2803*61046927SAndroid Build Coastguard Worker if (!_mesa_has_ARB_sparse_texture(ctx))
2804*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2805*61046927SAndroid Build Coastguard Worker *params = obj->VirtualPageSizeIndex;
2806*61046927SAndroid Build Coastguard Worker break;
2807*61046927SAndroid Build Coastguard Worker
2808*61046927SAndroid Build Coastguard Worker case GL_NUM_SPARSE_LEVELS_ARB:
2809*61046927SAndroid Build Coastguard Worker if (!_mesa_has_ARB_sparse_texture(ctx))
2810*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2811*61046927SAndroid Build Coastguard Worker *params = obj->NumSparseLevels;
2812*61046927SAndroid Build Coastguard Worker break;
2813*61046927SAndroid Build Coastguard Worker
2814*61046927SAndroid Build Coastguard Worker case GL_SURFACE_COMPRESSION_EXT:
2815*61046927SAndroid Build Coastguard Worker if (!_mesa_has_EXT_texture_storage_compression(ctx))
2816*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2817*61046927SAndroid Build Coastguard Worker *params = obj->CompressionRate;
2818*61046927SAndroid Build Coastguard Worker break;
2819*61046927SAndroid Build Coastguard Worker
2820*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_ASTC_DECODE_PRECISION_EXT:
2821*61046927SAndroid Build Coastguard Worker if (!_mesa_has_EXT_texture_compression_astc_decode_mode(ctx))
2822*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2823*61046927SAndroid Build Coastguard Worker *params = obj->AstcDecodePrecision;
2824*61046927SAndroid Build Coastguard Worker break;
2825*61046927SAndroid Build Coastguard Worker
2826*61046927SAndroid Build Coastguard Worker default:
2827*61046927SAndroid Build Coastguard Worker goto invalid_pname;
2828*61046927SAndroid Build Coastguard Worker }
2829*61046927SAndroid Build Coastguard Worker
2830*61046927SAndroid Build Coastguard Worker /* no error if we get here */
2831*61046927SAndroid Build Coastguard Worker _mesa_unlock_texture(ctx, obj);
2832*61046927SAndroid Build Coastguard Worker return;
2833*61046927SAndroid Build Coastguard Worker
2834*61046927SAndroid Build Coastguard Worker invalid_pname:
2835*61046927SAndroid Build Coastguard Worker _mesa_unlock_texture(ctx, obj);
2836*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM, "glGetTex%sParameteriv(pname=0x%x)",
2837*61046927SAndroid Build Coastguard Worker dsa ? "ture" : "", pname);
2838*61046927SAndroid Build Coastguard Worker }
2839*61046927SAndroid Build Coastguard Worker
2840*61046927SAndroid Build Coastguard Worker static void
get_tex_parameterIiv(struct gl_context * ctx,struct gl_texture_object * obj,GLenum pname,GLint * params,bool dsa)2841*61046927SAndroid Build Coastguard Worker get_tex_parameterIiv(struct gl_context *ctx,
2842*61046927SAndroid Build Coastguard Worker struct gl_texture_object *obj,
2843*61046927SAndroid Build Coastguard Worker GLenum pname, GLint *params, bool dsa)
2844*61046927SAndroid Build Coastguard Worker {
2845*61046927SAndroid Build Coastguard Worker switch (pname) {
2846*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BORDER_COLOR:
2847*61046927SAndroid Build Coastguard Worker COPY_4V(params, obj->Sampler.Attrib.state.border_color.i);
2848*61046927SAndroid Build Coastguard Worker break;
2849*61046927SAndroid Build Coastguard Worker default:
2850*61046927SAndroid Build Coastguard Worker get_tex_parameteriv(ctx, obj, pname, params, dsa);
2851*61046927SAndroid Build Coastguard Worker }
2852*61046927SAndroid Build Coastguard Worker }
2853*61046927SAndroid Build Coastguard Worker
2854*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetTexParameterfv(GLenum target,GLenum pname,GLfloat * params)2855*61046927SAndroid Build Coastguard Worker _mesa_GetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)
2856*61046927SAndroid Build Coastguard Worker {
2857*61046927SAndroid Build Coastguard Worker struct gl_texture_object *obj;
2858*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
2859*61046927SAndroid Build Coastguard Worker
2860*61046927SAndroid Build Coastguard Worker obj = _mesa_get_texobj_by_target_and_texunit(ctx, target,
2861*61046927SAndroid Build Coastguard Worker ctx->Texture.CurrentUnit,
2862*61046927SAndroid Build Coastguard Worker false,
2863*61046927SAndroid Build Coastguard Worker "glGetTexParameterfv");
2864*61046927SAndroid Build Coastguard Worker if (!obj)
2865*61046927SAndroid Build Coastguard Worker return;
2866*61046927SAndroid Build Coastguard Worker
2867*61046927SAndroid Build Coastguard Worker get_tex_parameterfv(ctx, obj, pname, params, false);
2868*61046927SAndroid Build Coastguard Worker }
2869*61046927SAndroid Build Coastguard Worker
2870*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetTexParameteriv(GLenum target,GLenum pname,GLint * params)2871*61046927SAndroid Build Coastguard Worker _mesa_GetTexParameteriv(GLenum target, GLenum pname, GLint *params)
2872*61046927SAndroid Build Coastguard Worker {
2873*61046927SAndroid Build Coastguard Worker struct gl_texture_object *obj;
2874*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
2875*61046927SAndroid Build Coastguard Worker
2876*61046927SAndroid Build Coastguard Worker obj = _mesa_get_texobj_by_target_and_texunit(ctx, target,
2877*61046927SAndroid Build Coastguard Worker ctx->Texture.CurrentUnit,
2878*61046927SAndroid Build Coastguard Worker false,
2879*61046927SAndroid Build Coastguard Worker "glGetTexParameteriv");
2880*61046927SAndroid Build Coastguard Worker if (!obj)
2881*61046927SAndroid Build Coastguard Worker return;
2882*61046927SAndroid Build Coastguard Worker
2883*61046927SAndroid Build Coastguard Worker get_tex_parameteriv(ctx, obj, pname, params, false);
2884*61046927SAndroid Build Coastguard Worker }
2885*61046927SAndroid Build Coastguard Worker
2886*61046927SAndroid Build Coastguard Worker /** New in GL 3.0 */
2887*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetTexParameterIiv(GLenum target,GLenum pname,GLint * params)2888*61046927SAndroid Build Coastguard Worker _mesa_GetTexParameterIiv(GLenum target, GLenum pname, GLint *params)
2889*61046927SAndroid Build Coastguard Worker {
2890*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
2891*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
2892*61046927SAndroid Build Coastguard Worker
2893*61046927SAndroid Build Coastguard Worker texObj = _mesa_get_texobj_by_target_and_texunit(ctx, target,
2894*61046927SAndroid Build Coastguard Worker ctx->Texture.CurrentUnit,
2895*61046927SAndroid Build Coastguard Worker false,
2896*61046927SAndroid Build Coastguard Worker "glGetTexParameterIiv");
2897*61046927SAndroid Build Coastguard Worker if (!texObj)
2898*61046927SAndroid Build Coastguard Worker return;
2899*61046927SAndroid Build Coastguard Worker
2900*61046927SAndroid Build Coastguard Worker get_tex_parameterIiv(ctx, texObj, pname, params, false);
2901*61046927SAndroid Build Coastguard Worker }
2902*61046927SAndroid Build Coastguard Worker
2903*61046927SAndroid Build Coastguard Worker
2904*61046927SAndroid Build Coastguard Worker /** New in GL 3.0 */
2905*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetTexParameterIuiv(GLenum target,GLenum pname,GLuint * params)2906*61046927SAndroid Build Coastguard Worker _mesa_GetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params)
2907*61046927SAndroid Build Coastguard Worker {
2908*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
2909*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
2910*61046927SAndroid Build Coastguard Worker
2911*61046927SAndroid Build Coastguard Worker texObj = _mesa_get_texobj_by_target_and_texunit(ctx, target,
2912*61046927SAndroid Build Coastguard Worker ctx->Texture.CurrentUnit,
2913*61046927SAndroid Build Coastguard Worker false,
2914*61046927SAndroid Build Coastguard Worker "glGetTexParameterIuiv");
2915*61046927SAndroid Build Coastguard Worker if (!texObj)
2916*61046927SAndroid Build Coastguard Worker return;
2917*61046927SAndroid Build Coastguard Worker
2918*61046927SAndroid Build Coastguard Worker get_tex_parameterIiv(ctx, texObj, pname, (GLint *) params, false);
2919*61046927SAndroid Build Coastguard Worker }
2920*61046927SAndroid Build Coastguard Worker
2921*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetTextureParameterfvEXT(GLuint texture,GLenum target,GLenum pname,GLfloat * params)2922*61046927SAndroid Build Coastguard Worker _mesa_GetTextureParameterfvEXT(GLuint texture, GLenum target, GLenum pname, GLfloat *params)
2923*61046927SAndroid Build Coastguard Worker {
2924*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
2925*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
2926*61046927SAndroid Build Coastguard Worker
2927*61046927SAndroid Build Coastguard Worker texObj = _mesa_lookup_or_create_texture(ctx, target, texture, false, true,
2928*61046927SAndroid Build Coastguard Worker "glGetTextureParameterfvEXT");
2929*61046927SAndroid Build Coastguard Worker if (!texObj)
2930*61046927SAndroid Build Coastguard Worker return;
2931*61046927SAndroid Build Coastguard Worker
2932*61046927SAndroid Build Coastguard Worker if (!is_texparameteri_target_valid(texObj->Target)) {
2933*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTextureParameterfvEXT");
2934*61046927SAndroid Build Coastguard Worker return;
2935*61046927SAndroid Build Coastguard Worker }
2936*61046927SAndroid Build Coastguard Worker
2937*61046927SAndroid Build Coastguard Worker get_tex_parameterfv(ctx, texObj, pname, params, true);
2938*61046927SAndroid Build Coastguard Worker }
2939*61046927SAndroid Build Coastguard Worker
2940*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetMultiTexParameterfvEXT(GLenum texunit,GLenum target,GLenum pname,GLfloat * params)2941*61046927SAndroid Build Coastguard Worker _mesa_GetMultiTexParameterfvEXT(GLenum texunit, GLenum target, GLenum pname, GLfloat *params)
2942*61046927SAndroid Build Coastguard Worker {
2943*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
2944*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
2945*61046927SAndroid Build Coastguard Worker
2946*61046927SAndroid Build Coastguard Worker texObj = _mesa_get_texobj_by_target_and_texunit(ctx, target,
2947*61046927SAndroid Build Coastguard Worker texunit - GL_TEXTURE0,
2948*61046927SAndroid Build Coastguard Worker false,
2949*61046927SAndroid Build Coastguard Worker "glGetMultiTexParameterfvEXT");
2950*61046927SAndroid Build Coastguard Worker if (!texObj)
2951*61046927SAndroid Build Coastguard Worker return;
2952*61046927SAndroid Build Coastguard Worker
2953*61046927SAndroid Build Coastguard Worker if (!is_texparameteri_target_valid(texObj->Target)) {
2954*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_OPERATION, "glGetMultiTexParameterfvEXT");
2955*61046927SAndroid Build Coastguard Worker return;
2956*61046927SAndroid Build Coastguard Worker }
2957*61046927SAndroid Build Coastguard Worker get_tex_parameterfv(ctx, texObj, pname, params, true);
2958*61046927SAndroid Build Coastguard Worker }
2959*61046927SAndroid Build Coastguard Worker
2960*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetTextureParameterfv(GLuint texture,GLenum pname,GLfloat * params)2961*61046927SAndroid Build Coastguard Worker _mesa_GetTextureParameterfv(GLuint texture, GLenum pname, GLfloat *params)
2962*61046927SAndroid Build Coastguard Worker {
2963*61046927SAndroid Build Coastguard Worker struct gl_texture_object *obj;
2964*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
2965*61046927SAndroid Build Coastguard Worker
2966*61046927SAndroid Build Coastguard Worker obj = get_texobj_by_name(ctx, texture, "glGetTextureParameterfv");
2967*61046927SAndroid Build Coastguard Worker if (!obj)
2968*61046927SAndroid Build Coastguard Worker return;
2969*61046927SAndroid Build Coastguard Worker
2970*61046927SAndroid Build Coastguard Worker get_tex_parameterfv(ctx, obj, pname, params, true);
2971*61046927SAndroid Build Coastguard Worker }
2972*61046927SAndroid Build Coastguard Worker
2973*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetTextureParameterivEXT(GLuint texture,GLenum target,GLenum pname,GLint * params)2974*61046927SAndroid Build Coastguard Worker _mesa_GetTextureParameterivEXT(GLuint texture, GLenum target, GLenum pname, GLint *params)
2975*61046927SAndroid Build Coastguard Worker {
2976*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
2977*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
2978*61046927SAndroid Build Coastguard Worker
2979*61046927SAndroid Build Coastguard Worker texObj = _mesa_lookup_or_create_texture(ctx, target, texture, false, true,
2980*61046927SAndroid Build Coastguard Worker "glGetTextureParameterivEXT");
2981*61046927SAndroid Build Coastguard Worker if (!texObj)
2982*61046927SAndroid Build Coastguard Worker return;
2983*61046927SAndroid Build Coastguard Worker
2984*61046927SAndroid Build Coastguard Worker if (!is_texparameteri_target_valid(texObj->Target)) {
2985*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTextureParameterivEXT");
2986*61046927SAndroid Build Coastguard Worker return;
2987*61046927SAndroid Build Coastguard Worker }
2988*61046927SAndroid Build Coastguard Worker get_tex_parameteriv(ctx, texObj, pname, params, true);
2989*61046927SAndroid Build Coastguard Worker }
2990*61046927SAndroid Build Coastguard Worker
2991*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetMultiTexParameterivEXT(GLenum texunit,GLenum target,GLenum pname,GLint * params)2992*61046927SAndroid Build Coastguard Worker _mesa_GetMultiTexParameterivEXT(GLenum texunit, GLenum target, GLenum pname, GLint *params)
2993*61046927SAndroid Build Coastguard Worker {
2994*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
2995*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
2996*61046927SAndroid Build Coastguard Worker
2997*61046927SAndroid Build Coastguard Worker texObj = _mesa_get_texobj_by_target_and_texunit(ctx, target,
2998*61046927SAndroid Build Coastguard Worker texunit - GL_TEXTURE0,
2999*61046927SAndroid Build Coastguard Worker false,
3000*61046927SAndroid Build Coastguard Worker "glGetMultiTexParameterivEXT");
3001*61046927SAndroid Build Coastguard Worker if (!texObj)
3002*61046927SAndroid Build Coastguard Worker return;
3003*61046927SAndroid Build Coastguard Worker
3004*61046927SAndroid Build Coastguard Worker if (!is_texparameteri_target_valid(texObj->Target)) {
3005*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_OPERATION, "glGetMultiTexParameterivEXT");
3006*61046927SAndroid Build Coastguard Worker return;
3007*61046927SAndroid Build Coastguard Worker }
3008*61046927SAndroid Build Coastguard Worker get_tex_parameteriv(ctx, texObj, pname, params, true);
3009*61046927SAndroid Build Coastguard Worker }
3010*61046927SAndroid Build Coastguard Worker
3011*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetTextureParameteriv(GLuint texture,GLenum pname,GLint * params)3012*61046927SAndroid Build Coastguard Worker _mesa_GetTextureParameteriv(GLuint texture, GLenum pname, GLint *params)
3013*61046927SAndroid Build Coastguard Worker {
3014*61046927SAndroid Build Coastguard Worker struct gl_texture_object *obj;
3015*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
3016*61046927SAndroid Build Coastguard Worker
3017*61046927SAndroid Build Coastguard Worker obj = get_texobj_by_name(ctx, texture, "glGetTextureParameteriv");
3018*61046927SAndroid Build Coastguard Worker if (!obj)
3019*61046927SAndroid Build Coastguard Worker return;
3020*61046927SAndroid Build Coastguard Worker
3021*61046927SAndroid Build Coastguard Worker get_tex_parameteriv(ctx, obj, pname, params, true);
3022*61046927SAndroid Build Coastguard Worker }
3023*61046927SAndroid Build Coastguard Worker
3024*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetTextureParameterIiv(GLuint texture,GLenum pname,GLint * params)3025*61046927SAndroid Build Coastguard Worker _mesa_GetTextureParameterIiv(GLuint texture, GLenum pname, GLint *params)
3026*61046927SAndroid Build Coastguard Worker {
3027*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
3028*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
3029*61046927SAndroid Build Coastguard Worker
3030*61046927SAndroid Build Coastguard Worker texObj = get_texobj_by_name(ctx, texture, "glGetTextureParameterIiv");
3031*61046927SAndroid Build Coastguard Worker if (!texObj)
3032*61046927SAndroid Build Coastguard Worker return;
3033*61046927SAndroid Build Coastguard Worker
3034*61046927SAndroid Build Coastguard Worker get_tex_parameterIiv(ctx, texObj, pname, params, true);
3035*61046927SAndroid Build Coastguard Worker }
3036*61046927SAndroid Build Coastguard Worker
3037*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetTextureParameterIivEXT(GLuint texture,GLenum target,GLenum pname,GLint * params)3038*61046927SAndroid Build Coastguard Worker _mesa_GetTextureParameterIivEXT(GLuint texture, GLenum target, GLenum pname, GLint *params)
3039*61046927SAndroid Build Coastguard Worker {
3040*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
3041*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
3042*61046927SAndroid Build Coastguard Worker
3043*61046927SAndroid Build Coastguard Worker texObj = _mesa_lookup_or_create_texture(ctx, target, texture, false, true,
3044*61046927SAndroid Build Coastguard Worker "glGetTextureParameterIivEXT");
3045*61046927SAndroid Build Coastguard Worker if (!texObj)
3046*61046927SAndroid Build Coastguard Worker return;
3047*61046927SAndroid Build Coastguard Worker
3048*61046927SAndroid Build Coastguard Worker
3049*61046927SAndroid Build Coastguard Worker get_tex_parameterIiv(ctx, texObj, pname, params, true);
3050*61046927SAndroid Build Coastguard Worker }
3051*61046927SAndroid Build Coastguard Worker
3052*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetMultiTexParameterIivEXT(GLenum texunit,GLenum target,GLenum pname,GLint * params)3053*61046927SAndroid Build Coastguard Worker _mesa_GetMultiTexParameterIivEXT(GLenum texunit, GLenum target, GLenum pname,
3054*61046927SAndroid Build Coastguard Worker GLint *params)
3055*61046927SAndroid Build Coastguard Worker {
3056*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
3057*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
3058*61046927SAndroid Build Coastguard Worker
3059*61046927SAndroid Build Coastguard Worker texObj = _mesa_get_texobj_by_target_and_texunit(ctx, target,
3060*61046927SAndroid Build Coastguard Worker texunit - GL_TEXTURE0,
3061*61046927SAndroid Build Coastguard Worker true,
3062*61046927SAndroid Build Coastguard Worker "glGetMultiTexParameterIiv");
3063*61046927SAndroid Build Coastguard Worker if (!texObj)
3064*61046927SAndroid Build Coastguard Worker return;
3065*61046927SAndroid Build Coastguard Worker
3066*61046927SAndroid Build Coastguard Worker get_tex_parameterIiv(ctx, texObj, pname, params, true);
3067*61046927SAndroid Build Coastguard Worker }
3068*61046927SAndroid Build Coastguard Worker
3069*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetTextureParameterIuiv(GLuint texture,GLenum pname,GLuint * params)3070*61046927SAndroid Build Coastguard Worker _mesa_GetTextureParameterIuiv(GLuint texture, GLenum pname, GLuint *params)
3071*61046927SAndroid Build Coastguard Worker {
3072*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
3073*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
3074*61046927SAndroid Build Coastguard Worker
3075*61046927SAndroid Build Coastguard Worker texObj = get_texobj_by_name(ctx, texture, "glGetTextureParameterIuiv");
3076*61046927SAndroid Build Coastguard Worker if (!texObj)
3077*61046927SAndroid Build Coastguard Worker return;
3078*61046927SAndroid Build Coastguard Worker
3079*61046927SAndroid Build Coastguard Worker get_tex_parameterIiv(ctx, texObj, pname, (GLint *) params, true);
3080*61046927SAndroid Build Coastguard Worker }
3081*61046927SAndroid Build Coastguard Worker
3082*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetTextureParameterIuivEXT(GLuint texture,GLenum target,GLenum pname,GLuint * params)3083*61046927SAndroid Build Coastguard Worker _mesa_GetTextureParameterIuivEXT(GLuint texture, GLenum target, GLenum pname,
3084*61046927SAndroid Build Coastguard Worker GLuint *params)
3085*61046927SAndroid Build Coastguard Worker {
3086*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
3087*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
3088*61046927SAndroid Build Coastguard Worker
3089*61046927SAndroid Build Coastguard Worker texObj = _mesa_lookup_or_create_texture(ctx, target, texture, false, true,
3090*61046927SAndroid Build Coastguard Worker "glGetTextureParameterIuvEXT");
3091*61046927SAndroid Build Coastguard Worker if (!texObj)
3092*61046927SAndroid Build Coastguard Worker return;
3093*61046927SAndroid Build Coastguard Worker
3094*61046927SAndroid Build Coastguard Worker get_tex_parameterIiv(ctx, texObj, pname, (GLint *) params, true);
3095*61046927SAndroid Build Coastguard Worker }
3096*61046927SAndroid Build Coastguard Worker
3097*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetMultiTexParameterIuivEXT(GLenum texunit,GLenum target,GLenum pname,GLuint * params)3098*61046927SAndroid Build Coastguard Worker _mesa_GetMultiTexParameterIuivEXT(GLenum texunit, GLenum target, GLenum pname,
3099*61046927SAndroid Build Coastguard Worker GLuint *params)
3100*61046927SAndroid Build Coastguard Worker {
3101*61046927SAndroid Build Coastguard Worker struct gl_texture_object *texObj;
3102*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
3103*61046927SAndroid Build Coastguard Worker
3104*61046927SAndroid Build Coastguard Worker texObj = _mesa_get_texobj_by_target_and_texunit(ctx, target,
3105*61046927SAndroid Build Coastguard Worker texunit - GL_TEXTURE0,
3106*61046927SAndroid Build Coastguard Worker true,
3107*61046927SAndroid Build Coastguard Worker "glGetMultiTexParameterIuiv");
3108*61046927SAndroid Build Coastguard Worker if (!texObj)
3109*61046927SAndroid Build Coastguard Worker return;
3110*61046927SAndroid Build Coastguard Worker
3111*61046927SAndroid Build Coastguard Worker get_tex_parameterIiv(ctx, texObj, pname, (GLint *) params, true);
3112*61046927SAndroid Build Coastguard Worker }
3113