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/dispatch.h"
36 #include "main/enums.h"
37 #include "main/hash.h"
38 #include "main/macros.h"
39 #include "main/mtypes.h"
40 #include "main/samplerobj.h"
43 struct gl_sampler_object
*
44 _mesa_lookup_samplerobj(struct gl_context
*ctx
, GLuint name
)
49 return (struct gl_sampler_object
*)
50 _mesa_HashLookup(ctx
->Shared
->SamplerObjects
, name
);
55 * Handle reference counting.
58 _mesa_reference_sampler_object_(struct gl_context
*ctx
,
59 struct gl_sampler_object
**ptr
,
60 struct gl_sampler_object
*samp
)
62 assert(*ptr
!= samp
); /* The inline wrapper should prevent no-op calls */
65 /* Unreference the old sampler */
66 GLboolean deleteFlag
= GL_FALSE
;
67 struct gl_sampler_object
*oldSamp
= *ptr
;
69 /*_glthread_LOCK_MUTEX(oldSamp->Mutex);*/
70 ASSERT(oldSamp
->RefCount
> 0);
73 printf("SamplerObj %p %d DECR to %d\n",
74 (void *) oldSamp
, oldSamp
->Name
, oldSamp
->RefCount
);
76 deleteFlag
= (oldSamp
->RefCount
== 0);
77 /*_glthread_UNLOCK_MUTEX(oldSamp->Mutex);*/
80 ASSERT(ctx
->Driver
.DeleteSamplerObject
);
81 ctx
->Driver
.DeleteSamplerObject(ctx
, oldSamp
);
89 /* reference new sampler */
90 /*_glthread_LOCK_MUTEX(samp->Mutex);*/
91 if (samp
->RefCount
== 0) {
92 /* this sampler's being deleted (look just above) */
93 /* Not sure this can every really happen. Warn if it does. */
94 _mesa_problem(NULL
, "referencing deleted sampler object");
100 printf("SamplerObj %p %d INCR to %d\n",
101 (void *) samp
, samp
->Name
, samp
->RefCount
);
105 /*_glthread_UNLOCK_MUTEX(samp->Mutex);*/
111 * Initialize the fields of the given sampler object.
114 _mesa_init_sampler_object(struct gl_sampler_object
*sampObj
, GLuint name
)
116 sampObj
->Name
= name
;
117 sampObj
->RefCount
= 1;
118 sampObj
->WrapS
= GL_REPEAT
;
119 sampObj
->WrapT
= GL_REPEAT
;
120 sampObj
->WrapR
= GL_REPEAT
;
121 sampObj
->MinFilter
= GL_NEAREST_MIPMAP_LINEAR
;
122 sampObj
->MagFilter
= GL_LINEAR
;
123 sampObj
->BorderColor
.f
[0] = 0.0;
124 sampObj
->BorderColor
.f
[1] = 0.0;
125 sampObj
->BorderColor
.f
[2] = 0.0;
126 sampObj
->BorderColor
.f
[3] = 0.0;
127 sampObj
->MinLod
= -1000.0F
;
128 sampObj
->MaxLod
= 1000.0F
;
129 sampObj
->LodBias
= 0.0F
;
130 sampObj
->MaxAnisotropy
= 1.0F
;
131 sampObj
->CompareMode
= GL_NONE
;
132 sampObj
->CompareFunc
= GL_LEQUAL
;
133 sampObj
->sRGBDecode
= GL_DECODE_EXT
;
134 sampObj
->CubeMapSeamless
= GL_FALSE
;
138 * Fallback for ctx->Driver.NewSamplerObject();
140 struct gl_sampler_object
*
141 _mesa_new_sampler_object(struct gl_context
*ctx
, GLuint name
)
143 struct gl_sampler_object
*sampObj
= CALLOC_STRUCT(gl_sampler_object
);
145 _mesa_init_sampler_object(sampObj
, name
);
152 * Fallback for ctx->Driver.DeleteSamplerObject();
155 _mesa_delete_sampler_object(struct gl_context
*ctx
,
156 struct gl_sampler_object
*sampObj
)
163 _mesa_GenSamplers(GLsizei count
, GLuint
*samplers
)
165 GET_CURRENT_CONTEXT(ctx
);
169 if (MESA_VERBOSE
& VERBOSE_API
)
170 _mesa_debug(ctx
, "glGenSamplers(%d)\n", count
);
173 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGenSamplers");
180 first
= _mesa_HashFindFreeKeyBlock(ctx
->Shared
->SamplerObjects
, count
);
182 /* Insert the ID and pointer to new sampler object into hash table */
183 for (i
= 0; i
< count
; i
++) {
184 struct gl_sampler_object
*sampObj
=
185 ctx
->Driver
.NewSamplerObject(ctx
, first
+ i
);
186 _mesa_HashInsert(ctx
->Shared
->SamplerObjects
, first
+ i
, sampObj
);
187 samplers
[i
] = first
+ i
;
193 _mesa_DeleteSamplers(GLsizei count
, const GLuint
*samplers
)
195 GET_CURRENT_CONTEXT(ctx
);
198 FLUSH_VERTICES(ctx
, 0);
201 _mesa_error(ctx
, GL_INVALID_VALUE
, "glDeleteSamplers(count)");
205 _glthread_LOCK_MUTEX(ctx
->Shared
->Mutex
);
207 for (i
= 0; i
< count
; i
++) {
210 struct gl_sampler_object
*sampObj
=
211 _mesa_lookup_samplerobj(ctx
, samplers
[i
]);
214 /* If the sampler is currently bound, unbind it. */
215 for (j
= 0; j
< ctx
->Const
.MaxCombinedTextureImageUnits
; j
++) {
216 if (ctx
->Texture
.Unit
[j
].Sampler
== sampObj
) {
217 FLUSH_VERTICES(ctx
, _NEW_TEXTURE
);
218 _mesa_reference_sampler_object(ctx
, &ctx
->Texture
.Unit
[j
].Sampler
, NULL
);
222 /* The ID is immediately freed for re-use */
223 _mesa_HashRemove(ctx
->Shared
->SamplerObjects
, samplers
[i
]);
224 /* But the object exists until its reference count goes to zero */
225 _mesa_reference_sampler_object(ctx
, &sampObj
, NULL
);
230 _glthread_UNLOCK_MUTEX(ctx
->Shared
->Mutex
);
235 _mesa_IsSampler(GLuint sampler
)
237 struct gl_sampler_object
*sampObj
;
238 GET_CURRENT_CONTEXT(ctx
);
240 ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx
, GL_FALSE
);
245 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
247 return sampObj
!= NULL
;
252 _mesa_BindSampler(GLuint unit
, GLuint sampler
)
254 struct gl_sampler_object
*sampObj
;
255 GET_CURRENT_CONTEXT(ctx
);
257 if (unit
>= ctx
->Const
.MaxCombinedTextureImageUnits
) {
258 _mesa_error(ctx
, GL_INVALID_VALUE
, "glBindSampler(unit %u)", unit
);
263 /* Use the default sampler object, the one contained in the texture
269 /* user-defined sampler object */
270 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
272 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glBindSampler(sampler)");
277 if (ctx
->Texture
.Unit
[unit
].Sampler
!= sampObj
) {
278 FLUSH_VERTICES(ctx
, _NEW_TEXTURE
);
281 /* bind new sampler */
282 _mesa_reference_sampler_object(ctx
, &ctx
->Texture
.Unit
[unit
].Sampler
,
288 * Check if a coordinate wrap mode is legal.
289 * \return GL_TRUE if legal, GL_FALSE otherwise
292 validate_texture_wrap_mode(struct gl_context
*ctx
, GLenum wrap
)
294 const struct gl_extensions
* const e
= &ctx
->Extensions
;
298 case GL_CLAMP_TO_EDGE
:
300 case GL_MIRRORED_REPEAT
:
302 case GL_CLAMP_TO_BORDER
:
303 return e
->ARB_texture_border_clamp
;
304 case GL_MIRROR_CLAMP_EXT
:
305 return e
->ATI_texture_mirror_once
|| e
->EXT_texture_mirror_clamp
;
306 case GL_MIRROR_CLAMP_TO_EDGE_EXT
:
307 return e
->ATI_texture_mirror_once
|| e
->EXT_texture_mirror_clamp
;
308 case GL_MIRROR_CLAMP_TO_BORDER_EXT
:
309 return e
->EXT_texture_mirror_clamp
;
317 * This is called just prior to changing any sampler object state.
320 flush(struct gl_context
*ctx
)
322 FLUSH_VERTICES(ctx
, _NEW_TEXTURE
);
326 #define INVALID_PARAM 0x100
327 #define INVALID_PNAME 0x101
328 #define INVALID_VALUE 0x102
331 set_sampler_wrap_s(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
334 if (samp
->WrapS
== param
)
336 if (validate_texture_wrap_mode(ctx
, param
)) {
341 return INVALID_PARAM
;
346 set_sampler_wrap_t(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
349 if (samp
->WrapT
== param
)
351 if (validate_texture_wrap_mode(ctx
, param
)) {
356 return INVALID_PARAM
;
361 set_sampler_wrap_r(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
364 if (samp
->WrapR
== param
)
366 if (validate_texture_wrap_mode(ctx
, param
)) {
371 return INVALID_PARAM
;
376 set_sampler_min_filter(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
379 if (samp
->MinFilter
== param
)
385 case GL_NEAREST_MIPMAP_NEAREST
:
386 case GL_LINEAR_MIPMAP_NEAREST
:
387 case GL_NEAREST_MIPMAP_LINEAR
:
388 case GL_LINEAR_MIPMAP_LINEAR
:
390 samp
->MinFilter
= param
;
393 return INVALID_PARAM
;
399 set_sampler_mag_filter(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
402 if (samp
->MagFilter
== param
)
409 samp
->MagFilter
= param
;
412 return INVALID_PARAM
;
418 set_sampler_lod_bias(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
421 if (samp
->LodBias
== param
)
425 samp
->LodBias
= param
;
431 set_sampler_border_colorf(struct gl_context
*ctx
,
432 struct gl_sampler_object
*samp
,
433 const GLfloat params
[4])
436 samp
->BorderColor
.f
[RCOMP
] = params
[0];
437 samp
->BorderColor
.f
[GCOMP
] = params
[1];
438 samp
->BorderColor
.f
[BCOMP
] = params
[2];
439 samp
->BorderColor
.f
[ACOMP
] = params
[3];
445 set_sampler_border_colori(struct gl_context
*ctx
,
446 struct gl_sampler_object
*samp
,
447 const GLint params
[4])
450 samp
->BorderColor
.i
[RCOMP
] = params
[0];
451 samp
->BorderColor
.i
[GCOMP
] = params
[1];
452 samp
->BorderColor
.i
[BCOMP
] = params
[2];
453 samp
->BorderColor
.i
[ACOMP
] = params
[3];
459 set_sampler_border_colorui(struct gl_context
*ctx
,
460 struct gl_sampler_object
*samp
,
461 const GLuint params
[4])
464 samp
->BorderColor
.ui
[RCOMP
] = params
[0];
465 samp
->BorderColor
.ui
[GCOMP
] = params
[1];
466 samp
->BorderColor
.ui
[BCOMP
] = params
[2];
467 samp
->BorderColor
.ui
[ACOMP
] = params
[3];
473 set_sampler_min_lod(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
476 if (samp
->MinLod
== param
)
480 samp
->MinLod
= param
;
486 set_sampler_max_lod(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
489 if (samp
->MaxLod
== param
)
493 samp
->MaxLod
= param
;
499 set_sampler_compare_mode(struct gl_context
*ctx
,
500 struct gl_sampler_object
*samp
, GLint param
)
502 if (!ctx
->Extensions
.ARB_shadow
)
503 return INVALID_PNAME
;
505 if (samp
->CompareMode
== param
)
508 if (param
== GL_NONE
||
509 param
== GL_COMPARE_R_TO_TEXTURE_ARB
) {
511 samp
->CompareMode
= param
;
515 return INVALID_PARAM
;
520 set_sampler_compare_func(struct gl_context
*ctx
,
521 struct gl_sampler_object
*samp
, GLint param
)
523 if (!ctx
->Extensions
.ARB_shadow
)
524 return INVALID_PNAME
;
526 if (samp
->CompareFunc
== param
)
533 samp
->CompareFunc
= param
;
541 if (ctx
->Extensions
.EXT_shadow_funcs
) {
543 samp
->CompareFunc
= param
;
548 return INVALID_PARAM
;
554 set_sampler_max_anisotropy(struct gl_context
*ctx
,
555 struct gl_sampler_object
*samp
, GLfloat param
)
557 if (!ctx
->Extensions
.EXT_texture_filter_anisotropic
)
558 return INVALID_PNAME
;
560 if (samp
->MaxAnisotropy
== param
)
564 return INVALID_VALUE
;
567 /* clamp to max, that's what NVIDIA does */
568 samp
->MaxAnisotropy
= MIN2(param
, ctx
->Const
.MaxTextureMaxAnisotropy
);
574 set_sampler_cube_map_seamless(struct gl_context
*ctx
,
575 struct gl_sampler_object
*samp
, GLboolean param
)
577 if (!ctx
->Extensions
.AMD_seamless_cubemap_per_texture
)
578 return INVALID_PNAME
;
580 if (samp
->CubeMapSeamless
== param
)
583 if (param
!= GL_TRUE
&& param
!= GL_FALSE
)
584 return INVALID_VALUE
;
587 samp
->CubeMapSeamless
= param
;
592 set_sampler_srgb_decode(struct gl_context
*ctx
,
593 struct gl_sampler_object
*samp
, GLenum param
)
595 if (!ctx
->Extensions
.EXT_texture_sRGB_decode
)
596 return INVALID_PNAME
;
598 if (samp
->sRGBDecode
== param
)
601 if (param
!= GL_DECODE_EXT
&& param
!= GL_SKIP_DECODE_EXT
)
602 return INVALID_VALUE
;
605 samp
->sRGBDecode
= param
;
610 _mesa_SamplerParameteri(GLuint sampler
, GLenum pname
, GLint param
)
612 struct gl_sampler_object
*sampObj
;
614 GET_CURRENT_CONTEXT(ctx
);
616 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
618 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameteri(sampler %u)",
624 case GL_TEXTURE_WRAP_S
:
625 res
= set_sampler_wrap_s(ctx
, sampObj
, param
);
627 case GL_TEXTURE_WRAP_T
:
628 res
= set_sampler_wrap_t(ctx
, sampObj
, param
);
630 case GL_TEXTURE_WRAP_R
:
631 res
= set_sampler_wrap_r(ctx
, sampObj
, param
);
633 case GL_TEXTURE_MIN_FILTER
:
634 res
= set_sampler_min_filter(ctx
, sampObj
, param
);
636 case GL_TEXTURE_MAG_FILTER
:
637 res
= set_sampler_mag_filter(ctx
, sampObj
, param
);
639 case GL_TEXTURE_MIN_LOD
:
640 res
= set_sampler_min_lod(ctx
, sampObj
, (GLfloat
) param
);
642 case GL_TEXTURE_MAX_LOD
:
643 res
= set_sampler_max_lod(ctx
, sampObj
, (GLfloat
) param
);
645 case GL_TEXTURE_LOD_BIAS
:
646 res
= set_sampler_lod_bias(ctx
, sampObj
, (GLfloat
) param
);
648 case GL_TEXTURE_COMPARE_MODE
:
649 res
= set_sampler_compare_mode(ctx
, sampObj
, param
);
651 case GL_TEXTURE_COMPARE_FUNC
:
652 res
= set_sampler_compare_func(ctx
, sampObj
, param
);
654 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
655 res
= set_sampler_max_anisotropy(ctx
, sampObj
, (GLfloat
) param
);
657 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
658 res
= set_sampler_cube_map_seamless(ctx
, sampObj
, param
);
660 case GL_TEXTURE_SRGB_DECODE_EXT
:
661 res
= set_sampler_srgb_decode(ctx
, sampObj
, param
);
663 case GL_TEXTURE_BORDER_COLOR
:
674 /* state change - we do nothing special at this time */
677 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameteri(pname=%s)\n",
678 _mesa_lookup_enum_by_nr(pname
));
681 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameteri(param=%d)\n",
685 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameteri(param=%d)\n",
695 _mesa_SamplerParameterf(GLuint sampler
, GLenum pname
, GLfloat param
)
697 struct gl_sampler_object
*sampObj
;
699 GET_CURRENT_CONTEXT(ctx
);
701 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
703 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterf(sampler %u)",
709 case GL_TEXTURE_WRAP_S
:
710 res
= set_sampler_wrap_s(ctx
, sampObj
, (GLint
) param
);
712 case GL_TEXTURE_WRAP_T
:
713 res
= set_sampler_wrap_t(ctx
, sampObj
, (GLint
) param
);
715 case GL_TEXTURE_WRAP_R
:
716 res
= set_sampler_wrap_r(ctx
, sampObj
, (GLint
) param
);
718 case GL_TEXTURE_MIN_FILTER
:
719 res
= set_sampler_min_filter(ctx
, sampObj
, (GLint
) param
);
721 case GL_TEXTURE_MAG_FILTER
:
722 res
= set_sampler_mag_filter(ctx
, sampObj
, (GLint
) param
);
724 case GL_TEXTURE_MIN_LOD
:
725 res
= set_sampler_min_lod(ctx
, sampObj
, param
);
727 case GL_TEXTURE_MAX_LOD
:
728 res
= set_sampler_max_lod(ctx
, sampObj
, param
);
730 case GL_TEXTURE_LOD_BIAS
:
731 res
= set_sampler_lod_bias(ctx
, sampObj
, param
);
733 case GL_TEXTURE_COMPARE_MODE
:
734 res
= set_sampler_compare_mode(ctx
, sampObj
, (GLint
) param
);
736 case GL_TEXTURE_COMPARE_FUNC
:
737 res
= set_sampler_compare_func(ctx
, sampObj
, (GLint
) param
);
739 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
740 res
= set_sampler_max_anisotropy(ctx
, sampObj
, param
);
742 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
743 res
= set_sampler_cube_map_seamless(ctx
, sampObj
, (GLboolean
) param
);
745 case GL_TEXTURE_SRGB_DECODE_EXT
:
746 res
= set_sampler_srgb_decode(ctx
, sampObj
, (GLenum
) param
);
748 case GL_TEXTURE_BORDER_COLOR
:
759 /* state change - we do nothing special at this time */
762 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterf(pname=%s)\n",
763 _mesa_lookup_enum_by_nr(pname
));
766 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterf(param=%f)\n",
770 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterf(param=%f)\n",
779 _mesa_SamplerParameteriv(GLuint sampler
, GLenum pname
, const GLint
*params
)
781 struct gl_sampler_object
*sampObj
;
783 GET_CURRENT_CONTEXT(ctx
);
785 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
787 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameteriv(sampler %u)",
793 case GL_TEXTURE_WRAP_S
:
794 res
= set_sampler_wrap_s(ctx
, sampObj
, params
[0]);
796 case GL_TEXTURE_WRAP_T
:
797 res
= set_sampler_wrap_t(ctx
, sampObj
, params
[0]);
799 case GL_TEXTURE_WRAP_R
:
800 res
= set_sampler_wrap_r(ctx
, sampObj
, params
[0]);
802 case GL_TEXTURE_MIN_FILTER
:
803 res
= set_sampler_min_filter(ctx
, sampObj
, params
[0]);
805 case GL_TEXTURE_MAG_FILTER
:
806 res
= set_sampler_mag_filter(ctx
, sampObj
, params
[0]);
808 case GL_TEXTURE_MIN_LOD
:
809 res
= set_sampler_min_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
811 case GL_TEXTURE_MAX_LOD
:
812 res
= set_sampler_max_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
814 case GL_TEXTURE_LOD_BIAS
:
815 res
= set_sampler_lod_bias(ctx
, sampObj
, (GLfloat
) params
[0]);
817 case GL_TEXTURE_COMPARE_MODE
:
818 res
= set_sampler_compare_mode(ctx
, sampObj
, params
[0]);
820 case GL_TEXTURE_COMPARE_FUNC
:
821 res
= set_sampler_compare_func(ctx
, sampObj
, params
[0]);
823 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
824 res
= set_sampler_max_anisotropy(ctx
, sampObj
, (GLfloat
) params
[0]);
826 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
827 res
= set_sampler_cube_map_seamless(ctx
, sampObj
, params
[0]);
829 case GL_TEXTURE_SRGB_DECODE_EXT
:
830 res
= set_sampler_srgb_decode(ctx
, sampObj
, params
[0]);
832 case GL_TEXTURE_BORDER_COLOR
:
835 c
[0] = INT_TO_FLOAT(params
[0]);
836 c
[1] = INT_TO_FLOAT(params
[1]);
837 c
[2] = INT_TO_FLOAT(params
[2]);
838 c
[3] = INT_TO_FLOAT(params
[3]);
839 res
= set_sampler_border_colorf(ctx
, sampObj
, c
);
851 /* state change - we do nothing special at this time */
854 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameteriv(pname=%s)\n",
855 _mesa_lookup_enum_by_nr(pname
));
858 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameteriv(param=%d)\n",
862 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameteriv(param=%d)\n",
871 _mesa_SamplerParameterfv(GLuint sampler
, GLenum pname
, const GLfloat
*params
)
873 struct gl_sampler_object
*sampObj
;
875 GET_CURRENT_CONTEXT(ctx
);
877 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
879 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterfv(sampler %u)",
885 case GL_TEXTURE_WRAP_S
:
886 res
= set_sampler_wrap_s(ctx
, sampObj
, (GLint
) params
[0]);
888 case GL_TEXTURE_WRAP_T
:
889 res
= set_sampler_wrap_t(ctx
, sampObj
, (GLint
) params
[0]);
891 case GL_TEXTURE_WRAP_R
:
892 res
= set_sampler_wrap_r(ctx
, sampObj
, (GLint
) params
[0]);
894 case GL_TEXTURE_MIN_FILTER
:
895 res
= set_sampler_min_filter(ctx
, sampObj
, (GLint
) params
[0]);
897 case GL_TEXTURE_MAG_FILTER
:
898 res
= set_sampler_mag_filter(ctx
, sampObj
, (GLint
) params
[0]);
900 case GL_TEXTURE_MIN_LOD
:
901 res
= set_sampler_min_lod(ctx
, sampObj
, params
[0]);
903 case GL_TEXTURE_MAX_LOD
:
904 res
= set_sampler_max_lod(ctx
, sampObj
, params
[0]);
906 case GL_TEXTURE_LOD_BIAS
:
907 res
= set_sampler_lod_bias(ctx
, sampObj
, params
[0]);
909 case GL_TEXTURE_COMPARE_MODE
:
910 res
= set_sampler_compare_mode(ctx
, sampObj
, (GLint
) params
[0]);
912 case GL_TEXTURE_COMPARE_FUNC
:
913 res
= set_sampler_compare_func(ctx
, sampObj
, (GLint
) params
[0]);
915 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
916 res
= set_sampler_max_anisotropy(ctx
, sampObj
, params
[0]);
918 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
919 res
= set_sampler_cube_map_seamless(ctx
, sampObj
, (GLboolean
) params
[0]);
921 case GL_TEXTURE_SRGB_DECODE_EXT
:
922 res
= set_sampler_srgb_decode(ctx
, sampObj
, (GLenum
) params
[0]);
924 case GL_TEXTURE_BORDER_COLOR
:
925 res
= set_sampler_border_colorf(ctx
, sampObj
, params
);
936 /* state change - we do nothing special at this time */
939 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterfv(pname=%s)\n",
940 _mesa_lookup_enum_by_nr(pname
));
943 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterfv(param=%f)\n",
947 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterfv(param=%f)\n",
956 _mesa_SamplerParameterIiv(GLuint sampler
, GLenum pname
, const GLint
*params
)
958 struct gl_sampler_object
*sampObj
;
960 GET_CURRENT_CONTEXT(ctx
);
962 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
964 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterIiv(sampler %u)",
970 case GL_TEXTURE_WRAP_S
:
971 res
= set_sampler_wrap_s(ctx
, sampObj
, params
[0]);
973 case GL_TEXTURE_WRAP_T
:
974 res
= set_sampler_wrap_t(ctx
, sampObj
, params
[0]);
976 case GL_TEXTURE_WRAP_R
:
977 res
= set_sampler_wrap_r(ctx
, sampObj
, params
[0]);
979 case GL_TEXTURE_MIN_FILTER
:
980 res
= set_sampler_min_filter(ctx
, sampObj
, params
[0]);
982 case GL_TEXTURE_MAG_FILTER
:
983 res
= set_sampler_mag_filter(ctx
, sampObj
, params
[0]);
985 case GL_TEXTURE_MIN_LOD
:
986 res
= set_sampler_min_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
988 case GL_TEXTURE_MAX_LOD
:
989 res
= set_sampler_max_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
991 case GL_TEXTURE_LOD_BIAS
:
992 res
= set_sampler_lod_bias(ctx
, sampObj
, (GLfloat
) params
[0]);
994 case GL_TEXTURE_COMPARE_MODE
:
995 res
= set_sampler_compare_mode(ctx
, sampObj
, params
[0]);
997 case GL_TEXTURE_COMPARE_FUNC
:
998 res
= set_sampler_compare_func(ctx
, sampObj
, params
[0]);
1000 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1001 res
= set_sampler_max_anisotropy(ctx
, sampObj
, (GLfloat
) params
[0]);
1003 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
1004 res
= set_sampler_cube_map_seamless(ctx
, sampObj
, params
[0]);
1006 case GL_TEXTURE_SRGB_DECODE_EXT
:
1007 res
= set_sampler_srgb_decode(ctx
, sampObj
, (GLenum
) params
[0]);
1009 case GL_TEXTURE_BORDER_COLOR
:
1010 res
= set_sampler_border_colori(ctx
, sampObj
, params
);
1013 res
= INVALID_PNAME
;
1021 /* state change - we do nothing special at this time */
1024 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterIiv(pname=%s)\n",
1025 _mesa_lookup_enum_by_nr(pname
));
1028 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterIiv(param=%d)\n",
1032 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterIiv(param=%d)\n",
1042 _mesa_SamplerParameterIuiv(GLuint sampler
, GLenum pname
, const GLuint
*params
)
1044 struct gl_sampler_object
*sampObj
;
1046 GET_CURRENT_CONTEXT(ctx
);
1048 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
1050 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterIuiv(sampler %u)",
1056 case GL_TEXTURE_WRAP_S
:
1057 res
= set_sampler_wrap_s(ctx
, sampObj
, params
[0]);
1059 case GL_TEXTURE_WRAP_T
:
1060 res
= set_sampler_wrap_t(ctx
, sampObj
, params
[0]);
1062 case GL_TEXTURE_WRAP_R
:
1063 res
= set_sampler_wrap_r(ctx
, sampObj
, params
[0]);
1065 case GL_TEXTURE_MIN_FILTER
:
1066 res
= set_sampler_min_filter(ctx
, sampObj
, params
[0]);
1068 case GL_TEXTURE_MAG_FILTER
:
1069 res
= set_sampler_mag_filter(ctx
, sampObj
, params
[0]);
1071 case GL_TEXTURE_MIN_LOD
:
1072 res
= set_sampler_min_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
1074 case GL_TEXTURE_MAX_LOD
:
1075 res
= set_sampler_max_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
1077 case GL_TEXTURE_LOD_BIAS
:
1078 res
= set_sampler_lod_bias(ctx
, sampObj
, (GLfloat
) params
[0]);
1080 case GL_TEXTURE_COMPARE_MODE
:
1081 res
= set_sampler_compare_mode(ctx
, sampObj
, params
[0]);
1083 case GL_TEXTURE_COMPARE_FUNC
:
1084 res
= set_sampler_compare_func(ctx
, sampObj
, params
[0]);
1086 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1087 res
= set_sampler_max_anisotropy(ctx
, sampObj
, (GLfloat
) params
[0]);
1089 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
1090 res
= set_sampler_cube_map_seamless(ctx
, sampObj
, params
[0]);
1092 case GL_TEXTURE_SRGB_DECODE_EXT
:
1093 res
= set_sampler_srgb_decode(ctx
, sampObj
, (GLenum
) params
[0]);
1095 case GL_TEXTURE_BORDER_COLOR
:
1096 res
= set_sampler_border_colorui(ctx
, sampObj
, params
);
1099 res
= INVALID_PNAME
;
1107 /* state change - we do nothing special at this time */
1110 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterIuiv(pname=%s)\n",
1111 _mesa_lookup_enum_by_nr(pname
));
1114 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterIuiv(param=%u)\n",
1118 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterIuiv(param=%u)\n",
1128 _mesa_GetSamplerParameteriv(GLuint sampler
, GLenum pname
, GLint
*params
)
1130 struct gl_sampler_object
*sampObj
;
1131 GET_CURRENT_CONTEXT(ctx
);
1133 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
1135 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetSamplerParameteriv(sampler %u)",
1141 case GL_TEXTURE_WRAP_S
:
1142 *params
= sampObj
->WrapS
;
1144 case GL_TEXTURE_WRAP_T
:
1145 *params
= sampObj
->WrapT
;
1147 case GL_TEXTURE_WRAP_R
:
1148 *params
= sampObj
->WrapR
;
1150 case GL_TEXTURE_MIN_FILTER
:
1151 *params
= sampObj
->MinFilter
;
1153 case GL_TEXTURE_MAG_FILTER
:
1154 *params
= sampObj
->MagFilter
;
1156 case GL_TEXTURE_MIN_LOD
:
1157 *params
= (GLint
) sampObj
->MinLod
;
1159 case GL_TEXTURE_MAX_LOD
:
1160 *params
= (GLint
) sampObj
->MaxLod
;
1162 case GL_TEXTURE_LOD_BIAS
:
1163 *params
= (GLint
) sampObj
->LodBias
;
1165 case GL_TEXTURE_COMPARE_MODE
:
1166 if (!ctx
->Extensions
.ARB_shadow
)
1168 *params
= sampObj
->CompareMode
;
1170 case GL_TEXTURE_COMPARE_FUNC
:
1171 if (!ctx
->Extensions
.ARB_shadow
)
1173 *params
= sampObj
->CompareFunc
;
1175 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1176 *params
= (GLint
) sampObj
->MaxAnisotropy
;
1178 case GL_TEXTURE_BORDER_COLOR
:
1179 params
[0] = FLOAT_TO_INT(sampObj
->BorderColor
.f
[0]);
1180 params
[1] = FLOAT_TO_INT(sampObj
->BorderColor
.f
[1]);
1181 params
[2] = FLOAT_TO_INT(sampObj
->BorderColor
.f
[2]);
1182 params
[3] = FLOAT_TO_INT(sampObj
->BorderColor
.f
[3]);
1184 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
1185 if (!ctx
->Extensions
.AMD_seamless_cubemap_per_texture
)
1187 *params
= sampObj
->CubeMapSeamless
;
1189 case GL_TEXTURE_SRGB_DECODE_EXT
:
1190 if (!ctx
->Extensions
.EXT_texture_sRGB_decode
)
1192 *params
= (GLenum
) sampObj
->sRGBDecode
;
1200 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetSamplerParameteriv(pname=%s)",
1201 _mesa_lookup_enum_by_nr(pname
));
1206 _mesa_GetSamplerParameterfv(GLuint sampler
, GLenum pname
, GLfloat
*params
)
1208 struct gl_sampler_object
*sampObj
;
1209 GET_CURRENT_CONTEXT(ctx
);
1211 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
1213 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetSamplerParameterfv(sampler %u)",
1219 case GL_TEXTURE_WRAP_S
:
1220 *params
= (GLfloat
) sampObj
->WrapS
;
1222 case GL_TEXTURE_WRAP_T
:
1223 *params
= (GLfloat
) sampObj
->WrapT
;
1225 case GL_TEXTURE_WRAP_R
:
1226 *params
= (GLfloat
) sampObj
->WrapR
;
1228 case GL_TEXTURE_MIN_FILTER
:
1229 *params
= (GLfloat
) sampObj
->MinFilter
;
1231 case GL_TEXTURE_MAG_FILTER
:
1232 *params
= (GLfloat
) sampObj
->MagFilter
;
1234 case GL_TEXTURE_MIN_LOD
:
1235 *params
= sampObj
->MinLod
;
1237 case GL_TEXTURE_MAX_LOD
:
1238 *params
= sampObj
->MaxLod
;
1240 case GL_TEXTURE_LOD_BIAS
:
1241 *params
= sampObj
->LodBias
;
1243 case GL_TEXTURE_COMPARE_MODE
:
1244 if (!ctx
->Extensions
.ARB_shadow
)
1246 *params
= (GLfloat
) sampObj
->CompareMode
;
1248 case GL_TEXTURE_COMPARE_FUNC
:
1249 if (!ctx
->Extensions
.ARB_shadow
)
1251 *params
= (GLfloat
) sampObj
->CompareFunc
;
1253 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1254 *params
= sampObj
->MaxAnisotropy
;
1256 case GL_TEXTURE_BORDER_COLOR
:
1257 params
[0] = sampObj
->BorderColor
.f
[0];
1258 params
[1] = sampObj
->BorderColor
.f
[1];
1259 params
[2] = sampObj
->BorderColor
.f
[2];
1260 params
[3] = sampObj
->BorderColor
.f
[3];
1262 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
1263 if (!ctx
->Extensions
.AMD_seamless_cubemap_per_texture
)
1265 *params
= (GLfloat
) sampObj
->CubeMapSeamless
;
1267 case GL_TEXTURE_SRGB_DECODE_EXT
:
1268 if (!ctx
->Extensions
.EXT_texture_sRGB_decode
)
1270 *params
= (GLfloat
) sampObj
->sRGBDecode
;
1278 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetSamplerParameterfv(pname=%s)",
1279 _mesa_lookup_enum_by_nr(pname
));
1284 _mesa_GetSamplerParameterIiv(GLuint sampler
, GLenum pname
, GLint
*params
)
1286 struct gl_sampler_object
*sampObj
;
1287 GET_CURRENT_CONTEXT(ctx
);
1289 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
1291 _mesa_error(ctx
, GL_INVALID_VALUE
,
1292 "glGetSamplerParameterIiv(sampler %u)",
1298 case GL_TEXTURE_WRAP_S
:
1299 *params
= sampObj
->WrapS
;
1301 case GL_TEXTURE_WRAP_T
:
1302 *params
= sampObj
->WrapT
;
1304 case GL_TEXTURE_WRAP_R
:
1305 *params
= sampObj
->WrapR
;
1307 case GL_TEXTURE_MIN_FILTER
:
1308 *params
= sampObj
->MinFilter
;
1310 case GL_TEXTURE_MAG_FILTER
:
1311 *params
= sampObj
->MagFilter
;
1313 case GL_TEXTURE_MIN_LOD
:
1314 *params
= (GLint
) sampObj
->MinLod
;
1316 case GL_TEXTURE_MAX_LOD
:
1317 *params
= (GLint
) sampObj
->MaxLod
;
1319 case GL_TEXTURE_LOD_BIAS
:
1320 *params
= (GLint
) sampObj
->LodBias
;
1322 case GL_TEXTURE_COMPARE_MODE
:
1323 if (!ctx
->Extensions
.ARB_shadow
)
1325 *params
= sampObj
->CompareMode
;
1327 case GL_TEXTURE_COMPARE_FUNC
:
1328 if (!ctx
->Extensions
.ARB_shadow
)
1330 *params
= sampObj
->CompareFunc
;
1332 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1333 *params
= (GLint
) sampObj
->MaxAnisotropy
;
1335 case GL_TEXTURE_BORDER_COLOR
:
1336 params
[0] = sampObj
->BorderColor
.i
[0];
1337 params
[1] = sampObj
->BorderColor
.i
[1];
1338 params
[2] = sampObj
->BorderColor
.i
[2];
1339 params
[3] = sampObj
->BorderColor
.i
[3];
1341 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
1342 if (!ctx
->Extensions
.AMD_seamless_cubemap_per_texture
)
1344 *params
= sampObj
->CubeMapSeamless
;
1346 case GL_TEXTURE_SRGB_DECODE_EXT
:
1347 if (!ctx
->Extensions
.EXT_texture_sRGB_decode
)
1349 *params
= (GLenum
) sampObj
->sRGBDecode
;
1357 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetSamplerParameterIiv(pname=%s)",
1358 _mesa_lookup_enum_by_nr(pname
));
1363 _mesa_GetSamplerParameterIuiv(GLuint sampler
, GLenum pname
, GLuint
*params
)
1365 struct gl_sampler_object
*sampObj
;
1366 GET_CURRENT_CONTEXT(ctx
);
1368 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
1370 _mesa_error(ctx
, GL_INVALID_VALUE
,
1371 "glGetSamplerParameterIuiv(sampler %u)",
1377 case GL_TEXTURE_WRAP_S
:
1378 *params
= sampObj
->WrapS
;
1380 case GL_TEXTURE_WRAP_T
:
1381 *params
= sampObj
->WrapT
;
1383 case GL_TEXTURE_WRAP_R
:
1384 *params
= sampObj
->WrapR
;
1386 case GL_TEXTURE_MIN_FILTER
:
1387 *params
= sampObj
->MinFilter
;
1389 case GL_TEXTURE_MAG_FILTER
:
1390 *params
= sampObj
->MagFilter
;
1392 case GL_TEXTURE_MIN_LOD
:
1393 *params
= (GLuint
) sampObj
->MinLod
;
1395 case GL_TEXTURE_MAX_LOD
:
1396 *params
= (GLuint
) sampObj
->MaxLod
;
1398 case GL_TEXTURE_LOD_BIAS
:
1399 *params
= (GLuint
) sampObj
->LodBias
;
1401 case GL_TEXTURE_COMPARE_MODE
:
1402 if (!ctx
->Extensions
.ARB_shadow
)
1404 *params
= sampObj
->CompareMode
;
1406 case GL_TEXTURE_COMPARE_FUNC
:
1407 if (!ctx
->Extensions
.ARB_shadow
)
1409 *params
= sampObj
->CompareFunc
;
1411 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1412 *params
= (GLuint
) sampObj
->MaxAnisotropy
;
1414 case GL_TEXTURE_BORDER_COLOR
:
1415 params
[0] = sampObj
->BorderColor
.ui
[0];
1416 params
[1] = sampObj
->BorderColor
.ui
[1];
1417 params
[2] = sampObj
->BorderColor
.ui
[2];
1418 params
[3] = sampObj
->BorderColor
.ui
[3];
1420 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
1421 if (!ctx
->Extensions
.AMD_seamless_cubemap_per_texture
)
1423 *params
= sampObj
->CubeMapSeamless
;
1425 case GL_TEXTURE_SRGB_DECODE_EXT
:
1426 if (!ctx
->Extensions
.EXT_texture_sRGB_decode
)
1428 *params
= (GLenum
) sampObj
->sRGBDecode
;
1436 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetSamplerParameterIuiv(pname=%s)",
1437 _mesa_lookup_enum_by_nr(pname
));
1442 _mesa_init_sampler_object_functions(struct dd_function_table
*driver
)
1444 driver
->NewSamplerObject
= _mesa_new_sampler_object
;
1445 driver
->DeleteSamplerObject
= _mesa_delete_sampler_object
;