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