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
->CompareFailValue
= 0.0;
134 sampObj
->sRGBDecode
= GL_DECODE_EXT
;
135 sampObj
->CubeMapSeamless
= GL_FALSE
;
139 * Fallback for ctx->Driver.NewSamplerObject();
141 struct gl_sampler_object
*
142 _mesa_new_sampler_object(struct gl_context
*ctx
, GLuint name
)
144 struct gl_sampler_object
*sampObj
= CALLOC_STRUCT(gl_sampler_object
);
146 _mesa_init_sampler_object(sampObj
, name
);
153 * Fallback for ctx->Driver.DeleteSamplerObject();
156 _mesa_delete_sampler_object(struct gl_context
*ctx
,
157 struct gl_sampler_object
*sampObj
)
164 _mesa_GenSamplers(GLsizei count
, GLuint
*samplers
)
166 GET_CURRENT_CONTEXT(ctx
);
170 ASSERT_OUTSIDE_BEGIN_END(ctx
);
172 if (MESA_VERBOSE
& VERBOSE_API
)
173 _mesa_debug(ctx
, "glGenSamplers(%d)\n", count
);
176 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGenSamplers");
183 first
= _mesa_HashFindFreeKeyBlock(ctx
->Shared
->SamplerObjects
, count
);
185 /* Insert the ID and pointer to new sampler object into hash table */
186 for (i
= 0; i
< count
; i
++) {
187 struct gl_sampler_object
*sampObj
=
188 ctx
->Driver
.NewSamplerObject(ctx
, first
+ i
);
189 _mesa_HashInsert(ctx
->Shared
->SamplerObjects
, first
+ i
, sampObj
);
190 samplers
[i
] = first
+ i
;
196 _mesa_DeleteSamplers(GLsizei count
, const GLuint
*samplers
)
198 GET_CURRENT_CONTEXT(ctx
);
201 ASSERT_OUTSIDE_BEGIN_END(ctx
);
202 FLUSH_VERTICES(ctx
, 0);
205 _mesa_error(ctx
, GL_INVALID_VALUE
, "glDeleteSamplers(count)");
209 _glthread_LOCK_MUTEX(ctx
->Shared
->Mutex
);
211 for (i
= 0; i
< count
; i
++) {
213 struct gl_sampler_object
*sampObj
=
214 _mesa_lookup_samplerobj(ctx
, samplers
[i
]);
216 /* The ID is immediately freed for re-use */
217 _mesa_HashRemove(ctx
->Shared
->SamplerObjects
, samplers
[i
]);
218 /* But the object exists until its reference count goes to zero */
219 _mesa_reference_sampler_object(ctx
, &sampObj
, NULL
);
224 _glthread_UNLOCK_MUTEX(ctx
->Shared
->Mutex
);
228 static GLboolean GLAPIENTRY
229 _mesa_IsSampler(GLuint sampler
)
231 struct gl_sampler_object
*sampObj
;
232 GET_CURRENT_CONTEXT(ctx
);
234 ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx
, GL_FALSE
);
239 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
241 return sampObj
!= NULL
;
246 _mesa_BindSampler(GLuint unit
, GLuint sampler
)
248 struct gl_sampler_object
*sampObj
;
249 GET_CURRENT_CONTEXT(ctx
);
251 if (unit
>= ctx
->Const
.MaxCombinedTextureImageUnits
) {
252 _mesa_error(ctx
, GL_INVALID_VALUE
, "glBindSampler(unit %u)", unit
);
257 /* Use the default sampler object, the one contained in the texture
263 /* user-defined sampler object */
264 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
266 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glBindSampler(sampler)");
271 if (ctx
->Texture
.Unit
[unit
].Sampler
!= sampObj
) {
272 FLUSH_VERTICES(ctx
, _NEW_TEXTURE
);
275 /* bind new sampler */
276 _mesa_reference_sampler_object(ctx
, &ctx
->Texture
.Unit
[unit
].Sampler
,
282 * Check if a coordinate wrap mode is legal.
283 * \return GL_TRUE if legal, GL_FALSE otherwise
286 validate_texture_wrap_mode(struct gl_context
*ctx
, GLenum wrap
)
288 const struct gl_extensions
* const e
= &ctx
->Extensions
;
292 case GL_CLAMP_TO_EDGE
:
294 case GL_MIRRORED_REPEAT
:
296 case GL_CLAMP_TO_BORDER
:
297 return e
->ARB_texture_border_clamp
;
298 case GL_MIRROR_CLAMP_EXT
:
299 return e
->ATI_texture_mirror_once
|| e
->EXT_texture_mirror_clamp
;
300 case GL_MIRROR_CLAMP_TO_EDGE_EXT
:
301 return e
->ATI_texture_mirror_once
|| e
->EXT_texture_mirror_clamp
;
302 case GL_MIRROR_CLAMP_TO_BORDER_EXT
:
303 return e
->EXT_texture_mirror_clamp
;
311 * This is called just prior to changing any sampler object state.
314 flush(struct gl_context
*ctx
)
316 FLUSH_VERTICES(ctx
, _NEW_TEXTURE
);
320 #define INVALID_PARAM 0x100
321 #define INVALID_PNAME 0x101
322 #define INVALID_VALUE 0x102
325 set_sampler_wrap_s(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
328 if (samp
->WrapS
== param
)
330 if (validate_texture_wrap_mode(ctx
, param
)) {
335 return INVALID_PARAM
;
340 set_sampler_wrap_t(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
343 if (samp
->WrapT
== param
)
345 if (validate_texture_wrap_mode(ctx
, param
)) {
350 return INVALID_PARAM
;
355 set_sampler_wrap_r(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
358 if (samp
->WrapR
== param
)
360 if (validate_texture_wrap_mode(ctx
, param
)) {
365 return INVALID_PARAM
;
370 set_sampler_min_filter(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
373 if (samp
->MinFilter
== param
)
379 case GL_NEAREST_MIPMAP_NEAREST
:
380 case GL_LINEAR_MIPMAP_NEAREST
:
381 case GL_NEAREST_MIPMAP_LINEAR
:
382 case GL_LINEAR_MIPMAP_LINEAR
:
384 samp
->MinFilter
= param
;
387 return INVALID_PARAM
;
393 set_sampler_mag_filter(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
396 if (samp
->MagFilter
== param
)
403 samp
->MagFilter
= param
;
406 return INVALID_PARAM
;
412 set_sampler_lod_bias(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
415 if (samp
->LodBias
== param
)
419 samp
->LodBias
= param
;
425 set_sampler_border_colorf(struct gl_context
*ctx
,
426 struct gl_sampler_object
*samp
,
427 const GLfloat params
[4])
430 samp
->BorderColor
.f
[RCOMP
] = params
[0];
431 samp
->BorderColor
.f
[GCOMP
] = params
[1];
432 samp
->BorderColor
.f
[BCOMP
] = params
[2];
433 samp
->BorderColor
.f
[ACOMP
] = params
[3];
439 set_sampler_border_colori(struct gl_context
*ctx
,
440 struct gl_sampler_object
*samp
,
441 const GLint params
[4])
444 samp
->BorderColor
.i
[RCOMP
] = params
[0];
445 samp
->BorderColor
.i
[GCOMP
] = params
[1];
446 samp
->BorderColor
.i
[BCOMP
] = params
[2];
447 samp
->BorderColor
.i
[ACOMP
] = params
[3];
453 set_sampler_border_colorui(struct gl_context
*ctx
,
454 struct gl_sampler_object
*samp
,
455 const GLuint params
[4])
458 samp
->BorderColor
.ui
[RCOMP
] = params
[0];
459 samp
->BorderColor
.ui
[GCOMP
] = params
[1];
460 samp
->BorderColor
.ui
[BCOMP
] = params
[2];
461 samp
->BorderColor
.ui
[ACOMP
] = params
[3];
467 set_sampler_min_lod(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
470 if (samp
->MinLod
== param
)
474 samp
->MinLod
= param
;
480 set_sampler_max_lod(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
483 if (samp
->MaxLod
== param
)
487 samp
->MaxLod
= param
;
493 set_sampler_compare_mode(struct gl_context
*ctx
,
494 struct gl_sampler_object
*samp
, GLint param
)
496 if (!ctx
->Extensions
.ARB_shadow
)
497 return INVALID_PNAME
;
499 if (samp
->CompareMode
== param
)
502 if (param
== GL_NONE
||
503 param
== GL_COMPARE_R_TO_TEXTURE_ARB
) {
505 samp
->CompareMode
= param
;
509 return INVALID_PARAM
;
514 set_sampler_compare_func(struct gl_context
*ctx
,
515 struct gl_sampler_object
*samp
, GLint param
)
517 if (!ctx
->Extensions
.ARB_shadow
)
518 return INVALID_PNAME
;
520 if (samp
->CompareFunc
== param
)
527 samp
->CompareFunc
= param
;
535 if (ctx
->Extensions
.EXT_shadow_funcs
) {
537 samp
->CompareFunc
= param
;
542 return INVALID_PARAM
;
548 set_sampler_max_anisotropy(struct gl_context
*ctx
,
549 struct gl_sampler_object
*samp
, GLfloat param
)
551 if (!ctx
->Extensions
.EXT_texture_filter_anisotropic
)
552 return INVALID_PNAME
;
554 if (samp
->MaxAnisotropy
== param
)
558 return INVALID_VALUE
;
561 /* clamp to max, that's what NVIDIA does */
562 samp
->MaxAnisotropy
= MIN2(param
, ctx
->Const
.MaxTextureMaxAnisotropy
);
568 set_sampler_cube_map_seamless(struct gl_context
*ctx
,
569 struct gl_sampler_object
*samp
, GLboolean param
)
571 if (!ctx
->Extensions
.AMD_seamless_cubemap_per_texture
)
572 return INVALID_PNAME
;
574 if (samp
->CubeMapSeamless
== param
)
577 if (param
!= GL_TRUE
&& param
!= GL_FALSE
)
578 return INVALID_VALUE
;
581 samp
->CubeMapSeamless
= param
;
586 set_sampler_srgb_decode(struct gl_context
*ctx
,
587 struct gl_sampler_object
*samp
, GLenum param
)
589 if (!ctx
->Extensions
.EXT_texture_sRGB_decode
)
590 return INVALID_PNAME
;
592 if (samp
->sRGBDecode
== param
)
595 if (param
!= GL_DECODE_EXT
&& param
!= GL_SKIP_DECODE_EXT
)
596 return INVALID_VALUE
;
599 samp
->sRGBDecode
= param
;
604 _mesa_SamplerParameteri(GLuint sampler
, GLenum pname
, GLint param
)
606 struct gl_sampler_object
*sampObj
;
608 GET_CURRENT_CONTEXT(ctx
);
610 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
612 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameteri(sampler %u)",
618 case GL_TEXTURE_WRAP_S
:
619 res
= set_sampler_wrap_s(ctx
, sampObj
, param
);
621 case GL_TEXTURE_WRAP_T
:
622 res
= set_sampler_wrap_t(ctx
, sampObj
, param
);
624 case GL_TEXTURE_WRAP_R
:
625 res
= set_sampler_wrap_r(ctx
, sampObj
, param
);
627 case GL_TEXTURE_MIN_FILTER
:
628 res
= set_sampler_min_filter(ctx
, sampObj
, param
);
630 case GL_TEXTURE_MAG_FILTER
:
631 res
= set_sampler_mag_filter(ctx
, sampObj
, param
);
633 case GL_TEXTURE_MIN_LOD
:
634 res
= set_sampler_min_lod(ctx
, sampObj
, (GLfloat
) param
);
636 case GL_TEXTURE_MAX_LOD
:
637 res
= set_sampler_max_lod(ctx
, sampObj
, (GLfloat
) param
);
639 case GL_TEXTURE_LOD_BIAS
:
640 res
= set_sampler_lod_bias(ctx
, sampObj
, (GLfloat
) param
);
642 case GL_TEXTURE_COMPARE_MODE
:
643 res
= set_sampler_compare_mode(ctx
, sampObj
, param
);
645 case GL_TEXTURE_COMPARE_FUNC
:
646 res
= set_sampler_compare_func(ctx
, sampObj
, param
);
648 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
649 res
= set_sampler_max_anisotropy(ctx
, sampObj
, (GLfloat
) param
);
651 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
652 res
= set_sampler_cube_map_seamless(ctx
, sampObj
, param
);
654 case GL_TEXTURE_SRGB_DECODE_EXT
:
655 res
= set_sampler_srgb_decode(ctx
, sampObj
, param
);
657 case GL_TEXTURE_BORDER_COLOR
:
668 /* state change - we do nothing special at this time */
671 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameteri(pname=%s)\n",
672 _mesa_lookup_enum_by_nr(pname
));
675 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameteri(param=%d)\n",
679 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameteri(param=%d)\n",
688 static void GLAPIENTRY
689 _mesa_SamplerParameterf(GLuint sampler
, GLenum pname
, GLfloat param
)
691 struct gl_sampler_object
*sampObj
;
693 GET_CURRENT_CONTEXT(ctx
);
695 ASSERT_OUTSIDE_BEGIN_END(ctx
);
697 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
699 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterf(sampler %u)",
705 case GL_TEXTURE_WRAP_S
:
706 res
= set_sampler_wrap_s(ctx
, sampObj
, (GLint
) param
);
708 case GL_TEXTURE_WRAP_T
:
709 res
= set_sampler_wrap_t(ctx
, sampObj
, (GLint
) param
);
711 case GL_TEXTURE_WRAP_R
:
712 res
= set_sampler_wrap_r(ctx
, sampObj
, (GLint
) param
);
714 case GL_TEXTURE_MIN_FILTER
:
715 res
= set_sampler_min_filter(ctx
, sampObj
, (GLint
) param
);
717 case GL_TEXTURE_MAG_FILTER
:
718 res
= set_sampler_mag_filter(ctx
, sampObj
, (GLint
) param
);
720 case GL_TEXTURE_MIN_LOD
:
721 res
= set_sampler_min_lod(ctx
, sampObj
, param
);
723 case GL_TEXTURE_MAX_LOD
:
724 res
= set_sampler_max_lod(ctx
, sampObj
, param
);
726 case GL_TEXTURE_LOD_BIAS
:
727 res
= set_sampler_lod_bias(ctx
, sampObj
, param
);
729 case GL_TEXTURE_COMPARE_MODE
:
730 res
= set_sampler_compare_mode(ctx
, sampObj
, (GLint
) param
);
732 case GL_TEXTURE_COMPARE_FUNC
:
733 res
= set_sampler_compare_func(ctx
, sampObj
, (GLint
) param
);
735 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
736 res
= set_sampler_max_anisotropy(ctx
, sampObj
, param
);
738 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
739 res
= set_sampler_cube_map_seamless(ctx
, sampObj
, (GLboolean
) param
);
741 case GL_TEXTURE_SRGB_DECODE_EXT
:
742 res
= set_sampler_srgb_decode(ctx
, sampObj
, (GLenum
) param
);
744 case GL_TEXTURE_BORDER_COLOR
:
755 /* state change - we do nothing special at this time */
758 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterf(pname=%s)\n",
759 _mesa_lookup_enum_by_nr(pname
));
762 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterf(param=%f)\n",
766 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterf(param=%f)\n",
774 static void GLAPIENTRY
775 _mesa_SamplerParameteriv(GLuint sampler
, GLenum pname
, const GLint
*params
)
777 struct gl_sampler_object
*sampObj
;
779 GET_CURRENT_CONTEXT(ctx
);
781 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
783 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameteriv(sampler %u)",
789 case GL_TEXTURE_WRAP_S
:
790 res
= set_sampler_wrap_s(ctx
, sampObj
, params
[0]);
792 case GL_TEXTURE_WRAP_T
:
793 res
= set_sampler_wrap_t(ctx
, sampObj
, params
[0]);
795 case GL_TEXTURE_WRAP_R
:
796 res
= set_sampler_wrap_r(ctx
, sampObj
, params
[0]);
798 case GL_TEXTURE_MIN_FILTER
:
799 res
= set_sampler_min_filter(ctx
, sampObj
, params
[0]);
801 case GL_TEXTURE_MAG_FILTER
:
802 res
= set_sampler_mag_filter(ctx
, sampObj
, params
[0]);
804 case GL_TEXTURE_MIN_LOD
:
805 res
= set_sampler_min_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
807 case GL_TEXTURE_MAX_LOD
:
808 res
= set_sampler_max_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
810 case GL_TEXTURE_LOD_BIAS
:
811 res
= set_sampler_lod_bias(ctx
, sampObj
, (GLfloat
) params
[0]);
813 case GL_TEXTURE_COMPARE_MODE
:
814 res
= set_sampler_compare_mode(ctx
, sampObj
, params
[0]);
816 case GL_TEXTURE_COMPARE_FUNC
:
817 res
= set_sampler_compare_func(ctx
, sampObj
, params
[0]);
819 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
820 res
= set_sampler_max_anisotropy(ctx
, sampObj
, (GLfloat
) params
[0]);
822 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
823 res
= set_sampler_cube_map_seamless(ctx
, sampObj
, params
[0]);
825 case GL_TEXTURE_SRGB_DECODE_EXT
:
826 res
= set_sampler_srgb_decode(ctx
, sampObj
, params
[0]);
828 case GL_TEXTURE_BORDER_COLOR
:
831 c
[0] = INT_TO_FLOAT(params
[0]);
832 c
[1] = INT_TO_FLOAT(params
[1]);
833 c
[2] = INT_TO_FLOAT(params
[2]);
834 c
[3] = INT_TO_FLOAT(params
[3]);
835 res
= set_sampler_border_colorf(ctx
, sampObj
, c
);
847 /* state change - we do nothing special at this time */
850 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameteriv(pname=%s)\n",
851 _mesa_lookup_enum_by_nr(pname
));
854 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameteriv(param=%d)\n",
858 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameteriv(param=%d)\n",
866 static void GLAPIENTRY
867 _mesa_SamplerParameterfv(GLuint sampler
, GLenum pname
, const GLfloat
*params
)
869 struct gl_sampler_object
*sampObj
;
871 GET_CURRENT_CONTEXT(ctx
);
873 ASSERT_OUTSIDE_BEGIN_END(ctx
);
875 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
877 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterfv(sampler %u)",
883 case GL_TEXTURE_WRAP_S
:
884 res
= set_sampler_wrap_s(ctx
, sampObj
, (GLint
) params
[0]);
886 case GL_TEXTURE_WRAP_T
:
887 res
= set_sampler_wrap_t(ctx
, sampObj
, (GLint
) params
[0]);
889 case GL_TEXTURE_WRAP_R
:
890 res
= set_sampler_wrap_r(ctx
, sampObj
, (GLint
) params
[0]);
892 case GL_TEXTURE_MIN_FILTER
:
893 res
= set_sampler_min_filter(ctx
, sampObj
, (GLint
) params
[0]);
895 case GL_TEXTURE_MAG_FILTER
:
896 res
= set_sampler_mag_filter(ctx
, sampObj
, (GLint
) params
[0]);
898 case GL_TEXTURE_MIN_LOD
:
899 res
= set_sampler_min_lod(ctx
, sampObj
, params
[0]);
901 case GL_TEXTURE_MAX_LOD
:
902 res
= set_sampler_max_lod(ctx
, sampObj
, params
[0]);
904 case GL_TEXTURE_LOD_BIAS
:
905 res
= set_sampler_lod_bias(ctx
, sampObj
, params
[0]);
907 case GL_TEXTURE_COMPARE_MODE
:
908 res
= set_sampler_compare_mode(ctx
, sampObj
, (GLint
) params
[0]);
910 case GL_TEXTURE_COMPARE_FUNC
:
911 res
= set_sampler_compare_func(ctx
, sampObj
, (GLint
) params
[0]);
913 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
914 res
= set_sampler_max_anisotropy(ctx
, sampObj
, params
[0]);
916 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
917 res
= set_sampler_cube_map_seamless(ctx
, sampObj
, (GLboolean
) params
[0]);
919 case GL_TEXTURE_SRGB_DECODE_EXT
:
920 res
= set_sampler_srgb_decode(ctx
, sampObj
, (GLenum
) params
[0]);
922 case GL_TEXTURE_BORDER_COLOR
:
923 res
= set_sampler_border_colorf(ctx
, sampObj
, params
);
934 /* state change - we do nothing special at this time */
937 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterfv(pname=%s)\n",
938 _mesa_lookup_enum_by_nr(pname
));
941 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterfv(param=%f)\n",
945 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterfv(param=%f)\n",
953 static void GLAPIENTRY
954 _mesa_SamplerParameterIiv(GLuint sampler
, GLenum pname
, const GLint
*params
)
956 struct gl_sampler_object
*sampObj
;
958 GET_CURRENT_CONTEXT(ctx
);
960 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
962 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterIiv(sampler %u)",
968 case GL_TEXTURE_WRAP_S
:
969 res
= set_sampler_wrap_s(ctx
, sampObj
, params
[0]);
971 case GL_TEXTURE_WRAP_T
:
972 res
= set_sampler_wrap_t(ctx
, sampObj
, params
[0]);
974 case GL_TEXTURE_WRAP_R
:
975 res
= set_sampler_wrap_r(ctx
, sampObj
, params
[0]);
977 case GL_TEXTURE_MIN_FILTER
:
978 res
= set_sampler_min_filter(ctx
, sampObj
, params
[0]);
980 case GL_TEXTURE_MAG_FILTER
:
981 res
= set_sampler_mag_filter(ctx
, sampObj
, params
[0]);
983 case GL_TEXTURE_MIN_LOD
:
984 res
= set_sampler_min_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
986 case GL_TEXTURE_MAX_LOD
:
987 res
= set_sampler_max_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
989 case GL_TEXTURE_LOD_BIAS
:
990 res
= set_sampler_lod_bias(ctx
, sampObj
, (GLfloat
) params
[0]);
992 case GL_TEXTURE_COMPARE_MODE
:
993 res
= set_sampler_compare_mode(ctx
, sampObj
, params
[0]);
995 case GL_TEXTURE_COMPARE_FUNC
:
996 res
= set_sampler_compare_func(ctx
, sampObj
, params
[0]);
998 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
999 res
= set_sampler_max_anisotropy(ctx
, sampObj
, (GLfloat
) params
[0]);
1001 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
1002 res
= set_sampler_cube_map_seamless(ctx
, sampObj
, params
[0]);
1004 case GL_TEXTURE_SRGB_DECODE_EXT
:
1005 res
= set_sampler_srgb_decode(ctx
, sampObj
, (GLenum
) params
[0]);
1007 case GL_TEXTURE_BORDER_COLOR
:
1008 res
= set_sampler_border_colori(ctx
, sampObj
, params
);
1011 res
= INVALID_PNAME
;
1019 /* state change - we do nothing special at this time */
1022 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterIiv(pname=%s)\n",
1023 _mesa_lookup_enum_by_nr(pname
));
1026 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterIiv(param=%d)\n",
1030 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterIiv(param=%d)\n",
1039 static void GLAPIENTRY
1040 _mesa_SamplerParameterIuiv(GLuint sampler
, GLenum pname
, const GLuint
*params
)
1042 struct gl_sampler_object
*sampObj
;
1044 GET_CURRENT_CONTEXT(ctx
);
1046 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
1048 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterIuiv(sampler %u)",
1054 case GL_TEXTURE_WRAP_S
:
1055 res
= set_sampler_wrap_s(ctx
, sampObj
, params
[0]);
1057 case GL_TEXTURE_WRAP_T
:
1058 res
= set_sampler_wrap_t(ctx
, sampObj
, params
[0]);
1060 case GL_TEXTURE_WRAP_R
:
1061 res
= set_sampler_wrap_r(ctx
, sampObj
, params
[0]);
1063 case GL_TEXTURE_MIN_FILTER
:
1064 res
= set_sampler_min_filter(ctx
, sampObj
, params
[0]);
1066 case GL_TEXTURE_MAG_FILTER
:
1067 res
= set_sampler_mag_filter(ctx
, sampObj
, params
[0]);
1069 case GL_TEXTURE_MIN_LOD
:
1070 res
= set_sampler_min_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
1072 case GL_TEXTURE_MAX_LOD
:
1073 res
= set_sampler_max_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
1075 case GL_TEXTURE_LOD_BIAS
:
1076 res
= set_sampler_lod_bias(ctx
, sampObj
, (GLfloat
) params
[0]);
1078 case GL_TEXTURE_COMPARE_MODE
:
1079 res
= set_sampler_compare_mode(ctx
, sampObj
, params
[0]);
1081 case GL_TEXTURE_COMPARE_FUNC
:
1082 res
= set_sampler_compare_func(ctx
, sampObj
, params
[0]);
1084 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1085 res
= set_sampler_max_anisotropy(ctx
, sampObj
, (GLfloat
) params
[0]);
1087 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
1088 res
= set_sampler_cube_map_seamless(ctx
, sampObj
, params
[0]);
1090 case GL_TEXTURE_SRGB_DECODE_EXT
:
1091 res
= set_sampler_srgb_decode(ctx
, sampObj
, (GLenum
) params
[0]);
1093 case GL_TEXTURE_BORDER_COLOR
:
1094 res
= set_sampler_border_colorui(ctx
, sampObj
, params
);
1097 res
= INVALID_PNAME
;
1105 /* state change - we do nothing special at this time */
1108 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterIuiv(pname=%s)\n",
1109 _mesa_lookup_enum_by_nr(pname
));
1112 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterIuiv(param=%u)\n",
1116 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterIuiv(param=%u)\n",
1125 static void GLAPIENTRY
1126 _mesa_GetSamplerParameteriv(GLuint sampler
, GLenum pname
, GLint
*params
)
1128 struct gl_sampler_object
*sampObj
;
1129 GET_CURRENT_CONTEXT(ctx
);
1131 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
1133 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetSamplerParameteriv(sampler %u)",
1139 case GL_TEXTURE_WRAP_S
:
1140 *params
= sampObj
->WrapS
;
1142 case GL_TEXTURE_WRAP_T
:
1143 *params
= sampObj
->WrapT
;
1145 case GL_TEXTURE_WRAP_R
:
1146 *params
= sampObj
->WrapR
;
1148 case GL_TEXTURE_MIN_FILTER
:
1149 *params
= sampObj
->MinFilter
;
1151 case GL_TEXTURE_MAG_FILTER
:
1152 *params
= sampObj
->MagFilter
;
1154 case GL_TEXTURE_MIN_LOD
:
1155 *params
= (GLint
) sampObj
->MinLod
;
1157 case GL_TEXTURE_MAX_LOD
:
1158 *params
= (GLint
) sampObj
->MaxLod
;
1160 case GL_TEXTURE_LOD_BIAS
:
1161 *params
= (GLint
) sampObj
->LodBias
;
1163 case GL_TEXTURE_COMPARE_MODE
:
1164 if (!ctx
->Extensions
.ARB_shadow
)
1166 *params
= sampObj
->CompareMode
;
1168 case GL_TEXTURE_COMPARE_FUNC
:
1169 if (!ctx
->Extensions
.ARB_shadow
)
1171 *params
= sampObj
->CompareFunc
;
1173 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1174 *params
= (GLint
) sampObj
->MaxAnisotropy
;
1176 case GL_TEXTURE_BORDER_COLOR
:
1177 params
[0] = FLOAT_TO_INT(sampObj
->BorderColor
.f
[0]);
1178 params
[1] = FLOAT_TO_INT(sampObj
->BorderColor
.f
[1]);
1179 params
[2] = FLOAT_TO_INT(sampObj
->BorderColor
.f
[2]);
1180 params
[3] = FLOAT_TO_INT(sampObj
->BorderColor
.f
[3]);
1182 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
1183 if (!ctx
->Extensions
.AMD_seamless_cubemap_per_texture
)
1185 *params
= sampObj
->CubeMapSeamless
;
1187 case GL_TEXTURE_SRGB_DECODE_EXT
:
1188 if (!ctx
->Extensions
.EXT_texture_sRGB_decode
)
1190 *params
= (GLenum
) sampObj
->sRGBDecode
;
1198 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetSamplerParameteriv(pname=%s)",
1199 _mesa_lookup_enum_by_nr(pname
));
1203 static void GLAPIENTRY
1204 _mesa_GetSamplerParameterfv(GLuint sampler
, GLenum pname
, GLfloat
*params
)
1206 struct gl_sampler_object
*sampObj
;
1207 GET_CURRENT_CONTEXT(ctx
);
1209 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
1211 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetSamplerParameterfv(sampler %u)",
1217 case GL_TEXTURE_WRAP_S
:
1218 *params
= (GLfloat
) sampObj
->WrapS
;
1220 case GL_TEXTURE_WRAP_T
:
1221 *params
= (GLfloat
) sampObj
->WrapT
;
1223 case GL_TEXTURE_WRAP_R
:
1224 *params
= (GLfloat
) sampObj
->WrapR
;
1226 case GL_TEXTURE_MIN_FILTER
:
1227 *params
= (GLfloat
) sampObj
->MinFilter
;
1229 case GL_TEXTURE_MAG_FILTER
:
1230 *params
= (GLfloat
) sampObj
->MagFilter
;
1232 case GL_TEXTURE_MIN_LOD
:
1233 *params
= sampObj
->MinLod
;
1235 case GL_TEXTURE_MAX_LOD
:
1236 *params
= sampObj
->MaxLod
;
1238 case GL_TEXTURE_LOD_BIAS
:
1239 *params
= sampObj
->LodBias
;
1241 case GL_TEXTURE_COMPARE_MODE
:
1242 if (!ctx
->Extensions
.ARB_shadow
)
1244 *params
= (GLfloat
) sampObj
->CompareMode
;
1246 case GL_TEXTURE_COMPARE_FUNC
:
1247 if (!ctx
->Extensions
.ARB_shadow
)
1249 *params
= (GLfloat
) sampObj
->CompareFunc
;
1251 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1252 *params
= sampObj
->MaxAnisotropy
;
1254 case GL_TEXTURE_BORDER_COLOR
:
1255 params
[0] = sampObj
->BorderColor
.f
[0];
1256 params
[1] = sampObj
->BorderColor
.f
[1];
1257 params
[2] = sampObj
->BorderColor
.f
[2];
1258 params
[3] = sampObj
->BorderColor
.f
[3];
1260 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
1261 if (!ctx
->Extensions
.AMD_seamless_cubemap_per_texture
)
1263 *params
= (GLfloat
) sampObj
->CubeMapSeamless
;
1265 case GL_TEXTURE_SRGB_DECODE_EXT
:
1266 if (!ctx
->Extensions
.EXT_texture_sRGB_decode
)
1268 *params
= (GLfloat
) sampObj
->sRGBDecode
;
1276 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetSamplerParameterfv(pname=%s)",
1277 _mesa_lookup_enum_by_nr(pname
));
1281 static void GLAPIENTRY
1282 _mesa_GetSamplerParameterIiv(GLuint sampler
, GLenum pname
, GLint
*params
)
1284 struct gl_sampler_object
*sampObj
;
1285 GET_CURRENT_CONTEXT(ctx
);
1287 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
1289 _mesa_error(ctx
, GL_INVALID_VALUE
,
1290 "glGetSamplerParameterIiv(sampler %u)",
1296 case GL_TEXTURE_WRAP_S
:
1297 *params
= sampObj
->WrapS
;
1299 case GL_TEXTURE_WRAP_T
:
1300 *params
= sampObj
->WrapT
;
1302 case GL_TEXTURE_WRAP_R
:
1303 *params
= sampObj
->WrapR
;
1305 case GL_TEXTURE_MIN_FILTER
:
1306 *params
= sampObj
->MinFilter
;
1308 case GL_TEXTURE_MAG_FILTER
:
1309 *params
= sampObj
->MagFilter
;
1311 case GL_TEXTURE_MIN_LOD
:
1312 *params
= (GLint
) sampObj
->MinLod
;
1314 case GL_TEXTURE_MAX_LOD
:
1315 *params
= (GLint
) sampObj
->MaxLod
;
1317 case GL_TEXTURE_LOD_BIAS
:
1318 *params
= (GLint
) sampObj
->LodBias
;
1320 case GL_TEXTURE_COMPARE_MODE
:
1321 if (!ctx
->Extensions
.ARB_shadow
)
1323 *params
= sampObj
->CompareMode
;
1325 case GL_TEXTURE_COMPARE_FUNC
:
1326 if (!ctx
->Extensions
.ARB_shadow
)
1328 *params
= sampObj
->CompareFunc
;
1330 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1331 *params
= (GLint
) sampObj
->MaxAnisotropy
;
1333 case GL_TEXTURE_BORDER_COLOR
:
1334 params
[0] = sampObj
->BorderColor
.i
[0];
1335 params
[1] = sampObj
->BorderColor
.i
[1];
1336 params
[2] = sampObj
->BorderColor
.i
[2];
1337 params
[3] = sampObj
->BorderColor
.i
[3];
1339 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
1340 if (!ctx
->Extensions
.AMD_seamless_cubemap_per_texture
)
1342 *params
= sampObj
->CubeMapSeamless
;
1344 case GL_TEXTURE_SRGB_DECODE_EXT
:
1345 if (!ctx
->Extensions
.EXT_texture_sRGB_decode
)
1347 *params
= (GLenum
) sampObj
->sRGBDecode
;
1355 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetSamplerParameterIiv(pname=%s)",
1356 _mesa_lookup_enum_by_nr(pname
));
1360 static void GLAPIENTRY
1361 _mesa_GetSamplerParameterIuiv(GLuint sampler
, GLenum pname
, GLuint
*params
)
1363 struct gl_sampler_object
*sampObj
;
1364 GET_CURRENT_CONTEXT(ctx
);
1366 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
1368 _mesa_error(ctx
, GL_INVALID_VALUE
,
1369 "glGetSamplerParameterIuiv(sampler %u)",
1375 case GL_TEXTURE_WRAP_S
:
1376 *params
= sampObj
->WrapS
;
1378 case GL_TEXTURE_WRAP_T
:
1379 *params
= sampObj
->WrapT
;
1381 case GL_TEXTURE_WRAP_R
:
1382 *params
= sampObj
->WrapR
;
1384 case GL_TEXTURE_MIN_FILTER
:
1385 *params
= sampObj
->MinFilter
;
1387 case GL_TEXTURE_MAG_FILTER
:
1388 *params
= sampObj
->MagFilter
;
1390 case GL_TEXTURE_MIN_LOD
:
1391 *params
= (GLuint
) sampObj
->MinLod
;
1393 case GL_TEXTURE_MAX_LOD
:
1394 *params
= (GLuint
) sampObj
->MaxLod
;
1396 case GL_TEXTURE_LOD_BIAS
:
1397 *params
= (GLuint
) sampObj
->LodBias
;
1399 case GL_TEXTURE_COMPARE_MODE
:
1400 if (!ctx
->Extensions
.ARB_shadow
)
1402 *params
= sampObj
->CompareMode
;
1404 case GL_TEXTURE_COMPARE_FUNC
:
1405 if (!ctx
->Extensions
.ARB_shadow
)
1407 *params
= sampObj
->CompareFunc
;
1409 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1410 *params
= (GLuint
) sampObj
->MaxAnisotropy
;
1412 case GL_TEXTURE_BORDER_COLOR
:
1413 params
[0] = sampObj
->BorderColor
.ui
[0];
1414 params
[1] = sampObj
->BorderColor
.ui
[1];
1415 params
[2] = sampObj
->BorderColor
.ui
[2];
1416 params
[3] = sampObj
->BorderColor
.ui
[3];
1418 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
1419 if (!ctx
->Extensions
.AMD_seamless_cubemap_per_texture
)
1421 *params
= sampObj
->CubeMapSeamless
;
1423 case GL_TEXTURE_SRGB_DECODE_EXT
:
1424 if (!ctx
->Extensions
.EXT_texture_sRGB_decode
)
1426 *params
= (GLenum
) sampObj
->sRGBDecode
;
1434 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetSamplerParameterIuiv(pname=%s)",
1435 _mesa_lookup_enum_by_nr(pname
));
1440 _mesa_init_sampler_object_functions(struct dd_function_table
*driver
)
1442 driver
->NewSamplerObject
= _mesa_new_sampler_object
;
1443 driver
->DeleteSamplerObject
= _mesa_delete_sampler_object
;
1448 _mesa_init_sampler_object_dispatch(struct _glapi_table
*disp
)
1450 SET_GenSamplers(disp
, _mesa_GenSamplers
);
1451 SET_DeleteSamplers(disp
, _mesa_DeleteSamplers
);
1452 SET_IsSampler(disp
, _mesa_IsSampler
);
1453 SET_BindSampler(disp
, _mesa_BindSampler
);
1454 SET_SamplerParameteri(disp
, _mesa_SamplerParameteri
);
1455 SET_SamplerParameterf(disp
, _mesa_SamplerParameterf
);
1456 SET_SamplerParameteriv(disp
, _mesa_SamplerParameteriv
);
1457 SET_SamplerParameterfv(disp
, _mesa_SamplerParameterfv
);
1458 SET_SamplerParameterIiv(disp
, _mesa_SamplerParameterIiv
);
1459 SET_SamplerParameterIuiv(disp
, _mesa_SamplerParameterIuiv
);
1460 SET_GetSamplerParameteriv(disp
, _mesa_GetSamplerParameteriv
);
1461 SET_GetSamplerParameterfv(disp
, _mesa_GetSamplerParameterfv
);
1462 SET_GetSamplerParameterIiv(disp
, _mesa_GetSamplerParameterIiv
);
1463 SET_GetSamplerParameterIuiv(disp
, _mesa_GetSamplerParameterIuiv
);