blob: ca0534858d06633ae390b5cbbc0e06115aaf647c [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
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800352// Warning: you should ensure binding really matches attrib.bindingIndex before using this function.
Geoff Lang0b031062016-10-13 14:30:04 -0400353template <typename ParamType, typename CurrentDataType, size_t CurrentValueCount>
354void QueryVertexAttribBase(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800355 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -0400356 const CurrentDataType (&currentValueData)[CurrentValueCount],
357 GLenum pname,
358 ParamType *params)
359{
360 switch (pname)
361 {
362 case GL_CURRENT_VERTEX_ATTRIB:
363 for (size_t i = 0; i < CurrentValueCount; ++i)
364 {
365 params[i] = ConvertCurrentValue<ParamType>(currentValueData[i]);
366 }
367 break;
368 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
369 *params = ConvertFromGLboolean<ParamType>(attrib.enabled);
370 break;
371 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
372 *params = ConvertFromGLuint<ParamType>(attrib.size);
373 break;
374 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800375 *params = ConvertFromGLuint<ParamType>(attrib.vertexAttribArrayStride);
Geoff Lang0b031062016-10-13 14:30:04 -0400376 break;
377 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
378 *params = ConvertFromGLenum<ParamType>(attrib.type);
379 break;
380 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
381 *params = ConvertFromGLboolean<ParamType>(attrib.normalized);
382 break;
383 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800384 *params = ConvertFromGLuint<ParamType>(binding.buffer.id());
Geoff Lang0b031062016-10-13 14:30:04 -0400385 break;
386 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800387 *params = ConvertFromGLuint<ParamType>(binding.divisor);
Geoff Lang0b031062016-10-13 14:30:04 -0400388 break;
389 case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
390 *params = ConvertFromGLboolean<ParamType>(attrib.pureInteger);
391 break;
392 default:
393 UNREACHABLE();
394 break;
395 }
396}
397
Geoff Langebebe1c2016-10-14 12:01:31 -0400398template <typename ParamType>
399void QueryBufferParameterBase(const Buffer *buffer, GLenum pname, ParamType *params)
400{
401 ASSERT(buffer != nullptr);
402
403 switch (pname)
404 {
405 case GL_BUFFER_USAGE:
406 *params = ConvertFromGLenum<ParamType>(buffer->getUsage());
407 break;
408 case GL_BUFFER_SIZE:
409 *params = ConvertFromGLint64<ParamType>(buffer->getSize());
410 break;
411 case GL_BUFFER_ACCESS_FLAGS:
412 *params = ConvertFromGLuint<ParamType>(buffer->getAccessFlags());
413 break;
414 case GL_BUFFER_ACCESS_OES:
415 *params = ConvertFromGLenum<ParamType>(buffer->getAccess());
416 break;
417 case GL_BUFFER_MAPPED:
418 *params = ConvertFromGLboolean<ParamType>(buffer->isMapped());
419 break;
420 case GL_BUFFER_MAP_OFFSET:
421 *params = ConvertFromGLint64<ParamType>(buffer->getMapOffset());
422 break;
423 case GL_BUFFER_MAP_LENGTH:
424 *params = ConvertFromGLint64<ParamType>(buffer->getMapLength());
425 break;
426 default:
427 UNREACHABLE();
428 break;
429 }
430}
431
Geoff Langc1984ed2016-10-07 12:41:00 -0400432} // anonymous namespace
433
Geoff Langff5b2d52016-09-07 11:32:23 -0400434void QueryFramebufferAttachmentParameteriv(const Framebuffer *framebuffer,
435 GLenum attachment,
436 GLenum pname,
437 GLint *params)
438{
439 ASSERT(framebuffer);
440
441 const FramebufferAttachment *attachmentObject = framebuffer->getAttachment(attachment);
442 if (attachmentObject == nullptr)
443 {
444 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
445 // is NONE, then querying any other pname will generate INVALID_ENUM.
446
447 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
448 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
449 // INVALID_OPERATION for all other pnames
450
451 switch (pname)
452 {
453 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
454 *params = GL_NONE;
455 break;
456
457 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
458 *params = 0;
459 break;
460
461 default:
462 UNREACHABLE();
463 break;
464 }
465
466 return;
467 }
468
469 switch (pname)
470 {
471 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
472 *params = attachmentObject->type();
473 break;
474
475 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
476 *params = attachmentObject->id();
477 break;
478
479 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
480 *params = attachmentObject->mipLevel();
481 break;
482
483 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
484 *params = attachmentObject->cubeMapFace();
485 break;
486
487 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
488 *params = attachmentObject->getRedSize();
489 break;
490
491 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
492 *params = attachmentObject->getGreenSize();
493 break;
494
495 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
496 *params = attachmentObject->getBlueSize();
497 break;
498
499 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
500 *params = attachmentObject->getAlphaSize();
501 break;
502
503 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
504 *params = attachmentObject->getDepthSize();
505 break;
506
507 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
508 *params = attachmentObject->getStencilSize();
509 break;
510
511 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
512 *params = attachmentObject->getComponentType();
513 break;
514
515 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
516 *params = attachmentObject->getColorEncoding();
517 break;
518
519 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
520 *params = attachmentObject->layer();
521 break;
522
523 default:
524 UNREACHABLE();
525 break;
526 }
527}
528
529void QueryBufferParameteriv(const Buffer *buffer, GLenum pname, GLint *params)
530{
Geoff Langebebe1c2016-10-14 12:01:31 -0400531 QueryBufferParameterBase(buffer, pname, params);
532}
Geoff Langff5b2d52016-09-07 11:32:23 -0400533
Geoff Langebebe1c2016-10-14 12:01:31 -0400534void QueryBufferParameteri64v(const Buffer *buffer, GLenum pname, GLint64 *params)
535{
536 QueryBufferParameterBase(buffer, pname, params);
Geoff Langff5b2d52016-09-07 11:32:23 -0400537}
538
Geoff Lang496c02d2016-10-20 11:38:11 -0700539void QueryBufferPointerv(const Buffer *buffer, GLenum pname, void **params)
540{
541 switch (pname)
542 {
543 case GL_BUFFER_MAP_POINTER:
544 *params = buffer->getMapPointer();
545 break;
546
547 default:
548 UNREACHABLE();
549 break;
550 }
551}
552
Geoff Langff5b2d52016-09-07 11:32:23 -0400553void QueryProgramiv(const Program *program, GLenum pname, GLint *params)
554{
555 ASSERT(program != nullptr);
556
557 switch (pname)
558 {
559 case GL_DELETE_STATUS:
560 *params = program->isFlaggedForDeletion();
561 return;
562 case GL_LINK_STATUS:
563 *params = program->isLinked();
564 return;
565 case GL_VALIDATE_STATUS:
566 *params = program->isValidated();
567 return;
568 case GL_INFO_LOG_LENGTH:
569 *params = program->getInfoLogLength();
570 return;
571 case GL_ATTACHED_SHADERS:
572 *params = program->getAttachedShadersCount();
573 return;
574 case GL_ACTIVE_ATTRIBUTES:
575 *params = program->getActiveAttributeCount();
576 return;
577 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
578 *params = program->getActiveAttributeMaxLength();
579 return;
580 case GL_ACTIVE_UNIFORMS:
581 *params = program->getActiveUniformCount();
582 return;
583 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
584 *params = program->getActiveUniformMaxLength();
585 return;
586 case GL_PROGRAM_BINARY_LENGTH_OES:
587 *params = program->getBinaryLength();
588 return;
589 case GL_ACTIVE_UNIFORM_BLOCKS:
590 *params = program->getActiveUniformBlockCount();
591 return;
592 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
593 *params = program->getActiveUniformBlockMaxLength();
594 break;
595 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
596 *params = program->getTransformFeedbackBufferMode();
597 break;
598 case GL_TRANSFORM_FEEDBACK_VARYINGS:
599 *params = program->getTransformFeedbackVaryingCount();
600 break;
601 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
602 *params = program->getTransformFeedbackVaryingMaxLength();
603 break;
604 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
605 *params = program->getBinaryRetrievableHint();
606 break;
607 default:
608 UNREACHABLE();
609 break;
610 }
611}
Geoff Lang740d9022016-10-07 11:20:52 -0400612
613void QueryRenderbufferiv(const Renderbuffer *renderbuffer, GLenum pname, GLint *params)
614{
615 ASSERT(renderbuffer != nullptr);
616
617 switch (pname)
618 {
619 case GL_RENDERBUFFER_WIDTH:
620 *params = renderbuffer->getWidth();
621 break;
622 case GL_RENDERBUFFER_HEIGHT:
623 *params = renderbuffer->getHeight();
624 break;
625 case GL_RENDERBUFFER_INTERNAL_FORMAT:
626 *params = renderbuffer->getFormat().info->internalFormat;
627 break;
628 case GL_RENDERBUFFER_RED_SIZE:
629 *params = renderbuffer->getRedSize();
630 break;
631 case GL_RENDERBUFFER_GREEN_SIZE:
632 *params = renderbuffer->getGreenSize();
633 break;
634 case GL_RENDERBUFFER_BLUE_SIZE:
635 *params = renderbuffer->getBlueSize();
636 break;
637 case GL_RENDERBUFFER_ALPHA_SIZE:
638 *params = renderbuffer->getAlphaSize();
639 break;
640 case GL_RENDERBUFFER_DEPTH_SIZE:
641 *params = renderbuffer->getDepthSize();
642 break;
643 case GL_RENDERBUFFER_STENCIL_SIZE:
644 *params = renderbuffer->getStencilSize();
645 break;
646 case GL_RENDERBUFFER_SAMPLES_ANGLE:
647 *params = renderbuffer->getSamples();
648 break;
649 default:
650 UNREACHABLE();
651 break;
652 }
653}
Geoff Langd7d0ed32016-10-07 11:33:51 -0400654
655void QueryShaderiv(const Shader *shader, GLenum pname, GLint *params)
656{
657 ASSERT(shader != nullptr);
658
659 switch (pname)
660 {
661 case GL_SHADER_TYPE:
662 *params = shader->getType();
663 return;
664 case GL_DELETE_STATUS:
665 *params = shader->isFlaggedForDeletion();
666 return;
667 case GL_COMPILE_STATUS:
668 *params = shader->isCompiled() ? GL_TRUE : GL_FALSE;
669 return;
670 case GL_INFO_LOG_LENGTH:
671 *params = shader->getInfoLogLength();
672 return;
673 case GL_SHADER_SOURCE_LENGTH:
674 *params = shader->getSourceLength();
675 return;
676 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
677 *params = shader->getTranslatedSourceWithDebugInfoLength();
678 return;
679 default:
680 UNREACHABLE();
681 break;
682 }
683}
Geoff Langc1984ed2016-10-07 12:41:00 -0400684
He Yunchao11b038b2016-11-22 21:24:04 +0800685void QueryTexLevelParameterfv(const Texture *texture,
686 GLenum target,
687 GLint level,
688 GLenum pname,
689 GLfloat *params)
690{
691 QueryTexLevelParameterBase(texture, target, level, pname, params);
692}
693
694void QueryTexLevelParameteriv(const Texture *texture,
695 GLenum target,
696 GLint level,
697 GLenum pname,
698 GLint *params)
699{
700 QueryTexLevelParameterBase(texture, target, level, pname, params);
701}
702
Geoff Langc1984ed2016-10-07 12:41:00 -0400703void QueryTexParameterfv(const Texture *texture, GLenum pname, GLfloat *params)
704{
705 QueryTexParameterBase(texture, pname, params);
706}
707
708void QueryTexParameteriv(const Texture *texture, GLenum pname, GLint *params)
709{
710 QueryTexParameterBase(texture, pname, params);
711}
712
713void QuerySamplerParameterfv(const Sampler *sampler, GLenum pname, GLfloat *params)
714{
715 QuerySamplerParameterBase(sampler, pname, params);
716}
717
718void QuerySamplerParameteriv(const Sampler *sampler, GLenum pname, GLint *params)
719{
720 QuerySamplerParameterBase(sampler, pname, params);
721}
722
Geoff Lang0b031062016-10-13 14:30:04 -0400723void QueryVertexAttribfv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800724 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -0400725 const VertexAttribCurrentValueData &currentValueData,
726 GLenum pname,
727 GLfloat *params)
728{
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800729 QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -0400730}
731
732void QueryVertexAttribiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800733 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -0400734 const VertexAttribCurrentValueData &currentValueData,
735 GLenum pname,
736 GLint *params)
737{
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800738 QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -0400739}
740
741void QueryVertexAttribPointerv(const VertexAttribute &attrib, GLenum pname, GLvoid **pointer)
742{
743 switch (pname)
744 {
745 case GL_VERTEX_ATTRIB_ARRAY_POINTER:
746 *pointer = const_cast<GLvoid *>(attrib.pointer);
747 break;
748
749 default:
750 UNREACHABLE();
751 break;
752 }
753}
754
755void QueryVertexAttribIiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800756 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -0400757 const VertexAttribCurrentValueData &currentValueData,
758 GLenum pname,
759 GLint *params)
760{
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800761 QueryVertexAttribBase(attrib, binding, currentValueData.IntValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -0400762}
763
764void QueryVertexAttribIuiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800765 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -0400766 const VertexAttribCurrentValueData &currentValueData,
767 GLenum pname,
768 GLuint *params)
769{
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800770 QueryVertexAttribBase(attrib, binding, currentValueData.UnsignedIntValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -0400771}
772
Geoff Lang6899b872016-10-14 11:30:13 -0400773void QueryActiveUniformBlockiv(const Program *program,
774 GLuint uniformBlockIndex,
775 GLenum pname,
776 GLint *params)
777{
778 const UniformBlock &uniformBlock = program->getUniformBlockByIndex(uniformBlockIndex);
779 switch (pname)
780 {
781 case GL_UNIFORM_BLOCK_BINDING:
782 *params = ConvertToGLint(program->getUniformBlockBinding(uniformBlockIndex));
783 break;
784 case GL_UNIFORM_BLOCK_DATA_SIZE:
785 *params = ConvertToGLint(uniformBlock.dataSize);
786 break;
787 case GL_UNIFORM_BLOCK_NAME_LENGTH:
788 *params = ConvertToGLint(uniformBlock.nameWithArrayIndex().size() + 1);
789 break;
790 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
791 *params = ConvertToGLint(uniformBlock.memberUniformIndexes.size());
792 break;
793 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
794 for (size_t blockMemberIndex = 0;
795 blockMemberIndex < uniformBlock.memberUniformIndexes.size(); blockMemberIndex++)
796 {
797 params[blockMemberIndex] =
798 ConvertToGLint(uniformBlock.memberUniformIndexes[blockMemberIndex]);
799 }
800 break;
801 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
802 *params = ConvertToGLint(uniformBlock.vertexStaticUse);
803 break;
804 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
805 *params = ConvertToGLint(uniformBlock.fragmentStaticUse);
806 break;
807 default:
808 UNREACHABLE();
809 break;
810 }
811}
812
Geoff Lang0a9661f2016-10-20 10:59:20 -0700813void QueryInternalFormativ(const TextureCaps &format, GLenum pname, GLsizei bufSize, GLint *params)
814{
815 switch (pname)
816 {
817 case GL_NUM_SAMPLE_COUNTS:
818 if (bufSize != 0)
819 {
820 *params = static_cast<GLint>(format.sampleCounts.size());
821 }
822 break;
823
824 case GL_SAMPLES:
825 {
826 size_t returnCount = std::min<size_t>(bufSize, format.sampleCounts.size());
827 auto sampleReverseIt = format.sampleCounts.rbegin();
828 for (size_t sampleIndex = 0; sampleIndex < returnCount; ++sampleIndex)
829 {
830 params[sampleIndex] = *sampleReverseIt++;
831 }
832 }
833 break;
834
835 default:
836 UNREACHABLE();
837 break;
838 }
839}
840
JiangYizhouf7bbc8a2016-11-16 09:57:22 +0800841void QueryFramebufferParameteriv(const Framebuffer *framebuffer, GLenum pname, GLint *params)
842{
843 ASSERT(framebuffer);
844
845 switch (pname)
846 {
847 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
848 *params = framebuffer->getDefaultWidth();
849 break;
850 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
851 *params = framebuffer->getDefaultHeight();
852 break;
853 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
854 *params = framebuffer->getDefaultSamples();
855 break;
856 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
857 *params = framebuffer->getDefaultFixedSampleLocations();
858 break;
859 default:
860 UNREACHABLE();
861 break;
862 }
863}
864
Geoff Langc1984ed2016-10-07 12:41:00 -0400865void SetTexParameterf(Texture *texture, GLenum pname, GLfloat param)
866{
867 SetTexParameterBase(texture, pname, &param);
868}
869
870void SetTexParameterfv(Texture *texture, GLenum pname, const GLfloat *params)
871{
872 SetTexParameterBase(texture, pname, params);
873}
874
875void SetTexParameteri(Texture *texture, GLenum pname, GLint param)
876{
877 SetTexParameterBase(texture, pname, &param);
878}
879
880void SetTexParameteriv(Texture *texture, GLenum pname, const GLint *params)
881{
882 SetTexParameterBase(texture, pname, params);
883}
884
885void SetSamplerParameterf(Sampler *sampler, GLenum pname, GLfloat param)
886{
887 SetSamplerParameterBase(sampler, pname, &param);
888}
889
890void SetSamplerParameterfv(Sampler *sampler, GLenum pname, const GLfloat *params)
891{
892 SetSamplerParameterBase(sampler, pname, params);
893}
894
895void SetSamplerParameteri(Sampler *sampler, GLenum pname, GLint param)
896{
897 SetSamplerParameterBase(sampler, pname, &param);
898}
899
900void SetSamplerParameteriv(Sampler *sampler, GLenum pname, const GLint *params)
901{
902 SetSamplerParameterBase(sampler, pname, params);
903}
Geoff Lang65603eb2017-01-12 16:48:03 -0500904
JiangYizhouf7bbc8a2016-11-16 09:57:22 +0800905void SetFramebufferParameteri(Framebuffer *framebuffer, GLenum pname, GLint param)
906{
907 ASSERT(framebuffer);
908
909 switch (pname)
910 {
911 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
912 framebuffer->setDefaultWidth(param);
913 break;
914 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
915 framebuffer->setDefaultHeight(param);
916 break;
917 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
918 framebuffer->setDefaultSamples(param);
919 break;
920 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
921 framebuffer->setDefaultFixedSampleLocations(static_cast<GLboolean>(param));
922 break;
923 default:
924 UNREACHABLE();
925 break;
926 }
927}
928
Geoff Lang65603eb2017-01-12 16:48:03 -0500929} // namespace gl
930
931namespace egl
932{
933
934void QueryConfigAttrib(const Config *config, EGLint attribute, EGLint *value)
935{
936 ASSERT(config != nullptr);
937 switch (attribute)
938 {
939 case EGL_BUFFER_SIZE:
940 *value = config->bufferSize;
941 break;
942 case EGL_ALPHA_SIZE:
943 *value = config->alphaSize;
944 break;
945 case EGL_BLUE_SIZE:
946 *value = config->blueSize;
947 break;
948 case EGL_GREEN_SIZE:
949 *value = config->greenSize;
950 break;
951 case EGL_RED_SIZE:
952 *value = config->redSize;
953 break;
954 case EGL_DEPTH_SIZE:
955 *value = config->depthSize;
956 break;
957 case EGL_STENCIL_SIZE:
958 *value = config->stencilSize;
959 break;
960 case EGL_CONFIG_CAVEAT:
961 *value = config->configCaveat;
962 break;
963 case EGL_CONFIG_ID:
964 *value = config->configID;
965 break;
966 case EGL_LEVEL:
967 *value = config->level;
968 break;
969 case EGL_NATIVE_RENDERABLE:
970 *value = config->nativeRenderable;
971 break;
972 case EGL_NATIVE_VISUAL_ID:
973 *value = config->nativeVisualID;
974 break;
975 case EGL_NATIVE_VISUAL_TYPE:
976 *value = config->nativeVisualType;
977 break;
978 case EGL_SAMPLES:
979 *value = config->samples;
980 break;
981 case EGL_SAMPLE_BUFFERS:
982 *value = config->sampleBuffers;
983 break;
984 case EGL_SURFACE_TYPE:
985 *value = config->surfaceType;
986 break;
987 case EGL_TRANSPARENT_TYPE:
988 *value = config->transparentType;
989 break;
990 case EGL_TRANSPARENT_BLUE_VALUE:
991 *value = config->transparentBlueValue;
992 break;
993 case EGL_TRANSPARENT_GREEN_VALUE:
994 *value = config->transparentGreenValue;
995 break;
996 case EGL_TRANSPARENT_RED_VALUE:
997 *value = config->transparentRedValue;
998 break;
999 case EGL_BIND_TO_TEXTURE_RGB:
1000 *value = config->bindToTextureRGB;
1001 break;
1002 case EGL_BIND_TO_TEXTURE_RGBA:
1003 *value = config->bindToTextureRGBA;
1004 break;
1005 case EGL_MIN_SWAP_INTERVAL:
1006 *value = config->minSwapInterval;
1007 break;
1008 case EGL_MAX_SWAP_INTERVAL:
1009 *value = config->maxSwapInterval;
1010 break;
1011 case EGL_LUMINANCE_SIZE:
1012 *value = config->luminanceSize;
1013 break;
1014 case EGL_ALPHA_MASK_SIZE:
1015 *value = config->alphaMaskSize;
1016 break;
1017 case EGL_COLOR_BUFFER_TYPE:
1018 *value = config->colorBufferType;
1019 break;
1020 case EGL_RENDERABLE_TYPE:
1021 *value = config->renderableType;
1022 break;
1023 case EGL_MATCH_NATIVE_PIXMAP:
1024 *value = false;
1025 UNIMPLEMENTED();
1026 break;
1027 case EGL_CONFORMANT:
1028 *value = config->conformant;
1029 break;
1030 case EGL_MAX_PBUFFER_WIDTH:
1031 *value = config->maxPBufferWidth;
1032 break;
1033 case EGL_MAX_PBUFFER_HEIGHT:
1034 *value = config->maxPBufferHeight;
1035 break;
1036 case EGL_MAX_PBUFFER_PIXELS:
1037 *value = config->maxPBufferPixels;
1038 break;
1039 case EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE:
1040 *value = config->optimalOrientation;
1041 break;
Geoff Langc5a2a172017-01-13 15:55:07 -05001042 case EGL_COLOR_COMPONENT_TYPE_EXT:
1043 *value = config->colorComponentType;
1044 break;
Geoff Lang65603eb2017-01-12 16:48:03 -05001045 default:
1046 UNREACHABLE();
1047 break;
1048 }
Geoff Langff5b2d52016-09-07 11:32:23 -04001049}
Geoff Lang65603eb2017-01-12 16:48:03 -05001050
1051} // namespace egl