blob: 389f3a525a8b428a702c9f214a9b675810b701c1 [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 Langc1984ed2016-10-07 12:41:00 -040022#include "libANGLE/Texture.h"
Geoff Lang6899b872016-10-14 11:30:13 -040023#include "libANGLE/Uniform.h"
Geoff Lang0b031062016-10-13 14:30:04 -040024#include "libANGLE/VertexAttribute.h"
Geoff Langff5b2d52016-09-07 11:32:23 -040025
26namespace gl
27{
Geoff Langc1984ed2016-10-07 12:41:00 -040028
29namespace
30{
31template <typename ParamType>
He Yunchao11b038b2016-11-22 21:24:04 +080032void QueryTexLevelParameterBase(const Texture *texture,
33 GLenum target,
34 GLint level,
35 GLenum pname,
36 ParamType *params)
37{
38 ASSERT(texture != nullptr);
39 const InternalFormat *info = texture->getTextureState().getImageDesc(target, level).format.info;
40
41 switch (pname)
42 {
43 case GL_TEXTURE_RED_TYPE:
44 *params = ConvertFromGLenum<ParamType>(info->redBits ? info->componentType : GL_NONE);
45 break;
46 case GL_TEXTURE_GREEN_TYPE:
47 *params = ConvertFromGLenum<ParamType>(info->greenBits ? info->componentType : GL_NONE);
48 break;
49 case GL_TEXTURE_BLUE_TYPE:
50 *params = ConvertFromGLenum<ParamType>(info->blueBits ? info->componentType : GL_NONE);
51 break;
52 case GL_TEXTURE_ALPHA_TYPE:
53 *params = ConvertFromGLenum<ParamType>(info->alphaBits ? info->componentType : GL_NONE);
54 break;
55 case GL_TEXTURE_DEPTH_TYPE:
56 *params = ConvertFromGLenum<ParamType>(info->depthBits ? info->componentType : GL_NONE);
57 break;
58 case GL_TEXTURE_RED_SIZE:
59 *params = ConvertFromGLuint<ParamType>(info->redBits);
60 break;
61 case GL_TEXTURE_GREEN_SIZE:
62 *params = ConvertFromGLuint<ParamType>(info->greenBits);
63 break;
64 case GL_TEXTURE_BLUE_SIZE:
65 *params = ConvertFromGLuint<ParamType>(info->blueBits);
66 break;
67 case GL_TEXTURE_ALPHA_SIZE:
68 *params = ConvertFromGLuint<ParamType>(info->alphaBits);
69 break;
70 case GL_TEXTURE_DEPTH_SIZE:
71 *params = ConvertFromGLuint<ParamType>(info->depthBits);
72 break;
73 case GL_TEXTURE_STENCIL_SIZE:
74 *params = ConvertFromGLuint<ParamType>(info->stencilBits);
75 break;
76 case GL_TEXTURE_SHARED_SIZE:
77 *params = ConvertFromGLuint<ParamType>(info->sharedBits);
78 break;
79 case GL_TEXTURE_INTERNAL_FORMAT:
80 *params =
81 ConvertFromGLenum<ParamType>(info->internalFormat ? info->internalFormat : GL_RGBA);
82 break;
83 case GL_TEXTURE_WIDTH:
84 *params =
85 ConvertFromGLint<ParamType>(static_cast<GLint>(texture->getWidth(target, level)));
86 break;
87 case GL_TEXTURE_HEIGHT:
88 *params =
89 ConvertFromGLint<ParamType>(static_cast<GLint>(texture->getHeight(target, level)));
90 break;
91 case GL_TEXTURE_DEPTH:
92 *params =
93 ConvertFromGLint<ParamType>(static_cast<GLint>(texture->getDepth(target, level)));
94 break;
95 case GL_TEXTURE_SAMPLES:
96 *params = ConvertFromGLint<ParamType>(texture->getSamples(target, level));
97 break;
98 case GL_TEXTURE_FIXED_SAMPLE_LOCATIONS:
99 *params =
100 ConvertFromGLboolean<ParamType>(texture->getFixedSampleLocations(target, level));
101 break;
102 case GL_TEXTURE_COMPRESSED:
103 *params = ConvertFromGLboolean<ParamType>(info->compressed);
104 break;
105 default:
106 UNREACHABLE();
107 break;
108 }
109}
110
111template <typename ParamType>
Geoff Langc1984ed2016-10-07 12:41:00 -0400112void QueryTexParameterBase(const Texture *texture, GLenum pname, ParamType *params)
113{
114 ASSERT(texture != nullptr);
115
116 switch (pname)
117 {
118 case GL_TEXTURE_MAG_FILTER:
119 *params = ConvertFromGLenum<ParamType>(texture->getMagFilter());
120 break;
121 case GL_TEXTURE_MIN_FILTER:
122 *params = ConvertFromGLenum<ParamType>(texture->getMinFilter());
123 break;
124 case GL_TEXTURE_WRAP_S:
125 *params = ConvertFromGLenum<ParamType>(texture->getWrapS());
126 break;
127 case GL_TEXTURE_WRAP_T:
128 *params = ConvertFromGLenum<ParamType>(texture->getWrapT());
129 break;
130 case GL_TEXTURE_WRAP_R:
131 *params = ConvertFromGLenum<ParamType>(texture->getWrapR());
132 break;
133 case GL_TEXTURE_IMMUTABLE_FORMAT:
134 *params = ConvertFromGLboolean<ParamType>(texture->getImmutableFormat());
135 break;
136 case GL_TEXTURE_IMMUTABLE_LEVELS:
137 *params = ConvertFromGLuint<ParamType>(texture->getImmutableLevels());
138 break;
139 case GL_TEXTURE_USAGE_ANGLE:
140 *params = ConvertFromGLenum<ParamType>(texture->getUsage());
141 break;
142 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
143 *params = ConvertFromGLfloat<ParamType>(texture->getMaxAnisotropy());
144 break;
145 case GL_TEXTURE_SWIZZLE_R:
146 *params = ConvertFromGLenum<ParamType>(texture->getSwizzleRed());
147 break;
148 case GL_TEXTURE_SWIZZLE_G:
149 *params = ConvertFromGLenum<ParamType>(texture->getSwizzleGreen());
150 break;
151 case GL_TEXTURE_SWIZZLE_B:
152 *params = ConvertFromGLenum<ParamType>(texture->getSwizzleBlue());
153 break;
154 case GL_TEXTURE_SWIZZLE_A:
155 *params = ConvertFromGLenum<ParamType>(texture->getSwizzleAlpha());
156 break;
157 case GL_TEXTURE_BASE_LEVEL:
158 *params = ConvertFromGLuint<ParamType>(texture->getBaseLevel());
159 break;
160 case GL_TEXTURE_MAX_LEVEL:
161 *params = ConvertFromGLuint<ParamType>(texture->getMaxLevel());
162 break;
163 case GL_TEXTURE_MIN_LOD:
164 *params = ConvertFromGLfloat<ParamType>(texture->getSamplerState().minLod);
165 break;
166 case GL_TEXTURE_MAX_LOD:
167 *params = ConvertFromGLfloat<ParamType>(texture->getSamplerState().maxLod);
168 break;
169 case GL_TEXTURE_COMPARE_MODE:
170 *params = ConvertFromGLenum<ParamType>(texture->getCompareMode());
171 break;
172 case GL_TEXTURE_COMPARE_FUNC:
173 *params = ConvertFromGLenum<ParamType>(texture->getCompareFunc());
174 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700175 case GL_TEXTURE_SRGB_DECODE_EXT:
176 *params = ConvertFromGLenum<ParamType>(texture->getSRGBDecode());
177 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400178 default:
179 UNREACHABLE();
180 break;
181 }
182}
183
184template <typename ParamType>
Jamie Madill4928b7c2017-06-20 12:57:39 -0400185void SetTexParameterBase(Context *context, Texture *texture, GLenum pname, const ParamType *params)
Geoff Langc1984ed2016-10-07 12:41:00 -0400186{
187 ASSERT(texture != nullptr);
188
189 switch (pname)
190 {
191 case GL_TEXTURE_WRAP_S:
192 texture->setWrapS(ConvertToGLenum(params[0]));
193 break;
194 case GL_TEXTURE_WRAP_T:
195 texture->setWrapT(ConvertToGLenum(params[0]));
196 break;
197 case GL_TEXTURE_WRAP_R:
198 texture->setWrapR(ConvertToGLenum(params[0]));
199 break;
200 case GL_TEXTURE_MIN_FILTER:
201 texture->setMinFilter(ConvertToGLenum(params[0]));
202 break;
203 case GL_TEXTURE_MAG_FILTER:
204 texture->setMagFilter(ConvertToGLenum(params[0]));
205 break;
206 case GL_TEXTURE_USAGE_ANGLE:
207 texture->setUsage(ConvertToGLenum(params[0]));
208 break;
209 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
210 texture->setMaxAnisotropy(ConvertToGLfloat(params[0]));
211 break;
212 case GL_TEXTURE_COMPARE_MODE:
213 texture->setCompareMode(ConvertToGLenum(params[0]));
214 break;
215 case GL_TEXTURE_COMPARE_FUNC:
216 texture->setCompareFunc(ConvertToGLenum(params[0]));
217 break;
218 case GL_TEXTURE_SWIZZLE_R:
219 texture->setSwizzleRed(ConvertToGLenum(params[0]));
220 break;
221 case GL_TEXTURE_SWIZZLE_G:
222 texture->setSwizzleGreen(ConvertToGLenum(params[0]));
223 break;
224 case GL_TEXTURE_SWIZZLE_B:
225 texture->setSwizzleBlue(ConvertToGLenum(params[0]));
226 break;
227 case GL_TEXTURE_SWIZZLE_A:
228 texture->setSwizzleAlpha(ConvertToGLenum(params[0]));
229 break;
230 case GL_TEXTURE_BASE_LEVEL:
Jamie Madill4928b7c2017-06-20 12:57:39 -0400231 {
232 context->handleError(texture->setBaseLevel(context, ConvertToGLuint(params[0])));
Geoff Langc1984ed2016-10-07 12:41:00 -0400233 break;
Jamie Madill4928b7c2017-06-20 12:57:39 -0400234 }
Geoff Langc1984ed2016-10-07 12:41:00 -0400235 case GL_TEXTURE_MAX_LEVEL:
236 texture->setMaxLevel(ConvertToGLuint(params[0]));
237 break;
238 case GL_TEXTURE_MIN_LOD:
239 texture->setMinLod(ConvertToGLfloat(params[0]));
240 break;
241 case GL_TEXTURE_MAX_LOD:
242 texture->setMaxLod(ConvertToGLfloat(params[0]));
243 break;
Geoff Lang3b573612016-10-31 14:08:10 -0400244 case GL_DEPTH_STENCIL_TEXTURE_MODE:
Geoff Lang9f090372016-12-02 10:20:43 -0500245 texture->setDepthStencilTextureMode(ConvertToGLenum(params[0]));
Geoff Lang3b573612016-10-31 14:08:10 -0400246 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700247 case GL_TEXTURE_SRGB_DECODE_EXT:
248 texture->setSRGBDecode(ConvertToGLenum(params[0]));
249 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400250 default:
251 UNREACHABLE();
252 break;
253 }
254}
255
256template <typename ParamType>
257void QuerySamplerParameterBase(const Sampler *sampler, GLenum pname, ParamType *params)
258{
259 switch (pname)
260 {
261 case GL_TEXTURE_MIN_FILTER:
262 *params = ConvertFromGLenum<ParamType>(sampler->getMinFilter());
263 break;
264 case GL_TEXTURE_MAG_FILTER:
265 *params = ConvertFromGLenum<ParamType>(sampler->getMagFilter());
266 break;
267 case GL_TEXTURE_WRAP_S:
268 *params = ConvertFromGLenum<ParamType>(sampler->getWrapS());
269 break;
270 case GL_TEXTURE_WRAP_T:
271 *params = ConvertFromGLenum<ParamType>(sampler->getWrapT());
272 break;
273 case GL_TEXTURE_WRAP_R:
274 *params = ConvertFromGLenum<ParamType>(sampler->getWrapR());
275 break;
276 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
277 *params = ConvertFromGLfloat<ParamType>(sampler->getMaxAnisotropy());
278 break;
279 case GL_TEXTURE_MIN_LOD:
280 *params = ConvertFromGLfloat<ParamType>(sampler->getMinLod());
281 break;
282 case GL_TEXTURE_MAX_LOD:
283 *params = ConvertFromGLfloat<ParamType>(sampler->getMaxLod());
284 break;
285 case GL_TEXTURE_COMPARE_MODE:
286 *params = ConvertFromGLenum<ParamType>(sampler->getCompareMode());
287 break;
288 case GL_TEXTURE_COMPARE_FUNC:
289 *params = ConvertFromGLenum<ParamType>(sampler->getCompareFunc());
290 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700291 case GL_TEXTURE_SRGB_DECODE_EXT:
292 *params = ConvertFromGLenum<ParamType>(sampler->getSRGBDecode());
293 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400294 default:
295 UNREACHABLE();
296 break;
297 }
298}
299
300template <typename ParamType>
301void SetSamplerParameterBase(Sampler *sampler, GLenum pname, const ParamType *params)
302{
303 switch (pname)
304 {
305 case GL_TEXTURE_WRAP_S:
306 sampler->setWrapS(ConvertToGLenum(params[0]));
307 break;
308 case GL_TEXTURE_WRAP_T:
309 sampler->setWrapT(ConvertToGLenum(params[0]));
310 break;
311 case GL_TEXTURE_WRAP_R:
312 sampler->setWrapR(ConvertToGLenum(params[0]));
313 break;
314 case GL_TEXTURE_MIN_FILTER:
315 sampler->setMinFilter(ConvertToGLenum(params[0]));
316 break;
317 case GL_TEXTURE_MAG_FILTER:
318 sampler->setMagFilter(ConvertToGLenum(params[0]));
319 break;
320 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
321 sampler->setMaxAnisotropy(ConvertToGLfloat(params[0]));
322 break;
323 case GL_TEXTURE_COMPARE_MODE:
324 sampler->setCompareMode(ConvertToGLenum(params[0]));
325 break;
326 case GL_TEXTURE_COMPARE_FUNC:
327 sampler->setCompareFunc(ConvertToGLenum(params[0]));
328 break;
329 case GL_TEXTURE_MIN_LOD:
330 sampler->setMinLod(ConvertToGLfloat(params[0]));
331 break;
332 case GL_TEXTURE_MAX_LOD:
333 sampler->setMaxLod(ConvertToGLfloat(params[0]));
334 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700335 case GL_TEXTURE_SRGB_DECODE_EXT:
336 sampler->setSRGBDecode(ConvertToGLenum(params[0]));
337 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400338 default:
339 UNREACHABLE();
340 break;
341 }
342}
343
Geoff Lang0b031062016-10-13 14:30:04 -0400344template <typename ParamType, typename CurrentDataType>
345ParamType ConvertCurrentValue(CurrentDataType currentValue)
346{
347 return static_cast<ParamType>(currentValue);
348}
349
350template <>
351GLint ConvertCurrentValue(GLfloat currentValue)
352{
353 return iround<GLint>(currentValue);
354}
355
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800356// Warning: you should ensure binding really matches attrib.bindingIndex before using this function.
Geoff Lang0b031062016-10-13 14:30:04 -0400357template <typename ParamType, typename CurrentDataType, size_t CurrentValueCount>
358void QueryVertexAttribBase(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800359 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -0400360 const CurrentDataType (&currentValueData)[CurrentValueCount],
361 GLenum pname,
362 ParamType *params)
363{
364 switch (pname)
365 {
366 case GL_CURRENT_VERTEX_ATTRIB:
367 for (size_t i = 0; i < CurrentValueCount; ++i)
368 {
369 params[i] = ConvertCurrentValue<ParamType>(currentValueData[i]);
370 }
371 break;
372 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
373 *params = ConvertFromGLboolean<ParamType>(attrib.enabled);
374 break;
375 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
376 *params = ConvertFromGLuint<ParamType>(attrib.size);
377 break;
378 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800379 *params = ConvertFromGLuint<ParamType>(attrib.vertexAttribArrayStride);
Geoff Lang0b031062016-10-13 14:30:04 -0400380 break;
381 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
382 *params = ConvertFromGLenum<ParamType>(attrib.type);
383 break;
384 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
385 *params = ConvertFromGLboolean<ParamType>(attrib.normalized);
386 break;
387 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
Martin Radevdd5f27e2017-06-07 10:17:09 +0300388 *params = ConvertFromGLuint<ParamType>(binding.getBuffer().id());
Geoff Lang0b031062016-10-13 14:30:04 -0400389 break;
390 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
Martin Radevdd5f27e2017-06-07 10:17:09 +0300391 *params = ConvertFromGLuint<ParamType>(binding.getDivisor());
Geoff Lang0b031062016-10-13 14:30:04 -0400392 break;
393 case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
394 *params = ConvertFromGLboolean<ParamType>(attrib.pureInteger);
395 break;
Shao80957d92017-02-20 21:25:59 +0800396 case GL_VERTEX_ATTRIB_BINDING:
397 *params = ConvertFromGLuint<ParamType>(attrib.bindingIndex);
398 break;
399 case GL_VERTEX_ATTRIB_RELATIVE_OFFSET:
Shaodde78e82017-05-22 14:13:27 +0800400 *params = ConvertFromGLuint<ParamType>(attrib.relativeOffset);
Shao80957d92017-02-20 21:25:59 +0800401 break;
Geoff Lang0b031062016-10-13 14:30:04 -0400402 default:
403 UNREACHABLE();
404 break;
405 }
406}
407
Geoff Langebebe1c2016-10-14 12:01:31 -0400408template <typename ParamType>
409void QueryBufferParameterBase(const Buffer *buffer, GLenum pname, ParamType *params)
410{
411 ASSERT(buffer != nullptr);
412
413 switch (pname)
414 {
415 case GL_BUFFER_USAGE:
416 *params = ConvertFromGLenum<ParamType>(buffer->getUsage());
417 break;
418 case GL_BUFFER_SIZE:
419 *params = ConvertFromGLint64<ParamType>(buffer->getSize());
420 break;
421 case GL_BUFFER_ACCESS_FLAGS:
422 *params = ConvertFromGLuint<ParamType>(buffer->getAccessFlags());
423 break;
424 case GL_BUFFER_ACCESS_OES:
425 *params = ConvertFromGLenum<ParamType>(buffer->getAccess());
426 break;
427 case GL_BUFFER_MAPPED:
428 *params = ConvertFromGLboolean<ParamType>(buffer->isMapped());
429 break;
430 case GL_BUFFER_MAP_OFFSET:
431 *params = ConvertFromGLint64<ParamType>(buffer->getMapOffset());
432 break;
433 case GL_BUFFER_MAP_LENGTH:
434 *params = ConvertFromGLint64<ParamType>(buffer->getMapLength());
435 break;
436 default:
437 UNREACHABLE();
438 break;
439 }
440}
441
Geoff Langc1984ed2016-10-07 12:41:00 -0400442} // anonymous namespace
443
Geoff Langff5b2d52016-09-07 11:32:23 -0400444void QueryFramebufferAttachmentParameteriv(const Framebuffer *framebuffer,
445 GLenum attachment,
446 GLenum pname,
447 GLint *params)
448{
449 ASSERT(framebuffer);
450
451 const FramebufferAttachment *attachmentObject = framebuffer->getAttachment(attachment);
452 if (attachmentObject == nullptr)
453 {
454 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
455 // is NONE, then querying any other pname will generate INVALID_ENUM.
456
457 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
458 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
459 // INVALID_OPERATION for all other pnames
460
461 switch (pname)
462 {
463 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
464 *params = GL_NONE;
465 break;
466
467 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
468 *params = 0;
469 break;
470
471 default:
472 UNREACHABLE();
473 break;
474 }
475
476 return;
477 }
478
479 switch (pname)
480 {
481 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
482 *params = attachmentObject->type();
483 break;
484
485 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
486 *params = attachmentObject->id();
487 break;
488
489 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
490 *params = attachmentObject->mipLevel();
491 break;
492
493 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
494 *params = attachmentObject->cubeMapFace();
495 break;
496
497 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
498 *params = attachmentObject->getRedSize();
499 break;
500
501 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
502 *params = attachmentObject->getGreenSize();
503 break;
504
505 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
506 *params = attachmentObject->getBlueSize();
507 break;
508
509 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
510 *params = attachmentObject->getAlphaSize();
511 break;
512
513 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
514 *params = attachmentObject->getDepthSize();
515 break;
516
517 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
518 *params = attachmentObject->getStencilSize();
519 break;
520
521 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
522 *params = attachmentObject->getComponentType();
523 break;
524
525 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
526 *params = attachmentObject->getColorEncoding();
527 break;
528
529 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
530 *params = attachmentObject->layer();
531 break;
532
Martin Radeve5285d22017-07-14 16:23:53 +0300533 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_ANGLE:
534 *params = attachmentObject->getNumViews();
535 break;
536
537 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_MULTIVIEW_LAYOUT_ANGLE:
538 *params = static_cast<GLint>(attachmentObject->getMultiviewLayout());
539 break;
540
541 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_ANGLE:
542 *params = attachmentObject->getBaseViewIndex();
543 break;
544
545 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_VIEWPORT_OFFSETS_ANGLE:
546 {
547 const std::vector<Offset> &offsets = attachmentObject->getMultiviewViewportOffsets();
548 for (size_t i = 0u; i < offsets.size(); ++i)
549 {
550 params[i * 2u] = offsets[i].x;
551 params[i * 2u + 1u] = offsets[i].y;
552 }
553 }
554 break;
555
Geoff Langff5b2d52016-09-07 11:32:23 -0400556 default:
557 UNREACHABLE();
558 break;
559 }
560}
561
562void QueryBufferParameteriv(const Buffer *buffer, GLenum pname, GLint *params)
563{
Geoff Langebebe1c2016-10-14 12:01:31 -0400564 QueryBufferParameterBase(buffer, pname, params);
565}
Geoff Langff5b2d52016-09-07 11:32:23 -0400566
Geoff Langebebe1c2016-10-14 12:01:31 -0400567void QueryBufferParameteri64v(const Buffer *buffer, GLenum pname, GLint64 *params)
568{
569 QueryBufferParameterBase(buffer, pname, params);
Geoff Langff5b2d52016-09-07 11:32:23 -0400570}
571
Geoff Lang496c02d2016-10-20 11:38:11 -0700572void QueryBufferPointerv(const Buffer *buffer, GLenum pname, void **params)
573{
574 switch (pname)
575 {
576 case GL_BUFFER_MAP_POINTER:
577 *params = buffer->getMapPointer();
578 break;
579
580 default:
581 UNREACHABLE();
582 break;
583 }
584}
585
Jamie Madillffe00c02017-06-27 16:26:55 -0400586void QueryProgramiv(const Context *context, const Program *program, GLenum pname, GLint *params)
Geoff Langff5b2d52016-09-07 11:32:23 -0400587{
588 ASSERT(program != nullptr);
589
590 switch (pname)
591 {
592 case GL_DELETE_STATUS:
593 *params = program->isFlaggedForDeletion();
594 return;
595 case GL_LINK_STATUS:
596 *params = program->isLinked();
597 return;
598 case GL_VALIDATE_STATUS:
599 *params = program->isValidated();
600 return;
601 case GL_INFO_LOG_LENGTH:
602 *params = program->getInfoLogLength();
603 return;
604 case GL_ATTACHED_SHADERS:
605 *params = program->getAttachedShadersCount();
606 return;
607 case GL_ACTIVE_ATTRIBUTES:
608 *params = program->getActiveAttributeCount();
609 return;
610 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
611 *params = program->getActiveAttributeMaxLength();
612 return;
613 case GL_ACTIVE_UNIFORMS:
614 *params = program->getActiveUniformCount();
615 return;
616 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
617 *params = program->getActiveUniformMaxLength();
618 return;
619 case GL_PROGRAM_BINARY_LENGTH_OES:
Jamie Madillffe00c02017-06-27 16:26:55 -0400620 *params = program->getBinaryLength(context);
Geoff Langff5b2d52016-09-07 11:32:23 -0400621 return;
622 case GL_ACTIVE_UNIFORM_BLOCKS:
623 *params = program->getActiveUniformBlockCount();
624 return;
625 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
626 *params = program->getActiveUniformBlockMaxLength();
627 break;
628 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
629 *params = program->getTransformFeedbackBufferMode();
630 break;
631 case GL_TRANSFORM_FEEDBACK_VARYINGS:
632 *params = program->getTransformFeedbackVaryingCount();
633 break;
634 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
635 *params = program->getTransformFeedbackVaryingMaxLength();
636 break;
637 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
638 *params = program->getBinaryRetrievableHint();
639 break;
Yunchao He61afff12017-03-14 15:34:03 +0800640 case GL_PROGRAM_SEPARABLE:
641 *params = program->isSeparable();
642 break;
Geoff Langff5b2d52016-09-07 11:32:23 -0400643 default:
644 UNREACHABLE();
645 break;
646 }
647}
Geoff Lang740d9022016-10-07 11:20:52 -0400648
Jamie Madill4e0e6f82017-02-17 11:06:03 -0500649void QueryRenderbufferiv(const Context *context,
650 const Renderbuffer *renderbuffer,
651 GLenum pname,
652 GLint *params)
Geoff Lang740d9022016-10-07 11:20:52 -0400653{
654 ASSERT(renderbuffer != nullptr);
655
656 switch (pname)
657 {
658 case GL_RENDERBUFFER_WIDTH:
659 *params = renderbuffer->getWidth();
660 break;
661 case GL_RENDERBUFFER_HEIGHT:
662 *params = renderbuffer->getHeight();
663 break;
664 case GL_RENDERBUFFER_INTERNAL_FORMAT:
Jamie Madill4e0e6f82017-02-17 11:06:03 -0500665 // Special case the WebGL 1 DEPTH_STENCIL format.
Jamie Madilla02315b2017-02-23 14:14:47 -0500666 if (context->isWebGL1() &&
Jamie Madill4e0e6f82017-02-17 11:06:03 -0500667 renderbuffer->getFormat().info->internalFormat == GL_DEPTH24_STENCIL8)
668 {
669 *params = GL_DEPTH_STENCIL;
670 }
671 else
672 {
673 *params = renderbuffer->getFormat().info->internalFormat;
674 }
Geoff Lang740d9022016-10-07 11:20:52 -0400675 break;
676 case GL_RENDERBUFFER_RED_SIZE:
677 *params = renderbuffer->getRedSize();
678 break;
679 case GL_RENDERBUFFER_GREEN_SIZE:
680 *params = renderbuffer->getGreenSize();
681 break;
682 case GL_RENDERBUFFER_BLUE_SIZE:
683 *params = renderbuffer->getBlueSize();
684 break;
685 case GL_RENDERBUFFER_ALPHA_SIZE:
686 *params = renderbuffer->getAlphaSize();
687 break;
688 case GL_RENDERBUFFER_DEPTH_SIZE:
689 *params = renderbuffer->getDepthSize();
690 break;
691 case GL_RENDERBUFFER_STENCIL_SIZE:
692 *params = renderbuffer->getStencilSize();
693 break;
694 case GL_RENDERBUFFER_SAMPLES_ANGLE:
695 *params = renderbuffer->getSamples();
696 break;
697 default:
698 UNREACHABLE();
699 break;
700 }
701}
Geoff Langd7d0ed32016-10-07 11:33:51 -0400702
Jamie Madillbd044ed2017-06-05 12:59:21 -0400703void QueryShaderiv(const Context *context, Shader *shader, GLenum pname, GLint *params)
Geoff Langd7d0ed32016-10-07 11:33:51 -0400704{
705 ASSERT(shader != nullptr);
706
707 switch (pname)
708 {
709 case GL_SHADER_TYPE:
710 *params = shader->getType();
711 return;
712 case GL_DELETE_STATUS:
713 *params = shader->isFlaggedForDeletion();
714 return;
715 case GL_COMPILE_STATUS:
Jamie Madillbd044ed2017-06-05 12:59:21 -0400716 *params = shader->isCompiled(context) ? GL_TRUE : GL_FALSE;
Geoff Langd7d0ed32016-10-07 11:33:51 -0400717 return;
718 case GL_INFO_LOG_LENGTH:
Jamie Madillbd044ed2017-06-05 12:59:21 -0400719 *params = shader->getInfoLogLength(context);
Geoff Langd7d0ed32016-10-07 11:33:51 -0400720 return;
721 case GL_SHADER_SOURCE_LENGTH:
722 *params = shader->getSourceLength();
723 return;
724 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
Jamie Madillbd044ed2017-06-05 12:59:21 -0400725 *params = shader->getTranslatedSourceWithDebugInfoLength(context);
Geoff Langd7d0ed32016-10-07 11:33:51 -0400726 return;
727 default:
728 UNREACHABLE();
729 break;
730 }
731}
Geoff Langc1984ed2016-10-07 12:41:00 -0400732
He Yunchao11b038b2016-11-22 21:24:04 +0800733void QueryTexLevelParameterfv(const Texture *texture,
734 GLenum target,
735 GLint level,
736 GLenum pname,
737 GLfloat *params)
738{
739 QueryTexLevelParameterBase(texture, target, level, pname, params);
740}
741
742void QueryTexLevelParameteriv(const Texture *texture,
743 GLenum target,
744 GLint level,
745 GLenum pname,
746 GLint *params)
747{
748 QueryTexLevelParameterBase(texture, target, level, pname, params);
749}
750
Geoff Langc1984ed2016-10-07 12:41:00 -0400751void QueryTexParameterfv(const Texture *texture, GLenum pname, GLfloat *params)
752{
753 QueryTexParameterBase(texture, pname, params);
754}
755
756void QueryTexParameteriv(const Texture *texture, GLenum pname, GLint *params)
757{
758 QueryTexParameterBase(texture, pname, params);
759}
760
761void QuerySamplerParameterfv(const Sampler *sampler, GLenum pname, GLfloat *params)
762{
763 QuerySamplerParameterBase(sampler, pname, params);
764}
765
766void QuerySamplerParameteriv(const Sampler *sampler, GLenum pname, GLint *params)
767{
768 QuerySamplerParameterBase(sampler, pname, params);
769}
770
Geoff Lang0b031062016-10-13 14:30:04 -0400771void QueryVertexAttribfv(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 GLfloat *params)
776{
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800777 QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -0400778}
779
780void QueryVertexAttribiv(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 GLint *params)
785{
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800786 QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -0400787}
788
Jamie Madill876429b2017-04-20 15:46:24 -0400789void QueryVertexAttribPointerv(const VertexAttribute &attrib, GLenum pname, void **pointer)
Geoff Lang0b031062016-10-13 14:30:04 -0400790{
791 switch (pname)
792 {
793 case GL_VERTEX_ATTRIB_ARRAY_POINTER:
Jamie Madill876429b2017-04-20 15:46:24 -0400794 *pointer = const_cast<void *>(attrib.pointer);
Geoff Lang0b031062016-10-13 14:30:04 -0400795 break;
796
797 default:
798 UNREACHABLE();
799 break;
800 }
801}
802
803void QueryVertexAttribIiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800804 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -0400805 const VertexAttribCurrentValueData &currentValueData,
806 GLenum pname,
807 GLint *params)
808{
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800809 QueryVertexAttribBase(attrib, binding, currentValueData.IntValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -0400810}
811
812void QueryVertexAttribIuiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800813 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -0400814 const VertexAttribCurrentValueData &currentValueData,
815 GLenum pname,
816 GLuint *params)
817{
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800818 QueryVertexAttribBase(attrib, binding, currentValueData.UnsignedIntValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -0400819}
820
Geoff Lang6899b872016-10-14 11:30:13 -0400821void QueryActiveUniformBlockiv(const Program *program,
822 GLuint uniformBlockIndex,
823 GLenum pname,
824 GLint *params)
825{
826 const UniformBlock &uniformBlock = program->getUniformBlockByIndex(uniformBlockIndex);
827 switch (pname)
828 {
829 case GL_UNIFORM_BLOCK_BINDING:
830 *params = ConvertToGLint(program->getUniformBlockBinding(uniformBlockIndex));
831 break;
832 case GL_UNIFORM_BLOCK_DATA_SIZE:
833 *params = ConvertToGLint(uniformBlock.dataSize);
834 break;
835 case GL_UNIFORM_BLOCK_NAME_LENGTH:
836 *params = ConvertToGLint(uniformBlock.nameWithArrayIndex().size() + 1);
837 break;
838 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
jchen10eaef1e52017-06-13 10:44:11 +0800839 *params = ConvertToGLint(uniformBlock.memberIndexes.size());
Geoff Lang6899b872016-10-14 11:30:13 -0400840 break;
841 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
jchen10eaef1e52017-06-13 10:44:11 +0800842 for (size_t blockMemberIndex = 0; blockMemberIndex < uniformBlock.memberIndexes.size();
843 blockMemberIndex++)
Geoff Lang6899b872016-10-14 11:30:13 -0400844 {
845 params[blockMemberIndex] =
jchen10eaef1e52017-06-13 10:44:11 +0800846 ConvertToGLint(uniformBlock.memberIndexes[blockMemberIndex]);
Geoff Lang6899b872016-10-14 11:30:13 -0400847 }
848 break;
849 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
850 *params = ConvertToGLint(uniformBlock.vertexStaticUse);
851 break;
852 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
853 *params = ConvertToGLint(uniformBlock.fragmentStaticUse);
854 break;
855 default:
856 UNREACHABLE();
857 break;
858 }
859}
860
Geoff Lang0a9661f2016-10-20 10:59:20 -0700861void QueryInternalFormativ(const TextureCaps &format, GLenum pname, GLsizei bufSize, GLint *params)
862{
863 switch (pname)
864 {
865 case GL_NUM_SAMPLE_COUNTS:
866 if (bufSize != 0)
867 {
868 *params = static_cast<GLint>(format.sampleCounts.size());
869 }
870 break;
871
872 case GL_SAMPLES:
873 {
874 size_t returnCount = std::min<size_t>(bufSize, format.sampleCounts.size());
875 auto sampleReverseIt = format.sampleCounts.rbegin();
876 for (size_t sampleIndex = 0; sampleIndex < returnCount; ++sampleIndex)
877 {
878 params[sampleIndex] = *sampleReverseIt++;
879 }
880 }
881 break;
882
883 default:
884 UNREACHABLE();
885 break;
886 }
887}
888
JiangYizhouf7bbc8a2016-11-16 09:57:22 +0800889void QueryFramebufferParameteriv(const Framebuffer *framebuffer, GLenum pname, GLint *params)
890{
891 ASSERT(framebuffer);
892
893 switch (pname)
894 {
895 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
896 *params = framebuffer->getDefaultWidth();
897 break;
898 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
899 *params = framebuffer->getDefaultHeight();
900 break;
901 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
902 *params = framebuffer->getDefaultSamples();
903 break;
904 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
905 *params = framebuffer->getDefaultFixedSampleLocations();
906 break;
907 default:
908 UNREACHABLE();
909 break;
910 }
911}
912
Geoff Lang82483b92017-04-11 15:33:00 -0400913Error QuerySynciv(const FenceSync *sync,
914 GLenum pname,
915 GLsizei bufSize,
916 GLsizei *length,
917 GLint *values)
Geoff Lang38f2cfb2017-04-11 15:23:08 -0400918{
919 ASSERT(sync);
920
Geoff Lang82483b92017-04-11 15:33:00 -0400921 // All queries return one value, exit early if the buffer can't fit anything.
922 if (bufSize < 1)
923 {
924 if (length != nullptr)
925 {
926 *length = 0;
927 }
928 return NoError();
929 }
930
Geoff Lang38f2cfb2017-04-11 15:23:08 -0400931 switch (pname)
932 {
933 case GL_OBJECT_TYPE:
934 *values = ConvertToGLint(GL_SYNC_FENCE);
935 break;
936 case GL_SYNC_CONDITION:
937 *values = ConvertToGLint(sync->getCondition());
938 break;
939 case GL_SYNC_FLAGS:
940 *values = ConvertToGLint(sync->getFlags());
941 break;
942 case GL_SYNC_STATUS:
943 ANGLE_TRY(sync->getStatus(values));
944 break;
945
946 default:
947 UNREACHABLE();
948 break;
949 }
950
Geoff Lang82483b92017-04-11 15:33:00 -0400951 if (length != nullptr)
952 {
953 *length = 1;
954 }
955
Geoff Lang38f2cfb2017-04-11 15:23:08 -0400956 return NoError();
957}
958
Jamie Madill4928b7c2017-06-20 12:57:39 -0400959void SetTexParameterf(Context *context, Texture *texture, GLenum pname, GLfloat param)
Geoff Langc1984ed2016-10-07 12:41:00 -0400960{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400961 SetTexParameterBase(context, texture, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -0400962}
963
Jamie Madill4928b7c2017-06-20 12:57:39 -0400964void SetTexParameterfv(Context *context, Texture *texture, GLenum pname, const GLfloat *params)
Geoff Langc1984ed2016-10-07 12:41:00 -0400965{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400966 SetTexParameterBase(context, texture, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -0400967}
968
Jamie Madill4928b7c2017-06-20 12:57:39 -0400969void SetTexParameteri(Context *context, Texture *texture, GLenum pname, GLint param)
Geoff Langc1984ed2016-10-07 12:41:00 -0400970{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400971 SetTexParameterBase(context, texture, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -0400972}
973
Jamie Madill4928b7c2017-06-20 12:57:39 -0400974void SetTexParameteriv(Context *context, Texture *texture, GLenum pname, const GLint *params)
Geoff Langc1984ed2016-10-07 12:41:00 -0400975{
Jamie Madill4928b7c2017-06-20 12:57:39 -0400976 SetTexParameterBase(context, texture, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -0400977}
978
979void SetSamplerParameterf(Sampler *sampler, GLenum pname, GLfloat param)
980{
981 SetSamplerParameterBase(sampler, pname, &param);
982}
983
984void SetSamplerParameterfv(Sampler *sampler, GLenum pname, const GLfloat *params)
985{
986 SetSamplerParameterBase(sampler, pname, params);
987}
988
989void SetSamplerParameteri(Sampler *sampler, GLenum pname, GLint param)
990{
991 SetSamplerParameterBase(sampler, pname, &param);
992}
993
994void SetSamplerParameteriv(Sampler *sampler, GLenum pname, const GLint *params)
995{
996 SetSamplerParameterBase(sampler, pname, params);
997}
Geoff Lang65603eb2017-01-12 16:48:03 -0500998
JiangYizhouf7bbc8a2016-11-16 09:57:22 +0800999void SetFramebufferParameteri(Framebuffer *framebuffer, GLenum pname, GLint param)
1000{
1001 ASSERT(framebuffer);
1002
1003 switch (pname)
1004 {
1005 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
1006 framebuffer->setDefaultWidth(param);
1007 break;
1008 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
1009 framebuffer->setDefaultHeight(param);
1010 break;
1011 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
1012 framebuffer->setDefaultSamples(param);
1013 break;
1014 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
1015 framebuffer->setDefaultFixedSampleLocations(static_cast<GLboolean>(param));
1016 break;
1017 default:
1018 UNREACHABLE();
1019 break;
1020 }
1021}
1022
Yunchao He61afff12017-03-14 15:34:03 +08001023void SetProgramParameteri(Program *program, GLenum pname, GLint value)
1024{
1025 ASSERT(program);
1026
1027 switch (pname)
1028 {
1029 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
1030 program->setBinaryRetrievableHint(value != GL_FALSE);
1031 break;
1032 case GL_PROGRAM_SEPARABLE:
1033 program->setSeparable(value != GL_FALSE);
1034 break;
1035 default:
1036 UNREACHABLE();
1037 break;
1038 }
1039}
1040
jchen1015015f72017-03-16 13:54:21 +08001041GLuint QueryProgramResourceIndex(const Program *program,
1042 GLenum programInterface,
1043 const GLchar *name)
1044{
1045 switch (programInterface)
1046 {
1047 case GL_PROGRAM_INPUT:
1048 return program->getInputResourceIndex(name);
1049
1050 case GL_PROGRAM_OUTPUT:
1051 return program->getOutputResourceIndex(name);
1052
jchen10191381f2017-04-11 13:59:04 +08001053 // TODO(jie.a.chen@intel.com): more interfaces.
jchen1015015f72017-03-16 13:54:21 +08001054 case GL_UNIFORM:
1055 case GL_UNIFORM_BLOCK:
1056 case GL_TRANSFORM_FEEDBACK_VARYING:
1057 case GL_BUFFER_VARIABLE:
1058 case GL_SHADER_STORAGE_BLOCK:
1059 UNIMPLEMENTED();
1060 return GL_INVALID_INDEX;
1061
1062 default:
1063 UNREACHABLE();
1064 return GL_INVALID_INDEX;
1065 }
1066}
1067
jchen10fd7c3b52017-03-21 15:36:03 +08001068void QueryProgramResourceName(const Program *program,
1069 GLenum programInterface,
1070 GLuint index,
1071 GLsizei bufSize,
1072 GLsizei *length,
1073 GLchar *name)
1074{
1075 switch (programInterface)
1076 {
1077 case GL_PROGRAM_INPUT:
1078 program->getInputResourceName(index, bufSize, length, name);
1079 break;
1080
1081 case GL_PROGRAM_OUTPUT:
1082 program->getOutputResourceName(index, bufSize, length, name);
1083 break;
1084
jchen10191381f2017-04-11 13:59:04 +08001085 // TODO(jie.a.chen@intel.com): more interfaces.
jchen10fd7c3b52017-03-21 15:36:03 +08001086 case GL_UNIFORM:
1087 case GL_UNIFORM_BLOCK:
1088 case GL_TRANSFORM_FEEDBACK_VARYING:
1089 case GL_BUFFER_VARIABLE:
1090 case GL_SHADER_STORAGE_BLOCK:
1091 UNIMPLEMENTED();
1092 break;
1093
1094 default:
1095 UNREACHABLE();
1096 }
1097}
1098
jchen10191381f2017-04-11 13:59:04 +08001099GLint QueryProgramResourceLocation(const Program *program,
1100 GLenum programInterface,
1101 const GLchar *name)
1102{
1103 switch (programInterface)
1104 {
1105 case GL_PROGRAM_INPUT:
1106 return program->getAttributeLocation(name);
1107
1108 case GL_PROGRAM_OUTPUT:
1109 return program->getFragDataLocation(name);
1110
1111 // TODO(jie.a.chen@intel.com): more interfaces.
1112 case GL_UNIFORM:
1113 case GL_UNIFORM_BLOCK:
1114 case GL_TRANSFORM_FEEDBACK_VARYING:
1115 case GL_BUFFER_VARIABLE:
1116 case GL_SHADER_STORAGE_BLOCK:
1117 UNIMPLEMENTED();
1118 return -1;
1119
1120 default:
1121 UNREACHABLE();
1122 return -1;
1123 }
1124}
1125
Geoff Lang65603eb2017-01-12 16:48:03 -05001126} // namespace gl
1127
1128namespace egl
1129{
1130
1131void QueryConfigAttrib(const Config *config, EGLint attribute, EGLint *value)
1132{
1133 ASSERT(config != nullptr);
1134 switch (attribute)
1135 {
1136 case EGL_BUFFER_SIZE:
1137 *value = config->bufferSize;
1138 break;
1139 case EGL_ALPHA_SIZE:
1140 *value = config->alphaSize;
1141 break;
1142 case EGL_BLUE_SIZE:
1143 *value = config->blueSize;
1144 break;
1145 case EGL_GREEN_SIZE:
1146 *value = config->greenSize;
1147 break;
1148 case EGL_RED_SIZE:
1149 *value = config->redSize;
1150 break;
1151 case EGL_DEPTH_SIZE:
1152 *value = config->depthSize;
1153 break;
1154 case EGL_STENCIL_SIZE:
1155 *value = config->stencilSize;
1156 break;
1157 case EGL_CONFIG_CAVEAT:
1158 *value = config->configCaveat;
1159 break;
1160 case EGL_CONFIG_ID:
1161 *value = config->configID;
1162 break;
1163 case EGL_LEVEL:
1164 *value = config->level;
1165 break;
1166 case EGL_NATIVE_RENDERABLE:
1167 *value = config->nativeRenderable;
1168 break;
1169 case EGL_NATIVE_VISUAL_ID:
1170 *value = config->nativeVisualID;
1171 break;
1172 case EGL_NATIVE_VISUAL_TYPE:
1173 *value = config->nativeVisualType;
1174 break;
1175 case EGL_SAMPLES:
1176 *value = config->samples;
1177 break;
1178 case EGL_SAMPLE_BUFFERS:
1179 *value = config->sampleBuffers;
1180 break;
1181 case EGL_SURFACE_TYPE:
1182 *value = config->surfaceType;
1183 break;
1184 case EGL_TRANSPARENT_TYPE:
1185 *value = config->transparentType;
1186 break;
1187 case EGL_TRANSPARENT_BLUE_VALUE:
1188 *value = config->transparentBlueValue;
1189 break;
1190 case EGL_TRANSPARENT_GREEN_VALUE:
1191 *value = config->transparentGreenValue;
1192 break;
1193 case EGL_TRANSPARENT_RED_VALUE:
1194 *value = config->transparentRedValue;
1195 break;
1196 case EGL_BIND_TO_TEXTURE_RGB:
1197 *value = config->bindToTextureRGB;
1198 break;
1199 case EGL_BIND_TO_TEXTURE_RGBA:
1200 *value = config->bindToTextureRGBA;
1201 break;
1202 case EGL_MIN_SWAP_INTERVAL:
1203 *value = config->minSwapInterval;
1204 break;
1205 case EGL_MAX_SWAP_INTERVAL:
1206 *value = config->maxSwapInterval;
1207 break;
1208 case EGL_LUMINANCE_SIZE:
1209 *value = config->luminanceSize;
1210 break;
1211 case EGL_ALPHA_MASK_SIZE:
1212 *value = config->alphaMaskSize;
1213 break;
1214 case EGL_COLOR_BUFFER_TYPE:
1215 *value = config->colorBufferType;
1216 break;
1217 case EGL_RENDERABLE_TYPE:
1218 *value = config->renderableType;
1219 break;
1220 case EGL_MATCH_NATIVE_PIXMAP:
1221 *value = false;
1222 UNIMPLEMENTED();
1223 break;
1224 case EGL_CONFORMANT:
1225 *value = config->conformant;
1226 break;
1227 case EGL_MAX_PBUFFER_WIDTH:
1228 *value = config->maxPBufferWidth;
1229 break;
1230 case EGL_MAX_PBUFFER_HEIGHT:
1231 *value = config->maxPBufferHeight;
1232 break;
1233 case EGL_MAX_PBUFFER_PIXELS:
1234 *value = config->maxPBufferPixels;
1235 break;
1236 case EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE:
1237 *value = config->optimalOrientation;
1238 break;
Geoff Langc5a2a172017-01-13 15:55:07 -05001239 case EGL_COLOR_COMPONENT_TYPE_EXT:
1240 *value = config->colorComponentType;
1241 break;
Geoff Lang65603eb2017-01-12 16:48:03 -05001242 default:
1243 UNREACHABLE();
1244 break;
1245 }
Geoff Langff5b2d52016-09-07 11:32:23 -04001246}
Geoff Lang65603eb2017-01-12 16:48:03 -05001247
1248} // namespace egl