blob: 5f2654991419ab73e974fd8fb9183d07c8cf5f5f [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;
Geoff Lang81c6b572016-10-19 14:07:52 -070092 case GL_TEXTURE_SRGB_DECODE_EXT:
93 *params = ConvertFromGLenum<ParamType>(texture->getSRGBDecode());
94 break;
Geoff Langc1984ed2016-10-07 12:41:00 -040095 default:
96 UNREACHABLE();
97 break;
98 }
99}
100
101template <typename ParamType>
102void SetTexParameterBase(Texture *texture, GLenum pname, const ParamType *params)
103{
104 ASSERT(texture != nullptr);
105
106 switch (pname)
107 {
108 case GL_TEXTURE_WRAP_S:
109 texture->setWrapS(ConvertToGLenum(params[0]));
110 break;
111 case GL_TEXTURE_WRAP_T:
112 texture->setWrapT(ConvertToGLenum(params[0]));
113 break;
114 case GL_TEXTURE_WRAP_R:
115 texture->setWrapR(ConvertToGLenum(params[0]));
116 break;
117 case GL_TEXTURE_MIN_FILTER:
118 texture->setMinFilter(ConvertToGLenum(params[0]));
119 break;
120 case GL_TEXTURE_MAG_FILTER:
121 texture->setMagFilter(ConvertToGLenum(params[0]));
122 break;
123 case GL_TEXTURE_USAGE_ANGLE:
124 texture->setUsage(ConvertToGLenum(params[0]));
125 break;
126 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
127 texture->setMaxAnisotropy(ConvertToGLfloat(params[0]));
128 break;
129 case GL_TEXTURE_COMPARE_MODE:
130 texture->setCompareMode(ConvertToGLenum(params[0]));
131 break;
132 case GL_TEXTURE_COMPARE_FUNC:
133 texture->setCompareFunc(ConvertToGLenum(params[0]));
134 break;
135 case GL_TEXTURE_SWIZZLE_R:
136 texture->setSwizzleRed(ConvertToGLenum(params[0]));
137 break;
138 case GL_TEXTURE_SWIZZLE_G:
139 texture->setSwizzleGreen(ConvertToGLenum(params[0]));
140 break;
141 case GL_TEXTURE_SWIZZLE_B:
142 texture->setSwizzleBlue(ConvertToGLenum(params[0]));
143 break;
144 case GL_TEXTURE_SWIZZLE_A:
145 texture->setSwizzleAlpha(ConvertToGLenum(params[0]));
146 break;
147 case GL_TEXTURE_BASE_LEVEL:
148 texture->setBaseLevel(ConvertToGLuint(params[0]));
149 break;
150 case GL_TEXTURE_MAX_LEVEL:
151 texture->setMaxLevel(ConvertToGLuint(params[0]));
152 break;
153 case GL_TEXTURE_MIN_LOD:
154 texture->setMinLod(ConvertToGLfloat(params[0]));
155 break;
156 case GL_TEXTURE_MAX_LOD:
157 texture->setMaxLod(ConvertToGLfloat(params[0]));
158 break;
Geoff Lang3b573612016-10-31 14:08:10 -0400159 case GL_DEPTH_STENCIL_TEXTURE_MODE:
Geoff Lang9f090372016-12-02 10:20:43 -0500160 texture->setDepthStencilTextureMode(ConvertToGLenum(params[0]));
Geoff Lang3b573612016-10-31 14:08:10 -0400161 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700162 case GL_TEXTURE_SRGB_DECODE_EXT:
163 texture->setSRGBDecode(ConvertToGLenum(params[0]));
164 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400165 default:
166 UNREACHABLE();
167 break;
168 }
169}
170
171template <typename ParamType>
172void QuerySamplerParameterBase(const Sampler *sampler, GLenum pname, ParamType *params)
173{
174 switch (pname)
175 {
176 case GL_TEXTURE_MIN_FILTER:
177 *params = ConvertFromGLenum<ParamType>(sampler->getMinFilter());
178 break;
179 case GL_TEXTURE_MAG_FILTER:
180 *params = ConvertFromGLenum<ParamType>(sampler->getMagFilter());
181 break;
182 case GL_TEXTURE_WRAP_S:
183 *params = ConvertFromGLenum<ParamType>(sampler->getWrapS());
184 break;
185 case GL_TEXTURE_WRAP_T:
186 *params = ConvertFromGLenum<ParamType>(sampler->getWrapT());
187 break;
188 case GL_TEXTURE_WRAP_R:
189 *params = ConvertFromGLenum<ParamType>(sampler->getWrapR());
190 break;
191 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
192 *params = ConvertFromGLfloat<ParamType>(sampler->getMaxAnisotropy());
193 break;
194 case GL_TEXTURE_MIN_LOD:
195 *params = ConvertFromGLfloat<ParamType>(sampler->getMinLod());
196 break;
197 case GL_TEXTURE_MAX_LOD:
198 *params = ConvertFromGLfloat<ParamType>(sampler->getMaxLod());
199 break;
200 case GL_TEXTURE_COMPARE_MODE:
201 *params = ConvertFromGLenum<ParamType>(sampler->getCompareMode());
202 break;
203 case GL_TEXTURE_COMPARE_FUNC:
204 *params = ConvertFromGLenum<ParamType>(sampler->getCompareFunc());
205 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700206 case GL_TEXTURE_SRGB_DECODE_EXT:
207 *params = ConvertFromGLenum<ParamType>(sampler->getSRGBDecode());
208 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400209 default:
210 UNREACHABLE();
211 break;
212 }
213}
214
215template <typename ParamType>
216void SetSamplerParameterBase(Sampler *sampler, GLenum pname, const ParamType *params)
217{
218 switch (pname)
219 {
220 case GL_TEXTURE_WRAP_S:
221 sampler->setWrapS(ConvertToGLenum(params[0]));
222 break;
223 case GL_TEXTURE_WRAP_T:
224 sampler->setWrapT(ConvertToGLenum(params[0]));
225 break;
226 case GL_TEXTURE_WRAP_R:
227 sampler->setWrapR(ConvertToGLenum(params[0]));
228 break;
229 case GL_TEXTURE_MIN_FILTER:
230 sampler->setMinFilter(ConvertToGLenum(params[0]));
231 break;
232 case GL_TEXTURE_MAG_FILTER:
233 sampler->setMagFilter(ConvertToGLenum(params[0]));
234 break;
235 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
236 sampler->setMaxAnisotropy(ConvertToGLfloat(params[0]));
237 break;
238 case GL_TEXTURE_COMPARE_MODE:
239 sampler->setCompareMode(ConvertToGLenum(params[0]));
240 break;
241 case GL_TEXTURE_COMPARE_FUNC:
242 sampler->setCompareFunc(ConvertToGLenum(params[0]));
243 break;
244 case GL_TEXTURE_MIN_LOD:
245 sampler->setMinLod(ConvertToGLfloat(params[0]));
246 break;
247 case GL_TEXTURE_MAX_LOD:
248 sampler->setMaxLod(ConvertToGLfloat(params[0]));
249 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700250 case GL_TEXTURE_SRGB_DECODE_EXT:
251 sampler->setSRGBDecode(ConvertToGLenum(params[0]));
252 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400253 default:
254 UNREACHABLE();
255 break;
256 }
257}
258
Geoff Lang0b031062016-10-13 14:30:04 -0400259template <typename ParamType, typename CurrentDataType>
260ParamType ConvertCurrentValue(CurrentDataType currentValue)
261{
262 return static_cast<ParamType>(currentValue);
263}
264
265template <>
266GLint ConvertCurrentValue(GLfloat currentValue)
267{
268 return iround<GLint>(currentValue);
269}
270
271template <typename ParamType, typename CurrentDataType, size_t CurrentValueCount>
272void QueryVertexAttribBase(const VertexAttribute &attrib,
273 const CurrentDataType (&currentValueData)[CurrentValueCount],
274 GLenum pname,
275 ParamType *params)
276{
277 switch (pname)
278 {
279 case GL_CURRENT_VERTEX_ATTRIB:
280 for (size_t i = 0; i < CurrentValueCount; ++i)
281 {
282 params[i] = ConvertCurrentValue<ParamType>(currentValueData[i]);
283 }
284 break;
285 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
286 *params = ConvertFromGLboolean<ParamType>(attrib.enabled);
287 break;
288 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
289 *params = ConvertFromGLuint<ParamType>(attrib.size);
290 break;
291 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
292 *params = ConvertFromGLuint<ParamType>(attrib.stride);
293 break;
294 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
295 *params = ConvertFromGLenum<ParamType>(attrib.type);
296 break;
297 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
298 *params = ConvertFromGLboolean<ParamType>(attrib.normalized);
299 break;
300 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
301 *params = ConvertFromGLuint<ParamType>(attrib.buffer.id());
302 break;
303 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
304 *params = ConvertFromGLuint<ParamType>(attrib.divisor);
305 break;
306 case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
307 *params = ConvertFromGLboolean<ParamType>(attrib.pureInteger);
308 break;
309 default:
310 UNREACHABLE();
311 break;
312 }
313}
314
Geoff Langebebe1c2016-10-14 12:01:31 -0400315template <typename ParamType>
316void QueryBufferParameterBase(const Buffer *buffer, GLenum pname, ParamType *params)
317{
318 ASSERT(buffer != nullptr);
319
320 switch (pname)
321 {
322 case GL_BUFFER_USAGE:
323 *params = ConvertFromGLenum<ParamType>(buffer->getUsage());
324 break;
325 case GL_BUFFER_SIZE:
326 *params = ConvertFromGLint64<ParamType>(buffer->getSize());
327 break;
328 case GL_BUFFER_ACCESS_FLAGS:
329 *params = ConvertFromGLuint<ParamType>(buffer->getAccessFlags());
330 break;
331 case GL_BUFFER_ACCESS_OES:
332 *params = ConvertFromGLenum<ParamType>(buffer->getAccess());
333 break;
334 case GL_BUFFER_MAPPED:
335 *params = ConvertFromGLboolean<ParamType>(buffer->isMapped());
336 break;
337 case GL_BUFFER_MAP_OFFSET:
338 *params = ConvertFromGLint64<ParamType>(buffer->getMapOffset());
339 break;
340 case GL_BUFFER_MAP_LENGTH:
341 *params = ConvertFromGLint64<ParamType>(buffer->getMapLength());
342 break;
343 default:
344 UNREACHABLE();
345 break;
346 }
347}
348
Geoff Langc1984ed2016-10-07 12:41:00 -0400349} // anonymous namespace
350
Geoff Langff5b2d52016-09-07 11:32:23 -0400351void QueryFramebufferAttachmentParameteriv(const Framebuffer *framebuffer,
352 GLenum attachment,
353 GLenum pname,
354 GLint *params)
355{
356 ASSERT(framebuffer);
357
358 const FramebufferAttachment *attachmentObject = framebuffer->getAttachment(attachment);
359 if (attachmentObject == nullptr)
360 {
361 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
362 // is NONE, then querying any other pname will generate INVALID_ENUM.
363
364 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
365 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
366 // INVALID_OPERATION for all other pnames
367
368 switch (pname)
369 {
370 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
371 *params = GL_NONE;
372 break;
373
374 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
375 *params = 0;
376 break;
377
378 default:
379 UNREACHABLE();
380 break;
381 }
382
383 return;
384 }
385
386 switch (pname)
387 {
388 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
389 *params = attachmentObject->type();
390 break;
391
392 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
393 *params = attachmentObject->id();
394 break;
395
396 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
397 *params = attachmentObject->mipLevel();
398 break;
399
400 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
401 *params = attachmentObject->cubeMapFace();
402 break;
403
404 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
405 *params = attachmentObject->getRedSize();
406 break;
407
408 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
409 *params = attachmentObject->getGreenSize();
410 break;
411
412 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
413 *params = attachmentObject->getBlueSize();
414 break;
415
416 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
417 *params = attachmentObject->getAlphaSize();
418 break;
419
420 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
421 *params = attachmentObject->getDepthSize();
422 break;
423
424 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
425 *params = attachmentObject->getStencilSize();
426 break;
427
428 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
429 *params = attachmentObject->getComponentType();
430 break;
431
432 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
433 *params = attachmentObject->getColorEncoding();
434 break;
435
436 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
437 *params = attachmentObject->layer();
438 break;
439
440 default:
441 UNREACHABLE();
442 break;
443 }
444}
445
446void QueryBufferParameteriv(const Buffer *buffer, GLenum pname, GLint *params)
447{
Geoff Langebebe1c2016-10-14 12:01:31 -0400448 QueryBufferParameterBase(buffer, pname, params);
449}
Geoff Langff5b2d52016-09-07 11:32:23 -0400450
Geoff Langebebe1c2016-10-14 12:01:31 -0400451void QueryBufferParameteri64v(const Buffer *buffer, GLenum pname, GLint64 *params)
452{
453 QueryBufferParameterBase(buffer, pname, params);
Geoff Langff5b2d52016-09-07 11:32:23 -0400454}
455
Geoff Lang496c02d2016-10-20 11:38:11 -0700456void QueryBufferPointerv(const Buffer *buffer, GLenum pname, void **params)
457{
458 switch (pname)
459 {
460 case GL_BUFFER_MAP_POINTER:
461 *params = buffer->getMapPointer();
462 break;
463
464 default:
465 UNREACHABLE();
466 break;
467 }
468}
469
Geoff Langff5b2d52016-09-07 11:32:23 -0400470void QueryProgramiv(const Program *program, GLenum pname, GLint *params)
471{
472 ASSERT(program != nullptr);
473
474 switch (pname)
475 {
476 case GL_DELETE_STATUS:
477 *params = program->isFlaggedForDeletion();
478 return;
479 case GL_LINK_STATUS:
480 *params = program->isLinked();
481 return;
482 case GL_VALIDATE_STATUS:
483 *params = program->isValidated();
484 return;
485 case GL_INFO_LOG_LENGTH:
486 *params = program->getInfoLogLength();
487 return;
488 case GL_ATTACHED_SHADERS:
489 *params = program->getAttachedShadersCount();
490 return;
491 case GL_ACTIVE_ATTRIBUTES:
492 *params = program->getActiveAttributeCount();
493 return;
494 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
495 *params = program->getActiveAttributeMaxLength();
496 return;
497 case GL_ACTIVE_UNIFORMS:
498 *params = program->getActiveUniformCount();
499 return;
500 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
501 *params = program->getActiveUniformMaxLength();
502 return;
503 case GL_PROGRAM_BINARY_LENGTH_OES:
504 *params = program->getBinaryLength();
505 return;
506 case GL_ACTIVE_UNIFORM_BLOCKS:
507 *params = program->getActiveUniformBlockCount();
508 return;
509 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
510 *params = program->getActiveUniformBlockMaxLength();
511 break;
512 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
513 *params = program->getTransformFeedbackBufferMode();
514 break;
515 case GL_TRANSFORM_FEEDBACK_VARYINGS:
516 *params = program->getTransformFeedbackVaryingCount();
517 break;
518 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
519 *params = program->getTransformFeedbackVaryingMaxLength();
520 break;
521 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
522 *params = program->getBinaryRetrievableHint();
523 break;
524 default:
525 UNREACHABLE();
526 break;
527 }
528}
Geoff Lang740d9022016-10-07 11:20:52 -0400529
530void QueryRenderbufferiv(const Renderbuffer *renderbuffer, GLenum pname, GLint *params)
531{
532 ASSERT(renderbuffer != nullptr);
533
534 switch (pname)
535 {
536 case GL_RENDERBUFFER_WIDTH:
537 *params = renderbuffer->getWidth();
538 break;
539 case GL_RENDERBUFFER_HEIGHT:
540 *params = renderbuffer->getHeight();
541 break;
542 case GL_RENDERBUFFER_INTERNAL_FORMAT:
543 *params = renderbuffer->getFormat().info->internalFormat;
544 break;
545 case GL_RENDERBUFFER_RED_SIZE:
546 *params = renderbuffer->getRedSize();
547 break;
548 case GL_RENDERBUFFER_GREEN_SIZE:
549 *params = renderbuffer->getGreenSize();
550 break;
551 case GL_RENDERBUFFER_BLUE_SIZE:
552 *params = renderbuffer->getBlueSize();
553 break;
554 case GL_RENDERBUFFER_ALPHA_SIZE:
555 *params = renderbuffer->getAlphaSize();
556 break;
557 case GL_RENDERBUFFER_DEPTH_SIZE:
558 *params = renderbuffer->getDepthSize();
559 break;
560 case GL_RENDERBUFFER_STENCIL_SIZE:
561 *params = renderbuffer->getStencilSize();
562 break;
563 case GL_RENDERBUFFER_SAMPLES_ANGLE:
564 *params = renderbuffer->getSamples();
565 break;
566 default:
567 UNREACHABLE();
568 break;
569 }
570}
Geoff Langd7d0ed32016-10-07 11:33:51 -0400571
572void QueryShaderiv(const Shader *shader, GLenum pname, GLint *params)
573{
574 ASSERT(shader != nullptr);
575
576 switch (pname)
577 {
578 case GL_SHADER_TYPE:
579 *params = shader->getType();
580 return;
581 case GL_DELETE_STATUS:
582 *params = shader->isFlaggedForDeletion();
583 return;
584 case GL_COMPILE_STATUS:
585 *params = shader->isCompiled() ? GL_TRUE : GL_FALSE;
586 return;
587 case GL_INFO_LOG_LENGTH:
588 *params = shader->getInfoLogLength();
589 return;
590 case GL_SHADER_SOURCE_LENGTH:
591 *params = shader->getSourceLength();
592 return;
593 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
594 *params = shader->getTranslatedSourceWithDebugInfoLength();
595 return;
596 default:
597 UNREACHABLE();
598 break;
599 }
600}
Geoff Langc1984ed2016-10-07 12:41:00 -0400601
602void QueryTexParameterfv(const Texture *texture, GLenum pname, GLfloat *params)
603{
604 QueryTexParameterBase(texture, pname, params);
605}
606
607void QueryTexParameteriv(const Texture *texture, GLenum pname, GLint *params)
608{
609 QueryTexParameterBase(texture, pname, params);
610}
611
612void QuerySamplerParameterfv(const Sampler *sampler, GLenum pname, GLfloat *params)
613{
614 QuerySamplerParameterBase(sampler, pname, params);
615}
616
617void QuerySamplerParameteriv(const Sampler *sampler, GLenum pname, GLint *params)
618{
619 QuerySamplerParameterBase(sampler, pname, params);
620}
621
Geoff Lang0b031062016-10-13 14:30:04 -0400622void QueryVertexAttribfv(const VertexAttribute &attrib,
623 const VertexAttribCurrentValueData &currentValueData,
624 GLenum pname,
625 GLfloat *params)
626{
627 QueryVertexAttribBase(attrib, currentValueData.FloatValues, pname, params);
628}
629
630void QueryVertexAttribiv(const VertexAttribute &attrib,
631 const VertexAttribCurrentValueData &currentValueData,
632 GLenum pname,
633 GLint *params)
634{
635 QueryVertexAttribBase(attrib, currentValueData.FloatValues, pname, params);
636}
637
638void QueryVertexAttribPointerv(const VertexAttribute &attrib, GLenum pname, GLvoid **pointer)
639{
640 switch (pname)
641 {
642 case GL_VERTEX_ATTRIB_ARRAY_POINTER:
643 *pointer = const_cast<GLvoid *>(attrib.pointer);
644 break;
645
646 default:
647 UNREACHABLE();
648 break;
649 }
650}
651
652void QueryVertexAttribIiv(const VertexAttribute &attrib,
653 const VertexAttribCurrentValueData &currentValueData,
654 GLenum pname,
655 GLint *params)
656{
657 QueryVertexAttribBase(attrib, currentValueData.IntValues, pname, params);
658}
659
660void QueryVertexAttribIuiv(const VertexAttribute &attrib,
661 const VertexAttribCurrentValueData &currentValueData,
662 GLenum pname,
663 GLuint *params)
664{
665 QueryVertexAttribBase(attrib, currentValueData.UnsignedIntValues, pname, params);
666}
667
Geoff Lang6899b872016-10-14 11:30:13 -0400668void QueryActiveUniformBlockiv(const Program *program,
669 GLuint uniformBlockIndex,
670 GLenum pname,
671 GLint *params)
672{
673 const UniformBlock &uniformBlock = program->getUniformBlockByIndex(uniformBlockIndex);
674 switch (pname)
675 {
676 case GL_UNIFORM_BLOCK_BINDING:
677 *params = ConvertToGLint(program->getUniformBlockBinding(uniformBlockIndex));
678 break;
679 case GL_UNIFORM_BLOCK_DATA_SIZE:
680 *params = ConvertToGLint(uniformBlock.dataSize);
681 break;
682 case GL_UNIFORM_BLOCK_NAME_LENGTH:
683 *params = ConvertToGLint(uniformBlock.nameWithArrayIndex().size() + 1);
684 break;
685 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
686 *params = ConvertToGLint(uniformBlock.memberUniformIndexes.size());
687 break;
688 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
689 for (size_t blockMemberIndex = 0;
690 blockMemberIndex < uniformBlock.memberUniformIndexes.size(); blockMemberIndex++)
691 {
692 params[blockMemberIndex] =
693 ConvertToGLint(uniformBlock.memberUniformIndexes[blockMemberIndex]);
694 }
695 break;
696 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
697 *params = ConvertToGLint(uniformBlock.vertexStaticUse);
698 break;
699 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
700 *params = ConvertToGLint(uniformBlock.fragmentStaticUse);
701 break;
702 default:
703 UNREACHABLE();
704 break;
705 }
706}
707
Geoff Lang0a9661f2016-10-20 10:59:20 -0700708void QueryInternalFormativ(const TextureCaps &format, GLenum pname, GLsizei bufSize, GLint *params)
709{
710 switch (pname)
711 {
712 case GL_NUM_SAMPLE_COUNTS:
713 if (bufSize != 0)
714 {
715 *params = static_cast<GLint>(format.sampleCounts.size());
716 }
717 break;
718
719 case GL_SAMPLES:
720 {
721 size_t returnCount = std::min<size_t>(bufSize, format.sampleCounts.size());
722 auto sampleReverseIt = format.sampleCounts.rbegin();
723 for (size_t sampleIndex = 0; sampleIndex < returnCount; ++sampleIndex)
724 {
725 params[sampleIndex] = *sampleReverseIt++;
726 }
727 }
728 break;
729
730 default:
731 UNREACHABLE();
732 break;
733 }
734}
735
Geoff Langc1984ed2016-10-07 12:41:00 -0400736void SetTexParameterf(Texture *texture, GLenum pname, GLfloat param)
737{
738 SetTexParameterBase(texture, pname, &param);
739}
740
741void SetTexParameterfv(Texture *texture, GLenum pname, const GLfloat *params)
742{
743 SetTexParameterBase(texture, pname, params);
744}
745
746void SetTexParameteri(Texture *texture, GLenum pname, GLint param)
747{
748 SetTexParameterBase(texture, pname, &param);
749}
750
751void SetTexParameteriv(Texture *texture, GLenum pname, const GLint *params)
752{
753 SetTexParameterBase(texture, pname, params);
754}
755
756void SetSamplerParameterf(Sampler *sampler, GLenum pname, GLfloat param)
757{
758 SetSamplerParameterBase(sampler, pname, &param);
759}
760
761void SetSamplerParameterfv(Sampler *sampler, GLenum pname, const GLfloat *params)
762{
763 SetSamplerParameterBase(sampler, pname, params);
764}
765
766void SetSamplerParameteri(Sampler *sampler, GLenum pname, GLint param)
767{
768 SetSamplerParameterBase(sampler, pname, &param);
769}
770
771void SetSamplerParameteriv(Sampler *sampler, GLenum pname, const GLint *params)
772{
773 SetSamplerParameterBase(sampler, pname, params);
774}
Geoff Langff5b2d52016-09-07 11:32:23 -0400775}