blob: 2d325e324d03b7e50d9db56595b67ad08f2d7c4b [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 Lang38f2cfb2017-04-11 15:23:08 -040016#include "libANGLE/Fence.h"
Geoff Langff5b2d52016-09-07 11:32:23 -040017#include "libANGLE/Framebuffer.h"
18#include "libANGLE/Program.h"
Geoff Lang740d9022016-10-07 11:20:52 -040019#include "libANGLE/Renderbuffer.h"
Geoff Langc1984ed2016-10-07 12:41:00 -040020#include "libANGLE/Sampler.h"
Geoff Langd7d0ed32016-10-07 11:33:51 -040021#include "libANGLE/Shader.h"
Geoff Lang31ecbd72017-07-26 13:01:27 -040022#include "libANGLE/Surface.h"
Geoff Langc1984ed2016-10-07 12:41:00 -040023#include "libANGLE/Texture.h"
Geoff Lang6899b872016-10-14 11:30:13 -040024#include "libANGLE/Uniform.h"
Geoff Lang0b031062016-10-13 14:30:04 -040025#include "libANGLE/VertexAttribute.h"
Geoff Langff5b2d52016-09-07 11:32:23 -040026
27namespace gl
28{
Geoff Langc1984ed2016-10-07 12:41:00 -040029
30namespace
31{
32template <typename ParamType>
He Yunchao11b038b2016-11-22 21:24:04 +080033void QueryTexLevelParameterBase(const Texture *texture,
34 GLenum target,
35 GLint level,
36 GLenum pname,
37 ParamType *params)
38{
39 ASSERT(texture != nullptr);
40 const InternalFormat *info = texture->getTextureState().getImageDesc(target, level).format.info;
41
42 switch (pname)
43 {
44 case GL_TEXTURE_RED_TYPE:
45 *params = ConvertFromGLenum<ParamType>(info->redBits ? info->componentType : GL_NONE);
46 break;
47 case GL_TEXTURE_GREEN_TYPE:
48 *params = ConvertFromGLenum<ParamType>(info->greenBits ? info->componentType : GL_NONE);
49 break;
50 case GL_TEXTURE_BLUE_TYPE:
51 *params = ConvertFromGLenum<ParamType>(info->blueBits ? info->componentType : GL_NONE);
52 break;
53 case GL_TEXTURE_ALPHA_TYPE:
54 *params = ConvertFromGLenum<ParamType>(info->alphaBits ? info->componentType : GL_NONE);
55 break;
56 case GL_TEXTURE_DEPTH_TYPE:
57 *params = ConvertFromGLenum<ParamType>(info->depthBits ? info->componentType : GL_NONE);
58 break;
59 case GL_TEXTURE_RED_SIZE:
60 *params = ConvertFromGLuint<ParamType>(info->redBits);
61 break;
62 case GL_TEXTURE_GREEN_SIZE:
63 *params = ConvertFromGLuint<ParamType>(info->greenBits);
64 break;
65 case GL_TEXTURE_BLUE_SIZE:
66 *params = ConvertFromGLuint<ParamType>(info->blueBits);
67 break;
68 case GL_TEXTURE_ALPHA_SIZE:
69 *params = ConvertFromGLuint<ParamType>(info->alphaBits);
70 break;
71 case GL_TEXTURE_DEPTH_SIZE:
72 *params = ConvertFromGLuint<ParamType>(info->depthBits);
73 break;
74 case GL_TEXTURE_STENCIL_SIZE:
75 *params = ConvertFromGLuint<ParamType>(info->stencilBits);
76 break;
77 case GL_TEXTURE_SHARED_SIZE:
78 *params = ConvertFromGLuint<ParamType>(info->sharedBits);
79 break;
80 case GL_TEXTURE_INTERNAL_FORMAT:
81 *params =
82 ConvertFromGLenum<ParamType>(info->internalFormat ? info->internalFormat : GL_RGBA);
83 break;
84 case GL_TEXTURE_WIDTH:
85 *params =
86 ConvertFromGLint<ParamType>(static_cast<GLint>(texture->getWidth(target, level)));
87 break;
88 case GL_TEXTURE_HEIGHT:
89 *params =
90 ConvertFromGLint<ParamType>(static_cast<GLint>(texture->getHeight(target, level)));
91 break;
92 case GL_TEXTURE_DEPTH:
93 *params =
94 ConvertFromGLint<ParamType>(static_cast<GLint>(texture->getDepth(target, level)));
95 break;
96 case GL_TEXTURE_SAMPLES:
97 *params = ConvertFromGLint<ParamType>(texture->getSamples(target, level));
98 break;
99 case GL_TEXTURE_FIXED_SAMPLE_LOCATIONS:
100 *params =
101 ConvertFromGLboolean<ParamType>(texture->getFixedSampleLocations(target, level));
102 break;
103 case GL_TEXTURE_COMPRESSED:
104 *params = ConvertFromGLboolean<ParamType>(info->compressed);
105 break;
106 default:
107 UNREACHABLE();
108 break;
109 }
110}
111
112template <typename ParamType>
Geoff Langc1984ed2016-10-07 12:41:00 -0400113void QueryTexParameterBase(const Texture *texture, GLenum pname, ParamType *params)
114{
115 ASSERT(texture != nullptr);
116
117 switch (pname)
118 {
119 case GL_TEXTURE_MAG_FILTER:
120 *params = ConvertFromGLenum<ParamType>(texture->getMagFilter());
121 break;
122 case GL_TEXTURE_MIN_FILTER:
123 *params = ConvertFromGLenum<ParamType>(texture->getMinFilter());
124 break;
125 case GL_TEXTURE_WRAP_S:
126 *params = ConvertFromGLenum<ParamType>(texture->getWrapS());
127 break;
128 case GL_TEXTURE_WRAP_T:
129 *params = ConvertFromGLenum<ParamType>(texture->getWrapT());
130 break;
131 case GL_TEXTURE_WRAP_R:
132 *params = ConvertFromGLenum<ParamType>(texture->getWrapR());
133 break;
134 case GL_TEXTURE_IMMUTABLE_FORMAT:
135 *params = ConvertFromGLboolean<ParamType>(texture->getImmutableFormat());
136 break;
137 case GL_TEXTURE_IMMUTABLE_LEVELS:
138 *params = ConvertFromGLuint<ParamType>(texture->getImmutableLevels());
139 break;
140 case GL_TEXTURE_USAGE_ANGLE:
141 *params = ConvertFromGLenum<ParamType>(texture->getUsage());
142 break;
143 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
144 *params = ConvertFromGLfloat<ParamType>(texture->getMaxAnisotropy());
145 break;
146 case GL_TEXTURE_SWIZZLE_R:
147 *params = ConvertFromGLenum<ParamType>(texture->getSwizzleRed());
148 break;
149 case GL_TEXTURE_SWIZZLE_G:
150 *params = ConvertFromGLenum<ParamType>(texture->getSwizzleGreen());
151 break;
152 case GL_TEXTURE_SWIZZLE_B:
153 *params = ConvertFromGLenum<ParamType>(texture->getSwizzleBlue());
154 break;
155 case GL_TEXTURE_SWIZZLE_A:
156 *params = ConvertFromGLenum<ParamType>(texture->getSwizzleAlpha());
157 break;
158 case GL_TEXTURE_BASE_LEVEL:
159 *params = ConvertFromGLuint<ParamType>(texture->getBaseLevel());
160 break;
161 case GL_TEXTURE_MAX_LEVEL:
162 *params = ConvertFromGLuint<ParamType>(texture->getMaxLevel());
163 break;
164 case GL_TEXTURE_MIN_LOD:
165 *params = ConvertFromGLfloat<ParamType>(texture->getSamplerState().minLod);
166 break;
167 case GL_TEXTURE_MAX_LOD:
168 *params = ConvertFromGLfloat<ParamType>(texture->getSamplerState().maxLod);
169 break;
170 case GL_TEXTURE_COMPARE_MODE:
171 *params = ConvertFromGLenum<ParamType>(texture->getCompareMode());
172 break;
173 case GL_TEXTURE_COMPARE_FUNC:
174 *params = ConvertFromGLenum<ParamType>(texture->getCompareFunc());
175 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700176 case GL_TEXTURE_SRGB_DECODE_EXT:
177 *params = ConvertFromGLenum<ParamType>(texture->getSRGBDecode());
178 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400179 default:
180 UNREACHABLE();
181 break;
182 }
183}
184
185template <typename ParamType>
Jamie Madill4928b7c2017-06-20 12:57:39 -0400186void SetTexParameterBase(Context *context, Texture *texture, GLenum pname, const ParamType *params)
Geoff Langc1984ed2016-10-07 12:41:00 -0400187{
188 ASSERT(texture != nullptr);
189
190 switch (pname)
191 {
192 case GL_TEXTURE_WRAP_S:
193 texture->setWrapS(ConvertToGLenum(params[0]));
194 break;
195 case GL_TEXTURE_WRAP_T:
196 texture->setWrapT(ConvertToGLenum(params[0]));
197 break;
198 case GL_TEXTURE_WRAP_R:
199 texture->setWrapR(ConvertToGLenum(params[0]));
200 break;
201 case GL_TEXTURE_MIN_FILTER:
202 texture->setMinFilter(ConvertToGLenum(params[0]));
203 break;
204 case GL_TEXTURE_MAG_FILTER:
205 texture->setMagFilter(ConvertToGLenum(params[0]));
206 break;
207 case GL_TEXTURE_USAGE_ANGLE:
208 texture->setUsage(ConvertToGLenum(params[0]));
209 break;
210 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
211 texture->setMaxAnisotropy(ConvertToGLfloat(params[0]));
212 break;
213 case GL_TEXTURE_COMPARE_MODE:
214 texture->setCompareMode(ConvertToGLenum(params[0]));
215 break;
216 case GL_TEXTURE_COMPARE_FUNC:
217 texture->setCompareFunc(ConvertToGLenum(params[0]));
218 break;
219 case GL_TEXTURE_SWIZZLE_R:
220 texture->setSwizzleRed(ConvertToGLenum(params[0]));
221 break;
222 case GL_TEXTURE_SWIZZLE_G:
223 texture->setSwizzleGreen(ConvertToGLenum(params[0]));
224 break;
225 case GL_TEXTURE_SWIZZLE_B:
226 texture->setSwizzleBlue(ConvertToGLenum(params[0]));
227 break;
228 case GL_TEXTURE_SWIZZLE_A:
229 texture->setSwizzleAlpha(ConvertToGLenum(params[0]));
230 break;
231 case GL_TEXTURE_BASE_LEVEL:
Jamie Madill4928b7c2017-06-20 12:57:39 -0400232 {
233 context->handleError(texture->setBaseLevel(context, ConvertToGLuint(params[0])));
Geoff Langc1984ed2016-10-07 12:41:00 -0400234 break;
Jamie Madill4928b7c2017-06-20 12:57:39 -0400235 }
Geoff Langc1984ed2016-10-07 12:41:00 -0400236 case GL_TEXTURE_MAX_LEVEL:
237 texture->setMaxLevel(ConvertToGLuint(params[0]));
238 break;
239 case GL_TEXTURE_MIN_LOD:
240 texture->setMinLod(ConvertToGLfloat(params[0]));
241 break;
242 case GL_TEXTURE_MAX_LOD:
243 texture->setMaxLod(ConvertToGLfloat(params[0]));
244 break;
Geoff Lang3b573612016-10-31 14:08:10 -0400245 case GL_DEPTH_STENCIL_TEXTURE_MODE:
Geoff Lang9f090372016-12-02 10:20:43 -0500246 texture->setDepthStencilTextureMode(ConvertToGLenum(params[0]));
Geoff Lang3b573612016-10-31 14:08:10 -0400247 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700248 case GL_TEXTURE_SRGB_DECODE_EXT:
249 texture->setSRGBDecode(ConvertToGLenum(params[0]));
250 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400251 default:
252 UNREACHABLE();
253 break;
254 }
255}
256
257template <typename ParamType>
258void QuerySamplerParameterBase(const Sampler *sampler, GLenum pname, ParamType *params)
259{
260 switch (pname)
261 {
262 case GL_TEXTURE_MIN_FILTER:
263 *params = ConvertFromGLenum<ParamType>(sampler->getMinFilter());
264 break;
265 case GL_TEXTURE_MAG_FILTER:
266 *params = ConvertFromGLenum<ParamType>(sampler->getMagFilter());
267 break;
268 case GL_TEXTURE_WRAP_S:
269 *params = ConvertFromGLenum<ParamType>(sampler->getWrapS());
270 break;
271 case GL_TEXTURE_WRAP_T:
272 *params = ConvertFromGLenum<ParamType>(sampler->getWrapT());
273 break;
274 case GL_TEXTURE_WRAP_R:
275 *params = ConvertFromGLenum<ParamType>(sampler->getWrapR());
276 break;
277 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
278 *params = ConvertFromGLfloat<ParamType>(sampler->getMaxAnisotropy());
279 break;
280 case GL_TEXTURE_MIN_LOD:
281 *params = ConvertFromGLfloat<ParamType>(sampler->getMinLod());
282 break;
283 case GL_TEXTURE_MAX_LOD:
284 *params = ConvertFromGLfloat<ParamType>(sampler->getMaxLod());
285 break;
286 case GL_TEXTURE_COMPARE_MODE:
287 *params = ConvertFromGLenum<ParamType>(sampler->getCompareMode());
288 break;
289 case GL_TEXTURE_COMPARE_FUNC:
290 *params = ConvertFromGLenum<ParamType>(sampler->getCompareFunc());
291 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700292 case GL_TEXTURE_SRGB_DECODE_EXT:
293 *params = ConvertFromGLenum<ParamType>(sampler->getSRGBDecode());
294 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400295 default:
296 UNREACHABLE();
297 break;
298 }
299}
300
301template <typename ParamType>
302void SetSamplerParameterBase(Sampler *sampler, GLenum pname, const ParamType *params)
303{
304 switch (pname)
305 {
306 case GL_TEXTURE_WRAP_S:
307 sampler->setWrapS(ConvertToGLenum(params[0]));
308 break;
309 case GL_TEXTURE_WRAP_T:
310 sampler->setWrapT(ConvertToGLenum(params[0]));
311 break;
312 case GL_TEXTURE_WRAP_R:
313 sampler->setWrapR(ConvertToGLenum(params[0]));
314 break;
315 case GL_TEXTURE_MIN_FILTER:
316 sampler->setMinFilter(ConvertToGLenum(params[0]));
317 break;
318 case GL_TEXTURE_MAG_FILTER:
319 sampler->setMagFilter(ConvertToGLenum(params[0]));
320 break;
321 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
322 sampler->setMaxAnisotropy(ConvertToGLfloat(params[0]));
323 break;
324 case GL_TEXTURE_COMPARE_MODE:
325 sampler->setCompareMode(ConvertToGLenum(params[0]));
326 break;
327 case GL_TEXTURE_COMPARE_FUNC:
328 sampler->setCompareFunc(ConvertToGLenum(params[0]));
329 break;
330 case GL_TEXTURE_MIN_LOD:
331 sampler->setMinLod(ConvertToGLfloat(params[0]));
332 break;
333 case GL_TEXTURE_MAX_LOD:
334 sampler->setMaxLod(ConvertToGLfloat(params[0]));
335 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700336 case GL_TEXTURE_SRGB_DECODE_EXT:
337 sampler->setSRGBDecode(ConvertToGLenum(params[0]));
338 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400339 default:
340 UNREACHABLE();
341 break;
342 }
343}
344
Geoff Lang0b031062016-10-13 14:30:04 -0400345template <typename ParamType, typename CurrentDataType>
346ParamType ConvertCurrentValue(CurrentDataType currentValue)
347{
348 return static_cast<ParamType>(currentValue);
349}
350
351template <>
352GLint ConvertCurrentValue(GLfloat currentValue)
353{
354 return iround<GLint>(currentValue);
355}
356
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800357// Warning: you should ensure binding really matches attrib.bindingIndex before using this function.
Geoff Lang0b031062016-10-13 14:30:04 -0400358template <typename ParamType, typename CurrentDataType, size_t CurrentValueCount>
359void QueryVertexAttribBase(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800360 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -0400361 const CurrentDataType (&currentValueData)[CurrentValueCount],
362 GLenum pname,
363 ParamType *params)
364{
365 switch (pname)
366 {
367 case GL_CURRENT_VERTEX_ATTRIB:
368 for (size_t i = 0; i < CurrentValueCount; ++i)
369 {
370 params[i] = ConvertCurrentValue<ParamType>(currentValueData[i]);
371 }
372 break;
373 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
374 *params = ConvertFromGLboolean<ParamType>(attrib.enabled);
375 break;
376 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
377 *params = ConvertFromGLuint<ParamType>(attrib.size);
378 break;
379 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800380 *params = ConvertFromGLuint<ParamType>(attrib.vertexAttribArrayStride);
Geoff Lang0b031062016-10-13 14:30:04 -0400381 break;
382 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
383 *params = ConvertFromGLenum<ParamType>(attrib.type);
384 break;
385 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
386 *params = ConvertFromGLboolean<ParamType>(attrib.normalized);
387 break;
388 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
Martin Radevdd5f27e2017-06-07 10:17:09 +0300389 *params = ConvertFromGLuint<ParamType>(binding.getBuffer().id());
Geoff Lang0b031062016-10-13 14:30:04 -0400390 break;
391 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
Martin Radevdd5f27e2017-06-07 10:17:09 +0300392 *params = ConvertFromGLuint<ParamType>(binding.getDivisor());
Geoff Lang0b031062016-10-13 14:30:04 -0400393 break;
394 case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
395 *params = ConvertFromGLboolean<ParamType>(attrib.pureInteger);
396 break;
Shao80957d92017-02-20 21:25:59 +0800397 case GL_VERTEX_ATTRIB_BINDING:
398 *params = ConvertFromGLuint<ParamType>(attrib.bindingIndex);
399 break;
400 case GL_VERTEX_ATTRIB_RELATIVE_OFFSET:
Shaodde78e82017-05-22 14:13:27 +0800401 *params = ConvertFromGLuint<ParamType>(attrib.relativeOffset);
Shao80957d92017-02-20 21:25:59 +0800402 break;
Geoff Lang0b031062016-10-13 14:30:04 -0400403 default:
404 UNREACHABLE();
405 break;
406 }
407}
408
Geoff Langebebe1c2016-10-14 12:01:31 -0400409template <typename ParamType>
410void QueryBufferParameterBase(const Buffer *buffer, GLenum pname, ParamType *params)
411{
412 ASSERT(buffer != nullptr);
413
414 switch (pname)
415 {
416 case GL_BUFFER_USAGE:
417 *params = ConvertFromGLenum<ParamType>(buffer->getUsage());
418 break;
419 case GL_BUFFER_SIZE:
420 *params = ConvertFromGLint64<ParamType>(buffer->getSize());
421 break;
422 case GL_BUFFER_ACCESS_FLAGS:
423 *params = ConvertFromGLuint<ParamType>(buffer->getAccessFlags());
424 break;
425 case GL_BUFFER_ACCESS_OES:
426 *params = ConvertFromGLenum<ParamType>(buffer->getAccess());
427 break;
428 case GL_BUFFER_MAPPED:
429 *params = ConvertFromGLboolean<ParamType>(buffer->isMapped());
430 break;
431 case GL_BUFFER_MAP_OFFSET:
432 *params = ConvertFromGLint64<ParamType>(buffer->getMapOffset());
433 break;
434 case GL_BUFFER_MAP_LENGTH:
435 *params = ConvertFromGLint64<ParamType>(buffer->getMapLength());
436 break;
437 default:
438 UNREACHABLE();
439 break;
440 }
441}
442
Geoff Langc1984ed2016-10-07 12:41:00 -0400443} // anonymous namespace
444
Geoff Langff5b2d52016-09-07 11:32:23 -0400445void QueryFramebufferAttachmentParameteriv(const Framebuffer *framebuffer,
446 GLenum attachment,
447 GLenum pname,
448 GLint *params)
449{
450 ASSERT(framebuffer);
451
452 const FramebufferAttachment *attachmentObject = framebuffer->getAttachment(attachment);
453 if (attachmentObject == nullptr)
454 {
455 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
456 // is NONE, then querying any other pname will generate INVALID_ENUM.
457
458 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
459 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
460 // INVALID_OPERATION for all other pnames
461
462 switch (pname)
463 {
464 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
465 *params = GL_NONE;
466 break;
467
468 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
469 *params = 0;
470 break;
471
472 default:
473 UNREACHABLE();
474 break;
475 }
476
477 return;
478 }
479
480 switch (pname)
481 {
482 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
483 *params = attachmentObject->type();
484 break;
485
486 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
487 *params = attachmentObject->id();
488 break;
489
490 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
491 *params = attachmentObject->mipLevel();
492 break;
493
494 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
495 *params = attachmentObject->cubeMapFace();
496 break;
497
498 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
499 *params = attachmentObject->getRedSize();
500 break;
501
502 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
503 *params = attachmentObject->getGreenSize();
504 break;
505
506 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
507 *params = attachmentObject->getBlueSize();
508 break;
509
510 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
511 *params = attachmentObject->getAlphaSize();
512 break;
513
514 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
515 *params = attachmentObject->getDepthSize();
516 break;
517
518 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
519 *params = attachmentObject->getStencilSize();
520 break;
521
522 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
523 *params = attachmentObject->getComponentType();
524 break;
525
526 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
527 *params = attachmentObject->getColorEncoding();
528 break;
529
530 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
531 *params = attachmentObject->layer();
532 break;
533
Martin Radeve5285d22017-07-14 16:23:53 +0300534 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_ANGLE:
535 *params = attachmentObject->getNumViews();
536 break;
537
538 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_MULTIVIEW_LAYOUT_ANGLE:
539 *params = static_cast<GLint>(attachmentObject->getMultiviewLayout());
540 break;
541
542 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_ANGLE:
543 *params = attachmentObject->getBaseViewIndex();
544 break;
545
546 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_VIEWPORT_OFFSETS_ANGLE:
547 {
548 const std::vector<Offset> &offsets = attachmentObject->getMultiviewViewportOffsets();
549 for (size_t i = 0u; i < offsets.size(); ++i)
550 {
551 params[i * 2u] = offsets[i].x;
552 params[i * 2u + 1u] = offsets[i].y;
553 }
554 }
555 break;
556
Geoff Langff5b2d52016-09-07 11:32:23 -0400557 default:
558 UNREACHABLE();
559 break;
560 }
561}
562
563void QueryBufferParameteriv(const Buffer *buffer, GLenum pname, GLint *params)
564{
Geoff Langebebe1c2016-10-14 12:01:31 -0400565 QueryBufferParameterBase(buffer, pname, params);
566}
Geoff Langff5b2d52016-09-07 11:32:23 -0400567
Geoff Langebebe1c2016-10-14 12:01:31 -0400568void QueryBufferParameteri64v(const Buffer *buffer, GLenum pname, GLint64 *params)
569{
570 QueryBufferParameterBase(buffer, pname, params);
Geoff Langff5b2d52016-09-07 11:32:23 -0400571}
572
Geoff Lang496c02d2016-10-20 11:38:11 -0700573void QueryBufferPointerv(const Buffer *buffer, GLenum pname, void **params)
574{
575 switch (pname)
576 {
577 case GL_BUFFER_MAP_POINTER:
578 *params = buffer->getMapPointer();
579 break;
580
581 default:
582 UNREACHABLE();
583 break;
584 }
585}
586
Jamie Madillffe00c02017-06-27 16:26:55 -0400587void QueryProgramiv(const Context *context, const Program *program, GLenum pname, GLint *params)
Geoff Langff5b2d52016-09-07 11:32:23 -0400588{
589 ASSERT(program != nullptr);
590
591 switch (pname)
592 {
593 case GL_DELETE_STATUS:
594 *params = program->isFlaggedForDeletion();
595 return;
596 case GL_LINK_STATUS:
597 *params = program->isLinked();
598 return;
599 case GL_VALIDATE_STATUS:
600 *params = program->isValidated();
601 return;
602 case GL_INFO_LOG_LENGTH:
603 *params = program->getInfoLogLength();
604 return;
605 case GL_ATTACHED_SHADERS:
606 *params = program->getAttachedShadersCount();
607 return;
608 case GL_ACTIVE_ATTRIBUTES:
609 *params = program->getActiveAttributeCount();
610 return;
611 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
612 *params = program->getActiveAttributeMaxLength();
613 return;
614 case GL_ACTIVE_UNIFORMS:
615 *params = program->getActiveUniformCount();
616 return;
617 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
618 *params = program->getActiveUniformMaxLength();
619 return;
620 case GL_PROGRAM_BINARY_LENGTH_OES:
Jamie Madillffe00c02017-06-27 16:26:55 -0400621 *params = program->getBinaryLength(context);
Geoff Langff5b2d52016-09-07 11:32:23 -0400622 return;
623 case GL_ACTIVE_UNIFORM_BLOCKS:
624 *params = program->getActiveUniformBlockCount();
625 return;
626 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
627 *params = program->getActiveUniformBlockMaxLength();
628 break;
629 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
630 *params = program->getTransformFeedbackBufferMode();
631 break;
632 case GL_TRANSFORM_FEEDBACK_VARYINGS:
633 *params = program->getTransformFeedbackVaryingCount();
634 break;
635 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
636 *params = program->getTransformFeedbackVaryingMaxLength();
637 break;
638 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
639 *params = program->getBinaryRetrievableHint();
640 break;
Yunchao He61afff12017-03-14 15:34:03 +0800641 case GL_PROGRAM_SEPARABLE:
642 *params = program->isSeparable();
643 break;
Geoff Langff5b2d52016-09-07 11:32:23 -0400644 default:
645 UNREACHABLE();
646 break;
647 }
648}
Geoff Lang740d9022016-10-07 11:20:52 -0400649
Jamie Madill4e0e6f82017-02-17 11:06:03 -0500650void QueryRenderbufferiv(const Context *context,
651 const Renderbuffer *renderbuffer,
652 GLenum pname,
653 GLint *params)
Geoff Lang740d9022016-10-07 11:20:52 -0400654{
655 ASSERT(renderbuffer != nullptr);
656
657 switch (pname)
658 {
659 case GL_RENDERBUFFER_WIDTH:
660 *params = renderbuffer->getWidth();
661 break;
662 case GL_RENDERBUFFER_HEIGHT:
663 *params = renderbuffer->getHeight();
664 break;
665 case GL_RENDERBUFFER_INTERNAL_FORMAT:
Jamie Madill4e0e6f82017-02-17 11:06:03 -0500666 // Special case the WebGL 1 DEPTH_STENCIL format.
Jamie Madilla02315b2017-02-23 14:14:47 -0500667 if (context->isWebGL1() &&
Jamie Madill4e0e6f82017-02-17 11:06:03 -0500668 renderbuffer->getFormat().info->internalFormat == GL_DEPTH24_STENCIL8)
669 {
670 *params = GL_DEPTH_STENCIL;
671 }
672 else
673 {
674 *params = renderbuffer->getFormat().info->internalFormat;
675 }
Geoff Lang740d9022016-10-07 11:20:52 -0400676 break;
677 case GL_RENDERBUFFER_RED_SIZE:
678 *params = renderbuffer->getRedSize();
679 break;
680 case GL_RENDERBUFFER_GREEN_SIZE:
681 *params = renderbuffer->getGreenSize();
682 break;
683 case GL_RENDERBUFFER_BLUE_SIZE:
684 *params = renderbuffer->getBlueSize();
685 break;
686 case GL_RENDERBUFFER_ALPHA_SIZE:
687 *params = renderbuffer->getAlphaSize();
688 break;
689 case GL_RENDERBUFFER_DEPTH_SIZE:
690 *params = renderbuffer->getDepthSize();
691 break;
692 case GL_RENDERBUFFER_STENCIL_SIZE:
693 *params = renderbuffer->getStencilSize();
694 break;
695 case GL_RENDERBUFFER_SAMPLES_ANGLE:
696 *params = renderbuffer->getSamples();
697 break;
698 default:
699 UNREACHABLE();
700 break;
701 }
702}
Geoff Langd7d0ed32016-10-07 11:33:51 -0400703
Jamie Madillbd044ed2017-06-05 12:59:21 -0400704void QueryShaderiv(const Context *context, Shader *shader, GLenum pname, GLint *params)
Geoff Langd7d0ed32016-10-07 11:33:51 -0400705{
706 ASSERT(shader != nullptr);
707
708 switch (pname)
709 {
710 case GL_SHADER_TYPE:
711 *params = shader->getType();
712 return;
713 case GL_DELETE_STATUS:
714 *params = shader->isFlaggedForDeletion();
715 return;
716 case GL_COMPILE_STATUS:
Jamie Madillbd044ed2017-06-05 12:59:21 -0400717 *params = shader->isCompiled(context) ? GL_TRUE : GL_FALSE;
Geoff Langd7d0ed32016-10-07 11:33:51 -0400718 return;
719 case GL_INFO_LOG_LENGTH:
Jamie Madillbd044ed2017-06-05 12:59:21 -0400720 *params = shader->getInfoLogLength(context);
Geoff Langd7d0ed32016-10-07 11:33:51 -0400721 return;
722 case GL_SHADER_SOURCE_LENGTH:
723 *params = shader->getSourceLength();
724 return;
725 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
Jamie Madillbd044ed2017-06-05 12:59:21 -0400726 *params = shader->getTranslatedSourceWithDebugInfoLength(context);
Geoff Langd7d0ed32016-10-07 11:33:51 -0400727 return;
728 default:
729 UNREACHABLE();
730 break;
731 }
732}
Geoff Langc1984ed2016-10-07 12:41:00 -0400733
He Yunchao11b038b2016-11-22 21:24:04 +0800734void QueryTexLevelParameterfv(const Texture *texture,
735 GLenum target,
736 GLint level,
737 GLenum pname,
738 GLfloat *params)
739{
740 QueryTexLevelParameterBase(texture, target, level, pname, params);
741}
742
743void QueryTexLevelParameteriv(const Texture *texture,
744 GLenum target,
745 GLint level,
746 GLenum pname,
747 GLint *params)
748{
749 QueryTexLevelParameterBase(texture, target, level, pname, params);
750}
751
Geoff Langc1984ed2016-10-07 12:41:00 -0400752void QueryTexParameterfv(const Texture *texture, GLenum pname, GLfloat *params)
753{
754 QueryTexParameterBase(texture, pname, params);
755}
756
757void QueryTexParameteriv(const Texture *texture, GLenum pname, GLint *params)
758{
759 QueryTexParameterBase(texture, pname, params);
760}
761
762void QuerySamplerParameterfv(const Sampler *sampler, GLenum pname, GLfloat *params)
763{
764 QuerySamplerParameterBase(sampler, pname, params);
765}
766
767void QuerySamplerParameteriv(const Sampler *sampler, GLenum pname, GLint *params)
768{
769 QuerySamplerParameterBase(sampler, pname, params);
770}
771
Geoff Lang0b031062016-10-13 14:30:04 -0400772void QueryVertexAttribfv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800773 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -0400774 const VertexAttribCurrentValueData &currentValueData,
775 GLenum pname,
776 GLfloat *params)
777{
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800778 QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -0400779}
780
781void QueryVertexAttribiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800782 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -0400783 const VertexAttribCurrentValueData &currentValueData,
784 GLenum pname,
785 GLint *params)
786{
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800787 QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -0400788}
789
Jamie Madill876429b2017-04-20 15:46:24 -0400790void QueryVertexAttribPointerv(const VertexAttribute &attrib, GLenum pname, void **pointer)
Geoff Lang0b031062016-10-13 14:30:04 -0400791{
792 switch (pname)
793 {
794 case GL_VERTEX_ATTRIB_ARRAY_POINTER:
Jamie Madill876429b2017-04-20 15:46:24 -0400795 *pointer = const_cast<void *>(attrib.pointer);
Geoff Lang0b031062016-10-13 14:30:04 -0400796 break;
797
798 default:
799 UNREACHABLE();
800 break;
801 }
802}
803
804void QueryVertexAttribIiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800805 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -0400806 const VertexAttribCurrentValueData &currentValueData,
807 GLenum pname,
808 GLint *params)
809{
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800810 QueryVertexAttribBase(attrib, binding, currentValueData.IntValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -0400811}
812
813void QueryVertexAttribIuiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800814 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -0400815 const VertexAttribCurrentValueData &currentValueData,
816 GLenum pname,
817 GLuint *params)
818{
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800819 QueryVertexAttribBase(attrib, binding, currentValueData.UnsignedIntValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -0400820}
821
Geoff Lang6899b872016-10-14 11:30:13 -0400822void QueryActiveUniformBlockiv(const Program *program,
823 GLuint uniformBlockIndex,
824 GLenum pname,
825 GLint *params)
826{
827 const UniformBlock &uniformBlock = program->getUniformBlockByIndex(uniformBlockIndex);
828 switch (pname)
829 {
830 case GL_UNIFORM_BLOCK_BINDING:
831 *params = ConvertToGLint(program->getUniformBlockBinding(uniformBlockIndex));
832 break;
833 case GL_UNIFORM_BLOCK_DATA_SIZE:
834 *params = ConvertToGLint(uniformBlock.dataSize);
835 break;
836 case GL_UNIFORM_BLOCK_NAME_LENGTH:
837 *params = ConvertToGLint(uniformBlock.nameWithArrayIndex().size() + 1);
838 break;
839 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
jchen10eaef1e52017-06-13 10:44:11 +0800840 *params = ConvertToGLint(uniformBlock.memberIndexes.size());
Geoff Lang6899b872016-10-14 11:30:13 -0400841 break;
842 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
jchen10eaef1e52017-06-13 10:44:11 +0800843 for (size_t blockMemberIndex = 0; blockMemberIndex < uniformBlock.memberIndexes.size();
844 blockMemberIndex++)
Geoff Lang6899b872016-10-14 11:30:13 -0400845 {
846 params[blockMemberIndex] =
jchen10eaef1e52017-06-13 10:44:11 +0800847 ConvertToGLint(uniformBlock.memberIndexes[blockMemberIndex]);
Geoff Lang6899b872016-10-14 11:30:13 -0400848 }
849 break;
850 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
851 *params = ConvertToGLint(uniformBlock.vertexStaticUse);
852 break;
853 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
854 *params = ConvertToGLint(uniformBlock.fragmentStaticUse);
855 break;
856 default:
857 UNREACHABLE();
858 break;
859 }
860}
861
Geoff Lang0a9661f2016-10-20 10:59:20 -0700862void QueryInternalFormativ(const TextureCaps &format, GLenum pname, GLsizei bufSize, GLint *params)
863{
864 switch (pname)
865 {
866 case GL_NUM_SAMPLE_COUNTS:
867 if (bufSize != 0)
868 {
869 *params = static_cast<GLint>(format.sampleCounts.size());
870 }
871 break;
872
873 case GL_SAMPLES:
874 {
875 size_t returnCount = std::min<size_t>(bufSize, format.sampleCounts.size());
876 auto sampleReverseIt = format.sampleCounts.rbegin();
877 for (size_t sampleIndex = 0; sampleIndex < returnCount; ++sampleIndex)
878 {
879 params[sampleIndex] = *sampleReverseIt++;
880 }
881 }
882 break;
883
884 default:
885 UNREACHABLE();
886 break;
887 }
888}
889
JiangYizhouf7bbc8a2016-11-16 09:57:22 +0800890void QueryFramebufferParameteriv(const Framebuffer *framebuffer, GLenum pname, GLint *params)
891{
892 ASSERT(framebuffer);
893
894 switch (pname)
895 {
896 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
897 *params = framebuffer->getDefaultWidth();
898 break;
899 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
900 *params = framebuffer->getDefaultHeight();
901 break;
902 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
903 *params = framebuffer->getDefaultSamples();
904 break;
905 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
906 *params = framebuffer->getDefaultFixedSampleLocations();
907 break;
908 default:
909 UNREACHABLE();
910 break;
911 }
912}
913
Geoff Lang82483b92017-04-11 15:33:00 -0400914Error QuerySynciv(const FenceSync *sync,
915 GLenum pname,
916 GLsizei bufSize,
917 GLsizei *length,
918 GLint *values)
Geoff Lang38f2cfb2017-04-11 15:23:08 -0400919{
920 ASSERT(sync);
921
Geoff Lang82483b92017-04-11 15:33:00 -0400922 // All queries return one value, exit early if the buffer can't fit anything.
923 if (bufSize < 1)
924 {
925 if (length != nullptr)
926 {
927 *length = 0;
928 }
929 return NoError();
930 }
931
Geoff Lang38f2cfb2017-04-11 15:23:08 -0400932 switch (pname)
933 {
934 case GL_OBJECT_TYPE:
935 *values = ConvertToGLint(GL_SYNC_FENCE);
936 break;
937 case GL_SYNC_CONDITION:
938 *values = ConvertToGLint(sync->getCondition());
939 break;
940 case GL_SYNC_FLAGS:
941 *values = ConvertToGLint(sync->getFlags());
942 break;
943 case GL_SYNC_STATUS:
944 ANGLE_TRY(sync->getStatus(values));
945 break;
946
947 default:
948 UNREACHABLE();
949 break;
950 }
951
Geoff Lang82483b92017-04-11 15:33:00 -0400952 if (length != nullptr)
953 {
954 *length = 1;
955 }
956
Geoff Lang38f2cfb2017-04-11 15:23:08 -0400957 return NoError();
958}
959
Jamie Madill4928b7c2017-06-20 12:57:39 -0400960void SetTexParameterf(Context *context, Texture *texture, GLenum pname, GLfloat param)
Geoff Langc1984ed2016-10-07 12:41:00 -0400961{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400962 SetTexParameterBase(context, texture, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -0400963}
964
Jamie Madill4928b7c2017-06-20 12:57:39 -0400965void SetTexParameterfv(Context *context, Texture *texture, GLenum pname, const GLfloat *params)
Geoff Langc1984ed2016-10-07 12:41:00 -0400966{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400967 SetTexParameterBase(context, texture, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -0400968}
969
Jamie Madill4928b7c2017-06-20 12:57:39 -0400970void SetTexParameteri(Context *context, Texture *texture, GLenum pname, GLint param)
Geoff Langc1984ed2016-10-07 12:41:00 -0400971{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400972 SetTexParameterBase(context, texture, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -0400973}
974
Jamie Madill4928b7c2017-06-20 12:57:39 -0400975void SetTexParameteriv(Context *context, Texture *texture, GLenum pname, const GLint *params)
Geoff Langc1984ed2016-10-07 12:41:00 -0400976{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400977 SetTexParameterBase(context, texture, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -0400978}
979
980void SetSamplerParameterf(Sampler *sampler, GLenum pname, GLfloat param)
981{
982 SetSamplerParameterBase(sampler, pname, &param);
983}
984
985void SetSamplerParameterfv(Sampler *sampler, GLenum pname, const GLfloat *params)
986{
987 SetSamplerParameterBase(sampler, pname, params);
988}
989
990void SetSamplerParameteri(Sampler *sampler, GLenum pname, GLint param)
991{
992 SetSamplerParameterBase(sampler, pname, &param);
993}
994
995void SetSamplerParameteriv(Sampler *sampler, GLenum pname, const GLint *params)
996{
997 SetSamplerParameterBase(sampler, pname, params);
998}
Geoff Lang65603eb2017-01-12 16:48:03 -0500999
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001000void SetFramebufferParameteri(Framebuffer *framebuffer, GLenum pname, GLint param)
1001{
1002 ASSERT(framebuffer);
1003
1004 switch (pname)
1005 {
1006 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
1007 framebuffer->setDefaultWidth(param);
1008 break;
1009 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
1010 framebuffer->setDefaultHeight(param);
1011 break;
1012 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
1013 framebuffer->setDefaultSamples(param);
1014 break;
1015 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
1016 framebuffer->setDefaultFixedSampleLocations(static_cast<GLboolean>(param));
1017 break;
1018 default:
1019 UNREACHABLE();
1020 break;
1021 }
1022}
1023
Yunchao He61afff12017-03-14 15:34:03 +08001024void SetProgramParameteri(Program *program, GLenum pname, GLint value)
1025{
1026 ASSERT(program);
1027
1028 switch (pname)
1029 {
1030 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
1031 program->setBinaryRetrievableHint(value != GL_FALSE);
1032 break;
1033 case GL_PROGRAM_SEPARABLE:
1034 program->setSeparable(value != GL_FALSE);
1035 break;
1036 default:
1037 UNREACHABLE();
1038 break;
1039 }
1040}
1041
jchen1015015f72017-03-16 13:54:21 +08001042GLuint QueryProgramResourceIndex(const Program *program,
1043 GLenum programInterface,
1044 const GLchar *name)
1045{
1046 switch (programInterface)
1047 {
1048 case GL_PROGRAM_INPUT:
1049 return program->getInputResourceIndex(name);
1050
1051 case GL_PROGRAM_OUTPUT:
1052 return program->getOutputResourceIndex(name);
1053
jchen10191381f2017-04-11 13:59:04 +08001054 // TODO(jie.a.chen@intel.com): more interfaces.
jchen1015015f72017-03-16 13:54:21 +08001055 case GL_UNIFORM:
1056 case GL_UNIFORM_BLOCK:
1057 case GL_TRANSFORM_FEEDBACK_VARYING:
1058 case GL_BUFFER_VARIABLE:
1059 case GL_SHADER_STORAGE_BLOCK:
1060 UNIMPLEMENTED();
1061 return GL_INVALID_INDEX;
1062
1063 default:
1064 UNREACHABLE();
1065 return GL_INVALID_INDEX;
1066 }
1067}
1068
jchen10fd7c3b52017-03-21 15:36:03 +08001069void QueryProgramResourceName(const Program *program,
1070 GLenum programInterface,
1071 GLuint index,
1072 GLsizei bufSize,
1073 GLsizei *length,
1074 GLchar *name)
1075{
1076 switch (programInterface)
1077 {
1078 case GL_PROGRAM_INPUT:
1079 program->getInputResourceName(index, bufSize, length, name);
1080 break;
1081
1082 case GL_PROGRAM_OUTPUT:
1083 program->getOutputResourceName(index, bufSize, length, name);
1084 break;
1085
jchen10191381f2017-04-11 13:59:04 +08001086 // TODO(jie.a.chen@intel.com): more interfaces.
jchen10fd7c3b52017-03-21 15:36:03 +08001087 case GL_UNIFORM:
1088 case GL_UNIFORM_BLOCK:
1089 case GL_TRANSFORM_FEEDBACK_VARYING:
1090 case GL_BUFFER_VARIABLE:
1091 case GL_SHADER_STORAGE_BLOCK:
1092 UNIMPLEMENTED();
1093 break;
1094
1095 default:
1096 UNREACHABLE();
1097 }
1098}
1099
jchen10191381f2017-04-11 13:59:04 +08001100GLint QueryProgramResourceLocation(const Program *program,
1101 GLenum programInterface,
1102 const GLchar *name)
1103{
1104 switch (programInterface)
1105 {
1106 case GL_PROGRAM_INPUT:
1107 return program->getAttributeLocation(name);
1108
1109 case GL_PROGRAM_OUTPUT:
1110 return program->getFragDataLocation(name);
1111
1112 // TODO(jie.a.chen@intel.com): more interfaces.
1113 case GL_UNIFORM:
1114 case GL_UNIFORM_BLOCK:
1115 case GL_TRANSFORM_FEEDBACK_VARYING:
1116 case GL_BUFFER_VARIABLE:
1117 case GL_SHADER_STORAGE_BLOCK:
1118 UNIMPLEMENTED();
1119 return -1;
1120
1121 default:
1122 UNREACHABLE();
1123 return -1;
1124 }
1125}
1126
Geoff Lang65603eb2017-01-12 16:48:03 -05001127} // namespace gl
1128
1129namespace egl
1130{
1131
1132void QueryConfigAttrib(const Config *config, EGLint attribute, EGLint *value)
1133{
1134 ASSERT(config != nullptr);
1135 switch (attribute)
1136 {
1137 case EGL_BUFFER_SIZE:
1138 *value = config->bufferSize;
1139 break;
1140 case EGL_ALPHA_SIZE:
1141 *value = config->alphaSize;
1142 break;
1143 case EGL_BLUE_SIZE:
1144 *value = config->blueSize;
1145 break;
1146 case EGL_GREEN_SIZE:
1147 *value = config->greenSize;
1148 break;
1149 case EGL_RED_SIZE:
1150 *value = config->redSize;
1151 break;
1152 case EGL_DEPTH_SIZE:
1153 *value = config->depthSize;
1154 break;
1155 case EGL_STENCIL_SIZE:
1156 *value = config->stencilSize;
1157 break;
1158 case EGL_CONFIG_CAVEAT:
1159 *value = config->configCaveat;
1160 break;
1161 case EGL_CONFIG_ID:
1162 *value = config->configID;
1163 break;
1164 case EGL_LEVEL:
1165 *value = config->level;
1166 break;
1167 case EGL_NATIVE_RENDERABLE:
1168 *value = config->nativeRenderable;
1169 break;
1170 case EGL_NATIVE_VISUAL_ID:
1171 *value = config->nativeVisualID;
1172 break;
1173 case EGL_NATIVE_VISUAL_TYPE:
1174 *value = config->nativeVisualType;
1175 break;
1176 case EGL_SAMPLES:
1177 *value = config->samples;
1178 break;
1179 case EGL_SAMPLE_BUFFERS:
1180 *value = config->sampleBuffers;
1181 break;
1182 case EGL_SURFACE_TYPE:
1183 *value = config->surfaceType;
1184 break;
1185 case EGL_TRANSPARENT_TYPE:
1186 *value = config->transparentType;
1187 break;
1188 case EGL_TRANSPARENT_BLUE_VALUE:
1189 *value = config->transparentBlueValue;
1190 break;
1191 case EGL_TRANSPARENT_GREEN_VALUE:
1192 *value = config->transparentGreenValue;
1193 break;
1194 case EGL_TRANSPARENT_RED_VALUE:
1195 *value = config->transparentRedValue;
1196 break;
1197 case EGL_BIND_TO_TEXTURE_RGB:
1198 *value = config->bindToTextureRGB;
1199 break;
1200 case EGL_BIND_TO_TEXTURE_RGBA:
1201 *value = config->bindToTextureRGBA;
1202 break;
1203 case EGL_MIN_SWAP_INTERVAL:
1204 *value = config->minSwapInterval;
1205 break;
1206 case EGL_MAX_SWAP_INTERVAL:
1207 *value = config->maxSwapInterval;
1208 break;
1209 case EGL_LUMINANCE_SIZE:
1210 *value = config->luminanceSize;
1211 break;
1212 case EGL_ALPHA_MASK_SIZE:
1213 *value = config->alphaMaskSize;
1214 break;
1215 case EGL_COLOR_BUFFER_TYPE:
1216 *value = config->colorBufferType;
1217 break;
1218 case EGL_RENDERABLE_TYPE:
1219 *value = config->renderableType;
1220 break;
1221 case EGL_MATCH_NATIVE_PIXMAP:
1222 *value = false;
1223 UNIMPLEMENTED();
1224 break;
1225 case EGL_CONFORMANT:
1226 *value = config->conformant;
1227 break;
1228 case EGL_MAX_PBUFFER_WIDTH:
1229 *value = config->maxPBufferWidth;
1230 break;
1231 case EGL_MAX_PBUFFER_HEIGHT:
1232 *value = config->maxPBufferHeight;
1233 break;
1234 case EGL_MAX_PBUFFER_PIXELS:
1235 *value = config->maxPBufferPixels;
1236 break;
1237 case EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE:
1238 *value = config->optimalOrientation;
1239 break;
Geoff Langc5a2a172017-01-13 15:55:07 -05001240 case EGL_COLOR_COMPONENT_TYPE_EXT:
1241 *value = config->colorComponentType;
1242 break;
Geoff Lang65603eb2017-01-12 16:48:03 -05001243 default:
1244 UNREACHABLE();
1245 break;
1246 }
Geoff Langff5b2d52016-09-07 11:32:23 -04001247}
Geoff Lang65603eb2017-01-12 16:48:03 -05001248
Geoff Lang31ecbd72017-07-26 13:01:27 -04001249void QuerySurfaceAttrib(const Surface *surface, EGLint attribute, EGLint *value)
1250{
1251 switch (attribute)
1252 {
1253 case EGL_GL_COLORSPACE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001254 *value = surface->getGLColorspace();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001255 break;
1256 case EGL_VG_ALPHA_FORMAT:
Geoff Lang40ac7832017-07-26 14:38:46 -04001257 *value = surface->getVGAlphaFormat();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001258 break;
1259 case EGL_VG_COLORSPACE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001260 *value = surface->getVGColorspace();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001261 break;
1262 case EGL_CONFIG_ID:
1263 *value = surface->getConfig()->configID;
1264 break;
1265 case EGL_HEIGHT:
1266 *value = surface->getHeight();
1267 break;
1268 case EGL_HORIZONTAL_RESOLUTION:
Geoff Lang40ac7832017-07-26 14:38:46 -04001269 *value = surface->getHorizontalResolution();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001270 break;
1271 case EGL_LARGEST_PBUFFER:
Geoff Lang40ac7832017-07-26 14:38:46 -04001272 // The EGL spec states that value is not written if the surface is not a pbuffer
1273 if (surface->getType() == EGL_PBUFFER_BIT)
1274 {
1275 *value = surface->getLargestPbuffer();
1276 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001277 break;
1278 case EGL_MIPMAP_TEXTURE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001279 // The EGL spec states that value is not written if the surface is not a pbuffer
1280 if (surface->getType() == EGL_PBUFFER_BIT)
1281 {
1282 *value = surface->getMipmapTexture();
1283 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001284 break;
1285 case EGL_MIPMAP_LEVEL:
Geoff Lang40ac7832017-07-26 14:38:46 -04001286 // The EGL spec states that value is not written if the surface is not a pbuffer
1287 if (surface->getType() == EGL_PBUFFER_BIT)
1288 {
1289 *value = surface->getMipmapLevel();
1290 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001291 break;
1292 case EGL_MULTISAMPLE_RESOLVE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001293 *value = surface->getMultisampleResolve();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001294 break;
1295 case EGL_PIXEL_ASPECT_RATIO:
1296 *value = surface->getPixelAspectRatio();
1297 break;
1298 case EGL_RENDER_BUFFER:
1299 *value = surface->getRenderBuffer();
1300 break;
1301 case EGL_SWAP_BEHAVIOR:
1302 *value = surface->getSwapBehavior();
1303 break;
1304 case EGL_TEXTURE_FORMAT:
Geoff Lang40ac7832017-07-26 14:38:46 -04001305 // The EGL spec states that value is not written if the surface is not a pbuffer
1306 if (surface->getType() == EGL_PBUFFER_BIT)
1307 {
1308 *value = surface->getTextureFormat();
1309 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001310 break;
1311 case EGL_TEXTURE_TARGET:
Geoff Lang40ac7832017-07-26 14:38:46 -04001312 // The EGL spec states that value is not written if the surface is not a pbuffer
1313 if (surface->getType() == EGL_PBUFFER_BIT)
1314 {
1315 *value = surface->getTextureTarget();
1316 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001317 break;
1318 case EGL_VERTICAL_RESOLUTION:
Geoff Lang40ac7832017-07-26 14:38:46 -04001319 *value = surface->getVerticalResolution();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001320 break;
1321 case EGL_WIDTH:
1322 *value = surface->getWidth();
1323 break;
1324 case EGL_POST_SUB_BUFFER_SUPPORTED_NV:
1325 *value = surface->isPostSubBufferSupported();
1326 break;
1327 case EGL_FIXED_SIZE_ANGLE:
1328 *value = surface->isFixedSize();
1329 break;
1330 case EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE:
1331 *value = surface->flexibleSurfaceCompatibilityRequested();
1332 break;
1333 case EGL_SURFACE_ORIENTATION_ANGLE:
1334 *value = surface->getOrientation();
1335 break;
1336 case EGL_DIRECT_COMPOSITION_ANGLE:
1337 *value = surface->directComposition();
1338 break;
1339 default:
1340 UNREACHABLE();
1341 break;
1342 }
1343}
1344
1345void SetSurfaceAttrib(Surface *surface, EGLint attribute, EGLint value)
1346{
1347 switch (attribute)
1348 {
1349 case EGL_MIPMAP_LEVEL:
Geoff Lang40ac7832017-07-26 14:38:46 -04001350 surface->setMipmapLevel(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04001351 break;
1352 case EGL_MULTISAMPLE_RESOLVE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001353 surface->setMultisampleResolve(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04001354 break;
1355 case EGL_SWAP_BEHAVIOR:
Geoff Lang40ac7832017-07-26 14:38:46 -04001356 surface->setSwapBehavior(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04001357 break;
1358 default:
1359 UNREACHABLE();
1360 break;
1361 }
1362}
1363
Geoff Lang65603eb2017-01-12 16:48:03 -05001364} // namespace egl