blob: 13250d58ccde5f9e8c7bd9133d0e9e1fefc865b6 [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
Geoff Lang496c02d2016-10-20 11:38:11 -0700441void QueryBufferPointerv(const Buffer *buffer, GLenum pname, void **params)
442{
443 switch (pname)
444 {
445 case GL_BUFFER_MAP_POINTER:
446 *params = buffer->getMapPointer();
447 break;
448
449 default:
450 UNREACHABLE();
451 break;
452 }
453}
454
Geoff Langff5b2d52016-09-07 11:32:23 -0400455void QueryProgramiv(const Program *program, GLenum pname, GLint *params)
456{
457 ASSERT(program != nullptr);
458
459 switch (pname)
460 {
461 case GL_DELETE_STATUS:
462 *params = program->isFlaggedForDeletion();
463 return;
464 case GL_LINK_STATUS:
465 *params = program->isLinked();
466 return;
467 case GL_VALIDATE_STATUS:
468 *params = program->isValidated();
469 return;
470 case GL_INFO_LOG_LENGTH:
471 *params = program->getInfoLogLength();
472 return;
473 case GL_ATTACHED_SHADERS:
474 *params = program->getAttachedShadersCount();
475 return;
476 case GL_ACTIVE_ATTRIBUTES:
477 *params = program->getActiveAttributeCount();
478 return;
479 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
480 *params = program->getActiveAttributeMaxLength();
481 return;
482 case GL_ACTIVE_UNIFORMS:
483 *params = program->getActiveUniformCount();
484 return;
485 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
486 *params = program->getActiveUniformMaxLength();
487 return;
488 case GL_PROGRAM_BINARY_LENGTH_OES:
489 *params = program->getBinaryLength();
490 return;
491 case GL_ACTIVE_UNIFORM_BLOCKS:
492 *params = program->getActiveUniformBlockCount();
493 return;
494 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
495 *params = program->getActiveUniformBlockMaxLength();
496 break;
497 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
498 *params = program->getTransformFeedbackBufferMode();
499 break;
500 case GL_TRANSFORM_FEEDBACK_VARYINGS:
501 *params = program->getTransformFeedbackVaryingCount();
502 break;
503 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
504 *params = program->getTransformFeedbackVaryingMaxLength();
505 break;
506 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
507 *params = program->getBinaryRetrievableHint();
508 break;
509 default:
510 UNREACHABLE();
511 break;
512 }
513}
Geoff Lang740d9022016-10-07 11:20:52 -0400514
515void QueryRenderbufferiv(const Renderbuffer *renderbuffer, GLenum pname, GLint *params)
516{
517 ASSERT(renderbuffer != nullptr);
518
519 switch (pname)
520 {
521 case GL_RENDERBUFFER_WIDTH:
522 *params = renderbuffer->getWidth();
523 break;
524 case GL_RENDERBUFFER_HEIGHT:
525 *params = renderbuffer->getHeight();
526 break;
527 case GL_RENDERBUFFER_INTERNAL_FORMAT:
528 *params = renderbuffer->getFormat().info->internalFormat;
529 break;
530 case GL_RENDERBUFFER_RED_SIZE:
531 *params = renderbuffer->getRedSize();
532 break;
533 case GL_RENDERBUFFER_GREEN_SIZE:
534 *params = renderbuffer->getGreenSize();
535 break;
536 case GL_RENDERBUFFER_BLUE_SIZE:
537 *params = renderbuffer->getBlueSize();
538 break;
539 case GL_RENDERBUFFER_ALPHA_SIZE:
540 *params = renderbuffer->getAlphaSize();
541 break;
542 case GL_RENDERBUFFER_DEPTH_SIZE:
543 *params = renderbuffer->getDepthSize();
544 break;
545 case GL_RENDERBUFFER_STENCIL_SIZE:
546 *params = renderbuffer->getStencilSize();
547 break;
548 case GL_RENDERBUFFER_SAMPLES_ANGLE:
549 *params = renderbuffer->getSamples();
550 break;
551 default:
552 UNREACHABLE();
553 break;
554 }
555}
Geoff Langd7d0ed32016-10-07 11:33:51 -0400556
557void QueryShaderiv(const Shader *shader, GLenum pname, GLint *params)
558{
559 ASSERT(shader != nullptr);
560
561 switch (pname)
562 {
563 case GL_SHADER_TYPE:
564 *params = shader->getType();
565 return;
566 case GL_DELETE_STATUS:
567 *params = shader->isFlaggedForDeletion();
568 return;
569 case GL_COMPILE_STATUS:
570 *params = shader->isCompiled() ? GL_TRUE : GL_FALSE;
571 return;
572 case GL_INFO_LOG_LENGTH:
573 *params = shader->getInfoLogLength();
574 return;
575 case GL_SHADER_SOURCE_LENGTH:
576 *params = shader->getSourceLength();
577 return;
578 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
579 *params = shader->getTranslatedSourceWithDebugInfoLength();
580 return;
581 default:
582 UNREACHABLE();
583 break;
584 }
585}
Geoff Langc1984ed2016-10-07 12:41:00 -0400586
587void QueryTexParameterfv(const Texture *texture, GLenum pname, GLfloat *params)
588{
589 QueryTexParameterBase(texture, pname, params);
590}
591
592void QueryTexParameteriv(const Texture *texture, GLenum pname, GLint *params)
593{
594 QueryTexParameterBase(texture, pname, params);
595}
596
597void QuerySamplerParameterfv(const Sampler *sampler, GLenum pname, GLfloat *params)
598{
599 QuerySamplerParameterBase(sampler, pname, params);
600}
601
602void QuerySamplerParameteriv(const Sampler *sampler, GLenum pname, GLint *params)
603{
604 QuerySamplerParameterBase(sampler, pname, params);
605}
606
Geoff Lang0b031062016-10-13 14:30:04 -0400607void QueryVertexAttribfv(const VertexAttribute &attrib,
608 const VertexAttribCurrentValueData &currentValueData,
609 GLenum pname,
610 GLfloat *params)
611{
612 QueryVertexAttribBase(attrib, currentValueData.FloatValues, pname, params);
613}
614
615void QueryVertexAttribiv(const VertexAttribute &attrib,
616 const VertexAttribCurrentValueData &currentValueData,
617 GLenum pname,
618 GLint *params)
619{
620 QueryVertexAttribBase(attrib, currentValueData.FloatValues, pname, params);
621}
622
623void QueryVertexAttribPointerv(const VertexAttribute &attrib, GLenum pname, GLvoid **pointer)
624{
625 switch (pname)
626 {
627 case GL_VERTEX_ATTRIB_ARRAY_POINTER:
628 *pointer = const_cast<GLvoid *>(attrib.pointer);
629 break;
630
631 default:
632 UNREACHABLE();
633 break;
634 }
635}
636
637void QueryVertexAttribIiv(const VertexAttribute &attrib,
638 const VertexAttribCurrentValueData &currentValueData,
639 GLenum pname,
640 GLint *params)
641{
642 QueryVertexAttribBase(attrib, currentValueData.IntValues, pname, params);
643}
644
645void QueryVertexAttribIuiv(const VertexAttribute &attrib,
646 const VertexAttribCurrentValueData &currentValueData,
647 GLenum pname,
648 GLuint *params)
649{
650 QueryVertexAttribBase(attrib, currentValueData.UnsignedIntValues, pname, params);
651}
652
Geoff Lang6899b872016-10-14 11:30:13 -0400653void QueryActiveUniformBlockiv(const Program *program,
654 GLuint uniformBlockIndex,
655 GLenum pname,
656 GLint *params)
657{
658 const UniformBlock &uniformBlock = program->getUniformBlockByIndex(uniformBlockIndex);
659 switch (pname)
660 {
661 case GL_UNIFORM_BLOCK_BINDING:
662 *params = ConvertToGLint(program->getUniformBlockBinding(uniformBlockIndex));
663 break;
664 case GL_UNIFORM_BLOCK_DATA_SIZE:
665 *params = ConvertToGLint(uniformBlock.dataSize);
666 break;
667 case GL_UNIFORM_BLOCK_NAME_LENGTH:
668 *params = ConvertToGLint(uniformBlock.nameWithArrayIndex().size() + 1);
669 break;
670 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
671 *params = ConvertToGLint(uniformBlock.memberUniformIndexes.size());
672 break;
673 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
674 for (size_t blockMemberIndex = 0;
675 blockMemberIndex < uniformBlock.memberUniformIndexes.size(); blockMemberIndex++)
676 {
677 params[blockMemberIndex] =
678 ConvertToGLint(uniformBlock.memberUniformIndexes[blockMemberIndex]);
679 }
680 break;
681 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
682 *params = ConvertToGLint(uniformBlock.vertexStaticUse);
683 break;
684 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
685 *params = ConvertToGLint(uniformBlock.fragmentStaticUse);
686 break;
687 default:
688 UNREACHABLE();
689 break;
690 }
691}
692
Geoff Lang0a9661f2016-10-20 10:59:20 -0700693void QueryInternalFormativ(const TextureCaps &format, GLenum pname, GLsizei bufSize, GLint *params)
694{
695 switch (pname)
696 {
697 case GL_NUM_SAMPLE_COUNTS:
698 if (bufSize != 0)
699 {
700 *params = static_cast<GLint>(format.sampleCounts.size());
701 }
702 break;
703
704 case GL_SAMPLES:
705 {
706 size_t returnCount = std::min<size_t>(bufSize, format.sampleCounts.size());
707 auto sampleReverseIt = format.sampleCounts.rbegin();
708 for (size_t sampleIndex = 0; sampleIndex < returnCount; ++sampleIndex)
709 {
710 params[sampleIndex] = *sampleReverseIt++;
711 }
712 }
713 break;
714
715 default:
716 UNREACHABLE();
717 break;
718 }
719}
720
Geoff Langc1984ed2016-10-07 12:41:00 -0400721void SetTexParameterf(Texture *texture, GLenum pname, GLfloat param)
722{
723 SetTexParameterBase(texture, pname, &param);
724}
725
726void SetTexParameterfv(Texture *texture, GLenum pname, const GLfloat *params)
727{
728 SetTexParameterBase(texture, pname, params);
729}
730
731void SetTexParameteri(Texture *texture, GLenum pname, GLint param)
732{
733 SetTexParameterBase(texture, pname, &param);
734}
735
736void SetTexParameteriv(Texture *texture, GLenum pname, const GLint *params)
737{
738 SetTexParameterBase(texture, pname, params);
739}
740
741void SetSamplerParameterf(Sampler *sampler, GLenum pname, GLfloat param)
742{
743 SetSamplerParameterBase(sampler, pname, &param);
744}
745
746void SetSamplerParameterfv(Sampler *sampler, GLenum pname, const GLfloat *params)
747{
748 SetSamplerParameterBase(sampler, pname, params);
749}
750
751void SetSamplerParameteri(Sampler *sampler, GLenum pname, GLint param)
752{
753 SetSamplerParameterBase(sampler, pname, &param);
754}
755
756void SetSamplerParameteriv(Sampler *sampler, GLenum pname, const GLint *params)
757{
758 SetSamplerParameterBase(sampler, pname, params);
759}
Geoff Langff5b2d52016-09-07 11:32:23 -0400760}