blob: b39d287b206dce9248117909596aec514620b78a [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 Langebebe1c2016-10-14 12:01:31 -0400300template <typename ParamType>
301void QueryBufferParameterBase(const Buffer *buffer, GLenum pname, ParamType *params)
302{
303 ASSERT(buffer != nullptr);
304
305 switch (pname)
306 {
307 case GL_BUFFER_USAGE:
308 *params = ConvertFromGLenum<ParamType>(buffer->getUsage());
309 break;
310 case GL_BUFFER_SIZE:
311 *params = ConvertFromGLint64<ParamType>(buffer->getSize());
312 break;
313 case GL_BUFFER_ACCESS_FLAGS:
314 *params = ConvertFromGLuint<ParamType>(buffer->getAccessFlags());
315 break;
316 case GL_BUFFER_ACCESS_OES:
317 *params = ConvertFromGLenum<ParamType>(buffer->getAccess());
318 break;
319 case GL_BUFFER_MAPPED:
320 *params = ConvertFromGLboolean<ParamType>(buffer->isMapped());
321 break;
322 case GL_BUFFER_MAP_OFFSET:
323 *params = ConvertFromGLint64<ParamType>(buffer->getMapOffset());
324 break;
325 case GL_BUFFER_MAP_LENGTH:
326 *params = ConvertFromGLint64<ParamType>(buffer->getMapLength());
327 break;
328 default:
329 UNREACHABLE();
330 break;
331 }
332}
333
Geoff Langc1984ed2016-10-07 12:41:00 -0400334} // anonymous namespace
335
Geoff Langff5b2d52016-09-07 11:32:23 -0400336void QueryFramebufferAttachmentParameteriv(const Framebuffer *framebuffer,
337 GLenum attachment,
338 GLenum pname,
339 GLint *params)
340{
341 ASSERT(framebuffer);
342
343 const FramebufferAttachment *attachmentObject = framebuffer->getAttachment(attachment);
344 if (attachmentObject == nullptr)
345 {
346 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
347 // is NONE, then querying any other pname will generate INVALID_ENUM.
348
349 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
350 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
351 // INVALID_OPERATION for all other pnames
352
353 switch (pname)
354 {
355 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
356 *params = GL_NONE;
357 break;
358
359 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
360 *params = 0;
361 break;
362
363 default:
364 UNREACHABLE();
365 break;
366 }
367
368 return;
369 }
370
371 switch (pname)
372 {
373 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
374 *params = attachmentObject->type();
375 break;
376
377 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
378 *params = attachmentObject->id();
379 break;
380
381 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
382 *params = attachmentObject->mipLevel();
383 break;
384
385 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
386 *params = attachmentObject->cubeMapFace();
387 break;
388
389 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
390 *params = attachmentObject->getRedSize();
391 break;
392
393 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
394 *params = attachmentObject->getGreenSize();
395 break;
396
397 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
398 *params = attachmentObject->getBlueSize();
399 break;
400
401 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
402 *params = attachmentObject->getAlphaSize();
403 break;
404
405 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
406 *params = attachmentObject->getDepthSize();
407 break;
408
409 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
410 *params = attachmentObject->getStencilSize();
411 break;
412
413 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
414 *params = attachmentObject->getComponentType();
415 break;
416
417 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
418 *params = attachmentObject->getColorEncoding();
419 break;
420
421 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
422 *params = attachmentObject->layer();
423 break;
424
425 default:
426 UNREACHABLE();
427 break;
428 }
429}
430
431void QueryBufferParameteriv(const Buffer *buffer, GLenum pname, GLint *params)
432{
Geoff Langebebe1c2016-10-14 12:01:31 -0400433 QueryBufferParameterBase(buffer, pname, params);
434}
Geoff Langff5b2d52016-09-07 11:32:23 -0400435
Geoff Langebebe1c2016-10-14 12:01:31 -0400436void QueryBufferParameteri64v(const Buffer *buffer, GLenum pname, GLint64 *params)
437{
438 QueryBufferParameterBase(buffer, pname, params);
Geoff Langff5b2d52016-09-07 11:32:23 -0400439}
440
441void QueryProgramiv(const Program *program, GLenum pname, GLint *params)
442{
443 ASSERT(program != nullptr);
444
445 switch (pname)
446 {
447 case GL_DELETE_STATUS:
448 *params = program->isFlaggedForDeletion();
449 return;
450 case GL_LINK_STATUS:
451 *params = program->isLinked();
452 return;
453 case GL_VALIDATE_STATUS:
454 *params = program->isValidated();
455 return;
456 case GL_INFO_LOG_LENGTH:
457 *params = program->getInfoLogLength();
458 return;
459 case GL_ATTACHED_SHADERS:
460 *params = program->getAttachedShadersCount();
461 return;
462 case GL_ACTIVE_ATTRIBUTES:
463 *params = program->getActiveAttributeCount();
464 return;
465 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
466 *params = program->getActiveAttributeMaxLength();
467 return;
468 case GL_ACTIVE_UNIFORMS:
469 *params = program->getActiveUniformCount();
470 return;
471 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
472 *params = program->getActiveUniformMaxLength();
473 return;
474 case GL_PROGRAM_BINARY_LENGTH_OES:
475 *params = program->getBinaryLength();
476 return;
477 case GL_ACTIVE_UNIFORM_BLOCKS:
478 *params = program->getActiveUniformBlockCount();
479 return;
480 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
481 *params = program->getActiveUniformBlockMaxLength();
482 break;
483 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
484 *params = program->getTransformFeedbackBufferMode();
485 break;
486 case GL_TRANSFORM_FEEDBACK_VARYINGS:
487 *params = program->getTransformFeedbackVaryingCount();
488 break;
489 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
490 *params = program->getTransformFeedbackVaryingMaxLength();
491 break;
492 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
493 *params = program->getBinaryRetrievableHint();
494 break;
495 default:
496 UNREACHABLE();
497 break;
498 }
499}
Geoff Lang740d9022016-10-07 11:20:52 -0400500
501void QueryRenderbufferiv(const Renderbuffer *renderbuffer, GLenum pname, GLint *params)
502{
503 ASSERT(renderbuffer != nullptr);
504
505 switch (pname)
506 {
507 case GL_RENDERBUFFER_WIDTH:
508 *params = renderbuffer->getWidth();
509 break;
510 case GL_RENDERBUFFER_HEIGHT:
511 *params = renderbuffer->getHeight();
512 break;
513 case GL_RENDERBUFFER_INTERNAL_FORMAT:
514 *params = renderbuffer->getFormat().info->internalFormat;
515 break;
516 case GL_RENDERBUFFER_RED_SIZE:
517 *params = renderbuffer->getRedSize();
518 break;
519 case GL_RENDERBUFFER_GREEN_SIZE:
520 *params = renderbuffer->getGreenSize();
521 break;
522 case GL_RENDERBUFFER_BLUE_SIZE:
523 *params = renderbuffer->getBlueSize();
524 break;
525 case GL_RENDERBUFFER_ALPHA_SIZE:
526 *params = renderbuffer->getAlphaSize();
527 break;
528 case GL_RENDERBUFFER_DEPTH_SIZE:
529 *params = renderbuffer->getDepthSize();
530 break;
531 case GL_RENDERBUFFER_STENCIL_SIZE:
532 *params = renderbuffer->getStencilSize();
533 break;
534 case GL_RENDERBUFFER_SAMPLES_ANGLE:
535 *params = renderbuffer->getSamples();
536 break;
537 default:
538 UNREACHABLE();
539 break;
540 }
541}
Geoff Langd7d0ed32016-10-07 11:33:51 -0400542
543void QueryShaderiv(const Shader *shader, GLenum pname, GLint *params)
544{
545 ASSERT(shader != nullptr);
546
547 switch (pname)
548 {
549 case GL_SHADER_TYPE:
550 *params = shader->getType();
551 return;
552 case GL_DELETE_STATUS:
553 *params = shader->isFlaggedForDeletion();
554 return;
555 case GL_COMPILE_STATUS:
556 *params = shader->isCompiled() ? GL_TRUE : GL_FALSE;
557 return;
558 case GL_INFO_LOG_LENGTH:
559 *params = shader->getInfoLogLength();
560 return;
561 case GL_SHADER_SOURCE_LENGTH:
562 *params = shader->getSourceLength();
563 return;
564 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
565 *params = shader->getTranslatedSourceWithDebugInfoLength();
566 return;
567 default:
568 UNREACHABLE();
569 break;
570 }
571}
Geoff Langc1984ed2016-10-07 12:41:00 -0400572
573void QueryTexParameterfv(const Texture *texture, GLenum pname, GLfloat *params)
574{
575 QueryTexParameterBase(texture, pname, params);
576}
577
578void QueryTexParameteriv(const Texture *texture, GLenum pname, GLint *params)
579{
580 QueryTexParameterBase(texture, pname, params);
581}
582
583void QuerySamplerParameterfv(const Sampler *sampler, GLenum pname, GLfloat *params)
584{
585 QuerySamplerParameterBase(sampler, pname, params);
586}
587
588void QuerySamplerParameteriv(const Sampler *sampler, GLenum pname, GLint *params)
589{
590 QuerySamplerParameterBase(sampler, pname, params);
591}
592
Geoff Lang0b031062016-10-13 14:30:04 -0400593void QueryVertexAttribfv(const VertexAttribute &attrib,
594 const VertexAttribCurrentValueData &currentValueData,
595 GLenum pname,
596 GLfloat *params)
597{
598 QueryVertexAttribBase(attrib, currentValueData.FloatValues, pname, params);
599}
600
601void QueryVertexAttribiv(const VertexAttribute &attrib,
602 const VertexAttribCurrentValueData &currentValueData,
603 GLenum pname,
604 GLint *params)
605{
606 QueryVertexAttribBase(attrib, currentValueData.FloatValues, pname, params);
607}
608
609void QueryVertexAttribPointerv(const VertexAttribute &attrib, GLenum pname, GLvoid **pointer)
610{
611 switch (pname)
612 {
613 case GL_VERTEX_ATTRIB_ARRAY_POINTER:
614 *pointer = const_cast<GLvoid *>(attrib.pointer);
615 break;
616
617 default:
618 UNREACHABLE();
619 break;
620 }
621}
622
623void QueryVertexAttribIiv(const VertexAttribute &attrib,
624 const VertexAttribCurrentValueData &currentValueData,
625 GLenum pname,
626 GLint *params)
627{
628 QueryVertexAttribBase(attrib, currentValueData.IntValues, pname, params);
629}
630
631void QueryVertexAttribIuiv(const VertexAttribute &attrib,
632 const VertexAttribCurrentValueData &currentValueData,
633 GLenum pname,
634 GLuint *params)
635{
636 QueryVertexAttribBase(attrib, currentValueData.UnsignedIntValues, pname, params);
637}
638
Geoff Lang6899b872016-10-14 11:30:13 -0400639void QueryActiveUniformBlockiv(const Program *program,
640 GLuint uniformBlockIndex,
641 GLenum pname,
642 GLint *params)
643{
644 const UniformBlock &uniformBlock = program->getUniformBlockByIndex(uniformBlockIndex);
645 switch (pname)
646 {
647 case GL_UNIFORM_BLOCK_BINDING:
648 *params = ConvertToGLint(program->getUniformBlockBinding(uniformBlockIndex));
649 break;
650 case GL_UNIFORM_BLOCK_DATA_SIZE:
651 *params = ConvertToGLint(uniformBlock.dataSize);
652 break;
653 case GL_UNIFORM_BLOCK_NAME_LENGTH:
654 *params = ConvertToGLint(uniformBlock.nameWithArrayIndex().size() + 1);
655 break;
656 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
657 *params = ConvertToGLint(uniformBlock.memberUniformIndexes.size());
658 break;
659 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
660 for (size_t blockMemberIndex = 0;
661 blockMemberIndex < uniformBlock.memberUniformIndexes.size(); blockMemberIndex++)
662 {
663 params[blockMemberIndex] =
664 ConvertToGLint(uniformBlock.memberUniformIndexes[blockMemberIndex]);
665 }
666 break;
667 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
668 *params = ConvertToGLint(uniformBlock.vertexStaticUse);
669 break;
670 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
671 *params = ConvertToGLint(uniformBlock.fragmentStaticUse);
672 break;
673 default:
674 UNREACHABLE();
675 break;
676 }
677}
678
Geoff Langc1984ed2016-10-07 12:41:00 -0400679void SetTexParameterf(Texture *texture, GLenum pname, GLfloat param)
680{
681 SetTexParameterBase(texture, pname, &param);
682}
683
684void SetTexParameterfv(Texture *texture, GLenum pname, const GLfloat *params)
685{
686 SetTexParameterBase(texture, pname, params);
687}
688
689void SetTexParameteri(Texture *texture, GLenum pname, GLint param)
690{
691 SetTexParameterBase(texture, pname, &param);
692}
693
694void SetTexParameteriv(Texture *texture, GLenum pname, const GLint *params)
695{
696 SetTexParameterBase(texture, pname, params);
697}
698
699void SetSamplerParameterf(Sampler *sampler, GLenum pname, GLfloat param)
700{
701 SetSamplerParameterBase(sampler, pname, &param);
702}
703
704void SetSamplerParameterfv(Sampler *sampler, GLenum pname, const GLfloat *params)
705{
706 SetSamplerParameterBase(sampler, pname, params);
707}
708
709void SetSamplerParameteri(Sampler *sampler, GLenum pname, GLint param)
710{
711 SetSamplerParameterBase(sampler, pname, &param);
712}
713
714void SetSamplerParameteriv(Sampler *sampler, GLenum pname, const GLint *params)
715{
716 SetSamplerParameterBase(sampler, pname, params);
717}
Geoff Langff5b2d52016-09-07 11:32:23 -0400718}