blob: bbdbc52baaff6ff0750dbacf2ea6ee8a3e9fdae8 [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>
He Yunchao11b038b2016-11-22 21:24:04 +080029void QueryTexLevelParameterBase(const Texture *texture,
30 GLenum target,
31 GLint level,
32 GLenum pname,
33 ParamType *params)
34{
35 ASSERT(texture != nullptr);
36 const InternalFormat *info = texture->getTextureState().getImageDesc(target, level).format.info;
37
38 switch (pname)
39 {
40 case GL_TEXTURE_RED_TYPE:
41 *params = ConvertFromGLenum<ParamType>(info->redBits ? info->componentType : GL_NONE);
42 break;
43 case GL_TEXTURE_GREEN_TYPE:
44 *params = ConvertFromGLenum<ParamType>(info->greenBits ? info->componentType : GL_NONE);
45 break;
46 case GL_TEXTURE_BLUE_TYPE:
47 *params = ConvertFromGLenum<ParamType>(info->blueBits ? info->componentType : GL_NONE);
48 break;
49 case GL_TEXTURE_ALPHA_TYPE:
50 *params = ConvertFromGLenum<ParamType>(info->alphaBits ? info->componentType : GL_NONE);
51 break;
52 case GL_TEXTURE_DEPTH_TYPE:
53 *params = ConvertFromGLenum<ParamType>(info->depthBits ? info->componentType : GL_NONE);
54 break;
55 case GL_TEXTURE_RED_SIZE:
56 *params = ConvertFromGLuint<ParamType>(info->redBits);
57 break;
58 case GL_TEXTURE_GREEN_SIZE:
59 *params = ConvertFromGLuint<ParamType>(info->greenBits);
60 break;
61 case GL_TEXTURE_BLUE_SIZE:
62 *params = ConvertFromGLuint<ParamType>(info->blueBits);
63 break;
64 case GL_TEXTURE_ALPHA_SIZE:
65 *params = ConvertFromGLuint<ParamType>(info->alphaBits);
66 break;
67 case GL_TEXTURE_DEPTH_SIZE:
68 *params = ConvertFromGLuint<ParamType>(info->depthBits);
69 break;
70 case GL_TEXTURE_STENCIL_SIZE:
71 *params = ConvertFromGLuint<ParamType>(info->stencilBits);
72 break;
73 case GL_TEXTURE_SHARED_SIZE:
74 *params = ConvertFromGLuint<ParamType>(info->sharedBits);
75 break;
76 case GL_TEXTURE_INTERNAL_FORMAT:
77 *params =
78 ConvertFromGLenum<ParamType>(info->internalFormat ? info->internalFormat : GL_RGBA);
79 break;
80 case GL_TEXTURE_WIDTH:
81 *params =
82 ConvertFromGLint<ParamType>(static_cast<GLint>(texture->getWidth(target, level)));
83 break;
84 case GL_TEXTURE_HEIGHT:
85 *params =
86 ConvertFromGLint<ParamType>(static_cast<GLint>(texture->getHeight(target, level)));
87 break;
88 case GL_TEXTURE_DEPTH:
89 *params =
90 ConvertFromGLint<ParamType>(static_cast<GLint>(texture->getDepth(target, level)));
91 break;
92 case GL_TEXTURE_SAMPLES:
93 *params = ConvertFromGLint<ParamType>(texture->getSamples(target, level));
94 break;
95 case GL_TEXTURE_FIXED_SAMPLE_LOCATIONS:
96 *params =
97 ConvertFromGLboolean<ParamType>(texture->getFixedSampleLocations(target, level));
98 break;
99 case GL_TEXTURE_COMPRESSED:
100 *params = ConvertFromGLboolean<ParamType>(info->compressed);
101 break;
102 default:
103 UNREACHABLE();
104 break;
105 }
106}
107
108template <typename ParamType>
Geoff Langc1984ed2016-10-07 12:41:00 -0400109void QueryTexParameterBase(const Texture *texture, GLenum pname, ParamType *params)
110{
111 ASSERT(texture != nullptr);
112
113 switch (pname)
114 {
115 case GL_TEXTURE_MAG_FILTER:
116 *params = ConvertFromGLenum<ParamType>(texture->getMagFilter());
117 break;
118 case GL_TEXTURE_MIN_FILTER:
119 *params = ConvertFromGLenum<ParamType>(texture->getMinFilter());
120 break;
121 case GL_TEXTURE_WRAP_S:
122 *params = ConvertFromGLenum<ParamType>(texture->getWrapS());
123 break;
124 case GL_TEXTURE_WRAP_T:
125 *params = ConvertFromGLenum<ParamType>(texture->getWrapT());
126 break;
127 case GL_TEXTURE_WRAP_R:
128 *params = ConvertFromGLenum<ParamType>(texture->getWrapR());
129 break;
130 case GL_TEXTURE_IMMUTABLE_FORMAT:
131 *params = ConvertFromGLboolean<ParamType>(texture->getImmutableFormat());
132 break;
133 case GL_TEXTURE_IMMUTABLE_LEVELS:
134 *params = ConvertFromGLuint<ParamType>(texture->getImmutableLevels());
135 break;
136 case GL_TEXTURE_USAGE_ANGLE:
137 *params = ConvertFromGLenum<ParamType>(texture->getUsage());
138 break;
139 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
140 *params = ConvertFromGLfloat<ParamType>(texture->getMaxAnisotropy());
141 break;
142 case GL_TEXTURE_SWIZZLE_R:
143 *params = ConvertFromGLenum<ParamType>(texture->getSwizzleRed());
144 break;
145 case GL_TEXTURE_SWIZZLE_G:
146 *params = ConvertFromGLenum<ParamType>(texture->getSwizzleGreen());
147 break;
148 case GL_TEXTURE_SWIZZLE_B:
149 *params = ConvertFromGLenum<ParamType>(texture->getSwizzleBlue());
150 break;
151 case GL_TEXTURE_SWIZZLE_A:
152 *params = ConvertFromGLenum<ParamType>(texture->getSwizzleAlpha());
153 break;
154 case GL_TEXTURE_BASE_LEVEL:
155 *params = ConvertFromGLuint<ParamType>(texture->getBaseLevel());
156 break;
157 case GL_TEXTURE_MAX_LEVEL:
158 *params = ConvertFromGLuint<ParamType>(texture->getMaxLevel());
159 break;
160 case GL_TEXTURE_MIN_LOD:
161 *params = ConvertFromGLfloat<ParamType>(texture->getSamplerState().minLod);
162 break;
163 case GL_TEXTURE_MAX_LOD:
164 *params = ConvertFromGLfloat<ParamType>(texture->getSamplerState().maxLod);
165 break;
166 case GL_TEXTURE_COMPARE_MODE:
167 *params = ConvertFromGLenum<ParamType>(texture->getCompareMode());
168 break;
169 case GL_TEXTURE_COMPARE_FUNC:
170 *params = ConvertFromGLenum<ParamType>(texture->getCompareFunc());
171 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700172 case GL_TEXTURE_SRGB_DECODE_EXT:
173 *params = ConvertFromGLenum<ParamType>(texture->getSRGBDecode());
174 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400175 default:
176 UNREACHABLE();
177 break;
178 }
179}
180
181template <typename ParamType>
182void SetTexParameterBase(Texture *texture, GLenum pname, const ParamType *params)
183{
184 ASSERT(texture != nullptr);
185
186 switch (pname)
187 {
188 case GL_TEXTURE_WRAP_S:
189 texture->setWrapS(ConvertToGLenum(params[0]));
190 break;
191 case GL_TEXTURE_WRAP_T:
192 texture->setWrapT(ConvertToGLenum(params[0]));
193 break;
194 case GL_TEXTURE_WRAP_R:
195 texture->setWrapR(ConvertToGLenum(params[0]));
196 break;
197 case GL_TEXTURE_MIN_FILTER:
198 texture->setMinFilter(ConvertToGLenum(params[0]));
199 break;
200 case GL_TEXTURE_MAG_FILTER:
201 texture->setMagFilter(ConvertToGLenum(params[0]));
202 break;
203 case GL_TEXTURE_USAGE_ANGLE:
204 texture->setUsage(ConvertToGLenum(params[0]));
205 break;
206 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
207 texture->setMaxAnisotropy(ConvertToGLfloat(params[0]));
208 break;
209 case GL_TEXTURE_COMPARE_MODE:
210 texture->setCompareMode(ConvertToGLenum(params[0]));
211 break;
212 case GL_TEXTURE_COMPARE_FUNC:
213 texture->setCompareFunc(ConvertToGLenum(params[0]));
214 break;
215 case GL_TEXTURE_SWIZZLE_R:
216 texture->setSwizzleRed(ConvertToGLenum(params[0]));
217 break;
218 case GL_TEXTURE_SWIZZLE_G:
219 texture->setSwizzleGreen(ConvertToGLenum(params[0]));
220 break;
221 case GL_TEXTURE_SWIZZLE_B:
222 texture->setSwizzleBlue(ConvertToGLenum(params[0]));
223 break;
224 case GL_TEXTURE_SWIZZLE_A:
225 texture->setSwizzleAlpha(ConvertToGLenum(params[0]));
226 break;
227 case GL_TEXTURE_BASE_LEVEL:
228 texture->setBaseLevel(ConvertToGLuint(params[0]));
229 break;
230 case GL_TEXTURE_MAX_LEVEL:
231 texture->setMaxLevel(ConvertToGLuint(params[0]));
232 break;
233 case GL_TEXTURE_MIN_LOD:
234 texture->setMinLod(ConvertToGLfloat(params[0]));
235 break;
236 case GL_TEXTURE_MAX_LOD:
237 texture->setMaxLod(ConvertToGLfloat(params[0]));
238 break;
Geoff Lang3b573612016-10-31 14:08:10 -0400239 case GL_DEPTH_STENCIL_TEXTURE_MODE:
Geoff Lang9f090372016-12-02 10:20:43 -0500240 texture->setDepthStencilTextureMode(ConvertToGLenum(params[0]));
Geoff Lang3b573612016-10-31 14:08:10 -0400241 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700242 case GL_TEXTURE_SRGB_DECODE_EXT:
243 texture->setSRGBDecode(ConvertToGLenum(params[0]));
244 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400245 default:
246 UNREACHABLE();
247 break;
248 }
249}
250
251template <typename ParamType>
252void QuerySamplerParameterBase(const Sampler *sampler, GLenum pname, ParamType *params)
253{
254 switch (pname)
255 {
256 case GL_TEXTURE_MIN_FILTER:
257 *params = ConvertFromGLenum<ParamType>(sampler->getMinFilter());
258 break;
259 case GL_TEXTURE_MAG_FILTER:
260 *params = ConvertFromGLenum<ParamType>(sampler->getMagFilter());
261 break;
262 case GL_TEXTURE_WRAP_S:
263 *params = ConvertFromGLenum<ParamType>(sampler->getWrapS());
264 break;
265 case GL_TEXTURE_WRAP_T:
266 *params = ConvertFromGLenum<ParamType>(sampler->getWrapT());
267 break;
268 case GL_TEXTURE_WRAP_R:
269 *params = ConvertFromGLenum<ParamType>(sampler->getWrapR());
270 break;
271 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
272 *params = ConvertFromGLfloat<ParamType>(sampler->getMaxAnisotropy());
273 break;
274 case GL_TEXTURE_MIN_LOD:
275 *params = ConvertFromGLfloat<ParamType>(sampler->getMinLod());
276 break;
277 case GL_TEXTURE_MAX_LOD:
278 *params = ConvertFromGLfloat<ParamType>(sampler->getMaxLod());
279 break;
280 case GL_TEXTURE_COMPARE_MODE:
281 *params = ConvertFromGLenum<ParamType>(sampler->getCompareMode());
282 break;
283 case GL_TEXTURE_COMPARE_FUNC:
284 *params = ConvertFromGLenum<ParamType>(sampler->getCompareFunc());
285 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700286 case GL_TEXTURE_SRGB_DECODE_EXT:
287 *params = ConvertFromGLenum<ParamType>(sampler->getSRGBDecode());
288 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400289 default:
290 UNREACHABLE();
291 break;
292 }
293}
294
295template <typename ParamType>
296void SetSamplerParameterBase(Sampler *sampler, GLenum pname, const ParamType *params)
297{
298 switch (pname)
299 {
300 case GL_TEXTURE_WRAP_S:
301 sampler->setWrapS(ConvertToGLenum(params[0]));
302 break;
303 case GL_TEXTURE_WRAP_T:
304 sampler->setWrapT(ConvertToGLenum(params[0]));
305 break;
306 case GL_TEXTURE_WRAP_R:
307 sampler->setWrapR(ConvertToGLenum(params[0]));
308 break;
309 case GL_TEXTURE_MIN_FILTER:
310 sampler->setMinFilter(ConvertToGLenum(params[0]));
311 break;
312 case GL_TEXTURE_MAG_FILTER:
313 sampler->setMagFilter(ConvertToGLenum(params[0]));
314 break;
315 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
316 sampler->setMaxAnisotropy(ConvertToGLfloat(params[0]));
317 break;
318 case GL_TEXTURE_COMPARE_MODE:
319 sampler->setCompareMode(ConvertToGLenum(params[0]));
320 break;
321 case GL_TEXTURE_COMPARE_FUNC:
322 sampler->setCompareFunc(ConvertToGLenum(params[0]));
323 break;
324 case GL_TEXTURE_MIN_LOD:
325 sampler->setMinLod(ConvertToGLfloat(params[0]));
326 break;
327 case GL_TEXTURE_MAX_LOD:
328 sampler->setMaxLod(ConvertToGLfloat(params[0]));
329 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700330 case GL_TEXTURE_SRGB_DECODE_EXT:
331 sampler->setSRGBDecode(ConvertToGLenum(params[0]));
332 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400333 default:
334 UNREACHABLE();
335 break;
336 }
337}
338
Geoff Lang0b031062016-10-13 14:30:04 -0400339template <typename ParamType, typename CurrentDataType>
340ParamType ConvertCurrentValue(CurrentDataType currentValue)
341{
342 return static_cast<ParamType>(currentValue);
343}
344
345template <>
346GLint ConvertCurrentValue(GLfloat currentValue)
347{
348 return iround<GLint>(currentValue);
349}
350
351template <typename ParamType, typename CurrentDataType, size_t CurrentValueCount>
352void QueryVertexAttribBase(const VertexAttribute &attrib,
353 const CurrentDataType (&currentValueData)[CurrentValueCount],
354 GLenum pname,
355 ParamType *params)
356{
357 switch (pname)
358 {
359 case GL_CURRENT_VERTEX_ATTRIB:
360 for (size_t i = 0; i < CurrentValueCount; ++i)
361 {
362 params[i] = ConvertCurrentValue<ParamType>(currentValueData[i]);
363 }
364 break;
365 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
366 *params = ConvertFromGLboolean<ParamType>(attrib.enabled);
367 break;
368 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
369 *params = ConvertFromGLuint<ParamType>(attrib.size);
370 break;
371 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
372 *params = ConvertFromGLuint<ParamType>(attrib.stride);
373 break;
374 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
375 *params = ConvertFromGLenum<ParamType>(attrib.type);
376 break;
377 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
378 *params = ConvertFromGLboolean<ParamType>(attrib.normalized);
379 break;
380 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
381 *params = ConvertFromGLuint<ParamType>(attrib.buffer.id());
382 break;
383 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
384 *params = ConvertFromGLuint<ParamType>(attrib.divisor);
385 break;
386 case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
387 *params = ConvertFromGLboolean<ParamType>(attrib.pureInteger);
388 break;
389 default:
390 UNREACHABLE();
391 break;
392 }
393}
394
Geoff Langebebe1c2016-10-14 12:01:31 -0400395template <typename ParamType>
396void QueryBufferParameterBase(const Buffer *buffer, GLenum pname, ParamType *params)
397{
398 ASSERT(buffer != nullptr);
399
400 switch (pname)
401 {
402 case GL_BUFFER_USAGE:
403 *params = ConvertFromGLenum<ParamType>(buffer->getUsage());
404 break;
405 case GL_BUFFER_SIZE:
406 *params = ConvertFromGLint64<ParamType>(buffer->getSize());
407 break;
408 case GL_BUFFER_ACCESS_FLAGS:
409 *params = ConvertFromGLuint<ParamType>(buffer->getAccessFlags());
410 break;
411 case GL_BUFFER_ACCESS_OES:
412 *params = ConvertFromGLenum<ParamType>(buffer->getAccess());
413 break;
414 case GL_BUFFER_MAPPED:
415 *params = ConvertFromGLboolean<ParamType>(buffer->isMapped());
416 break;
417 case GL_BUFFER_MAP_OFFSET:
418 *params = ConvertFromGLint64<ParamType>(buffer->getMapOffset());
419 break;
420 case GL_BUFFER_MAP_LENGTH:
421 *params = ConvertFromGLint64<ParamType>(buffer->getMapLength());
422 break;
423 default:
424 UNREACHABLE();
425 break;
426 }
427}
428
Geoff Langc1984ed2016-10-07 12:41:00 -0400429} // anonymous namespace
430
Geoff Langff5b2d52016-09-07 11:32:23 -0400431void QueryFramebufferAttachmentParameteriv(const Framebuffer *framebuffer,
432 GLenum attachment,
433 GLenum pname,
434 GLint *params)
435{
436 ASSERT(framebuffer);
437
438 const FramebufferAttachment *attachmentObject = framebuffer->getAttachment(attachment);
439 if (attachmentObject == nullptr)
440 {
441 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
442 // is NONE, then querying any other pname will generate INVALID_ENUM.
443
444 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
445 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
446 // INVALID_OPERATION for all other pnames
447
448 switch (pname)
449 {
450 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
451 *params = GL_NONE;
452 break;
453
454 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
455 *params = 0;
456 break;
457
458 default:
459 UNREACHABLE();
460 break;
461 }
462
463 return;
464 }
465
466 switch (pname)
467 {
468 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
469 *params = attachmentObject->type();
470 break;
471
472 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
473 *params = attachmentObject->id();
474 break;
475
476 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
477 *params = attachmentObject->mipLevel();
478 break;
479
480 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
481 *params = attachmentObject->cubeMapFace();
482 break;
483
484 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
485 *params = attachmentObject->getRedSize();
486 break;
487
488 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
489 *params = attachmentObject->getGreenSize();
490 break;
491
492 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
493 *params = attachmentObject->getBlueSize();
494 break;
495
496 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
497 *params = attachmentObject->getAlphaSize();
498 break;
499
500 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
501 *params = attachmentObject->getDepthSize();
502 break;
503
504 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
505 *params = attachmentObject->getStencilSize();
506 break;
507
508 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
509 *params = attachmentObject->getComponentType();
510 break;
511
512 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
513 *params = attachmentObject->getColorEncoding();
514 break;
515
516 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
517 *params = attachmentObject->layer();
518 break;
519
520 default:
521 UNREACHABLE();
522 break;
523 }
524}
525
526void QueryBufferParameteriv(const Buffer *buffer, GLenum pname, GLint *params)
527{
Geoff Langebebe1c2016-10-14 12:01:31 -0400528 QueryBufferParameterBase(buffer, pname, params);
529}
Geoff Langff5b2d52016-09-07 11:32:23 -0400530
Geoff Langebebe1c2016-10-14 12:01:31 -0400531void QueryBufferParameteri64v(const Buffer *buffer, GLenum pname, GLint64 *params)
532{
533 QueryBufferParameterBase(buffer, pname, params);
Geoff Langff5b2d52016-09-07 11:32:23 -0400534}
535
Geoff Lang496c02d2016-10-20 11:38:11 -0700536void QueryBufferPointerv(const Buffer *buffer, GLenum pname, void **params)
537{
538 switch (pname)
539 {
540 case GL_BUFFER_MAP_POINTER:
541 *params = buffer->getMapPointer();
542 break;
543
544 default:
545 UNREACHABLE();
546 break;
547 }
548}
549
Geoff Langff5b2d52016-09-07 11:32:23 -0400550void QueryProgramiv(const Program *program, GLenum pname, GLint *params)
551{
552 ASSERT(program != nullptr);
553
554 switch (pname)
555 {
556 case GL_DELETE_STATUS:
557 *params = program->isFlaggedForDeletion();
558 return;
559 case GL_LINK_STATUS:
560 *params = program->isLinked();
561 return;
562 case GL_VALIDATE_STATUS:
563 *params = program->isValidated();
564 return;
565 case GL_INFO_LOG_LENGTH:
566 *params = program->getInfoLogLength();
567 return;
568 case GL_ATTACHED_SHADERS:
569 *params = program->getAttachedShadersCount();
570 return;
571 case GL_ACTIVE_ATTRIBUTES:
572 *params = program->getActiveAttributeCount();
573 return;
574 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
575 *params = program->getActiveAttributeMaxLength();
576 return;
577 case GL_ACTIVE_UNIFORMS:
578 *params = program->getActiveUniformCount();
579 return;
580 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
581 *params = program->getActiveUniformMaxLength();
582 return;
583 case GL_PROGRAM_BINARY_LENGTH_OES:
584 *params = program->getBinaryLength();
585 return;
586 case GL_ACTIVE_UNIFORM_BLOCKS:
587 *params = program->getActiveUniformBlockCount();
588 return;
589 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
590 *params = program->getActiveUniformBlockMaxLength();
591 break;
592 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
593 *params = program->getTransformFeedbackBufferMode();
594 break;
595 case GL_TRANSFORM_FEEDBACK_VARYINGS:
596 *params = program->getTransformFeedbackVaryingCount();
597 break;
598 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
599 *params = program->getTransformFeedbackVaryingMaxLength();
600 break;
601 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
602 *params = program->getBinaryRetrievableHint();
603 break;
604 default:
605 UNREACHABLE();
606 break;
607 }
608}
Geoff Lang740d9022016-10-07 11:20:52 -0400609
610void QueryRenderbufferiv(const Renderbuffer *renderbuffer, GLenum pname, GLint *params)
611{
612 ASSERT(renderbuffer != nullptr);
613
614 switch (pname)
615 {
616 case GL_RENDERBUFFER_WIDTH:
617 *params = renderbuffer->getWidth();
618 break;
619 case GL_RENDERBUFFER_HEIGHT:
620 *params = renderbuffer->getHeight();
621 break;
622 case GL_RENDERBUFFER_INTERNAL_FORMAT:
623 *params = renderbuffer->getFormat().info->internalFormat;
624 break;
625 case GL_RENDERBUFFER_RED_SIZE:
626 *params = renderbuffer->getRedSize();
627 break;
628 case GL_RENDERBUFFER_GREEN_SIZE:
629 *params = renderbuffer->getGreenSize();
630 break;
631 case GL_RENDERBUFFER_BLUE_SIZE:
632 *params = renderbuffer->getBlueSize();
633 break;
634 case GL_RENDERBUFFER_ALPHA_SIZE:
635 *params = renderbuffer->getAlphaSize();
636 break;
637 case GL_RENDERBUFFER_DEPTH_SIZE:
638 *params = renderbuffer->getDepthSize();
639 break;
640 case GL_RENDERBUFFER_STENCIL_SIZE:
641 *params = renderbuffer->getStencilSize();
642 break;
643 case GL_RENDERBUFFER_SAMPLES_ANGLE:
644 *params = renderbuffer->getSamples();
645 break;
646 default:
647 UNREACHABLE();
648 break;
649 }
650}
Geoff Langd7d0ed32016-10-07 11:33:51 -0400651
652void QueryShaderiv(const Shader *shader, GLenum pname, GLint *params)
653{
654 ASSERT(shader != nullptr);
655
656 switch (pname)
657 {
658 case GL_SHADER_TYPE:
659 *params = shader->getType();
660 return;
661 case GL_DELETE_STATUS:
662 *params = shader->isFlaggedForDeletion();
663 return;
664 case GL_COMPILE_STATUS:
665 *params = shader->isCompiled() ? GL_TRUE : GL_FALSE;
666 return;
667 case GL_INFO_LOG_LENGTH:
668 *params = shader->getInfoLogLength();
669 return;
670 case GL_SHADER_SOURCE_LENGTH:
671 *params = shader->getSourceLength();
672 return;
673 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
674 *params = shader->getTranslatedSourceWithDebugInfoLength();
675 return;
676 default:
677 UNREACHABLE();
678 break;
679 }
680}
Geoff Langc1984ed2016-10-07 12:41:00 -0400681
He Yunchao11b038b2016-11-22 21:24:04 +0800682void QueryTexLevelParameterfv(const Texture *texture,
683 GLenum target,
684 GLint level,
685 GLenum pname,
686 GLfloat *params)
687{
688 QueryTexLevelParameterBase(texture, target, level, pname, params);
689}
690
691void QueryTexLevelParameteriv(const Texture *texture,
692 GLenum target,
693 GLint level,
694 GLenum pname,
695 GLint *params)
696{
697 QueryTexLevelParameterBase(texture, target, level, pname, params);
698}
699
Geoff Langc1984ed2016-10-07 12:41:00 -0400700void QueryTexParameterfv(const Texture *texture, GLenum pname, GLfloat *params)
701{
702 QueryTexParameterBase(texture, pname, params);
703}
704
705void QueryTexParameteriv(const Texture *texture, GLenum pname, GLint *params)
706{
707 QueryTexParameterBase(texture, pname, params);
708}
709
710void QuerySamplerParameterfv(const Sampler *sampler, GLenum pname, GLfloat *params)
711{
712 QuerySamplerParameterBase(sampler, pname, params);
713}
714
715void QuerySamplerParameteriv(const Sampler *sampler, GLenum pname, GLint *params)
716{
717 QuerySamplerParameterBase(sampler, pname, params);
718}
719
Geoff Lang0b031062016-10-13 14:30:04 -0400720void QueryVertexAttribfv(const VertexAttribute &attrib,
721 const VertexAttribCurrentValueData &currentValueData,
722 GLenum pname,
723 GLfloat *params)
724{
725 QueryVertexAttribBase(attrib, currentValueData.FloatValues, pname, params);
726}
727
728void QueryVertexAttribiv(const VertexAttribute &attrib,
729 const VertexAttribCurrentValueData &currentValueData,
730 GLenum pname,
731 GLint *params)
732{
733 QueryVertexAttribBase(attrib, currentValueData.FloatValues, pname, params);
734}
735
736void QueryVertexAttribPointerv(const VertexAttribute &attrib, GLenum pname, GLvoid **pointer)
737{
738 switch (pname)
739 {
740 case GL_VERTEX_ATTRIB_ARRAY_POINTER:
741 *pointer = const_cast<GLvoid *>(attrib.pointer);
742 break;
743
744 default:
745 UNREACHABLE();
746 break;
747 }
748}
749
750void QueryVertexAttribIiv(const VertexAttribute &attrib,
751 const VertexAttribCurrentValueData &currentValueData,
752 GLenum pname,
753 GLint *params)
754{
755 QueryVertexAttribBase(attrib, currentValueData.IntValues, pname, params);
756}
757
758void QueryVertexAttribIuiv(const VertexAttribute &attrib,
759 const VertexAttribCurrentValueData &currentValueData,
760 GLenum pname,
761 GLuint *params)
762{
763 QueryVertexAttribBase(attrib, currentValueData.UnsignedIntValues, pname, params);
764}
765
Geoff Lang6899b872016-10-14 11:30:13 -0400766void QueryActiveUniformBlockiv(const Program *program,
767 GLuint uniformBlockIndex,
768 GLenum pname,
769 GLint *params)
770{
771 const UniformBlock &uniformBlock = program->getUniformBlockByIndex(uniformBlockIndex);
772 switch (pname)
773 {
774 case GL_UNIFORM_BLOCK_BINDING:
775 *params = ConvertToGLint(program->getUniformBlockBinding(uniformBlockIndex));
776 break;
777 case GL_UNIFORM_BLOCK_DATA_SIZE:
778 *params = ConvertToGLint(uniformBlock.dataSize);
779 break;
780 case GL_UNIFORM_BLOCK_NAME_LENGTH:
781 *params = ConvertToGLint(uniformBlock.nameWithArrayIndex().size() + 1);
782 break;
783 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
784 *params = ConvertToGLint(uniformBlock.memberUniformIndexes.size());
785 break;
786 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
787 for (size_t blockMemberIndex = 0;
788 blockMemberIndex < uniformBlock.memberUniformIndexes.size(); blockMemberIndex++)
789 {
790 params[blockMemberIndex] =
791 ConvertToGLint(uniformBlock.memberUniformIndexes[blockMemberIndex]);
792 }
793 break;
794 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
795 *params = ConvertToGLint(uniformBlock.vertexStaticUse);
796 break;
797 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
798 *params = ConvertToGLint(uniformBlock.fragmentStaticUse);
799 break;
800 default:
801 UNREACHABLE();
802 break;
803 }
804}
805
Geoff Lang0a9661f2016-10-20 10:59:20 -0700806void QueryInternalFormativ(const TextureCaps &format, GLenum pname, GLsizei bufSize, GLint *params)
807{
808 switch (pname)
809 {
810 case GL_NUM_SAMPLE_COUNTS:
811 if (bufSize != 0)
812 {
813 *params = static_cast<GLint>(format.sampleCounts.size());
814 }
815 break;
816
817 case GL_SAMPLES:
818 {
819 size_t returnCount = std::min<size_t>(bufSize, format.sampleCounts.size());
820 auto sampleReverseIt = format.sampleCounts.rbegin();
821 for (size_t sampleIndex = 0; sampleIndex < returnCount; ++sampleIndex)
822 {
823 params[sampleIndex] = *sampleReverseIt++;
824 }
825 }
826 break;
827
828 default:
829 UNREACHABLE();
830 break;
831 }
832}
833
Geoff Langc1984ed2016-10-07 12:41:00 -0400834void SetTexParameterf(Texture *texture, GLenum pname, GLfloat param)
835{
836 SetTexParameterBase(texture, pname, &param);
837}
838
839void SetTexParameterfv(Texture *texture, GLenum pname, const GLfloat *params)
840{
841 SetTexParameterBase(texture, pname, params);
842}
843
844void SetTexParameteri(Texture *texture, GLenum pname, GLint param)
845{
846 SetTexParameterBase(texture, pname, &param);
847}
848
849void SetTexParameteriv(Texture *texture, GLenum pname, const GLint *params)
850{
851 SetTexParameterBase(texture, pname, params);
852}
853
854void SetSamplerParameterf(Sampler *sampler, GLenum pname, GLfloat param)
855{
856 SetSamplerParameterBase(sampler, pname, &param);
857}
858
859void SetSamplerParameterfv(Sampler *sampler, GLenum pname, const GLfloat *params)
860{
861 SetSamplerParameterBase(sampler, pname, params);
862}
863
864void SetSamplerParameteri(Sampler *sampler, GLenum pname, GLint param)
865{
866 SetSamplerParameterBase(sampler, pname, &param);
867}
868
869void SetSamplerParameteriv(Sampler *sampler, GLenum pname, const GLint *params)
870{
871 SetSamplerParameterBase(sampler, pname, params);
872}
Geoff Langff5b2d52016-09-07 11:32:23 -0400873}