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
)
66 /* Unreference the old sampler */
67 GLboolean deleteFlag
= GL_FALSE
;
68 struct gl_sampler_object
*oldSamp
= *ptr
;
70 /*_glthread_LOCK_MUTEX(oldSamp->Mutex);*/
71 ASSERT(oldSamp
->RefCount
> 0);
74 printf("SamplerObj %p %d DECR to %d\n",
75 (void *) oldSamp
, oldSamp
->Name
, oldSamp
->RefCount
);
77 deleteFlag
= (oldSamp
->RefCount
== 0);
78 /*_glthread_UNLOCK_MUTEX(oldSamp->Mutex);*/
81 ASSERT(ctx
->Driver
.DeleteSamplerObject
);
82 ctx
->Driver
.DeleteSamplerObject(ctx
, oldSamp
);
90 /* reference new sampler */
91 /*_glthread_LOCK_MUTEX(samp->Mutex);*/
92 if (samp
->RefCount
== 0) {
93 /* this sampler's being deleted (look just above) */
94 /* Not sure this can every really happen. Warn if it does. */
95 _mesa_problem(NULL
, "referencing deleted sampler object");
101 printf("SamplerObj %p %d INCR to %d\n",
102 (void *) samp
, samp
->Name
, samp
->RefCount
);
106 /*_glthread_UNLOCK_MUTEX(samp->Mutex);*/
112 * Initialize the fields of the given sampler object.
115 _mesa_init_sampler_object(struct gl_sampler_object
*sampObj
, GLuint name
)
117 sampObj
->Name
= name
;
118 sampObj
->RefCount
= 1;
119 sampObj
->WrapS
= GL_REPEAT
;
120 sampObj
->WrapT
= GL_REPEAT
;
121 sampObj
->WrapR
= GL_REPEAT
;
122 sampObj
->MinFilter
= GL_NEAREST_MIPMAP_LINEAR
;
123 sampObj
->MagFilter
= GL_LINEAR
;
124 sampObj
->BorderColor
.f
[0] = 0.0;
125 sampObj
->BorderColor
.f
[1] = 0.0;
126 sampObj
->BorderColor
.f
[2] = 0.0;
127 sampObj
->BorderColor
.f
[3] = 0.0;
128 sampObj
->MinLod
= -1000.0F
;
129 sampObj
->MaxLod
= 1000.0F
;
130 sampObj
->LodBias
= 0.0F
;
131 sampObj
->MaxAnisotropy
= 1.0F
;
132 sampObj
->CompareMode
= GL_NONE
;
133 sampObj
->CompareFunc
= GL_LEQUAL
;
134 sampObj
->CompareFailValue
= 0.0;
135 sampObj
->sRGBDecode
= GL_DECODE_EXT
;
136 sampObj
->CubeMapSeamless
= GL_FALSE
;
137 sampObj
->DepthMode
= 0;
142 * Fallback for ctx->Driver.NewSamplerObject();
144 struct gl_sampler_object
*
145 _mesa_new_sampler_object(struct gl_context
*ctx
, GLuint name
)
147 struct gl_sampler_object
*sampObj
= CALLOC_STRUCT(gl_sampler_object
);
149 _mesa_init_sampler_object(sampObj
, name
);
156 * Fallback for ctx->Driver.DeleteSamplerObject();
159 _mesa_delete_sampler_object(struct gl_context
*ctx
,
160 struct gl_sampler_object
*sampObj
)
166 static void GLAPIENTRY
167 _mesa_GenSamplers(GLsizei count
, GLuint
*samplers
)
169 GET_CURRENT_CONTEXT(ctx
);
173 ASSERT_OUTSIDE_BEGIN_END(ctx
);
175 if (MESA_VERBOSE
& VERBOSE_API
)
176 _mesa_debug(ctx
, "glGenSamplers(%d)\n", count
);
179 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGenSamplers");
186 first
= _mesa_HashFindFreeKeyBlock(ctx
->Shared
->SamplerObjects
, count
);
188 /* Insert the ID and pointer to new sampler object into hash table */
189 for (i
= 0; i
< count
; i
++) {
190 struct gl_sampler_object
*sampObj
=
191 ctx
->Driver
.NewSamplerObject(ctx
, first
+ i
);
192 _mesa_HashInsert(ctx
->Shared
->SamplerObjects
, first
+ i
, sampObj
);
193 samplers
[i
] = first
+ i
;
198 static void GLAPIENTRY
199 _mesa_DeleteSamplers(GLsizei count
, const GLuint
*samplers
)
201 GET_CURRENT_CONTEXT(ctx
);
204 ASSERT_OUTSIDE_BEGIN_END(ctx
);
205 FLUSH_VERTICES(ctx
, 0);
208 _mesa_error(ctx
, GL_INVALID_VALUE
, "glDeleteSamplers(count)");
212 _glthread_LOCK_MUTEX(ctx
->Shared
->Mutex
);
214 for (i
= 0; i
< count
; i
++) {
216 struct gl_sampler_object
*sampObj
=
217 _mesa_lookup_samplerobj(ctx
, samplers
[i
]);
219 /* The ID is immediately freed for re-use */
220 _mesa_HashRemove(ctx
->Shared
->SamplerObjects
, samplers
[i
]);
221 /* But the object exists until its reference count goes to zero */
222 _mesa_reference_sampler_object(ctx
, &sampObj
, NULL
);
227 _glthread_UNLOCK_MUTEX(ctx
->Shared
->Mutex
);
231 static GLboolean GLAPIENTRY
232 _mesa_IsSampler(GLuint sampler
)
234 struct gl_sampler_object
*sampObj
;
235 GET_CURRENT_CONTEXT(ctx
);
237 ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx
, GL_FALSE
);
242 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
244 return sampObj
!= NULL
;
248 static void GLAPIENTRY
249 _mesa_BindSampler(GLuint unit
, GLuint sampler
)
251 struct gl_sampler_object
*sampObj
;
252 GET_CURRENT_CONTEXT(ctx
);
254 if (unit
>= ctx
->Const
.MaxCombinedTextureImageUnits
) {
255 _mesa_error(ctx
, GL_INVALID_VALUE
, "glBindSampler(unit %u)", unit
);
260 /* Use the default sampler object, the one contained in the texture
266 /* user-defined sampler object */
267 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
269 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glBindSampler(sampler)");
274 if (ctx
->Texture
.Unit
[unit
].Sampler
!= sampObj
) {
275 FLUSH_VERTICES(ctx
, _NEW_TEXTURE
);
278 /* bind new sampler */
279 _mesa_reference_sampler_object(ctx
, &ctx
->Texture
.Unit
[unit
].Sampler
,
285 * Check if a coordinate wrap mode is legal.
286 * \return GL_TRUE if legal, GL_FALSE otherwise
289 validate_texture_wrap_mode(struct gl_context
*ctx
, GLenum wrap
)
291 const struct gl_extensions
* const e
= &ctx
->Extensions
;
295 case GL_CLAMP_TO_EDGE
:
297 case GL_MIRRORED_REPEAT
:
299 case GL_CLAMP_TO_BORDER
:
300 return e
->ARB_texture_border_clamp
;
301 case GL_MIRROR_CLAMP_EXT
:
302 return e
->ATI_texture_mirror_once
|| e
->EXT_texture_mirror_clamp
;
303 case GL_MIRROR_CLAMP_TO_EDGE_EXT
:
304 return e
->ATI_texture_mirror_once
|| e
->EXT_texture_mirror_clamp
;
305 case GL_MIRROR_CLAMP_TO_BORDER_EXT
:
306 return e
->EXT_texture_mirror_clamp
;
314 * This is called just prior to changing any sampler object state.
317 flush(struct gl_context
*ctx
)
319 FLUSH_VERTICES(ctx
, _NEW_TEXTURE
);
323 #define INVALID_PARAM 0x100
324 #define INVALID_PNAME 0x101
325 #define INVALID_VALUE 0x102
328 set_sampler_wrap_s(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
331 if (samp
->WrapS
== param
)
333 if (validate_texture_wrap_mode(ctx
, param
)) {
338 return INVALID_PARAM
;
343 set_sampler_wrap_t(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
346 if (samp
->WrapT
== param
)
348 if (validate_texture_wrap_mode(ctx
, param
)) {
353 return INVALID_PARAM
;
358 set_sampler_wrap_r(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
361 if (samp
->WrapR
== param
)
363 if (validate_texture_wrap_mode(ctx
, param
)) {
368 return INVALID_PARAM
;
373 set_sampler_min_filter(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
376 if (samp
->MinFilter
== param
)
382 case GL_NEAREST_MIPMAP_NEAREST
:
383 case GL_LINEAR_MIPMAP_NEAREST
:
384 case GL_NEAREST_MIPMAP_LINEAR
:
385 case GL_LINEAR_MIPMAP_LINEAR
:
387 samp
->MinFilter
= param
;
390 return INVALID_PARAM
;
396 set_sampler_mag_filter(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
399 if (samp
->MagFilter
== param
)
406 samp
->MagFilter
= param
;
409 return INVALID_PARAM
;
415 set_sampler_lod_bias(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
418 if (samp
->LodBias
== param
)
422 samp
->LodBias
= param
;
428 set_sampler_border_colorf(struct gl_context
*ctx
,
429 struct gl_sampler_object
*samp
,
430 const GLfloat params
[4])
433 samp
->BorderColor
.f
[RCOMP
] = params
[0];
434 samp
->BorderColor
.f
[GCOMP
] = params
[1];
435 samp
->BorderColor
.f
[BCOMP
] = params
[2];
436 samp
->BorderColor
.f
[ACOMP
] = params
[3];
442 set_sampler_border_colori(struct gl_context
*ctx
,
443 struct gl_sampler_object
*samp
,
444 const GLint params
[4])
447 samp
->BorderColor
.i
[RCOMP
] = params
[0];
448 samp
->BorderColor
.i
[GCOMP
] = params
[1];
449 samp
->BorderColor
.i
[BCOMP
] = params
[2];
450 samp
->BorderColor
.i
[ACOMP
] = params
[3];
456 set_sampler_border_colorui(struct gl_context
*ctx
,
457 struct gl_sampler_object
*samp
,
458 const GLuint params
[4])
461 samp
->BorderColor
.ui
[RCOMP
] = params
[0];
462 samp
->BorderColor
.ui
[GCOMP
] = params
[1];
463 samp
->BorderColor
.ui
[BCOMP
] = params
[2];
464 samp
->BorderColor
.ui
[ACOMP
] = params
[3];
470 set_sampler_min_lod(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
473 if (samp
->MinLod
== param
)
477 samp
->MinLod
= param
;
483 set_sampler_max_lod(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
486 if (samp
->MaxLod
== param
)
490 samp
->MaxLod
= param
;
496 set_sampler_compare_mode(struct gl_context
*ctx
,
497 struct gl_sampler_object
*samp
, GLint param
)
499 if (!ctx
->Extensions
.ARB_shadow
)
500 return INVALID_PNAME
;
502 if (samp
->CompareMode
== param
)
505 if (param
== GL_NONE
||
506 param
== GL_COMPARE_R_TO_TEXTURE_ARB
) {
508 samp
->CompareMode
= param
;
512 return INVALID_PARAM
;
517 set_sampler_compare_func(struct gl_context
*ctx
,
518 struct gl_sampler_object
*samp
, GLint param
)
520 if (!ctx
->Extensions
.ARB_shadow
)
521 return INVALID_PNAME
;
523 if (samp
->CompareFunc
== param
)
530 samp
->CompareFunc
= param
;
538 if (ctx
->Extensions
.EXT_shadow_funcs
) {
540 samp
->CompareFunc
= param
;
545 return INVALID_PARAM
;
551 set_sampler_max_anisotropy(struct gl_context
*ctx
,
552 struct gl_sampler_object
*samp
, GLfloat param
)
554 if (!ctx
->Extensions
.EXT_texture_filter_anisotropic
)
555 return INVALID_PNAME
;
557 if (samp
->MaxAnisotropy
== param
)
561 return INVALID_VALUE
;
564 /* clamp to max, that's what NVIDIA does */
565 samp
->MaxAnisotropy
= MIN2(param
, ctx
->Const
.MaxTextureMaxAnisotropy
);
571 set_sampler_cube_map_seamless(struct gl_context
*ctx
,
572 struct gl_sampler_object
*samp
, GLboolean param
)
574 if (!ctx
->Extensions
.AMD_seamless_cubemap_per_texture
)
575 return INVALID_PNAME
;
577 if (samp
->CubeMapSeamless
== param
)
580 if (param
!= GL_TRUE
&& param
!= GL_FALSE
)
581 return INVALID_VALUE
;
584 samp
->CubeMapSeamless
= param
;
589 static void GLAPIENTRY
590 _mesa_SamplerParameteri(GLuint sampler
, GLenum pname
, GLint param
)
592 struct gl_sampler_object
*sampObj
;
594 GET_CURRENT_CONTEXT(ctx
);
596 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
598 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameteri(sampler %u)",
604 case GL_TEXTURE_WRAP_S
:
605 res
= set_sampler_wrap_s(ctx
, sampObj
, param
);
607 case GL_TEXTURE_WRAP_T
:
608 res
= set_sampler_wrap_t(ctx
, sampObj
, param
);
610 case GL_TEXTURE_WRAP_R
:
611 res
= set_sampler_wrap_r(ctx
, sampObj
, param
);
613 case GL_TEXTURE_MIN_FILTER
:
614 res
= set_sampler_min_filter(ctx
, sampObj
, param
);
616 case GL_TEXTURE_MAG_FILTER
:
617 res
= set_sampler_mag_filter(ctx
, sampObj
, param
);
619 case GL_TEXTURE_MIN_LOD
:
620 res
= set_sampler_min_lod(ctx
, sampObj
, (GLfloat
) param
);
622 case GL_TEXTURE_MAX_LOD
:
623 res
= set_sampler_max_lod(ctx
, sampObj
, (GLfloat
) param
);
625 case GL_TEXTURE_LOD_BIAS
:
626 res
= set_sampler_lod_bias(ctx
, sampObj
, (GLfloat
) param
);
628 case GL_TEXTURE_COMPARE_MODE
:
629 res
= set_sampler_compare_mode(ctx
, sampObj
, param
);
631 case GL_TEXTURE_COMPARE_FUNC
:
632 res
= set_sampler_compare_func(ctx
, sampObj
, param
);
634 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
635 res
= set_sampler_max_anisotropy(ctx
, sampObj
, (GLfloat
) param
);
637 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
638 res
= set_sampler_cube_map_seamless(ctx
, sampObj
, param
);
640 case GL_TEXTURE_BORDER_COLOR
:
651 /* state change - we do nothing special at this time */
654 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameteri(pname=%s)\n",
655 _mesa_lookup_enum_by_nr(pname
));
658 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameteri(param=%d)\n",
662 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameteri(param=%d)\n",
671 static void GLAPIENTRY
672 _mesa_SamplerParameterf(GLuint sampler
, GLenum pname
, GLfloat param
)
674 struct gl_sampler_object
*sampObj
;
676 GET_CURRENT_CONTEXT(ctx
);
678 ASSERT_OUTSIDE_BEGIN_END(ctx
);
680 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
682 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterf(sampler %u)",
688 case GL_TEXTURE_WRAP_S
:
689 res
= set_sampler_wrap_s(ctx
, sampObj
, (GLint
) param
);
691 case GL_TEXTURE_WRAP_T
:
692 res
= set_sampler_wrap_t(ctx
, sampObj
, (GLint
) param
);
694 case GL_TEXTURE_WRAP_R
:
695 res
= set_sampler_wrap_r(ctx
, sampObj
, (GLint
) param
);
697 case GL_TEXTURE_MIN_FILTER
:
698 res
= set_sampler_min_filter(ctx
, sampObj
, (GLint
) param
);
700 case GL_TEXTURE_MAG_FILTER
:
701 res
= set_sampler_mag_filter(ctx
, sampObj
, (GLint
) param
);
703 case GL_TEXTURE_MIN_LOD
:
704 res
= set_sampler_min_lod(ctx
, sampObj
, param
);
706 case GL_TEXTURE_MAX_LOD
:
707 res
= set_sampler_max_lod(ctx
, sampObj
, param
);
709 case GL_TEXTURE_LOD_BIAS
:
710 res
= set_sampler_lod_bias(ctx
, sampObj
, param
);
712 case GL_TEXTURE_COMPARE_MODE
:
713 res
= set_sampler_compare_mode(ctx
, sampObj
, (GLint
) param
);
715 case GL_TEXTURE_COMPARE_FUNC
:
716 res
= set_sampler_compare_func(ctx
, sampObj
, (GLint
) param
);
718 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
719 res
= set_sampler_max_anisotropy(ctx
, sampObj
, param
);
721 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
722 res
= set_sampler_cube_map_seamless(ctx
, sampObj
, (GLboolean
) param
);
724 case GL_TEXTURE_BORDER_COLOR
:
735 /* state change - we do nothing special at this time */
738 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterf(pname=%s)\n",
739 _mesa_lookup_enum_by_nr(pname
));
742 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterf(param=%f)\n",
746 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterf(param=%f)\n",
754 static void GLAPIENTRY
755 _mesa_SamplerParameteriv(GLuint sampler
, GLenum pname
, const GLint
*params
)
757 struct gl_sampler_object
*sampObj
;
759 GET_CURRENT_CONTEXT(ctx
);
761 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
763 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameteriv(sampler %u)",
769 case GL_TEXTURE_WRAP_S
:
770 res
= set_sampler_wrap_s(ctx
, sampObj
, params
[0]);
772 case GL_TEXTURE_WRAP_T
:
773 res
= set_sampler_wrap_t(ctx
, sampObj
, params
[0]);
775 case GL_TEXTURE_WRAP_R
:
776 res
= set_sampler_wrap_r(ctx
, sampObj
, params
[0]);
778 case GL_TEXTURE_MIN_FILTER
:
779 res
= set_sampler_min_filter(ctx
, sampObj
, params
[0]);
781 case GL_TEXTURE_MAG_FILTER
:
782 res
= set_sampler_mag_filter(ctx
, sampObj
, params
[0]);
784 case GL_TEXTURE_MIN_LOD
:
785 res
= set_sampler_min_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
787 case GL_TEXTURE_MAX_LOD
:
788 res
= set_sampler_max_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
790 case GL_TEXTURE_LOD_BIAS
:
791 res
= set_sampler_lod_bias(ctx
, sampObj
, (GLfloat
) params
[0]);
793 case GL_TEXTURE_COMPARE_MODE
:
794 res
= set_sampler_compare_mode(ctx
, sampObj
, params
[0]);
796 case GL_TEXTURE_COMPARE_FUNC
:
797 res
= set_sampler_compare_func(ctx
, sampObj
, params
[0]);
799 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
800 res
= set_sampler_max_anisotropy(ctx
, sampObj
, (GLfloat
) params
[0]);
802 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
803 res
= set_sampler_cube_map_seamless(ctx
, sampObj
, params
[0]);
805 case GL_TEXTURE_BORDER_COLOR
:
808 c
[0] = INT_TO_FLOAT(params
[0]);
809 c
[1] = INT_TO_FLOAT(params
[1]);
810 c
[2] = INT_TO_FLOAT(params
[2]);
811 c
[3] = INT_TO_FLOAT(params
[3]);
812 res
= set_sampler_border_colorf(ctx
, sampObj
, c
);
824 /* state change - we do nothing special at this time */
827 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameteriv(pname=%s)\n",
828 _mesa_lookup_enum_by_nr(pname
));
831 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameteriv(param=%d)\n",
835 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameteriv(param=%d)\n",
843 static void GLAPIENTRY
844 _mesa_SamplerParameterfv(GLuint sampler
, GLenum pname
, const GLfloat
*params
)
846 struct gl_sampler_object
*sampObj
;
848 GET_CURRENT_CONTEXT(ctx
);
850 ASSERT_OUTSIDE_BEGIN_END(ctx
);
852 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
854 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterfv(sampler %u)",
860 case GL_TEXTURE_WRAP_S
:
861 res
= set_sampler_wrap_s(ctx
, sampObj
, (GLint
) params
[0]);
863 case GL_TEXTURE_WRAP_T
:
864 res
= set_sampler_wrap_t(ctx
, sampObj
, (GLint
) params
[0]);
866 case GL_TEXTURE_WRAP_R
:
867 res
= set_sampler_wrap_r(ctx
, sampObj
, (GLint
) params
[0]);
869 case GL_TEXTURE_MIN_FILTER
:
870 res
= set_sampler_min_filter(ctx
, sampObj
, (GLint
) params
[0]);
872 case GL_TEXTURE_MAG_FILTER
:
873 res
= set_sampler_mag_filter(ctx
, sampObj
, (GLint
) params
[0]);
875 case GL_TEXTURE_MIN_LOD
:
876 res
= set_sampler_min_lod(ctx
, sampObj
, params
[0]);
878 case GL_TEXTURE_MAX_LOD
:
879 res
= set_sampler_max_lod(ctx
, sampObj
, params
[0]);
881 case GL_TEXTURE_LOD_BIAS
:
882 res
= set_sampler_lod_bias(ctx
, sampObj
, params
[0]);
884 case GL_TEXTURE_COMPARE_MODE
:
885 res
= set_sampler_compare_mode(ctx
, sampObj
, (GLint
) params
[0]);
887 case GL_TEXTURE_COMPARE_FUNC
:
888 res
= set_sampler_compare_func(ctx
, sampObj
, (GLint
) params
[0]);
890 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
891 res
= set_sampler_max_anisotropy(ctx
, sampObj
, params
[0]);
893 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
894 res
= set_sampler_cube_map_seamless(ctx
, sampObj
, (GLboolean
) params
[0]);
896 case GL_TEXTURE_BORDER_COLOR
:
897 res
= set_sampler_border_colorf(ctx
, sampObj
, params
);
908 /* state change - we do nothing special at this time */
911 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterfv(pname=%s)\n",
912 _mesa_lookup_enum_by_nr(pname
));
915 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterfv(param=%f)\n",
919 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterfv(param=%f)\n",
927 static void GLAPIENTRY
928 _mesa_SamplerParameterIiv(GLuint sampler
, GLenum pname
, const GLint
*params
)
930 struct gl_sampler_object
*sampObj
;
932 GET_CURRENT_CONTEXT(ctx
);
934 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
936 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterIiv(sampler %u)",
942 case GL_TEXTURE_WRAP_S
:
943 res
= set_sampler_wrap_s(ctx
, sampObj
, params
[0]);
945 case GL_TEXTURE_WRAP_T
:
946 res
= set_sampler_wrap_t(ctx
, sampObj
, params
[0]);
948 case GL_TEXTURE_WRAP_R
:
949 res
= set_sampler_wrap_r(ctx
, sampObj
, params
[0]);
951 case GL_TEXTURE_MIN_FILTER
:
952 res
= set_sampler_min_filter(ctx
, sampObj
, params
[0]);
954 case GL_TEXTURE_MAG_FILTER
:
955 res
= set_sampler_mag_filter(ctx
, sampObj
, params
[0]);
957 case GL_TEXTURE_MIN_LOD
:
958 res
= set_sampler_min_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
960 case GL_TEXTURE_MAX_LOD
:
961 res
= set_sampler_max_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
963 case GL_TEXTURE_LOD_BIAS
:
964 res
= set_sampler_lod_bias(ctx
, sampObj
, (GLfloat
) params
[0]);
966 case GL_TEXTURE_COMPARE_MODE
:
967 res
= set_sampler_compare_mode(ctx
, sampObj
, params
[0]);
969 case GL_TEXTURE_COMPARE_FUNC
:
970 res
= set_sampler_compare_func(ctx
, sampObj
, params
[0]);
972 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
973 res
= set_sampler_max_anisotropy(ctx
, sampObj
, (GLfloat
) params
[0]);
975 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
976 res
= set_sampler_cube_map_seamless(ctx
, sampObj
, params
[0]);
978 case GL_TEXTURE_BORDER_COLOR
:
979 res
= set_sampler_border_colori(ctx
, sampObj
, params
);
990 /* state change - we do nothing special at this time */
993 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterIiv(pname=%s)\n",
994 _mesa_lookup_enum_by_nr(pname
));
997 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterIiv(param=%d)\n",
1001 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterIiv(param=%d)\n",
1010 static void GLAPIENTRY
1011 _mesa_SamplerParameterIuiv(GLuint sampler
, GLenum pname
, const GLuint
*params
)
1013 struct gl_sampler_object
*sampObj
;
1015 GET_CURRENT_CONTEXT(ctx
);
1017 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
1019 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterIuiv(sampler %u)",
1025 case GL_TEXTURE_WRAP_S
:
1026 res
= set_sampler_wrap_s(ctx
, sampObj
, params
[0]);
1028 case GL_TEXTURE_WRAP_T
:
1029 res
= set_sampler_wrap_t(ctx
, sampObj
, params
[0]);
1031 case GL_TEXTURE_WRAP_R
:
1032 res
= set_sampler_wrap_r(ctx
, sampObj
, params
[0]);
1034 case GL_TEXTURE_MIN_FILTER
:
1035 res
= set_sampler_min_filter(ctx
, sampObj
, params
[0]);
1037 case GL_TEXTURE_MAG_FILTER
:
1038 res
= set_sampler_mag_filter(ctx
, sampObj
, params
[0]);
1040 case GL_TEXTURE_MIN_LOD
:
1041 res
= set_sampler_min_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
1043 case GL_TEXTURE_MAX_LOD
:
1044 res
= set_sampler_max_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
1046 case GL_TEXTURE_LOD_BIAS
:
1047 res
= set_sampler_lod_bias(ctx
, sampObj
, (GLfloat
) params
[0]);
1049 case GL_TEXTURE_COMPARE_MODE
:
1050 res
= set_sampler_compare_mode(ctx
, sampObj
, params
[0]);
1052 case GL_TEXTURE_COMPARE_FUNC
:
1053 res
= set_sampler_compare_func(ctx
, sampObj
, params
[0]);
1055 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1056 res
= set_sampler_max_anisotropy(ctx
, sampObj
, (GLfloat
) params
[0]);
1058 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
1059 res
= set_sampler_cube_map_seamless(ctx
, sampObj
, params
[0]);
1061 case GL_TEXTURE_BORDER_COLOR
:
1062 res
= set_sampler_border_colorui(ctx
, sampObj
, params
);
1065 res
= INVALID_PNAME
;
1073 /* state change - we do nothing special at this time */
1076 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterIuiv(pname=%s)\n",
1077 _mesa_lookup_enum_by_nr(pname
));
1080 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterIuiv(param=%u)\n",
1084 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterIuiv(param=%u)\n",
1093 static void GLAPIENTRY
1094 _mesa_GetSamplerParameteriv(GLuint sampler
, GLenum pname
, GLint
*params
)
1096 struct gl_sampler_object
*sampObj
;
1097 GET_CURRENT_CONTEXT(ctx
);
1099 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
1101 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetSamplerParameteriv(sampler %u)",
1107 case GL_TEXTURE_WRAP_S
:
1108 *params
= sampObj
->WrapS
;
1110 case GL_TEXTURE_WRAP_T
:
1111 *params
= sampObj
->WrapT
;
1113 case GL_TEXTURE_WRAP_R
:
1114 *params
= sampObj
->WrapR
;
1116 case GL_TEXTURE_MIN_FILTER
:
1117 *params
= sampObj
->MinFilter
;
1119 case GL_TEXTURE_MAG_FILTER
:
1120 *params
= sampObj
->MagFilter
;
1122 case GL_TEXTURE_MIN_LOD
:
1123 *params
= (GLint
) sampObj
->MinLod
;
1125 case GL_TEXTURE_MAX_LOD
:
1126 *params
= (GLint
) sampObj
->MaxLod
;
1128 case GL_TEXTURE_LOD_BIAS
:
1129 *params
= (GLint
) sampObj
->LodBias
;
1131 case GL_TEXTURE_COMPARE_MODE
:
1132 if (!ctx
->Extensions
.ARB_shadow
)
1134 *params
= sampObj
->CompareMode
;
1136 case GL_TEXTURE_COMPARE_FUNC
:
1137 if (!ctx
->Extensions
.ARB_shadow
)
1139 *params
= sampObj
->CompareFunc
;
1141 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1142 *params
= (GLint
) sampObj
->MaxAnisotropy
;
1144 case GL_TEXTURE_BORDER_COLOR
:
1145 params
[0] = FLOAT_TO_INT(sampObj
->BorderColor
.f
[0]);
1146 params
[1] = FLOAT_TO_INT(sampObj
->BorderColor
.f
[1]);
1147 params
[2] = FLOAT_TO_INT(sampObj
->BorderColor
.f
[2]);
1148 params
[3] = FLOAT_TO_INT(sampObj
->BorderColor
.f
[3]);
1150 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
1151 if (!ctx
->Extensions
.AMD_seamless_cubemap_per_texture
)
1153 *params
= sampObj
->CubeMapSeamless
;
1161 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetSamplerParameteriv(pname=%s)",
1162 _mesa_lookup_enum_by_nr(pname
));
1166 static void GLAPIENTRY
1167 _mesa_GetSamplerParameterfv(GLuint sampler
, GLenum pname
, GLfloat
*params
)
1169 struct gl_sampler_object
*sampObj
;
1170 GET_CURRENT_CONTEXT(ctx
);
1172 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
1174 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetSamplerParameterfv(sampler %u)",
1180 case GL_TEXTURE_WRAP_S
:
1181 *params
= (GLfloat
) sampObj
->WrapS
;
1183 case GL_TEXTURE_WRAP_T
:
1184 *params
= (GLfloat
) sampObj
->WrapT
;
1186 case GL_TEXTURE_WRAP_R
:
1187 *params
= (GLfloat
) sampObj
->WrapR
;
1189 case GL_TEXTURE_MIN_FILTER
:
1190 *params
= (GLfloat
) sampObj
->MinFilter
;
1192 case GL_TEXTURE_MAG_FILTER
:
1193 *params
= (GLfloat
) sampObj
->MagFilter
;
1195 case GL_TEXTURE_MIN_LOD
:
1196 *params
= sampObj
->MinLod
;
1198 case GL_TEXTURE_MAX_LOD
:
1199 *params
= sampObj
->MaxLod
;
1201 case GL_TEXTURE_LOD_BIAS
:
1202 *params
= sampObj
->LodBias
;
1204 case GL_TEXTURE_COMPARE_MODE
:
1205 if (!ctx
->Extensions
.ARB_shadow
)
1207 *params
= (GLfloat
) sampObj
->CompareMode
;
1209 case GL_TEXTURE_COMPARE_FUNC
:
1210 if (!ctx
->Extensions
.ARB_shadow
)
1212 *params
= (GLfloat
) sampObj
->CompareFunc
;
1214 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1215 *params
= sampObj
->MaxAnisotropy
;
1217 case GL_TEXTURE_BORDER_COLOR
:
1218 params
[0] = sampObj
->BorderColor
.f
[0];
1219 params
[1] = sampObj
->BorderColor
.f
[1];
1220 params
[2] = sampObj
->BorderColor
.f
[2];
1221 params
[3] = sampObj
->BorderColor
.f
[3];
1223 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
1224 if (!ctx
->Extensions
.AMD_seamless_cubemap_per_texture
)
1226 *params
= (GLfloat
) sampObj
->CubeMapSeamless
;
1234 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetSamplerParameterfv(pname=%s)",
1235 _mesa_lookup_enum_by_nr(pname
));
1239 static void GLAPIENTRY
1240 _mesa_GetSamplerParameterIiv(GLuint sampler
, GLenum pname
, GLint
*params
)
1242 struct gl_sampler_object
*sampObj
;
1243 GET_CURRENT_CONTEXT(ctx
);
1245 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
1247 _mesa_error(ctx
, GL_INVALID_VALUE
,
1248 "glGetSamplerParameterIiv(sampler %u)",
1254 case GL_TEXTURE_WRAP_S
:
1255 *params
= sampObj
->WrapS
;
1257 case GL_TEXTURE_WRAP_T
:
1258 *params
= sampObj
->WrapT
;
1260 case GL_TEXTURE_WRAP_R
:
1261 *params
= sampObj
->WrapR
;
1263 case GL_TEXTURE_MIN_FILTER
:
1264 *params
= sampObj
->MinFilter
;
1266 case GL_TEXTURE_MAG_FILTER
:
1267 *params
= sampObj
->MagFilter
;
1269 case GL_TEXTURE_MIN_LOD
:
1270 *params
= (GLint
) sampObj
->MinLod
;
1272 case GL_TEXTURE_MAX_LOD
:
1273 *params
= (GLint
) sampObj
->MaxLod
;
1275 case GL_TEXTURE_LOD_BIAS
:
1276 *params
= (GLint
) sampObj
->LodBias
;
1278 case GL_TEXTURE_COMPARE_MODE
:
1279 if (!ctx
->Extensions
.ARB_shadow
)
1281 *params
= sampObj
->CompareMode
;
1283 case GL_TEXTURE_COMPARE_FUNC
:
1284 if (!ctx
->Extensions
.ARB_shadow
)
1286 *params
= sampObj
->CompareFunc
;
1288 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1289 *params
= (GLint
) sampObj
->MaxAnisotropy
;
1291 case GL_TEXTURE_BORDER_COLOR
:
1292 params
[0] = sampObj
->BorderColor
.i
[0];
1293 params
[1] = sampObj
->BorderColor
.i
[1];
1294 params
[2] = sampObj
->BorderColor
.i
[2];
1295 params
[3] = sampObj
->BorderColor
.i
[3];
1297 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
1298 if (!ctx
->Extensions
.AMD_seamless_cubemap_per_texture
)
1300 *params
= sampObj
->CubeMapSeamless
;
1308 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetSamplerParameterIiv(pname=%s)",
1309 _mesa_lookup_enum_by_nr(pname
));
1313 static void GLAPIENTRY
1314 _mesa_GetSamplerParameterIuiv(GLuint sampler
, GLenum pname
, GLuint
*params
)
1316 struct gl_sampler_object
*sampObj
;
1317 GET_CURRENT_CONTEXT(ctx
);
1319 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
1321 _mesa_error(ctx
, GL_INVALID_VALUE
,
1322 "glGetSamplerParameterIuiv(sampler %u)",
1328 case GL_TEXTURE_WRAP_S
:
1329 *params
= sampObj
->WrapS
;
1331 case GL_TEXTURE_WRAP_T
:
1332 *params
= sampObj
->WrapT
;
1334 case GL_TEXTURE_WRAP_R
:
1335 *params
= sampObj
->WrapR
;
1337 case GL_TEXTURE_MIN_FILTER
:
1338 *params
= sampObj
->MinFilter
;
1340 case GL_TEXTURE_MAG_FILTER
:
1341 *params
= sampObj
->MagFilter
;
1343 case GL_TEXTURE_MIN_LOD
:
1344 *params
= (GLuint
) sampObj
->MinLod
;
1346 case GL_TEXTURE_MAX_LOD
:
1347 *params
= (GLuint
) sampObj
->MaxLod
;
1349 case GL_TEXTURE_LOD_BIAS
:
1350 *params
= (GLuint
) sampObj
->LodBias
;
1352 case GL_TEXTURE_COMPARE_MODE
:
1353 if (!ctx
->Extensions
.ARB_shadow
)
1355 *params
= sampObj
->CompareMode
;
1357 case GL_TEXTURE_COMPARE_FUNC
:
1358 if (!ctx
->Extensions
.ARB_shadow
)
1360 *params
= sampObj
->CompareFunc
;
1362 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1363 *params
= (GLuint
) sampObj
->MaxAnisotropy
;
1365 case GL_TEXTURE_BORDER_COLOR
:
1366 params
[0] = sampObj
->BorderColor
.ui
[0];
1367 params
[1] = sampObj
->BorderColor
.ui
[1];
1368 params
[2] = sampObj
->BorderColor
.ui
[2];
1369 params
[3] = sampObj
->BorderColor
.ui
[3];
1371 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
1372 if (!ctx
->Extensions
.AMD_seamless_cubemap_per_texture
)
1374 *params
= sampObj
->CubeMapSeamless
;
1382 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetSamplerParameterIuiv(pname=%s)",
1383 _mesa_lookup_enum_by_nr(pname
));
1388 _mesa_init_sampler_object_functions(struct dd_function_table
*driver
)
1390 driver
->NewSamplerObject
= _mesa_new_sampler_object
;
1391 driver
->DeleteSamplerObject
= _mesa_delete_sampler_object
;
1396 _mesa_init_sampler_object_dispatch(struct _glapi_table
*disp
)
1398 SET_GenSamplers(disp
, _mesa_GenSamplers
);
1399 SET_DeleteSamplers(disp
, _mesa_DeleteSamplers
);
1400 SET_IsSampler(disp
, _mesa_IsSampler
);
1401 SET_BindSampler(disp
, _mesa_BindSampler
);
1402 SET_SamplerParameteri(disp
, _mesa_SamplerParameteri
);
1403 SET_SamplerParameterf(disp
, _mesa_SamplerParameterf
);
1404 SET_SamplerParameteriv(disp
, _mesa_SamplerParameteriv
);
1405 SET_SamplerParameterfv(disp
, _mesa_SamplerParameterfv
);
1406 SET_SamplerParameterIiv(disp
, _mesa_SamplerParameterIiv
);
1407 SET_SamplerParameterIuiv(disp
, _mesa_SamplerParameterIuiv
);
1408 SET_GetSamplerParameteriv(disp
, _mesa_GetSamplerParameteriv
);
1409 SET_GetSamplerParameterfv(disp
, _mesa_GetSamplerParameterfv
);
1410 SET_GetSamplerParameterIiv(disp
, _mesa_GetSamplerParameterIiv
);
1411 SET_GetSamplerParameterIuiv(disp
, _mesa_GetSamplerParameterIuiv
);