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 buffer */
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 buffer's being deleted (look just above) */
94 /* Not sure this can every really happen. Warn if it does. */
95 _mesa_problem(NULL
, "referencing deleted buffer 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
->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
.MaxTextureImageUnits
) {
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 supported for the texture target.
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
:
297 case GL_CLAMP_TO_BORDER
:
298 return e
->ARB_texture_border_clamp
;
299 case GL_MIRRORED_REPEAT
:
300 return e
->ARB_texture_mirrored_repeat
;
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
);
570 static void GLAPIENTRY
571 _mesa_SamplerParameteri(GLuint sampler
, GLenum pname
, GLint param
)
573 struct gl_sampler_object
*sampObj
;
575 GET_CURRENT_CONTEXT(ctx
);
577 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
579 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameteri(sampler %u)",
585 case GL_TEXTURE_WRAP_S
:
586 res
= set_sampler_wrap_s(ctx
, sampObj
, param
);
588 case GL_TEXTURE_WRAP_T
:
589 res
= set_sampler_wrap_t(ctx
, sampObj
, param
);
591 case GL_TEXTURE_WRAP_R
:
592 res
= set_sampler_wrap_r(ctx
, sampObj
, param
);
594 case GL_TEXTURE_MIN_FILTER
:
595 res
= set_sampler_min_filter(ctx
, sampObj
, param
);
597 case GL_TEXTURE_MAG_FILTER
:
598 res
= set_sampler_mag_filter(ctx
, sampObj
, param
);
600 case GL_TEXTURE_MIN_LOD
:
601 res
= set_sampler_min_lod(ctx
, sampObj
, (GLfloat
) param
);
603 case GL_TEXTURE_MAX_LOD
:
604 res
= set_sampler_max_lod(ctx
, sampObj
, (GLfloat
) param
);
606 case GL_TEXTURE_LOD_BIAS
:
607 res
= set_sampler_lod_bias(ctx
, sampObj
, (GLfloat
) param
);
609 case GL_TEXTURE_COMPARE_MODE
:
610 res
= set_sampler_compare_mode(ctx
, sampObj
, param
);
612 case GL_TEXTURE_COMPARE_FUNC
:
613 res
= set_sampler_compare_func(ctx
, sampObj
, param
);
615 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
616 res
= set_sampler_max_anisotropy(ctx
, sampObj
, (GLfloat
) param
);
618 case GL_TEXTURE_BORDER_COLOR
:
629 /* state change - we do nothing special at this time */
632 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameteri(pname=%s)\n",
633 _mesa_lookup_enum_by_nr(pname
));
636 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameteri(param=%d)\n",
640 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameteri(param=%d)\n",
649 static void GLAPIENTRY
650 _mesa_SamplerParameterf(GLuint sampler
, GLenum pname
, GLfloat param
)
652 struct gl_sampler_object
*sampObj
;
654 GET_CURRENT_CONTEXT(ctx
);
656 ASSERT_OUTSIDE_BEGIN_END(ctx
);
658 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
660 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterf(sampler %u)",
666 case GL_TEXTURE_WRAP_S
:
667 res
= set_sampler_wrap_s(ctx
, sampObj
, (GLint
) param
);
669 case GL_TEXTURE_WRAP_T
:
670 res
= set_sampler_wrap_t(ctx
, sampObj
, (GLint
) param
);
672 case GL_TEXTURE_WRAP_R
:
673 res
= set_sampler_wrap_r(ctx
, sampObj
, (GLint
) param
);
675 case GL_TEXTURE_MIN_FILTER
:
676 res
= set_sampler_min_filter(ctx
, sampObj
, (GLint
) param
);
678 case GL_TEXTURE_MAG_FILTER
:
679 res
= set_sampler_mag_filter(ctx
, sampObj
, (GLint
) param
);
681 case GL_TEXTURE_MIN_LOD
:
682 res
= set_sampler_min_lod(ctx
, sampObj
, param
);
684 case GL_TEXTURE_MAX_LOD
:
685 res
= set_sampler_max_lod(ctx
, sampObj
, param
);
687 case GL_TEXTURE_LOD_BIAS
:
688 res
= set_sampler_lod_bias(ctx
, sampObj
, param
);
690 case GL_TEXTURE_COMPARE_MODE
:
691 res
= set_sampler_compare_mode(ctx
, sampObj
, (GLint
) param
);
693 case GL_TEXTURE_COMPARE_FUNC
:
694 res
= set_sampler_compare_func(ctx
, sampObj
, (GLint
) param
);
696 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
697 res
= set_sampler_max_anisotropy(ctx
, sampObj
, param
);
699 case GL_TEXTURE_BORDER_COLOR
:
710 /* state change - we do nothing special at this time */
713 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterf(pname=%s)\n",
714 _mesa_lookup_enum_by_nr(pname
));
717 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterf(param=%f)\n",
721 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterf(param=%f)\n",
729 static void GLAPIENTRY
730 _mesa_SamplerParameteriv(GLuint sampler
, GLenum pname
, const GLint
*params
)
732 struct gl_sampler_object
*sampObj
;
734 GET_CURRENT_CONTEXT(ctx
);
736 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
738 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameteriv(sampler %u)",
744 case GL_TEXTURE_WRAP_S
:
745 res
= set_sampler_wrap_s(ctx
, sampObj
, params
[0]);
747 case GL_TEXTURE_WRAP_T
:
748 res
= set_sampler_wrap_t(ctx
, sampObj
, params
[0]);
750 case GL_TEXTURE_WRAP_R
:
751 res
= set_sampler_wrap_r(ctx
, sampObj
, params
[0]);
753 case GL_TEXTURE_MIN_FILTER
:
754 res
= set_sampler_min_filter(ctx
, sampObj
, params
[0]);
756 case GL_TEXTURE_MAG_FILTER
:
757 res
= set_sampler_mag_filter(ctx
, sampObj
, params
[0]);
759 case GL_TEXTURE_MIN_LOD
:
760 res
= set_sampler_min_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
762 case GL_TEXTURE_MAX_LOD
:
763 res
= set_sampler_max_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
765 case GL_TEXTURE_LOD_BIAS
:
766 res
= set_sampler_lod_bias(ctx
, sampObj
, (GLfloat
) params
[0]);
768 case GL_TEXTURE_COMPARE_MODE
:
769 res
= set_sampler_compare_mode(ctx
, sampObj
, params
[0]);
771 case GL_TEXTURE_COMPARE_FUNC
:
772 res
= set_sampler_compare_func(ctx
, sampObj
, params
[0]);
774 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
775 res
= set_sampler_max_anisotropy(ctx
, sampObj
, (GLfloat
) params
[0]);
777 case GL_TEXTURE_BORDER_COLOR
:
780 c
[0] = INT_TO_FLOAT(params
[0]);
781 c
[1] = INT_TO_FLOAT(params
[1]);
782 c
[2] = INT_TO_FLOAT(params
[2]);
783 c
[3] = INT_TO_FLOAT(params
[3]);
784 res
= set_sampler_border_colorf(ctx
, sampObj
, c
);
796 /* state change - we do nothing special at this time */
799 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameteriv(pname=%s)\n",
800 _mesa_lookup_enum_by_nr(pname
));
803 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameteriv(param=%d)\n",
807 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameteriv(param=%d)\n",
815 static void GLAPIENTRY
816 _mesa_SamplerParameterfv(GLuint sampler
, GLenum pname
, const GLfloat
*params
)
818 struct gl_sampler_object
*sampObj
;
820 GET_CURRENT_CONTEXT(ctx
);
822 ASSERT_OUTSIDE_BEGIN_END(ctx
);
824 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
826 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterfv(sampler %u)",
832 case GL_TEXTURE_WRAP_S
:
833 res
= set_sampler_wrap_s(ctx
, sampObj
, (GLint
) params
[0]);
835 case GL_TEXTURE_WRAP_T
:
836 res
= set_sampler_wrap_t(ctx
, sampObj
, (GLint
) params
[0]);
838 case GL_TEXTURE_WRAP_R
:
839 res
= set_sampler_wrap_r(ctx
, sampObj
, (GLint
) params
[0]);
841 case GL_TEXTURE_MIN_FILTER
:
842 res
= set_sampler_min_filter(ctx
, sampObj
, (GLint
) params
[0]);
844 case GL_TEXTURE_MAG_FILTER
:
845 res
= set_sampler_mag_filter(ctx
, sampObj
, (GLint
) params
[0]);
847 case GL_TEXTURE_MIN_LOD
:
848 res
= set_sampler_min_lod(ctx
, sampObj
, params
[0]);
850 case GL_TEXTURE_MAX_LOD
:
851 res
= set_sampler_max_lod(ctx
, sampObj
, params
[0]);
853 case GL_TEXTURE_LOD_BIAS
:
854 res
= set_sampler_lod_bias(ctx
, sampObj
, params
[0]);
856 case GL_TEXTURE_COMPARE_MODE
:
857 res
= set_sampler_compare_mode(ctx
, sampObj
, (GLint
) params
[0]);
859 case GL_TEXTURE_COMPARE_FUNC
:
860 res
= set_sampler_compare_func(ctx
, sampObj
, (GLint
) params
[0]);
862 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
863 res
= set_sampler_max_anisotropy(ctx
, sampObj
, params
[0]);
865 case GL_TEXTURE_BORDER_COLOR
:
866 res
= set_sampler_border_colorf(ctx
, sampObj
, params
);
877 /* state change - we do nothing special at this time */
880 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterfv(pname=%s)\n",
881 _mesa_lookup_enum_by_nr(pname
));
884 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterfv(param=%f)\n",
888 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterfv(param=%f)\n",
896 static void GLAPIENTRY
897 _mesa_SamplerParameterIiv(GLuint sampler
, GLenum pname
, const GLint
*params
)
899 struct gl_sampler_object
*sampObj
;
901 GET_CURRENT_CONTEXT(ctx
);
903 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
905 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterIiv(sampler %u)",
911 case GL_TEXTURE_WRAP_S
:
912 res
= set_sampler_wrap_s(ctx
, sampObj
, params
[0]);
914 case GL_TEXTURE_WRAP_T
:
915 res
= set_sampler_wrap_t(ctx
, sampObj
, params
[0]);
917 case GL_TEXTURE_WRAP_R
:
918 res
= set_sampler_wrap_r(ctx
, sampObj
, params
[0]);
920 case GL_TEXTURE_MIN_FILTER
:
921 res
= set_sampler_min_filter(ctx
, sampObj
, params
[0]);
923 case GL_TEXTURE_MAG_FILTER
:
924 res
= set_sampler_mag_filter(ctx
, sampObj
, params
[0]);
926 case GL_TEXTURE_MIN_LOD
:
927 res
= set_sampler_min_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
929 case GL_TEXTURE_MAX_LOD
:
930 res
= set_sampler_max_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
932 case GL_TEXTURE_LOD_BIAS
:
933 res
= set_sampler_lod_bias(ctx
, sampObj
, (GLfloat
) params
[0]);
935 case GL_TEXTURE_COMPARE_MODE
:
936 res
= set_sampler_compare_mode(ctx
, sampObj
, params
[0]);
938 case GL_TEXTURE_COMPARE_FUNC
:
939 res
= set_sampler_compare_func(ctx
, sampObj
, params
[0]);
941 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
942 res
= set_sampler_max_anisotropy(ctx
, sampObj
, (GLfloat
) params
[0]);
944 case GL_TEXTURE_BORDER_COLOR
:
945 res
= set_sampler_border_colori(ctx
, sampObj
, params
);
956 /* state change - we do nothing special at this time */
959 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterIiv(pname=%s)\n",
960 _mesa_lookup_enum_by_nr(pname
));
963 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterIiv(param=%d)\n",
967 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterIiv(param=%d)\n",
976 static void GLAPIENTRY
977 _mesa_SamplerParameterIuiv(GLuint sampler
, GLenum pname
, const GLuint
*params
)
979 struct gl_sampler_object
*sampObj
;
981 GET_CURRENT_CONTEXT(ctx
);
983 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
985 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterIuiv(sampler %u)",
991 case GL_TEXTURE_WRAP_S
:
992 res
= set_sampler_wrap_s(ctx
, sampObj
, params
[0]);
994 case GL_TEXTURE_WRAP_T
:
995 res
= set_sampler_wrap_t(ctx
, sampObj
, params
[0]);
997 case GL_TEXTURE_WRAP_R
:
998 res
= set_sampler_wrap_r(ctx
, sampObj
, params
[0]);
1000 case GL_TEXTURE_MIN_FILTER
:
1001 res
= set_sampler_min_filter(ctx
, sampObj
, params
[0]);
1003 case GL_TEXTURE_MAG_FILTER
:
1004 res
= set_sampler_mag_filter(ctx
, sampObj
, params
[0]);
1006 case GL_TEXTURE_MIN_LOD
:
1007 res
= set_sampler_min_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
1009 case GL_TEXTURE_MAX_LOD
:
1010 res
= set_sampler_max_lod(ctx
, sampObj
, (GLfloat
) params
[0]);
1012 case GL_TEXTURE_LOD_BIAS
:
1013 res
= set_sampler_lod_bias(ctx
, sampObj
, (GLfloat
) params
[0]);
1015 case GL_TEXTURE_COMPARE_MODE
:
1016 res
= set_sampler_compare_mode(ctx
, sampObj
, params
[0]);
1018 case GL_TEXTURE_COMPARE_FUNC
:
1019 res
= set_sampler_compare_func(ctx
, sampObj
, params
[0]);
1021 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1022 res
= set_sampler_max_anisotropy(ctx
, sampObj
, (GLfloat
) params
[0]);
1024 case GL_TEXTURE_BORDER_COLOR
:
1025 res
= set_sampler_border_colorui(ctx
, sampObj
, params
);
1028 res
= INVALID_PNAME
;
1036 /* state change - we do nothing special at this time */
1039 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterIuiv(pname=%s)\n",
1040 _mesa_lookup_enum_by_nr(pname
));
1043 _mesa_error(ctx
, GL_INVALID_ENUM
, "glSamplerParameterIuiv(param=%u)\n",
1047 _mesa_error(ctx
, GL_INVALID_VALUE
, "glSamplerParameterIuiv(param=%u)\n",
1056 static void GLAPIENTRY
1057 _mesa_GetSamplerParameteriv(GLuint sampler
, GLenum pname
, GLint
*params
)
1059 struct gl_sampler_object
*sampObj
;
1060 GET_CURRENT_CONTEXT(ctx
);
1062 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
1064 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetSamplerParameteriv(sampler %u)",
1070 case GL_TEXTURE_WRAP_S
:
1071 *params
= sampObj
->WrapS
;
1073 case GL_TEXTURE_WRAP_T
:
1074 *params
= sampObj
->WrapT
;
1076 case GL_TEXTURE_WRAP_R
:
1077 *params
= sampObj
->WrapR
;
1079 case GL_TEXTURE_MIN_FILTER
:
1080 *params
= sampObj
->MinFilter
;
1082 case GL_TEXTURE_MAG_FILTER
:
1083 *params
= sampObj
->MagFilter
;
1085 case GL_TEXTURE_MIN_LOD
:
1086 *params
= (GLint
) sampObj
->MinLod
;
1088 case GL_TEXTURE_MAX_LOD
:
1089 *params
= (GLint
) sampObj
->MaxLod
;
1091 case GL_TEXTURE_LOD_BIAS
:
1092 *params
= (GLint
) sampObj
->LodBias
;
1094 case GL_TEXTURE_COMPARE_MODE
:
1095 if (!ctx
->Extensions
.ARB_shadow
)
1097 *params
= sampObj
->CompareMode
;
1099 case GL_TEXTURE_COMPARE_FUNC
:
1100 if (!ctx
->Extensions
.ARB_shadow
)
1102 *params
= sampObj
->CompareFunc
;
1104 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1105 *params
= (GLint
) sampObj
->MaxAnisotropy
;
1107 case GL_TEXTURE_BORDER_COLOR
:
1108 params
[0] = FLOAT_TO_INT(sampObj
->BorderColor
.f
[0]);
1109 params
[1] = FLOAT_TO_INT(sampObj
->BorderColor
.f
[1]);
1110 params
[2] = FLOAT_TO_INT(sampObj
->BorderColor
.f
[2]);
1111 params
[3] = FLOAT_TO_INT(sampObj
->BorderColor
.f
[3]);
1119 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetSamplerParameteriv(pname=%s)",
1120 _mesa_lookup_enum_by_nr(pname
));
1124 static void GLAPIENTRY
1125 _mesa_GetSamplerParameterfv(GLuint sampler
, GLenum pname
, GLfloat
*params
)
1127 struct gl_sampler_object
*sampObj
;
1128 GET_CURRENT_CONTEXT(ctx
);
1130 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
1132 _mesa_error(ctx
, GL_INVALID_VALUE
, "glGetSamplerParameterfv(sampler %u)",
1138 case GL_TEXTURE_WRAP_S
:
1139 *params
= (GLfloat
) sampObj
->WrapS
;
1141 case GL_TEXTURE_WRAP_T
:
1142 *params
= (GLfloat
) sampObj
->WrapT
;
1144 case GL_TEXTURE_WRAP_R
:
1145 *params
= (GLfloat
) sampObj
->WrapR
;
1147 case GL_TEXTURE_MIN_FILTER
:
1148 *params
= (GLfloat
) sampObj
->MinFilter
;
1150 case GL_TEXTURE_MAG_FILTER
:
1151 *params
= (GLfloat
) sampObj
->MagFilter
;
1153 case GL_TEXTURE_MIN_LOD
:
1154 *params
= sampObj
->MinLod
;
1156 case GL_TEXTURE_MAX_LOD
:
1157 *params
= sampObj
->MaxLod
;
1159 case GL_TEXTURE_LOD_BIAS
:
1160 *params
= sampObj
->LodBias
;
1162 case GL_TEXTURE_COMPARE_MODE
:
1163 if (!ctx
->Extensions
.ARB_shadow
)
1165 *params
= (GLfloat
) sampObj
->CompareMode
;
1167 case GL_TEXTURE_COMPARE_FUNC
:
1168 if (!ctx
->Extensions
.ARB_shadow
)
1170 *params
= (GLfloat
) sampObj
->CompareFunc
;
1172 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1173 *params
= sampObj
->MaxAnisotropy
;
1175 case GL_TEXTURE_BORDER_COLOR
:
1176 params
[0] = sampObj
->BorderColor
.f
[0];
1177 params
[1] = sampObj
->BorderColor
.f
[1];
1178 params
[2] = sampObj
->BorderColor
.f
[2];
1179 params
[3] = sampObj
->BorderColor
.f
[3];
1187 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetSamplerParameterfv(pname=%s)",
1188 _mesa_lookup_enum_by_nr(pname
));
1192 static void GLAPIENTRY
1193 _mesa_GetSamplerParameterIiv(GLuint sampler
, GLenum pname
, GLint
*params
)
1195 struct gl_sampler_object
*sampObj
;
1196 GET_CURRENT_CONTEXT(ctx
);
1198 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
1200 _mesa_error(ctx
, GL_INVALID_VALUE
,
1201 "glGetSamplerParameterIiv(sampler %u)",
1207 case GL_TEXTURE_WRAP_S
:
1208 *params
= sampObj
->WrapS
;
1210 case GL_TEXTURE_WRAP_T
:
1211 *params
= sampObj
->WrapT
;
1213 case GL_TEXTURE_WRAP_R
:
1214 *params
= sampObj
->WrapR
;
1216 case GL_TEXTURE_MIN_FILTER
:
1217 *params
= sampObj
->MinFilter
;
1219 case GL_TEXTURE_MAG_FILTER
:
1220 *params
= sampObj
->MagFilter
;
1222 case GL_TEXTURE_MIN_LOD
:
1223 *params
= (GLint
) sampObj
->MinLod
;
1225 case GL_TEXTURE_MAX_LOD
:
1226 *params
= (GLint
) sampObj
->MaxLod
;
1228 case GL_TEXTURE_LOD_BIAS
:
1229 *params
= (GLint
) sampObj
->LodBias
;
1231 case GL_TEXTURE_COMPARE_MODE
:
1232 if (!ctx
->Extensions
.ARB_shadow
)
1234 *params
= sampObj
->CompareMode
;
1236 case GL_TEXTURE_COMPARE_FUNC
:
1237 if (!ctx
->Extensions
.ARB_shadow
)
1239 *params
= sampObj
->CompareFunc
;
1241 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1242 *params
= (GLint
) sampObj
->MaxAnisotropy
;
1244 case GL_TEXTURE_BORDER_COLOR
:
1245 params
[0] = sampObj
->BorderColor
.i
[0];
1246 params
[1] = sampObj
->BorderColor
.i
[1];
1247 params
[2] = sampObj
->BorderColor
.i
[2];
1248 params
[3] = sampObj
->BorderColor
.i
[3];
1256 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetSamplerParameterIiv(pname=%s)",
1257 _mesa_lookup_enum_by_nr(pname
));
1261 static void GLAPIENTRY
1262 _mesa_GetSamplerParameterIuiv(GLuint sampler
, GLenum pname
, GLuint
*params
)
1264 struct gl_sampler_object
*sampObj
;
1265 GET_CURRENT_CONTEXT(ctx
);
1267 sampObj
= _mesa_lookup_samplerobj(ctx
, sampler
);
1269 _mesa_error(ctx
, GL_INVALID_VALUE
,
1270 "glGetSamplerParameterIuiv(sampler %u)",
1276 case GL_TEXTURE_WRAP_S
:
1277 *params
= sampObj
->WrapS
;
1279 case GL_TEXTURE_WRAP_T
:
1280 *params
= sampObj
->WrapT
;
1282 case GL_TEXTURE_WRAP_R
:
1283 *params
= sampObj
->WrapR
;
1285 case GL_TEXTURE_MIN_FILTER
:
1286 *params
= sampObj
->MinFilter
;
1288 case GL_TEXTURE_MAG_FILTER
:
1289 *params
= sampObj
->MagFilter
;
1291 case GL_TEXTURE_MIN_LOD
:
1292 *params
= (GLuint
) sampObj
->MinLod
;
1294 case GL_TEXTURE_MAX_LOD
:
1295 *params
= (GLuint
) sampObj
->MaxLod
;
1297 case GL_TEXTURE_LOD_BIAS
:
1298 *params
= (GLuint
) sampObj
->LodBias
;
1300 case GL_TEXTURE_COMPARE_MODE
:
1301 if (!ctx
->Extensions
.ARB_shadow
)
1303 *params
= sampObj
->CompareMode
;
1305 case GL_TEXTURE_COMPARE_FUNC
:
1306 if (!ctx
->Extensions
.ARB_shadow
)
1308 *params
= sampObj
->CompareFunc
;
1310 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1311 *params
= (GLuint
) sampObj
->MaxAnisotropy
;
1313 case GL_TEXTURE_BORDER_COLOR
:
1314 params
[0] = sampObj
->BorderColor
.ui
[0];
1315 params
[1] = sampObj
->BorderColor
.ui
[1];
1316 params
[2] = sampObj
->BorderColor
.ui
[2];
1317 params
[3] = sampObj
->BorderColor
.ui
[3];
1325 _mesa_error(ctx
, GL_INVALID_ENUM
, "glGetSamplerParameterIuiv(pname=%s)",
1326 _mesa_lookup_enum_by_nr(pname
));
1331 _mesa_init_sampler_object_functions(struct dd_function_table
*driver
)
1333 driver
->NewSamplerObject
= _mesa_new_sampler_object
;
1334 driver
->DeleteSamplerObject
= _mesa_delete_sampler_object
;
1339 _mesa_init_sampler_object_dispatch(struct _glapi_table
*disp
)
1341 SET_GenSamplers(disp
, _mesa_GenSamplers
);
1342 SET_DeleteSamplers(disp
, _mesa_DeleteSamplers
);
1343 SET_IsSampler(disp
, _mesa_IsSampler
);
1344 SET_BindSampler(disp
, _mesa_BindSampler
);
1345 SET_SamplerParameteri(disp
, _mesa_SamplerParameteri
);
1346 SET_SamplerParameterf(disp
, _mesa_SamplerParameterf
);
1347 SET_SamplerParameteriv(disp
, _mesa_SamplerParameteriv
);
1348 SET_SamplerParameterfv(disp
, _mesa_SamplerParameterfv
);
1349 SET_SamplerParameterIiv(disp
, _mesa_SamplerParameterIiv
);
1350 SET_SamplerParameterIuiv(disp
, _mesa_SamplerParameterIuiv
);
1351 SET_GetSamplerParameteriv(disp
, _mesa_GetSamplerParameteriv
);
1352 SET_GetSamplerParameterfv(disp
, _mesa_GetSamplerParameterfv
);
1353 SET_GetSamplerParameterIiv(disp
, _mesa_GetSamplerParameterIiv
);
1354 SET_GetSamplerParameterIuiv(disp
, _mesa_GetSamplerParameterIuiv
);