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_FALSE
;
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
.MaxTextureImageUnits
) {
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
:
298 case GL_CLAMP_TO_BORDER
:
299 return e
->ARB_texture_border_clamp
;
300 case GL_MIRRORED_REPEAT
:
301 return e
->ARB_texture_mirrored_repeat
;
302 case GL_MIRROR_CLAMP_EXT
:
303 return e
->ATI_texture_mirror_once
|| e
->EXT_texture_mirror_clamp
;
304 case GL_MIRROR_CLAMP_TO_EDGE_EXT
:
305 return e
->ATI_texture_mirror_once
|| e
->EXT_texture_mirror_clamp
;
306 case GL_MIRROR_CLAMP_TO_BORDER_EXT
:
307 return e
->EXT_texture_mirror_clamp
;
315 * This is called just prior to changing any sampler object state.
318 flush(struct gl_context
*ctx
)
320 FLUSH_VERTICES(ctx
, _NEW_TEXTURE
);
324 #define INVALID_PARAM 0x100
325 #define INVALID_PNAME 0x101
326 #define INVALID_VALUE 0x102
329 set_sampler_wrap_s(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
332 if (samp
->WrapS
== param
)
334 if (validate_texture_wrap_mode(ctx
, param
)) {
339 return INVALID_PARAM
;
344 set_sampler_wrap_t(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
347 if (samp
->WrapT
== param
)
349 if (validate_texture_wrap_mode(ctx
, param
)) {
354 return INVALID_PARAM
;
359 set_sampler_wrap_r(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
362 if (samp
->WrapR
== param
)
364 if (validate_texture_wrap_mode(ctx
, param
)) {
369 return INVALID_PARAM
;
374 set_sampler_min_filter(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
377 if (samp
->MinFilter
== param
)
383 case GL_NEAREST_MIPMAP_NEAREST
:
384 case GL_LINEAR_MIPMAP_NEAREST
:
385 case GL_NEAREST_MIPMAP_LINEAR
:
386 case GL_LINEAR_MIPMAP_LINEAR
:
388 samp
->MinFilter
= param
;
391 return INVALID_PARAM
;
397 set_sampler_mag_filter(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
400 if (samp
->MagFilter
== param
)
407 samp
->MagFilter
= param
;
410 return INVALID_PARAM
;
416 set_sampler_lod_bias(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
419 if (samp
->LodBias
== param
)
423 samp
->LodBias
= param
;
429 set_sampler_border_colorf(struct gl_context
*ctx
,
430 struct gl_sampler_object
*samp
,
431 const GLfloat params
[4])
434 samp
->BorderColor
.f
[RCOMP
] = params
[0];
435 samp
->BorderColor
.f
[GCOMP
] = params
[1];
436 samp
->BorderColor
.f
[BCOMP
] = params
[2];
437 samp
->BorderColor
.f
[ACOMP
] = params
[3];
443 set_sampler_border_colori(struct gl_context
*ctx
,
444 struct gl_sampler_object
*samp
,
445 const GLint params
[4])
448 samp
->BorderColor
.i
[RCOMP
] = params
[0];
449 samp
->BorderColor
.i
[GCOMP
] = params
[1];
450 samp
->BorderColor
.i
[BCOMP
] = params
[2];
451 samp
->BorderColor
.i
[ACOMP
] = params
[3];
457 set_sampler_border_colorui(struct gl_context
*ctx
,
458 struct gl_sampler_object
*samp
,
459 const GLuint params
[4])
462 samp
->BorderColor
.ui
[RCOMP
] = params
[0];
463 samp
->BorderColor
.ui
[GCOMP
] = params
[1];
464 samp
->BorderColor
.ui
[BCOMP
] = params
[2];
465 samp
->BorderColor
.ui
[ACOMP
] = params
[3];
471 set_sampler_min_lod(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
474 if (samp
->MinLod
== param
)
478 samp
->MinLod
= param
;
484 set_sampler_max_lod(struct gl_context
*ctx
, struct gl_sampler_object
*samp
,
487 if (samp
->MaxLod
== param
)
491 samp
->MaxLod
= param
;
497 set_sampler_compare_mode(struct gl_context
*ctx
,
498 struct gl_sampler_object
*samp
, GLint param
)
500 if (!ctx
->Extensions
.ARB_shadow
)
501 return INVALID_PNAME
;
503 if (samp
->CompareMode
== param
)
506 if (param
== GL_NONE
||
507 param
== GL_COMPARE_R_TO_TEXTURE_ARB
) {
509 samp
->CompareMode
= param
;
513 return INVALID_PARAM
;
518 set_sampler_compare_func(struct gl_context
*ctx
,
519 struct gl_sampler_object
*samp
, GLint param
)
521 if (!ctx
->Extensions
.ARB_shadow
)
522 return INVALID_PNAME
;
524 if (samp
->CompareFunc
== param
)
531 samp
->CompareFunc
= param
;
539 if (ctx
->Extensions
.EXT_shadow_funcs
) {
541 samp
->CompareFunc
= param
;
546 return INVALID_PARAM
;
552 set_sampler_max_anisotropy(struct gl_context
*ctx
,
553 struct gl_sampler_object
*samp
, GLfloat param
)
555 if (!ctx
->Extensions
.EXT_texture_filter_anisotropic
)
556 return INVALID_PNAME
;
558 if (samp
->MaxAnisotropy
== param
)
562 return INVALID_VALUE
;
565 /* clamp to max, that's what NVIDIA does */
566 samp
->MaxAnisotropy
= MIN2(param
, ctx
->Const
.MaxTextureMaxAnisotropy
);
571 static void GLAPIENTRY
572 _mesa_SamplerParameteri(GLuint sampler
, GLenum pname
, GLint param
)
574 struct gl_sampler_object
*sampObj
;
576 GET_CURRENT_CONTEXT(ctx
);
578 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
580 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameteri(sampler %u)",
586 case GL_TEXTURE_WRAP_S
:
587 res
= set_sampler_wrap_s(ctx
, sampObj
, param
);
589 case GL_TEXTURE_WRAP_T
:
590 res
= set_sampler_wrap_t(ctx
, sampObj
, param
);
592 case GL_TEXTURE_WRAP_R
:
593 res
= set_sampler_wrap_r(ctx
, sampObj
, param
);
595 case GL_TEXTURE_MIN_FILTER
:
596 res
= set_sampler_min_filter(ctx
, sampObj
, param
);
598 case GL_TEXTURE_MAG_FILTER
:
599 res
= set_sampler_mag_filter(ctx
, sampObj
, param
);
601 case GL_TEXTURE_MIN_LOD
:
602 res
= set_sampler_min_lod(ctx
, sampObj
, (GLfloat
) param
);
604 case GL_TEXTURE_MAX_LOD
:
605 res
= set_sampler_max_lod(ctx
, sampObj
, (GLfloat
) param
);
607 case GL_TEXTURE_LOD_BIAS
:
608 res
= set_sampler_lod_bias(ctx
, sampObj
, (GLfloat
) param
);
610 case GL_TEXTURE_COMPARE_MODE
:
611 res
= set_sampler_compare_mode(ctx
, sampObj
, param
);
613 case GL_TEXTURE_COMPARE_FUNC
:
614 res
= set_sampler_compare_func(ctx
, sampObj
, param
);
616 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
617 res
= set_sampler_max_anisotropy(ctx
, sampObj
, (GLfloat
) param
);
619 case GL_TEXTURE_BORDER_COLOR
:
630 /* state change - we do nothing special at this time */
633 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameteri(pname=%s)\n",
634 _mesa_lookup_enum_by_nr(pname
));
637 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameteri(param=%d)\n",
641 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameteri(param=%d)\n",
650 static void GLAPIENTRY
651 _mesa_SamplerParameterf(GLuint sampler
, GLenum pname
, GLfloat param
)
653 struct gl_sampler_object
*sampObj
;
655 GET_CURRENT_CONTEXT(ctx
);
657 ASSERT_OUTSIDE_BEGIN_END(ctx
);
659 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
661 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterf(sampler %u)",
667 case GL_TEXTURE_WRAP_S
:
668 res
= set_sampler_wrap_s(ctx
, sampObj
, (GLint
) param
);
670 case GL_TEXTURE_WRAP_T
:
671 res
= set_sampler_wrap_t(ctx
, sampObj
, (GLint
) param
);
673 case GL_TEXTURE_WRAP_R
:
674 res
= set_sampler_wrap_r(ctx
, sampObj
, (GLint
) param
);
676 case GL_TEXTURE_MIN_FILTER
:
677 res
= set_sampler_min_filter(ctx
, sampObj
, (GLint
) param
);
679 case GL_TEXTURE_MAG_FILTER
:
680 res
= set_sampler_mag_filter(ctx
, sampObj
, (GLint
) param
);
682 case GL_TEXTURE_MIN_LOD
:
683 res
= set_sampler_min_lod(ctx
, sampObj
, param
);
685 case GL_TEXTURE_MAX_LOD
:
686 res
= set_sampler_max_lod(ctx
, sampObj
, param
);
688 case GL_TEXTURE_LOD_BIAS
:
689 res
= set_sampler_lod_bias(ctx
, sampObj
, param
);
691 case GL_TEXTURE_COMPARE_MODE
:
692 res
= set_sampler_compare_mode(ctx
, sampObj
, (GLint
) param
);
694 case GL_TEXTURE_COMPARE_FUNC
:
695 res
= set_sampler_compare_func(ctx
, sampObj
, (GLint
) param
);
697 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
698 res
= set_sampler_max_anisotropy(ctx
, sampObj
, param
);
700 case GL_TEXTURE_BORDER_COLOR
:
711 /* state change - we do nothing special at this time */
714 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterf(pname=%s)\n",
715 _mesa_lookup_enum_by_nr(pname
));
718 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterf(param=%f)\n",
722 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterf(param=%f)\n",
730 static void GLAPIENTRY
731 _mesa_SamplerParameteriv(GLuint sampler
, GLenum pname
, const GLint
*params
)
733 struct gl_sampler_object
*sampObj
;
735 GET_CURRENT_CONTEXT(ctx
);
737 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
739 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameteriv(sampler %u)",
745 case GL_TEXTURE_WRAP_S
:
746 res
= set_sampler_wrap_s(ctx
, sampObj
, params
[0]);
748 case GL_TEXTURE_WRAP_T
:
749 res
= set_sampler_wrap_t(ctx
, sampObj
, params
[0]);
751 case GL_TEXTURE_WRAP_R
:
752 res
= set_sampler_wrap_r(ctx
, sampObj
, params
[0]);
754 case GL_TEXTURE_MIN_FILTER
:
755 res
= set_sampler_min_filter(ctx
, sampObj
, params
[0]);
757 case GL_TEXTURE_MAG_FILTER
:
758 res
= set_sampler_mag_filter(ctx
, sampObj
, params
[0]);
760 case GL_TEXTURE_MIN_LOD
:
761 res
= set_sampler_min_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
763 case GL_TEXTURE_MAX_LOD
:
764 res
= set_sampler_max_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
766 case GL_TEXTURE_LOD_BIAS
:
767 res
= set_sampler_lod_bias(ctx
, sampObj
, (GLfloat
) params
[0]);
769 case GL_TEXTURE_COMPARE_MODE
:
770 res
= set_sampler_compare_mode(ctx
, sampObj
, params
[0]);
772 case GL_TEXTURE_COMPARE_FUNC
:
773 res
= set_sampler_compare_func(ctx
, sampObj
, params
[0]);
775 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
776 res
= set_sampler_max_anisotropy(ctx
, sampObj
, (GLfloat
) params
[0]);
778 case GL_TEXTURE_BORDER_COLOR
:
781 c
[0] = INT_TO_FLOAT(params
[0]);
782 c
[1] = INT_TO_FLOAT(params
[1]);
783 c
[2] = INT_TO_FLOAT(params
[2]);
784 c
[3] = INT_TO_FLOAT(params
[3]);
785 res
= set_sampler_border_colorf(ctx
, sampObj
, c
);
797 /* state change - we do nothing special at this time */
800 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameteriv(pname=%s)\n",
801 _mesa_lookup_enum_by_nr(pname
));
804 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameteriv(param=%d)\n",
808 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameteriv(param=%d)\n",
816 static void GLAPIENTRY
817 _mesa_SamplerParameterfv(GLuint sampler
, GLenum pname
, const GLfloat
*params
)
819 struct gl_sampler_object
*sampObj
;
821 GET_CURRENT_CONTEXT(ctx
);
823 ASSERT_OUTSIDE_BEGIN_END(ctx
);
825 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
827 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterfv(sampler %u)",
833 case GL_TEXTURE_WRAP_S
:
834 res
= set_sampler_wrap_s(ctx
, sampObj
, (GLint
) params
[0]);
836 case GL_TEXTURE_WRAP_T
:
837 res
= set_sampler_wrap_t(ctx
, sampObj
, (GLint
) params
[0]);
839 case GL_TEXTURE_WRAP_R
:
840 res
= set_sampler_wrap_r(ctx
, sampObj
, (GLint
) params
[0]);
842 case GL_TEXTURE_MIN_FILTER
:
843 res
= set_sampler_min_filter(ctx
, sampObj
, (GLint
) params
[0]);
845 case GL_TEXTURE_MAG_FILTER
:
846 res
= set_sampler_mag_filter(ctx
, sampObj
, (GLint
) params
[0]);
848 case GL_TEXTURE_MIN_LOD
:
849 res
= set_sampler_min_lod(ctx
, sampObj
, params
[0]);
851 case GL_TEXTURE_MAX_LOD
:
852 res
= set_sampler_max_lod(ctx
, sampObj
, params
[0]);
854 case GL_TEXTURE_LOD_BIAS
:
855 res
= set_sampler_lod_bias(ctx
, sampObj
, params
[0]);
857 case GL_TEXTURE_COMPARE_MODE
:
858 res
= set_sampler_compare_mode(ctx
, sampObj
, (GLint
) params
[0]);
860 case GL_TEXTURE_COMPARE_FUNC
:
861 res
= set_sampler_compare_func(ctx
, sampObj
, (GLint
) params
[0]);
863 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
864 res
= set_sampler_max_anisotropy(ctx
, sampObj
, params
[0]);
866 case GL_TEXTURE_BORDER_COLOR
:
867 res
= set_sampler_border_colorf(ctx
, sampObj
, params
);
878 /* state change - we do nothing special at this time */
881 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterfv(pname=%s)\n",
882 _mesa_lookup_enum_by_nr(pname
));
885 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterfv(param=%f)\n",
889 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterfv(param=%f)\n",
897 static void GLAPIENTRY
898 _mesa_SamplerParameterIiv(GLuint sampler
, GLenum pname
, const GLint
*params
)
900 struct gl_sampler_object
*sampObj
;
902 GET_CURRENT_CONTEXT(ctx
);
904 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
906 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterIiv(sampler %u)",
912 case GL_TEXTURE_WRAP_S
:
913 res
= set_sampler_wrap_s(ctx
, sampObj
, params
[0]);
915 case GL_TEXTURE_WRAP_T
:
916 res
= set_sampler_wrap_t(ctx
, sampObj
, params
[0]);
918 case GL_TEXTURE_WRAP_R
:
919 res
= set_sampler_wrap_r(ctx
, sampObj
, params
[0]);
921 case GL_TEXTURE_MIN_FILTER
:
922 res
= set_sampler_min_filter(ctx
, sampObj
, params
[0]);
924 case GL_TEXTURE_MAG_FILTER
:
925 res
= set_sampler_mag_filter(ctx
, sampObj
, params
[0]);
927 case GL_TEXTURE_MIN_LOD
:
928 res
= set_sampler_min_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
930 case GL_TEXTURE_MAX_LOD
:
931 res
= set_sampler_max_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
933 case GL_TEXTURE_LOD_BIAS
:
934 res
= set_sampler_lod_bias(ctx
, sampObj
, (GLfloat
) params
[0]);
936 case GL_TEXTURE_COMPARE_MODE
:
937 res
= set_sampler_compare_mode(ctx
, sampObj
, params
[0]);
939 case GL_TEXTURE_COMPARE_FUNC
:
940 res
= set_sampler_compare_func(ctx
, sampObj
, params
[0]);
942 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
943 res
= set_sampler_max_anisotropy(ctx
, sampObj
, (GLfloat
) params
[0]);
945 case GL_TEXTURE_BORDER_COLOR
:
946 res
= set_sampler_border_colori(ctx
, sampObj
, params
);
957 /* state change - we do nothing special at this time */
960 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterIiv(pname=%s)\n",
961 _mesa_lookup_enum_by_nr(pname
));
964 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterIiv(param=%d)\n",
968 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterIiv(param=%d)\n",
977 static void GLAPIENTRY
978 _mesa_SamplerParameterIuiv(GLuint sampler
, GLenum pname
, const GLuint
*params
)
980 struct gl_sampler_object
*sampObj
;
982 GET_CURRENT_CONTEXT(ctx
);
984 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
986 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterIuiv(sampler %u)",
992 case GL_TEXTURE_WRAP_S
:
993 res
= set_sampler_wrap_s(ctx
, sampObj
, params
[0]);
995 case GL_TEXTURE_WRAP_T
:
996 res
= set_sampler_wrap_t(ctx
, sampObj
, params
[0]);
998 case GL_TEXTURE_WRAP_R
:
999 res
= set_sampler_wrap_r(ctx
, sampObj
, params
[0]);
1001 case GL_TEXTURE_MIN_FILTER
:
1002 res
= set_sampler_min_filter(ctx
, sampObj
, params
[0]);
1004 case GL_TEXTURE_MAG_FILTER
:
1005 res
= set_sampler_mag_filter(ctx
, sampObj
, params
[0]);
1007 case GL_TEXTURE_MIN_LOD
:
1008 res
= set_sampler_min_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
1010 case GL_TEXTURE_MAX_LOD
:
1011 res
= set_sampler_max_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
1013 case GL_TEXTURE_LOD_BIAS
:
1014 res
= set_sampler_lod_bias(ctx
, sampObj
, (GLfloat
) params
[0]);
1016 case GL_TEXTURE_COMPARE_MODE
:
1017 res
= set_sampler_compare_mode(ctx
, sampObj
, params
[0]);
1019 case GL_TEXTURE_COMPARE_FUNC
:
1020 res
= set_sampler_compare_func(ctx
, sampObj
, params
[0]);
1022 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1023 res
= set_sampler_max_anisotropy(ctx
, sampObj
, (GLfloat
) params
[0]);
1025 case GL_TEXTURE_BORDER_COLOR
:
1026 res
= set_sampler_border_colorui(ctx
, sampObj
, params
);
1029 res
= INVALID_PNAME
;
1037 /* state change - we do nothing special at this time */
1040 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterIuiv(pname=%s)\n",
1041 _mesa_lookup_enum_by_nr(pname
));
1044 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterIuiv(param=%u)\n",
1048 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterIuiv(param=%u)\n",
1057 static void GLAPIENTRY
1058 _mesa_GetSamplerParameteriv(GLuint sampler
, GLenum pname
, GLint
*params
)
1060 struct gl_sampler_object
*sampObj
;
1061 GET_CURRENT_CONTEXT(ctx
);
1063 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
1065 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetSamplerParameteriv(sampler %u)",
1071 case GL_TEXTURE_WRAP_S
:
1072 *params
= sampObj
->WrapS
;
1074 case GL_TEXTURE_WRAP_T
:
1075 *params
= sampObj
->WrapT
;
1077 case GL_TEXTURE_WRAP_R
:
1078 *params
= sampObj
->WrapR
;
1080 case GL_TEXTURE_MIN_FILTER
:
1081 *params
= sampObj
->MinFilter
;
1083 case GL_TEXTURE_MAG_FILTER
:
1084 *params
= sampObj
->MagFilter
;
1086 case GL_TEXTURE_MIN_LOD
:
1087 *params
= (GLint
) sampObj
->MinLod
;
1089 case GL_TEXTURE_MAX_LOD
:
1090 *params
= (GLint
) sampObj
->MaxLod
;
1092 case GL_TEXTURE_LOD_BIAS
:
1093 *params
= (GLint
) sampObj
->LodBias
;
1095 case GL_TEXTURE_COMPARE_MODE
:
1096 if (!ctx
->Extensions
.ARB_shadow
)
1098 *params
= sampObj
->CompareMode
;
1100 case GL_TEXTURE_COMPARE_FUNC
:
1101 if (!ctx
->Extensions
.ARB_shadow
)
1103 *params
= sampObj
->CompareFunc
;
1105 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1106 *params
= (GLint
) sampObj
->MaxAnisotropy
;
1108 case GL_TEXTURE_BORDER_COLOR
:
1109 params
[0] = FLOAT_TO_INT(sampObj
->BorderColor
.f
[0]);
1110 params
[1] = FLOAT_TO_INT(sampObj
->BorderColor
.f
[1]);
1111 params
[2] = FLOAT_TO_INT(sampObj
->BorderColor
.f
[2]);
1112 params
[3] = FLOAT_TO_INT(sampObj
->BorderColor
.f
[3]);
1114 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
1115 if (!ctx
->Extensions
.AMD_seamless_cubemap_per_texture
)
1117 *params
= sampObj
->CubeMapSeamless
;
1125 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetSamplerParameteriv(pname=%s)",
1126 _mesa_lookup_enum_by_nr(pname
));
1130 static void GLAPIENTRY
1131 _mesa_GetSamplerParameterfv(GLuint sampler
, GLenum pname
, GLfloat
*params
)
1133 struct gl_sampler_object
*sampObj
;
1134 GET_CURRENT_CONTEXT(ctx
);
1136 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
1138 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetSamplerParameterfv(sampler %u)",
1144 case GL_TEXTURE_WRAP_S
:
1145 *params
= (GLfloat
) sampObj
->WrapS
;
1147 case GL_TEXTURE_WRAP_T
:
1148 *params
= (GLfloat
) sampObj
->WrapT
;
1150 case GL_TEXTURE_WRAP_R
:
1151 *params
= (GLfloat
) sampObj
->WrapR
;
1153 case GL_TEXTURE_MIN_FILTER
:
1154 *params
= (GLfloat
) sampObj
->MinFilter
;
1156 case GL_TEXTURE_MAG_FILTER
:
1157 *params
= (GLfloat
) sampObj
->MagFilter
;
1159 case GL_TEXTURE_MIN_LOD
:
1160 *params
= sampObj
->MinLod
;
1162 case GL_TEXTURE_MAX_LOD
:
1163 *params
= sampObj
->MaxLod
;
1165 case GL_TEXTURE_LOD_BIAS
:
1166 *params
= sampObj
->LodBias
;
1168 case GL_TEXTURE_COMPARE_MODE
:
1169 if (!ctx
->Extensions
.ARB_shadow
)
1171 *params
= (GLfloat
) sampObj
->CompareMode
;
1173 case GL_TEXTURE_COMPARE_FUNC
:
1174 if (!ctx
->Extensions
.ARB_shadow
)
1176 *params
= (GLfloat
) sampObj
->CompareFunc
;
1178 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1179 *params
= sampObj
->MaxAnisotropy
;
1181 case GL_TEXTURE_BORDER_COLOR
:
1182 params
[0] = sampObj
->BorderColor
.f
[0];
1183 params
[1] = sampObj
->BorderColor
.f
[1];
1184 params
[2] = sampObj
->BorderColor
.f
[2];
1185 params
[3] = sampObj
->BorderColor
.f
[3];
1187 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
1188 if (!ctx
->Extensions
.AMD_seamless_cubemap_per_texture
)
1190 *params
= (GLfloat
) sampObj
->CubeMapSeamless
;
1198 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetSamplerParameterfv(pname=%s)",
1199 _mesa_lookup_enum_by_nr(pname
));
1203 static void GLAPIENTRY
1204 _mesa_GetSamplerParameterIiv(GLuint sampler
, GLenum pname
, GLint
*params
)
1206 struct gl_sampler_object
*sampObj
;
1207 GET_CURRENT_CONTEXT(ctx
);
1209 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
1211 _mesa_error(ctx
, GL_INVALID_VALUE
,
1212 "glGetSamplerParameterIiv(sampler %u)",
1218 case GL_TEXTURE_WRAP_S
:
1219 *params
= sampObj
->WrapS
;
1221 case GL_TEXTURE_WRAP_T
:
1222 *params
= sampObj
->WrapT
;
1224 case GL_TEXTURE_WRAP_R
:
1225 *params
= sampObj
->WrapR
;
1227 case GL_TEXTURE_MIN_FILTER
:
1228 *params
= sampObj
->MinFilter
;
1230 case GL_TEXTURE_MAG_FILTER
:
1231 *params
= sampObj
->MagFilter
;
1233 case GL_TEXTURE_MIN_LOD
:
1234 *params
= (GLint
) sampObj
->MinLod
;
1236 case GL_TEXTURE_MAX_LOD
:
1237 *params
= (GLint
) sampObj
->MaxLod
;
1239 case GL_TEXTURE_LOD_BIAS
:
1240 *params
= (GLint
) sampObj
->LodBias
;
1242 case GL_TEXTURE_COMPARE_MODE
:
1243 if (!ctx
->Extensions
.ARB_shadow
)
1245 *params
= sampObj
->CompareMode
;
1247 case GL_TEXTURE_COMPARE_FUNC
:
1248 if (!ctx
->Extensions
.ARB_shadow
)
1250 *params
= sampObj
->CompareFunc
;
1252 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1253 *params
= (GLint
) sampObj
->MaxAnisotropy
;
1255 case GL_TEXTURE_BORDER_COLOR
:
1256 params
[0] = sampObj
->BorderColor
.i
[0];
1257 params
[1] = sampObj
->BorderColor
.i
[1];
1258 params
[2] = sampObj
->BorderColor
.i
[2];
1259 params
[3] = sampObj
->BorderColor
.i
[3];
1261 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
1262 if (!ctx
->Extensions
.AMD_seamless_cubemap_per_texture
)
1264 *params
= sampObj
->CubeMapSeamless
;
1272 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetSamplerParameterIiv(pname=%s)",
1273 _mesa_lookup_enum_by_nr(pname
));
1277 static void GLAPIENTRY
1278 _mesa_GetSamplerParameterIuiv(GLuint sampler
, GLenum pname
, GLuint
*params
)
1280 struct gl_sampler_object
*sampObj
;
1281 GET_CURRENT_CONTEXT(ctx
);
1283 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
1285 _mesa_error(ctx
, GL_INVALID_VALUE
,
1286 "glGetSamplerParameterIuiv(sampler %u)",
1292 case GL_TEXTURE_WRAP_S
:
1293 *params
= sampObj
->WrapS
;
1295 case GL_TEXTURE_WRAP_T
:
1296 *params
= sampObj
->WrapT
;
1298 case GL_TEXTURE_WRAP_R
:
1299 *params
= sampObj
->WrapR
;
1301 case GL_TEXTURE_MIN_FILTER
:
1302 *params
= sampObj
->MinFilter
;
1304 case GL_TEXTURE_MAG_FILTER
:
1305 *params
= sampObj
->MagFilter
;
1307 case GL_TEXTURE_MIN_LOD
:
1308 *params
= (GLuint
) sampObj
->MinLod
;
1310 case GL_TEXTURE_MAX_LOD
:
1311 *params
= (GLuint
) sampObj
->MaxLod
;
1313 case GL_TEXTURE_LOD_BIAS
:
1314 *params
= (GLuint
) sampObj
->LodBias
;
1316 case GL_TEXTURE_COMPARE_MODE
:
1317 if (!ctx
->Extensions
.ARB_shadow
)
1319 *params
= sampObj
->CompareMode
;
1321 case GL_TEXTURE_COMPARE_FUNC
:
1322 if (!ctx
->Extensions
.ARB_shadow
)
1324 *params
= sampObj
->CompareFunc
;
1326 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1327 *params
= (GLuint
) sampObj
->MaxAnisotropy
;
1329 case GL_TEXTURE_BORDER_COLOR
:
1330 params
[0] = sampObj
->BorderColor
.ui
[0];
1331 params
[1] = sampObj
->BorderColor
.ui
[1];
1332 params
[2] = sampObj
->BorderColor
.ui
[2];
1333 params
[3] = sampObj
->BorderColor
.ui
[3];
1335 case GL_TEXTURE_CUBE_MAP_SEAMLESS
:
1336 if (!ctx
->Extensions
.AMD_seamless_cubemap_per_texture
)
1338 *params
= sampObj
->CubeMapSeamless
;
1346 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetSamplerParameterIuiv(pname=%s)",
1347 _mesa_lookup_enum_by_nr(pname
));
1352 _mesa_init_sampler_object_functions(struct dd_function_table
*driver
)
1354 driver
->NewSamplerObject
= _mesa_new_sampler_object
;
1355 driver
->DeleteSamplerObject
= _mesa_delete_sampler_object
;
1360 _mesa_init_sampler_object_dispatch(struct _glapi_table
*disp
)
1362 SET_GenSamplers(disp
, _mesa_GenSamplers
);
1363 SET_DeleteSamplers(disp
, _mesa_DeleteSamplers
);
1364 SET_IsSampler(disp
, _mesa_IsSampler
);
1365 SET_BindSampler(disp
, _mesa_BindSampler
);
1366 SET_SamplerParameteri(disp
, _mesa_SamplerParameteri
);
1367 SET_SamplerParameterf(disp
, _mesa_SamplerParameterf
);
1368 SET_SamplerParameteriv(disp
, _mesa_SamplerParameteriv
);
1369 SET_SamplerParameterfv(disp
, _mesa_SamplerParameterfv
);
1370 SET_SamplerParameterIiv(disp
, _mesa_SamplerParameterIiv
);
1371 SET_SamplerParameterIuiv(disp
, _mesa_SamplerParameterIuiv
);
1372 SET_GetSamplerParameteriv(disp
, _mesa_GetSamplerParameteriv
);
1373 SET_GetSamplerParameterfv(disp
, _mesa_GetSamplerParameterfv
);
1374 SET_GetSamplerParameterIiv(disp
, _mesa_GetSamplerParameterIiv
);
1375 SET_GetSamplerParameterIuiv(disp
, _mesa_GetSamplerParameterIuiv
);