2
* Mesa 3-D graphics library
4
* Copyright (C) 2011 VMware, Inc. All Rights Reserved.
6
* Permission is hereby granted, free of charge, to any person obtaining a
7
* copy of this software and associated documentation files (the "Software"),
8
* to deal in the Software without restriction, including without limitation
9
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
10
* and/or sell copies of the Software, and to permit persons to whom the
11
* Software is furnished to do so, subject to the following conditions:
13
* The above copyright notice and this permission notice shall be included
14
* in all copies or substantial portions of the Software.
16
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
* OTHER DEALINGS IN THE SOFTWARE.
28
* \brief Functions for the GL_ARB_sampler_objects extension.
33
#include "main/glheader.h"
34
#include "main/context.h"
35
#include "main/enums.h"
36
#include "main/hash.h"
37
#include "main/macros.h"
38
#include "main/mtypes.h"
39
#include "main/samplerobj.h"
40
#include "main/texturebindless.h"
41
#include "util/u_memory.h"
42
#include "api_exec_decl.h"
44
/* Take advantage of how the enums are defined. */
45
const enum pipe_tex_wrap wrap_to_gallium_table[32] = {
46
[GL_REPEAT & 0x1f] = PIPE_TEX_WRAP_REPEAT,
47
[GL_CLAMP & 0x1f] = PIPE_TEX_WRAP_CLAMP,
48
[GL_CLAMP_TO_EDGE & 0x1f] = PIPE_TEX_WRAP_CLAMP_TO_EDGE,
49
[GL_CLAMP_TO_BORDER & 0x1f] = PIPE_TEX_WRAP_CLAMP_TO_BORDER,
50
[GL_MIRRORED_REPEAT & 0x1f] = PIPE_TEX_WRAP_MIRROR_REPEAT,
51
[GL_MIRROR_CLAMP_EXT & 0x1f] = PIPE_TEX_WRAP_MIRROR_CLAMP,
52
[GL_MIRROR_CLAMP_TO_EDGE & 0x1f] = PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE,
53
[GL_MIRROR_CLAMP_TO_BORDER_EXT & 0x1f] = PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER,
56
struct gl_sampler_object *
57
_mesa_lookup_samplerobj(struct gl_context *ctx, GLuint name)
62
return (struct gl_sampler_object *)
63
_mesa_HashLookup(ctx->Shared->SamplerObjects, name);
66
static inline struct gl_sampler_object *
67
lookup_samplerobj_locked(struct gl_context *ctx, GLuint name)
69
return (struct gl_sampler_object *)
70
_mesa_HashLookupLocked(ctx->Shared->SamplerObjects, name);
74
delete_sampler_object(struct gl_context *ctx,
75
struct gl_sampler_object *sampObj)
77
_mesa_delete_sampler_handles(ctx, sampObj);
83
* Handle reference counting.
86
_mesa_reference_sampler_object_(struct gl_context *ctx,
87
struct gl_sampler_object **ptr,
88
struct gl_sampler_object *samp)
90
assert(*ptr != samp); /* The inline wrapper should prevent no-op calls */
93
/* Unreference the old sampler */
94
struct gl_sampler_object *oldSamp = *ptr;
96
assert(oldSamp->RefCount > 0);
98
if (p_atomic_dec_zero(&oldSamp->RefCount))
99
delete_sampler_object(ctx, oldSamp);
103
/* reference new sampler */
104
assert(samp->RefCount > 0);
106
p_atomic_inc(&samp->RefCount);
114
* Initialize the fields of the given sampler object.
117
_mesa_init_sampler_object(struct gl_sampler_object *sampObj, GLuint name)
119
sampObj->Name = name;
120
sampObj->RefCount = 1;
121
sampObj->Attrib.WrapS = GL_REPEAT;
122
sampObj->Attrib.WrapT = GL_REPEAT;
123
sampObj->Attrib.WrapR = GL_REPEAT;
124
sampObj->Attrib.state.wrap_s = PIPE_TEX_WRAP_REPEAT;
125
sampObj->Attrib.state.wrap_t = PIPE_TEX_WRAP_REPEAT;
126
sampObj->Attrib.state.wrap_r = PIPE_TEX_WRAP_REPEAT;
127
sampObj->Attrib.MinFilter = GL_NEAREST_MIPMAP_LINEAR;
128
sampObj->Attrib.MagFilter = GL_LINEAR;
129
sampObj->Attrib.state.min_img_filter = PIPE_TEX_FILTER_NEAREST;
130
sampObj->Attrib.state.min_mip_filter = PIPE_TEX_MIPFILTER_LINEAR;
131
sampObj->Attrib.state.mag_img_filter = PIPE_TEX_FILTER_LINEAR;
132
sampObj->Attrib.state.border_color.f[0] = 0;
133
sampObj->Attrib.state.border_color.f[1] = 0;
134
sampObj->Attrib.state.border_color.f[2] = 0;
135
sampObj->Attrib.state.border_color.f[3] = 0;
136
_mesa_update_is_border_color_nonzero(sampObj);
137
sampObj->Attrib.MinLod = -1000.0F;
138
sampObj->Attrib.MaxLod = 1000.0F;
139
sampObj->Attrib.state.min_lod = 0; /* Gallium doesn't allow negative numbers */
140
sampObj->Attrib.state.max_lod = 1000;
141
sampObj->Attrib.LodBias = 0.0F;
142
sampObj->Attrib.state.lod_bias = 0;
143
sampObj->Attrib.MaxAnisotropy = 1.0F;
144
sampObj->Attrib.state.max_anisotropy = 0; /* Gallium uses 0 instead of 1. */
145
sampObj->Attrib.CompareMode = GL_NONE;
146
sampObj->Attrib.CompareFunc = GL_LEQUAL;
147
sampObj->Attrib.state.compare_mode = PIPE_TEX_COMPARE_NONE;
148
sampObj->Attrib.state.compare_func = PIPE_FUNC_LEQUAL;
149
sampObj->Attrib.sRGBDecode = GL_DECODE_EXT;
150
sampObj->Attrib.CubeMapSeamless = GL_FALSE;
151
sampObj->Attrib.state.seamless_cube_map = false;
152
sampObj->Attrib.ReductionMode = GL_WEIGHTED_AVERAGE_EXT;
153
sampObj->Attrib.state.reduction_mode = PIPE_TEX_REDUCTION_WEIGHTED_AVERAGE;
154
sampObj->HandleAllocated = GL_FALSE;
156
/* GL_ARB_bindless_texture */
157
_mesa_init_sampler_handles(sampObj);
160
static struct gl_sampler_object *
161
_mesa_new_sampler_object(struct gl_context *ctx, GLuint name)
163
struct gl_sampler_object *sampObj = CALLOC_STRUCT(gl_sampler_object);
165
_mesa_init_sampler_object(sampObj, name);
171
create_samplers(struct gl_context *ctx, GLsizei count, GLuint *samplers,
179
_mesa_HashLockMutex(ctx->Shared->SamplerObjects);
181
_mesa_HashFindFreeKeys(ctx->Shared->SamplerObjects, samplers, count);
183
/* Insert the ID and pointer to new sampler object into hash table */
184
for (i = 0; i < count; i++) {
185
struct gl_sampler_object *sampObj;
187
sampObj = _mesa_new_sampler_object(ctx, samplers[i]);
189
_mesa_HashUnlockMutex(ctx->Shared->SamplerObjects);
190
_mesa_error(ctx, GL_OUT_OF_MEMORY, "%s", caller);
194
_mesa_HashInsertLocked(ctx->Shared->SamplerObjects, samplers[i],
198
_mesa_HashUnlockMutex(ctx->Shared->SamplerObjects);
202
create_samplers_err(struct gl_context *ctx, GLsizei count, GLuint *samplers,
206
if (MESA_VERBOSE & VERBOSE_API)
207
_mesa_debug(ctx, "%s(%d)\n", caller, count);
210
_mesa_error(ctx, GL_INVALID_VALUE, "%s(n<0)", caller);
214
create_samplers(ctx, count, samplers, caller);
218
_mesa_GenSamplers_no_error(GLsizei count, GLuint *samplers)
220
GET_CURRENT_CONTEXT(ctx);
221
create_samplers(ctx, count, samplers, "glGenSamplers");
225
_mesa_GenSamplers(GLsizei count, GLuint *samplers)
227
GET_CURRENT_CONTEXT(ctx);
228
create_samplers_err(ctx, count, samplers, "glGenSamplers");
232
_mesa_CreateSamplers_no_error(GLsizei count, GLuint *samplers)
234
GET_CURRENT_CONTEXT(ctx);
235
create_samplers(ctx, count, samplers, "glCreateSamplers");
239
_mesa_CreateSamplers(GLsizei count, GLuint *samplers)
241
GET_CURRENT_CONTEXT(ctx);
242
create_samplers_err(ctx, count, samplers, "glCreateSamplers");
247
delete_samplers(struct gl_context *ctx, GLsizei count, const GLuint *samplers)
249
FLUSH_VERTICES(ctx, 0, 0);
251
_mesa_HashLockMutex(ctx->Shared->SamplerObjects);
253
for (GLsizei i = 0; i < count; i++) {
256
struct gl_sampler_object *sampObj =
257
lookup_samplerobj_locked(ctx, samplers[i]);
260
/* If the sampler is currently bound, unbind it. */
261
for (j = 0; j < ctx->Const.MaxCombinedTextureImageUnits; j++) {
262
if (ctx->Texture.Unit[j].Sampler == sampObj) {
263
FLUSH_VERTICES(ctx, _NEW_TEXTURE_OBJECT, GL_TEXTURE_BIT);
264
_mesa_reference_sampler_object(ctx, &ctx->Texture.Unit[j].Sampler, NULL);
268
/* The ID is immediately freed for re-use */
269
_mesa_HashRemoveLocked(ctx->Shared->SamplerObjects, samplers[i]);
270
/* But the object exists until its reference count goes to zero */
271
_mesa_reference_sampler_object(ctx, &sampObj, NULL);
276
_mesa_HashUnlockMutex(ctx->Shared->SamplerObjects);
281
_mesa_DeleteSamplers_no_error(GLsizei count, const GLuint *samplers)
283
GET_CURRENT_CONTEXT(ctx);
284
delete_samplers(ctx, count, samplers);
289
_mesa_DeleteSamplers(GLsizei count, const GLuint *samplers)
291
GET_CURRENT_CONTEXT(ctx);
294
_mesa_error(ctx, GL_INVALID_VALUE, "glDeleteSamplers(count)");
298
delete_samplers(ctx, count, samplers);
303
_mesa_IsSampler(GLuint sampler)
305
GET_CURRENT_CONTEXT(ctx);
307
ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE);
309
return _mesa_lookup_samplerobj(ctx, sampler) != NULL;
313
_mesa_bind_sampler(struct gl_context *ctx, GLuint unit,
314
struct gl_sampler_object *sampObj)
316
if (ctx->Texture.Unit[unit].Sampler != sampObj) {
317
FLUSH_VERTICES(ctx, _NEW_TEXTURE_OBJECT, GL_TEXTURE_BIT);
320
_mesa_reference_sampler_object(ctx, &ctx->Texture.Unit[unit].Sampler,
324
static ALWAYS_INLINE void
325
bind_sampler(struct gl_context *ctx, GLuint unit, GLuint sampler, bool no_error)
327
struct gl_sampler_object *sampObj;
330
/* Use the default sampler object, the one contained in the texture
335
/* user-defined sampler object */
336
sampObj = _mesa_lookup_samplerobj(ctx, sampler);
337
if (!no_error && !sampObj) {
338
_mesa_error(ctx, GL_INVALID_OPERATION, "glBindSampler(sampler)");
343
/* bind new sampler */
344
_mesa_bind_sampler(ctx, unit, sampObj);
348
_mesa_BindSampler_no_error(GLuint unit, GLuint sampler)
350
GET_CURRENT_CONTEXT(ctx);
351
bind_sampler(ctx, unit, sampler, true);
355
_mesa_BindSampler(GLuint unit, GLuint sampler)
357
GET_CURRENT_CONTEXT(ctx);
359
if (unit >= ctx->Const.MaxCombinedTextureImageUnits) {
360
_mesa_error(ctx, GL_INVALID_VALUE, "glBindSampler(unit %u)", unit);
364
bind_sampler(ctx, unit, sampler, false);
368
static ALWAYS_INLINE void
369
bind_samplers(struct gl_context *ctx, GLuint first, GLsizei count,
370
const GLuint *samplers, bool no_error)
374
FLUSH_VERTICES(ctx, 0, 0);
377
/* Note that the error semantics for multi-bind commands differ from
378
* those of other GL commands.
380
* The Issues section in the ARB_multi_bind spec says:
382
* "(11) Typically, OpenGL specifies that if an error is generated by
383
* a command, that command has no effect. This is somewhat
384
* unfortunate for multi-bind commands, because it would require
385
* a first pass to scan the entire list of bound objects for
386
* errors and then a second pass to actually perform the
387
* bindings. Should we have different error semantics?
389
* RESOLVED: Yes. In this specification, when the parameters for
390
* one of the <count> binding points are invalid, that binding
391
* point is not updated and an error will be generated. However,
392
* other binding points in the same command will be updated if
393
* their parameters are valid and no other error occurs."
396
_mesa_HashLockMutex(ctx->Shared->SamplerObjects);
398
for (i = 0; i < count; i++) {
399
const GLuint unit = first + i;
400
struct gl_sampler_object * const currentSampler =
401
ctx->Texture.Unit[unit].Sampler;
402
struct gl_sampler_object *sampObj;
404
if (samplers[i] != 0) {
405
if (currentSampler && currentSampler->Name == samplers[i])
406
sampObj = currentSampler;
408
sampObj = lookup_samplerobj_locked(ctx, samplers[i]);
410
/* The ARB_multi_bind spec says:
412
* "An INVALID_OPERATION error is generated if any value
413
* in <samplers> is not zero or the name of an existing
414
* sampler object (per binding)."
416
if (!no_error && !sampObj) {
417
_mesa_error(ctx, GL_INVALID_OPERATION,
418
"glBindSamplers(samplers[%d]=%u is not zero or "
419
"the name of an existing sampler object)",
427
/* Bind the new sampler */
428
if (sampObj != currentSampler) {
429
_mesa_reference_sampler_object(ctx,
430
&ctx->Texture.Unit[unit].Sampler,
432
ctx->NewState |= _NEW_TEXTURE_OBJECT;
433
ctx->PopAttribState |= GL_TEXTURE_BIT;
437
_mesa_HashUnlockMutex(ctx->Shared->SamplerObjects);
439
/* Unbind all samplers in the range <first> through <first>+<count>-1 */
440
for (i = 0; i < count; i++) {
441
const GLuint unit = first + i;
443
if (ctx->Texture.Unit[unit].Sampler) {
444
_mesa_reference_sampler_object(ctx,
445
&ctx->Texture.Unit[unit].Sampler,
447
ctx->NewState |= _NEW_TEXTURE_OBJECT;
448
ctx->PopAttribState |= GL_TEXTURE_BIT;
456
_mesa_BindSamplers_no_error(GLuint first, GLsizei count, const GLuint *samplers)
458
GET_CURRENT_CONTEXT(ctx);
459
bind_samplers(ctx, first, count, samplers, true);
464
_mesa_BindSamplers(GLuint first, GLsizei count, const GLuint *samplers)
466
GET_CURRENT_CONTEXT(ctx);
468
/* The ARB_multi_bind spec says:
470
* "An INVALID_OPERATION error is generated if <first> + <count> is
471
* greater than the number of texture image units supported by
472
* the implementation."
474
if (first + count > ctx->Const.MaxCombinedTextureImageUnits) {
475
_mesa_error(ctx, GL_INVALID_OPERATION,
476
"glBindSamplers(first=%u + count=%d > the value of "
477
"GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS=%u)",
478
first, count, ctx->Const.MaxCombinedTextureImageUnits);
482
bind_samplers(ctx, first, count, samplers, false);
487
* Check if a coordinate wrap mode is legal.
488
* \return GL_TRUE if legal, GL_FALSE otherwise
491
validate_texture_wrap_mode(struct gl_context *ctx, GLenum wrap)
493
const struct gl_extensions * const e = &ctx->Extensions;
497
/* From GL 3.0 specification section E.1 "Profiles and Deprecated
498
* Features of OpenGL 3.0":
500
* - Texture wrap mode CLAMP - CLAMP is no longer accepted as a value of
501
* texture parameters TEXTURE_WRAP_S, TEXTURE_WRAP_T, or
504
return ctx->API == API_OPENGL_COMPAT;
505
case GL_CLAMP_TO_EDGE:
507
case GL_MIRRORED_REPEAT:
508
case GL_CLAMP_TO_BORDER:
510
case GL_MIRROR_CLAMP_EXT:
511
return e->ATI_texture_mirror_once || e->EXT_texture_mirror_clamp;
512
case GL_MIRROR_CLAMP_TO_EDGE_EXT:
513
return e->ATI_texture_mirror_once || e->EXT_texture_mirror_clamp || e->ARB_texture_mirror_clamp_to_edge;
514
case GL_MIRROR_CLAMP_TO_BORDER_EXT:
515
return e->EXT_texture_mirror_clamp;
523
* This is called just prior to changing any sampler object state.
526
flush(struct gl_context *ctx)
528
FLUSH_VERTICES(ctx, _NEW_TEXTURE_OBJECT, GL_TEXTURE_BIT);
531
#define INVALID_PARAM 0x100
532
#define INVALID_PNAME 0x101
533
#define INVALID_VALUE 0x102
535
static inline GLboolean
536
is_wrap_gl_clamp(GLint param)
538
return param == GL_CLAMP || param == GL_MIRROR_CLAMP_EXT;
542
set_sampler_wrap_s(struct gl_context *ctx, struct gl_sampler_object *samp,
545
if (samp->Attrib.WrapS == param)
547
if (validate_texture_wrap_mode(ctx, param)) {
549
if (is_wrap_gl_clamp(samp->Attrib.WrapS) != is_wrap_gl_clamp(param))
550
ctx->NewDriverState |= ctx->DriverFlags.NewSamplersWithClamp;
551
samp->Attrib.WrapS = param;
552
samp->Attrib.state.wrap_s = wrap_to_gallium(param);
553
_mesa_lower_gl_clamp(ctx, samp);
556
return INVALID_PARAM;
561
set_sampler_wrap_t(struct gl_context *ctx, struct gl_sampler_object *samp,
564
if (samp->Attrib.WrapT == param)
566
if (validate_texture_wrap_mode(ctx, param)) {
568
if (is_wrap_gl_clamp(samp->Attrib.WrapT) != is_wrap_gl_clamp(param))
569
ctx->NewDriverState |= ctx->DriverFlags.NewSamplersWithClamp;
570
samp->Attrib.WrapT = param;
571
samp->Attrib.state.wrap_t = wrap_to_gallium(param);
572
_mesa_lower_gl_clamp(ctx, samp);
575
return INVALID_PARAM;
580
set_sampler_wrap_r(struct gl_context *ctx, struct gl_sampler_object *samp,
583
if (samp->Attrib.WrapR == param)
585
if (validate_texture_wrap_mode(ctx, param)) {
587
if (is_wrap_gl_clamp(samp->Attrib.WrapR) != is_wrap_gl_clamp(param))
588
ctx->NewDriverState |= ctx->DriverFlags.NewSamplersWithClamp;
589
samp->Attrib.WrapR = param;
590
samp->Attrib.state.wrap_r = wrap_to_gallium(param);
591
_mesa_lower_gl_clamp(ctx, samp);
594
return INVALID_PARAM;
598
set_sampler_min_filter(struct gl_context *ctx, struct gl_sampler_object *samp,
601
if (samp->Attrib.MinFilter == param)
607
case GL_NEAREST_MIPMAP_NEAREST:
608
case GL_LINEAR_MIPMAP_NEAREST:
609
case GL_NEAREST_MIPMAP_LINEAR:
610
case GL_LINEAR_MIPMAP_LINEAR:
612
samp->Attrib.MinFilter = param;
613
samp->Attrib.state.min_img_filter = filter_to_gallium(param);
614
samp->Attrib.state.min_mip_filter = mipfilter_to_gallium(param);
615
_mesa_lower_gl_clamp(ctx, samp);
618
return INVALID_PARAM;
624
set_sampler_mag_filter(struct gl_context *ctx, struct gl_sampler_object *samp,
627
if (samp->Attrib.MagFilter == param)
634
samp->Attrib.MagFilter = param;
635
samp->Attrib.state.mag_img_filter = filter_to_gallium(param);
636
_mesa_lower_gl_clamp(ctx, samp);
639
return INVALID_PARAM;
645
set_sampler_lod_bias(struct gl_context *ctx, struct gl_sampler_object *samp,
648
if (samp->Attrib.LodBias == param)
652
samp->Attrib.LodBias = param;
653
samp->Attrib.state.lod_bias = util_quantize_lod_bias(param);
659
set_sampler_border_colorf(struct gl_context *ctx,
660
struct gl_sampler_object *samp,
661
const GLfloat params[4])
664
memcpy(samp->Attrib.state.border_color.f, params, 4 * sizeof(float));
665
_mesa_update_is_border_color_nonzero(samp);
671
set_sampler_border_colori(struct gl_context *ctx,
672
struct gl_sampler_object *samp,
673
const GLint params[4])
676
memcpy(samp->Attrib.state.border_color.i, params, 4 * sizeof(float));
677
_mesa_update_is_border_color_nonzero(samp);
683
set_sampler_border_colorui(struct gl_context *ctx,
684
struct gl_sampler_object *samp,
685
const GLuint params[4])
688
memcpy(samp->Attrib.state.border_color.ui, params, 4 * sizeof(float));
689
_mesa_update_is_border_color_nonzero(samp);
695
set_sampler_min_lod(struct gl_context *ctx, struct gl_sampler_object *samp,
698
if (samp->Attrib.MinLod == param)
702
samp->Attrib.MinLod = param;
703
samp->Attrib.state.min_lod = MAX2(param, 0.0f); /* only positive */
710
set_sampler_max_lod(struct gl_context *ctx, struct gl_sampler_object *samp,
713
if (samp->Attrib.MaxLod == param)
717
samp->Attrib.MaxLod = param;
718
samp->Attrib.state.max_lod = param;
724
set_sampler_compare_mode(struct gl_context *ctx,
725
struct gl_sampler_object *samp, GLint param)
727
/* If GL_ARB_shadow is not supported, don't report an error. The
728
* sampler object extension spec isn't clear on this extension interaction.
729
* Silences errors with Wine on older GPUs such as R200.
731
if (!ctx->Extensions.ARB_shadow)
734
if (samp->Attrib.CompareMode == param)
737
if (param == GL_NONE ||
738
param == GL_COMPARE_R_TO_TEXTURE_ARB) {
740
samp->Attrib.CompareMode = param;
744
return INVALID_PARAM;
749
set_sampler_compare_func(struct gl_context *ctx,
750
struct gl_sampler_object *samp, GLint param)
752
/* If GL_ARB_shadow is not supported, don't report an error. The
753
* sampler object extension spec isn't clear on this extension interaction.
754
* Silences errors with Wine on older GPUs such as R200.
756
if (!ctx->Extensions.ARB_shadow)
759
if (samp->Attrib.CompareFunc == param)
772
samp->Attrib.CompareFunc = param;
773
samp->Attrib.state.compare_func = func_to_gallium(param);
776
return INVALID_PARAM;
782
set_sampler_max_anisotropy(struct gl_context *ctx,
783
struct gl_sampler_object *samp, GLfloat param)
785
if (!ctx->Extensions.EXT_texture_filter_anisotropic)
786
return INVALID_PNAME;
788
if (samp->Attrib.MaxAnisotropy == param)
792
return INVALID_VALUE;
795
/* clamp to max, that's what NVIDIA does */
796
samp->Attrib.MaxAnisotropy = MIN2(param, ctx->Const.MaxTextureMaxAnisotropy);
797
/* gallium sets 0 for 1 */
798
samp->Attrib.state.max_anisotropy = samp->Attrib.MaxAnisotropy == 1 ?
799
0 : samp->Attrib.MaxAnisotropy;
805
set_sampler_cube_map_seamless(struct gl_context *ctx,
806
struct gl_sampler_object *samp, GLboolean param)
808
if (!_mesa_is_desktop_gl(ctx)
809
|| !ctx->Extensions.AMD_seamless_cubemap_per_texture)
810
return INVALID_PNAME;
812
if (samp->Attrib.CubeMapSeamless == param)
815
if (param != GL_TRUE && param != GL_FALSE)
816
return INVALID_VALUE;
819
samp->Attrib.CubeMapSeamless = param;
820
samp->Attrib.state.seamless_cube_map = param;
825
set_sampler_srgb_decode(struct gl_context *ctx,
826
struct gl_sampler_object *samp, GLenum param)
828
if (!ctx->Extensions.EXT_texture_sRGB_decode)
829
return INVALID_PNAME;
831
if (samp->Attrib.sRGBDecode == param)
834
/* The EXT_texture_sRGB_decode spec says:
836
* "INVALID_ENUM is generated if the <pname> parameter of
837
* TexParameter[i,f,Ii,Iui][v][EXT],
838
* MultiTexParameter[i,f,Ii,Iui][v]EXT,
839
* TextureParameter[i,f,Ii,Iui][v]EXT, SamplerParameter[i,f,Ii,Iui][v]
840
* is TEXTURE_SRGB_DECODE_EXT when the <param> parameter is not one of
841
* DECODE_EXT or SKIP_DECODE_EXT.
843
* Returning INVALID_PARAM makes that happen.
845
if (param != GL_DECODE_EXT && param != GL_SKIP_DECODE_EXT)
846
return INVALID_PARAM;
849
samp->Attrib.sRGBDecode = param;
854
set_sampler_reduction_mode(struct gl_context *ctx,
855
struct gl_sampler_object *samp, GLenum param)
857
if (!ctx->Extensions.EXT_texture_filter_minmax &&
858
!_mesa_has_ARB_texture_filter_minmax(ctx))
859
return INVALID_PNAME;
861
if (samp->Attrib.ReductionMode == param)
864
if (param != GL_WEIGHTED_AVERAGE_EXT && param != GL_MIN && param != GL_MAX)
865
return INVALID_PARAM;
868
samp->Attrib.ReductionMode = param;
869
samp->Attrib.state.reduction_mode = reduction_to_gallium(param);
873
static struct gl_sampler_object *
874
sampler_parameter_error_check(struct gl_context *ctx, GLuint sampler,
875
bool get, const char *name)
877
struct gl_sampler_object *sampObj;
879
sampObj = _mesa_lookup_samplerobj(ctx, sampler);
881
/* OpenGL 4.5 spec, section "8.2 Sampler Objects", page 176 of the PDF
884
* "An INVALID_OPERATION error is generated if sampler is not the name
885
* of a sampler object previously returned from a call to
888
_mesa_error(ctx, GL_INVALID_OPERATION, "%s(invalid sampler)", name);
892
if (!get && sampObj->HandleAllocated) {
893
/* The ARB_bindless_texture spec says:
895
* "The error INVALID_OPERATION is generated by SamplerParameter* if
896
* <sampler> identifies a sampler object referenced by one or more
899
_mesa_error(ctx, GL_INVALID_OPERATION, "%s(immutable sampler)", name);
907
_mesa_SamplerParameteri(GLuint sampler, GLenum pname, GLint param)
909
struct gl_sampler_object *sampObj;
911
GET_CURRENT_CONTEXT(ctx);
913
sampObj = sampler_parameter_error_check(ctx, sampler, false,
914
"glSamplerParameteri");
919
case GL_TEXTURE_WRAP_S:
920
res = set_sampler_wrap_s(ctx, sampObj, param);
922
case GL_TEXTURE_WRAP_T:
923
res = set_sampler_wrap_t(ctx, sampObj, param);
925
case GL_TEXTURE_WRAP_R:
926
res = set_sampler_wrap_r(ctx, sampObj, param);
928
case GL_TEXTURE_MIN_FILTER:
929
res = set_sampler_min_filter(ctx, sampObj, param);
931
case GL_TEXTURE_MAG_FILTER:
932
res = set_sampler_mag_filter(ctx, sampObj, param);
934
case GL_TEXTURE_MIN_LOD:
935
res = set_sampler_min_lod(ctx, sampObj, (GLfloat) param);
937
case GL_TEXTURE_MAX_LOD:
938
res = set_sampler_max_lod(ctx, sampObj, (GLfloat) param);
940
case GL_TEXTURE_LOD_BIAS:
941
res = set_sampler_lod_bias(ctx, sampObj, (GLfloat) param);
943
case GL_TEXTURE_COMPARE_MODE:
944
res = set_sampler_compare_mode(ctx, sampObj, param);
946
case GL_TEXTURE_COMPARE_FUNC:
947
res = set_sampler_compare_func(ctx, sampObj, param);
949
case GL_TEXTURE_MAX_ANISOTROPY_EXT:
950
res = set_sampler_max_anisotropy(ctx, sampObj, (GLfloat) param);
952
case GL_TEXTURE_CUBE_MAP_SEAMLESS:
953
res = set_sampler_cube_map_seamless(ctx, sampObj, param);
955
case GL_TEXTURE_SRGB_DECODE_EXT:
956
res = set_sampler_srgb_decode(ctx, sampObj, param);
958
case GL_TEXTURE_REDUCTION_MODE_EXT:
959
res = set_sampler_reduction_mode(ctx, sampObj, param);
961
case GL_TEXTURE_BORDER_COLOR:
972
/* state change - we do nothing special at this time */
975
_mesa_error(ctx, GL_INVALID_ENUM, "glSamplerParameteri(pname=%s)\n",
976
_mesa_enum_to_string(pname));
979
_mesa_error(ctx, GL_INVALID_ENUM, "glSamplerParameteri(param=%d)\n",
983
_mesa_error(ctx, GL_INVALID_VALUE, "glSamplerParameteri(param=%d)\n",
993
_mesa_SamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
995
struct gl_sampler_object *sampObj;
997
GET_CURRENT_CONTEXT(ctx);
999
sampObj = sampler_parameter_error_check(ctx, sampler, false,
1000
"glSamplerParameterf");
1005
case GL_TEXTURE_WRAP_S:
1006
res = set_sampler_wrap_s(ctx, sampObj, (GLint) param);
1008
case GL_TEXTURE_WRAP_T:
1009
res = set_sampler_wrap_t(ctx, sampObj, (GLint) param);
1011
case GL_TEXTURE_WRAP_R:
1012
res = set_sampler_wrap_r(ctx, sampObj, (GLint) param);
1014
case GL_TEXTURE_MIN_FILTER:
1015
res = set_sampler_min_filter(ctx, sampObj, (GLint) param);
1017
case GL_TEXTURE_MAG_FILTER:
1018
res = set_sampler_mag_filter(ctx, sampObj, (GLint) param);
1020
case GL_TEXTURE_MIN_LOD:
1021
res = set_sampler_min_lod(ctx, sampObj, param);
1023
case GL_TEXTURE_MAX_LOD:
1024
res = set_sampler_max_lod(ctx, sampObj, param);
1026
case GL_TEXTURE_LOD_BIAS:
1027
res = set_sampler_lod_bias(ctx, sampObj, param);
1029
case GL_TEXTURE_COMPARE_MODE:
1030
res = set_sampler_compare_mode(ctx, sampObj, (GLint) param);
1032
case GL_TEXTURE_COMPARE_FUNC:
1033
res = set_sampler_compare_func(ctx, sampObj, (GLint) param);
1035
case GL_TEXTURE_MAX_ANISOTROPY_EXT:
1036
res = set_sampler_max_anisotropy(ctx, sampObj, param);
1038
case GL_TEXTURE_CUBE_MAP_SEAMLESS:
1039
res = set_sampler_cube_map_seamless(ctx, sampObj, (GLboolean) param);
1041
case GL_TEXTURE_SRGB_DECODE_EXT:
1042
res = set_sampler_srgb_decode(ctx, sampObj, (GLenum) param);
1044
case GL_TEXTURE_REDUCTION_MODE_EXT:
1045
res = set_sampler_reduction_mode(ctx, sampObj, (GLenum) param);
1047
case GL_TEXTURE_BORDER_COLOR:
1050
res = INVALID_PNAME;
1058
/* state change - we do nothing special at this time */
1061
_mesa_error(ctx, GL_INVALID_ENUM, "glSamplerParameterf(pname=%s)\n",
1062
_mesa_enum_to_string(pname));
1065
_mesa_error(ctx, GL_INVALID_ENUM, "glSamplerParameterf(param=%f)\n",
1069
_mesa_error(ctx, GL_INVALID_VALUE, "glSamplerParameterf(param=%f)\n",
1078
_mesa_SamplerParameteriv(GLuint sampler, GLenum pname, const GLint *params)
1080
struct gl_sampler_object *sampObj;
1082
GET_CURRENT_CONTEXT(ctx);
1084
sampObj = sampler_parameter_error_check(ctx, sampler, false,
1085
"glSamplerParameteriv");
1090
case GL_TEXTURE_WRAP_S:
1091
res = set_sampler_wrap_s(ctx, sampObj, params[0]);
1093
case GL_TEXTURE_WRAP_T:
1094
res = set_sampler_wrap_t(ctx, sampObj, params[0]);
1096
case GL_TEXTURE_WRAP_R:
1097
res = set_sampler_wrap_r(ctx, sampObj, params[0]);
1099
case GL_TEXTURE_MIN_FILTER:
1100
res = set_sampler_min_filter(ctx, sampObj, params[0]);
1102
case GL_TEXTURE_MAG_FILTER:
1103
res = set_sampler_mag_filter(ctx, sampObj, params[0]);
1105
case GL_TEXTURE_MIN_LOD:
1106
res = set_sampler_min_lod(ctx, sampObj, (GLfloat) params[0]);
1108
case GL_TEXTURE_MAX_LOD:
1109
res = set_sampler_max_lod(ctx, sampObj, (GLfloat) params[0]);
1111
case GL_TEXTURE_LOD_BIAS:
1112
res = set_sampler_lod_bias(ctx, sampObj, (GLfloat) params[0]);
1114
case GL_TEXTURE_COMPARE_MODE:
1115
res = set_sampler_compare_mode(ctx, sampObj, params[0]);
1117
case GL_TEXTURE_COMPARE_FUNC:
1118
res = set_sampler_compare_func(ctx, sampObj, params[0]);
1120
case GL_TEXTURE_MAX_ANISOTROPY_EXT:
1121
res = set_sampler_max_anisotropy(ctx, sampObj, (GLfloat) params[0]);
1123
case GL_TEXTURE_CUBE_MAP_SEAMLESS:
1124
res = set_sampler_cube_map_seamless(ctx, sampObj, params[0]);
1126
case GL_TEXTURE_SRGB_DECODE_EXT:
1127
res = set_sampler_srgb_decode(ctx, sampObj, params[0]);
1129
case GL_TEXTURE_REDUCTION_MODE_EXT:
1130
res = set_sampler_reduction_mode(ctx, sampObj, params[0]);
1132
case GL_TEXTURE_BORDER_COLOR:
1135
c[0] = INT_TO_FLOAT(params[0]);
1136
c[1] = INT_TO_FLOAT(params[1]);
1137
c[2] = INT_TO_FLOAT(params[2]);
1138
c[3] = INT_TO_FLOAT(params[3]);
1139
res = set_sampler_border_colorf(ctx, sampObj, c);
1143
res = INVALID_PNAME;
1151
/* state change - we do nothing special at this time */
1154
_mesa_error(ctx, GL_INVALID_ENUM, "glSamplerParameteriv(pname=%s)\n",
1155
_mesa_enum_to_string(pname));
1158
_mesa_error(ctx, GL_INVALID_ENUM, "glSamplerParameteriv(param=%d)\n",
1162
_mesa_error(ctx, GL_INVALID_VALUE, "glSamplerParameteriv(param=%d)\n",
1171
_mesa_SamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *params)
1173
struct gl_sampler_object *sampObj;
1175
GET_CURRENT_CONTEXT(ctx);
1177
sampObj = sampler_parameter_error_check(ctx, sampler, false,
1178
"glSamplerParameterfv");
1183
case GL_TEXTURE_WRAP_S:
1184
res = set_sampler_wrap_s(ctx, sampObj, (GLint) params[0]);
1186
case GL_TEXTURE_WRAP_T:
1187
res = set_sampler_wrap_t(ctx, sampObj, (GLint) params[0]);
1189
case GL_TEXTURE_WRAP_R:
1190
res = set_sampler_wrap_r(ctx, sampObj, (GLint) params[0]);
1192
case GL_TEXTURE_MIN_FILTER:
1193
res = set_sampler_min_filter(ctx, sampObj, (GLint) params[0]);
1195
case GL_TEXTURE_MAG_FILTER:
1196
res = set_sampler_mag_filter(ctx, sampObj, (GLint) params[0]);
1198
case GL_TEXTURE_MIN_LOD:
1199
res = set_sampler_min_lod(ctx, sampObj, params[0]);
1201
case GL_TEXTURE_MAX_LOD:
1202
res = set_sampler_max_lod(ctx, sampObj, params[0]);
1204
case GL_TEXTURE_LOD_BIAS:
1205
res = set_sampler_lod_bias(ctx, sampObj, params[0]);
1207
case GL_TEXTURE_COMPARE_MODE:
1208
res = set_sampler_compare_mode(ctx, sampObj, (GLint) params[0]);
1210
case GL_TEXTURE_COMPARE_FUNC:
1211
res = set_sampler_compare_func(ctx, sampObj, (GLint) params[0]);
1213
case GL_TEXTURE_MAX_ANISOTROPY_EXT:
1214
res = set_sampler_max_anisotropy(ctx, sampObj, params[0]);
1216
case GL_TEXTURE_CUBE_MAP_SEAMLESS:
1217
res = set_sampler_cube_map_seamless(ctx, sampObj, (GLboolean) params[0]);
1219
case GL_TEXTURE_SRGB_DECODE_EXT:
1220
res = set_sampler_srgb_decode(ctx, sampObj, (GLenum) params[0]);
1222
case GL_TEXTURE_REDUCTION_MODE_EXT:
1223
res = set_sampler_reduction_mode(ctx, sampObj, (GLenum) params[0]);
1225
case GL_TEXTURE_BORDER_COLOR:
1226
res = set_sampler_border_colorf(ctx, sampObj, params);
1229
res = INVALID_PNAME;
1237
/* state change - we do nothing special at this time */
1240
_mesa_error(ctx, GL_INVALID_ENUM, "glSamplerParameterfv(pname=%s)\n",
1241
_mesa_enum_to_string(pname));
1244
_mesa_error(ctx, GL_INVALID_ENUM, "glSamplerParameterfv(param=%f)\n",
1248
_mesa_error(ctx, GL_INVALID_VALUE, "glSamplerParameterfv(param=%f)\n",
1257
_mesa_SamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *params)
1259
struct gl_sampler_object *sampObj;
1261
GET_CURRENT_CONTEXT(ctx);
1263
sampObj = sampler_parameter_error_check(ctx, sampler, false,
1264
"glSamplerParameterIiv");
1269
case GL_TEXTURE_WRAP_S:
1270
res = set_sampler_wrap_s(ctx, sampObj, params[0]);
1272
case GL_TEXTURE_WRAP_T:
1273
res = set_sampler_wrap_t(ctx, sampObj, params[0]);
1275
case GL_TEXTURE_WRAP_R:
1276
res = set_sampler_wrap_r(ctx, sampObj, params[0]);
1278
case GL_TEXTURE_MIN_FILTER:
1279
res = set_sampler_min_filter(ctx, sampObj, params[0]);
1281
case GL_TEXTURE_MAG_FILTER:
1282
res = set_sampler_mag_filter(ctx, sampObj, params[0]);
1284
case GL_TEXTURE_MIN_LOD:
1285
res = set_sampler_min_lod(ctx, sampObj, (GLfloat) params[0]);
1287
case GL_TEXTURE_MAX_LOD:
1288
res = set_sampler_max_lod(ctx, sampObj, (GLfloat) params[0]);
1290
case GL_TEXTURE_LOD_BIAS:
1291
res = set_sampler_lod_bias(ctx, sampObj, (GLfloat) params[0]);
1293
case GL_TEXTURE_COMPARE_MODE:
1294
res = set_sampler_compare_mode(ctx, sampObj, params[0]);
1296
case GL_TEXTURE_COMPARE_FUNC:
1297
res = set_sampler_compare_func(ctx, sampObj, params[0]);
1299
case GL_TEXTURE_MAX_ANISOTROPY_EXT:
1300
res = set_sampler_max_anisotropy(ctx, sampObj, (GLfloat) params[0]);
1302
case GL_TEXTURE_CUBE_MAP_SEAMLESS:
1303
res = set_sampler_cube_map_seamless(ctx, sampObj, params[0]);
1305
case GL_TEXTURE_SRGB_DECODE_EXT:
1306
res = set_sampler_srgb_decode(ctx, sampObj, (GLenum) params[0]);
1308
case GL_TEXTURE_REDUCTION_MODE_EXT:
1309
res = set_sampler_reduction_mode(ctx, sampObj, (GLenum) params[0]);
1311
case GL_TEXTURE_BORDER_COLOR:
1312
res = set_sampler_border_colori(ctx, sampObj, params);
1315
res = INVALID_PNAME;
1323
/* state change - we do nothing special at this time */
1326
_mesa_error(ctx, GL_INVALID_ENUM, "glSamplerParameterIiv(pname=%s)\n",
1327
_mesa_enum_to_string(pname));
1330
_mesa_error(ctx, GL_INVALID_ENUM, "glSamplerParameterIiv(param=%d)\n",
1334
_mesa_error(ctx, GL_INVALID_VALUE, "glSamplerParameterIiv(param=%d)\n",
1344
_mesa_SamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *params)
1346
struct gl_sampler_object *sampObj;
1348
GET_CURRENT_CONTEXT(ctx);
1350
sampObj = sampler_parameter_error_check(ctx, sampler, false,
1351
"glSamplerParameterIuiv");
1356
case GL_TEXTURE_WRAP_S:
1357
res = set_sampler_wrap_s(ctx, sampObj, params[0]);
1359
case GL_TEXTURE_WRAP_T:
1360
res = set_sampler_wrap_t(ctx, sampObj, params[0]);
1362
case GL_TEXTURE_WRAP_R:
1363
res = set_sampler_wrap_r(ctx, sampObj, params[0]);
1365
case GL_TEXTURE_MIN_FILTER:
1366
res = set_sampler_min_filter(ctx, sampObj, params[0]);
1368
case GL_TEXTURE_MAG_FILTER:
1369
res = set_sampler_mag_filter(ctx, sampObj, params[0]);
1371
case GL_TEXTURE_MIN_LOD:
1372
res = set_sampler_min_lod(ctx, sampObj, (GLfloat) params[0]);
1374
case GL_TEXTURE_MAX_LOD:
1375
res = set_sampler_max_lod(ctx, sampObj, (GLfloat) params[0]);
1377
case GL_TEXTURE_LOD_BIAS:
1378
res = set_sampler_lod_bias(ctx, sampObj, (GLfloat) params[0]);
1380
case GL_TEXTURE_COMPARE_MODE:
1381
res = set_sampler_compare_mode(ctx, sampObj, params[0]);
1383
case GL_TEXTURE_COMPARE_FUNC:
1384
res = set_sampler_compare_func(ctx, sampObj, params[0]);
1386
case GL_TEXTURE_MAX_ANISOTROPY_EXT:
1387
res = set_sampler_max_anisotropy(ctx, sampObj, (GLfloat) params[0]);
1389
case GL_TEXTURE_CUBE_MAP_SEAMLESS:
1390
res = set_sampler_cube_map_seamless(ctx, sampObj, params[0]);
1392
case GL_TEXTURE_SRGB_DECODE_EXT:
1393
res = set_sampler_srgb_decode(ctx, sampObj, (GLenum) params[0]);
1395
case GL_TEXTURE_REDUCTION_MODE_EXT:
1396
res = set_sampler_reduction_mode(ctx, sampObj, (GLenum) params[0]);
1398
case GL_TEXTURE_BORDER_COLOR:
1399
res = set_sampler_border_colorui(ctx, sampObj, params);
1402
res = INVALID_PNAME;
1410
/* state change - we do nothing special at this time */
1413
_mesa_error(ctx, GL_INVALID_ENUM, "glSamplerParameterIuiv(pname=%s)\n",
1414
_mesa_enum_to_string(pname));
1417
_mesa_error(ctx, GL_INVALID_ENUM, "glSamplerParameterIuiv(param=%u)\n",
1421
_mesa_error(ctx, GL_INVALID_VALUE, "glSamplerParameterIuiv(param=%u)\n",
1431
_mesa_GetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
1433
struct gl_sampler_object *sampObj;
1434
GET_CURRENT_CONTEXT(ctx);
1436
sampObj = sampler_parameter_error_check(ctx, sampler, true,
1437
"glGetSamplerParameteriv");
1442
case GL_TEXTURE_WRAP_S:
1443
*params = sampObj->Attrib.WrapS;
1445
case GL_TEXTURE_WRAP_T:
1446
*params = sampObj->Attrib.WrapT;
1448
case GL_TEXTURE_WRAP_R:
1449
*params = sampObj->Attrib.WrapR;
1451
case GL_TEXTURE_MIN_FILTER:
1452
*params = sampObj->Attrib.MinFilter;
1454
case GL_TEXTURE_MAG_FILTER:
1455
*params = sampObj->Attrib.MagFilter;
1457
case GL_TEXTURE_MIN_LOD:
1458
/* GL spec 'Data Conversions' section specifies that floating-point
1459
* value in integer Get function is rounded to nearest integer
1461
*params = lroundf(sampObj->Attrib.MinLod);
1463
case GL_TEXTURE_MAX_LOD:
1464
/* GL spec 'Data Conversions' section specifies that floating-point
1465
* value in integer Get function is rounded to nearest integer
1467
*params = lroundf(sampObj->Attrib.MaxLod);
1469
case GL_TEXTURE_LOD_BIAS:
1470
/* GL spec 'Data Conversions' section specifies that floating-point
1471
* value in integer Get function is rounded to nearest integer
1473
*params = lroundf(sampObj->Attrib.LodBias);
1475
case GL_TEXTURE_COMPARE_MODE:
1476
if (!ctx->Extensions.ARB_shadow)
1478
*params = sampObj->Attrib.CompareMode;
1480
case GL_TEXTURE_COMPARE_FUNC:
1481
if (!ctx->Extensions.ARB_shadow)
1483
*params = sampObj->Attrib.CompareFunc;
1485
case GL_TEXTURE_MAX_ANISOTROPY_EXT:
1486
if (!ctx->Extensions.EXT_texture_filter_anisotropic)
1488
/* GL spec 'Data Conversions' section specifies that floating-point
1489
* value in integer Get function is rounded to nearest integer
1491
*params = lroundf(sampObj->Attrib.MaxAnisotropy);
1493
case GL_TEXTURE_BORDER_COLOR:
1494
params[0] = FLOAT_TO_INT(sampObj->Attrib.state.border_color.f[0]);
1495
params[1] = FLOAT_TO_INT(sampObj->Attrib.state.border_color.f[1]);
1496
params[2] = FLOAT_TO_INT(sampObj->Attrib.state.border_color.f[2]);
1497
params[3] = FLOAT_TO_INT(sampObj->Attrib.state.border_color.f[3]);
1499
case GL_TEXTURE_CUBE_MAP_SEAMLESS:
1500
if (!ctx->Extensions.AMD_seamless_cubemap_per_texture)
1502
*params = sampObj->Attrib.CubeMapSeamless;
1504
case GL_TEXTURE_SRGB_DECODE_EXT:
1505
if (!ctx->Extensions.EXT_texture_sRGB_decode)
1507
*params = (GLenum) sampObj->Attrib.sRGBDecode;
1509
case GL_TEXTURE_REDUCTION_MODE_EXT:
1510
if (!ctx->Extensions.EXT_texture_filter_minmax &&
1511
!_mesa_has_ARB_texture_filter_minmax(ctx))
1513
*params = (GLenum) sampObj->Attrib.ReductionMode;
1521
_mesa_error(ctx, GL_INVALID_ENUM, "glGetSamplerParameteriv(pname=%s)",
1522
_mesa_enum_to_string(pname));
1527
_mesa_GetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
1529
struct gl_sampler_object *sampObj;
1530
GET_CURRENT_CONTEXT(ctx);
1532
sampObj = sampler_parameter_error_check(ctx, sampler, true,
1533
"glGetSamplerParameterfv");
1538
case GL_TEXTURE_WRAP_S:
1539
*params = (GLfloat) sampObj->Attrib.WrapS;
1541
case GL_TEXTURE_WRAP_T:
1542
*params = (GLfloat) sampObj->Attrib.WrapT;
1544
case GL_TEXTURE_WRAP_R:
1545
*params = (GLfloat) sampObj->Attrib.WrapR;
1547
case GL_TEXTURE_MIN_FILTER:
1548
*params = (GLfloat) sampObj->Attrib.MinFilter;
1550
case GL_TEXTURE_MAG_FILTER:
1551
*params = (GLfloat) sampObj->Attrib.MagFilter;
1553
case GL_TEXTURE_MIN_LOD:
1554
*params = sampObj->Attrib.MinLod;
1556
case GL_TEXTURE_MAX_LOD:
1557
*params = sampObj->Attrib.MaxLod;
1559
case GL_TEXTURE_LOD_BIAS:
1560
*params = sampObj->Attrib.LodBias;
1562
case GL_TEXTURE_COMPARE_MODE:
1563
*params = (GLfloat) sampObj->Attrib.CompareMode;
1565
case GL_TEXTURE_COMPARE_FUNC:
1566
*params = (GLfloat) sampObj->Attrib.CompareFunc;
1568
case GL_TEXTURE_MAX_ANISOTROPY_EXT:
1569
*params = sampObj->Attrib.MaxAnisotropy;
1571
case GL_TEXTURE_BORDER_COLOR:
1572
params[0] = sampObj->Attrib.state.border_color.f[0];
1573
params[1] = sampObj->Attrib.state.border_color.f[1];
1574
params[2] = sampObj->Attrib.state.border_color.f[2];
1575
params[3] = sampObj->Attrib.state.border_color.f[3];
1577
case GL_TEXTURE_CUBE_MAP_SEAMLESS:
1578
if (!ctx->Extensions.AMD_seamless_cubemap_per_texture)
1580
*params = (GLfloat) sampObj->Attrib.CubeMapSeamless;
1582
case GL_TEXTURE_SRGB_DECODE_EXT:
1583
if (!ctx->Extensions.EXT_texture_sRGB_decode)
1585
*params = (GLfloat) sampObj->Attrib.sRGBDecode;
1587
case GL_TEXTURE_REDUCTION_MODE_EXT:
1588
if (!ctx->Extensions.EXT_texture_filter_minmax &&
1589
!_mesa_has_ARB_texture_filter_minmax(ctx))
1591
*params = (GLfloat) sampObj->Attrib.ReductionMode;
1599
_mesa_error(ctx, GL_INVALID_ENUM, "glGetSamplerParameterfv(pname=%s)",
1600
_mesa_enum_to_string(pname));
1605
_mesa_GetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint *params)
1607
struct gl_sampler_object *sampObj;
1608
GET_CURRENT_CONTEXT(ctx);
1610
sampObj = sampler_parameter_error_check(ctx, sampler, true,
1611
"glGetSamplerParameterIiv");
1616
case GL_TEXTURE_WRAP_S:
1617
*params = sampObj->Attrib.WrapS;
1619
case GL_TEXTURE_WRAP_T:
1620
*params = sampObj->Attrib.WrapT;
1622
case GL_TEXTURE_WRAP_R:
1623
*params = sampObj->Attrib.WrapR;
1625
case GL_TEXTURE_MIN_FILTER:
1626
*params = sampObj->Attrib.MinFilter;
1628
case GL_TEXTURE_MAG_FILTER:
1629
*params = sampObj->Attrib.MagFilter;
1631
case GL_TEXTURE_MIN_LOD:
1632
*params = (GLint) sampObj->Attrib.MinLod;
1634
case GL_TEXTURE_MAX_LOD:
1635
*params = (GLint) sampObj->Attrib.MaxLod;
1637
case GL_TEXTURE_LOD_BIAS:
1638
*params = (GLint) sampObj->Attrib.LodBias;
1640
case GL_TEXTURE_COMPARE_MODE:
1641
*params = sampObj->Attrib.CompareMode;
1643
case GL_TEXTURE_COMPARE_FUNC:
1644
*params = sampObj->Attrib.CompareFunc;
1646
case GL_TEXTURE_MAX_ANISOTROPY_EXT:
1647
*params = (GLint) sampObj->Attrib.MaxAnisotropy;
1649
case GL_TEXTURE_BORDER_COLOR:
1650
params[0] = sampObj->Attrib.state.border_color.i[0];
1651
params[1] = sampObj->Attrib.state.border_color.i[1];
1652
params[2] = sampObj->Attrib.state.border_color.i[2];
1653
params[3] = sampObj->Attrib.state.border_color.i[3];
1655
case GL_TEXTURE_CUBE_MAP_SEAMLESS:
1656
if (!ctx->Extensions.AMD_seamless_cubemap_per_texture)
1658
*params = sampObj->Attrib.CubeMapSeamless;
1660
case GL_TEXTURE_SRGB_DECODE_EXT:
1661
if (!ctx->Extensions.EXT_texture_sRGB_decode)
1663
*params = (GLenum) sampObj->Attrib.sRGBDecode;
1665
case GL_TEXTURE_REDUCTION_MODE_EXT:
1666
if (!ctx->Extensions.EXT_texture_filter_minmax &&
1667
!_mesa_has_ARB_texture_filter_minmax(ctx))
1669
*params = (GLenum) sampObj->Attrib.ReductionMode;
1677
_mesa_error(ctx, GL_INVALID_ENUM, "glGetSamplerParameterIiv(pname=%s)",
1678
_mesa_enum_to_string(pname));
1683
_mesa_GetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint *params)
1685
struct gl_sampler_object *sampObj;
1686
GET_CURRENT_CONTEXT(ctx);
1688
sampObj = sampler_parameter_error_check(ctx, sampler, true,
1689
"glGetSamplerParameterIuiv");
1694
case GL_TEXTURE_WRAP_S:
1695
*params = sampObj->Attrib.WrapS;
1697
case GL_TEXTURE_WRAP_T:
1698
*params = sampObj->Attrib.WrapT;
1700
case GL_TEXTURE_WRAP_R:
1701
*params = sampObj->Attrib.WrapR;
1703
case GL_TEXTURE_MIN_FILTER:
1704
*params = sampObj->Attrib.MinFilter;
1706
case GL_TEXTURE_MAG_FILTER:
1707
*params = sampObj->Attrib.MagFilter;
1709
case GL_TEXTURE_MIN_LOD:
1710
*params = (GLuint) sampObj->Attrib.MinLod;
1712
case GL_TEXTURE_MAX_LOD:
1713
*params = (GLuint) sampObj->Attrib.MaxLod;
1715
case GL_TEXTURE_LOD_BIAS:
1716
*params = (GLuint) sampObj->Attrib.LodBias;
1718
case GL_TEXTURE_COMPARE_MODE:
1719
*params = sampObj->Attrib.CompareMode;
1721
case GL_TEXTURE_COMPARE_FUNC:
1722
*params = sampObj->Attrib.CompareFunc;
1724
case GL_TEXTURE_MAX_ANISOTROPY_EXT:
1725
*params = (GLuint) sampObj->Attrib.MaxAnisotropy;
1727
case GL_TEXTURE_BORDER_COLOR:
1728
params[0] = sampObj->Attrib.state.border_color.ui[0];
1729
params[1] = sampObj->Attrib.state.border_color.ui[1];
1730
params[2] = sampObj->Attrib.state.border_color.ui[2];
1731
params[3] = sampObj->Attrib.state.border_color.ui[3];
1733
case GL_TEXTURE_CUBE_MAP_SEAMLESS:
1734
if (!ctx->Extensions.AMD_seamless_cubemap_per_texture)
1736
*params = sampObj->Attrib.CubeMapSeamless;
1738
case GL_TEXTURE_SRGB_DECODE_EXT:
1739
if (!ctx->Extensions.EXT_texture_sRGB_decode)
1741
*params = (GLenum) sampObj->Attrib.sRGBDecode;
1743
case GL_TEXTURE_REDUCTION_MODE_EXT:
1744
if (!ctx->Extensions.EXT_texture_filter_minmax &&
1745
!_mesa_has_ARB_texture_filter_minmax(ctx))
1747
*params = (GLenum) sampObj->Attrib.ReductionMode;
1755
_mesa_error(ctx, GL_INVALID_ENUM, "glGetSamplerParameterIuiv(pname=%s)",
1756
_mesa_enum_to_string(pname));