blob: 8b5d2f9c2a7164a2b869c6c1d20387a0809a1458 [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"
Geoff Lang65603eb2017-01-12 16:48:03 -050014#include "libANGLE/Config.h"
Geoff Langff5b2d52016-09-07 11:32:23 -040015#include "libANGLE/Framebuffer.h"
16#include "libANGLE/Program.h"
Geoff Lang740d9022016-10-07 11:20:52 -040017#include "libANGLE/Renderbuffer.h"
Geoff Langc1984ed2016-10-07 12:41:00 -040018#include "libANGLE/Sampler.h"
Geoff Langd7d0ed32016-10-07 11:33:51 -040019#include "libANGLE/Shader.h"
Geoff Langc1984ed2016-10-07 12:41:00 -040020#include "libANGLE/Texture.h"
Geoff Lang6899b872016-10-14 11:30:13 -040021#include "libANGLE/Uniform.h"
Geoff Lang0b031062016-10-13 14:30:04 -040022#include "libANGLE/VertexAttribute.h"
Geoff Langff5b2d52016-09-07 11:32:23 -040023
24namespace gl
25{
Geoff Langc1984ed2016-10-07 12:41:00 -040026
27namespace
28{
29template <typename ParamType>
He Yunchao11b038b2016-11-22 21:24:04 +080030void QueryTexLevelParameterBase(const Texture *texture,
31 GLenum target,
32 GLint level,
33 GLenum pname,
34 ParamType *params)
35{
36 ASSERT(texture != nullptr);
37 const InternalFormat *info = texture->getTextureState().getImageDesc(target, level).format.info;
38
39 switch (pname)
40 {
41 case GL_TEXTURE_RED_TYPE:
42 *params = ConvertFromGLenum<ParamType>(info->redBits ? info->componentType : GL_NONE);
43 break;
44 case GL_TEXTURE_GREEN_TYPE:
45 *params = ConvertFromGLenum<ParamType>(info->greenBits ? info->componentType : GL_NONE);
46 break;
47 case GL_TEXTURE_BLUE_TYPE:
48 *params = ConvertFromGLenum<ParamType>(info->blueBits ? info->componentType : GL_NONE);
49 break;
50 case GL_TEXTURE_ALPHA_TYPE:
51 *params = ConvertFromGLenum<ParamType>(info->alphaBits ? info->componentType : GL_NONE);
52 break;
53 case GL_TEXTURE_DEPTH_TYPE:
54 *params = ConvertFromGLenum<ParamType>(info->depthBits ? info->componentType : GL_NONE);
55 break;
56 case GL_TEXTURE_RED_SIZE:
57 *params = ConvertFromGLuint<ParamType>(info->redBits);
58 break;
59 case GL_TEXTURE_GREEN_SIZE:
60 *params = ConvertFromGLuint<ParamType>(info->greenBits);
61 break;
62 case GL_TEXTURE_BLUE_SIZE:
63 *params = ConvertFromGLuint<ParamType>(info->blueBits);
64 break;
65 case GL_TEXTURE_ALPHA_SIZE:
66 *params = ConvertFromGLuint<ParamType>(info->alphaBits);
67 break;
68 case GL_TEXTURE_DEPTH_SIZE:
69 *params = ConvertFromGLuint<ParamType>(info->depthBits);
70 break;
71 case GL_TEXTURE_STENCIL_SIZE:
72 *params = ConvertFromGLuint<ParamType>(info->stencilBits);
73 break;
74 case GL_TEXTURE_SHARED_SIZE:
75 *params = ConvertFromGLuint<ParamType>(info->sharedBits);
76 break;
77 case GL_TEXTURE_INTERNAL_FORMAT:
78 *params =
79 ConvertFromGLenum<ParamType>(info->internalFormat ? info->internalFormat : GL_RGBA);
80 break;
81 case GL_TEXTURE_WIDTH:
82 *params =
83 ConvertFromGLint<ParamType>(static_cast<GLint>(texture->getWidth(target, level)));
84 break;
85 case GL_TEXTURE_HEIGHT:
86 *params =
87 ConvertFromGLint<ParamType>(static_cast<GLint>(texture->getHeight(target, level)));
88 break;
89 case GL_TEXTURE_DEPTH:
90 *params =
91 ConvertFromGLint<ParamType>(static_cast<GLint>(texture->getDepth(target, level)));
92 break;
93 case GL_TEXTURE_SAMPLES:
94 *params = ConvertFromGLint<ParamType>(texture->getSamples(target, level));
95 break;
96 case GL_TEXTURE_FIXED_SAMPLE_LOCATIONS:
97 *params =
98 ConvertFromGLboolean<ParamType>(texture->getFixedSampleLocations(target, level));
99 break;
100 case GL_TEXTURE_COMPRESSED:
101 *params = ConvertFromGLboolean<ParamType>(info->compressed);
102 break;
103 default:
104 UNREACHABLE();
105 break;
106 }
107}
108
109template <typename ParamType>
Geoff Langc1984ed2016-10-07 12:41:00 -0400110void QueryTexParameterBase(const Texture *texture, GLenum pname, ParamType *params)
111{
112 ASSERT(texture != nullptr);
113
114 switch (pname)
115 {
116 case GL_TEXTURE_MAG_FILTER:
117 *params = ConvertFromGLenum<ParamType>(texture->getMagFilter());
118 break;
119 case GL_TEXTURE_MIN_FILTER:
120 *params = ConvertFromGLenum<ParamType>(texture->getMinFilter());
121 break;
122 case GL_TEXTURE_WRAP_S:
123 *params = ConvertFromGLenum<ParamType>(texture->getWrapS());
124 break;
125 case GL_TEXTURE_WRAP_T:
126 *params = ConvertFromGLenum<ParamType>(texture->getWrapT());
127 break;
128 case GL_TEXTURE_WRAP_R:
129 *params = ConvertFromGLenum<ParamType>(texture->getWrapR());
130 break;
131 case GL_TEXTURE_IMMUTABLE_FORMAT:
132 *params = ConvertFromGLboolean<ParamType>(texture->getImmutableFormat());
133 break;
134 case GL_TEXTURE_IMMUTABLE_LEVELS:
135 *params = ConvertFromGLuint<ParamType>(texture->getImmutableLevels());
136 break;
137 case GL_TEXTURE_USAGE_ANGLE:
138 *params = ConvertFromGLenum<ParamType>(texture->getUsage());
139 break;
140 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
141 *params = ConvertFromGLfloat<ParamType>(texture->getMaxAnisotropy());
142 break;
143 case GL_TEXTURE_SWIZZLE_R:
144 *params = ConvertFromGLenum<ParamType>(texture->getSwizzleRed());
145 break;
146 case GL_TEXTURE_SWIZZLE_G:
147 *params = ConvertFromGLenum<ParamType>(texture->getSwizzleGreen());
148 break;
149 case GL_TEXTURE_SWIZZLE_B:
150 *params = ConvertFromGLenum<ParamType>(texture->getSwizzleBlue());
151 break;
152 case GL_TEXTURE_SWIZZLE_A:
153 *params = ConvertFromGLenum<ParamType>(texture->getSwizzleAlpha());
154 break;
155 case GL_TEXTURE_BASE_LEVEL:
156 *params = ConvertFromGLuint<ParamType>(texture->getBaseLevel());
157 break;
158 case GL_TEXTURE_MAX_LEVEL:
159 *params = ConvertFromGLuint<ParamType>(texture->getMaxLevel());
160 break;
161 case GL_TEXTURE_MIN_LOD:
162 *params = ConvertFromGLfloat<ParamType>(texture->getSamplerState().minLod);
163 break;
164 case GL_TEXTURE_MAX_LOD:
165 *params = ConvertFromGLfloat<ParamType>(texture->getSamplerState().maxLod);
166 break;
167 case GL_TEXTURE_COMPARE_MODE:
168 *params = ConvertFromGLenum<ParamType>(texture->getCompareMode());
169 break;
170 case GL_TEXTURE_COMPARE_FUNC:
171 *params = ConvertFromGLenum<ParamType>(texture->getCompareFunc());
172 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700173 case GL_TEXTURE_SRGB_DECODE_EXT:
174 *params = ConvertFromGLenum<ParamType>(texture->getSRGBDecode());
175 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400176 default:
177 UNREACHABLE();
178 break;
179 }
180}
181
182template <typename ParamType>
183void SetTexParameterBase(Texture *texture, GLenum pname, const ParamType *params)
184{
185 ASSERT(texture != nullptr);
186
187 switch (pname)
188 {
189 case GL_TEXTURE_WRAP_S:
190 texture->setWrapS(ConvertToGLenum(params[0]));
191 break;
192 case GL_TEXTURE_WRAP_T:
193 texture->setWrapT(ConvertToGLenum(params[0]));
194 break;
195 case GL_TEXTURE_WRAP_R:
196 texture->setWrapR(ConvertToGLenum(params[0]));
197 break;
198 case GL_TEXTURE_MIN_FILTER:
199 texture->setMinFilter(ConvertToGLenum(params[0]));
200 break;
201 case GL_TEXTURE_MAG_FILTER:
202 texture->setMagFilter(ConvertToGLenum(params[0]));
203 break;
204 case GL_TEXTURE_USAGE_ANGLE:
205 texture->setUsage(ConvertToGLenum(params[0]));
206 break;
207 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
208 texture->setMaxAnisotropy(ConvertToGLfloat(params[0]));
209 break;
210 case GL_TEXTURE_COMPARE_MODE:
211 texture->setCompareMode(ConvertToGLenum(params[0]));
212 break;
213 case GL_TEXTURE_COMPARE_FUNC:
214 texture->setCompareFunc(ConvertToGLenum(params[0]));
215 break;
216 case GL_TEXTURE_SWIZZLE_R:
217 texture->setSwizzleRed(ConvertToGLenum(params[0]));
218 break;
219 case GL_TEXTURE_SWIZZLE_G:
220 texture->setSwizzleGreen(ConvertToGLenum(params[0]));
221 break;
222 case GL_TEXTURE_SWIZZLE_B:
223 texture->setSwizzleBlue(ConvertToGLenum(params[0]));
224 break;
225 case GL_TEXTURE_SWIZZLE_A:
226 texture->setSwizzleAlpha(ConvertToGLenum(params[0]));
227 break;
228 case GL_TEXTURE_BASE_LEVEL:
229 texture->setBaseLevel(ConvertToGLuint(params[0]));
230 break;
231 case GL_TEXTURE_MAX_LEVEL:
232 texture->setMaxLevel(ConvertToGLuint(params[0]));
233 break;
234 case GL_TEXTURE_MIN_LOD:
235 texture->setMinLod(ConvertToGLfloat(params[0]));
236 break;
237 case GL_TEXTURE_MAX_LOD:
238 texture->setMaxLod(ConvertToGLfloat(params[0]));
239 break;
Geoff Lang3b573612016-10-31 14:08:10 -0400240 case GL_DEPTH_STENCIL_TEXTURE_MODE:
Geoff Lang9f090372016-12-02 10:20:43 -0500241 texture->setDepthStencilTextureMode(ConvertToGLenum(params[0]));
Geoff Lang3b573612016-10-31 14:08:10 -0400242 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700243 case GL_TEXTURE_SRGB_DECODE_EXT:
244 texture->setSRGBDecode(ConvertToGLenum(params[0]));
245 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400246 default:
247 UNREACHABLE();
248 break;
249 }
250}
251
252template <typename ParamType>
253void QuerySamplerParameterBase(const Sampler *sampler, GLenum pname, ParamType *params)
254{
255 switch (pname)
256 {
257 case GL_TEXTURE_MIN_FILTER:
258 *params = ConvertFromGLenum<ParamType>(sampler->getMinFilter());
259 break;
260 case GL_TEXTURE_MAG_FILTER:
261 *params = ConvertFromGLenum<ParamType>(sampler->getMagFilter());
262 break;
263 case GL_TEXTURE_WRAP_S:
264 *params = ConvertFromGLenum<ParamType>(sampler->getWrapS());
265 break;
266 case GL_TEXTURE_WRAP_T:
267 *params = ConvertFromGLenum<ParamType>(sampler->getWrapT());
268 break;
269 case GL_TEXTURE_WRAP_R:
270 *params = ConvertFromGLenum<ParamType>(sampler->getWrapR());
271 break;
272 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
273 *params = ConvertFromGLfloat<ParamType>(sampler->getMaxAnisotropy());
274 break;
275 case GL_TEXTURE_MIN_LOD:
276 *params = ConvertFromGLfloat<ParamType>(sampler->getMinLod());
277 break;
278 case GL_TEXTURE_MAX_LOD:
279 *params = ConvertFromGLfloat<ParamType>(sampler->getMaxLod());
280 break;
281 case GL_TEXTURE_COMPARE_MODE:
282 *params = ConvertFromGLenum<ParamType>(sampler->getCompareMode());
283 break;
284 case GL_TEXTURE_COMPARE_FUNC:
285 *params = ConvertFromGLenum<ParamType>(sampler->getCompareFunc());
286 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700287 case GL_TEXTURE_SRGB_DECODE_EXT:
288 *params = ConvertFromGLenum<ParamType>(sampler->getSRGBDecode());
289 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400290 default:
291 UNREACHABLE();
292 break;
293 }
294}
295
296template <typename ParamType>
297void SetSamplerParameterBase(Sampler *sampler, GLenum pname, const ParamType *params)
298{
299 switch (pname)
300 {
301 case GL_TEXTURE_WRAP_S:
302 sampler->setWrapS(ConvertToGLenum(params[0]));
303 break;
304 case GL_TEXTURE_WRAP_T:
305 sampler->setWrapT(ConvertToGLenum(params[0]));
306 break;
307 case GL_TEXTURE_WRAP_R:
308 sampler->setWrapR(ConvertToGLenum(params[0]));
309 break;
310 case GL_TEXTURE_MIN_FILTER:
311 sampler->setMinFilter(ConvertToGLenum(params[0]));
312 break;
313 case GL_TEXTURE_MAG_FILTER:
314 sampler->setMagFilter(ConvertToGLenum(params[0]));
315 break;
316 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
317 sampler->setMaxAnisotropy(ConvertToGLfloat(params[0]));
318 break;
319 case GL_TEXTURE_COMPARE_MODE:
320 sampler->setCompareMode(ConvertToGLenum(params[0]));
321 break;
322 case GL_TEXTURE_COMPARE_FUNC:
323 sampler->setCompareFunc(ConvertToGLenum(params[0]));
324 break;
325 case GL_TEXTURE_MIN_LOD:
326 sampler->setMinLod(ConvertToGLfloat(params[0]));
327 break;
328 case GL_TEXTURE_MAX_LOD:
329 sampler->setMaxLod(ConvertToGLfloat(params[0]));
330 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700331 case GL_TEXTURE_SRGB_DECODE_EXT:
332 sampler->setSRGBDecode(ConvertToGLenum(params[0]));
333 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400334 default:
335 UNREACHABLE();
336 break;
337 }
338}
339
Geoff Lang0b031062016-10-13 14:30:04 -0400340template <typename ParamType, typename CurrentDataType>
341ParamType ConvertCurrentValue(CurrentDataType currentValue)
342{
343 return static_cast<ParamType>(currentValue);
344}
345
346template <>
347GLint ConvertCurrentValue(GLfloat currentValue)
348{
349 return iround<GLint>(currentValue);
350}
351
352template <typename ParamType, typename CurrentDataType, size_t CurrentValueCount>
353void QueryVertexAttribBase(const VertexAttribute &attrib,
354 const CurrentDataType (&currentValueData)[CurrentValueCount],
355 GLenum pname,
356 ParamType *params)
357{
358 switch (pname)
359 {
360 case GL_CURRENT_VERTEX_ATTRIB:
361 for (size_t i = 0; i < CurrentValueCount; ++i)
362 {
363 params[i] = ConvertCurrentValue<ParamType>(currentValueData[i]);
364 }
365 break;
366 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
367 *params = ConvertFromGLboolean<ParamType>(attrib.enabled);
368 break;
369 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
370 *params = ConvertFromGLuint<ParamType>(attrib.size);
371 break;
372 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
373 *params = ConvertFromGLuint<ParamType>(attrib.stride);
374 break;
375 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
376 *params = ConvertFromGLenum<ParamType>(attrib.type);
377 break;
378 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
379 *params = ConvertFromGLboolean<ParamType>(attrib.normalized);
380 break;
381 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
382 *params = ConvertFromGLuint<ParamType>(attrib.buffer.id());
383 break;
384 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
385 *params = ConvertFromGLuint<ParamType>(attrib.divisor);
386 break;
387 case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
388 *params = ConvertFromGLboolean<ParamType>(attrib.pureInteger);
389 break;
390 default:
391 UNREACHABLE();
392 break;
393 }
394}
395
Geoff Langebebe1c2016-10-14 12:01:31 -0400396template <typename ParamType>
397void QueryBufferParameterBase(const Buffer *buffer, GLenum pname, ParamType *params)
398{
399 ASSERT(buffer != nullptr);
400
401 switch (pname)
402 {
403 case GL_BUFFER_USAGE:
404 *params = ConvertFromGLenum<ParamType>(buffer->getUsage());
405 break;
406 case GL_BUFFER_SIZE:
407 *params = ConvertFromGLint64<ParamType>(buffer->getSize());
408 break;
409 case GL_BUFFER_ACCESS_FLAGS:
410 *params = ConvertFromGLuint<ParamType>(buffer->getAccessFlags());
411 break;
412 case GL_BUFFER_ACCESS_OES:
413 *params = ConvertFromGLenum<ParamType>(buffer->getAccess());
414 break;
415 case GL_BUFFER_MAPPED:
416 *params = ConvertFromGLboolean<ParamType>(buffer->isMapped());
417 break;
418 case GL_BUFFER_MAP_OFFSET:
419 *params = ConvertFromGLint64<ParamType>(buffer->getMapOffset());
420 break;
421 case GL_BUFFER_MAP_LENGTH:
422 *params = ConvertFromGLint64<ParamType>(buffer->getMapLength());
423 break;
424 default:
425 UNREACHABLE();
426 break;
427 }
428}
429
Geoff Langc1984ed2016-10-07 12:41:00 -0400430} // anonymous namespace
431
Geoff Langff5b2d52016-09-07 11:32:23 -0400432void QueryFramebufferAttachmentParameteriv(const Framebuffer *framebuffer,
433 GLenum attachment,
434 GLenum pname,
435 GLint *params)
436{
437 ASSERT(framebuffer);
438
439 const FramebufferAttachment *attachmentObject = framebuffer->getAttachment(attachment);
440 if (attachmentObject == nullptr)
441 {
442 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
443 // is NONE, then querying any other pname will generate INVALID_ENUM.
444
445 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
446 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
447 // INVALID_OPERATION for all other pnames
448
449 switch (pname)
450 {
451 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
452 *params = GL_NONE;
453 break;
454
455 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
456 *params = 0;
457 break;
458
459 default:
460 UNREACHABLE();
461 break;
462 }
463
464 return;
465 }
466
467 switch (pname)
468 {
469 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
470 *params = attachmentObject->type();
471 break;
472
473 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
474 *params = attachmentObject->id();
475 break;
476
477 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
478 *params = attachmentObject->mipLevel();
479 break;
480
481 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
482 *params = attachmentObject->cubeMapFace();
483 break;
484
485 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
486 *params = attachmentObject->getRedSize();
487 break;
488
489 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
490 *params = attachmentObject->getGreenSize();
491 break;
492
493 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
494 *params = attachmentObject->getBlueSize();
495 break;
496
497 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
498 *params = attachmentObject->getAlphaSize();
499 break;
500
501 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
502 *params = attachmentObject->getDepthSize();
503 break;
504
505 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
506 *params = attachmentObject->getStencilSize();
507 break;
508
509 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
510 *params = attachmentObject->getComponentType();
511 break;
512
513 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
514 *params = attachmentObject->getColorEncoding();
515 break;
516
517 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
518 *params = attachmentObject->layer();
519 break;
520
521 default:
522 UNREACHABLE();
523 break;
524 }
525}
526
527void QueryBufferParameteriv(const Buffer *buffer, GLenum pname, GLint *params)
528{
Geoff Langebebe1c2016-10-14 12:01:31 -0400529 QueryBufferParameterBase(buffer, pname, params);
530}
Geoff Langff5b2d52016-09-07 11:32:23 -0400531
Geoff Langebebe1c2016-10-14 12:01:31 -0400532void QueryBufferParameteri64v(const Buffer *buffer, GLenum pname, GLint64 *params)
533{
534 QueryBufferParameterBase(buffer, pname, params);
Geoff Langff5b2d52016-09-07 11:32:23 -0400535}
536
Geoff Lang496c02d2016-10-20 11:38:11 -0700537void QueryBufferPointerv(const Buffer *buffer, GLenum pname, void **params)
538{
539 switch (pname)
540 {
541 case GL_BUFFER_MAP_POINTER:
542 *params = buffer->getMapPointer();
543 break;
544
545 default:
546 UNREACHABLE();
547 break;
548 }
549}
550
Geoff Langff5b2d52016-09-07 11:32:23 -0400551void QueryProgramiv(const Program *program, GLenum pname, GLint *params)
552{
553 ASSERT(program != nullptr);
554
555 switch (pname)
556 {
557 case GL_DELETE_STATUS:
558 *params = program->isFlaggedForDeletion();
559 return;
560 case GL_LINK_STATUS:
561 *params = program->isLinked();
562 return;
563 case GL_VALIDATE_STATUS:
564 *params = program->isValidated();
565 return;
566 case GL_INFO_LOG_LENGTH:
567 *params = program->getInfoLogLength();
568 return;
569 case GL_ATTACHED_SHADERS:
570 *params = program->getAttachedShadersCount();
571 return;
572 case GL_ACTIVE_ATTRIBUTES:
573 *params = program->getActiveAttributeCount();
574 return;
575 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
576 *params = program->getActiveAttributeMaxLength();
577 return;
578 case GL_ACTIVE_UNIFORMS:
579 *params = program->getActiveUniformCount();
580 return;
581 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
582 *params = program->getActiveUniformMaxLength();
583 return;
584 case GL_PROGRAM_BINARY_LENGTH_OES:
585 *params = program->getBinaryLength();
586 return;
587 case GL_ACTIVE_UNIFORM_BLOCKS:
588 *params = program->getActiveUniformBlockCount();
589 return;
590 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
591 *params = program->getActiveUniformBlockMaxLength();
592 break;
593 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
594 *params = program->getTransformFeedbackBufferMode();
595 break;
596 case GL_TRANSFORM_FEEDBACK_VARYINGS:
597 *params = program->getTransformFeedbackVaryingCount();
598 break;
599 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
600 *params = program->getTransformFeedbackVaryingMaxLength();
601 break;
602 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
603 *params = program->getBinaryRetrievableHint();
604 break;
605 default:
606 UNREACHABLE();
607 break;
608 }
609}
Geoff Lang740d9022016-10-07 11:20:52 -0400610
611void QueryRenderbufferiv(const Renderbuffer *renderbuffer, GLenum pname, GLint *params)
612{
613 ASSERT(renderbuffer != nullptr);
614
615 switch (pname)
616 {
617 case GL_RENDERBUFFER_WIDTH:
618 *params = renderbuffer->getWidth();
619 break;
620 case GL_RENDERBUFFER_HEIGHT:
621 *params = renderbuffer->getHeight();
622 break;
623 case GL_RENDERBUFFER_INTERNAL_FORMAT:
624 *params = renderbuffer->getFormat().info->internalFormat;
625 break;
626 case GL_RENDERBUFFER_RED_SIZE:
627 *params = renderbuffer->getRedSize();
628 break;
629 case GL_RENDERBUFFER_GREEN_SIZE:
630 *params = renderbuffer->getGreenSize();
631 break;
632 case GL_RENDERBUFFER_BLUE_SIZE:
633 *params = renderbuffer->getBlueSize();
634 break;
635 case GL_RENDERBUFFER_ALPHA_SIZE:
636 *params = renderbuffer->getAlphaSize();
637 break;
638 case GL_RENDERBUFFER_DEPTH_SIZE:
639 *params = renderbuffer->getDepthSize();
640 break;
641 case GL_RENDERBUFFER_STENCIL_SIZE:
642 *params = renderbuffer->getStencilSize();
643 break;
644 case GL_RENDERBUFFER_SAMPLES_ANGLE:
645 *params = renderbuffer->getSamples();
646 break;
647 default:
648 UNREACHABLE();
649 break;
650 }
651}
Geoff Langd7d0ed32016-10-07 11:33:51 -0400652
653void QueryShaderiv(const Shader *shader, GLenum pname, GLint *params)
654{
655 ASSERT(shader != nullptr);
656
657 switch (pname)
658 {
659 case GL_SHADER_TYPE:
660 *params = shader->getType();
661 return;
662 case GL_DELETE_STATUS:
663 *params = shader->isFlaggedForDeletion();
664 return;
665 case GL_COMPILE_STATUS:
666 *params = shader->isCompiled() ? GL_TRUE : GL_FALSE;
667 return;
668 case GL_INFO_LOG_LENGTH:
669 *params = shader->getInfoLogLength();
670 return;
671 case GL_SHADER_SOURCE_LENGTH:
672 *params = shader->getSourceLength();
673 return;
674 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
675 *params = shader->getTranslatedSourceWithDebugInfoLength();
676 return;
677 default:
678 UNREACHABLE();
679 break;
680 }
681}
Geoff Langc1984ed2016-10-07 12:41:00 -0400682
He Yunchao11b038b2016-11-22 21:24:04 +0800683void QueryTexLevelParameterfv(const Texture *texture,
684 GLenum target,
685 GLint level,
686 GLenum pname,
687 GLfloat *params)
688{
689 QueryTexLevelParameterBase(texture, target, level, pname, params);
690}
691
692void QueryTexLevelParameteriv(const Texture *texture,
693 GLenum target,
694 GLint level,
695 GLenum pname,
696 GLint *params)
697{
698 QueryTexLevelParameterBase(texture, target, level, pname, params);
699}
700
Geoff Langc1984ed2016-10-07 12:41:00 -0400701void QueryTexParameterfv(const Texture *texture, GLenum pname, GLfloat *params)
702{
703 QueryTexParameterBase(texture, pname, params);
704}
705
706void QueryTexParameteriv(const Texture *texture, GLenum pname, GLint *params)
707{
708 QueryTexParameterBase(texture, pname, params);
709}
710
711void QuerySamplerParameterfv(const Sampler *sampler, GLenum pname, GLfloat *params)
712{
713 QuerySamplerParameterBase(sampler, pname, params);
714}
715
716void QuerySamplerParameteriv(const Sampler *sampler, GLenum pname, GLint *params)
717{
718 QuerySamplerParameterBase(sampler, pname, params);
719}
720
Geoff Lang0b031062016-10-13 14:30:04 -0400721void QueryVertexAttribfv(const VertexAttribute &attrib,
722 const VertexAttribCurrentValueData &currentValueData,
723 GLenum pname,
724 GLfloat *params)
725{
726 QueryVertexAttribBase(attrib, currentValueData.FloatValues, pname, params);
727}
728
729void QueryVertexAttribiv(const VertexAttribute &attrib,
730 const VertexAttribCurrentValueData &currentValueData,
731 GLenum pname,
732 GLint *params)
733{
734 QueryVertexAttribBase(attrib, currentValueData.FloatValues, pname, params);
735}
736
737void QueryVertexAttribPointerv(const VertexAttribute &attrib, GLenum pname, GLvoid **pointer)
738{
739 switch (pname)
740 {
741 case GL_VERTEX_ATTRIB_ARRAY_POINTER:
742 *pointer = const_cast<GLvoid *>(attrib.pointer);
743 break;
744
745 default:
746 UNREACHABLE();
747 break;
748 }
749}
750
751void QueryVertexAttribIiv(const VertexAttribute &attrib,
752 const VertexAttribCurrentValueData &currentValueData,
753 GLenum pname,
754 GLint *params)
755{
756 QueryVertexAttribBase(attrib, currentValueData.IntValues, pname, params);
757}
758
759void QueryVertexAttribIuiv(const VertexAttribute &attrib,
760 const VertexAttribCurrentValueData &currentValueData,
761 GLenum pname,
762 GLuint *params)
763{
764 QueryVertexAttribBase(attrib, currentValueData.UnsignedIntValues, pname, params);
765}
766
Geoff Lang6899b872016-10-14 11:30:13 -0400767void QueryActiveUniformBlockiv(const Program *program,
768 GLuint uniformBlockIndex,
769 GLenum pname,
770 GLint *params)
771{
772 const UniformBlock &uniformBlock = program->getUniformBlockByIndex(uniformBlockIndex);
773 switch (pname)
774 {
775 case GL_UNIFORM_BLOCK_BINDING:
776 *params = ConvertToGLint(program->getUniformBlockBinding(uniformBlockIndex));
777 break;
778 case GL_UNIFORM_BLOCK_DATA_SIZE:
779 *params = ConvertToGLint(uniformBlock.dataSize);
780 break;
781 case GL_UNIFORM_BLOCK_NAME_LENGTH:
782 *params = ConvertToGLint(uniformBlock.nameWithArrayIndex().size() + 1);
783 break;
784 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
785 *params = ConvertToGLint(uniformBlock.memberUniformIndexes.size());
786 break;
787 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
788 for (size_t blockMemberIndex = 0;
789 blockMemberIndex < uniformBlock.memberUniformIndexes.size(); blockMemberIndex++)
790 {
791 params[blockMemberIndex] =
792 ConvertToGLint(uniformBlock.memberUniformIndexes[blockMemberIndex]);
793 }
794 break;
795 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
796 *params = ConvertToGLint(uniformBlock.vertexStaticUse);
797 break;
798 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
799 *params = ConvertToGLint(uniformBlock.fragmentStaticUse);
800 break;
801 default:
802 UNREACHABLE();
803 break;
804 }
805}
806
Geoff Lang0a9661f2016-10-20 10:59:20 -0700807void QueryInternalFormativ(const TextureCaps &format, GLenum pname, GLsizei bufSize, GLint *params)
808{
809 switch (pname)
810 {
811 case GL_NUM_SAMPLE_COUNTS:
812 if (bufSize != 0)
813 {
814 *params = static_cast<GLint>(format.sampleCounts.size());
815 }
816 break;
817
818 case GL_SAMPLES:
819 {
820 size_t returnCount = std::min<size_t>(bufSize, format.sampleCounts.size());
821 auto sampleReverseIt = format.sampleCounts.rbegin();
822 for (size_t sampleIndex = 0; sampleIndex < returnCount; ++sampleIndex)
823 {
824 params[sampleIndex] = *sampleReverseIt++;
825 }
826 }
827 break;
828
829 default:
830 UNREACHABLE();
831 break;
832 }
833}
834
Geoff Langc1984ed2016-10-07 12:41:00 -0400835void SetTexParameterf(Texture *texture, GLenum pname, GLfloat param)
836{
837 SetTexParameterBase(texture, pname, &param);
838}
839
840void SetTexParameterfv(Texture *texture, GLenum pname, const GLfloat *params)
841{
842 SetTexParameterBase(texture, pname, params);
843}
844
845void SetTexParameteri(Texture *texture, GLenum pname, GLint param)
846{
847 SetTexParameterBase(texture, pname, &param);
848}
849
850void SetTexParameteriv(Texture *texture, GLenum pname, const GLint *params)
851{
852 SetTexParameterBase(texture, pname, params);
853}
854
855void SetSamplerParameterf(Sampler *sampler, GLenum pname, GLfloat param)
856{
857 SetSamplerParameterBase(sampler, pname, &param);
858}
859
860void SetSamplerParameterfv(Sampler *sampler, GLenum pname, const GLfloat *params)
861{
862 SetSamplerParameterBase(sampler, pname, params);
863}
864
865void SetSamplerParameteri(Sampler *sampler, GLenum pname, GLint param)
866{
867 SetSamplerParameterBase(sampler, pname, &param);
868}
869
870void SetSamplerParameteriv(Sampler *sampler, GLenum pname, const GLint *params)
871{
872 SetSamplerParameterBase(sampler, pname, params);
873}
Geoff Lang65603eb2017-01-12 16:48:03 -0500874
875} // namespace gl
876
877namespace egl
878{
879
880void QueryConfigAttrib(const Config *config, EGLint attribute, EGLint *value)
881{
882 ASSERT(config != nullptr);
883 switch (attribute)
884 {
885 case EGL_BUFFER_SIZE:
886 *value = config->bufferSize;
887 break;
888 case EGL_ALPHA_SIZE:
889 *value = config->alphaSize;
890 break;
891 case EGL_BLUE_SIZE:
892 *value = config->blueSize;
893 break;
894 case EGL_GREEN_SIZE:
895 *value = config->greenSize;
896 break;
897 case EGL_RED_SIZE:
898 *value = config->redSize;
899 break;
900 case EGL_DEPTH_SIZE:
901 *value = config->depthSize;
902 break;
903 case EGL_STENCIL_SIZE:
904 *value = config->stencilSize;
905 break;
906 case EGL_CONFIG_CAVEAT:
907 *value = config->configCaveat;
908 break;
909 case EGL_CONFIG_ID:
910 *value = config->configID;
911 break;
912 case EGL_LEVEL:
913 *value = config->level;
914 break;
915 case EGL_NATIVE_RENDERABLE:
916 *value = config->nativeRenderable;
917 break;
918 case EGL_NATIVE_VISUAL_ID:
919 *value = config->nativeVisualID;
920 break;
921 case EGL_NATIVE_VISUAL_TYPE:
922 *value = config->nativeVisualType;
923 break;
924 case EGL_SAMPLES:
925 *value = config->samples;
926 break;
927 case EGL_SAMPLE_BUFFERS:
928 *value = config->sampleBuffers;
929 break;
930 case EGL_SURFACE_TYPE:
931 *value = config->surfaceType;
932 break;
933 case EGL_TRANSPARENT_TYPE:
934 *value = config->transparentType;
935 break;
936 case EGL_TRANSPARENT_BLUE_VALUE:
937 *value = config->transparentBlueValue;
938 break;
939 case EGL_TRANSPARENT_GREEN_VALUE:
940 *value = config->transparentGreenValue;
941 break;
942 case EGL_TRANSPARENT_RED_VALUE:
943 *value = config->transparentRedValue;
944 break;
945 case EGL_BIND_TO_TEXTURE_RGB:
946 *value = config->bindToTextureRGB;
947 break;
948 case EGL_BIND_TO_TEXTURE_RGBA:
949 *value = config->bindToTextureRGBA;
950 break;
951 case EGL_MIN_SWAP_INTERVAL:
952 *value = config->minSwapInterval;
953 break;
954 case EGL_MAX_SWAP_INTERVAL:
955 *value = config->maxSwapInterval;
956 break;
957 case EGL_LUMINANCE_SIZE:
958 *value = config->luminanceSize;
959 break;
960 case EGL_ALPHA_MASK_SIZE:
961 *value = config->alphaMaskSize;
962 break;
963 case EGL_COLOR_BUFFER_TYPE:
964 *value = config->colorBufferType;
965 break;
966 case EGL_RENDERABLE_TYPE:
967 *value = config->renderableType;
968 break;
969 case EGL_MATCH_NATIVE_PIXMAP:
970 *value = false;
971 UNIMPLEMENTED();
972 break;
973 case EGL_CONFORMANT:
974 *value = config->conformant;
975 break;
976 case EGL_MAX_PBUFFER_WIDTH:
977 *value = config->maxPBufferWidth;
978 break;
979 case EGL_MAX_PBUFFER_HEIGHT:
980 *value = config->maxPBufferHeight;
981 break;
982 case EGL_MAX_PBUFFER_PIXELS:
983 *value = config->maxPBufferPixels;
984 break;
985 case EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE:
986 *value = config->optimalOrientation;
987 break;
988 default:
989 UNREACHABLE();
990 break;
991 }
Geoff Langff5b2d52016-09-07 11:32:23 -0400992}
Geoff Lang65603eb2017-01-12 16:48:03 -0500993
994} // namespace egl