blob: 020db1a2736e5a447d4e91fed8539bd9f24800af [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
Olli Etuaho465835d2017-09-26 13:34:10 +0300439GLint GetCommonVariableProperty(const sh::ShaderVariable &var, GLenum prop)
jchen10880683b2017-04-12 16:21:55 +0800440{
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:
Olli Etuaho465835d2017-09-26 13:34:10 +0300447 // Queryable variables are guaranteed not to be arrays of arrays or arrays of structs,
448 // see GLES 3.1 spec section 7.3.1.1 page 77.
449 return clampCast<GLint>(var.getBasicTypeElementCount());
jchen10880683b2017-04-12 16:21:55 +0800450
451 case GL_NAME_LENGTH:
jchen10880683b2017-04-12 16:21:55 +0800452 // ES31 spec p84: This counts the terminating null char.
Olli Etuahod2551232017-10-26 20:03:33 +0300453 return clampCast<GLint>(var.name.size() + 1u);
jchen10880683b2017-04-12 16:21:55 +0800454
455 default:
456 UNREACHABLE();
457 return GL_INVALID_VALUE;
458 }
459}
460
461GLint GetInputResourceProperty(const Program *program, GLuint index, GLenum prop)
462{
463 const auto &attribute = program->getInputResource(index);
464 switch (prop)
465 {
466 case GL_TYPE:
467 case GL_ARRAY_SIZE:
jchen10880683b2017-04-12 16:21:55 +0800468 case GL_NAME_LENGTH:
Olli Etuaho465835d2017-09-26 13:34:10 +0300469 return GetCommonVariableProperty(attribute, prop);
jchen10880683b2017-04-12 16:21:55 +0800470
jchen10baf5d942017-08-28 20:45:48 +0800471 case GL_LOCATION:
472 return program->getAttributeLocation(attribute.name);
473
jchen10880683b2017-04-12 16:21:55 +0800474 case GL_REFERENCED_BY_VERTEX_SHADER:
475 return 1;
476
477 case GL_REFERENCED_BY_FRAGMENT_SHADER:
478 case GL_REFERENCED_BY_COMPUTE_SHADER:
479 return 0;
480
481 default:
482 UNREACHABLE();
483 return GL_INVALID_VALUE;
484 }
485}
486
487GLint GetOutputResourceProperty(const Program *program, GLuint index, const GLenum prop)
488{
489 const auto &outputVariable = program->getOutputResource(index);
490 switch (prop)
491 {
492 case GL_TYPE:
493 case GL_ARRAY_SIZE:
jchen10880683b2017-04-12 16:21:55 +0800494 case GL_NAME_LENGTH:
Olli Etuaho465835d2017-09-26 13:34:10 +0300495 return GetCommonVariableProperty(outputVariable, prop);
jchen10880683b2017-04-12 16:21:55 +0800496
jchen10baf5d942017-08-28 20:45:48 +0800497 case GL_LOCATION:
498 return program->getFragDataLocation(outputVariable.name);
499
jchen10880683b2017-04-12 16:21:55 +0800500 case GL_REFERENCED_BY_VERTEX_SHADER:
501 return 0;
502
503 case GL_REFERENCED_BY_FRAGMENT_SHADER:
504 return 1;
505
506 case GL_REFERENCED_BY_COMPUTE_SHADER:
507 return 0;
508
509 default:
510 UNREACHABLE();
511 return GL_INVALID_VALUE;
512 }
513}
514
jchen10d9cd7b72017-08-30 15:04:25 +0800515GLint QueryProgramInterfaceActiveResources(const Program *program, GLenum programInterface)
516{
517 switch (programInterface)
518 {
519 case GL_PROGRAM_INPUT:
jchen10a99ed552017-09-22 08:10:32 +0800520 return clampCast<GLint>(program->getAttributes().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800521
522 case GL_PROGRAM_OUTPUT:
jchen10a99ed552017-09-22 08:10:32 +0800523 return clampCast<GLint>(program->getState().getOutputVariables().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800524
525 case GL_UNIFORM:
jchen10a99ed552017-09-22 08:10:32 +0800526 return clampCast<GLint>(program->getState().getUniforms().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800527
528 case GL_UNIFORM_BLOCK:
jchen10a99ed552017-09-22 08:10:32 +0800529 return clampCast<GLint>(program->getState().getUniformBlocks().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800530
jchen1058f67be2017-10-27 08:59:27 +0800531 case GL_ATOMIC_COUNTER_BUFFER:
532 return clampCast<GLint>(program->getState().getAtomicCounterBuffers().size());
533
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800534 case GL_BUFFER_VARIABLE:
535 return clampCast<GLint>(program->getState().getBufferVariables().size());
536
537 case GL_SHADER_STORAGE_BLOCK:
538 return clampCast<GLint>(program->getState().getShaderStorageBlocks().size());
539
jchen10d9cd7b72017-08-30 15:04:25 +0800540 // TODO(jie.a.chen@intel.com): more interfaces.
541 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10d9cd7b72017-08-30 15:04:25 +0800542 UNIMPLEMENTED();
543 return 0;
544
545 default:
546 UNREACHABLE();
547 return 0;
548 }
549}
550
551template <typename T, typename M>
552GLint FindMaxSize(const std::vector<T> &resources, M member)
553{
554 GLint max = 0;
555 for (const T &resource : resources)
556 {
jchen10a99ed552017-09-22 08:10:32 +0800557 max = std::max(max, clampCast<GLint>((resource.*member).size()));
jchen10d9cd7b72017-08-30 15:04:25 +0800558 }
559 return max;
560}
561
562GLint QueryProgramInterfaceMaxNameLength(const Program *program, GLenum programInterface)
563{
564 GLint maxNameLength = 0;
565 switch (programInterface)
566 {
567 case GL_PROGRAM_INPUT:
568 maxNameLength = FindMaxSize(program->getAttributes(), &sh::Attribute::name);
569 break;
570
571 case GL_PROGRAM_OUTPUT:
572 maxNameLength =
573 FindMaxSize(program->getState().getOutputVariables(), &sh::OutputVariable::name);
574 break;
575
576 case GL_UNIFORM:
577 maxNameLength = FindMaxSize(program->getState().getUniforms(), &LinkedUniform::name);
578 break;
579
580 case GL_UNIFORM_BLOCK:
581 maxNameLength =
Jiajia Qin729b2c62017-08-14 09:36:11 +0800582 FindMaxSize(program->getState().getUniformBlocks(), &InterfaceBlock::name);
jchen10d9cd7b72017-08-30 15:04:25 +0800583 break;
584
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800585 case GL_BUFFER_VARIABLE:
586 maxNameLength =
587 FindMaxSize(program->getState().getBufferVariables(), &BufferVariable::name);
588 break;
589
590 case GL_SHADER_STORAGE_BLOCK:
591 maxNameLength =
592 FindMaxSize(program->getState().getShaderStorageBlocks(), &InterfaceBlock::name);
593 break;
594
jchen10d9cd7b72017-08-30 15:04:25 +0800595 // TODO(jie.a.chen@intel.com): more interfaces.
596 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10d9cd7b72017-08-30 15:04:25 +0800597 UNIMPLEMENTED();
598 return 0;
599
600 default:
601 UNREACHABLE();
602 return 0;
603 }
604 // This length includes an extra character for the null terminator.
605 return (maxNameLength == 0 ? 0 : maxNameLength + 1);
606}
607
608GLint QueryProgramInterfaceMaxNumActiveVariables(const Program *program, GLenum programInterface)
609{
610 switch (programInterface)
611 {
612 case GL_UNIFORM_BLOCK:
613 return FindMaxSize(program->getState().getUniformBlocks(),
Jiajia Qin729b2c62017-08-14 09:36:11 +0800614 &InterfaceBlock::memberIndexes);
jchen1058f67be2017-10-27 08:59:27 +0800615 case GL_ATOMIC_COUNTER_BUFFER:
616 return FindMaxSize(program->getState().getAtomicCounterBuffers(),
617 &AtomicCounterBuffer::memberIndexes);
jchen10d9cd7b72017-08-30 15:04:25 +0800618
jchen10d9cd7b72017-08-30 15:04:25 +0800619 case GL_SHADER_STORAGE_BLOCK:
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800620 return FindMaxSize(program->getState().getShaderStorageBlocks(),
621 &InterfaceBlock::memberIndexes);
jchen10d9cd7b72017-08-30 15:04:25 +0800622
623 default:
624 UNREACHABLE();
625 return 0;
626 }
627}
628
jchen10baf5d942017-08-28 20:45:48 +0800629GLenum GetUniformPropertyEnum(GLenum prop)
630{
631 switch (prop)
632 {
633 case GL_UNIFORM_TYPE:
634 return GL_TYPE;
635 case GL_UNIFORM_SIZE:
636 return GL_ARRAY_SIZE;
637 case GL_UNIFORM_NAME_LENGTH:
638 return GL_NAME_LENGTH;
639 case GL_UNIFORM_BLOCK_INDEX:
640 return GL_BLOCK_INDEX;
641 case GL_UNIFORM_OFFSET:
642 return GL_OFFSET;
643 case GL_UNIFORM_ARRAY_STRIDE:
644 return GL_ARRAY_STRIDE;
645 case GL_UNIFORM_MATRIX_STRIDE:
646 return GL_MATRIX_STRIDE;
647 case GL_UNIFORM_IS_ROW_MAJOR:
648 return GL_IS_ROW_MAJOR;
649
650 default:
651 return prop;
652 }
653}
654
jchen1058f67be2017-10-27 08:59:27 +0800655GLenum GetUniformBlockPropertyEnum(GLenum prop)
656{
657 switch (prop)
658 {
659 case GL_UNIFORM_BLOCK_BINDING:
660 return GL_BUFFER_BINDING;
661
662 case GL_UNIFORM_BLOCK_DATA_SIZE:
663 return GL_BUFFER_DATA_SIZE;
664
665 case GL_UNIFORM_BLOCK_NAME_LENGTH:
666 return GL_NAME_LENGTH;
667
668 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
669 return GL_NUM_ACTIVE_VARIABLES;
670
671 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
672 return GL_ACTIVE_VARIABLES;
673
674 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
675 return GL_REFERENCED_BY_VERTEX_SHADER;
676
677 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
678 return GL_REFERENCED_BY_FRAGMENT_SHADER;
679
680 default:
681 return prop;
682 }
683}
684
685void GetShaderVariableBufferResourceProperty(const ShaderVariableBuffer &buffer,
686 GLenum pname,
687 GLint *params,
688 GLsizei bufSize,
689 GLsizei *outputPosition)
690
691{
692 switch (pname)
693 {
694 case GL_BUFFER_BINDING:
695 params[(*outputPosition)++] = buffer.binding;
696 break;
697 case GL_BUFFER_DATA_SIZE:
698 params[(*outputPosition)++] = clampCast<GLint>(buffer.dataSize);
699 break;
700 case GL_NUM_ACTIVE_VARIABLES:
701 params[(*outputPosition)++] = buffer.numActiveVariables();
702 break;
703 case GL_ACTIVE_VARIABLES:
704 for (size_t memberIndex = 0;
705 memberIndex < buffer.memberIndexes.size() && *outputPosition < bufSize;
706 ++memberIndex)
707 {
708 params[(*outputPosition)++] = clampCast<GLint>(buffer.memberIndexes[memberIndex]);
709 }
710 break;
711 case GL_REFERENCED_BY_VERTEX_SHADER:
712 params[(*outputPosition)++] = static_cast<GLint>(buffer.vertexStaticUse);
713 break;
714 case GL_REFERENCED_BY_FRAGMENT_SHADER:
715 params[(*outputPosition)++] = static_cast<GLint>(buffer.fragmentStaticUse);
716 break;
717 case GL_REFERENCED_BY_COMPUTE_SHADER:
718 params[(*outputPosition)++] = static_cast<GLint>(buffer.computeStaticUse);
719 break;
720 default:
721 UNREACHABLE();
722 break;
723 }
724}
725
726void GetInterfaceBlockResourceProperty(const InterfaceBlock &block,
727 GLenum pname,
728 GLint *params,
729 GLsizei bufSize,
730 GLsizei *outputPosition)
731{
732 if (pname == GL_NAME_LENGTH)
733 {
734 params[(*outputPosition)++] = clampCast<GLint>(block.nameWithArrayIndex().size() + 1);
735 return;
736 }
737 GetShaderVariableBufferResourceProperty(block, pname, params, bufSize, outputPosition);
738}
739
740void GetUniformBlockResourceProperty(const Program *program,
741 GLuint blockIndex,
742 GLenum pname,
743 GLint *params,
744 GLsizei bufSize,
745 GLsizei *outputPosition)
746
747{
748 ASSERT(*outputPosition < bufSize);
749 const auto &block = program->getUniformBlockByIndex(blockIndex);
750 GetInterfaceBlockResourceProperty(block, pname, params, bufSize, outputPosition);
751}
752
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800753void GetShaderStorageBlockResourceProperty(const Program *program,
754 GLuint blockIndex,
755 GLenum pname,
756 GLint *params,
757 GLsizei bufSize,
758 GLsizei *outputPosition)
759
760{
761 ASSERT(*outputPosition < bufSize);
762 const auto &block = program->getShaderStorageBlockByIndex(blockIndex);
763 GetInterfaceBlockResourceProperty(block, pname, params, bufSize, outputPosition);
764}
765
jchen1058f67be2017-10-27 08:59:27 +0800766void GetAtomicCounterBufferResourceProperty(const Program *program,
767 GLuint index,
768 GLenum pname,
769 GLint *params,
770 GLsizei bufSize,
771 GLsizei *outputPosition)
772
773{
774 ASSERT(*outputPosition < bufSize);
775 const auto &buffer = program->getState().getAtomicCounterBuffers()[index];
776 GetShaderVariableBufferResourceProperty(buffer, pname, params, bufSize, outputPosition);
777}
778
Geoff Langc1984ed2016-10-07 12:41:00 -0400779} // anonymous namespace
780
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -0800781void QueryFramebufferAttachmentParameteriv(const Context *context,
782 const Framebuffer *framebuffer,
Geoff Langff5b2d52016-09-07 11:32:23 -0400783 GLenum attachment,
784 GLenum pname,
785 GLint *params)
786{
787 ASSERT(framebuffer);
788
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -0800789 const FramebufferAttachment *attachmentObject = framebuffer->getAttachment(context, attachment);
790
Geoff Langff5b2d52016-09-07 11:32:23 -0400791 if (attachmentObject == nullptr)
792 {
793 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
794 // is NONE, then querying any other pname will generate INVALID_ENUM.
795
796 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
797 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
798 // INVALID_OPERATION for all other pnames
799
800 switch (pname)
801 {
802 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
803 *params = GL_NONE;
804 break;
805
806 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
807 *params = 0;
808 break;
809
810 default:
811 UNREACHABLE();
812 break;
813 }
814
815 return;
816 }
817
818 switch (pname)
819 {
820 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
821 *params = attachmentObject->type();
822 break;
823
824 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
825 *params = attachmentObject->id();
826 break;
827
828 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
829 *params = attachmentObject->mipLevel();
830 break;
831
832 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
833 *params = attachmentObject->cubeMapFace();
834 break;
835
836 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
837 *params = attachmentObject->getRedSize();
838 break;
839
840 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
841 *params = attachmentObject->getGreenSize();
842 break;
843
844 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
845 *params = attachmentObject->getBlueSize();
846 break;
847
848 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
849 *params = attachmentObject->getAlphaSize();
850 break;
851
852 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
853 *params = attachmentObject->getDepthSize();
854 break;
855
856 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
857 *params = attachmentObject->getStencilSize();
858 break;
859
860 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
861 *params = attachmentObject->getComponentType();
862 break;
863
864 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
865 *params = attachmentObject->getColorEncoding();
866 break;
867
868 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
869 *params = attachmentObject->layer();
870 break;
871
Martin Radeve5285d22017-07-14 16:23:53 +0300872 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_ANGLE:
873 *params = attachmentObject->getNumViews();
874 break;
875
876 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_MULTIVIEW_LAYOUT_ANGLE:
877 *params = static_cast<GLint>(attachmentObject->getMultiviewLayout());
878 break;
879
880 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_ANGLE:
881 *params = attachmentObject->getBaseViewIndex();
882 break;
883
884 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_VIEWPORT_OFFSETS_ANGLE:
885 {
886 const std::vector<Offset> &offsets = attachmentObject->getMultiviewViewportOffsets();
887 for (size_t i = 0u; i < offsets.size(); ++i)
888 {
889 params[i * 2u] = offsets[i].x;
890 params[i * 2u + 1u] = offsets[i].y;
891 }
892 }
893 break;
894
Geoff Langff5b2d52016-09-07 11:32:23 -0400895 default:
896 UNREACHABLE();
897 break;
898 }
899}
900
901void QueryBufferParameteriv(const Buffer *buffer, GLenum pname, GLint *params)
902{
Geoff Langebebe1c2016-10-14 12:01:31 -0400903 QueryBufferParameterBase(buffer, pname, params);
904}
Geoff Langff5b2d52016-09-07 11:32:23 -0400905
Geoff Langebebe1c2016-10-14 12:01:31 -0400906void QueryBufferParameteri64v(const Buffer *buffer, GLenum pname, GLint64 *params)
907{
908 QueryBufferParameterBase(buffer, pname, params);
Geoff Langff5b2d52016-09-07 11:32:23 -0400909}
910
Geoff Lang496c02d2016-10-20 11:38:11 -0700911void QueryBufferPointerv(const Buffer *buffer, GLenum pname, void **params)
912{
913 switch (pname)
914 {
915 case GL_BUFFER_MAP_POINTER:
916 *params = buffer->getMapPointer();
917 break;
918
919 default:
920 UNREACHABLE();
921 break;
922 }
923}
924
Jamie Madillffe00c02017-06-27 16:26:55 -0400925void QueryProgramiv(const Context *context, const Program *program, GLenum pname, GLint *params)
Geoff Langff5b2d52016-09-07 11:32:23 -0400926{
927 ASSERT(program != nullptr);
928
929 switch (pname)
930 {
931 case GL_DELETE_STATUS:
932 *params = program->isFlaggedForDeletion();
933 return;
934 case GL_LINK_STATUS:
935 *params = program->isLinked();
936 return;
937 case GL_VALIDATE_STATUS:
938 *params = program->isValidated();
939 return;
940 case GL_INFO_LOG_LENGTH:
941 *params = program->getInfoLogLength();
942 return;
943 case GL_ATTACHED_SHADERS:
944 *params = program->getAttachedShadersCount();
945 return;
946 case GL_ACTIVE_ATTRIBUTES:
947 *params = program->getActiveAttributeCount();
948 return;
949 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
950 *params = program->getActiveAttributeMaxLength();
951 return;
952 case GL_ACTIVE_UNIFORMS:
953 *params = program->getActiveUniformCount();
954 return;
955 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
956 *params = program->getActiveUniformMaxLength();
957 return;
958 case GL_PROGRAM_BINARY_LENGTH_OES:
Jamie Madillffe00c02017-06-27 16:26:55 -0400959 *params = program->getBinaryLength(context);
Geoff Langff5b2d52016-09-07 11:32:23 -0400960 return;
961 case GL_ACTIVE_UNIFORM_BLOCKS:
962 *params = program->getActiveUniformBlockCount();
963 return;
964 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
965 *params = program->getActiveUniformBlockMaxLength();
966 break;
967 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
968 *params = program->getTransformFeedbackBufferMode();
969 break;
970 case GL_TRANSFORM_FEEDBACK_VARYINGS:
971 *params = program->getTransformFeedbackVaryingCount();
972 break;
973 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
974 *params = program->getTransformFeedbackVaryingMaxLength();
975 break;
976 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
977 *params = program->getBinaryRetrievableHint();
978 break;
Yunchao He61afff12017-03-14 15:34:03 +0800979 case GL_PROGRAM_SEPARABLE:
980 *params = program->isSeparable();
981 break;
Xinghua Cao971f8502017-10-17 13:01:24 +0800982 case GL_COMPUTE_WORK_GROUP_SIZE:
983 {
984 const sh::WorkGroupSize &localSize = program->getComputeShaderLocalSize();
985 params[0] = localSize[0];
986 params[1] = localSize[1];
987 params[2] = localSize[2];
988 }
989 break;
jchen1058f67be2017-10-27 08:59:27 +0800990 case GL_ACTIVE_ATOMIC_COUNTER_BUFFERS:
991 *params = program->getActiveAtomicCounterBufferCount();
992 break;
Geoff Langff5b2d52016-09-07 11:32:23 -0400993 default:
994 UNREACHABLE();
995 break;
996 }
997}
Geoff Lang740d9022016-10-07 11:20:52 -0400998
Jamie Madill4e0e6f82017-02-17 11:06:03 -0500999void QueryRenderbufferiv(const Context *context,
1000 const Renderbuffer *renderbuffer,
1001 GLenum pname,
1002 GLint *params)
Geoff Lang740d9022016-10-07 11:20:52 -04001003{
1004 ASSERT(renderbuffer != nullptr);
1005
1006 switch (pname)
1007 {
1008 case GL_RENDERBUFFER_WIDTH:
1009 *params = renderbuffer->getWidth();
1010 break;
1011 case GL_RENDERBUFFER_HEIGHT:
1012 *params = renderbuffer->getHeight();
1013 break;
1014 case GL_RENDERBUFFER_INTERNAL_FORMAT:
Jamie Madill4e0e6f82017-02-17 11:06:03 -05001015 // Special case the WebGL 1 DEPTH_STENCIL format.
Jamie Madilla02315b2017-02-23 14:14:47 -05001016 if (context->isWebGL1() &&
Jamie Madill4e0e6f82017-02-17 11:06:03 -05001017 renderbuffer->getFormat().info->internalFormat == GL_DEPTH24_STENCIL8)
1018 {
1019 *params = GL_DEPTH_STENCIL;
1020 }
1021 else
1022 {
1023 *params = renderbuffer->getFormat().info->internalFormat;
1024 }
Geoff Lang740d9022016-10-07 11:20:52 -04001025 break;
1026 case GL_RENDERBUFFER_RED_SIZE:
1027 *params = renderbuffer->getRedSize();
1028 break;
1029 case GL_RENDERBUFFER_GREEN_SIZE:
1030 *params = renderbuffer->getGreenSize();
1031 break;
1032 case GL_RENDERBUFFER_BLUE_SIZE:
1033 *params = renderbuffer->getBlueSize();
1034 break;
1035 case GL_RENDERBUFFER_ALPHA_SIZE:
1036 *params = renderbuffer->getAlphaSize();
1037 break;
1038 case GL_RENDERBUFFER_DEPTH_SIZE:
1039 *params = renderbuffer->getDepthSize();
1040 break;
1041 case GL_RENDERBUFFER_STENCIL_SIZE:
1042 *params = renderbuffer->getStencilSize();
1043 break;
1044 case GL_RENDERBUFFER_SAMPLES_ANGLE:
1045 *params = renderbuffer->getSamples();
1046 break;
1047 default:
1048 UNREACHABLE();
1049 break;
1050 }
1051}
Geoff Langd7d0ed32016-10-07 11:33:51 -04001052
Jamie Madillbd044ed2017-06-05 12:59:21 -04001053void QueryShaderiv(const Context *context, Shader *shader, GLenum pname, GLint *params)
Geoff Langd7d0ed32016-10-07 11:33:51 -04001054{
1055 ASSERT(shader != nullptr);
1056
1057 switch (pname)
1058 {
1059 case GL_SHADER_TYPE:
1060 *params = shader->getType();
1061 return;
1062 case GL_DELETE_STATUS:
1063 *params = shader->isFlaggedForDeletion();
1064 return;
1065 case GL_COMPILE_STATUS:
Jamie Madillbd044ed2017-06-05 12:59:21 -04001066 *params = shader->isCompiled(context) ? GL_TRUE : GL_FALSE;
Geoff Langd7d0ed32016-10-07 11:33:51 -04001067 return;
1068 case GL_INFO_LOG_LENGTH:
Jamie Madillbd044ed2017-06-05 12:59:21 -04001069 *params = shader->getInfoLogLength(context);
Geoff Langd7d0ed32016-10-07 11:33:51 -04001070 return;
1071 case GL_SHADER_SOURCE_LENGTH:
1072 *params = shader->getSourceLength();
1073 return;
1074 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
Jamie Madillbd044ed2017-06-05 12:59:21 -04001075 *params = shader->getTranslatedSourceWithDebugInfoLength(context);
Geoff Langd7d0ed32016-10-07 11:33:51 -04001076 return;
1077 default:
1078 UNREACHABLE();
1079 break;
1080 }
1081}
Geoff Langc1984ed2016-10-07 12:41:00 -04001082
He Yunchao11b038b2016-11-22 21:24:04 +08001083void QueryTexLevelParameterfv(const Texture *texture,
1084 GLenum target,
1085 GLint level,
1086 GLenum pname,
1087 GLfloat *params)
1088{
1089 QueryTexLevelParameterBase(texture, target, level, pname, params);
1090}
1091
1092void QueryTexLevelParameteriv(const Texture *texture,
1093 GLenum target,
1094 GLint level,
1095 GLenum pname,
1096 GLint *params)
1097{
1098 QueryTexLevelParameterBase(texture, target, level, pname, params);
1099}
1100
Geoff Langc1984ed2016-10-07 12:41:00 -04001101void QueryTexParameterfv(const Texture *texture, GLenum pname, GLfloat *params)
1102{
1103 QueryTexParameterBase(texture, pname, params);
1104}
1105
1106void QueryTexParameteriv(const Texture *texture, GLenum pname, GLint *params)
1107{
1108 QueryTexParameterBase(texture, pname, params);
1109}
1110
1111void QuerySamplerParameterfv(const Sampler *sampler, GLenum pname, GLfloat *params)
1112{
1113 QuerySamplerParameterBase(sampler, pname, params);
1114}
1115
1116void QuerySamplerParameteriv(const Sampler *sampler, GLenum pname, GLint *params)
1117{
1118 QuerySamplerParameterBase(sampler, pname, params);
1119}
1120
Geoff Lang0b031062016-10-13 14:30:04 -04001121void QueryVertexAttribfv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001122 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001123 const VertexAttribCurrentValueData &currentValueData,
1124 GLenum pname,
1125 GLfloat *params)
1126{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001127 QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001128}
1129
1130void QueryVertexAttribiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001131 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001132 const VertexAttribCurrentValueData &currentValueData,
1133 GLenum pname,
1134 GLint *params)
1135{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001136 QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001137}
1138
Jamie Madill876429b2017-04-20 15:46:24 -04001139void QueryVertexAttribPointerv(const VertexAttribute &attrib, GLenum pname, void **pointer)
Geoff Lang0b031062016-10-13 14:30:04 -04001140{
1141 switch (pname)
1142 {
1143 case GL_VERTEX_ATTRIB_ARRAY_POINTER:
Jamie Madill876429b2017-04-20 15:46:24 -04001144 *pointer = const_cast<void *>(attrib.pointer);
Geoff Lang0b031062016-10-13 14:30:04 -04001145 break;
1146
1147 default:
1148 UNREACHABLE();
1149 break;
1150 }
1151}
1152
1153void QueryVertexAttribIiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001154 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001155 const VertexAttribCurrentValueData &currentValueData,
1156 GLenum pname,
1157 GLint *params)
1158{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001159 QueryVertexAttribBase(attrib, binding, currentValueData.IntValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001160}
1161
1162void QueryVertexAttribIuiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001163 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001164 const VertexAttribCurrentValueData &currentValueData,
1165 GLenum pname,
1166 GLuint *params)
1167{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001168 QueryVertexAttribBase(attrib, binding, currentValueData.UnsignedIntValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001169}
1170
Geoff Lang6899b872016-10-14 11:30:13 -04001171void QueryActiveUniformBlockiv(const Program *program,
1172 GLuint uniformBlockIndex,
1173 GLenum pname,
1174 GLint *params)
1175{
jchen1058f67be2017-10-27 08:59:27 +08001176 GLenum prop = GetUniformBlockPropertyEnum(pname);
1177 QueryProgramResourceiv(program, GL_UNIFORM_BLOCK, uniformBlockIndex, 1, &prop,
1178 std::numeric_limits<GLsizei>::max(), nullptr, params);
Geoff Lang6899b872016-10-14 11:30:13 -04001179}
1180
Geoff Lang0a9661f2016-10-20 10:59:20 -07001181void QueryInternalFormativ(const TextureCaps &format, GLenum pname, GLsizei bufSize, GLint *params)
1182{
1183 switch (pname)
1184 {
1185 case GL_NUM_SAMPLE_COUNTS:
1186 if (bufSize != 0)
1187 {
jchen10a99ed552017-09-22 08:10:32 +08001188 *params = clampCast<GLint>(format.sampleCounts.size());
Geoff Lang0a9661f2016-10-20 10:59:20 -07001189 }
1190 break;
1191
1192 case GL_SAMPLES:
1193 {
1194 size_t returnCount = std::min<size_t>(bufSize, format.sampleCounts.size());
1195 auto sampleReverseIt = format.sampleCounts.rbegin();
1196 for (size_t sampleIndex = 0; sampleIndex < returnCount; ++sampleIndex)
1197 {
1198 params[sampleIndex] = *sampleReverseIt++;
1199 }
1200 }
1201 break;
1202
1203 default:
1204 UNREACHABLE();
1205 break;
1206 }
1207}
1208
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001209void QueryFramebufferParameteriv(const Framebuffer *framebuffer, GLenum pname, GLint *params)
1210{
1211 ASSERT(framebuffer);
1212
1213 switch (pname)
1214 {
1215 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
1216 *params = framebuffer->getDefaultWidth();
1217 break;
1218 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
1219 *params = framebuffer->getDefaultHeight();
1220 break;
1221 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
1222 *params = framebuffer->getDefaultSamples();
1223 break;
1224 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
Geoff Lang92019432017-11-20 13:09:34 -05001225 *params = ConvertToGLBoolean(framebuffer->getDefaultFixedSampleLocations());
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001226 break;
1227 default:
1228 UNREACHABLE();
1229 break;
1230 }
1231}
1232
Jamie Madill70b5bb02017-08-28 13:32:37 -04001233Error QuerySynciv(const Sync *sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001234{
1235 ASSERT(sync);
1236
Geoff Lang82483b92017-04-11 15:33:00 -04001237 // All queries return one value, exit early if the buffer can't fit anything.
1238 if (bufSize < 1)
1239 {
1240 if (length != nullptr)
1241 {
1242 *length = 0;
1243 }
1244 return NoError();
1245 }
1246
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001247 switch (pname)
1248 {
1249 case GL_OBJECT_TYPE:
jchen10a99ed552017-09-22 08:10:32 +08001250 *values = clampCast<GLint>(GL_SYNC_FENCE);
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001251 break;
1252 case GL_SYNC_CONDITION:
jchen10a99ed552017-09-22 08:10:32 +08001253 *values = clampCast<GLint>(sync->getCondition());
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001254 break;
1255 case GL_SYNC_FLAGS:
jchen10a99ed552017-09-22 08:10:32 +08001256 *values = clampCast<GLint>(sync->getFlags());
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001257 break;
1258 case GL_SYNC_STATUS:
1259 ANGLE_TRY(sync->getStatus(values));
1260 break;
1261
1262 default:
1263 UNREACHABLE();
1264 break;
1265 }
1266
Geoff Lang82483b92017-04-11 15:33:00 -04001267 if (length != nullptr)
1268 {
1269 *length = 1;
1270 }
1271
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001272 return NoError();
1273}
1274
Jamie Madill4928b7c2017-06-20 12:57:39 -04001275void SetTexParameterf(Context *context, Texture *texture, GLenum pname, GLfloat param)
Geoff Langc1984ed2016-10-07 12:41:00 -04001276{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001277 SetTexParameterBase(context, texture, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -04001278}
1279
Jamie Madill4928b7c2017-06-20 12:57:39 -04001280void SetTexParameterfv(Context *context, Texture *texture, GLenum pname, const GLfloat *params)
Geoff Langc1984ed2016-10-07 12:41:00 -04001281{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001282 SetTexParameterBase(context, texture, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001283}
1284
Jamie Madill4928b7c2017-06-20 12:57:39 -04001285void SetTexParameteri(Context *context, Texture *texture, GLenum pname, GLint param)
Geoff Langc1984ed2016-10-07 12:41:00 -04001286{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001287 SetTexParameterBase(context, texture, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -04001288}
1289
Jamie Madill4928b7c2017-06-20 12:57:39 -04001290void SetTexParameteriv(Context *context, Texture *texture, GLenum pname, const GLint *params)
Geoff Langc1984ed2016-10-07 12:41:00 -04001291{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001292 SetTexParameterBase(context, texture, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001293}
1294
1295void SetSamplerParameterf(Sampler *sampler, GLenum pname, GLfloat param)
1296{
1297 SetSamplerParameterBase(sampler, pname, &param);
1298}
1299
1300void SetSamplerParameterfv(Sampler *sampler, GLenum pname, const GLfloat *params)
1301{
1302 SetSamplerParameterBase(sampler, pname, params);
1303}
1304
1305void SetSamplerParameteri(Sampler *sampler, GLenum pname, GLint param)
1306{
1307 SetSamplerParameterBase(sampler, pname, &param);
1308}
1309
1310void SetSamplerParameteriv(Sampler *sampler, GLenum pname, const GLint *params)
1311{
1312 SetSamplerParameterBase(sampler, pname, params);
1313}
Geoff Lang65603eb2017-01-12 16:48:03 -05001314
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001315void SetFramebufferParameteri(Framebuffer *framebuffer, GLenum pname, GLint param)
1316{
1317 ASSERT(framebuffer);
1318
1319 switch (pname)
1320 {
1321 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
1322 framebuffer->setDefaultWidth(param);
1323 break;
1324 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
1325 framebuffer->setDefaultHeight(param);
1326 break;
1327 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
1328 framebuffer->setDefaultSamples(param);
1329 break;
1330 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
Geoff Lang5201ce12017-11-28 11:36:28 -05001331 framebuffer->setDefaultFixedSampleLocations(ConvertToBool(param));
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001332 break;
1333 default:
1334 UNREACHABLE();
1335 break;
1336 }
1337}
1338
Yunchao He61afff12017-03-14 15:34:03 +08001339void SetProgramParameteri(Program *program, GLenum pname, GLint value)
1340{
1341 ASSERT(program);
1342
1343 switch (pname)
1344 {
1345 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
Geoff Lang92019432017-11-20 13:09:34 -05001346 program->setBinaryRetrievableHint(ConvertToBool(value));
Yunchao He61afff12017-03-14 15:34:03 +08001347 break;
1348 case GL_PROGRAM_SEPARABLE:
Geoff Lang92019432017-11-20 13:09:34 -05001349 program->setSeparable(ConvertToBool(value));
Yunchao He61afff12017-03-14 15:34:03 +08001350 break;
1351 default:
1352 UNREACHABLE();
1353 break;
1354 }
1355}
1356
jchen10baf5d942017-08-28 20:45:48 +08001357GLint GetUniformResourceProperty(const Program *program, GLuint index, const GLenum prop)
1358{
1359 const auto &uniform = program->getUniformByIndex(index);
1360 GLenum resourceProp = GetUniformPropertyEnum(prop);
1361 switch (resourceProp)
1362 {
1363 case GL_TYPE:
1364 case GL_ARRAY_SIZE:
1365 case GL_NAME_LENGTH:
Olli Etuaho465835d2017-09-26 13:34:10 +03001366 return GetCommonVariableProperty(uniform, resourceProp);
jchen10baf5d942017-08-28 20:45:48 +08001367
1368 case GL_LOCATION:
1369 return program->getUniformLocation(uniform.name);
1370
1371 case GL_BLOCK_INDEX:
1372 return (uniform.isAtomicCounter() ? -1 : uniform.bufferIndex);
1373
1374 case GL_OFFSET:
1375 return uniform.blockInfo.offset;
1376
1377 case GL_ARRAY_STRIDE:
1378 return uniform.blockInfo.arrayStride;
1379
1380 case GL_MATRIX_STRIDE:
1381 return uniform.blockInfo.matrixStride;
1382
1383 case GL_IS_ROW_MAJOR:
1384 return static_cast<GLint>(uniform.blockInfo.isRowMajorMatrix);
1385
1386 case GL_REFERENCED_BY_VERTEX_SHADER:
1387 return uniform.vertexStaticUse;
1388
1389 case GL_REFERENCED_BY_FRAGMENT_SHADER:
1390 return uniform.fragmentStaticUse;
1391
1392 case GL_REFERENCED_BY_COMPUTE_SHADER:
1393 return uniform.computeStaticUse;
1394
1395 case GL_ATOMIC_COUNTER_BUFFER_INDEX:
1396 return (uniform.isAtomicCounter() ? uniform.bufferIndex : -1);
1397
1398 default:
1399 UNREACHABLE();
1400 return 0;
1401 }
1402}
1403
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001404GLint GetBufferVariableResourceProperty(const Program *program, GLuint index, const GLenum prop)
1405{
1406 const auto &bufferVariable = program->getBufferVariableByIndex(index);
1407 switch (prop)
1408 {
1409 case GL_TYPE:
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001410 case GL_ARRAY_SIZE:
Olli Etuaho465835d2017-09-26 13:34:10 +03001411 case GL_NAME_LENGTH:
1412 return GetCommonVariableProperty(bufferVariable, prop);
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001413
1414 case GL_BLOCK_INDEX:
1415 return bufferVariable.bufferIndex;
1416
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001417 case GL_OFFSET:
1418 return bufferVariable.blockInfo.offset;
1419
1420 case GL_ARRAY_STRIDE:
1421 return bufferVariable.blockInfo.arrayStride;
1422
1423 case GL_MATRIX_STRIDE:
1424 return bufferVariable.blockInfo.matrixStride;
1425
1426 case GL_IS_ROW_MAJOR:
1427 return static_cast<GLint>(bufferVariable.blockInfo.isRowMajorMatrix);
1428
1429 case GL_REFERENCED_BY_VERTEX_SHADER:
1430 return bufferVariable.vertexStaticUse;
1431
1432 case GL_REFERENCED_BY_FRAGMENT_SHADER:
1433 return bufferVariable.fragmentStaticUse;
1434
1435 case GL_REFERENCED_BY_COMPUTE_SHADER:
1436 return bufferVariable.computeStaticUse;
1437
1438 case GL_TOP_LEVEL_ARRAY_SIZE:
1439 return bufferVariable.topLevelArraySize;
1440
1441 case GL_TOP_LEVEL_ARRAY_STRIDE:
1442 return bufferVariable.blockInfo.topLevelArrayStride;
1443
1444 default:
1445 UNREACHABLE();
1446 return 0;
1447 }
1448}
1449
jchen1015015f72017-03-16 13:54:21 +08001450GLuint QueryProgramResourceIndex(const Program *program,
1451 GLenum programInterface,
1452 const GLchar *name)
1453{
1454 switch (programInterface)
1455 {
1456 case GL_PROGRAM_INPUT:
1457 return program->getInputResourceIndex(name);
1458
1459 case GL_PROGRAM_OUTPUT:
1460 return program->getOutputResourceIndex(name);
1461
jchen1015015f72017-03-16 13:54:21 +08001462 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001463 return program->getState().getUniformIndexFromName(name);
1464
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001465 case GL_BUFFER_VARIABLE:
1466 return program->getState().getBufferVariableIndexFromName(name);
1467
1468 case GL_SHADER_STORAGE_BLOCK:
1469 return program->getShaderStorageBlockIndex(name);
1470
jchen1015015f72017-03-16 13:54:21 +08001471 case GL_UNIFORM_BLOCK:
jchen1058f67be2017-10-27 08:59:27 +08001472 return program->getUniformBlockIndex(name);
1473
1474 // TODO(jie.a.chen@intel.com): more interfaces.
jchen1015015f72017-03-16 13:54:21 +08001475 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen1015015f72017-03-16 13:54:21 +08001476 UNIMPLEMENTED();
1477 return GL_INVALID_INDEX;
1478
1479 default:
1480 UNREACHABLE();
1481 return GL_INVALID_INDEX;
1482 }
1483}
1484
jchen10fd7c3b52017-03-21 15:36:03 +08001485void QueryProgramResourceName(const Program *program,
1486 GLenum programInterface,
1487 GLuint index,
1488 GLsizei bufSize,
1489 GLsizei *length,
1490 GLchar *name)
1491{
1492 switch (programInterface)
1493 {
1494 case GL_PROGRAM_INPUT:
1495 program->getInputResourceName(index, bufSize, length, name);
1496 break;
1497
1498 case GL_PROGRAM_OUTPUT:
1499 program->getOutputResourceName(index, bufSize, length, name);
1500 break;
1501
jchen10fd7c3b52017-03-21 15:36:03 +08001502 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001503 program->getUniformResourceName(index, bufSize, length, name);
1504 break;
1505
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001506 case GL_BUFFER_VARIABLE:
1507 program->getBufferVariableResourceName(index, bufSize, length, name);
1508 break;
1509
1510 case GL_SHADER_STORAGE_BLOCK:
1511 program->getActiveShaderStorageBlockName(index, bufSize, length, name);
1512 break;
1513
jchen10fd7c3b52017-03-21 15:36:03 +08001514 case GL_UNIFORM_BLOCK:
jchen1058f67be2017-10-27 08:59:27 +08001515 program->getActiveUniformBlockName(index, bufSize, length, name);
1516 break;
1517
1518 // TODO(jie.a.chen@intel.com): more interfaces.
jchen10fd7c3b52017-03-21 15:36:03 +08001519 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10fd7c3b52017-03-21 15:36:03 +08001520 UNIMPLEMENTED();
1521 break;
1522
1523 default:
1524 UNREACHABLE();
1525 }
1526}
1527
jchen10191381f2017-04-11 13:59:04 +08001528GLint QueryProgramResourceLocation(const Program *program,
1529 GLenum programInterface,
1530 const GLchar *name)
1531{
1532 switch (programInterface)
1533 {
1534 case GL_PROGRAM_INPUT:
1535 return program->getAttributeLocation(name);
1536
1537 case GL_PROGRAM_OUTPUT:
1538 return program->getFragDataLocation(name);
1539
jchen10191381f2017-04-11 13:59:04 +08001540 case GL_UNIFORM:
Olli Etuahod2551232017-10-26 20:03:33 +03001541 return program->getUniformLocation(name);
jchen10baf5d942017-08-28 20:45:48 +08001542
jchen10191381f2017-04-11 13:59:04 +08001543 default:
1544 UNREACHABLE();
1545 return -1;
1546 }
1547}
1548
jchen10880683b2017-04-12 16:21:55 +08001549void QueryProgramResourceiv(const Program *program,
1550 GLenum programInterface,
1551 GLuint index,
1552 GLsizei propCount,
1553 const GLenum *props,
1554 GLsizei bufSize,
1555 GLsizei *length,
1556 GLint *params)
1557{
1558 if (!program->isLinked())
1559 {
1560 if (length != nullptr)
1561 {
1562 *length = 0;
1563 }
1564 return;
1565 }
1566
jchen1058f67be2017-10-27 08:59:27 +08001567 GLsizei pos = 0;
1568 for (GLsizei i = 0; i < propCount; i++)
jchen10880683b2017-04-12 16:21:55 +08001569 {
1570 switch (programInterface)
1571 {
1572 case GL_PROGRAM_INPUT:
1573 params[i] = GetInputResourceProperty(program, index, props[i]);
jchen1058f67be2017-10-27 08:59:27 +08001574 ++pos;
jchen10880683b2017-04-12 16:21:55 +08001575 break;
1576
1577 case GL_PROGRAM_OUTPUT:
1578 params[i] = GetOutputResourceProperty(program, index, props[i]);
jchen1058f67be2017-10-27 08:59:27 +08001579 ++pos;
jchen10880683b2017-04-12 16:21:55 +08001580 break;
1581
jchen10880683b2017-04-12 16:21:55 +08001582 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001583 params[i] = GetUniformResourceProperty(program, index, props[i]);
jchen1058f67be2017-10-27 08:59:27 +08001584 ++pos;
1585 break;
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001586
1587 case GL_BUFFER_VARIABLE:
1588 params[i] = GetBufferVariableResourceProperty(program, index, props[i]);
1589 ++pos;
1590 break;
1591
jchen1058f67be2017-10-27 08:59:27 +08001592 case GL_UNIFORM_BLOCK:
1593 GetUniformBlockResourceProperty(program, index, props[i], params, bufSize, &pos);
jchen10baf5d942017-08-28 20:45:48 +08001594 break;
1595
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001596 case GL_SHADER_STORAGE_BLOCK:
1597 GetShaderStorageBlockResourceProperty(program, index, props[i], params, bufSize,
1598 &pos);
1599 break;
1600
jchen1058f67be2017-10-27 08:59:27 +08001601 case GL_ATOMIC_COUNTER_BUFFER:
1602 GetAtomicCounterBufferResourceProperty(program, index, props[i], params, bufSize,
1603 &pos);
1604 break;
jchen10baf5d942017-08-28 20:45:48 +08001605 // TODO(jie.a.chen@intel.com): more interfaces.
jchen10880683b2017-04-12 16:21:55 +08001606 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10880683b2017-04-12 16:21:55 +08001607 UNIMPLEMENTED();
1608 params[i] = GL_INVALID_VALUE;
1609 break;
1610
1611 default:
1612 UNREACHABLE();
1613 params[i] = GL_INVALID_VALUE;
1614 }
jchen1058f67be2017-10-27 08:59:27 +08001615 if (pos == bufSize)
1616 {
1617 // Most properties return one value, but GL_ACTIVE_VARIABLES returns an array of values.
1618 // This checks not to break buffer bounds for such case.
1619 break;
1620 }
1621 }
1622
1623 if (length != nullptr)
1624 {
1625 *length = pos;
jchen10880683b2017-04-12 16:21:55 +08001626 }
1627}
1628
jchen10d9cd7b72017-08-30 15:04:25 +08001629void QueryProgramInterfaceiv(const Program *program,
1630 GLenum programInterface,
1631 GLenum pname,
1632 GLint *params)
1633{
1634 switch (pname)
1635 {
1636 case GL_ACTIVE_RESOURCES:
1637 *params = QueryProgramInterfaceActiveResources(program, programInterface);
1638 break;
1639
1640 case GL_MAX_NAME_LENGTH:
1641 *params = QueryProgramInterfaceMaxNameLength(program, programInterface);
1642 break;
1643
1644 case GL_MAX_NUM_ACTIVE_VARIABLES:
1645 *params = QueryProgramInterfaceMaxNumActiveVariables(program, programInterface);
1646 break;
1647
1648 default:
1649 UNREACHABLE();
1650 }
1651}
1652
Geoff Lang65603eb2017-01-12 16:48:03 -05001653} // namespace gl
1654
1655namespace egl
1656{
1657
1658void QueryConfigAttrib(const Config *config, EGLint attribute, EGLint *value)
1659{
1660 ASSERT(config != nullptr);
1661 switch (attribute)
1662 {
1663 case EGL_BUFFER_SIZE:
1664 *value = config->bufferSize;
1665 break;
1666 case EGL_ALPHA_SIZE:
1667 *value = config->alphaSize;
1668 break;
1669 case EGL_BLUE_SIZE:
1670 *value = config->blueSize;
1671 break;
1672 case EGL_GREEN_SIZE:
1673 *value = config->greenSize;
1674 break;
1675 case EGL_RED_SIZE:
1676 *value = config->redSize;
1677 break;
1678 case EGL_DEPTH_SIZE:
1679 *value = config->depthSize;
1680 break;
1681 case EGL_STENCIL_SIZE:
1682 *value = config->stencilSize;
1683 break;
1684 case EGL_CONFIG_CAVEAT:
1685 *value = config->configCaveat;
1686 break;
1687 case EGL_CONFIG_ID:
1688 *value = config->configID;
1689 break;
1690 case EGL_LEVEL:
1691 *value = config->level;
1692 break;
1693 case EGL_NATIVE_RENDERABLE:
1694 *value = config->nativeRenderable;
1695 break;
1696 case EGL_NATIVE_VISUAL_ID:
1697 *value = config->nativeVisualID;
1698 break;
1699 case EGL_NATIVE_VISUAL_TYPE:
1700 *value = config->nativeVisualType;
1701 break;
1702 case EGL_SAMPLES:
1703 *value = config->samples;
1704 break;
1705 case EGL_SAMPLE_BUFFERS:
1706 *value = config->sampleBuffers;
1707 break;
1708 case EGL_SURFACE_TYPE:
1709 *value = config->surfaceType;
1710 break;
1711 case EGL_TRANSPARENT_TYPE:
1712 *value = config->transparentType;
1713 break;
1714 case EGL_TRANSPARENT_BLUE_VALUE:
1715 *value = config->transparentBlueValue;
1716 break;
1717 case EGL_TRANSPARENT_GREEN_VALUE:
1718 *value = config->transparentGreenValue;
1719 break;
1720 case EGL_TRANSPARENT_RED_VALUE:
1721 *value = config->transparentRedValue;
1722 break;
1723 case EGL_BIND_TO_TEXTURE_RGB:
1724 *value = config->bindToTextureRGB;
1725 break;
1726 case EGL_BIND_TO_TEXTURE_RGBA:
1727 *value = config->bindToTextureRGBA;
1728 break;
1729 case EGL_MIN_SWAP_INTERVAL:
1730 *value = config->minSwapInterval;
1731 break;
1732 case EGL_MAX_SWAP_INTERVAL:
1733 *value = config->maxSwapInterval;
1734 break;
1735 case EGL_LUMINANCE_SIZE:
1736 *value = config->luminanceSize;
1737 break;
1738 case EGL_ALPHA_MASK_SIZE:
1739 *value = config->alphaMaskSize;
1740 break;
1741 case EGL_COLOR_BUFFER_TYPE:
1742 *value = config->colorBufferType;
1743 break;
1744 case EGL_RENDERABLE_TYPE:
1745 *value = config->renderableType;
1746 break;
1747 case EGL_MATCH_NATIVE_PIXMAP:
1748 *value = false;
1749 UNIMPLEMENTED();
1750 break;
1751 case EGL_CONFORMANT:
1752 *value = config->conformant;
1753 break;
1754 case EGL_MAX_PBUFFER_WIDTH:
1755 *value = config->maxPBufferWidth;
1756 break;
1757 case EGL_MAX_PBUFFER_HEIGHT:
1758 *value = config->maxPBufferHeight;
1759 break;
1760 case EGL_MAX_PBUFFER_PIXELS:
1761 *value = config->maxPBufferPixels;
1762 break;
1763 case EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE:
1764 *value = config->optimalOrientation;
1765 break;
Geoff Langc5a2a172017-01-13 15:55:07 -05001766 case EGL_COLOR_COMPONENT_TYPE_EXT:
1767 *value = config->colorComponentType;
1768 break;
Geoff Lang65603eb2017-01-12 16:48:03 -05001769 default:
1770 UNREACHABLE();
1771 break;
1772 }
Geoff Langff5b2d52016-09-07 11:32:23 -04001773}
Geoff Lang65603eb2017-01-12 16:48:03 -05001774
Geoff Langaf143fe2017-10-05 13:59:43 -04001775void QueryContextAttrib(const gl::Context *context, EGLint attribute, EGLint *value)
1776{
1777 switch (attribute)
1778 {
1779 case EGL_CONFIG_ID:
1780 *value = context->getConfig()->configID;
1781 break;
1782 case EGL_CONTEXT_CLIENT_TYPE:
1783 *value = context->getClientType();
1784 break;
1785 case EGL_CONTEXT_CLIENT_VERSION:
1786 *value = context->getClientMajorVersion();
1787 break;
1788 case EGL_RENDER_BUFFER:
1789 *value = context->getRenderBuffer();
1790 break;
Geoff Langb433e872017-10-05 14:01:47 -04001791 case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
1792 *value = context->isRobustResourceInitEnabled();
1793 break;
Geoff Langaf143fe2017-10-05 13:59:43 -04001794 default:
1795 UNREACHABLE();
1796 break;
1797 }
1798}
1799
Geoff Lang31ecbd72017-07-26 13:01:27 -04001800void QuerySurfaceAttrib(const Surface *surface, EGLint attribute, EGLint *value)
1801{
1802 switch (attribute)
1803 {
1804 case EGL_GL_COLORSPACE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001805 *value = surface->getGLColorspace();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001806 break;
1807 case EGL_VG_ALPHA_FORMAT:
Geoff Lang40ac7832017-07-26 14:38:46 -04001808 *value = surface->getVGAlphaFormat();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001809 break;
1810 case EGL_VG_COLORSPACE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001811 *value = surface->getVGColorspace();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001812 break;
1813 case EGL_CONFIG_ID:
1814 *value = surface->getConfig()->configID;
1815 break;
1816 case EGL_HEIGHT:
1817 *value = surface->getHeight();
1818 break;
1819 case EGL_HORIZONTAL_RESOLUTION:
Geoff Lang40ac7832017-07-26 14:38:46 -04001820 *value = surface->getHorizontalResolution();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001821 break;
1822 case EGL_LARGEST_PBUFFER:
Geoff Lang40ac7832017-07-26 14:38:46 -04001823 // The EGL spec states that value is not written if the surface is not a pbuffer
1824 if (surface->getType() == EGL_PBUFFER_BIT)
1825 {
1826 *value = surface->getLargestPbuffer();
1827 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001828 break;
1829 case EGL_MIPMAP_TEXTURE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001830 // The EGL spec states that value is not written if the surface is not a pbuffer
1831 if (surface->getType() == EGL_PBUFFER_BIT)
1832 {
1833 *value = surface->getMipmapTexture();
1834 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001835 break;
1836 case EGL_MIPMAP_LEVEL:
Geoff Lang40ac7832017-07-26 14:38:46 -04001837 // The EGL spec states that value is not written if the surface is not a pbuffer
1838 if (surface->getType() == EGL_PBUFFER_BIT)
1839 {
1840 *value = surface->getMipmapLevel();
1841 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001842 break;
1843 case EGL_MULTISAMPLE_RESOLVE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001844 *value = surface->getMultisampleResolve();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001845 break;
1846 case EGL_PIXEL_ASPECT_RATIO:
1847 *value = surface->getPixelAspectRatio();
1848 break;
1849 case EGL_RENDER_BUFFER:
1850 *value = surface->getRenderBuffer();
1851 break;
1852 case EGL_SWAP_BEHAVIOR:
1853 *value = surface->getSwapBehavior();
1854 break;
1855 case EGL_TEXTURE_FORMAT:
Geoff Lang40ac7832017-07-26 14:38:46 -04001856 // The EGL spec states that value is not written if the surface is not a pbuffer
1857 if (surface->getType() == EGL_PBUFFER_BIT)
1858 {
1859 *value = surface->getTextureFormat();
1860 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001861 break;
1862 case EGL_TEXTURE_TARGET:
Geoff Lang40ac7832017-07-26 14:38:46 -04001863 // The EGL spec states that value is not written if the surface is not a pbuffer
1864 if (surface->getType() == EGL_PBUFFER_BIT)
1865 {
1866 *value = surface->getTextureTarget();
1867 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001868 break;
1869 case EGL_VERTICAL_RESOLUTION:
Geoff Lang40ac7832017-07-26 14:38:46 -04001870 *value = surface->getVerticalResolution();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001871 break;
1872 case EGL_WIDTH:
1873 *value = surface->getWidth();
1874 break;
1875 case EGL_POST_SUB_BUFFER_SUPPORTED_NV:
1876 *value = surface->isPostSubBufferSupported();
1877 break;
1878 case EGL_FIXED_SIZE_ANGLE:
1879 *value = surface->isFixedSize();
1880 break;
1881 case EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE:
1882 *value = surface->flexibleSurfaceCompatibilityRequested();
1883 break;
1884 case EGL_SURFACE_ORIENTATION_ANGLE:
1885 *value = surface->getOrientation();
1886 break;
1887 case EGL_DIRECT_COMPOSITION_ANGLE:
1888 *value = surface->directComposition();
1889 break;
Geoff Langb433e872017-10-05 14:01:47 -04001890 case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
1891 *value = surface->isRobustResourceInitEnabled();
1892 break;
Geoff Lang31ecbd72017-07-26 13:01:27 -04001893 default:
1894 UNREACHABLE();
1895 break;
1896 }
1897}
1898
1899void SetSurfaceAttrib(Surface *surface, EGLint attribute, EGLint value)
1900{
1901 switch (attribute)
1902 {
1903 case EGL_MIPMAP_LEVEL:
Geoff Lang40ac7832017-07-26 14:38:46 -04001904 surface->setMipmapLevel(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04001905 break;
1906 case EGL_MULTISAMPLE_RESOLVE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001907 surface->setMultisampleResolve(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04001908 break;
1909 case EGL_SWAP_BEHAVIOR:
Geoff Lang40ac7832017-07-26 14:38:46 -04001910 surface->setSwapBehavior(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04001911 break;
1912 default:
1913 UNREACHABLE();
1914 break;
1915 }
1916}
1917
Geoff Lang65603eb2017-01-12 16:48:03 -05001918} // namespace egl