blob: 5c5a0f4ab7971b94241e60b7922040615d7f3661 [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"
jchen10a99ed552017-09-22 08:10:32 +080026#include "libANGLE/queryconversions.h"
Geoff Langff5b2d52016-09-07 11:32:23 -040027
28namespace gl
29{
Geoff Langc1984ed2016-10-07 12:41:00 -040030
31namespace
32{
jchen10a99ed552017-09-22 08:10:32 +080033
Geoff Langc1984ed2016-10-07 12:41:00 -040034template <typename ParamType>
He Yunchao11b038b2016-11-22 21:24:04 +080035void QueryTexLevelParameterBase(const Texture *texture,
36 GLenum target,
37 GLint level,
38 GLenum pname,
39 ParamType *params)
40{
41 ASSERT(texture != nullptr);
42 const InternalFormat *info = texture->getTextureState().getImageDesc(target, level).format.info;
43
44 switch (pname)
45 {
46 case GL_TEXTURE_RED_TYPE:
jchen10a99ed552017-09-22 08:10:32 +080047 *params = CastFromGLintStateValue<ParamType>(
48 pname, info->redBits ? info->componentType : GL_NONE);
He Yunchao11b038b2016-11-22 21:24:04 +080049 break;
50 case GL_TEXTURE_GREEN_TYPE:
jchen10a99ed552017-09-22 08:10:32 +080051 *params = CastFromGLintStateValue<ParamType>(
52 pname, info->greenBits ? info->componentType : GL_NONE);
He Yunchao11b038b2016-11-22 21:24:04 +080053 break;
54 case GL_TEXTURE_BLUE_TYPE:
jchen10a99ed552017-09-22 08:10:32 +080055 *params = CastFromGLintStateValue<ParamType>(
56 pname, info->blueBits ? info->componentType : GL_NONE);
He Yunchao11b038b2016-11-22 21:24:04 +080057 break;
58 case GL_TEXTURE_ALPHA_TYPE:
jchen10a99ed552017-09-22 08:10:32 +080059 *params = CastFromGLintStateValue<ParamType>(
60 pname, info->alphaBits ? info->componentType : GL_NONE);
He Yunchao11b038b2016-11-22 21:24:04 +080061 break;
62 case GL_TEXTURE_DEPTH_TYPE:
jchen10a99ed552017-09-22 08:10:32 +080063 *params = CastFromGLintStateValue<ParamType>(
64 pname, info->depthBits ? info->componentType : GL_NONE);
He Yunchao11b038b2016-11-22 21:24:04 +080065 break;
66 case GL_TEXTURE_RED_SIZE:
jchen10a99ed552017-09-22 08:10:32 +080067 *params = CastFromGLintStateValue<ParamType>(pname, info->redBits);
He Yunchao11b038b2016-11-22 21:24:04 +080068 break;
69 case GL_TEXTURE_GREEN_SIZE:
jchen10a99ed552017-09-22 08:10:32 +080070 *params = CastFromGLintStateValue<ParamType>(pname, info->greenBits);
He Yunchao11b038b2016-11-22 21:24:04 +080071 break;
72 case GL_TEXTURE_BLUE_SIZE:
jchen10a99ed552017-09-22 08:10:32 +080073 *params = CastFromGLintStateValue<ParamType>(pname, info->blueBits);
He Yunchao11b038b2016-11-22 21:24:04 +080074 break;
75 case GL_TEXTURE_ALPHA_SIZE:
jchen10a99ed552017-09-22 08:10:32 +080076 *params = CastFromGLintStateValue<ParamType>(pname, info->alphaBits);
He Yunchao11b038b2016-11-22 21:24:04 +080077 break;
78 case GL_TEXTURE_DEPTH_SIZE:
jchen10a99ed552017-09-22 08:10:32 +080079 *params = CastFromGLintStateValue<ParamType>(pname, info->depthBits);
He Yunchao11b038b2016-11-22 21:24:04 +080080 break;
81 case GL_TEXTURE_STENCIL_SIZE:
jchen10a99ed552017-09-22 08:10:32 +080082 *params = CastFromGLintStateValue<ParamType>(pname, info->stencilBits);
He Yunchao11b038b2016-11-22 21:24:04 +080083 break;
84 case GL_TEXTURE_SHARED_SIZE:
jchen10a99ed552017-09-22 08:10:32 +080085 *params = CastFromGLintStateValue<ParamType>(pname, info->sharedBits);
He Yunchao11b038b2016-11-22 21:24:04 +080086 break;
87 case GL_TEXTURE_INTERNAL_FORMAT:
jchen10a99ed552017-09-22 08:10:32 +080088 *params = CastFromGLintStateValue<ParamType>(
89 pname, info->internalFormat ? info->internalFormat : GL_RGBA);
He Yunchao11b038b2016-11-22 21:24:04 +080090 break;
91 case GL_TEXTURE_WIDTH:
Corentin Wallez10d40262017-10-04 16:34:09 -040092 *params = CastFromGLintStateValue<ParamType>(
93 pname, static_cast<uint32_t>(texture->getWidth(target, level)));
He Yunchao11b038b2016-11-22 21:24:04 +080094 break;
95 case GL_TEXTURE_HEIGHT:
Corentin Wallez10d40262017-10-04 16:34:09 -040096 *params = CastFromGLintStateValue<ParamType>(
97 pname, static_cast<uint32_t>(texture->getHeight(target, level)));
He Yunchao11b038b2016-11-22 21:24:04 +080098 break;
99 case GL_TEXTURE_DEPTH:
Corentin Wallez10d40262017-10-04 16:34:09 -0400100 *params = CastFromGLintStateValue<ParamType>(
101 pname, static_cast<uint32_t>(texture->getDepth(target, level)));
He Yunchao11b038b2016-11-22 21:24:04 +0800102 break;
103 case GL_TEXTURE_SAMPLES:
jchen10a99ed552017-09-22 08:10:32 +0800104 *params = CastFromStateValue<ParamType>(pname, texture->getSamples(target, level));
He Yunchao11b038b2016-11-22 21:24:04 +0800105 break;
106 case GL_TEXTURE_FIXED_SAMPLE_LOCATIONS:
jchen10a99ed552017-09-22 08:10:32 +0800107 *params = CastFromStateValue<ParamType>(
108 pname, static_cast<GLint>(texture->getFixedSampleLocations(target, level)));
He Yunchao11b038b2016-11-22 21:24:04 +0800109 break;
110 case GL_TEXTURE_COMPRESSED:
jchen10a99ed552017-09-22 08:10:32 +0800111 *params = CastFromStateValue<ParamType>(pname, static_cast<GLint>(info->compressed));
He Yunchao11b038b2016-11-22 21:24:04 +0800112 break;
113 default:
114 UNREACHABLE();
115 break;
116 }
117}
118
119template <typename ParamType>
Geoff Langc1984ed2016-10-07 12:41:00 -0400120void QueryTexParameterBase(const Texture *texture, GLenum pname, ParamType *params)
121{
122 ASSERT(texture != nullptr);
123
124 switch (pname)
125 {
126 case GL_TEXTURE_MAG_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800127 *params = CastFromGLintStateValue<ParamType>(pname, texture->getMagFilter());
Geoff Langc1984ed2016-10-07 12:41:00 -0400128 break;
129 case GL_TEXTURE_MIN_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800130 *params = CastFromGLintStateValue<ParamType>(pname, texture->getMinFilter());
Geoff Langc1984ed2016-10-07 12:41:00 -0400131 break;
132 case GL_TEXTURE_WRAP_S:
jchen10a99ed552017-09-22 08:10:32 +0800133 *params = CastFromGLintStateValue<ParamType>(pname, texture->getWrapS());
Geoff Langc1984ed2016-10-07 12:41:00 -0400134 break;
135 case GL_TEXTURE_WRAP_T:
jchen10a99ed552017-09-22 08:10:32 +0800136 *params = CastFromGLintStateValue<ParamType>(pname, texture->getWrapT());
Geoff Langc1984ed2016-10-07 12:41:00 -0400137 break;
138 case GL_TEXTURE_WRAP_R:
jchen10a99ed552017-09-22 08:10:32 +0800139 *params = CastFromGLintStateValue<ParamType>(pname, texture->getWrapR());
Geoff Langc1984ed2016-10-07 12:41:00 -0400140 break;
141 case GL_TEXTURE_IMMUTABLE_FORMAT:
jchen10a99ed552017-09-22 08:10:32 +0800142 *params = CastFromGLintStateValue<ParamType>(pname, texture->getImmutableFormat());
Geoff Langc1984ed2016-10-07 12:41:00 -0400143 break;
144 case GL_TEXTURE_IMMUTABLE_LEVELS:
jchen10a99ed552017-09-22 08:10:32 +0800145 *params = CastFromGLintStateValue<ParamType>(pname, texture->getImmutableLevels());
Geoff Langc1984ed2016-10-07 12:41:00 -0400146 break;
147 case GL_TEXTURE_USAGE_ANGLE:
jchen10a99ed552017-09-22 08:10:32 +0800148 *params = CastFromGLintStateValue<ParamType>(pname, texture->getUsage());
Geoff Langc1984ed2016-10-07 12:41:00 -0400149 break;
150 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800151 *params = CastFromStateValue<ParamType>(pname, texture->getMaxAnisotropy());
Geoff Langc1984ed2016-10-07 12:41:00 -0400152 break;
153 case GL_TEXTURE_SWIZZLE_R:
jchen10a99ed552017-09-22 08:10:32 +0800154 *params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleRed());
Geoff Langc1984ed2016-10-07 12:41:00 -0400155 break;
156 case GL_TEXTURE_SWIZZLE_G:
jchen10a99ed552017-09-22 08:10:32 +0800157 *params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleGreen());
Geoff Langc1984ed2016-10-07 12:41:00 -0400158 break;
159 case GL_TEXTURE_SWIZZLE_B:
jchen10a99ed552017-09-22 08:10:32 +0800160 *params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleBlue());
Geoff Langc1984ed2016-10-07 12:41:00 -0400161 break;
162 case GL_TEXTURE_SWIZZLE_A:
jchen10a99ed552017-09-22 08:10:32 +0800163 *params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleAlpha());
Geoff Langc1984ed2016-10-07 12:41:00 -0400164 break;
165 case GL_TEXTURE_BASE_LEVEL:
jchen10a99ed552017-09-22 08:10:32 +0800166 *params = CastFromGLintStateValue<ParamType>(pname, texture->getBaseLevel());
Geoff Langc1984ed2016-10-07 12:41:00 -0400167 break;
168 case GL_TEXTURE_MAX_LEVEL:
jchen10a99ed552017-09-22 08:10:32 +0800169 *params = CastFromGLintStateValue<ParamType>(pname, texture->getMaxLevel());
Geoff Langc1984ed2016-10-07 12:41:00 -0400170 break;
171 case GL_TEXTURE_MIN_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800172 *params = CastFromStateValue<ParamType>(pname, texture->getSamplerState().minLod);
Geoff Langc1984ed2016-10-07 12:41:00 -0400173 break;
174 case GL_TEXTURE_MAX_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800175 *params = CastFromStateValue<ParamType>(pname, texture->getSamplerState().maxLod);
Geoff Langc1984ed2016-10-07 12:41:00 -0400176 break;
177 case GL_TEXTURE_COMPARE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800178 *params = CastFromGLintStateValue<ParamType>(pname, texture->getCompareMode());
Geoff Langc1984ed2016-10-07 12:41:00 -0400179 break;
180 case GL_TEXTURE_COMPARE_FUNC:
jchen10a99ed552017-09-22 08:10:32 +0800181 *params = CastFromGLintStateValue<ParamType>(pname, texture->getCompareFunc());
Geoff Langc1984ed2016-10-07 12:41:00 -0400182 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700183 case GL_TEXTURE_SRGB_DECODE_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800184 *params = CastFromGLintStateValue<ParamType>(pname, texture->getSRGBDecode());
Geoff Lang81c6b572016-10-19 14:07:52 -0700185 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400186 default:
187 UNREACHABLE();
188 break;
189 }
190}
191
192template <typename ParamType>
Jamie Madill4928b7c2017-06-20 12:57:39 -0400193void SetTexParameterBase(Context *context, Texture *texture, GLenum pname, const ParamType *params)
Geoff Langc1984ed2016-10-07 12:41:00 -0400194{
195 ASSERT(texture != nullptr);
196
197 switch (pname)
198 {
199 case GL_TEXTURE_WRAP_S:
jchen10a99ed552017-09-22 08:10:32 +0800200 texture->setWrapS(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400201 break;
202 case GL_TEXTURE_WRAP_T:
jchen10a99ed552017-09-22 08:10:32 +0800203 texture->setWrapT(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400204 break;
205 case GL_TEXTURE_WRAP_R:
jchen10a99ed552017-09-22 08:10:32 +0800206 texture->setWrapR(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400207 break;
208 case GL_TEXTURE_MIN_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800209 texture->setMinFilter(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400210 break;
211 case GL_TEXTURE_MAG_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800212 texture->setMagFilter(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400213 break;
214 case GL_TEXTURE_USAGE_ANGLE:
jchen10a99ed552017-09-22 08:10:32 +0800215 texture->setUsage(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400216 break;
217 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800218 texture->setMaxAnisotropy(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400219 break;
220 case GL_TEXTURE_COMPARE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800221 texture->setCompareMode(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400222 break;
223 case GL_TEXTURE_COMPARE_FUNC:
jchen10a99ed552017-09-22 08:10:32 +0800224 texture->setCompareFunc(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400225 break;
226 case GL_TEXTURE_SWIZZLE_R:
jchen10a99ed552017-09-22 08:10:32 +0800227 texture->setSwizzleRed(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400228 break;
229 case GL_TEXTURE_SWIZZLE_G:
jchen10a99ed552017-09-22 08:10:32 +0800230 texture->setSwizzleGreen(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400231 break;
232 case GL_TEXTURE_SWIZZLE_B:
jchen10a99ed552017-09-22 08:10:32 +0800233 texture->setSwizzleBlue(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400234 break;
235 case GL_TEXTURE_SWIZZLE_A:
jchen10a99ed552017-09-22 08:10:32 +0800236 texture->setSwizzleAlpha(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400237 break;
238 case GL_TEXTURE_BASE_LEVEL:
Jamie Madill4928b7c2017-06-20 12:57:39 -0400239 {
jchen10a99ed552017-09-22 08:10:32 +0800240 context->handleError(texture->setBaseLevel(
241 context, clampCast<GLuint>(CastQueryValueTo<GLint>(pname, params[0]))));
Geoff Langc1984ed2016-10-07 12:41:00 -0400242 break;
Jamie Madill4928b7c2017-06-20 12:57:39 -0400243 }
Geoff Langc1984ed2016-10-07 12:41:00 -0400244 case GL_TEXTURE_MAX_LEVEL:
jchen10a99ed552017-09-22 08:10:32 +0800245 texture->setMaxLevel(clampCast<GLuint>(CastQueryValueTo<GLint>(pname, params[0])));
Geoff Langc1984ed2016-10-07 12:41:00 -0400246 break;
247 case GL_TEXTURE_MIN_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800248 texture->setMinLod(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400249 break;
250 case GL_TEXTURE_MAX_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800251 texture->setMaxLod(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400252 break;
Geoff Lang3b573612016-10-31 14:08:10 -0400253 case GL_DEPTH_STENCIL_TEXTURE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800254 texture->setDepthStencilTextureMode(ConvertToGLenum(pname, params[0]));
Geoff Lang3b573612016-10-31 14:08:10 -0400255 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700256 case GL_TEXTURE_SRGB_DECODE_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800257 texture->setSRGBDecode(ConvertToGLenum(pname, params[0]));
Geoff Lang81c6b572016-10-19 14:07:52 -0700258 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400259 default:
260 UNREACHABLE();
261 break;
262 }
263}
264
265template <typename ParamType>
266void QuerySamplerParameterBase(const Sampler *sampler, GLenum pname, ParamType *params)
267{
268 switch (pname)
269 {
270 case GL_TEXTURE_MIN_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800271 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getMinFilter());
Geoff Langc1984ed2016-10-07 12:41:00 -0400272 break;
273 case GL_TEXTURE_MAG_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800274 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getMagFilter());
Geoff Langc1984ed2016-10-07 12:41:00 -0400275 break;
276 case GL_TEXTURE_WRAP_S:
jchen10a99ed552017-09-22 08:10:32 +0800277 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getWrapS());
Geoff Langc1984ed2016-10-07 12:41:00 -0400278 break;
279 case GL_TEXTURE_WRAP_T:
jchen10a99ed552017-09-22 08:10:32 +0800280 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getWrapT());
Geoff Langc1984ed2016-10-07 12:41:00 -0400281 break;
282 case GL_TEXTURE_WRAP_R:
jchen10a99ed552017-09-22 08:10:32 +0800283 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getWrapR());
Geoff Langc1984ed2016-10-07 12:41:00 -0400284 break;
285 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800286 *params = CastFromStateValue<ParamType>(pname, sampler->getMaxAnisotropy());
Geoff Langc1984ed2016-10-07 12:41:00 -0400287 break;
288 case GL_TEXTURE_MIN_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800289 *params = CastFromStateValue<ParamType>(pname, sampler->getMinLod());
Geoff Langc1984ed2016-10-07 12:41:00 -0400290 break;
291 case GL_TEXTURE_MAX_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800292 *params = CastFromStateValue<ParamType>(pname, sampler->getMaxLod());
Geoff Langc1984ed2016-10-07 12:41:00 -0400293 break;
294 case GL_TEXTURE_COMPARE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800295 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getCompareMode());
Geoff Langc1984ed2016-10-07 12:41:00 -0400296 break;
297 case GL_TEXTURE_COMPARE_FUNC:
jchen10a99ed552017-09-22 08:10:32 +0800298 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getCompareFunc());
Geoff Langc1984ed2016-10-07 12:41:00 -0400299 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700300 case GL_TEXTURE_SRGB_DECODE_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800301 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getSRGBDecode());
Geoff Lang81c6b572016-10-19 14:07:52 -0700302 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400303 default:
304 UNREACHABLE();
305 break;
306 }
307}
308
309template <typename ParamType>
310void SetSamplerParameterBase(Sampler *sampler, GLenum pname, const ParamType *params)
311{
312 switch (pname)
313 {
314 case GL_TEXTURE_WRAP_S:
jchen10a99ed552017-09-22 08:10:32 +0800315 sampler->setWrapS(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400316 break;
317 case GL_TEXTURE_WRAP_T:
jchen10a99ed552017-09-22 08:10:32 +0800318 sampler->setWrapT(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400319 break;
320 case GL_TEXTURE_WRAP_R:
jchen10a99ed552017-09-22 08:10:32 +0800321 sampler->setWrapR(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400322 break;
323 case GL_TEXTURE_MIN_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800324 sampler->setMinFilter(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400325 break;
326 case GL_TEXTURE_MAG_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800327 sampler->setMagFilter(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400328 break;
329 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800330 sampler->setMaxAnisotropy(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400331 break;
332 case GL_TEXTURE_COMPARE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800333 sampler->setCompareMode(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400334 break;
335 case GL_TEXTURE_COMPARE_FUNC:
jchen10a99ed552017-09-22 08:10:32 +0800336 sampler->setCompareFunc(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400337 break;
338 case GL_TEXTURE_MIN_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800339 sampler->setMinLod(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400340 break;
341 case GL_TEXTURE_MAX_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800342 sampler->setMaxLod(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400343 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700344 case GL_TEXTURE_SRGB_DECODE_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800345 sampler->setSRGBDecode(ConvertToGLenum(pname, params[0]));
Geoff Lang81c6b572016-10-19 14:07:52 -0700346 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400347 default:
348 UNREACHABLE();
349 break;
350 }
351}
352
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800353// Warning: you should ensure binding really matches attrib.bindingIndex before using this function.
Geoff Lang0b031062016-10-13 14:30:04 -0400354template <typename ParamType, typename CurrentDataType, size_t CurrentValueCount>
355void QueryVertexAttribBase(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800356 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -0400357 const CurrentDataType (&currentValueData)[CurrentValueCount],
358 GLenum pname,
359 ParamType *params)
360{
361 switch (pname)
362 {
363 case GL_CURRENT_VERTEX_ATTRIB:
364 for (size_t i = 0; i < CurrentValueCount; ++i)
365 {
jchen10a99ed552017-09-22 08:10:32 +0800366 params[i] = CastFromStateValue<ParamType>(pname, currentValueData[i]);
Geoff Lang0b031062016-10-13 14:30:04 -0400367 }
368 break;
369 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
jchen10a99ed552017-09-22 08:10:32 +0800370 *params = CastFromStateValue<ParamType>(pname, static_cast<GLint>(attrib.enabled));
Geoff Lang0b031062016-10-13 14:30:04 -0400371 break;
372 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
jchen10a99ed552017-09-22 08:10:32 +0800373 *params = CastFromGLintStateValue<ParamType>(pname, attrib.size);
Geoff Lang0b031062016-10-13 14:30:04 -0400374 break;
375 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
jchen10a99ed552017-09-22 08:10:32 +0800376 *params = CastFromGLintStateValue<ParamType>(pname, attrib.vertexAttribArrayStride);
Geoff Lang0b031062016-10-13 14:30:04 -0400377 break;
378 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
jchen10a99ed552017-09-22 08:10:32 +0800379 *params = CastFromGLintStateValue<ParamType>(pname, attrib.type);
Geoff Lang0b031062016-10-13 14:30:04 -0400380 break;
381 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
jchen10a99ed552017-09-22 08:10:32 +0800382 *params = CastFromStateValue<ParamType>(pname, static_cast<GLint>(attrib.normalized));
Geoff Lang0b031062016-10-13 14:30:04 -0400383 break;
384 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
jchen10a99ed552017-09-22 08:10:32 +0800385 *params = CastFromGLintStateValue<ParamType>(pname, binding.getBuffer().id());
Geoff Lang0b031062016-10-13 14:30:04 -0400386 break;
387 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
jchen10a99ed552017-09-22 08:10:32 +0800388 *params = CastFromGLintStateValue<ParamType>(pname, binding.getDivisor());
Geoff Lang0b031062016-10-13 14:30:04 -0400389 break;
390 case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
jchen10a99ed552017-09-22 08:10:32 +0800391 *params = CastFromGLintStateValue<ParamType>(pname, attrib.pureInteger);
Geoff Lang0b031062016-10-13 14:30:04 -0400392 break;
Shao80957d92017-02-20 21:25:59 +0800393 case GL_VERTEX_ATTRIB_BINDING:
jchen10a99ed552017-09-22 08:10:32 +0800394 *params = CastFromGLintStateValue<ParamType>(pname, attrib.bindingIndex);
Shao80957d92017-02-20 21:25:59 +0800395 break;
396 case GL_VERTEX_ATTRIB_RELATIVE_OFFSET:
jchen10a99ed552017-09-22 08:10:32 +0800397 *params = CastFromGLintStateValue<ParamType>(pname, attrib.relativeOffset);
Shao80957d92017-02-20 21:25:59 +0800398 break;
Geoff Lang0b031062016-10-13 14:30:04 -0400399 default:
400 UNREACHABLE();
401 break;
402 }
403}
404
Geoff Langebebe1c2016-10-14 12:01:31 -0400405template <typename ParamType>
406void QueryBufferParameterBase(const Buffer *buffer, GLenum pname, ParamType *params)
407{
408 ASSERT(buffer != nullptr);
409
410 switch (pname)
411 {
412 case GL_BUFFER_USAGE:
jchen10a99ed552017-09-22 08:10:32 +0800413 *params = CastFromGLintStateValue<ParamType>(pname, buffer->getUsage());
Geoff Langebebe1c2016-10-14 12:01:31 -0400414 break;
415 case GL_BUFFER_SIZE:
jchen10a99ed552017-09-22 08:10:32 +0800416 *params = CastFromStateValue<ParamType>(pname, buffer->getSize());
Geoff Langebebe1c2016-10-14 12:01:31 -0400417 break;
418 case GL_BUFFER_ACCESS_FLAGS:
jchen10a99ed552017-09-22 08:10:32 +0800419 *params = CastFromGLintStateValue<ParamType>(pname, buffer->getAccessFlags());
Geoff Langebebe1c2016-10-14 12:01:31 -0400420 break;
421 case GL_BUFFER_ACCESS_OES:
jchen10a99ed552017-09-22 08:10:32 +0800422 *params = CastFromGLintStateValue<ParamType>(pname, buffer->getAccess());
Geoff Langebebe1c2016-10-14 12:01:31 -0400423 break;
424 case GL_BUFFER_MAPPED:
jchen10a99ed552017-09-22 08:10:32 +0800425 *params = CastFromStateValue<ParamType>(pname, buffer->isMapped());
Geoff Langebebe1c2016-10-14 12:01:31 -0400426 break;
427 case GL_BUFFER_MAP_OFFSET:
jchen10a99ed552017-09-22 08:10:32 +0800428 *params = CastFromStateValue<ParamType>(pname, buffer->getMapOffset());
Geoff Langebebe1c2016-10-14 12:01:31 -0400429 break;
430 case GL_BUFFER_MAP_LENGTH:
jchen10a99ed552017-09-22 08:10:32 +0800431 *params = CastFromStateValue<ParamType>(pname, buffer->getMapLength());
Geoff Langebebe1c2016-10-14 12:01:31 -0400432 break;
433 default:
434 UNREACHABLE();
435 break;
436 }
437}
438
jchen10880683b2017-04-12 16:21:55 +0800439GLint GetLocationVariableProperty(const sh::VariableWithLocation &var, GLenum prop)
440{
441 switch (prop)
442 {
443 case GL_TYPE:
jchen10a99ed552017-09-22 08:10:32 +0800444 return clampCast<GLint>(var.type);
jchen10880683b2017-04-12 16:21:55 +0800445
446 case GL_ARRAY_SIZE:
447 // TODO(jie.a.chen@intel.com): check array of array.
448 if (var.isArray() && !var.isStruct())
449 {
jchen10a99ed552017-09-22 08:10:32 +0800450 return clampCast<GLint>(var.elementCount());
jchen10880683b2017-04-12 16:21:55 +0800451 }
452 return 1;
453
454 case GL_NAME_LENGTH:
455 {
jchen10d9cd7b72017-08-30 15:04:25 +0800456 size_t length = var.name.size();
jchen10880683b2017-04-12 16:21:55 +0800457 if (var.isArray())
458 {
459 // Counts "[0]".
460 length += 3;
461 }
462 // ES31 spec p84: This counts the terminating null char.
463 ++length;
jchen10a99ed552017-09-22 08:10:32 +0800464 return clampCast<GLint>(length);
jchen10880683b2017-04-12 16:21:55 +0800465 }
466
467 case GL_LOCATION:
468 return var.location;
469
470 default:
471 UNREACHABLE();
472 return GL_INVALID_VALUE;
473 }
474}
475
476GLint GetInputResourceProperty(const Program *program, GLuint index, GLenum prop)
477{
478 const auto &attribute = program->getInputResource(index);
479 switch (prop)
480 {
481 case GL_TYPE:
482 case GL_ARRAY_SIZE:
jchen10880683b2017-04-12 16:21:55 +0800483 case GL_NAME_LENGTH:
484 return GetLocationVariableProperty(attribute, prop);
485
jchen10baf5d942017-08-28 20:45:48 +0800486 case GL_LOCATION:
487 return program->getAttributeLocation(attribute.name);
488
jchen10880683b2017-04-12 16:21:55 +0800489 case GL_REFERENCED_BY_VERTEX_SHADER:
490 return 1;
491
492 case GL_REFERENCED_BY_FRAGMENT_SHADER:
493 case GL_REFERENCED_BY_COMPUTE_SHADER:
494 return 0;
495
496 default:
497 UNREACHABLE();
498 return GL_INVALID_VALUE;
499 }
500}
501
502GLint GetOutputResourceProperty(const Program *program, GLuint index, const GLenum prop)
503{
504 const auto &outputVariable = program->getOutputResource(index);
505 switch (prop)
506 {
507 case GL_TYPE:
508 case GL_ARRAY_SIZE:
jchen10880683b2017-04-12 16:21:55 +0800509 case GL_NAME_LENGTH:
510 return GetLocationVariableProperty(outputVariable, prop);
511
jchen10baf5d942017-08-28 20:45:48 +0800512 case GL_LOCATION:
513 return program->getFragDataLocation(outputVariable.name);
514
jchen10880683b2017-04-12 16:21:55 +0800515 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:
jchen10a99ed552017-09-22 08:10:32 +0800535 return clampCast<GLint>(program->getAttributes().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800536
537 case GL_PROGRAM_OUTPUT:
jchen10a99ed552017-09-22 08:10:32 +0800538 return clampCast<GLint>(program->getState().getOutputVariables().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800539
540 case GL_UNIFORM:
jchen10a99ed552017-09-22 08:10:32 +0800541 return clampCast<GLint>(program->getState().getUniforms().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800542
543 case GL_UNIFORM_BLOCK:
jchen10a99ed552017-09-22 08:10:32 +0800544 return clampCast<GLint>(program->getState().getUniformBlocks().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800545
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 {
jchen10a99ed552017-09-22 08:10:32 +0800566 max = std::max(max, clampCast<GLint>((resource.*member).size()));
jchen10d9cd7b72017-08-30 15:04:25 +0800567 }
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
jchen10baf5d942017-08-28 20:45:48 +0800629GLenum GetUniformPropertyEnum(GLenum prop)
630{
631 switch (prop)
632 {
633 case GL_UNIFORM_TYPE:
634 return GL_TYPE;
635 case GL_UNIFORM_SIZE:
636 return GL_ARRAY_SIZE;
637 case GL_UNIFORM_NAME_LENGTH:
638 return GL_NAME_LENGTH;
639 case GL_UNIFORM_BLOCK_INDEX:
640 return GL_BLOCK_INDEX;
641 case GL_UNIFORM_OFFSET:
642 return GL_OFFSET;
643 case GL_UNIFORM_ARRAY_STRIDE:
644 return GL_ARRAY_STRIDE;
645 case GL_UNIFORM_MATRIX_STRIDE:
646 return GL_MATRIX_STRIDE;
647 case GL_UNIFORM_IS_ROW_MAJOR:
648 return GL_IS_ROW_MAJOR;
649
650 default:
651 return prop;
652 }
653}
654
Geoff Langc1984ed2016-10-07 12:41:00 -0400655} // anonymous namespace
656
Geoff Langff5b2d52016-09-07 11:32:23 -0400657void QueryFramebufferAttachmentParameteriv(const Framebuffer *framebuffer,
658 GLenum attachment,
659 GLenum pname,
660 GLint *params)
661{
662 ASSERT(framebuffer);
663
664 const FramebufferAttachment *attachmentObject = framebuffer->getAttachment(attachment);
665 if (attachmentObject == nullptr)
666 {
667 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
668 // is NONE, then querying any other pname will generate INVALID_ENUM.
669
670 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
671 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
672 // INVALID_OPERATION for all other pnames
673
674 switch (pname)
675 {
676 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
677 *params = GL_NONE;
678 break;
679
680 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
681 *params = 0;
682 break;
683
684 default:
685 UNREACHABLE();
686 break;
687 }
688
689 return;
690 }
691
692 switch (pname)
693 {
694 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
695 *params = attachmentObject->type();
696 break;
697
698 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
699 *params = attachmentObject->id();
700 break;
701
702 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
703 *params = attachmentObject->mipLevel();
704 break;
705
706 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
707 *params = attachmentObject->cubeMapFace();
708 break;
709
710 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
711 *params = attachmentObject->getRedSize();
712 break;
713
714 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
715 *params = attachmentObject->getGreenSize();
716 break;
717
718 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
719 *params = attachmentObject->getBlueSize();
720 break;
721
722 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
723 *params = attachmentObject->getAlphaSize();
724 break;
725
726 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
727 *params = attachmentObject->getDepthSize();
728 break;
729
730 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
731 *params = attachmentObject->getStencilSize();
732 break;
733
734 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
735 *params = attachmentObject->getComponentType();
736 break;
737
738 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
739 *params = attachmentObject->getColorEncoding();
740 break;
741
742 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
743 *params = attachmentObject->layer();
744 break;
745
Martin Radeve5285d22017-07-14 16:23:53 +0300746 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_ANGLE:
747 *params = attachmentObject->getNumViews();
748 break;
749
750 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_MULTIVIEW_LAYOUT_ANGLE:
751 *params = static_cast<GLint>(attachmentObject->getMultiviewLayout());
752 break;
753
754 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_ANGLE:
755 *params = attachmentObject->getBaseViewIndex();
756 break;
757
758 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_VIEWPORT_OFFSETS_ANGLE:
759 {
760 const std::vector<Offset> &offsets = attachmentObject->getMultiviewViewportOffsets();
761 for (size_t i = 0u; i < offsets.size(); ++i)
762 {
763 params[i * 2u] = offsets[i].x;
764 params[i * 2u + 1u] = offsets[i].y;
765 }
766 }
767 break;
768
Geoff Langff5b2d52016-09-07 11:32:23 -0400769 default:
770 UNREACHABLE();
771 break;
772 }
773}
774
775void QueryBufferParameteriv(const Buffer *buffer, GLenum pname, GLint *params)
776{
Geoff Langebebe1c2016-10-14 12:01:31 -0400777 QueryBufferParameterBase(buffer, pname, params);
778}
Geoff Langff5b2d52016-09-07 11:32:23 -0400779
Geoff Langebebe1c2016-10-14 12:01:31 -0400780void QueryBufferParameteri64v(const Buffer *buffer, GLenum pname, GLint64 *params)
781{
782 QueryBufferParameterBase(buffer, pname, params);
Geoff Langff5b2d52016-09-07 11:32:23 -0400783}
784
Geoff Lang496c02d2016-10-20 11:38:11 -0700785void QueryBufferPointerv(const Buffer *buffer, GLenum pname, void **params)
786{
787 switch (pname)
788 {
789 case GL_BUFFER_MAP_POINTER:
790 *params = buffer->getMapPointer();
791 break;
792
793 default:
794 UNREACHABLE();
795 break;
796 }
797}
798
Jamie Madillffe00c02017-06-27 16:26:55 -0400799void QueryProgramiv(const Context *context, const Program *program, GLenum pname, GLint *params)
Geoff Langff5b2d52016-09-07 11:32:23 -0400800{
801 ASSERT(program != nullptr);
802
803 switch (pname)
804 {
805 case GL_DELETE_STATUS:
806 *params = program->isFlaggedForDeletion();
807 return;
808 case GL_LINK_STATUS:
809 *params = program->isLinked();
810 return;
811 case GL_VALIDATE_STATUS:
812 *params = program->isValidated();
813 return;
814 case GL_INFO_LOG_LENGTH:
815 *params = program->getInfoLogLength();
816 return;
817 case GL_ATTACHED_SHADERS:
818 *params = program->getAttachedShadersCount();
819 return;
820 case GL_ACTIVE_ATTRIBUTES:
821 *params = program->getActiveAttributeCount();
822 return;
823 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
824 *params = program->getActiveAttributeMaxLength();
825 return;
826 case GL_ACTIVE_UNIFORMS:
827 *params = program->getActiveUniformCount();
828 return;
829 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
830 *params = program->getActiveUniformMaxLength();
831 return;
832 case GL_PROGRAM_BINARY_LENGTH_OES:
Jamie Madillffe00c02017-06-27 16:26:55 -0400833 *params = program->getBinaryLength(context);
Geoff Langff5b2d52016-09-07 11:32:23 -0400834 return;
835 case GL_ACTIVE_UNIFORM_BLOCKS:
836 *params = program->getActiveUniformBlockCount();
837 return;
838 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
839 *params = program->getActiveUniformBlockMaxLength();
840 break;
841 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
842 *params = program->getTransformFeedbackBufferMode();
843 break;
844 case GL_TRANSFORM_FEEDBACK_VARYINGS:
845 *params = program->getTransformFeedbackVaryingCount();
846 break;
847 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
848 *params = program->getTransformFeedbackVaryingMaxLength();
849 break;
850 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
851 *params = program->getBinaryRetrievableHint();
852 break;
Yunchao He61afff12017-03-14 15:34:03 +0800853 case GL_PROGRAM_SEPARABLE:
854 *params = program->isSeparable();
855 break;
Geoff Langff5b2d52016-09-07 11:32:23 -0400856 default:
857 UNREACHABLE();
858 break;
859 }
860}
Geoff Lang740d9022016-10-07 11:20:52 -0400861
Jamie Madill4e0e6f82017-02-17 11:06:03 -0500862void QueryRenderbufferiv(const Context *context,
863 const Renderbuffer *renderbuffer,
864 GLenum pname,
865 GLint *params)
Geoff Lang740d9022016-10-07 11:20:52 -0400866{
867 ASSERT(renderbuffer != nullptr);
868
869 switch (pname)
870 {
871 case GL_RENDERBUFFER_WIDTH:
872 *params = renderbuffer->getWidth();
873 break;
874 case GL_RENDERBUFFER_HEIGHT:
875 *params = renderbuffer->getHeight();
876 break;
877 case GL_RENDERBUFFER_INTERNAL_FORMAT:
Jamie Madill4e0e6f82017-02-17 11:06:03 -0500878 // Special case the WebGL 1 DEPTH_STENCIL format.
Jamie Madilla02315b2017-02-23 14:14:47 -0500879 if (context->isWebGL1() &&
Jamie Madill4e0e6f82017-02-17 11:06:03 -0500880 renderbuffer->getFormat().info->internalFormat == GL_DEPTH24_STENCIL8)
881 {
882 *params = GL_DEPTH_STENCIL;
883 }
884 else
885 {
886 *params = renderbuffer->getFormat().info->internalFormat;
887 }
Geoff Lang740d9022016-10-07 11:20:52 -0400888 break;
889 case GL_RENDERBUFFER_RED_SIZE:
890 *params = renderbuffer->getRedSize();
891 break;
892 case GL_RENDERBUFFER_GREEN_SIZE:
893 *params = renderbuffer->getGreenSize();
894 break;
895 case GL_RENDERBUFFER_BLUE_SIZE:
896 *params = renderbuffer->getBlueSize();
897 break;
898 case GL_RENDERBUFFER_ALPHA_SIZE:
899 *params = renderbuffer->getAlphaSize();
900 break;
901 case GL_RENDERBUFFER_DEPTH_SIZE:
902 *params = renderbuffer->getDepthSize();
903 break;
904 case GL_RENDERBUFFER_STENCIL_SIZE:
905 *params = renderbuffer->getStencilSize();
906 break;
907 case GL_RENDERBUFFER_SAMPLES_ANGLE:
908 *params = renderbuffer->getSamples();
909 break;
910 default:
911 UNREACHABLE();
912 break;
913 }
914}
Geoff Langd7d0ed32016-10-07 11:33:51 -0400915
Jamie Madillbd044ed2017-06-05 12:59:21 -0400916void QueryShaderiv(const Context *context, Shader *shader, GLenum pname, GLint *params)
Geoff Langd7d0ed32016-10-07 11:33:51 -0400917{
918 ASSERT(shader != nullptr);
919
920 switch (pname)
921 {
922 case GL_SHADER_TYPE:
923 *params = shader->getType();
924 return;
925 case GL_DELETE_STATUS:
926 *params = shader->isFlaggedForDeletion();
927 return;
928 case GL_COMPILE_STATUS:
Jamie Madillbd044ed2017-06-05 12:59:21 -0400929 *params = shader->isCompiled(context) ? GL_TRUE : GL_FALSE;
Geoff Langd7d0ed32016-10-07 11:33:51 -0400930 return;
931 case GL_INFO_LOG_LENGTH:
Jamie Madillbd044ed2017-06-05 12:59:21 -0400932 *params = shader->getInfoLogLength(context);
Geoff Langd7d0ed32016-10-07 11:33:51 -0400933 return;
934 case GL_SHADER_SOURCE_LENGTH:
935 *params = shader->getSourceLength();
936 return;
937 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
Jamie Madillbd044ed2017-06-05 12:59:21 -0400938 *params = shader->getTranslatedSourceWithDebugInfoLength(context);
Geoff Langd7d0ed32016-10-07 11:33:51 -0400939 return;
940 default:
941 UNREACHABLE();
942 break;
943 }
944}
Geoff Langc1984ed2016-10-07 12:41:00 -0400945
He Yunchao11b038b2016-11-22 21:24:04 +0800946void QueryTexLevelParameterfv(const Texture *texture,
947 GLenum target,
948 GLint level,
949 GLenum pname,
950 GLfloat *params)
951{
952 QueryTexLevelParameterBase(texture, target, level, pname, params);
953}
954
955void QueryTexLevelParameteriv(const Texture *texture,
956 GLenum target,
957 GLint level,
958 GLenum pname,
959 GLint *params)
960{
961 QueryTexLevelParameterBase(texture, target, level, pname, params);
962}
963
Geoff Langc1984ed2016-10-07 12:41:00 -0400964void QueryTexParameterfv(const Texture *texture, GLenum pname, GLfloat *params)
965{
966 QueryTexParameterBase(texture, pname, params);
967}
968
969void QueryTexParameteriv(const Texture *texture, GLenum pname, GLint *params)
970{
971 QueryTexParameterBase(texture, pname, params);
972}
973
974void QuerySamplerParameterfv(const Sampler *sampler, GLenum pname, GLfloat *params)
975{
976 QuerySamplerParameterBase(sampler, pname, params);
977}
978
979void QuerySamplerParameteriv(const Sampler *sampler, GLenum pname, GLint *params)
980{
981 QuerySamplerParameterBase(sampler, pname, params);
982}
983
Geoff Lang0b031062016-10-13 14:30:04 -0400984void QueryVertexAttribfv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800985 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -0400986 const VertexAttribCurrentValueData &currentValueData,
987 GLenum pname,
988 GLfloat *params)
989{
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800990 QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -0400991}
992
993void QueryVertexAttribiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800994 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -0400995 const VertexAttribCurrentValueData &currentValueData,
996 GLenum pname,
997 GLint *params)
998{
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800999 QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001000}
1001
Jamie Madill876429b2017-04-20 15:46:24 -04001002void QueryVertexAttribPointerv(const VertexAttribute &attrib, GLenum pname, void **pointer)
Geoff Lang0b031062016-10-13 14:30:04 -04001003{
1004 switch (pname)
1005 {
1006 case GL_VERTEX_ATTRIB_ARRAY_POINTER:
Jamie Madill876429b2017-04-20 15:46:24 -04001007 *pointer = const_cast<void *>(attrib.pointer);
Geoff Lang0b031062016-10-13 14:30:04 -04001008 break;
1009
1010 default:
1011 UNREACHABLE();
1012 break;
1013 }
1014}
1015
1016void QueryVertexAttribIiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001017 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001018 const VertexAttribCurrentValueData &currentValueData,
1019 GLenum pname,
1020 GLint *params)
1021{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001022 QueryVertexAttribBase(attrib, binding, currentValueData.IntValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001023}
1024
1025void QueryVertexAttribIuiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001026 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001027 const VertexAttribCurrentValueData &currentValueData,
1028 GLenum pname,
1029 GLuint *params)
1030{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001031 QueryVertexAttribBase(attrib, binding, currentValueData.UnsignedIntValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001032}
1033
Geoff Lang6899b872016-10-14 11:30:13 -04001034void QueryActiveUniformBlockiv(const Program *program,
1035 GLuint uniformBlockIndex,
1036 GLenum pname,
1037 GLint *params)
1038{
Jiajia Qin729b2c62017-08-14 09:36:11 +08001039 const InterfaceBlock &uniformBlock = program->getUniformBlockByIndex(uniformBlockIndex);
Geoff Lang6899b872016-10-14 11:30:13 -04001040 switch (pname)
1041 {
1042 case GL_UNIFORM_BLOCK_BINDING:
jchen10a99ed552017-09-22 08:10:32 +08001043 *params = clampCast<GLint>(program->getUniformBlockBinding(uniformBlockIndex));
Geoff Lang6899b872016-10-14 11:30:13 -04001044 break;
1045 case GL_UNIFORM_BLOCK_DATA_SIZE:
jchen10a99ed552017-09-22 08:10:32 +08001046 *params = clampCast<GLint>(uniformBlock.dataSize);
Geoff Lang6899b872016-10-14 11:30:13 -04001047 break;
1048 case GL_UNIFORM_BLOCK_NAME_LENGTH:
jchen10a99ed552017-09-22 08:10:32 +08001049 *params = clampCast<GLint>(uniformBlock.nameWithArrayIndex().size() + 1);
Geoff Lang6899b872016-10-14 11:30:13 -04001050 break;
1051 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
jchen10a99ed552017-09-22 08:10:32 +08001052 *params = clampCast<GLint>(uniformBlock.memberIndexes.size());
Geoff Lang6899b872016-10-14 11:30:13 -04001053 break;
1054 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
jchen10eaef1e52017-06-13 10:44:11 +08001055 for (size_t blockMemberIndex = 0; blockMemberIndex < uniformBlock.memberIndexes.size();
1056 blockMemberIndex++)
Geoff Lang6899b872016-10-14 11:30:13 -04001057 {
1058 params[blockMemberIndex] =
jchen10a99ed552017-09-22 08:10:32 +08001059 clampCast<GLint>(uniformBlock.memberIndexes[blockMemberIndex]);
Geoff Lang6899b872016-10-14 11:30:13 -04001060 }
1061 break;
1062 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
jchen10a99ed552017-09-22 08:10:32 +08001063 *params = static_cast<GLint>(uniformBlock.vertexStaticUse);
Geoff Lang6899b872016-10-14 11:30:13 -04001064 break;
1065 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
jchen10a99ed552017-09-22 08:10:32 +08001066 *params = static_cast<GLint>(uniformBlock.fragmentStaticUse);
Geoff Lang6899b872016-10-14 11:30:13 -04001067 break;
1068 default:
1069 UNREACHABLE();
1070 break;
1071 }
1072}
1073
Geoff Lang0a9661f2016-10-20 10:59:20 -07001074void QueryInternalFormativ(const TextureCaps &format, GLenum pname, GLsizei bufSize, GLint *params)
1075{
1076 switch (pname)
1077 {
1078 case GL_NUM_SAMPLE_COUNTS:
1079 if (bufSize != 0)
1080 {
jchen10a99ed552017-09-22 08:10:32 +08001081 *params = clampCast<GLint>(format.sampleCounts.size());
Geoff Lang0a9661f2016-10-20 10:59:20 -07001082 }
1083 break;
1084
1085 case GL_SAMPLES:
1086 {
1087 size_t returnCount = std::min<size_t>(bufSize, format.sampleCounts.size());
1088 auto sampleReverseIt = format.sampleCounts.rbegin();
1089 for (size_t sampleIndex = 0; sampleIndex < returnCount; ++sampleIndex)
1090 {
1091 params[sampleIndex] = *sampleReverseIt++;
1092 }
1093 }
1094 break;
1095
1096 default:
1097 UNREACHABLE();
1098 break;
1099 }
1100}
1101
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001102void QueryFramebufferParameteriv(const Framebuffer *framebuffer, GLenum pname, GLint *params)
1103{
1104 ASSERT(framebuffer);
1105
1106 switch (pname)
1107 {
1108 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
1109 *params = framebuffer->getDefaultWidth();
1110 break;
1111 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
1112 *params = framebuffer->getDefaultHeight();
1113 break;
1114 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
1115 *params = framebuffer->getDefaultSamples();
1116 break;
1117 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
1118 *params = framebuffer->getDefaultFixedSampleLocations();
1119 break;
1120 default:
1121 UNREACHABLE();
1122 break;
1123 }
1124}
1125
Jamie Madill70b5bb02017-08-28 13:32:37 -04001126Error QuerySynciv(const Sync *sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001127{
1128 ASSERT(sync);
1129
Geoff Lang82483b92017-04-11 15:33:00 -04001130 // All queries return one value, exit early if the buffer can't fit anything.
1131 if (bufSize < 1)
1132 {
1133 if (length != nullptr)
1134 {
1135 *length = 0;
1136 }
1137 return NoError();
1138 }
1139
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001140 switch (pname)
1141 {
1142 case GL_OBJECT_TYPE:
jchen10a99ed552017-09-22 08:10:32 +08001143 *values = clampCast<GLint>(GL_SYNC_FENCE);
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001144 break;
1145 case GL_SYNC_CONDITION:
jchen10a99ed552017-09-22 08:10:32 +08001146 *values = clampCast<GLint>(sync->getCondition());
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001147 break;
1148 case GL_SYNC_FLAGS:
jchen10a99ed552017-09-22 08:10:32 +08001149 *values = clampCast<GLint>(sync->getFlags());
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001150 break;
1151 case GL_SYNC_STATUS:
1152 ANGLE_TRY(sync->getStatus(values));
1153 break;
1154
1155 default:
1156 UNREACHABLE();
1157 break;
1158 }
1159
Geoff Lang82483b92017-04-11 15:33:00 -04001160 if (length != nullptr)
1161 {
1162 *length = 1;
1163 }
1164
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001165 return NoError();
1166}
1167
Jamie Madill4928b7c2017-06-20 12:57:39 -04001168void SetTexParameterf(Context *context, Texture *texture, GLenum pname, GLfloat param)
Geoff Langc1984ed2016-10-07 12:41:00 -04001169{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001170 SetTexParameterBase(context, texture, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -04001171}
1172
Jamie Madill4928b7c2017-06-20 12:57:39 -04001173void SetTexParameterfv(Context *context, Texture *texture, GLenum pname, const GLfloat *params)
Geoff Langc1984ed2016-10-07 12:41:00 -04001174{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001175 SetTexParameterBase(context, texture, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001176}
1177
Jamie Madill4928b7c2017-06-20 12:57:39 -04001178void SetTexParameteri(Context *context, Texture *texture, GLenum pname, GLint param)
Geoff Langc1984ed2016-10-07 12:41:00 -04001179{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001180 SetTexParameterBase(context, texture, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -04001181}
1182
Jamie Madill4928b7c2017-06-20 12:57:39 -04001183void SetTexParameteriv(Context *context, Texture *texture, GLenum pname, const GLint *params)
Geoff Langc1984ed2016-10-07 12:41:00 -04001184{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001185 SetTexParameterBase(context, texture, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001186}
1187
1188void SetSamplerParameterf(Sampler *sampler, GLenum pname, GLfloat param)
1189{
1190 SetSamplerParameterBase(sampler, pname, &param);
1191}
1192
1193void SetSamplerParameterfv(Sampler *sampler, GLenum pname, const GLfloat *params)
1194{
1195 SetSamplerParameterBase(sampler, pname, params);
1196}
1197
1198void SetSamplerParameteri(Sampler *sampler, GLenum pname, GLint param)
1199{
1200 SetSamplerParameterBase(sampler, pname, &param);
1201}
1202
1203void SetSamplerParameteriv(Sampler *sampler, GLenum pname, const GLint *params)
1204{
1205 SetSamplerParameterBase(sampler, pname, params);
1206}
Geoff Lang65603eb2017-01-12 16:48:03 -05001207
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001208void SetFramebufferParameteri(Framebuffer *framebuffer, GLenum pname, GLint param)
1209{
1210 ASSERT(framebuffer);
1211
1212 switch (pname)
1213 {
1214 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
1215 framebuffer->setDefaultWidth(param);
1216 break;
1217 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
1218 framebuffer->setDefaultHeight(param);
1219 break;
1220 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
1221 framebuffer->setDefaultSamples(param);
1222 break;
1223 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
jchen10a99ed552017-09-22 08:10:32 +08001224 framebuffer->setDefaultFixedSampleLocations(CastQueryValueTo<GLboolean>(pname, param));
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001225 break;
1226 default:
1227 UNREACHABLE();
1228 break;
1229 }
1230}
1231
Yunchao He61afff12017-03-14 15:34:03 +08001232void SetProgramParameteri(Program *program, GLenum pname, GLint value)
1233{
1234 ASSERT(program);
1235
1236 switch (pname)
1237 {
1238 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
1239 program->setBinaryRetrievableHint(value != GL_FALSE);
1240 break;
1241 case GL_PROGRAM_SEPARABLE:
1242 program->setSeparable(value != GL_FALSE);
1243 break;
1244 default:
1245 UNREACHABLE();
1246 break;
1247 }
1248}
1249
jchen10baf5d942017-08-28 20:45:48 +08001250GLint GetUniformResourceProperty(const Program *program, GLuint index, const GLenum prop)
1251{
1252 const auto &uniform = program->getUniformByIndex(index);
1253 GLenum resourceProp = GetUniformPropertyEnum(prop);
1254 switch (resourceProp)
1255 {
1256 case GL_TYPE:
1257 case GL_ARRAY_SIZE:
1258 case GL_NAME_LENGTH:
1259 return GetLocationVariableProperty(uniform, resourceProp);
1260
1261 case GL_LOCATION:
1262 return program->getUniformLocation(uniform.name);
1263
1264 case GL_BLOCK_INDEX:
1265 return (uniform.isAtomicCounter() ? -1 : uniform.bufferIndex);
1266
1267 case GL_OFFSET:
1268 return uniform.blockInfo.offset;
1269
1270 case GL_ARRAY_STRIDE:
1271 return uniform.blockInfo.arrayStride;
1272
1273 case GL_MATRIX_STRIDE:
1274 return uniform.blockInfo.matrixStride;
1275
1276 case GL_IS_ROW_MAJOR:
1277 return static_cast<GLint>(uniform.blockInfo.isRowMajorMatrix);
1278
1279 case GL_REFERENCED_BY_VERTEX_SHADER:
1280 return uniform.vertexStaticUse;
1281
1282 case GL_REFERENCED_BY_FRAGMENT_SHADER:
1283 return uniform.fragmentStaticUse;
1284
1285 case GL_REFERENCED_BY_COMPUTE_SHADER:
1286 return uniform.computeStaticUse;
1287
1288 case GL_ATOMIC_COUNTER_BUFFER_INDEX:
1289 return (uniform.isAtomicCounter() ? uniform.bufferIndex : -1);
1290
1291 default:
1292 UNREACHABLE();
1293 return 0;
1294 }
1295}
1296
jchen1015015f72017-03-16 13:54:21 +08001297GLuint QueryProgramResourceIndex(const Program *program,
1298 GLenum programInterface,
1299 const GLchar *name)
1300{
1301 switch (programInterface)
1302 {
1303 case GL_PROGRAM_INPUT:
1304 return program->getInputResourceIndex(name);
1305
1306 case GL_PROGRAM_OUTPUT:
1307 return program->getOutputResourceIndex(name);
1308
jchen1015015f72017-03-16 13:54:21 +08001309 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001310 return program->getState().getUniformIndexFromName(name);
1311
1312 // TODO(jie.a.chen@intel.com): more interfaces.
jchen1015015f72017-03-16 13:54:21 +08001313 case GL_UNIFORM_BLOCK:
1314 case GL_TRANSFORM_FEEDBACK_VARYING:
1315 case GL_BUFFER_VARIABLE:
1316 case GL_SHADER_STORAGE_BLOCK:
1317 UNIMPLEMENTED();
1318 return GL_INVALID_INDEX;
1319
1320 default:
1321 UNREACHABLE();
1322 return GL_INVALID_INDEX;
1323 }
1324}
1325
jchen10fd7c3b52017-03-21 15:36:03 +08001326void QueryProgramResourceName(const Program *program,
1327 GLenum programInterface,
1328 GLuint index,
1329 GLsizei bufSize,
1330 GLsizei *length,
1331 GLchar *name)
1332{
1333 switch (programInterface)
1334 {
1335 case GL_PROGRAM_INPUT:
1336 program->getInputResourceName(index, bufSize, length, name);
1337 break;
1338
1339 case GL_PROGRAM_OUTPUT:
1340 program->getOutputResourceName(index, bufSize, length, name);
1341 break;
1342
jchen10fd7c3b52017-03-21 15:36:03 +08001343 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001344 program->getUniformResourceName(index, bufSize, length, name);
1345 break;
1346
1347 // TODO(jie.a.chen@intel.com): more interfaces.
jchen10fd7c3b52017-03-21 15:36:03 +08001348 case GL_UNIFORM_BLOCK:
1349 case GL_TRANSFORM_FEEDBACK_VARYING:
1350 case GL_BUFFER_VARIABLE:
1351 case GL_SHADER_STORAGE_BLOCK:
1352 UNIMPLEMENTED();
1353 break;
1354
1355 default:
1356 UNREACHABLE();
1357 }
1358}
1359
jchen10191381f2017-04-11 13:59:04 +08001360GLint QueryProgramResourceLocation(const Program *program,
1361 GLenum programInterface,
1362 const GLchar *name)
1363{
1364 switch (programInterface)
1365 {
1366 case GL_PROGRAM_INPUT:
1367 return program->getAttributeLocation(name);
1368
1369 case GL_PROGRAM_OUTPUT:
1370 return program->getFragDataLocation(name);
1371
jchen10191381f2017-04-11 13:59:04 +08001372 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001373 return program->getState().getUniformLocation(name);
1374
1375 // TODO(jie.a.chen@intel.com): more interfaces.
jchen10191381f2017-04-11 13:59:04 +08001376 case GL_UNIFORM_BLOCK:
1377 case GL_TRANSFORM_FEEDBACK_VARYING:
1378 case GL_BUFFER_VARIABLE:
1379 case GL_SHADER_STORAGE_BLOCK:
1380 UNIMPLEMENTED();
1381 return -1;
1382
1383 default:
1384 UNREACHABLE();
1385 return -1;
1386 }
1387}
1388
jchen10880683b2017-04-12 16:21:55 +08001389void QueryProgramResourceiv(const Program *program,
1390 GLenum programInterface,
1391 GLuint index,
1392 GLsizei propCount,
1393 const GLenum *props,
1394 GLsizei bufSize,
1395 GLsizei *length,
1396 GLint *params)
1397{
1398 if (!program->isLinked())
1399 {
1400 if (length != nullptr)
1401 {
1402 *length = 0;
1403 }
1404 return;
1405 }
1406
1407 GLsizei count = std::min(propCount, bufSize);
1408 if (length != nullptr)
1409 {
1410 *length = count;
1411 }
1412
1413 for (GLsizei i = 0; i < count; i++)
1414 {
1415 switch (programInterface)
1416 {
1417 case GL_PROGRAM_INPUT:
1418 params[i] = GetInputResourceProperty(program, index, props[i]);
1419 break;
1420
1421 case GL_PROGRAM_OUTPUT:
1422 params[i] = GetOutputResourceProperty(program, index, props[i]);
1423 break;
1424
jchen10880683b2017-04-12 16:21:55 +08001425 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001426 params[i] = GetUniformResourceProperty(program, index, props[i]);
1427 break;
1428
1429 // TODO(jie.a.chen@intel.com): more interfaces.
jchen10880683b2017-04-12 16:21:55 +08001430 case GL_UNIFORM_BLOCK:
1431 case GL_TRANSFORM_FEEDBACK_VARYING:
1432 case GL_BUFFER_VARIABLE:
1433 case GL_SHADER_STORAGE_BLOCK:
1434 case GL_ATOMIC_COUNTER_BUFFER:
1435 UNIMPLEMENTED();
1436 params[i] = GL_INVALID_VALUE;
1437 break;
1438
1439 default:
1440 UNREACHABLE();
1441 params[i] = GL_INVALID_VALUE;
1442 }
1443 }
1444}
1445
jchen10d9cd7b72017-08-30 15:04:25 +08001446void QueryProgramInterfaceiv(const Program *program,
1447 GLenum programInterface,
1448 GLenum pname,
1449 GLint *params)
1450{
1451 switch (pname)
1452 {
1453 case GL_ACTIVE_RESOURCES:
1454 *params = QueryProgramInterfaceActiveResources(program, programInterface);
1455 break;
1456
1457 case GL_MAX_NAME_LENGTH:
1458 *params = QueryProgramInterfaceMaxNameLength(program, programInterface);
1459 break;
1460
1461 case GL_MAX_NUM_ACTIVE_VARIABLES:
1462 *params = QueryProgramInterfaceMaxNumActiveVariables(program, programInterface);
1463 break;
1464
1465 default:
1466 UNREACHABLE();
1467 }
1468}
1469
Geoff Lang65603eb2017-01-12 16:48:03 -05001470} // namespace gl
1471
1472namespace egl
1473{
1474
1475void QueryConfigAttrib(const Config *config, EGLint attribute, EGLint *value)
1476{
1477 ASSERT(config != nullptr);
1478 switch (attribute)
1479 {
1480 case EGL_BUFFER_SIZE:
1481 *value = config->bufferSize;
1482 break;
1483 case EGL_ALPHA_SIZE:
1484 *value = config->alphaSize;
1485 break;
1486 case EGL_BLUE_SIZE:
1487 *value = config->blueSize;
1488 break;
1489 case EGL_GREEN_SIZE:
1490 *value = config->greenSize;
1491 break;
1492 case EGL_RED_SIZE:
1493 *value = config->redSize;
1494 break;
1495 case EGL_DEPTH_SIZE:
1496 *value = config->depthSize;
1497 break;
1498 case EGL_STENCIL_SIZE:
1499 *value = config->stencilSize;
1500 break;
1501 case EGL_CONFIG_CAVEAT:
1502 *value = config->configCaveat;
1503 break;
1504 case EGL_CONFIG_ID:
1505 *value = config->configID;
1506 break;
1507 case EGL_LEVEL:
1508 *value = config->level;
1509 break;
1510 case EGL_NATIVE_RENDERABLE:
1511 *value = config->nativeRenderable;
1512 break;
1513 case EGL_NATIVE_VISUAL_ID:
1514 *value = config->nativeVisualID;
1515 break;
1516 case EGL_NATIVE_VISUAL_TYPE:
1517 *value = config->nativeVisualType;
1518 break;
1519 case EGL_SAMPLES:
1520 *value = config->samples;
1521 break;
1522 case EGL_SAMPLE_BUFFERS:
1523 *value = config->sampleBuffers;
1524 break;
1525 case EGL_SURFACE_TYPE:
1526 *value = config->surfaceType;
1527 break;
1528 case EGL_TRANSPARENT_TYPE:
1529 *value = config->transparentType;
1530 break;
1531 case EGL_TRANSPARENT_BLUE_VALUE:
1532 *value = config->transparentBlueValue;
1533 break;
1534 case EGL_TRANSPARENT_GREEN_VALUE:
1535 *value = config->transparentGreenValue;
1536 break;
1537 case EGL_TRANSPARENT_RED_VALUE:
1538 *value = config->transparentRedValue;
1539 break;
1540 case EGL_BIND_TO_TEXTURE_RGB:
1541 *value = config->bindToTextureRGB;
1542 break;
1543 case EGL_BIND_TO_TEXTURE_RGBA:
1544 *value = config->bindToTextureRGBA;
1545 break;
1546 case EGL_MIN_SWAP_INTERVAL:
1547 *value = config->minSwapInterval;
1548 break;
1549 case EGL_MAX_SWAP_INTERVAL:
1550 *value = config->maxSwapInterval;
1551 break;
1552 case EGL_LUMINANCE_SIZE:
1553 *value = config->luminanceSize;
1554 break;
1555 case EGL_ALPHA_MASK_SIZE:
1556 *value = config->alphaMaskSize;
1557 break;
1558 case EGL_COLOR_BUFFER_TYPE:
1559 *value = config->colorBufferType;
1560 break;
1561 case EGL_RENDERABLE_TYPE:
1562 *value = config->renderableType;
1563 break;
1564 case EGL_MATCH_NATIVE_PIXMAP:
1565 *value = false;
1566 UNIMPLEMENTED();
1567 break;
1568 case EGL_CONFORMANT:
1569 *value = config->conformant;
1570 break;
1571 case EGL_MAX_PBUFFER_WIDTH:
1572 *value = config->maxPBufferWidth;
1573 break;
1574 case EGL_MAX_PBUFFER_HEIGHT:
1575 *value = config->maxPBufferHeight;
1576 break;
1577 case EGL_MAX_PBUFFER_PIXELS:
1578 *value = config->maxPBufferPixels;
1579 break;
1580 case EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE:
1581 *value = config->optimalOrientation;
1582 break;
Geoff Langc5a2a172017-01-13 15:55:07 -05001583 case EGL_COLOR_COMPONENT_TYPE_EXT:
1584 *value = config->colorComponentType;
1585 break;
Geoff Lang65603eb2017-01-12 16:48:03 -05001586 default:
1587 UNREACHABLE();
1588 break;
1589 }
Geoff Langff5b2d52016-09-07 11:32:23 -04001590}
Geoff Lang65603eb2017-01-12 16:48:03 -05001591
Geoff Lang31ecbd72017-07-26 13:01:27 -04001592void QuerySurfaceAttrib(const Surface *surface, EGLint attribute, EGLint *value)
1593{
1594 switch (attribute)
1595 {
1596 case EGL_GL_COLORSPACE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001597 *value = surface->getGLColorspace();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001598 break;
1599 case EGL_VG_ALPHA_FORMAT:
Geoff Lang40ac7832017-07-26 14:38:46 -04001600 *value = surface->getVGAlphaFormat();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001601 break;
1602 case EGL_VG_COLORSPACE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001603 *value = surface->getVGColorspace();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001604 break;
1605 case EGL_CONFIG_ID:
1606 *value = surface->getConfig()->configID;
1607 break;
1608 case EGL_HEIGHT:
1609 *value = surface->getHeight();
1610 break;
1611 case EGL_HORIZONTAL_RESOLUTION:
Geoff Lang40ac7832017-07-26 14:38:46 -04001612 *value = surface->getHorizontalResolution();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001613 break;
1614 case EGL_LARGEST_PBUFFER:
Geoff Lang40ac7832017-07-26 14:38:46 -04001615 // The EGL spec states that value is not written if the surface is not a pbuffer
1616 if (surface->getType() == EGL_PBUFFER_BIT)
1617 {
1618 *value = surface->getLargestPbuffer();
1619 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001620 break;
1621 case EGL_MIPMAP_TEXTURE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001622 // The EGL spec states that value is not written if the surface is not a pbuffer
1623 if (surface->getType() == EGL_PBUFFER_BIT)
1624 {
1625 *value = surface->getMipmapTexture();
1626 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001627 break;
1628 case EGL_MIPMAP_LEVEL:
Geoff Lang40ac7832017-07-26 14:38:46 -04001629 // The EGL spec states that value is not written if the surface is not a pbuffer
1630 if (surface->getType() == EGL_PBUFFER_BIT)
1631 {
1632 *value = surface->getMipmapLevel();
1633 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001634 break;
1635 case EGL_MULTISAMPLE_RESOLVE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001636 *value = surface->getMultisampleResolve();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001637 break;
1638 case EGL_PIXEL_ASPECT_RATIO:
1639 *value = surface->getPixelAspectRatio();
1640 break;
1641 case EGL_RENDER_BUFFER:
1642 *value = surface->getRenderBuffer();
1643 break;
1644 case EGL_SWAP_BEHAVIOR:
1645 *value = surface->getSwapBehavior();
1646 break;
1647 case EGL_TEXTURE_FORMAT:
Geoff Lang40ac7832017-07-26 14:38:46 -04001648 // The EGL spec states that value is not written if the surface is not a pbuffer
1649 if (surface->getType() == EGL_PBUFFER_BIT)
1650 {
1651 *value = surface->getTextureFormat();
1652 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001653 break;
1654 case EGL_TEXTURE_TARGET:
Geoff Lang40ac7832017-07-26 14:38:46 -04001655 // The EGL spec states that value is not written if the surface is not a pbuffer
1656 if (surface->getType() == EGL_PBUFFER_BIT)
1657 {
1658 *value = surface->getTextureTarget();
1659 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001660 break;
1661 case EGL_VERTICAL_RESOLUTION:
Geoff Lang40ac7832017-07-26 14:38:46 -04001662 *value = surface->getVerticalResolution();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001663 break;
1664 case EGL_WIDTH:
1665 *value = surface->getWidth();
1666 break;
1667 case EGL_POST_SUB_BUFFER_SUPPORTED_NV:
1668 *value = surface->isPostSubBufferSupported();
1669 break;
1670 case EGL_FIXED_SIZE_ANGLE:
1671 *value = surface->isFixedSize();
1672 break;
1673 case EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE:
1674 *value = surface->flexibleSurfaceCompatibilityRequested();
1675 break;
1676 case EGL_SURFACE_ORIENTATION_ANGLE:
1677 *value = surface->getOrientation();
1678 break;
1679 case EGL_DIRECT_COMPOSITION_ANGLE:
1680 *value = surface->directComposition();
1681 break;
1682 default:
1683 UNREACHABLE();
1684 break;
1685 }
1686}
1687
1688void SetSurfaceAttrib(Surface *surface, EGLint attribute, EGLint value)
1689{
1690 switch (attribute)
1691 {
1692 case EGL_MIPMAP_LEVEL:
Geoff Lang40ac7832017-07-26 14:38:46 -04001693 surface->setMipmapLevel(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04001694 break;
1695 case EGL_MULTISAMPLE_RESOLVE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001696 surface->setMultisampleResolve(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04001697 break;
1698 case EGL_SWAP_BEHAVIOR:
Geoff Lang40ac7832017-07-26 14:38:46 -04001699 surface->setSwapBehavior(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04001700 break;
1701 default:
1702 UNREACHABLE();
1703 break;
1704 }
1705}
1706
Geoff Lang65603eb2017-01-12 16:48:03 -05001707} // namespace egl