blob: 6468933760aae8c7524e6951f31b4ae7621494d5 [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
11#include "libANGLE/Buffer.h"
12#include "libANGLE/Framebuffer.h"
13#include "libANGLE/Program.h"
Geoff Lang740d9022016-10-07 11:20:52 -040014#include "libANGLE/Renderbuffer.h"
Geoff Langd7d0ed32016-10-07 11:33:51 -040015#include "libANGLE/Shader.h"
Geoff Langff5b2d52016-09-07 11:32:23 -040016
17namespace gl
18{
19void QueryFramebufferAttachmentParameteriv(const Framebuffer *framebuffer,
20 GLenum attachment,
21 GLenum pname,
22 GLint *params)
23{
24 ASSERT(framebuffer);
25
26 const FramebufferAttachment *attachmentObject = framebuffer->getAttachment(attachment);
27 if (attachmentObject == nullptr)
28 {
29 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
30 // is NONE, then querying any other pname will generate INVALID_ENUM.
31
32 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
33 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
34 // INVALID_OPERATION for all other pnames
35
36 switch (pname)
37 {
38 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
39 *params = GL_NONE;
40 break;
41
42 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
43 *params = 0;
44 break;
45
46 default:
47 UNREACHABLE();
48 break;
49 }
50
51 return;
52 }
53
54 switch (pname)
55 {
56 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
57 *params = attachmentObject->type();
58 break;
59
60 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
61 *params = attachmentObject->id();
62 break;
63
64 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
65 *params = attachmentObject->mipLevel();
66 break;
67
68 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
69 *params = attachmentObject->cubeMapFace();
70 break;
71
72 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
73 *params = attachmentObject->getRedSize();
74 break;
75
76 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
77 *params = attachmentObject->getGreenSize();
78 break;
79
80 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
81 *params = attachmentObject->getBlueSize();
82 break;
83
84 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
85 *params = attachmentObject->getAlphaSize();
86 break;
87
88 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
89 *params = attachmentObject->getDepthSize();
90 break;
91
92 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
93 *params = attachmentObject->getStencilSize();
94 break;
95
96 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
97 *params = attachmentObject->getComponentType();
98 break;
99
100 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
101 *params = attachmentObject->getColorEncoding();
102 break;
103
104 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
105 *params = attachmentObject->layer();
106 break;
107
108 default:
109 UNREACHABLE();
110 break;
111 }
112}
113
114void QueryBufferParameteriv(const Buffer *buffer, GLenum pname, GLint *params)
115{
116 ASSERT(buffer != nullptr);
117
118 switch (pname)
119 {
120 case GL_BUFFER_USAGE:
121 *params = static_cast<GLint>(buffer->getUsage());
122 break;
123 case GL_BUFFER_SIZE:
124 *params = clampCast<GLint>(buffer->getSize());
125 break;
126 case GL_BUFFER_ACCESS_FLAGS:
127 *params = buffer->getAccessFlags();
128 break;
129 case GL_BUFFER_ACCESS_OES:
130 *params = buffer->getAccess();
131 break;
132 case GL_BUFFER_MAPPED:
133 *params = static_cast<GLint>(buffer->isMapped());
134 break;
135 case GL_BUFFER_MAP_OFFSET:
136 *params = clampCast<GLint>(buffer->getMapOffset());
137 break;
138 case GL_BUFFER_MAP_LENGTH:
139 *params = clampCast<GLint>(buffer->getMapLength());
140 break;
141 default:
142 UNREACHABLE();
143 break;
144 }
145}
146
147void QueryProgramiv(const Program *program, GLenum pname, GLint *params)
148{
149 ASSERT(program != nullptr);
150
151 switch (pname)
152 {
153 case GL_DELETE_STATUS:
154 *params = program->isFlaggedForDeletion();
155 return;
156 case GL_LINK_STATUS:
157 *params = program->isLinked();
158 return;
159 case GL_VALIDATE_STATUS:
160 *params = program->isValidated();
161 return;
162 case GL_INFO_LOG_LENGTH:
163 *params = program->getInfoLogLength();
164 return;
165 case GL_ATTACHED_SHADERS:
166 *params = program->getAttachedShadersCount();
167 return;
168 case GL_ACTIVE_ATTRIBUTES:
169 *params = program->getActiveAttributeCount();
170 return;
171 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
172 *params = program->getActiveAttributeMaxLength();
173 return;
174 case GL_ACTIVE_UNIFORMS:
175 *params = program->getActiveUniformCount();
176 return;
177 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
178 *params = program->getActiveUniformMaxLength();
179 return;
180 case GL_PROGRAM_BINARY_LENGTH_OES:
181 *params = program->getBinaryLength();
182 return;
183 case GL_ACTIVE_UNIFORM_BLOCKS:
184 *params = program->getActiveUniformBlockCount();
185 return;
186 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
187 *params = program->getActiveUniformBlockMaxLength();
188 break;
189 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
190 *params = program->getTransformFeedbackBufferMode();
191 break;
192 case GL_TRANSFORM_FEEDBACK_VARYINGS:
193 *params = program->getTransformFeedbackVaryingCount();
194 break;
195 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
196 *params = program->getTransformFeedbackVaryingMaxLength();
197 break;
198 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
199 *params = program->getBinaryRetrievableHint();
200 break;
201 default:
202 UNREACHABLE();
203 break;
204 }
205}
Geoff Lang740d9022016-10-07 11:20:52 -0400206
207void QueryRenderbufferiv(const Renderbuffer *renderbuffer, GLenum pname, GLint *params)
208{
209 ASSERT(renderbuffer != nullptr);
210
211 switch (pname)
212 {
213 case GL_RENDERBUFFER_WIDTH:
214 *params = renderbuffer->getWidth();
215 break;
216 case GL_RENDERBUFFER_HEIGHT:
217 *params = renderbuffer->getHeight();
218 break;
219 case GL_RENDERBUFFER_INTERNAL_FORMAT:
220 *params = renderbuffer->getFormat().info->internalFormat;
221 break;
222 case GL_RENDERBUFFER_RED_SIZE:
223 *params = renderbuffer->getRedSize();
224 break;
225 case GL_RENDERBUFFER_GREEN_SIZE:
226 *params = renderbuffer->getGreenSize();
227 break;
228 case GL_RENDERBUFFER_BLUE_SIZE:
229 *params = renderbuffer->getBlueSize();
230 break;
231 case GL_RENDERBUFFER_ALPHA_SIZE:
232 *params = renderbuffer->getAlphaSize();
233 break;
234 case GL_RENDERBUFFER_DEPTH_SIZE:
235 *params = renderbuffer->getDepthSize();
236 break;
237 case GL_RENDERBUFFER_STENCIL_SIZE:
238 *params = renderbuffer->getStencilSize();
239 break;
240 case GL_RENDERBUFFER_SAMPLES_ANGLE:
241 *params = renderbuffer->getSamples();
242 break;
243 default:
244 UNREACHABLE();
245 break;
246 }
247}
Geoff Langd7d0ed32016-10-07 11:33:51 -0400248
249void QueryShaderiv(const Shader *shader, GLenum pname, GLint *params)
250{
251 ASSERT(shader != nullptr);
252
253 switch (pname)
254 {
255 case GL_SHADER_TYPE:
256 *params = shader->getType();
257 return;
258 case GL_DELETE_STATUS:
259 *params = shader->isFlaggedForDeletion();
260 return;
261 case GL_COMPILE_STATUS:
262 *params = shader->isCompiled() ? GL_TRUE : GL_FALSE;
263 return;
264 case GL_INFO_LOG_LENGTH:
265 *params = shader->getInfoLogLength();
266 return;
267 case GL_SHADER_SOURCE_LENGTH:
268 *params = shader->getSourceLength();
269 return;
270 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
271 *params = shader->getTranslatedSourceWithDebugInfoLength();
272 return;
273 default:
274 UNREACHABLE();
275 break;
276 }
277}
Geoff Langff5b2d52016-09-07 11:32:23 -0400278}