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 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
20 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 * \brief Functions for the GL_ARB_sampler_objects extension.
32 #include "main/glheader.h"
33 #include "main/context.h"
34 #include "main/dispatch.h"
35 #include "main/enums.h"
36 #include "main/hash.h"
37 #include "main/macros.h"
38 #include "main/mfeatures.h"
39 #include "main/mtypes.h"
40 #include "main/samplerobj.h"
43 static 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 ASSERT_OUTSIDE_BEGIN_END(ctx
);
171 if (MESA_VERBOSE
& VERBOSE_API
)
172 _mesa_debug(ctx
, "glGenSamplers(%d)\n", count
);
175 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGenSamplers");
182 first
= _mesa_HashFindFreeKeyBlock(ctx
->Shared
->SamplerObjects
, count
);
184 /* Insert the ID and pointer to new sampler object into hash table */
185 for (i
= 0; i
< count
; i
++) {
186 struct gl_sampler_object
*sampObj
=
187 ctx
->Driver
.NewSamplerObject(ctx
, first
+ i
);
188 _mesa_HashInsert(ctx
->Shared
->SamplerObjects
, first
+ i
, sampObj
);
189 samplers
[i
] = first
+ i
;
195 _mesa_DeleteSamplers(GLsizei count
, const GLuint
*samplers
)
197 GET_CURRENT_CONTEXT(ctx
);
200 ASSERT_OUTSIDE_BEGIN_END(ctx
);
201 FLUSH_VERTICES(ctx
, 0);
204 _mesa_error(ctx
, GL_INVALID_VALUE
, "glDeleteSamplers(count)");
208 _glthread_LOCK_MUTEX(ctx
->Shared
->Mutex
);
210 for (i
= 0; i
< count
; i
++) {
212 struct gl_sampler_object
*sampObj
=
213 _mesa_lookup_samplerobj(ctx
, samplers
[i
]);
215 /* The ID is immediately freed for re-use */
216 _mesa_HashRemove(ctx
->Shared
->SamplerObjects
, samplers
[i
]);
217 /* But the object exists until its reference count goes to zero */
218 _mesa_reference_sampler_object(ctx
, &sampObj
, NULL
);
223 _glthread_UNLOCK_MUTEX(ctx
->Shared
->Mutex
);
228 _mesa_IsSampler(GLuint sampler
)
230 struct gl_sampler_object
*sampObj
;
231 GET_CURRENT_CONTEXT(ctx
);
233 ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx
, GL_FALSE
);
238 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
240 return sampObj
!= NULL
;
245 _mesa_BindSampler(GLuint unit
, GLuint sampler
)
247 struct gl_sampler_object
*sampObj
;
248 GET_CURRENT_CONTEXT(ctx
);
250 if (unit
>= ctx
->Const
.MaxCombinedTextureImageUnits
) {
251 _mesa_error(ctx
, GL_INVALID_VALUE
, "glBindSampler(unit %u)", unit
);
256 /* Use the default sampler object, the one contained in the texture
262 /* user-defined sampler object */
263 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
265 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glBindSampler(sampler)");
270 if (ctx
->Texture
.Unit
[unit
].Sampler
!= sampObj
) {
271 FLUSH_VERTICES(ctx
, _NEW_TEXTURE
);
274 /* bind new sampler */
275 _mesa_reference_sampler_object(ctx
, &ctx
->Texture
.Unit
[unit
].Sampler
,
281 * Check if a coordinate wrap mode is legal.
282 * \return GL_TRUE if legal, GL_FALSE otherwise
285 validate_texture_wrap_mode(struct gl_context
*ctx
, GLenum wrap
)
287 const struct gl_extensions
* const e
= &ctx
->Extensions
;
291 case GL_CLAMP_TO_EDGE
:
293 case GL_MIRRORED_REPEAT
:
295 case GL_CLAMP_TO_BORDER
:
296 return e
->ARB_texture_border_clamp
;
297 case GL_MIRROR_CLAMP_EXT
:
298 return e
->ATI_texture_mirror_once
|| e
->EXT_texture_mirror_clamp
;
299 case GL_MIRROR_CLAMP_TO_EDGE_EXT
:
300 return e
->ATI_texture_mirror_once
|| e
->EXT_texture_mirror_clamp
;
301 case GL_MIRROR_CLAMP_TO_BORDER_EXT
:
302 return e
->EXT_texture_mirror_clamp
;
310 * This is called just prior to changing any sampler object state.
313 flush(struct gl_context
*ctx
)
315 FLUSH_VERTICES(ctx
, _NEW_TEXTURE
);
319 #define INVALID_PARAM 0x100
320 #define INVALID_PNAME 0x101
321 #define INVALID_VALUE 0x102
324 set_sampler_wrap_s(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
327 if (samp
->WrapS
== param
)
329 if (validate_texture_wrap_mode(ctx
, param
)) {
334 return INVALID_PARAM
;
339 set_sampler_wrap_t(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
342 if (samp
->WrapT
== param
)
344 if (validate_texture_wrap_mode(ctx
, param
)) {
349 return INVALID_PARAM
;
354 set_sampler_wrap_r(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
357 if (samp
->WrapR
== param
)
359 if (validate_texture_wrap_mode(ctx
, param
)) {
364 return INVALID_PARAM
;
369 set_sampler_min_filter(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
372 if (samp
->MinFilter
== param
)
378 case GL_NEAREST_MIPMAP_NEAREST
:
379 case GL_LINEAR_MIPMAP_NEAREST
:
380 case GL_NEAREST_MIPMAP_LINEAR
:
381 case GL_LINEAR_MIPMAP_LINEAR
:
383 samp
->MinFilter
= param
;
386 return INVALID_PARAM
;
392 set_sampler_mag_filter(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
395 if (samp
->MagFilter
== param
)
402 samp
->MagFilter
= param
;
405 return INVALID_PARAM
;
411 set_sampler_lod_bias(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
414 if (samp
->LodBias
== param
)
418 samp
->LodBias
= param
;
424 set_sampler_border_colorf(struct gl_context
*ctx
,
425 struct gl_sampler_object
*samp
,
426 const GLfloat params
[4])
429 samp
->BorderColor
.f
[RCOMP
] = params
[0];
430 samp
->BorderColor
.f
[GCOMP
] = params
[1];
431 samp
->BorderColor
.f
[BCOMP
] = params
[2];
432 samp
->BorderColor
.f
[ACOMP
] = params
[3];
438 set_sampler_border_colori(struct gl_context
*ctx
,
439 struct gl_sampler_object
*samp
,
440 const GLint params
[4])
443 samp
->BorderColor
.i
[RCOMP
] = params
[0];
444 samp
->BorderColor
.i
[GCOMP
] = params
[1];
445 samp
->BorderColor
.i
[BCOMP
] = params
[2];
446 samp
->BorderColor
.i
[ACOMP
] = params
[3];
452 set_sampler_border_colorui(struct gl_context
*ctx
,
453 struct gl_sampler_object
*samp
,
454 const GLuint params
[4])
457 samp
->BorderColor
.ui
[RCOMP
] = params
[0];
458 samp
->BorderColor
.ui
[GCOMP
] = params
[1];
459 samp
->BorderColor
.ui
[BCOMP
] = params
[2];
460 samp
->BorderColor
.ui
[ACOMP
] = params
[3];
466 set_sampler_min_lod(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
469 if (samp
->MinLod
== param
)
473 samp
->MinLod
= param
;
479 set_sampler_max_lod(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
482 if (samp
->MaxLod
== param
)
486 samp
->MaxLod
= param
;
492 set_sampler_compare_mode(struct gl_context
*ctx
,
493 struct gl_sampler_object
*samp
, GLint param
)
495 if (!ctx
->Extensions
.ARB_shadow
)
496 return INVALID_PNAME
;
498 if (samp
->CompareMode
== param
)
501 if (param
== GL_NONE
||
502 param
== GL_COMPARE_R_TO_TEXTURE_ARB
) {
504 samp
->CompareMode
= param
;
508 return INVALID_PARAM
;
513 set_sampler_compare_func(struct gl_context
*ctx
,
514 struct gl_sampler_object
*samp
, GLint param
)
516 if (!ctx
->Extensions
.ARB_shadow
)
517 return INVALID_PNAME
;
519 if (samp
->CompareFunc
== param
)
526 samp
->CompareFunc
= param
;
534 if (ctx
->Extensions
.EXT_shadow_funcs
) {
536 samp
->CompareFunc
= param
;
541 return INVALID_PARAM
;
547 set_sampler_max_anisotropy(struct gl_context
*ctx
,
548 struct gl_sampler_object
*samp
, GLfloat param
)
550 if (!ctx
->Extensions
.EXT_texture_filter_anisotropic
)
551 return INVALID_PNAME
;
553 if (samp
->MaxAnisotropy
== param
)
557 return INVALID_VALUE
;
560 /* clamp to max, that's what NVIDIA does */
561 samp
->MaxAnisotropy
= MIN2(param
, ctx
->Const
.MaxTextureMaxAnisotropy
);
567 set_sampler_cube_map_seamless(struct gl_context
*ctx
,
568 struct gl_sampler_object
*samp
, GLboolean param
)
570 if (!ctx
->Extensions
.AMD_seamless_cubemap_per_texture
)
571 return INVALID_PNAME
;
573 if (samp
->CubeMapSeamless
== param
)
576 if (param
!= GL_TRUE
&& param
!= GL_FALSE
)
577 return INVALID_VALUE
;
580 samp
->CubeMapSeamless
= param
;
585 set_sampler_srgb_decode(struct gl_context
*ctx
,
586 struct gl_sampler_object
*samp
, GLenum param
)
588 if (!ctx
->Extensions
.EXT_texture_sRGB_decode
)
589 return INVALID_PNAME
;
591 if (samp
->sRGBDecode
== param
)
594 if (param
!= GL_DECODE_EXT
&& param
!= GL_SKIP_DECODE_EXT
)
595 return INVALID_VALUE
;
598 samp
->sRGBDecode
= param
;
603 _mesa_SamplerParameteri(GLuint sampler
, GLenum pname
, GLint param
)
605 struct gl_sampler_object
*sampObj
;
607 GET_CURRENT_CONTEXT(ctx
);
609 ASSERT_OUTSIDE_BEGIN_END(ctx
);
611 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
613 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameteri(sampler %u)",
619 case GL_TEXTURE_WRAP_S
:
620 res
= set_sampler_wrap_s(ctx
, sampObj
, param
);
622 case GL_TEXTURE_WRAP_T
:
623 res
= set_sampler_wrap_t(ctx
, sampObj
, param
);
625 case GL_TEXTURE_WRAP_R
:
626 res
= set_sampler_wrap_r(ctx
, sampObj
, param
);
628 case GL_TEXTURE_MIN_FILTER
:
629 res
= set_sampler_min_filter(ctx
, sampObj
, param
);
631 case GL_TEXTURE_MAG_FILTER
:
632 res
= set_sampler_mag_filter(ctx
, sampObj
, param
);
634 case GL_TEXTURE_MIN_LOD
:
635 res
= set_sampler_min_lod(ctx
, sampObj
, (GLfloat
) param
);
637 case GL_TEXTURE_MAX_LOD
:
638 res
= set_sampler_max_lod(ctx
, sampObj
, (GLfloat
) param
);
640 case GL_TEXTURE_LOD_BIAS
:
641 res
= set_sampler_lod_bias(ctx
, sampObj
, (GLfloat
) param
);
643 case GL_TEXTURE_COMPARE_MODE
:
644 res
= set_sampler_compare_mode(ctx
, sampObj
, param
);
646 case GL_TEXTURE_COMPARE_FUNC
:
647 res
= set_sampler_compare_func(ctx
, sampObj
, param
);
649 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
650 res
= set_sampler_max_anisotropy(ctx
, sampObj
, (GLfloat
) param
);
652 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
653 res
= set_sampler_cube_map_seamless(ctx
, sampObj
, param
);
655 case GL_TEXTURE_SRGB_DECODE_EXT
:
656 res
= set_sampler_srgb_decode(ctx
, sampObj
, param
);
658 case GL_TEXTURE_BORDER_COLOR
:
669 /* state change - we do nothing special at this time */
672 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameteri(pname=%s)\n",
673 _mesa_lookup_enum_by_nr(pname
));
676 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameteri(param=%d)\n",
680 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameteri(param=%d)\n",
690 _mesa_SamplerParameterf(GLuint sampler
, GLenum pname
, GLfloat param
)
692 struct gl_sampler_object
*sampObj
;
694 GET_CURRENT_CONTEXT(ctx
);
696 ASSERT_OUTSIDE_BEGIN_END(ctx
);
698 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
700 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterf(sampler %u)",
706 case GL_TEXTURE_WRAP_S
:
707 res
= set_sampler_wrap_s(ctx
, sampObj
, (GLint
) param
);
709 case GL_TEXTURE_WRAP_T
:
710 res
= set_sampler_wrap_t(ctx
, sampObj
, (GLint
) param
);
712 case GL_TEXTURE_WRAP_R
:
713 res
= set_sampler_wrap_r(ctx
, sampObj
, (GLint
) param
);
715 case GL_TEXTURE_MIN_FILTER
:
716 res
= set_sampler_min_filter(ctx
, sampObj
, (GLint
) param
);
718 case GL_TEXTURE_MAG_FILTER
:
719 res
= set_sampler_mag_filter(ctx
, sampObj
, (GLint
) param
);
721 case GL_TEXTURE_MIN_LOD
:
722 res
= set_sampler_min_lod(ctx
, sampObj
, param
);
724 case GL_TEXTURE_MAX_LOD
:
725 res
= set_sampler_max_lod(ctx
, sampObj
, param
);
727 case GL_TEXTURE_LOD_BIAS
:
728 res
= set_sampler_lod_bias(ctx
, sampObj
, param
);
730 case GL_TEXTURE_COMPARE_MODE
:
731 res
= set_sampler_compare_mode(ctx
, sampObj
, (GLint
) param
);
733 case GL_TEXTURE_COMPARE_FUNC
:
734 res
= set_sampler_compare_func(ctx
, sampObj
, (GLint
) param
);
736 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
737 res
= set_sampler_max_anisotropy(ctx
, sampObj
, param
);
739 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
740 res
= set_sampler_cube_map_seamless(ctx
, sampObj
, (GLboolean
) param
);
742 case GL_TEXTURE_SRGB_DECODE_EXT
:
743 res
= set_sampler_srgb_decode(ctx
, sampObj
, (GLenum
) param
);
745 case GL_TEXTURE_BORDER_COLOR
:
756 /* state change - we do nothing special at this time */
759 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterf(pname=%s)\n",
760 _mesa_lookup_enum_by_nr(pname
));
763 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterf(param=%f)\n",
767 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterf(param=%f)\n",
776 _mesa_SamplerParameteriv(GLuint sampler
, GLenum pname
, const GLint
*params
)
778 struct gl_sampler_object
*sampObj
;
780 GET_CURRENT_CONTEXT(ctx
);
782 ASSERT_OUTSIDE_BEGIN_END(ctx
);
784 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
786 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameteriv(sampler %u)",
792 case GL_TEXTURE_WRAP_S
:
793 res
= set_sampler_wrap_s(ctx
, sampObj
, params
[0]);
795 case GL_TEXTURE_WRAP_T
:
796 res
= set_sampler_wrap_t(ctx
, sampObj
, params
[0]);
798 case GL_TEXTURE_WRAP_R
:
799 res
= set_sampler_wrap_r(ctx
, sampObj
, params
[0]);
801 case GL_TEXTURE_MIN_FILTER
:
802 res
= set_sampler_min_filter(ctx
, sampObj
, params
[0]);
804 case GL_TEXTURE_MAG_FILTER
:
805 res
= set_sampler_mag_filter(ctx
, sampObj
, params
[0]);
807 case GL_TEXTURE_MIN_LOD
:
808 res
= set_sampler_min_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
810 case GL_TEXTURE_MAX_LOD
:
811 res
= set_sampler_max_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
813 case GL_TEXTURE_LOD_BIAS
:
814 res
= set_sampler_lod_bias(ctx
, sampObj
, (GLfloat
) params
[0]);
816 case GL_TEXTURE_COMPARE_MODE
:
817 res
= set_sampler_compare_mode(ctx
, sampObj
, params
[0]);
819 case GL_TEXTURE_COMPARE_FUNC
:
820 res
= set_sampler_compare_func(ctx
, sampObj
, params
[0]);
822 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
823 res
= set_sampler_max_anisotropy(ctx
, sampObj
, (GLfloat
) params
[0]);
825 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
826 res
= set_sampler_cube_map_seamless(ctx
, sampObj
, params
[0]);
828 case GL_TEXTURE_SRGB_DECODE_EXT
:
829 res
= set_sampler_srgb_decode(ctx
, sampObj
, params
[0]);
831 case GL_TEXTURE_BORDER_COLOR
:
834 c
[0] = INT_TO_FLOAT(params
[0]);
835 c
[1] = INT_TO_FLOAT(params
[1]);
836 c
[2] = INT_TO_FLOAT(params
[2]);
837 c
[3] = INT_TO_FLOAT(params
[3]);
838 res
= set_sampler_border_colorf(ctx
, sampObj
, c
);
850 /* state change - we do nothing special at this time */
853 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameteriv(pname=%s)\n",
854 _mesa_lookup_enum_by_nr(pname
));
857 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameteriv(param=%d)\n",
861 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameteriv(param=%d)\n",
870 _mesa_SamplerParameterfv(GLuint sampler
, GLenum pname
, const GLfloat
*params
)
872 struct gl_sampler_object
*sampObj
;
874 GET_CURRENT_CONTEXT(ctx
);
876 ASSERT_OUTSIDE_BEGIN_END(ctx
);
878 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
880 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterfv(sampler %u)",
886 case GL_TEXTURE_WRAP_S
:
887 res
= set_sampler_wrap_s(ctx
, sampObj
, (GLint
) params
[0]);
889 case GL_TEXTURE_WRAP_T
:
890 res
= set_sampler_wrap_t(ctx
, sampObj
, (GLint
) params
[0]);
892 case GL_TEXTURE_WRAP_R
:
893 res
= set_sampler_wrap_r(ctx
, sampObj
, (GLint
) params
[0]);
895 case GL_TEXTURE_MIN_FILTER
:
896 res
= set_sampler_min_filter(ctx
, sampObj
, (GLint
) params
[0]);
898 case GL_TEXTURE_MAG_FILTER
:
899 res
= set_sampler_mag_filter(ctx
, sampObj
, (GLint
) params
[0]);
901 case GL_TEXTURE_MIN_LOD
:
902 res
= set_sampler_min_lod(ctx
, sampObj
, params
[0]);
904 case GL_TEXTURE_MAX_LOD
:
905 res
= set_sampler_max_lod(ctx
, sampObj
, params
[0]);
907 case GL_TEXTURE_LOD_BIAS
:
908 res
= set_sampler_lod_bias(ctx
, sampObj
, params
[0]);
910 case GL_TEXTURE_COMPARE_MODE
:
911 res
= set_sampler_compare_mode(ctx
, sampObj
, (GLint
) params
[0]);
913 case GL_TEXTURE_COMPARE_FUNC
:
914 res
= set_sampler_compare_func(ctx
, sampObj
, (GLint
) params
[0]);
916 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
917 res
= set_sampler_max_anisotropy(ctx
, sampObj
, params
[0]);
919 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
920 res
= set_sampler_cube_map_seamless(ctx
, sampObj
, (GLboolean
) params
[0]);
922 case GL_TEXTURE_SRGB_DECODE_EXT
:
923 res
= set_sampler_srgb_decode(ctx
, sampObj
, (GLenum
) params
[0]);
925 case GL_TEXTURE_BORDER_COLOR
:
926 res
= set_sampler_border_colorf(ctx
, sampObj
, params
);
937 /* state change - we do nothing special at this time */
940 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterfv(pname=%s)\n",
941 _mesa_lookup_enum_by_nr(pname
));
944 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterfv(param=%f)\n",
948 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterfv(param=%f)\n",
957 _mesa_SamplerParameterIiv(GLuint sampler
, GLenum pname
, const GLint
*params
)
959 struct gl_sampler_object
*sampObj
;
961 GET_CURRENT_CONTEXT(ctx
);
963 ASSERT_OUTSIDE_BEGIN_END(ctx
);
965 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
967 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterIiv(sampler %u)",
973 case GL_TEXTURE_WRAP_S
:
974 res
= set_sampler_wrap_s(ctx
, sampObj
, params
[0]);
976 case GL_TEXTURE_WRAP_T
:
977 res
= set_sampler_wrap_t(ctx
, sampObj
, params
[0]);
979 case GL_TEXTURE_WRAP_R
:
980 res
= set_sampler_wrap_r(ctx
, sampObj
, params
[0]);
982 case GL_TEXTURE_MIN_FILTER
:
983 res
= set_sampler_min_filter(ctx
, sampObj
, params
[0]);
985 case GL_TEXTURE_MAG_FILTER
:
986 res
= set_sampler_mag_filter(ctx
, sampObj
, params
[0]);
988 case GL_TEXTURE_MIN_LOD
:
989 res
= set_sampler_min_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
991 case GL_TEXTURE_MAX_LOD
:
992 res
= set_sampler_max_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
994 case GL_TEXTURE_LOD_BIAS
:
995 res
= set_sampler_lod_bias(ctx
, sampObj
, (GLfloat
) params
[0]);
997 case GL_TEXTURE_COMPARE_MODE
:
998 res
= set_sampler_compare_mode(ctx
, sampObj
, params
[0]);
1000 case GL_TEXTURE_COMPARE_FUNC
:
1001 res
= set_sampler_compare_func(ctx
, sampObj
, params
[0]);
1003 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1004 res
= set_sampler_max_anisotropy(ctx
, sampObj
, (GLfloat
) params
[0]);
1006 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
1007 res
= set_sampler_cube_map_seamless(ctx
, sampObj
, params
[0]);
1009 case GL_TEXTURE_SRGB_DECODE_EXT
:
1010 res
= set_sampler_srgb_decode(ctx
, sampObj
, (GLenum
) params
[0]);
1012 case GL_TEXTURE_BORDER_COLOR
:
1013 res
= set_sampler_border_colori(ctx
, sampObj
, params
);
1016 res
= INVALID_PNAME
;
1024 /* state change - we do nothing special at this time */
1027 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterIiv(pname=%s)\n",
1028 _mesa_lookup_enum_by_nr(pname
));
1031 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterIiv(param=%d)\n",
1035 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterIiv(param=%d)\n",
1045 _mesa_SamplerParameterIuiv(GLuint sampler
, GLenum pname
, const GLuint
*params
)
1047 struct gl_sampler_object
*sampObj
;
1049 GET_CURRENT_CONTEXT(ctx
);
1051 ASSERT_OUTSIDE_BEGIN_END(ctx
);
1053 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
1055 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterIuiv(sampler %u)",
1061 case GL_TEXTURE_WRAP_S
:
1062 res
= set_sampler_wrap_s(ctx
, sampObj
, params
[0]);
1064 case GL_TEXTURE_WRAP_T
:
1065 res
= set_sampler_wrap_t(ctx
, sampObj
, params
[0]);
1067 case GL_TEXTURE_WRAP_R
:
1068 res
= set_sampler_wrap_r(ctx
, sampObj
, params
[0]);
1070 case GL_TEXTURE_MIN_FILTER
:
1071 res
= set_sampler_min_filter(ctx
, sampObj
, params
[0]);
1073 case GL_TEXTURE_MAG_FILTER
:
1074 res
= set_sampler_mag_filter(ctx
, sampObj
, params
[0]);
1076 case GL_TEXTURE_MIN_LOD
:
1077 res
= set_sampler_min_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
1079 case GL_TEXTURE_MAX_LOD
:
1080 res
= set_sampler_max_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
1082 case GL_TEXTURE_LOD_BIAS
:
1083 res
= set_sampler_lod_bias(ctx
, sampObj
, (GLfloat
) params
[0]);
1085 case GL_TEXTURE_COMPARE_MODE
:
1086 res
= set_sampler_compare_mode(ctx
, sampObj
, params
[0]);
1088 case GL_TEXTURE_COMPARE_FUNC
:
1089 res
= set_sampler_compare_func(ctx
, sampObj
, params
[0]);
1091 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1092 res
= set_sampler_max_anisotropy(ctx
, sampObj
, (GLfloat
) params
[0]);
1094 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
1095 res
= set_sampler_cube_map_seamless(ctx
, sampObj
, params
[0]);
1097 case GL_TEXTURE_SRGB_DECODE_EXT
:
1098 res
= set_sampler_srgb_decode(ctx
, sampObj
, (GLenum
) params
[0]);
1100 case GL_TEXTURE_BORDER_COLOR
:
1101 res
= set_sampler_border_colorui(ctx
, sampObj
, params
);
1104 res
= INVALID_PNAME
;
1112 /* state change - we do nothing special at this time */
1115 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterIuiv(pname=%s)\n",
1116 _mesa_lookup_enum_by_nr(pname
));
1119 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterIuiv(param=%u)\n",
1123 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterIuiv(param=%u)\n",
1133 _mesa_GetSamplerParameteriv(GLuint sampler
, GLenum pname
, GLint
*params
)
1135 struct gl_sampler_object
*sampObj
;
1136 GET_CURRENT_CONTEXT(ctx
);
1138 ASSERT_OUTSIDE_BEGIN_END(ctx
);
1140 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
1142 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetSamplerParameteriv(sampler %u)",
1148 case GL_TEXTURE_WRAP_S
:
1149 *params
= sampObj
->WrapS
;
1151 case GL_TEXTURE_WRAP_T
:
1152 *params
= sampObj
->WrapT
;
1154 case GL_TEXTURE_WRAP_R
:
1155 *params
= sampObj
->WrapR
;
1157 case GL_TEXTURE_MIN_FILTER
:
1158 *params
= sampObj
->MinFilter
;
1160 case GL_TEXTURE_MAG_FILTER
:
1161 *params
= sampObj
->MagFilter
;
1163 case GL_TEXTURE_MIN_LOD
:
1164 *params
= (GLint
) sampObj
->MinLod
;
1166 case GL_TEXTURE_MAX_LOD
:
1167 *params
= (GLint
) sampObj
->MaxLod
;
1169 case GL_TEXTURE_LOD_BIAS
:
1170 *params
= (GLint
) sampObj
->LodBias
;
1172 case GL_TEXTURE_COMPARE_MODE
:
1173 if (!ctx
->Extensions
.ARB_shadow
)
1175 *params
= sampObj
->CompareMode
;
1177 case GL_TEXTURE_COMPARE_FUNC
:
1178 if (!ctx
->Extensions
.ARB_shadow
)
1180 *params
= sampObj
->CompareFunc
;
1182 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1183 *params
= (GLint
) sampObj
->MaxAnisotropy
;
1185 case GL_TEXTURE_BORDER_COLOR
:
1186 params
[0] = FLOAT_TO_INT(sampObj
->BorderColor
.f
[0]);
1187 params
[1] = FLOAT_TO_INT(sampObj
->BorderColor
.f
[1]);
1188 params
[2] = FLOAT_TO_INT(sampObj
->BorderColor
.f
[2]);
1189 params
[3] = FLOAT_TO_INT(sampObj
->BorderColor
.f
[3]);
1191 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
1192 if (!ctx
->Extensions
.AMD_seamless_cubemap_per_texture
)
1194 *params
= sampObj
->CubeMapSeamless
;
1196 case GL_TEXTURE_SRGB_DECODE_EXT
:
1197 if (!ctx
->Extensions
.EXT_texture_sRGB_decode
)
1199 *params
= (GLenum
) sampObj
->sRGBDecode
;
1207 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetSamplerParameteriv(pname=%s)",
1208 _mesa_lookup_enum_by_nr(pname
));
1213 _mesa_GetSamplerParameterfv(GLuint sampler
, GLenum pname
, GLfloat
*params
)
1215 struct gl_sampler_object
*sampObj
;
1216 GET_CURRENT_CONTEXT(ctx
);
1218 ASSERT_OUTSIDE_BEGIN_END(ctx
);
1220 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
1222 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetSamplerParameterfv(sampler %u)",
1228 case GL_TEXTURE_WRAP_S
:
1229 *params
= (GLfloat
) sampObj
->WrapS
;
1231 case GL_TEXTURE_WRAP_T
:
1232 *params
= (GLfloat
) sampObj
->WrapT
;
1234 case GL_TEXTURE_WRAP_R
:
1235 *params
= (GLfloat
) sampObj
->WrapR
;
1237 case GL_TEXTURE_MIN_FILTER
:
1238 *params
= (GLfloat
) sampObj
->MinFilter
;
1240 case GL_TEXTURE_MAG_FILTER
:
1241 *params
= (GLfloat
) sampObj
->MagFilter
;
1243 case GL_TEXTURE_MIN_LOD
:
1244 *params
= sampObj
->MinLod
;
1246 case GL_TEXTURE_MAX_LOD
:
1247 *params
= sampObj
->MaxLod
;
1249 case GL_TEXTURE_LOD_BIAS
:
1250 *params
= sampObj
->LodBias
;
1252 case GL_TEXTURE_COMPARE_MODE
:
1253 if (!ctx
->Extensions
.ARB_shadow
)
1255 *params
= (GLfloat
) sampObj
->CompareMode
;
1257 case GL_TEXTURE_COMPARE_FUNC
:
1258 if (!ctx
->Extensions
.ARB_shadow
)
1260 *params
= (GLfloat
) sampObj
->CompareFunc
;
1262 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1263 *params
= sampObj
->MaxAnisotropy
;
1265 case GL_TEXTURE_BORDER_COLOR
:
1266 params
[0] = sampObj
->BorderColor
.f
[0];
1267 params
[1] = sampObj
->BorderColor
.f
[1];
1268 params
[2] = sampObj
->BorderColor
.f
[2];
1269 params
[3] = sampObj
->BorderColor
.f
[3];
1271 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
1272 if (!ctx
->Extensions
.AMD_seamless_cubemap_per_texture
)
1274 *params
= (GLfloat
) sampObj
->CubeMapSeamless
;
1276 case GL_TEXTURE_SRGB_DECODE_EXT
:
1277 if (!ctx
->Extensions
.EXT_texture_sRGB_decode
)
1279 *params
= (GLfloat
) sampObj
->sRGBDecode
;
1287 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetSamplerParameterfv(pname=%s)",
1288 _mesa_lookup_enum_by_nr(pname
));
1293 _mesa_GetSamplerParameterIiv(GLuint sampler
, GLenum pname
, GLint
*params
)
1295 struct gl_sampler_object
*sampObj
;
1296 GET_CURRENT_CONTEXT(ctx
);
1298 ASSERT_OUTSIDE_BEGIN_END(ctx
);
1300 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
1302 _mesa_error(ctx
, GL_INVALID_VALUE
,
1303 "glGetSamplerParameterIiv(sampler %u)",
1309 case GL_TEXTURE_WRAP_S
:
1310 *params
= sampObj
->WrapS
;
1312 case GL_TEXTURE_WRAP_T
:
1313 *params
= sampObj
->WrapT
;
1315 case GL_TEXTURE_WRAP_R
:
1316 *params
= sampObj
->WrapR
;
1318 case GL_TEXTURE_MIN_FILTER
:
1319 *params
= sampObj
->MinFilter
;
1321 case GL_TEXTURE_MAG_FILTER
:
1322 *params
= sampObj
->MagFilter
;
1324 case GL_TEXTURE_MIN_LOD
:
1325 *params
= (GLint
) sampObj
->MinLod
;
1327 case GL_TEXTURE_MAX_LOD
:
1328 *params
= (GLint
) sampObj
->MaxLod
;
1330 case GL_TEXTURE_LOD_BIAS
:
1331 *params
= (GLint
) sampObj
->LodBias
;
1333 case GL_TEXTURE_COMPARE_MODE
:
1334 if (!ctx
->Extensions
.ARB_shadow
)
1336 *params
= sampObj
->CompareMode
;
1338 case GL_TEXTURE_COMPARE_FUNC
:
1339 if (!ctx
->Extensions
.ARB_shadow
)
1341 *params
= sampObj
->CompareFunc
;
1343 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1344 *params
= (GLint
) sampObj
->MaxAnisotropy
;
1346 case GL_TEXTURE_BORDER_COLOR
:
1347 params
[0] = sampObj
->BorderColor
.i
[0];
1348 params
[1] = sampObj
->BorderColor
.i
[1];
1349 params
[2] = sampObj
->BorderColor
.i
[2];
1350 params
[3] = sampObj
->BorderColor
.i
[3];
1352 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
1353 if (!ctx
->Extensions
.AMD_seamless_cubemap_per_texture
)
1355 *params
= sampObj
->CubeMapSeamless
;
1357 case GL_TEXTURE_SRGB_DECODE_EXT
:
1358 if (!ctx
->Extensions
.EXT_texture_sRGB_decode
)
1360 *params
= (GLenum
) sampObj
->sRGBDecode
;
1368 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetSamplerParameterIiv(pname=%s)",
1369 _mesa_lookup_enum_by_nr(pname
));
1374 _mesa_GetSamplerParameterIuiv(GLuint sampler
, GLenum pname
, GLuint
*params
)
1376 struct gl_sampler_object
*sampObj
;
1377 GET_CURRENT_CONTEXT(ctx
);
1379 ASSERT_OUTSIDE_BEGIN_END(ctx
);
1381 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
1383 _mesa_error(ctx
, GL_INVALID_VALUE
,
1384 "glGetSamplerParameterIuiv(sampler %u)",
1390 case GL_TEXTURE_WRAP_S
:
1391 *params
= sampObj
->WrapS
;
1393 case GL_TEXTURE_WRAP_T
:
1394 *params
= sampObj
->WrapT
;
1396 case GL_TEXTURE_WRAP_R
:
1397 *params
= sampObj
->WrapR
;
1399 case GL_TEXTURE_MIN_FILTER
:
1400 *params
= sampObj
->MinFilter
;
1402 case GL_TEXTURE_MAG_FILTER
:
1403 *params
= sampObj
->MagFilter
;
1405 case GL_TEXTURE_MIN_LOD
:
1406 *params
= (GLuint
) sampObj
->MinLod
;
1408 case GL_TEXTURE_MAX_LOD
:
1409 *params
= (GLuint
) sampObj
->MaxLod
;
1411 case GL_TEXTURE_LOD_BIAS
:
1412 *params
= (GLuint
) sampObj
->LodBias
;
1414 case GL_TEXTURE_COMPARE_MODE
:
1415 if (!ctx
->Extensions
.ARB_shadow
)
1417 *params
= sampObj
->CompareMode
;
1419 case GL_TEXTURE_COMPARE_FUNC
:
1420 if (!ctx
->Extensions
.ARB_shadow
)
1422 *params
= sampObj
->CompareFunc
;
1424 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1425 *params
= (GLuint
) sampObj
->MaxAnisotropy
;
1427 case GL_TEXTURE_BORDER_COLOR
:
1428 params
[0] = sampObj
->BorderColor
.ui
[0];
1429 params
[1] = sampObj
->BorderColor
.ui
[1];
1430 params
[2] = sampObj
->BorderColor
.ui
[2];
1431 params
[3] = sampObj
->BorderColor
.ui
[3];
1433 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
1434 if (!ctx
->Extensions
.AMD_seamless_cubemap_per_texture
)
1436 *params
= sampObj
->CubeMapSeamless
;
1438 case GL_TEXTURE_SRGB_DECODE_EXT
:
1439 if (!ctx
->Extensions
.EXT_texture_sRGB_decode
)
1441 *params
= (GLenum
) sampObj
->sRGBDecode
;
1449 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetSamplerParameterIuiv(pname=%s)",
1450 _mesa_lookup_enum_by_nr(pname
));
1455 _mesa_init_sampler_object_functions(struct dd_function_table
*driver
)
1457 driver
->NewSamplerObject
= _mesa_new_sampler_object
;
1458 driver
->DeleteSamplerObject
= _mesa_delete_sampler_object
;
1463 _mesa_init_sampler_object_dispatch(const struct gl_context
*ctx
,
1464 struct _glapi_table
*disp
)
1466 SET_GenSamplers(disp
, _mesa_GenSamplers
);
1467 SET_DeleteSamplers(disp
, _mesa_DeleteSamplers
);
1468 SET_IsSampler(disp
, _mesa_IsSampler
);
1469 SET_BindSampler(disp
, _mesa_BindSampler
);
1470 SET_SamplerParameteri(disp
, _mesa_SamplerParameteri
);
1471 SET_SamplerParameterf(disp
, _mesa_SamplerParameterf
);
1472 SET_SamplerParameteriv(disp
, _mesa_SamplerParameteriv
);
1473 SET_SamplerParameterfv(disp
, _mesa_SamplerParameterfv
);
1474 SET_GetSamplerParameteriv(disp
, _mesa_GetSamplerParameteriv
);
1475 SET_GetSamplerParameterfv(disp
, _mesa_GetSamplerParameterfv
);
1477 if (_mesa_is_desktop_gl(ctx
)) {
1478 SET_SamplerParameterIiv(disp
, _mesa_SamplerParameterIiv
);
1479 SET_SamplerParameterIuiv(disp
, _mesa_SamplerParameterIuiv
);
1480 SET_GetSamplerParameterIiv(disp
, _mesa_GetSamplerParameterIiv
);
1481 SET_GetSamplerParameterIuiv(disp
, _mesa_GetSamplerParameterIuiv
);