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
;
136 sampObj
->DepthMode
= 0;
141 * Fallback for ctx->Driver.NewSamplerObject();
143 struct gl_sampler_object
*
144 _mesa_new_sampler_object(struct gl_context
*ctx
, GLuint name
)
146 struct gl_sampler_object
*sampObj
= CALLOC_STRUCT(gl_sampler_object
);
148 _mesa_init_sampler_object(sampObj
, name
);
155 * Fallback for ctx->Driver.DeleteSamplerObject();
158 _mesa_delete_sampler_object(struct gl_context
*ctx
,
159 struct gl_sampler_object
*sampObj
)
165 static void GLAPIENTRY
166 _mesa_GenSamplers(GLsizei count
, GLuint
*samplers
)
168 GET_CURRENT_CONTEXT(ctx
);
172 ASSERT_OUTSIDE_BEGIN_END(ctx
);
174 if (MESA_VERBOSE
& VERBOSE_API
)
175 _mesa_debug(ctx
, "glGenSamplers(%d)\n", count
);
178 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGenSamplers");
185 first
= _mesa_HashFindFreeKeyBlock(ctx
->Shared
->SamplerObjects
, count
);
187 /* Insert the ID and pointer to new sampler object into hash table */
188 for (i
= 0; i
< count
; i
++) {
189 struct gl_sampler_object
*sampObj
=
190 ctx
->Driver
.NewSamplerObject(ctx
, first
+ i
);
191 _mesa_HashInsert(ctx
->Shared
->SamplerObjects
, first
+ i
, sampObj
);
192 samplers
[i
] = first
+ i
;
197 static void GLAPIENTRY
198 _mesa_DeleteSamplers(GLsizei count
, const GLuint
*samplers
)
200 GET_CURRENT_CONTEXT(ctx
);
203 ASSERT_OUTSIDE_BEGIN_END(ctx
);
204 FLUSH_VERTICES(ctx
, 0);
207 _mesa_error(ctx
, GL_INVALID_VALUE
, "glDeleteSamplers(count)");
211 _glthread_LOCK_MUTEX(ctx
->Shared
->Mutex
);
213 for (i
= 0; i
< count
; i
++) {
215 struct gl_sampler_object
*sampObj
=
216 _mesa_lookup_samplerobj(ctx
, samplers
[i
]);
218 /* The ID is immediately freed for re-use */
219 _mesa_HashRemove(ctx
->Shared
->SamplerObjects
, samplers
[i
]);
220 /* But the object exists until its reference count goes to zero */
221 _mesa_reference_sampler_object(ctx
, &sampObj
, NULL
);
226 _glthread_UNLOCK_MUTEX(ctx
->Shared
->Mutex
);
230 static GLboolean GLAPIENTRY
231 _mesa_IsSampler(GLuint sampler
)
233 struct gl_sampler_object
*sampObj
;
234 GET_CURRENT_CONTEXT(ctx
);
236 ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx
, GL_FALSE
);
241 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
243 return sampObj
!= NULL
;
247 static void GLAPIENTRY
248 _mesa_BindSampler(GLuint unit
, GLuint sampler
)
250 struct gl_sampler_object
*sampObj
;
251 GET_CURRENT_CONTEXT(ctx
);
253 if (unit
>= ctx
->Const
.MaxCombinedTextureImageUnits
) {
254 _mesa_error(ctx
, GL_INVALID_VALUE
, "glBindSampler(unit %u)", unit
);
259 /* Use the default sampler object, the one contained in the texture
265 /* user-defined sampler object */
266 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
268 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glBindSampler(sampler)");
273 if (ctx
->Texture
.Unit
[unit
].Sampler
!= sampObj
) {
274 FLUSH_VERTICES(ctx
, _NEW_TEXTURE
);
277 /* bind new sampler */
278 _mesa_reference_sampler_object(ctx
, &ctx
->Texture
.Unit
[unit
].Sampler
,
284 * Check if a coordinate wrap mode is legal.
285 * \return GL_TRUE if legal, GL_FALSE otherwise
288 validate_texture_wrap_mode(struct gl_context
*ctx
, GLenum wrap
)
290 const struct gl_extensions
* const e
= &ctx
->Extensions
;
294 case GL_CLAMP_TO_EDGE
:
296 case GL_MIRRORED_REPEAT
:
298 case GL_CLAMP_TO_BORDER
:
299 return e
->ARB_texture_border_clamp
;
300 case GL_MIRROR_CLAMP_EXT
:
301 return e
->ATI_texture_mirror_once
|| e
->EXT_texture_mirror_clamp
;
302 case GL_MIRROR_CLAMP_TO_EDGE_EXT
:
303 return e
->ATI_texture_mirror_once
|| e
->EXT_texture_mirror_clamp
;
304 case GL_MIRROR_CLAMP_TO_BORDER_EXT
:
305 return e
->EXT_texture_mirror_clamp
;
313 * This is called just prior to changing any sampler object state.
316 flush(struct gl_context
*ctx
)
318 FLUSH_VERTICES(ctx
, _NEW_TEXTURE
);
322 #define INVALID_PARAM 0x100
323 #define INVALID_PNAME 0x101
324 #define INVALID_VALUE 0x102
327 set_sampler_wrap_s(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
330 if (samp
->WrapS
== param
)
332 if (validate_texture_wrap_mode(ctx
, param
)) {
337 return INVALID_PARAM
;
342 set_sampler_wrap_t(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
345 if (samp
->WrapT
== param
)
347 if (validate_texture_wrap_mode(ctx
, param
)) {
352 return INVALID_PARAM
;
357 set_sampler_wrap_r(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
360 if (samp
->WrapR
== param
)
362 if (validate_texture_wrap_mode(ctx
, param
)) {
367 return INVALID_PARAM
;
372 set_sampler_min_filter(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
375 if (samp
->MinFilter
== param
)
381 case GL_NEAREST_MIPMAP_NEAREST
:
382 case GL_LINEAR_MIPMAP_NEAREST
:
383 case GL_NEAREST_MIPMAP_LINEAR
:
384 case GL_LINEAR_MIPMAP_LINEAR
:
386 samp
->MinFilter
= param
;
389 return INVALID_PARAM
;
395 set_sampler_mag_filter(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
398 if (samp
->MagFilter
== param
)
405 samp
->MagFilter
= param
;
408 return INVALID_PARAM
;
414 set_sampler_lod_bias(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
417 if (samp
->LodBias
== param
)
421 samp
->LodBias
= param
;
427 set_sampler_border_colorf(struct gl_context
*ctx
,
428 struct gl_sampler_object
*samp
,
429 const GLfloat params
[4])
432 samp
->BorderColor
.f
[RCOMP
] = params
[0];
433 samp
->BorderColor
.f
[GCOMP
] = params
[1];
434 samp
->BorderColor
.f
[BCOMP
] = params
[2];
435 samp
->BorderColor
.f
[ACOMP
] = params
[3];
441 set_sampler_border_colori(struct gl_context
*ctx
,
442 struct gl_sampler_object
*samp
,
443 const GLint params
[4])
446 samp
->BorderColor
.i
[RCOMP
] = params
[0];
447 samp
->BorderColor
.i
[GCOMP
] = params
[1];
448 samp
->BorderColor
.i
[BCOMP
] = params
[2];
449 samp
->BorderColor
.i
[ACOMP
] = params
[3];
455 set_sampler_border_colorui(struct gl_context
*ctx
,
456 struct gl_sampler_object
*samp
,
457 const GLuint params
[4])
460 samp
->BorderColor
.ui
[RCOMP
] = params
[0];
461 samp
->BorderColor
.ui
[GCOMP
] = params
[1];
462 samp
->BorderColor
.ui
[BCOMP
] = params
[2];
463 samp
->BorderColor
.ui
[ACOMP
] = params
[3];
469 set_sampler_min_lod(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
472 if (samp
->MinLod
== param
)
476 samp
->MinLod
= param
;
482 set_sampler_max_lod(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
485 if (samp
->MaxLod
== param
)
489 samp
->MaxLod
= param
;
495 set_sampler_compare_mode(struct gl_context
*ctx
,
496 struct gl_sampler_object
*samp
, GLint param
)
498 if (!ctx
->Extensions
.ARB_shadow
)
499 return INVALID_PNAME
;
501 if (samp
->CompareMode
== param
)
504 if (param
== GL_NONE
||
505 param
== GL_COMPARE_R_TO_TEXTURE_ARB
) {
507 samp
->CompareMode
= param
;
511 return INVALID_PARAM
;
516 set_sampler_compare_func(struct gl_context
*ctx
,
517 struct gl_sampler_object
*samp
, GLint param
)
519 if (!ctx
->Extensions
.ARB_shadow
)
520 return INVALID_PNAME
;
522 if (samp
->CompareFunc
== param
)
529 samp
->CompareFunc
= param
;
537 if (ctx
->Extensions
.EXT_shadow_funcs
) {
539 samp
->CompareFunc
= param
;
544 return INVALID_PARAM
;
550 set_sampler_max_anisotropy(struct gl_context
*ctx
,
551 struct gl_sampler_object
*samp
, GLfloat param
)
553 if (!ctx
->Extensions
.EXT_texture_filter_anisotropic
)
554 return INVALID_PNAME
;
556 if (samp
->MaxAnisotropy
== param
)
560 return INVALID_VALUE
;
563 /* clamp to max, that's what NVIDIA does */
564 samp
->MaxAnisotropy
= MIN2(param
, ctx
->Const
.MaxTextureMaxAnisotropy
);
570 set_sampler_cube_map_seamless(struct gl_context
*ctx
,
571 struct gl_sampler_object
*samp
, GLboolean param
)
573 if (!ctx
->Extensions
.AMD_seamless_cubemap_per_texture
)
574 return INVALID_PNAME
;
576 if (samp
->CubeMapSeamless
== param
)
579 if (param
!= GL_TRUE
&& param
!= GL_FALSE
)
580 return INVALID_VALUE
;
583 samp
->CubeMapSeamless
= param
;
588 static void GLAPIENTRY
589 _mesa_SamplerParameteri(GLuint sampler
, GLenum pname
, GLint param
)
591 struct gl_sampler_object
*sampObj
;
593 GET_CURRENT_CONTEXT(ctx
);
595 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
597 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameteri(sampler %u)",
603 case GL_TEXTURE_WRAP_S
:
604 res
= set_sampler_wrap_s(ctx
, sampObj
, param
);
606 case GL_TEXTURE_WRAP_T
:
607 res
= set_sampler_wrap_t(ctx
, sampObj
, param
);
609 case GL_TEXTURE_WRAP_R
:
610 res
= set_sampler_wrap_r(ctx
, sampObj
, param
);
612 case GL_TEXTURE_MIN_FILTER
:
613 res
= set_sampler_min_filter(ctx
, sampObj
, param
);
615 case GL_TEXTURE_MAG_FILTER
:
616 res
= set_sampler_mag_filter(ctx
, sampObj
, param
);
618 case GL_TEXTURE_MIN_LOD
:
619 res
= set_sampler_min_lod(ctx
, sampObj
, (GLfloat
) param
);
621 case GL_TEXTURE_MAX_LOD
:
622 res
= set_sampler_max_lod(ctx
, sampObj
, (GLfloat
) param
);
624 case GL_TEXTURE_LOD_BIAS
:
625 res
= set_sampler_lod_bias(ctx
, sampObj
, (GLfloat
) param
);
627 case GL_TEXTURE_COMPARE_MODE
:
628 res
= set_sampler_compare_mode(ctx
, sampObj
, param
);
630 case GL_TEXTURE_COMPARE_FUNC
:
631 res
= set_sampler_compare_func(ctx
, sampObj
, param
);
633 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
634 res
= set_sampler_max_anisotropy(ctx
, sampObj
, (GLfloat
) param
);
636 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
637 res
= set_sampler_cube_map_seamless(ctx
, sampObj
, param
);
639 case GL_TEXTURE_BORDER_COLOR
:
650 /* state change - we do nothing special at this time */
653 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameteri(pname=%s)\n",
654 _mesa_lookup_enum_by_nr(pname
));
657 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameteri(param=%d)\n",
661 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameteri(param=%d)\n",
670 static void GLAPIENTRY
671 _mesa_SamplerParameterf(GLuint sampler
, GLenum pname
, GLfloat param
)
673 struct gl_sampler_object
*sampObj
;
675 GET_CURRENT_CONTEXT(ctx
);
677 ASSERT_OUTSIDE_BEGIN_END(ctx
);
679 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
681 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterf(sampler %u)",
687 case GL_TEXTURE_WRAP_S
:
688 res
= set_sampler_wrap_s(ctx
, sampObj
, (GLint
) param
);
690 case GL_TEXTURE_WRAP_T
:
691 res
= set_sampler_wrap_t(ctx
, sampObj
, (GLint
) param
);
693 case GL_TEXTURE_WRAP_R
:
694 res
= set_sampler_wrap_r(ctx
, sampObj
, (GLint
) param
);
696 case GL_TEXTURE_MIN_FILTER
:
697 res
= set_sampler_min_filter(ctx
, sampObj
, (GLint
) param
);
699 case GL_TEXTURE_MAG_FILTER
:
700 res
= set_sampler_mag_filter(ctx
, sampObj
, (GLint
) param
);
702 case GL_TEXTURE_MIN_LOD
:
703 res
= set_sampler_min_lod(ctx
, sampObj
, param
);
705 case GL_TEXTURE_MAX_LOD
:
706 res
= set_sampler_max_lod(ctx
, sampObj
, param
);
708 case GL_TEXTURE_LOD_BIAS
:
709 res
= set_sampler_lod_bias(ctx
, sampObj
, param
);
711 case GL_TEXTURE_COMPARE_MODE
:
712 res
= set_sampler_compare_mode(ctx
, sampObj
, (GLint
) param
);
714 case GL_TEXTURE_COMPARE_FUNC
:
715 res
= set_sampler_compare_func(ctx
, sampObj
, (GLint
) param
);
717 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
718 res
= set_sampler_max_anisotropy(ctx
, sampObj
, param
);
720 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
721 res
= set_sampler_cube_map_seamless(ctx
, sampObj
, (GLboolean
) param
);
723 case GL_TEXTURE_BORDER_COLOR
:
734 /* state change - we do nothing special at this time */
737 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterf(pname=%s)\n",
738 _mesa_lookup_enum_by_nr(pname
));
741 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterf(param=%f)\n",
745 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterf(param=%f)\n",
753 static void GLAPIENTRY
754 _mesa_SamplerParameteriv(GLuint sampler
, GLenum pname
, const GLint
*params
)
756 struct gl_sampler_object
*sampObj
;
758 GET_CURRENT_CONTEXT(ctx
);
760 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
762 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameteriv(sampler %u)",
768 case GL_TEXTURE_WRAP_S
:
769 res
= set_sampler_wrap_s(ctx
, sampObj
, params
[0]);
771 case GL_TEXTURE_WRAP_T
:
772 res
= set_sampler_wrap_t(ctx
, sampObj
, params
[0]);
774 case GL_TEXTURE_WRAP_R
:
775 res
= set_sampler_wrap_r(ctx
, sampObj
, params
[0]);
777 case GL_TEXTURE_MIN_FILTER
:
778 res
= set_sampler_min_filter(ctx
, sampObj
, params
[0]);
780 case GL_TEXTURE_MAG_FILTER
:
781 res
= set_sampler_mag_filter(ctx
, sampObj
, params
[0]);
783 case GL_TEXTURE_MIN_LOD
:
784 res
= set_sampler_min_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
786 case GL_TEXTURE_MAX_LOD
:
787 res
= set_sampler_max_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
789 case GL_TEXTURE_LOD_BIAS
:
790 res
= set_sampler_lod_bias(ctx
, sampObj
, (GLfloat
) params
[0]);
792 case GL_TEXTURE_COMPARE_MODE
:
793 res
= set_sampler_compare_mode(ctx
, sampObj
, params
[0]);
795 case GL_TEXTURE_COMPARE_FUNC
:
796 res
= set_sampler_compare_func(ctx
, sampObj
, params
[0]);
798 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
799 res
= set_sampler_max_anisotropy(ctx
, sampObj
, (GLfloat
) params
[0]);
801 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
802 res
= set_sampler_cube_map_seamless(ctx
, sampObj
, params
[0]);
804 case GL_TEXTURE_BORDER_COLOR
:
807 c
[0] = INT_TO_FLOAT(params
[0]);
808 c
[1] = INT_TO_FLOAT(params
[1]);
809 c
[2] = INT_TO_FLOAT(params
[2]);
810 c
[3] = INT_TO_FLOAT(params
[3]);
811 res
= set_sampler_border_colorf(ctx
, sampObj
, c
);
823 /* state change - we do nothing special at this time */
826 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameteriv(pname=%s)\n",
827 _mesa_lookup_enum_by_nr(pname
));
830 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameteriv(param=%d)\n",
834 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameteriv(param=%d)\n",
842 static void GLAPIENTRY
843 _mesa_SamplerParameterfv(GLuint sampler
, GLenum pname
, const GLfloat
*params
)
845 struct gl_sampler_object
*sampObj
;
847 GET_CURRENT_CONTEXT(ctx
);
849 ASSERT_OUTSIDE_BEGIN_END(ctx
);
851 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
853 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterfv(sampler %u)",
859 case GL_TEXTURE_WRAP_S
:
860 res
= set_sampler_wrap_s(ctx
, sampObj
, (GLint
) params
[0]);
862 case GL_TEXTURE_WRAP_T
:
863 res
= set_sampler_wrap_t(ctx
, sampObj
, (GLint
) params
[0]);
865 case GL_TEXTURE_WRAP_R
:
866 res
= set_sampler_wrap_r(ctx
, sampObj
, (GLint
) params
[0]);
868 case GL_TEXTURE_MIN_FILTER
:
869 res
= set_sampler_min_filter(ctx
, sampObj
, (GLint
) params
[0]);
871 case GL_TEXTURE_MAG_FILTER
:
872 res
= set_sampler_mag_filter(ctx
, sampObj
, (GLint
) params
[0]);
874 case GL_TEXTURE_MIN_LOD
:
875 res
= set_sampler_min_lod(ctx
, sampObj
, params
[0]);
877 case GL_TEXTURE_MAX_LOD
:
878 res
= set_sampler_max_lod(ctx
, sampObj
, params
[0]);
880 case GL_TEXTURE_LOD_BIAS
:
881 res
= set_sampler_lod_bias(ctx
, sampObj
, params
[0]);
883 case GL_TEXTURE_COMPARE_MODE
:
884 res
= set_sampler_compare_mode(ctx
, sampObj
, (GLint
) params
[0]);
886 case GL_TEXTURE_COMPARE_FUNC
:
887 res
= set_sampler_compare_func(ctx
, sampObj
, (GLint
) params
[0]);
889 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
890 res
= set_sampler_max_anisotropy(ctx
, sampObj
, params
[0]);
892 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
893 res
= set_sampler_cube_map_seamless(ctx
, sampObj
, (GLboolean
) params
[0]);
895 case GL_TEXTURE_BORDER_COLOR
:
896 res
= set_sampler_border_colorf(ctx
, sampObj
, params
);
907 /* state change - we do nothing special at this time */
910 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterfv(pname=%s)\n",
911 _mesa_lookup_enum_by_nr(pname
));
914 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterfv(param=%f)\n",
918 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterfv(param=%f)\n",
926 static void GLAPIENTRY
927 _mesa_SamplerParameterIiv(GLuint sampler
, GLenum pname
, const GLint
*params
)
929 struct gl_sampler_object
*sampObj
;
931 GET_CURRENT_CONTEXT(ctx
);
933 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
935 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterIiv(sampler %u)",
941 case GL_TEXTURE_WRAP_S
:
942 res
= set_sampler_wrap_s(ctx
, sampObj
, params
[0]);
944 case GL_TEXTURE_WRAP_T
:
945 res
= set_sampler_wrap_t(ctx
, sampObj
, params
[0]);
947 case GL_TEXTURE_WRAP_R
:
948 res
= set_sampler_wrap_r(ctx
, sampObj
, params
[0]);
950 case GL_TEXTURE_MIN_FILTER
:
951 res
= set_sampler_min_filter(ctx
, sampObj
, params
[0]);
953 case GL_TEXTURE_MAG_FILTER
:
954 res
= set_sampler_mag_filter(ctx
, sampObj
, params
[0]);
956 case GL_TEXTURE_MIN_LOD
:
957 res
= set_sampler_min_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
959 case GL_TEXTURE_MAX_LOD
:
960 res
= set_sampler_max_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
962 case GL_TEXTURE_LOD_BIAS
:
963 res
= set_sampler_lod_bias(ctx
, sampObj
, (GLfloat
) params
[0]);
965 case GL_TEXTURE_COMPARE_MODE
:
966 res
= set_sampler_compare_mode(ctx
, sampObj
, params
[0]);
968 case GL_TEXTURE_COMPARE_FUNC
:
969 res
= set_sampler_compare_func(ctx
, sampObj
, params
[0]);
971 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
972 res
= set_sampler_max_anisotropy(ctx
, sampObj
, (GLfloat
) params
[0]);
974 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
975 res
= set_sampler_cube_map_seamless(ctx
, sampObj
, params
[0]);
977 case GL_TEXTURE_BORDER_COLOR
:
978 res
= set_sampler_border_colori(ctx
, sampObj
, params
);
989 /* state change - we do nothing special at this time */
992 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterIiv(pname=%s)\n",
993 _mesa_lookup_enum_by_nr(pname
));
996 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterIiv(param=%d)\n",
1000 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterIiv(param=%d)\n",
1009 static void GLAPIENTRY
1010 _mesa_SamplerParameterIuiv(GLuint sampler
, GLenum pname
, const GLuint
*params
)
1012 struct gl_sampler_object
*sampObj
;
1014 GET_CURRENT_CONTEXT(ctx
);
1016 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
1018 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterIuiv(sampler %u)",
1024 case GL_TEXTURE_WRAP_S
:
1025 res
= set_sampler_wrap_s(ctx
, sampObj
, params
[0]);
1027 case GL_TEXTURE_WRAP_T
:
1028 res
= set_sampler_wrap_t(ctx
, sampObj
, params
[0]);
1030 case GL_TEXTURE_WRAP_R
:
1031 res
= set_sampler_wrap_r(ctx
, sampObj
, params
[0]);
1033 case GL_TEXTURE_MIN_FILTER
:
1034 res
= set_sampler_min_filter(ctx
, sampObj
, params
[0]);
1036 case GL_TEXTURE_MAG_FILTER
:
1037 res
= set_sampler_mag_filter(ctx
, sampObj
, params
[0]);
1039 case GL_TEXTURE_MIN_LOD
:
1040 res
= set_sampler_min_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
1042 case GL_TEXTURE_MAX_LOD
:
1043 res
= set_sampler_max_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
1045 case GL_TEXTURE_LOD_BIAS
:
1046 res
= set_sampler_lod_bias(ctx
, sampObj
, (GLfloat
) params
[0]);
1048 case GL_TEXTURE_COMPARE_MODE
:
1049 res
= set_sampler_compare_mode(ctx
, sampObj
, params
[0]);
1051 case GL_TEXTURE_COMPARE_FUNC
:
1052 res
= set_sampler_compare_func(ctx
, sampObj
, params
[0]);
1054 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1055 res
= set_sampler_max_anisotropy(ctx
, sampObj
, (GLfloat
) params
[0]);
1057 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
1058 res
= set_sampler_cube_map_seamless(ctx
, sampObj
, params
[0]);
1060 case GL_TEXTURE_BORDER_COLOR
:
1061 res
= set_sampler_border_colorui(ctx
, sampObj
, params
);
1064 res
= INVALID_PNAME
;
1072 /* state change - we do nothing special at this time */
1075 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterIuiv(pname=%s)\n",
1076 _mesa_lookup_enum_by_nr(pname
));
1079 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterIuiv(param=%u)\n",
1083 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterIuiv(param=%u)\n",
1092 static void GLAPIENTRY
1093 _mesa_GetSamplerParameteriv(GLuint sampler
, GLenum pname
, GLint
*params
)
1095 struct gl_sampler_object
*sampObj
;
1096 GET_CURRENT_CONTEXT(ctx
);
1098 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
1100 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetSamplerParameteriv(sampler %u)",
1106 case GL_TEXTURE_WRAP_S
:
1107 *params
= sampObj
->WrapS
;
1109 case GL_TEXTURE_WRAP_T
:
1110 *params
= sampObj
->WrapT
;
1112 case GL_TEXTURE_WRAP_R
:
1113 *params
= sampObj
->WrapR
;
1115 case GL_TEXTURE_MIN_FILTER
:
1116 *params
= sampObj
->MinFilter
;
1118 case GL_TEXTURE_MAG_FILTER
:
1119 *params
= sampObj
->MagFilter
;
1121 case GL_TEXTURE_MIN_LOD
:
1122 *params
= (GLint
) sampObj
->MinLod
;
1124 case GL_TEXTURE_MAX_LOD
:
1125 *params
= (GLint
) sampObj
->MaxLod
;
1127 case GL_TEXTURE_LOD_BIAS
:
1128 *params
= (GLint
) sampObj
->LodBias
;
1130 case GL_TEXTURE_COMPARE_MODE
:
1131 if (!ctx
->Extensions
.ARB_shadow
)
1133 *params
= sampObj
->CompareMode
;
1135 case GL_TEXTURE_COMPARE_FUNC
:
1136 if (!ctx
->Extensions
.ARB_shadow
)
1138 *params
= sampObj
->CompareFunc
;
1140 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1141 *params
= (GLint
) sampObj
->MaxAnisotropy
;
1143 case GL_TEXTURE_BORDER_COLOR
:
1144 params
[0] = FLOAT_TO_INT(sampObj
->BorderColor
.f
[0]);
1145 params
[1] = FLOAT_TO_INT(sampObj
->BorderColor
.f
[1]);
1146 params
[2] = FLOAT_TO_INT(sampObj
->BorderColor
.f
[2]);
1147 params
[3] = FLOAT_TO_INT(sampObj
->BorderColor
.f
[3]);
1149 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
1150 if (!ctx
->Extensions
.AMD_seamless_cubemap_per_texture
)
1152 *params
= sampObj
->CubeMapSeamless
;
1160 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetSamplerParameteriv(pname=%s)",
1161 _mesa_lookup_enum_by_nr(pname
));
1165 static void GLAPIENTRY
1166 _mesa_GetSamplerParameterfv(GLuint sampler
, GLenum pname
, GLfloat
*params
)
1168 struct gl_sampler_object
*sampObj
;
1169 GET_CURRENT_CONTEXT(ctx
);
1171 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
1173 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetSamplerParameterfv(sampler %u)",
1179 case GL_TEXTURE_WRAP_S
:
1180 *params
= (GLfloat
) sampObj
->WrapS
;
1182 case GL_TEXTURE_WRAP_T
:
1183 *params
= (GLfloat
) sampObj
->WrapT
;
1185 case GL_TEXTURE_WRAP_R
:
1186 *params
= (GLfloat
) sampObj
->WrapR
;
1188 case GL_TEXTURE_MIN_FILTER
:
1189 *params
= (GLfloat
) sampObj
->MinFilter
;
1191 case GL_TEXTURE_MAG_FILTER
:
1192 *params
= (GLfloat
) sampObj
->MagFilter
;
1194 case GL_TEXTURE_MIN_LOD
:
1195 *params
= sampObj
->MinLod
;
1197 case GL_TEXTURE_MAX_LOD
:
1198 *params
= sampObj
->MaxLod
;
1200 case GL_TEXTURE_LOD_BIAS
:
1201 *params
= sampObj
->LodBias
;
1203 case GL_TEXTURE_COMPARE_MODE
:
1204 if (!ctx
->Extensions
.ARB_shadow
)
1206 *params
= (GLfloat
) sampObj
->CompareMode
;
1208 case GL_TEXTURE_COMPARE_FUNC
:
1209 if (!ctx
->Extensions
.ARB_shadow
)
1211 *params
= (GLfloat
) sampObj
->CompareFunc
;
1213 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1214 *params
= sampObj
->MaxAnisotropy
;
1216 case GL_TEXTURE_BORDER_COLOR
:
1217 params
[0] = sampObj
->BorderColor
.f
[0];
1218 params
[1] = sampObj
->BorderColor
.f
[1];
1219 params
[2] = sampObj
->BorderColor
.f
[2];
1220 params
[3] = sampObj
->BorderColor
.f
[3];
1222 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
1223 if (!ctx
->Extensions
.AMD_seamless_cubemap_per_texture
)
1225 *params
= (GLfloat
) sampObj
->CubeMapSeamless
;
1233 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetSamplerParameterfv(pname=%s)",
1234 _mesa_lookup_enum_by_nr(pname
));
1238 static void GLAPIENTRY
1239 _mesa_GetSamplerParameterIiv(GLuint sampler
, GLenum pname
, GLint
*params
)
1241 struct gl_sampler_object
*sampObj
;
1242 GET_CURRENT_CONTEXT(ctx
);
1244 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
1246 _mesa_error(ctx
, GL_INVALID_VALUE
,
1247 "glGetSamplerParameterIiv(sampler %u)",
1253 case GL_TEXTURE_WRAP_S
:
1254 *params
= sampObj
->WrapS
;
1256 case GL_TEXTURE_WRAP_T
:
1257 *params
= sampObj
->WrapT
;
1259 case GL_TEXTURE_WRAP_R
:
1260 *params
= sampObj
->WrapR
;
1262 case GL_TEXTURE_MIN_FILTER
:
1263 *params
= sampObj
->MinFilter
;
1265 case GL_TEXTURE_MAG_FILTER
:
1266 *params
= sampObj
->MagFilter
;
1268 case GL_TEXTURE_MIN_LOD
:
1269 *params
= (GLint
) sampObj
->MinLod
;
1271 case GL_TEXTURE_MAX_LOD
:
1272 *params
= (GLint
) sampObj
->MaxLod
;
1274 case GL_TEXTURE_LOD_BIAS
:
1275 *params
= (GLint
) sampObj
->LodBias
;
1277 case GL_TEXTURE_COMPARE_MODE
:
1278 if (!ctx
->Extensions
.ARB_shadow
)
1280 *params
= sampObj
->CompareMode
;
1282 case GL_TEXTURE_COMPARE_FUNC
:
1283 if (!ctx
->Extensions
.ARB_shadow
)
1285 *params
= sampObj
->CompareFunc
;
1287 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1288 *params
= (GLint
) sampObj
->MaxAnisotropy
;
1290 case GL_TEXTURE_BORDER_COLOR
:
1291 params
[0] = sampObj
->BorderColor
.i
[0];
1292 params
[1] = sampObj
->BorderColor
.i
[1];
1293 params
[2] = sampObj
->BorderColor
.i
[2];
1294 params
[3] = sampObj
->BorderColor
.i
[3];
1296 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
1297 if (!ctx
->Extensions
.AMD_seamless_cubemap_per_texture
)
1299 *params
= sampObj
->CubeMapSeamless
;
1307 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetSamplerParameterIiv(pname=%s)",
1308 _mesa_lookup_enum_by_nr(pname
));
1312 static void GLAPIENTRY
1313 _mesa_GetSamplerParameterIuiv(GLuint sampler
, GLenum pname
, GLuint
*params
)
1315 struct gl_sampler_object
*sampObj
;
1316 GET_CURRENT_CONTEXT(ctx
);
1318 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
1320 _mesa_error(ctx
, GL_INVALID_VALUE
,
1321 "glGetSamplerParameterIuiv(sampler %u)",
1327 case GL_TEXTURE_WRAP_S
:
1328 *params
= sampObj
->WrapS
;
1330 case GL_TEXTURE_WRAP_T
:
1331 *params
= sampObj
->WrapT
;
1333 case GL_TEXTURE_WRAP_R
:
1334 *params
= sampObj
->WrapR
;
1336 case GL_TEXTURE_MIN_FILTER
:
1337 *params
= sampObj
->MinFilter
;
1339 case GL_TEXTURE_MAG_FILTER
:
1340 *params
= sampObj
->MagFilter
;
1342 case GL_TEXTURE_MIN_LOD
:
1343 *params
= (GLuint
) sampObj
->MinLod
;
1345 case GL_TEXTURE_MAX_LOD
:
1346 *params
= (GLuint
) sampObj
->MaxLod
;
1348 case GL_TEXTURE_LOD_BIAS
:
1349 *params
= (GLuint
) sampObj
->LodBias
;
1351 case GL_TEXTURE_COMPARE_MODE
:
1352 if (!ctx
->Extensions
.ARB_shadow
)
1354 *params
= sampObj
->CompareMode
;
1356 case GL_TEXTURE_COMPARE_FUNC
:
1357 if (!ctx
->Extensions
.ARB_shadow
)
1359 *params
= sampObj
->CompareFunc
;
1361 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1362 *params
= (GLuint
) sampObj
->MaxAnisotropy
;
1364 case GL_TEXTURE_BORDER_COLOR
:
1365 params
[0] = sampObj
->BorderColor
.ui
[0];
1366 params
[1] = sampObj
->BorderColor
.ui
[1];
1367 params
[2] = sampObj
->BorderColor
.ui
[2];
1368 params
[3] = sampObj
->BorderColor
.ui
[3];
1370 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
1371 if (!ctx
->Extensions
.AMD_seamless_cubemap_per_texture
)
1373 *params
= sampObj
->CubeMapSeamless
;
1381 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetSamplerParameterIuiv(pname=%s)",
1382 _mesa_lookup_enum_by_nr(pname
));
1387 _mesa_init_sampler_object_functions(struct dd_function_table
*driver
)
1389 driver
->NewSamplerObject
= _mesa_new_sampler_object
;
1390 driver
->DeleteSamplerObject
= _mesa_delete_sampler_object
;
1395 _mesa_init_sampler_object_dispatch(struct _glapi_table
*disp
)
1397 SET_GenSamplers(disp
, _mesa_GenSamplers
);
1398 SET_DeleteSamplers(disp
, _mesa_DeleteSamplers
);
1399 SET_IsSampler(disp
, _mesa_IsSampler
);
1400 SET_BindSampler(disp
, _mesa_BindSampler
);
1401 SET_SamplerParameteri(disp
, _mesa_SamplerParameteri
);
1402 SET_SamplerParameterf(disp
, _mesa_SamplerParameterf
);
1403 SET_SamplerParameteriv(disp
, _mesa_SamplerParameteriv
);
1404 SET_SamplerParameterfv(disp
, _mesa_SamplerParameterfv
);
1405 SET_SamplerParameterIiv(disp
, _mesa_SamplerParameterIiv
);
1406 SET_SamplerParameterIuiv(disp
, _mesa_SamplerParameterIuiv
);
1407 SET_GetSamplerParameteriv(disp
, _mesa_GetSamplerParameteriv
);
1408 SET_GetSamplerParameterfv(disp
, _mesa_GetSamplerParameterfv
);
1409 SET_GetSamplerParameterIiv(disp
, _mesa_GetSamplerParameterIiv
);
1410 SET_GetSamplerParameterIuiv(disp
, _mesa_GetSamplerParameterIuiv
);