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) 2011 VMware, Inc. All Rights Reserved.
5*61046927SAndroid Build Coastguard Worker *
6*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
7*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
8*61046927SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
9*61046927SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10*61046927SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
11*61046927SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
12*61046927SAndroid Build Coastguard Worker *
13*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice shall be included
14*61046927SAndroid Build Coastguard Worker * in all copies or substantial portions of the Software.
15*61046927SAndroid Build Coastguard Worker *
16*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17*61046927SAndroid Build Coastguard Worker * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19*61046927SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20*61046927SAndroid Build Coastguard Worker * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21*61046927SAndroid Build Coastguard Worker * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22*61046927SAndroid Build Coastguard Worker * OTHER DEALINGS IN THE SOFTWARE.
23*61046927SAndroid Build Coastguard Worker */
24*61046927SAndroid Build Coastguard Worker
25*61046927SAndroid Build Coastguard Worker
26*61046927SAndroid Build Coastguard Worker /**
27*61046927SAndroid Build Coastguard Worker * \file samplerobj.c
28*61046927SAndroid Build Coastguard Worker * \brief Functions for the GL_ARB_sampler_objects extension.
29*61046927SAndroid Build Coastguard Worker * \author Brian Paul
30*61046927SAndroid Build Coastguard Worker */
31*61046927SAndroid Build Coastguard Worker
32*61046927SAndroid Build Coastguard Worker
33*61046927SAndroid Build Coastguard Worker #include "util/glheader.h"
34*61046927SAndroid Build Coastguard Worker #include "main/context.h"
35*61046927SAndroid Build Coastguard Worker #include "main/enums.h"
36*61046927SAndroid Build Coastguard Worker #include "main/hash.h"
37*61046927SAndroid Build Coastguard Worker #include "main/macros.h"
38*61046927SAndroid Build Coastguard Worker #include "main/mtypes.h"
39*61046927SAndroid Build Coastguard Worker #include "main/samplerobj.h"
40*61046927SAndroid Build Coastguard Worker #include "main/texturebindless.h"
41*61046927SAndroid Build Coastguard Worker #include "util/u_memory.h"
42*61046927SAndroid Build Coastguard Worker #include "api_exec_decl.h"
43*61046927SAndroid Build Coastguard Worker
44*61046927SAndroid Build Coastguard Worker /* Take advantage of how the enums are defined. */
45*61046927SAndroid Build Coastguard Worker const enum pipe_tex_wrap wrap_to_gallium_table[32] = {
46*61046927SAndroid Build Coastguard Worker [GL_REPEAT & 0x1f] = PIPE_TEX_WRAP_REPEAT,
47*61046927SAndroid Build Coastguard Worker [GL_CLAMP & 0x1f] = PIPE_TEX_WRAP_CLAMP,
48*61046927SAndroid Build Coastguard Worker [GL_CLAMP_TO_EDGE & 0x1f] = PIPE_TEX_WRAP_CLAMP_TO_EDGE,
49*61046927SAndroid Build Coastguard Worker [GL_CLAMP_TO_BORDER & 0x1f] = PIPE_TEX_WRAP_CLAMP_TO_BORDER,
50*61046927SAndroid Build Coastguard Worker [GL_MIRRORED_REPEAT & 0x1f] = PIPE_TEX_WRAP_MIRROR_REPEAT,
51*61046927SAndroid Build Coastguard Worker [GL_MIRROR_CLAMP_EXT & 0x1f] = PIPE_TEX_WRAP_MIRROR_CLAMP,
52*61046927SAndroid Build Coastguard Worker [GL_MIRROR_CLAMP_TO_EDGE & 0x1f] = PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE,
53*61046927SAndroid Build Coastguard Worker [GL_MIRROR_CLAMP_TO_BORDER_EXT & 0x1f] = PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER,
54*61046927SAndroid Build Coastguard Worker };
55*61046927SAndroid Build Coastguard Worker
56*61046927SAndroid Build Coastguard Worker struct gl_sampler_object *
_mesa_lookup_samplerobj(struct gl_context * ctx,GLuint name)57*61046927SAndroid Build Coastguard Worker _mesa_lookup_samplerobj(struct gl_context *ctx, GLuint name)
58*61046927SAndroid Build Coastguard Worker {
59*61046927SAndroid Build Coastguard Worker if (name == 0)
60*61046927SAndroid Build Coastguard Worker return NULL;
61*61046927SAndroid Build Coastguard Worker else
62*61046927SAndroid Build Coastguard Worker return (struct gl_sampler_object *)
63*61046927SAndroid Build Coastguard Worker _mesa_HashLookup(&ctx->Shared->SamplerObjects, name);
64*61046927SAndroid Build Coastguard Worker }
65*61046927SAndroid Build Coastguard Worker
66*61046927SAndroid Build Coastguard Worker static inline struct gl_sampler_object *
lookup_samplerobj_locked(struct gl_context * ctx,GLuint name)67*61046927SAndroid Build Coastguard Worker lookup_samplerobj_locked(struct gl_context *ctx, GLuint name)
68*61046927SAndroid Build Coastguard Worker {
69*61046927SAndroid Build Coastguard Worker return (struct gl_sampler_object *)
70*61046927SAndroid Build Coastguard Worker _mesa_HashLookupLocked(&ctx->Shared->SamplerObjects, name);
71*61046927SAndroid Build Coastguard Worker }
72*61046927SAndroid Build Coastguard Worker
73*61046927SAndroid Build Coastguard Worker static void
delete_sampler_object(struct gl_context * ctx,struct gl_sampler_object * sampObj)74*61046927SAndroid Build Coastguard Worker delete_sampler_object(struct gl_context *ctx,
75*61046927SAndroid Build Coastguard Worker struct gl_sampler_object *sampObj)
76*61046927SAndroid Build Coastguard Worker {
77*61046927SAndroid Build Coastguard Worker _mesa_delete_sampler_handles(ctx, sampObj);
78*61046927SAndroid Build Coastguard Worker free(sampObj->Label);
79*61046927SAndroid Build Coastguard Worker FREE(sampObj);
80*61046927SAndroid Build Coastguard Worker }
81*61046927SAndroid Build Coastguard Worker
82*61046927SAndroid Build Coastguard Worker /**
83*61046927SAndroid Build Coastguard Worker * Handle reference counting.
84*61046927SAndroid Build Coastguard Worker */
85*61046927SAndroid Build Coastguard Worker void
_mesa_reference_sampler_object_(struct gl_context * ctx,struct gl_sampler_object ** ptr,struct gl_sampler_object * samp)86*61046927SAndroid Build Coastguard Worker _mesa_reference_sampler_object_(struct gl_context *ctx,
87*61046927SAndroid Build Coastguard Worker struct gl_sampler_object **ptr,
88*61046927SAndroid Build Coastguard Worker struct gl_sampler_object *samp)
89*61046927SAndroid Build Coastguard Worker {
90*61046927SAndroid Build Coastguard Worker assert(*ptr != samp); /* The inline wrapper should prevent no-op calls */
91*61046927SAndroid Build Coastguard Worker
92*61046927SAndroid Build Coastguard Worker if (*ptr) {
93*61046927SAndroid Build Coastguard Worker /* Unreference the old sampler */
94*61046927SAndroid Build Coastguard Worker struct gl_sampler_object *oldSamp = *ptr;
95*61046927SAndroid Build Coastguard Worker
96*61046927SAndroid Build Coastguard Worker assert(oldSamp->RefCount > 0);
97*61046927SAndroid Build Coastguard Worker
98*61046927SAndroid Build Coastguard Worker if (p_atomic_dec_zero(&oldSamp->RefCount))
99*61046927SAndroid Build Coastguard Worker delete_sampler_object(ctx, oldSamp);
100*61046927SAndroid Build Coastguard Worker }
101*61046927SAndroid Build Coastguard Worker
102*61046927SAndroid Build Coastguard Worker if (samp) {
103*61046927SAndroid Build Coastguard Worker /* reference new sampler */
104*61046927SAndroid Build Coastguard Worker assert(samp->RefCount > 0);
105*61046927SAndroid Build Coastguard Worker
106*61046927SAndroid Build Coastguard Worker p_atomic_inc(&samp->RefCount);
107*61046927SAndroid Build Coastguard Worker }
108*61046927SAndroid Build Coastguard Worker
109*61046927SAndroid Build Coastguard Worker *ptr = samp;
110*61046927SAndroid Build Coastguard Worker }
111*61046927SAndroid Build Coastguard Worker
112*61046927SAndroid Build Coastguard Worker
113*61046927SAndroid Build Coastguard Worker /**
114*61046927SAndroid Build Coastguard Worker * Initialize the fields of the given sampler object.
115*61046927SAndroid Build Coastguard Worker */
116*61046927SAndroid Build Coastguard Worker static void
_mesa_init_sampler_object(struct gl_sampler_object * sampObj,GLuint name)117*61046927SAndroid Build Coastguard Worker _mesa_init_sampler_object(struct gl_sampler_object *sampObj, GLuint name)
118*61046927SAndroid Build Coastguard Worker {
119*61046927SAndroid Build Coastguard Worker sampObj->Name = name;
120*61046927SAndroid Build Coastguard Worker sampObj->RefCount = 1;
121*61046927SAndroid Build Coastguard Worker sampObj->Attrib.WrapS = GL_REPEAT;
122*61046927SAndroid Build Coastguard Worker sampObj->Attrib.WrapT = GL_REPEAT;
123*61046927SAndroid Build Coastguard Worker sampObj->Attrib.WrapR = GL_REPEAT;
124*61046927SAndroid Build Coastguard Worker sampObj->Attrib.state.wrap_s = PIPE_TEX_WRAP_REPEAT;
125*61046927SAndroid Build Coastguard Worker sampObj->Attrib.state.wrap_t = PIPE_TEX_WRAP_REPEAT;
126*61046927SAndroid Build Coastguard Worker sampObj->Attrib.state.wrap_r = PIPE_TEX_WRAP_REPEAT;
127*61046927SAndroid Build Coastguard Worker sampObj->Attrib.MinFilter = GL_NEAREST_MIPMAP_LINEAR;
128*61046927SAndroid Build Coastguard Worker sampObj->Attrib.MagFilter = GL_LINEAR;
129*61046927SAndroid Build Coastguard Worker sampObj->Attrib.state.min_img_filter = PIPE_TEX_FILTER_NEAREST;
130*61046927SAndroid Build Coastguard Worker sampObj->Attrib.state.min_mip_filter = PIPE_TEX_MIPFILTER_LINEAR;
131*61046927SAndroid Build Coastguard Worker sampObj->Attrib.state.mag_img_filter = PIPE_TEX_FILTER_LINEAR;
132*61046927SAndroid Build Coastguard Worker sampObj->Attrib.state.border_color.f[0] = 0;
133*61046927SAndroid Build Coastguard Worker sampObj->Attrib.state.border_color.f[1] = 0;
134*61046927SAndroid Build Coastguard Worker sampObj->Attrib.state.border_color.f[2] = 0;
135*61046927SAndroid Build Coastguard Worker sampObj->Attrib.state.border_color.f[3] = 0;
136*61046927SAndroid Build Coastguard Worker _mesa_update_is_border_color_nonzero(sampObj);
137*61046927SAndroid Build Coastguard Worker sampObj->Attrib.MinLod = -1000.0F;
138*61046927SAndroid Build Coastguard Worker sampObj->Attrib.MaxLod = 1000.0F;
139*61046927SAndroid Build Coastguard Worker sampObj->Attrib.state.min_lod = 0; /* Gallium doesn't allow negative numbers */
140*61046927SAndroid Build Coastguard Worker sampObj->Attrib.state.max_lod = 1000;
141*61046927SAndroid Build Coastguard Worker sampObj->Attrib.LodBias = 0.0F;
142*61046927SAndroid Build Coastguard Worker sampObj->Attrib.state.lod_bias = 0;
143*61046927SAndroid Build Coastguard Worker sampObj->Attrib.MaxAnisotropy = 1.0F;
144*61046927SAndroid Build Coastguard Worker sampObj->Attrib.state.max_anisotropy = 0; /* Gallium uses 0 instead of 1. */
145*61046927SAndroid Build Coastguard Worker sampObj->Attrib.CompareMode = GL_NONE;
146*61046927SAndroid Build Coastguard Worker sampObj->Attrib.CompareFunc = GL_LEQUAL;
147*61046927SAndroid Build Coastguard Worker sampObj->Attrib.state.compare_mode = PIPE_TEX_COMPARE_NONE;
148*61046927SAndroid Build Coastguard Worker sampObj->Attrib.state.compare_func = PIPE_FUNC_LEQUAL;
149*61046927SAndroid Build Coastguard Worker sampObj->Attrib.sRGBDecode = GL_DECODE_EXT;
150*61046927SAndroid Build Coastguard Worker sampObj->Attrib.CubeMapSeamless = GL_FALSE;
151*61046927SAndroid Build Coastguard Worker sampObj->Attrib.state.seamless_cube_map = false;
152*61046927SAndroid Build Coastguard Worker sampObj->Attrib.ReductionMode = GL_WEIGHTED_AVERAGE_EXT;
153*61046927SAndroid Build Coastguard Worker sampObj->Attrib.state.reduction_mode = PIPE_TEX_REDUCTION_WEIGHTED_AVERAGE;
154*61046927SAndroid Build Coastguard Worker sampObj->HandleAllocated = GL_FALSE;
155*61046927SAndroid Build Coastguard Worker
156*61046927SAndroid Build Coastguard Worker /* GL_ARB_bindless_texture */
157*61046927SAndroid Build Coastguard Worker _mesa_init_sampler_handles(sampObj);
158*61046927SAndroid Build Coastguard Worker }
159*61046927SAndroid Build Coastguard Worker
160*61046927SAndroid Build Coastguard Worker static struct gl_sampler_object *
_mesa_new_sampler_object(struct gl_context * ctx,GLuint name)161*61046927SAndroid Build Coastguard Worker _mesa_new_sampler_object(struct gl_context *ctx, GLuint name)
162*61046927SAndroid Build Coastguard Worker {
163*61046927SAndroid Build Coastguard Worker struct gl_sampler_object *sampObj = CALLOC_STRUCT(gl_sampler_object);
164*61046927SAndroid Build Coastguard Worker if (sampObj) {
165*61046927SAndroid Build Coastguard Worker _mesa_init_sampler_object(sampObj, name);
166*61046927SAndroid Build Coastguard Worker }
167*61046927SAndroid Build Coastguard Worker return sampObj;
168*61046927SAndroid Build Coastguard Worker }
169*61046927SAndroid Build Coastguard Worker
170*61046927SAndroid Build Coastguard Worker static void
create_samplers(struct gl_context * ctx,GLsizei count,GLuint * samplers,const char * caller)171*61046927SAndroid Build Coastguard Worker create_samplers(struct gl_context *ctx, GLsizei count, GLuint *samplers,
172*61046927SAndroid Build Coastguard Worker const char *caller)
173*61046927SAndroid Build Coastguard Worker {
174*61046927SAndroid Build Coastguard Worker GLint i;
175*61046927SAndroid Build Coastguard Worker
176*61046927SAndroid Build Coastguard Worker if (!samplers)
177*61046927SAndroid Build Coastguard Worker return;
178*61046927SAndroid Build Coastguard Worker
179*61046927SAndroid Build Coastguard Worker _mesa_HashLockMutex(&ctx->Shared->SamplerObjects);
180*61046927SAndroid Build Coastguard Worker
181*61046927SAndroid Build Coastguard Worker _mesa_HashFindFreeKeys(&ctx->Shared->SamplerObjects, samplers, count);
182*61046927SAndroid Build Coastguard Worker
183*61046927SAndroid Build Coastguard Worker /* Insert the ID and pointer to new sampler object into hash table */
184*61046927SAndroid Build Coastguard Worker for (i = 0; i < count; i++) {
185*61046927SAndroid Build Coastguard Worker struct gl_sampler_object *sampObj;
186*61046927SAndroid Build Coastguard Worker
187*61046927SAndroid Build Coastguard Worker sampObj = _mesa_new_sampler_object(ctx, samplers[i]);
188*61046927SAndroid Build Coastguard Worker if (!sampObj) {
189*61046927SAndroid Build Coastguard Worker _mesa_HashUnlockMutex(&ctx->Shared->SamplerObjects);
190*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_OUT_OF_MEMORY, "%s", caller);
191*61046927SAndroid Build Coastguard Worker return;
192*61046927SAndroid Build Coastguard Worker }
193*61046927SAndroid Build Coastguard Worker
194*61046927SAndroid Build Coastguard Worker _mesa_HashInsertLocked(&ctx->Shared->SamplerObjects, samplers[i],
195*61046927SAndroid Build Coastguard Worker sampObj);
196*61046927SAndroid Build Coastguard Worker }
197*61046927SAndroid Build Coastguard Worker
198*61046927SAndroid Build Coastguard Worker _mesa_HashUnlockMutex(&ctx->Shared->SamplerObjects);
199*61046927SAndroid Build Coastguard Worker }
200*61046927SAndroid Build Coastguard Worker
201*61046927SAndroid Build Coastguard Worker static void
create_samplers_err(struct gl_context * ctx,GLsizei count,GLuint * samplers,const char * caller)202*61046927SAndroid Build Coastguard Worker create_samplers_err(struct gl_context *ctx, GLsizei count, GLuint *samplers,
203*61046927SAndroid Build Coastguard Worker const char *caller)
204*61046927SAndroid Build Coastguard Worker {
205*61046927SAndroid Build Coastguard Worker
206*61046927SAndroid Build Coastguard Worker if (MESA_VERBOSE & VERBOSE_API)
207*61046927SAndroid Build Coastguard Worker _mesa_debug(ctx, "%s(%d)\n", caller, count);
208*61046927SAndroid Build Coastguard Worker
209*61046927SAndroid Build Coastguard Worker if (count < 0) {
210*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_VALUE, "%s(n<0)", caller);
211*61046927SAndroid Build Coastguard Worker return;
212*61046927SAndroid Build Coastguard Worker }
213*61046927SAndroid Build Coastguard Worker
214*61046927SAndroid Build Coastguard Worker create_samplers(ctx, count, samplers, caller);
215*61046927SAndroid Build Coastguard Worker }
216*61046927SAndroid Build Coastguard Worker
217*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GenSamplers_no_error(GLsizei count,GLuint * samplers)218*61046927SAndroid Build Coastguard Worker _mesa_GenSamplers_no_error(GLsizei count, GLuint *samplers)
219*61046927SAndroid Build Coastguard Worker {
220*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
221*61046927SAndroid Build Coastguard Worker create_samplers(ctx, count, samplers, "glGenSamplers");
222*61046927SAndroid Build Coastguard Worker }
223*61046927SAndroid Build Coastguard Worker
224*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GenSamplers(GLsizei count,GLuint * samplers)225*61046927SAndroid Build Coastguard Worker _mesa_GenSamplers(GLsizei count, GLuint *samplers)
226*61046927SAndroid Build Coastguard Worker {
227*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
228*61046927SAndroid Build Coastguard Worker create_samplers_err(ctx, count, samplers, "glGenSamplers");
229*61046927SAndroid Build Coastguard Worker }
230*61046927SAndroid Build Coastguard Worker
231*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_CreateSamplers_no_error(GLsizei count,GLuint * samplers)232*61046927SAndroid Build Coastguard Worker _mesa_CreateSamplers_no_error(GLsizei count, GLuint *samplers)
233*61046927SAndroid Build Coastguard Worker {
234*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
235*61046927SAndroid Build Coastguard Worker create_samplers(ctx, count, samplers, "glCreateSamplers");
236*61046927SAndroid Build Coastguard Worker }
237*61046927SAndroid Build Coastguard Worker
238*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_CreateSamplers(GLsizei count,GLuint * samplers)239*61046927SAndroid Build Coastguard Worker _mesa_CreateSamplers(GLsizei count, GLuint *samplers)
240*61046927SAndroid Build Coastguard Worker {
241*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
242*61046927SAndroid Build Coastguard Worker create_samplers_err(ctx, count, samplers, "glCreateSamplers");
243*61046927SAndroid Build Coastguard Worker }
244*61046927SAndroid Build Coastguard Worker
245*61046927SAndroid Build Coastguard Worker
246*61046927SAndroid Build Coastguard Worker static void
delete_samplers(struct gl_context * ctx,GLsizei count,const GLuint * samplers)247*61046927SAndroid Build Coastguard Worker delete_samplers(struct gl_context *ctx, GLsizei count, const GLuint *samplers)
248*61046927SAndroid Build Coastguard Worker {
249*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0, 0);
250*61046927SAndroid Build Coastguard Worker
251*61046927SAndroid Build Coastguard Worker _mesa_HashLockMutex(&ctx->Shared->SamplerObjects);
252*61046927SAndroid Build Coastguard Worker
253*61046927SAndroid Build Coastguard Worker for (GLsizei i = 0; i < count; i++) {
254*61046927SAndroid Build Coastguard Worker if (samplers[i]) {
255*61046927SAndroid Build Coastguard Worker GLuint j;
256*61046927SAndroid Build Coastguard Worker struct gl_sampler_object *sampObj =
257*61046927SAndroid Build Coastguard Worker lookup_samplerobj_locked(ctx, samplers[i]);
258*61046927SAndroid Build Coastguard Worker
259*61046927SAndroid Build Coastguard Worker if (sampObj) {
260*61046927SAndroid Build Coastguard Worker /* If the sampler is currently bound, unbind it. */
261*61046927SAndroid Build Coastguard Worker for (j = 0; j < ctx->Const.MaxCombinedTextureImageUnits; j++) {
262*61046927SAndroid Build Coastguard Worker if (ctx->Texture.Unit[j].Sampler == sampObj) {
263*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_TEXTURE_OBJECT, GL_TEXTURE_BIT);
264*61046927SAndroid Build Coastguard Worker _mesa_reference_sampler_object(ctx, &ctx->Texture.Unit[j].Sampler, NULL);
265*61046927SAndroid Build Coastguard Worker }
266*61046927SAndroid Build Coastguard Worker }
267*61046927SAndroid Build Coastguard Worker
268*61046927SAndroid Build Coastguard Worker /* The ID is immediately freed for re-use */
269*61046927SAndroid Build Coastguard Worker _mesa_HashRemoveLocked(&ctx->Shared->SamplerObjects, samplers[i]);
270*61046927SAndroid Build Coastguard Worker /* But the object exists until its reference count goes to zero */
271*61046927SAndroid Build Coastguard Worker _mesa_reference_sampler_object(ctx, &sampObj, NULL);
272*61046927SAndroid Build Coastguard Worker }
273*61046927SAndroid Build Coastguard Worker }
274*61046927SAndroid Build Coastguard Worker }
275*61046927SAndroid Build Coastguard Worker
276*61046927SAndroid Build Coastguard Worker _mesa_HashUnlockMutex(&ctx->Shared->SamplerObjects);
277*61046927SAndroid Build Coastguard Worker }
278*61046927SAndroid Build Coastguard Worker
279*61046927SAndroid Build Coastguard Worker
280*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_DeleteSamplers_no_error(GLsizei count,const GLuint * samplers)281*61046927SAndroid Build Coastguard Worker _mesa_DeleteSamplers_no_error(GLsizei count, const GLuint *samplers)
282*61046927SAndroid Build Coastguard Worker {
283*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
284*61046927SAndroid Build Coastguard Worker delete_samplers(ctx, count, samplers);
285*61046927SAndroid Build Coastguard Worker }
286*61046927SAndroid Build Coastguard Worker
287*61046927SAndroid Build Coastguard Worker
288*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_DeleteSamplers(GLsizei count,const GLuint * samplers)289*61046927SAndroid Build Coastguard Worker _mesa_DeleteSamplers(GLsizei count, const GLuint *samplers)
290*61046927SAndroid Build Coastguard Worker {
291*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
292*61046927SAndroid Build Coastguard Worker
293*61046927SAndroid Build Coastguard Worker if (count < 0) {
294*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_VALUE, "glDeleteSamplers(count)");
295*61046927SAndroid Build Coastguard Worker return;
296*61046927SAndroid Build Coastguard Worker }
297*61046927SAndroid Build Coastguard Worker
298*61046927SAndroid Build Coastguard Worker delete_samplers(ctx, count, samplers);
299*61046927SAndroid Build Coastguard Worker }
300*61046927SAndroid Build Coastguard Worker
301*61046927SAndroid Build Coastguard Worker
302*61046927SAndroid Build Coastguard Worker GLboolean GLAPIENTRY
_mesa_IsSampler(GLuint sampler)303*61046927SAndroid Build Coastguard Worker _mesa_IsSampler(GLuint sampler)
304*61046927SAndroid Build Coastguard Worker {
305*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
306*61046927SAndroid Build Coastguard Worker
307*61046927SAndroid Build Coastguard Worker ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE);
308*61046927SAndroid Build Coastguard Worker
309*61046927SAndroid Build Coastguard Worker return _mesa_lookup_samplerobj(ctx, sampler) != NULL;
310*61046927SAndroid Build Coastguard Worker }
311*61046927SAndroid Build Coastguard Worker
312*61046927SAndroid Build Coastguard Worker void
_mesa_bind_sampler(struct gl_context * ctx,GLuint unit,struct gl_sampler_object * sampObj)313*61046927SAndroid Build Coastguard Worker _mesa_bind_sampler(struct gl_context *ctx, GLuint unit,
314*61046927SAndroid Build Coastguard Worker struct gl_sampler_object *sampObj)
315*61046927SAndroid Build Coastguard Worker {
316*61046927SAndroid Build Coastguard Worker if (ctx->Texture.Unit[unit].Sampler != sampObj) {
317*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_TEXTURE_OBJECT, GL_TEXTURE_BIT);
318*61046927SAndroid Build Coastguard Worker }
319*61046927SAndroid Build Coastguard Worker
320*61046927SAndroid Build Coastguard Worker _mesa_reference_sampler_object(ctx, &ctx->Texture.Unit[unit].Sampler,
321*61046927SAndroid Build Coastguard Worker sampObj);
322*61046927SAndroid Build Coastguard Worker }
323*61046927SAndroid Build Coastguard Worker
324*61046927SAndroid Build Coastguard Worker static ALWAYS_INLINE void
bind_sampler(struct gl_context * ctx,GLuint unit,GLuint sampler,bool no_error)325*61046927SAndroid Build Coastguard Worker bind_sampler(struct gl_context *ctx, GLuint unit, GLuint sampler, bool no_error)
326*61046927SAndroid Build Coastguard Worker {
327*61046927SAndroid Build Coastguard Worker struct gl_sampler_object *sampObj;
328*61046927SAndroid Build Coastguard Worker
329*61046927SAndroid Build Coastguard Worker if (sampler == 0) {
330*61046927SAndroid Build Coastguard Worker /* Use the default sampler object, the one contained in the texture
331*61046927SAndroid Build Coastguard Worker * object.
332*61046927SAndroid Build Coastguard Worker */
333*61046927SAndroid Build Coastguard Worker sampObj = NULL;
334*61046927SAndroid Build Coastguard Worker } else {
335*61046927SAndroid Build Coastguard Worker /* user-defined sampler object */
336*61046927SAndroid Build Coastguard Worker sampObj = _mesa_lookup_samplerobj(ctx, sampler);
337*61046927SAndroid Build Coastguard Worker if (!no_error && !sampObj) {
338*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_OPERATION, "glBindSampler(sampler)");
339*61046927SAndroid Build Coastguard Worker return;
340*61046927SAndroid Build Coastguard Worker }
341*61046927SAndroid Build Coastguard Worker }
342*61046927SAndroid Build Coastguard Worker
343*61046927SAndroid Build Coastguard Worker /* bind new sampler */
344*61046927SAndroid Build Coastguard Worker _mesa_bind_sampler(ctx, unit, sampObj);
345*61046927SAndroid Build Coastguard Worker }
346*61046927SAndroid Build Coastguard Worker
347*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_BindSampler_no_error(GLuint unit,GLuint sampler)348*61046927SAndroid Build Coastguard Worker _mesa_BindSampler_no_error(GLuint unit, GLuint sampler)
349*61046927SAndroid Build Coastguard Worker {
350*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
351*61046927SAndroid Build Coastguard Worker bind_sampler(ctx, unit, sampler, true);
352*61046927SAndroid Build Coastguard Worker }
353*61046927SAndroid Build Coastguard Worker
354*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_BindSampler(GLuint unit,GLuint sampler)355*61046927SAndroid Build Coastguard Worker _mesa_BindSampler(GLuint unit, GLuint sampler)
356*61046927SAndroid Build Coastguard Worker {
357*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
358*61046927SAndroid Build Coastguard Worker
359*61046927SAndroid Build Coastguard Worker if (unit >= ctx->Const.MaxCombinedTextureImageUnits) {
360*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_VALUE, "glBindSampler(unit %u)", unit);
361*61046927SAndroid Build Coastguard Worker return;
362*61046927SAndroid Build Coastguard Worker }
363*61046927SAndroid Build Coastguard Worker
364*61046927SAndroid Build Coastguard Worker bind_sampler(ctx, unit, sampler, false);
365*61046927SAndroid Build Coastguard Worker }
366*61046927SAndroid Build Coastguard Worker
367*61046927SAndroid Build Coastguard Worker
368*61046927SAndroid Build Coastguard Worker static ALWAYS_INLINE void
bind_samplers(struct gl_context * ctx,GLuint first,GLsizei count,const GLuint * samplers,bool no_error)369*61046927SAndroid Build Coastguard Worker bind_samplers(struct gl_context *ctx, GLuint first, GLsizei count,
370*61046927SAndroid Build Coastguard Worker const GLuint *samplers, bool no_error)
371*61046927SAndroid Build Coastguard Worker {
372*61046927SAndroid Build Coastguard Worker GLsizei i;
373*61046927SAndroid Build Coastguard Worker
374*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0, 0);
375*61046927SAndroid Build Coastguard Worker
376*61046927SAndroid Build Coastguard Worker if (samplers) {
377*61046927SAndroid Build Coastguard Worker /* Note that the error semantics for multi-bind commands differ from
378*61046927SAndroid Build Coastguard Worker * those of other GL commands.
379*61046927SAndroid Build Coastguard Worker *
380*61046927SAndroid Build Coastguard Worker * The Issues section in the ARB_multi_bind spec says:
381*61046927SAndroid Build Coastguard Worker *
382*61046927SAndroid Build Coastguard Worker * "(11) Typically, OpenGL specifies that if an error is generated by
383*61046927SAndroid Build Coastguard Worker * a command, that command has no effect. This is somewhat
384*61046927SAndroid Build Coastguard Worker * unfortunate for multi-bind commands, because it would require
385*61046927SAndroid Build Coastguard Worker * a first pass to scan the entire list of bound objects for
386*61046927SAndroid Build Coastguard Worker * errors and then a second pass to actually perform the
387*61046927SAndroid Build Coastguard Worker * bindings. Should we have different error semantics?
388*61046927SAndroid Build Coastguard Worker *
389*61046927SAndroid Build Coastguard Worker * RESOLVED: Yes. In this specification, when the parameters for
390*61046927SAndroid Build Coastguard Worker * one of the <count> binding points are invalid, that binding
391*61046927SAndroid Build Coastguard Worker * point is not updated and an error will be generated. However,
392*61046927SAndroid Build Coastguard Worker * other binding points in the same command will be updated if
393*61046927SAndroid Build Coastguard Worker * their parameters are valid and no other error occurs."
394*61046927SAndroid Build Coastguard Worker */
395*61046927SAndroid Build Coastguard Worker
396*61046927SAndroid Build Coastguard Worker _mesa_HashLockMutex(&ctx->Shared->SamplerObjects);
397*61046927SAndroid Build Coastguard Worker
398*61046927SAndroid Build Coastguard Worker for (i = 0; i < count; i++) {
399*61046927SAndroid Build Coastguard Worker const GLuint unit = first + i;
400*61046927SAndroid Build Coastguard Worker struct gl_sampler_object * const currentSampler =
401*61046927SAndroid Build Coastguard Worker ctx->Texture.Unit[unit].Sampler;
402*61046927SAndroid Build Coastguard Worker struct gl_sampler_object *sampObj;
403*61046927SAndroid Build Coastguard Worker
404*61046927SAndroid Build Coastguard Worker if (samplers[i] != 0) {
405*61046927SAndroid Build Coastguard Worker if (currentSampler && currentSampler->Name == samplers[i])
406*61046927SAndroid Build Coastguard Worker sampObj = currentSampler;
407*61046927SAndroid Build Coastguard Worker else
408*61046927SAndroid Build Coastguard Worker sampObj = lookup_samplerobj_locked(ctx, samplers[i]);
409*61046927SAndroid Build Coastguard Worker
410*61046927SAndroid Build Coastguard Worker /* The ARB_multi_bind spec says:
411*61046927SAndroid Build Coastguard Worker *
412*61046927SAndroid Build Coastguard Worker * "An INVALID_OPERATION error is generated if any value
413*61046927SAndroid Build Coastguard Worker * in <samplers> is not zero or the name of an existing
414*61046927SAndroid Build Coastguard Worker * sampler object (per binding)."
415*61046927SAndroid Build Coastguard Worker */
416*61046927SAndroid Build Coastguard Worker if (!no_error && !sampObj) {
417*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_OPERATION,
418*61046927SAndroid Build Coastguard Worker "glBindSamplers(samplers[%d]=%u is not zero or "
419*61046927SAndroid Build Coastguard Worker "the name of an existing sampler object)",
420*61046927SAndroid Build Coastguard Worker i, samplers[i]);
421*61046927SAndroid Build Coastguard Worker continue;
422*61046927SAndroid Build Coastguard Worker }
423*61046927SAndroid Build Coastguard Worker } else {
424*61046927SAndroid Build Coastguard Worker sampObj = NULL;
425*61046927SAndroid Build Coastguard Worker }
426*61046927SAndroid Build Coastguard Worker
427*61046927SAndroid Build Coastguard Worker /* Bind the new sampler */
428*61046927SAndroid Build Coastguard Worker if (sampObj != currentSampler) {
429*61046927SAndroid Build Coastguard Worker _mesa_reference_sampler_object(ctx,
430*61046927SAndroid Build Coastguard Worker &ctx->Texture.Unit[unit].Sampler,
431*61046927SAndroid Build Coastguard Worker sampObj);
432*61046927SAndroid Build Coastguard Worker ctx->NewState |= _NEW_TEXTURE_OBJECT;
433*61046927SAndroid Build Coastguard Worker ctx->PopAttribState |= GL_TEXTURE_BIT;
434*61046927SAndroid Build Coastguard Worker }
435*61046927SAndroid Build Coastguard Worker }
436*61046927SAndroid Build Coastguard Worker
437*61046927SAndroid Build Coastguard Worker _mesa_HashUnlockMutex(&ctx->Shared->SamplerObjects);
438*61046927SAndroid Build Coastguard Worker } else {
439*61046927SAndroid Build Coastguard Worker /* Unbind all samplers in the range <first> through <first>+<count>-1 */
440*61046927SAndroid Build Coastguard Worker for (i = 0; i < count; i++) {
441*61046927SAndroid Build Coastguard Worker const GLuint unit = first + i;
442*61046927SAndroid Build Coastguard Worker
443*61046927SAndroid Build Coastguard Worker if (ctx->Texture.Unit[unit].Sampler) {
444*61046927SAndroid Build Coastguard Worker _mesa_reference_sampler_object(ctx,
445*61046927SAndroid Build Coastguard Worker &ctx->Texture.Unit[unit].Sampler,
446*61046927SAndroid Build Coastguard Worker NULL);
447*61046927SAndroid Build Coastguard Worker ctx->NewState |= _NEW_TEXTURE_OBJECT;
448*61046927SAndroid Build Coastguard Worker ctx->PopAttribState |= GL_TEXTURE_BIT;
449*61046927SAndroid Build Coastguard Worker }
450*61046927SAndroid Build Coastguard Worker }
451*61046927SAndroid Build Coastguard Worker }
452*61046927SAndroid Build Coastguard Worker }
453*61046927SAndroid Build Coastguard Worker
454*61046927SAndroid Build Coastguard Worker
455*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_BindSamplers_no_error(GLuint first,GLsizei count,const GLuint * samplers)456*61046927SAndroid Build Coastguard Worker _mesa_BindSamplers_no_error(GLuint first, GLsizei count, const GLuint *samplers)
457*61046927SAndroid Build Coastguard Worker {
458*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
459*61046927SAndroid Build Coastguard Worker bind_samplers(ctx, first, count, samplers, true);
460*61046927SAndroid Build Coastguard Worker }
461*61046927SAndroid Build Coastguard Worker
462*61046927SAndroid Build Coastguard Worker
463*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_BindSamplers(GLuint first,GLsizei count,const GLuint * samplers)464*61046927SAndroid Build Coastguard Worker _mesa_BindSamplers(GLuint first, GLsizei count, const GLuint *samplers)
465*61046927SAndroid Build Coastguard Worker {
466*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
467*61046927SAndroid Build Coastguard Worker
468*61046927SAndroid Build Coastguard Worker /* The ARB_multi_bind spec says:
469*61046927SAndroid Build Coastguard Worker *
470*61046927SAndroid Build Coastguard Worker * "An INVALID_OPERATION error is generated if <first> + <count> is
471*61046927SAndroid Build Coastguard Worker * greater than the number of texture image units supported by
472*61046927SAndroid Build Coastguard Worker * the implementation."
473*61046927SAndroid Build Coastguard Worker */
474*61046927SAndroid Build Coastguard Worker if (first + count > ctx->Const.MaxCombinedTextureImageUnits) {
475*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_OPERATION,
476*61046927SAndroid Build Coastguard Worker "glBindSamplers(first=%u + count=%d > the value of "
477*61046927SAndroid Build Coastguard Worker "GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS=%u)",
478*61046927SAndroid Build Coastguard Worker first, count, ctx->Const.MaxCombinedTextureImageUnits);
479*61046927SAndroid Build Coastguard Worker return;
480*61046927SAndroid Build Coastguard Worker }
481*61046927SAndroid Build Coastguard Worker
482*61046927SAndroid Build Coastguard Worker bind_samplers(ctx, first, count, samplers, false);
483*61046927SAndroid Build Coastguard Worker }
484*61046927SAndroid Build Coastguard Worker
485*61046927SAndroid Build Coastguard Worker
486*61046927SAndroid Build Coastguard Worker /**
487*61046927SAndroid Build Coastguard Worker * Check if a coordinate wrap mode is legal.
488*61046927SAndroid Build Coastguard Worker * \return GL_TRUE if legal, GL_FALSE otherwise
489*61046927SAndroid Build Coastguard Worker */
490*61046927SAndroid Build Coastguard Worker static GLboolean
validate_texture_wrap_mode(struct gl_context * ctx,GLenum wrap)491*61046927SAndroid Build Coastguard Worker validate_texture_wrap_mode(struct gl_context *ctx, GLenum wrap)
492*61046927SAndroid Build Coastguard Worker {
493*61046927SAndroid Build Coastguard Worker const struct gl_extensions * const e = &ctx->Extensions;
494*61046927SAndroid Build Coastguard Worker
495*61046927SAndroid Build Coastguard Worker bool mirror_clamp =
496*61046927SAndroid Build Coastguard Worker _mesa_has_ATI_texture_mirror_once(ctx) ||
497*61046927SAndroid Build Coastguard Worker _mesa_has_EXT_texture_mirror_clamp(ctx);
498*61046927SAndroid Build Coastguard Worker
499*61046927SAndroid Build Coastguard Worker bool mirror_clamp_to_edge =
500*61046927SAndroid Build Coastguard Worker _mesa_has_ARB_texture_mirror_clamp_to_edge(ctx) ||
501*61046927SAndroid Build Coastguard Worker _mesa_has_EXT_texture_mirror_clamp_to_edge(ctx) ||
502*61046927SAndroid Build Coastguard Worker mirror_clamp;
503*61046927SAndroid Build Coastguard Worker
504*61046927SAndroid Build Coastguard Worker switch (wrap) {
505*61046927SAndroid Build Coastguard Worker case GL_CLAMP:
506*61046927SAndroid Build Coastguard Worker /* From GL 3.0 specification section E.1 "Profiles and Deprecated
507*61046927SAndroid Build Coastguard Worker * Features of OpenGL 3.0":
508*61046927SAndroid Build Coastguard Worker *
509*61046927SAndroid Build Coastguard Worker * - Texture wrap mode CLAMP - CLAMP is no longer accepted as a value of
510*61046927SAndroid Build Coastguard Worker * texture parameters TEXTURE_WRAP_S, TEXTURE_WRAP_T, or
511*61046927SAndroid Build Coastguard Worker * TEXTURE_WRAP_R.
512*61046927SAndroid Build Coastguard Worker */
513*61046927SAndroid Build Coastguard Worker return _mesa_is_desktop_gl_compat(ctx);
514*61046927SAndroid Build Coastguard Worker case GL_CLAMP_TO_EDGE:
515*61046927SAndroid Build Coastguard Worker case GL_REPEAT:
516*61046927SAndroid Build Coastguard Worker case GL_MIRRORED_REPEAT:
517*61046927SAndroid Build Coastguard Worker case GL_CLAMP_TO_BORDER:
518*61046927SAndroid Build Coastguard Worker return GL_TRUE;
519*61046927SAndroid Build Coastguard Worker case GL_MIRROR_CLAMP_EXT:
520*61046927SAndroid Build Coastguard Worker return mirror_clamp;
521*61046927SAndroid Build Coastguard Worker case GL_MIRROR_CLAMP_TO_EDGE_EXT:
522*61046927SAndroid Build Coastguard Worker return mirror_clamp_to_edge;
523*61046927SAndroid Build Coastguard Worker case GL_MIRROR_CLAMP_TO_BORDER_EXT:
524*61046927SAndroid Build Coastguard Worker return e->EXT_texture_mirror_clamp;
525*61046927SAndroid Build Coastguard Worker default:
526*61046927SAndroid Build Coastguard Worker return GL_FALSE;
527*61046927SAndroid Build Coastguard Worker }
528*61046927SAndroid Build Coastguard Worker }
529*61046927SAndroid Build Coastguard Worker
530*61046927SAndroid Build Coastguard Worker
531*61046927SAndroid Build Coastguard Worker /**
532*61046927SAndroid Build Coastguard Worker * This is called just prior to changing any sampler object state.
533*61046927SAndroid Build Coastguard Worker */
534*61046927SAndroid Build Coastguard Worker static inline void
flush(struct gl_context * ctx)535*61046927SAndroid Build Coastguard Worker flush(struct gl_context *ctx)
536*61046927SAndroid Build Coastguard Worker {
537*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, _NEW_TEXTURE_OBJECT, GL_TEXTURE_BIT);
538*61046927SAndroid Build Coastguard Worker }
539*61046927SAndroid Build Coastguard Worker
540*61046927SAndroid Build Coastguard Worker #define INVALID_PARAM 0x100
541*61046927SAndroid Build Coastguard Worker #define INVALID_PNAME 0x101
542*61046927SAndroid Build Coastguard Worker #define INVALID_VALUE 0x102
543*61046927SAndroid Build Coastguard Worker
544*61046927SAndroid Build Coastguard Worker static GLuint
set_sampler_wrap_s(struct gl_context * ctx,struct gl_sampler_object * samp,GLint param)545*61046927SAndroid Build Coastguard Worker set_sampler_wrap_s(struct gl_context *ctx, struct gl_sampler_object *samp,
546*61046927SAndroid Build Coastguard Worker GLint param)
547*61046927SAndroid Build Coastguard Worker {
548*61046927SAndroid Build Coastguard Worker if (samp->Attrib.WrapS == param)
549*61046927SAndroid Build Coastguard Worker return GL_FALSE;
550*61046927SAndroid Build Coastguard Worker if (validate_texture_wrap_mode(ctx, param)) {
551*61046927SAndroid Build Coastguard Worker flush(ctx);
552*61046927SAndroid Build Coastguard Worker update_sampler_gl_clamp(ctx, samp, is_wrap_gl_clamp(samp->Attrib.WrapS), is_wrap_gl_clamp(param), WRAP_S);
553*61046927SAndroid Build Coastguard Worker samp->Attrib.WrapS = param;
554*61046927SAndroid Build Coastguard Worker samp->Attrib.state.wrap_s = wrap_to_gallium(param);
555*61046927SAndroid Build Coastguard Worker _mesa_lower_gl_clamp(ctx, samp);
556*61046927SAndroid Build Coastguard Worker return GL_TRUE;
557*61046927SAndroid Build Coastguard Worker }
558*61046927SAndroid Build Coastguard Worker return INVALID_PARAM;
559*61046927SAndroid Build Coastguard Worker }
560*61046927SAndroid Build Coastguard Worker
561*61046927SAndroid Build Coastguard Worker
562*61046927SAndroid Build Coastguard Worker static GLuint
set_sampler_wrap_t(struct gl_context * ctx,struct gl_sampler_object * samp,GLint param)563*61046927SAndroid Build Coastguard Worker set_sampler_wrap_t(struct gl_context *ctx, struct gl_sampler_object *samp,
564*61046927SAndroid Build Coastguard Worker GLint param)
565*61046927SAndroid Build Coastguard Worker {
566*61046927SAndroid Build Coastguard Worker if (samp->Attrib.WrapT == param)
567*61046927SAndroid Build Coastguard Worker return GL_FALSE;
568*61046927SAndroid Build Coastguard Worker if (validate_texture_wrap_mode(ctx, param)) {
569*61046927SAndroid Build Coastguard Worker flush(ctx);
570*61046927SAndroid Build Coastguard Worker update_sampler_gl_clamp(ctx, samp, is_wrap_gl_clamp(samp->Attrib.WrapT), is_wrap_gl_clamp(param), WRAP_T);
571*61046927SAndroid Build Coastguard Worker samp->Attrib.WrapT = param;
572*61046927SAndroid Build Coastguard Worker samp->Attrib.state.wrap_t = wrap_to_gallium(param);
573*61046927SAndroid Build Coastguard Worker _mesa_lower_gl_clamp(ctx, samp);
574*61046927SAndroid Build Coastguard Worker return GL_TRUE;
575*61046927SAndroid Build Coastguard Worker }
576*61046927SAndroid Build Coastguard Worker return INVALID_PARAM;
577*61046927SAndroid Build Coastguard Worker }
578*61046927SAndroid Build Coastguard Worker
579*61046927SAndroid Build Coastguard Worker
580*61046927SAndroid Build Coastguard Worker static GLuint
set_sampler_wrap_r(struct gl_context * ctx,struct gl_sampler_object * samp,GLint param)581*61046927SAndroid Build Coastguard Worker set_sampler_wrap_r(struct gl_context *ctx, struct gl_sampler_object *samp,
582*61046927SAndroid Build Coastguard Worker GLint param)
583*61046927SAndroid Build Coastguard Worker {
584*61046927SAndroid Build Coastguard Worker if (samp->Attrib.WrapR == param)
585*61046927SAndroid Build Coastguard Worker return GL_FALSE;
586*61046927SAndroid Build Coastguard Worker if (validate_texture_wrap_mode(ctx, param)) {
587*61046927SAndroid Build Coastguard Worker flush(ctx);
588*61046927SAndroid Build Coastguard Worker update_sampler_gl_clamp(ctx, samp, is_wrap_gl_clamp(samp->Attrib.WrapR), is_wrap_gl_clamp(param), WRAP_R);
589*61046927SAndroid Build Coastguard Worker samp->Attrib.WrapR = param;
590*61046927SAndroid Build Coastguard Worker samp->Attrib.state.wrap_r = wrap_to_gallium(param);
591*61046927SAndroid Build Coastguard Worker _mesa_lower_gl_clamp(ctx, samp);
592*61046927SAndroid Build Coastguard Worker return GL_TRUE;
593*61046927SAndroid Build Coastguard Worker }
594*61046927SAndroid Build Coastguard Worker return INVALID_PARAM;
595*61046927SAndroid Build Coastguard Worker }
596*61046927SAndroid Build Coastguard Worker
597*61046927SAndroid Build Coastguard Worker static GLuint
set_sampler_min_filter(struct gl_context * ctx,struct gl_sampler_object * samp,GLint param)598*61046927SAndroid Build Coastguard Worker set_sampler_min_filter(struct gl_context *ctx, struct gl_sampler_object *samp,
599*61046927SAndroid Build Coastguard Worker GLint param)
600*61046927SAndroid Build Coastguard Worker {
601*61046927SAndroid Build Coastguard Worker if (samp->Attrib.MinFilter == param)
602*61046927SAndroid Build Coastguard Worker return GL_FALSE;
603*61046927SAndroid Build Coastguard Worker
604*61046927SAndroid Build Coastguard Worker switch (param) {
605*61046927SAndroid Build Coastguard Worker case GL_NEAREST:
606*61046927SAndroid Build Coastguard Worker case GL_LINEAR:
607*61046927SAndroid Build Coastguard Worker case GL_NEAREST_MIPMAP_NEAREST:
608*61046927SAndroid Build Coastguard Worker case GL_LINEAR_MIPMAP_NEAREST:
609*61046927SAndroid Build Coastguard Worker case GL_NEAREST_MIPMAP_LINEAR:
610*61046927SAndroid Build Coastguard Worker case GL_LINEAR_MIPMAP_LINEAR:
611*61046927SAndroid Build Coastguard Worker flush(ctx);
612*61046927SAndroid Build Coastguard Worker samp->Attrib.MinFilter = param;
613*61046927SAndroid Build Coastguard Worker samp->Attrib.state.min_img_filter = filter_to_gallium(param);
614*61046927SAndroid Build Coastguard Worker samp->Attrib.state.min_mip_filter = mipfilter_to_gallium(param);
615*61046927SAndroid Build Coastguard Worker _mesa_lower_gl_clamp(ctx, samp);
616*61046927SAndroid Build Coastguard Worker return GL_TRUE;
617*61046927SAndroid Build Coastguard Worker default:
618*61046927SAndroid Build Coastguard Worker return INVALID_PARAM;
619*61046927SAndroid Build Coastguard Worker }
620*61046927SAndroid Build Coastguard Worker }
621*61046927SAndroid Build Coastguard Worker
622*61046927SAndroid Build Coastguard Worker
623*61046927SAndroid Build Coastguard Worker static GLuint
set_sampler_mag_filter(struct gl_context * ctx,struct gl_sampler_object * samp,GLint param)624*61046927SAndroid Build Coastguard Worker set_sampler_mag_filter(struct gl_context *ctx, struct gl_sampler_object *samp,
625*61046927SAndroid Build Coastguard Worker GLint param)
626*61046927SAndroid Build Coastguard Worker {
627*61046927SAndroid Build Coastguard Worker if (samp->Attrib.MagFilter == param)
628*61046927SAndroid Build Coastguard Worker return GL_FALSE;
629*61046927SAndroid Build Coastguard Worker
630*61046927SAndroid Build Coastguard Worker switch (param) {
631*61046927SAndroid Build Coastguard Worker case GL_NEAREST:
632*61046927SAndroid Build Coastguard Worker case GL_LINEAR:
633*61046927SAndroid Build Coastguard Worker flush(ctx);
634*61046927SAndroid Build Coastguard Worker samp->Attrib.MagFilter = param;
635*61046927SAndroid Build Coastguard Worker samp->Attrib.state.mag_img_filter = filter_to_gallium(param);
636*61046927SAndroid Build Coastguard Worker _mesa_lower_gl_clamp(ctx, samp);
637*61046927SAndroid Build Coastguard Worker return GL_TRUE;
638*61046927SAndroid Build Coastguard Worker default:
639*61046927SAndroid Build Coastguard Worker return INVALID_PARAM;
640*61046927SAndroid Build Coastguard Worker }
641*61046927SAndroid Build Coastguard Worker }
642*61046927SAndroid Build Coastguard Worker
643*61046927SAndroid Build Coastguard Worker
644*61046927SAndroid Build Coastguard Worker static GLuint
set_sampler_lod_bias(struct gl_context * ctx,struct gl_sampler_object * samp,GLfloat param)645*61046927SAndroid Build Coastguard Worker set_sampler_lod_bias(struct gl_context *ctx, struct gl_sampler_object *samp,
646*61046927SAndroid Build Coastguard Worker GLfloat param)
647*61046927SAndroid Build Coastguard Worker {
648*61046927SAndroid Build Coastguard Worker if (samp->Attrib.LodBias == param)
649*61046927SAndroid Build Coastguard Worker return GL_FALSE;
650*61046927SAndroid Build Coastguard Worker
651*61046927SAndroid Build Coastguard Worker flush(ctx);
652*61046927SAndroid Build Coastguard Worker samp->Attrib.LodBias = param;
653*61046927SAndroid Build Coastguard Worker samp->Attrib.state.lod_bias = util_quantize_lod_bias(param);
654*61046927SAndroid Build Coastguard Worker return GL_TRUE;
655*61046927SAndroid Build Coastguard Worker }
656*61046927SAndroid Build Coastguard Worker
657*61046927SAndroid Build Coastguard Worker
658*61046927SAndroid Build Coastguard Worker static GLuint
set_sampler_border_colorf(struct gl_context * ctx,struct gl_sampler_object * samp,const GLfloat params[4])659*61046927SAndroid Build Coastguard Worker set_sampler_border_colorf(struct gl_context *ctx,
660*61046927SAndroid Build Coastguard Worker struct gl_sampler_object *samp,
661*61046927SAndroid Build Coastguard Worker const GLfloat params[4])
662*61046927SAndroid Build Coastguard Worker {
663*61046927SAndroid Build Coastguard Worker flush(ctx);
664*61046927SAndroid Build Coastguard Worker memcpy(samp->Attrib.state.border_color.f, params, 4 * sizeof(float));
665*61046927SAndroid Build Coastguard Worker _mesa_update_is_border_color_nonzero(samp);
666*61046927SAndroid Build Coastguard Worker return GL_TRUE;
667*61046927SAndroid Build Coastguard Worker }
668*61046927SAndroid Build Coastguard Worker
669*61046927SAndroid Build Coastguard Worker
670*61046927SAndroid Build Coastguard Worker static GLuint
set_sampler_border_colori(struct gl_context * ctx,struct gl_sampler_object * samp,const GLint params[4])671*61046927SAndroid Build Coastguard Worker set_sampler_border_colori(struct gl_context *ctx,
672*61046927SAndroid Build Coastguard Worker struct gl_sampler_object *samp,
673*61046927SAndroid Build Coastguard Worker const GLint params[4])
674*61046927SAndroid Build Coastguard Worker {
675*61046927SAndroid Build Coastguard Worker flush(ctx);
676*61046927SAndroid Build Coastguard Worker memcpy(samp->Attrib.state.border_color.i, params, 4 * sizeof(float));
677*61046927SAndroid Build Coastguard Worker _mesa_update_is_border_color_nonzero(samp);
678*61046927SAndroid Build Coastguard Worker return GL_TRUE;
679*61046927SAndroid Build Coastguard Worker }
680*61046927SAndroid Build Coastguard Worker
681*61046927SAndroid Build Coastguard Worker
682*61046927SAndroid Build Coastguard Worker static GLuint
set_sampler_border_colorui(struct gl_context * ctx,struct gl_sampler_object * samp,const GLuint params[4])683*61046927SAndroid Build Coastguard Worker set_sampler_border_colorui(struct gl_context *ctx,
684*61046927SAndroid Build Coastguard Worker struct gl_sampler_object *samp,
685*61046927SAndroid Build Coastguard Worker const GLuint params[4])
686*61046927SAndroid Build Coastguard Worker {
687*61046927SAndroid Build Coastguard Worker flush(ctx);
688*61046927SAndroid Build Coastguard Worker memcpy(samp->Attrib.state.border_color.ui, params, 4 * sizeof(float));
689*61046927SAndroid Build Coastguard Worker _mesa_update_is_border_color_nonzero(samp);
690*61046927SAndroid Build Coastguard Worker return GL_TRUE;
691*61046927SAndroid Build Coastguard Worker }
692*61046927SAndroid Build Coastguard Worker
693*61046927SAndroid Build Coastguard Worker
694*61046927SAndroid Build Coastguard Worker static GLuint
set_sampler_min_lod(struct gl_context * ctx,struct gl_sampler_object * samp,GLfloat param)695*61046927SAndroid Build Coastguard Worker set_sampler_min_lod(struct gl_context *ctx, struct gl_sampler_object *samp,
696*61046927SAndroid Build Coastguard Worker GLfloat param)
697*61046927SAndroid Build Coastguard Worker {
698*61046927SAndroid Build Coastguard Worker if (samp->Attrib.MinLod == param)
699*61046927SAndroid Build Coastguard Worker return GL_FALSE;
700*61046927SAndroid Build Coastguard Worker
701*61046927SAndroid Build Coastguard Worker flush(ctx);
702*61046927SAndroid Build Coastguard Worker samp->Attrib.MinLod = param;
703*61046927SAndroid Build Coastguard Worker samp->Attrib.state.min_lod = MAX2(param, 0.0f); /* only positive */
704*61046927SAndroid Build Coastguard Worker
705*61046927SAndroid Build Coastguard Worker return GL_TRUE;
706*61046927SAndroid Build Coastguard Worker }
707*61046927SAndroid Build Coastguard Worker
708*61046927SAndroid Build Coastguard Worker
709*61046927SAndroid Build Coastguard Worker static GLuint
set_sampler_max_lod(struct gl_context * ctx,struct gl_sampler_object * samp,GLfloat param)710*61046927SAndroid Build Coastguard Worker set_sampler_max_lod(struct gl_context *ctx, struct gl_sampler_object *samp,
711*61046927SAndroid Build Coastguard Worker GLfloat param)
712*61046927SAndroid Build Coastguard Worker {
713*61046927SAndroid Build Coastguard Worker if (samp->Attrib.MaxLod == param)
714*61046927SAndroid Build Coastguard Worker return GL_FALSE;
715*61046927SAndroid Build Coastguard Worker
716*61046927SAndroid Build Coastguard Worker flush(ctx);
717*61046927SAndroid Build Coastguard Worker samp->Attrib.MaxLod = param;
718*61046927SAndroid Build Coastguard Worker samp->Attrib.state.max_lod = param;
719*61046927SAndroid Build Coastguard Worker return GL_TRUE;
720*61046927SAndroid Build Coastguard Worker }
721*61046927SAndroid Build Coastguard Worker
722*61046927SAndroid Build Coastguard Worker
723*61046927SAndroid Build Coastguard Worker static GLuint
set_sampler_compare_mode(struct gl_context * ctx,struct gl_sampler_object * samp,GLint param)724*61046927SAndroid Build Coastguard Worker set_sampler_compare_mode(struct gl_context *ctx,
725*61046927SAndroid Build Coastguard Worker struct gl_sampler_object *samp, GLint param)
726*61046927SAndroid Build Coastguard Worker {
727*61046927SAndroid Build Coastguard Worker /* If GL_ARB_shadow is not supported, don't report an error. The
728*61046927SAndroid Build Coastguard Worker * sampler object extension spec isn't clear on this extension interaction.
729*61046927SAndroid Build Coastguard Worker * Silences errors with Wine on older GPUs such as R200.
730*61046927SAndroid Build Coastguard Worker */
731*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_shadow)
732*61046927SAndroid Build Coastguard Worker return GL_FALSE;
733*61046927SAndroid Build Coastguard Worker
734*61046927SAndroid Build Coastguard Worker if (samp->Attrib.CompareMode == param)
735*61046927SAndroid Build Coastguard Worker return GL_FALSE;
736*61046927SAndroid Build Coastguard Worker
737*61046927SAndroid Build Coastguard Worker if (param == GL_NONE ||
738*61046927SAndroid Build Coastguard Worker param == GL_COMPARE_R_TO_TEXTURE_ARB) {
739*61046927SAndroid Build Coastguard Worker flush(ctx);
740*61046927SAndroid Build Coastguard Worker samp->Attrib.CompareMode = param;
741*61046927SAndroid Build Coastguard Worker return GL_TRUE;
742*61046927SAndroid Build Coastguard Worker }
743*61046927SAndroid Build Coastguard Worker
744*61046927SAndroid Build Coastguard Worker return INVALID_PARAM;
745*61046927SAndroid Build Coastguard Worker }
746*61046927SAndroid Build Coastguard Worker
747*61046927SAndroid Build Coastguard Worker
748*61046927SAndroid Build Coastguard Worker static GLuint
set_sampler_compare_func(struct gl_context * ctx,struct gl_sampler_object * samp,GLint param)749*61046927SAndroid Build Coastguard Worker set_sampler_compare_func(struct gl_context *ctx,
750*61046927SAndroid Build Coastguard Worker struct gl_sampler_object *samp, GLint param)
751*61046927SAndroid Build Coastguard Worker {
752*61046927SAndroid Build Coastguard Worker /* If GL_ARB_shadow is not supported, don't report an error. The
753*61046927SAndroid Build Coastguard Worker * sampler object extension spec isn't clear on this extension interaction.
754*61046927SAndroid Build Coastguard Worker * Silences errors with Wine on older GPUs such as R200.
755*61046927SAndroid Build Coastguard Worker */
756*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_shadow)
757*61046927SAndroid Build Coastguard Worker return GL_FALSE;
758*61046927SAndroid Build Coastguard Worker
759*61046927SAndroid Build Coastguard Worker if (samp->Attrib.CompareFunc == param)
760*61046927SAndroid Build Coastguard Worker return GL_FALSE;
761*61046927SAndroid Build Coastguard Worker
762*61046927SAndroid Build Coastguard Worker switch (param) {
763*61046927SAndroid Build Coastguard Worker case GL_LEQUAL:
764*61046927SAndroid Build Coastguard Worker case GL_GEQUAL:
765*61046927SAndroid Build Coastguard Worker case GL_EQUAL:
766*61046927SAndroid Build Coastguard Worker case GL_NOTEQUAL:
767*61046927SAndroid Build Coastguard Worker case GL_LESS:
768*61046927SAndroid Build Coastguard Worker case GL_GREATER:
769*61046927SAndroid Build Coastguard Worker case GL_ALWAYS:
770*61046927SAndroid Build Coastguard Worker case GL_NEVER:
771*61046927SAndroid Build Coastguard Worker flush(ctx);
772*61046927SAndroid Build Coastguard Worker samp->Attrib.CompareFunc = param;
773*61046927SAndroid Build Coastguard Worker samp->Attrib.state.compare_func = func_to_gallium(param);
774*61046927SAndroid Build Coastguard Worker return GL_TRUE;
775*61046927SAndroid Build Coastguard Worker default:
776*61046927SAndroid Build Coastguard Worker return INVALID_PARAM;
777*61046927SAndroid Build Coastguard Worker }
778*61046927SAndroid Build Coastguard Worker }
779*61046927SAndroid Build Coastguard Worker
780*61046927SAndroid Build Coastguard Worker
781*61046927SAndroid Build Coastguard Worker static GLuint
set_sampler_max_anisotropy(struct gl_context * ctx,struct gl_sampler_object * samp,GLfloat param)782*61046927SAndroid Build Coastguard Worker set_sampler_max_anisotropy(struct gl_context *ctx,
783*61046927SAndroid Build Coastguard Worker struct gl_sampler_object *samp, GLfloat param)
784*61046927SAndroid Build Coastguard Worker {
785*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.EXT_texture_filter_anisotropic)
786*61046927SAndroid Build Coastguard Worker return INVALID_PNAME;
787*61046927SAndroid Build Coastguard Worker
788*61046927SAndroid Build Coastguard Worker if (samp->Attrib.MaxAnisotropy == param)
789*61046927SAndroid Build Coastguard Worker return GL_FALSE;
790*61046927SAndroid Build Coastguard Worker
791*61046927SAndroid Build Coastguard Worker if (param < 1.0F)
792*61046927SAndroid Build Coastguard Worker return INVALID_VALUE;
793*61046927SAndroid Build Coastguard Worker
794*61046927SAndroid Build Coastguard Worker flush(ctx);
795*61046927SAndroid Build Coastguard Worker /* clamp to max, that's what NVIDIA does */
796*61046927SAndroid Build Coastguard Worker samp->Attrib.MaxAnisotropy = MIN2(param, ctx->Const.MaxTextureMaxAnisotropy);
797*61046927SAndroid Build Coastguard Worker /* gallium sets 0 for 1 */
798*61046927SAndroid Build Coastguard Worker samp->Attrib.state.max_anisotropy = samp->Attrib.MaxAnisotropy == 1 ?
799*61046927SAndroid Build Coastguard Worker 0 : samp->Attrib.MaxAnisotropy;
800*61046927SAndroid Build Coastguard Worker return GL_TRUE;
801*61046927SAndroid Build Coastguard Worker }
802*61046927SAndroid Build Coastguard Worker
803*61046927SAndroid Build Coastguard Worker
804*61046927SAndroid Build Coastguard Worker static GLuint
set_sampler_cube_map_seamless(struct gl_context * ctx,struct gl_sampler_object * samp,GLboolean param)805*61046927SAndroid Build Coastguard Worker set_sampler_cube_map_seamless(struct gl_context *ctx,
806*61046927SAndroid Build Coastguard Worker struct gl_sampler_object *samp, GLboolean param)
807*61046927SAndroid Build Coastguard Worker {
808*61046927SAndroid Build Coastguard Worker if (!_mesa_is_desktop_gl(ctx)
809*61046927SAndroid Build Coastguard Worker || !ctx->Extensions.AMD_seamless_cubemap_per_texture)
810*61046927SAndroid Build Coastguard Worker return INVALID_PNAME;
811*61046927SAndroid Build Coastguard Worker
812*61046927SAndroid Build Coastguard Worker if (samp->Attrib.CubeMapSeamless == param)
813*61046927SAndroid Build Coastguard Worker return GL_FALSE;
814*61046927SAndroid Build Coastguard Worker
815*61046927SAndroid Build Coastguard Worker if (param != GL_TRUE && param != GL_FALSE)
816*61046927SAndroid Build Coastguard Worker return INVALID_VALUE;
817*61046927SAndroid Build Coastguard Worker
818*61046927SAndroid Build Coastguard Worker flush(ctx);
819*61046927SAndroid Build Coastguard Worker samp->Attrib.CubeMapSeamless = param;
820*61046927SAndroid Build Coastguard Worker samp->Attrib.state.seamless_cube_map = param;
821*61046927SAndroid Build Coastguard Worker return GL_TRUE;
822*61046927SAndroid Build Coastguard Worker }
823*61046927SAndroid Build Coastguard Worker
824*61046927SAndroid Build Coastguard Worker static GLuint
set_sampler_srgb_decode(struct gl_context * ctx,struct gl_sampler_object * samp,GLenum param)825*61046927SAndroid Build Coastguard Worker set_sampler_srgb_decode(struct gl_context *ctx,
826*61046927SAndroid Build Coastguard Worker struct gl_sampler_object *samp, GLenum param)
827*61046927SAndroid Build Coastguard Worker {
828*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.EXT_texture_sRGB_decode)
829*61046927SAndroid Build Coastguard Worker return INVALID_PNAME;
830*61046927SAndroid Build Coastguard Worker
831*61046927SAndroid Build Coastguard Worker if (samp->Attrib.sRGBDecode == param)
832*61046927SAndroid Build Coastguard Worker return GL_FALSE;
833*61046927SAndroid Build Coastguard Worker
834*61046927SAndroid Build Coastguard Worker /* The EXT_texture_sRGB_decode spec says:
835*61046927SAndroid Build Coastguard Worker *
836*61046927SAndroid Build Coastguard Worker * "INVALID_ENUM is generated if the <pname> parameter of
837*61046927SAndroid Build Coastguard Worker * TexParameter[i,f,Ii,Iui][v][EXT],
838*61046927SAndroid Build Coastguard Worker * MultiTexParameter[i,f,Ii,Iui][v]EXT,
839*61046927SAndroid Build Coastguard Worker * TextureParameter[i,f,Ii,Iui][v]EXT, SamplerParameter[i,f,Ii,Iui][v]
840*61046927SAndroid Build Coastguard Worker * is TEXTURE_SRGB_DECODE_EXT when the <param> parameter is not one of
841*61046927SAndroid Build Coastguard Worker * DECODE_EXT or SKIP_DECODE_EXT.
842*61046927SAndroid Build Coastguard Worker *
843*61046927SAndroid Build Coastguard Worker * Returning INVALID_PARAM makes that happen.
844*61046927SAndroid Build Coastguard Worker */
845*61046927SAndroid Build Coastguard Worker if (param != GL_DECODE_EXT && param != GL_SKIP_DECODE_EXT)
846*61046927SAndroid Build Coastguard Worker return INVALID_PARAM;
847*61046927SAndroid Build Coastguard Worker
848*61046927SAndroid Build Coastguard Worker flush(ctx);
849*61046927SAndroid Build Coastguard Worker samp->Attrib.sRGBDecode = param;
850*61046927SAndroid Build Coastguard Worker return GL_TRUE;
851*61046927SAndroid Build Coastguard Worker }
852*61046927SAndroid Build Coastguard Worker
853*61046927SAndroid Build Coastguard Worker static GLuint
set_sampler_reduction_mode(struct gl_context * ctx,struct gl_sampler_object * samp,GLenum param)854*61046927SAndroid Build Coastguard Worker set_sampler_reduction_mode(struct gl_context *ctx,
855*61046927SAndroid Build Coastguard Worker struct gl_sampler_object *samp, GLenum param)
856*61046927SAndroid Build Coastguard Worker {
857*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.EXT_texture_filter_minmax &&
858*61046927SAndroid Build Coastguard Worker !_mesa_has_ARB_texture_filter_minmax(ctx))
859*61046927SAndroid Build Coastguard Worker return INVALID_PNAME;
860*61046927SAndroid Build Coastguard Worker
861*61046927SAndroid Build Coastguard Worker if (samp->Attrib.ReductionMode == param)
862*61046927SAndroid Build Coastguard Worker return GL_FALSE;
863*61046927SAndroid Build Coastguard Worker
864*61046927SAndroid Build Coastguard Worker if (param != GL_WEIGHTED_AVERAGE_EXT && param != GL_MIN && param != GL_MAX)
865*61046927SAndroid Build Coastguard Worker return INVALID_PARAM;
866*61046927SAndroid Build Coastguard Worker
867*61046927SAndroid Build Coastguard Worker flush(ctx);
868*61046927SAndroid Build Coastguard Worker samp->Attrib.ReductionMode = param;
869*61046927SAndroid Build Coastguard Worker samp->Attrib.state.reduction_mode = reduction_to_gallium(param);
870*61046927SAndroid Build Coastguard Worker return GL_TRUE;
871*61046927SAndroid Build Coastguard Worker }
872*61046927SAndroid Build Coastguard Worker
873*61046927SAndroid Build Coastguard Worker static struct gl_sampler_object *
sampler_parameter_error_check(struct gl_context * ctx,GLuint sampler,bool get,const char * name)874*61046927SAndroid Build Coastguard Worker sampler_parameter_error_check(struct gl_context *ctx, GLuint sampler,
875*61046927SAndroid Build Coastguard Worker bool get, const char *name)
876*61046927SAndroid Build Coastguard Worker {
877*61046927SAndroid Build Coastguard Worker struct gl_sampler_object *sampObj;
878*61046927SAndroid Build Coastguard Worker
879*61046927SAndroid Build Coastguard Worker sampObj = _mesa_lookup_samplerobj(ctx, sampler);
880*61046927SAndroid Build Coastguard Worker if (!sampObj) {
881*61046927SAndroid Build Coastguard Worker /* OpenGL 4.5 spec, section "8.2 Sampler Objects", page 176 of the PDF
882*61046927SAndroid Build Coastguard Worker * states:
883*61046927SAndroid Build Coastguard Worker *
884*61046927SAndroid Build Coastguard Worker * "An INVALID_OPERATION error is generated if sampler is not the name
885*61046927SAndroid Build Coastguard Worker * of a sampler object previously returned from a call to
886*61046927SAndroid Build Coastguard Worker * GenSamplers."
887*61046927SAndroid Build Coastguard Worker */
888*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_OPERATION, "%s(invalid sampler)", name);
889*61046927SAndroid Build Coastguard Worker return NULL;
890*61046927SAndroid Build Coastguard Worker }
891*61046927SAndroid Build Coastguard Worker
892*61046927SAndroid Build Coastguard Worker if (!get && sampObj->HandleAllocated) {
893*61046927SAndroid Build Coastguard Worker /* The ARB_bindless_texture spec says:
894*61046927SAndroid Build Coastguard Worker *
895*61046927SAndroid Build Coastguard Worker * "The error INVALID_OPERATION is generated by SamplerParameter* if
896*61046927SAndroid Build Coastguard Worker * <sampler> identifies a sampler object referenced by one or more
897*61046927SAndroid Build Coastguard Worker * texture handles."
898*61046927SAndroid Build Coastguard Worker */
899*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_OPERATION, "%s(immutable sampler)", name);
900*61046927SAndroid Build Coastguard Worker return NULL;
901*61046927SAndroid Build Coastguard Worker }
902*61046927SAndroid Build Coastguard Worker
903*61046927SAndroid Build Coastguard Worker return sampObj;
904*61046927SAndroid Build Coastguard Worker }
905*61046927SAndroid Build Coastguard Worker
906*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_SamplerParameteri(GLuint sampler,GLenum pname,GLint param)907*61046927SAndroid Build Coastguard Worker _mesa_SamplerParameteri(GLuint sampler, GLenum pname, GLint param)
908*61046927SAndroid Build Coastguard Worker {
909*61046927SAndroid Build Coastguard Worker struct gl_sampler_object *sampObj;
910*61046927SAndroid Build Coastguard Worker GLuint res;
911*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
912*61046927SAndroid Build Coastguard Worker
913*61046927SAndroid Build Coastguard Worker sampObj = sampler_parameter_error_check(ctx, sampler, false,
914*61046927SAndroid Build Coastguard Worker "glSamplerParameteri");
915*61046927SAndroid Build Coastguard Worker if (!sampObj)
916*61046927SAndroid Build Coastguard Worker return;
917*61046927SAndroid Build Coastguard Worker
918*61046927SAndroid Build Coastguard Worker switch (pname) {
919*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_S:
920*61046927SAndroid Build Coastguard Worker res = set_sampler_wrap_s(ctx, sampObj, param);
921*61046927SAndroid Build Coastguard Worker break;
922*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_T:
923*61046927SAndroid Build Coastguard Worker res = set_sampler_wrap_t(ctx, sampObj, param);
924*61046927SAndroid Build Coastguard Worker break;
925*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_R:
926*61046927SAndroid Build Coastguard Worker res = set_sampler_wrap_r(ctx, sampObj, param);
927*61046927SAndroid Build Coastguard Worker break;
928*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MIN_FILTER:
929*61046927SAndroid Build Coastguard Worker res = set_sampler_min_filter(ctx, sampObj, param);
930*61046927SAndroid Build Coastguard Worker break;
931*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAG_FILTER:
932*61046927SAndroid Build Coastguard Worker res = set_sampler_mag_filter(ctx, sampObj, param);
933*61046927SAndroid Build Coastguard Worker break;
934*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MIN_LOD:
935*61046927SAndroid Build Coastguard Worker res = set_sampler_min_lod(ctx, sampObj, (GLfloat) param);
936*61046927SAndroid Build Coastguard Worker break;
937*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAX_LOD:
938*61046927SAndroid Build Coastguard Worker res = set_sampler_max_lod(ctx, sampObj, (GLfloat) param);
939*61046927SAndroid Build Coastguard Worker break;
940*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_LOD_BIAS:
941*61046927SAndroid Build Coastguard Worker res = set_sampler_lod_bias(ctx, sampObj, (GLfloat) param);
942*61046927SAndroid Build Coastguard Worker break;
943*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COMPARE_MODE:
944*61046927SAndroid Build Coastguard Worker res = set_sampler_compare_mode(ctx, sampObj, param);
945*61046927SAndroid Build Coastguard Worker break;
946*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COMPARE_FUNC:
947*61046927SAndroid Build Coastguard Worker res = set_sampler_compare_func(ctx, sampObj, param);
948*61046927SAndroid Build Coastguard Worker break;
949*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAX_ANISOTROPY_EXT:
950*61046927SAndroid Build Coastguard Worker res = set_sampler_max_anisotropy(ctx, sampObj, (GLfloat) param);
951*61046927SAndroid Build Coastguard Worker break;
952*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_CUBE_MAP_SEAMLESS:
953*61046927SAndroid Build Coastguard Worker res = set_sampler_cube_map_seamless(ctx, sampObj, param);
954*61046927SAndroid Build Coastguard Worker break;
955*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SRGB_DECODE_EXT:
956*61046927SAndroid Build Coastguard Worker res = set_sampler_srgb_decode(ctx, sampObj, param);
957*61046927SAndroid Build Coastguard Worker break;
958*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_REDUCTION_MODE_EXT:
959*61046927SAndroid Build Coastguard Worker res = set_sampler_reduction_mode(ctx, sampObj, param);
960*61046927SAndroid Build Coastguard Worker break;
961*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BORDER_COLOR:
962*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
963*61046927SAndroid Build Coastguard Worker default:
964*61046927SAndroid Build Coastguard Worker res = INVALID_PNAME;
965*61046927SAndroid Build Coastguard Worker }
966*61046927SAndroid Build Coastguard Worker
967*61046927SAndroid Build Coastguard Worker switch (res) {
968*61046927SAndroid Build Coastguard Worker case GL_FALSE:
969*61046927SAndroid Build Coastguard Worker /* no change */
970*61046927SAndroid Build Coastguard Worker break;
971*61046927SAndroid Build Coastguard Worker case GL_TRUE:
972*61046927SAndroid Build Coastguard Worker /* state change - we do nothing special at this time */
973*61046927SAndroid Build Coastguard Worker break;
974*61046927SAndroid Build Coastguard Worker case INVALID_PNAME:
975*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM, "glSamplerParameteri(pname=%s)\n",
976*61046927SAndroid Build Coastguard Worker _mesa_enum_to_string(pname));
977*61046927SAndroid Build Coastguard Worker break;
978*61046927SAndroid Build Coastguard Worker case INVALID_PARAM:
979*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM, "glSamplerParameteri(param=%d)\n",
980*61046927SAndroid Build Coastguard Worker param);
981*61046927SAndroid Build Coastguard Worker break;
982*61046927SAndroid Build Coastguard Worker case INVALID_VALUE:
983*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_VALUE, "glSamplerParameteri(param=%d)\n",
984*61046927SAndroid Build Coastguard Worker param);
985*61046927SAndroid Build Coastguard Worker break;
986*61046927SAndroid Build Coastguard Worker default:
987*61046927SAndroid Build Coastguard Worker ;
988*61046927SAndroid Build Coastguard Worker }
989*61046927SAndroid Build Coastguard Worker }
990*61046927SAndroid Build Coastguard Worker
991*61046927SAndroid Build Coastguard Worker
992*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_SamplerParameterf(GLuint sampler,GLenum pname,GLfloat param)993*61046927SAndroid Build Coastguard Worker _mesa_SamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
994*61046927SAndroid Build Coastguard Worker {
995*61046927SAndroid Build Coastguard Worker struct gl_sampler_object *sampObj;
996*61046927SAndroid Build Coastguard Worker GLuint res;
997*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
998*61046927SAndroid Build Coastguard Worker
999*61046927SAndroid Build Coastguard Worker sampObj = sampler_parameter_error_check(ctx, sampler, false,
1000*61046927SAndroid Build Coastguard Worker "glSamplerParameterf");
1001*61046927SAndroid Build Coastguard Worker if (!sampObj)
1002*61046927SAndroid Build Coastguard Worker return;
1003*61046927SAndroid Build Coastguard Worker
1004*61046927SAndroid Build Coastguard Worker switch (pname) {
1005*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_S:
1006*61046927SAndroid Build Coastguard Worker res = set_sampler_wrap_s(ctx, sampObj, (GLint) param);
1007*61046927SAndroid Build Coastguard Worker break;
1008*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_T:
1009*61046927SAndroid Build Coastguard Worker res = set_sampler_wrap_t(ctx, sampObj, (GLint) param);
1010*61046927SAndroid Build Coastguard Worker break;
1011*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_R:
1012*61046927SAndroid Build Coastguard Worker res = set_sampler_wrap_r(ctx, sampObj, (GLint) param);
1013*61046927SAndroid Build Coastguard Worker break;
1014*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MIN_FILTER:
1015*61046927SAndroid Build Coastguard Worker res = set_sampler_min_filter(ctx, sampObj, (GLint) param);
1016*61046927SAndroid Build Coastguard Worker break;
1017*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAG_FILTER:
1018*61046927SAndroid Build Coastguard Worker res = set_sampler_mag_filter(ctx, sampObj, (GLint) param);
1019*61046927SAndroid Build Coastguard Worker break;
1020*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MIN_LOD:
1021*61046927SAndroid Build Coastguard Worker res = set_sampler_min_lod(ctx, sampObj, param);
1022*61046927SAndroid Build Coastguard Worker break;
1023*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAX_LOD:
1024*61046927SAndroid Build Coastguard Worker res = set_sampler_max_lod(ctx, sampObj, param);
1025*61046927SAndroid Build Coastguard Worker break;
1026*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_LOD_BIAS:
1027*61046927SAndroid Build Coastguard Worker res = set_sampler_lod_bias(ctx, sampObj, param);
1028*61046927SAndroid Build Coastguard Worker break;
1029*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COMPARE_MODE:
1030*61046927SAndroid Build Coastguard Worker res = set_sampler_compare_mode(ctx, sampObj, (GLint) param);
1031*61046927SAndroid Build Coastguard Worker break;
1032*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COMPARE_FUNC:
1033*61046927SAndroid Build Coastguard Worker res = set_sampler_compare_func(ctx, sampObj, (GLint) param);
1034*61046927SAndroid Build Coastguard Worker break;
1035*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAX_ANISOTROPY_EXT:
1036*61046927SAndroid Build Coastguard Worker res = set_sampler_max_anisotropy(ctx, sampObj, param);
1037*61046927SAndroid Build Coastguard Worker break;
1038*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_CUBE_MAP_SEAMLESS:
1039*61046927SAndroid Build Coastguard Worker res = set_sampler_cube_map_seamless(ctx, sampObj, (GLboolean) param);
1040*61046927SAndroid Build Coastguard Worker break;
1041*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SRGB_DECODE_EXT:
1042*61046927SAndroid Build Coastguard Worker res = set_sampler_srgb_decode(ctx, sampObj, (GLenum) param);
1043*61046927SAndroid Build Coastguard Worker break;
1044*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_REDUCTION_MODE_EXT:
1045*61046927SAndroid Build Coastguard Worker res = set_sampler_reduction_mode(ctx, sampObj, (GLenum) param);
1046*61046927SAndroid Build Coastguard Worker break;
1047*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BORDER_COLOR:
1048*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
1049*61046927SAndroid Build Coastguard Worker default:
1050*61046927SAndroid Build Coastguard Worker res = INVALID_PNAME;
1051*61046927SAndroid Build Coastguard Worker }
1052*61046927SAndroid Build Coastguard Worker
1053*61046927SAndroid Build Coastguard Worker switch (res) {
1054*61046927SAndroid Build Coastguard Worker case GL_FALSE:
1055*61046927SAndroid Build Coastguard Worker /* no change */
1056*61046927SAndroid Build Coastguard Worker break;
1057*61046927SAndroid Build Coastguard Worker case GL_TRUE:
1058*61046927SAndroid Build Coastguard Worker /* state change - we do nothing special at this time */
1059*61046927SAndroid Build Coastguard Worker break;
1060*61046927SAndroid Build Coastguard Worker case INVALID_PNAME:
1061*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM, "glSamplerParameterf(pname=%s)\n",
1062*61046927SAndroid Build Coastguard Worker _mesa_enum_to_string(pname));
1063*61046927SAndroid Build Coastguard Worker break;
1064*61046927SAndroid Build Coastguard Worker case INVALID_PARAM:
1065*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM, "glSamplerParameterf(param=%f)\n",
1066*61046927SAndroid Build Coastguard Worker param);
1067*61046927SAndroid Build Coastguard Worker break;
1068*61046927SAndroid Build Coastguard Worker case INVALID_VALUE:
1069*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_VALUE, "glSamplerParameterf(param=%f)\n",
1070*61046927SAndroid Build Coastguard Worker param);
1071*61046927SAndroid Build Coastguard Worker break;
1072*61046927SAndroid Build Coastguard Worker default:
1073*61046927SAndroid Build Coastguard Worker ;
1074*61046927SAndroid Build Coastguard Worker }
1075*61046927SAndroid Build Coastguard Worker }
1076*61046927SAndroid Build Coastguard Worker
1077*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_SamplerParameteriv(GLuint sampler,GLenum pname,const GLint * params)1078*61046927SAndroid Build Coastguard Worker _mesa_SamplerParameteriv(GLuint sampler, GLenum pname, const GLint *params)
1079*61046927SAndroid Build Coastguard Worker {
1080*61046927SAndroid Build Coastguard Worker struct gl_sampler_object *sampObj;
1081*61046927SAndroid Build Coastguard Worker GLuint res;
1082*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
1083*61046927SAndroid Build Coastguard Worker
1084*61046927SAndroid Build Coastguard Worker sampObj = sampler_parameter_error_check(ctx, sampler, false,
1085*61046927SAndroid Build Coastguard Worker "glSamplerParameteriv");
1086*61046927SAndroid Build Coastguard Worker if (!sampObj)
1087*61046927SAndroid Build Coastguard Worker return;
1088*61046927SAndroid Build Coastguard Worker
1089*61046927SAndroid Build Coastguard Worker switch (pname) {
1090*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_S:
1091*61046927SAndroid Build Coastguard Worker res = set_sampler_wrap_s(ctx, sampObj, params[0]);
1092*61046927SAndroid Build Coastguard Worker break;
1093*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_T:
1094*61046927SAndroid Build Coastguard Worker res = set_sampler_wrap_t(ctx, sampObj, params[0]);
1095*61046927SAndroid Build Coastguard Worker break;
1096*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_R:
1097*61046927SAndroid Build Coastguard Worker res = set_sampler_wrap_r(ctx, sampObj, params[0]);
1098*61046927SAndroid Build Coastguard Worker break;
1099*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MIN_FILTER:
1100*61046927SAndroid Build Coastguard Worker res = set_sampler_min_filter(ctx, sampObj, params[0]);
1101*61046927SAndroid Build Coastguard Worker break;
1102*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAG_FILTER:
1103*61046927SAndroid Build Coastguard Worker res = set_sampler_mag_filter(ctx, sampObj, params[0]);
1104*61046927SAndroid Build Coastguard Worker break;
1105*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MIN_LOD:
1106*61046927SAndroid Build Coastguard Worker res = set_sampler_min_lod(ctx, sampObj, (GLfloat) params[0]);
1107*61046927SAndroid Build Coastguard Worker break;
1108*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAX_LOD:
1109*61046927SAndroid Build Coastguard Worker res = set_sampler_max_lod(ctx, sampObj, (GLfloat) params[0]);
1110*61046927SAndroid Build Coastguard Worker break;
1111*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_LOD_BIAS:
1112*61046927SAndroid Build Coastguard Worker res = set_sampler_lod_bias(ctx, sampObj, (GLfloat) params[0]);
1113*61046927SAndroid Build Coastguard Worker break;
1114*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COMPARE_MODE:
1115*61046927SAndroid Build Coastguard Worker res = set_sampler_compare_mode(ctx, sampObj, params[0]);
1116*61046927SAndroid Build Coastguard Worker break;
1117*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COMPARE_FUNC:
1118*61046927SAndroid Build Coastguard Worker res = set_sampler_compare_func(ctx, sampObj, params[0]);
1119*61046927SAndroid Build Coastguard Worker break;
1120*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAX_ANISOTROPY_EXT:
1121*61046927SAndroid Build Coastguard Worker res = set_sampler_max_anisotropy(ctx, sampObj, (GLfloat) params[0]);
1122*61046927SAndroid Build Coastguard Worker break;
1123*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_CUBE_MAP_SEAMLESS:
1124*61046927SAndroid Build Coastguard Worker res = set_sampler_cube_map_seamless(ctx, sampObj, params[0]);
1125*61046927SAndroid Build Coastguard Worker break;
1126*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SRGB_DECODE_EXT:
1127*61046927SAndroid Build Coastguard Worker res = set_sampler_srgb_decode(ctx, sampObj, params[0]);
1128*61046927SAndroid Build Coastguard Worker break;
1129*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_REDUCTION_MODE_EXT:
1130*61046927SAndroid Build Coastguard Worker res = set_sampler_reduction_mode(ctx, sampObj, params[0]);
1131*61046927SAndroid Build Coastguard Worker break;
1132*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BORDER_COLOR:
1133*61046927SAndroid Build Coastguard Worker {
1134*61046927SAndroid Build Coastguard Worker GLfloat c[4];
1135*61046927SAndroid Build Coastguard Worker c[0] = INT_TO_FLOAT(params[0]);
1136*61046927SAndroid Build Coastguard Worker c[1] = INT_TO_FLOAT(params[1]);
1137*61046927SAndroid Build Coastguard Worker c[2] = INT_TO_FLOAT(params[2]);
1138*61046927SAndroid Build Coastguard Worker c[3] = INT_TO_FLOAT(params[3]);
1139*61046927SAndroid Build Coastguard Worker res = set_sampler_border_colorf(ctx, sampObj, c);
1140*61046927SAndroid Build Coastguard Worker }
1141*61046927SAndroid Build Coastguard Worker break;
1142*61046927SAndroid Build Coastguard Worker default:
1143*61046927SAndroid Build Coastguard Worker res = INVALID_PNAME;
1144*61046927SAndroid Build Coastguard Worker }
1145*61046927SAndroid Build Coastguard Worker
1146*61046927SAndroid Build Coastguard Worker switch (res) {
1147*61046927SAndroid Build Coastguard Worker case GL_FALSE:
1148*61046927SAndroid Build Coastguard Worker /* no change */
1149*61046927SAndroid Build Coastguard Worker break;
1150*61046927SAndroid Build Coastguard Worker case GL_TRUE:
1151*61046927SAndroid Build Coastguard Worker /* state change - we do nothing special at this time */
1152*61046927SAndroid Build Coastguard Worker break;
1153*61046927SAndroid Build Coastguard Worker case INVALID_PNAME:
1154*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM, "glSamplerParameteriv(pname=%s)\n",
1155*61046927SAndroid Build Coastguard Worker _mesa_enum_to_string(pname));
1156*61046927SAndroid Build Coastguard Worker break;
1157*61046927SAndroid Build Coastguard Worker case INVALID_PARAM:
1158*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM, "glSamplerParameteriv(param=%d)\n",
1159*61046927SAndroid Build Coastguard Worker params[0]);
1160*61046927SAndroid Build Coastguard Worker break;
1161*61046927SAndroid Build Coastguard Worker case INVALID_VALUE:
1162*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_VALUE, "glSamplerParameteriv(param=%d)\n",
1163*61046927SAndroid Build Coastguard Worker params[0]);
1164*61046927SAndroid Build Coastguard Worker break;
1165*61046927SAndroid Build Coastguard Worker default:
1166*61046927SAndroid Build Coastguard Worker ;
1167*61046927SAndroid Build Coastguard Worker }
1168*61046927SAndroid Build Coastguard Worker }
1169*61046927SAndroid Build Coastguard Worker
1170*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_SamplerParameterfv(GLuint sampler,GLenum pname,const GLfloat * params)1171*61046927SAndroid Build Coastguard Worker _mesa_SamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *params)
1172*61046927SAndroid Build Coastguard Worker {
1173*61046927SAndroid Build Coastguard Worker struct gl_sampler_object *sampObj;
1174*61046927SAndroid Build Coastguard Worker GLuint res;
1175*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
1176*61046927SAndroid Build Coastguard Worker
1177*61046927SAndroid Build Coastguard Worker sampObj = sampler_parameter_error_check(ctx, sampler, false,
1178*61046927SAndroid Build Coastguard Worker "glSamplerParameterfv");
1179*61046927SAndroid Build Coastguard Worker if (!sampObj)
1180*61046927SAndroid Build Coastguard Worker return;
1181*61046927SAndroid Build Coastguard Worker
1182*61046927SAndroid Build Coastguard Worker switch (pname) {
1183*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_S:
1184*61046927SAndroid Build Coastguard Worker res = set_sampler_wrap_s(ctx, sampObj, (GLint) params[0]);
1185*61046927SAndroid Build Coastguard Worker break;
1186*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_T:
1187*61046927SAndroid Build Coastguard Worker res = set_sampler_wrap_t(ctx, sampObj, (GLint) params[0]);
1188*61046927SAndroid Build Coastguard Worker break;
1189*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_R:
1190*61046927SAndroid Build Coastguard Worker res = set_sampler_wrap_r(ctx, sampObj, (GLint) params[0]);
1191*61046927SAndroid Build Coastguard Worker break;
1192*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MIN_FILTER:
1193*61046927SAndroid Build Coastguard Worker res = set_sampler_min_filter(ctx, sampObj, (GLint) params[0]);
1194*61046927SAndroid Build Coastguard Worker break;
1195*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAG_FILTER:
1196*61046927SAndroid Build Coastguard Worker res = set_sampler_mag_filter(ctx, sampObj, (GLint) params[0]);
1197*61046927SAndroid Build Coastguard Worker break;
1198*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MIN_LOD:
1199*61046927SAndroid Build Coastguard Worker res = set_sampler_min_lod(ctx, sampObj, params[0]);
1200*61046927SAndroid Build Coastguard Worker break;
1201*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAX_LOD:
1202*61046927SAndroid Build Coastguard Worker res = set_sampler_max_lod(ctx, sampObj, params[0]);
1203*61046927SAndroid Build Coastguard Worker break;
1204*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_LOD_BIAS:
1205*61046927SAndroid Build Coastguard Worker res = set_sampler_lod_bias(ctx, sampObj, params[0]);
1206*61046927SAndroid Build Coastguard Worker break;
1207*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COMPARE_MODE:
1208*61046927SAndroid Build Coastguard Worker res = set_sampler_compare_mode(ctx, sampObj, (GLint) params[0]);
1209*61046927SAndroid Build Coastguard Worker break;
1210*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COMPARE_FUNC:
1211*61046927SAndroid Build Coastguard Worker res = set_sampler_compare_func(ctx, sampObj, (GLint) params[0]);
1212*61046927SAndroid Build Coastguard Worker break;
1213*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAX_ANISOTROPY_EXT:
1214*61046927SAndroid Build Coastguard Worker res = set_sampler_max_anisotropy(ctx, sampObj, params[0]);
1215*61046927SAndroid Build Coastguard Worker break;
1216*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_CUBE_MAP_SEAMLESS:
1217*61046927SAndroid Build Coastguard Worker res = set_sampler_cube_map_seamless(ctx, sampObj, (GLboolean) params[0]);
1218*61046927SAndroid Build Coastguard Worker break;
1219*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SRGB_DECODE_EXT:
1220*61046927SAndroid Build Coastguard Worker res = set_sampler_srgb_decode(ctx, sampObj, (GLenum) params[0]);
1221*61046927SAndroid Build Coastguard Worker break;
1222*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_REDUCTION_MODE_EXT:
1223*61046927SAndroid Build Coastguard Worker res = set_sampler_reduction_mode(ctx, sampObj, (GLenum) params[0]);
1224*61046927SAndroid Build Coastguard Worker break;
1225*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BORDER_COLOR:
1226*61046927SAndroid Build Coastguard Worker res = set_sampler_border_colorf(ctx, sampObj, params);
1227*61046927SAndroid Build Coastguard Worker break;
1228*61046927SAndroid Build Coastguard Worker default:
1229*61046927SAndroid Build Coastguard Worker res = INVALID_PNAME;
1230*61046927SAndroid Build Coastguard Worker }
1231*61046927SAndroid Build Coastguard Worker
1232*61046927SAndroid Build Coastguard Worker switch (res) {
1233*61046927SAndroid Build Coastguard Worker case GL_FALSE:
1234*61046927SAndroid Build Coastguard Worker /* no change */
1235*61046927SAndroid Build Coastguard Worker break;
1236*61046927SAndroid Build Coastguard Worker case GL_TRUE:
1237*61046927SAndroid Build Coastguard Worker /* state change - we do nothing special at this time */
1238*61046927SAndroid Build Coastguard Worker break;
1239*61046927SAndroid Build Coastguard Worker case INVALID_PNAME:
1240*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM, "glSamplerParameterfv(pname=%s)\n",
1241*61046927SAndroid Build Coastguard Worker _mesa_enum_to_string(pname));
1242*61046927SAndroid Build Coastguard Worker break;
1243*61046927SAndroid Build Coastguard Worker case INVALID_PARAM:
1244*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM, "glSamplerParameterfv(param=%f)\n",
1245*61046927SAndroid Build Coastguard Worker params[0]);
1246*61046927SAndroid Build Coastguard Worker break;
1247*61046927SAndroid Build Coastguard Worker case INVALID_VALUE:
1248*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_VALUE, "glSamplerParameterfv(param=%f)\n",
1249*61046927SAndroid Build Coastguard Worker params[0]);
1250*61046927SAndroid Build Coastguard Worker break;
1251*61046927SAndroid Build Coastguard Worker default:
1252*61046927SAndroid Build Coastguard Worker ;
1253*61046927SAndroid Build Coastguard Worker }
1254*61046927SAndroid Build Coastguard Worker }
1255*61046927SAndroid Build Coastguard Worker
1256*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_SamplerParameterIiv(GLuint sampler,GLenum pname,const GLint * params)1257*61046927SAndroid Build Coastguard Worker _mesa_SamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *params)
1258*61046927SAndroid Build Coastguard Worker {
1259*61046927SAndroid Build Coastguard Worker struct gl_sampler_object *sampObj;
1260*61046927SAndroid Build Coastguard Worker GLuint res;
1261*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
1262*61046927SAndroid Build Coastguard Worker
1263*61046927SAndroid Build Coastguard Worker sampObj = sampler_parameter_error_check(ctx, sampler, false,
1264*61046927SAndroid Build Coastguard Worker "glSamplerParameterIiv");
1265*61046927SAndroid Build Coastguard Worker if (!sampObj)
1266*61046927SAndroid Build Coastguard Worker return;
1267*61046927SAndroid Build Coastguard Worker
1268*61046927SAndroid Build Coastguard Worker switch (pname) {
1269*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_S:
1270*61046927SAndroid Build Coastguard Worker res = set_sampler_wrap_s(ctx, sampObj, params[0]);
1271*61046927SAndroid Build Coastguard Worker break;
1272*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_T:
1273*61046927SAndroid Build Coastguard Worker res = set_sampler_wrap_t(ctx, sampObj, params[0]);
1274*61046927SAndroid Build Coastguard Worker break;
1275*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_R:
1276*61046927SAndroid Build Coastguard Worker res = set_sampler_wrap_r(ctx, sampObj, params[0]);
1277*61046927SAndroid Build Coastguard Worker break;
1278*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MIN_FILTER:
1279*61046927SAndroid Build Coastguard Worker res = set_sampler_min_filter(ctx, sampObj, params[0]);
1280*61046927SAndroid Build Coastguard Worker break;
1281*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAG_FILTER:
1282*61046927SAndroid Build Coastguard Worker res = set_sampler_mag_filter(ctx, sampObj, params[0]);
1283*61046927SAndroid Build Coastguard Worker break;
1284*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MIN_LOD:
1285*61046927SAndroid Build Coastguard Worker res = set_sampler_min_lod(ctx, sampObj, (GLfloat) params[0]);
1286*61046927SAndroid Build Coastguard Worker break;
1287*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAX_LOD:
1288*61046927SAndroid Build Coastguard Worker res = set_sampler_max_lod(ctx, sampObj, (GLfloat) params[0]);
1289*61046927SAndroid Build Coastguard Worker break;
1290*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_LOD_BIAS:
1291*61046927SAndroid Build Coastguard Worker res = set_sampler_lod_bias(ctx, sampObj, (GLfloat) params[0]);
1292*61046927SAndroid Build Coastguard Worker break;
1293*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COMPARE_MODE:
1294*61046927SAndroid Build Coastguard Worker res = set_sampler_compare_mode(ctx, sampObj, params[0]);
1295*61046927SAndroid Build Coastguard Worker break;
1296*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COMPARE_FUNC:
1297*61046927SAndroid Build Coastguard Worker res = set_sampler_compare_func(ctx, sampObj, params[0]);
1298*61046927SAndroid Build Coastguard Worker break;
1299*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAX_ANISOTROPY_EXT:
1300*61046927SAndroid Build Coastguard Worker res = set_sampler_max_anisotropy(ctx, sampObj, (GLfloat) params[0]);
1301*61046927SAndroid Build Coastguard Worker break;
1302*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_CUBE_MAP_SEAMLESS:
1303*61046927SAndroid Build Coastguard Worker res = set_sampler_cube_map_seamless(ctx, sampObj, params[0]);
1304*61046927SAndroid Build Coastguard Worker break;
1305*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SRGB_DECODE_EXT:
1306*61046927SAndroid Build Coastguard Worker res = set_sampler_srgb_decode(ctx, sampObj, (GLenum) params[0]);
1307*61046927SAndroid Build Coastguard Worker break;
1308*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_REDUCTION_MODE_EXT:
1309*61046927SAndroid Build Coastguard Worker res = set_sampler_reduction_mode(ctx, sampObj, (GLenum) params[0]);
1310*61046927SAndroid Build Coastguard Worker break;
1311*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BORDER_COLOR:
1312*61046927SAndroid Build Coastguard Worker res = set_sampler_border_colori(ctx, sampObj, params);
1313*61046927SAndroid Build Coastguard Worker break;
1314*61046927SAndroid Build Coastguard Worker default:
1315*61046927SAndroid Build Coastguard Worker res = INVALID_PNAME;
1316*61046927SAndroid Build Coastguard Worker }
1317*61046927SAndroid Build Coastguard Worker
1318*61046927SAndroid Build Coastguard Worker switch (res) {
1319*61046927SAndroid Build Coastguard Worker case GL_FALSE:
1320*61046927SAndroid Build Coastguard Worker /* no change */
1321*61046927SAndroid Build Coastguard Worker break;
1322*61046927SAndroid Build Coastguard Worker case GL_TRUE:
1323*61046927SAndroid Build Coastguard Worker /* state change - we do nothing special at this time */
1324*61046927SAndroid Build Coastguard Worker break;
1325*61046927SAndroid Build Coastguard Worker case INVALID_PNAME:
1326*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM, "glSamplerParameterIiv(pname=%s)\n",
1327*61046927SAndroid Build Coastguard Worker _mesa_enum_to_string(pname));
1328*61046927SAndroid Build Coastguard Worker break;
1329*61046927SAndroid Build Coastguard Worker case INVALID_PARAM:
1330*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM, "glSamplerParameterIiv(param=%d)\n",
1331*61046927SAndroid Build Coastguard Worker params[0]);
1332*61046927SAndroid Build Coastguard Worker break;
1333*61046927SAndroid Build Coastguard Worker case INVALID_VALUE:
1334*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_VALUE, "glSamplerParameterIiv(param=%d)\n",
1335*61046927SAndroid Build Coastguard Worker params[0]);
1336*61046927SAndroid Build Coastguard Worker break;
1337*61046927SAndroid Build Coastguard Worker default:
1338*61046927SAndroid Build Coastguard Worker ;
1339*61046927SAndroid Build Coastguard Worker }
1340*61046927SAndroid Build Coastguard Worker }
1341*61046927SAndroid Build Coastguard Worker
1342*61046927SAndroid Build Coastguard Worker
1343*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_SamplerParameterIuiv(GLuint sampler,GLenum pname,const GLuint * params)1344*61046927SAndroid Build Coastguard Worker _mesa_SamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *params)
1345*61046927SAndroid Build Coastguard Worker {
1346*61046927SAndroid Build Coastguard Worker struct gl_sampler_object *sampObj;
1347*61046927SAndroid Build Coastguard Worker GLuint res;
1348*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
1349*61046927SAndroid Build Coastguard Worker
1350*61046927SAndroid Build Coastguard Worker sampObj = sampler_parameter_error_check(ctx, sampler, false,
1351*61046927SAndroid Build Coastguard Worker "glSamplerParameterIuiv");
1352*61046927SAndroid Build Coastguard Worker if (!sampObj)
1353*61046927SAndroid Build Coastguard Worker return;
1354*61046927SAndroid Build Coastguard Worker
1355*61046927SAndroid Build Coastguard Worker switch (pname) {
1356*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_S:
1357*61046927SAndroid Build Coastguard Worker res = set_sampler_wrap_s(ctx, sampObj, params[0]);
1358*61046927SAndroid Build Coastguard Worker break;
1359*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_T:
1360*61046927SAndroid Build Coastguard Worker res = set_sampler_wrap_t(ctx, sampObj, params[0]);
1361*61046927SAndroid Build Coastguard Worker break;
1362*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_R:
1363*61046927SAndroid Build Coastguard Worker res = set_sampler_wrap_r(ctx, sampObj, params[0]);
1364*61046927SAndroid Build Coastguard Worker break;
1365*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MIN_FILTER:
1366*61046927SAndroid Build Coastguard Worker res = set_sampler_min_filter(ctx, sampObj, params[0]);
1367*61046927SAndroid Build Coastguard Worker break;
1368*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAG_FILTER:
1369*61046927SAndroid Build Coastguard Worker res = set_sampler_mag_filter(ctx, sampObj, params[0]);
1370*61046927SAndroid Build Coastguard Worker break;
1371*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MIN_LOD:
1372*61046927SAndroid Build Coastguard Worker res = set_sampler_min_lod(ctx, sampObj, (GLfloat) params[0]);
1373*61046927SAndroid Build Coastguard Worker break;
1374*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAX_LOD:
1375*61046927SAndroid Build Coastguard Worker res = set_sampler_max_lod(ctx, sampObj, (GLfloat) params[0]);
1376*61046927SAndroid Build Coastguard Worker break;
1377*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_LOD_BIAS:
1378*61046927SAndroid Build Coastguard Worker res = set_sampler_lod_bias(ctx, sampObj, (GLfloat) params[0]);
1379*61046927SAndroid Build Coastguard Worker break;
1380*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COMPARE_MODE:
1381*61046927SAndroid Build Coastguard Worker res = set_sampler_compare_mode(ctx, sampObj, params[0]);
1382*61046927SAndroid Build Coastguard Worker break;
1383*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COMPARE_FUNC:
1384*61046927SAndroid Build Coastguard Worker res = set_sampler_compare_func(ctx, sampObj, params[0]);
1385*61046927SAndroid Build Coastguard Worker break;
1386*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAX_ANISOTROPY_EXT:
1387*61046927SAndroid Build Coastguard Worker res = set_sampler_max_anisotropy(ctx, sampObj, (GLfloat) params[0]);
1388*61046927SAndroid Build Coastguard Worker break;
1389*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_CUBE_MAP_SEAMLESS:
1390*61046927SAndroid Build Coastguard Worker res = set_sampler_cube_map_seamless(ctx, sampObj, params[0]);
1391*61046927SAndroid Build Coastguard Worker break;
1392*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SRGB_DECODE_EXT:
1393*61046927SAndroid Build Coastguard Worker res = set_sampler_srgb_decode(ctx, sampObj, (GLenum) params[0]);
1394*61046927SAndroid Build Coastguard Worker break;
1395*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_REDUCTION_MODE_EXT:
1396*61046927SAndroid Build Coastguard Worker res = set_sampler_reduction_mode(ctx, sampObj, (GLenum) params[0]);
1397*61046927SAndroid Build Coastguard Worker break;
1398*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BORDER_COLOR:
1399*61046927SAndroid Build Coastguard Worker res = set_sampler_border_colorui(ctx, sampObj, params);
1400*61046927SAndroid Build Coastguard Worker break;
1401*61046927SAndroid Build Coastguard Worker default:
1402*61046927SAndroid Build Coastguard Worker res = INVALID_PNAME;
1403*61046927SAndroid Build Coastguard Worker }
1404*61046927SAndroid Build Coastguard Worker
1405*61046927SAndroid Build Coastguard Worker switch (res) {
1406*61046927SAndroid Build Coastguard Worker case GL_FALSE:
1407*61046927SAndroid Build Coastguard Worker /* no change */
1408*61046927SAndroid Build Coastguard Worker break;
1409*61046927SAndroid Build Coastguard Worker case GL_TRUE:
1410*61046927SAndroid Build Coastguard Worker /* state change - we do nothing special at this time */
1411*61046927SAndroid Build Coastguard Worker break;
1412*61046927SAndroid Build Coastguard Worker case INVALID_PNAME:
1413*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM, "glSamplerParameterIuiv(pname=%s)\n",
1414*61046927SAndroid Build Coastguard Worker _mesa_enum_to_string(pname));
1415*61046927SAndroid Build Coastguard Worker break;
1416*61046927SAndroid Build Coastguard Worker case INVALID_PARAM:
1417*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM, "glSamplerParameterIuiv(param=%u)\n",
1418*61046927SAndroid Build Coastguard Worker params[0]);
1419*61046927SAndroid Build Coastguard Worker break;
1420*61046927SAndroid Build Coastguard Worker case INVALID_VALUE:
1421*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_VALUE, "glSamplerParameterIuiv(param=%u)\n",
1422*61046927SAndroid Build Coastguard Worker params[0]);
1423*61046927SAndroid Build Coastguard Worker break;
1424*61046927SAndroid Build Coastguard Worker default:
1425*61046927SAndroid Build Coastguard Worker ;
1426*61046927SAndroid Build Coastguard Worker }
1427*61046927SAndroid Build Coastguard Worker }
1428*61046927SAndroid Build Coastguard Worker
1429*61046927SAndroid Build Coastguard Worker
1430*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetSamplerParameteriv(GLuint sampler,GLenum pname,GLint * params)1431*61046927SAndroid Build Coastguard Worker _mesa_GetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
1432*61046927SAndroid Build Coastguard Worker {
1433*61046927SAndroid Build Coastguard Worker struct gl_sampler_object *sampObj;
1434*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
1435*61046927SAndroid Build Coastguard Worker
1436*61046927SAndroid Build Coastguard Worker sampObj = sampler_parameter_error_check(ctx, sampler, true,
1437*61046927SAndroid Build Coastguard Worker "glGetSamplerParameteriv");
1438*61046927SAndroid Build Coastguard Worker if (!sampObj)
1439*61046927SAndroid Build Coastguard Worker return;
1440*61046927SAndroid Build Coastguard Worker
1441*61046927SAndroid Build Coastguard Worker switch (pname) {
1442*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_S:
1443*61046927SAndroid Build Coastguard Worker *params = sampObj->Attrib.WrapS;
1444*61046927SAndroid Build Coastguard Worker break;
1445*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_T:
1446*61046927SAndroid Build Coastguard Worker *params = sampObj->Attrib.WrapT;
1447*61046927SAndroid Build Coastguard Worker break;
1448*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_R:
1449*61046927SAndroid Build Coastguard Worker *params = sampObj->Attrib.WrapR;
1450*61046927SAndroid Build Coastguard Worker break;
1451*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MIN_FILTER:
1452*61046927SAndroid Build Coastguard Worker *params = sampObj->Attrib.MinFilter;
1453*61046927SAndroid Build Coastguard Worker break;
1454*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAG_FILTER:
1455*61046927SAndroid Build Coastguard Worker *params = sampObj->Attrib.MagFilter;
1456*61046927SAndroid Build Coastguard Worker break;
1457*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MIN_LOD:
1458*61046927SAndroid Build Coastguard Worker /* GL spec 'Data Conversions' section specifies that floating-point
1459*61046927SAndroid Build Coastguard Worker * value in integer Get function is rounded to nearest integer
1460*61046927SAndroid Build Coastguard Worker */
1461*61046927SAndroid Build Coastguard Worker *params = lroundf(sampObj->Attrib.MinLod);
1462*61046927SAndroid Build Coastguard Worker break;
1463*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAX_LOD:
1464*61046927SAndroid Build Coastguard Worker /* GL spec 'Data Conversions' section specifies that floating-point
1465*61046927SAndroid Build Coastguard Worker * value in integer Get function is rounded to nearest integer
1466*61046927SAndroid Build Coastguard Worker */
1467*61046927SAndroid Build Coastguard Worker *params = lroundf(sampObj->Attrib.MaxLod);
1468*61046927SAndroid Build Coastguard Worker break;
1469*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_LOD_BIAS:
1470*61046927SAndroid Build Coastguard Worker /* GL spec 'Data Conversions' section specifies that floating-point
1471*61046927SAndroid Build Coastguard Worker * value in integer Get function is rounded to nearest integer
1472*61046927SAndroid Build Coastguard Worker */
1473*61046927SAndroid Build Coastguard Worker *params = lroundf(sampObj->Attrib.LodBias);
1474*61046927SAndroid Build Coastguard Worker break;
1475*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COMPARE_MODE:
1476*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_shadow)
1477*61046927SAndroid Build Coastguard Worker goto invalid_pname;
1478*61046927SAndroid Build Coastguard Worker *params = sampObj->Attrib.CompareMode;
1479*61046927SAndroid Build Coastguard Worker break;
1480*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COMPARE_FUNC:
1481*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_shadow)
1482*61046927SAndroid Build Coastguard Worker goto invalid_pname;
1483*61046927SAndroid Build Coastguard Worker *params = sampObj->Attrib.CompareFunc;
1484*61046927SAndroid Build Coastguard Worker break;
1485*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAX_ANISOTROPY_EXT:
1486*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.EXT_texture_filter_anisotropic)
1487*61046927SAndroid Build Coastguard Worker goto invalid_pname;
1488*61046927SAndroid Build Coastguard Worker /* GL spec 'Data Conversions' section specifies that floating-point
1489*61046927SAndroid Build Coastguard Worker * value in integer Get function is rounded to nearest integer
1490*61046927SAndroid Build Coastguard Worker */
1491*61046927SAndroid Build Coastguard Worker *params = lroundf(sampObj->Attrib.MaxAnisotropy);
1492*61046927SAndroid Build Coastguard Worker break;
1493*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BORDER_COLOR:
1494*61046927SAndroid Build Coastguard Worker params[0] = FLOAT_TO_INT(sampObj->Attrib.state.border_color.f[0]);
1495*61046927SAndroid Build Coastguard Worker params[1] = FLOAT_TO_INT(sampObj->Attrib.state.border_color.f[1]);
1496*61046927SAndroid Build Coastguard Worker params[2] = FLOAT_TO_INT(sampObj->Attrib.state.border_color.f[2]);
1497*61046927SAndroid Build Coastguard Worker params[3] = FLOAT_TO_INT(sampObj->Attrib.state.border_color.f[3]);
1498*61046927SAndroid Build Coastguard Worker break;
1499*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_CUBE_MAP_SEAMLESS:
1500*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.AMD_seamless_cubemap_per_texture)
1501*61046927SAndroid Build Coastguard Worker goto invalid_pname;
1502*61046927SAndroid Build Coastguard Worker *params = sampObj->Attrib.CubeMapSeamless;
1503*61046927SAndroid Build Coastguard Worker break;
1504*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SRGB_DECODE_EXT:
1505*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.EXT_texture_sRGB_decode)
1506*61046927SAndroid Build Coastguard Worker goto invalid_pname;
1507*61046927SAndroid Build Coastguard Worker *params = (GLenum) sampObj->Attrib.sRGBDecode;
1508*61046927SAndroid Build Coastguard Worker break;
1509*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_REDUCTION_MODE_EXT:
1510*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.EXT_texture_filter_minmax &&
1511*61046927SAndroid Build Coastguard Worker !_mesa_has_ARB_texture_filter_minmax(ctx))
1512*61046927SAndroid Build Coastguard Worker goto invalid_pname;
1513*61046927SAndroid Build Coastguard Worker *params = (GLenum) sampObj->Attrib.ReductionMode;
1514*61046927SAndroid Build Coastguard Worker break;
1515*61046927SAndroid Build Coastguard Worker default:
1516*61046927SAndroid Build Coastguard Worker goto invalid_pname;
1517*61046927SAndroid Build Coastguard Worker }
1518*61046927SAndroid Build Coastguard Worker return;
1519*61046927SAndroid Build Coastguard Worker
1520*61046927SAndroid Build Coastguard Worker invalid_pname:
1521*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM, "glGetSamplerParameteriv(pname=%s)",
1522*61046927SAndroid Build Coastguard Worker _mesa_enum_to_string(pname));
1523*61046927SAndroid Build Coastguard Worker }
1524*61046927SAndroid Build Coastguard Worker
1525*61046927SAndroid Build Coastguard Worker
1526*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetSamplerParameterfv(GLuint sampler,GLenum pname,GLfloat * params)1527*61046927SAndroid Build Coastguard Worker _mesa_GetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
1528*61046927SAndroid Build Coastguard Worker {
1529*61046927SAndroid Build Coastguard Worker struct gl_sampler_object *sampObj;
1530*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
1531*61046927SAndroid Build Coastguard Worker
1532*61046927SAndroid Build Coastguard Worker sampObj = sampler_parameter_error_check(ctx, sampler, true,
1533*61046927SAndroid Build Coastguard Worker "glGetSamplerParameterfv");
1534*61046927SAndroid Build Coastguard Worker if (!sampObj)
1535*61046927SAndroid Build Coastguard Worker return;
1536*61046927SAndroid Build Coastguard Worker
1537*61046927SAndroid Build Coastguard Worker switch (pname) {
1538*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_S:
1539*61046927SAndroid Build Coastguard Worker *params = (GLfloat) sampObj->Attrib.WrapS;
1540*61046927SAndroid Build Coastguard Worker break;
1541*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_T:
1542*61046927SAndroid Build Coastguard Worker *params = (GLfloat) sampObj->Attrib.WrapT;
1543*61046927SAndroid Build Coastguard Worker break;
1544*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_R:
1545*61046927SAndroid Build Coastguard Worker *params = (GLfloat) sampObj->Attrib.WrapR;
1546*61046927SAndroid Build Coastguard Worker break;
1547*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MIN_FILTER:
1548*61046927SAndroid Build Coastguard Worker *params = (GLfloat) sampObj->Attrib.MinFilter;
1549*61046927SAndroid Build Coastguard Worker break;
1550*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAG_FILTER:
1551*61046927SAndroid Build Coastguard Worker *params = (GLfloat) sampObj->Attrib.MagFilter;
1552*61046927SAndroid Build Coastguard Worker break;
1553*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MIN_LOD:
1554*61046927SAndroid Build Coastguard Worker *params = sampObj->Attrib.MinLod;
1555*61046927SAndroid Build Coastguard Worker break;
1556*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAX_LOD:
1557*61046927SAndroid Build Coastguard Worker *params = sampObj->Attrib.MaxLod;
1558*61046927SAndroid Build Coastguard Worker break;
1559*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_LOD_BIAS:
1560*61046927SAndroid Build Coastguard Worker *params = sampObj->Attrib.LodBias;
1561*61046927SAndroid Build Coastguard Worker break;
1562*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COMPARE_MODE:
1563*61046927SAndroid Build Coastguard Worker *params = (GLfloat) sampObj->Attrib.CompareMode;
1564*61046927SAndroid Build Coastguard Worker break;
1565*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COMPARE_FUNC:
1566*61046927SAndroid Build Coastguard Worker *params = (GLfloat) sampObj->Attrib.CompareFunc;
1567*61046927SAndroid Build Coastguard Worker break;
1568*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAX_ANISOTROPY_EXT:
1569*61046927SAndroid Build Coastguard Worker *params = sampObj->Attrib.MaxAnisotropy;
1570*61046927SAndroid Build Coastguard Worker break;
1571*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BORDER_COLOR:
1572*61046927SAndroid Build Coastguard Worker params[0] = sampObj->Attrib.state.border_color.f[0];
1573*61046927SAndroid Build Coastguard Worker params[1] = sampObj->Attrib.state.border_color.f[1];
1574*61046927SAndroid Build Coastguard Worker params[2] = sampObj->Attrib.state.border_color.f[2];
1575*61046927SAndroid Build Coastguard Worker params[3] = sampObj->Attrib.state.border_color.f[3];
1576*61046927SAndroid Build Coastguard Worker break;
1577*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_CUBE_MAP_SEAMLESS:
1578*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.AMD_seamless_cubemap_per_texture)
1579*61046927SAndroid Build Coastguard Worker goto invalid_pname;
1580*61046927SAndroid Build Coastguard Worker *params = (GLfloat) sampObj->Attrib.CubeMapSeamless;
1581*61046927SAndroid Build Coastguard Worker break;
1582*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SRGB_DECODE_EXT:
1583*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.EXT_texture_sRGB_decode)
1584*61046927SAndroid Build Coastguard Worker goto invalid_pname;
1585*61046927SAndroid Build Coastguard Worker *params = (GLfloat) sampObj->Attrib.sRGBDecode;
1586*61046927SAndroid Build Coastguard Worker break;
1587*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_REDUCTION_MODE_EXT:
1588*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.EXT_texture_filter_minmax &&
1589*61046927SAndroid Build Coastguard Worker !_mesa_has_ARB_texture_filter_minmax(ctx))
1590*61046927SAndroid Build Coastguard Worker goto invalid_pname;
1591*61046927SAndroid Build Coastguard Worker *params = (GLfloat) sampObj->Attrib.ReductionMode;
1592*61046927SAndroid Build Coastguard Worker break;
1593*61046927SAndroid Build Coastguard Worker default:
1594*61046927SAndroid Build Coastguard Worker goto invalid_pname;
1595*61046927SAndroid Build Coastguard Worker }
1596*61046927SAndroid Build Coastguard Worker return;
1597*61046927SAndroid Build Coastguard Worker
1598*61046927SAndroid Build Coastguard Worker invalid_pname:
1599*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM, "glGetSamplerParameterfv(pname=%s)",
1600*61046927SAndroid Build Coastguard Worker _mesa_enum_to_string(pname));
1601*61046927SAndroid Build Coastguard Worker }
1602*61046927SAndroid Build Coastguard Worker
1603*61046927SAndroid Build Coastguard Worker
1604*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetSamplerParameterIiv(GLuint sampler,GLenum pname,GLint * params)1605*61046927SAndroid Build Coastguard Worker _mesa_GetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
1606*61046927SAndroid Build Coastguard Worker {
1607*61046927SAndroid Build Coastguard Worker struct gl_sampler_object *sampObj;
1608*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
1609*61046927SAndroid Build Coastguard Worker
1610*61046927SAndroid Build Coastguard Worker sampObj = sampler_parameter_error_check(ctx, sampler, true,
1611*61046927SAndroid Build Coastguard Worker "glGetSamplerParameterIiv");
1612*61046927SAndroid Build Coastguard Worker if (!sampObj)
1613*61046927SAndroid Build Coastguard Worker return;
1614*61046927SAndroid Build Coastguard Worker
1615*61046927SAndroid Build Coastguard Worker switch (pname) {
1616*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_S:
1617*61046927SAndroid Build Coastguard Worker *params = sampObj->Attrib.WrapS;
1618*61046927SAndroid Build Coastguard Worker break;
1619*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_T:
1620*61046927SAndroid Build Coastguard Worker *params = sampObj->Attrib.WrapT;
1621*61046927SAndroid Build Coastguard Worker break;
1622*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_R:
1623*61046927SAndroid Build Coastguard Worker *params = sampObj->Attrib.WrapR;
1624*61046927SAndroid Build Coastguard Worker break;
1625*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MIN_FILTER:
1626*61046927SAndroid Build Coastguard Worker *params = sampObj->Attrib.MinFilter;
1627*61046927SAndroid Build Coastguard Worker break;
1628*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAG_FILTER:
1629*61046927SAndroid Build Coastguard Worker *params = sampObj->Attrib.MagFilter;
1630*61046927SAndroid Build Coastguard Worker break;
1631*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MIN_LOD:
1632*61046927SAndroid Build Coastguard Worker *params = (GLint) sampObj->Attrib.MinLod;
1633*61046927SAndroid Build Coastguard Worker break;
1634*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAX_LOD:
1635*61046927SAndroid Build Coastguard Worker *params = (GLint) sampObj->Attrib.MaxLod;
1636*61046927SAndroid Build Coastguard Worker break;
1637*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_LOD_BIAS:
1638*61046927SAndroid Build Coastguard Worker *params = (GLint) sampObj->Attrib.LodBias;
1639*61046927SAndroid Build Coastguard Worker break;
1640*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COMPARE_MODE:
1641*61046927SAndroid Build Coastguard Worker *params = sampObj->Attrib.CompareMode;
1642*61046927SAndroid Build Coastguard Worker break;
1643*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COMPARE_FUNC:
1644*61046927SAndroid Build Coastguard Worker *params = sampObj->Attrib.CompareFunc;
1645*61046927SAndroid Build Coastguard Worker break;
1646*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAX_ANISOTROPY_EXT:
1647*61046927SAndroid Build Coastguard Worker *params = (GLint) sampObj->Attrib.MaxAnisotropy;
1648*61046927SAndroid Build Coastguard Worker break;
1649*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BORDER_COLOR:
1650*61046927SAndroid Build Coastguard Worker params[0] = sampObj->Attrib.state.border_color.i[0];
1651*61046927SAndroid Build Coastguard Worker params[1] = sampObj->Attrib.state.border_color.i[1];
1652*61046927SAndroid Build Coastguard Worker params[2] = sampObj->Attrib.state.border_color.i[2];
1653*61046927SAndroid Build Coastguard Worker params[3] = sampObj->Attrib.state.border_color.i[3];
1654*61046927SAndroid Build Coastguard Worker break;
1655*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_CUBE_MAP_SEAMLESS:
1656*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.AMD_seamless_cubemap_per_texture)
1657*61046927SAndroid Build Coastguard Worker goto invalid_pname;
1658*61046927SAndroid Build Coastguard Worker *params = sampObj->Attrib.CubeMapSeamless;
1659*61046927SAndroid Build Coastguard Worker break;
1660*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SRGB_DECODE_EXT:
1661*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.EXT_texture_sRGB_decode)
1662*61046927SAndroid Build Coastguard Worker goto invalid_pname;
1663*61046927SAndroid Build Coastguard Worker *params = (GLenum) sampObj->Attrib.sRGBDecode;
1664*61046927SAndroid Build Coastguard Worker break;
1665*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_REDUCTION_MODE_EXT:
1666*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.EXT_texture_filter_minmax &&
1667*61046927SAndroid Build Coastguard Worker !_mesa_has_ARB_texture_filter_minmax(ctx))
1668*61046927SAndroid Build Coastguard Worker goto invalid_pname;
1669*61046927SAndroid Build Coastguard Worker *params = (GLenum) sampObj->Attrib.ReductionMode;
1670*61046927SAndroid Build Coastguard Worker break;
1671*61046927SAndroid Build Coastguard Worker default:
1672*61046927SAndroid Build Coastguard Worker goto invalid_pname;
1673*61046927SAndroid Build Coastguard Worker }
1674*61046927SAndroid Build Coastguard Worker return;
1675*61046927SAndroid Build Coastguard Worker
1676*61046927SAndroid Build Coastguard Worker invalid_pname:
1677*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM, "glGetSamplerParameterIiv(pname=%s)",
1678*61046927SAndroid Build Coastguard Worker _mesa_enum_to_string(pname));
1679*61046927SAndroid Build Coastguard Worker }
1680*61046927SAndroid Build Coastguard Worker
1681*61046927SAndroid Build Coastguard Worker
1682*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetSamplerParameterIuiv(GLuint sampler,GLenum pname,GLuint * params)1683*61046927SAndroid Build Coastguard Worker _mesa_GetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
1684*61046927SAndroid Build Coastguard Worker {
1685*61046927SAndroid Build Coastguard Worker struct gl_sampler_object *sampObj;
1686*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
1687*61046927SAndroid Build Coastguard Worker
1688*61046927SAndroid Build Coastguard Worker sampObj = sampler_parameter_error_check(ctx, sampler, true,
1689*61046927SAndroid Build Coastguard Worker "glGetSamplerParameterIuiv");
1690*61046927SAndroid Build Coastguard Worker if (!sampObj)
1691*61046927SAndroid Build Coastguard Worker return;
1692*61046927SAndroid Build Coastguard Worker
1693*61046927SAndroid Build Coastguard Worker switch (pname) {
1694*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_S:
1695*61046927SAndroid Build Coastguard Worker *params = sampObj->Attrib.WrapS;
1696*61046927SAndroid Build Coastguard Worker break;
1697*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_T:
1698*61046927SAndroid Build Coastguard Worker *params = sampObj->Attrib.WrapT;
1699*61046927SAndroid Build Coastguard Worker break;
1700*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_WRAP_R:
1701*61046927SAndroid Build Coastguard Worker *params = sampObj->Attrib.WrapR;
1702*61046927SAndroid Build Coastguard Worker break;
1703*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MIN_FILTER:
1704*61046927SAndroid Build Coastguard Worker *params = sampObj->Attrib.MinFilter;
1705*61046927SAndroid Build Coastguard Worker break;
1706*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAG_FILTER:
1707*61046927SAndroid Build Coastguard Worker *params = sampObj->Attrib.MagFilter;
1708*61046927SAndroid Build Coastguard Worker break;
1709*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MIN_LOD:
1710*61046927SAndroid Build Coastguard Worker *params = (GLuint) sampObj->Attrib.MinLod;
1711*61046927SAndroid Build Coastguard Worker break;
1712*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAX_LOD:
1713*61046927SAndroid Build Coastguard Worker *params = (GLuint) sampObj->Attrib.MaxLod;
1714*61046927SAndroid Build Coastguard Worker break;
1715*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_LOD_BIAS:
1716*61046927SAndroid Build Coastguard Worker *params = (GLuint) sampObj->Attrib.LodBias;
1717*61046927SAndroid Build Coastguard Worker break;
1718*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COMPARE_MODE:
1719*61046927SAndroid Build Coastguard Worker *params = sampObj->Attrib.CompareMode;
1720*61046927SAndroid Build Coastguard Worker break;
1721*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COMPARE_FUNC:
1722*61046927SAndroid Build Coastguard Worker *params = sampObj->Attrib.CompareFunc;
1723*61046927SAndroid Build Coastguard Worker break;
1724*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MAX_ANISOTROPY_EXT:
1725*61046927SAndroid Build Coastguard Worker *params = (GLuint) sampObj->Attrib.MaxAnisotropy;
1726*61046927SAndroid Build Coastguard Worker break;
1727*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BORDER_COLOR:
1728*61046927SAndroid Build Coastguard Worker params[0] = sampObj->Attrib.state.border_color.ui[0];
1729*61046927SAndroid Build Coastguard Worker params[1] = sampObj->Attrib.state.border_color.ui[1];
1730*61046927SAndroid Build Coastguard Worker params[2] = sampObj->Attrib.state.border_color.ui[2];
1731*61046927SAndroid Build Coastguard Worker params[3] = sampObj->Attrib.state.border_color.ui[3];
1732*61046927SAndroid Build Coastguard Worker break;
1733*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_CUBE_MAP_SEAMLESS:
1734*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.AMD_seamless_cubemap_per_texture)
1735*61046927SAndroid Build Coastguard Worker goto invalid_pname;
1736*61046927SAndroid Build Coastguard Worker *params = sampObj->Attrib.CubeMapSeamless;
1737*61046927SAndroid Build Coastguard Worker break;
1738*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_SRGB_DECODE_EXT:
1739*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.EXT_texture_sRGB_decode)
1740*61046927SAndroid Build Coastguard Worker goto invalid_pname;
1741*61046927SAndroid Build Coastguard Worker *params = (GLenum) sampObj->Attrib.sRGBDecode;
1742*61046927SAndroid Build Coastguard Worker break;
1743*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_REDUCTION_MODE_EXT:
1744*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.EXT_texture_filter_minmax &&
1745*61046927SAndroid Build Coastguard Worker !_mesa_has_ARB_texture_filter_minmax(ctx))
1746*61046927SAndroid Build Coastguard Worker goto invalid_pname;
1747*61046927SAndroid Build Coastguard Worker *params = (GLenum) sampObj->Attrib.ReductionMode;
1748*61046927SAndroid Build Coastguard Worker break;
1749*61046927SAndroid Build Coastguard Worker default:
1750*61046927SAndroid Build Coastguard Worker goto invalid_pname;
1751*61046927SAndroid Build Coastguard Worker }
1752*61046927SAndroid Build Coastguard Worker return;
1753*61046927SAndroid Build Coastguard Worker
1754*61046927SAndroid Build Coastguard Worker invalid_pname:
1755*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM, "glGetSamplerParameterIuiv(pname=%s)",
1756*61046927SAndroid Build Coastguard Worker _mesa_enum_to_string(pname));
1757*61046927SAndroid Build Coastguard Worker }
1758