blob: 9914029468994f65ab2dc2b002e1c5df60e39958 [file] [log] [blame]
Geoff Langff5b2d52016-09-07 11:32:23 -04001//
2// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// queryutils.cpp: Utilities for querying values from GL objects
8
9#include "libANGLE/queryutils.h"
10
Geoff Langc1984ed2016-10-07 12:41:00 -040011#include "common/utilities.h"
12
Geoff Langff5b2d52016-09-07 11:32:23 -040013#include "libANGLE/Buffer.h"
14#include "libANGLE/Framebuffer.h"
15#include "libANGLE/Program.h"
Geoff Lang740d9022016-10-07 11:20:52 -040016#include "libANGLE/Renderbuffer.h"
Geoff Langc1984ed2016-10-07 12:41:00 -040017#include "libANGLE/Sampler.h"
Geoff Langd7d0ed32016-10-07 11:33:51 -040018#include "libANGLE/Shader.h"
Geoff Langc1984ed2016-10-07 12:41:00 -040019#include "libANGLE/Texture.h"
Geoff Lang0b031062016-10-13 14:30:04 -040020#include "libANGLE/VertexAttribute.h"
Geoff Langff5b2d52016-09-07 11:32:23 -040021
22namespace gl
23{
Geoff Langc1984ed2016-10-07 12:41:00 -040024
25namespace
26{
27template <typename ParamType>
28void QueryTexParameterBase(const Texture *texture, GLenum pname, ParamType *params)
29{
30 ASSERT(texture != nullptr);
31
32 switch (pname)
33 {
34 case GL_TEXTURE_MAG_FILTER:
35 *params = ConvertFromGLenum<ParamType>(texture->getMagFilter());
36 break;
37 case GL_TEXTURE_MIN_FILTER:
38 *params = ConvertFromGLenum<ParamType>(texture->getMinFilter());
39 break;
40 case GL_TEXTURE_WRAP_S:
41 *params = ConvertFromGLenum<ParamType>(texture->getWrapS());
42 break;
43 case GL_TEXTURE_WRAP_T:
44 *params = ConvertFromGLenum<ParamType>(texture->getWrapT());
45 break;
46 case GL_TEXTURE_WRAP_R:
47 *params = ConvertFromGLenum<ParamType>(texture->getWrapR());
48 break;
49 case GL_TEXTURE_IMMUTABLE_FORMAT:
50 *params = ConvertFromGLboolean<ParamType>(texture->getImmutableFormat());
51 break;
52 case GL_TEXTURE_IMMUTABLE_LEVELS:
53 *params = ConvertFromGLuint<ParamType>(texture->getImmutableLevels());
54 break;
55 case GL_TEXTURE_USAGE_ANGLE:
56 *params = ConvertFromGLenum<ParamType>(texture->getUsage());
57 break;
58 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
59 *params = ConvertFromGLfloat<ParamType>(texture->getMaxAnisotropy());
60 break;
61 case GL_TEXTURE_SWIZZLE_R:
62 *params = ConvertFromGLenum<ParamType>(texture->getSwizzleRed());
63 break;
64 case GL_TEXTURE_SWIZZLE_G:
65 *params = ConvertFromGLenum<ParamType>(texture->getSwizzleGreen());
66 break;
67 case GL_TEXTURE_SWIZZLE_B:
68 *params = ConvertFromGLenum<ParamType>(texture->getSwizzleBlue());
69 break;
70 case GL_TEXTURE_SWIZZLE_A:
71 *params = ConvertFromGLenum<ParamType>(texture->getSwizzleAlpha());
72 break;
73 case GL_TEXTURE_BASE_LEVEL:
74 *params = ConvertFromGLuint<ParamType>(texture->getBaseLevel());
75 break;
76 case GL_TEXTURE_MAX_LEVEL:
77 *params = ConvertFromGLuint<ParamType>(texture->getMaxLevel());
78 break;
79 case GL_TEXTURE_MIN_LOD:
80 *params = ConvertFromGLfloat<ParamType>(texture->getSamplerState().minLod);
81 break;
82 case GL_TEXTURE_MAX_LOD:
83 *params = ConvertFromGLfloat<ParamType>(texture->getSamplerState().maxLod);
84 break;
85 case GL_TEXTURE_COMPARE_MODE:
86 *params = ConvertFromGLenum<ParamType>(texture->getCompareMode());
87 break;
88 case GL_TEXTURE_COMPARE_FUNC:
89 *params = ConvertFromGLenum<ParamType>(texture->getCompareFunc());
90 break;
91 default:
92 UNREACHABLE();
93 break;
94 }
95}
96
97template <typename ParamType>
98void SetTexParameterBase(Texture *texture, GLenum pname, const ParamType *params)
99{
100 ASSERT(texture != nullptr);
101
102 switch (pname)
103 {
104 case GL_TEXTURE_WRAP_S:
105 texture->setWrapS(ConvertToGLenum(params[0]));
106 break;
107 case GL_TEXTURE_WRAP_T:
108 texture->setWrapT(ConvertToGLenum(params[0]));
109 break;
110 case GL_TEXTURE_WRAP_R:
111 texture->setWrapR(ConvertToGLenum(params[0]));
112 break;
113 case GL_TEXTURE_MIN_FILTER:
114 texture->setMinFilter(ConvertToGLenum(params[0]));
115 break;
116 case GL_TEXTURE_MAG_FILTER:
117 texture->setMagFilter(ConvertToGLenum(params[0]));
118 break;
119 case GL_TEXTURE_USAGE_ANGLE:
120 texture->setUsage(ConvertToGLenum(params[0]));
121 break;
122 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
123 texture->setMaxAnisotropy(ConvertToGLfloat(params[0]));
124 break;
125 case GL_TEXTURE_COMPARE_MODE:
126 texture->setCompareMode(ConvertToGLenum(params[0]));
127 break;
128 case GL_TEXTURE_COMPARE_FUNC:
129 texture->setCompareFunc(ConvertToGLenum(params[0]));
130 break;
131 case GL_TEXTURE_SWIZZLE_R:
132 texture->setSwizzleRed(ConvertToGLenum(params[0]));
133 break;
134 case GL_TEXTURE_SWIZZLE_G:
135 texture->setSwizzleGreen(ConvertToGLenum(params[0]));
136 break;
137 case GL_TEXTURE_SWIZZLE_B:
138 texture->setSwizzleBlue(ConvertToGLenum(params[0]));
139 break;
140 case GL_TEXTURE_SWIZZLE_A:
141 texture->setSwizzleAlpha(ConvertToGLenum(params[0]));
142 break;
143 case GL_TEXTURE_BASE_LEVEL:
144 texture->setBaseLevel(ConvertToGLuint(params[0]));
145 break;
146 case GL_TEXTURE_MAX_LEVEL:
147 texture->setMaxLevel(ConvertToGLuint(params[0]));
148 break;
149 case GL_TEXTURE_MIN_LOD:
150 texture->setMinLod(ConvertToGLfloat(params[0]));
151 break;
152 case GL_TEXTURE_MAX_LOD:
153 texture->setMaxLod(ConvertToGLfloat(params[0]));
154 break;
155 default:
156 UNREACHABLE();
157 break;
158 }
159}
160
161template <typename ParamType>
162void QuerySamplerParameterBase(const Sampler *sampler, GLenum pname, ParamType *params)
163{
164 switch (pname)
165 {
166 case GL_TEXTURE_MIN_FILTER:
167 *params = ConvertFromGLenum<ParamType>(sampler->getMinFilter());
168 break;
169 case GL_TEXTURE_MAG_FILTER:
170 *params = ConvertFromGLenum<ParamType>(sampler->getMagFilter());
171 break;
172 case GL_TEXTURE_WRAP_S:
173 *params = ConvertFromGLenum<ParamType>(sampler->getWrapS());
174 break;
175 case GL_TEXTURE_WRAP_T:
176 *params = ConvertFromGLenum<ParamType>(sampler->getWrapT());
177 break;
178 case GL_TEXTURE_WRAP_R:
179 *params = ConvertFromGLenum<ParamType>(sampler->getWrapR());
180 break;
181 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
182 *params = ConvertFromGLfloat<ParamType>(sampler->getMaxAnisotropy());
183 break;
184 case GL_TEXTURE_MIN_LOD:
185 *params = ConvertFromGLfloat<ParamType>(sampler->getMinLod());
186 break;
187 case GL_TEXTURE_MAX_LOD:
188 *params = ConvertFromGLfloat<ParamType>(sampler->getMaxLod());
189 break;
190 case GL_TEXTURE_COMPARE_MODE:
191 *params = ConvertFromGLenum<ParamType>(sampler->getCompareMode());
192 break;
193 case GL_TEXTURE_COMPARE_FUNC:
194 *params = ConvertFromGLenum<ParamType>(sampler->getCompareFunc());
195 break;
196 default:
197 UNREACHABLE();
198 break;
199 }
200}
201
202template <typename ParamType>
203void SetSamplerParameterBase(Sampler *sampler, GLenum pname, const ParamType *params)
204{
205 switch (pname)
206 {
207 case GL_TEXTURE_WRAP_S:
208 sampler->setWrapS(ConvertToGLenum(params[0]));
209 break;
210 case GL_TEXTURE_WRAP_T:
211 sampler->setWrapT(ConvertToGLenum(params[0]));
212 break;
213 case GL_TEXTURE_WRAP_R:
214 sampler->setWrapR(ConvertToGLenum(params[0]));
215 break;
216 case GL_TEXTURE_MIN_FILTER:
217 sampler->setMinFilter(ConvertToGLenum(params[0]));
218 break;
219 case GL_TEXTURE_MAG_FILTER:
220 sampler->setMagFilter(ConvertToGLenum(params[0]));
221 break;
222 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
223 sampler->setMaxAnisotropy(ConvertToGLfloat(params[0]));
224 break;
225 case GL_TEXTURE_COMPARE_MODE:
226 sampler->setCompareMode(ConvertToGLenum(params[0]));
227 break;
228 case GL_TEXTURE_COMPARE_FUNC:
229 sampler->setCompareFunc(ConvertToGLenum(params[0]));
230 break;
231 case GL_TEXTURE_MIN_LOD:
232 sampler->setMinLod(ConvertToGLfloat(params[0]));
233 break;
234 case GL_TEXTURE_MAX_LOD:
235 sampler->setMaxLod(ConvertToGLfloat(params[0]));
236 break;
237 default:
238 UNREACHABLE();
239 break;
240 }
241}
242
Geoff Lang0b031062016-10-13 14:30:04 -0400243template <typename ParamType, typename CurrentDataType>
244ParamType ConvertCurrentValue(CurrentDataType currentValue)
245{
246 return static_cast<ParamType>(currentValue);
247}
248
249template <>
250GLint ConvertCurrentValue(GLfloat currentValue)
251{
252 return iround<GLint>(currentValue);
253}
254
255template <typename ParamType, typename CurrentDataType, size_t CurrentValueCount>
256void QueryVertexAttribBase(const VertexAttribute &attrib,
257 const CurrentDataType (&currentValueData)[CurrentValueCount],
258 GLenum pname,
259 ParamType *params)
260{
261 switch (pname)
262 {
263 case GL_CURRENT_VERTEX_ATTRIB:
264 for (size_t i = 0; i < CurrentValueCount; ++i)
265 {
266 params[i] = ConvertCurrentValue<ParamType>(currentValueData[i]);
267 }
268 break;
269 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
270 *params = ConvertFromGLboolean<ParamType>(attrib.enabled);
271 break;
272 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
273 *params = ConvertFromGLuint<ParamType>(attrib.size);
274 break;
275 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
276 *params = ConvertFromGLuint<ParamType>(attrib.stride);
277 break;
278 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
279 *params = ConvertFromGLenum<ParamType>(attrib.type);
280 break;
281 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
282 *params = ConvertFromGLboolean<ParamType>(attrib.normalized);
283 break;
284 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
285 *params = ConvertFromGLuint<ParamType>(attrib.buffer.id());
286 break;
287 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
288 *params = ConvertFromGLuint<ParamType>(attrib.divisor);
289 break;
290 case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
291 *params = ConvertFromGLboolean<ParamType>(attrib.pureInteger);
292 break;
293 default:
294 UNREACHABLE();
295 break;
296 }
297}
298
Geoff Langc1984ed2016-10-07 12:41:00 -0400299} // anonymous namespace
300
Geoff Langff5b2d52016-09-07 11:32:23 -0400301void QueryFramebufferAttachmentParameteriv(const Framebuffer *framebuffer,
302 GLenum attachment,
303 GLenum pname,
304 GLint *params)
305{
306 ASSERT(framebuffer);
307
308 const FramebufferAttachment *attachmentObject = framebuffer->getAttachment(attachment);
309 if (attachmentObject == nullptr)
310 {
311 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
312 // is NONE, then querying any other pname will generate INVALID_ENUM.
313
314 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
315 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
316 // INVALID_OPERATION for all other pnames
317
318 switch (pname)
319 {
320 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
321 *params = GL_NONE;
322 break;
323
324 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
325 *params = 0;
326 break;
327
328 default:
329 UNREACHABLE();
330 break;
331 }
332
333 return;
334 }
335
336 switch (pname)
337 {
338 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
339 *params = attachmentObject->type();
340 break;
341
342 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
343 *params = attachmentObject->id();
344 break;
345
346 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
347 *params = attachmentObject->mipLevel();
348 break;
349
350 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
351 *params = attachmentObject->cubeMapFace();
352 break;
353
354 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
355 *params = attachmentObject->getRedSize();
356 break;
357
358 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
359 *params = attachmentObject->getGreenSize();
360 break;
361
362 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
363 *params = attachmentObject->getBlueSize();
364 break;
365
366 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
367 *params = attachmentObject->getAlphaSize();
368 break;
369
370 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
371 *params = attachmentObject->getDepthSize();
372 break;
373
374 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
375 *params = attachmentObject->getStencilSize();
376 break;
377
378 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
379 *params = attachmentObject->getComponentType();
380 break;
381
382 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
383 *params = attachmentObject->getColorEncoding();
384 break;
385
386 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
387 *params = attachmentObject->layer();
388 break;
389
390 default:
391 UNREACHABLE();
392 break;
393 }
394}
395
396void QueryBufferParameteriv(const Buffer *buffer, GLenum pname, GLint *params)
397{
398 ASSERT(buffer != nullptr);
399
400 switch (pname)
401 {
402 case GL_BUFFER_USAGE:
403 *params = static_cast<GLint>(buffer->getUsage());
404 break;
405 case GL_BUFFER_SIZE:
406 *params = clampCast<GLint>(buffer->getSize());
407 break;
408 case GL_BUFFER_ACCESS_FLAGS:
409 *params = buffer->getAccessFlags();
410 break;
411 case GL_BUFFER_ACCESS_OES:
412 *params = buffer->getAccess();
413 break;
414 case GL_BUFFER_MAPPED:
415 *params = static_cast<GLint>(buffer->isMapped());
416 break;
417 case GL_BUFFER_MAP_OFFSET:
418 *params = clampCast<GLint>(buffer->getMapOffset());
419 break;
420 case GL_BUFFER_MAP_LENGTH:
421 *params = clampCast<GLint>(buffer->getMapLength());
422 break;
423 default:
424 UNREACHABLE();
425 break;
426 }
427}
428
429void QueryProgramiv(const Program *program, GLenum pname, GLint *params)
430{
431 ASSERT(program != nullptr);
432
433 switch (pname)
434 {
435 case GL_DELETE_STATUS:
436 *params = program->isFlaggedForDeletion();
437 return;
438 case GL_LINK_STATUS:
439 *params = program->isLinked();
440 return;
441 case GL_VALIDATE_STATUS:
442 *params = program->isValidated();
443 return;
444 case GL_INFO_LOG_LENGTH:
445 *params = program->getInfoLogLength();
446 return;
447 case GL_ATTACHED_SHADERS:
448 *params = program->getAttachedShadersCount();
449 return;
450 case GL_ACTIVE_ATTRIBUTES:
451 *params = program->getActiveAttributeCount();
452 return;
453 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
454 *params = program->getActiveAttributeMaxLength();
455 return;
456 case GL_ACTIVE_UNIFORMS:
457 *params = program->getActiveUniformCount();
458 return;
459 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
460 *params = program->getActiveUniformMaxLength();
461 return;
462 case GL_PROGRAM_BINARY_LENGTH_OES:
463 *params = program->getBinaryLength();
464 return;
465 case GL_ACTIVE_UNIFORM_BLOCKS:
466 *params = program->getActiveUniformBlockCount();
467 return;
468 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
469 *params = program->getActiveUniformBlockMaxLength();
470 break;
471 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
472 *params = program->getTransformFeedbackBufferMode();
473 break;
474 case GL_TRANSFORM_FEEDBACK_VARYINGS:
475 *params = program->getTransformFeedbackVaryingCount();
476 break;
477 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
478 *params = program->getTransformFeedbackVaryingMaxLength();
479 break;
480 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
481 *params = program->getBinaryRetrievableHint();
482 break;
483 default:
484 UNREACHABLE();
485 break;
486 }
487}
Geoff Lang740d9022016-10-07 11:20:52 -0400488
489void QueryRenderbufferiv(const Renderbuffer *renderbuffer, GLenum pname, GLint *params)
490{
491 ASSERT(renderbuffer != nullptr);
492
493 switch (pname)
494 {
495 case GL_RENDERBUFFER_WIDTH:
496 *params = renderbuffer->getWidth();
497 break;
498 case GL_RENDERBUFFER_HEIGHT:
499 *params = renderbuffer->getHeight();
500 break;
501 case GL_RENDERBUFFER_INTERNAL_FORMAT:
502 *params = renderbuffer->getFormat().info->internalFormat;
503 break;
504 case GL_RENDERBUFFER_RED_SIZE:
505 *params = renderbuffer->getRedSize();
506 break;
507 case GL_RENDERBUFFER_GREEN_SIZE:
508 *params = renderbuffer->getGreenSize();
509 break;
510 case GL_RENDERBUFFER_BLUE_SIZE:
511 *params = renderbuffer->getBlueSize();
512 break;
513 case GL_RENDERBUFFER_ALPHA_SIZE:
514 *params = renderbuffer->getAlphaSize();
515 break;
516 case GL_RENDERBUFFER_DEPTH_SIZE:
517 *params = renderbuffer->getDepthSize();
518 break;
519 case GL_RENDERBUFFER_STENCIL_SIZE:
520 *params = renderbuffer->getStencilSize();
521 break;
522 case GL_RENDERBUFFER_SAMPLES_ANGLE:
523 *params = renderbuffer->getSamples();
524 break;
525 default:
526 UNREACHABLE();
527 break;
528 }
529}
Geoff Langd7d0ed32016-10-07 11:33:51 -0400530
531void QueryShaderiv(const Shader *shader, GLenum pname, GLint *params)
532{
533 ASSERT(shader != nullptr);
534
535 switch (pname)
536 {
537 case GL_SHADER_TYPE:
538 *params = shader->getType();
539 return;
540 case GL_DELETE_STATUS:
541 *params = shader->isFlaggedForDeletion();
542 return;
543 case GL_COMPILE_STATUS:
544 *params = shader->isCompiled() ? GL_TRUE : GL_FALSE;
545 return;
546 case GL_INFO_LOG_LENGTH:
547 *params = shader->getInfoLogLength();
548 return;
549 case GL_SHADER_SOURCE_LENGTH:
550 *params = shader->getSourceLength();
551 return;
552 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
553 *params = shader->getTranslatedSourceWithDebugInfoLength();
554 return;
555 default:
556 UNREACHABLE();
557 break;
558 }
559}
Geoff Langc1984ed2016-10-07 12:41:00 -0400560
561void QueryTexParameterfv(const Texture *texture, GLenum pname, GLfloat *params)
562{
563 QueryTexParameterBase(texture, pname, params);
564}
565
566void QueryTexParameteriv(const Texture *texture, GLenum pname, GLint *params)
567{
568 QueryTexParameterBase(texture, pname, params);
569}
570
571void QuerySamplerParameterfv(const Sampler *sampler, GLenum pname, GLfloat *params)
572{
573 QuerySamplerParameterBase(sampler, pname, params);
574}
575
576void QuerySamplerParameteriv(const Sampler *sampler, GLenum pname, GLint *params)
577{
578 QuerySamplerParameterBase(sampler, pname, params);
579}
580
Geoff Lang0b031062016-10-13 14:30:04 -0400581void QueryVertexAttribfv(const VertexAttribute &attrib,
582 const VertexAttribCurrentValueData &currentValueData,
583 GLenum pname,
584 GLfloat *params)
585{
586 QueryVertexAttribBase(attrib, currentValueData.FloatValues, pname, params);
587}
588
589void QueryVertexAttribiv(const VertexAttribute &attrib,
590 const VertexAttribCurrentValueData &currentValueData,
591 GLenum pname,
592 GLint *params)
593{
594 QueryVertexAttribBase(attrib, currentValueData.FloatValues, pname, params);
595}
596
597void QueryVertexAttribPointerv(const VertexAttribute &attrib, GLenum pname, GLvoid **pointer)
598{
599 switch (pname)
600 {
601 case GL_VERTEX_ATTRIB_ARRAY_POINTER:
602 *pointer = const_cast<GLvoid *>(attrib.pointer);
603 break;
604
605 default:
606 UNREACHABLE();
607 break;
608 }
609}
610
611void QueryVertexAttribIiv(const VertexAttribute &attrib,
612 const VertexAttribCurrentValueData &currentValueData,
613 GLenum pname,
614 GLint *params)
615{
616 QueryVertexAttribBase(attrib, currentValueData.IntValues, pname, params);
617}
618
619void QueryVertexAttribIuiv(const VertexAttribute &attrib,
620 const VertexAttribCurrentValueData &currentValueData,
621 GLenum pname,
622 GLuint *params)
623{
624 QueryVertexAttribBase(attrib, currentValueData.UnsignedIntValues, pname, params);
625}
626
Geoff Langc1984ed2016-10-07 12:41:00 -0400627void SetTexParameterf(Texture *texture, GLenum pname, GLfloat param)
628{
629 SetTexParameterBase(texture, pname, &param);
630}
631
632void SetTexParameterfv(Texture *texture, GLenum pname, const GLfloat *params)
633{
634 SetTexParameterBase(texture, pname, params);
635}
636
637void SetTexParameteri(Texture *texture, GLenum pname, GLint param)
638{
639 SetTexParameterBase(texture, pname, &param);
640}
641
642void SetTexParameteriv(Texture *texture, GLenum pname, const GLint *params)
643{
644 SetTexParameterBase(texture, pname, params);
645}
646
647void SetSamplerParameterf(Sampler *sampler, GLenum pname, GLfloat param)
648{
649 SetSamplerParameterBase(sampler, pname, &param);
650}
651
652void SetSamplerParameterfv(Sampler *sampler, GLenum pname, const GLfloat *params)
653{
654 SetSamplerParameterBase(sampler, pname, params);
655}
656
657void SetSamplerParameteri(Sampler *sampler, GLenum pname, GLint param)
658{
659 SetSamplerParameterBase(sampler, pname, &param);
660}
661
662void SetSamplerParameteriv(Sampler *sampler, GLenum pname, const GLint *params)
663{
664 SetSamplerParameterBase(sampler, pname, params);
665}
Geoff Langff5b2d52016-09-07 11:32:23 -0400666}