blob: 8332d1a6cac06b5d87a331a5f87aecbc69d4a8fe [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"
Jamie Madill4e0e6f82017-02-17 11:06:03 -050015#include "libANGLE/Context.h"
Geoff Langff5b2d52016-09-07 11:32:23 -040016#include "libANGLE/Framebuffer.h"
17#include "libANGLE/Program.h"
Geoff Lang740d9022016-10-07 11:20:52 -040018#include "libANGLE/Renderbuffer.h"
Geoff Langc1984ed2016-10-07 12:41:00 -040019#include "libANGLE/Sampler.h"
Geoff Langd7d0ed32016-10-07 11:33:51 -040020#include "libANGLE/Shader.h"
Geoff Langc1984ed2016-10-07 12:41:00 -040021#include "libANGLE/Texture.h"
Geoff Lang6899b872016-10-14 11:30:13 -040022#include "libANGLE/Uniform.h"
Geoff Lang0b031062016-10-13 14:30:04 -040023#include "libANGLE/VertexAttribute.h"
Geoff Langff5b2d52016-09-07 11:32:23 -040024
25namespace gl
26{
Geoff Langc1984ed2016-10-07 12:41:00 -040027
28namespace
29{
30template <typename ParamType>
He Yunchao11b038b2016-11-22 21:24:04 +080031void QueryTexLevelParameterBase(const Texture *texture,
32 GLenum target,
33 GLint level,
34 GLenum pname,
35 ParamType *params)
36{
37 ASSERT(texture != nullptr);
38 const InternalFormat *info = texture->getTextureState().getImageDesc(target, level).format.info;
39
40 switch (pname)
41 {
42 case GL_TEXTURE_RED_TYPE:
43 *params = ConvertFromGLenum<ParamType>(info->redBits ? info->componentType : GL_NONE);
44 break;
45 case GL_TEXTURE_GREEN_TYPE:
46 *params = ConvertFromGLenum<ParamType>(info->greenBits ? info->componentType : GL_NONE);
47 break;
48 case GL_TEXTURE_BLUE_TYPE:
49 *params = ConvertFromGLenum<ParamType>(info->blueBits ? info->componentType : GL_NONE);
50 break;
51 case GL_TEXTURE_ALPHA_TYPE:
52 *params = ConvertFromGLenum<ParamType>(info->alphaBits ? info->componentType : GL_NONE);
53 break;
54 case GL_TEXTURE_DEPTH_TYPE:
55 *params = ConvertFromGLenum<ParamType>(info->depthBits ? info->componentType : GL_NONE);
56 break;
57 case GL_TEXTURE_RED_SIZE:
58 *params = ConvertFromGLuint<ParamType>(info->redBits);
59 break;
60 case GL_TEXTURE_GREEN_SIZE:
61 *params = ConvertFromGLuint<ParamType>(info->greenBits);
62 break;
63 case GL_TEXTURE_BLUE_SIZE:
64 *params = ConvertFromGLuint<ParamType>(info->blueBits);
65 break;
66 case GL_TEXTURE_ALPHA_SIZE:
67 *params = ConvertFromGLuint<ParamType>(info->alphaBits);
68 break;
69 case GL_TEXTURE_DEPTH_SIZE:
70 *params = ConvertFromGLuint<ParamType>(info->depthBits);
71 break;
72 case GL_TEXTURE_STENCIL_SIZE:
73 *params = ConvertFromGLuint<ParamType>(info->stencilBits);
74 break;
75 case GL_TEXTURE_SHARED_SIZE:
76 *params = ConvertFromGLuint<ParamType>(info->sharedBits);
77 break;
78 case GL_TEXTURE_INTERNAL_FORMAT:
79 *params =
80 ConvertFromGLenum<ParamType>(info->internalFormat ? info->internalFormat : GL_RGBA);
81 break;
82 case GL_TEXTURE_WIDTH:
83 *params =
84 ConvertFromGLint<ParamType>(static_cast<GLint>(texture->getWidth(target, level)));
85 break;
86 case GL_TEXTURE_HEIGHT:
87 *params =
88 ConvertFromGLint<ParamType>(static_cast<GLint>(texture->getHeight(target, level)));
89 break;
90 case GL_TEXTURE_DEPTH:
91 *params =
92 ConvertFromGLint<ParamType>(static_cast<GLint>(texture->getDepth(target, level)));
93 break;
94 case GL_TEXTURE_SAMPLES:
95 *params = ConvertFromGLint<ParamType>(texture->getSamples(target, level));
96 break;
97 case GL_TEXTURE_FIXED_SAMPLE_LOCATIONS:
98 *params =
99 ConvertFromGLboolean<ParamType>(texture->getFixedSampleLocations(target, level));
100 break;
101 case GL_TEXTURE_COMPRESSED:
102 *params = ConvertFromGLboolean<ParamType>(info->compressed);
103 break;
104 default:
105 UNREACHABLE();
106 break;
107 }
108}
109
110template <typename ParamType>
Geoff Langc1984ed2016-10-07 12:41:00 -0400111void QueryTexParameterBase(const Texture *texture, GLenum pname, ParamType *params)
112{
113 ASSERT(texture != nullptr);
114
115 switch (pname)
116 {
117 case GL_TEXTURE_MAG_FILTER:
118 *params = ConvertFromGLenum<ParamType>(texture->getMagFilter());
119 break;
120 case GL_TEXTURE_MIN_FILTER:
121 *params = ConvertFromGLenum<ParamType>(texture->getMinFilter());
122 break;
123 case GL_TEXTURE_WRAP_S:
124 *params = ConvertFromGLenum<ParamType>(texture->getWrapS());
125 break;
126 case GL_TEXTURE_WRAP_T:
127 *params = ConvertFromGLenum<ParamType>(texture->getWrapT());
128 break;
129 case GL_TEXTURE_WRAP_R:
130 *params = ConvertFromGLenum<ParamType>(texture->getWrapR());
131 break;
132 case GL_TEXTURE_IMMUTABLE_FORMAT:
133 *params = ConvertFromGLboolean<ParamType>(texture->getImmutableFormat());
134 break;
135 case GL_TEXTURE_IMMUTABLE_LEVELS:
136 *params = ConvertFromGLuint<ParamType>(texture->getImmutableLevels());
137 break;
138 case GL_TEXTURE_USAGE_ANGLE:
139 *params = ConvertFromGLenum<ParamType>(texture->getUsage());
140 break;
141 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
142 *params = ConvertFromGLfloat<ParamType>(texture->getMaxAnisotropy());
143 break;
144 case GL_TEXTURE_SWIZZLE_R:
145 *params = ConvertFromGLenum<ParamType>(texture->getSwizzleRed());
146 break;
147 case GL_TEXTURE_SWIZZLE_G:
148 *params = ConvertFromGLenum<ParamType>(texture->getSwizzleGreen());
149 break;
150 case GL_TEXTURE_SWIZZLE_B:
151 *params = ConvertFromGLenum<ParamType>(texture->getSwizzleBlue());
152 break;
153 case GL_TEXTURE_SWIZZLE_A:
154 *params = ConvertFromGLenum<ParamType>(texture->getSwizzleAlpha());
155 break;
156 case GL_TEXTURE_BASE_LEVEL:
157 *params = ConvertFromGLuint<ParamType>(texture->getBaseLevel());
158 break;
159 case GL_TEXTURE_MAX_LEVEL:
160 *params = ConvertFromGLuint<ParamType>(texture->getMaxLevel());
161 break;
162 case GL_TEXTURE_MIN_LOD:
163 *params = ConvertFromGLfloat<ParamType>(texture->getSamplerState().minLod);
164 break;
165 case GL_TEXTURE_MAX_LOD:
166 *params = ConvertFromGLfloat<ParamType>(texture->getSamplerState().maxLod);
167 break;
168 case GL_TEXTURE_COMPARE_MODE:
169 *params = ConvertFromGLenum<ParamType>(texture->getCompareMode());
170 break;
171 case GL_TEXTURE_COMPARE_FUNC:
172 *params = ConvertFromGLenum<ParamType>(texture->getCompareFunc());
173 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700174 case GL_TEXTURE_SRGB_DECODE_EXT:
175 *params = ConvertFromGLenum<ParamType>(texture->getSRGBDecode());
176 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400177 default:
178 UNREACHABLE();
179 break;
180 }
181}
182
183template <typename ParamType>
184void SetTexParameterBase(Texture *texture, GLenum pname, const ParamType *params)
185{
186 ASSERT(texture != nullptr);
187
188 switch (pname)
189 {
190 case GL_TEXTURE_WRAP_S:
191 texture->setWrapS(ConvertToGLenum(params[0]));
192 break;
193 case GL_TEXTURE_WRAP_T:
194 texture->setWrapT(ConvertToGLenum(params[0]));
195 break;
196 case GL_TEXTURE_WRAP_R:
197 texture->setWrapR(ConvertToGLenum(params[0]));
198 break;
199 case GL_TEXTURE_MIN_FILTER:
200 texture->setMinFilter(ConvertToGLenum(params[0]));
201 break;
202 case GL_TEXTURE_MAG_FILTER:
203 texture->setMagFilter(ConvertToGLenum(params[0]));
204 break;
205 case GL_TEXTURE_USAGE_ANGLE:
206 texture->setUsage(ConvertToGLenum(params[0]));
207 break;
208 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
209 texture->setMaxAnisotropy(ConvertToGLfloat(params[0]));
210 break;
211 case GL_TEXTURE_COMPARE_MODE:
212 texture->setCompareMode(ConvertToGLenum(params[0]));
213 break;
214 case GL_TEXTURE_COMPARE_FUNC:
215 texture->setCompareFunc(ConvertToGLenum(params[0]));
216 break;
217 case GL_TEXTURE_SWIZZLE_R:
218 texture->setSwizzleRed(ConvertToGLenum(params[0]));
219 break;
220 case GL_TEXTURE_SWIZZLE_G:
221 texture->setSwizzleGreen(ConvertToGLenum(params[0]));
222 break;
223 case GL_TEXTURE_SWIZZLE_B:
224 texture->setSwizzleBlue(ConvertToGLenum(params[0]));
225 break;
226 case GL_TEXTURE_SWIZZLE_A:
227 texture->setSwizzleAlpha(ConvertToGLenum(params[0]));
228 break;
229 case GL_TEXTURE_BASE_LEVEL:
230 texture->setBaseLevel(ConvertToGLuint(params[0]));
231 break;
232 case GL_TEXTURE_MAX_LEVEL:
233 texture->setMaxLevel(ConvertToGLuint(params[0]));
234 break;
235 case GL_TEXTURE_MIN_LOD:
236 texture->setMinLod(ConvertToGLfloat(params[0]));
237 break;
238 case GL_TEXTURE_MAX_LOD:
239 texture->setMaxLod(ConvertToGLfloat(params[0]));
240 break;
Geoff Lang3b573612016-10-31 14:08:10 -0400241 case GL_DEPTH_STENCIL_TEXTURE_MODE:
Geoff Lang9f090372016-12-02 10:20:43 -0500242 texture->setDepthStencilTextureMode(ConvertToGLenum(params[0]));
Geoff Lang3b573612016-10-31 14:08:10 -0400243 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700244 case GL_TEXTURE_SRGB_DECODE_EXT:
245 texture->setSRGBDecode(ConvertToGLenum(params[0]));
246 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400247 default:
248 UNREACHABLE();
249 break;
250 }
251}
252
253template <typename ParamType>
254void QuerySamplerParameterBase(const Sampler *sampler, GLenum pname, ParamType *params)
255{
256 switch (pname)
257 {
258 case GL_TEXTURE_MIN_FILTER:
259 *params = ConvertFromGLenum<ParamType>(sampler->getMinFilter());
260 break;
261 case GL_TEXTURE_MAG_FILTER:
262 *params = ConvertFromGLenum<ParamType>(sampler->getMagFilter());
263 break;
264 case GL_TEXTURE_WRAP_S:
265 *params = ConvertFromGLenum<ParamType>(sampler->getWrapS());
266 break;
267 case GL_TEXTURE_WRAP_T:
268 *params = ConvertFromGLenum<ParamType>(sampler->getWrapT());
269 break;
270 case GL_TEXTURE_WRAP_R:
271 *params = ConvertFromGLenum<ParamType>(sampler->getWrapR());
272 break;
273 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
274 *params = ConvertFromGLfloat<ParamType>(sampler->getMaxAnisotropy());
275 break;
276 case GL_TEXTURE_MIN_LOD:
277 *params = ConvertFromGLfloat<ParamType>(sampler->getMinLod());
278 break;
279 case GL_TEXTURE_MAX_LOD:
280 *params = ConvertFromGLfloat<ParamType>(sampler->getMaxLod());
281 break;
282 case GL_TEXTURE_COMPARE_MODE:
283 *params = ConvertFromGLenum<ParamType>(sampler->getCompareMode());
284 break;
285 case GL_TEXTURE_COMPARE_FUNC:
286 *params = ConvertFromGLenum<ParamType>(sampler->getCompareFunc());
287 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700288 case GL_TEXTURE_SRGB_DECODE_EXT:
289 *params = ConvertFromGLenum<ParamType>(sampler->getSRGBDecode());
290 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400291 default:
292 UNREACHABLE();
293 break;
294 }
295}
296
297template <typename ParamType>
298void SetSamplerParameterBase(Sampler *sampler, GLenum pname, const ParamType *params)
299{
300 switch (pname)
301 {
302 case GL_TEXTURE_WRAP_S:
303 sampler->setWrapS(ConvertToGLenum(params[0]));
304 break;
305 case GL_TEXTURE_WRAP_T:
306 sampler->setWrapT(ConvertToGLenum(params[0]));
307 break;
308 case GL_TEXTURE_WRAP_R:
309 sampler->setWrapR(ConvertToGLenum(params[0]));
310 break;
311 case GL_TEXTURE_MIN_FILTER:
312 sampler->setMinFilter(ConvertToGLenum(params[0]));
313 break;
314 case GL_TEXTURE_MAG_FILTER:
315 sampler->setMagFilter(ConvertToGLenum(params[0]));
316 break;
317 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
318 sampler->setMaxAnisotropy(ConvertToGLfloat(params[0]));
319 break;
320 case GL_TEXTURE_COMPARE_MODE:
321 sampler->setCompareMode(ConvertToGLenum(params[0]));
322 break;
323 case GL_TEXTURE_COMPARE_FUNC:
324 sampler->setCompareFunc(ConvertToGLenum(params[0]));
325 break;
326 case GL_TEXTURE_MIN_LOD:
327 sampler->setMinLod(ConvertToGLfloat(params[0]));
328 break;
329 case GL_TEXTURE_MAX_LOD:
330 sampler->setMaxLod(ConvertToGLfloat(params[0]));
331 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700332 case GL_TEXTURE_SRGB_DECODE_EXT:
333 sampler->setSRGBDecode(ConvertToGLenum(params[0]));
334 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400335 default:
336 UNREACHABLE();
337 break;
338 }
339}
340
Geoff Lang0b031062016-10-13 14:30:04 -0400341template <typename ParamType, typename CurrentDataType>
342ParamType ConvertCurrentValue(CurrentDataType currentValue)
343{
344 return static_cast<ParamType>(currentValue);
345}
346
347template <>
348GLint ConvertCurrentValue(GLfloat currentValue)
349{
350 return iround<GLint>(currentValue);
351}
352
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800353// Warning: you should ensure binding really matches attrib.bindingIndex before using this function.
Geoff Lang0b031062016-10-13 14:30:04 -0400354template <typename ParamType, typename CurrentDataType, size_t CurrentValueCount>
355void QueryVertexAttribBase(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800356 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -0400357 const CurrentDataType (&currentValueData)[CurrentValueCount],
358 GLenum pname,
359 ParamType *params)
360{
361 switch (pname)
362 {
363 case GL_CURRENT_VERTEX_ATTRIB:
364 for (size_t i = 0; i < CurrentValueCount; ++i)
365 {
366 params[i] = ConvertCurrentValue<ParamType>(currentValueData[i]);
367 }
368 break;
369 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
370 *params = ConvertFromGLboolean<ParamType>(attrib.enabled);
371 break;
372 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
373 *params = ConvertFromGLuint<ParamType>(attrib.size);
374 break;
375 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800376 *params = ConvertFromGLuint<ParamType>(attrib.vertexAttribArrayStride);
Geoff Lang0b031062016-10-13 14:30:04 -0400377 break;
378 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
379 *params = ConvertFromGLenum<ParamType>(attrib.type);
380 break;
381 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
382 *params = ConvertFromGLboolean<ParamType>(attrib.normalized);
383 break;
384 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800385 *params = ConvertFromGLuint<ParamType>(binding.buffer.id());
Geoff Lang0b031062016-10-13 14:30:04 -0400386 break;
387 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800388 *params = ConvertFromGLuint<ParamType>(binding.divisor);
Geoff Lang0b031062016-10-13 14:30:04 -0400389 break;
390 case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
391 *params = ConvertFromGLboolean<ParamType>(attrib.pureInteger);
392 break;
393 default:
394 UNREACHABLE();
395 break;
396 }
397}
398
Geoff Langebebe1c2016-10-14 12:01:31 -0400399template <typename ParamType>
400void QueryBufferParameterBase(const Buffer *buffer, GLenum pname, ParamType *params)
401{
402 ASSERT(buffer != nullptr);
403
404 switch (pname)
405 {
406 case GL_BUFFER_USAGE:
407 *params = ConvertFromGLenum<ParamType>(buffer->getUsage());
408 break;
409 case GL_BUFFER_SIZE:
410 *params = ConvertFromGLint64<ParamType>(buffer->getSize());
411 break;
412 case GL_BUFFER_ACCESS_FLAGS:
413 *params = ConvertFromGLuint<ParamType>(buffer->getAccessFlags());
414 break;
415 case GL_BUFFER_ACCESS_OES:
416 *params = ConvertFromGLenum<ParamType>(buffer->getAccess());
417 break;
418 case GL_BUFFER_MAPPED:
419 *params = ConvertFromGLboolean<ParamType>(buffer->isMapped());
420 break;
421 case GL_BUFFER_MAP_OFFSET:
422 *params = ConvertFromGLint64<ParamType>(buffer->getMapOffset());
423 break;
424 case GL_BUFFER_MAP_LENGTH:
425 *params = ConvertFromGLint64<ParamType>(buffer->getMapLength());
426 break;
427 default:
428 UNREACHABLE();
429 break;
430 }
431}
432
Geoff Langc1984ed2016-10-07 12:41:00 -0400433} // anonymous namespace
434
Geoff Langff5b2d52016-09-07 11:32:23 -0400435void QueryFramebufferAttachmentParameteriv(const Framebuffer *framebuffer,
436 GLenum attachment,
437 GLenum pname,
438 GLint *params)
439{
440 ASSERT(framebuffer);
441
442 const FramebufferAttachment *attachmentObject = framebuffer->getAttachment(attachment);
443 if (attachmentObject == nullptr)
444 {
445 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
446 // is NONE, then querying any other pname will generate INVALID_ENUM.
447
448 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
449 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
450 // INVALID_OPERATION for all other pnames
451
452 switch (pname)
453 {
454 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
455 *params = GL_NONE;
456 break;
457
458 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
459 *params = 0;
460 break;
461
462 default:
463 UNREACHABLE();
464 break;
465 }
466
467 return;
468 }
469
470 switch (pname)
471 {
472 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
473 *params = attachmentObject->type();
474 break;
475
476 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
477 *params = attachmentObject->id();
478 break;
479
480 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
481 *params = attachmentObject->mipLevel();
482 break;
483
484 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
485 *params = attachmentObject->cubeMapFace();
486 break;
487
488 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
489 *params = attachmentObject->getRedSize();
490 break;
491
492 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
493 *params = attachmentObject->getGreenSize();
494 break;
495
496 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
497 *params = attachmentObject->getBlueSize();
498 break;
499
500 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
501 *params = attachmentObject->getAlphaSize();
502 break;
503
504 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
505 *params = attachmentObject->getDepthSize();
506 break;
507
508 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
509 *params = attachmentObject->getStencilSize();
510 break;
511
512 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
513 *params = attachmentObject->getComponentType();
514 break;
515
516 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
517 *params = attachmentObject->getColorEncoding();
518 break;
519
520 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
521 *params = attachmentObject->layer();
522 break;
523
524 default:
525 UNREACHABLE();
526 break;
527 }
528}
529
530void QueryBufferParameteriv(const Buffer *buffer, GLenum pname, GLint *params)
531{
Geoff Langebebe1c2016-10-14 12:01:31 -0400532 QueryBufferParameterBase(buffer, pname, params);
533}
Geoff Langff5b2d52016-09-07 11:32:23 -0400534
Geoff Langebebe1c2016-10-14 12:01:31 -0400535void QueryBufferParameteri64v(const Buffer *buffer, GLenum pname, GLint64 *params)
536{
537 QueryBufferParameterBase(buffer, pname, params);
Geoff Langff5b2d52016-09-07 11:32:23 -0400538}
539
Geoff Lang496c02d2016-10-20 11:38:11 -0700540void QueryBufferPointerv(const Buffer *buffer, GLenum pname, void **params)
541{
542 switch (pname)
543 {
544 case GL_BUFFER_MAP_POINTER:
545 *params = buffer->getMapPointer();
546 break;
547
548 default:
549 UNREACHABLE();
550 break;
551 }
552}
553
Geoff Langff5b2d52016-09-07 11:32:23 -0400554void QueryProgramiv(const Program *program, GLenum pname, GLint *params)
555{
556 ASSERT(program != nullptr);
557
558 switch (pname)
559 {
560 case GL_DELETE_STATUS:
561 *params = program->isFlaggedForDeletion();
562 return;
563 case GL_LINK_STATUS:
564 *params = program->isLinked();
565 return;
566 case GL_VALIDATE_STATUS:
567 *params = program->isValidated();
568 return;
569 case GL_INFO_LOG_LENGTH:
570 *params = program->getInfoLogLength();
571 return;
572 case GL_ATTACHED_SHADERS:
573 *params = program->getAttachedShadersCount();
574 return;
575 case GL_ACTIVE_ATTRIBUTES:
576 *params = program->getActiveAttributeCount();
577 return;
578 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
579 *params = program->getActiveAttributeMaxLength();
580 return;
581 case GL_ACTIVE_UNIFORMS:
582 *params = program->getActiveUniformCount();
583 return;
584 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
585 *params = program->getActiveUniformMaxLength();
586 return;
587 case GL_PROGRAM_BINARY_LENGTH_OES:
588 *params = program->getBinaryLength();
589 return;
590 case GL_ACTIVE_UNIFORM_BLOCKS:
591 *params = program->getActiveUniformBlockCount();
592 return;
593 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
594 *params = program->getActiveUniformBlockMaxLength();
595 break;
596 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
597 *params = program->getTransformFeedbackBufferMode();
598 break;
599 case GL_TRANSFORM_FEEDBACK_VARYINGS:
600 *params = program->getTransformFeedbackVaryingCount();
601 break;
602 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
603 *params = program->getTransformFeedbackVaryingMaxLength();
604 break;
605 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
606 *params = program->getBinaryRetrievableHint();
607 break;
Yunchao He61afff12017-03-14 15:34:03 +0800608 case GL_PROGRAM_SEPARABLE:
609 *params = program->isSeparable();
610 break;
Geoff Langff5b2d52016-09-07 11:32:23 -0400611 default:
612 UNREACHABLE();
613 break;
614 }
615}
Geoff Lang740d9022016-10-07 11:20:52 -0400616
Jamie Madill4e0e6f82017-02-17 11:06:03 -0500617void QueryRenderbufferiv(const Context *context,
618 const Renderbuffer *renderbuffer,
619 GLenum pname,
620 GLint *params)
Geoff Lang740d9022016-10-07 11:20:52 -0400621{
622 ASSERT(renderbuffer != nullptr);
623
624 switch (pname)
625 {
626 case GL_RENDERBUFFER_WIDTH:
627 *params = renderbuffer->getWidth();
628 break;
629 case GL_RENDERBUFFER_HEIGHT:
630 *params = renderbuffer->getHeight();
631 break;
632 case GL_RENDERBUFFER_INTERNAL_FORMAT:
Jamie Madill4e0e6f82017-02-17 11:06:03 -0500633 // Special case the WebGL 1 DEPTH_STENCIL format.
Jamie Madilla02315b2017-02-23 14:14:47 -0500634 if (context->isWebGL1() &&
Jamie Madill4e0e6f82017-02-17 11:06:03 -0500635 renderbuffer->getFormat().info->internalFormat == GL_DEPTH24_STENCIL8)
636 {
637 *params = GL_DEPTH_STENCIL;
638 }
639 else
640 {
641 *params = renderbuffer->getFormat().info->internalFormat;
642 }
Geoff Lang740d9022016-10-07 11:20:52 -0400643 break;
644 case GL_RENDERBUFFER_RED_SIZE:
645 *params = renderbuffer->getRedSize();
646 break;
647 case GL_RENDERBUFFER_GREEN_SIZE:
648 *params = renderbuffer->getGreenSize();
649 break;
650 case GL_RENDERBUFFER_BLUE_SIZE:
651 *params = renderbuffer->getBlueSize();
652 break;
653 case GL_RENDERBUFFER_ALPHA_SIZE:
654 *params = renderbuffer->getAlphaSize();
655 break;
656 case GL_RENDERBUFFER_DEPTH_SIZE:
657 *params = renderbuffer->getDepthSize();
658 break;
659 case GL_RENDERBUFFER_STENCIL_SIZE:
660 *params = renderbuffer->getStencilSize();
661 break;
662 case GL_RENDERBUFFER_SAMPLES_ANGLE:
663 *params = renderbuffer->getSamples();
664 break;
665 default:
666 UNREACHABLE();
667 break;
668 }
669}
Geoff Langd7d0ed32016-10-07 11:33:51 -0400670
671void QueryShaderiv(const Shader *shader, GLenum pname, GLint *params)
672{
673 ASSERT(shader != nullptr);
674
675 switch (pname)
676 {
677 case GL_SHADER_TYPE:
678 *params = shader->getType();
679 return;
680 case GL_DELETE_STATUS:
681 *params = shader->isFlaggedForDeletion();
682 return;
683 case GL_COMPILE_STATUS:
684 *params = shader->isCompiled() ? GL_TRUE : GL_FALSE;
685 return;
686 case GL_INFO_LOG_LENGTH:
687 *params = shader->getInfoLogLength();
688 return;
689 case GL_SHADER_SOURCE_LENGTH:
690 *params = shader->getSourceLength();
691 return;
692 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
693 *params = shader->getTranslatedSourceWithDebugInfoLength();
694 return;
695 default:
696 UNREACHABLE();
697 break;
698 }
699}
Geoff Langc1984ed2016-10-07 12:41:00 -0400700
He Yunchao11b038b2016-11-22 21:24:04 +0800701void QueryTexLevelParameterfv(const Texture *texture,
702 GLenum target,
703 GLint level,
704 GLenum pname,
705 GLfloat *params)
706{
707 QueryTexLevelParameterBase(texture, target, level, pname, params);
708}
709
710void QueryTexLevelParameteriv(const Texture *texture,
711 GLenum target,
712 GLint level,
713 GLenum pname,
714 GLint *params)
715{
716 QueryTexLevelParameterBase(texture, target, level, pname, params);
717}
718
Geoff Langc1984ed2016-10-07 12:41:00 -0400719void QueryTexParameterfv(const Texture *texture, GLenum pname, GLfloat *params)
720{
721 QueryTexParameterBase(texture, pname, params);
722}
723
724void QueryTexParameteriv(const Texture *texture, GLenum pname, GLint *params)
725{
726 QueryTexParameterBase(texture, pname, params);
727}
728
729void QuerySamplerParameterfv(const Sampler *sampler, GLenum pname, GLfloat *params)
730{
731 QuerySamplerParameterBase(sampler, pname, params);
732}
733
734void QuerySamplerParameteriv(const Sampler *sampler, GLenum pname, GLint *params)
735{
736 QuerySamplerParameterBase(sampler, pname, params);
737}
738
Geoff Lang0b031062016-10-13 14:30:04 -0400739void QueryVertexAttribfv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800740 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -0400741 const VertexAttribCurrentValueData &currentValueData,
742 GLenum pname,
743 GLfloat *params)
744{
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800745 QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -0400746}
747
748void QueryVertexAttribiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800749 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -0400750 const VertexAttribCurrentValueData &currentValueData,
751 GLenum pname,
752 GLint *params)
753{
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800754 QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -0400755}
756
757void QueryVertexAttribPointerv(const VertexAttribute &attrib, GLenum pname, GLvoid **pointer)
758{
759 switch (pname)
760 {
761 case GL_VERTEX_ATTRIB_ARRAY_POINTER:
762 *pointer = const_cast<GLvoid *>(attrib.pointer);
763 break;
764
765 default:
766 UNREACHABLE();
767 break;
768 }
769}
770
771void QueryVertexAttribIiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800772 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -0400773 const VertexAttribCurrentValueData &currentValueData,
774 GLenum pname,
775 GLint *params)
776{
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800777 QueryVertexAttribBase(attrib, binding, currentValueData.IntValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -0400778}
779
780void QueryVertexAttribIuiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800781 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -0400782 const VertexAttribCurrentValueData &currentValueData,
783 GLenum pname,
784 GLuint *params)
785{
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800786 QueryVertexAttribBase(attrib, binding, currentValueData.UnsignedIntValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -0400787}
788
Geoff Lang6899b872016-10-14 11:30:13 -0400789void QueryActiveUniformBlockiv(const Program *program,
790 GLuint uniformBlockIndex,
791 GLenum pname,
792 GLint *params)
793{
794 const UniformBlock &uniformBlock = program->getUniformBlockByIndex(uniformBlockIndex);
795 switch (pname)
796 {
797 case GL_UNIFORM_BLOCK_BINDING:
798 *params = ConvertToGLint(program->getUniformBlockBinding(uniformBlockIndex));
799 break;
800 case GL_UNIFORM_BLOCK_DATA_SIZE:
801 *params = ConvertToGLint(uniformBlock.dataSize);
802 break;
803 case GL_UNIFORM_BLOCK_NAME_LENGTH:
804 *params = ConvertToGLint(uniformBlock.nameWithArrayIndex().size() + 1);
805 break;
806 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
807 *params = ConvertToGLint(uniformBlock.memberUniformIndexes.size());
808 break;
809 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
810 for (size_t blockMemberIndex = 0;
811 blockMemberIndex < uniformBlock.memberUniformIndexes.size(); blockMemberIndex++)
812 {
813 params[blockMemberIndex] =
814 ConvertToGLint(uniformBlock.memberUniformIndexes[blockMemberIndex]);
815 }
816 break;
817 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
818 *params = ConvertToGLint(uniformBlock.vertexStaticUse);
819 break;
820 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
821 *params = ConvertToGLint(uniformBlock.fragmentStaticUse);
822 break;
823 default:
824 UNREACHABLE();
825 break;
826 }
827}
828
Geoff Lang0a9661f2016-10-20 10:59:20 -0700829void QueryInternalFormativ(const TextureCaps &format, GLenum pname, GLsizei bufSize, GLint *params)
830{
831 switch (pname)
832 {
833 case GL_NUM_SAMPLE_COUNTS:
834 if (bufSize != 0)
835 {
836 *params = static_cast<GLint>(format.sampleCounts.size());
837 }
838 break;
839
840 case GL_SAMPLES:
841 {
842 size_t returnCount = std::min<size_t>(bufSize, format.sampleCounts.size());
843 auto sampleReverseIt = format.sampleCounts.rbegin();
844 for (size_t sampleIndex = 0; sampleIndex < returnCount; ++sampleIndex)
845 {
846 params[sampleIndex] = *sampleReverseIt++;
847 }
848 }
849 break;
850
851 default:
852 UNREACHABLE();
853 break;
854 }
855}
856
JiangYizhouf7bbc8a2016-11-16 09:57:22 +0800857void QueryFramebufferParameteriv(const Framebuffer *framebuffer, GLenum pname, GLint *params)
858{
859 ASSERT(framebuffer);
860
861 switch (pname)
862 {
863 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
864 *params = framebuffer->getDefaultWidth();
865 break;
866 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
867 *params = framebuffer->getDefaultHeight();
868 break;
869 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
870 *params = framebuffer->getDefaultSamples();
871 break;
872 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
873 *params = framebuffer->getDefaultFixedSampleLocations();
874 break;
875 default:
876 UNREACHABLE();
877 break;
878 }
879}
880
Geoff Langc1984ed2016-10-07 12:41:00 -0400881void SetTexParameterf(Texture *texture, GLenum pname, GLfloat param)
882{
883 SetTexParameterBase(texture, pname, &param);
884}
885
886void SetTexParameterfv(Texture *texture, GLenum pname, const GLfloat *params)
887{
888 SetTexParameterBase(texture, pname, params);
889}
890
891void SetTexParameteri(Texture *texture, GLenum pname, GLint param)
892{
893 SetTexParameterBase(texture, pname, &param);
894}
895
896void SetTexParameteriv(Texture *texture, GLenum pname, const GLint *params)
897{
898 SetTexParameterBase(texture, pname, params);
899}
900
901void SetSamplerParameterf(Sampler *sampler, GLenum pname, GLfloat param)
902{
903 SetSamplerParameterBase(sampler, pname, &param);
904}
905
906void SetSamplerParameterfv(Sampler *sampler, GLenum pname, const GLfloat *params)
907{
908 SetSamplerParameterBase(sampler, pname, params);
909}
910
911void SetSamplerParameteri(Sampler *sampler, GLenum pname, GLint param)
912{
913 SetSamplerParameterBase(sampler, pname, &param);
914}
915
916void SetSamplerParameteriv(Sampler *sampler, GLenum pname, const GLint *params)
917{
918 SetSamplerParameterBase(sampler, pname, params);
919}
Geoff Lang65603eb2017-01-12 16:48:03 -0500920
JiangYizhouf7bbc8a2016-11-16 09:57:22 +0800921void SetFramebufferParameteri(Framebuffer *framebuffer, GLenum pname, GLint param)
922{
923 ASSERT(framebuffer);
924
925 switch (pname)
926 {
927 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
928 framebuffer->setDefaultWidth(param);
929 break;
930 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
931 framebuffer->setDefaultHeight(param);
932 break;
933 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
934 framebuffer->setDefaultSamples(param);
935 break;
936 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
937 framebuffer->setDefaultFixedSampleLocations(static_cast<GLboolean>(param));
938 break;
939 default:
940 UNREACHABLE();
941 break;
942 }
943}
944
Yunchao He61afff12017-03-14 15:34:03 +0800945void SetProgramParameteri(Program *program, GLenum pname, GLint value)
946{
947 ASSERT(program);
948
949 switch (pname)
950 {
951 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
952 program->setBinaryRetrievableHint(value != GL_FALSE);
953 break;
954 case GL_PROGRAM_SEPARABLE:
955 program->setSeparable(value != GL_FALSE);
956 break;
957 default:
958 UNREACHABLE();
959 break;
960 }
961}
962
jchen1015015f72017-03-16 13:54:21 +0800963GLuint QueryProgramResourceIndex(const Program *program,
964 GLenum programInterface,
965 const GLchar *name)
966{
967 switch (programInterface)
968 {
969 case GL_PROGRAM_INPUT:
970 return program->getInputResourceIndex(name);
971
972 case GL_PROGRAM_OUTPUT:
973 return program->getOutputResourceIndex(name);
974
975 // TODO(Jie): more interfaces.
976 case GL_UNIFORM:
977 case GL_UNIFORM_BLOCK:
978 case GL_TRANSFORM_FEEDBACK_VARYING:
979 case GL_BUFFER_VARIABLE:
980 case GL_SHADER_STORAGE_BLOCK:
981 UNIMPLEMENTED();
982 return GL_INVALID_INDEX;
983
984 default:
985 UNREACHABLE();
986 return GL_INVALID_INDEX;
987 }
988}
989
Geoff Lang65603eb2017-01-12 16:48:03 -0500990} // namespace gl
991
992namespace egl
993{
994
995void QueryConfigAttrib(const Config *config, EGLint attribute, EGLint *value)
996{
997 ASSERT(config != nullptr);
998 switch (attribute)
999 {
1000 case EGL_BUFFER_SIZE:
1001 *value = config->bufferSize;
1002 break;
1003 case EGL_ALPHA_SIZE:
1004 *value = config->alphaSize;
1005 break;
1006 case EGL_BLUE_SIZE:
1007 *value = config->blueSize;
1008 break;
1009 case EGL_GREEN_SIZE:
1010 *value = config->greenSize;
1011 break;
1012 case EGL_RED_SIZE:
1013 *value = config->redSize;
1014 break;
1015 case EGL_DEPTH_SIZE:
1016 *value = config->depthSize;
1017 break;
1018 case EGL_STENCIL_SIZE:
1019 *value = config->stencilSize;
1020 break;
1021 case EGL_CONFIG_CAVEAT:
1022 *value = config->configCaveat;
1023 break;
1024 case EGL_CONFIG_ID:
1025 *value = config->configID;
1026 break;
1027 case EGL_LEVEL:
1028 *value = config->level;
1029 break;
1030 case EGL_NATIVE_RENDERABLE:
1031 *value = config->nativeRenderable;
1032 break;
1033 case EGL_NATIVE_VISUAL_ID:
1034 *value = config->nativeVisualID;
1035 break;
1036 case EGL_NATIVE_VISUAL_TYPE:
1037 *value = config->nativeVisualType;
1038 break;
1039 case EGL_SAMPLES:
1040 *value = config->samples;
1041 break;
1042 case EGL_SAMPLE_BUFFERS:
1043 *value = config->sampleBuffers;
1044 break;
1045 case EGL_SURFACE_TYPE:
1046 *value = config->surfaceType;
1047 break;
1048 case EGL_TRANSPARENT_TYPE:
1049 *value = config->transparentType;
1050 break;
1051 case EGL_TRANSPARENT_BLUE_VALUE:
1052 *value = config->transparentBlueValue;
1053 break;
1054 case EGL_TRANSPARENT_GREEN_VALUE:
1055 *value = config->transparentGreenValue;
1056 break;
1057 case EGL_TRANSPARENT_RED_VALUE:
1058 *value = config->transparentRedValue;
1059 break;
1060 case EGL_BIND_TO_TEXTURE_RGB:
1061 *value = config->bindToTextureRGB;
1062 break;
1063 case EGL_BIND_TO_TEXTURE_RGBA:
1064 *value = config->bindToTextureRGBA;
1065 break;
1066 case EGL_MIN_SWAP_INTERVAL:
1067 *value = config->minSwapInterval;
1068 break;
1069 case EGL_MAX_SWAP_INTERVAL:
1070 *value = config->maxSwapInterval;
1071 break;
1072 case EGL_LUMINANCE_SIZE:
1073 *value = config->luminanceSize;
1074 break;
1075 case EGL_ALPHA_MASK_SIZE:
1076 *value = config->alphaMaskSize;
1077 break;
1078 case EGL_COLOR_BUFFER_TYPE:
1079 *value = config->colorBufferType;
1080 break;
1081 case EGL_RENDERABLE_TYPE:
1082 *value = config->renderableType;
1083 break;
1084 case EGL_MATCH_NATIVE_PIXMAP:
1085 *value = false;
1086 UNIMPLEMENTED();
1087 break;
1088 case EGL_CONFORMANT:
1089 *value = config->conformant;
1090 break;
1091 case EGL_MAX_PBUFFER_WIDTH:
1092 *value = config->maxPBufferWidth;
1093 break;
1094 case EGL_MAX_PBUFFER_HEIGHT:
1095 *value = config->maxPBufferHeight;
1096 break;
1097 case EGL_MAX_PBUFFER_PIXELS:
1098 *value = config->maxPBufferPixels;
1099 break;
1100 case EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE:
1101 *value = config->optimalOrientation;
1102 break;
Geoff Langc5a2a172017-01-13 15:55:07 -05001103 case EGL_COLOR_COMPONENT_TYPE_EXT:
1104 *value = config->colorComponentType;
1105 break;
Geoff Lang65603eb2017-01-12 16:48:03 -05001106 default:
1107 UNREACHABLE();
1108 break;
1109 }
Geoff Langff5b2d52016-09-07 11:32:23 -04001110}
Geoff Lang65603eb2017-01-12 16:48:03 -05001111
1112} // namespace egl