blob: eb978594a678bb58e833e9b8f80cff47c9e092c7 [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
jchen10910a3da2017-11-15 09:40:11 +0800515GLint GetTransformFeedbackVaryingResourceProperty(const Program *program,
516 GLuint index,
517 const GLenum prop)
518{
519 const auto &tfVariable = program->getTransformFeedbackVaryingResource(index);
520 switch (prop)
521 {
522 case GL_TYPE:
523 return clampCast<GLint>(tfVariable.type);
524
525 case GL_ARRAY_SIZE:
526 return clampCast<GLint>(tfVariable.size());
527
528 case GL_NAME_LENGTH:
529 return clampCast<GLint>(tfVariable.nameWithArrayIndex().size() + 1);
530
531 default:
532 UNREACHABLE();
533 return GL_INVALID_VALUE;
534 }
535}
536
jchen10d9cd7b72017-08-30 15:04:25 +0800537GLint QueryProgramInterfaceActiveResources(const Program *program, GLenum programInterface)
538{
539 switch (programInterface)
540 {
541 case GL_PROGRAM_INPUT:
jchen10a99ed552017-09-22 08:10:32 +0800542 return clampCast<GLint>(program->getAttributes().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800543
544 case GL_PROGRAM_OUTPUT:
jchen10a99ed552017-09-22 08:10:32 +0800545 return clampCast<GLint>(program->getState().getOutputVariables().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800546
547 case GL_UNIFORM:
jchen10a99ed552017-09-22 08:10:32 +0800548 return clampCast<GLint>(program->getState().getUniforms().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800549
550 case GL_UNIFORM_BLOCK:
jchen10a99ed552017-09-22 08:10:32 +0800551 return clampCast<GLint>(program->getState().getUniformBlocks().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800552
jchen1058f67be2017-10-27 08:59:27 +0800553 case GL_ATOMIC_COUNTER_BUFFER:
554 return clampCast<GLint>(program->getState().getAtomicCounterBuffers().size());
555
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800556 case GL_BUFFER_VARIABLE:
557 return clampCast<GLint>(program->getState().getBufferVariables().size());
558
559 case GL_SHADER_STORAGE_BLOCK:
560 return clampCast<GLint>(program->getState().getShaderStorageBlocks().size());
561
jchen10d9cd7b72017-08-30 15:04:25 +0800562 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10910a3da2017-11-15 09:40:11 +0800563 return clampCast<GLint>(program->getTransformFeedbackVaryingCount());
jchen10d9cd7b72017-08-30 15:04:25 +0800564
565 default:
566 UNREACHABLE();
567 return 0;
568 }
569}
570
571template <typename T, typename M>
572GLint FindMaxSize(const std::vector<T> &resources, M member)
573{
574 GLint max = 0;
575 for (const T &resource : resources)
576 {
jchen10a99ed552017-09-22 08:10:32 +0800577 max = std::max(max, clampCast<GLint>((resource.*member).size()));
jchen10d9cd7b72017-08-30 15:04:25 +0800578 }
579 return max;
580}
581
582GLint QueryProgramInterfaceMaxNameLength(const Program *program, GLenum programInterface)
583{
584 GLint maxNameLength = 0;
585 switch (programInterface)
586 {
587 case GL_PROGRAM_INPUT:
588 maxNameLength = FindMaxSize(program->getAttributes(), &sh::Attribute::name);
589 break;
590
591 case GL_PROGRAM_OUTPUT:
592 maxNameLength =
593 FindMaxSize(program->getState().getOutputVariables(), &sh::OutputVariable::name);
594 break;
595
596 case GL_UNIFORM:
597 maxNameLength = FindMaxSize(program->getState().getUniforms(), &LinkedUniform::name);
598 break;
599
600 case GL_UNIFORM_BLOCK:
601 maxNameLength =
Jiajia Qin729b2c62017-08-14 09:36:11 +0800602 FindMaxSize(program->getState().getUniformBlocks(), &InterfaceBlock::name);
jchen10d9cd7b72017-08-30 15:04:25 +0800603 break;
604
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800605 case GL_BUFFER_VARIABLE:
606 maxNameLength =
607 FindMaxSize(program->getState().getBufferVariables(), &BufferVariable::name);
608 break;
609
610 case GL_SHADER_STORAGE_BLOCK:
611 maxNameLength =
612 FindMaxSize(program->getState().getShaderStorageBlocks(), &InterfaceBlock::name);
613 break;
614
jchen10d9cd7b72017-08-30 15:04:25 +0800615 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10910a3da2017-11-15 09:40:11 +0800616 maxNameLength = clampCast<GLint>(program->getTransformFeedbackVaryingMaxLength() - 1);
617 break;
jchen10d9cd7b72017-08-30 15:04:25 +0800618
619 default:
620 UNREACHABLE();
621 return 0;
622 }
623 // This length includes an extra character for the null terminator.
624 return (maxNameLength == 0 ? 0 : maxNameLength + 1);
625}
626
627GLint QueryProgramInterfaceMaxNumActiveVariables(const Program *program, GLenum programInterface)
628{
629 switch (programInterface)
630 {
631 case GL_UNIFORM_BLOCK:
632 return FindMaxSize(program->getState().getUniformBlocks(),
Jiajia Qin729b2c62017-08-14 09:36:11 +0800633 &InterfaceBlock::memberIndexes);
jchen1058f67be2017-10-27 08:59:27 +0800634 case GL_ATOMIC_COUNTER_BUFFER:
635 return FindMaxSize(program->getState().getAtomicCounterBuffers(),
636 &AtomicCounterBuffer::memberIndexes);
jchen10d9cd7b72017-08-30 15:04:25 +0800637
jchen10d9cd7b72017-08-30 15:04:25 +0800638 case GL_SHADER_STORAGE_BLOCK:
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800639 return FindMaxSize(program->getState().getShaderStorageBlocks(),
640 &InterfaceBlock::memberIndexes);
jchen10d9cd7b72017-08-30 15:04:25 +0800641
642 default:
643 UNREACHABLE();
644 return 0;
645 }
646}
647
jchen10baf5d942017-08-28 20:45:48 +0800648GLenum GetUniformPropertyEnum(GLenum prop)
649{
650 switch (prop)
651 {
652 case GL_UNIFORM_TYPE:
653 return GL_TYPE;
654 case GL_UNIFORM_SIZE:
655 return GL_ARRAY_SIZE;
656 case GL_UNIFORM_NAME_LENGTH:
657 return GL_NAME_LENGTH;
658 case GL_UNIFORM_BLOCK_INDEX:
659 return GL_BLOCK_INDEX;
660 case GL_UNIFORM_OFFSET:
661 return GL_OFFSET;
662 case GL_UNIFORM_ARRAY_STRIDE:
663 return GL_ARRAY_STRIDE;
664 case GL_UNIFORM_MATRIX_STRIDE:
665 return GL_MATRIX_STRIDE;
666 case GL_UNIFORM_IS_ROW_MAJOR:
667 return GL_IS_ROW_MAJOR;
668
669 default:
670 return prop;
671 }
672}
673
jchen1058f67be2017-10-27 08:59:27 +0800674GLenum GetUniformBlockPropertyEnum(GLenum prop)
675{
676 switch (prop)
677 {
678 case GL_UNIFORM_BLOCK_BINDING:
679 return GL_BUFFER_BINDING;
680
681 case GL_UNIFORM_BLOCK_DATA_SIZE:
682 return GL_BUFFER_DATA_SIZE;
683
684 case GL_UNIFORM_BLOCK_NAME_LENGTH:
685 return GL_NAME_LENGTH;
686
687 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
688 return GL_NUM_ACTIVE_VARIABLES;
689
690 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
691 return GL_ACTIVE_VARIABLES;
692
693 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
694 return GL_REFERENCED_BY_VERTEX_SHADER;
695
696 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
697 return GL_REFERENCED_BY_FRAGMENT_SHADER;
698
699 default:
700 return prop;
701 }
702}
703
704void GetShaderVariableBufferResourceProperty(const ShaderVariableBuffer &buffer,
705 GLenum pname,
706 GLint *params,
707 GLsizei bufSize,
708 GLsizei *outputPosition)
709
710{
711 switch (pname)
712 {
713 case GL_BUFFER_BINDING:
714 params[(*outputPosition)++] = buffer.binding;
715 break;
716 case GL_BUFFER_DATA_SIZE:
717 params[(*outputPosition)++] = clampCast<GLint>(buffer.dataSize);
718 break;
719 case GL_NUM_ACTIVE_VARIABLES:
720 params[(*outputPosition)++] = buffer.numActiveVariables();
721 break;
722 case GL_ACTIVE_VARIABLES:
723 for (size_t memberIndex = 0;
724 memberIndex < buffer.memberIndexes.size() && *outputPosition < bufSize;
725 ++memberIndex)
726 {
727 params[(*outputPosition)++] = clampCast<GLint>(buffer.memberIndexes[memberIndex]);
728 }
729 break;
730 case GL_REFERENCED_BY_VERTEX_SHADER:
731 params[(*outputPosition)++] = static_cast<GLint>(buffer.vertexStaticUse);
732 break;
733 case GL_REFERENCED_BY_FRAGMENT_SHADER:
734 params[(*outputPosition)++] = static_cast<GLint>(buffer.fragmentStaticUse);
735 break;
736 case GL_REFERENCED_BY_COMPUTE_SHADER:
737 params[(*outputPosition)++] = static_cast<GLint>(buffer.computeStaticUse);
738 break;
739 default:
740 UNREACHABLE();
741 break;
742 }
743}
744
745void GetInterfaceBlockResourceProperty(const InterfaceBlock &block,
746 GLenum pname,
747 GLint *params,
748 GLsizei bufSize,
749 GLsizei *outputPosition)
750{
751 if (pname == GL_NAME_LENGTH)
752 {
753 params[(*outputPosition)++] = clampCast<GLint>(block.nameWithArrayIndex().size() + 1);
754 return;
755 }
756 GetShaderVariableBufferResourceProperty(block, pname, params, bufSize, outputPosition);
757}
758
759void GetUniformBlockResourceProperty(const Program *program,
760 GLuint blockIndex,
761 GLenum pname,
762 GLint *params,
763 GLsizei bufSize,
764 GLsizei *outputPosition)
765
766{
767 ASSERT(*outputPosition < bufSize);
768 const auto &block = program->getUniformBlockByIndex(blockIndex);
769 GetInterfaceBlockResourceProperty(block, pname, params, bufSize, outputPosition);
770}
771
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800772void GetShaderStorageBlockResourceProperty(const Program *program,
773 GLuint blockIndex,
774 GLenum pname,
775 GLint *params,
776 GLsizei bufSize,
777 GLsizei *outputPosition)
778
779{
780 ASSERT(*outputPosition < bufSize);
781 const auto &block = program->getShaderStorageBlockByIndex(blockIndex);
782 GetInterfaceBlockResourceProperty(block, pname, params, bufSize, outputPosition);
783}
784
jchen1058f67be2017-10-27 08:59:27 +0800785void GetAtomicCounterBufferResourceProperty(const Program *program,
786 GLuint index,
787 GLenum pname,
788 GLint *params,
789 GLsizei bufSize,
790 GLsizei *outputPosition)
791
792{
793 ASSERT(*outputPosition < bufSize);
794 const auto &buffer = program->getState().getAtomicCounterBuffers()[index];
795 GetShaderVariableBufferResourceProperty(buffer, pname, params, bufSize, outputPosition);
796}
797
Geoff Langc1984ed2016-10-07 12:41:00 -0400798} // anonymous namespace
799
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -0800800void QueryFramebufferAttachmentParameteriv(const Context *context,
801 const Framebuffer *framebuffer,
Geoff Langff5b2d52016-09-07 11:32:23 -0400802 GLenum attachment,
803 GLenum pname,
804 GLint *params)
805{
806 ASSERT(framebuffer);
807
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -0800808 const FramebufferAttachment *attachmentObject = framebuffer->getAttachment(context, attachment);
809
Geoff Langff5b2d52016-09-07 11:32:23 -0400810 if (attachmentObject == nullptr)
811 {
812 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
813 // is NONE, then querying any other pname will generate INVALID_ENUM.
814
815 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
816 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
817 // INVALID_OPERATION for all other pnames
818
819 switch (pname)
820 {
821 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
822 *params = GL_NONE;
823 break;
824
825 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
826 *params = 0;
827 break;
828
829 default:
830 UNREACHABLE();
831 break;
832 }
833
834 return;
835 }
836
837 switch (pname)
838 {
839 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
840 *params = attachmentObject->type();
841 break;
842
843 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
844 *params = attachmentObject->id();
845 break;
846
847 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
848 *params = attachmentObject->mipLevel();
849 break;
850
851 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
852 *params = attachmentObject->cubeMapFace();
853 break;
854
855 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
856 *params = attachmentObject->getRedSize();
857 break;
858
859 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
860 *params = attachmentObject->getGreenSize();
861 break;
862
863 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
864 *params = attachmentObject->getBlueSize();
865 break;
866
867 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
868 *params = attachmentObject->getAlphaSize();
869 break;
870
871 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
872 *params = attachmentObject->getDepthSize();
873 break;
874
875 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
876 *params = attachmentObject->getStencilSize();
877 break;
878
879 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
880 *params = attachmentObject->getComponentType();
881 break;
882
883 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
884 *params = attachmentObject->getColorEncoding();
885 break;
886
887 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
888 *params = attachmentObject->layer();
889 break;
890
Martin Radeve5285d22017-07-14 16:23:53 +0300891 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_ANGLE:
892 *params = attachmentObject->getNumViews();
893 break;
894
895 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_MULTIVIEW_LAYOUT_ANGLE:
896 *params = static_cast<GLint>(attachmentObject->getMultiviewLayout());
897 break;
898
899 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_ANGLE:
900 *params = attachmentObject->getBaseViewIndex();
901 break;
902
903 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_VIEWPORT_OFFSETS_ANGLE:
904 {
905 const std::vector<Offset> &offsets = attachmentObject->getMultiviewViewportOffsets();
906 for (size_t i = 0u; i < offsets.size(); ++i)
907 {
908 params[i * 2u] = offsets[i].x;
909 params[i * 2u + 1u] = offsets[i].y;
910 }
911 }
912 break;
913
Geoff Langff5b2d52016-09-07 11:32:23 -0400914 default:
915 UNREACHABLE();
916 break;
917 }
918}
919
920void QueryBufferParameteriv(const Buffer *buffer, GLenum pname, GLint *params)
921{
Geoff Langebebe1c2016-10-14 12:01:31 -0400922 QueryBufferParameterBase(buffer, pname, params);
923}
Geoff Langff5b2d52016-09-07 11:32:23 -0400924
Geoff Langebebe1c2016-10-14 12:01:31 -0400925void QueryBufferParameteri64v(const Buffer *buffer, GLenum pname, GLint64 *params)
926{
927 QueryBufferParameterBase(buffer, pname, params);
Geoff Langff5b2d52016-09-07 11:32:23 -0400928}
929
Geoff Lang496c02d2016-10-20 11:38:11 -0700930void QueryBufferPointerv(const Buffer *buffer, GLenum pname, void **params)
931{
932 switch (pname)
933 {
934 case GL_BUFFER_MAP_POINTER:
935 *params = buffer->getMapPointer();
936 break;
937
938 default:
939 UNREACHABLE();
940 break;
941 }
942}
943
Jamie Madillffe00c02017-06-27 16:26:55 -0400944void QueryProgramiv(const Context *context, const Program *program, GLenum pname, GLint *params)
Geoff Langff5b2d52016-09-07 11:32:23 -0400945{
946 ASSERT(program != nullptr);
947
948 switch (pname)
949 {
950 case GL_DELETE_STATUS:
951 *params = program->isFlaggedForDeletion();
952 return;
953 case GL_LINK_STATUS:
954 *params = program->isLinked();
955 return;
956 case GL_VALIDATE_STATUS:
957 *params = program->isValidated();
958 return;
959 case GL_INFO_LOG_LENGTH:
960 *params = program->getInfoLogLength();
961 return;
962 case GL_ATTACHED_SHADERS:
963 *params = program->getAttachedShadersCount();
964 return;
965 case GL_ACTIVE_ATTRIBUTES:
966 *params = program->getActiveAttributeCount();
967 return;
968 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
969 *params = program->getActiveAttributeMaxLength();
970 return;
971 case GL_ACTIVE_UNIFORMS:
972 *params = program->getActiveUniformCount();
973 return;
974 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
975 *params = program->getActiveUniformMaxLength();
976 return;
977 case GL_PROGRAM_BINARY_LENGTH_OES:
Jamie Madillffe00c02017-06-27 16:26:55 -0400978 *params = program->getBinaryLength(context);
Geoff Langff5b2d52016-09-07 11:32:23 -0400979 return;
980 case GL_ACTIVE_UNIFORM_BLOCKS:
981 *params = program->getActiveUniformBlockCount();
982 return;
983 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
984 *params = program->getActiveUniformBlockMaxLength();
985 break;
986 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
987 *params = program->getTransformFeedbackBufferMode();
988 break;
989 case GL_TRANSFORM_FEEDBACK_VARYINGS:
jchen10910a3da2017-11-15 09:40:11 +0800990 *params = clampCast<GLint>(program->getTransformFeedbackVaryingCount());
Geoff Langff5b2d52016-09-07 11:32:23 -0400991 break;
992 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
993 *params = program->getTransformFeedbackVaryingMaxLength();
994 break;
995 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
996 *params = program->getBinaryRetrievableHint();
997 break;
Yunchao He61afff12017-03-14 15:34:03 +0800998 case GL_PROGRAM_SEPARABLE:
999 *params = program->isSeparable();
1000 break;
Xinghua Cao971f8502017-10-17 13:01:24 +08001001 case GL_COMPUTE_WORK_GROUP_SIZE:
1002 {
1003 const sh::WorkGroupSize &localSize = program->getComputeShaderLocalSize();
1004 params[0] = localSize[0];
1005 params[1] = localSize[1];
1006 params[2] = localSize[2];
1007 }
1008 break;
jchen1058f67be2017-10-27 08:59:27 +08001009 case GL_ACTIVE_ATOMIC_COUNTER_BUFFERS:
1010 *params = program->getActiveAtomicCounterBufferCount();
1011 break;
Geoff Langff5b2d52016-09-07 11:32:23 -04001012 default:
1013 UNREACHABLE();
1014 break;
1015 }
1016}
Geoff Lang740d9022016-10-07 11:20:52 -04001017
Jamie Madill4e0e6f82017-02-17 11:06:03 -05001018void QueryRenderbufferiv(const Context *context,
1019 const Renderbuffer *renderbuffer,
1020 GLenum pname,
1021 GLint *params)
Geoff Lang740d9022016-10-07 11:20:52 -04001022{
1023 ASSERT(renderbuffer != nullptr);
1024
1025 switch (pname)
1026 {
1027 case GL_RENDERBUFFER_WIDTH:
1028 *params = renderbuffer->getWidth();
1029 break;
1030 case GL_RENDERBUFFER_HEIGHT:
1031 *params = renderbuffer->getHeight();
1032 break;
1033 case GL_RENDERBUFFER_INTERNAL_FORMAT:
Jamie Madill4e0e6f82017-02-17 11:06:03 -05001034 // Special case the WebGL 1 DEPTH_STENCIL format.
Jamie Madilla02315b2017-02-23 14:14:47 -05001035 if (context->isWebGL1() &&
Jamie Madill4e0e6f82017-02-17 11:06:03 -05001036 renderbuffer->getFormat().info->internalFormat == GL_DEPTH24_STENCIL8)
1037 {
1038 *params = GL_DEPTH_STENCIL;
1039 }
1040 else
1041 {
1042 *params = renderbuffer->getFormat().info->internalFormat;
1043 }
Geoff Lang740d9022016-10-07 11:20:52 -04001044 break;
1045 case GL_RENDERBUFFER_RED_SIZE:
1046 *params = renderbuffer->getRedSize();
1047 break;
1048 case GL_RENDERBUFFER_GREEN_SIZE:
1049 *params = renderbuffer->getGreenSize();
1050 break;
1051 case GL_RENDERBUFFER_BLUE_SIZE:
1052 *params = renderbuffer->getBlueSize();
1053 break;
1054 case GL_RENDERBUFFER_ALPHA_SIZE:
1055 *params = renderbuffer->getAlphaSize();
1056 break;
1057 case GL_RENDERBUFFER_DEPTH_SIZE:
1058 *params = renderbuffer->getDepthSize();
1059 break;
1060 case GL_RENDERBUFFER_STENCIL_SIZE:
1061 *params = renderbuffer->getStencilSize();
1062 break;
1063 case GL_RENDERBUFFER_SAMPLES_ANGLE:
1064 *params = renderbuffer->getSamples();
1065 break;
1066 default:
1067 UNREACHABLE();
1068 break;
1069 }
1070}
Geoff Langd7d0ed32016-10-07 11:33:51 -04001071
Jamie Madillbd044ed2017-06-05 12:59:21 -04001072void QueryShaderiv(const Context *context, Shader *shader, GLenum pname, GLint *params)
Geoff Langd7d0ed32016-10-07 11:33:51 -04001073{
1074 ASSERT(shader != nullptr);
1075
1076 switch (pname)
1077 {
1078 case GL_SHADER_TYPE:
1079 *params = shader->getType();
1080 return;
1081 case GL_DELETE_STATUS:
1082 *params = shader->isFlaggedForDeletion();
1083 return;
1084 case GL_COMPILE_STATUS:
Jamie Madillbd044ed2017-06-05 12:59:21 -04001085 *params = shader->isCompiled(context) ? GL_TRUE : GL_FALSE;
Geoff Langd7d0ed32016-10-07 11:33:51 -04001086 return;
1087 case GL_INFO_LOG_LENGTH:
Jamie Madillbd044ed2017-06-05 12:59:21 -04001088 *params = shader->getInfoLogLength(context);
Geoff Langd7d0ed32016-10-07 11:33:51 -04001089 return;
1090 case GL_SHADER_SOURCE_LENGTH:
1091 *params = shader->getSourceLength();
1092 return;
1093 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
Jamie Madillbd044ed2017-06-05 12:59:21 -04001094 *params = shader->getTranslatedSourceWithDebugInfoLength(context);
Geoff Langd7d0ed32016-10-07 11:33:51 -04001095 return;
1096 default:
1097 UNREACHABLE();
1098 break;
1099 }
1100}
Geoff Langc1984ed2016-10-07 12:41:00 -04001101
He Yunchao11b038b2016-11-22 21:24:04 +08001102void QueryTexLevelParameterfv(const Texture *texture,
1103 GLenum target,
1104 GLint level,
1105 GLenum pname,
1106 GLfloat *params)
1107{
1108 QueryTexLevelParameterBase(texture, target, level, pname, params);
1109}
1110
1111void QueryTexLevelParameteriv(const Texture *texture,
1112 GLenum target,
1113 GLint level,
1114 GLenum pname,
1115 GLint *params)
1116{
1117 QueryTexLevelParameterBase(texture, target, level, pname, params);
1118}
1119
Geoff Langc1984ed2016-10-07 12:41:00 -04001120void QueryTexParameterfv(const Texture *texture, GLenum pname, GLfloat *params)
1121{
1122 QueryTexParameterBase(texture, pname, params);
1123}
1124
1125void QueryTexParameteriv(const Texture *texture, GLenum pname, GLint *params)
1126{
1127 QueryTexParameterBase(texture, pname, params);
1128}
1129
1130void QuerySamplerParameterfv(const Sampler *sampler, GLenum pname, GLfloat *params)
1131{
1132 QuerySamplerParameterBase(sampler, pname, params);
1133}
1134
1135void QuerySamplerParameteriv(const Sampler *sampler, GLenum pname, GLint *params)
1136{
1137 QuerySamplerParameterBase(sampler, pname, params);
1138}
1139
Geoff Lang0b031062016-10-13 14:30:04 -04001140void QueryVertexAttribfv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001141 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001142 const VertexAttribCurrentValueData &currentValueData,
1143 GLenum pname,
1144 GLfloat *params)
1145{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001146 QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001147}
1148
1149void QueryVertexAttribiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001150 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001151 const VertexAttribCurrentValueData &currentValueData,
1152 GLenum pname,
1153 GLint *params)
1154{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001155 QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001156}
1157
Jamie Madill876429b2017-04-20 15:46:24 -04001158void QueryVertexAttribPointerv(const VertexAttribute &attrib, GLenum pname, void **pointer)
Geoff Lang0b031062016-10-13 14:30:04 -04001159{
1160 switch (pname)
1161 {
1162 case GL_VERTEX_ATTRIB_ARRAY_POINTER:
Jamie Madill876429b2017-04-20 15:46:24 -04001163 *pointer = const_cast<void *>(attrib.pointer);
Geoff Lang0b031062016-10-13 14:30:04 -04001164 break;
1165
1166 default:
1167 UNREACHABLE();
1168 break;
1169 }
1170}
1171
1172void QueryVertexAttribIiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001173 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001174 const VertexAttribCurrentValueData &currentValueData,
1175 GLenum pname,
1176 GLint *params)
1177{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001178 QueryVertexAttribBase(attrib, binding, currentValueData.IntValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001179}
1180
1181void QueryVertexAttribIuiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001182 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001183 const VertexAttribCurrentValueData &currentValueData,
1184 GLenum pname,
1185 GLuint *params)
1186{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001187 QueryVertexAttribBase(attrib, binding, currentValueData.UnsignedIntValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001188}
1189
Geoff Lang6899b872016-10-14 11:30:13 -04001190void QueryActiveUniformBlockiv(const Program *program,
1191 GLuint uniformBlockIndex,
1192 GLenum pname,
1193 GLint *params)
1194{
jchen1058f67be2017-10-27 08:59:27 +08001195 GLenum prop = GetUniformBlockPropertyEnum(pname);
1196 QueryProgramResourceiv(program, GL_UNIFORM_BLOCK, uniformBlockIndex, 1, &prop,
1197 std::numeric_limits<GLsizei>::max(), nullptr, params);
Geoff Lang6899b872016-10-14 11:30:13 -04001198}
1199
Geoff Lang0a9661f2016-10-20 10:59:20 -07001200void QueryInternalFormativ(const TextureCaps &format, GLenum pname, GLsizei bufSize, GLint *params)
1201{
1202 switch (pname)
1203 {
1204 case GL_NUM_SAMPLE_COUNTS:
1205 if (bufSize != 0)
1206 {
jchen10a99ed552017-09-22 08:10:32 +08001207 *params = clampCast<GLint>(format.sampleCounts.size());
Geoff Lang0a9661f2016-10-20 10:59:20 -07001208 }
1209 break;
1210
1211 case GL_SAMPLES:
1212 {
1213 size_t returnCount = std::min<size_t>(bufSize, format.sampleCounts.size());
1214 auto sampleReverseIt = format.sampleCounts.rbegin();
1215 for (size_t sampleIndex = 0; sampleIndex < returnCount; ++sampleIndex)
1216 {
1217 params[sampleIndex] = *sampleReverseIt++;
1218 }
1219 }
1220 break;
1221
1222 default:
1223 UNREACHABLE();
1224 break;
1225 }
1226}
1227
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001228void QueryFramebufferParameteriv(const Framebuffer *framebuffer, GLenum pname, GLint *params)
1229{
1230 ASSERT(framebuffer);
1231
1232 switch (pname)
1233 {
1234 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
1235 *params = framebuffer->getDefaultWidth();
1236 break;
1237 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
1238 *params = framebuffer->getDefaultHeight();
1239 break;
1240 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
1241 *params = framebuffer->getDefaultSamples();
1242 break;
1243 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
Geoff Lang92019432017-11-20 13:09:34 -05001244 *params = ConvertToGLBoolean(framebuffer->getDefaultFixedSampleLocations());
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001245 break;
1246 default:
1247 UNREACHABLE();
1248 break;
1249 }
1250}
1251
Jamie Madill70b5bb02017-08-28 13:32:37 -04001252Error QuerySynciv(const Sync *sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001253{
1254 ASSERT(sync);
1255
Geoff Lang82483b92017-04-11 15:33:00 -04001256 // All queries return one value, exit early if the buffer can't fit anything.
1257 if (bufSize < 1)
1258 {
1259 if (length != nullptr)
1260 {
1261 *length = 0;
1262 }
1263 return NoError();
1264 }
1265
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001266 switch (pname)
1267 {
1268 case GL_OBJECT_TYPE:
jchen10a99ed552017-09-22 08:10:32 +08001269 *values = clampCast<GLint>(GL_SYNC_FENCE);
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001270 break;
1271 case GL_SYNC_CONDITION:
jchen10a99ed552017-09-22 08:10:32 +08001272 *values = clampCast<GLint>(sync->getCondition());
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001273 break;
1274 case GL_SYNC_FLAGS:
jchen10a99ed552017-09-22 08:10:32 +08001275 *values = clampCast<GLint>(sync->getFlags());
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001276 break;
1277 case GL_SYNC_STATUS:
1278 ANGLE_TRY(sync->getStatus(values));
1279 break;
1280
1281 default:
1282 UNREACHABLE();
1283 break;
1284 }
1285
Geoff Lang82483b92017-04-11 15:33:00 -04001286 if (length != nullptr)
1287 {
1288 *length = 1;
1289 }
1290
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001291 return NoError();
1292}
1293
Jamie Madill4928b7c2017-06-20 12:57:39 -04001294void SetTexParameterf(Context *context, Texture *texture, GLenum pname, GLfloat param)
Geoff Langc1984ed2016-10-07 12:41:00 -04001295{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001296 SetTexParameterBase(context, texture, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -04001297}
1298
Jamie Madill4928b7c2017-06-20 12:57:39 -04001299void SetTexParameterfv(Context *context, Texture *texture, GLenum pname, const GLfloat *params)
Geoff Langc1984ed2016-10-07 12:41:00 -04001300{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001301 SetTexParameterBase(context, texture, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001302}
1303
Jamie Madill4928b7c2017-06-20 12:57:39 -04001304void SetTexParameteri(Context *context, Texture *texture, GLenum pname, GLint param)
Geoff Langc1984ed2016-10-07 12:41:00 -04001305{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001306 SetTexParameterBase(context, texture, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -04001307}
1308
Jamie Madill4928b7c2017-06-20 12:57:39 -04001309void SetTexParameteriv(Context *context, Texture *texture, GLenum pname, const GLint *params)
Geoff Langc1984ed2016-10-07 12:41:00 -04001310{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001311 SetTexParameterBase(context, texture, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001312}
1313
1314void SetSamplerParameterf(Sampler *sampler, GLenum pname, GLfloat param)
1315{
1316 SetSamplerParameterBase(sampler, pname, &param);
1317}
1318
1319void SetSamplerParameterfv(Sampler *sampler, GLenum pname, const GLfloat *params)
1320{
1321 SetSamplerParameterBase(sampler, pname, params);
1322}
1323
1324void SetSamplerParameteri(Sampler *sampler, GLenum pname, GLint param)
1325{
1326 SetSamplerParameterBase(sampler, pname, &param);
1327}
1328
1329void SetSamplerParameteriv(Sampler *sampler, GLenum pname, const GLint *params)
1330{
1331 SetSamplerParameterBase(sampler, pname, params);
1332}
Geoff Lang65603eb2017-01-12 16:48:03 -05001333
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001334void SetFramebufferParameteri(Framebuffer *framebuffer, GLenum pname, GLint param)
1335{
1336 ASSERT(framebuffer);
1337
1338 switch (pname)
1339 {
1340 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
1341 framebuffer->setDefaultWidth(param);
1342 break;
1343 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
1344 framebuffer->setDefaultHeight(param);
1345 break;
1346 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
1347 framebuffer->setDefaultSamples(param);
1348 break;
1349 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
Geoff Lang5201ce12017-11-28 11:36:28 -05001350 framebuffer->setDefaultFixedSampleLocations(ConvertToBool(param));
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001351 break;
1352 default:
1353 UNREACHABLE();
1354 break;
1355 }
1356}
1357
Yunchao He61afff12017-03-14 15:34:03 +08001358void SetProgramParameteri(Program *program, GLenum pname, GLint value)
1359{
1360 ASSERT(program);
1361
1362 switch (pname)
1363 {
1364 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
Geoff Lang92019432017-11-20 13:09:34 -05001365 program->setBinaryRetrievableHint(ConvertToBool(value));
Yunchao He61afff12017-03-14 15:34:03 +08001366 break;
1367 case GL_PROGRAM_SEPARABLE:
Geoff Lang92019432017-11-20 13:09:34 -05001368 program->setSeparable(ConvertToBool(value));
Yunchao He61afff12017-03-14 15:34:03 +08001369 break;
1370 default:
1371 UNREACHABLE();
1372 break;
1373 }
1374}
1375
jchen10baf5d942017-08-28 20:45:48 +08001376GLint GetUniformResourceProperty(const Program *program, GLuint index, const GLenum prop)
1377{
1378 const auto &uniform = program->getUniformByIndex(index);
1379 GLenum resourceProp = GetUniformPropertyEnum(prop);
1380 switch (resourceProp)
1381 {
1382 case GL_TYPE:
1383 case GL_ARRAY_SIZE:
1384 case GL_NAME_LENGTH:
Olli Etuaho465835d2017-09-26 13:34:10 +03001385 return GetCommonVariableProperty(uniform, resourceProp);
jchen10baf5d942017-08-28 20:45:48 +08001386
1387 case GL_LOCATION:
1388 return program->getUniformLocation(uniform.name);
1389
1390 case GL_BLOCK_INDEX:
1391 return (uniform.isAtomicCounter() ? -1 : uniform.bufferIndex);
1392
1393 case GL_OFFSET:
1394 return uniform.blockInfo.offset;
1395
1396 case GL_ARRAY_STRIDE:
1397 return uniform.blockInfo.arrayStride;
1398
1399 case GL_MATRIX_STRIDE:
1400 return uniform.blockInfo.matrixStride;
1401
1402 case GL_IS_ROW_MAJOR:
1403 return static_cast<GLint>(uniform.blockInfo.isRowMajorMatrix);
1404
1405 case GL_REFERENCED_BY_VERTEX_SHADER:
1406 return uniform.vertexStaticUse;
1407
1408 case GL_REFERENCED_BY_FRAGMENT_SHADER:
1409 return uniform.fragmentStaticUse;
1410
1411 case GL_REFERENCED_BY_COMPUTE_SHADER:
1412 return uniform.computeStaticUse;
1413
1414 case GL_ATOMIC_COUNTER_BUFFER_INDEX:
1415 return (uniform.isAtomicCounter() ? uniform.bufferIndex : -1);
1416
1417 default:
1418 UNREACHABLE();
1419 return 0;
1420 }
1421}
1422
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001423GLint GetBufferVariableResourceProperty(const Program *program, GLuint index, const GLenum prop)
1424{
1425 const auto &bufferVariable = program->getBufferVariableByIndex(index);
1426 switch (prop)
1427 {
1428 case GL_TYPE:
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001429 case GL_ARRAY_SIZE:
Olli Etuaho465835d2017-09-26 13:34:10 +03001430 case GL_NAME_LENGTH:
1431 return GetCommonVariableProperty(bufferVariable, prop);
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001432
1433 case GL_BLOCK_INDEX:
1434 return bufferVariable.bufferIndex;
1435
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001436 case GL_OFFSET:
1437 return bufferVariable.blockInfo.offset;
1438
1439 case GL_ARRAY_STRIDE:
1440 return bufferVariable.blockInfo.arrayStride;
1441
1442 case GL_MATRIX_STRIDE:
1443 return bufferVariable.blockInfo.matrixStride;
1444
1445 case GL_IS_ROW_MAJOR:
1446 return static_cast<GLint>(bufferVariable.blockInfo.isRowMajorMatrix);
1447
1448 case GL_REFERENCED_BY_VERTEX_SHADER:
1449 return bufferVariable.vertexStaticUse;
1450
1451 case GL_REFERENCED_BY_FRAGMENT_SHADER:
1452 return bufferVariable.fragmentStaticUse;
1453
1454 case GL_REFERENCED_BY_COMPUTE_SHADER:
1455 return bufferVariable.computeStaticUse;
1456
1457 case GL_TOP_LEVEL_ARRAY_SIZE:
1458 return bufferVariable.topLevelArraySize;
1459
1460 case GL_TOP_LEVEL_ARRAY_STRIDE:
1461 return bufferVariable.blockInfo.topLevelArrayStride;
1462
1463 default:
1464 UNREACHABLE();
1465 return 0;
1466 }
1467}
1468
jchen1015015f72017-03-16 13:54:21 +08001469GLuint QueryProgramResourceIndex(const Program *program,
1470 GLenum programInterface,
1471 const GLchar *name)
1472{
1473 switch (programInterface)
1474 {
1475 case GL_PROGRAM_INPUT:
1476 return program->getInputResourceIndex(name);
1477
1478 case GL_PROGRAM_OUTPUT:
1479 return program->getOutputResourceIndex(name);
1480
jchen1015015f72017-03-16 13:54:21 +08001481 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001482 return program->getState().getUniformIndexFromName(name);
1483
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001484 case GL_BUFFER_VARIABLE:
1485 return program->getState().getBufferVariableIndexFromName(name);
1486
1487 case GL_SHADER_STORAGE_BLOCK:
1488 return program->getShaderStorageBlockIndex(name);
1489
jchen1015015f72017-03-16 13:54:21 +08001490 case GL_UNIFORM_BLOCK:
jchen1058f67be2017-10-27 08:59:27 +08001491 return program->getUniformBlockIndex(name);
1492
jchen1015015f72017-03-16 13:54:21 +08001493 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10910a3da2017-11-15 09:40:11 +08001494 return program->getTransformFeedbackVaryingResourceIndex(name);
jchen1015015f72017-03-16 13:54:21 +08001495
1496 default:
1497 UNREACHABLE();
1498 return GL_INVALID_INDEX;
1499 }
1500}
1501
jchen10fd7c3b52017-03-21 15:36:03 +08001502void QueryProgramResourceName(const Program *program,
1503 GLenum programInterface,
1504 GLuint index,
1505 GLsizei bufSize,
1506 GLsizei *length,
1507 GLchar *name)
1508{
1509 switch (programInterface)
1510 {
1511 case GL_PROGRAM_INPUT:
1512 program->getInputResourceName(index, bufSize, length, name);
1513 break;
1514
1515 case GL_PROGRAM_OUTPUT:
1516 program->getOutputResourceName(index, bufSize, length, name);
1517 break;
1518
jchen10fd7c3b52017-03-21 15:36:03 +08001519 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001520 program->getUniformResourceName(index, bufSize, length, name);
1521 break;
1522
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001523 case GL_BUFFER_VARIABLE:
1524 program->getBufferVariableResourceName(index, bufSize, length, name);
1525 break;
1526
1527 case GL_SHADER_STORAGE_BLOCK:
1528 program->getActiveShaderStorageBlockName(index, bufSize, length, name);
1529 break;
1530
jchen10fd7c3b52017-03-21 15:36:03 +08001531 case GL_UNIFORM_BLOCK:
jchen1058f67be2017-10-27 08:59:27 +08001532 program->getActiveUniformBlockName(index, bufSize, length, name);
1533 break;
1534
jchen10fd7c3b52017-03-21 15:36:03 +08001535 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10910a3da2017-11-15 09:40:11 +08001536 program->getTransformFeedbackVarying(index, bufSize, length, nullptr, nullptr, name);
jchen10fd7c3b52017-03-21 15:36:03 +08001537 break;
1538
1539 default:
1540 UNREACHABLE();
1541 }
1542}
1543
jchen10191381f2017-04-11 13:59:04 +08001544GLint QueryProgramResourceLocation(const Program *program,
1545 GLenum programInterface,
1546 const GLchar *name)
1547{
1548 switch (programInterface)
1549 {
1550 case GL_PROGRAM_INPUT:
1551 return program->getAttributeLocation(name);
1552
1553 case GL_PROGRAM_OUTPUT:
1554 return program->getFragDataLocation(name);
1555
jchen10191381f2017-04-11 13:59:04 +08001556 case GL_UNIFORM:
Olli Etuahod2551232017-10-26 20:03:33 +03001557 return program->getUniformLocation(name);
jchen10baf5d942017-08-28 20:45:48 +08001558
jchen10191381f2017-04-11 13:59:04 +08001559 default:
1560 UNREACHABLE();
1561 return -1;
1562 }
1563}
1564
jchen10880683b2017-04-12 16:21:55 +08001565void QueryProgramResourceiv(const Program *program,
1566 GLenum programInterface,
1567 GLuint index,
1568 GLsizei propCount,
1569 const GLenum *props,
1570 GLsizei bufSize,
1571 GLsizei *length,
1572 GLint *params)
1573{
1574 if (!program->isLinked())
1575 {
1576 if (length != nullptr)
1577 {
1578 *length = 0;
1579 }
1580 return;
1581 }
1582
jchen1058f67be2017-10-27 08:59:27 +08001583 GLsizei pos = 0;
1584 for (GLsizei i = 0; i < propCount; i++)
jchen10880683b2017-04-12 16:21:55 +08001585 {
1586 switch (programInterface)
1587 {
1588 case GL_PROGRAM_INPUT:
1589 params[i] = GetInputResourceProperty(program, index, props[i]);
jchen1058f67be2017-10-27 08:59:27 +08001590 ++pos;
jchen10880683b2017-04-12 16:21:55 +08001591 break;
1592
1593 case GL_PROGRAM_OUTPUT:
1594 params[i] = GetOutputResourceProperty(program, index, props[i]);
jchen1058f67be2017-10-27 08:59:27 +08001595 ++pos;
jchen10880683b2017-04-12 16:21:55 +08001596 break;
1597
jchen10880683b2017-04-12 16:21:55 +08001598 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001599 params[i] = GetUniformResourceProperty(program, index, props[i]);
jchen1058f67be2017-10-27 08:59:27 +08001600 ++pos;
1601 break;
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001602
1603 case GL_BUFFER_VARIABLE:
1604 params[i] = GetBufferVariableResourceProperty(program, index, props[i]);
1605 ++pos;
1606 break;
1607
jchen1058f67be2017-10-27 08:59:27 +08001608 case GL_UNIFORM_BLOCK:
1609 GetUniformBlockResourceProperty(program, index, props[i], params, bufSize, &pos);
jchen10baf5d942017-08-28 20:45:48 +08001610 break;
1611
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001612 case GL_SHADER_STORAGE_BLOCK:
1613 GetShaderStorageBlockResourceProperty(program, index, props[i], params, bufSize,
1614 &pos);
1615 break;
1616
jchen1058f67be2017-10-27 08:59:27 +08001617 case GL_ATOMIC_COUNTER_BUFFER:
1618 GetAtomicCounterBufferResourceProperty(program, index, props[i], params, bufSize,
1619 &pos);
1620 break;
jchen10910a3da2017-11-15 09:40:11 +08001621
jchen10880683b2017-04-12 16:21:55 +08001622 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10910a3da2017-11-15 09:40:11 +08001623 params[i] = GetTransformFeedbackVaryingResourceProperty(program, index, props[i]);
1624 ++pos;
jchen10880683b2017-04-12 16:21:55 +08001625 break;
1626
1627 default:
1628 UNREACHABLE();
1629 params[i] = GL_INVALID_VALUE;
1630 }
jchen1058f67be2017-10-27 08:59:27 +08001631 if (pos == bufSize)
1632 {
1633 // Most properties return one value, but GL_ACTIVE_VARIABLES returns an array of values.
1634 // This checks not to break buffer bounds for such case.
1635 break;
1636 }
1637 }
1638
1639 if (length != nullptr)
1640 {
1641 *length = pos;
jchen10880683b2017-04-12 16:21:55 +08001642 }
1643}
1644
jchen10d9cd7b72017-08-30 15:04:25 +08001645void QueryProgramInterfaceiv(const Program *program,
1646 GLenum programInterface,
1647 GLenum pname,
1648 GLint *params)
1649{
1650 switch (pname)
1651 {
1652 case GL_ACTIVE_RESOURCES:
1653 *params = QueryProgramInterfaceActiveResources(program, programInterface);
1654 break;
1655
1656 case GL_MAX_NAME_LENGTH:
1657 *params = QueryProgramInterfaceMaxNameLength(program, programInterface);
1658 break;
1659
1660 case GL_MAX_NUM_ACTIVE_VARIABLES:
1661 *params = QueryProgramInterfaceMaxNumActiveVariables(program, programInterface);
1662 break;
1663
1664 default:
1665 UNREACHABLE();
1666 }
1667}
1668
Geoff Lang65603eb2017-01-12 16:48:03 -05001669} // namespace gl
1670
1671namespace egl
1672{
1673
1674void QueryConfigAttrib(const Config *config, EGLint attribute, EGLint *value)
1675{
1676 ASSERT(config != nullptr);
1677 switch (attribute)
1678 {
1679 case EGL_BUFFER_SIZE:
1680 *value = config->bufferSize;
1681 break;
1682 case EGL_ALPHA_SIZE:
1683 *value = config->alphaSize;
1684 break;
1685 case EGL_BLUE_SIZE:
1686 *value = config->blueSize;
1687 break;
1688 case EGL_GREEN_SIZE:
1689 *value = config->greenSize;
1690 break;
1691 case EGL_RED_SIZE:
1692 *value = config->redSize;
1693 break;
1694 case EGL_DEPTH_SIZE:
1695 *value = config->depthSize;
1696 break;
1697 case EGL_STENCIL_SIZE:
1698 *value = config->stencilSize;
1699 break;
1700 case EGL_CONFIG_CAVEAT:
1701 *value = config->configCaveat;
1702 break;
1703 case EGL_CONFIG_ID:
1704 *value = config->configID;
1705 break;
1706 case EGL_LEVEL:
1707 *value = config->level;
1708 break;
1709 case EGL_NATIVE_RENDERABLE:
1710 *value = config->nativeRenderable;
1711 break;
1712 case EGL_NATIVE_VISUAL_ID:
1713 *value = config->nativeVisualID;
1714 break;
1715 case EGL_NATIVE_VISUAL_TYPE:
1716 *value = config->nativeVisualType;
1717 break;
1718 case EGL_SAMPLES:
1719 *value = config->samples;
1720 break;
1721 case EGL_SAMPLE_BUFFERS:
1722 *value = config->sampleBuffers;
1723 break;
1724 case EGL_SURFACE_TYPE:
1725 *value = config->surfaceType;
1726 break;
1727 case EGL_TRANSPARENT_TYPE:
1728 *value = config->transparentType;
1729 break;
1730 case EGL_TRANSPARENT_BLUE_VALUE:
1731 *value = config->transparentBlueValue;
1732 break;
1733 case EGL_TRANSPARENT_GREEN_VALUE:
1734 *value = config->transparentGreenValue;
1735 break;
1736 case EGL_TRANSPARENT_RED_VALUE:
1737 *value = config->transparentRedValue;
1738 break;
1739 case EGL_BIND_TO_TEXTURE_RGB:
1740 *value = config->bindToTextureRGB;
1741 break;
1742 case EGL_BIND_TO_TEXTURE_RGBA:
1743 *value = config->bindToTextureRGBA;
1744 break;
1745 case EGL_MIN_SWAP_INTERVAL:
1746 *value = config->minSwapInterval;
1747 break;
1748 case EGL_MAX_SWAP_INTERVAL:
1749 *value = config->maxSwapInterval;
1750 break;
1751 case EGL_LUMINANCE_SIZE:
1752 *value = config->luminanceSize;
1753 break;
1754 case EGL_ALPHA_MASK_SIZE:
1755 *value = config->alphaMaskSize;
1756 break;
1757 case EGL_COLOR_BUFFER_TYPE:
1758 *value = config->colorBufferType;
1759 break;
1760 case EGL_RENDERABLE_TYPE:
1761 *value = config->renderableType;
1762 break;
1763 case EGL_MATCH_NATIVE_PIXMAP:
1764 *value = false;
1765 UNIMPLEMENTED();
1766 break;
1767 case EGL_CONFORMANT:
1768 *value = config->conformant;
1769 break;
1770 case EGL_MAX_PBUFFER_WIDTH:
1771 *value = config->maxPBufferWidth;
1772 break;
1773 case EGL_MAX_PBUFFER_HEIGHT:
1774 *value = config->maxPBufferHeight;
1775 break;
1776 case EGL_MAX_PBUFFER_PIXELS:
1777 *value = config->maxPBufferPixels;
1778 break;
1779 case EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE:
1780 *value = config->optimalOrientation;
1781 break;
Geoff Langc5a2a172017-01-13 15:55:07 -05001782 case EGL_COLOR_COMPONENT_TYPE_EXT:
1783 *value = config->colorComponentType;
1784 break;
Geoff Lang65603eb2017-01-12 16:48:03 -05001785 default:
1786 UNREACHABLE();
1787 break;
1788 }
Geoff Langff5b2d52016-09-07 11:32:23 -04001789}
Geoff Lang65603eb2017-01-12 16:48:03 -05001790
Geoff Langaf143fe2017-10-05 13:59:43 -04001791void QueryContextAttrib(const gl::Context *context, EGLint attribute, EGLint *value)
1792{
1793 switch (attribute)
1794 {
1795 case EGL_CONFIG_ID:
1796 *value = context->getConfig()->configID;
1797 break;
1798 case EGL_CONTEXT_CLIENT_TYPE:
1799 *value = context->getClientType();
1800 break;
1801 case EGL_CONTEXT_CLIENT_VERSION:
1802 *value = context->getClientMajorVersion();
1803 break;
1804 case EGL_RENDER_BUFFER:
1805 *value = context->getRenderBuffer();
1806 break;
Geoff Langb433e872017-10-05 14:01:47 -04001807 case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
1808 *value = context->isRobustResourceInitEnabled();
1809 break;
Geoff Langaf143fe2017-10-05 13:59:43 -04001810 default:
1811 UNREACHABLE();
1812 break;
1813 }
1814}
1815
Geoff Lang31ecbd72017-07-26 13:01:27 -04001816void QuerySurfaceAttrib(const Surface *surface, EGLint attribute, EGLint *value)
1817{
1818 switch (attribute)
1819 {
1820 case EGL_GL_COLORSPACE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001821 *value = surface->getGLColorspace();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001822 break;
1823 case EGL_VG_ALPHA_FORMAT:
Geoff Lang40ac7832017-07-26 14:38:46 -04001824 *value = surface->getVGAlphaFormat();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001825 break;
1826 case EGL_VG_COLORSPACE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001827 *value = surface->getVGColorspace();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001828 break;
1829 case EGL_CONFIG_ID:
1830 *value = surface->getConfig()->configID;
1831 break;
1832 case EGL_HEIGHT:
1833 *value = surface->getHeight();
1834 break;
1835 case EGL_HORIZONTAL_RESOLUTION:
Geoff Lang40ac7832017-07-26 14:38:46 -04001836 *value = surface->getHorizontalResolution();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001837 break;
1838 case EGL_LARGEST_PBUFFER:
Geoff Lang40ac7832017-07-26 14:38:46 -04001839 // The EGL spec states that value is not written if the surface is not a pbuffer
1840 if (surface->getType() == EGL_PBUFFER_BIT)
1841 {
1842 *value = surface->getLargestPbuffer();
1843 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001844 break;
1845 case EGL_MIPMAP_TEXTURE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001846 // The EGL spec states that value is not written if the surface is not a pbuffer
1847 if (surface->getType() == EGL_PBUFFER_BIT)
1848 {
1849 *value = surface->getMipmapTexture();
1850 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001851 break;
1852 case EGL_MIPMAP_LEVEL:
Geoff Lang40ac7832017-07-26 14:38:46 -04001853 // The EGL spec states that value is not written if the surface is not a pbuffer
1854 if (surface->getType() == EGL_PBUFFER_BIT)
1855 {
1856 *value = surface->getMipmapLevel();
1857 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001858 break;
1859 case EGL_MULTISAMPLE_RESOLVE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001860 *value = surface->getMultisampleResolve();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001861 break;
1862 case EGL_PIXEL_ASPECT_RATIO:
1863 *value = surface->getPixelAspectRatio();
1864 break;
1865 case EGL_RENDER_BUFFER:
1866 *value = surface->getRenderBuffer();
1867 break;
1868 case EGL_SWAP_BEHAVIOR:
1869 *value = surface->getSwapBehavior();
1870 break;
1871 case EGL_TEXTURE_FORMAT:
Geoff Lang40ac7832017-07-26 14:38:46 -04001872 // The EGL spec states that value is not written if the surface is not a pbuffer
1873 if (surface->getType() == EGL_PBUFFER_BIT)
1874 {
1875 *value = surface->getTextureFormat();
1876 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001877 break;
1878 case EGL_TEXTURE_TARGET:
Geoff Lang40ac7832017-07-26 14:38:46 -04001879 // The EGL spec states that value is not written if the surface is not a pbuffer
1880 if (surface->getType() == EGL_PBUFFER_BIT)
1881 {
1882 *value = surface->getTextureTarget();
1883 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001884 break;
1885 case EGL_VERTICAL_RESOLUTION:
Geoff Lang40ac7832017-07-26 14:38:46 -04001886 *value = surface->getVerticalResolution();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001887 break;
1888 case EGL_WIDTH:
1889 *value = surface->getWidth();
1890 break;
1891 case EGL_POST_SUB_BUFFER_SUPPORTED_NV:
1892 *value = surface->isPostSubBufferSupported();
1893 break;
1894 case EGL_FIXED_SIZE_ANGLE:
1895 *value = surface->isFixedSize();
1896 break;
1897 case EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE:
1898 *value = surface->flexibleSurfaceCompatibilityRequested();
1899 break;
1900 case EGL_SURFACE_ORIENTATION_ANGLE:
1901 *value = surface->getOrientation();
1902 break;
1903 case EGL_DIRECT_COMPOSITION_ANGLE:
1904 *value = surface->directComposition();
1905 break;
Geoff Langb433e872017-10-05 14:01:47 -04001906 case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
1907 *value = surface->isRobustResourceInitEnabled();
1908 break;
Geoff Lang31ecbd72017-07-26 13:01:27 -04001909 default:
1910 UNREACHABLE();
1911 break;
1912 }
1913}
1914
1915void SetSurfaceAttrib(Surface *surface, EGLint attribute, EGLint value)
1916{
1917 switch (attribute)
1918 {
1919 case EGL_MIPMAP_LEVEL:
Geoff Lang40ac7832017-07-26 14:38:46 -04001920 surface->setMipmapLevel(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04001921 break;
1922 case EGL_MULTISAMPLE_RESOLVE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001923 surface->setMultisampleResolve(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04001924 break;
1925 case EGL_SWAP_BEHAVIOR:
Geoff Lang40ac7832017-07-26 14:38:46 -04001926 surface->setSwapBehavior(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04001927 break;
1928 default:
1929 UNREACHABLE();
1930 break;
1931 }
1932}
1933
Geoff Lang65603eb2017-01-12 16:48:03 -05001934} // namespace egl