blob: ce94323d919c9a556c66caa3c09268082a5e6129 [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:
jchen10d9cd7b72017-08-30 15:04:25 +0800448 return ConvertToGLint(var.type);
jchen10880683b2017-04-12 16:21:55 +0800449
450 case GL_ARRAY_SIZE:
451 // TODO(jie.a.chen@intel.com): check array of array.
452 if (var.isArray() && !var.isStruct())
453 {
jchen10d9cd7b72017-08-30 15:04:25 +0800454 return ConvertToGLint(var.elementCount());
jchen10880683b2017-04-12 16:21:55 +0800455 }
456 return 1;
457
458 case GL_NAME_LENGTH:
459 {
jchen10d9cd7b72017-08-30 15:04:25 +0800460 size_t length = var.name.size();
jchen10880683b2017-04-12 16:21:55 +0800461 if (var.isArray())
462 {
463 // Counts "[0]".
464 length += 3;
465 }
466 // ES31 spec p84: This counts the terminating null char.
467 ++length;
jchen10d9cd7b72017-08-30 15:04:25 +0800468 return ConvertToGLint(length);
jchen10880683b2017-04-12 16:21:55 +0800469 }
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
jchen10d9cd7b72017-08-30 15:04:25 +0800530GLint QueryProgramInterfaceActiveResources(const Program *program, GLenum programInterface)
531{
532 switch (programInterface)
533 {
534 case GL_PROGRAM_INPUT:
535 return ConvertToGLint(program->getAttributes().size());
536
537 case GL_PROGRAM_OUTPUT:
538 return ConvertToGLint(program->getState().getOutputVariables().size());
539
540 case GL_UNIFORM:
541 return ConvertToGLint(program->getState().getUniforms().size());
542
543 case GL_UNIFORM_BLOCK:
544 return ConvertToGLint(program->getState().getUniformBlocks().size());
545
546 // TODO(jie.a.chen@intel.com): more interfaces.
547 case GL_TRANSFORM_FEEDBACK_VARYING:
548 case GL_BUFFER_VARIABLE:
549 case GL_SHADER_STORAGE_BLOCK:
550 case GL_ATOMIC_COUNTER_BUFFER:
551 UNIMPLEMENTED();
552 return 0;
553
554 default:
555 UNREACHABLE();
556 return 0;
557 }
558}
559
560template <typename T, typename M>
561GLint FindMaxSize(const std::vector<T> &resources, M member)
562{
563 GLint max = 0;
564 for (const T &resource : resources)
565 {
566 max = std::max(max, ConvertToGLint((resource.*member).size()));
567 }
568 return max;
569}
570
571GLint QueryProgramInterfaceMaxNameLength(const Program *program, GLenum programInterface)
572{
573 GLint maxNameLength = 0;
574 switch (programInterface)
575 {
576 case GL_PROGRAM_INPUT:
577 maxNameLength = FindMaxSize(program->getAttributes(), &sh::Attribute::name);
578 break;
579
580 case GL_PROGRAM_OUTPUT:
581 maxNameLength =
582 FindMaxSize(program->getState().getOutputVariables(), &sh::OutputVariable::name);
583 break;
584
585 case GL_UNIFORM:
586 maxNameLength = FindMaxSize(program->getState().getUniforms(), &LinkedUniform::name);
587 break;
588
589 case GL_UNIFORM_BLOCK:
590 maxNameLength =
Jiajia Qin729b2c62017-08-14 09:36:11 +0800591 FindMaxSize(program->getState().getUniformBlocks(), &InterfaceBlock::name);
jchen10d9cd7b72017-08-30 15:04:25 +0800592 break;
593
594 // TODO(jie.a.chen@intel.com): more interfaces.
595 case GL_TRANSFORM_FEEDBACK_VARYING:
596 case GL_BUFFER_VARIABLE:
597 case GL_SHADER_STORAGE_BLOCK:
598 UNIMPLEMENTED();
599 return 0;
600
601 default:
602 UNREACHABLE();
603 return 0;
604 }
605 // This length includes an extra character for the null terminator.
606 return (maxNameLength == 0 ? 0 : maxNameLength + 1);
607}
608
609GLint QueryProgramInterfaceMaxNumActiveVariables(const Program *program, GLenum programInterface)
610{
611 switch (programInterface)
612 {
613 case GL_UNIFORM_BLOCK:
614 return FindMaxSize(program->getState().getUniformBlocks(),
Jiajia Qin729b2c62017-08-14 09:36:11 +0800615 &InterfaceBlock::memberIndexes);
jchen10d9cd7b72017-08-30 15:04:25 +0800616
617 // TODO(jie.a.chen@intel.com): more interfaces.
618 case GL_SHADER_STORAGE_BLOCK:
619 case GL_ATOMIC_COUNTER_BUFFER:
620 UNIMPLEMENTED();
621 return 0;
622
623 default:
624 UNREACHABLE();
625 return 0;
626 }
627}
628
Geoff Langc1984ed2016-10-07 12:41:00 -0400629} // anonymous namespace
630
Geoff Langff5b2d52016-09-07 11:32:23 -0400631void QueryFramebufferAttachmentParameteriv(const Framebuffer *framebuffer,
632 GLenum attachment,
633 GLenum pname,
634 GLint *params)
635{
636 ASSERT(framebuffer);
637
638 const FramebufferAttachment *attachmentObject = framebuffer->getAttachment(attachment);
639 if (attachmentObject == nullptr)
640 {
641 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
642 // is NONE, then querying any other pname will generate INVALID_ENUM.
643
644 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
645 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
646 // INVALID_OPERATION for all other pnames
647
648 switch (pname)
649 {
650 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
651 *params = GL_NONE;
652 break;
653
654 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
655 *params = 0;
656 break;
657
658 default:
659 UNREACHABLE();
660 break;
661 }
662
663 return;
664 }
665
666 switch (pname)
667 {
668 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
669 *params = attachmentObject->type();
670 break;
671
672 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
673 *params = attachmentObject->id();
674 break;
675
676 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
677 *params = attachmentObject->mipLevel();
678 break;
679
680 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
681 *params = attachmentObject->cubeMapFace();
682 break;
683
684 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
685 *params = attachmentObject->getRedSize();
686 break;
687
688 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
689 *params = attachmentObject->getGreenSize();
690 break;
691
692 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
693 *params = attachmentObject->getBlueSize();
694 break;
695
696 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
697 *params = attachmentObject->getAlphaSize();
698 break;
699
700 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
701 *params = attachmentObject->getDepthSize();
702 break;
703
704 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
705 *params = attachmentObject->getStencilSize();
706 break;
707
708 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
709 *params = attachmentObject->getComponentType();
710 break;
711
712 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
713 *params = attachmentObject->getColorEncoding();
714 break;
715
716 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
717 *params = attachmentObject->layer();
718 break;
719
Martin Radeve5285d22017-07-14 16:23:53 +0300720 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_ANGLE:
721 *params = attachmentObject->getNumViews();
722 break;
723
724 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_MULTIVIEW_LAYOUT_ANGLE:
725 *params = static_cast<GLint>(attachmentObject->getMultiviewLayout());
726 break;
727
728 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_ANGLE:
729 *params = attachmentObject->getBaseViewIndex();
730 break;
731
732 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_VIEWPORT_OFFSETS_ANGLE:
733 {
734 const std::vector<Offset> &offsets = attachmentObject->getMultiviewViewportOffsets();
735 for (size_t i = 0u; i < offsets.size(); ++i)
736 {
737 params[i * 2u] = offsets[i].x;
738 params[i * 2u + 1u] = offsets[i].y;
739 }
740 }
741 break;
742
Geoff Langff5b2d52016-09-07 11:32:23 -0400743 default:
744 UNREACHABLE();
745 break;
746 }
747}
748
749void QueryBufferParameteriv(const Buffer *buffer, GLenum pname, GLint *params)
750{
Geoff Langebebe1c2016-10-14 12:01:31 -0400751 QueryBufferParameterBase(buffer, pname, params);
752}
Geoff Langff5b2d52016-09-07 11:32:23 -0400753
Geoff Langebebe1c2016-10-14 12:01:31 -0400754void QueryBufferParameteri64v(const Buffer *buffer, GLenum pname, GLint64 *params)
755{
756 QueryBufferParameterBase(buffer, pname, params);
Geoff Langff5b2d52016-09-07 11:32:23 -0400757}
758
Geoff Lang496c02d2016-10-20 11:38:11 -0700759void QueryBufferPointerv(const Buffer *buffer, GLenum pname, void **params)
760{
761 switch (pname)
762 {
763 case GL_BUFFER_MAP_POINTER:
764 *params = buffer->getMapPointer();
765 break;
766
767 default:
768 UNREACHABLE();
769 break;
770 }
771}
772
Jamie Madillffe00c02017-06-27 16:26:55 -0400773void QueryProgramiv(const Context *context, const Program *program, GLenum pname, GLint *params)
Geoff Langff5b2d52016-09-07 11:32:23 -0400774{
775 ASSERT(program != nullptr);
776
777 switch (pname)
778 {
779 case GL_DELETE_STATUS:
780 *params = program->isFlaggedForDeletion();
781 return;
782 case GL_LINK_STATUS:
783 *params = program->isLinked();
784 return;
785 case GL_VALIDATE_STATUS:
786 *params = program->isValidated();
787 return;
788 case GL_INFO_LOG_LENGTH:
789 *params = program->getInfoLogLength();
790 return;
791 case GL_ATTACHED_SHADERS:
792 *params = program->getAttachedShadersCount();
793 return;
794 case GL_ACTIVE_ATTRIBUTES:
795 *params = program->getActiveAttributeCount();
796 return;
797 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
798 *params = program->getActiveAttributeMaxLength();
799 return;
800 case GL_ACTIVE_UNIFORMS:
801 *params = program->getActiveUniformCount();
802 return;
803 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
804 *params = program->getActiveUniformMaxLength();
805 return;
806 case GL_PROGRAM_BINARY_LENGTH_OES:
Jamie Madillffe00c02017-06-27 16:26:55 -0400807 *params = program->getBinaryLength(context);
Geoff Langff5b2d52016-09-07 11:32:23 -0400808 return;
809 case GL_ACTIVE_UNIFORM_BLOCKS:
810 *params = program->getActiveUniformBlockCount();
811 return;
812 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
813 *params = program->getActiveUniformBlockMaxLength();
814 break;
815 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
816 *params = program->getTransformFeedbackBufferMode();
817 break;
818 case GL_TRANSFORM_FEEDBACK_VARYINGS:
819 *params = program->getTransformFeedbackVaryingCount();
820 break;
821 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
822 *params = program->getTransformFeedbackVaryingMaxLength();
823 break;
824 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
825 *params = program->getBinaryRetrievableHint();
826 break;
Yunchao He61afff12017-03-14 15:34:03 +0800827 case GL_PROGRAM_SEPARABLE:
828 *params = program->isSeparable();
829 break;
Geoff Langff5b2d52016-09-07 11:32:23 -0400830 default:
831 UNREACHABLE();
832 break;
833 }
834}
Geoff Lang740d9022016-10-07 11:20:52 -0400835
Jamie Madill4e0e6f82017-02-17 11:06:03 -0500836void QueryRenderbufferiv(const Context *context,
837 const Renderbuffer *renderbuffer,
838 GLenum pname,
839 GLint *params)
Geoff Lang740d9022016-10-07 11:20:52 -0400840{
841 ASSERT(renderbuffer != nullptr);
842
843 switch (pname)
844 {
845 case GL_RENDERBUFFER_WIDTH:
846 *params = renderbuffer->getWidth();
847 break;
848 case GL_RENDERBUFFER_HEIGHT:
849 *params = renderbuffer->getHeight();
850 break;
851 case GL_RENDERBUFFER_INTERNAL_FORMAT:
Jamie Madill4e0e6f82017-02-17 11:06:03 -0500852 // Special case the WebGL 1 DEPTH_STENCIL format.
Jamie Madilla02315b2017-02-23 14:14:47 -0500853 if (context->isWebGL1() &&
Jamie Madill4e0e6f82017-02-17 11:06:03 -0500854 renderbuffer->getFormat().info->internalFormat == GL_DEPTH24_STENCIL8)
855 {
856 *params = GL_DEPTH_STENCIL;
857 }
858 else
859 {
860 *params = renderbuffer->getFormat().info->internalFormat;
861 }
Geoff Lang740d9022016-10-07 11:20:52 -0400862 break;
863 case GL_RENDERBUFFER_RED_SIZE:
864 *params = renderbuffer->getRedSize();
865 break;
866 case GL_RENDERBUFFER_GREEN_SIZE:
867 *params = renderbuffer->getGreenSize();
868 break;
869 case GL_RENDERBUFFER_BLUE_SIZE:
870 *params = renderbuffer->getBlueSize();
871 break;
872 case GL_RENDERBUFFER_ALPHA_SIZE:
873 *params = renderbuffer->getAlphaSize();
874 break;
875 case GL_RENDERBUFFER_DEPTH_SIZE:
876 *params = renderbuffer->getDepthSize();
877 break;
878 case GL_RENDERBUFFER_STENCIL_SIZE:
879 *params = renderbuffer->getStencilSize();
880 break;
881 case GL_RENDERBUFFER_SAMPLES_ANGLE:
882 *params = renderbuffer->getSamples();
883 break;
884 default:
885 UNREACHABLE();
886 break;
887 }
888}
Geoff Langd7d0ed32016-10-07 11:33:51 -0400889
Jamie Madillbd044ed2017-06-05 12:59:21 -0400890void QueryShaderiv(const Context *context, Shader *shader, GLenum pname, GLint *params)
Geoff Langd7d0ed32016-10-07 11:33:51 -0400891{
892 ASSERT(shader != nullptr);
893
894 switch (pname)
895 {
896 case GL_SHADER_TYPE:
897 *params = shader->getType();
898 return;
899 case GL_DELETE_STATUS:
900 *params = shader->isFlaggedForDeletion();
901 return;
902 case GL_COMPILE_STATUS:
Jamie Madillbd044ed2017-06-05 12:59:21 -0400903 *params = shader->isCompiled(context) ? GL_TRUE : GL_FALSE;
Geoff Langd7d0ed32016-10-07 11:33:51 -0400904 return;
905 case GL_INFO_LOG_LENGTH:
Jamie Madillbd044ed2017-06-05 12:59:21 -0400906 *params = shader->getInfoLogLength(context);
Geoff Langd7d0ed32016-10-07 11:33:51 -0400907 return;
908 case GL_SHADER_SOURCE_LENGTH:
909 *params = shader->getSourceLength();
910 return;
911 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
Jamie Madillbd044ed2017-06-05 12:59:21 -0400912 *params = shader->getTranslatedSourceWithDebugInfoLength(context);
Geoff Langd7d0ed32016-10-07 11:33:51 -0400913 return;
914 default:
915 UNREACHABLE();
916 break;
917 }
918}
Geoff Langc1984ed2016-10-07 12:41:00 -0400919
He Yunchao11b038b2016-11-22 21:24:04 +0800920void QueryTexLevelParameterfv(const Texture *texture,
921 GLenum target,
922 GLint level,
923 GLenum pname,
924 GLfloat *params)
925{
926 QueryTexLevelParameterBase(texture, target, level, pname, params);
927}
928
929void QueryTexLevelParameteriv(const Texture *texture,
930 GLenum target,
931 GLint level,
932 GLenum pname,
933 GLint *params)
934{
935 QueryTexLevelParameterBase(texture, target, level, pname, params);
936}
937
Geoff Langc1984ed2016-10-07 12:41:00 -0400938void QueryTexParameterfv(const Texture *texture, GLenum pname, GLfloat *params)
939{
940 QueryTexParameterBase(texture, pname, params);
941}
942
943void QueryTexParameteriv(const Texture *texture, GLenum pname, GLint *params)
944{
945 QueryTexParameterBase(texture, pname, params);
946}
947
948void QuerySamplerParameterfv(const Sampler *sampler, GLenum pname, GLfloat *params)
949{
950 QuerySamplerParameterBase(sampler, pname, params);
951}
952
953void QuerySamplerParameteriv(const Sampler *sampler, GLenum pname, GLint *params)
954{
955 QuerySamplerParameterBase(sampler, pname, params);
956}
957
Geoff Lang0b031062016-10-13 14:30:04 -0400958void QueryVertexAttribfv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800959 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -0400960 const VertexAttribCurrentValueData &currentValueData,
961 GLenum pname,
962 GLfloat *params)
963{
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800964 QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -0400965}
966
967void QueryVertexAttribiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800968 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -0400969 const VertexAttribCurrentValueData &currentValueData,
970 GLenum pname,
971 GLint *params)
972{
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800973 QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -0400974}
975
Jamie Madill876429b2017-04-20 15:46:24 -0400976void QueryVertexAttribPointerv(const VertexAttribute &attrib, GLenum pname, void **pointer)
Geoff Lang0b031062016-10-13 14:30:04 -0400977{
978 switch (pname)
979 {
980 case GL_VERTEX_ATTRIB_ARRAY_POINTER:
Jamie Madill876429b2017-04-20 15:46:24 -0400981 *pointer = const_cast<void *>(attrib.pointer);
Geoff Lang0b031062016-10-13 14:30:04 -0400982 break;
983
984 default:
985 UNREACHABLE();
986 break;
987 }
988}
989
990void QueryVertexAttribIiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800991 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -0400992 const VertexAttribCurrentValueData &currentValueData,
993 GLenum pname,
994 GLint *params)
995{
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800996 QueryVertexAttribBase(attrib, binding, currentValueData.IntValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -0400997}
998
999void QueryVertexAttribIuiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001000 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001001 const VertexAttribCurrentValueData &currentValueData,
1002 GLenum pname,
1003 GLuint *params)
1004{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001005 QueryVertexAttribBase(attrib, binding, currentValueData.UnsignedIntValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001006}
1007
Geoff Lang6899b872016-10-14 11:30:13 -04001008void QueryActiveUniformBlockiv(const Program *program,
1009 GLuint uniformBlockIndex,
1010 GLenum pname,
1011 GLint *params)
1012{
Jiajia Qin729b2c62017-08-14 09:36:11 +08001013 const InterfaceBlock &uniformBlock = program->getUniformBlockByIndex(uniformBlockIndex);
Geoff Lang6899b872016-10-14 11:30:13 -04001014 switch (pname)
1015 {
1016 case GL_UNIFORM_BLOCK_BINDING:
1017 *params = ConvertToGLint(program->getUniformBlockBinding(uniformBlockIndex));
1018 break;
1019 case GL_UNIFORM_BLOCK_DATA_SIZE:
1020 *params = ConvertToGLint(uniformBlock.dataSize);
1021 break;
1022 case GL_UNIFORM_BLOCK_NAME_LENGTH:
1023 *params = ConvertToGLint(uniformBlock.nameWithArrayIndex().size() + 1);
1024 break;
1025 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
jchen10eaef1e52017-06-13 10:44:11 +08001026 *params = ConvertToGLint(uniformBlock.memberIndexes.size());
Geoff Lang6899b872016-10-14 11:30:13 -04001027 break;
1028 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
jchen10eaef1e52017-06-13 10:44:11 +08001029 for (size_t blockMemberIndex = 0; blockMemberIndex < uniformBlock.memberIndexes.size();
1030 blockMemberIndex++)
Geoff Lang6899b872016-10-14 11:30:13 -04001031 {
1032 params[blockMemberIndex] =
jchen10eaef1e52017-06-13 10:44:11 +08001033 ConvertToGLint(uniformBlock.memberIndexes[blockMemberIndex]);
Geoff Lang6899b872016-10-14 11:30:13 -04001034 }
1035 break;
1036 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
1037 *params = ConvertToGLint(uniformBlock.vertexStaticUse);
1038 break;
1039 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
1040 *params = ConvertToGLint(uniformBlock.fragmentStaticUse);
1041 break;
1042 default:
1043 UNREACHABLE();
1044 break;
1045 }
1046}
1047
Geoff Lang0a9661f2016-10-20 10:59:20 -07001048void QueryInternalFormativ(const TextureCaps &format, GLenum pname, GLsizei bufSize, GLint *params)
1049{
1050 switch (pname)
1051 {
1052 case GL_NUM_SAMPLE_COUNTS:
1053 if (bufSize != 0)
1054 {
1055 *params = static_cast<GLint>(format.sampleCounts.size());
1056 }
1057 break;
1058
1059 case GL_SAMPLES:
1060 {
1061 size_t returnCount = std::min<size_t>(bufSize, format.sampleCounts.size());
1062 auto sampleReverseIt = format.sampleCounts.rbegin();
1063 for (size_t sampleIndex = 0; sampleIndex < returnCount; ++sampleIndex)
1064 {
1065 params[sampleIndex] = *sampleReverseIt++;
1066 }
1067 }
1068 break;
1069
1070 default:
1071 UNREACHABLE();
1072 break;
1073 }
1074}
1075
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001076void QueryFramebufferParameteriv(const Framebuffer *framebuffer, GLenum pname, GLint *params)
1077{
1078 ASSERT(framebuffer);
1079
1080 switch (pname)
1081 {
1082 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
1083 *params = framebuffer->getDefaultWidth();
1084 break;
1085 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
1086 *params = framebuffer->getDefaultHeight();
1087 break;
1088 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
1089 *params = framebuffer->getDefaultSamples();
1090 break;
1091 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
1092 *params = framebuffer->getDefaultFixedSampleLocations();
1093 break;
1094 default:
1095 UNREACHABLE();
1096 break;
1097 }
1098}
1099
Jamie Madill70b5bb02017-08-28 13:32:37 -04001100Error QuerySynciv(const Sync *sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001101{
1102 ASSERT(sync);
1103
Geoff Lang82483b92017-04-11 15:33:00 -04001104 // All queries return one value, exit early if the buffer can't fit anything.
1105 if (bufSize < 1)
1106 {
1107 if (length != nullptr)
1108 {
1109 *length = 0;
1110 }
1111 return NoError();
1112 }
1113
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001114 switch (pname)
1115 {
1116 case GL_OBJECT_TYPE:
1117 *values = ConvertToGLint(GL_SYNC_FENCE);
1118 break;
1119 case GL_SYNC_CONDITION:
1120 *values = ConvertToGLint(sync->getCondition());
1121 break;
1122 case GL_SYNC_FLAGS:
1123 *values = ConvertToGLint(sync->getFlags());
1124 break;
1125 case GL_SYNC_STATUS:
1126 ANGLE_TRY(sync->getStatus(values));
1127 break;
1128
1129 default:
1130 UNREACHABLE();
1131 break;
1132 }
1133
Geoff Lang82483b92017-04-11 15:33:00 -04001134 if (length != nullptr)
1135 {
1136 *length = 1;
1137 }
1138
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001139 return NoError();
1140}
1141
Jamie Madill4928b7c2017-06-20 12:57:39 -04001142void SetTexParameterf(Context *context, Texture *texture, GLenum pname, GLfloat param)
Geoff Langc1984ed2016-10-07 12:41:00 -04001143{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001144 SetTexParameterBase(context, texture, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -04001145}
1146
Jamie Madill4928b7c2017-06-20 12:57:39 -04001147void SetTexParameterfv(Context *context, Texture *texture, GLenum pname, const GLfloat *params)
Geoff Langc1984ed2016-10-07 12:41:00 -04001148{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001149 SetTexParameterBase(context, texture, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001150}
1151
Jamie Madill4928b7c2017-06-20 12:57:39 -04001152void SetTexParameteri(Context *context, Texture *texture, GLenum pname, GLint param)
Geoff Langc1984ed2016-10-07 12:41:00 -04001153{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001154 SetTexParameterBase(context, texture, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -04001155}
1156
Jamie Madill4928b7c2017-06-20 12:57:39 -04001157void SetTexParameteriv(Context *context, Texture *texture, GLenum pname, const GLint *params)
Geoff Langc1984ed2016-10-07 12:41:00 -04001158{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001159 SetTexParameterBase(context, texture, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001160}
1161
1162void SetSamplerParameterf(Sampler *sampler, GLenum pname, GLfloat param)
1163{
1164 SetSamplerParameterBase(sampler, pname, &param);
1165}
1166
1167void SetSamplerParameterfv(Sampler *sampler, GLenum pname, const GLfloat *params)
1168{
1169 SetSamplerParameterBase(sampler, pname, params);
1170}
1171
1172void SetSamplerParameteri(Sampler *sampler, GLenum pname, GLint param)
1173{
1174 SetSamplerParameterBase(sampler, pname, &param);
1175}
1176
1177void SetSamplerParameteriv(Sampler *sampler, GLenum pname, const GLint *params)
1178{
1179 SetSamplerParameterBase(sampler, pname, params);
1180}
Geoff Lang65603eb2017-01-12 16:48:03 -05001181
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001182void SetFramebufferParameteri(Framebuffer *framebuffer, GLenum pname, GLint param)
1183{
1184 ASSERT(framebuffer);
1185
1186 switch (pname)
1187 {
1188 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
1189 framebuffer->setDefaultWidth(param);
1190 break;
1191 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
1192 framebuffer->setDefaultHeight(param);
1193 break;
1194 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
1195 framebuffer->setDefaultSamples(param);
1196 break;
1197 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
1198 framebuffer->setDefaultFixedSampleLocations(static_cast<GLboolean>(param));
1199 break;
1200 default:
1201 UNREACHABLE();
1202 break;
1203 }
1204}
1205
Yunchao He61afff12017-03-14 15:34:03 +08001206void SetProgramParameteri(Program *program, GLenum pname, GLint value)
1207{
1208 ASSERT(program);
1209
1210 switch (pname)
1211 {
1212 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
1213 program->setBinaryRetrievableHint(value != GL_FALSE);
1214 break;
1215 case GL_PROGRAM_SEPARABLE:
1216 program->setSeparable(value != GL_FALSE);
1217 break;
1218 default:
1219 UNREACHABLE();
1220 break;
1221 }
1222}
1223
jchen1015015f72017-03-16 13:54:21 +08001224GLuint QueryProgramResourceIndex(const Program *program,
1225 GLenum programInterface,
1226 const GLchar *name)
1227{
1228 switch (programInterface)
1229 {
1230 case GL_PROGRAM_INPUT:
1231 return program->getInputResourceIndex(name);
1232
1233 case GL_PROGRAM_OUTPUT:
1234 return program->getOutputResourceIndex(name);
1235
jchen10191381f2017-04-11 13:59:04 +08001236 // TODO(jie.a.chen@intel.com): more interfaces.
jchen1015015f72017-03-16 13:54:21 +08001237 case GL_UNIFORM:
1238 case GL_UNIFORM_BLOCK:
1239 case GL_TRANSFORM_FEEDBACK_VARYING:
1240 case GL_BUFFER_VARIABLE:
1241 case GL_SHADER_STORAGE_BLOCK:
1242 UNIMPLEMENTED();
1243 return GL_INVALID_INDEX;
1244
1245 default:
1246 UNREACHABLE();
1247 return GL_INVALID_INDEX;
1248 }
1249}
1250
jchen10fd7c3b52017-03-21 15:36:03 +08001251void QueryProgramResourceName(const Program *program,
1252 GLenum programInterface,
1253 GLuint index,
1254 GLsizei bufSize,
1255 GLsizei *length,
1256 GLchar *name)
1257{
1258 switch (programInterface)
1259 {
1260 case GL_PROGRAM_INPUT:
1261 program->getInputResourceName(index, bufSize, length, name);
1262 break;
1263
1264 case GL_PROGRAM_OUTPUT:
1265 program->getOutputResourceName(index, bufSize, length, name);
1266 break;
1267
jchen10191381f2017-04-11 13:59:04 +08001268 // TODO(jie.a.chen@intel.com): more interfaces.
jchen10fd7c3b52017-03-21 15:36:03 +08001269 case GL_UNIFORM:
1270 case GL_UNIFORM_BLOCK:
1271 case GL_TRANSFORM_FEEDBACK_VARYING:
1272 case GL_BUFFER_VARIABLE:
1273 case GL_SHADER_STORAGE_BLOCK:
1274 UNIMPLEMENTED();
1275 break;
1276
1277 default:
1278 UNREACHABLE();
1279 }
1280}
1281
jchen10191381f2017-04-11 13:59:04 +08001282GLint QueryProgramResourceLocation(const Program *program,
1283 GLenum programInterface,
1284 const GLchar *name)
1285{
1286 switch (programInterface)
1287 {
1288 case GL_PROGRAM_INPUT:
1289 return program->getAttributeLocation(name);
1290
1291 case GL_PROGRAM_OUTPUT:
1292 return program->getFragDataLocation(name);
1293
1294 // TODO(jie.a.chen@intel.com): more interfaces.
1295 case GL_UNIFORM:
1296 case GL_UNIFORM_BLOCK:
1297 case GL_TRANSFORM_FEEDBACK_VARYING:
1298 case GL_BUFFER_VARIABLE:
1299 case GL_SHADER_STORAGE_BLOCK:
1300 UNIMPLEMENTED();
1301 return -1;
1302
1303 default:
1304 UNREACHABLE();
1305 return -1;
1306 }
1307}
1308
jchen10880683b2017-04-12 16:21:55 +08001309void QueryProgramResourceiv(const Program *program,
1310 GLenum programInterface,
1311 GLuint index,
1312 GLsizei propCount,
1313 const GLenum *props,
1314 GLsizei bufSize,
1315 GLsizei *length,
1316 GLint *params)
1317{
1318 if (!program->isLinked())
1319 {
1320 if (length != nullptr)
1321 {
1322 *length = 0;
1323 }
1324 return;
1325 }
1326
1327 GLsizei count = std::min(propCount, bufSize);
1328 if (length != nullptr)
1329 {
1330 *length = count;
1331 }
1332
1333 for (GLsizei i = 0; i < count; i++)
1334 {
1335 switch (programInterface)
1336 {
1337 case GL_PROGRAM_INPUT:
1338 params[i] = GetInputResourceProperty(program, index, props[i]);
1339 break;
1340
1341 case GL_PROGRAM_OUTPUT:
1342 params[i] = GetOutputResourceProperty(program, index, props[i]);
1343 break;
1344
1345 // TODO(jie.a.chen@intel.com): more interfaces.
1346 case GL_UNIFORM:
1347 case GL_UNIFORM_BLOCK:
1348 case GL_TRANSFORM_FEEDBACK_VARYING:
1349 case GL_BUFFER_VARIABLE:
1350 case GL_SHADER_STORAGE_BLOCK:
1351 case GL_ATOMIC_COUNTER_BUFFER:
1352 UNIMPLEMENTED();
1353 params[i] = GL_INVALID_VALUE;
1354 break;
1355
1356 default:
1357 UNREACHABLE();
1358 params[i] = GL_INVALID_VALUE;
1359 }
1360 }
1361}
1362
jchen10d9cd7b72017-08-30 15:04:25 +08001363void QueryProgramInterfaceiv(const Program *program,
1364 GLenum programInterface,
1365 GLenum pname,
1366 GLint *params)
1367{
1368 switch (pname)
1369 {
1370 case GL_ACTIVE_RESOURCES:
1371 *params = QueryProgramInterfaceActiveResources(program, programInterface);
1372 break;
1373
1374 case GL_MAX_NAME_LENGTH:
1375 *params = QueryProgramInterfaceMaxNameLength(program, programInterface);
1376 break;
1377
1378 case GL_MAX_NUM_ACTIVE_VARIABLES:
1379 *params = QueryProgramInterfaceMaxNumActiveVariables(program, programInterface);
1380 break;
1381
1382 default:
1383 UNREACHABLE();
1384 }
1385}
1386
Geoff Lang65603eb2017-01-12 16:48:03 -05001387} // namespace gl
1388
1389namespace egl
1390{
1391
1392void QueryConfigAttrib(const Config *config, EGLint attribute, EGLint *value)
1393{
1394 ASSERT(config != nullptr);
1395 switch (attribute)
1396 {
1397 case EGL_BUFFER_SIZE:
1398 *value = config->bufferSize;
1399 break;
1400 case EGL_ALPHA_SIZE:
1401 *value = config->alphaSize;
1402 break;
1403 case EGL_BLUE_SIZE:
1404 *value = config->blueSize;
1405 break;
1406 case EGL_GREEN_SIZE:
1407 *value = config->greenSize;
1408 break;
1409 case EGL_RED_SIZE:
1410 *value = config->redSize;
1411 break;
1412 case EGL_DEPTH_SIZE:
1413 *value = config->depthSize;
1414 break;
1415 case EGL_STENCIL_SIZE:
1416 *value = config->stencilSize;
1417 break;
1418 case EGL_CONFIG_CAVEAT:
1419 *value = config->configCaveat;
1420 break;
1421 case EGL_CONFIG_ID:
1422 *value = config->configID;
1423 break;
1424 case EGL_LEVEL:
1425 *value = config->level;
1426 break;
1427 case EGL_NATIVE_RENDERABLE:
1428 *value = config->nativeRenderable;
1429 break;
1430 case EGL_NATIVE_VISUAL_ID:
1431 *value = config->nativeVisualID;
1432 break;
1433 case EGL_NATIVE_VISUAL_TYPE:
1434 *value = config->nativeVisualType;
1435 break;
1436 case EGL_SAMPLES:
1437 *value = config->samples;
1438 break;
1439 case EGL_SAMPLE_BUFFERS:
1440 *value = config->sampleBuffers;
1441 break;
1442 case EGL_SURFACE_TYPE:
1443 *value = config->surfaceType;
1444 break;
1445 case EGL_TRANSPARENT_TYPE:
1446 *value = config->transparentType;
1447 break;
1448 case EGL_TRANSPARENT_BLUE_VALUE:
1449 *value = config->transparentBlueValue;
1450 break;
1451 case EGL_TRANSPARENT_GREEN_VALUE:
1452 *value = config->transparentGreenValue;
1453 break;
1454 case EGL_TRANSPARENT_RED_VALUE:
1455 *value = config->transparentRedValue;
1456 break;
1457 case EGL_BIND_TO_TEXTURE_RGB:
1458 *value = config->bindToTextureRGB;
1459 break;
1460 case EGL_BIND_TO_TEXTURE_RGBA:
1461 *value = config->bindToTextureRGBA;
1462 break;
1463 case EGL_MIN_SWAP_INTERVAL:
1464 *value = config->minSwapInterval;
1465 break;
1466 case EGL_MAX_SWAP_INTERVAL:
1467 *value = config->maxSwapInterval;
1468 break;
1469 case EGL_LUMINANCE_SIZE:
1470 *value = config->luminanceSize;
1471 break;
1472 case EGL_ALPHA_MASK_SIZE:
1473 *value = config->alphaMaskSize;
1474 break;
1475 case EGL_COLOR_BUFFER_TYPE:
1476 *value = config->colorBufferType;
1477 break;
1478 case EGL_RENDERABLE_TYPE:
1479 *value = config->renderableType;
1480 break;
1481 case EGL_MATCH_NATIVE_PIXMAP:
1482 *value = false;
1483 UNIMPLEMENTED();
1484 break;
1485 case EGL_CONFORMANT:
1486 *value = config->conformant;
1487 break;
1488 case EGL_MAX_PBUFFER_WIDTH:
1489 *value = config->maxPBufferWidth;
1490 break;
1491 case EGL_MAX_PBUFFER_HEIGHT:
1492 *value = config->maxPBufferHeight;
1493 break;
1494 case EGL_MAX_PBUFFER_PIXELS:
1495 *value = config->maxPBufferPixels;
1496 break;
1497 case EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE:
1498 *value = config->optimalOrientation;
1499 break;
Geoff Langc5a2a172017-01-13 15:55:07 -05001500 case EGL_COLOR_COMPONENT_TYPE_EXT:
1501 *value = config->colorComponentType;
1502 break;
Geoff Lang65603eb2017-01-12 16:48:03 -05001503 default:
1504 UNREACHABLE();
1505 break;
1506 }
Geoff Langff5b2d52016-09-07 11:32:23 -04001507}
Geoff Lang65603eb2017-01-12 16:48:03 -05001508
Geoff Lang31ecbd72017-07-26 13:01:27 -04001509void QuerySurfaceAttrib(const Surface *surface, EGLint attribute, EGLint *value)
1510{
1511 switch (attribute)
1512 {
1513 case EGL_GL_COLORSPACE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001514 *value = surface->getGLColorspace();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001515 break;
1516 case EGL_VG_ALPHA_FORMAT:
Geoff Lang40ac7832017-07-26 14:38:46 -04001517 *value = surface->getVGAlphaFormat();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001518 break;
1519 case EGL_VG_COLORSPACE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001520 *value = surface->getVGColorspace();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001521 break;
1522 case EGL_CONFIG_ID:
1523 *value = surface->getConfig()->configID;
1524 break;
1525 case EGL_HEIGHT:
1526 *value = surface->getHeight();
1527 break;
1528 case EGL_HORIZONTAL_RESOLUTION:
Geoff Lang40ac7832017-07-26 14:38:46 -04001529 *value = surface->getHorizontalResolution();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001530 break;
1531 case EGL_LARGEST_PBUFFER:
Geoff Lang40ac7832017-07-26 14:38:46 -04001532 // The EGL spec states that value is not written if the surface is not a pbuffer
1533 if (surface->getType() == EGL_PBUFFER_BIT)
1534 {
1535 *value = surface->getLargestPbuffer();
1536 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001537 break;
1538 case EGL_MIPMAP_TEXTURE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001539 // The EGL spec states that value is not written if the surface is not a pbuffer
1540 if (surface->getType() == EGL_PBUFFER_BIT)
1541 {
1542 *value = surface->getMipmapTexture();
1543 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001544 break;
1545 case EGL_MIPMAP_LEVEL:
Geoff Lang40ac7832017-07-26 14:38:46 -04001546 // The EGL spec states that value is not written if the surface is not a pbuffer
1547 if (surface->getType() == EGL_PBUFFER_BIT)
1548 {
1549 *value = surface->getMipmapLevel();
1550 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001551 break;
1552 case EGL_MULTISAMPLE_RESOLVE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001553 *value = surface->getMultisampleResolve();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001554 break;
1555 case EGL_PIXEL_ASPECT_RATIO:
1556 *value = surface->getPixelAspectRatio();
1557 break;
1558 case EGL_RENDER_BUFFER:
1559 *value = surface->getRenderBuffer();
1560 break;
1561 case EGL_SWAP_BEHAVIOR:
1562 *value = surface->getSwapBehavior();
1563 break;
1564 case EGL_TEXTURE_FORMAT:
Geoff Lang40ac7832017-07-26 14:38:46 -04001565 // The EGL spec states that value is not written if the surface is not a pbuffer
1566 if (surface->getType() == EGL_PBUFFER_BIT)
1567 {
1568 *value = surface->getTextureFormat();
1569 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001570 break;
1571 case EGL_TEXTURE_TARGET:
Geoff Lang40ac7832017-07-26 14:38:46 -04001572 // The EGL spec states that value is not written if the surface is not a pbuffer
1573 if (surface->getType() == EGL_PBUFFER_BIT)
1574 {
1575 *value = surface->getTextureTarget();
1576 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001577 break;
1578 case EGL_VERTICAL_RESOLUTION:
Geoff Lang40ac7832017-07-26 14:38:46 -04001579 *value = surface->getVerticalResolution();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001580 break;
1581 case EGL_WIDTH:
1582 *value = surface->getWidth();
1583 break;
1584 case EGL_POST_SUB_BUFFER_SUPPORTED_NV:
1585 *value = surface->isPostSubBufferSupported();
1586 break;
1587 case EGL_FIXED_SIZE_ANGLE:
1588 *value = surface->isFixedSize();
1589 break;
1590 case EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE:
1591 *value = surface->flexibleSurfaceCompatibilityRequested();
1592 break;
1593 case EGL_SURFACE_ORIENTATION_ANGLE:
1594 *value = surface->getOrientation();
1595 break;
1596 case EGL_DIRECT_COMPOSITION_ANGLE:
1597 *value = surface->directComposition();
1598 break;
1599 default:
1600 UNREACHABLE();
1601 break;
1602 }
1603}
1604
1605void SetSurfaceAttrib(Surface *surface, EGLint attribute, EGLint value)
1606{
1607 switch (attribute)
1608 {
1609 case EGL_MIPMAP_LEVEL:
Geoff Lang40ac7832017-07-26 14:38:46 -04001610 surface->setMipmapLevel(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04001611 break;
1612 case EGL_MULTISAMPLE_RESOLVE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001613 surface->setMultisampleResolve(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04001614 break;
1615 case EGL_SWAP_BEHAVIOR:
Geoff Lang40ac7832017-07-26 14:38:46 -04001616 surface->setSwapBehavior(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04001617 break;
1618 default:
1619 UNREACHABLE();
1620 break;
1621 }
1622}
1623
Geoff Lang65603eb2017-01-12 16:48:03 -05001624} // namespace egl