blob: 38730c335b94e98548211c22a3200c6d2813780b [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,
Corentin Wallez99d492c2018-02-27 15:17:10 -050036 TextureTarget target,
He Yunchao11b038b2016-11-22 21:24:04 +080037 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;
Yunchao Hebacaa712018-01-30 14:01:39 +0800186 case GL_DEPTH_STENCIL_TEXTURE_MODE:
187 *params =
188 CastFromGLintStateValue<ParamType>(pname, texture->getDepthStencilTextureMode());
189 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400190 default:
191 UNREACHABLE();
192 break;
193 }
194}
195
196template <typename ParamType>
Jamie Madill4928b7c2017-06-20 12:57:39 -0400197void SetTexParameterBase(Context *context, Texture *texture, GLenum pname, const ParamType *params)
Geoff Langc1984ed2016-10-07 12:41:00 -0400198{
199 ASSERT(texture != nullptr);
200
201 switch (pname)
202 {
203 case GL_TEXTURE_WRAP_S:
jchen10a99ed552017-09-22 08:10:32 +0800204 texture->setWrapS(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400205 break;
206 case GL_TEXTURE_WRAP_T:
jchen10a99ed552017-09-22 08:10:32 +0800207 texture->setWrapT(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400208 break;
209 case GL_TEXTURE_WRAP_R:
jchen10a99ed552017-09-22 08:10:32 +0800210 texture->setWrapR(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400211 break;
212 case GL_TEXTURE_MIN_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800213 texture->setMinFilter(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400214 break;
215 case GL_TEXTURE_MAG_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800216 texture->setMagFilter(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400217 break;
218 case GL_TEXTURE_USAGE_ANGLE:
jchen10a99ed552017-09-22 08:10:32 +0800219 texture->setUsage(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400220 break;
221 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800222 texture->setMaxAnisotropy(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400223 break;
224 case GL_TEXTURE_COMPARE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800225 texture->setCompareMode(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400226 break;
227 case GL_TEXTURE_COMPARE_FUNC:
jchen10a99ed552017-09-22 08:10:32 +0800228 texture->setCompareFunc(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400229 break;
230 case GL_TEXTURE_SWIZZLE_R:
jchen10a99ed552017-09-22 08:10:32 +0800231 texture->setSwizzleRed(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400232 break;
233 case GL_TEXTURE_SWIZZLE_G:
jchen10a99ed552017-09-22 08:10:32 +0800234 texture->setSwizzleGreen(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400235 break;
236 case GL_TEXTURE_SWIZZLE_B:
jchen10a99ed552017-09-22 08:10:32 +0800237 texture->setSwizzleBlue(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400238 break;
239 case GL_TEXTURE_SWIZZLE_A:
jchen10a99ed552017-09-22 08:10:32 +0800240 texture->setSwizzleAlpha(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400241 break;
242 case GL_TEXTURE_BASE_LEVEL:
Jamie Madill4928b7c2017-06-20 12:57:39 -0400243 {
jchen10a99ed552017-09-22 08:10:32 +0800244 context->handleError(texture->setBaseLevel(
245 context, clampCast<GLuint>(CastQueryValueTo<GLint>(pname, params[0]))));
Geoff Langc1984ed2016-10-07 12:41:00 -0400246 break;
Jamie Madill4928b7c2017-06-20 12:57:39 -0400247 }
Geoff Langc1984ed2016-10-07 12:41:00 -0400248 case GL_TEXTURE_MAX_LEVEL:
jchen10a99ed552017-09-22 08:10:32 +0800249 texture->setMaxLevel(clampCast<GLuint>(CastQueryValueTo<GLint>(pname, params[0])));
Geoff Langc1984ed2016-10-07 12:41:00 -0400250 break;
251 case GL_TEXTURE_MIN_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800252 texture->setMinLod(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400253 break;
254 case GL_TEXTURE_MAX_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800255 texture->setMaxLod(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400256 break;
Geoff Lang3b573612016-10-31 14:08:10 -0400257 case GL_DEPTH_STENCIL_TEXTURE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800258 texture->setDepthStencilTextureMode(ConvertToGLenum(pname, params[0]));
Geoff Lang3b573612016-10-31 14:08:10 -0400259 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700260 case GL_TEXTURE_SRGB_DECODE_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800261 texture->setSRGBDecode(ConvertToGLenum(pname, params[0]));
Geoff Lang81c6b572016-10-19 14:07:52 -0700262 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400263 default:
264 UNREACHABLE();
265 break;
266 }
267}
268
269template <typename ParamType>
270void QuerySamplerParameterBase(const Sampler *sampler, GLenum pname, ParamType *params)
271{
272 switch (pname)
273 {
274 case GL_TEXTURE_MIN_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800275 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getMinFilter());
Geoff Langc1984ed2016-10-07 12:41:00 -0400276 break;
277 case GL_TEXTURE_MAG_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800278 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getMagFilter());
Geoff Langc1984ed2016-10-07 12:41:00 -0400279 break;
280 case GL_TEXTURE_WRAP_S:
jchen10a99ed552017-09-22 08:10:32 +0800281 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getWrapS());
Geoff Langc1984ed2016-10-07 12:41:00 -0400282 break;
283 case GL_TEXTURE_WRAP_T:
jchen10a99ed552017-09-22 08:10:32 +0800284 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getWrapT());
Geoff Langc1984ed2016-10-07 12:41:00 -0400285 break;
286 case GL_TEXTURE_WRAP_R:
jchen10a99ed552017-09-22 08:10:32 +0800287 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getWrapR());
Geoff Langc1984ed2016-10-07 12:41:00 -0400288 break;
289 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800290 *params = CastFromStateValue<ParamType>(pname, sampler->getMaxAnisotropy());
Geoff Langc1984ed2016-10-07 12:41:00 -0400291 break;
292 case GL_TEXTURE_MIN_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800293 *params = CastFromStateValue<ParamType>(pname, sampler->getMinLod());
Geoff Langc1984ed2016-10-07 12:41:00 -0400294 break;
295 case GL_TEXTURE_MAX_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800296 *params = CastFromStateValue<ParamType>(pname, sampler->getMaxLod());
Geoff Langc1984ed2016-10-07 12:41:00 -0400297 break;
298 case GL_TEXTURE_COMPARE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800299 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getCompareMode());
Geoff Langc1984ed2016-10-07 12:41:00 -0400300 break;
301 case GL_TEXTURE_COMPARE_FUNC:
jchen10a99ed552017-09-22 08:10:32 +0800302 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getCompareFunc());
Geoff Langc1984ed2016-10-07 12:41:00 -0400303 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700304 case GL_TEXTURE_SRGB_DECODE_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800305 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getSRGBDecode());
Geoff Lang81c6b572016-10-19 14:07:52 -0700306 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400307 default:
308 UNREACHABLE();
309 break;
310 }
311}
312
313template <typename ParamType>
314void SetSamplerParameterBase(Sampler *sampler, GLenum pname, const ParamType *params)
315{
316 switch (pname)
317 {
318 case GL_TEXTURE_WRAP_S:
jchen10a99ed552017-09-22 08:10:32 +0800319 sampler->setWrapS(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400320 break;
321 case GL_TEXTURE_WRAP_T:
jchen10a99ed552017-09-22 08:10:32 +0800322 sampler->setWrapT(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400323 break;
324 case GL_TEXTURE_WRAP_R:
jchen10a99ed552017-09-22 08:10:32 +0800325 sampler->setWrapR(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400326 break;
327 case GL_TEXTURE_MIN_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800328 sampler->setMinFilter(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400329 break;
330 case GL_TEXTURE_MAG_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800331 sampler->setMagFilter(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400332 break;
333 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800334 sampler->setMaxAnisotropy(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400335 break;
336 case GL_TEXTURE_COMPARE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800337 sampler->setCompareMode(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400338 break;
339 case GL_TEXTURE_COMPARE_FUNC:
jchen10a99ed552017-09-22 08:10:32 +0800340 sampler->setCompareFunc(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400341 break;
342 case GL_TEXTURE_MIN_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800343 sampler->setMinLod(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400344 break;
345 case GL_TEXTURE_MAX_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800346 sampler->setMaxLod(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400347 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700348 case GL_TEXTURE_SRGB_DECODE_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800349 sampler->setSRGBDecode(ConvertToGLenum(pname, params[0]));
Geoff Lang81c6b572016-10-19 14:07:52 -0700350 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400351 default:
352 UNREACHABLE();
353 break;
354 }
355}
356
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800357// Warning: you should ensure binding really matches attrib.bindingIndex before using this function.
Geoff Lang0b031062016-10-13 14:30:04 -0400358template <typename ParamType, typename CurrentDataType, size_t CurrentValueCount>
359void QueryVertexAttribBase(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800360 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -0400361 const CurrentDataType (&currentValueData)[CurrentValueCount],
362 GLenum pname,
363 ParamType *params)
364{
365 switch (pname)
366 {
367 case GL_CURRENT_VERTEX_ATTRIB:
368 for (size_t i = 0; i < CurrentValueCount; ++i)
369 {
jchen10a99ed552017-09-22 08:10:32 +0800370 params[i] = CastFromStateValue<ParamType>(pname, currentValueData[i]);
Geoff Lang0b031062016-10-13 14:30:04 -0400371 }
372 break;
373 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
jchen10a99ed552017-09-22 08:10:32 +0800374 *params = CastFromStateValue<ParamType>(pname, static_cast<GLint>(attrib.enabled));
Geoff Lang0b031062016-10-13 14:30:04 -0400375 break;
376 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
jchen10a99ed552017-09-22 08:10:32 +0800377 *params = CastFromGLintStateValue<ParamType>(pname, attrib.size);
Geoff Lang0b031062016-10-13 14:30:04 -0400378 break;
379 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
jchen10a99ed552017-09-22 08:10:32 +0800380 *params = CastFromGLintStateValue<ParamType>(pname, attrib.vertexAttribArrayStride);
Geoff Lang0b031062016-10-13 14:30:04 -0400381 break;
382 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
jchen10a99ed552017-09-22 08:10:32 +0800383 *params = CastFromGLintStateValue<ParamType>(pname, attrib.type);
Geoff Lang0b031062016-10-13 14:30:04 -0400384 break;
385 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
jchen10a99ed552017-09-22 08:10:32 +0800386 *params = CastFromStateValue<ParamType>(pname, static_cast<GLint>(attrib.normalized));
Geoff Lang0b031062016-10-13 14:30:04 -0400387 break;
388 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
jchen10a99ed552017-09-22 08:10:32 +0800389 *params = CastFromGLintStateValue<ParamType>(pname, binding.getBuffer().id());
Geoff Lang0b031062016-10-13 14:30:04 -0400390 break;
391 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
jchen10a99ed552017-09-22 08:10:32 +0800392 *params = CastFromGLintStateValue<ParamType>(pname, binding.getDivisor());
Geoff Lang0b031062016-10-13 14:30:04 -0400393 break;
394 case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
jchen10a99ed552017-09-22 08:10:32 +0800395 *params = CastFromGLintStateValue<ParamType>(pname, attrib.pureInteger);
Geoff Lang0b031062016-10-13 14:30:04 -0400396 break;
Shao80957d92017-02-20 21:25:59 +0800397 case GL_VERTEX_ATTRIB_BINDING:
jchen10a99ed552017-09-22 08:10:32 +0800398 *params = CastFromGLintStateValue<ParamType>(pname, attrib.bindingIndex);
Shao80957d92017-02-20 21:25:59 +0800399 break;
400 case GL_VERTEX_ATTRIB_RELATIVE_OFFSET:
jchen10a99ed552017-09-22 08:10:32 +0800401 *params = CastFromGLintStateValue<ParamType>(pname, attrib.relativeOffset);
Shao80957d92017-02-20 21:25:59 +0800402 break;
Geoff Lang0b031062016-10-13 14:30:04 -0400403 default:
404 UNREACHABLE();
405 break;
406 }
407}
408
Geoff Langebebe1c2016-10-14 12:01:31 -0400409template <typename ParamType>
410void QueryBufferParameterBase(const Buffer *buffer, GLenum pname, ParamType *params)
411{
412 ASSERT(buffer != nullptr);
413
414 switch (pname)
415 {
416 case GL_BUFFER_USAGE:
Corentin Wallez2e568cf2017-09-18 17:05:22 -0400417 *params = CastFromGLintStateValue<ParamType>(pname, ToGLenum(buffer->getUsage()));
Geoff Langebebe1c2016-10-14 12:01:31 -0400418 break;
419 case GL_BUFFER_SIZE:
jchen10a99ed552017-09-22 08:10:32 +0800420 *params = CastFromStateValue<ParamType>(pname, buffer->getSize());
Geoff Langebebe1c2016-10-14 12:01:31 -0400421 break;
422 case GL_BUFFER_ACCESS_FLAGS:
jchen10a99ed552017-09-22 08:10:32 +0800423 *params = CastFromGLintStateValue<ParamType>(pname, buffer->getAccessFlags());
Geoff Langebebe1c2016-10-14 12:01:31 -0400424 break;
425 case GL_BUFFER_ACCESS_OES:
jchen10a99ed552017-09-22 08:10:32 +0800426 *params = CastFromGLintStateValue<ParamType>(pname, buffer->getAccess());
Geoff Langebebe1c2016-10-14 12:01:31 -0400427 break;
428 case GL_BUFFER_MAPPED:
jchen10a99ed552017-09-22 08:10:32 +0800429 *params = CastFromStateValue<ParamType>(pname, buffer->isMapped());
Geoff Langebebe1c2016-10-14 12:01:31 -0400430 break;
431 case GL_BUFFER_MAP_OFFSET:
jchen10a99ed552017-09-22 08:10:32 +0800432 *params = CastFromStateValue<ParamType>(pname, buffer->getMapOffset());
Geoff Langebebe1c2016-10-14 12:01:31 -0400433 break;
434 case GL_BUFFER_MAP_LENGTH:
jchen10a99ed552017-09-22 08:10:32 +0800435 *params = CastFromStateValue<ParamType>(pname, buffer->getMapLength());
Geoff Langebebe1c2016-10-14 12:01:31 -0400436 break;
437 default:
438 UNREACHABLE();
439 break;
440 }
441}
442
Olli Etuaho465835d2017-09-26 13:34:10 +0300443GLint GetCommonVariableProperty(const sh::ShaderVariable &var, GLenum prop)
jchen10880683b2017-04-12 16:21:55 +0800444{
445 switch (prop)
446 {
447 case GL_TYPE:
jchen10a99ed552017-09-22 08:10:32 +0800448 return clampCast<GLint>(var.type);
jchen10880683b2017-04-12 16:21:55 +0800449
450 case GL_ARRAY_SIZE:
Olli Etuaho465835d2017-09-26 13:34:10 +0300451 // Queryable variables are guaranteed not to be arrays of arrays or arrays of structs,
452 // see GLES 3.1 spec section 7.3.1.1 page 77.
453 return clampCast<GLint>(var.getBasicTypeElementCount());
jchen10880683b2017-04-12 16:21:55 +0800454
455 case GL_NAME_LENGTH:
jchen10880683b2017-04-12 16:21:55 +0800456 // ES31 spec p84: This counts the terminating null char.
Olli Etuahod2551232017-10-26 20:03:33 +0300457 return clampCast<GLint>(var.name.size() + 1u);
jchen10880683b2017-04-12 16:21:55 +0800458
459 default:
460 UNREACHABLE();
461 return GL_INVALID_VALUE;
462 }
463}
464
465GLint GetInputResourceProperty(const Program *program, GLuint index, GLenum prop)
466{
467 const auto &attribute = program->getInputResource(index);
468 switch (prop)
469 {
470 case GL_TYPE:
471 case GL_ARRAY_SIZE:
jchen10880683b2017-04-12 16:21:55 +0800472 case GL_NAME_LENGTH:
Olli Etuaho465835d2017-09-26 13:34:10 +0300473 return GetCommonVariableProperty(attribute, prop);
jchen10880683b2017-04-12 16:21:55 +0800474
jchen10baf5d942017-08-28 20:45:48 +0800475 case GL_LOCATION:
476 return program->getAttributeLocation(attribute.name);
477
jchen10880683b2017-04-12 16:21:55 +0800478 case GL_REFERENCED_BY_VERTEX_SHADER:
479 return 1;
480
481 case GL_REFERENCED_BY_FRAGMENT_SHADER:
482 case GL_REFERENCED_BY_COMPUTE_SHADER:
Jiawei Shaoc6f82872018-04-24 14:14:50 +0800483 case GL_REFERENCED_BY_GEOMETRY_SHADER_EXT:
jchen10880683b2017-04-12 16:21:55 +0800484 return 0;
485
486 default:
487 UNREACHABLE();
488 return GL_INVALID_VALUE;
489 }
490}
491
492GLint GetOutputResourceProperty(const Program *program, GLuint index, const GLenum prop)
493{
494 const auto &outputVariable = program->getOutputResource(index);
495 switch (prop)
496 {
497 case GL_TYPE:
498 case GL_ARRAY_SIZE:
jchen10880683b2017-04-12 16:21:55 +0800499 case GL_NAME_LENGTH:
Olli Etuaho465835d2017-09-26 13:34:10 +0300500 return GetCommonVariableProperty(outputVariable, prop);
jchen10880683b2017-04-12 16:21:55 +0800501
jchen10baf5d942017-08-28 20:45:48 +0800502 case GL_LOCATION:
503 return program->getFragDataLocation(outputVariable.name);
504
jchen10880683b2017-04-12 16:21:55 +0800505 case GL_REFERENCED_BY_FRAGMENT_SHADER:
506 return 1;
507
Jiawei Shaoc6f82872018-04-24 14:14:50 +0800508 case GL_REFERENCED_BY_VERTEX_SHADER:
jchen10880683b2017-04-12 16:21:55 +0800509 case GL_REFERENCED_BY_COMPUTE_SHADER:
Jiawei Shaoc6f82872018-04-24 14:14:50 +0800510 case GL_REFERENCED_BY_GEOMETRY_SHADER_EXT:
jchen10880683b2017-04-12 16:21:55 +0800511 return 0;
512
513 default:
514 UNREACHABLE();
515 return GL_INVALID_VALUE;
516 }
517}
518
jchen10910a3da2017-11-15 09:40:11 +0800519GLint GetTransformFeedbackVaryingResourceProperty(const Program *program,
520 GLuint index,
521 const GLenum prop)
522{
523 const auto &tfVariable = program->getTransformFeedbackVaryingResource(index);
524 switch (prop)
525 {
526 case GL_TYPE:
527 return clampCast<GLint>(tfVariable.type);
528
529 case GL_ARRAY_SIZE:
530 return clampCast<GLint>(tfVariable.size());
531
532 case GL_NAME_LENGTH:
533 return clampCast<GLint>(tfVariable.nameWithArrayIndex().size() + 1);
534
535 default:
536 UNREACHABLE();
537 return GL_INVALID_VALUE;
538 }
539}
540
jchen10d9cd7b72017-08-30 15:04:25 +0800541GLint QueryProgramInterfaceActiveResources(const Program *program, GLenum programInterface)
542{
543 switch (programInterface)
544 {
545 case GL_PROGRAM_INPUT:
jchen10a99ed552017-09-22 08:10:32 +0800546 return clampCast<GLint>(program->getAttributes().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800547
548 case GL_PROGRAM_OUTPUT:
jchen10a99ed552017-09-22 08:10:32 +0800549 return clampCast<GLint>(program->getState().getOutputVariables().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800550
551 case GL_UNIFORM:
jchen10a99ed552017-09-22 08:10:32 +0800552 return clampCast<GLint>(program->getState().getUniforms().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800553
554 case GL_UNIFORM_BLOCK:
jchen10a99ed552017-09-22 08:10:32 +0800555 return clampCast<GLint>(program->getState().getUniformBlocks().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800556
jchen1058f67be2017-10-27 08:59:27 +0800557 case GL_ATOMIC_COUNTER_BUFFER:
558 return clampCast<GLint>(program->getState().getAtomicCounterBuffers().size());
559
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800560 case GL_BUFFER_VARIABLE:
561 return clampCast<GLint>(program->getState().getBufferVariables().size());
562
563 case GL_SHADER_STORAGE_BLOCK:
564 return clampCast<GLint>(program->getState().getShaderStorageBlocks().size());
565
jchen10d9cd7b72017-08-30 15:04:25 +0800566 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10910a3da2017-11-15 09:40:11 +0800567 return clampCast<GLint>(program->getTransformFeedbackVaryingCount());
jchen10d9cd7b72017-08-30 15:04:25 +0800568
569 default:
570 UNREACHABLE();
571 return 0;
572 }
573}
574
575template <typename T, typename M>
576GLint FindMaxSize(const std::vector<T> &resources, M member)
577{
578 GLint max = 0;
579 for (const T &resource : resources)
580 {
jchen10a99ed552017-09-22 08:10:32 +0800581 max = std::max(max, clampCast<GLint>((resource.*member).size()));
jchen10d9cd7b72017-08-30 15:04:25 +0800582 }
583 return max;
584}
585
586GLint QueryProgramInterfaceMaxNameLength(const Program *program, GLenum programInterface)
587{
588 GLint maxNameLength = 0;
589 switch (programInterface)
590 {
591 case GL_PROGRAM_INPUT:
592 maxNameLength = FindMaxSize(program->getAttributes(), &sh::Attribute::name);
593 break;
594
595 case GL_PROGRAM_OUTPUT:
596 maxNameLength =
597 FindMaxSize(program->getState().getOutputVariables(), &sh::OutputVariable::name);
598 break;
599
600 case GL_UNIFORM:
601 maxNameLength = FindMaxSize(program->getState().getUniforms(), &LinkedUniform::name);
602 break;
603
604 case GL_UNIFORM_BLOCK:
Qin Jiajia9bf55522018-01-29 13:56:23 +0800605 return program->getActiveUniformBlockMaxNameLength();
jchen10d9cd7b72017-08-30 15:04:25 +0800606
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800607 case GL_BUFFER_VARIABLE:
608 maxNameLength =
609 FindMaxSize(program->getState().getBufferVariables(), &BufferVariable::name);
610 break;
611
612 case GL_SHADER_STORAGE_BLOCK:
Qin Jiajia9bf55522018-01-29 13:56:23 +0800613 return program->getActiveShaderStorageBlockMaxNameLength();
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800614
jchen10d9cd7b72017-08-30 15:04:25 +0800615 case GL_TRANSFORM_FEEDBACK_VARYING:
Qin Jiajia9bf55522018-01-29 13:56:23 +0800616 return clampCast<GLint>(program->getTransformFeedbackVaryingMaxLength());
jchen10d9cd7b72017-08-30 15:04:25 +0800617
618 default:
619 UNREACHABLE();
620 return 0;
621 }
622 // This length includes an extra character for the null terminator.
623 return (maxNameLength == 0 ? 0 : maxNameLength + 1);
624}
625
626GLint QueryProgramInterfaceMaxNumActiveVariables(const Program *program, GLenum programInterface)
627{
628 switch (programInterface)
629 {
630 case GL_UNIFORM_BLOCK:
631 return FindMaxSize(program->getState().getUniformBlocks(),
Jiajia Qin729b2c62017-08-14 09:36:11 +0800632 &InterfaceBlock::memberIndexes);
jchen1058f67be2017-10-27 08:59:27 +0800633 case GL_ATOMIC_COUNTER_BUFFER:
634 return FindMaxSize(program->getState().getAtomicCounterBuffers(),
635 &AtomicCounterBuffer::memberIndexes);
jchen10d9cd7b72017-08-30 15:04:25 +0800636
jchen10d9cd7b72017-08-30 15:04:25 +0800637 case GL_SHADER_STORAGE_BLOCK:
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800638 return FindMaxSize(program->getState().getShaderStorageBlocks(),
639 &InterfaceBlock::memberIndexes);
jchen10d9cd7b72017-08-30 15:04:25 +0800640
641 default:
642 UNREACHABLE();
643 return 0;
644 }
645}
646
jchen10baf5d942017-08-28 20:45:48 +0800647GLenum GetUniformPropertyEnum(GLenum prop)
648{
649 switch (prop)
650 {
651 case GL_UNIFORM_TYPE:
652 return GL_TYPE;
653 case GL_UNIFORM_SIZE:
654 return GL_ARRAY_SIZE;
655 case GL_UNIFORM_NAME_LENGTH:
656 return GL_NAME_LENGTH;
657 case GL_UNIFORM_BLOCK_INDEX:
658 return GL_BLOCK_INDEX;
659 case GL_UNIFORM_OFFSET:
660 return GL_OFFSET;
661 case GL_UNIFORM_ARRAY_STRIDE:
662 return GL_ARRAY_STRIDE;
663 case GL_UNIFORM_MATRIX_STRIDE:
664 return GL_MATRIX_STRIDE;
665 case GL_UNIFORM_IS_ROW_MAJOR:
666 return GL_IS_ROW_MAJOR;
667
668 default:
669 return prop;
670 }
671}
672
jchen1058f67be2017-10-27 08:59:27 +0800673GLenum GetUniformBlockPropertyEnum(GLenum prop)
674{
675 switch (prop)
676 {
677 case GL_UNIFORM_BLOCK_BINDING:
678 return GL_BUFFER_BINDING;
679
680 case GL_UNIFORM_BLOCK_DATA_SIZE:
681 return GL_BUFFER_DATA_SIZE;
682
683 case GL_UNIFORM_BLOCK_NAME_LENGTH:
684 return GL_NAME_LENGTH;
685
686 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
687 return GL_NUM_ACTIVE_VARIABLES;
688
689 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
690 return GL_ACTIVE_VARIABLES;
691
692 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
693 return GL_REFERENCED_BY_VERTEX_SHADER;
694
695 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
696 return GL_REFERENCED_BY_FRAGMENT_SHADER;
697
698 default:
699 return prop;
700 }
701}
702
703void GetShaderVariableBufferResourceProperty(const ShaderVariableBuffer &buffer,
704 GLenum pname,
705 GLint *params,
706 GLsizei bufSize,
707 GLsizei *outputPosition)
708
709{
710 switch (pname)
711 {
712 case GL_BUFFER_BINDING:
713 params[(*outputPosition)++] = buffer.binding;
714 break;
715 case GL_BUFFER_DATA_SIZE:
716 params[(*outputPosition)++] = clampCast<GLint>(buffer.dataSize);
717 break;
718 case GL_NUM_ACTIVE_VARIABLES:
719 params[(*outputPosition)++] = buffer.numActiveVariables();
720 break;
721 case GL_ACTIVE_VARIABLES:
722 for (size_t memberIndex = 0;
723 memberIndex < buffer.memberIndexes.size() && *outputPosition < bufSize;
724 ++memberIndex)
725 {
726 params[(*outputPosition)++] = clampCast<GLint>(buffer.memberIndexes[memberIndex]);
727 }
728 break;
729 case GL_REFERENCED_BY_VERTEX_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +0800730 params[(*outputPosition)++] = static_cast<GLint>(buffer.isActive(ShaderType::Vertex));
jchen1058f67be2017-10-27 08:59:27 +0800731 break;
732 case GL_REFERENCED_BY_FRAGMENT_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +0800733 params[(*outputPosition)++] = static_cast<GLint>(buffer.isActive(ShaderType::Fragment));
jchen1058f67be2017-10-27 08:59:27 +0800734 break;
735 case GL_REFERENCED_BY_COMPUTE_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +0800736 params[(*outputPosition)++] = static_cast<GLint>(buffer.isActive(ShaderType::Compute));
jchen1058f67be2017-10-27 08:59:27 +0800737 break;
Jiawei Shaoc6f82872018-04-24 14:14:50 +0800738 case GL_REFERENCED_BY_GEOMETRY_SHADER_EXT:
739 params[(*outputPosition)++] = static_cast<GLint>(buffer.isActive(ShaderType::Geometry));
740 break;
jchen1058f67be2017-10-27 08:59:27 +0800741 default:
742 UNREACHABLE();
743 break;
744 }
745}
746
747void GetInterfaceBlockResourceProperty(const InterfaceBlock &block,
748 GLenum pname,
749 GLint *params,
750 GLsizei bufSize,
751 GLsizei *outputPosition)
752{
753 if (pname == GL_NAME_LENGTH)
754 {
755 params[(*outputPosition)++] = clampCast<GLint>(block.nameWithArrayIndex().size() + 1);
756 return;
757 }
758 GetShaderVariableBufferResourceProperty(block, pname, params, bufSize, outputPosition);
759}
760
761void GetUniformBlockResourceProperty(const Program *program,
762 GLuint blockIndex,
763 GLenum pname,
764 GLint *params,
765 GLsizei bufSize,
766 GLsizei *outputPosition)
767
768{
769 ASSERT(*outputPosition < bufSize);
770 const auto &block = program->getUniformBlockByIndex(blockIndex);
771 GetInterfaceBlockResourceProperty(block, pname, params, bufSize, outputPosition);
772}
773
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800774void GetShaderStorageBlockResourceProperty(const Program *program,
775 GLuint blockIndex,
776 GLenum pname,
777 GLint *params,
778 GLsizei bufSize,
779 GLsizei *outputPosition)
780
781{
782 ASSERT(*outputPosition < bufSize);
783 const auto &block = program->getShaderStorageBlockByIndex(blockIndex);
784 GetInterfaceBlockResourceProperty(block, pname, params, bufSize, outputPosition);
785}
786
jchen1058f67be2017-10-27 08:59:27 +0800787void GetAtomicCounterBufferResourceProperty(const Program *program,
788 GLuint index,
789 GLenum pname,
790 GLint *params,
791 GLsizei bufSize,
792 GLsizei *outputPosition)
793
794{
795 ASSERT(*outputPosition < bufSize);
796 const auto &buffer = program->getState().getAtomicCounterBuffers()[index];
797 GetShaderVariableBufferResourceProperty(buffer, pname, params, bufSize, outputPosition);
798}
799
Geoff Langc1984ed2016-10-07 12:41:00 -0400800} // anonymous namespace
801
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -0800802void QueryFramebufferAttachmentParameteriv(const Context *context,
803 const Framebuffer *framebuffer,
Geoff Langff5b2d52016-09-07 11:32:23 -0400804 GLenum attachment,
805 GLenum pname,
806 GLint *params)
807{
808 ASSERT(framebuffer);
809
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -0800810 const FramebufferAttachment *attachmentObject = framebuffer->getAttachment(context, attachment);
811
Geoff Langff5b2d52016-09-07 11:32:23 -0400812 if (attachmentObject == nullptr)
813 {
814 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
815 // is NONE, then querying any other pname will generate INVALID_ENUM.
816
817 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
818 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
819 // INVALID_OPERATION for all other pnames
820
821 switch (pname)
822 {
823 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
824 *params = GL_NONE;
825 break;
826
827 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
828 *params = 0;
829 break;
830
831 default:
832 UNREACHABLE();
833 break;
834 }
835
836 return;
837 }
838
839 switch (pname)
840 {
841 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
842 *params = attachmentObject->type();
843 break;
844
845 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
846 *params = attachmentObject->id();
847 break;
848
849 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
850 *params = attachmentObject->mipLevel();
851 break;
852
853 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
Corentin Wallez99d492c2018-02-27 15:17:10 -0500854 {
855 TextureTarget face = attachmentObject->cubeMapFace();
856 if (face != TextureTarget::InvalidEnum)
857 {
858 *params = ToGLenum(attachmentObject->cubeMapFace());
859 }
860 else
861 {
862 // This happens when the attachment isn't a texture cube map face
863 *params = GL_NONE;
864 }
865 }
866 break;
Geoff Langff5b2d52016-09-07 11:32:23 -0400867
868 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
869 *params = attachmentObject->getRedSize();
870 break;
871
872 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
873 *params = attachmentObject->getGreenSize();
874 break;
875
876 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
877 *params = attachmentObject->getBlueSize();
878 break;
879
880 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
881 *params = attachmentObject->getAlphaSize();
882 break;
883
884 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
885 *params = attachmentObject->getDepthSize();
886 break;
887
888 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
889 *params = attachmentObject->getStencilSize();
890 break;
891
892 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
893 *params = attachmentObject->getComponentType();
894 break;
895
896 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
897 *params = attachmentObject->getColorEncoding();
898 break;
899
900 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
901 *params = attachmentObject->layer();
902 break;
903
Martin Radeve5285d22017-07-14 16:23:53 +0300904 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_ANGLE:
905 *params = attachmentObject->getNumViews();
906 break;
907
908 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_MULTIVIEW_LAYOUT_ANGLE:
909 *params = static_cast<GLint>(attachmentObject->getMultiviewLayout());
910 break;
911
912 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_ANGLE:
913 *params = attachmentObject->getBaseViewIndex();
914 break;
915
916 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_VIEWPORT_OFFSETS_ANGLE:
917 {
918 const std::vector<Offset> &offsets = attachmentObject->getMultiviewViewportOffsets();
919 for (size_t i = 0u; i < offsets.size(); ++i)
920 {
921 params[i * 2u] = offsets[i].x;
922 params[i * 2u + 1u] = offsets[i].y;
923 }
924 }
925 break;
926
Geoff Langff5b2d52016-09-07 11:32:23 -0400927 default:
928 UNREACHABLE();
929 break;
930 }
931}
932
933void QueryBufferParameteriv(const Buffer *buffer, GLenum pname, GLint *params)
934{
Geoff Langebebe1c2016-10-14 12:01:31 -0400935 QueryBufferParameterBase(buffer, pname, params);
936}
Geoff Langff5b2d52016-09-07 11:32:23 -0400937
Geoff Langebebe1c2016-10-14 12:01:31 -0400938void QueryBufferParameteri64v(const Buffer *buffer, GLenum pname, GLint64 *params)
939{
940 QueryBufferParameterBase(buffer, pname, params);
Geoff Langff5b2d52016-09-07 11:32:23 -0400941}
942
Geoff Lang496c02d2016-10-20 11:38:11 -0700943void QueryBufferPointerv(const Buffer *buffer, GLenum pname, void **params)
944{
945 switch (pname)
946 {
947 case GL_BUFFER_MAP_POINTER:
948 *params = buffer->getMapPointer();
949 break;
950
951 default:
952 UNREACHABLE();
953 break;
954 }
955}
956
Jamie Madillffe00c02017-06-27 16:26:55 -0400957void QueryProgramiv(const Context *context, const Program *program, GLenum pname, GLint *params)
Geoff Langff5b2d52016-09-07 11:32:23 -0400958{
959 ASSERT(program != nullptr);
960
961 switch (pname)
962 {
963 case GL_DELETE_STATUS:
964 *params = program->isFlaggedForDeletion();
965 return;
966 case GL_LINK_STATUS:
967 *params = program->isLinked();
968 return;
969 case GL_VALIDATE_STATUS:
970 *params = program->isValidated();
971 return;
972 case GL_INFO_LOG_LENGTH:
973 *params = program->getInfoLogLength();
974 return;
975 case GL_ATTACHED_SHADERS:
976 *params = program->getAttachedShadersCount();
977 return;
978 case GL_ACTIVE_ATTRIBUTES:
979 *params = program->getActiveAttributeCount();
980 return;
981 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
982 *params = program->getActiveAttributeMaxLength();
983 return;
984 case GL_ACTIVE_UNIFORMS:
985 *params = program->getActiveUniformCount();
986 return;
987 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
988 *params = program->getActiveUniformMaxLength();
989 return;
990 case GL_PROGRAM_BINARY_LENGTH_OES:
Jamie Madillffe00c02017-06-27 16:26:55 -0400991 *params = program->getBinaryLength(context);
Geoff Langff5b2d52016-09-07 11:32:23 -0400992 return;
993 case GL_ACTIVE_UNIFORM_BLOCKS:
994 *params = program->getActiveUniformBlockCount();
995 return;
996 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
Qin Jiajia9bf55522018-01-29 13:56:23 +0800997 *params = program->getActiveUniformBlockMaxNameLength();
Geoff Langff5b2d52016-09-07 11:32:23 -0400998 break;
999 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
1000 *params = program->getTransformFeedbackBufferMode();
1001 break;
1002 case GL_TRANSFORM_FEEDBACK_VARYINGS:
jchen10910a3da2017-11-15 09:40:11 +08001003 *params = clampCast<GLint>(program->getTransformFeedbackVaryingCount());
Geoff Langff5b2d52016-09-07 11:32:23 -04001004 break;
1005 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
1006 *params = program->getTransformFeedbackVaryingMaxLength();
1007 break;
1008 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
1009 *params = program->getBinaryRetrievableHint();
1010 break;
Yunchao He61afff12017-03-14 15:34:03 +08001011 case GL_PROGRAM_SEPARABLE:
1012 *params = program->isSeparable();
1013 break;
Xinghua Cao971f8502017-10-17 13:01:24 +08001014 case GL_COMPUTE_WORK_GROUP_SIZE:
1015 {
1016 const sh::WorkGroupSize &localSize = program->getComputeShaderLocalSize();
1017 params[0] = localSize[0];
1018 params[1] = localSize[1];
1019 params[2] = localSize[2];
1020 }
1021 break;
jchen1058f67be2017-10-27 08:59:27 +08001022 case GL_ACTIVE_ATOMIC_COUNTER_BUFFERS:
1023 *params = program->getActiveAtomicCounterBufferCount();
1024 break;
Jiawei Shao447bfac2018-03-14 14:23:40 +08001025 case GL_GEOMETRY_LINKED_INPUT_TYPE_EXT:
Jamie Madill493f9572018-05-24 19:52:15 -04001026 *params = ToGLenum(program->getGeometryShaderInputPrimitiveType());
Jiawei Shao447bfac2018-03-14 14:23:40 +08001027 break;
1028 case GL_GEOMETRY_LINKED_OUTPUT_TYPE_EXT:
Jamie Madill493f9572018-05-24 19:52:15 -04001029 *params = ToGLenum(program->getGeometryShaderOutputPrimitiveType());
Jiawei Shao447bfac2018-03-14 14:23:40 +08001030 break;
1031 case GL_GEOMETRY_LINKED_VERTICES_OUT_EXT:
1032 *params = program->getGeometryShaderMaxVertices();
1033 break;
1034 case GL_GEOMETRY_SHADER_INVOCATIONS_EXT:
1035 *params = program->getGeometryShaderInvocations();
1036 break;
Geoff Langff5b2d52016-09-07 11:32:23 -04001037 default:
1038 UNREACHABLE();
1039 break;
1040 }
1041}
Geoff Lang740d9022016-10-07 11:20:52 -04001042
Jamie Madill4e0e6f82017-02-17 11:06:03 -05001043void QueryRenderbufferiv(const Context *context,
1044 const Renderbuffer *renderbuffer,
1045 GLenum pname,
1046 GLint *params)
Geoff Lang740d9022016-10-07 11:20:52 -04001047{
1048 ASSERT(renderbuffer != nullptr);
1049
1050 switch (pname)
1051 {
1052 case GL_RENDERBUFFER_WIDTH:
1053 *params = renderbuffer->getWidth();
1054 break;
1055 case GL_RENDERBUFFER_HEIGHT:
1056 *params = renderbuffer->getHeight();
1057 break;
1058 case GL_RENDERBUFFER_INTERNAL_FORMAT:
Jamie Madill4e0e6f82017-02-17 11:06:03 -05001059 // Special case the WebGL 1 DEPTH_STENCIL format.
Jamie Madilla02315b2017-02-23 14:14:47 -05001060 if (context->isWebGL1() &&
Jamie Madill4e0e6f82017-02-17 11:06:03 -05001061 renderbuffer->getFormat().info->internalFormat == GL_DEPTH24_STENCIL8)
1062 {
1063 *params = GL_DEPTH_STENCIL;
1064 }
1065 else
1066 {
1067 *params = renderbuffer->getFormat().info->internalFormat;
1068 }
Geoff Lang740d9022016-10-07 11:20:52 -04001069 break;
1070 case GL_RENDERBUFFER_RED_SIZE:
1071 *params = renderbuffer->getRedSize();
1072 break;
1073 case GL_RENDERBUFFER_GREEN_SIZE:
1074 *params = renderbuffer->getGreenSize();
1075 break;
1076 case GL_RENDERBUFFER_BLUE_SIZE:
1077 *params = renderbuffer->getBlueSize();
1078 break;
1079 case GL_RENDERBUFFER_ALPHA_SIZE:
1080 *params = renderbuffer->getAlphaSize();
1081 break;
1082 case GL_RENDERBUFFER_DEPTH_SIZE:
1083 *params = renderbuffer->getDepthSize();
1084 break;
1085 case GL_RENDERBUFFER_STENCIL_SIZE:
1086 *params = renderbuffer->getStencilSize();
1087 break;
1088 case GL_RENDERBUFFER_SAMPLES_ANGLE:
1089 *params = renderbuffer->getSamples();
1090 break;
1091 default:
1092 UNREACHABLE();
1093 break;
1094 }
1095}
Geoff Langd7d0ed32016-10-07 11:33:51 -04001096
Jamie Madillbd044ed2017-06-05 12:59:21 -04001097void QueryShaderiv(const Context *context, Shader *shader, GLenum pname, GLint *params)
Geoff Langd7d0ed32016-10-07 11:33:51 -04001098{
1099 ASSERT(shader != nullptr);
1100
1101 switch (pname)
1102 {
1103 case GL_SHADER_TYPE:
Jiawei Shao385b3e02018-03-21 09:43:28 +08001104 *params = static_cast<GLint>(ToGLenum(shader->getType()));
Geoff Langd7d0ed32016-10-07 11:33:51 -04001105 return;
1106 case GL_DELETE_STATUS:
1107 *params = shader->isFlaggedForDeletion();
1108 return;
1109 case GL_COMPILE_STATUS:
Jamie Madillbd044ed2017-06-05 12:59:21 -04001110 *params = shader->isCompiled(context) ? GL_TRUE : GL_FALSE;
Geoff Langd7d0ed32016-10-07 11:33:51 -04001111 return;
1112 case GL_INFO_LOG_LENGTH:
Jamie Madillbd044ed2017-06-05 12:59:21 -04001113 *params = shader->getInfoLogLength(context);
Geoff Langd7d0ed32016-10-07 11:33:51 -04001114 return;
1115 case GL_SHADER_SOURCE_LENGTH:
1116 *params = shader->getSourceLength();
1117 return;
1118 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
Jamie Madillbd044ed2017-06-05 12:59:21 -04001119 *params = shader->getTranslatedSourceWithDebugInfoLength(context);
Geoff Langd7d0ed32016-10-07 11:33:51 -04001120 return;
1121 default:
1122 UNREACHABLE();
1123 break;
1124 }
1125}
Geoff Langc1984ed2016-10-07 12:41:00 -04001126
He Yunchao11b038b2016-11-22 21:24:04 +08001127void QueryTexLevelParameterfv(const Texture *texture,
Corentin Wallez99d492c2018-02-27 15:17:10 -05001128 TextureTarget target,
He Yunchao11b038b2016-11-22 21:24:04 +08001129 GLint level,
1130 GLenum pname,
1131 GLfloat *params)
1132{
1133 QueryTexLevelParameterBase(texture, target, level, pname, params);
1134}
1135
1136void QueryTexLevelParameteriv(const Texture *texture,
Corentin Wallez99d492c2018-02-27 15:17:10 -05001137 TextureTarget target,
He Yunchao11b038b2016-11-22 21:24:04 +08001138 GLint level,
1139 GLenum pname,
1140 GLint *params)
1141{
1142 QueryTexLevelParameterBase(texture, target, level, pname, params);
1143}
1144
Geoff Langc1984ed2016-10-07 12:41:00 -04001145void QueryTexParameterfv(const Texture *texture, GLenum pname, GLfloat *params)
1146{
1147 QueryTexParameterBase(texture, pname, params);
1148}
1149
1150void QueryTexParameteriv(const Texture *texture, GLenum pname, GLint *params)
1151{
1152 QueryTexParameterBase(texture, pname, params);
1153}
1154
1155void QuerySamplerParameterfv(const Sampler *sampler, GLenum pname, GLfloat *params)
1156{
1157 QuerySamplerParameterBase(sampler, pname, params);
1158}
1159
1160void QuerySamplerParameteriv(const Sampler *sampler, GLenum pname, GLint *params)
1161{
1162 QuerySamplerParameterBase(sampler, pname, params);
1163}
1164
Geoff Lang0b031062016-10-13 14:30:04 -04001165void QueryVertexAttribfv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001166 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001167 const VertexAttribCurrentValueData &currentValueData,
1168 GLenum pname,
1169 GLfloat *params)
1170{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001171 QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001172}
1173
1174void QueryVertexAttribiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001175 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001176 const VertexAttribCurrentValueData &currentValueData,
1177 GLenum pname,
1178 GLint *params)
1179{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001180 QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001181}
1182
Jamie Madill876429b2017-04-20 15:46:24 -04001183void QueryVertexAttribPointerv(const VertexAttribute &attrib, GLenum pname, void **pointer)
Geoff Lang0b031062016-10-13 14:30:04 -04001184{
1185 switch (pname)
1186 {
1187 case GL_VERTEX_ATTRIB_ARRAY_POINTER:
Jamie Madill876429b2017-04-20 15:46:24 -04001188 *pointer = const_cast<void *>(attrib.pointer);
Geoff Lang0b031062016-10-13 14:30:04 -04001189 break;
1190
1191 default:
1192 UNREACHABLE();
1193 break;
1194 }
1195}
1196
1197void QueryVertexAttribIiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001198 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001199 const VertexAttribCurrentValueData &currentValueData,
1200 GLenum pname,
1201 GLint *params)
1202{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001203 QueryVertexAttribBase(attrib, binding, currentValueData.IntValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001204}
1205
1206void QueryVertexAttribIuiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001207 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001208 const VertexAttribCurrentValueData &currentValueData,
1209 GLenum pname,
1210 GLuint *params)
1211{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001212 QueryVertexAttribBase(attrib, binding, currentValueData.UnsignedIntValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001213}
1214
Geoff Lang6899b872016-10-14 11:30:13 -04001215void QueryActiveUniformBlockiv(const Program *program,
1216 GLuint uniformBlockIndex,
1217 GLenum pname,
1218 GLint *params)
1219{
jchen1058f67be2017-10-27 08:59:27 +08001220 GLenum prop = GetUniformBlockPropertyEnum(pname);
1221 QueryProgramResourceiv(program, GL_UNIFORM_BLOCK, uniformBlockIndex, 1, &prop,
1222 std::numeric_limits<GLsizei>::max(), nullptr, params);
Geoff Lang6899b872016-10-14 11:30:13 -04001223}
1224
Geoff Lang0a9661f2016-10-20 10:59:20 -07001225void QueryInternalFormativ(const TextureCaps &format, GLenum pname, GLsizei bufSize, GLint *params)
1226{
1227 switch (pname)
1228 {
1229 case GL_NUM_SAMPLE_COUNTS:
1230 if (bufSize != 0)
1231 {
jchen10a99ed552017-09-22 08:10:32 +08001232 *params = clampCast<GLint>(format.sampleCounts.size());
Geoff Lang0a9661f2016-10-20 10:59:20 -07001233 }
1234 break;
1235
1236 case GL_SAMPLES:
1237 {
1238 size_t returnCount = std::min<size_t>(bufSize, format.sampleCounts.size());
1239 auto sampleReverseIt = format.sampleCounts.rbegin();
1240 for (size_t sampleIndex = 0; sampleIndex < returnCount; ++sampleIndex)
1241 {
1242 params[sampleIndex] = *sampleReverseIt++;
1243 }
1244 }
1245 break;
1246
1247 default:
1248 UNREACHABLE();
1249 break;
1250 }
1251}
1252
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001253void QueryFramebufferParameteriv(const Framebuffer *framebuffer, GLenum pname, GLint *params)
1254{
1255 ASSERT(framebuffer);
1256
1257 switch (pname)
1258 {
1259 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
1260 *params = framebuffer->getDefaultWidth();
1261 break;
1262 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
1263 *params = framebuffer->getDefaultHeight();
1264 break;
1265 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
1266 *params = framebuffer->getDefaultSamples();
1267 break;
1268 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
Geoff Lang92019432017-11-20 13:09:34 -05001269 *params = ConvertToGLBoolean(framebuffer->getDefaultFixedSampleLocations());
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001270 break;
Jiawei Shaob1e91382018-05-17 14:33:55 +08001271 case GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT:
1272 *params = framebuffer->getDefaultLayers();
1273 break;
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001274 default:
1275 UNREACHABLE();
1276 break;
1277 }
1278}
1279
Jamie Madill70b5bb02017-08-28 13:32:37 -04001280Error QuerySynciv(const Sync *sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001281{
1282 ASSERT(sync);
1283
Geoff Lang82483b92017-04-11 15:33:00 -04001284 // All queries return one value, exit early if the buffer can't fit anything.
1285 if (bufSize < 1)
1286 {
1287 if (length != nullptr)
1288 {
1289 *length = 0;
1290 }
1291 return NoError();
1292 }
1293
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001294 switch (pname)
1295 {
1296 case GL_OBJECT_TYPE:
jchen10a99ed552017-09-22 08:10:32 +08001297 *values = clampCast<GLint>(GL_SYNC_FENCE);
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001298 break;
1299 case GL_SYNC_CONDITION:
jchen10a99ed552017-09-22 08:10:32 +08001300 *values = clampCast<GLint>(sync->getCondition());
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001301 break;
1302 case GL_SYNC_FLAGS:
jchen10a99ed552017-09-22 08:10:32 +08001303 *values = clampCast<GLint>(sync->getFlags());
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001304 break;
1305 case GL_SYNC_STATUS:
1306 ANGLE_TRY(sync->getStatus(values));
1307 break;
1308
1309 default:
1310 UNREACHABLE();
1311 break;
1312 }
1313
Geoff Lang82483b92017-04-11 15:33:00 -04001314 if (length != nullptr)
1315 {
1316 *length = 1;
1317 }
1318
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001319 return NoError();
1320}
1321
Jamie Madill4928b7c2017-06-20 12:57:39 -04001322void SetTexParameterf(Context *context, Texture *texture, GLenum pname, GLfloat param)
Geoff Langc1984ed2016-10-07 12:41:00 -04001323{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001324 SetTexParameterBase(context, texture, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -04001325}
1326
Jamie Madill4928b7c2017-06-20 12:57:39 -04001327void SetTexParameterfv(Context *context, Texture *texture, GLenum pname, const GLfloat *params)
Geoff Langc1984ed2016-10-07 12:41:00 -04001328{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001329 SetTexParameterBase(context, texture, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001330}
1331
Jamie Madill4928b7c2017-06-20 12:57:39 -04001332void SetTexParameteri(Context *context, Texture *texture, GLenum pname, GLint param)
Geoff Langc1984ed2016-10-07 12:41:00 -04001333{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001334 SetTexParameterBase(context, texture, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -04001335}
1336
Jamie Madill4928b7c2017-06-20 12:57:39 -04001337void SetTexParameteriv(Context *context, Texture *texture, GLenum pname, const GLint *params)
Geoff Langc1984ed2016-10-07 12:41:00 -04001338{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001339 SetTexParameterBase(context, texture, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001340}
1341
1342void SetSamplerParameterf(Sampler *sampler, GLenum pname, GLfloat param)
1343{
1344 SetSamplerParameterBase(sampler, pname, &param);
1345}
1346
1347void SetSamplerParameterfv(Sampler *sampler, GLenum pname, const GLfloat *params)
1348{
1349 SetSamplerParameterBase(sampler, pname, params);
1350}
1351
1352void SetSamplerParameteri(Sampler *sampler, GLenum pname, GLint param)
1353{
1354 SetSamplerParameterBase(sampler, pname, &param);
1355}
1356
1357void SetSamplerParameteriv(Sampler *sampler, GLenum pname, const GLint *params)
1358{
1359 SetSamplerParameterBase(sampler, pname, params);
1360}
Geoff Lang65603eb2017-01-12 16:48:03 -05001361
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001362void SetFramebufferParameteri(Framebuffer *framebuffer, GLenum pname, GLint param)
1363{
1364 ASSERT(framebuffer);
1365
1366 switch (pname)
1367 {
1368 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
1369 framebuffer->setDefaultWidth(param);
1370 break;
1371 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
1372 framebuffer->setDefaultHeight(param);
1373 break;
1374 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
1375 framebuffer->setDefaultSamples(param);
1376 break;
1377 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
Geoff Lang5201ce12017-11-28 11:36:28 -05001378 framebuffer->setDefaultFixedSampleLocations(ConvertToBool(param));
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001379 break;
Jiawei Shaob1e91382018-05-17 14:33:55 +08001380 case GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT:
1381 framebuffer->setDefaultLayers(param);
1382 break;
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001383 default:
1384 UNREACHABLE();
1385 break;
1386 }
1387}
1388
Yunchao He61afff12017-03-14 15:34:03 +08001389void SetProgramParameteri(Program *program, GLenum pname, GLint value)
1390{
1391 ASSERT(program);
1392
1393 switch (pname)
1394 {
1395 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
Geoff Lang92019432017-11-20 13:09:34 -05001396 program->setBinaryRetrievableHint(ConvertToBool(value));
Yunchao He61afff12017-03-14 15:34:03 +08001397 break;
1398 case GL_PROGRAM_SEPARABLE:
Geoff Lang92019432017-11-20 13:09:34 -05001399 program->setSeparable(ConvertToBool(value));
Yunchao He61afff12017-03-14 15:34:03 +08001400 break;
1401 default:
1402 UNREACHABLE();
1403 break;
1404 }
1405}
1406
jchen10baf5d942017-08-28 20:45:48 +08001407GLint GetUniformResourceProperty(const Program *program, GLuint index, const GLenum prop)
1408{
1409 const auto &uniform = program->getUniformByIndex(index);
1410 GLenum resourceProp = GetUniformPropertyEnum(prop);
1411 switch (resourceProp)
1412 {
1413 case GL_TYPE:
1414 case GL_ARRAY_SIZE:
1415 case GL_NAME_LENGTH:
Olli Etuaho465835d2017-09-26 13:34:10 +03001416 return GetCommonVariableProperty(uniform, resourceProp);
jchen10baf5d942017-08-28 20:45:48 +08001417
1418 case GL_LOCATION:
1419 return program->getUniformLocation(uniform.name);
1420
1421 case GL_BLOCK_INDEX:
1422 return (uniform.isAtomicCounter() ? -1 : uniform.bufferIndex);
1423
1424 case GL_OFFSET:
1425 return uniform.blockInfo.offset;
1426
1427 case GL_ARRAY_STRIDE:
1428 return uniform.blockInfo.arrayStride;
1429
1430 case GL_MATRIX_STRIDE:
1431 return uniform.blockInfo.matrixStride;
1432
1433 case GL_IS_ROW_MAJOR:
1434 return static_cast<GLint>(uniform.blockInfo.isRowMajorMatrix);
1435
1436 case GL_REFERENCED_BY_VERTEX_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001437 return uniform.isActive(ShaderType::Vertex);
jchen10baf5d942017-08-28 20:45:48 +08001438
1439 case GL_REFERENCED_BY_FRAGMENT_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001440 return uniform.isActive(ShaderType::Fragment);
jchen10baf5d942017-08-28 20:45:48 +08001441
1442 case GL_REFERENCED_BY_COMPUTE_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001443 return uniform.isActive(ShaderType::Compute);
jchen10baf5d942017-08-28 20:45:48 +08001444
Jiawei Shaoc6f82872018-04-24 14:14:50 +08001445 case GL_REFERENCED_BY_GEOMETRY_SHADER_EXT:
1446 return uniform.isActive(ShaderType::Geometry);
1447
jchen10baf5d942017-08-28 20:45:48 +08001448 case GL_ATOMIC_COUNTER_BUFFER_INDEX:
1449 return (uniform.isAtomicCounter() ? uniform.bufferIndex : -1);
1450
1451 default:
1452 UNREACHABLE();
1453 return 0;
1454 }
1455}
1456
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001457GLint GetBufferVariableResourceProperty(const Program *program, GLuint index, const GLenum prop)
1458{
1459 const auto &bufferVariable = program->getBufferVariableByIndex(index);
1460 switch (prop)
1461 {
1462 case GL_TYPE:
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001463 case GL_ARRAY_SIZE:
Olli Etuaho465835d2017-09-26 13:34:10 +03001464 case GL_NAME_LENGTH:
1465 return GetCommonVariableProperty(bufferVariable, prop);
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001466
1467 case GL_BLOCK_INDEX:
1468 return bufferVariable.bufferIndex;
1469
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001470 case GL_OFFSET:
1471 return bufferVariable.blockInfo.offset;
1472
1473 case GL_ARRAY_STRIDE:
1474 return bufferVariable.blockInfo.arrayStride;
1475
1476 case GL_MATRIX_STRIDE:
1477 return bufferVariable.blockInfo.matrixStride;
1478
1479 case GL_IS_ROW_MAJOR:
1480 return static_cast<GLint>(bufferVariable.blockInfo.isRowMajorMatrix);
1481
1482 case GL_REFERENCED_BY_VERTEX_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001483 return bufferVariable.isActive(ShaderType::Vertex);
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001484
1485 case GL_REFERENCED_BY_FRAGMENT_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001486 return bufferVariable.isActive(ShaderType::Fragment);
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001487
1488 case GL_REFERENCED_BY_COMPUTE_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001489 return bufferVariable.isActive(ShaderType::Compute);
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001490
Jiawei Shaoc6f82872018-04-24 14:14:50 +08001491 case GL_REFERENCED_BY_GEOMETRY_SHADER_EXT:
1492 return bufferVariable.isActive(ShaderType::Geometry);
1493
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001494 case GL_TOP_LEVEL_ARRAY_SIZE:
1495 return bufferVariable.topLevelArraySize;
1496
1497 case GL_TOP_LEVEL_ARRAY_STRIDE:
1498 return bufferVariable.blockInfo.topLevelArrayStride;
1499
1500 default:
1501 UNREACHABLE();
1502 return 0;
1503 }
1504}
1505
jchen1015015f72017-03-16 13:54:21 +08001506GLuint QueryProgramResourceIndex(const Program *program,
1507 GLenum programInterface,
1508 const GLchar *name)
1509{
1510 switch (programInterface)
1511 {
1512 case GL_PROGRAM_INPUT:
1513 return program->getInputResourceIndex(name);
1514
1515 case GL_PROGRAM_OUTPUT:
1516 return program->getOutputResourceIndex(name);
1517
jchen1015015f72017-03-16 13:54:21 +08001518 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001519 return program->getState().getUniformIndexFromName(name);
1520
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001521 case GL_BUFFER_VARIABLE:
1522 return program->getState().getBufferVariableIndexFromName(name);
1523
1524 case GL_SHADER_STORAGE_BLOCK:
1525 return program->getShaderStorageBlockIndex(name);
1526
jchen1015015f72017-03-16 13:54:21 +08001527 case GL_UNIFORM_BLOCK:
jchen1058f67be2017-10-27 08:59:27 +08001528 return program->getUniformBlockIndex(name);
1529
jchen1015015f72017-03-16 13:54:21 +08001530 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10910a3da2017-11-15 09:40:11 +08001531 return program->getTransformFeedbackVaryingResourceIndex(name);
jchen1015015f72017-03-16 13:54:21 +08001532
1533 default:
1534 UNREACHABLE();
1535 return GL_INVALID_INDEX;
1536 }
1537}
1538
jchen10fd7c3b52017-03-21 15:36:03 +08001539void QueryProgramResourceName(const Program *program,
1540 GLenum programInterface,
1541 GLuint index,
1542 GLsizei bufSize,
1543 GLsizei *length,
1544 GLchar *name)
1545{
1546 switch (programInterface)
1547 {
1548 case GL_PROGRAM_INPUT:
1549 program->getInputResourceName(index, bufSize, length, name);
1550 break;
1551
1552 case GL_PROGRAM_OUTPUT:
1553 program->getOutputResourceName(index, bufSize, length, name);
1554 break;
1555
jchen10fd7c3b52017-03-21 15:36:03 +08001556 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001557 program->getUniformResourceName(index, bufSize, length, name);
1558 break;
1559
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001560 case GL_BUFFER_VARIABLE:
1561 program->getBufferVariableResourceName(index, bufSize, length, name);
1562 break;
1563
1564 case GL_SHADER_STORAGE_BLOCK:
1565 program->getActiveShaderStorageBlockName(index, bufSize, length, name);
1566 break;
1567
jchen10fd7c3b52017-03-21 15:36:03 +08001568 case GL_UNIFORM_BLOCK:
jchen1058f67be2017-10-27 08:59:27 +08001569 program->getActiveUniformBlockName(index, bufSize, length, name);
1570 break;
1571
jchen10fd7c3b52017-03-21 15:36:03 +08001572 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10910a3da2017-11-15 09:40:11 +08001573 program->getTransformFeedbackVarying(index, bufSize, length, nullptr, nullptr, name);
jchen10fd7c3b52017-03-21 15:36:03 +08001574 break;
1575
1576 default:
1577 UNREACHABLE();
1578 }
1579}
1580
jchen10191381f2017-04-11 13:59:04 +08001581GLint QueryProgramResourceLocation(const Program *program,
1582 GLenum programInterface,
1583 const GLchar *name)
1584{
1585 switch (programInterface)
1586 {
1587 case GL_PROGRAM_INPUT:
1588 return program->getAttributeLocation(name);
1589
1590 case GL_PROGRAM_OUTPUT:
1591 return program->getFragDataLocation(name);
1592
jchen10191381f2017-04-11 13:59:04 +08001593 case GL_UNIFORM:
Olli Etuahod2551232017-10-26 20:03:33 +03001594 return program->getUniformLocation(name);
jchen10baf5d942017-08-28 20:45:48 +08001595
jchen10191381f2017-04-11 13:59:04 +08001596 default:
1597 UNREACHABLE();
1598 return -1;
1599 }
1600}
1601
jchen10880683b2017-04-12 16:21:55 +08001602void QueryProgramResourceiv(const Program *program,
1603 GLenum programInterface,
1604 GLuint index,
1605 GLsizei propCount,
1606 const GLenum *props,
1607 GLsizei bufSize,
1608 GLsizei *length,
1609 GLint *params)
1610{
1611 if (!program->isLinked())
1612 {
1613 if (length != nullptr)
1614 {
1615 *length = 0;
1616 }
1617 return;
1618 }
1619
jchen1058f67be2017-10-27 08:59:27 +08001620 GLsizei pos = 0;
1621 for (GLsizei i = 0; i < propCount; i++)
jchen10880683b2017-04-12 16:21:55 +08001622 {
1623 switch (programInterface)
1624 {
1625 case GL_PROGRAM_INPUT:
1626 params[i] = GetInputResourceProperty(program, index, props[i]);
jchen1058f67be2017-10-27 08:59:27 +08001627 ++pos;
jchen10880683b2017-04-12 16:21:55 +08001628 break;
1629
1630 case GL_PROGRAM_OUTPUT:
1631 params[i] = GetOutputResourceProperty(program, index, props[i]);
jchen1058f67be2017-10-27 08:59:27 +08001632 ++pos;
jchen10880683b2017-04-12 16:21:55 +08001633 break;
1634
jchen10880683b2017-04-12 16:21:55 +08001635 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001636 params[i] = GetUniformResourceProperty(program, index, props[i]);
jchen1058f67be2017-10-27 08:59:27 +08001637 ++pos;
1638 break;
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001639
1640 case GL_BUFFER_VARIABLE:
1641 params[i] = GetBufferVariableResourceProperty(program, index, props[i]);
1642 ++pos;
1643 break;
1644
jchen1058f67be2017-10-27 08:59:27 +08001645 case GL_UNIFORM_BLOCK:
1646 GetUniformBlockResourceProperty(program, index, props[i], params, bufSize, &pos);
jchen10baf5d942017-08-28 20:45:48 +08001647 break;
1648
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001649 case GL_SHADER_STORAGE_BLOCK:
1650 GetShaderStorageBlockResourceProperty(program, index, props[i], params, bufSize,
1651 &pos);
1652 break;
1653
jchen1058f67be2017-10-27 08:59:27 +08001654 case GL_ATOMIC_COUNTER_BUFFER:
1655 GetAtomicCounterBufferResourceProperty(program, index, props[i], params, bufSize,
1656 &pos);
1657 break;
jchen10910a3da2017-11-15 09:40:11 +08001658
jchen10880683b2017-04-12 16:21:55 +08001659 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10910a3da2017-11-15 09:40:11 +08001660 params[i] = GetTransformFeedbackVaryingResourceProperty(program, index, props[i]);
1661 ++pos;
jchen10880683b2017-04-12 16:21:55 +08001662 break;
1663
1664 default:
1665 UNREACHABLE();
1666 params[i] = GL_INVALID_VALUE;
1667 }
jchen1058f67be2017-10-27 08:59:27 +08001668 if (pos == bufSize)
1669 {
1670 // Most properties return one value, but GL_ACTIVE_VARIABLES returns an array of values.
1671 // This checks not to break buffer bounds for such case.
1672 break;
1673 }
1674 }
1675
1676 if (length != nullptr)
1677 {
1678 *length = pos;
jchen10880683b2017-04-12 16:21:55 +08001679 }
1680}
1681
jchen10d9cd7b72017-08-30 15:04:25 +08001682void QueryProgramInterfaceiv(const Program *program,
1683 GLenum programInterface,
1684 GLenum pname,
1685 GLint *params)
1686{
1687 switch (pname)
1688 {
1689 case GL_ACTIVE_RESOURCES:
1690 *params = QueryProgramInterfaceActiveResources(program, programInterface);
1691 break;
1692
1693 case GL_MAX_NAME_LENGTH:
1694 *params = QueryProgramInterfaceMaxNameLength(program, programInterface);
1695 break;
1696
1697 case GL_MAX_NUM_ACTIVE_VARIABLES:
1698 *params = QueryProgramInterfaceMaxNumActiveVariables(program, programInterface);
1699 break;
1700
1701 default:
1702 UNREACHABLE();
1703 }
1704}
1705
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001706ClientVertexArrayType ParamToVertexArrayType(GLenum param)
1707{
1708 switch (param)
1709 {
1710 case GL_VERTEX_ARRAY:
1711 case GL_VERTEX_ARRAY_BUFFER_BINDING:
1712 case GL_VERTEX_ARRAY_STRIDE:
1713 case GL_VERTEX_ARRAY_SIZE:
1714 case GL_VERTEX_ARRAY_TYPE:
1715 case GL_VERTEX_ARRAY_POINTER:
1716 return ClientVertexArrayType::Vertex;
1717 case GL_NORMAL_ARRAY:
1718 case GL_NORMAL_ARRAY_BUFFER_BINDING:
1719 case GL_NORMAL_ARRAY_STRIDE:
1720 case GL_NORMAL_ARRAY_TYPE:
1721 case GL_NORMAL_ARRAY_POINTER:
1722 return ClientVertexArrayType::Normal;
1723 case GL_COLOR_ARRAY:
1724 case GL_COLOR_ARRAY_BUFFER_BINDING:
1725 case GL_COLOR_ARRAY_STRIDE:
1726 case GL_COLOR_ARRAY_SIZE:
1727 case GL_COLOR_ARRAY_TYPE:
1728 case GL_COLOR_ARRAY_POINTER:
1729 return ClientVertexArrayType::Color;
1730 case GL_POINT_SIZE_ARRAY_OES:
1731 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
1732 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
1733 case GL_POINT_SIZE_ARRAY_TYPE_OES:
1734 case GL_POINT_SIZE_ARRAY_POINTER_OES:
1735 return ClientVertexArrayType::PointSize;
1736 case GL_TEXTURE_COORD_ARRAY:
1737 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
1738 case GL_TEXTURE_COORD_ARRAY_STRIDE:
1739 case GL_TEXTURE_COORD_ARRAY_SIZE:
1740 case GL_TEXTURE_COORD_ARRAY_TYPE:
1741 case GL_TEXTURE_COORD_ARRAY_POINTER:
1742 return ClientVertexArrayType::TextureCoord;
1743 default:
1744 UNREACHABLE();
1745 return ClientVertexArrayType::InvalidEnum;
1746 }
1747}
1748
Geoff Lang65603eb2017-01-12 16:48:03 -05001749} // namespace gl
1750
1751namespace egl
1752{
1753
1754void QueryConfigAttrib(const Config *config, EGLint attribute, EGLint *value)
1755{
1756 ASSERT(config != nullptr);
1757 switch (attribute)
1758 {
1759 case EGL_BUFFER_SIZE:
1760 *value = config->bufferSize;
1761 break;
1762 case EGL_ALPHA_SIZE:
1763 *value = config->alphaSize;
1764 break;
1765 case EGL_BLUE_SIZE:
1766 *value = config->blueSize;
1767 break;
1768 case EGL_GREEN_SIZE:
1769 *value = config->greenSize;
1770 break;
1771 case EGL_RED_SIZE:
1772 *value = config->redSize;
1773 break;
1774 case EGL_DEPTH_SIZE:
1775 *value = config->depthSize;
1776 break;
1777 case EGL_STENCIL_SIZE:
1778 *value = config->stencilSize;
1779 break;
1780 case EGL_CONFIG_CAVEAT:
1781 *value = config->configCaveat;
1782 break;
1783 case EGL_CONFIG_ID:
1784 *value = config->configID;
1785 break;
1786 case EGL_LEVEL:
1787 *value = config->level;
1788 break;
1789 case EGL_NATIVE_RENDERABLE:
1790 *value = config->nativeRenderable;
1791 break;
1792 case EGL_NATIVE_VISUAL_ID:
1793 *value = config->nativeVisualID;
1794 break;
1795 case EGL_NATIVE_VISUAL_TYPE:
1796 *value = config->nativeVisualType;
1797 break;
1798 case EGL_SAMPLES:
1799 *value = config->samples;
1800 break;
1801 case EGL_SAMPLE_BUFFERS:
1802 *value = config->sampleBuffers;
1803 break;
1804 case EGL_SURFACE_TYPE:
1805 *value = config->surfaceType;
1806 break;
1807 case EGL_TRANSPARENT_TYPE:
1808 *value = config->transparentType;
1809 break;
1810 case EGL_TRANSPARENT_BLUE_VALUE:
1811 *value = config->transparentBlueValue;
1812 break;
1813 case EGL_TRANSPARENT_GREEN_VALUE:
1814 *value = config->transparentGreenValue;
1815 break;
1816 case EGL_TRANSPARENT_RED_VALUE:
1817 *value = config->transparentRedValue;
1818 break;
1819 case EGL_BIND_TO_TEXTURE_RGB:
1820 *value = config->bindToTextureRGB;
1821 break;
1822 case EGL_BIND_TO_TEXTURE_RGBA:
1823 *value = config->bindToTextureRGBA;
1824 break;
1825 case EGL_MIN_SWAP_INTERVAL:
1826 *value = config->minSwapInterval;
1827 break;
1828 case EGL_MAX_SWAP_INTERVAL:
1829 *value = config->maxSwapInterval;
1830 break;
1831 case EGL_LUMINANCE_SIZE:
1832 *value = config->luminanceSize;
1833 break;
1834 case EGL_ALPHA_MASK_SIZE:
1835 *value = config->alphaMaskSize;
1836 break;
1837 case EGL_COLOR_BUFFER_TYPE:
1838 *value = config->colorBufferType;
1839 break;
1840 case EGL_RENDERABLE_TYPE:
1841 *value = config->renderableType;
1842 break;
1843 case EGL_MATCH_NATIVE_PIXMAP:
1844 *value = false;
1845 UNIMPLEMENTED();
1846 break;
1847 case EGL_CONFORMANT:
1848 *value = config->conformant;
1849 break;
1850 case EGL_MAX_PBUFFER_WIDTH:
1851 *value = config->maxPBufferWidth;
1852 break;
1853 case EGL_MAX_PBUFFER_HEIGHT:
1854 *value = config->maxPBufferHeight;
1855 break;
1856 case EGL_MAX_PBUFFER_PIXELS:
1857 *value = config->maxPBufferPixels;
1858 break;
1859 case EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE:
1860 *value = config->optimalOrientation;
1861 break;
Geoff Langc5a2a172017-01-13 15:55:07 -05001862 case EGL_COLOR_COMPONENT_TYPE_EXT:
1863 *value = config->colorComponentType;
1864 break;
Geoff Lang65603eb2017-01-12 16:48:03 -05001865 default:
1866 UNREACHABLE();
1867 break;
1868 }
Geoff Langff5b2d52016-09-07 11:32:23 -04001869}
Geoff Lang65603eb2017-01-12 16:48:03 -05001870
Geoff Langaf143fe2017-10-05 13:59:43 -04001871void QueryContextAttrib(const gl::Context *context, EGLint attribute, EGLint *value)
1872{
1873 switch (attribute)
1874 {
1875 case EGL_CONFIG_ID:
1876 *value = context->getConfig()->configID;
1877 break;
1878 case EGL_CONTEXT_CLIENT_TYPE:
1879 *value = context->getClientType();
1880 break;
1881 case EGL_CONTEXT_CLIENT_VERSION:
1882 *value = context->getClientMajorVersion();
1883 break;
1884 case EGL_RENDER_BUFFER:
1885 *value = context->getRenderBuffer();
1886 break;
Geoff Langb433e872017-10-05 14:01:47 -04001887 case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
1888 *value = context->isRobustResourceInitEnabled();
1889 break;
Geoff Langaf143fe2017-10-05 13:59:43 -04001890 default:
1891 UNREACHABLE();
1892 break;
1893 }
1894}
1895
Geoff Lang31ecbd72017-07-26 13:01:27 -04001896void QuerySurfaceAttrib(const Surface *surface, EGLint attribute, EGLint *value)
1897{
1898 switch (attribute)
1899 {
1900 case EGL_GL_COLORSPACE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001901 *value = surface->getGLColorspace();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001902 break;
1903 case EGL_VG_ALPHA_FORMAT:
Geoff Lang40ac7832017-07-26 14:38:46 -04001904 *value = surface->getVGAlphaFormat();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001905 break;
1906 case EGL_VG_COLORSPACE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001907 *value = surface->getVGColorspace();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001908 break;
1909 case EGL_CONFIG_ID:
1910 *value = surface->getConfig()->configID;
1911 break;
1912 case EGL_HEIGHT:
1913 *value = surface->getHeight();
1914 break;
1915 case EGL_HORIZONTAL_RESOLUTION:
Geoff Lang40ac7832017-07-26 14:38:46 -04001916 *value = surface->getHorizontalResolution();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001917 break;
1918 case EGL_LARGEST_PBUFFER:
Geoff Lang40ac7832017-07-26 14:38:46 -04001919 // The EGL spec states that value is not written if the surface is not a pbuffer
1920 if (surface->getType() == EGL_PBUFFER_BIT)
1921 {
1922 *value = surface->getLargestPbuffer();
1923 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001924 break;
1925 case EGL_MIPMAP_TEXTURE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001926 // The EGL spec states that value is not written if the surface is not a pbuffer
1927 if (surface->getType() == EGL_PBUFFER_BIT)
1928 {
1929 *value = surface->getMipmapTexture();
1930 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001931 break;
1932 case EGL_MIPMAP_LEVEL:
Geoff Lang40ac7832017-07-26 14:38:46 -04001933 // The EGL spec states that value is not written if the surface is not a pbuffer
1934 if (surface->getType() == EGL_PBUFFER_BIT)
1935 {
1936 *value = surface->getMipmapLevel();
1937 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001938 break;
1939 case EGL_MULTISAMPLE_RESOLVE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001940 *value = surface->getMultisampleResolve();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001941 break;
1942 case EGL_PIXEL_ASPECT_RATIO:
1943 *value = surface->getPixelAspectRatio();
1944 break;
1945 case EGL_RENDER_BUFFER:
1946 *value = surface->getRenderBuffer();
1947 break;
1948 case EGL_SWAP_BEHAVIOR:
1949 *value = surface->getSwapBehavior();
1950 break;
1951 case EGL_TEXTURE_FORMAT:
Geoff Lang40ac7832017-07-26 14:38:46 -04001952 // The EGL spec states that value is not written if the surface is not a pbuffer
1953 if (surface->getType() == EGL_PBUFFER_BIT)
1954 {
Geoff Lang8ceea812018-04-10 03:07:13 -04001955 *value = ToEGLenum(surface->getTextureFormat());
Geoff Lang40ac7832017-07-26 14:38:46 -04001956 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001957 break;
1958 case EGL_TEXTURE_TARGET:
Geoff Lang40ac7832017-07-26 14:38:46 -04001959 // The EGL spec states that value is not written if the surface is not a pbuffer
1960 if (surface->getType() == EGL_PBUFFER_BIT)
1961 {
1962 *value = surface->getTextureTarget();
1963 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001964 break;
1965 case EGL_VERTICAL_RESOLUTION:
Geoff Lang40ac7832017-07-26 14:38:46 -04001966 *value = surface->getVerticalResolution();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001967 break;
1968 case EGL_WIDTH:
1969 *value = surface->getWidth();
1970 break;
1971 case EGL_POST_SUB_BUFFER_SUPPORTED_NV:
1972 *value = surface->isPostSubBufferSupported();
1973 break;
1974 case EGL_FIXED_SIZE_ANGLE:
1975 *value = surface->isFixedSize();
1976 break;
1977 case EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE:
1978 *value = surface->flexibleSurfaceCompatibilityRequested();
1979 break;
1980 case EGL_SURFACE_ORIENTATION_ANGLE:
1981 *value = surface->getOrientation();
1982 break;
1983 case EGL_DIRECT_COMPOSITION_ANGLE:
1984 *value = surface->directComposition();
1985 break;
Geoff Langb433e872017-10-05 14:01:47 -04001986 case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
1987 *value = surface->isRobustResourceInitEnabled();
1988 break;
Geoff Lang31ecbd72017-07-26 13:01:27 -04001989 default:
1990 UNREACHABLE();
1991 break;
1992 }
1993}
1994
1995void SetSurfaceAttrib(Surface *surface, EGLint attribute, EGLint value)
1996{
1997 switch (attribute)
1998 {
1999 case EGL_MIPMAP_LEVEL:
Geoff Lang40ac7832017-07-26 14:38:46 -04002000 surface->setMipmapLevel(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04002001 break;
2002 case EGL_MULTISAMPLE_RESOLVE:
Geoff Lang40ac7832017-07-26 14:38:46 -04002003 surface->setMultisampleResolve(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04002004 break;
2005 case EGL_SWAP_BEHAVIOR:
Geoff Lang40ac7832017-07-26 14:38:46 -04002006 surface->setSwapBehavior(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04002007 break;
2008 default:
2009 UNREACHABLE();
2010 break;
2011 }
2012}
2013
Geoff Lang65603eb2017-01-12 16:48:03 -05002014} // namespace egl