blob: 7270276d8cd787b10d4b6412ef556cb8bb3922b4 [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:
Corentin Wallez2e568cf2017-09-18 17:05:22 -0400413 *params = CastFromGLintStateValue<ParamType>(pname, ToGLenum(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
jchen1058f67be2017-10-27 08:59:27 +0800546 case GL_ATOMIC_COUNTER_BUFFER:
547 return clampCast<GLint>(program->getState().getAtomicCounterBuffers().size());
548
jchen10d9cd7b72017-08-30 15:04:25 +0800549 // TODO(jie.a.chen@intel.com): more interfaces.
550 case GL_TRANSFORM_FEEDBACK_VARYING:
551 case GL_BUFFER_VARIABLE:
552 case GL_SHADER_STORAGE_BLOCK:
jchen10d9cd7b72017-08-30 15:04:25 +0800553 UNIMPLEMENTED();
554 return 0;
555
556 default:
557 UNREACHABLE();
558 return 0;
559 }
560}
561
562template <typename T, typename M>
563GLint FindMaxSize(const std::vector<T> &resources, M member)
564{
565 GLint max = 0;
566 for (const T &resource : resources)
567 {
jchen10a99ed552017-09-22 08:10:32 +0800568 max = std::max(max, clampCast<GLint>((resource.*member).size()));
jchen10d9cd7b72017-08-30 15:04:25 +0800569 }
570 return max;
571}
572
573GLint QueryProgramInterfaceMaxNameLength(const Program *program, GLenum programInterface)
574{
575 GLint maxNameLength = 0;
576 switch (programInterface)
577 {
578 case GL_PROGRAM_INPUT:
579 maxNameLength = FindMaxSize(program->getAttributes(), &sh::Attribute::name);
580 break;
581
582 case GL_PROGRAM_OUTPUT:
583 maxNameLength =
584 FindMaxSize(program->getState().getOutputVariables(), &sh::OutputVariable::name);
585 break;
586
587 case GL_UNIFORM:
588 maxNameLength = FindMaxSize(program->getState().getUniforms(), &LinkedUniform::name);
589 break;
590
591 case GL_UNIFORM_BLOCK:
592 maxNameLength =
Jiajia Qin729b2c62017-08-14 09:36:11 +0800593 FindMaxSize(program->getState().getUniformBlocks(), &InterfaceBlock::name);
jchen10d9cd7b72017-08-30 15:04:25 +0800594 break;
595
596 // TODO(jie.a.chen@intel.com): more interfaces.
597 case GL_TRANSFORM_FEEDBACK_VARYING:
598 case GL_BUFFER_VARIABLE:
599 case GL_SHADER_STORAGE_BLOCK:
600 UNIMPLEMENTED();
601 return 0;
602
603 default:
604 UNREACHABLE();
605 return 0;
606 }
607 // This length includes an extra character for the null terminator.
608 return (maxNameLength == 0 ? 0 : maxNameLength + 1);
609}
610
611GLint QueryProgramInterfaceMaxNumActiveVariables(const Program *program, GLenum programInterface)
612{
613 switch (programInterface)
614 {
615 case GL_UNIFORM_BLOCK:
616 return FindMaxSize(program->getState().getUniformBlocks(),
Jiajia Qin729b2c62017-08-14 09:36:11 +0800617 &InterfaceBlock::memberIndexes);
jchen1058f67be2017-10-27 08:59:27 +0800618 case GL_ATOMIC_COUNTER_BUFFER:
619 return FindMaxSize(program->getState().getAtomicCounterBuffers(),
620 &AtomicCounterBuffer::memberIndexes);
jchen10d9cd7b72017-08-30 15:04:25 +0800621
622 // TODO(jie.a.chen@intel.com): more interfaces.
623 case GL_SHADER_STORAGE_BLOCK:
jchen10d9cd7b72017-08-30 15:04:25 +0800624 UNIMPLEMENTED();
625 return 0;
626
627 default:
628 UNREACHABLE();
629 return 0;
630 }
631}
632
jchen10baf5d942017-08-28 20:45:48 +0800633GLenum GetUniformPropertyEnum(GLenum prop)
634{
635 switch (prop)
636 {
637 case GL_UNIFORM_TYPE:
638 return GL_TYPE;
639 case GL_UNIFORM_SIZE:
640 return GL_ARRAY_SIZE;
641 case GL_UNIFORM_NAME_LENGTH:
642 return GL_NAME_LENGTH;
643 case GL_UNIFORM_BLOCK_INDEX:
644 return GL_BLOCK_INDEX;
645 case GL_UNIFORM_OFFSET:
646 return GL_OFFSET;
647 case GL_UNIFORM_ARRAY_STRIDE:
648 return GL_ARRAY_STRIDE;
649 case GL_UNIFORM_MATRIX_STRIDE:
650 return GL_MATRIX_STRIDE;
651 case GL_UNIFORM_IS_ROW_MAJOR:
652 return GL_IS_ROW_MAJOR;
653
654 default:
655 return prop;
656 }
657}
658
jchen1058f67be2017-10-27 08:59:27 +0800659GLenum GetUniformBlockPropertyEnum(GLenum prop)
660{
661 switch (prop)
662 {
663 case GL_UNIFORM_BLOCK_BINDING:
664 return GL_BUFFER_BINDING;
665
666 case GL_UNIFORM_BLOCK_DATA_SIZE:
667 return GL_BUFFER_DATA_SIZE;
668
669 case GL_UNIFORM_BLOCK_NAME_LENGTH:
670 return GL_NAME_LENGTH;
671
672 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
673 return GL_NUM_ACTIVE_VARIABLES;
674
675 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
676 return GL_ACTIVE_VARIABLES;
677
678 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
679 return GL_REFERENCED_BY_VERTEX_SHADER;
680
681 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
682 return GL_REFERENCED_BY_FRAGMENT_SHADER;
683
684 default:
685 return prop;
686 }
687}
688
689void GetShaderVariableBufferResourceProperty(const ShaderVariableBuffer &buffer,
690 GLenum pname,
691 GLint *params,
692 GLsizei bufSize,
693 GLsizei *outputPosition)
694
695{
696 switch (pname)
697 {
698 case GL_BUFFER_BINDING:
699 params[(*outputPosition)++] = buffer.binding;
700 break;
701 case GL_BUFFER_DATA_SIZE:
702 params[(*outputPosition)++] = clampCast<GLint>(buffer.dataSize);
703 break;
704 case GL_NUM_ACTIVE_VARIABLES:
705 params[(*outputPosition)++] = buffer.numActiveVariables();
706 break;
707 case GL_ACTIVE_VARIABLES:
708 for (size_t memberIndex = 0;
709 memberIndex < buffer.memberIndexes.size() && *outputPosition < bufSize;
710 ++memberIndex)
711 {
712 params[(*outputPosition)++] = clampCast<GLint>(buffer.memberIndexes[memberIndex]);
713 }
714 break;
715 case GL_REFERENCED_BY_VERTEX_SHADER:
716 params[(*outputPosition)++] = static_cast<GLint>(buffer.vertexStaticUse);
717 break;
718 case GL_REFERENCED_BY_FRAGMENT_SHADER:
719 params[(*outputPosition)++] = static_cast<GLint>(buffer.fragmentStaticUse);
720 break;
721 case GL_REFERENCED_BY_COMPUTE_SHADER:
722 params[(*outputPosition)++] = static_cast<GLint>(buffer.computeStaticUse);
723 break;
724 default:
725 UNREACHABLE();
726 break;
727 }
728}
729
730void GetInterfaceBlockResourceProperty(const InterfaceBlock &block,
731 GLenum pname,
732 GLint *params,
733 GLsizei bufSize,
734 GLsizei *outputPosition)
735{
736 if (pname == GL_NAME_LENGTH)
737 {
738 params[(*outputPosition)++] = clampCast<GLint>(block.nameWithArrayIndex().size() + 1);
739 return;
740 }
741 GetShaderVariableBufferResourceProperty(block, pname, params, bufSize, outputPosition);
742}
743
744void GetUniformBlockResourceProperty(const Program *program,
745 GLuint blockIndex,
746 GLenum pname,
747 GLint *params,
748 GLsizei bufSize,
749 GLsizei *outputPosition)
750
751{
752 ASSERT(*outputPosition < bufSize);
753 const auto &block = program->getUniformBlockByIndex(blockIndex);
754 GetInterfaceBlockResourceProperty(block, pname, params, bufSize, outputPosition);
755}
756
757void GetAtomicCounterBufferResourceProperty(const Program *program,
758 GLuint index,
759 GLenum pname,
760 GLint *params,
761 GLsizei bufSize,
762 GLsizei *outputPosition)
763
764{
765 ASSERT(*outputPosition < bufSize);
766 const auto &buffer = program->getState().getAtomicCounterBuffers()[index];
767 GetShaderVariableBufferResourceProperty(buffer, pname, params, bufSize, outputPosition);
768}
769
Geoff Langc1984ed2016-10-07 12:41:00 -0400770} // anonymous namespace
771
Geoff Langff5b2d52016-09-07 11:32:23 -0400772void QueryFramebufferAttachmentParameteriv(const Framebuffer *framebuffer,
773 GLenum attachment,
774 GLenum pname,
775 GLint *params)
776{
777 ASSERT(framebuffer);
778
779 const FramebufferAttachment *attachmentObject = framebuffer->getAttachment(attachment);
780 if (attachmentObject == nullptr)
781 {
782 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
783 // is NONE, then querying any other pname will generate INVALID_ENUM.
784
785 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
786 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
787 // INVALID_OPERATION for all other pnames
788
789 switch (pname)
790 {
791 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
792 *params = GL_NONE;
793 break;
794
795 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
796 *params = 0;
797 break;
798
799 default:
800 UNREACHABLE();
801 break;
802 }
803
804 return;
805 }
806
807 switch (pname)
808 {
809 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
810 *params = attachmentObject->type();
811 break;
812
813 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
814 *params = attachmentObject->id();
815 break;
816
817 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
818 *params = attachmentObject->mipLevel();
819 break;
820
821 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
822 *params = attachmentObject->cubeMapFace();
823 break;
824
825 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
826 *params = attachmentObject->getRedSize();
827 break;
828
829 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
830 *params = attachmentObject->getGreenSize();
831 break;
832
833 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
834 *params = attachmentObject->getBlueSize();
835 break;
836
837 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
838 *params = attachmentObject->getAlphaSize();
839 break;
840
841 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
842 *params = attachmentObject->getDepthSize();
843 break;
844
845 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
846 *params = attachmentObject->getStencilSize();
847 break;
848
849 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
850 *params = attachmentObject->getComponentType();
851 break;
852
853 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
854 *params = attachmentObject->getColorEncoding();
855 break;
856
857 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
858 *params = attachmentObject->layer();
859 break;
860
Martin Radeve5285d22017-07-14 16:23:53 +0300861 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_ANGLE:
862 *params = attachmentObject->getNumViews();
863 break;
864
865 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_MULTIVIEW_LAYOUT_ANGLE:
866 *params = static_cast<GLint>(attachmentObject->getMultiviewLayout());
867 break;
868
869 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_ANGLE:
870 *params = attachmentObject->getBaseViewIndex();
871 break;
872
873 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_VIEWPORT_OFFSETS_ANGLE:
874 {
875 const std::vector<Offset> &offsets = attachmentObject->getMultiviewViewportOffsets();
876 for (size_t i = 0u; i < offsets.size(); ++i)
877 {
878 params[i * 2u] = offsets[i].x;
879 params[i * 2u + 1u] = offsets[i].y;
880 }
881 }
882 break;
883
Geoff Langff5b2d52016-09-07 11:32:23 -0400884 default:
885 UNREACHABLE();
886 break;
887 }
888}
889
890void QueryBufferParameteriv(const Buffer *buffer, GLenum pname, GLint *params)
891{
Geoff Langebebe1c2016-10-14 12:01:31 -0400892 QueryBufferParameterBase(buffer, pname, params);
893}
Geoff Langff5b2d52016-09-07 11:32:23 -0400894
Geoff Langebebe1c2016-10-14 12:01:31 -0400895void QueryBufferParameteri64v(const Buffer *buffer, GLenum pname, GLint64 *params)
896{
897 QueryBufferParameterBase(buffer, pname, params);
Geoff Langff5b2d52016-09-07 11:32:23 -0400898}
899
Geoff Lang496c02d2016-10-20 11:38:11 -0700900void QueryBufferPointerv(const Buffer *buffer, GLenum pname, void **params)
901{
902 switch (pname)
903 {
904 case GL_BUFFER_MAP_POINTER:
905 *params = buffer->getMapPointer();
906 break;
907
908 default:
909 UNREACHABLE();
910 break;
911 }
912}
913
Jamie Madillffe00c02017-06-27 16:26:55 -0400914void QueryProgramiv(const Context *context, const Program *program, GLenum pname, GLint *params)
Geoff Langff5b2d52016-09-07 11:32:23 -0400915{
916 ASSERT(program != nullptr);
917
918 switch (pname)
919 {
920 case GL_DELETE_STATUS:
921 *params = program->isFlaggedForDeletion();
922 return;
923 case GL_LINK_STATUS:
924 *params = program->isLinked();
925 return;
926 case GL_VALIDATE_STATUS:
927 *params = program->isValidated();
928 return;
929 case GL_INFO_LOG_LENGTH:
930 *params = program->getInfoLogLength();
931 return;
932 case GL_ATTACHED_SHADERS:
933 *params = program->getAttachedShadersCount();
934 return;
935 case GL_ACTIVE_ATTRIBUTES:
936 *params = program->getActiveAttributeCount();
937 return;
938 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
939 *params = program->getActiveAttributeMaxLength();
940 return;
941 case GL_ACTIVE_UNIFORMS:
942 *params = program->getActiveUniformCount();
943 return;
944 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
945 *params = program->getActiveUniformMaxLength();
946 return;
947 case GL_PROGRAM_BINARY_LENGTH_OES:
Jamie Madillffe00c02017-06-27 16:26:55 -0400948 *params = program->getBinaryLength(context);
Geoff Langff5b2d52016-09-07 11:32:23 -0400949 return;
950 case GL_ACTIVE_UNIFORM_BLOCKS:
951 *params = program->getActiveUniformBlockCount();
952 return;
953 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
954 *params = program->getActiveUniformBlockMaxLength();
955 break;
956 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
957 *params = program->getTransformFeedbackBufferMode();
958 break;
959 case GL_TRANSFORM_FEEDBACK_VARYINGS:
960 *params = program->getTransformFeedbackVaryingCount();
961 break;
962 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
963 *params = program->getTransformFeedbackVaryingMaxLength();
964 break;
965 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
966 *params = program->getBinaryRetrievableHint();
967 break;
Yunchao He61afff12017-03-14 15:34:03 +0800968 case GL_PROGRAM_SEPARABLE:
969 *params = program->isSeparable();
970 break;
Xinghua Cao971f8502017-10-17 13:01:24 +0800971 case GL_COMPUTE_WORK_GROUP_SIZE:
972 {
973 const sh::WorkGroupSize &localSize = program->getComputeShaderLocalSize();
974 params[0] = localSize[0];
975 params[1] = localSize[1];
976 params[2] = localSize[2];
977 }
978 break;
jchen1058f67be2017-10-27 08:59:27 +0800979 case GL_ACTIVE_ATOMIC_COUNTER_BUFFERS:
980 *params = program->getActiveAtomicCounterBufferCount();
981 break;
Geoff Langff5b2d52016-09-07 11:32:23 -0400982 default:
983 UNREACHABLE();
984 break;
985 }
986}
Geoff Lang740d9022016-10-07 11:20:52 -0400987
Jamie Madill4e0e6f82017-02-17 11:06:03 -0500988void QueryRenderbufferiv(const Context *context,
989 const Renderbuffer *renderbuffer,
990 GLenum pname,
991 GLint *params)
Geoff Lang740d9022016-10-07 11:20:52 -0400992{
993 ASSERT(renderbuffer != nullptr);
994
995 switch (pname)
996 {
997 case GL_RENDERBUFFER_WIDTH:
998 *params = renderbuffer->getWidth();
999 break;
1000 case GL_RENDERBUFFER_HEIGHT:
1001 *params = renderbuffer->getHeight();
1002 break;
1003 case GL_RENDERBUFFER_INTERNAL_FORMAT:
Jamie Madill4e0e6f82017-02-17 11:06:03 -05001004 // Special case the WebGL 1 DEPTH_STENCIL format.
Jamie Madilla02315b2017-02-23 14:14:47 -05001005 if (context->isWebGL1() &&
Jamie Madill4e0e6f82017-02-17 11:06:03 -05001006 renderbuffer->getFormat().info->internalFormat == GL_DEPTH24_STENCIL8)
1007 {
1008 *params = GL_DEPTH_STENCIL;
1009 }
1010 else
1011 {
1012 *params = renderbuffer->getFormat().info->internalFormat;
1013 }
Geoff Lang740d9022016-10-07 11:20:52 -04001014 break;
1015 case GL_RENDERBUFFER_RED_SIZE:
1016 *params = renderbuffer->getRedSize();
1017 break;
1018 case GL_RENDERBUFFER_GREEN_SIZE:
1019 *params = renderbuffer->getGreenSize();
1020 break;
1021 case GL_RENDERBUFFER_BLUE_SIZE:
1022 *params = renderbuffer->getBlueSize();
1023 break;
1024 case GL_RENDERBUFFER_ALPHA_SIZE:
1025 *params = renderbuffer->getAlphaSize();
1026 break;
1027 case GL_RENDERBUFFER_DEPTH_SIZE:
1028 *params = renderbuffer->getDepthSize();
1029 break;
1030 case GL_RENDERBUFFER_STENCIL_SIZE:
1031 *params = renderbuffer->getStencilSize();
1032 break;
1033 case GL_RENDERBUFFER_SAMPLES_ANGLE:
1034 *params = renderbuffer->getSamples();
1035 break;
1036 default:
1037 UNREACHABLE();
1038 break;
1039 }
1040}
Geoff Langd7d0ed32016-10-07 11:33:51 -04001041
Jamie Madillbd044ed2017-06-05 12:59:21 -04001042void QueryShaderiv(const Context *context, Shader *shader, GLenum pname, GLint *params)
Geoff Langd7d0ed32016-10-07 11:33:51 -04001043{
1044 ASSERT(shader != nullptr);
1045
1046 switch (pname)
1047 {
1048 case GL_SHADER_TYPE:
1049 *params = shader->getType();
1050 return;
1051 case GL_DELETE_STATUS:
1052 *params = shader->isFlaggedForDeletion();
1053 return;
1054 case GL_COMPILE_STATUS:
Jamie Madillbd044ed2017-06-05 12:59:21 -04001055 *params = shader->isCompiled(context) ? GL_TRUE : GL_FALSE;
Geoff Langd7d0ed32016-10-07 11:33:51 -04001056 return;
1057 case GL_INFO_LOG_LENGTH:
Jamie Madillbd044ed2017-06-05 12:59:21 -04001058 *params = shader->getInfoLogLength(context);
Geoff Langd7d0ed32016-10-07 11:33:51 -04001059 return;
1060 case GL_SHADER_SOURCE_LENGTH:
1061 *params = shader->getSourceLength();
1062 return;
1063 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
Jamie Madillbd044ed2017-06-05 12:59:21 -04001064 *params = shader->getTranslatedSourceWithDebugInfoLength(context);
Geoff Langd7d0ed32016-10-07 11:33:51 -04001065 return;
1066 default:
1067 UNREACHABLE();
1068 break;
1069 }
1070}
Geoff Langc1984ed2016-10-07 12:41:00 -04001071
He Yunchao11b038b2016-11-22 21:24:04 +08001072void QueryTexLevelParameterfv(const Texture *texture,
1073 GLenum target,
1074 GLint level,
1075 GLenum pname,
1076 GLfloat *params)
1077{
1078 QueryTexLevelParameterBase(texture, target, level, pname, params);
1079}
1080
1081void QueryTexLevelParameteriv(const Texture *texture,
1082 GLenum target,
1083 GLint level,
1084 GLenum pname,
1085 GLint *params)
1086{
1087 QueryTexLevelParameterBase(texture, target, level, pname, params);
1088}
1089
Geoff Langc1984ed2016-10-07 12:41:00 -04001090void QueryTexParameterfv(const Texture *texture, GLenum pname, GLfloat *params)
1091{
1092 QueryTexParameterBase(texture, pname, params);
1093}
1094
1095void QueryTexParameteriv(const Texture *texture, GLenum pname, GLint *params)
1096{
1097 QueryTexParameterBase(texture, pname, params);
1098}
1099
1100void QuerySamplerParameterfv(const Sampler *sampler, GLenum pname, GLfloat *params)
1101{
1102 QuerySamplerParameterBase(sampler, pname, params);
1103}
1104
1105void QuerySamplerParameteriv(const Sampler *sampler, GLenum pname, GLint *params)
1106{
1107 QuerySamplerParameterBase(sampler, pname, params);
1108}
1109
Geoff Lang0b031062016-10-13 14:30:04 -04001110void QueryVertexAttribfv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001111 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001112 const VertexAttribCurrentValueData &currentValueData,
1113 GLenum pname,
1114 GLfloat *params)
1115{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001116 QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001117}
1118
1119void QueryVertexAttribiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001120 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001121 const VertexAttribCurrentValueData &currentValueData,
1122 GLenum pname,
1123 GLint *params)
1124{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001125 QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001126}
1127
Jamie Madill876429b2017-04-20 15:46:24 -04001128void QueryVertexAttribPointerv(const VertexAttribute &attrib, GLenum pname, void **pointer)
Geoff Lang0b031062016-10-13 14:30:04 -04001129{
1130 switch (pname)
1131 {
1132 case GL_VERTEX_ATTRIB_ARRAY_POINTER:
Jamie Madill876429b2017-04-20 15:46:24 -04001133 *pointer = const_cast<void *>(attrib.pointer);
Geoff Lang0b031062016-10-13 14:30:04 -04001134 break;
1135
1136 default:
1137 UNREACHABLE();
1138 break;
1139 }
1140}
1141
1142void QueryVertexAttribIiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001143 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001144 const VertexAttribCurrentValueData &currentValueData,
1145 GLenum pname,
1146 GLint *params)
1147{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001148 QueryVertexAttribBase(attrib, binding, currentValueData.IntValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001149}
1150
1151void QueryVertexAttribIuiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001152 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001153 const VertexAttribCurrentValueData &currentValueData,
1154 GLenum pname,
1155 GLuint *params)
1156{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001157 QueryVertexAttribBase(attrib, binding, currentValueData.UnsignedIntValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001158}
1159
Geoff Lang6899b872016-10-14 11:30:13 -04001160void QueryActiveUniformBlockiv(const Program *program,
1161 GLuint uniformBlockIndex,
1162 GLenum pname,
1163 GLint *params)
1164{
jchen1058f67be2017-10-27 08:59:27 +08001165 GLenum prop = GetUniformBlockPropertyEnum(pname);
1166 QueryProgramResourceiv(program, GL_UNIFORM_BLOCK, uniformBlockIndex, 1, &prop,
1167 std::numeric_limits<GLsizei>::max(), nullptr, params);
Geoff Lang6899b872016-10-14 11:30:13 -04001168}
1169
Geoff Lang0a9661f2016-10-20 10:59:20 -07001170void QueryInternalFormativ(const TextureCaps &format, GLenum pname, GLsizei bufSize, GLint *params)
1171{
1172 switch (pname)
1173 {
1174 case GL_NUM_SAMPLE_COUNTS:
1175 if (bufSize != 0)
1176 {
jchen10a99ed552017-09-22 08:10:32 +08001177 *params = clampCast<GLint>(format.sampleCounts.size());
Geoff Lang0a9661f2016-10-20 10:59:20 -07001178 }
1179 break;
1180
1181 case GL_SAMPLES:
1182 {
1183 size_t returnCount = std::min<size_t>(bufSize, format.sampleCounts.size());
1184 auto sampleReverseIt = format.sampleCounts.rbegin();
1185 for (size_t sampleIndex = 0; sampleIndex < returnCount; ++sampleIndex)
1186 {
1187 params[sampleIndex] = *sampleReverseIt++;
1188 }
1189 }
1190 break;
1191
1192 default:
1193 UNREACHABLE();
1194 break;
1195 }
1196}
1197
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001198void QueryFramebufferParameteriv(const Framebuffer *framebuffer, GLenum pname, GLint *params)
1199{
1200 ASSERT(framebuffer);
1201
1202 switch (pname)
1203 {
1204 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
1205 *params = framebuffer->getDefaultWidth();
1206 break;
1207 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
1208 *params = framebuffer->getDefaultHeight();
1209 break;
1210 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
1211 *params = framebuffer->getDefaultSamples();
1212 break;
1213 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
1214 *params = framebuffer->getDefaultFixedSampleLocations();
1215 break;
1216 default:
1217 UNREACHABLE();
1218 break;
1219 }
1220}
1221
Jamie Madill70b5bb02017-08-28 13:32:37 -04001222Error QuerySynciv(const Sync *sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001223{
1224 ASSERT(sync);
1225
Geoff Lang82483b92017-04-11 15:33:00 -04001226 // All queries return one value, exit early if the buffer can't fit anything.
1227 if (bufSize < 1)
1228 {
1229 if (length != nullptr)
1230 {
1231 *length = 0;
1232 }
1233 return NoError();
1234 }
1235
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001236 switch (pname)
1237 {
1238 case GL_OBJECT_TYPE:
jchen10a99ed552017-09-22 08:10:32 +08001239 *values = clampCast<GLint>(GL_SYNC_FENCE);
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001240 break;
1241 case GL_SYNC_CONDITION:
jchen10a99ed552017-09-22 08:10:32 +08001242 *values = clampCast<GLint>(sync->getCondition());
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001243 break;
1244 case GL_SYNC_FLAGS:
jchen10a99ed552017-09-22 08:10:32 +08001245 *values = clampCast<GLint>(sync->getFlags());
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001246 break;
1247 case GL_SYNC_STATUS:
1248 ANGLE_TRY(sync->getStatus(values));
1249 break;
1250
1251 default:
1252 UNREACHABLE();
1253 break;
1254 }
1255
Geoff Lang82483b92017-04-11 15:33:00 -04001256 if (length != nullptr)
1257 {
1258 *length = 1;
1259 }
1260
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001261 return NoError();
1262}
1263
Jamie Madill4928b7c2017-06-20 12:57:39 -04001264void SetTexParameterf(Context *context, Texture *texture, GLenum pname, GLfloat param)
Geoff Langc1984ed2016-10-07 12:41:00 -04001265{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001266 SetTexParameterBase(context, texture, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -04001267}
1268
Jamie Madill4928b7c2017-06-20 12:57:39 -04001269void SetTexParameterfv(Context *context, Texture *texture, GLenum pname, const GLfloat *params)
Geoff Langc1984ed2016-10-07 12:41:00 -04001270{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001271 SetTexParameterBase(context, texture, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001272}
1273
Jamie Madill4928b7c2017-06-20 12:57:39 -04001274void SetTexParameteri(Context *context, Texture *texture, GLenum pname, GLint param)
Geoff Langc1984ed2016-10-07 12:41:00 -04001275{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001276 SetTexParameterBase(context, texture, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -04001277}
1278
Jamie Madill4928b7c2017-06-20 12:57:39 -04001279void SetTexParameteriv(Context *context, Texture *texture, GLenum pname, const GLint *params)
Geoff Langc1984ed2016-10-07 12:41:00 -04001280{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001281 SetTexParameterBase(context, texture, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001282}
1283
1284void SetSamplerParameterf(Sampler *sampler, GLenum pname, GLfloat param)
1285{
1286 SetSamplerParameterBase(sampler, pname, &param);
1287}
1288
1289void SetSamplerParameterfv(Sampler *sampler, GLenum pname, const GLfloat *params)
1290{
1291 SetSamplerParameterBase(sampler, pname, params);
1292}
1293
1294void SetSamplerParameteri(Sampler *sampler, GLenum pname, GLint param)
1295{
1296 SetSamplerParameterBase(sampler, pname, &param);
1297}
1298
1299void SetSamplerParameteriv(Sampler *sampler, GLenum pname, const GLint *params)
1300{
1301 SetSamplerParameterBase(sampler, pname, params);
1302}
Geoff Lang65603eb2017-01-12 16:48:03 -05001303
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001304void SetFramebufferParameteri(Framebuffer *framebuffer, GLenum pname, GLint param)
1305{
1306 ASSERT(framebuffer);
1307
1308 switch (pname)
1309 {
1310 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
1311 framebuffer->setDefaultWidth(param);
1312 break;
1313 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
1314 framebuffer->setDefaultHeight(param);
1315 break;
1316 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
1317 framebuffer->setDefaultSamples(param);
1318 break;
1319 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
jchen10a99ed552017-09-22 08:10:32 +08001320 framebuffer->setDefaultFixedSampleLocations(CastQueryValueTo<GLboolean>(pname, param));
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001321 break;
1322 default:
1323 UNREACHABLE();
1324 break;
1325 }
1326}
1327
Yunchao He61afff12017-03-14 15:34:03 +08001328void SetProgramParameteri(Program *program, GLenum pname, GLint value)
1329{
1330 ASSERT(program);
1331
1332 switch (pname)
1333 {
1334 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
1335 program->setBinaryRetrievableHint(value != GL_FALSE);
1336 break;
1337 case GL_PROGRAM_SEPARABLE:
1338 program->setSeparable(value != GL_FALSE);
1339 break;
1340 default:
1341 UNREACHABLE();
1342 break;
1343 }
1344}
1345
jchen10baf5d942017-08-28 20:45:48 +08001346GLint GetUniformResourceProperty(const Program *program, GLuint index, const GLenum prop)
1347{
1348 const auto &uniform = program->getUniformByIndex(index);
1349 GLenum resourceProp = GetUniformPropertyEnum(prop);
1350 switch (resourceProp)
1351 {
1352 case GL_TYPE:
1353 case GL_ARRAY_SIZE:
1354 case GL_NAME_LENGTH:
1355 return GetLocationVariableProperty(uniform, resourceProp);
1356
1357 case GL_LOCATION:
1358 return program->getUniformLocation(uniform.name);
1359
1360 case GL_BLOCK_INDEX:
1361 return (uniform.isAtomicCounter() ? -1 : uniform.bufferIndex);
1362
1363 case GL_OFFSET:
1364 return uniform.blockInfo.offset;
1365
1366 case GL_ARRAY_STRIDE:
1367 return uniform.blockInfo.arrayStride;
1368
1369 case GL_MATRIX_STRIDE:
1370 return uniform.blockInfo.matrixStride;
1371
1372 case GL_IS_ROW_MAJOR:
1373 return static_cast<GLint>(uniform.blockInfo.isRowMajorMatrix);
1374
1375 case GL_REFERENCED_BY_VERTEX_SHADER:
1376 return uniform.vertexStaticUse;
1377
1378 case GL_REFERENCED_BY_FRAGMENT_SHADER:
1379 return uniform.fragmentStaticUse;
1380
1381 case GL_REFERENCED_BY_COMPUTE_SHADER:
1382 return uniform.computeStaticUse;
1383
1384 case GL_ATOMIC_COUNTER_BUFFER_INDEX:
1385 return (uniform.isAtomicCounter() ? uniform.bufferIndex : -1);
1386
1387 default:
1388 UNREACHABLE();
1389 return 0;
1390 }
1391}
1392
jchen1015015f72017-03-16 13:54:21 +08001393GLuint QueryProgramResourceIndex(const Program *program,
1394 GLenum programInterface,
1395 const GLchar *name)
1396{
1397 switch (programInterface)
1398 {
1399 case GL_PROGRAM_INPUT:
1400 return program->getInputResourceIndex(name);
1401
1402 case GL_PROGRAM_OUTPUT:
1403 return program->getOutputResourceIndex(name);
1404
jchen1015015f72017-03-16 13:54:21 +08001405 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001406 return program->getState().getUniformIndexFromName(name);
1407
jchen1015015f72017-03-16 13:54:21 +08001408 case GL_UNIFORM_BLOCK:
jchen1058f67be2017-10-27 08:59:27 +08001409 return program->getUniformBlockIndex(name);
1410
1411 // TODO(jie.a.chen@intel.com): more interfaces.
jchen1015015f72017-03-16 13:54:21 +08001412 case GL_TRANSFORM_FEEDBACK_VARYING:
1413 case GL_BUFFER_VARIABLE:
1414 case GL_SHADER_STORAGE_BLOCK:
1415 UNIMPLEMENTED();
1416 return GL_INVALID_INDEX;
1417
1418 default:
1419 UNREACHABLE();
1420 return GL_INVALID_INDEX;
1421 }
1422}
1423
jchen10fd7c3b52017-03-21 15:36:03 +08001424void QueryProgramResourceName(const Program *program,
1425 GLenum programInterface,
1426 GLuint index,
1427 GLsizei bufSize,
1428 GLsizei *length,
1429 GLchar *name)
1430{
1431 switch (programInterface)
1432 {
1433 case GL_PROGRAM_INPUT:
1434 program->getInputResourceName(index, bufSize, length, name);
1435 break;
1436
1437 case GL_PROGRAM_OUTPUT:
1438 program->getOutputResourceName(index, bufSize, length, name);
1439 break;
1440
jchen10fd7c3b52017-03-21 15:36:03 +08001441 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001442 program->getUniformResourceName(index, bufSize, length, name);
1443 break;
1444
jchen10fd7c3b52017-03-21 15:36:03 +08001445 case GL_UNIFORM_BLOCK:
jchen1058f67be2017-10-27 08:59:27 +08001446 program->getActiveUniformBlockName(index, bufSize, length, name);
1447 break;
1448
1449 // TODO(jie.a.chen@intel.com): more interfaces.
jchen10fd7c3b52017-03-21 15:36:03 +08001450 case GL_TRANSFORM_FEEDBACK_VARYING:
1451 case GL_BUFFER_VARIABLE:
1452 case GL_SHADER_STORAGE_BLOCK:
1453 UNIMPLEMENTED();
1454 break;
1455
1456 default:
1457 UNREACHABLE();
1458 }
1459}
1460
jchen10191381f2017-04-11 13:59:04 +08001461GLint QueryProgramResourceLocation(const Program *program,
1462 GLenum programInterface,
1463 const GLchar *name)
1464{
1465 switch (programInterface)
1466 {
1467 case GL_PROGRAM_INPUT:
1468 return program->getAttributeLocation(name);
1469
1470 case GL_PROGRAM_OUTPUT:
1471 return program->getFragDataLocation(name);
1472
jchen10191381f2017-04-11 13:59:04 +08001473 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001474 return program->getState().getUniformLocation(name);
1475
jchen10191381f2017-04-11 13:59:04 +08001476 default:
1477 UNREACHABLE();
1478 return -1;
1479 }
1480}
1481
jchen10880683b2017-04-12 16:21:55 +08001482void QueryProgramResourceiv(const Program *program,
1483 GLenum programInterface,
1484 GLuint index,
1485 GLsizei propCount,
1486 const GLenum *props,
1487 GLsizei bufSize,
1488 GLsizei *length,
1489 GLint *params)
1490{
1491 if (!program->isLinked())
1492 {
1493 if (length != nullptr)
1494 {
1495 *length = 0;
1496 }
1497 return;
1498 }
1499
jchen1058f67be2017-10-27 08:59:27 +08001500 GLsizei pos = 0;
1501 for (GLsizei i = 0; i < propCount; i++)
jchen10880683b2017-04-12 16:21:55 +08001502 {
1503 switch (programInterface)
1504 {
1505 case GL_PROGRAM_INPUT:
1506 params[i] = GetInputResourceProperty(program, index, props[i]);
jchen1058f67be2017-10-27 08:59:27 +08001507 ++pos;
jchen10880683b2017-04-12 16:21:55 +08001508 break;
1509
1510 case GL_PROGRAM_OUTPUT:
1511 params[i] = GetOutputResourceProperty(program, index, props[i]);
jchen1058f67be2017-10-27 08:59:27 +08001512 ++pos;
jchen10880683b2017-04-12 16:21:55 +08001513 break;
1514
jchen10880683b2017-04-12 16:21:55 +08001515 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001516 params[i] = GetUniformResourceProperty(program, index, props[i]);
jchen1058f67be2017-10-27 08:59:27 +08001517 ++pos;
1518 break;
1519 case GL_UNIFORM_BLOCK:
1520 GetUniformBlockResourceProperty(program, index, props[i], params, bufSize, &pos);
jchen10baf5d942017-08-28 20:45:48 +08001521 break;
1522
jchen1058f67be2017-10-27 08:59:27 +08001523 case GL_ATOMIC_COUNTER_BUFFER:
1524 GetAtomicCounterBufferResourceProperty(program, index, props[i], params, bufSize,
1525 &pos);
1526 break;
jchen10baf5d942017-08-28 20:45:48 +08001527 // TODO(jie.a.chen@intel.com): more interfaces.
jchen10880683b2017-04-12 16:21:55 +08001528 case GL_TRANSFORM_FEEDBACK_VARYING:
1529 case GL_BUFFER_VARIABLE:
1530 case GL_SHADER_STORAGE_BLOCK:
jchen10880683b2017-04-12 16:21:55 +08001531 UNIMPLEMENTED();
1532 params[i] = GL_INVALID_VALUE;
1533 break;
1534
1535 default:
1536 UNREACHABLE();
1537 params[i] = GL_INVALID_VALUE;
1538 }
jchen1058f67be2017-10-27 08:59:27 +08001539 if (pos == bufSize)
1540 {
1541 // Most properties return one value, but GL_ACTIVE_VARIABLES returns an array of values.
1542 // This checks not to break buffer bounds for such case.
1543 break;
1544 }
1545 }
1546
1547 if (length != nullptr)
1548 {
1549 *length = pos;
jchen10880683b2017-04-12 16:21:55 +08001550 }
1551}
1552
jchen10d9cd7b72017-08-30 15:04:25 +08001553void QueryProgramInterfaceiv(const Program *program,
1554 GLenum programInterface,
1555 GLenum pname,
1556 GLint *params)
1557{
1558 switch (pname)
1559 {
1560 case GL_ACTIVE_RESOURCES:
1561 *params = QueryProgramInterfaceActiveResources(program, programInterface);
1562 break;
1563
1564 case GL_MAX_NAME_LENGTH:
1565 *params = QueryProgramInterfaceMaxNameLength(program, programInterface);
1566 break;
1567
1568 case GL_MAX_NUM_ACTIVE_VARIABLES:
1569 *params = QueryProgramInterfaceMaxNumActiveVariables(program, programInterface);
1570 break;
1571
1572 default:
1573 UNREACHABLE();
1574 }
1575}
1576
Geoff Lang65603eb2017-01-12 16:48:03 -05001577} // namespace gl
1578
1579namespace egl
1580{
1581
1582void QueryConfigAttrib(const Config *config, EGLint attribute, EGLint *value)
1583{
1584 ASSERT(config != nullptr);
1585 switch (attribute)
1586 {
1587 case EGL_BUFFER_SIZE:
1588 *value = config->bufferSize;
1589 break;
1590 case EGL_ALPHA_SIZE:
1591 *value = config->alphaSize;
1592 break;
1593 case EGL_BLUE_SIZE:
1594 *value = config->blueSize;
1595 break;
1596 case EGL_GREEN_SIZE:
1597 *value = config->greenSize;
1598 break;
1599 case EGL_RED_SIZE:
1600 *value = config->redSize;
1601 break;
1602 case EGL_DEPTH_SIZE:
1603 *value = config->depthSize;
1604 break;
1605 case EGL_STENCIL_SIZE:
1606 *value = config->stencilSize;
1607 break;
1608 case EGL_CONFIG_CAVEAT:
1609 *value = config->configCaveat;
1610 break;
1611 case EGL_CONFIG_ID:
1612 *value = config->configID;
1613 break;
1614 case EGL_LEVEL:
1615 *value = config->level;
1616 break;
1617 case EGL_NATIVE_RENDERABLE:
1618 *value = config->nativeRenderable;
1619 break;
1620 case EGL_NATIVE_VISUAL_ID:
1621 *value = config->nativeVisualID;
1622 break;
1623 case EGL_NATIVE_VISUAL_TYPE:
1624 *value = config->nativeVisualType;
1625 break;
1626 case EGL_SAMPLES:
1627 *value = config->samples;
1628 break;
1629 case EGL_SAMPLE_BUFFERS:
1630 *value = config->sampleBuffers;
1631 break;
1632 case EGL_SURFACE_TYPE:
1633 *value = config->surfaceType;
1634 break;
1635 case EGL_TRANSPARENT_TYPE:
1636 *value = config->transparentType;
1637 break;
1638 case EGL_TRANSPARENT_BLUE_VALUE:
1639 *value = config->transparentBlueValue;
1640 break;
1641 case EGL_TRANSPARENT_GREEN_VALUE:
1642 *value = config->transparentGreenValue;
1643 break;
1644 case EGL_TRANSPARENT_RED_VALUE:
1645 *value = config->transparentRedValue;
1646 break;
1647 case EGL_BIND_TO_TEXTURE_RGB:
1648 *value = config->bindToTextureRGB;
1649 break;
1650 case EGL_BIND_TO_TEXTURE_RGBA:
1651 *value = config->bindToTextureRGBA;
1652 break;
1653 case EGL_MIN_SWAP_INTERVAL:
1654 *value = config->minSwapInterval;
1655 break;
1656 case EGL_MAX_SWAP_INTERVAL:
1657 *value = config->maxSwapInterval;
1658 break;
1659 case EGL_LUMINANCE_SIZE:
1660 *value = config->luminanceSize;
1661 break;
1662 case EGL_ALPHA_MASK_SIZE:
1663 *value = config->alphaMaskSize;
1664 break;
1665 case EGL_COLOR_BUFFER_TYPE:
1666 *value = config->colorBufferType;
1667 break;
1668 case EGL_RENDERABLE_TYPE:
1669 *value = config->renderableType;
1670 break;
1671 case EGL_MATCH_NATIVE_PIXMAP:
1672 *value = false;
1673 UNIMPLEMENTED();
1674 break;
1675 case EGL_CONFORMANT:
1676 *value = config->conformant;
1677 break;
1678 case EGL_MAX_PBUFFER_WIDTH:
1679 *value = config->maxPBufferWidth;
1680 break;
1681 case EGL_MAX_PBUFFER_HEIGHT:
1682 *value = config->maxPBufferHeight;
1683 break;
1684 case EGL_MAX_PBUFFER_PIXELS:
1685 *value = config->maxPBufferPixels;
1686 break;
1687 case EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE:
1688 *value = config->optimalOrientation;
1689 break;
Geoff Langc5a2a172017-01-13 15:55:07 -05001690 case EGL_COLOR_COMPONENT_TYPE_EXT:
1691 *value = config->colorComponentType;
1692 break;
Geoff Lang65603eb2017-01-12 16:48:03 -05001693 default:
1694 UNREACHABLE();
1695 break;
1696 }
Geoff Langff5b2d52016-09-07 11:32:23 -04001697}
Geoff Lang65603eb2017-01-12 16:48:03 -05001698
Geoff Langaf143fe2017-10-05 13:59:43 -04001699void QueryContextAttrib(const gl::Context *context, EGLint attribute, EGLint *value)
1700{
1701 switch (attribute)
1702 {
1703 case EGL_CONFIG_ID:
1704 *value = context->getConfig()->configID;
1705 break;
1706 case EGL_CONTEXT_CLIENT_TYPE:
1707 *value = context->getClientType();
1708 break;
1709 case EGL_CONTEXT_CLIENT_VERSION:
1710 *value = context->getClientMajorVersion();
1711 break;
1712 case EGL_RENDER_BUFFER:
1713 *value = context->getRenderBuffer();
1714 break;
Geoff Langb433e872017-10-05 14:01:47 -04001715 case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
1716 *value = context->isRobustResourceInitEnabled();
1717 break;
Geoff Langaf143fe2017-10-05 13:59:43 -04001718 default:
1719 UNREACHABLE();
1720 break;
1721 }
1722}
1723
Geoff Lang31ecbd72017-07-26 13:01:27 -04001724void QuerySurfaceAttrib(const Surface *surface, EGLint attribute, EGLint *value)
1725{
1726 switch (attribute)
1727 {
1728 case EGL_GL_COLORSPACE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001729 *value = surface->getGLColorspace();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001730 break;
1731 case EGL_VG_ALPHA_FORMAT:
Geoff Lang40ac7832017-07-26 14:38:46 -04001732 *value = surface->getVGAlphaFormat();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001733 break;
1734 case EGL_VG_COLORSPACE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001735 *value = surface->getVGColorspace();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001736 break;
1737 case EGL_CONFIG_ID:
1738 *value = surface->getConfig()->configID;
1739 break;
1740 case EGL_HEIGHT:
1741 *value = surface->getHeight();
1742 break;
1743 case EGL_HORIZONTAL_RESOLUTION:
Geoff Lang40ac7832017-07-26 14:38:46 -04001744 *value = surface->getHorizontalResolution();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001745 break;
1746 case EGL_LARGEST_PBUFFER:
Geoff Lang40ac7832017-07-26 14:38:46 -04001747 // The EGL spec states that value is not written if the surface is not a pbuffer
1748 if (surface->getType() == EGL_PBUFFER_BIT)
1749 {
1750 *value = surface->getLargestPbuffer();
1751 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001752 break;
1753 case EGL_MIPMAP_TEXTURE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001754 // The EGL spec states that value is not written if the surface is not a pbuffer
1755 if (surface->getType() == EGL_PBUFFER_BIT)
1756 {
1757 *value = surface->getMipmapTexture();
1758 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001759 break;
1760 case EGL_MIPMAP_LEVEL:
Geoff Lang40ac7832017-07-26 14:38:46 -04001761 // The EGL spec states that value is not written if the surface is not a pbuffer
1762 if (surface->getType() == EGL_PBUFFER_BIT)
1763 {
1764 *value = surface->getMipmapLevel();
1765 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001766 break;
1767 case EGL_MULTISAMPLE_RESOLVE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001768 *value = surface->getMultisampleResolve();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001769 break;
1770 case EGL_PIXEL_ASPECT_RATIO:
1771 *value = surface->getPixelAspectRatio();
1772 break;
1773 case EGL_RENDER_BUFFER:
1774 *value = surface->getRenderBuffer();
1775 break;
1776 case EGL_SWAP_BEHAVIOR:
1777 *value = surface->getSwapBehavior();
1778 break;
1779 case EGL_TEXTURE_FORMAT:
Geoff Lang40ac7832017-07-26 14:38:46 -04001780 // The EGL spec states that value is not written if the surface is not a pbuffer
1781 if (surface->getType() == EGL_PBUFFER_BIT)
1782 {
1783 *value = surface->getTextureFormat();
1784 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001785 break;
1786 case EGL_TEXTURE_TARGET:
Geoff Lang40ac7832017-07-26 14:38:46 -04001787 // The EGL spec states that value is not written if the surface is not a pbuffer
1788 if (surface->getType() == EGL_PBUFFER_BIT)
1789 {
1790 *value = surface->getTextureTarget();
1791 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001792 break;
1793 case EGL_VERTICAL_RESOLUTION:
Geoff Lang40ac7832017-07-26 14:38:46 -04001794 *value = surface->getVerticalResolution();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001795 break;
1796 case EGL_WIDTH:
1797 *value = surface->getWidth();
1798 break;
1799 case EGL_POST_SUB_BUFFER_SUPPORTED_NV:
1800 *value = surface->isPostSubBufferSupported();
1801 break;
1802 case EGL_FIXED_SIZE_ANGLE:
1803 *value = surface->isFixedSize();
1804 break;
1805 case EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE:
1806 *value = surface->flexibleSurfaceCompatibilityRequested();
1807 break;
1808 case EGL_SURFACE_ORIENTATION_ANGLE:
1809 *value = surface->getOrientation();
1810 break;
1811 case EGL_DIRECT_COMPOSITION_ANGLE:
1812 *value = surface->directComposition();
1813 break;
Geoff Langb433e872017-10-05 14:01:47 -04001814 case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
1815 *value = surface->isRobustResourceInitEnabled();
1816 break;
Geoff Lang31ecbd72017-07-26 13:01:27 -04001817 default:
1818 UNREACHABLE();
1819 break;
1820 }
1821}
1822
1823void SetSurfaceAttrib(Surface *surface, EGLint attribute, EGLint value)
1824{
1825 switch (attribute)
1826 {
1827 case EGL_MIPMAP_LEVEL:
Geoff Lang40ac7832017-07-26 14:38:46 -04001828 surface->setMipmapLevel(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04001829 break;
1830 case EGL_MULTISAMPLE_RESOLVE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001831 surface->setMultisampleResolve(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04001832 break;
1833 case EGL_SWAP_BEHAVIOR:
Geoff Lang40ac7832017-07-26 14:38:46 -04001834 surface->setSwapBehavior(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04001835 break;
1836 default:
1837 UNREACHABLE();
1838 break;
1839 }
1840}
1841
Geoff Lang65603eb2017-01-12 16:48:03 -05001842} // namespace egl