2 * Mesa 3-D graphics library
4 * Copyright (C) 2011 VMware, Inc. All Rights Reserved.
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
20 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 * \brief Functions for the GL_ARB_sampler_objects extension.
32 #include "main/glheader.h"
33 #include "main/context.h"
34 #include "main/dispatch.h"
35 #include "main/enums.h"
36 #include "main/hash.h"
37 #include "main/macros.h"
38 #include "main/mfeatures.h"
39 #include "main/mtypes.h"
40 #include "main/samplerobj.h"
43 static struct gl_sampler_object
*
44 _mesa_lookup_samplerobj(struct gl_context
*ctx
, GLuint name
)
49 return (struct gl_sampler_object
*)
50 _mesa_HashLookup(ctx
->Shared
->SamplerObjects
, name
);
55 * Handle reference counting.
58 _mesa_reference_sampler_object_(struct gl_context
*ctx
,
59 struct gl_sampler_object
**ptr
,
60 struct gl_sampler_object
*samp
)
62 assert(*ptr
!= samp
); /* The inline wrapper should prevent no-op calls */
65 /* Unreference the old sampler */
66 GLboolean deleteFlag
= GL_FALSE
;
67 struct gl_sampler_object
*oldSamp
= *ptr
;
69 /*_glthread_LOCK_MUTEX(oldSamp->Mutex);*/
70 ASSERT(oldSamp
->RefCount
> 0);
73 printf("SamplerObj %p %d DECR to %d\n",
74 (void *) oldSamp
, oldSamp
->Name
, oldSamp
->RefCount
);
76 deleteFlag
= (oldSamp
->RefCount
== 0);
77 /*_glthread_UNLOCK_MUTEX(oldSamp->Mutex);*/
80 ASSERT(ctx
->Driver
.DeleteSamplerObject
);
81 ctx
->Driver
.DeleteSamplerObject(ctx
, oldSamp
);
89 /* reference new sampler */
90 /*_glthread_LOCK_MUTEX(samp->Mutex);*/
91 if (samp
->RefCount
== 0) {
92 /* this sampler's being deleted (look just above) */
93 /* Not sure this can every really happen. Warn if it does. */
94 _mesa_problem(NULL
, "referencing deleted sampler object");
100 printf("SamplerObj %p %d INCR to %d\n",
101 (void *) samp
, samp
->Name
, samp
->RefCount
);
105 /*_glthread_UNLOCK_MUTEX(samp->Mutex);*/
111 * Initialize the fields of the given sampler object.
114 _mesa_init_sampler_object(struct gl_sampler_object
*sampObj
, GLuint name
)
116 sampObj
->Name
= name
;
117 sampObj
->RefCount
= 1;
118 sampObj
->WrapS
= GL_REPEAT
;
119 sampObj
->WrapT
= GL_REPEAT
;
120 sampObj
->WrapR
= GL_REPEAT
;
121 sampObj
->MinFilter
= GL_NEAREST_MIPMAP_LINEAR
;
122 sampObj
->MagFilter
= GL_LINEAR
;
123 sampObj
->BorderColor
.f
[0] = 0.0;
124 sampObj
->BorderColor
.f
[1] = 0.0;
125 sampObj
->BorderColor
.f
[2] = 0.0;
126 sampObj
->BorderColor
.f
[3] = 0.0;
127 sampObj
->MinLod
= -1000.0F
;
128 sampObj
->MaxLod
= 1000.0F
;
129 sampObj
->LodBias
= 0.0F
;
130 sampObj
->MaxAnisotropy
= 1.0F
;
131 sampObj
->CompareMode
= GL_NONE
;
132 sampObj
->CompareFunc
= GL_LEQUAL
;
133 sampObj
->sRGBDecode
= GL_DECODE_EXT
;
134 sampObj
->CubeMapSeamless
= GL_FALSE
;
138 * Fallback for ctx->Driver.NewSamplerObject();
140 struct gl_sampler_object
*
141 _mesa_new_sampler_object(struct gl_context
*ctx
, GLuint name
)
143 struct gl_sampler_object
*sampObj
= CALLOC_STRUCT(gl_sampler_object
);
145 _mesa_init_sampler_object(sampObj
, name
);
152 * Fallback for ctx->Driver.DeleteSamplerObject();
155 _mesa_delete_sampler_object(struct gl_context
*ctx
,
156 struct gl_sampler_object
*sampObj
)
163 _mesa_GenSamplers(GLsizei count
, GLuint
*samplers
)
165 GET_CURRENT_CONTEXT(ctx
);
169 if (MESA_VERBOSE
& VERBOSE_API
)
170 _mesa_debug(ctx
, "glGenSamplers(%d)\n", count
);
173 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGenSamplers");
180 first
= _mesa_HashFindFreeKeyBlock(ctx
->Shared
->SamplerObjects
, count
);
182 /* Insert the ID and pointer to new sampler object into hash table */
183 for (i
= 0; i
< count
; i
++) {
184 struct gl_sampler_object
*sampObj
=
185 ctx
->Driver
.NewSamplerObject(ctx
, first
+ i
);
186 _mesa_HashInsert(ctx
->Shared
->SamplerObjects
, first
+ i
, sampObj
);
187 samplers
[i
] = first
+ i
;
193 _mesa_DeleteSamplers(GLsizei count
, const GLuint
*samplers
)
195 GET_CURRENT_CONTEXT(ctx
);
198 FLUSH_VERTICES(ctx
, 0);
201 _mesa_error(ctx
, GL_INVALID_VALUE
, "glDeleteSamplers(count)");
205 _glthread_LOCK_MUTEX(ctx
->Shared
->Mutex
);
207 for (i
= 0; i
< count
; i
++) {
209 struct gl_sampler_object
*sampObj
=
210 _mesa_lookup_samplerobj(ctx
, samplers
[i
]);
212 /* The ID is immediately freed for re-use */
213 _mesa_HashRemove(ctx
->Shared
->SamplerObjects
, samplers
[i
]);
214 /* But the object exists until its reference count goes to zero */
215 _mesa_reference_sampler_object(ctx
, &sampObj
, NULL
);
220 _glthread_UNLOCK_MUTEX(ctx
->Shared
->Mutex
);
225 _mesa_IsSampler(GLuint sampler
)
227 struct gl_sampler_object
*sampObj
;
228 GET_CURRENT_CONTEXT(ctx
);
230 ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx
, GL_FALSE
);
235 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
237 return sampObj
!= NULL
;
242 _mesa_BindSampler(GLuint unit
, GLuint sampler
)
244 struct gl_sampler_object
*sampObj
;
245 GET_CURRENT_CONTEXT(ctx
);
247 if (unit
>= ctx
->Const
.MaxCombinedTextureImageUnits
) {
248 _mesa_error(ctx
, GL_INVALID_VALUE
, "glBindSampler(unit %u)", unit
);
253 /* Use the default sampler object, the one contained in the texture
259 /* user-defined sampler object */
260 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
262 _mesa_error(ctx
, GL_INVALID_OPERATION
, "glBindSampler(sampler)");
267 if (ctx
->Texture
.Unit
[unit
].Sampler
!= sampObj
) {
268 FLUSH_VERTICES(ctx
, _NEW_TEXTURE
);
271 /* bind new sampler */
272 _mesa_reference_sampler_object(ctx
, &ctx
->Texture
.Unit
[unit
].Sampler
,
278 * Check if a coordinate wrap mode is legal.
279 * \return GL_TRUE if legal, GL_FALSE otherwise
282 validate_texture_wrap_mode(struct gl_context
*ctx
, GLenum wrap
)
284 const struct gl_extensions
* const e
= &ctx
->Extensions
;
288 case GL_CLAMP_TO_EDGE
:
290 case GL_MIRRORED_REPEAT
:
292 case GL_CLAMP_TO_BORDER
:
293 return e
->ARB_texture_border_clamp
;
294 case GL_MIRROR_CLAMP_EXT
:
295 return e
->ATI_texture_mirror_once
|| e
->EXT_texture_mirror_clamp
;
296 case GL_MIRROR_CLAMP_TO_EDGE_EXT
:
297 return e
->ATI_texture_mirror_once
|| e
->EXT_texture_mirror_clamp
;
298 case GL_MIRROR_CLAMP_TO_BORDER_EXT
:
299 return e
->EXT_texture_mirror_clamp
;
307 * This is called just prior to changing any sampler object state.
310 flush(struct gl_context
*ctx
)
312 FLUSH_VERTICES(ctx
, _NEW_TEXTURE
);
316 #define INVALID_PARAM 0x100
317 #define INVALID_PNAME 0x101
318 #define INVALID_VALUE 0x102
321 set_sampler_wrap_s(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
324 if (samp
->WrapS
== param
)
326 if (validate_texture_wrap_mode(ctx
, param
)) {
331 return INVALID_PARAM
;
336 set_sampler_wrap_t(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
339 if (samp
->WrapT
== param
)
341 if (validate_texture_wrap_mode(ctx
, param
)) {
346 return INVALID_PARAM
;
351 set_sampler_wrap_r(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
354 if (samp
->WrapR
== param
)
356 if (validate_texture_wrap_mode(ctx
, param
)) {
361 return INVALID_PARAM
;
366 set_sampler_min_filter(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
369 if (samp
->MinFilter
== param
)
375 case GL_NEAREST_MIPMAP_NEAREST
:
376 case GL_LINEAR_MIPMAP_NEAREST
:
377 case GL_NEAREST_MIPMAP_LINEAR
:
378 case GL_LINEAR_MIPMAP_LINEAR
:
380 samp
->MinFilter
= param
;
383 return INVALID_PARAM
;
389 set_sampler_mag_filter(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
392 if (samp
->MagFilter
== param
)
399 samp
->MagFilter
= param
;
402 return INVALID_PARAM
;
408 set_sampler_lod_bias(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
411 if (samp
->LodBias
== param
)
415 samp
->LodBias
= param
;
421 set_sampler_border_colorf(struct gl_context
*ctx
,
422 struct gl_sampler_object
*samp
,
423 const GLfloat params
[4])
426 samp
->BorderColor
.f
[RCOMP
] = params
[0];
427 samp
->BorderColor
.f
[GCOMP
] = params
[1];
428 samp
->BorderColor
.f
[BCOMP
] = params
[2];
429 samp
->BorderColor
.f
[ACOMP
] = params
[3];
435 set_sampler_border_colori(struct gl_context
*ctx
,
436 struct gl_sampler_object
*samp
,
437 const GLint params
[4])
440 samp
->BorderColor
.i
[RCOMP
] = params
[0];
441 samp
->BorderColor
.i
[GCOMP
] = params
[1];
442 samp
->BorderColor
.i
[BCOMP
] = params
[2];
443 samp
->BorderColor
.i
[ACOMP
] = params
[3];
449 set_sampler_border_colorui(struct gl_context
*ctx
,
450 struct gl_sampler_object
*samp
,
451 const GLuint params
[4])
454 samp
->BorderColor
.ui
[RCOMP
] = params
[0];
455 samp
->BorderColor
.ui
[GCOMP
] = params
[1];
456 samp
->BorderColor
.ui
[BCOMP
] = params
[2];
457 samp
->BorderColor
.ui
[ACOMP
] = params
[3];
463 set_sampler_min_lod(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
466 if (samp
->MinLod
== param
)
470 samp
->MinLod
= param
;
476 set_sampler_max_lod(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
479 if (samp
->MaxLod
== param
)
483 samp
->MaxLod
= param
;
489 set_sampler_compare_mode(struct gl_context
*ctx
,
490 struct gl_sampler_object
*samp
, GLint param
)
492 if (!ctx
->Extensions
.ARB_shadow
)
493 return INVALID_PNAME
;
495 if (samp
->CompareMode
== param
)
498 if (param
== GL_NONE
||
499 param
== GL_COMPARE_R_TO_TEXTURE_ARB
) {
501 samp
->CompareMode
= param
;
505 return INVALID_PARAM
;
510 set_sampler_compare_func(struct gl_context
*ctx
,
511 struct gl_sampler_object
*samp
, GLint param
)
513 if (!ctx
->Extensions
.ARB_shadow
)
514 return INVALID_PNAME
;
516 if (samp
->CompareFunc
== param
)
523 samp
->CompareFunc
= param
;
531 if (ctx
->Extensions
.EXT_shadow_funcs
) {
533 samp
->CompareFunc
= param
;
538 return INVALID_PARAM
;
544 set_sampler_max_anisotropy(struct gl_context
*ctx
,
545 struct gl_sampler_object
*samp
, GLfloat param
)
547 if (!ctx
->Extensions
.EXT_texture_filter_anisotropic
)
548 return INVALID_PNAME
;
550 if (samp
->MaxAnisotropy
== param
)
554 return INVALID_VALUE
;
557 /* clamp to max, that's what NVIDIA does */
558 samp
->MaxAnisotropy
= MIN2(param
, ctx
->Const
.MaxTextureMaxAnisotropy
);
564 set_sampler_cube_map_seamless(struct gl_context
*ctx
,
565 struct gl_sampler_object
*samp
, GLboolean param
)
567 if (!ctx
->Extensions
.AMD_seamless_cubemap_per_texture
)
568 return INVALID_PNAME
;
570 if (samp
->CubeMapSeamless
== param
)
573 if (param
!= GL_TRUE
&& param
!= GL_FALSE
)
574 return INVALID_VALUE
;
577 samp
->CubeMapSeamless
= param
;
582 set_sampler_srgb_decode(struct gl_context
*ctx
,
583 struct gl_sampler_object
*samp
, GLenum param
)
585 if (!ctx
->Extensions
.EXT_texture_sRGB_decode
)
586 return INVALID_PNAME
;
588 if (samp
->sRGBDecode
== param
)
591 if (param
!= GL_DECODE_EXT
&& param
!= GL_SKIP_DECODE_EXT
)
592 return INVALID_VALUE
;
595 samp
->sRGBDecode
= param
;
600 _mesa_SamplerParameteri(GLuint sampler
, GLenum pname
, GLint param
)
602 struct gl_sampler_object
*sampObj
;
604 GET_CURRENT_CONTEXT(ctx
);
606 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
608 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameteri(sampler %u)",
614 case GL_TEXTURE_WRAP_S
:
615 res
= set_sampler_wrap_s(ctx
, sampObj
, param
);
617 case GL_TEXTURE_WRAP_T
:
618 res
= set_sampler_wrap_t(ctx
, sampObj
, param
);
620 case GL_TEXTURE_WRAP_R
:
621 res
= set_sampler_wrap_r(ctx
, sampObj
, param
);
623 case GL_TEXTURE_MIN_FILTER
:
624 res
= set_sampler_min_filter(ctx
, sampObj
, param
);
626 case GL_TEXTURE_MAG_FILTER
:
627 res
= set_sampler_mag_filter(ctx
, sampObj
, param
);
629 case GL_TEXTURE_MIN_LOD
:
630 res
= set_sampler_min_lod(ctx
, sampObj
, (GLfloat
) param
);
632 case GL_TEXTURE_MAX_LOD
:
633 res
= set_sampler_max_lod(ctx
, sampObj
, (GLfloat
) param
);
635 case GL_TEXTURE_LOD_BIAS
:
636 res
= set_sampler_lod_bias(ctx
, sampObj
, (GLfloat
) param
);
638 case GL_TEXTURE_COMPARE_MODE
:
639 res
= set_sampler_compare_mode(ctx
, sampObj
, param
);
641 case GL_TEXTURE_COMPARE_FUNC
:
642 res
= set_sampler_compare_func(ctx
, sampObj
, param
);
644 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
645 res
= set_sampler_max_anisotropy(ctx
, sampObj
, (GLfloat
) param
);
647 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
648 res
= set_sampler_cube_map_seamless(ctx
, sampObj
, param
);
650 case GL_TEXTURE_SRGB_DECODE_EXT
:
651 res
= set_sampler_srgb_decode(ctx
, sampObj
, param
);
653 case GL_TEXTURE_BORDER_COLOR
:
664 /* state change - we do nothing special at this time */
667 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameteri(pname=%s)\n",
668 _mesa_lookup_enum_by_nr(pname
));
671 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameteri(param=%d)\n",
675 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameteri(param=%d)\n",
685 _mesa_SamplerParameterf(GLuint sampler
, GLenum pname
, GLfloat param
)
687 struct gl_sampler_object
*sampObj
;
689 GET_CURRENT_CONTEXT(ctx
);
691 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
693 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterf(sampler %u)",
699 case GL_TEXTURE_WRAP_S
:
700 res
= set_sampler_wrap_s(ctx
, sampObj
, (GLint
) param
);
702 case GL_TEXTURE_WRAP_T
:
703 res
= set_sampler_wrap_t(ctx
, sampObj
, (GLint
) param
);
705 case GL_TEXTURE_WRAP_R
:
706 res
= set_sampler_wrap_r(ctx
, sampObj
, (GLint
) param
);
708 case GL_TEXTURE_MIN_FILTER
:
709 res
= set_sampler_min_filter(ctx
, sampObj
, (GLint
) param
);
711 case GL_TEXTURE_MAG_FILTER
:
712 res
= set_sampler_mag_filter(ctx
, sampObj
, (GLint
) param
);
714 case GL_TEXTURE_MIN_LOD
:
715 res
= set_sampler_min_lod(ctx
, sampObj
, param
);
717 case GL_TEXTURE_MAX_LOD
:
718 res
= set_sampler_max_lod(ctx
, sampObj
, param
);
720 case GL_TEXTURE_LOD_BIAS
:
721 res
= set_sampler_lod_bias(ctx
, sampObj
, param
);
723 case GL_TEXTURE_COMPARE_MODE
:
724 res
= set_sampler_compare_mode(ctx
, sampObj
, (GLint
) param
);
726 case GL_TEXTURE_COMPARE_FUNC
:
727 res
= set_sampler_compare_func(ctx
, sampObj
, (GLint
) param
);
729 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
730 res
= set_sampler_max_anisotropy(ctx
, sampObj
, param
);
732 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
733 res
= set_sampler_cube_map_seamless(ctx
, sampObj
, (GLboolean
) param
);
735 case GL_TEXTURE_SRGB_DECODE_EXT
:
736 res
= set_sampler_srgb_decode(ctx
, sampObj
, (GLenum
) param
);
738 case GL_TEXTURE_BORDER_COLOR
:
749 /* state change - we do nothing special at this time */
752 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterf(pname=%s)\n",
753 _mesa_lookup_enum_by_nr(pname
));
756 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterf(param=%f)\n",
760 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterf(param=%f)\n",
769 _mesa_SamplerParameteriv(GLuint sampler
, GLenum pname
, const GLint
*params
)
771 struct gl_sampler_object
*sampObj
;
773 GET_CURRENT_CONTEXT(ctx
);
775 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
777 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameteriv(sampler %u)",
783 case GL_TEXTURE_WRAP_S
:
784 res
= set_sampler_wrap_s(ctx
, sampObj
, params
[0]);
786 case GL_TEXTURE_WRAP_T
:
787 res
= set_sampler_wrap_t(ctx
, sampObj
, params
[0]);
789 case GL_TEXTURE_WRAP_R
:
790 res
= set_sampler_wrap_r(ctx
, sampObj
, params
[0]);
792 case GL_TEXTURE_MIN_FILTER
:
793 res
= set_sampler_min_filter(ctx
, sampObj
, params
[0]);
795 case GL_TEXTURE_MAG_FILTER
:
796 res
= set_sampler_mag_filter(ctx
, sampObj
, params
[0]);
798 case GL_TEXTURE_MIN_LOD
:
799 res
= set_sampler_min_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
801 case GL_TEXTURE_MAX_LOD
:
802 res
= set_sampler_max_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
804 case GL_TEXTURE_LOD_BIAS
:
805 res
= set_sampler_lod_bias(ctx
, sampObj
, (GLfloat
) params
[0]);
807 case GL_TEXTURE_COMPARE_MODE
:
808 res
= set_sampler_compare_mode(ctx
, sampObj
, params
[0]);
810 case GL_TEXTURE_COMPARE_FUNC
:
811 res
= set_sampler_compare_func(ctx
, sampObj
, params
[0]);
813 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
814 res
= set_sampler_max_anisotropy(ctx
, sampObj
, (GLfloat
) params
[0]);
816 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
817 res
= set_sampler_cube_map_seamless(ctx
, sampObj
, params
[0]);
819 case GL_TEXTURE_SRGB_DECODE_EXT
:
820 res
= set_sampler_srgb_decode(ctx
, sampObj
, params
[0]);
822 case GL_TEXTURE_BORDER_COLOR
:
825 c
[0] = INT_TO_FLOAT(params
[0]);
826 c
[1] = INT_TO_FLOAT(params
[1]);
827 c
[2] = INT_TO_FLOAT(params
[2]);
828 c
[3] = INT_TO_FLOAT(params
[3]);
829 res
= set_sampler_border_colorf(ctx
, sampObj
, c
);
841 /* state change - we do nothing special at this time */
844 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameteriv(pname=%s)\n",
845 _mesa_lookup_enum_by_nr(pname
));
848 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameteriv(param=%d)\n",
852 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameteriv(param=%d)\n",
861 _mesa_SamplerParameterfv(GLuint sampler
, GLenum pname
, const GLfloat
*params
)
863 struct gl_sampler_object
*sampObj
;
865 GET_CURRENT_CONTEXT(ctx
);
867 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
869 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterfv(sampler %u)",
875 case GL_TEXTURE_WRAP_S
:
876 res
= set_sampler_wrap_s(ctx
, sampObj
, (GLint
) params
[0]);
878 case GL_TEXTURE_WRAP_T
:
879 res
= set_sampler_wrap_t(ctx
, sampObj
, (GLint
) params
[0]);
881 case GL_TEXTURE_WRAP_R
:
882 res
= set_sampler_wrap_r(ctx
, sampObj
, (GLint
) params
[0]);
884 case GL_TEXTURE_MIN_FILTER
:
885 res
= set_sampler_min_filter(ctx
, sampObj
, (GLint
) params
[0]);
887 case GL_TEXTURE_MAG_FILTER
:
888 res
= set_sampler_mag_filter(ctx
, sampObj
, (GLint
) params
[0]);
890 case GL_TEXTURE_MIN_LOD
:
891 res
= set_sampler_min_lod(ctx
, sampObj
, params
[0]);
893 case GL_TEXTURE_MAX_LOD
:
894 res
= set_sampler_max_lod(ctx
, sampObj
, params
[0]);
896 case GL_TEXTURE_LOD_BIAS
:
897 res
= set_sampler_lod_bias(ctx
, sampObj
, params
[0]);
899 case GL_TEXTURE_COMPARE_MODE
:
900 res
= set_sampler_compare_mode(ctx
, sampObj
, (GLint
) params
[0]);
902 case GL_TEXTURE_COMPARE_FUNC
:
903 res
= set_sampler_compare_func(ctx
, sampObj
, (GLint
) params
[0]);
905 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
906 res
= set_sampler_max_anisotropy(ctx
, sampObj
, params
[0]);
908 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
909 res
= set_sampler_cube_map_seamless(ctx
, sampObj
, (GLboolean
) params
[0]);
911 case GL_TEXTURE_SRGB_DECODE_EXT
:
912 res
= set_sampler_srgb_decode(ctx
, sampObj
, (GLenum
) params
[0]);
914 case GL_TEXTURE_BORDER_COLOR
:
915 res
= set_sampler_border_colorf(ctx
, sampObj
, params
);
926 /* state change - we do nothing special at this time */
929 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterfv(pname=%s)\n",
930 _mesa_lookup_enum_by_nr(pname
));
933 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterfv(param=%f)\n",
937 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterfv(param=%f)\n",
946 _mesa_SamplerParameterIiv(GLuint sampler
, GLenum pname
, const GLint
*params
)
948 struct gl_sampler_object
*sampObj
;
950 GET_CURRENT_CONTEXT(ctx
);
952 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
954 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterIiv(sampler %u)",
960 case GL_TEXTURE_WRAP_S
:
961 res
= set_sampler_wrap_s(ctx
, sampObj
, params
[0]);
963 case GL_TEXTURE_WRAP_T
:
964 res
= set_sampler_wrap_t(ctx
, sampObj
, params
[0]);
966 case GL_TEXTURE_WRAP_R
:
967 res
= set_sampler_wrap_r(ctx
, sampObj
, params
[0]);
969 case GL_TEXTURE_MIN_FILTER
:
970 res
= set_sampler_min_filter(ctx
, sampObj
, params
[0]);
972 case GL_TEXTURE_MAG_FILTER
:
973 res
= set_sampler_mag_filter(ctx
, sampObj
, params
[0]);
975 case GL_TEXTURE_MIN_LOD
:
976 res
= set_sampler_min_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
978 case GL_TEXTURE_MAX_LOD
:
979 res
= set_sampler_max_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
981 case GL_TEXTURE_LOD_BIAS
:
982 res
= set_sampler_lod_bias(ctx
, sampObj
, (GLfloat
) params
[0]);
984 case GL_TEXTURE_COMPARE_MODE
:
985 res
= set_sampler_compare_mode(ctx
, sampObj
, params
[0]);
987 case GL_TEXTURE_COMPARE_FUNC
:
988 res
= set_sampler_compare_func(ctx
, sampObj
, params
[0]);
990 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
991 res
= set_sampler_max_anisotropy(ctx
, sampObj
, (GLfloat
) params
[0]);
993 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
994 res
= set_sampler_cube_map_seamless(ctx
, sampObj
, params
[0]);
996 case GL_TEXTURE_SRGB_DECODE_EXT
:
997 res
= set_sampler_srgb_decode(ctx
, sampObj
, (GLenum
) params
[0]);
999 case GL_TEXTURE_BORDER_COLOR
:
1000 res
= set_sampler_border_colori(ctx
, sampObj
, params
);
1003 res
= INVALID_PNAME
;
1011 /* state change - we do nothing special at this time */
1014 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterIiv(pname=%s)\n",
1015 _mesa_lookup_enum_by_nr(pname
));
1018 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterIiv(param=%d)\n",
1022 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterIiv(param=%d)\n",
1032 _mesa_SamplerParameterIuiv(GLuint sampler
, GLenum pname
, const GLuint
*params
)
1034 struct gl_sampler_object
*sampObj
;
1036 GET_CURRENT_CONTEXT(ctx
);
1038 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
1040 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterIuiv(sampler %u)",
1046 case GL_TEXTURE_WRAP_S
:
1047 res
= set_sampler_wrap_s(ctx
, sampObj
, params
[0]);
1049 case GL_TEXTURE_WRAP_T
:
1050 res
= set_sampler_wrap_t(ctx
, sampObj
, params
[0]);
1052 case GL_TEXTURE_WRAP_R
:
1053 res
= set_sampler_wrap_r(ctx
, sampObj
, params
[0]);
1055 case GL_TEXTURE_MIN_FILTER
:
1056 res
= set_sampler_min_filter(ctx
, sampObj
, params
[0]);
1058 case GL_TEXTURE_MAG_FILTER
:
1059 res
= set_sampler_mag_filter(ctx
, sampObj
, params
[0]);
1061 case GL_TEXTURE_MIN_LOD
:
1062 res
= set_sampler_min_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
1064 case GL_TEXTURE_MAX_LOD
:
1065 res
= set_sampler_max_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
1067 case GL_TEXTURE_LOD_BIAS
:
1068 res
= set_sampler_lod_bias(ctx
, sampObj
, (GLfloat
) params
[0]);
1070 case GL_TEXTURE_COMPARE_MODE
:
1071 res
= set_sampler_compare_mode(ctx
, sampObj
, params
[0]);
1073 case GL_TEXTURE_COMPARE_FUNC
:
1074 res
= set_sampler_compare_func(ctx
, sampObj
, params
[0]);
1076 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1077 res
= set_sampler_max_anisotropy(ctx
, sampObj
, (GLfloat
) params
[0]);
1079 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
1080 res
= set_sampler_cube_map_seamless(ctx
, sampObj
, params
[0]);
1082 case GL_TEXTURE_SRGB_DECODE_EXT
:
1083 res
= set_sampler_srgb_decode(ctx
, sampObj
, (GLenum
) params
[0]);
1085 case GL_TEXTURE_BORDER_COLOR
:
1086 res
= set_sampler_border_colorui(ctx
, sampObj
, params
);
1089 res
= INVALID_PNAME
;
1097 /* state change - we do nothing special at this time */
1100 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterIuiv(pname=%s)\n",
1101 _mesa_lookup_enum_by_nr(pname
));
1104 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterIuiv(param=%u)\n",
1108 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterIuiv(param=%u)\n",
1118 _mesa_GetSamplerParameteriv(GLuint sampler
, GLenum pname
, GLint
*params
)
1120 struct gl_sampler_object
*sampObj
;
1121 GET_CURRENT_CONTEXT(ctx
);
1123 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
1125 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetSamplerParameteriv(sampler %u)",
1131 case GL_TEXTURE_WRAP_S
:
1132 *params
= sampObj
->WrapS
;
1134 case GL_TEXTURE_WRAP_T
:
1135 *params
= sampObj
->WrapT
;
1137 case GL_TEXTURE_WRAP_R
:
1138 *params
= sampObj
->WrapR
;
1140 case GL_TEXTURE_MIN_FILTER
:
1141 *params
= sampObj
->MinFilter
;
1143 case GL_TEXTURE_MAG_FILTER
:
1144 *params
= sampObj
->MagFilter
;
1146 case GL_TEXTURE_MIN_LOD
:
1147 *params
= (GLint
) sampObj
->MinLod
;
1149 case GL_TEXTURE_MAX_LOD
:
1150 *params
= (GLint
) sampObj
->MaxLod
;
1152 case GL_TEXTURE_LOD_BIAS
:
1153 *params
= (GLint
) sampObj
->LodBias
;
1155 case GL_TEXTURE_COMPARE_MODE
:
1156 if (!ctx
->Extensions
.ARB_shadow
)
1158 *params
= sampObj
->CompareMode
;
1160 case GL_TEXTURE_COMPARE_FUNC
:
1161 if (!ctx
->Extensions
.ARB_shadow
)
1163 *params
= sampObj
->CompareFunc
;
1165 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1166 *params
= (GLint
) sampObj
->MaxAnisotropy
;
1168 case GL_TEXTURE_BORDER_COLOR
:
1169 params
[0] = FLOAT_TO_INT(sampObj
->BorderColor
.f
[0]);
1170 params
[1] = FLOAT_TO_INT(sampObj
->BorderColor
.f
[1]);
1171 params
[2] = FLOAT_TO_INT(sampObj
->BorderColor
.f
[2]);
1172 params
[3] = FLOAT_TO_INT(sampObj
->BorderColor
.f
[3]);
1174 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
1175 if (!ctx
->Extensions
.AMD_seamless_cubemap_per_texture
)
1177 *params
= sampObj
->CubeMapSeamless
;
1179 case GL_TEXTURE_SRGB_DECODE_EXT
:
1180 if (!ctx
->Extensions
.EXT_texture_sRGB_decode
)
1182 *params
= (GLenum
) sampObj
->sRGBDecode
;
1190 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetSamplerParameteriv(pname=%s)",
1191 _mesa_lookup_enum_by_nr(pname
));
1196 _mesa_GetSamplerParameterfv(GLuint sampler
, GLenum pname
, GLfloat
*params
)
1198 struct gl_sampler_object
*sampObj
;
1199 GET_CURRENT_CONTEXT(ctx
);
1201 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
1203 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetSamplerParameterfv(sampler %u)",
1209 case GL_TEXTURE_WRAP_S
:
1210 *params
= (GLfloat
) sampObj
->WrapS
;
1212 case GL_TEXTURE_WRAP_T
:
1213 *params
= (GLfloat
) sampObj
->WrapT
;
1215 case GL_TEXTURE_WRAP_R
:
1216 *params
= (GLfloat
) sampObj
->WrapR
;
1218 case GL_TEXTURE_MIN_FILTER
:
1219 *params
= (GLfloat
) sampObj
->MinFilter
;
1221 case GL_TEXTURE_MAG_FILTER
:
1222 *params
= (GLfloat
) sampObj
->MagFilter
;
1224 case GL_TEXTURE_MIN_LOD
:
1225 *params
= sampObj
->MinLod
;
1227 case GL_TEXTURE_MAX_LOD
:
1228 *params
= sampObj
->MaxLod
;
1230 case GL_TEXTURE_LOD_BIAS
:
1231 *params
= sampObj
->LodBias
;
1233 case GL_TEXTURE_COMPARE_MODE
:
1234 if (!ctx
->Extensions
.ARB_shadow
)
1236 *params
= (GLfloat
) sampObj
->CompareMode
;
1238 case GL_TEXTURE_COMPARE_FUNC
:
1239 if (!ctx
->Extensions
.ARB_shadow
)
1241 *params
= (GLfloat
) sampObj
->CompareFunc
;
1243 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1244 *params
= sampObj
->MaxAnisotropy
;
1246 case GL_TEXTURE_BORDER_COLOR
:
1247 params
[0] = sampObj
->BorderColor
.f
[0];
1248 params
[1] = sampObj
->BorderColor
.f
[1];
1249 params
[2] = sampObj
->BorderColor
.f
[2];
1250 params
[3] = sampObj
->BorderColor
.f
[3];
1252 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
1253 if (!ctx
->Extensions
.AMD_seamless_cubemap_per_texture
)
1255 *params
= (GLfloat
) sampObj
->CubeMapSeamless
;
1257 case GL_TEXTURE_SRGB_DECODE_EXT
:
1258 if (!ctx
->Extensions
.EXT_texture_sRGB_decode
)
1260 *params
= (GLfloat
) sampObj
->sRGBDecode
;
1268 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetSamplerParameterfv(pname=%s)",
1269 _mesa_lookup_enum_by_nr(pname
));
1274 _mesa_GetSamplerParameterIiv(GLuint sampler
, GLenum pname
, GLint
*params
)
1276 struct gl_sampler_object
*sampObj
;
1277 GET_CURRENT_CONTEXT(ctx
);
1279 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
1281 _mesa_error(ctx
, GL_INVALID_VALUE
,
1282 "glGetSamplerParameterIiv(sampler %u)",
1288 case GL_TEXTURE_WRAP_S
:
1289 *params
= sampObj
->WrapS
;
1291 case GL_TEXTURE_WRAP_T
:
1292 *params
= sampObj
->WrapT
;
1294 case GL_TEXTURE_WRAP_R
:
1295 *params
= sampObj
->WrapR
;
1297 case GL_TEXTURE_MIN_FILTER
:
1298 *params
= sampObj
->MinFilter
;
1300 case GL_TEXTURE_MAG_FILTER
:
1301 *params
= sampObj
->MagFilter
;
1303 case GL_TEXTURE_MIN_LOD
:
1304 *params
= (GLint
) sampObj
->MinLod
;
1306 case GL_TEXTURE_MAX_LOD
:
1307 *params
= (GLint
) sampObj
->MaxLod
;
1309 case GL_TEXTURE_LOD_BIAS
:
1310 *params
= (GLint
) sampObj
->LodBias
;
1312 case GL_TEXTURE_COMPARE_MODE
:
1313 if (!ctx
->Extensions
.ARB_shadow
)
1315 *params
= sampObj
->CompareMode
;
1317 case GL_TEXTURE_COMPARE_FUNC
:
1318 if (!ctx
->Extensions
.ARB_shadow
)
1320 *params
= sampObj
->CompareFunc
;
1322 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1323 *params
= (GLint
) sampObj
->MaxAnisotropy
;
1325 case GL_TEXTURE_BORDER_COLOR
:
1326 params
[0] = sampObj
->BorderColor
.i
[0];
1327 params
[1] = sampObj
->BorderColor
.i
[1];
1328 params
[2] = sampObj
->BorderColor
.i
[2];
1329 params
[3] = sampObj
->BorderColor
.i
[3];
1331 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
1332 if (!ctx
->Extensions
.AMD_seamless_cubemap_per_texture
)
1334 *params
= sampObj
->CubeMapSeamless
;
1336 case GL_TEXTURE_SRGB_DECODE_EXT
:
1337 if (!ctx
->Extensions
.EXT_texture_sRGB_decode
)
1339 *params
= (GLenum
) sampObj
->sRGBDecode
;
1347 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetSamplerParameterIiv(pname=%s)",
1348 _mesa_lookup_enum_by_nr(pname
));
1353 _mesa_GetSamplerParameterIuiv(GLuint sampler
, GLenum pname
, GLuint
*params
)
1355 struct gl_sampler_object
*sampObj
;
1356 GET_CURRENT_CONTEXT(ctx
);
1358 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
1360 _mesa_error(ctx
, GL_INVALID_VALUE
,
1361 "glGetSamplerParameterIuiv(sampler %u)",
1367 case GL_TEXTURE_WRAP_S
:
1368 *params
= sampObj
->WrapS
;
1370 case GL_TEXTURE_WRAP_T
:
1371 *params
= sampObj
->WrapT
;
1373 case GL_TEXTURE_WRAP_R
:
1374 *params
= sampObj
->WrapR
;
1376 case GL_TEXTURE_MIN_FILTER
:
1377 *params
= sampObj
->MinFilter
;
1379 case GL_TEXTURE_MAG_FILTER
:
1380 *params
= sampObj
->MagFilter
;
1382 case GL_TEXTURE_MIN_LOD
:
1383 *params
= (GLuint
) sampObj
->MinLod
;
1385 case GL_TEXTURE_MAX_LOD
:
1386 *params
= (GLuint
) sampObj
->MaxLod
;
1388 case GL_TEXTURE_LOD_BIAS
:
1389 *params
= (GLuint
) sampObj
->LodBias
;
1391 case GL_TEXTURE_COMPARE_MODE
:
1392 if (!ctx
->Extensions
.ARB_shadow
)
1394 *params
= sampObj
->CompareMode
;
1396 case GL_TEXTURE_COMPARE_FUNC
:
1397 if (!ctx
->Extensions
.ARB_shadow
)
1399 *params
= sampObj
->CompareFunc
;
1401 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1402 *params
= (GLuint
) sampObj
->MaxAnisotropy
;
1404 case GL_TEXTURE_BORDER_COLOR
:
1405 params
[0] = sampObj
->BorderColor
.ui
[0];
1406 params
[1] = sampObj
->BorderColor
.ui
[1];
1407 params
[2] = sampObj
->BorderColor
.ui
[2];
1408 params
[3] = sampObj
->BorderColor
.ui
[3];
1410 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
1411 if (!ctx
->Extensions
.AMD_seamless_cubemap_per_texture
)
1413 *params
= sampObj
->CubeMapSeamless
;
1415 case GL_TEXTURE_SRGB_DECODE_EXT
:
1416 if (!ctx
->Extensions
.EXT_texture_sRGB_decode
)
1418 *params
= (GLenum
) sampObj
->sRGBDecode
;
1426 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetSamplerParameterIuiv(pname=%s)",
1427 _mesa_lookup_enum_by_nr(pname
));
1432 _mesa_init_sampler_object_functions(struct dd_function_table
*driver
)
1434 driver
->NewSamplerObject
= _mesa_new_sampler_object
;
1435 driver
->DeleteSamplerObject
= _mesa_delete_sampler_object
;