blob: ab07b57afce7c6434a636df719df9845491b31d7 [file] [log] [blame]
Geoff Langff5b2d52016-09-07 11:32:23 -04001//
2// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// queryutils.cpp: Utilities for querying values from GL objects
8
9#include "libANGLE/queryutils.h"
10
Geoff Langc1984ed2016-10-07 12:41:00 -040011#include "common/utilities.h"
12
Geoff Langff5b2d52016-09-07 11:32:23 -040013#include "libANGLE/Buffer.h"
Geoff Lang65603eb2017-01-12 16:48:03 -050014#include "libANGLE/Config.h"
Jamie Madill4e0e6f82017-02-17 11:06:03 -050015#include "libANGLE/Context.h"
Geoff Lang38f2cfb2017-04-11 15:23:08 -040016#include "libANGLE/Fence.h"
Geoff Langff5b2d52016-09-07 11:32:23 -040017#include "libANGLE/Framebuffer.h"
18#include "libANGLE/Program.h"
Geoff Lang740d9022016-10-07 11:20:52 -040019#include "libANGLE/Renderbuffer.h"
Geoff Langc1984ed2016-10-07 12:41:00 -040020#include "libANGLE/Sampler.h"
Geoff Langd7d0ed32016-10-07 11:33:51 -040021#include "libANGLE/Shader.h"
Geoff Lang31ecbd72017-07-26 13:01:27 -040022#include "libANGLE/Surface.h"
Geoff Langc1984ed2016-10-07 12:41:00 -040023#include "libANGLE/Texture.h"
Geoff Lang6899b872016-10-14 11:30:13 -040024#include "libANGLE/Uniform.h"
Geoff Lang0b031062016-10-13 14:30:04 -040025#include "libANGLE/VertexAttribute.h"
jchen10a99ed552017-09-22 08:10:32 +080026#include "libANGLE/queryconversions.h"
Geoff Langff5b2d52016-09-07 11:32:23 -040027
28namespace gl
29{
Geoff Langc1984ed2016-10-07 12:41:00 -040030
31namespace
32{
jchen10a99ed552017-09-22 08:10:32 +080033
Geoff Langc1984ed2016-10-07 12:41:00 -040034template <typename ParamType>
He Yunchao11b038b2016-11-22 21:24:04 +080035void QueryTexLevelParameterBase(const Texture *texture,
36 GLenum target,
37 GLint level,
38 GLenum pname,
39 ParamType *params)
40{
41 ASSERT(texture != nullptr);
42 const InternalFormat *info = texture->getTextureState().getImageDesc(target, level).format.info;
43
44 switch (pname)
45 {
46 case GL_TEXTURE_RED_TYPE:
jchen10a99ed552017-09-22 08:10:32 +080047 *params = CastFromGLintStateValue<ParamType>(
48 pname, info->redBits ? info->componentType : GL_NONE);
He Yunchao11b038b2016-11-22 21:24:04 +080049 break;
50 case GL_TEXTURE_GREEN_TYPE:
jchen10a99ed552017-09-22 08:10:32 +080051 *params = CastFromGLintStateValue<ParamType>(
52 pname, info->greenBits ? info->componentType : GL_NONE);
He Yunchao11b038b2016-11-22 21:24:04 +080053 break;
54 case GL_TEXTURE_BLUE_TYPE:
jchen10a99ed552017-09-22 08:10:32 +080055 *params = CastFromGLintStateValue<ParamType>(
56 pname, info->blueBits ? info->componentType : GL_NONE);
He Yunchao11b038b2016-11-22 21:24:04 +080057 break;
58 case GL_TEXTURE_ALPHA_TYPE:
jchen10a99ed552017-09-22 08:10:32 +080059 *params = CastFromGLintStateValue<ParamType>(
60 pname, info->alphaBits ? info->componentType : GL_NONE);
He Yunchao11b038b2016-11-22 21:24:04 +080061 break;
62 case GL_TEXTURE_DEPTH_TYPE:
jchen10a99ed552017-09-22 08:10:32 +080063 *params = CastFromGLintStateValue<ParamType>(
64 pname, info->depthBits ? info->componentType : GL_NONE);
He Yunchao11b038b2016-11-22 21:24:04 +080065 break;
66 case GL_TEXTURE_RED_SIZE:
jchen10a99ed552017-09-22 08:10:32 +080067 *params = CastFromGLintStateValue<ParamType>(pname, info->redBits);
He Yunchao11b038b2016-11-22 21:24:04 +080068 break;
69 case GL_TEXTURE_GREEN_SIZE:
jchen10a99ed552017-09-22 08:10:32 +080070 *params = CastFromGLintStateValue<ParamType>(pname, info->greenBits);
He Yunchao11b038b2016-11-22 21:24:04 +080071 break;
72 case GL_TEXTURE_BLUE_SIZE:
jchen10a99ed552017-09-22 08:10:32 +080073 *params = CastFromGLintStateValue<ParamType>(pname, info->blueBits);
He Yunchao11b038b2016-11-22 21:24:04 +080074 break;
75 case GL_TEXTURE_ALPHA_SIZE:
jchen10a99ed552017-09-22 08:10:32 +080076 *params = CastFromGLintStateValue<ParamType>(pname, info->alphaBits);
He Yunchao11b038b2016-11-22 21:24:04 +080077 break;
78 case GL_TEXTURE_DEPTH_SIZE:
jchen10a99ed552017-09-22 08:10:32 +080079 *params = CastFromGLintStateValue<ParamType>(pname, info->depthBits);
He Yunchao11b038b2016-11-22 21:24:04 +080080 break;
81 case GL_TEXTURE_STENCIL_SIZE:
jchen10a99ed552017-09-22 08:10:32 +080082 *params = CastFromGLintStateValue<ParamType>(pname, info->stencilBits);
He Yunchao11b038b2016-11-22 21:24:04 +080083 break;
84 case GL_TEXTURE_SHARED_SIZE:
jchen10a99ed552017-09-22 08:10:32 +080085 *params = CastFromGLintStateValue<ParamType>(pname, info->sharedBits);
He Yunchao11b038b2016-11-22 21:24:04 +080086 break;
87 case GL_TEXTURE_INTERNAL_FORMAT:
jchen10a99ed552017-09-22 08:10:32 +080088 *params = CastFromGLintStateValue<ParamType>(
89 pname, info->internalFormat ? info->internalFormat : GL_RGBA);
He Yunchao11b038b2016-11-22 21:24:04 +080090 break;
91 case GL_TEXTURE_WIDTH:
Corentin Wallez10d40262017-10-04 16:34:09 -040092 *params = CastFromGLintStateValue<ParamType>(
93 pname, static_cast<uint32_t>(texture->getWidth(target, level)));
He Yunchao11b038b2016-11-22 21:24:04 +080094 break;
95 case GL_TEXTURE_HEIGHT:
Corentin Wallez10d40262017-10-04 16:34:09 -040096 *params = CastFromGLintStateValue<ParamType>(
97 pname, static_cast<uint32_t>(texture->getHeight(target, level)));
He Yunchao11b038b2016-11-22 21:24:04 +080098 break;
99 case GL_TEXTURE_DEPTH:
Corentin Wallez10d40262017-10-04 16:34:09 -0400100 *params = CastFromGLintStateValue<ParamType>(
101 pname, static_cast<uint32_t>(texture->getDepth(target, level)));
He Yunchao11b038b2016-11-22 21:24:04 +0800102 break;
103 case GL_TEXTURE_SAMPLES:
jchen10a99ed552017-09-22 08:10:32 +0800104 *params = CastFromStateValue<ParamType>(pname, texture->getSamples(target, level));
He Yunchao11b038b2016-11-22 21:24:04 +0800105 break;
106 case GL_TEXTURE_FIXED_SAMPLE_LOCATIONS:
jchen10a99ed552017-09-22 08:10:32 +0800107 *params = CastFromStateValue<ParamType>(
108 pname, static_cast<GLint>(texture->getFixedSampleLocations(target, level)));
He Yunchao11b038b2016-11-22 21:24:04 +0800109 break;
110 case GL_TEXTURE_COMPRESSED:
jchen10a99ed552017-09-22 08:10:32 +0800111 *params = CastFromStateValue<ParamType>(pname, static_cast<GLint>(info->compressed));
He Yunchao11b038b2016-11-22 21:24:04 +0800112 break;
113 default:
114 UNREACHABLE();
115 break;
116 }
117}
118
119template <typename ParamType>
Geoff Langc1984ed2016-10-07 12:41:00 -0400120void QueryTexParameterBase(const Texture *texture, GLenum pname, ParamType *params)
121{
122 ASSERT(texture != nullptr);
123
124 switch (pname)
125 {
126 case GL_TEXTURE_MAG_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800127 *params = CastFromGLintStateValue<ParamType>(pname, texture->getMagFilter());
Geoff Langc1984ed2016-10-07 12:41:00 -0400128 break;
129 case GL_TEXTURE_MIN_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800130 *params = CastFromGLintStateValue<ParamType>(pname, texture->getMinFilter());
Geoff Langc1984ed2016-10-07 12:41:00 -0400131 break;
132 case GL_TEXTURE_WRAP_S:
jchen10a99ed552017-09-22 08:10:32 +0800133 *params = CastFromGLintStateValue<ParamType>(pname, texture->getWrapS());
Geoff Langc1984ed2016-10-07 12:41:00 -0400134 break;
135 case GL_TEXTURE_WRAP_T:
jchen10a99ed552017-09-22 08:10:32 +0800136 *params = CastFromGLintStateValue<ParamType>(pname, texture->getWrapT());
Geoff Langc1984ed2016-10-07 12:41:00 -0400137 break;
138 case GL_TEXTURE_WRAP_R:
jchen10a99ed552017-09-22 08:10:32 +0800139 *params = CastFromGLintStateValue<ParamType>(pname, texture->getWrapR());
Geoff Langc1984ed2016-10-07 12:41:00 -0400140 break;
141 case GL_TEXTURE_IMMUTABLE_FORMAT:
jchen10a99ed552017-09-22 08:10:32 +0800142 *params = CastFromGLintStateValue<ParamType>(pname, texture->getImmutableFormat());
Geoff Langc1984ed2016-10-07 12:41:00 -0400143 break;
144 case GL_TEXTURE_IMMUTABLE_LEVELS:
jchen10a99ed552017-09-22 08:10:32 +0800145 *params = CastFromGLintStateValue<ParamType>(pname, texture->getImmutableLevels());
Geoff Langc1984ed2016-10-07 12:41:00 -0400146 break;
147 case GL_TEXTURE_USAGE_ANGLE:
jchen10a99ed552017-09-22 08:10:32 +0800148 *params = CastFromGLintStateValue<ParamType>(pname, texture->getUsage());
Geoff Langc1984ed2016-10-07 12:41:00 -0400149 break;
150 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800151 *params = CastFromStateValue<ParamType>(pname, texture->getMaxAnisotropy());
Geoff Langc1984ed2016-10-07 12:41:00 -0400152 break;
153 case GL_TEXTURE_SWIZZLE_R:
jchen10a99ed552017-09-22 08:10:32 +0800154 *params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleRed());
Geoff Langc1984ed2016-10-07 12:41:00 -0400155 break;
156 case GL_TEXTURE_SWIZZLE_G:
jchen10a99ed552017-09-22 08:10:32 +0800157 *params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleGreen());
Geoff Langc1984ed2016-10-07 12:41:00 -0400158 break;
159 case GL_TEXTURE_SWIZZLE_B:
jchen10a99ed552017-09-22 08:10:32 +0800160 *params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleBlue());
Geoff Langc1984ed2016-10-07 12:41:00 -0400161 break;
162 case GL_TEXTURE_SWIZZLE_A:
jchen10a99ed552017-09-22 08:10:32 +0800163 *params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleAlpha());
Geoff Langc1984ed2016-10-07 12:41:00 -0400164 break;
165 case GL_TEXTURE_BASE_LEVEL:
jchen10a99ed552017-09-22 08:10:32 +0800166 *params = CastFromGLintStateValue<ParamType>(pname, texture->getBaseLevel());
Geoff Langc1984ed2016-10-07 12:41:00 -0400167 break;
168 case GL_TEXTURE_MAX_LEVEL:
jchen10a99ed552017-09-22 08:10:32 +0800169 *params = CastFromGLintStateValue<ParamType>(pname, texture->getMaxLevel());
Geoff Langc1984ed2016-10-07 12:41:00 -0400170 break;
171 case GL_TEXTURE_MIN_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800172 *params = CastFromStateValue<ParamType>(pname, texture->getSamplerState().minLod);
Geoff Langc1984ed2016-10-07 12:41:00 -0400173 break;
174 case GL_TEXTURE_MAX_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800175 *params = CastFromStateValue<ParamType>(pname, texture->getSamplerState().maxLod);
Geoff Langc1984ed2016-10-07 12:41:00 -0400176 break;
177 case GL_TEXTURE_COMPARE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800178 *params = CastFromGLintStateValue<ParamType>(pname, texture->getCompareMode());
Geoff Langc1984ed2016-10-07 12:41:00 -0400179 break;
180 case GL_TEXTURE_COMPARE_FUNC:
jchen10a99ed552017-09-22 08:10:32 +0800181 *params = CastFromGLintStateValue<ParamType>(pname, texture->getCompareFunc());
Geoff Langc1984ed2016-10-07 12:41:00 -0400182 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700183 case GL_TEXTURE_SRGB_DECODE_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800184 *params = CastFromGLintStateValue<ParamType>(pname, texture->getSRGBDecode());
Geoff Lang81c6b572016-10-19 14:07:52 -0700185 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400186 default:
187 UNREACHABLE();
188 break;
189 }
190}
191
192template <typename ParamType>
Jamie Madill4928b7c2017-06-20 12:57:39 -0400193void SetTexParameterBase(Context *context, Texture *texture, GLenum pname, const ParamType *params)
Geoff Langc1984ed2016-10-07 12:41:00 -0400194{
195 ASSERT(texture != nullptr);
196
197 switch (pname)
198 {
199 case GL_TEXTURE_WRAP_S:
jchen10a99ed552017-09-22 08:10:32 +0800200 texture->setWrapS(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400201 break;
202 case GL_TEXTURE_WRAP_T:
jchen10a99ed552017-09-22 08:10:32 +0800203 texture->setWrapT(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400204 break;
205 case GL_TEXTURE_WRAP_R:
jchen10a99ed552017-09-22 08:10:32 +0800206 texture->setWrapR(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400207 break;
208 case GL_TEXTURE_MIN_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800209 texture->setMinFilter(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400210 break;
211 case GL_TEXTURE_MAG_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800212 texture->setMagFilter(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400213 break;
214 case GL_TEXTURE_USAGE_ANGLE:
jchen10a99ed552017-09-22 08:10:32 +0800215 texture->setUsage(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400216 break;
217 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800218 texture->setMaxAnisotropy(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400219 break;
220 case GL_TEXTURE_COMPARE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800221 texture->setCompareMode(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400222 break;
223 case GL_TEXTURE_COMPARE_FUNC:
jchen10a99ed552017-09-22 08:10:32 +0800224 texture->setCompareFunc(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400225 break;
226 case GL_TEXTURE_SWIZZLE_R:
jchen10a99ed552017-09-22 08:10:32 +0800227 texture->setSwizzleRed(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400228 break;
229 case GL_TEXTURE_SWIZZLE_G:
jchen10a99ed552017-09-22 08:10:32 +0800230 texture->setSwizzleGreen(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400231 break;
232 case GL_TEXTURE_SWIZZLE_B:
jchen10a99ed552017-09-22 08:10:32 +0800233 texture->setSwizzleBlue(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400234 break;
235 case GL_TEXTURE_SWIZZLE_A:
jchen10a99ed552017-09-22 08:10:32 +0800236 texture->setSwizzleAlpha(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400237 break;
238 case GL_TEXTURE_BASE_LEVEL:
Jamie Madill4928b7c2017-06-20 12:57:39 -0400239 {
jchen10a99ed552017-09-22 08:10:32 +0800240 context->handleError(texture->setBaseLevel(
241 context, clampCast<GLuint>(CastQueryValueTo<GLint>(pname, params[0]))));
Geoff Langc1984ed2016-10-07 12:41:00 -0400242 break;
Jamie Madill4928b7c2017-06-20 12:57:39 -0400243 }
Geoff Langc1984ed2016-10-07 12:41:00 -0400244 case GL_TEXTURE_MAX_LEVEL:
jchen10a99ed552017-09-22 08:10:32 +0800245 texture->setMaxLevel(clampCast<GLuint>(CastQueryValueTo<GLint>(pname, params[0])));
Geoff Langc1984ed2016-10-07 12:41:00 -0400246 break;
247 case GL_TEXTURE_MIN_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800248 texture->setMinLod(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400249 break;
250 case GL_TEXTURE_MAX_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800251 texture->setMaxLod(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400252 break;
Geoff Lang3b573612016-10-31 14:08:10 -0400253 case GL_DEPTH_STENCIL_TEXTURE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800254 texture->setDepthStencilTextureMode(ConvertToGLenum(pname, params[0]));
Geoff Lang3b573612016-10-31 14:08:10 -0400255 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700256 case GL_TEXTURE_SRGB_DECODE_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800257 texture->setSRGBDecode(ConvertToGLenum(pname, params[0]));
Geoff Lang81c6b572016-10-19 14:07:52 -0700258 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400259 default:
260 UNREACHABLE();
261 break;
262 }
263}
264
265template <typename ParamType>
266void QuerySamplerParameterBase(const Sampler *sampler, GLenum pname, ParamType *params)
267{
268 switch (pname)
269 {
270 case GL_TEXTURE_MIN_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800271 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getMinFilter());
Geoff Langc1984ed2016-10-07 12:41:00 -0400272 break;
273 case GL_TEXTURE_MAG_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800274 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getMagFilter());
Geoff Langc1984ed2016-10-07 12:41:00 -0400275 break;
276 case GL_TEXTURE_WRAP_S:
jchen10a99ed552017-09-22 08:10:32 +0800277 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getWrapS());
Geoff Langc1984ed2016-10-07 12:41:00 -0400278 break;
279 case GL_TEXTURE_WRAP_T:
jchen10a99ed552017-09-22 08:10:32 +0800280 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getWrapT());
Geoff Langc1984ed2016-10-07 12:41:00 -0400281 break;
282 case GL_TEXTURE_WRAP_R:
jchen10a99ed552017-09-22 08:10:32 +0800283 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getWrapR());
Geoff Langc1984ed2016-10-07 12:41:00 -0400284 break;
285 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800286 *params = CastFromStateValue<ParamType>(pname, sampler->getMaxAnisotropy());
Geoff Langc1984ed2016-10-07 12:41:00 -0400287 break;
288 case GL_TEXTURE_MIN_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800289 *params = CastFromStateValue<ParamType>(pname, sampler->getMinLod());
Geoff Langc1984ed2016-10-07 12:41:00 -0400290 break;
291 case GL_TEXTURE_MAX_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800292 *params = CastFromStateValue<ParamType>(pname, sampler->getMaxLod());
Geoff Langc1984ed2016-10-07 12:41:00 -0400293 break;
294 case GL_TEXTURE_COMPARE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800295 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getCompareMode());
Geoff Langc1984ed2016-10-07 12:41:00 -0400296 break;
297 case GL_TEXTURE_COMPARE_FUNC:
jchen10a99ed552017-09-22 08:10:32 +0800298 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getCompareFunc());
Geoff Langc1984ed2016-10-07 12:41:00 -0400299 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700300 case GL_TEXTURE_SRGB_DECODE_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800301 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getSRGBDecode());
Geoff Lang81c6b572016-10-19 14:07:52 -0700302 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400303 default:
304 UNREACHABLE();
305 break;
306 }
307}
308
309template <typename ParamType>
310void SetSamplerParameterBase(Sampler *sampler, GLenum pname, const ParamType *params)
311{
312 switch (pname)
313 {
314 case GL_TEXTURE_WRAP_S:
jchen10a99ed552017-09-22 08:10:32 +0800315 sampler->setWrapS(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400316 break;
317 case GL_TEXTURE_WRAP_T:
jchen10a99ed552017-09-22 08:10:32 +0800318 sampler->setWrapT(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400319 break;
320 case GL_TEXTURE_WRAP_R:
jchen10a99ed552017-09-22 08:10:32 +0800321 sampler->setWrapR(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400322 break;
323 case GL_TEXTURE_MIN_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800324 sampler->setMinFilter(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400325 break;
326 case GL_TEXTURE_MAG_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800327 sampler->setMagFilter(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400328 break;
329 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800330 sampler->setMaxAnisotropy(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400331 break;
332 case GL_TEXTURE_COMPARE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800333 sampler->setCompareMode(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400334 break;
335 case GL_TEXTURE_COMPARE_FUNC:
jchen10a99ed552017-09-22 08:10:32 +0800336 sampler->setCompareFunc(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400337 break;
338 case GL_TEXTURE_MIN_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800339 sampler->setMinLod(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400340 break;
341 case GL_TEXTURE_MAX_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800342 sampler->setMaxLod(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400343 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700344 case GL_TEXTURE_SRGB_DECODE_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800345 sampler->setSRGBDecode(ConvertToGLenum(pname, params[0]));
Geoff Lang81c6b572016-10-19 14:07:52 -0700346 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400347 default:
348 UNREACHABLE();
349 break;
350 }
351}
352
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800353// Warning: you should ensure binding really matches attrib.bindingIndex before using this function.
Geoff Lang0b031062016-10-13 14:30:04 -0400354template <typename ParamType, typename CurrentDataType, size_t CurrentValueCount>
355void QueryVertexAttribBase(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800356 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -0400357 const CurrentDataType (&currentValueData)[CurrentValueCount],
358 GLenum pname,
359 ParamType *params)
360{
361 switch (pname)
362 {
363 case GL_CURRENT_VERTEX_ATTRIB:
364 for (size_t i = 0; i < CurrentValueCount; ++i)
365 {
jchen10a99ed552017-09-22 08:10:32 +0800366 params[i] = CastFromStateValue<ParamType>(pname, currentValueData[i]);
Geoff Lang0b031062016-10-13 14:30:04 -0400367 }
368 break;
369 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
jchen10a99ed552017-09-22 08:10:32 +0800370 *params = CastFromStateValue<ParamType>(pname, static_cast<GLint>(attrib.enabled));
Geoff Lang0b031062016-10-13 14:30:04 -0400371 break;
372 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
jchen10a99ed552017-09-22 08:10:32 +0800373 *params = CastFromGLintStateValue<ParamType>(pname, attrib.size);
Geoff Lang0b031062016-10-13 14:30:04 -0400374 break;
375 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
jchen10a99ed552017-09-22 08:10:32 +0800376 *params = CastFromGLintStateValue<ParamType>(pname, attrib.vertexAttribArrayStride);
Geoff Lang0b031062016-10-13 14:30:04 -0400377 break;
378 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
jchen10a99ed552017-09-22 08:10:32 +0800379 *params = CastFromGLintStateValue<ParamType>(pname, attrib.type);
Geoff Lang0b031062016-10-13 14:30:04 -0400380 break;
381 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
jchen10a99ed552017-09-22 08:10:32 +0800382 *params = CastFromStateValue<ParamType>(pname, static_cast<GLint>(attrib.normalized));
Geoff Lang0b031062016-10-13 14:30:04 -0400383 break;
384 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
jchen10a99ed552017-09-22 08:10:32 +0800385 *params = CastFromGLintStateValue<ParamType>(pname, binding.getBuffer().id());
Geoff Lang0b031062016-10-13 14:30:04 -0400386 break;
387 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
jchen10a99ed552017-09-22 08:10:32 +0800388 *params = CastFromGLintStateValue<ParamType>(pname, binding.getDivisor());
Geoff Lang0b031062016-10-13 14:30:04 -0400389 break;
390 case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
jchen10a99ed552017-09-22 08:10:32 +0800391 *params = CastFromGLintStateValue<ParamType>(pname, attrib.pureInteger);
Geoff Lang0b031062016-10-13 14:30:04 -0400392 break;
Shao80957d92017-02-20 21:25:59 +0800393 case GL_VERTEX_ATTRIB_BINDING:
jchen10a99ed552017-09-22 08:10:32 +0800394 *params = CastFromGLintStateValue<ParamType>(pname, attrib.bindingIndex);
Shao80957d92017-02-20 21:25:59 +0800395 break;
396 case GL_VERTEX_ATTRIB_RELATIVE_OFFSET:
jchen10a99ed552017-09-22 08:10:32 +0800397 *params = CastFromGLintStateValue<ParamType>(pname, attrib.relativeOffset);
Shao80957d92017-02-20 21:25:59 +0800398 break;
Geoff Lang0b031062016-10-13 14:30:04 -0400399 default:
400 UNREACHABLE();
401 break;
402 }
403}
404
Geoff Langebebe1c2016-10-14 12:01:31 -0400405template <typename ParamType>
406void QueryBufferParameterBase(const Buffer *buffer, GLenum pname, ParamType *params)
407{
408 ASSERT(buffer != nullptr);
409
410 switch (pname)
411 {
412 case GL_BUFFER_USAGE:
Corentin Wallez2e568cf2017-09-18 17:05:22 -0400413 *params = CastFromGLintStateValue<ParamType>(pname, ToGLenum(buffer->getUsage()));
Geoff Langebebe1c2016-10-14 12:01:31 -0400414 break;
415 case GL_BUFFER_SIZE:
jchen10a99ed552017-09-22 08:10:32 +0800416 *params = CastFromStateValue<ParamType>(pname, buffer->getSize());
Geoff Langebebe1c2016-10-14 12:01:31 -0400417 break;
418 case GL_BUFFER_ACCESS_FLAGS:
jchen10a99ed552017-09-22 08:10:32 +0800419 *params = CastFromGLintStateValue<ParamType>(pname, buffer->getAccessFlags());
Geoff Langebebe1c2016-10-14 12:01:31 -0400420 break;
421 case GL_BUFFER_ACCESS_OES:
jchen10a99ed552017-09-22 08:10:32 +0800422 *params = CastFromGLintStateValue<ParamType>(pname, buffer->getAccess());
Geoff Langebebe1c2016-10-14 12:01:31 -0400423 break;
424 case GL_BUFFER_MAPPED:
jchen10a99ed552017-09-22 08:10:32 +0800425 *params = CastFromStateValue<ParamType>(pname, buffer->isMapped());
Geoff Langebebe1c2016-10-14 12:01:31 -0400426 break;
427 case GL_BUFFER_MAP_OFFSET:
jchen10a99ed552017-09-22 08:10:32 +0800428 *params = CastFromStateValue<ParamType>(pname, buffer->getMapOffset());
Geoff Langebebe1c2016-10-14 12:01:31 -0400429 break;
430 case GL_BUFFER_MAP_LENGTH:
jchen10a99ed552017-09-22 08:10:32 +0800431 *params = CastFromStateValue<ParamType>(pname, buffer->getMapLength());
Geoff Langebebe1c2016-10-14 12:01:31 -0400432 break;
433 default:
434 UNREACHABLE();
435 break;
436 }
437}
438
jchen10880683b2017-04-12 16:21:55 +0800439GLint GetLocationVariableProperty(const sh::VariableWithLocation &var, GLenum prop)
440{
441 switch (prop)
442 {
443 case GL_TYPE:
jchen10a99ed552017-09-22 08:10:32 +0800444 return clampCast<GLint>(var.type);
jchen10880683b2017-04-12 16:21:55 +0800445
446 case GL_ARRAY_SIZE:
447 // TODO(jie.a.chen@intel.com): check array of array.
448 if (var.isArray() && !var.isStruct())
449 {
jchen10a99ed552017-09-22 08:10:32 +0800450 return clampCast<GLint>(var.elementCount());
jchen10880683b2017-04-12 16:21:55 +0800451 }
452 return 1;
453
454 case GL_NAME_LENGTH:
455 {
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
460 case GL_LOCATION:
461 return var.location;
462
463 default:
464 UNREACHABLE();
465 return GL_INVALID_VALUE;
466 }
467}
468
469GLint GetInputResourceProperty(const Program *program, GLuint index, GLenum prop)
470{
471 const auto &attribute = program->getInputResource(index);
472 switch (prop)
473 {
474 case GL_TYPE:
475 case GL_ARRAY_SIZE:
jchen10880683b2017-04-12 16:21:55 +0800476 case GL_NAME_LENGTH:
477 return GetLocationVariableProperty(attribute, prop);
478
jchen10baf5d942017-08-28 20:45:48 +0800479 case GL_LOCATION:
480 return program->getAttributeLocation(attribute.name);
481
jchen10880683b2017-04-12 16:21:55 +0800482 case GL_REFERENCED_BY_VERTEX_SHADER:
483 return 1;
484
485 case GL_REFERENCED_BY_FRAGMENT_SHADER:
486 case GL_REFERENCED_BY_COMPUTE_SHADER:
487 return 0;
488
489 default:
490 UNREACHABLE();
491 return GL_INVALID_VALUE;
492 }
493}
494
495GLint GetOutputResourceProperty(const Program *program, GLuint index, const GLenum prop)
496{
497 const auto &outputVariable = program->getOutputResource(index);
498 switch (prop)
499 {
500 case GL_TYPE:
501 case GL_ARRAY_SIZE:
jchen10880683b2017-04-12 16:21:55 +0800502 case GL_NAME_LENGTH:
503 return GetLocationVariableProperty(outputVariable, prop);
504
jchen10baf5d942017-08-28 20:45:48 +0800505 case GL_LOCATION:
506 return program->getFragDataLocation(outputVariable.name);
507
jchen10880683b2017-04-12 16:21:55 +0800508 case GL_REFERENCED_BY_VERTEX_SHADER:
509 return 0;
510
511 case GL_REFERENCED_BY_FRAGMENT_SHADER:
512 return 1;
513
514 case GL_REFERENCED_BY_COMPUTE_SHADER:
515 return 0;
516
517 default:
518 UNREACHABLE();
519 return GL_INVALID_VALUE;
520 }
521}
522
jchen10d9cd7b72017-08-30 15:04:25 +0800523GLint QueryProgramInterfaceActiveResources(const Program *program, GLenum programInterface)
524{
525 switch (programInterface)
526 {
527 case GL_PROGRAM_INPUT:
jchen10a99ed552017-09-22 08:10:32 +0800528 return clampCast<GLint>(program->getAttributes().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800529
530 case GL_PROGRAM_OUTPUT:
jchen10a99ed552017-09-22 08:10:32 +0800531 return clampCast<GLint>(program->getState().getOutputVariables().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800532
533 case GL_UNIFORM:
jchen10a99ed552017-09-22 08:10:32 +0800534 return clampCast<GLint>(program->getState().getUniforms().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800535
536 case GL_UNIFORM_BLOCK:
jchen10a99ed552017-09-22 08:10:32 +0800537 return clampCast<GLint>(program->getState().getUniformBlocks().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800538
jchen1058f67be2017-10-27 08:59:27 +0800539 case GL_ATOMIC_COUNTER_BUFFER:
540 return clampCast<GLint>(program->getState().getAtomicCounterBuffers().size());
541
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800542 case GL_BUFFER_VARIABLE:
543 return clampCast<GLint>(program->getState().getBufferVariables().size());
544
545 case GL_SHADER_STORAGE_BLOCK:
546 return clampCast<GLint>(program->getState().getShaderStorageBlocks().size());
547
jchen10d9cd7b72017-08-30 15:04:25 +0800548 // TODO(jie.a.chen@intel.com): more interfaces.
549 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10d9cd7b72017-08-30 15:04:25 +0800550 UNIMPLEMENTED();
551 return 0;
552
553 default:
554 UNREACHABLE();
555 return 0;
556 }
557}
558
559template <typename T, typename M>
560GLint FindMaxSize(const std::vector<T> &resources, M member)
561{
562 GLint max = 0;
563 for (const T &resource : resources)
564 {
jchen10a99ed552017-09-22 08:10:32 +0800565 max = std::max(max, clampCast<GLint>((resource.*member).size()));
jchen10d9cd7b72017-08-30 15:04:25 +0800566 }
567 return max;
568}
569
570GLint QueryProgramInterfaceMaxNameLength(const Program *program, GLenum programInterface)
571{
572 GLint maxNameLength = 0;
573 switch (programInterface)
574 {
575 case GL_PROGRAM_INPUT:
576 maxNameLength = FindMaxSize(program->getAttributes(), &sh::Attribute::name);
577 break;
578
579 case GL_PROGRAM_OUTPUT:
580 maxNameLength =
581 FindMaxSize(program->getState().getOutputVariables(), &sh::OutputVariable::name);
582 break;
583
584 case GL_UNIFORM:
585 maxNameLength = FindMaxSize(program->getState().getUniforms(), &LinkedUniform::name);
586 break;
587
588 case GL_UNIFORM_BLOCK:
589 maxNameLength =
Jiajia Qin729b2c62017-08-14 09:36:11 +0800590 FindMaxSize(program->getState().getUniformBlocks(), &InterfaceBlock::name);
jchen10d9cd7b72017-08-30 15:04:25 +0800591 break;
592
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800593 case GL_BUFFER_VARIABLE:
594 maxNameLength =
595 FindMaxSize(program->getState().getBufferVariables(), &BufferVariable::name);
596 break;
597
598 case GL_SHADER_STORAGE_BLOCK:
599 maxNameLength =
600 FindMaxSize(program->getState().getShaderStorageBlocks(), &InterfaceBlock::name);
601 break;
602
jchen10d9cd7b72017-08-30 15:04:25 +0800603 // TODO(jie.a.chen@intel.com): more interfaces.
604 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10d9cd7b72017-08-30 15:04:25 +0800605 UNIMPLEMENTED();
606 return 0;
607
608 default:
609 UNREACHABLE();
610 return 0;
611 }
612 // This length includes an extra character for the null terminator.
613 return (maxNameLength == 0 ? 0 : maxNameLength + 1);
614}
615
616GLint QueryProgramInterfaceMaxNumActiveVariables(const Program *program, GLenum programInterface)
617{
618 switch (programInterface)
619 {
620 case GL_UNIFORM_BLOCK:
621 return FindMaxSize(program->getState().getUniformBlocks(),
Jiajia Qin729b2c62017-08-14 09:36:11 +0800622 &InterfaceBlock::memberIndexes);
jchen1058f67be2017-10-27 08:59:27 +0800623 case GL_ATOMIC_COUNTER_BUFFER:
624 return FindMaxSize(program->getState().getAtomicCounterBuffers(),
625 &AtomicCounterBuffer::memberIndexes);
jchen10d9cd7b72017-08-30 15:04:25 +0800626
jchen10d9cd7b72017-08-30 15:04:25 +0800627 case GL_SHADER_STORAGE_BLOCK:
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800628 return FindMaxSize(program->getState().getShaderStorageBlocks(),
629 &InterfaceBlock::memberIndexes);
jchen10d9cd7b72017-08-30 15:04:25 +0800630
631 default:
632 UNREACHABLE();
633 return 0;
634 }
635}
636
jchen10baf5d942017-08-28 20:45:48 +0800637GLenum GetUniformPropertyEnum(GLenum prop)
638{
639 switch (prop)
640 {
641 case GL_UNIFORM_TYPE:
642 return GL_TYPE;
643 case GL_UNIFORM_SIZE:
644 return GL_ARRAY_SIZE;
645 case GL_UNIFORM_NAME_LENGTH:
646 return GL_NAME_LENGTH;
647 case GL_UNIFORM_BLOCK_INDEX:
648 return GL_BLOCK_INDEX;
649 case GL_UNIFORM_OFFSET:
650 return GL_OFFSET;
651 case GL_UNIFORM_ARRAY_STRIDE:
652 return GL_ARRAY_STRIDE;
653 case GL_UNIFORM_MATRIX_STRIDE:
654 return GL_MATRIX_STRIDE;
655 case GL_UNIFORM_IS_ROW_MAJOR:
656 return GL_IS_ROW_MAJOR;
657
658 default:
659 return prop;
660 }
661}
662
jchen1058f67be2017-10-27 08:59:27 +0800663GLenum GetUniformBlockPropertyEnum(GLenum prop)
664{
665 switch (prop)
666 {
667 case GL_UNIFORM_BLOCK_BINDING:
668 return GL_BUFFER_BINDING;
669
670 case GL_UNIFORM_BLOCK_DATA_SIZE:
671 return GL_BUFFER_DATA_SIZE;
672
673 case GL_UNIFORM_BLOCK_NAME_LENGTH:
674 return GL_NAME_LENGTH;
675
676 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
677 return GL_NUM_ACTIVE_VARIABLES;
678
679 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
680 return GL_ACTIVE_VARIABLES;
681
682 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
683 return GL_REFERENCED_BY_VERTEX_SHADER;
684
685 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
686 return GL_REFERENCED_BY_FRAGMENT_SHADER;
687
688 default:
689 return prop;
690 }
691}
692
693void GetShaderVariableBufferResourceProperty(const ShaderVariableBuffer &buffer,
694 GLenum pname,
695 GLint *params,
696 GLsizei bufSize,
697 GLsizei *outputPosition)
698
699{
700 switch (pname)
701 {
702 case GL_BUFFER_BINDING:
703 params[(*outputPosition)++] = buffer.binding;
704 break;
705 case GL_BUFFER_DATA_SIZE:
706 params[(*outputPosition)++] = clampCast<GLint>(buffer.dataSize);
707 break;
708 case GL_NUM_ACTIVE_VARIABLES:
709 params[(*outputPosition)++] = buffer.numActiveVariables();
710 break;
711 case GL_ACTIVE_VARIABLES:
712 for (size_t memberIndex = 0;
713 memberIndex < buffer.memberIndexes.size() && *outputPosition < bufSize;
714 ++memberIndex)
715 {
716 params[(*outputPosition)++] = clampCast<GLint>(buffer.memberIndexes[memberIndex]);
717 }
718 break;
719 case GL_REFERENCED_BY_VERTEX_SHADER:
720 params[(*outputPosition)++] = static_cast<GLint>(buffer.vertexStaticUse);
721 break;
722 case GL_REFERENCED_BY_FRAGMENT_SHADER:
723 params[(*outputPosition)++] = static_cast<GLint>(buffer.fragmentStaticUse);
724 break;
725 case GL_REFERENCED_BY_COMPUTE_SHADER:
726 params[(*outputPosition)++] = static_cast<GLint>(buffer.computeStaticUse);
727 break;
728 default:
729 UNREACHABLE();
730 break;
731 }
732}
733
734void GetInterfaceBlockResourceProperty(const InterfaceBlock &block,
735 GLenum pname,
736 GLint *params,
737 GLsizei bufSize,
738 GLsizei *outputPosition)
739{
740 if (pname == GL_NAME_LENGTH)
741 {
742 params[(*outputPosition)++] = clampCast<GLint>(block.nameWithArrayIndex().size() + 1);
743 return;
744 }
745 GetShaderVariableBufferResourceProperty(block, pname, params, bufSize, outputPosition);
746}
747
748void GetUniformBlockResourceProperty(const Program *program,
749 GLuint blockIndex,
750 GLenum pname,
751 GLint *params,
752 GLsizei bufSize,
753 GLsizei *outputPosition)
754
755{
756 ASSERT(*outputPosition < bufSize);
757 const auto &block = program->getUniformBlockByIndex(blockIndex);
758 GetInterfaceBlockResourceProperty(block, pname, params, bufSize, outputPosition);
759}
760
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800761void GetShaderStorageBlockResourceProperty(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->getShaderStorageBlockByIndex(blockIndex);
771 GetInterfaceBlockResourceProperty(block, pname, params, bufSize, outputPosition);
772}
773
jchen1058f67be2017-10-27 08:59:27 +0800774void GetAtomicCounterBufferResourceProperty(const Program *program,
775 GLuint index,
776 GLenum pname,
777 GLint *params,
778 GLsizei bufSize,
779 GLsizei *outputPosition)
780
781{
782 ASSERT(*outputPosition < bufSize);
783 const auto &buffer = program->getState().getAtomicCounterBuffers()[index];
784 GetShaderVariableBufferResourceProperty(buffer, pname, params, bufSize, outputPosition);
785}
786
Geoff Langc1984ed2016-10-07 12:41:00 -0400787} // anonymous namespace
788
Geoff Langff5b2d52016-09-07 11:32:23 -0400789void QueryFramebufferAttachmentParameteriv(const Framebuffer *framebuffer,
790 GLenum attachment,
791 GLenum pname,
792 GLint *params)
793{
794 ASSERT(framebuffer);
795
796 const FramebufferAttachment *attachmentObject = framebuffer->getAttachment(attachment);
797 if (attachmentObject == nullptr)
798 {
799 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
800 // is NONE, then querying any other pname will generate INVALID_ENUM.
801
802 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
803 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
804 // INVALID_OPERATION for all other pnames
805
806 switch (pname)
807 {
808 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
809 *params = GL_NONE;
810 break;
811
812 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
813 *params = 0;
814 break;
815
816 default:
817 UNREACHABLE();
818 break;
819 }
820
821 return;
822 }
823
824 switch (pname)
825 {
826 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
827 *params = attachmentObject->type();
828 break;
829
830 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
831 *params = attachmentObject->id();
832 break;
833
834 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
835 *params = attachmentObject->mipLevel();
836 break;
837
838 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
839 *params = attachmentObject->cubeMapFace();
840 break;
841
842 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
843 *params = attachmentObject->getRedSize();
844 break;
845
846 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
847 *params = attachmentObject->getGreenSize();
848 break;
849
850 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
851 *params = attachmentObject->getBlueSize();
852 break;
853
854 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
855 *params = attachmentObject->getAlphaSize();
856 break;
857
858 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
859 *params = attachmentObject->getDepthSize();
860 break;
861
862 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
863 *params = attachmentObject->getStencilSize();
864 break;
865
866 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
867 *params = attachmentObject->getComponentType();
868 break;
869
870 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
871 *params = attachmentObject->getColorEncoding();
872 break;
873
874 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
875 *params = attachmentObject->layer();
876 break;
877
Martin Radeve5285d22017-07-14 16:23:53 +0300878 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_ANGLE:
879 *params = attachmentObject->getNumViews();
880 break;
881
882 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_MULTIVIEW_LAYOUT_ANGLE:
883 *params = static_cast<GLint>(attachmentObject->getMultiviewLayout());
884 break;
885
886 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_ANGLE:
887 *params = attachmentObject->getBaseViewIndex();
888 break;
889
890 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_VIEWPORT_OFFSETS_ANGLE:
891 {
892 const std::vector<Offset> &offsets = attachmentObject->getMultiviewViewportOffsets();
893 for (size_t i = 0u; i < offsets.size(); ++i)
894 {
895 params[i * 2u] = offsets[i].x;
896 params[i * 2u + 1u] = offsets[i].y;
897 }
898 }
899 break;
900
Geoff Langff5b2d52016-09-07 11:32:23 -0400901 default:
902 UNREACHABLE();
903 break;
904 }
905}
906
907void QueryBufferParameteriv(const Buffer *buffer, GLenum pname, GLint *params)
908{
Geoff Langebebe1c2016-10-14 12:01:31 -0400909 QueryBufferParameterBase(buffer, pname, params);
910}
Geoff Langff5b2d52016-09-07 11:32:23 -0400911
Geoff Langebebe1c2016-10-14 12:01:31 -0400912void QueryBufferParameteri64v(const Buffer *buffer, GLenum pname, GLint64 *params)
913{
914 QueryBufferParameterBase(buffer, pname, params);
Geoff Langff5b2d52016-09-07 11:32:23 -0400915}
916
Geoff Lang496c02d2016-10-20 11:38:11 -0700917void QueryBufferPointerv(const Buffer *buffer, GLenum pname, void **params)
918{
919 switch (pname)
920 {
921 case GL_BUFFER_MAP_POINTER:
922 *params = buffer->getMapPointer();
923 break;
924
925 default:
926 UNREACHABLE();
927 break;
928 }
929}
930
Jamie Madillffe00c02017-06-27 16:26:55 -0400931void QueryProgramiv(const Context *context, const Program *program, GLenum pname, GLint *params)
Geoff Langff5b2d52016-09-07 11:32:23 -0400932{
933 ASSERT(program != nullptr);
934
935 switch (pname)
936 {
937 case GL_DELETE_STATUS:
938 *params = program->isFlaggedForDeletion();
939 return;
940 case GL_LINK_STATUS:
941 *params = program->isLinked();
942 return;
943 case GL_VALIDATE_STATUS:
944 *params = program->isValidated();
945 return;
946 case GL_INFO_LOG_LENGTH:
947 *params = program->getInfoLogLength();
948 return;
949 case GL_ATTACHED_SHADERS:
950 *params = program->getAttachedShadersCount();
951 return;
952 case GL_ACTIVE_ATTRIBUTES:
953 *params = program->getActiveAttributeCount();
954 return;
955 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
956 *params = program->getActiveAttributeMaxLength();
957 return;
958 case GL_ACTIVE_UNIFORMS:
959 *params = program->getActiveUniformCount();
960 return;
961 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
962 *params = program->getActiveUniformMaxLength();
963 return;
964 case GL_PROGRAM_BINARY_LENGTH_OES:
Jamie Madillffe00c02017-06-27 16:26:55 -0400965 *params = program->getBinaryLength(context);
Geoff Langff5b2d52016-09-07 11:32:23 -0400966 return;
967 case GL_ACTIVE_UNIFORM_BLOCKS:
968 *params = program->getActiveUniformBlockCount();
969 return;
970 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
971 *params = program->getActiveUniformBlockMaxLength();
972 break;
973 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
974 *params = program->getTransformFeedbackBufferMode();
975 break;
976 case GL_TRANSFORM_FEEDBACK_VARYINGS:
977 *params = program->getTransformFeedbackVaryingCount();
978 break;
979 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
980 *params = program->getTransformFeedbackVaryingMaxLength();
981 break;
982 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
983 *params = program->getBinaryRetrievableHint();
984 break;
Yunchao He61afff12017-03-14 15:34:03 +0800985 case GL_PROGRAM_SEPARABLE:
986 *params = program->isSeparable();
987 break;
Xinghua Cao971f8502017-10-17 13:01:24 +0800988 case GL_COMPUTE_WORK_GROUP_SIZE:
989 {
990 const sh::WorkGroupSize &localSize = program->getComputeShaderLocalSize();
991 params[0] = localSize[0];
992 params[1] = localSize[1];
993 params[2] = localSize[2];
994 }
995 break;
jchen1058f67be2017-10-27 08:59:27 +0800996 case GL_ACTIVE_ATOMIC_COUNTER_BUFFERS:
997 *params = program->getActiveAtomicCounterBufferCount();
998 break;
Geoff Langff5b2d52016-09-07 11:32:23 -0400999 default:
1000 UNREACHABLE();
1001 break;
1002 }
1003}
Geoff Lang740d9022016-10-07 11:20:52 -04001004
Jamie Madill4e0e6f82017-02-17 11:06:03 -05001005void QueryRenderbufferiv(const Context *context,
1006 const Renderbuffer *renderbuffer,
1007 GLenum pname,
1008 GLint *params)
Geoff Lang740d9022016-10-07 11:20:52 -04001009{
1010 ASSERT(renderbuffer != nullptr);
1011
1012 switch (pname)
1013 {
1014 case GL_RENDERBUFFER_WIDTH:
1015 *params = renderbuffer->getWidth();
1016 break;
1017 case GL_RENDERBUFFER_HEIGHT:
1018 *params = renderbuffer->getHeight();
1019 break;
1020 case GL_RENDERBUFFER_INTERNAL_FORMAT:
Jamie Madill4e0e6f82017-02-17 11:06:03 -05001021 // Special case the WebGL 1 DEPTH_STENCIL format.
Jamie Madilla02315b2017-02-23 14:14:47 -05001022 if (context->isWebGL1() &&
Jamie Madill4e0e6f82017-02-17 11:06:03 -05001023 renderbuffer->getFormat().info->internalFormat == GL_DEPTH24_STENCIL8)
1024 {
1025 *params = GL_DEPTH_STENCIL;
1026 }
1027 else
1028 {
1029 *params = renderbuffer->getFormat().info->internalFormat;
1030 }
Geoff Lang740d9022016-10-07 11:20:52 -04001031 break;
1032 case GL_RENDERBUFFER_RED_SIZE:
1033 *params = renderbuffer->getRedSize();
1034 break;
1035 case GL_RENDERBUFFER_GREEN_SIZE:
1036 *params = renderbuffer->getGreenSize();
1037 break;
1038 case GL_RENDERBUFFER_BLUE_SIZE:
1039 *params = renderbuffer->getBlueSize();
1040 break;
1041 case GL_RENDERBUFFER_ALPHA_SIZE:
1042 *params = renderbuffer->getAlphaSize();
1043 break;
1044 case GL_RENDERBUFFER_DEPTH_SIZE:
1045 *params = renderbuffer->getDepthSize();
1046 break;
1047 case GL_RENDERBUFFER_STENCIL_SIZE:
1048 *params = renderbuffer->getStencilSize();
1049 break;
1050 case GL_RENDERBUFFER_SAMPLES_ANGLE:
1051 *params = renderbuffer->getSamples();
1052 break;
1053 default:
1054 UNREACHABLE();
1055 break;
1056 }
1057}
Geoff Langd7d0ed32016-10-07 11:33:51 -04001058
Jamie Madillbd044ed2017-06-05 12:59:21 -04001059void QueryShaderiv(const Context *context, Shader *shader, GLenum pname, GLint *params)
Geoff Langd7d0ed32016-10-07 11:33:51 -04001060{
1061 ASSERT(shader != nullptr);
1062
1063 switch (pname)
1064 {
1065 case GL_SHADER_TYPE:
1066 *params = shader->getType();
1067 return;
1068 case GL_DELETE_STATUS:
1069 *params = shader->isFlaggedForDeletion();
1070 return;
1071 case GL_COMPILE_STATUS:
Jamie Madillbd044ed2017-06-05 12:59:21 -04001072 *params = shader->isCompiled(context) ? GL_TRUE : GL_FALSE;
Geoff Langd7d0ed32016-10-07 11:33:51 -04001073 return;
1074 case GL_INFO_LOG_LENGTH:
Jamie Madillbd044ed2017-06-05 12:59:21 -04001075 *params = shader->getInfoLogLength(context);
Geoff Langd7d0ed32016-10-07 11:33:51 -04001076 return;
1077 case GL_SHADER_SOURCE_LENGTH:
1078 *params = shader->getSourceLength();
1079 return;
1080 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
Jamie Madillbd044ed2017-06-05 12:59:21 -04001081 *params = shader->getTranslatedSourceWithDebugInfoLength(context);
Geoff Langd7d0ed32016-10-07 11:33:51 -04001082 return;
1083 default:
1084 UNREACHABLE();
1085 break;
1086 }
1087}
Geoff Langc1984ed2016-10-07 12:41:00 -04001088
He Yunchao11b038b2016-11-22 21:24:04 +08001089void QueryTexLevelParameterfv(const Texture *texture,
1090 GLenum target,
1091 GLint level,
1092 GLenum pname,
1093 GLfloat *params)
1094{
1095 QueryTexLevelParameterBase(texture, target, level, pname, params);
1096}
1097
1098void QueryTexLevelParameteriv(const Texture *texture,
1099 GLenum target,
1100 GLint level,
1101 GLenum pname,
1102 GLint *params)
1103{
1104 QueryTexLevelParameterBase(texture, target, level, pname, params);
1105}
1106
Geoff Langc1984ed2016-10-07 12:41:00 -04001107void QueryTexParameterfv(const Texture *texture, GLenum pname, GLfloat *params)
1108{
1109 QueryTexParameterBase(texture, pname, params);
1110}
1111
1112void QueryTexParameteriv(const Texture *texture, GLenum pname, GLint *params)
1113{
1114 QueryTexParameterBase(texture, pname, params);
1115}
1116
1117void QuerySamplerParameterfv(const Sampler *sampler, GLenum pname, GLfloat *params)
1118{
1119 QuerySamplerParameterBase(sampler, pname, params);
1120}
1121
1122void QuerySamplerParameteriv(const Sampler *sampler, GLenum pname, GLint *params)
1123{
1124 QuerySamplerParameterBase(sampler, pname, params);
1125}
1126
Geoff Lang0b031062016-10-13 14:30:04 -04001127void QueryVertexAttribfv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001128 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001129 const VertexAttribCurrentValueData &currentValueData,
1130 GLenum pname,
1131 GLfloat *params)
1132{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001133 QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001134}
1135
1136void QueryVertexAttribiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001137 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001138 const VertexAttribCurrentValueData &currentValueData,
1139 GLenum pname,
1140 GLint *params)
1141{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001142 QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001143}
1144
Jamie Madill876429b2017-04-20 15:46:24 -04001145void QueryVertexAttribPointerv(const VertexAttribute &attrib, GLenum pname, void **pointer)
Geoff Lang0b031062016-10-13 14:30:04 -04001146{
1147 switch (pname)
1148 {
1149 case GL_VERTEX_ATTRIB_ARRAY_POINTER:
Jamie Madill876429b2017-04-20 15:46:24 -04001150 *pointer = const_cast<void *>(attrib.pointer);
Geoff Lang0b031062016-10-13 14:30:04 -04001151 break;
1152
1153 default:
1154 UNREACHABLE();
1155 break;
1156 }
1157}
1158
1159void QueryVertexAttribIiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001160 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001161 const VertexAttribCurrentValueData &currentValueData,
1162 GLenum pname,
1163 GLint *params)
1164{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001165 QueryVertexAttribBase(attrib, binding, currentValueData.IntValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001166}
1167
1168void QueryVertexAttribIuiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001169 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001170 const VertexAttribCurrentValueData &currentValueData,
1171 GLenum pname,
1172 GLuint *params)
1173{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001174 QueryVertexAttribBase(attrib, binding, currentValueData.UnsignedIntValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001175}
1176
Geoff Lang6899b872016-10-14 11:30:13 -04001177void QueryActiveUniformBlockiv(const Program *program,
1178 GLuint uniformBlockIndex,
1179 GLenum pname,
1180 GLint *params)
1181{
jchen1058f67be2017-10-27 08:59:27 +08001182 GLenum prop = GetUniformBlockPropertyEnum(pname);
1183 QueryProgramResourceiv(program, GL_UNIFORM_BLOCK, uniformBlockIndex, 1, &prop,
1184 std::numeric_limits<GLsizei>::max(), nullptr, params);
Geoff Lang6899b872016-10-14 11:30:13 -04001185}
1186
Geoff Lang0a9661f2016-10-20 10:59:20 -07001187void QueryInternalFormativ(const TextureCaps &format, GLenum pname, GLsizei bufSize, GLint *params)
1188{
1189 switch (pname)
1190 {
1191 case GL_NUM_SAMPLE_COUNTS:
1192 if (bufSize != 0)
1193 {
jchen10a99ed552017-09-22 08:10:32 +08001194 *params = clampCast<GLint>(format.sampleCounts.size());
Geoff Lang0a9661f2016-10-20 10:59:20 -07001195 }
1196 break;
1197
1198 case GL_SAMPLES:
1199 {
1200 size_t returnCount = std::min<size_t>(bufSize, format.sampleCounts.size());
1201 auto sampleReverseIt = format.sampleCounts.rbegin();
1202 for (size_t sampleIndex = 0; sampleIndex < returnCount; ++sampleIndex)
1203 {
1204 params[sampleIndex] = *sampleReverseIt++;
1205 }
1206 }
1207 break;
1208
1209 default:
1210 UNREACHABLE();
1211 break;
1212 }
1213}
1214
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001215void QueryFramebufferParameteriv(const Framebuffer *framebuffer, GLenum pname, GLint *params)
1216{
1217 ASSERT(framebuffer);
1218
1219 switch (pname)
1220 {
1221 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
1222 *params = framebuffer->getDefaultWidth();
1223 break;
1224 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
1225 *params = framebuffer->getDefaultHeight();
1226 break;
1227 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
1228 *params = framebuffer->getDefaultSamples();
1229 break;
1230 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
Geoff Lang92019432017-11-20 13:09:34 -05001231 *params = ConvertToGLBoolean(framebuffer->getDefaultFixedSampleLocations());
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001232 break;
1233 default:
1234 UNREACHABLE();
1235 break;
1236 }
1237}
1238
Jamie Madill70b5bb02017-08-28 13:32:37 -04001239Error QuerySynciv(const Sync *sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001240{
1241 ASSERT(sync);
1242
Geoff Lang82483b92017-04-11 15:33:00 -04001243 // All queries return one value, exit early if the buffer can't fit anything.
1244 if (bufSize < 1)
1245 {
1246 if (length != nullptr)
1247 {
1248 *length = 0;
1249 }
1250 return NoError();
1251 }
1252
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001253 switch (pname)
1254 {
1255 case GL_OBJECT_TYPE:
jchen10a99ed552017-09-22 08:10:32 +08001256 *values = clampCast<GLint>(GL_SYNC_FENCE);
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001257 break;
1258 case GL_SYNC_CONDITION:
jchen10a99ed552017-09-22 08:10:32 +08001259 *values = clampCast<GLint>(sync->getCondition());
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001260 break;
1261 case GL_SYNC_FLAGS:
jchen10a99ed552017-09-22 08:10:32 +08001262 *values = clampCast<GLint>(sync->getFlags());
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001263 break;
1264 case GL_SYNC_STATUS:
1265 ANGLE_TRY(sync->getStatus(values));
1266 break;
1267
1268 default:
1269 UNREACHABLE();
1270 break;
1271 }
1272
Geoff Lang82483b92017-04-11 15:33:00 -04001273 if (length != nullptr)
1274 {
1275 *length = 1;
1276 }
1277
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001278 return NoError();
1279}
1280
Jamie Madill4928b7c2017-06-20 12:57:39 -04001281void SetTexParameterf(Context *context, Texture *texture, GLenum pname, GLfloat param)
Geoff Langc1984ed2016-10-07 12:41:00 -04001282{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001283 SetTexParameterBase(context, texture, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -04001284}
1285
Jamie Madill4928b7c2017-06-20 12:57:39 -04001286void SetTexParameterfv(Context *context, Texture *texture, GLenum pname, const GLfloat *params)
Geoff Langc1984ed2016-10-07 12:41:00 -04001287{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001288 SetTexParameterBase(context, texture, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001289}
1290
Jamie Madill4928b7c2017-06-20 12:57:39 -04001291void SetTexParameteri(Context *context, Texture *texture, GLenum pname, GLint param)
Geoff Langc1984ed2016-10-07 12:41:00 -04001292{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001293 SetTexParameterBase(context, texture, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -04001294}
1295
Jamie Madill4928b7c2017-06-20 12:57:39 -04001296void SetTexParameteriv(Context *context, Texture *texture, GLenum pname, const GLint *params)
Geoff Langc1984ed2016-10-07 12:41:00 -04001297{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001298 SetTexParameterBase(context, texture, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001299}
1300
1301void SetSamplerParameterf(Sampler *sampler, GLenum pname, GLfloat param)
1302{
1303 SetSamplerParameterBase(sampler, pname, &param);
1304}
1305
1306void SetSamplerParameterfv(Sampler *sampler, GLenum pname, const GLfloat *params)
1307{
1308 SetSamplerParameterBase(sampler, pname, params);
1309}
1310
1311void SetSamplerParameteri(Sampler *sampler, GLenum pname, GLint param)
1312{
1313 SetSamplerParameterBase(sampler, pname, &param);
1314}
1315
1316void SetSamplerParameteriv(Sampler *sampler, GLenum pname, const GLint *params)
1317{
1318 SetSamplerParameterBase(sampler, pname, params);
1319}
Geoff Lang65603eb2017-01-12 16:48:03 -05001320
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001321void SetFramebufferParameteri(Framebuffer *framebuffer, GLenum pname, GLint param)
1322{
1323 ASSERT(framebuffer);
1324
1325 switch (pname)
1326 {
1327 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
1328 framebuffer->setDefaultWidth(param);
1329 break;
1330 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
1331 framebuffer->setDefaultHeight(param);
1332 break;
1333 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
1334 framebuffer->setDefaultSamples(param);
1335 break;
1336 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
jchen10a99ed552017-09-22 08:10:32 +08001337 framebuffer->setDefaultFixedSampleLocations(CastQueryValueTo<GLboolean>(pname, param));
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001338 break;
1339 default:
1340 UNREACHABLE();
1341 break;
1342 }
1343}
1344
Yunchao He61afff12017-03-14 15:34:03 +08001345void SetProgramParameteri(Program *program, GLenum pname, GLint value)
1346{
1347 ASSERT(program);
1348
1349 switch (pname)
1350 {
1351 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
Geoff Lang92019432017-11-20 13:09:34 -05001352 program->setBinaryRetrievableHint(ConvertToBool(value));
Yunchao He61afff12017-03-14 15:34:03 +08001353 break;
1354 case GL_PROGRAM_SEPARABLE:
Geoff Lang92019432017-11-20 13:09:34 -05001355 program->setSeparable(ConvertToBool(value));
Yunchao He61afff12017-03-14 15:34:03 +08001356 break;
1357 default:
1358 UNREACHABLE();
1359 break;
1360 }
1361}
1362
jchen10baf5d942017-08-28 20:45:48 +08001363GLint GetUniformResourceProperty(const Program *program, GLuint index, const GLenum prop)
1364{
1365 const auto &uniform = program->getUniformByIndex(index);
1366 GLenum resourceProp = GetUniformPropertyEnum(prop);
1367 switch (resourceProp)
1368 {
1369 case GL_TYPE:
1370 case GL_ARRAY_SIZE:
1371 case GL_NAME_LENGTH:
1372 return GetLocationVariableProperty(uniform, resourceProp);
1373
1374 case GL_LOCATION:
1375 return program->getUniformLocation(uniform.name);
1376
1377 case GL_BLOCK_INDEX:
1378 return (uniform.isAtomicCounter() ? -1 : uniform.bufferIndex);
1379
1380 case GL_OFFSET:
1381 return uniform.blockInfo.offset;
1382
1383 case GL_ARRAY_STRIDE:
1384 return uniform.blockInfo.arrayStride;
1385
1386 case GL_MATRIX_STRIDE:
1387 return uniform.blockInfo.matrixStride;
1388
1389 case GL_IS_ROW_MAJOR:
1390 return static_cast<GLint>(uniform.blockInfo.isRowMajorMatrix);
1391
1392 case GL_REFERENCED_BY_VERTEX_SHADER:
1393 return uniform.vertexStaticUse;
1394
1395 case GL_REFERENCED_BY_FRAGMENT_SHADER:
1396 return uniform.fragmentStaticUse;
1397
1398 case GL_REFERENCED_BY_COMPUTE_SHADER:
1399 return uniform.computeStaticUse;
1400
1401 case GL_ATOMIC_COUNTER_BUFFER_INDEX:
1402 return (uniform.isAtomicCounter() ? uniform.bufferIndex : -1);
1403
1404 default:
1405 UNREACHABLE();
1406 return 0;
1407 }
1408}
1409
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001410GLint GetBufferVariableResourceProperty(const Program *program, GLuint index, const GLenum prop)
1411{
1412 const auto &bufferVariable = program->getBufferVariableByIndex(index);
1413 switch (prop)
1414 {
1415 case GL_TYPE:
1416 return clampCast<GLint>(bufferVariable.type);
1417
1418 case GL_ARRAY_SIZE:
1419 return clampCast<GLint>(bufferVariable.elementCount());
1420
1421 case GL_BLOCK_INDEX:
1422 return bufferVariable.bufferIndex;
1423
1424 case GL_NAME_LENGTH:
1425 // ES31 spec p84: This counts the terminating null char.
1426 return clampCast<GLint>(bufferVariable.name.size() + 1u);
1427
1428 case GL_OFFSET:
1429 return bufferVariable.blockInfo.offset;
1430
1431 case GL_ARRAY_STRIDE:
1432 return bufferVariable.blockInfo.arrayStride;
1433
1434 case GL_MATRIX_STRIDE:
1435 return bufferVariable.blockInfo.matrixStride;
1436
1437 case GL_IS_ROW_MAJOR:
1438 return static_cast<GLint>(bufferVariable.blockInfo.isRowMajorMatrix);
1439
1440 case GL_REFERENCED_BY_VERTEX_SHADER:
1441 return bufferVariable.vertexStaticUse;
1442
1443 case GL_REFERENCED_BY_FRAGMENT_SHADER:
1444 return bufferVariable.fragmentStaticUse;
1445
1446 case GL_REFERENCED_BY_COMPUTE_SHADER:
1447 return bufferVariable.computeStaticUse;
1448
1449 case GL_TOP_LEVEL_ARRAY_SIZE:
1450 return bufferVariable.topLevelArraySize;
1451
1452 case GL_TOP_LEVEL_ARRAY_STRIDE:
1453 return bufferVariable.blockInfo.topLevelArrayStride;
1454
1455 default:
1456 UNREACHABLE();
1457 return 0;
1458 }
1459}
1460
jchen1015015f72017-03-16 13:54:21 +08001461GLuint QueryProgramResourceIndex(const Program *program,
1462 GLenum programInterface,
1463 const GLchar *name)
1464{
1465 switch (programInterface)
1466 {
1467 case GL_PROGRAM_INPUT:
1468 return program->getInputResourceIndex(name);
1469
1470 case GL_PROGRAM_OUTPUT:
1471 return program->getOutputResourceIndex(name);
1472
jchen1015015f72017-03-16 13:54:21 +08001473 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001474 return program->getState().getUniformIndexFromName(name);
1475
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001476 case GL_BUFFER_VARIABLE:
1477 return program->getState().getBufferVariableIndexFromName(name);
1478
1479 case GL_SHADER_STORAGE_BLOCK:
1480 return program->getShaderStorageBlockIndex(name);
1481
jchen1015015f72017-03-16 13:54:21 +08001482 case GL_UNIFORM_BLOCK:
jchen1058f67be2017-10-27 08:59:27 +08001483 return program->getUniformBlockIndex(name);
1484
1485 // TODO(jie.a.chen@intel.com): more interfaces.
jchen1015015f72017-03-16 13:54:21 +08001486 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen1015015f72017-03-16 13:54:21 +08001487 UNIMPLEMENTED();
1488 return GL_INVALID_INDEX;
1489
1490 default:
1491 UNREACHABLE();
1492 return GL_INVALID_INDEX;
1493 }
1494}
1495
jchen10fd7c3b52017-03-21 15:36:03 +08001496void QueryProgramResourceName(const Program *program,
1497 GLenum programInterface,
1498 GLuint index,
1499 GLsizei bufSize,
1500 GLsizei *length,
1501 GLchar *name)
1502{
1503 switch (programInterface)
1504 {
1505 case GL_PROGRAM_INPUT:
1506 program->getInputResourceName(index, bufSize, length, name);
1507 break;
1508
1509 case GL_PROGRAM_OUTPUT:
1510 program->getOutputResourceName(index, bufSize, length, name);
1511 break;
1512
jchen10fd7c3b52017-03-21 15:36:03 +08001513 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001514 program->getUniformResourceName(index, bufSize, length, name);
1515 break;
1516
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001517 case GL_BUFFER_VARIABLE:
1518 program->getBufferVariableResourceName(index, bufSize, length, name);
1519 break;
1520
1521 case GL_SHADER_STORAGE_BLOCK:
1522 program->getActiveShaderStorageBlockName(index, bufSize, length, name);
1523 break;
1524
jchen10fd7c3b52017-03-21 15:36:03 +08001525 case GL_UNIFORM_BLOCK:
jchen1058f67be2017-10-27 08:59:27 +08001526 program->getActiveUniformBlockName(index, bufSize, length, name);
1527 break;
1528
1529 // TODO(jie.a.chen@intel.com): more interfaces.
jchen10fd7c3b52017-03-21 15:36:03 +08001530 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10fd7c3b52017-03-21 15:36:03 +08001531 UNIMPLEMENTED();
1532 break;
1533
1534 default:
1535 UNREACHABLE();
1536 }
1537}
1538
jchen10191381f2017-04-11 13:59:04 +08001539GLint QueryProgramResourceLocation(const Program *program,
1540 GLenum programInterface,
1541 const GLchar *name)
1542{
1543 switch (programInterface)
1544 {
1545 case GL_PROGRAM_INPUT:
1546 return program->getAttributeLocation(name);
1547
1548 case GL_PROGRAM_OUTPUT:
1549 return program->getFragDataLocation(name);
1550
jchen10191381f2017-04-11 13:59:04 +08001551 case GL_UNIFORM:
Olli Etuahod2551232017-10-26 20:03:33 +03001552 return program->getUniformLocation(name);
jchen10baf5d942017-08-28 20:45:48 +08001553
jchen10191381f2017-04-11 13:59:04 +08001554 default:
1555 UNREACHABLE();
1556 return -1;
1557 }
1558}
1559
jchen10880683b2017-04-12 16:21:55 +08001560void QueryProgramResourceiv(const Program *program,
1561 GLenum programInterface,
1562 GLuint index,
1563 GLsizei propCount,
1564 const GLenum *props,
1565 GLsizei bufSize,
1566 GLsizei *length,
1567 GLint *params)
1568{
1569 if (!program->isLinked())
1570 {
1571 if (length != nullptr)
1572 {
1573 *length = 0;
1574 }
1575 return;
1576 }
1577
jchen1058f67be2017-10-27 08:59:27 +08001578 GLsizei pos = 0;
1579 for (GLsizei i = 0; i < propCount; i++)
jchen10880683b2017-04-12 16:21:55 +08001580 {
1581 switch (programInterface)
1582 {
1583 case GL_PROGRAM_INPUT:
1584 params[i] = GetInputResourceProperty(program, index, props[i]);
jchen1058f67be2017-10-27 08:59:27 +08001585 ++pos;
jchen10880683b2017-04-12 16:21:55 +08001586 break;
1587
1588 case GL_PROGRAM_OUTPUT:
1589 params[i] = GetOutputResourceProperty(program, index, props[i]);
jchen1058f67be2017-10-27 08:59:27 +08001590 ++pos;
jchen10880683b2017-04-12 16:21:55 +08001591 break;
1592
jchen10880683b2017-04-12 16:21:55 +08001593 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001594 params[i] = GetUniformResourceProperty(program, index, props[i]);
jchen1058f67be2017-10-27 08:59:27 +08001595 ++pos;
1596 break;
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001597
1598 case GL_BUFFER_VARIABLE:
1599 params[i] = GetBufferVariableResourceProperty(program, index, props[i]);
1600 ++pos;
1601 break;
1602
jchen1058f67be2017-10-27 08:59:27 +08001603 case GL_UNIFORM_BLOCK:
1604 GetUniformBlockResourceProperty(program, index, props[i], params, bufSize, &pos);
jchen10baf5d942017-08-28 20:45:48 +08001605 break;
1606
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001607 case GL_SHADER_STORAGE_BLOCK:
1608 GetShaderStorageBlockResourceProperty(program, index, props[i], params, bufSize,
1609 &pos);
1610 break;
1611
jchen1058f67be2017-10-27 08:59:27 +08001612 case GL_ATOMIC_COUNTER_BUFFER:
1613 GetAtomicCounterBufferResourceProperty(program, index, props[i], params, bufSize,
1614 &pos);
1615 break;
jchen10baf5d942017-08-28 20:45:48 +08001616 // TODO(jie.a.chen@intel.com): more interfaces.
jchen10880683b2017-04-12 16:21:55 +08001617 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10880683b2017-04-12 16:21:55 +08001618 UNIMPLEMENTED();
1619 params[i] = GL_INVALID_VALUE;
1620 break;
1621
1622 default:
1623 UNREACHABLE();
1624 params[i] = GL_INVALID_VALUE;
1625 }
jchen1058f67be2017-10-27 08:59:27 +08001626 if (pos == bufSize)
1627 {
1628 // Most properties return one value, but GL_ACTIVE_VARIABLES returns an array of values.
1629 // This checks not to break buffer bounds for such case.
1630 break;
1631 }
1632 }
1633
1634 if (length != nullptr)
1635 {
1636 *length = pos;
jchen10880683b2017-04-12 16:21:55 +08001637 }
1638}
1639
jchen10d9cd7b72017-08-30 15:04:25 +08001640void QueryProgramInterfaceiv(const Program *program,
1641 GLenum programInterface,
1642 GLenum pname,
1643 GLint *params)
1644{
1645 switch (pname)
1646 {
1647 case GL_ACTIVE_RESOURCES:
1648 *params = QueryProgramInterfaceActiveResources(program, programInterface);
1649 break;
1650
1651 case GL_MAX_NAME_LENGTH:
1652 *params = QueryProgramInterfaceMaxNameLength(program, programInterface);
1653 break;
1654
1655 case GL_MAX_NUM_ACTIVE_VARIABLES:
1656 *params = QueryProgramInterfaceMaxNumActiveVariables(program, programInterface);
1657 break;
1658
1659 default:
1660 UNREACHABLE();
1661 }
1662}
1663
Geoff Lang65603eb2017-01-12 16:48:03 -05001664} // namespace gl
1665
1666namespace egl
1667{
1668
1669void QueryConfigAttrib(const Config *config, EGLint attribute, EGLint *value)
1670{
1671 ASSERT(config != nullptr);
1672 switch (attribute)
1673 {
1674 case EGL_BUFFER_SIZE:
1675 *value = config->bufferSize;
1676 break;
1677 case EGL_ALPHA_SIZE:
1678 *value = config->alphaSize;
1679 break;
1680 case EGL_BLUE_SIZE:
1681 *value = config->blueSize;
1682 break;
1683 case EGL_GREEN_SIZE:
1684 *value = config->greenSize;
1685 break;
1686 case EGL_RED_SIZE:
1687 *value = config->redSize;
1688 break;
1689 case EGL_DEPTH_SIZE:
1690 *value = config->depthSize;
1691 break;
1692 case EGL_STENCIL_SIZE:
1693 *value = config->stencilSize;
1694 break;
1695 case EGL_CONFIG_CAVEAT:
1696 *value = config->configCaveat;
1697 break;
1698 case EGL_CONFIG_ID:
1699 *value = config->configID;
1700 break;
1701 case EGL_LEVEL:
1702 *value = config->level;
1703 break;
1704 case EGL_NATIVE_RENDERABLE:
1705 *value = config->nativeRenderable;
1706 break;
1707 case EGL_NATIVE_VISUAL_ID:
1708 *value = config->nativeVisualID;
1709 break;
1710 case EGL_NATIVE_VISUAL_TYPE:
1711 *value = config->nativeVisualType;
1712 break;
1713 case EGL_SAMPLES:
1714 *value = config->samples;
1715 break;
1716 case EGL_SAMPLE_BUFFERS:
1717 *value = config->sampleBuffers;
1718 break;
1719 case EGL_SURFACE_TYPE:
1720 *value = config->surfaceType;
1721 break;
1722 case EGL_TRANSPARENT_TYPE:
1723 *value = config->transparentType;
1724 break;
1725 case EGL_TRANSPARENT_BLUE_VALUE:
1726 *value = config->transparentBlueValue;
1727 break;
1728 case EGL_TRANSPARENT_GREEN_VALUE:
1729 *value = config->transparentGreenValue;
1730 break;
1731 case EGL_TRANSPARENT_RED_VALUE:
1732 *value = config->transparentRedValue;
1733 break;
1734 case EGL_BIND_TO_TEXTURE_RGB:
1735 *value = config->bindToTextureRGB;
1736 break;
1737 case EGL_BIND_TO_TEXTURE_RGBA:
1738 *value = config->bindToTextureRGBA;
1739 break;
1740 case EGL_MIN_SWAP_INTERVAL:
1741 *value = config->minSwapInterval;
1742 break;
1743 case EGL_MAX_SWAP_INTERVAL:
1744 *value = config->maxSwapInterval;
1745 break;
1746 case EGL_LUMINANCE_SIZE:
1747 *value = config->luminanceSize;
1748 break;
1749 case EGL_ALPHA_MASK_SIZE:
1750 *value = config->alphaMaskSize;
1751 break;
1752 case EGL_COLOR_BUFFER_TYPE:
1753 *value = config->colorBufferType;
1754 break;
1755 case EGL_RENDERABLE_TYPE:
1756 *value = config->renderableType;
1757 break;
1758 case EGL_MATCH_NATIVE_PIXMAP:
1759 *value = false;
1760 UNIMPLEMENTED();
1761 break;
1762 case EGL_CONFORMANT:
1763 *value = config->conformant;
1764 break;
1765 case EGL_MAX_PBUFFER_WIDTH:
1766 *value = config->maxPBufferWidth;
1767 break;
1768 case EGL_MAX_PBUFFER_HEIGHT:
1769 *value = config->maxPBufferHeight;
1770 break;
1771 case EGL_MAX_PBUFFER_PIXELS:
1772 *value = config->maxPBufferPixels;
1773 break;
1774 case EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE:
1775 *value = config->optimalOrientation;
1776 break;
Geoff Langc5a2a172017-01-13 15:55:07 -05001777 case EGL_COLOR_COMPONENT_TYPE_EXT:
1778 *value = config->colorComponentType;
1779 break;
Geoff Lang65603eb2017-01-12 16:48:03 -05001780 default:
1781 UNREACHABLE();
1782 break;
1783 }
Geoff Langff5b2d52016-09-07 11:32:23 -04001784}
Geoff Lang65603eb2017-01-12 16:48:03 -05001785
Geoff Langaf143fe2017-10-05 13:59:43 -04001786void QueryContextAttrib(const gl::Context *context, EGLint attribute, EGLint *value)
1787{
1788 switch (attribute)
1789 {
1790 case EGL_CONFIG_ID:
1791 *value = context->getConfig()->configID;
1792 break;
1793 case EGL_CONTEXT_CLIENT_TYPE:
1794 *value = context->getClientType();
1795 break;
1796 case EGL_CONTEXT_CLIENT_VERSION:
1797 *value = context->getClientMajorVersion();
1798 break;
1799 case EGL_RENDER_BUFFER:
1800 *value = context->getRenderBuffer();
1801 break;
Geoff Langb433e872017-10-05 14:01:47 -04001802 case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
1803 *value = context->isRobustResourceInitEnabled();
1804 break;
Geoff Langaf143fe2017-10-05 13:59:43 -04001805 default:
1806 UNREACHABLE();
1807 break;
1808 }
1809}
1810
Geoff Lang31ecbd72017-07-26 13:01:27 -04001811void QuerySurfaceAttrib(const Surface *surface, EGLint attribute, EGLint *value)
1812{
1813 switch (attribute)
1814 {
1815 case EGL_GL_COLORSPACE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001816 *value = surface->getGLColorspace();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001817 break;
1818 case EGL_VG_ALPHA_FORMAT:
Geoff Lang40ac7832017-07-26 14:38:46 -04001819 *value = surface->getVGAlphaFormat();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001820 break;
1821 case EGL_VG_COLORSPACE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001822 *value = surface->getVGColorspace();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001823 break;
1824 case EGL_CONFIG_ID:
1825 *value = surface->getConfig()->configID;
1826 break;
1827 case EGL_HEIGHT:
1828 *value = surface->getHeight();
1829 break;
1830 case EGL_HORIZONTAL_RESOLUTION:
Geoff Lang40ac7832017-07-26 14:38:46 -04001831 *value = surface->getHorizontalResolution();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001832 break;
1833 case EGL_LARGEST_PBUFFER:
Geoff Lang40ac7832017-07-26 14:38:46 -04001834 // The EGL spec states that value is not written if the surface is not a pbuffer
1835 if (surface->getType() == EGL_PBUFFER_BIT)
1836 {
1837 *value = surface->getLargestPbuffer();
1838 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001839 break;
1840 case EGL_MIPMAP_TEXTURE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001841 // The EGL spec states that value is not written if the surface is not a pbuffer
1842 if (surface->getType() == EGL_PBUFFER_BIT)
1843 {
1844 *value = surface->getMipmapTexture();
1845 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001846 break;
1847 case EGL_MIPMAP_LEVEL:
Geoff Lang40ac7832017-07-26 14:38:46 -04001848 // The EGL spec states that value is not written if the surface is not a pbuffer
1849 if (surface->getType() == EGL_PBUFFER_BIT)
1850 {
1851 *value = surface->getMipmapLevel();
1852 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001853 break;
1854 case EGL_MULTISAMPLE_RESOLVE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001855 *value = surface->getMultisampleResolve();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001856 break;
1857 case EGL_PIXEL_ASPECT_RATIO:
1858 *value = surface->getPixelAspectRatio();
1859 break;
1860 case EGL_RENDER_BUFFER:
1861 *value = surface->getRenderBuffer();
1862 break;
1863 case EGL_SWAP_BEHAVIOR:
1864 *value = surface->getSwapBehavior();
1865 break;
1866 case EGL_TEXTURE_FORMAT:
Geoff Lang40ac7832017-07-26 14:38:46 -04001867 // The EGL spec states that value is not written if the surface is not a pbuffer
1868 if (surface->getType() == EGL_PBUFFER_BIT)
1869 {
1870 *value = surface->getTextureFormat();
1871 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001872 break;
1873 case EGL_TEXTURE_TARGET:
Geoff Lang40ac7832017-07-26 14:38:46 -04001874 // The EGL spec states that value is not written if the surface is not a pbuffer
1875 if (surface->getType() == EGL_PBUFFER_BIT)
1876 {
1877 *value = surface->getTextureTarget();
1878 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001879 break;
1880 case EGL_VERTICAL_RESOLUTION:
Geoff Lang40ac7832017-07-26 14:38:46 -04001881 *value = surface->getVerticalResolution();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001882 break;
1883 case EGL_WIDTH:
1884 *value = surface->getWidth();
1885 break;
1886 case EGL_POST_SUB_BUFFER_SUPPORTED_NV:
1887 *value = surface->isPostSubBufferSupported();
1888 break;
1889 case EGL_FIXED_SIZE_ANGLE:
1890 *value = surface->isFixedSize();
1891 break;
1892 case EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE:
1893 *value = surface->flexibleSurfaceCompatibilityRequested();
1894 break;
1895 case EGL_SURFACE_ORIENTATION_ANGLE:
1896 *value = surface->getOrientation();
1897 break;
1898 case EGL_DIRECT_COMPOSITION_ANGLE:
1899 *value = surface->directComposition();
1900 break;
Geoff Langb433e872017-10-05 14:01:47 -04001901 case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
1902 *value = surface->isRobustResourceInitEnabled();
1903 break;
Geoff Lang31ecbd72017-07-26 13:01:27 -04001904 default:
1905 UNREACHABLE();
1906 break;
1907 }
1908}
1909
1910void SetSurfaceAttrib(Surface *surface, EGLint attribute, EGLint value)
1911{
1912 switch (attribute)
1913 {
1914 case EGL_MIPMAP_LEVEL:
Geoff Lang40ac7832017-07-26 14:38:46 -04001915 surface->setMipmapLevel(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04001916 break;
1917 case EGL_MULTISAMPLE_RESOLVE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001918 surface->setMultisampleResolve(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04001919 break;
1920 case EGL_SWAP_BEHAVIOR:
Geoff Lang40ac7832017-07-26 14:38:46 -04001921 surface->setSwapBehavior(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04001922 break;
1923 default:
1924 UNREACHABLE();
1925 break;
1926 }
1927}
1928
Geoff Lang65603eb2017-01-12 16:48:03 -05001929} // namespace egl