blob: ea1306179e51f56ab230aa2890e81e63c513c80e [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
jchen10880683b2017-04-12 16:21:55 +0800443GLint GetLocationVariableProperty(const sh::VariableWithLocation &var, GLenum prop)
444{
445 switch (prop)
446 {
447 case GL_TYPE:
448 return var.type;
449
450 case GL_ARRAY_SIZE:
451 // TODO(jie.a.chen@intel.com): check array of array.
452 if (var.isArray() && !var.isStruct())
453 {
454 return static_cast<GLint>(var.elementCount());
455 }
456 return 1;
457
458 case GL_NAME_LENGTH:
459 {
460 GLint length = static_cast<GLint>(var.name.size());
461 if (var.isArray())
462 {
463 // Counts "[0]".
464 length += 3;
465 }
466 // ES31 spec p84: This counts the terminating null char.
467 ++length;
468 return length;
469 }
470
471 case GL_LOCATION:
472 return var.location;
473
474 default:
475 UNREACHABLE();
476 return GL_INVALID_VALUE;
477 }
478}
479
480GLint GetInputResourceProperty(const Program *program, GLuint index, GLenum prop)
481{
482 const auto &attribute = program->getInputResource(index);
483 switch (prop)
484 {
485 case GL_TYPE:
486 case GL_ARRAY_SIZE:
487 case GL_LOCATION:
488 case GL_NAME_LENGTH:
489 return GetLocationVariableProperty(attribute, prop);
490
491 case GL_REFERENCED_BY_VERTEX_SHADER:
492 return 1;
493
494 case GL_REFERENCED_BY_FRAGMENT_SHADER:
495 case GL_REFERENCED_BY_COMPUTE_SHADER:
496 return 0;
497
498 default:
499 UNREACHABLE();
500 return GL_INVALID_VALUE;
501 }
502}
503
504GLint GetOutputResourceProperty(const Program *program, GLuint index, const GLenum prop)
505{
506 const auto &outputVariable = program->getOutputResource(index);
507 switch (prop)
508 {
509 case GL_TYPE:
510 case GL_ARRAY_SIZE:
511 case GL_LOCATION:
512 case GL_NAME_LENGTH:
513 return GetLocationVariableProperty(outputVariable, prop);
514
515 case GL_REFERENCED_BY_VERTEX_SHADER:
516 return 0;
517
518 case GL_REFERENCED_BY_FRAGMENT_SHADER:
519 return 1;
520
521 case GL_REFERENCED_BY_COMPUTE_SHADER:
522 return 0;
523
524 default:
525 UNREACHABLE();
526 return GL_INVALID_VALUE;
527 }
528}
529
Geoff Langc1984ed2016-10-07 12:41:00 -0400530} // anonymous namespace
531
Geoff Langff5b2d52016-09-07 11:32:23 -0400532void QueryFramebufferAttachmentParameteriv(const Framebuffer *framebuffer,
533 GLenum attachment,
534 GLenum pname,
535 GLint *params)
536{
537 ASSERT(framebuffer);
538
539 const FramebufferAttachment *attachmentObject = framebuffer->getAttachment(attachment);
540 if (attachmentObject == nullptr)
541 {
542 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
543 // is NONE, then querying any other pname will generate INVALID_ENUM.
544
545 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
546 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
547 // INVALID_OPERATION for all other pnames
548
549 switch (pname)
550 {
551 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
552 *params = GL_NONE;
553 break;
554
555 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
556 *params = 0;
557 break;
558
559 default:
560 UNREACHABLE();
561 break;
562 }
563
564 return;
565 }
566
567 switch (pname)
568 {
569 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
570 *params = attachmentObject->type();
571 break;
572
573 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
574 *params = attachmentObject->id();
575 break;
576
577 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
578 *params = attachmentObject->mipLevel();
579 break;
580
581 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
582 *params = attachmentObject->cubeMapFace();
583 break;
584
585 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
586 *params = attachmentObject->getRedSize();
587 break;
588
589 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
590 *params = attachmentObject->getGreenSize();
591 break;
592
593 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
594 *params = attachmentObject->getBlueSize();
595 break;
596
597 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
598 *params = attachmentObject->getAlphaSize();
599 break;
600
601 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
602 *params = attachmentObject->getDepthSize();
603 break;
604
605 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
606 *params = attachmentObject->getStencilSize();
607 break;
608
609 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
610 *params = attachmentObject->getComponentType();
611 break;
612
613 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
614 *params = attachmentObject->getColorEncoding();
615 break;
616
617 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
618 *params = attachmentObject->layer();
619 break;
620
Martin Radeve5285d22017-07-14 16:23:53 +0300621 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_ANGLE:
622 *params = attachmentObject->getNumViews();
623 break;
624
625 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_MULTIVIEW_LAYOUT_ANGLE:
626 *params = static_cast<GLint>(attachmentObject->getMultiviewLayout());
627 break;
628
629 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_ANGLE:
630 *params = attachmentObject->getBaseViewIndex();
631 break;
632
633 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_VIEWPORT_OFFSETS_ANGLE:
634 {
635 const std::vector<Offset> &offsets = attachmentObject->getMultiviewViewportOffsets();
636 for (size_t i = 0u; i < offsets.size(); ++i)
637 {
638 params[i * 2u] = offsets[i].x;
639 params[i * 2u + 1u] = offsets[i].y;
640 }
641 }
642 break;
643
Geoff Langff5b2d52016-09-07 11:32:23 -0400644 default:
645 UNREACHABLE();
646 break;
647 }
648}
649
650void QueryBufferParameteriv(const Buffer *buffer, GLenum pname, GLint *params)
651{
Geoff Langebebe1c2016-10-14 12:01:31 -0400652 QueryBufferParameterBase(buffer, pname, params);
653}
Geoff Langff5b2d52016-09-07 11:32:23 -0400654
Geoff Langebebe1c2016-10-14 12:01:31 -0400655void QueryBufferParameteri64v(const Buffer *buffer, GLenum pname, GLint64 *params)
656{
657 QueryBufferParameterBase(buffer, pname, params);
Geoff Langff5b2d52016-09-07 11:32:23 -0400658}
659
Geoff Lang496c02d2016-10-20 11:38:11 -0700660void QueryBufferPointerv(const Buffer *buffer, GLenum pname, void **params)
661{
662 switch (pname)
663 {
664 case GL_BUFFER_MAP_POINTER:
665 *params = buffer->getMapPointer();
666 break;
667
668 default:
669 UNREACHABLE();
670 break;
671 }
672}
673
Jamie Madillffe00c02017-06-27 16:26:55 -0400674void QueryProgramiv(const Context *context, const Program *program, GLenum pname, GLint *params)
Geoff Langff5b2d52016-09-07 11:32:23 -0400675{
676 ASSERT(program != nullptr);
677
678 switch (pname)
679 {
680 case GL_DELETE_STATUS:
681 *params = program->isFlaggedForDeletion();
682 return;
683 case GL_LINK_STATUS:
684 *params = program->isLinked();
685 return;
686 case GL_VALIDATE_STATUS:
687 *params = program->isValidated();
688 return;
689 case GL_INFO_LOG_LENGTH:
690 *params = program->getInfoLogLength();
691 return;
692 case GL_ATTACHED_SHADERS:
693 *params = program->getAttachedShadersCount();
694 return;
695 case GL_ACTIVE_ATTRIBUTES:
696 *params = program->getActiveAttributeCount();
697 return;
698 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
699 *params = program->getActiveAttributeMaxLength();
700 return;
701 case GL_ACTIVE_UNIFORMS:
702 *params = program->getActiveUniformCount();
703 return;
704 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
705 *params = program->getActiveUniformMaxLength();
706 return;
707 case GL_PROGRAM_BINARY_LENGTH_OES:
Jamie Madillffe00c02017-06-27 16:26:55 -0400708 *params = program->getBinaryLength(context);
Geoff Langff5b2d52016-09-07 11:32:23 -0400709 return;
710 case GL_ACTIVE_UNIFORM_BLOCKS:
711 *params = program->getActiveUniformBlockCount();
712 return;
713 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
714 *params = program->getActiveUniformBlockMaxLength();
715 break;
716 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
717 *params = program->getTransformFeedbackBufferMode();
718 break;
719 case GL_TRANSFORM_FEEDBACK_VARYINGS:
720 *params = program->getTransformFeedbackVaryingCount();
721 break;
722 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
723 *params = program->getTransformFeedbackVaryingMaxLength();
724 break;
725 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
726 *params = program->getBinaryRetrievableHint();
727 break;
Yunchao He61afff12017-03-14 15:34:03 +0800728 case GL_PROGRAM_SEPARABLE:
729 *params = program->isSeparable();
730 break;
Geoff Langff5b2d52016-09-07 11:32:23 -0400731 default:
732 UNREACHABLE();
733 break;
734 }
735}
Geoff Lang740d9022016-10-07 11:20:52 -0400736
Jamie Madill4e0e6f82017-02-17 11:06:03 -0500737void QueryRenderbufferiv(const Context *context,
738 const Renderbuffer *renderbuffer,
739 GLenum pname,
740 GLint *params)
Geoff Lang740d9022016-10-07 11:20:52 -0400741{
742 ASSERT(renderbuffer != nullptr);
743
744 switch (pname)
745 {
746 case GL_RENDERBUFFER_WIDTH:
747 *params = renderbuffer->getWidth();
748 break;
749 case GL_RENDERBUFFER_HEIGHT:
750 *params = renderbuffer->getHeight();
751 break;
752 case GL_RENDERBUFFER_INTERNAL_FORMAT:
Jamie Madill4e0e6f82017-02-17 11:06:03 -0500753 // Special case the WebGL 1 DEPTH_STENCIL format.
Jamie Madilla02315b2017-02-23 14:14:47 -0500754 if (context->isWebGL1() &&
Jamie Madill4e0e6f82017-02-17 11:06:03 -0500755 renderbuffer->getFormat().info->internalFormat == GL_DEPTH24_STENCIL8)
756 {
757 *params = GL_DEPTH_STENCIL;
758 }
759 else
760 {
761 *params = renderbuffer->getFormat().info->internalFormat;
762 }
Geoff Lang740d9022016-10-07 11:20:52 -0400763 break;
764 case GL_RENDERBUFFER_RED_SIZE:
765 *params = renderbuffer->getRedSize();
766 break;
767 case GL_RENDERBUFFER_GREEN_SIZE:
768 *params = renderbuffer->getGreenSize();
769 break;
770 case GL_RENDERBUFFER_BLUE_SIZE:
771 *params = renderbuffer->getBlueSize();
772 break;
773 case GL_RENDERBUFFER_ALPHA_SIZE:
774 *params = renderbuffer->getAlphaSize();
775 break;
776 case GL_RENDERBUFFER_DEPTH_SIZE:
777 *params = renderbuffer->getDepthSize();
778 break;
779 case GL_RENDERBUFFER_STENCIL_SIZE:
780 *params = renderbuffer->getStencilSize();
781 break;
782 case GL_RENDERBUFFER_SAMPLES_ANGLE:
783 *params = renderbuffer->getSamples();
784 break;
785 default:
786 UNREACHABLE();
787 break;
788 }
789}
Geoff Langd7d0ed32016-10-07 11:33:51 -0400790
Jamie Madillbd044ed2017-06-05 12:59:21 -0400791void QueryShaderiv(const Context *context, Shader *shader, GLenum pname, GLint *params)
Geoff Langd7d0ed32016-10-07 11:33:51 -0400792{
793 ASSERT(shader != nullptr);
794
795 switch (pname)
796 {
797 case GL_SHADER_TYPE:
798 *params = shader->getType();
799 return;
800 case GL_DELETE_STATUS:
801 *params = shader->isFlaggedForDeletion();
802 return;
803 case GL_COMPILE_STATUS:
Jamie Madillbd044ed2017-06-05 12:59:21 -0400804 *params = shader->isCompiled(context) ? GL_TRUE : GL_FALSE;
Geoff Langd7d0ed32016-10-07 11:33:51 -0400805 return;
806 case GL_INFO_LOG_LENGTH:
Jamie Madillbd044ed2017-06-05 12:59:21 -0400807 *params = shader->getInfoLogLength(context);
Geoff Langd7d0ed32016-10-07 11:33:51 -0400808 return;
809 case GL_SHADER_SOURCE_LENGTH:
810 *params = shader->getSourceLength();
811 return;
812 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
Jamie Madillbd044ed2017-06-05 12:59:21 -0400813 *params = shader->getTranslatedSourceWithDebugInfoLength(context);
Geoff Langd7d0ed32016-10-07 11:33:51 -0400814 return;
815 default:
816 UNREACHABLE();
817 break;
818 }
819}
Geoff Langc1984ed2016-10-07 12:41:00 -0400820
He Yunchao11b038b2016-11-22 21:24:04 +0800821void QueryTexLevelParameterfv(const Texture *texture,
822 GLenum target,
823 GLint level,
824 GLenum pname,
825 GLfloat *params)
826{
827 QueryTexLevelParameterBase(texture, target, level, pname, params);
828}
829
830void QueryTexLevelParameteriv(const Texture *texture,
831 GLenum target,
832 GLint level,
833 GLenum pname,
834 GLint *params)
835{
836 QueryTexLevelParameterBase(texture, target, level, pname, params);
837}
838
Geoff Langc1984ed2016-10-07 12:41:00 -0400839void QueryTexParameterfv(const Texture *texture, GLenum pname, GLfloat *params)
840{
841 QueryTexParameterBase(texture, pname, params);
842}
843
844void QueryTexParameteriv(const Texture *texture, GLenum pname, GLint *params)
845{
846 QueryTexParameterBase(texture, pname, params);
847}
848
849void QuerySamplerParameterfv(const Sampler *sampler, GLenum pname, GLfloat *params)
850{
851 QuerySamplerParameterBase(sampler, pname, params);
852}
853
854void QuerySamplerParameteriv(const Sampler *sampler, GLenum pname, GLint *params)
855{
856 QuerySamplerParameterBase(sampler, pname, params);
857}
858
Geoff Lang0b031062016-10-13 14:30:04 -0400859void QueryVertexAttribfv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800860 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -0400861 const VertexAttribCurrentValueData &currentValueData,
862 GLenum pname,
863 GLfloat *params)
864{
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800865 QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -0400866}
867
868void QueryVertexAttribiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800869 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -0400870 const VertexAttribCurrentValueData &currentValueData,
871 GLenum pname,
872 GLint *params)
873{
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800874 QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -0400875}
876
Jamie Madill876429b2017-04-20 15:46:24 -0400877void QueryVertexAttribPointerv(const VertexAttribute &attrib, GLenum pname, void **pointer)
Geoff Lang0b031062016-10-13 14:30:04 -0400878{
879 switch (pname)
880 {
881 case GL_VERTEX_ATTRIB_ARRAY_POINTER:
Jamie Madill876429b2017-04-20 15:46:24 -0400882 *pointer = const_cast<void *>(attrib.pointer);
Geoff Lang0b031062016-10-13 14:30:04 -0400883 break;
884
885 default:
886 UNREACHABLE();
887 break;
888 }
889}
890
891void QueryVertexAttribIiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800892 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -0400893 const VertexAttribCurrentValueData &currentValueData,
894 GLenum pname,
895 GLint *params)
896{
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800897 QueryVertexAttribBase(attrib, binding, currentValueData.IntValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -0400898}
899
900void QueryVertexAttribIuiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800901 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -0400902 const VertexAttribCurrentValueData &currentValueData,
903 GLenum pname,
904 GLuint *params)
905{
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800906 QueryVertexAttribBase(attrib, binding, currentValueData.UnsignedIntValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -0400907}
908
Geoff Lang6899b872016-10-14 11:30:13 -0400909void QueryActiveUniformBlockiv(const Program *program,
910 GLuint uniformBlockIndex,
911 GLenum pname,
912 GLint *params)
913{
914 const UniformBlock &uniformBlock = program->getUniformBlockByIndex(uniformBlockIndex);
915 switch (pname)
916 {
917 case GL_UNIFORM_BLOCK_BINDING:
918 *params = ConvertToGLint(program->getUniformBlockBinding(uniformBlockIndex));
919 break;
920 case GL_UNIFORM_BLOCK_DATA_SIZE:
921 *params = ConvertToGLint(uniformBlock.dataSize);
922 break;
923 case GL_UNIFORM_BLOCK_NAME_LENGTH:
924 *params = ConvertToGLint(uniformBlock.nameWithArrayIndex().size() + 1);
925 break;
926 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
jchen10eaef1e52017-06-13 10:44:11 +0800927 *params = ConvertToGLint(uniformBlock.memberIndexes.size());
Geoff Lang6899b872016-10-14 11:30:13 -0400928 break;
929 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
jchen10eaef1e52017-06-13 10:44:11 +0800930 for (size_t blockMemberIndex = 0; blockMemberIndex < uniformBlock.memberIndexes.size();
931 blockMemberIndex++)
Geoff Lang6899b872016-10-14 11:30:13 -0400932 {
933 params[blockMemberIndex] =
jchen10eaef1e52017-06-13 10:44:11 +0800934 ConvertToGLint(uniformBlock.memberIndexes[blockMemberIndex]);
Geoff Lang6899b872016-10-14 11:30:13 -0400935 }
936 break;
937 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
938 *params = ConvertToGLint(uniformBlock.vertexStaticUse);
939 break;
940 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
941 *params = ConvertToGLint(uniformBlock.fragmentStaticUse);
942 break;
943 default:
944 UNREACHABLE();
945 break;
946 }
947}
948
Geoff Lang0a9661f2016-10-20 10:59:20 -0700949void QueryInternalFormativ(const TextureCaps &format, GLenum pname, GLsizei bufSize, GLint *params)
950{
951 switch (pname)
952 {
953 case GL_NUM_SAMPLE_COUNTS:
954 if (bufSize != 0)
955 {
956 *params = static_cast<GLint>(format.sampleCounts.size());
957 }
958 break;
959
960 case GL_SAMPLES:
961 {
962 size_t returnCount = std::min<size_t>(bufSize, format.sampleCounts.size());
963 auto sampleReverseIt = format.sampleCounts.rbegin();
964 for (size_t sampleIndex = 0; sampleIndex < returnCount; ++sampleIndex)
965 {
966 params[sampleIndex] = *sampleReverseIt++;
967 }
968 }
969 break;
970
971 default:
972 UNREACHABLE();
973 break;
974 }
975}
976
JiangYizhouf7bbc8a2016-11-16 09:57:22 +0800977void QueryFramebufferParameteriv(const Framebuffer *framebuffer, GLenum pname, GLint *params)
978{
979 ASSERT(framebuffer);
980
981 switch (pname)
982 {
983 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
984 *params = framebuffer->getDefaultWidth();
985 break;
986 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
987 *params = framebuffer->getDefaultHeight();
988 break;
989 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
990 *params = framebuffer->getDefaultSamples();
991 break;
992 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
993 *params = framebuffer->getDefaultFixedSampleLocations();
994 break;
995 default:
996 UNREACHABLE();
997 break;
998 }
999}
1000
Geoff Lang82483b92017-04-11 15:33:00 -04001001Error QuerySynciv(const FenceSync *sync,
1002 GLenum pname,
1003 GLsizei bufSize,
1004 GLsizei *length,
1005 GLint *values)
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001006{
1007 ASSERT(sync);
1008
Geoff Lang82483b92017-04-11 15:33:00 -04001009 // All queries return one value, exit early if the buffer can't fit anything.
1010 if (bufSize < 1)
1011 {
1012 if (length != nullptr)
1013 {
1014 *length = 0;
1015 }
1016 return NoError();
1017 }
1018
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001019 switch (pname)
1020 {
1021 case GL_OBJECT_TYPE:
1022 *values = ConvertToGLint(GL_SYNC_FENCE);
1023 break;
1024 case GL_SYNC_CONDITION:
1025 *values = ConvertToGLint(sync->getCondition());
1026 break;
1027 case GL_SYNC_FLAGS:
1028 *values = ConvertToGLint(sync->getFlags());
1029 break;
1030 case GL_SYNC_STATUS:
1031 ANGLE_TRY(sync->getStatus(values));
1032 break;
1033
1034 default:
1035 UNREACHABLE();
1036 break;
1037 }
1038
Geoff Lang82483b92017-04-11 15:33:00 -04001039 if (length != nullptr)
1040 {
1041 *length = 1;
1042 }
1043
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001044 return NoError();
1045}
1046
Jamie Madill4928b7c2017-06-20 12:57:39 -04001047void SetTexParameterf(Context *context, Texture *texture, GLenum pname, GLfloat param)
Geoff Langc1984ed2016-10-07 12:41:00 -04001048{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001049 SetTexParameterBase(context, texture, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -04001050}
1051
Jamie Madill4928b7c2017-06-20 12:57:39 -04001052void SetTexParameterfv(Context *context, Texture *texture, GLenum pname, const GLfloat *params)
Geoff Langc1984ed2016-10-07 12:41:00 -04001053{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001054 SetTexParameterBase(context, texture, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001055}
1056
Jamie Madill4928b7c2017-06-20 12:57:39 -04001057void SetTexParameteri(Context *context, Texture *texture, GLenum pname, GLint param)
Geoff Langc1984ed2016-10-07 12:41:00 -04001058{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001059 SetTexParameterBase(context, texture, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -04001060}
1061
Jamie Madill4928b7c2017-06-20 12:57:39 -04001062void SetTexParameteriv(Context *context, Texture *texture, GLenum pname, const GLint *params)
Geoff Langc1984ed2016-10-07 12:41:00 -04001063{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001064 SetTexParameterBase(context, texture, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001065}
1066
1067void SetSamplerParameterf(Sampler *sampler, GLenum pname, GLfloat param)
1068{
1069 SetSamplerParameterBase(sampler, pname, &param);
1070}
1071
1072void SetSamplerParameterfv(Sampler *sampler, GLenum pname, const GLfloat *params)
1073{
1074 SetSamplerParameterBase(sampler, pname, params);
1075}
1076
1077void SetSamplerParameteri(Sampler *sampler, GLenum pname, GLint param)
1078{
1079 SetSamplerParameterBase(sampler, pname, &param);
1080}
1081
1082void SetSamplerParameteriv(Sampler *sampler, GLenum pname, const GLint *params)
1083{
1084 SetSamplerParameterBase(sampler, pname, params);
1085}
Geoff Lang65603eb2017-01-12 16:48:03 -05001086
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001087void SetFramebufferParameteri(Framebuffer *framebuffer, GLenum pname, GLint param)
1088{
1089 ASSERT(framebuffer);
1090
1091 switch (pname)
1092 {
1093 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
1094 framebuffer->setDefaultWidth(param);
1095 break;
1096 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
1097 framebuffer->setDefaultHeight(param);
1098 break;
1099 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
1100 framebuffer->setDefaultSamples(param);
1101 break;
1102 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
1103 framebuffer->setDefaultFixedSampleLocations(static_cast<GLboolean>(param));
1104 break;
1105 default:
1106 UNREACHABLE();
1107 break;
1108 }
1109}
1110
Yunchao He61afff12017-03-14 15:34:03 +08001111void SetProgramParameteri(Program *program, GLenum pname, GLint value)
1112{
1113 ASSERT(program);
1114
1115 switch (pname)
1116 {
1117 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
1118 program->setBinaryRetrievableHint(value != GL_FALSE);
1119 break;
1120 case GL_PROGRAM_SEPARABLE:
1121 program->setSeparable(value != GL_FALSE);
1122 break;
1123 default:
1124 UNREACHABLE();
1125 break;
1126 }
1127}
1128
jchen1015015f72017-03-16 13:54:21 +08001129GLuint QueryProgramResourceIndex(const Program *program,
1130 GLenum programInterface,
1131 const GLchar *name)
1132{
1133 switch (programInterface)
1134 {
1135 case GL_PROGRAM_INPUT:
1136 return program->getInputResourceIndex(name);
1137
1138 case GL_PROGRAM_OUTPUT:
1139 return program->getOutputResourceIndex(name);
1140
jchen10191381f2017-04-11 13:59:04 +08001141 // TODO(jie.a.chen@intel.com): more interfaces.
jchen1015015f72017-03-16 13:54:21 +08001142 case GL_UNIFORM:
1143 case GL_UNIFORM_BLOCK:
1144 case GL_TRANSFORM_FEEDBACK_VARYING:
1145 case GL_BUFFER_VARIABLE:
1146 case GL_SHADER_STORAGE_BLOCK:
1147 UNIMPLEMENTED();
1148 return GL_INVALID_INDEX;
1149
1150 default:
1151 UNREACHABLE();
1152 return GL_INVALID_INDEX;
1153 }
1154}
1155
jchen10fd7c3b52017-03-21 15:36:03 +08001156void QueryProgramResourceName(const Program *program,
1157 GLenum programInterface,
1158 GLuint index,
1159 GLsizei bufSize,
1160 GLsizei *length,
1161 GLchar *name)
1162{
1163 switch (programInterface)
1164 {
1165 case GL_PROGRAM_INPUT:
1166 program->getInputResourceName(index, bufSize, length, name);
1167 break;
1168
1169 case GL_PROGRAM_OUTPUT:
1170 program->getOutputResourceName(index, bufSize, length, name);
1171 break;
1172
jchen10191381f2017-04-11 13:59:04 +08001173 // TODO(jie.a.chen@intel.com): more interfaces.
jchen10fd7c3b52017-03-21 15:36:03 +08001174 case GL_UNIFORM:
1175 case GL_UNIFORM_BLOCK:
1176 case GL_TRANSFORM_FEEDBACK_VARYING:
1177 case GL_BUFFER_VARIABLE:
1178 case GL_SHADER_STORAGE_BLOCK:
1179 UNIMPLEMENTED();
1180 break;
1181
1182 default:
1183 UNREACHABLE();
1184 }
1185}
1186
jchen10191381f2017-04-11 13:59:04 +08001187GLint QueryProgramResourceLocation(const Program *program,
1188 GLenum programInterface,
1189 const GLchar *name)
1190{
1191 switch (programInterface)
1192 {
1193 case GL_PROGRAM_INPUT:
1194 return program->getAttributeLocation(name);
1195
1196 case GL_PROGRAM_OUTPUT:
1197 return program->getFragDataLocation(name);
1198
1199 // TODO(jie.a.chen@intel.com): more interfaces.
1200 case GL_UNIFORM:
1201 case GL_UNIFORM_BLOCK:
1202 case GL_TRANSFORM_FEEDBACK_VARYING:
1203 case GL_BUFFER_VARIABLE:
1204 case GL_SHADER_STORAGE_BLOCK:
1205 UNIMPLEMENTED();
1206 return -1;
1207
1208 default:
1209 UNREACHABLE();
1210 return -1;
1211 }
1212}
1213
jchen10880683b2017-04-12 16:21:55 +08001214void QueryProgramResourceiv(const Program *program,
1215 GLenum programInterface,
1216 GLuint index,
1217 GLsizei propCount,
1218 const GLenum *props,
1219 GLsizei bufSize,
1220 GLsizei *length,
1221 GLint *params)
1222{
1223 if (!program->isLinked())
1224 {
1225 if (length != nullptr)
1226 {
1227 *length = 0;
1228 }
1229 return;
1230 }
1231
1232 GLsizei count = std::min(propCount, bufSize);
1233 if (length != nullptr)
1234 {
1235 *length = count;
1236 }
1237
1238 for (GLsizei i = 0; i < count; i++)
1239 {
1240 switch (programInterface)
1241 {
1242 case GL_PROGRAM_INPUT:
1243 params[i] = GetInputResourceProperty(program, index, props[i]);
1244 break;
1245
1246 case GL_PROGRAM_OUTPUT:
1247 params[i] = GetOutputResourceProperty(program, index, props[i]);
1248 break;
1249
1250 // TODO(jie.a.chen@intel.com): more interfaces.
1251 case GL_UNIFORM:
1252 case GL_UNIFORM_BLOCK:
1253 case GL_TRANSFORM_FEEDBACK_VARYING:
1254 case GL_BUFFER_VARIABLE:
1255 case GL_SHADER_STORAGE_BLOCK:
1256 case GL_ATOMIC_COUNTER_BUFFER:
1257 UNIMPLEMENTED();
1258 params[i] = GL_INVALID_VALUE;
1259 break;
1260
1261 default:
1262 UNREACHABLE();
1263 params[i] = GL_INVALID_VALUE;
1264 }
1265 }
1266}
1267
Geoff Lang65603eb2017-01-12 16:48:03 -05001268} // namespace gl
1269
1270namespace egl
1271{
1272
1273void QueryConfigAttrib(const Config *config, EGLint attribute, EGLint *value)
1274{
1275 ASSERT(config != nullptr);
1276 switch (attribute)
1277 {
1278 case EGL_BUFFER_SIZE:
1279 *value = config->bufferSize;
1280 break;
1281 case EGL_ALPHA_SIZE:
1282 *value = config->alphaSize;
1283 break;
1284 case EGL_BLUE_SIZE:
1285 *value = config->blueSize;
1286 break;
1287 case EGL_GREEN_SIZE:
1288 *value = config->greenSize;
1289 break;
1290 case EGL_RED_SIZE:
1291 *value = config->redSize;
1292 break;
1293 case EGL_DEPTH_SIZE:
1294 *value = config->depthSize;
1295 break;
1296 case EGL_STENCIL_SIZE:
1297 *value = config->stencilSize;
1298 break;
1299 case EGL_CONFIG_CAVEAT:
1300 *value = config->configCaveat;
1301 break;
1302 case EGL_CONFIG_ID:
1303 *value = config->configID;
1304 break;
1305 case EGL_LEVEL:
1306 *value = config->level;
1307 break;
1308 case EGL_NATIVE_RENDERABLE:
1309 *value = config->nativeRenderable;
1310 break;
1311 case EGL_NATIVE_VISUAL_ID:
1312 *value = config->nativeVisualID;
1313 break;
1314 case EGL_NATIVE_VISUAL_TYPE:
1315 *value = config->nativeVisualType;
1316 break;
1317 case EGL_SAMPLES:
1318 *value = config->samples;
1319 break;
1320 case EGL_SAMPLE_BUFFERS:
1321 *value = config->sampleBuffers;
1322 break;
1323 case EGL_SURFACE_TYPE:
1324 *value = config->surfaceType;
1325 break;
1326 case EGL_TRANSPARENT_TYPE:
1327 *value = config->transparentType;
1328 break;
1329 case EGL_TRANSPARENT_BLUE_VALUE:
1330 *value = config->transparentBlueValue;
1331 break;
1332 case EGL_TRANSPARENT_GREEN_VALUE:
1333 *value = config->transparentGreenValue;
1334 break;
1335 case EGL_TRANSPARENT_RED_VALUE:
1336 *value = config->transparentRedValue;
1337 break;
1338 case EGL_BIND_TO_TEXTURE_RGB:
1339 *value = config->bindToTextureRGB;
1340 break;
1341 case EGL_BIND_TO_TEXTURE_RGBA:
1342 *value = config->bindToTextureRGBA;
1343 break;
1344 case EGL_MIN_SWAP_INTERVAL:
1345 *value = config->minSwapInterval;
1346 break;
1347 case EGL_MAX_SWAP_INTERVAL:
1348 *value = config->maxSwapInterval;
1349 break;
1350 case EGL_LUMINANCE_SIZE:
1351 *value = config->luminanceSize;
1352 break;
1353 case EGL_ALPHA_MASK_SIZE:
1354 *value = config->alphaMaskSize;
1355 break;
1356 case EGL_COLOR_BUFFER_TYPE:
1357 *value = config->colorBufferType;
1358 break;
1359 case EGL_RENDERABLE_TYPE:
1360 *value = config->renderableType;
1361 break;
1362 case EGL_MATCH_NATIVE_PIXMAP:
1363 *value = false;
1364 UNIMPLEMENTED();
1365 break;
1366 case EGL_CONFORMANT:
1367 *value = config->conformant;
1368 break;
1369 case EGL_MAX_PBUFFER_WIDTH:
1370 *value = config->maxPBufferWidth;
1371 break;
1372 case EGL_MAX_PBUFFER_HEIGHT:
1373 *value = config->maxPBufferHeight;
1374 break;
1375 case EGL_MAX_PBUFFER_PIXELS:
1376 *value = config->maxPBufferPixels;
1377 break;
1378 case EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE:
1379 *value = config->optimalOrientation;
1380 break;
Geoff Langc5a2a172017-01-13 15:55:07 -05001381 case EGL_COLOR_COMPONENT_TYPE_EXT:
1382 *value = config->colorComponentType;
1383 break;
Geoff Lang65603eb2017-01-12 16:48:03 -05001384 default:
1385 UNREACHABLE();
1386 break;
1387 }
Geoff Langff5b2d52016-09-07 11:32:23 -04001388}
Geoff Lang65603eb2017-01-12 16:48:03 -05001389
Geoff Lang31ecbd72017-07-26 13:01:27 -04001390void QuerySurfaceAttrib(const Surface *surface, EGLint attribute, EGLint *value)
1391{
1392 switch (attribute)
1393 {
1394 case EGL_GL_COLORSPACE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001395 *value = surface->getGLColorspace();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001396 break;
1397 case EGL_VG_ALPHA_FORMAT:
Geoff Lang40ac7832017-07-26 14:38:46 -04001398 *value = surface->getVGAlphaFormat();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001399 break;
1400 case EGL_VG_COLORSPACE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001401 *value = surface->getVGColorspace();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001402 break;
1403 case EGL_CONFIG_ID:
1404 *value = surface->getConfig()->configID;
1405 break;
1406 case EGL_HEIGHT:
1407 *value = surface->getHeight();
1408 break;
1409 case EGL_HORIZONTAL_RESOLUTION:
Geoff Lang40ac7832017-07-26 14:38:46 -04001410 *value = surface->getHorizontalResolution();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001411 break;
1412 case EGL_LARGEST_PBUFFER:
Geoff Lang40ac7832017-07-26 14:38:46 -04001413 // The EGL spec states that value is not written if the surface is not a pbuffer
1414 if (surface->getType() == EGL_PBUFFER_BIT)
1415 {
1416 *value = surface->getLargestPbuffer();
1417 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001418 break;
1419 case EGL_MIPMAP_TEXTURE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001420 // The EGL spec states that value is not written if the surface is not a pbuffer
1421 if (surface->getType() == EGL_PBUFFER_BIT)
1422 {
1423 *value = surface->getMipmapTexture();
1424 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001425 break;
1426 case EGL_MIPMAP_LEVEL:
Geoff Lang40ac7832017-07-26 14:38:46 -04001427 // The EGL spec states that value is not written if the surface is not a pbuffer
1428 if (surface->getType() == EGL_PBUFFER_BIT)
1429 {
1430 *value = surface->getMipmapLevel();
1431 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001432 break;
1433 case EGL_MULTISAMPLE_RESOLVE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001434 *value = surface->getMultisampleResolve();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001435 break;
1436 case EGL_PIXEL_ASPECT_RATIO:
1437 *value = surface->getPixelAspectRatio();
1438 break;
1439 case EGL_RENDER_BUFFER:
1440 *value = surface->getRenderBuffer();
1441 break;
1442 case EGL_SWAP_BEHAVIOR:
1443 *value = surface->getSwapBehavior();
1444 break;
1445 case EGL_TEXTURE_FORMAT:
Geoff Lang40ac7832017-07-26 14:38:46 -04001446 // The EGL spec states that value is not written if the surface is not a pbuffer
1447 if (surface->getType() == EGL_PBUFFER_BIT)
1448 {
1449 *value = surface->getTextureFormat();
1450 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001451 break;
1452 case EGL_TEXTURE_TARGET:
Geoff Lang40ac7832017-07-26 14:38:46 -04001453 // The EGL spec states that value is not written if the surface is not a pbuffer
1454 if (surface->getType() == EGL_PBUFFER_BIT)
1455 {
1456 *value = surface->getTextureTarget();
1457 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001458 break;
1459 case EGL_VERTICAL_RESOLUTION:
Geoff Lang40ac7832017-07-26 14:38:46 -04001460 *value = surface->getVerticalResolution();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001461 break;
1462 case EGL_WIDTH:
1463 *value = surface->getWidth();
1464 break;
1465 case EGL_POST_SUB_BUFFER_SUPPORTED_NV:
1466 *value = surface->isPostSubBufferSupported();
1467 break;
1468 case EGL_FIXED_SIZE_ANGLE:
1469 *value = surface->isFixedSize();
1470 break;
1471 case EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE:
1472 *value = surface->flexibleSurfaceCompatibilityRequested();
1473 break;
1474 case EGL_SURFACE_ORIENTATION_ANGLE:
1475 *value = surface->getOrientation();
1476 break;
1477 case EGL_DIRECT_COMPOSITION_ANGLE:
1478 *value = surface->directComposition();
1479 break;
1480 default:
1481 UNREACHABLE();
1482 break;
1483 }
1484}
1485
1486void SetSurfaceAttrib(Surface *surface, EGLint attribute, EGLint value)
1487{
1488 switch (attribute)
1489 {
1490 case EGL_MIPMAP_LEVEL:
Geoff Lang40ac7832017-07-26 14:38:46 -04001491 surface->setMipmapLevel(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04001492 break;
1493 case EGL_MULTISAMPLE_RESOLVE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001494 surface->setMultisampleResolve(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04001495 break;
1496 case EGL_SWAP_BEHAVIOR:
Geoff Lang40ac7832017-07-26 14:38:46 -04001497 surface->setSwapBehavior(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04001498 break;
1499 default:
1500 UNREACHABLE();
1501 break;
1502 }
1503}
1504
Geoff Lang65603eb2017-01-12 16:48:03 -05001505} // namespace egl