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