blob: a53ee22953f5987f29b50d37c0f1ceaffc359b6e [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
JiangYizhouf7bbc8a2016-11-16 09:57:22 +0800835void QueryFramebufferParameteriv(const Framebuffer *framebuffer, GLenum pname, GLint *params)
836{
837 ASSERT(framebuffer);
838
839 switch (pname)
840 {
841 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
842 *params = framebuffer->getDefaultWidth();
843 break;
844 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
845 *params = framebuffer->getDefaultHeight();
846 break;
847 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
848 *params = framebuffer->getDefaultSamples();
849 break;
850 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
851 *params = framebuffer->getDefaultFixedSampleLocations();
852 break;
853 default:
854 UNREACHABLE();
855 break;
856 }
857}
858
Geoff Langc1984ed2016-10-07 12:41:00 -0400859void SetTexParameterf(Texture *texture, GLenum pname, GLfloat param)
860{
861 SetTexParameterBase(texture, pname, &param);
862}
863
864void SetTexParameterfv(Texture *texture, GLenum pname, const GLfloat *params)
865{
866 SetTexParameterBase(texture, pname, params);
867}
868
869void SetTexParameteri(Texture *texture, GLenum pname, GLint param)
870{
871 SetTexParameterBase(texture, pname, &param);
872}
873
874void SetTexParameteriv(Texture *texture, GLenum pname, const GLint *params)
875{
876 SetTexParameterBase(texture, pname, params);
877}
878
879void SetSamplerParameterf(Sampler *sampler, GLenum pname, GLfloat param)
880{
881 SetSamplerParameterBase(sampler, pname, &param);
882}
883
884void SetSamplerParameterfv(Sampler *sampler, GLenum pname, const GLfloat *params)
885{
886 SetSamplerParameterBase(sampler, pname, params);
887}
888
889void SetSamplerParameteri(Sampler *sampler, GLenum pname, GLint param)
890{
891 SetSamplerParameterBase(sampler, pname, &param);
892}
893
894void SetSamplerParameteriv(Sampler *sampler, GLenum pname, const GLint *params)
895{
896 SetSamplerParameterBase(sampler, pname, params);
897}
Geoff Lang65603eb2017-01-12 16:48:03 -0500898
JiangYizhouf7bbc8a2016-11-16 09:57:22 +0800899void SetFramebufferParameteri(Framebuffer *framebuffer, GLenum pname, GLint param)
900{
901 ASSERT(framebuffer);
902
903 switch (pname)
904 {
905 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
906 framebuffer->setDefaultWidth(param);
907 break;
908 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
909 framebuffer->setDefaultHeight(param);
910 break;
911 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
912 framebuffer->setDefaultSamples(param);
913 break;
914 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
915 framebuffer->setDefaultFixedSampleLocations(static_cast<GLboolean>(param));
916 break;
917 default:
918 UNREACHABLE();
919 break;
920 }
921}
922
Geoff Lang65603eb2017-01-12 16:48:03 -0500923} // namespace gl
924
925namespace egl
926{
927
928void QueryConfigAttrib(const Config *config, EGLint attribute, EGLint *value)
929{
930 ASSERT(config != nullptr);
931 switch (attribute)
932 {
933 case EGL_BUFFER_SIZE:
934 *value = config->bufferSize;
935 break;
936 case EGL_ALPHA_SIZE:
937 *value = config->alphaSize;
938 break;
939 case EGL_BLUE_SIZE:
940 *value = config->blueSize;
941 break;
942 case EGL_GREEN_SIZE:
943 *value = config->greenSize;
944 break;
945 case EGL_RED_SIZE:
946 *value = config->redSize;
947 break;
948 case EGL_DEPTH_SIZE:
949 *value = config->depthSize;
950 break;
951 case EGL_STENCIL_SIZE:
952 *value = config->stencilSize;
953 break;
954 case EGL_CONFIG_CAVEAT:
955 *value = config->configCaveat;
956 break;
957 case EGL_CONFIG_ID:
958 *value = config->configID;
959 break;
960 case EGL_LEVEL:
961 *value = config->level;
962 break;
963 case EGL_NATIVE_RENDERABLE:
964 *value = config->nativeRenderable;
965 break;
966 case EGL_NATIVE_VISUAL_ID:
967 *value = config->nativeVisualID;
968 break;
969 case EGL_NATIVE_VISUAL_TYPE:
970 *value = config->nativeVisualType;
971 break;
972 case EGL_SAMPLES:
973 *value = config->samples;
974 break;
975 case EGL_SAMPLE_BUFFERS:
976 *value = config->sampleBuffers;
977 break;
978 case EGL_SURFACE_TYPE:
979 *value = config->surfaceType;
980 break;
981 case EGL_TRANSPARENT_TYPE:
982 *value = config->transparentType;
983 break;
984 case EGL_TRANSPARENT_BLUE_VALUE:
985 *value = config->transparentBlueValue;
986 break;
987 case EGL_TRANSPARENT_GREEN_VALUE:
988 *value = config->transparentGreenValue;
989 break;
990 case EGL_TRANSPARENT_RED_VALUE:
991 *value = config->transparentRedValue;
992 break;
993 case EGL_BIND_TO_TEXTURE_RGB:
994 *value = config->bindToTextureRGB;
995 break;
996 case EGL_BIND_TO_TEXTURE_RGBA:
997 *value = config->bindToTextureRGBA;
998 break;
999 case EGL_MIN_SWAP_INTERVAL:
1000 *value = config->minSwapInterval;
1001 break;
1002 case EGL_MAX_SWAP_INTERVAL:
1003 *value = config->maxSwapInterval;
1004 break;
1005 case EGL_LUMINANCE_SIZE:
1006 *value = config->luminanceSize;
1007 break;
1008 case EGL_ALPHA_MASK_SIZE:
1009 *value = config->alphaMaskSize;
1010 break;
1011 case EGL_COLOR_BUFFER_TYPE:
1012 *value = config->colorBufferType;
1013 break;
1014 case EGL_RENDERABLE_TYPE:
1015 *value = config->renderableType;
1016 break;
1017 case EGL_MATCH_NATIVE_PIXMAP:
1018 *value = false;
1019 UNIMPLEMENTED();
1020 break;
1021 case EGL_CONFORMANT:
1022 *value = config->conformant;
1023 break;
1024 case EGL_MAX_PBUFFER_WIDTH:
1025 *value = config->maxPBufferWidth;
1026 break;
1027 case EGL_MAX_PBUFFER_HEIGHT:
1028 *value = config->maxPBufferHeight;
1029 break;
1030 case EGL_MAX_PBUFFER_PIXELS:
1031 *value = config->maxPBufferPixels;
1032 break;
1033 case EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE:
1034 *value = config->optimalOrientation;
1035 break;
Geoff Langc5a2a172017-01-13 15:55:07 -05001036 case EGL_COLOR_COMPONENT_TYPE_EXT:
1037 *value = config->colorComponentType;
1038 break;
Geoff Lang65603eb2017-01-12 16:48:03 -05001039 default:
1040 UNREACHABLE();
1041 break;
1042 }
Geoff Langff5b2d52016-09-07 11:32:23 -04001043}
Geoff Lang65603eb2017-01-12 16:48:03 -05001044
1045} // namespace egl