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