blob: 542834ff1a7be99a40135788f1075bef5bd1f401 [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"
14#include "libANGLE/Framebuffer.h"
15#include "libANGLE/Program.h"
Geoff Lang740d9022016-10-07 11:20:52 -040016#include "libANGLE/Renderbuffer.h"
Geoff Langc1984ed2016-10-07 12:41:00 -040017#include "libANGLE/Sampler.h"
Geoff Langd7d0ed32016-10-07 11:33:51 -040018#include "libANGLE/Shader.h"
Geoff Langc1984ed2016-10-07 12:41:00 -040019#include "libANGLE/Texture.h"
Geoff Langff5b2d52016-09-07 11:32:23 -040020
21namespace gl
22{
Geoff Langc1984ed2016-10-07 12:41:00 -040023
24namespace
25{
26template <typename ParamType>
27void QueryTexParameterBase(const Texture *texture, GLenum pname, ParamType *params)
28{
29 ASSERT(texture != nullptr);
30
31 switch (pname)
32 {
33 case GL_TEXTURE_MAG_FILTER:
34 *params = ConvertFromGLenum<ParamType>(texture->getMagFilter());
35 break;
36 case GL_TEXTURE_MIN_FILTER:
37 *params = ConvertFromGLenum<ParamType>(texture->getMinFilter());
38 break;
39 case GL_TEXTURE_WRAP_S:
40 *params = ConvertFromGLenum<ParamType>(texture->getWrapS());
41 break;
42 case GL_TEXTURE_WRAP_T:
43 *params = ConvertFromGLenum<ParamType>(texture->getWrapT());
44 break;
45 case GL_TEXTURE_WRAP_R:
46 *params = ConvertFromGLenum<ParamType>(texture->getWrapR());
47 break;
48 case GL_TEXTURE_IMMUTABLE_FORMAT:
49 *params = ConvertFromGLboolean<ParamType>(texture->getImmutableFormat());
50 break;
51 case GL_TEXTURE_IMMUTABLE_LEVELS:
52 *params = ConvertFromGLuint<ParamType>(texture->getImmutableLevels());
53 break;
54 case GL_TEXTURE_USAGE_ANGLE:
55 *params = ConvertFromGLenum<ParamType>(texture->getUsage());
56 break;
57 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
58 *params = ConvertFromGLfloat<ParamType>(texture->getMaxAnisotropy());
59 break;
60 case GL_TEXTURE_SWIZZLE_R:
61 *params = ConvertFromGLenum<ParamType>(texture->getSwizzleRed());
62 break;
63 case GL_TEXTURE_SWIZZLE_G:
64 *params = ConvertFromGLenum<ParamType>(texture->getSwizzleGreen());
65 break;
66 case GL_TEXTURE_SWIZZLE_B:
67 *params = ConvertFromGLenum<ParamType>(texture->getSwizzleBlue());
68 break;
69 case GL_TEXTURE_SWIZZLE_A:
70 *params = ConvertFromGLenum<ParamType>(texture->getSwizzleAlpha());
71 break;
72 case GL_TEXTURE_BASE_LEVEL:
73 *params = ConvertFromGLuint<ParamType>(texture->getBaseLevel());
74 break;
75 case GL_TEXTURE_MAX_LEVEL:
76 *params = ConvertFromGLuint<ParamType>(texture->getMaxLevel());
77 break;
78 case GL_TEXTURE_MIN_LOD:
79 *params = ConvertFromGLfloat<ParamType>(texture->getSamplerState().minLod);
80 break;
81 case GL_TEXTURE_MAX_LOD:
82 *params = ConvertFromGLfloat<ParamType>(texture->getSamplerState().maxLod);
83 break;
84 case GL_TEXTURE_COMPARE_MODE:
85 *params = ConvertFromGLenum<ParamType>(texture->getCompareMode());
86 break;
87 case GL_TEXTURE_COMPARE_FUNC:
88 *params = ConvertFromGLenum<ParamType>(texture->getCompareFunc());
89 break;
90 default:
91 UNREACHABLE();
92 break;
93 }
94}
95
96template <typename ParamType>
97void SetTexParameterBase(Texture *texture, GLenum pname, const ParamType *params)
98{
99 ASSERT(texture != nullptr);
100
101 switch (pname)
102 {
103 case GL_TEXTURE_WRAP_S:
104 texture->setWrapS(ConvertToGLenum(params[0]));
105 break;
106 case GL_TEXTURE_WRAP_T:
107 texture->setWrapT(ConvertToGLenum(params[0]));
108 break;
109 case GL_TEXTURE_WRAP_R:
110 texture->setWrapR(ConvertToGLenum(params[0]));
111 break;
112 case GL_TEXTURE_MIN_FILTER:
113 texture->setMinFilter(ConvertToGLenum(params[0]));
114 break;
115 case GL_TEXTURE_MAG_FILTER:
116 texture->setMagFilter(ConvertToGLenum(params[0]));
117 break;
118 case GL_TEXTURE_USAGE_ANGLE:
119 texture->setUsage(ConvertToGLenum(params[0]));
120 break;
121 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
122 texture->setMaxAnisotropy(ConvertToGLfloat(params[0]));
123 break;
124 case GL_TEXTURE_COMPARE_MODE:
125 texture->setCompareMode(ConvertToGLenum(params[0]));
126 break;
127 case GL_TEXTURE_COMPARE_FUNC:
128 texture->setCompareFunc(ConvertToGLenum(params[0]));
129 break;
130 case GL_TEXTURE_SWIZZLE_R:
131 texture->setSwizzleRed(ConvertToGLenum(params[0]));
132 break;
133 case GL_TEXTURE_SWIZZLE_G:
134 texture->setSwizzleGreen(ConvertToGLenum(params[0]));
135 break;
136 case GL_TEXTURE_SWIZZLE_B:
137 texture->setSwizzleBlue(ConvertToGLenum(params[0]));
138 break;
139 case GL_TEXTURE_SWIZZLE_A:
140 texture->setSwizzleAlpha(ConvertToGLenum(params[0]));
141 break;
142 case GL_TEXTURE_BASE_LEVEL:
143 texture->setBaseLevel(ConvertToGLuint(params[0]));
144 break;
145 case GL_TEXTURE_MAX_LEVEL:
146 texture->setMaxLevel(ConvertToGLuint(params[0]));
147 break;
148 case GL_TEXTURE_MIN_LOD:
149 texture->setMinLod(ConvertToGLfloat(params[0]));
150 break;
151 case GL_TEXTURE_MAX_LOD:
152 texture->setMaxLod(ConvertToGLfloat(params[0]));
153 break;
154 default:
155 UNREACHABLE();
156 break;
157 }
158}
159
160template <typename ParamType>
161void QuerySamplerParameterBase(const Sampler *sampler, GLenum pname, ParamType *params)
162{
163 switch (pname)
164 {
165 case GL_TEXTURE_MIN_FILTER:
166 *params = ConvertFromGLenum<ParamType>(sampler->getMinFilter());
167 break;
168 case GL_TEXTURE_MAG_FILTER:
169 *params = ConvertFromGLenum<ParamType>(sampler->getMagFilter());
170 break;
171 case GL_TEXTURE_WRAP_S:
172 *params = ConvertFromGLenum<ParamType>(sampler->getWrapS());
173 break;
174 case GL_TEXTURE_WRAP_T:
175 *params = ConvertFromGLenum<ParamType>(sampler->getWrapT());
176 break;
177 case GL_TEXTURE_WRAP_R:
178 *params = ConvertFromGLenum<ParamType>(sampler->getWrapR());
179 break;
180 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
181 *params = ConvertFromGLfloat<ParamType>(sampler->getMaxAnisotropy());
182 break;
183 case GL_TEXTURE_MIN_LOD:
184 *params = ConvertFromGLfloat<ParamType>(sampler->getMinLod());
185 break;
186 case GL_TEXTURE_MAX_LOD:
187 *params = ConvertFromGLfloat<ParamType>(sampler->getMaxLod());
188 break;
189 case GL_TEXTURE_COMPARE_MODE:
190 *params = ConvertFromGLenum<ParamType>(sampler->getCompareMode());
191 break;
192 case GL_TEXTURE_COMPARE_FUNC:
193 *params = ConvertFromGLenum<ParamType>(sampler->getCompareFunc());
194 break;
195 default:
196 UNREACHABLE();
197 break;
198 }
199}
200
201template <typename ParamType>
202void SetSamplerParameterBase(Sampler *sampler, GLenum pname, const ParamType *params)
203{
204 switch (pname)
205 {
206 case GL_TEXTURE_WRAP_S:
207 sampler->setWrapS(ConvertToGLenum(params[0]));
208 break;
209 case GL_TEXTURE_WRAP_T:
210 sampler->setWrapT(ConvertToGLenum(params[0]));
211 break;
212 case GL_TEXTURE_WRAP_R:
213 sampler->setWrapR(ConvertToGLenum(params[0]));
214 break;
215 case GL_TEXTURE_MIN_FILTER:
216 sampler->setMinFilter(ConvertToGLenum(params[0]));
217 break;
218 case GL_TEXTURE_MAG_FILTER:
219 sampler->setMagFilter(ConvertToGLenum(params[0]));
220 break;
221 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
222 sampler->setMaxAnisotropy(ConvertToGLfloat(params[0]));
223 break;
224 case GL_TEXTURE_COMPARE_MODE:
225 sampler->setCompareMode(ConvertToGLenum(params[0]));
226 break;
227 case GL_TEXTURE_COMPARE_FUNC:
228 sampler->setCompareFunc(ConvertToGLenum(params[0]));
229 break;
230 case GL_TEXTURE_MIN_LOD:
231 sampler->setMinLod(ConvertToGLfloat(params[0]));
232 break;
233 case GL_TEXTURE_MAX_LOD:
234 sampler->setMaxLod(ConvertToGLfloat(params[0]));
235 break;
236 default:
237 UNREACHABLE();
238 break;
239 }
240}
241
242} // anonymous namespace
243
Geoff Langff5b2d52016-09-07 11:32:23 -0400244void QueryFramebufferAttachmentParameteriv(const Framebuffer *framebuffer,
245 GLenum attachment,
246 GLenum pname,
247 GLint *params)
248{
249 ASSERT(framebuffer);
250
251 const FramebufferAttachment *attachmentObject = framebuffer->getAttachment(attachment);
252 if (attachmentObject == nullptr)
253 {
254 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
255 // is NONE, then querying any other pname will generate INVALID_ENUM.
256
257 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
258 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
259 // INVALID_OPERATION for all other pnames
260
261 switch (pname)
262 {
263 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
264 *params = GL_NONE;
265 break;
266
267 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
268 *params = 0;
269 break;
270
271 default:
272 UNREACHABLE();
273 break;
274 }
275
276 return;
277 }
278
279 switch (pname)
280 {
281 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
282 *params = attachmentObject->type();
283 break;
284
285 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
286 *params = attachmentObject->id();
287 break;
288
289 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
290 *params = attachmentObject->mipLevel();
291 break;
292
293 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
294 *params = attachmentObject->cubeMapFace();
295 break;
296
297 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
298 *params = attachmentObject->getRedSize();
299 break;
300
301 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
302 *params = attachmentObject->getGreenSize();
303 break;
304
305 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
306 *params = attachmentObject->getBlueSize();
307 break;
308
309 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
310 *params = attachmentObject->getAlphaSize();
311 break;
312
313 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
314 *params = attachmentObject->getDepthSize();
315 break;
316
317 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
318 *params = attachmentObject->getStencilSize();
319 break;
320
321 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
322 *params = attachmentObject->getComponentType();
323 break;
324
325 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
326 *params = attachmentObject->getColorEncoding();
327 break;
328
329 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
330 *params = attachmentObject->layer();
331 break;
332
333 default:
334 UNREACHABLE();
335 break;
336 }
337}
338
339void QueryBufferParameteriv(const Buffer *buffer, GLenum pname, GLint *params)
340{
341 ASSERT(buffer != nullptr);
342
343 switch (pname)
344 {
345 case GL_BUFFER_USAGE:
346 *params = static_cast<GLint>(buffer->getUsage());
347 break;
348 case GL_BUFFER_SIZE:
349 *params = clampCast<GLint>(buffer->getSize());
350 break;
351 case GL_BUFFER_ACCESS_FLAGS:
352 *params = buffer->getAccessFlags();
353 break;
354 case GL_BUFFER_ACCESS_OES:
355 *params = buffer->getAccess();
356 break;
357 case GL_BUFFER_MAPPED:
358 *params = static_cast<GLint>(buffer->isMapped());
359 break;
360 case GL_BUFFER_MAP_OFFSET:
361 *params = clampCast<GLint>(buffer->getMapOffset());
362 break;
363 case GL_BUFFER_MAP_LENGTH:
364 *params = clampCast<GLint>(buffer->getMapLength());
365 break;
366 default:
367 UNREACHABLE();
368 break;
369 }
370}
371
372void QueryProgramiv(const Program *program, GLenum pname, GLint *params)
373{
374 ASSERT(program != nullptr);
375
376 switch (pname)
377 {
378 case GL_DELETE_STATUS:
379 *params = program->isFlaggedForDeletion();
380 return;
381 case GL_LINK_STATUS:
382 *params = program->isLinked();
383 return;
384 case GL_VALIDATE_STATUS:
385 *params = program->isValidated();
386 return;
387 case GL_INFO_LOG_LENGTH:
388 *params = program->getInfoLogLength();
389 return;
390 case GL_ATTACHED_SHADERS:
391 *params = program->getAttachedShadersCount();
392 return;
393 case GL_ACTIVE_ATTRIBUTES:
394 *params = program->getActiveAttributeCount();
395 return;
396 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
397 *params = program->getActiveAttributeMaxLength();
398 return;
399 case GL_ACTIVE_UNIFORMS:
400 *params = program->getActiveUniformCount();
401 return;
402 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
403 *params = program->getActiveUniformMaxLength();
404 return;
405 case GL_PROGRAM_BINARY_LENGTH_OES:
406 *params = program->getBinaryLength();
407 return;
408 case GL_ACTIVE_UNIFORM_BLOCKS:
409 *params = program->getActiveUniformBlockCount();
410 return;
411 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
412 *params = program->getActiveUniformBlockMaxLength();
413 break;
414 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
415 *params = program->getTransformFeedbackBufferMode();
416 break;
417 case GL_TRANSFORM_FEEDBACK_VARYINGS:
418 *params = program->getTransformFeedbackVaryingCount();
419 break;
420 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
421 *params = program->getTransformFeedbackVaryingMaxLength();
422 break;
423 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
424 *params = program->getBinaryRetrievableHint();
425 break;
426 default:
427 UNREACHABLE();
428 break;
429 }
430}
Geoff Lang740d9022016-10-07 11:20:52 -0400431
432void QueryRenderbufferiv(const Renderbuffer *renderbuffer, GLenum pname, GLint *params)
433{
434 ASSERT(renderbuffer != nullptr);
435
436 switch (pname)
437 {
438 case GL_RENDERBUFFER_WIDTH:
439 *params = renderbuffer->getWidth();
440 break;
441 case GL_RENDERBUFFER_HEIGHT:
442 *params = renderbuffer->getHeight();
443 break;
444 case GL_RENDERBUFFER_INTERNAL_FORMAT:
445 *params = renderbuffer->getFormat().info->internalFormat;
446 break;
447 case GL_RENDERBUFFER_RED_SIZE:
448 *params = renderbuffer->getRedSize();
449 break;
450 case GL_RENDERBUFFER_GREEN_SIZE:
451 *params = renderbuffer->getGreenSize();
452 break;
453 case GL_RENDERBUFFER_BLUE_SIZE:
454 *params = renderbuffer->getBlueSize();
455 break;
456 case GL_RENDERBUFFER_ALPHA_SIZE:
457 *params = renderbuffer->getAlphaSize();
458 break;
459 case GL_RENDERBUFFER_DEPTH_SIZE:
460 *params = renderbuffer->getDepthSize();
461 break;
462 case GL_RENDERBUFFER_STENCIL_SIZE:
463 *params = renderbuffer->getStencilSize();
464 break;
465 case GL_RENDERBUFFER_SAMPLES_ANGLE:
466 *params = renderbuffer->getSamples();
467 break;
468 default:
469 UNREACHABLE();
470 break;
471 }
472}
Geoff Langd7d0ed32016-10-07 11:33:51 -0400473
474void QueryShaderiv(const Shader *shader, GLenum pname, GLint *params)
475{
476 ASSERT(shader != nullptr);
477
478 switch (pname)
479 {
480 case GL_SHADER_TYPE:
481 *params = shader->getType();
482 return;
483 case GL_DELETE_STATUS:
484 *params = shader->isFlaggedForDeletion();
485 return;
486 case GL_COMPILE_STATUS:
487 *params = shader->isCompiled() ? GL_TRUE : GL_FALSE;
488 return;
489 case GL_INFO_LOG_LENGTH:
490 *params = shader->getInfoLogLength();
491 return;
492 case GL_SHADER_SOURCE_LENGTH:
493 *params = shader->getSourceLength();
494 return;
495 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
496 *params = shader->getTranslatedSourceWithDebugInfoLength();
497 return;
498 default:
499 UNREACHABLE();
500 break;
501 }
502}
Geoff Langc1984ed2016-10-07 12:41:00 -0400503
504void QueryTexParameterfv(const Texture *texture, GLenum pname, GLfloat *params)
505{
506 QueryTexParameterBase(texture, pname, params);
507}
508
509void QueryTexParameteriv(const Texture *texture, GLenum pname, GLint *params)
510{
511 QueryTexParameterBase(texture, pname, params);
512}
513
514void QuerySamplerParameterfv(const Sampler *sampler, GLenum pname, GLfloat *params)
515{
516 QuerySamplerParameterBase(sampler, pname, params);
517}
518
519void QuerySamplerParameteriv(const Sampler *sampler, GLenum pname, GLint *params)
520{
521 QuerySamplerParameterBase(sampler, pname, params);
522}
523
524void SetTexParameterf(Texture *texture, GLenum pname, GLfloat param)
525{
526 SetTexParameterBase(texture, pname, &param);
527}
528
529void SetTexParameterfv(Texture *texture, GLenum pname, const GLfloat *params)
530{
531 SetTexParameterBase(texture, pname, params);
532}
533
534void SetTexParameteri(Texture *texture, GLenum pname, GLint param)
535{
536 SetTexParameterBase(texture, pname, &param);
537}
538
539void SetTexParameteriv(Texture *texture, GLenum pname, const GLint *params)
540{
541 SetTexParameterBase(texture, pname, params);
542}
543
544void SetSamplerParameterf(Sampler *sampler, GLenum pname, GLfloat param)
545{
546 SetSamplerParameterBase(sampler, pname, &param);
547}
548
549void SetSamplerParameterfv(Sampler *sampler, GLenum pname, const GLfloat *params)
550{
551 SetSamplerParameterBase(sampler, pname, params);
552}
553
554void SetSamplerParameteri(Sampler *sampler, GLenum pname, GLint param)
555{
556 SetSamplerParameterBase(sampler, pname, &param);
557}
558
559void SetSamplerParameteriv(Sampler *sampler, GLenum pname, const GLint *params)
560{
561 SetSamplerParameterBase(sampler, pname, params);
562}
Geoff Langff5b2d52016-09-07 11:32:23 -0400563}