blob: 5362515c3849bc7fc233eb385c66c28a5b8851b2 [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"
Lingfeng Yangd0febe72018-05-17 22:36:52 -070018#include "libANGLE/GLES1State.h"
Geoff Langff5b2d52016-09-07 11:32:23 -040019#include "libANGLE/Program.h"
Geoff Lang740d9022016-10-07 11:20:52 -040020#include "libANGLE/Renderbuffer.h"
Geoff Langc1984ed2016-10-07 12:41:00 -040021#include "libANGLE/Sampler.h"
Geoff Langd7d0ed32016-10-07 11:33:51 -040022#include "libANGLE/Shader.h"
Geoff Lang31ecbd72017-07-26 13:01:27 -040023#include "libANGLE/Surface.h"
Geoff Langc1984ed2016-10-07 12:41:00 -040024#include "libANGLE/Texture.h"
Geoff Lang6899b872016-10-14 11:30:13 -040025#include "libANGLE/Uniform.h"
Geoff Lang0b031062016-10-13 14:30:04 -040026#include "libANGLE/VertexAttribute.h"
jchen10a99ed552017-09-22 08:10:32 +080027#include "libANGLE/queryconversions.h"
Geoff Langff5b2d52016-09-07 11:32:23 -040028
29namespace gl
30{
Geoff Langc1984ed2016-10-07 12:41:00 -040031
32namespace
33{
jchen10a99ed552017-09-22 08:10:32 +080034
Till Rathmannb8543632018-10-02 19:46:14 +020035template <bool isPureInteger>
36ColorGeneric ConvertToColor(const GLfloat *params)
37{
38 if (isPureInteger)
39 {
40 UNREACHABLE();
41 return ColorGeneric(ColorI());
42 }
43 else
44 {
45 return ColorGeneric(ColorF::fromData(params));
46 }
47}
48
49template <bool isPureInteger>
50ColorGeneric ConvertToColor(const GLint *params)
51{
52 if (isPureInteger)
53 {
54 return ColorGeneric(ColorI(params[0], params[1], params[2], params[3]));
55 }
56 else
57 {
58 return ColorGeneric(ColorF(normalizedToFloat(params[0]), normalizedToFloat(params[1]),
59 normalizedToFloat(params[2]), normalizedToFloat(params[3])));
60 }
61}
62
63template <bool isPureInteger>
64ColorGeneric ConvertToColor(const GLuint *params)
65{
66 if (isPureInteger)
67 {
68 return ColorGeneric(ColorUI(params[0], params[1], params[2], params[3]));
69 }
70 else
71 {
72 UNREACHABLE();
73 return ColorGeneric(ColorF());
74 }
75}
76
77template <bool isPureInteger>
78void ConvertFromColor(const ColorGeneric &color, GLfloat *outParams)
79{
80 if (isPureInteger)
81 {
82 UNREACHABLE();
83 }
84 else
85 {
86 ASSERT(color.type == ColorGeneric::Type::Float);
87 color.colorF.writeData(outParams);
88 }
89}
90
91template <bool isPureInteger>
92void ConvertFromColor(const ColorGeneric &color, GLint *outParams)
93{
94 if (isPureInteger)
95 {
96 ASSERT(color.type == ColorGeneric::Type::Int);
97 outParams[0] = color.colorI.red;
98 outParams[1] = color.colorI.green;
99 outParams[2] = color.colorI.blue;
100 outParams[3] = color.colorI.alpha;
101 }
102 else
103 {
104 ASSERT(color.type == ColorGeneric::Type::Float);
105 outParams[0] = floatToNormalized<GLint>(color.colorF.red);
106 outParams[1] = floatToNormalized<GLint>(color.colorF.green);
107 outParams[2] = floatToNormalized<GLint>(color.colorF.blue);
108 outParams[3] = floatToNormalized<GLint>(color.colorF.alpha);
109 }
110}
111
112template <bool isPureInteger>
113void ConvertFromColor(const ColorGeneric &color, GLuint *outParams)
114{
115 if (isPureInteger)
116 {
117 ASSERT(color.type == ColorGeneric::Type::UInt);
118 outParams[0] = color.colorUI.red;
119 outParams[1] = color.colorUI.green;
120 outParams[2] = color.colorUI.blue;
121 outParams[3] = color.colorUI.alpha;
122 }
123 else
124 {
125 UNREACHABLE();
126 }
127}
128
Geoff Langc1984ed2016-10-07 12:41:00 -0400129template <typename ParamType>
He Yunchao11b038b2016-11-22 21:24:04 +0800130void QueryTexLevelParameterBase(const Texture *texture,
Corentin Wallez99d492c2018-02-27 15:17:10 -0500131 TextureTarget target,
He Yunchao11b038b2016-11-22 21:24:04 +0800132 GLint level,
133 GLenum pname,
134 ParamType *params)
135{
136 ASSERT(texture != nullptr);
137 const InternalFormat *info = texture->getTextureState().getImageDesc(target, level).format.info;
138
139 switch (pname)
140 {
141 case GL_TEXTURE_RED_TYPE:
jchen10a99ed552017-09-22 08:10:32 +0800142 *params = CastFromGLintStateValue<ParamType>(
143 pname, info->redBits ? info->componentType : GL_NONE);
He Yunchao11b038b2016-11-22 21:24:04 +0800144 break;
145 case GL_TEXTURE_GREEN_TYPE:
jchen10a99ed552017-09-22 08:10:32 +0800146 *params = CastFromGLintStateValue<ParamType>(
147 pname, info->greenBits ? info->componentType : GL_NONE);
He Yunchao11b038b2016-11-22 21:24:04 +0800148 break;
149 case GL_TEXTURE_BLUE_TYPE:
jchen10a99ed552017-09-22 08:10:32 +0800150 *params = CastFromGLintStateValue<ParamType>(
151 pname, info->blueBits ? info->componentType : GL_NONE);
He Yunchao11b038b2016-11-22 21:24:04 +0800152 break;
153 case GL_TEXTURE_ALPHA_TYPE:
jchen10a99ed552017-09-22 08:10:32 +0800154 *params = CastFromGLintStateValue<ParamType>(
155 pname, info->alphaBits ? info->componentType : GL_NONE);
He Yunchao11b038b2016-11-22 21:24:04 +0800156 break;
157 case GL_TEXTURE_DEPTH_TYPE:
jchen10a99ed552017-09-22 08:10:32 +0800158 *params = CastFromGLintStateValue<ParamType>(
159 pname, info->depthBits ? info->componentType : GL_NONE);
He Yunchao11b038b2016-11-22 21:24:04 +0800160 break;
161 case GL_TEXTURE_RED_SIZE:
jchen10a99ed552017-09-22 08:10:32 +0800162 *params = CastFromGLintStateValue<ParamType>(pname, info->redBits);
He Yunchao11b038b2016-11-22 21:24:04 +0800163 break;
164 case GL_TEXTURE_GREEN_SIZE:
jchen10a99ed552017-09-22 08:10:32 +0800165 *params = CastFromGLintStateValue<ParamType>(pname, info->greenBits);
He Yunchao11b038b2016-11-22 21:24:04 +0800166 break;
167 case GL_TEXTURE_BLUE_SIZE:
jchen10a99ed552017-09-22 08:10:32 +0800168 *params = CastFromGLintStateValue<ParamType>(pname, info->blueBits);
He Yunchao11b038b2016-11-22 21:24:04 +0800169 break;
170 case GL_TEXTURE_ALPHA_SIZE:
jchen10a99ed552017-09-22 08:10:32 +0800171 *params = CastFromGLintStateValue<ParamType>(pname, info->alphaBits);
He Yunchao11b038b2016-11-22 21:24:04 +0800172 break;
173 case GL_TEXTURE_DEPTH_SIZE:
jchen10a99ed552017-09-22 08:10:32 +0800174 *params = CastFromGLintStateValue<ParamType>(pname, info->depthBits);
He Yunchao11b038b2016-11-22 21:24:04 +0800175 break;
176 case GL_TEXTURE_STENCIL_SIZE:
jchen10a99ed552017-09-22 08:10:32 +0800177 *params = CastFromGLintStateValue<ParamType>(pname, info->stencilBits);
He Yunchao11b038b2016-11-22 21:24:04 +0800178 break;
179 case GL_TEXTURE_SHARED_SIZE:
jchen10a99ed552017-09-22 08:10:32 +0800180 *params = CastFromGLintStateValue<ParamType>(pname, info->sharedBits);
He Yunchao11b038b2016-11-22 21:24:04 +0800181 break;
182 case GL_TEXTURE_INTERNAL_FORMAT:
jchen10a99ed552017-09-22 08:10:32 +0800183 *params = CastFromGLintStateValue<ParamType>(
184 pname, info->internalFormat ? info->internalFormat : GL_RGBA);
He Yunchao11b038b2016-11-22 21:24:04 +0800185 break;
186 case GL_TEXTURE_WIDTH:
Corentin Wallez10d40262017-10-04 16:34:09 -0400187 *params = CastFromGLintStateValue<ParamType>(
188 pname, static_cast<uint32_t>(texture->getWidth(target, level)));
He Yunchao11b038b2016-11-22 21:24:04 +0800189 break;
190 case GL_TEXTURE_HEIGHT:
Corentin Wallez10d40262017-10-04 16:34:09 -0400191 *params = CastFromGLintStateValue<ParamType>(
192 pname, static_cast<uint32_t>(texture->getHeight(target, level)));
He Yunchao11b038b2016-11-22 21:24:04 +0800193 break;
194 case GL_TEXTURE_DEPTH:
Corentin Wallez10d40262017-10-04 16:34:09 -0400195 *params = CastFromGLintStateValue<ParamType>(
196 pname, static_cast<uint32_t>(texture->getDepth(target, level)));
He Yunchao11b038b2016-11-22 21:24:04 +0800197 break;
198 case GL_TEXTURE_SAMPLES:
jchen10a99ed552017-09-22 08:10:32 +0800199 *params = CastFromStateValue<ParamType>(pname, texture->getSamples(target, level));
He Yunchao11b038b2016-11-22 21:24:04 +0800200 break;
201 case GL_TEXTURE_FIXED_SAMPLE_LOCATIONS:
jchen10a99ed552017-09-22 08:10:32 +0800202 *params = CastFromStateValue<ParamType>(
203 pname, static_cast<GLint>(texture->getFixedSampleLocations(target, level)));
He Yunchao11b038b2016-11-22 21:24:04 +0800204 break;
205 case GL_TEXTURE_COMPRESSED:
jchen10a99ed552017-09-22 08:10:32 +0800206 *params = CastFromStateValue<ParamType>(pname, static_cast<GLint>(info->compressed));
He Yunchao11b038b2016-11-22 21:24:04 +0800207 break;
Geoff Lang79b91402018-10-04 15:11:30 -0400208 case GL_MEMORY_SIZE_ANGLE:
209 *params =
210 CastFromStateValue<ParamType>(pname, texture->getLevelMemorySize(target, level));
211 break;
He Yunchao11b038b2016-11-22 21:24:04 +0800212 default:
213 UNREACHABLE();
214 break;
215 }
216}
217
Till Rathmannb8543632018-10-02 19:46:14 +0200218template <bool isPureInteger, typename ParamType>
Geoff Langc1984ed2016-10-07 12:41:00 -0400219void QueryTexParameterBase(const Texture *texture, GLenum pname, ParamType *params)
220{
221 ASSERT(texture != nullptr);
222
223 switch (pname)
224 {
225 case GL_TEXTURE_MAG_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800226 *params = CastFromGLintStateValue<ParamType>(pname, texture->getMagFilter());
Geoff Langc1984ed2016-10-07 12:41:00 -0400227 break;
228 case GL_TEXTURE_MIN_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800229 *params = CastFromGLintStateValue<ParamType>(pname, texture->getMinFilter());
Geoff Langc1984ed2016-10-07 12:41:00 -0400230 break;
231 case GL_TEXTURE_WRAP_S:
jchen10a99ed552017-09-22 08:10:32 +0800232 *params = CastFromGLintStateValue<ParamType>(pname, texture->getWrapS());
Geoff Langc1984ed2016-10-07 12:41:00 -0400233 break;
234 case GL_TEXTURE_WRAP_T:
jchen10a99ed552017-09-22 08:10:32 +0800235 *params = CastFromGLintStateValue<ParamType>(pname, texture->getWrapT());
Geoff Langc1984ed2016-10-07 12:41:00 -0400236 break;
237 case GL_TEXTURE_WRAP_R:
jchen10a99ed552017-09-22 08:10:32 +0800238 *params = CastFromGLintStateValue<ParamType>(pname, texture->getWrapR());
Geoff Langc1984ed2016-10-07 12:41:00 -0400239 break;
240 case GL_TEXTURE_IMMUTABLE_FORMAT:
jchen10a99ed552017-09-22 08:10:32 +0800241 *params = CastFromGLintStateValue<ParamType>(pname, texture->getImmutableFormat());
Geoff Langc1984ed2016-10-07 12:41:00 -0400242 break;
243 case GL_TEXTURE_IMMUTABLE_LEVELS:
jchen10a99ed552017-09-22 08:10:32 +0800244 *params = CastFromGLintStateValue<ParamType>(pname, texture->getImmutableLevels());
Geoff Langc1984ed2016-10-07 12:41:00 -0400245 break;
246 case GL_TEXTURE_USAGE_ANGLE:
jchen10a99ed552017-09-22 08:10:32 +0800247 *params = CastFromGLintStateValue<ParamType>(pname, texture->getUsage());
Geoff Langc1984ed2016-10-07 12:41:00 -0400248 break;
249 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800250 *params = CastFromStateValue<ParamType>(pname, texture->getMaxAnisotropy());
Geoff Langc1984ed2016-10-07 12:41:00 -0400251 break;
252 case GL_TEXTURE_SWIZZLE_R:
jchen10a99ed552017-09-22 08:10:32 +0800253 *params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleRed());
Geoff Langc1984ed2016-10-07 12:41:00 -0400254 break;
255 case GL_TEXTURE_SWIZZLE_G:
jchen10a99ed552017-09-22 08:10:32 +0800256 *params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleGreen());
Geoff Langc1984ed2016-10-07 12:41:00 -0400257 break;
258 case GL_TEXTURE_SWIZZLE_B:
jchen10a99ed552017-09-22 08:10:32 +0800259 *params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleBlue());
Geoff Langc1984ed2016-10-07 12:41:00 -0400260 break;
261 case GL_TEXTURE_SWIZZLE_A:
jchen10a99ed552017-09-22 08:10:32 +0800262 *params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleAlpha());
Geoff Langc1984ed2016-10-07 12:41:00 -0400263 break;
264 case GL_TEXTURE_BASE_LEVEL:
jchen10a99ed552017-09-22 08:10:32 +0800265 *params = CastFromGLintStateValue<ParamType>(pname, texture->getBaseLevel());
Geoff Langc1984ed2016-10-07 12:41:00 -0400266 break;
267 case GL_TEXTURE_MAX_LEVEL:
jchen10a99ed552017-09-22 08:10:32 +0800268 *params = CastFromGLintStateValue<ParamType>(pname, texture->getMaxLevel());
Geoff Langc1984ed2016-10-07 12:41:00 -0400269 break;
270 case GL_TEXTURE_MIN_LOD:
Jamie Madill097d3c02018-09-12 11:03:05 -0400271 *params = CastFromStateValue<ParamType>(pname, texture->getMinLod());
Geoff Langc1984ed2016-10-07 12:41:00 -0400272 break;
273 case GL_TEXTURE_MAX_LOD:
Jamie Madill097d3c02018-09-12 11:03:05 -0400274 *params = CastFromStateValue<ParamType>(pname, texture->getMaxLod());
Geoff Langc1984ed2016-10-07 12:41:00 -0400275 break;
276 case GL_TEXTURE_COMPARE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800277 *params = CastFromGLintStateValue<ParamType>(pname, texture->getCompareMode());
Geoff Langc1984ed2016-10-07 12:41:00 -0400278 break;
279 case GL_TEXTURE_COMPARE_FUNC:
jchen10a99ed552017-09-22 08:10:32 +0800280 *params = CastFromGLintStateValue<ParamType>(pname, texture->getCompareFunc());
Geoff Langc1984ed2016-10-07 12:41:00 -0400281 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700282 case GL_TEXTURE_SRGB_DECODE_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800283 *params = CastFromGLintStateValue<ParamType>(pname, texture->getSRGBDecode());
Geoff Lang81c6b572016-10-19 14:07:52 -0700284 break;
Yunchao Hebacaa712018-01-30 14:01:39 +0800285 case GL_DEPTH_STENCIL_TEXTURE_MODE:
286 *params =
287 CastFromGLintStateValue<ParamType>(pname, texture->getDepthStencilTextureMode());
288 break;
Lingfeng Yangf97641c2018-06-21 19:22:45 -0700289 case GL_TEXTURE_CROP_RECT_OES:
290 {
291 const gl::Rectangle &crop = texture->getCrop();
292 params[0] = CastFromGLintStateValue<ParamType>(pname, crop.x);
293 params[1] = CastFromGLintStateValue<ParamType>(pname, crop.y);
294 params[2] = CastFromGLintStateValue<ParamType>(pname, crop.width);
295 params[3] = CastFromGLintStateValue<ParamType>(pname, crop.height);
296 break;
297 }
298 case GL_GENERATE_MIPMAP:
299 *params = CastFromGLintStateValue<ParamType>(pname, texture->getGenerateMipmapHint());
300 break;
Geoff Lang79b91402018-10-04 15:11:30 -0400301 case GL_MEMORY_SIZE_ANGLE:
302 *params = CastFromStateValue<ParamType>(pname, texture->getMemorySize());
303 break;
Till Rathmannb8543632018-10-02 19:46:14 +0200304 case GL_TEXTURE_BORDER_COLOR:
305 ConvertFromColor<isPureInteger>(texture->getBorderColor(), params);
306 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400307 default:
308 UNREACHABLE();
309 break;
310 }
311}
312
Till Rathmannb8543632018-10-02 19:46:14 +0200313template <bool isPureInteger, typename ParamType>
Jamie Madill4928b7c2017-06-20 12:57:39 -0400314void SetTexParameterBase(Context *context, Texture *texture, GLenum pname, const ParamType *params)
Geoff Langc1984ed2016-10-07 12:41:00 -0400315{
316 ASSERT(texture != nullptr);
317
318 switch (pname)
319 {
320 case GL_TEXTURE_WRAP_S:
jchen10a99ed552017-09-22 08:10:32 +0800321 texture->setWrapS(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400322 break;
323 case GL_TEXTURE_WRAP_T:
jchen10a99ed552017-09-22 08:10:32 +0800324 texture->setWrapT(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400325 break;
326 case GL_TEXTURE_WRAP_R:
jchen10a99ed552017-09-22 08:10:32 +0800327 texture->setWrapR(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400328 break;
329 case GL_TEXTURE_MIN_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800330 texture->setMinFilter(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400331 break;
332 case GL_TEXTURE_MAG_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800333 texture->setMagFilter(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400334 break;
335 case GL_TEXTURE_USAGE_ANGLE:
jchen10a99ed552017-09-22 08:10:32 +0800336 texture->setUsage(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400337 break;
338 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800339 texture->setMaxAnisotropy(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400340 break;
341 case GL_TEXTURE_COMPARE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800342 texture->setCompareMode(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400343 break;
344 case GL_TEXTURE_COMPARE_FUNC:
jchen10a99ed552017-09-22 08:10:32 +0800345 texture->setCompareFunc(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400346 break;
347 case GL_TEXTURE_SWIZZLE_R:
jchen10a99ed552017-09-22 08:10:32 +0800348 texture->setSwizzleRed(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400349 break;
350 case GL_TEXTURE_SWIZZLE_G:
jchen10a99ed552017-09-22 08:10:32 +0800351 texture->setSwizzleGreen(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400352 break;
353 case GL_TEXTURE_SWIZZLE_B:
jchen10a99ed552017-09-22 08:10:32 +0800354 texture->setSwizzleBlue(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400355 break;
356 case GL_TEXTURE_SWIZZLE_A:
jchen10a99ed552017-09-22 08:10:32 +0800357 texture->setSwizzleAlpha(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400358 break;
359 case GL_TEXTURE_BASE_LEVEL:
Jamie Madill4928b7c2017-06-20 12:57:39 -0400360 {
jchen10a99ed552017-09-22 08:10:32 +0800361 context->handleError(texture->setBaseLevel(
362 context, clampCast<GLuint>(CastQueryValueTo<GLint>(pname, params[0]))));
Geoff Langc1984ed2016-10-07 12:41:00 -0400363 break;
Jamie Madill4928b7c2017-06-20 12:57:39 -0400364 }
Geoff Langc1984ed2016-10-07 12:41:00 -0400365 case GL_TEXTURE_MAX_LEVEL:
jchen10a99ed552017-09-22 08:10:32 +0800366 texture->setMaxLevel(clampCast<GLuint>(CastQueryValueTo<GLint>(pname, params[0])));
Geoff Langc1984ed2016-10-07 12:41:00 -0400367 break;
368 case GL_TEXTURE_MIN_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800369 texture->setMinLod(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400370 break;
371 case GL_TEXTURE_MAX_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800372 texture->setMaxLod(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400373 break;
Geoff Lang3b573612016-10-31 14:08:10 -0400374 case GL_DEPTH_STENCIL_TEXTURE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800375 texture->setDepthStencilTextureMode(ConvertToGLenum(pname, params[0]));
Geoff Lang3b573612016-10-31 14:08:10 -0400376 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700377 case GL_TEXTURE_SRGB_DECODE_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800378 texture->setSRGBDecode(ConvertToGLenum(pname, params[0]));
Geoff Lang81c6b572016-10-19 14:07:52 -0700379 break;
Lingfeng Yangf97641c2018-06-21 19:22:45 -0700380 case GL_TEXTURE_CROP_RECT_OES:
381 texture->setCrop(gl::Rectangle(CastQueryValueTo<GLint>(pname, params[0]),
382 CastQueryValueTo<GLint>(pname, params[1]),
383 CastQueryValueTo<GLint>(pname, params[2]),
384 CastQueryValueTo<GLint>(pname, params[3])));
385 break;
386 case GL_GENERATE_MIPMAP:
387 texture->setGenerateMipmapHint(ConvertToGLenum(params[0]));
388 break;
Till Rathmannb8543632018-10-02 19:46:14 +0200389 case GL_TEXTURE_BORDER_COLOR:
390 texture->setBorderColor(ConvertToColor<isPureInteger>(params));
391 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400392 default:
393 UNREACHABLE();
394 break;
395 }
396}
397
Till Rathmannb8543632018-10-02 19:46:14 +0200398template <bool isPureInteger, typename ParamType>
Geoff Langc1984ed2016-10-07 12:41:00 -0400399void QuerySamplerParameterBase(const Sampler *sampler, GLenum pname, ParamType *params)
400{
401 switch (pname)
402 {
403 case GL_TEXTURE_MIN_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800404 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getMinFilter());
Geoff Langc1984ed2016-10-07 12:41:00 -0400405 break;
406 case GL_TEXTURE_MAG_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800407 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getMagFilter());
Geoff Langc1984ed2016-10-07 12:41:00 -0400408 break;
409 case GL_TEXTURE_WRAP_S:
jchen10a99ed552017-09-22 08:10:32 +0800410 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getWrapS());
Geoff Langc1984ed2016-10-07 12:41:00 -0400411 break;
412 case GL_TEXTURE_WRAP_T:
jchen10a99ed552017-09-22 08:10:32 +0800413 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getWrapT());
Geoff Langc1984ed2016-10-07 12:41:00 -0400414 break;
415 case GL_TEXTURE_WRAP_R:
jchen10a99ed552017-09-22 08:10:32 +0800416 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getWrapR());
Geoff Langc1984ed2016-10-07 12:41:00 -0400417 break;
418 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800419 *params = CastFromStateValue<ParamType>(pname, sampler->getMaxAnisotropy());
Geoff Langc1984ed2016-10-07 12:41:00 -0400420 break;
421 case GL_TEXTURE_MIN_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800422 *params = CastFromStateValue<ParamType>(pname, sampler->getMinLod());
Geoff Langc1984ed2016-10-07 12:41:00 -0400423 break;
424 case GL_TEXTURE_MAX_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800425 *params = CastFromStateValue<ParamType>(pname, sampler->getMaxLod());
Geoff Langc1984ed2016-10-07 12:41:00 -0400426 break;
427 case GL_TEXTURE_COMPARE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800428 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getCompareMode());
Geoff Langc1984ed2016-10-07 12:41:00 -0400429 break;
430 case GL_TEXTURE_COMPARE_FUNC:
jchen10a99ed552017-09-22 08:10:32 +0800431 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getCompareFunc());
Geoff Langc1984ed2016-10-07 12:41:00 -0400432 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700433 case GL_TEXTURE_SRGB_DECODE_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800434 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getSRGBDecode());
Geoff Lang81c6b572016-10-19 14:07:52 -0700435 break;
Till Rathmannb8543632018-10-02 19:46:14 +0200436 case GL_TEXTURE_BORDER_COLOR:
437 ConvertFromColor<isPureInteger>(sampler->getBorderColor(), params);
438 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400439 default:
440 UNREACHABLE();
441 break;
442 }
443}
444
Till Rathmannb8543632018-10-02 19:46:14 +0200445template <bool isPureInteger, typename ParamType>
Jamie Madille25b8002018-09-20 13:39:49 -0400446void SetSamplerParameterBase(Context *context,
447 Sampler *sampler,
448 GLenum pname,
449 const ParamType *params)
Geoff Langc1984ed2016-10-07 12:41:00 -0400450{
451 switch (pname)
452 {
453 case GL_TEXTURE_WRAP_S:
jchen10a99ed552017-09-22 08:10:32 +0800454 sampler->setWrapS(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400455 break;
456 case GL_TEXTURE_WRAP_T:
jchen10a99ed552017-09-22 08:10:32 +0800457 sampler->setWrapT(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400458 break;
459 case GL_TEXTURE_WRAP_R:
jchen10a99ed552017-09-22 08:10:32 +0800460 sampler->setWrapR(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400461 break;
462 case GL_TEXTURE_MIN_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800463 sampler->setMinFilter(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400464 break;
465 case GL_TEXTURE_MAG_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800466 sampler->setMagFilter(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400467 break;
468 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800469 sampler->setMaxAnisotropy(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400470 break;
471 case GL_TEXTURE_COMPARE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800472 sampler->setCompareMode(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400473 break;
474 case GL_TEXTURE_COMPARE_FUNC:
jchen10a99ed552017-09-22 08:10:32 +0800475 sampler->setCompareFunc(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400476 break;
477 case GL_TEXTURE_MIN_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800478 sampler->setMinLod(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400479 break;
480 case GL_TEXTURE_MAX_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800481 sampler->setMaxLod(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400482 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700483 case GL_TEXTURE_SRGB_DECODE_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800484 sampler->setSRGBDecode(ConvertToGLenum(pname, params[0]));
Geoff Lang81c6b572016-10-19 14:07:52 -0700485 break;
Till Rathmannb8543632018-10-02 19:46:14 +0200486 case GL_TEXTURE_BORDER_COLOR:
487 sampler->setBorderColor(ConvertToColor<isPureInteger>(params));
488 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400489 default:
490 UNREACHABLE();
491 break;
492 }
Jamie Madille25b8002018-09-20 13:39:49 -0400493
494 sampler->onStateChange(context, angle::SubjectMessage::CONTENTS_CHANGED);
Geoff Langc1984ed2016-10-07 12:41:00 -0400495}
496
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800497// Warning: you should ensure binding really matches attrib.bindingIndex before using this function.
Geoff Lang0b031062016-10-13 14:30:04 -0400498template <typename ParamType, typename CurrentDataType, size_t CurrentValueCount>
499void QueryVertexAttribBase(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800500 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -0400501 const CurrentDataType (&currentValueData)[CurrentValueCount],
502 GLenum pname,
503 ParamType *params)
504{
505 switch (pname)
506 {
507 case GL_CURRENT_VERTEX_ATTRIB:
508 for (size_t i = 0; i < CurrentValueCount; ++i)
509 {
jchen10a99ed552017-09-22 08:10:32 +0800510 params[i] = CastFromStateValue<ParamType>(pname, currentValueData[i]);
Geoff Lang0b031062016-10-13 14:30:04 -0400511 }
512 break;
513 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
jchen10a99ed552017-09-22 08:10:32 +0800514 *params = CastFromStateValue<ParamType>(pname, static_cast<GLint>(attrib.enabled));
Geoff Lang0b031062016-10-13 14:30:04 -0400515 break;
516 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
jchen10a99ed552017-09-22 08:10:32 +0800517 *params = CastFromGLintStateValue<ParamType>(pname, attrib.size);
Geoff Lang0b031062016-10-13 14:30:04 -0400518 break;
519 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
jchen10a99ed552017-09-22 08:10:32 +0800520 *params = CastFromGLintStateValue<ParamType>(pname, attrib.vertexAttribArrayStride);
Geoff Lang0b031062016-10-13 14:30:04 -0400521 break;
522 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
jchen10a99ed552017-09-22 08:10:32 +0800523 *params = CastFromGLintStateValue<ParamType>(pname, attrib.type);
Geoff Lang0b031062016-10-13 14:30:04 -0400524 break;
525 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
jchen10a99ed552017-09-22 08:10:32 +0800526 *params = CastFromStateValue<ParamType>(pname, static_cast<GLint>(attrib.normalized));
Geoff Lang0b031062016-10-13 14:30:04 -0400527 break;
528 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
jchen10a99ed552017-09-22 08:10:32 +0800529 *params = CastFromGLintStateValue<ParamType>(pname, binding.getBuffer().id());
Geoff Lang0b031062016-10-13 14:30:04 -0400530 break;
531 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
Joonatan Saarhelobbd532d2018-10-10 17:40:26 +0300532 *params = CastFromStateValue<ParamType>(pname, binding.getDivisor());
Geoff Lang0b031062016-10-13 14:30:04 -0400533 break;
534 case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
jchen10a99ed552017-09-22 08:10:32 +0800535 *params = CastFromGLintStateValue<ParamType>(pname, attrib.pureInteger);
Geoff Lang0b031062016-10-13 14:30:04 -0400536 break;
Shao80957d92017-02-20 21:25:59 +0800537 case GL_VERTEX_ATTRIB_BINDING:
jchen10a99ed552017-09-22 08:10:32 +0800538 *params = CastFromGLintStateValue<ParamType>(pname, attrib.bindingIndex);
Shao80957d92017-02-20 21:25:59 +0800539 break;
540 case GL_VERTEX_ATTRIB_RELATIVE_OFFSET:
jchen10a99ed552017-09-22 08:10:32 +0800541 *params = CastFromGLintStateValue<ParamType>(pname, attrib.relativeOffset);
Shao80957d92017-02-20 21:25:59 +0800542 break;
Geoff Lang0b031062016-10-13 14:30:04 -0400543 default:
544 UNREACHABLE();
545 break;
546 }
547}
548
Geoff Langebebe1c2016-10-14 12:01:31 -0400549template <typename ParamType>
550void QueryBufferParameterBase(const Buffer *buffer, GLenum pname, ParamType *params)
551{
552 ASSERT(buffer != nullptr);
553
554 switch (pname)
555 {
556 case GL_BUFFER_USAGE:
Corentin Wallez2e568cf2017-09-18 17:05:22 -0400557 *params = CastFromGLintStateValue<ParamType>(pname, ToGLenum(buffer->getUsage()));
Geoff Langebebe1c2016-10-14 12:01:31 -0400558 break;
559 case GL_BUFFER_SIZE:
jchen10a99ed552017-09-22 08:10:32 +0800560 *params = CastFromStateValue<ParamType>(pname, buffer->getSize());
Geoff Langebebe1c2016-10-14 12:01:31 -0400561 break;
562 case GL_BUFFER_ACCESS_FLAGS:
jchen10a99ed552017-09-22 08:10:32 +0800563 *params = CastFromGLintStateValue<ParamType>(pname, buffer->getAccessFlags());
Geoff Langebebe1c2016-10-14 12:01:31 -0400564 break;
565 case GL_BUFFER_ACCESS_OES:
jchen10a99ed552017-09-22 08:10:32 +0800566 *params = CastFromGLintStateValue<ParamType>(pname, buffer->getAccess());
Geoff Langebebe1c2016-10-14 12:01:31 -0400567 break;
568 case GL_BUFFER_MAPPED:
jchen10a99ed552017-09-22 08:10:32 +0800569 *params = CastFromStateValue<ParamType>(pname, buffer->isMapped());
Geoff Langebebe1c2016-10-14 12:01:31 -0400570 break;
571 case GL_BUFFER_MAP_OFFSET:
jchen10a99ed552017-09-22 08:10:32 +0800572 *params = CastFromStateValue<ParamType>(pname, buffer->getMapOffset());
Geoff Langebebe1c2016-10-14 12:01:31 -0400573 break;
574 case GL_BUFFER_MAP_LENGTH:
jchen10a99ed552017-09-22 08:10:32 +0800575 *params = CastFromStateValue<ParamType>(pname, buffer->getMapLength());
Geoff Langebebe1c2016-10-14 12:01:31 -0400576 break;
Geoff Lang79b91402018-10-04 15:11:30 -0400577 case GL_MEMORY_SIZE_ANGLE:
578 *params = CastFromStateValue<ParamType>(pname, buffer->getMemorySize());
579 break;
Geoff Langebebe1c2016-10-14 12:01:31 -0400580 default:
581 UNREACHABLE();
582 break;
583 }
584}
585
Olli Etuaho465835d2017-09-26 13:34:10 +0300586GLint GetCommonVariableProperty(const sh::ShaderVariable &var, GLenum prop)
jchen10880683b2017-04-12 16:21:55 +0800587{
588 switch (prop)
589 {
590 case GL_TYPE:
jchen10a99ed552017-09-22 08:10:32 +0800591 return clampCast<GLint>(var.type);
jchen10880683b2017-04-12 16:21:55 +0800592
593 case GL_ARRAY_SIZE:
Olli Etuaho465835d2017-09-26 13:34:10 +0300594 // Queryable variables are guaranteed not to be arrays of arrays or arrays of structs,
595 // see GLES 3.1 spec section 7.3.1.1 page 77.
596 return clampCast<GLint>(var.getBasicTypeElementCount());
jchen10880683b2017-04-12 16:21:55 +0800597
598 case GL_NAME_LENGTH:
jchen10880683b2017-04-12 16:21:55 +0800599 // ES31 spec p84: This counts the terminating null char.
Olli Etuahod2551232017-10-26 20:03:33 +0300600 return clampCast<GLint>(var.name.size() + 1u);
jchen10880683b2017-04-12 16:21:55 +0800601
602 default:
603 UNREACHABLE();
604 return GL_INVALID_VALUE;
605 }
606}
607
608GLint GetInputResourceProperty(const Program *program, GLuint index, GLenum prop)
609{
610 const auto &attribute = program->getInputResource(index);
611 switch (prop)
612 {
613 case GL_TYPE:
614 case GL_ARRAY_SIZE:
jchen10880683b2017-04-12 16:21:55 +0800615 case GL_NAME_LENGTH:
Olli Etuaho465835d2017-09-26 13:34:10 +0300616 return GetCommonVariableProperty(attribute, prop);
jchen10880683b2017-04-12 16:21:55 +0800617
jchen10baf5d942017-08-28 20:45:48 +0800618 case GL_LOCATION:
619 return program->getAttributeLocation(attribute.name);
620
jchen10880683b2017-04-12 16:21:55 +0800621 case GL_REFERENCED_BY_VERTEX_SHADER:
622 return 1;
623
624 case GL_REFERENCED_BY_FRAGMENT_SHADER:
625 case GL_REFERENCED_BY_COMPUTE_SHADER:
Jiawei Shaoc6f82872018-04-24 14:14:50 +0800626 case GL_REFERENCED_BY_GEOMETRY_SHADER_EXT:
jchen10880683b2017-04-12 16:21:55 +0800627 return 0;
628
629 default:
630 UNREACHABLE();
631 return GL_INVALID_VALUE;
632 }
633}
634
635GLint GetOutputResourceProperty(const Program *program, GLuint index, const GLenum prop)
636{
637 const auto &outputVariable = program->getOutputResource(index);
638 switch (prop)
639 {
640 case GL_TYPE:
641 case GL_ARRAY_SIZE:
jchen10880683b2017-04-12 16:21:55 +0800642 case GL_NAME_LENGTH:
Olli Etuaho465835d2017-09-26 13:34:10 +0300643 return GetCommonVariableProperty(outputVariable, prop);
jchen10880683b2017-04-12 16:21:55 +0800644
jchen10baf5d942017-08-28 20:45:48 +0800645 case GL_LOCATION:
646 return program->getFragDataLocation(outputVariable.name);
647
Olli Etuaho0ca09752018-09-24 11:00:50 +0300648 case GL_LOCATION_INDEX_EXT:
649 // EXT_blend_func_extended
650 return program->getFragDataIndex(outputVariable.name);
651
jchen10880683b2017-04-12 16:21:55 +0800652 case GL_REFERENCED_BY_FRAGMENT_SHADER:
653 return 1;
654
Jiawei Shaoc6f82872018-04-24 14:14:50 +0800655 case GL_REFERENCED_BY_VERTEX_SHADER:
jchen10880683b2017-04-12 16:21:55 +0800656 case GL_REFERENCED_BY_COMPUTE_SHADER:
Jiawei Shaoc6f82872018-04-24 14:14:50 +0800657 case GL_REFERENCED_BY_GEOMETRY_SHADER_EXT:
jchen10880683b2017-04-12 16:21:55 +0800658 return 0;
659
660 default:
661 UNREACHABLE();
662 return GL_INVALID_VALUE;
663 }
664}
665
jchen10910a3da2017-11-15 09:40:11 +0800666GLint GetTransformFeedbackVaryingResourceProperty(const Program *program,
667 GLuint index,
668 const GLenum prop)
669{
670 const auto &tfVariable = program->getTransformFeedbackVaryingResource(index);
671 switch (prop)
672 {
673 case GL_TYPE:
674 return clampCast<GLint>(tfVariable.type);
675
676 case GL_ARRAY_SIZE:
677 return clampCast<GLint>(tfVariable.size());
678
679 case GL_NAME_LENGTH:
680 return clampCast<GLint>(tfVariable.nameWithArrayIndex().size() + 1);
681
682 default:
683 UNREACHABLE();
684 return GL_INVALID_VALUE;
685 }
686}
687
jchen10d9cd7b72017-08-30 15:04:25 +0800688GLint QueryProgramInterfaceActiveResources(const Program *program, GLenum programInterface)
689{
690 switch (programInterface)
691 {
692 case GL_PROGRAM_INPUT:
jchen10a99ed552017-09-22 08:10:32 +0800693 return clampCast<GLint>(program->getAttributes().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800694
695 case GL_PROGRAM_OUTPUT:
jchen10a99ed552017-09-22 08:10:32 +0800696 return clampCast<GLint>(program->getState().getOutputVariables().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800697
698 case GL_UNIFORM:
jchen10a99ed552017-09-22 08:10:32 +0800699 return clampCast<GLint>(program->getState().getUniforms().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800700
701 case GL_UNIFORM_BLOCK:
jchen10a99ed552017-09-22 08:10:32 +0800702 return clampCast<GLint>(program->getState().getUniformBlocks().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800703
jchen1058f67be2017-10-27 08:59:27 +0800704 case GL_ATOMIC_COUNTER_BUFFER:
705 return clampCast<GLint>(program->getState().getAtomicCounterBuffers().size());
706
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800707 case GL_BUFFER_VARIABLE:
708 return clampCast<GLint>(program->getState().getBufferVariables().size());
709
710 case GL_SHADER_STORAGE_BLOCK:
711 return clampCast<GLint>(program->getState().getShaderStorageBlocks().size());
712
jchen10d9cd7b72017-08-30 15:04:25 +0800713 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10910a3da2017-11-15 09:40:11 +0800714 return clampCast<GLint>(program->getTransformFeedbackVaryingCount());
jchen10d9cd7b72017-08-30 15:04:25 +0800715
716 default:
717 UNREACHABLE();
718 return 0;
719 }
720}
721
722template <typename T, typename M>
723GLint FindMaxSize(const std::vector<T> &resources, M member)
724{
725 GLint max = 0;
726 for (const T &resource : resources)
727 {
jchen10a99ed552017-09-22 08:10:32 +0800728 max = std::max(max, clampCast<GLint>((resource.*member).size()));
jchen10d9cd7b72017-08-30 15:04:25 +0800729 }
730 return max;
731}
732
733GLint QueryProgramInterfaceMaxNameLength(const Program *program, GLenum programInterface)
734{
735 GLint maxNameLength = 0;
736 switch (programInterface)
737 {
738 case GL_PROGRAM_INPUT:
739 maxNameLength = FindMaxSize(program->getAttributes(), &sh::Attribute::name);
740 break;
741
742 case GL_PROGRAM_OUTPUT:
743 maxNameLength =
744 FindMaxSize(program->getState().getOutputVariables(), &sh::OutputVariable::name);
745 break;
746
747 case GL_UNIFORM:
748 maxNameLength = FindMaxSize(program->getState().getUniforms(), &LinkedUniform::name);
749 break;
750
751 case GL_UNIFORM_BLOCK:
Qin Jiajia9bf55522018-01-29 13:56:23 +0800752 return program->getActiveUniformBlockMaxNameLength();
jchen10d9cd7b72017-08-30 15:04:25 +0800753
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800754 case GL_BUFFER_VARIABLE:
755 maxNameLength =
756 FindMaxSize(program->getState().getBufferVariables(), &BufferVariable::name);
757 break;
758
759 case GL_SHADER_STORAGE_BLOCK:
Qin Jiajia9bf55522018-01-29 13:56:23 +0800760 return program->getActiveShaderStorageBlockMaxNameLength();
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800761
jchen10d9cd7b72017-08-30 15:04:25 +0800762 case GL_TRANSFORM_FEEDBACK_VARYING:
Qin Jiajia9bf55522018-01-29 13:56:23 +0800763 return clampCast<GLint>(program->getTransformFeedbackVaryingMaxLength());
jchen10d9cd7b72017-08-30 15:04:25 +0800764
765 default:
766 UNREACHABLE();
767 return 0;
768 }
769 // This length includes an extra character for the null terminator.
770 return (maxNameLength == 0 ? 0 : maxNameLength + 1);
771}
772
773GLint QueryProgramInterfaceMaxNumActiveVariables(const Program *program, GLenum programInterface)
774{
775 switch (programInterface)
776 {
777 case GL_UNIFORM_BLOCK:
778 return FindMaxSize(program->getState().getUniformBlocks(),
Jiajia Qin729b2c62017-08-14 09:36:11 +0800779 &InterfaceBlock::memberIndexes);
jchen1058f67be2017-10-27 08:59:27 +0800780 case GL_ATOMIC_COUNTER_BUFFER:
781 return FindMaxSize(program->getState().getAtomicCounterBuffers(),
782 &AtomicCounterBuffer::memberIndexes);
jchen10d9cd7b72017-08-30 15:04:25 +0800783
jchen10d9cd7b72017-08-30 15:04:25 +0800784 case GL_SHADER_STORAGE_BLOCK:
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800785 return FindMaxSize(program->getState().getShaderStorageBlocks(),
786 &InterfaceBlock::memberIndexes);
jchen10d9cd7b72017-08-30 15:04:25 +0800787
788 default:
789 UNREACHABLE();
790 return 0;
791 }
792}
793
jchen10baf5d942017-08-28 20:45:48 +0800794GLenum GetUniformPropertyEnum(GLenum prop)
795{
796 switch (prop)
797 {
798 case GL_UNIFORM_TYPE:
799 return GL_TYPE;
800 case GL_UNIFORM_SIZE:
801 return GL_ARRAY_SIZE;
802 case GL_UNIFORM_NAME_LENGTH:
803 return GL_NAME_LENGTH;
804 case GL_UNIFORM_BLOCK_INDEX:
805 return GL_BLOCK_INDEX;
806 case GL_UNIFORM_OFFSET:
807 return GL_OFFSET;
808 case GL_UNIFORM_ARRAY_STRIDE:
809 return GL_ARRAY_STRIDE;
810 case GL_UNIFORM_MATRIX_STRIDE:
811 return GL_MATRIX_STRIDE;
812 case GL_UNIFORM_IS_ROW_MAJOR:
813 return GL_IS_ROW_MAJOR;
814
815 default:
816 return prop;
817 }
818}
819
jchen1058f67be2017-10-27 08:59:27 +0800820GLenum GetUniformBlockPropertyEnum(GLenum prop)
821{
822 switch (prop)
823 {
824 case GL_UNIFORM_BLOCK_BINDING:
825 return GL_BUFFER_BINDING;
826
827 case GL_UNIFORM_BLOCK_DATA_SIZE:
828 return GL_BUFFER_DATA_SIZE;
829
830 case GL_UNIFORM_BLOCK_NAME_LENGTH:
831 return GL_NAME_LENGTH;
832
833 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
834 return GL_NUM_ACTIVE_VARIABLES;
835
836 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
837 return GL_ACTIVE_VARIABLES;
838
839 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
840 return GL_REFERENCED_BY_VERTEX_SHADER;
841
842 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
843 return GL_REFERENCED_BY_FRAGMENT_SHADER;
844
845 default:
846 return prop;
847 }
848}
849
850void GetShaderVariableBufferResourceProperty(const ShaderVariableBuffer &buffer,
851 GLenum pname,
852 GLint *params,
853 GLsizei bufSize,
854 GLsizei *outputPosition)
855
856{
857 switch (pname)
858 {
859 case GL_BUFFER_BINDING:
860 params[(*outputPosition)++] = buffer.binding;
861 break;
862 case GL_BUFFER_DATA_SIZE:
863 params[(*outputPosition)++] = clampCast<GLint>(buffer.dataSize);
864 break;
865 case GL_NUM_ACTIVE_VARIABLES:
866 params[(*outputPosition)++] = buffer.numActiveVariables();
867 break;
868 case GL_ACTIVE_VARIABLES:
869 for (size_t memberIndex = 0;
870 memberIndex < buffer.memberIndexes.size() && *outputPosition < bufSize;
871 ++memberIndex)
872 {
873 params[(*outputPosition)++] = clampCast<GLint>(buffer.memberIndexes[memberIndex]);
874 }
875 break;
876 case GL_REFERENCED_BY_VERTEX_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +0800877 params[(*outputPosition)++] = static_cast<GLint>(buffer.isActive(ShaderType::Vertex));
jchen1058f67be2017-10-27 08:59:27 +0800878 break;
879 case GL_REFERENCED_BY_FRAGMENT_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +0800880 params[(*outputPosition)++] = static_cast<GLint>(buffer.isActive(ShaderType::Fragment));
jchen1058f67be2017-10-27 08:59:27 +0800881 break;
882 case GL_REFERENCED_BY_COMPUTE_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +0800883 params[(*outputPosition)++] = static_cast<GLint>(buffer.isActive(ShaderType::Compute));
jchen1058f67be2017-10-27 08:59:27 +0800884 break;
Jiawei Shaoc6f82872018-04-24 14:14:50 +0800885 case GL_REFERENCED_BY_GEOMETRY_SHADER_EXT:
886 params[(*outputPosition)++] = static_cast<GLint>(buffer.isActive(ShaderType::Geometry));
887 break;
jchen1058f67be2017-10-27 08:59:27 +0800888 default:
889 UNREACHABLE();
890 break;
891 }
892}
893
894void GetInterfaceBlockResourceProperty(const InterfaceBlock &block,
895 GLenum pname,
896 GLint *params,
897 GLsizei bufSize,
898 GLsizei *outputPosition)
899{
900 if (pname == GL_NAME_LENGTH)
901 {
902 params[(*outputPosition)++] = clampCast<GLint>(block.nameWithArrayIndex().size() + 1);
903 return;
904 }
905 GetShaderVariableBufferResourceProperty(block, pname, params, bufSize, outputPosition);
906}
907
908void GetUniformBlockResourceProperty(const Program *program,
909 GLuint blockIndex,
910 GLenum pname,
911 GLint *params,
912 GLsizei bufSize,
913 GLsizei *outputPosition)
914
915{
916 ASSERT(*outputPosition < bufSize);
917 const auto &block = program->getUniformBlockByIndex(blockIndex);
918 GetInterfaceBlockResourceProperty(block, pname, params, bufSize, outputPosition);
919}
920
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800921void GetShaderStorageBlockResourceProperty(const Program *program,
922 GLuint blockIndex,
923 GLenum pname,
924 GLint *params,
925 GLsizei bufSize,
926 GLsizei *outputPosition)
927
928{
929 ASSERT(*outputPosition < bufSize);
930 const auto &block = program->getShaderStorageBlockByIndex(blockIndex);
931 GetInterfaceBlockResourceProperty(block, pname, params, bufSize, outputPosition);
932}
933
jchen1058f67be2017-10-27 08:59:27 +0800934void GetAtomicCounterBufferResourceProperty(const Program *program,
935 GLuint index,
936 GLenum pname,
937 GLint *params,
938 GLsizei bufSize,
939 GLsizei *outputPosition)
940
941{
942 ASSERT(*outputPosition < bufSize);
943 const auto &buffer = program->getState().getAtomicCounterBuffers()[index];
944 GetShaderVariableBufferResourceProperty(buffer, pname, params, bufSize, outputPosition);
945}
946
Lingfeng Yang45b5a872018-06-07 11:33:25 -0700947bool IsTextureEnvEnumParameter(TextureEnvParameter pname)
948{
949 switch (pname)
950 {
951 case TextureEnvParameter::Mode:
952 case TextureEnvParameter::CombineRgb:
953 case TextureEnvParameter::CombineAlpha:
954 case TextureEnvParameter::Src0Rgb:
955 case TextureEnvParameter::Src1Rgb:
956 case TextureEnvParameter::Src2Rgb:
957 case TextureEnvParameter::Src0Alpha:
958 case TextureEnvParameter::Src1Alpha:
959 case TextureEnvParameter::Src2Alpha:
960 case TextureEnvParameter::Op0Rgb:
961 case TextureEnvParameter::Op1Rgb:
962 case TextureEnvParameter::Op2Rgb:
963 case TextureEnvParameter::Op0Alpha:
964 case TextureEnvParameter::Op1Alpha:
965 case TextureEnvParameter::Op2Alpha:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -0700966 case TextureEnvParameter::PointCoordReplace:
Lingfeng Yang45b5a872018-06-07 11:33:25 -0700967 return true;
968 default:
969 return false;
970 }
971}
972
Geoff Langc1984ed2016-10-07 12:41:00 -0400973} // anonymous namespace
974
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -0800975void QueryFramebufferAttachmentParameteriv(const Context *context,
976 const Framebuffer *framebuffer,
Geoff Langff5b2d52016-09-07 11:32:23 -0400977 GLenum attachment,
978 GLenum pname,
979 GLint *params)
980{
981 ASSERT(framebuffer);
982
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -0800983 const FramebufferAttachment *attachmentObject = framebuffer->getAttachment(context, attachment);
984
Geoff Langff5b2d52016-09-07 11:32:23 -0400985 if (attachmentObject == nullptr)
986 {
987 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
988 // is NONE, then querying any other pname will generate INVALID_ENUM.
989
990 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
991 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
992 // INVALID_OPERATION for all other pnames
993
994 switch (pname)
995 {
996 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
997 *params = GL_NONE;
998 break;
999
1000 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
1001 *params = 0;
1002 break;
1003
1004 default:
1005 UNREACHABLE();
1006 break;
1007 }
1008
1009 return;
1010 }
1011
1012 switch (pname)
1013 {
1014 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
1015 *params = attachmentObject->type();
1016 break;
1017
1018 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
1019 *params = attachmentObject->id();
1020 break;
1021
1022 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
1023 *params = attachmentObject->mipLevel();
1024 break;
1025
1026 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
Corentin Wallez99d492c2018-02-27 15:17:10 -05001027 {
1028 TextureTarget face = attachmentObject->cubeMapFace();
1029 if (face != TextureTarget::InvalidEnum)
1030 {
1031 *params = ToGLenum(attachmentObject->cubeMapFace());
1032 }
1033 else
1034 {
1035 // This happens when the attachment isn't a texture cube map face
1036 *params = GL_NONE;
1037 }
1038 }
1039 break;
Geoff Langff5b2d52016-09-07 11:32:23 -04001040
1041 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
1042 *params = attachmentObject->getRedSize();
1043 break;
1044
1045 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
1046 *params = attachmentObject->getGreenSize();
1047 break;
1048
1049 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
1050 *params = attachmentObject->getBlueSize();
1051 break;
1052
1053 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
1054 *params = attachmentObject->getAlphaSize();
1055 break;
1056
1057 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
1058 *params = attachmentObject->getDepthSize();
1059 break;
1060
1061 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
1062 *params = attachmentObject->getStencilSize();
1063 break;
1064
1065 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
1066 *params = attachmentObject->getComponentType();
1067 break;
1068
1069 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
1070 *params = attachmentObject->getColorEncoding();
1071 break;
1072
1073 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
1074 *params = attachmentObject->layer();
1075 break;
1076
Martin Radeve5285d22017-07-14 16:23:53 +03001077 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_ANGLE:
1078 *params = attachmentObject->getNumViews();
1079 break;
1080
1081 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_MULTIVIEW_LAYOUT_ANGLE:
1082 *params = static_cast<GLint>(attachmentObject->getMultiviewLayout());
1083 break;
1084
1085 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_ANGLE:
1086 *params = attachmentObject->getBaseViewIndex();
1087 break;
1088
1089 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_VIEWPORT_OFFSETS_ANGLE:
1090 {
1091 const std::vector<Offset> &offsets = attachmentObject->getMultiviewViewportOffsets();
1092 for (size_t i = 0u; i < offsets.size(); ++i)
1093 {
1094 params[i * 2u] = offsets[i].x;
1095 params[i * 2u + 1u] = offsets[i].y;
1096 }
1097 }
1098 break;
1099
Jiawei Shaoa8802472018-05-28 11:17:47 +08001100 case GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT:
1101 *params = attachmentObject->isLayered();
1102 break;
1103
Geoff Langff5b2d52016-09-07 11:32:23 -04001104 default:
1105 UNREACHABLE();
1106 break;
1107 }
1108}
1109
1110void QueryBufferParameteriv(const Buffer *buffer, GLenum pname, GLint *params)
1111{
Geoff Langebebe1c2016-10-14 12:01:31 -04001112 QueryBufferParameterBase(buffer, pname, params);
1113}
Geoff Langff5b2d52016-09-07 11:32:23 -04001114
Geoff Langebebe1c2016-10-14 12:01:31 -04001115void QueryBufferParameteri64v(const Buffer *buffer, GLenum pname, GLint64 *params)
1116{
1117 QueryBufferParameterBase(buffer, pname, params);
Geoff Langff5b2d52016-09-07 11:32:23 -04001118}
1119
Geoff Lang496c02d2016-10-20 11:38:11 -07001120void QueryBufferPointerv(const Buffer *buffer, GLenum pname, void **params)
1121{
1122 switch (pname)
1123 {
1124 case GL_BUFFER_MAP_POINTER:
1125 *params = buffer->getMapPointer();
1126 break;
1127
1128 default:
1129 UNREACHABLE();
1130 break;
1131 }
1132}
1133
Jamie Madillf4a789f2018-10-18 16:56:20 -04001134void QueryProgramiv(Context *context, const Program *program, GLenum pname, GLint *params)
Geoff Langff5b2d52016-09-07 11:32:23 -04001135{
1136 ASSERT(program != nullptr);
1137
1138 switch (pname)
1139 {
1140 case GL_DELETE_STATUS:
1141 *params = program->isFlaggedForDeletion();
1142 return;
1143 case GL_LINK_STATUS:
1144 *params = program->isLinked();
1145 return;
jchen107ae70d82018-07-06 13:47:01 +08001146 case GL_COMPLETION_STATUS_KHR:
1147 *params = program->isLinking() ? GL_FALSE : GL_TRUE;
1148 return;
Geoff Langff5b2d52016-09-07 11:32:23 -04001149 case GL_VALIDATE_STATUS:
1150 *params = program->isValidated();
1151 return;
1152 case GL_INFO_LOG_LENGTH:
1153 *params = program->getInfoLogLength();
1154 return;
1155 case GL_ATTACHED_SHADERS:
1156 *params = program->getAttachedShadersCount();
1157 return;
1158 case GL_ACTIVE_ATTRIBUTES:
1159 *params = program->getActiveAttributeCount();
1160 return;
1161 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
1162 *params = program->getActiveAttributeMaxLength();
1163 return;
1164 case GL_ACTIVE_UNIFORMS:
1165 *params = program->getActiveUniformCount();
1166 return;
1167 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
1168 *params = program->getActiveUniformMaxLength();
1169 return;
1170 case GL_PROGRAM_BINARY_LENGTH_OES:
Shahbaz Youssefic14ab2a2018-08-24 13:57:55 -04001171 *params = context->getCaps().programBinaryFormats.empty()
1172 ? 0
1173 : program->getBinaryLength(context);
Geoff Langff5b2d52016-09-07 11:32:23 -04001174 return;
1175 case GL_ACTIVE_UNIFORM_BLOCKS:
1176 *params = program->getActiveUniformBlockCount();
1177 return;
1178 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
Qin Jiajia9bf55522018-01-29 13:56:23 +08001179 *params = program->getActiveUniformBlockMaxNameLength();
Geoff Langff5b2d52016-09-07 11:32:23 -04001180 break;
1181 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
1182 *params = program->getTransformFeedbackBufferMode();
1183 break;
1184 case GL_TRANSFORM_FEEDBACK_VARYINGS:
jchen10910a3da2017-11-15 09:40:11 +08001185 *params = clampCast<GLint>(program->getTransformFeedbackVaryingCount());
Geoff Langff5b2d52016-09-07 11:32:23 -04001186 break;
1187 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
1188 *params = program->getTransformFeedbackVaryingMaxLength();
1189 break;
1190 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
1191 *params = program->getBinaryRetrievableHint();
1192 break;
Yunchao He61afff12017-03-14 15:34:03 +08001193 case GL_PROGRAM_SEPARABLE:
1194 *params = program->isSeparable();
1195 break;
Xinghua Cao971f8502017-10-17 13:01:24 +08001196 case GL_COMPUTE_WORK_GROUP_SIZE:
1197 {
1198 const sh::WorkGroupSize &localSize = program->getComputeShaderLocalSize();
1199 params[0] = localSize[0];
1200 params[1] = localSize[1];
1201 params[2] = localSize[2];
1202 }
1203 break;
jchen1058f67be2017-10-27 08:59:27 +08001204 case GL_ACTIVE_ATOMIC_COUNTER_BUFFERS:
1205 *params = program->getActiveAtomicCounterBufferCount();
1206 break;
Jiawei Shao447bfac2018-03-14 14:23:40 +08001207 case GL_GEOMETRY_LINKED_INPUT_TYPE_EXT:
Jamie Madill493f9572018-05-24 19:52:15 -04001208 *params = ToGLenum(program->getGeometryShaderInputPrimitiveType());
Jiawei Shao447bfac2018-03-14 14:23:40 +08001209 break;
1210 case GL_GEOMETRY_LINKED_OUTPUT_TYPE_EXT:
Jamie Madill493f9572018-05-24 19:52:15 -04001211 *params = ToGLenum(program->getGeometryShaderOutputPrimitiveType());
Jiawei Shao447bfac2018-03-14 14:23:40 +08001212 break;
1213 case GL_GEOMETRY_LINKED_VERTICES_OUT_EXT:
1214 *params = program->getGeometryShaderMaxVertices();
1215 break;
1216 case GL_GEOMETRY_SHADER_INVOCATIONS_EXT:
1217 *params = program->getGeometryShaderInvocations();
1218 break;
Geoff Langff5b2d52016-09-07 11:32:23 -04001219 default:
1220 UNREACHABLE();
1221 break;
1222 }
1223}
Geoff Lang740d9022016-10-07 11:20:52 -04001224
Jamie Madill4e0e6f82017-02-17 11:06:03 -05001225void QueryRenderbufferiv(const Context *context,
1226 const Renderbuffer *renderbuffer,
1227 GLenum pname,
1228 GLint *params)
Geoff Lang740d9022016-10-07 11:20:52 -04001229{
1230 ASSERT(renderbuffer != nullptr);
1231
1232 switch (pname)
1233 {
1234 case GL_RENDERBUFFER_WIDTH:
1235 *params = renderbuffer->getWidth();
1236 break;
1237 case GL_RENDERBUFFER_HEIGHT:
1238 *params = renderbuffer->getHeight();
1239 break;
1240 case GL_RENDERBUFFER_INTERNAL_FORMAT:
Jamie Madill4e0e6f82017-02-17 11:06:03 -05001241 // Special case the WebGL 1 DEPTH_STENCIL format.
Jamie Madilla02315b2017-02-23 14:14:47 -05001242 if (context->isWebGL1() &&
Jamie Madill4e0e6f82017-02-17 11:06:03 -05001243 renderbuffer->getFormat().info->internalFormat == GL_DEPTH24_STENCIL8)
1244 {
1245 *params = GL_DEPTH_STENCIL;
1246 }
1247 else
1248 {
1249 *params = renderbuffer->getFormat().info->internalFormat;
1250 }
Geoff Lang740d9022016-10-07 11:20:52 -04001251 break;
1252 case GL_RENDERBUFFER_RED_SIZE:
1253 *params = renderbuffer->getRedSize();
1254 break;
1255 case GL_RENDERBUFFER_GREEN_SIZE:
1256 *params = renderbuffer->getGreenSize();
1257 break;
1258 case GL_RENDERBUFFER_BLUE_SIZE:
1259 *params = renderbuffer->getBlueSize();
1260 break;
1261 case GL_RENDERBUFFER_ALPHA_SIZE:
1262 *params = renderbuffer->getAlphaSize();
1263 break;
1264 case GL_RENDERBUFFER_DEPTH_SIZE:
1265 *params = renderbuffer->getDepthSize();
1266 break;
1267 case GL_RENDERBUFFER_STENCIL_SIZE:
1268 *params = renderbuffer->getStencilSize();
1269 break;
1270 case GL_RENDERBUFFER_SAMPLES_ANGLE:
1271 *params = renderbuffer->getSamples();
1272 break;
Geoff Lang79b91402018-10-04 15:11:30 -04001273 case GL_MEMORY_SIZE_ANGLE:
1274 *params = renderbuffer->getMemorySize();
1275 break;
Geoff Lang740d9022016-10-07 11:20:52 -04001276 default:
1277 UNREACHABLE();
1278 break;
1279 }
1280}
Geoff Langd7d0ed32016-10-07 11:33:51 -04001281
jchen103fd614d2018-08-13 12:21:58 +08001282void QueryShaderiv(Shader *shader, GLenum pname, GLint *params)
Geoff Langd7d0ed32016-10-07 11:33:51 -04001283{
1284 ASSERT(shader != nullptr);
1285
1286 switch (pname)
1287 {
1288 case GL_SHADER_TYPE:
Jiawei Shao385b3e02018-03-21 09:43:28 +08001289 *params = static_cast<GLint>(ToGLenum(shader->getType()));
Geoff Langd7d0ed32016-10-07 11:33:51 -04001290 return;
1291 case GL_DELETE_STATUS:
1292 *params = shader->isFlaggedForDeletion();
1293 return;
1294 case GL_COMPILE_STATUS:
jchen103fd614d2018-08-13 12:21:58 +08001295 *params = shader->isCompiled() ? GL_TRUE : GL_FALSE;
Geoff Langd7d0ed32016-10-07 11:33:51 -04001296 return;
jchen107ae70d82018-07-06 13:47:01 +08001297 case GL_COMPLETION_STATUS_KHR:
jchen10a155bac2018-08-16 15:26:39 +08001298 *params = shader->isCompleted() ? GL_TRUE : GL_FALSE;
jchen107ae70d82018-07-06 13:47:01 +08001299 return;
Geoff Langd7d0ed32016-10-07 11:33:51 -04001300 case GL_INFO_LOG_LENGTH:
jchen103fd614d2018-08-13 12:21:58 +08001301 *params = shader->getInfoLogLength();
Geoff Langd7d0ed32016-10-07 11:33:51 -04001302 return;
1303 case GL_SHADER_SOURCE_LENGTH:
1304 *params = shader->getSourceLength();
1305 return;
1306 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
jchen103fd614d2018-08-13 12:21:58 +08001307 *params = shader->getTranslatedSourceWithDebugInfoLength();
Geoff Langd7d0ed32016-10-07 11:33:51 -04001308 return;
1309 default:
1310 UNREACHABLE();
1311 break;
1312 }
1313}
Geoff Langc1984ed2016-10-07 12:41:00 -04001314
He Yunchao11b038b2016-11-22 21:24:04 +08001315void QueryTexLevelParameterfv(const Texture *texture,
Corentin Wallez99d492c2018-02-27 15:17:10 -05001316 TextureTarget target,
He Yunchao11b038b2016-11-22 21:24:04 +08001317 GLint level,
1318 GLenum pname,
1319 GLfloat *params)
1320{
1321 QueryTexLevelParameterBase(texture, target, level, pname, params);
1322}
1323
1324void QueryTexLevelParameteriv(const Texture *texture,
Corentin Wallez99d492c2018-02-27 15:17:10 -05001325 TextureTarget target,
He Yunchao11b038b2016-11-22 21:24:04 +08001326 GLint level,
1327 GLenum pname,
1328 GLint *params)
1329{
1330 QueryTexLevelParameterBase(texture, target, level, pname, params);
1331}
1332
Geoff Langc1984ed2016-10-07 12:41:00 -04001333void QueryTexParameterfv(const Texture *texture, GLenum pname, GLfloat *params)
1334{
Till Rathmannb8543632018-10-02 19:46:14 +02001335 QueryTexParameterBase<false>(texture, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001336}
1337
1338void QueryTexParameteriv(const Texture *texture, GLenum pname, GLint *params)
1339{
Till Rathmannb8543632018-10-02 19:46:14 +02001340 QueryTexParameterBase<false>(texture, pname, params);
1341}
1342
1343void QueryTexParameterIiv(const Texture *texture, GLenum pname, GLint *params)
1344{
1345 QueryTexParameterBase<true>(texture, pname, params);
1346}
1347
1348void QueryTexParameterIuiv(const Texture *texture, GLenum pname, GLuint *params)
1349{
1350 QueryTexParameterBase<true>(texture, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001351}
1352
1353void QuerySamplerParameterfv(const Sampler *sampler, GLenum pname, GLfloat *params)
1354{
Till Rathmannb8543632018-10-02 19:46:14 +02001355 QuerySamplerParameterBase<false>(sampler, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001356}
1357
1358void QuerySamplerParameteriv(const Sampler *sampler, GLenum pname, GLint *params)
1359{
Till Rathmannb8543632018-10-02 19:46:14 +02001360 QuerySamplerParameterBase<false>(sampler, pname, params);
1361}
1362
1363void QuerySamplerParameterIiv(const Sampler *sampler, GLenum pname, GLint *params)
1364{
1365 QuerySamplerParameterBase<true>(sampler, pname, params);
1366}
1367
1368void QuerySamplerParameterIuiv(const Sampler *sampler, GLenum pname, GLuint *params)
1369{
1370 QuerySamplerParameterBase<true>(sampler, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001371}
1372
Geoff Lang0b031062016-10-13 14:30:04 -04001373void QueryVertexAttribfv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001374 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001375 const VertexAttribCurrentValueData &currentValueData,
1376 GLenum pname,
1377 GLfloat *params)
1378{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001379 QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001380}
1381
1382void QueryVertexAttribiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001383 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001384 const VertexAttribCurrentValueData &currentValueData,
1385 GLenum pname,
1386 GLint *params)
1387{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001388 QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001389}
1390
Jamie Madill876429b2017-04-20 15:46:24 -04001391void QueryVertexAttribPointerv(const VertexAttribute &attrib, GLenum pname, void **pointer)
Geoff Lang0b031062016-10-13 14:30:04 -04001392{
1393 switch (pname)
1394 {
1395 case GL_VERTEX_ATTRIB_ARRAY_POINTER:
Jamie Madill876429b2017-04-20 15:46:24 -04001396 *pointer = const_cast<void *>(attrib.pointer);
Geoff Lang0b031062016-10-13 14:30:04 -04001397 break;
1398
1399 default:
1400 UNREACHABLE();
1401 break;
1402 }
1403}
1404
1405void QueryVertexAttribIiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001406 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001407 const VertexAttribCurrentValueData &currentValueData,
1408 GLenum pname,
1409 GLint *params)
1410{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001411 QueryVertexAttribBase(attrib, binding, currentValueData.IntValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001412}
1413
1414void QueryVertexAttribIuiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001415 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001416 const VertexAttribCurrentValueData &currentValueData,
1417 GLenum pname,
1418 GLuint *params)
1419{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001420 QueryVertexAttribBase(attrib, binding, currentValueData.UnsignedIntValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001421}
1422
Geoff Lang6899b872016-10-14 11:30:13 -04001423void QueryActiveUniformBlockiv(const Program *program,
1424 GLuint uniformBlockIndex,
1425 GLenum pname,
1426 GLint *params)
1427{
jchen1058f67be2017-10-27 08:59:27 +08001428 GLenum prop = GetUniformBlockPropertyEnum(pname);
1429 QueryProgramResourceiv(program, GL_UNIFORM_BLOCK, uniformBlockIndex, 1, &prop,
1430 std::numeric_limits<GLsizei>::max(), nullptr, params);
Geoff Lang6899b872016-10-14 11:30:13 -04001431}
1432
Geoff Lang0a9661f2016-10-20 10:59:20 -07001433void QueryInternalFormativ(const TextureCaps &format, GLenum pname, GLsizei bufSize, GLint *params)
1434{
1435 switch (pname)
1436 {
1437 case GL_NUM_SAMPLE_COUNTS:
1438 if (bufSize != 0)
1439 {
jchen10a99ed552017-09-22 08:10:32 +08001440 *params = clampCast<GLint>(format.sampleCounts.size());
Geoff Lang0a9661f2016-10-20 10:59:20 -07001441 }
1442 break;
1443
1444 case GL_SAMPLES:
1445 {
1446 size_t returnCount = std::min<size_t>(bufSize, format.sampleCounts.size());
1447 auto sampleReverseIt = format.sampleCounts.rbegin();
1448 for (size_t sampleIndex = 0; sampleIndex < returnCount; ++sampleIndex)
1449 {
1450 params[sampleIndex] = *sampleReverseIt++;
1451 }
1452 }
1453 break;
1454
1455 default:
1456 UNREACHABLE();
1457 break;
1458 }
1459}
1460
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001461void QueryFramebufferParameteriv(const Framebuffer *framebuffer, GLenum pname, GLint *params)
1462{
1463 ASSERT(framebuffer);
1464
1465 switch (pname)
1466 {
1467 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
1468 *params = framebuffer->getDefaultWidth();
1469 break;
1470 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
1471 *params = framebuffer->getDefaultHeight();
1472 break;
1473 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
1474 *params = framebuffer->getDefaultSamples();
1475 break;
1476 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
Geoff Lang92019432017-11-20 13:09:34 -05001477 *params = ConvertToGLBoolean(framebuffer->getDefaultFixedSampleLocations());
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001478 break;
Jiawei Shaob1e91382018-05-17 14:33:55 +08001479 case GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT:
1480 *params = framebuffer->getDefaultLayers();
1481 break;
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001482 default:
1483 UNREACHABLE();
1484 break;
1485 }
1486}
1487
Jamie Madilla0691b72018-07-25 10:41:22 -04001488Error QuerySynciv(const Context *context,
1489 const Sync *sync,
1490 GLenum pname,
1491 GLsizei bufSize,
1492 GLsizei *length,
1493 GLint *values)
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001494{
1495 ASSERT(sync);
1496
Geoff Lang82483b92017-04-11 15:33:00 -04001497 // All queries return one value, exit early if the buffer can't fit anything.
1498 if (bufSize < 1)
1499 {
1500 if (length != nullptr)
1501 {
1502 *length = 0;
1503 }
1504 return NoError();
1505 }
1506
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001507 switch (pname)
1508 {
1509 case GL_OBJECT_TYPE:
jchen10a99ed552017-09-22 08:10:32 +08001510 *values = clampCast<GLint>(GL_SYNC_FENCE);
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001511 break;
1512 case GL_SYNC_CONDITION:
jchen10a99ed552017-09-22 08:10:32 +08001513 *values = clampCast<GLint>(sync->getCondition());
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001514 break;
1515 case GL_SYNC_FLAGS:
jchen10a99ed552017-09-22 08:10:32 +08001516 *values = clampCast<GLint>(sync->getFlags());
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001517 break;
1518 case GL_SYNC_STATUS:
Jamie Madilla0691b72018-07-25 10:41:22 -04001519 ANGLE_TRY(sync->getStatus(context, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001520 break;
1521
1522 default:
1523 UNREACHABLE();
1524 break;
1525 }
1526
Geoff Lang82483b92017-04-11 15:33:00 -04001527 if (length != nullptr)
1528 {
1529 *length = 1;
1530 }
1531
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001532 return NoError();
1533}
1534
Jamie Madill4928b7c2017-06-20 12:57:39 -04001535void SetTexParameterf(Context *context, Texture *texture, GLenum pname, GLfloat param)
Geoff Langc1984ed2016-10-07 12:41:00 -04001536{
Till Rathmannb8543632018-10-02 19:46:14 +02001537 SetTexParameterBase<false>(context, texture, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -04001538}
1539
Jamie Madill4928b7c2017-06-20 12:57:39 -04001540void SetTexParameterfv(Context *context, Texture *texture, GLenum pname, const GLfloat *params)
Geoff Langc1984ed2016-10-07 12:41:00 -04001541{
Till Rathmannb8543632018-10-02 19:46:14 +02001542 SetTexParameterBase<false>(context, texture, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001543}
1544
Jamie Madill4928b7c2017-06-20 12:57:39 -04001545void SetTexParameteri(Context *context, Texture *texture, GLenum pname, GLint param)
Geoff Langc1984ed2016-10-07 12:41:00 -04001546{
Till Rathmannb8543632018-10-02 19:46:14 +02001547 SetTexParameterBase<false>(context, texture, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -04001548}
1549
Jamie Madill4928b7c2017-06-20 12:57:39 -04001550void SetTexParameteriv(Context *context, Texture *texture, GLenum pname, const GLint *params)
Geoff Langc1984ed2016-10-07 12:41:00 -04001551{
Till Rathmannb8543632018-10-02 19:46:14 +02001552 SetTexParameterBase<false>(context, texture, pname, params);
1553}
1554
1555void SetTexParameterIiv(Context *context, Texture *texture, GLenum pname, const GLint *params)
1556{
1557 SetTexParameterBase<true>(context, texture, pname, params);
1558}
1559
1560void SetTexParameterIuiv(Context *context, Texture *texture, GLenum pname, const GLuint *params)
1561{
1562 SetTexParameterBase<true>(context, texture, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001563}
1564
Jamie Madille25b8002018-09-20 13:39:49 -04001565void SetSamplerParameterf(Context *context, Sampler *sampler, GLenum pname, GLfloat param)
Geoff Langc1984ed2016-10-07 12:41:00 -04001566{
Till Rathmannb8543632018-10-02 19:46:14 +02001567 SetSamplerParameterBase<false>(context, sampler, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -04001568}
1569
Jamie Madille25b8002018-09-20 13:39:49 -04001570void SetSamplerParameterfv(Context *context, Sampler *sampler, GLenum pname, const GLfloat *params)
Geoff Langc1984ed2016-10-07 12:41:00 -04001571{
Till Rathmannb8543632018-10-02 19:46:14 +02001572 SetSamplerParameterBase<false>(context, sampler, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001573}
1574
Jamie Madille25b8002018-09-20 13:39:49 -04001575void SetSamplerParameteri(Context *context, Sampler *sampler, GLenum pname, GLint param)
Geoff Langc1984ed2016-10-07 12:41:00 -04001576{
Till Rathmannb8543632018-10-02 19:46:14 +02001577 SetSamplerParameterBase<false>(context, sampler, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -04001578}
1579
Jamie Madille25b8002018-09-20 13:39:49 -04001580void SetSamplerParameteriv(Context *context, Sampler *sampler, GLenum pname, const GLint *params)
Geoff Langc1984ed2016-10-07 12:41:00 -04001581{
Till Rathmannb8543632018-10-02 19:46:14 +02001582 SetSamplerParameterBase<false>(context, sampler, pname, params);
1583}
1584
1585void SetSamplerParameterIiv(Context *context, Sampler *sampler, GLenum pname, const GLint *params)
1586{
1587 SetSamplerParameterBase<true>(context, sampler, pname, params);
1588}
1589
1590void SetSamplerParameterIuiv(Context *context, Sampler *sampler, GLenum pname, const GLuint *params)
1591{
1592 SetSamplerParameterBase<true>(context, sampler, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001593}
Geoff Lang65603eb2017-01-12 16:48:03 -05001594
Jamie Madillb983a4b2018-08-01 11:34:51 -04001595void SetFramebufferParameteri(const Context *context,
1596 Framebuffer *framebuffer,
1597 GLenum pname,
1598 GLint param)
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001599{
1600 ASSERT(framebuffer);
1601
1602 switch (pname)
1603 {
1604 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
Jamie Madillb983a4b2018-08-01 11:34:51 -04001605 framebuffer->setDefaultWidth(context, param);
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001606 break;
1607 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
Jamie Madillb983a4b2018-08-01 11:34:51 -04001608 framebuffer->setDefaultHeight(context, param);
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001609 break;
1610 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
Jamie Madillb983a4b2018-08-01 11:34:51 -04001611 framebuffer->setDefaultSamples(context, param);
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001612 break;
1613 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
Jamie Madillb983a4b2018-08-01 11:34:51 -04001614 framebuffer->setDefaultFixedSampleLocations(context, ConvertToBool(param));
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001615 break;
Jiawei Shaob1e91382018-05-17 14:33:55 +08001616 case GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT:
1617 framebuffer->setDefaultLayers(param);
1618 break;
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001619 default:
1620 UNREACHABLE();
1621 break;
1622 }
1623}
1624
Yunchao He61afff12017-03-14 15:34:03 +08001625void SetProgramParameteri(Program *program, GLenum pname, GLint value)
1626{
1627 ASSERT(program);
1628
1629 switch (pname)
1630 {
1631 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
Geoff Lang92019432017-11-20 13:09:34 -05001632 program->setBinaryRetrievableHint(ConvertToBool(value));
Yunchao He61afff12017-03-14 15:34:03 +08001633 break;
1634 case GL_PROGRAM_SEPARABLE:
Geoff Lang92019432017-11-20 13:09:34 -05001635 program->setSeparable(ConvertToBool(value));
Yunchao He61afff12017-03-14 15:34:03 +08001636 break;
1637 default:
1638 UNREACHABLE();
1639 break;
1640 }
1641}
1642
jchen10baf5d942017-08-28 20:45:48 +08001643GLint GetUniformResourceProperty(const Program *program, GLuint index, const GLenum prop)
1644{
1645 const auto &uniform = program->getUniformByIndex(index);
1646 GLenum resourceProp = GetUniformPropertyEnum(prop);
1647 switch (resourceProp)
1648 {
1649 case GL_TYPE:
1650 case GL_ARRAY_SIZE:
1651 case GL_NAME_LENGTH:
Olli Etuaho465835d2017-09-26 13:34:10 +03001652 return GetCommonVariableProperty(uniform, resourceProp);
jchen10baf5d942017-08-28 20:45:48 +08001653
1654 case GL_LOCATION:
1655 return program->getUniformLocation(uniform.name);
1656
1657 case GL_BLOCK_INDEX:
1658 return (uniform.isAtomicCounter() ? -1 : uniform.bufferIndex);
1659
1660 case GL_OFFSET:
1661 return uniform.blockInfo.offset;
1662
1663 case GL_ARRAY_STRIDE:
1664 return uniform.blockInfo.arrayStride;
1665
1666 case GL_MATRIX_STRIDE:
1667 return uniform.blockInfo.matrixStride;
1668
1669 case GL_IS_ROW_MAJOR:
1670 return static_cast<GLint>(uniform.blockInfo.isRowMajorMatrix);
1671
1672 case GL_REFERENCED_BY_VERTEX_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001673 return uniform.isActive(ShaderType::Vertex);
jchen10baf5d942017-08-28 20:45:48 +08001674
1675 case GL_REFERENCED_BY_FRAGMENT_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001676 return uniform.isActive(ShaderType::Fragment);
jchen10baf5d942017-08-28 20:45:48 +08001677
1678 case GL_REFERENCED_BY_COMPUTE_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001679 return uniform.isActive(ShaderType::Compute);
jchen10baf5d942017-08-28 20:45:48 +08001680
Jiawei Shaoc6f82872018-04-24 14:14:50 +08001681 case GL_REFERENCED_BY_GEOMETRY_SHADER_EXT:
1682 return uniform.isActive(ShaderType::Geometry);
1683
jchen10baf5d942017-08-28 20:45:48 +08001684 case GL_ATOMIC_COUNTER_BUFFER_INDEX:
1685 return (uniform.isAtomicCounter() ? uniform.bufferIndex : -1);
1686
1687 default:
1688 UNREACHABLE();
1689 return 0;
1690 }
1691}
1692
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001693GLint GetBufferVariableResourceProperty(const Program *program, GLuint index, const GLenum prop)
1694{
1695 const auto &bufferVariable = program->getBufferVariableByIndex(index);
1696 switch (prop)
1697 {
1698 case GL_TYPE:
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001699 case GL_ARRAY_SIZE:
Olli Etuaho465835d2017-09-26 13:34:10 +03001700 case GL_NAME_LENGTH:
1701 return GetCommonVariableProperty(bufferVariable, prop);
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001702
1703 case GL_BLOCK_INDEX:
1704 return bufferVariable.bufferIndex;
1705
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001706 case GL_OFFSET:
1707 return bufferVariable.blockInfo.offset;
1708
1709 case GL_ARRAY_STRIDE:
1710 return bufferVariable.blockInfo.arrayStride;
1711
1712 case GL_MATRIX_STRIDE:
1713 return bufferVariable.blockInfo.matrixStride;
1714
1715 case GL_IS_ROW_MAJOR:
1716 return static_cast<GLint>(bufferVariable.blockInfo.isRowMajorMatrix);
1717
1718 case GL_REFERENCED_BY_VERTEX_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001719 return bufferVariable.isActive(ShaderType::Vertex);
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001720
1721 case GL_REFERENCED_BY_FRAGMENT_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001722 return bufferVariable.isActive(ShaderType::Fragment);
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001723
1724 case GL_REFERENCED_BY_COMPUTE_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001725 return bufferVariable.isActive(ShaderType::Compute);
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001726
Jiawei Shaoc6f82872018-04-24 14:14:50 +08001727 case GL_REFERENCED_BY_GEOMETRY_SHADER_EXT:
1728 return bufferVariable.isActive(ShaderType::Geometry);
1729
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001730 case GL_TOP_LEVEL_ARRAY_SIZE:
1731 return bufferVariable.topLevelArraySize;
1732
1733 case GL_TOP_LEVEL_ARRAY_STRIDE:
1734 return bufferVariable.blockInfo.topLevelArrayStride;
1735
1736 default:
1737 UNREACHABLE();
1738 return 0;
1739 }
1740}
1741
jchen1015015f72017-03-16 13:54:21 +08001742GLuint QueryProgramResourceIndex(const Program *program,
1743 GLenum programInterface,
1744 const GLchar *name)
1745{
1746 switch (programInterface)
1747 {
1748 case GL_PROGRAM_INPUT:
1749 return program->getInputResourceIndex(name);
1750
1751 case GL_PROGRAM_OUTPUT:
1752 return program->getOutputResourceIndex(name);
1753
jchen1015015f72017-03-16 13:54:21 +08001754 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001755 return program->getState().getUniformIndexFromName(name);
1756
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001757 case GL_BUFFER_VARIABLE:
1758 return program->getState().getBufferVariableIndexFromName(name);
1759
1760 case GL_SHADER_STORAGE_BLOCK:
1761 return program->getShaderStorageBlockIndex(name);
1762
jchen1015015f72017-03-16 13:54:21 +08001763 case GL_UNIFORM_BLOCK:
jchen1058f67be2017-10-27 08:59:27 +08001764 return program->getUniformBlockIndex(name);
1765
jchen1015015f72017-03-16 13:54:21 +08001766 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10910a3da2017-11-15 09:40:11 +08001767 return program->getTransformFeedbackVaryingResourceIndex(name);
jchen1015015f72017-03-16 13:54:21 +08001768
1769 default:
1770 UNREACHABLE();
1771 return GL_INVALID_INDEX;
1772 }
1773}
1774
jchen10fd7c3b52017-03-21 15:36:03 +08001775void QueryProgramResourceName(const Program *program,
1776 GLenum programInterface,
1777 GLuint index,
1778 GLsizei bufSize,
1779 GLsizei *length,
1780 GLchar *name)
1781{
1782 switch (programInterface)
1783 {
1784 case GL_PROGRAM_INPUT:
1785 program->getInputResourceName(index, bufSize, length, name);
1786 break;
1787
1788 case GL_PROGRAM_OUTPUT:
1789 program->getOutputResourceName(index, bufSize, length, name);
1790 break;
1791
jchen10fd7c3b52017-03-21 15:36:03 +08001792 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001793 program->getUniformResourceName(index, bufSize, length, name);
1794 break;
1795
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001796 case GL_BUFFER_VARIABLE:
1797 program->getBufferVariableResourceName(index, bufSize, length, name);
1798 break;
1799
1800 case GL_SHADER_STORAGE_BLOCK:
1801 program->getActiveShaderStorageBlockName(index, bufSize, length, name);
1802 break;
1803
jchen10fd7c3b52017-03-21 15:36:03 +08001804 case GL_UNIFORM_BLOCK:
jchen1058f67be2017-10-27 08:59:27 +08001805 program->getActiveUniformBlockName(index, bufSize, length, name);
1806 break;
1807
jchen10fd7c3b52017-03-21 15:36:03 +08001808 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10910a3da2017-11-15 09:40:11 +08001809 program->getTransformFeedbackVarying(index, bufSize, length, nullptr, nullptr, name);
jchen10fd7c3b52017-03-21 15:36:03 +08001810 break;
1811
1812 default:
1813 UNREACHABLE();
1814 }
1815}
1816
jchen10191381f2017-04-11 13:59:04 +08001817GLint QueryProgramResourceLocation(const Program *program,
1818 GLenum programInterface,
1819 const GLchar *name)
1820{
1821 switch (programInterface)
1822 {
1823 case GL_PROGRAM_INPUT:
1824 return program->getAttributeLocation(name);
1825
1826 case GL_PROGRAM_OUTPUT:
1827 return program->getFragDataLocation(name);
1828
jchen10191381f2017-04-11 13:59:04 +08001829 case GL_UNIFORM:
Olli Etuahod2551232017-10-26 20:03:33 +03001830 return program->getUniformLocation(name);
jchen10baf5d942017-08-28 20:45:48 +08001831
jchen10191381f2017-04-11 13:59:04 +08001832 default:
1833 UNREACHABLE();
1834 return -1;
1835 }
1836}
1837
jchen10880683b2017-04-12 16:21:55 +08001838void QueryProgramResourceiv(const Program *program,
1839 GLenum programInterface,
1840 GLuint index,
1841 GLsizei propCount,
1842 const GLenum *props,
1843 GLsizei bufSize,
1844 GLsizei *length,
1845 GLint *params)
1846{
1847 if (!program->isLinked())
1848 {
1849 if (length != nullptr)
1850 {
1851 *length = 0;
1852 }
1853 return;
1854 }
1855
jchen1058f67be2017-10-27 08:59:27 +08001856 GLsizei pos = 0;
1857 for (GLsizei i = 0; i < propCount; i++)
jchen10880683b2017-04-12 16:21:55 +08001858 {
1859 switch (programInterface)
1860 {
1861 case GL_PROGRAM_INPUT:
1862 params[i] = GetInputResourceProperty(program, index, props[i]);
jchen1058f67be2017-10-27 08:59:27 +08001863 ++pos;
jchen10880683b2017-04-12 16:21:55 +08001864 break;
1865
1866 case GL_PROGRAM_OUTPUT:
1867 params[i] = GetOutputResourceProperty(program, index, props[i]);
jchen1058f67be2017-10-27 08:59:27 +08001868 ++pos;
jchen10880683b2017-04-12 16:21:55 +08001869 break;
1870
jchen10880683b2017-04-12 16:21:55 +08001871 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001872 params[i] = GetUniformResourceProperty(program, index, props[i]);
jchen1058f67be2017-10-27 08:59:27 +08001873 ++pos;
1874 break;
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001875
1876 case GL_BUFFER_VARIABLE:
1877 params[i] = GetBufferVariableResourceProperty(program, index, props[i]);
1878 ++pos;
1879 break;
1880
jchen1058f67be2017-10-27 08:59:27 +08001881 case GL_UNIFORM_BLOCK:
1882 GetUniformBlockResourceProperty(program, index, props[i], params, bufSize, &pos);
jchen10baf5d942017-08-28 20:45:48 +08001883 break;
1884
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001885 case GL_SHADER_STORAGE_BLOCK:
1886 GetShaderStorageBlockResourceProperty(program, index, props[i], params, bufSize,
1887 &pos);
1888 break;
1889
jchen1058f67be2017-10-27 08:59:27 +08001890 case GL_ATOMIC_COUNTER_BUFFER:
1891 GetAtomicCounterBufferResourceProperty(program, index, props[i], params, bufSize,
1892 &pos);
1893 break;
jchen10910a3da2017-11-15 09:40:11 +08001894
jchen10880683b2017-04-12 16:21:55 +08001895 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10910a3da2017-11-15 09:40:11 +08001896 params[i] = GetTransformFeedbackVaryingResourceProperty(program, index, props[i]);
1897 ++pos;
jchen10880683b2017-04-12 16:21:55 +08001898 break;
1899
1900 default:
1901 UNREACHABLE();
1902 params[i] = GL_INVALID_VALUE;
1903 }
jchen1058f67be2017-10-27 08:59:27 +08001904 if (pos == bufSize)
1905 {
1906 // Most properties return one value, but GL_ACTIVE_VARIABLES returns an array of values.
1907 // This checks not to break buffer bounds for such case.
1908 break;
1909 }
1910 }
1911
1912 if (length != nullptr)
1913 {
1914 *length = pos;
jchen10880683b2017-04-12 16:21:55 +08001915 }
1916}
1917
jchen10d9cd7b72017-08-30 15:04:25 +08001918void QueryProgramInterfaceiv(const Program *program,
1919 GLenum programInterface,
1920 GLenum pname,
1921 GLint *params)
1922{
1923 switch (pname)
1924 {
1925 case GL_ACTIVE_RESOURCES:
1926 *params = QueryProgramInterfaceActiveResources(program, programInterface);
1927 break;
1928
1929 case GL_MAX_NAME_LENGTH:
1930 *params = QueryProgramInterfaceMaxNameLength(program, programInterface);
1931 break;
1932
1933 case GL_MAX_NUM_ACTIVE_VARIABLES:
1934 *params = QueryProgramInterfaceMaxNumActiveVariables(program, programInterface);
1935 break;
1936
1937 default:
1938 UNREACHABLE();
1939 }
1940}
1941
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001942ClientVertexArrayType ParamToVertexArrayType(GLenum param)
1943{
1944 switch (param)
1945 {
1946 case GL_VERTEX_ARRAY:
1947 case GL_VERTEX_ARRAY_BUFFER_BINDING:
1948 case GL_VERTEX_ARRAY_STRIDE:
1949 case GL_VERTEX_ARRAY_SIZE:
1950 case GL_VERTEX_ARRAY_TYPE:
1951 case GL_VERTEX_ARRAY_POINTER:
1952 return ClientVertexArrayType::Vertex;
1953 case GL_NORMAL_ARRAY:
1954 case GL_NORMAL_ARRAY_BUFFER_BINDING:
1955 case GL_NORMAL_ARRAY_STRIDE:
1956 case GL_NORMAL_ARRAY_TYPE:
1957 case GL_NORMAL_ARRAY_POINTER:
1958 return ClientVertexArrayType::Normal;
1959 case GL_COLOR_ARRAY:
1960 case GL_COLOR_ARRAY_BUFFER_BINDING:
1961 case GL_COLOR_ARRAY_STRIDE:
1962 case GL_COLOR_ARRAY_SIZE:
1963 case GL_COLOR_ARRAY_TYPE:
1964 case GL_COLOR_ARRAY_POINTER:
1965 return ClientVertexArrayType::Color;
1966 case GL_POINT_SIZE_ARRAY_OES:
1967 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
1968 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
1969 case GL_POINT_SIZE_ARRAY_TYPE_OES:
1970 case GL_POINT_SIZE_ARRAY_POINTER_OES:
1971 return ClientVertexArrayType::PointSize;
1972 case GL_TEXTURE_COORD_ARRAY:
1973 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
1974 case GL_TEXTURE_COORD_ARRAY_STRIDE:
1975 case GL_TEXTURE_COORD_ARRAY_SIZE:
1976 case GL_TEXTURE_COORD_ARRAY_TYPE:
1977 case GL_TEXTURE_COORD_ARRAY_POINTER:
1978 return ClientVertexArrayType::TextureCoord;
1979 default:
1980 UNREACHABLE();
1981 return ClientVertexArrayType::InvalidEnum;
1982 }
1983}
1984
Lingfeng Yangd0febe72018-05-17 22:36:52 -07001985void SetLightModelParameters(GLES1State *state, GLenum pname, const GLfloat *params)
1986{
1987 LightModelParameters &lightModel = state->lightModelParameters();
1988
1989 switch (pname)
1990 {
1991 case GL_LIGHT_MODEL_AMBIENT:
1992 lightModel.color = ColorF::fromData(params);
1993 break;
1994 case GL_LIGHT_MODEL_TWO_SIDE:
1995 lightModel.twoSided = *params == 1.0f ? true : false;
1996 break;
1997 default:
1998 break;
1999 }
2000}
2001
2002void GetLightModelParameters(const GLES1State *state, GLenum pname, GLfloat *params)
2003{
2004 const LightModelParameters &lightModel = state->lightModelParameters();
2005
2006 switch (pname)
2007 {
2008 case GL_LIGHT_MODEL_TWO_SIDE:
2009 *params = lightModel.twoSided ? 1.0f : 0.0f;
2010 break;
2011 case GL_LIGHT_MODEL_AMBIENT:
2012 lightModel.color.writeData(params);
2013 break;
2014 default:
2015 break;
2016 }
2017}
2018
2019bool IsLightModelTwoSided(const GLES1State *state)
2020{
2021 return state->lightModelParameters().twoSided;
2022}
2023
2024void SetLightParameters(GLES1State *state,
2025 GLenum light,
2026 LightParameter pname,
2027 const GLfloat *params)
2028{
2029 uint32_t lightIndex = light - GL_LIGHT0;
2030
2031 LightParameters &lightParams = state->lightParameters(lightIndex);
2032
2033 switch (pname)
2034 {
2035 case LightParameter::Ambient:
2036 lightParams.ambient = ColorF::fromData(params);
2037 break;
2038 case LightParameter::Diffuse:
2039 lightParams.diffuse = ColorF::fromData(params);
2040 break;
2041 case LightParameter::Specular:
2042 lightParams.specular = ColorF::fromData(params);
2043 break;
2044 case LightParameter::Position:
2045 {
2046 angle::Mat4 mv = state->getModelviewMatrix();
2047 angle::Vector4 transformedPos =
2048 mv.product(angle::Vector4(params[0], params[1], params[2], params[3]));
2049 lightParams.position[0] = transformedPos[0];
2050 lightParams.position[1] = transformedPos[1];
2051 lightParams.position[2] = transformedPos[2];
2052 lightParams.position[3] = transformedPos[3];
2053 }
2054 break;
2055 case LightParameter::SpotDirection:
2056 {
2057 angle::Mat4 mv = state->getModelviewMatrix();
2058 angle::Vector4 transformedPos =
2059 mv.product(angle::Vector4(params[0], params[1], params[2], 0.0f));
2060 lightParams.direction[0] = transformedPos[0];
2061 lightParams.direction[1] = transformedPos[1];
2062 lightParams.direction[2] = transformedPos[2];
2063 }
2064 break;
2065 case LightParameter::SpotExponent:
2066 lightParams.spotlightExponent = *params;
2067 break;
2068 case LightParameter::SpotCutoff:
2069 lightParams.spotlightCutoffAngle = *params;
2070 break;
2071 case LightParameter::ConstantAttenuation:
2072 lightParams.attenuationConst = *params;
2073 break;
2074 case LightParameter::LinearAttenuation:
2075 lightParams.attenuationLinear = *params;
2076 break;
2077 case LightParameter::QuadraticAttenuation:
2078 lightParams.attenuationQuadratic = *params;
2079 break;
2080 default:
2081 return;
2082 }
2083}
2084
2085void GetLightParameters(const GLES1State *state,
2086 GLenum light,
2087 LightParameter pname,
2088 GLfloat *params)
2089{
2090 uint32_t lightIndex = light - GL_LIGHT0;
2091 const LightParameters &lightParams = state->lightParameters(lightIndex);
2092
2093 switch (pname)
2094 {
2095 case LightParameter::Ambient:
2096 lightParams.ambient.writeData(params);
2097 break;
2098 case LightParameter::Diffuse:
2099 lightParams.diffuse.writeData(params);
2100 break;
2101 case LightParameter::Specular:
2102 lightParams.specular.writeData(params);
2103 break;
2104 case LightParameter::Position:
2105 memcpy(params, lightParams.position.data(), 4 * sizeof(GLfloat));
2106 break;
2107 case LightParameter::SpotDirection:
2108 memcpy(params, lightParams.direction.data(), 3 * sizeof(GLfloat));
2109 break;
2110 case LightParameter::SpotExponent:
2111 *params = lightParams.spotlightExponent;
2112 break;
2113 case LightParameter::SpotCutoff:
2114 *params = lightParams.spotlightCutoffAngle;
2115 break;
2116 case LightParameter::ConstantAttenuation:
2117 *params = lightParams.attenuationConst;
2118 break;
2119 case LightParameter::LinearAttenuation:
2120 *params = lightParams.attenuationLinear;
2121 break;
2122 case LightParameter::QuadraticAttenuation:
2123 *params = lightParams.attenuationQuadratic;
2124 break;
2125 default:
2126 break;
2127 }
2128}
2129
2130void SetMaterialParameters(GLES1State *state,
2131 GLenum face,
2132 MaterialParameter pname,
2133 const GLfloat *params)
2134{
2135 MaterialParameters &material = state->materialParameters();
2136 switch (pname)
2137 {
2138 case MaterialParameter::Ambient:
2139 material.ambient = ColorF::fromData(params);
2140 break;
2141 case MaterialParameter::Diffuse:
2142 material.diffuse = ColorF::fromData(params);
2143 break;
2144 case MaterialParameter::AmbientAndDiffuse:
2145 material.ambient = ColorF::fromData(params);
2146 material.diffuse = ColorF::fromData(params);
2147 break;
2148 case MaterialParameter::Specular:
2149 material.specular = ColorF::fromData(params);
2150 break;
2151 case MaterialParameter::Emission:
2152 material.emissive = ColorF::fromData(params);
2153 break;
2154 case MaterialParameter::Shininess:
2155 material.specularExponent = *params;
2156 break;
2157 default:
2158 return;
2159 }
2160}
2161
2162void GetMaterialParameters(const GLES1State *state,
2163 GLenum face,
2164 MaterialParameter pname,
2165 GLfloat *params)
2166{
2167 const ColorF &currentColor = state->getCurrentColor();
2168 const MaterialParameters &material = state->materialParameters();
2169 const bool colorMaterialEnabled = state->isColorMaterialEnabled();
2170
2171 switch (pname)
2172 {
2173 case MaterialParameter::Ambient:
2174 if (colorMaterialEnabled)
2175 {
2176 currentColor.writeData(params);
2177 }
2178 else
2179 {
2180 material.ambient.writeData(params);
2181 }
2182 break;
2183 case MaterialParameter::Diffuse:
2184 if (colorMaterialEnabled)
2185 {
2186 currentColor.writeData(params);
2187 }
2188 else
2189 {
2190 material.diffuse.writeData(params);
2191 }
2192 break;
2193 case MaterialParameter::Specular:
2194 material.specular.writeData(params);
2195 break;
2196 case MaterialParameter::Emission:
2197 material.emissive.writeData(params);
2198 break;
2199 case MaterialParameter::Shininess:
2200 *params = material.specularExponent;
2201 break;
2202 default:
2203 return;
2204 }
2205}
2206
2207unsigned int GetLightModelParameterCount(GLenum pname)
2208{
2209 switch (pname)
2210 {
2211 case GL_LIGHT_MODEL_AMBIENT:
2212 return 4;
2213 case GL_LIGHT_MODEL_TWO_SIDE:
2214 return 1;
2215 default:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07002216 return 0;
2217 }
2218}
2219
2220unsigned int GetLightParameterCount(LightParameter pname)
2221{
2222 switch (pname)
2223 {
2224 case LightParameter::Ambient:
2225 case LightParameter::Diffuse:
2226 case LightParameter::Specular:
2227 case LightParameter::Position:
2228 return 4;
2229 case LightParameter::SpotDirection:
2230 return 3;
2231 case LightParameter::SpotExponent:
2232 case LightParameter::SpotCutoff:
2233 case LightParameter::ConstantAttenuation:
2234 case LightParameter::LinearAttenuation:
2235 case LightParameter::QuadraticAttenuation:
2236 return 1;
2237 default:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07002238 return 0;
2239 }
2240}
2241
2242unsigned int GetMaterialParameterCount(MaterialParameter pname)
2243{
2244 switch (pname)
2245 {
2246 case MaterialParameter::Ambient:
2247 case MaterialParameter::Diffuse:
2248 case MaterialParameter::Specular:
2249 case MaterialParameter::Emission:
2250 return 4;
2251 case MaterialParameter::Shininess:
2252 return 1;
2253 default:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07002254 return 0;
2255 }
2256}
2257
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07002258void SetFogParameters(GLES1State *state, GLenum pname, const GLfloat *params)
2259{
2260 FogParameters &fog = state->fogParameters();
2261 switch (pname)
2262 {
2263 case GL_FOG_MODE:
2264 fog.mode = FromGLenum<FogMode>(static_cast<GLenum>(params[0]));
2265 break;
2266 case GL_FOG_DENSITY:
2267 fog.density = params[0];
2268 break;
2269 case GL_FOG_START:
2270 fog.start = params[0];
2271 break;
2272 case GL_FOG_END:
2273 fog.end = params[0];
2274 break;
2275 case GL_FOG_COLOR:
2276 fog.color = ColorF::fromData(params);
2277 break;
2278 default:
2279 return;
2280 }
2281}
2282
2283void GetFogParameters(const GLES1State *state, GLenum pname, GLfloat *params)
2284{
2285 const FogParameters &fog = state->fogParameters();
2286 switch (pname)
2287 {
2288 case GL_FOG_MODE:
2289 params[0] = static_cast<GLfloat>(ToGLenum(fog.mode));
2290 break;
2291 case GL_FOG_DENSITY:
2292 params[0] = fog.density;
2293 break;
2294 case GL_FOG_START:
2295 params[0] = fog.start;
2296 break;
2297 case GL_FOG_END:
2298 params[0] = fog.end;
2299 break;
2300 case GL_FOG_COLOR:
2301 fog.color.writeData(params);
2302 break;
2303 default:
2304 return;
2305 }
2306}
2307
2308unsigned int GetFogParameterCount(GLenum pname)
2309{
2310 switch (pname)
2311 {
2312 case GL_FOG_MODE:
2313 case GL_FOG_DENSITY:
2314 case GL_FOG_START:
2315 case GL_FOG_END:
2316 return 1;
2317 case GL_FOG_COLOR:
2318 return 4;
2319 default:
2320 return 0;
2321 }
2322}
2323
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002324unsigned int GetTextureEnvParameterCount(TextureEnvParameter pname)
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07002325{
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002326 switch (pname)
2327 {
2328 case TextureEnvParameter::Mode:
2329 case TextureEnvParameter::CombineRgb:
2330 case TextureEnvParameter::CombineAlpha:
2331 case TextureEnvParameter::Src0Rgb:
2332 case TextureEnvParameter::Src1Rgb:
2333 case TextureEnvParameter::Src2Rgb:
2334 case TextureEnvParameter::Src0Alpha:
2335 case TextureEnvParameter::Src1Alpha:
2336 case TextureEnvParameter::Src2Alpha:
2337 case TextureEnvParameter::Op0Rgb:
2338 case TextureEnvParameter::Op1Rgb:
2339 case TextureEnvParameter::Op2Rgb:
2340 case TextureEnvParameter::Op0Alpha:
2341 case TextureEnvParameter::Op1Alpha:
2342 case TextureEnvParameter::Op2Alpha:
2343 case TextureEnvParameter::RgbScale:
2344 case TextureEnvParameter::AlphaScale:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07002345 case TextureEnvParameter::PointCoordReplace:
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002346 return 1;
2347 case TextureEnvParameter::Color:
2348 return 4;
2349 default:
2350 return 0;
2351 }
2352}
2353
2354void ConvertTextureEnvFromInt(TextureEnvParameter pname, const GLint *input, GLfloat *output)
2355{
2356 if (IsTextureEnvEnumParameter(pname))
2357 {
2358 ConvertGLenumValue(input[0], output);
2359 return;
2360 }
2361
2362 switch (pname)
2363 {
2364 case TextureEnvParameter::RgbScale:
2365 case TextureEnvParameter::AlphaScale:
2366 output[0] = static_cast<GLfloat>(input[0]);
2367 break;
2368 case TextureEnvParameter::Color:
2369 for (int i = 0; i < 4; i++)
2370 {
2371 output[i] = input[i] / 255.0f;
2372 }
2373 break;
2374 default:
2375 UNREACHABLE();
2376 break;
2377 }
2378}
2379
2380void ConvertTextureEnvFromFixed(TextureEnvParameter pname, const GLfixed *input, GLfloat *output)
2381{
2382 if (IsTextureEnvEnumParameter(pname))
2383 {
2384 ConvertGLenumValue(input[0], output);
2385 return;
2386 }
2387
2388 switch (pname)
2389 {
2390 case TextureEnvParameter::RgbScale:
2391 case TextureEnvParameter::AlphaScale:
2392 output[0] = FixedToFloat(input[0]);
2393 break;
2394 case TextureEnvParameter::Color:
2395 for (int i = 0; i < 4; i++)
2396 {
2397 output[i] = FixedToFloat(input[i]);
2398 }
2399 break;
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002400 default:
2401 UNREACHABLE();
2402 break;
2403 }
2404}
2405
2406void ConvertTextureEnvToInt(TextureEnvParameter pname, const GLfloat *input, GLint *output)
2407{
2408 if (IsTextureEnvEnumParameter(pname))
2409 {
2410 ConvertGLenumValue(input[0], output);
2411 return;
2412 }
2413
2414 switch (pname)
2415 {
2416 case TextureEnvParameter::RgbScale:
2417 case TextureEnvParameter::AlphaScale:
2418 output[0] = static_cast<GLint>(input[0]);
2419 break;
2420 case TextureEnvParameter::Color:
2421 for (int i = 0; i < 4; i++)
2422 {
2423 output[i] = static_cast<GLint>(input[i] * 255.0f);
2424 }
2425 break;
2426 default:
2427 UNREACHABLE();
2428 break;
2429 }
2430}
2431
2432void ConvertTextureEnvToFixed(TextureEnvParameter pname, const GLfloat *input, GLfixed *output)
2433{
2434 if (IsTextureEnvEnumParameter(pname))
2435 {
2436 ConvertGLenumValue(input[0], output);
2437 return;
2438 }
2439
2440 switch (pname)
2441 {
2442 case TextureEnvParameter::RgbScale:
2443 case TextureEnvParameter::AlphaScale:
2444 output[0] = FloatToFixed(input[0]);
2445 break;
2446 case TextureEnvParameter::Color:
2447 for (int i = 0; i < 4; i++)
2448 {
2449 output[i] = FloatToFixed(input[i]);
2450 }
2451 break;
2452 default:
2453 UNREACHABLE();
2454 break;
2455 }
2456}
2457
2458void SetTextureEnv(unsigned int unit,
2459 GLES1State *state,
2460 TextureEnvTarget target,
2461 TextureEnvParameter pname,
2462 const GLfloat *params)
2463{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002464 TextureEnvironmentParameters &env = state->textureEnvironment(unit);
2465 GLenum asEnum = ConvertToGLenum(params[0]);
2466
2467 switch (target)
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002468 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002469 case TextureEnvTarget::Env:
2470 switch (pname)
2471 {
2472 case TextureEnvParameter::Mode:
2473 env.mode = FromGLenum<TextureEnvMode>(asEnum);
2474 break;
2475 case TextureEnvParameter::CombineRgb:
2476 env.combineRgb = FromGLenum<TextureCombine>(asEnum);
2477 break;
2478 case TextureEnvParameter::CombineAlpha:
2479 env.combineAlpha = FromGLenum<TextureCombine>(asEnum);
2480 break;
2481 case TextureEnvParameter::Src0Rgb:
2482 env.src0Rgb = FromGLenum<TextureSrc>(asEnum);
2483 break;
2484 case TextureEnvParameter::Src1Rgb:
2485 env.src1Rgb = FromGLenum<TextureSrc>(asEnum);
2486 break;
2487 case TextureEnvParameter::Src2Rgb:
2488 env.src2Rgb = FromGLenum<TextureSrc>(asEnum);
2489 break;
2490 case TextureEnvParameter::Src0Alpha:
2491 env.src0Alpha = FromGLenum<TextureSrc>(asEnum);
2492 break;
2493 case TextureEnvParameter::Src1Alpha:
2494 env.src1Alpha = FromGLenum<TextureSrc>(asEnum);
2495 break;
2496 case TextureEnvParameter::Src2Alpha:
2497 env.src2Alpha = FromGLenum<TextureSrc>(asEnum);
2498 break;
2499 case TextureEnvParameter::Op0Rgb:
2500 env.op0Rgb = FromGLenum<TextureOp>(asEnum);
2501 break;
2502 case TextureEnvParameter::Op1Rgb:
2503 env.op1Rgb = FromGLenum<TextureOp>(asEnum);
2504 break;
2505 case TextureEnvParameter::Op2Rgb:
2506 env.op2Rgb = FromGLenum<TextureOp>(asEnum);
2507 break;
2508 case TextureEnvParameter::Op0Alpha:
2509 env.op0Alpha = FromGLenum<TextureOp>(asEnum);
2510 break;
2511 case TextureEnvParameter::Op1Alpha:
2512 env.op1Alpha = FromGLenum<TextureOp>(asEnum);
2513 break;
2514 case TextureEnvParameter::Op2Alpha:
2515 env.op2Alpha = FromGLenum<TextureOp>(asEnum);
2516 break;
2517 case TextureEnvParameter::Color:
2518 env.color = ColorF::fromData(params);
2519 break;
2520 case TextureEnvParameter::RgbScale:
2521 env.rgbScale = params[0];
2522 break;
2523 case TextureEnvParameter::AlphaScale:
2524 env.alphaScale = params[0];
2525 break;
2526 default:
2527 UNREACHABLE();
2528 break;
2529 }
2530 break;
2531 case TextureEnvTarget::PointSprite:
2532 switch (pname)
2533 {
2534 case TextureEnvParameter::PointCoordReplace:
2535 env.pointSpriteCoordReplace = static_cast<bool>(params[0]);
2536 break;
2537 default:
2538 UNREACHABLE();
2539 break;
2540 }
2541 break;
2542 default:
2543 UNREACHABLE();
2544 break;
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002545 }
2546}
2547
2548void GetTextureEnv(unsigned int unit,
2549 const GLES1State *state,
2550 TextureEnvTarget target,
2551 TextureEnvParameter pname,
2552 GLfloat *params)
2553{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002554 const TextureEnvironmentParameters &env = state->textureEnvironment(unit);
2555
2556 switch (target)
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002557 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002558 case TextureEnvTarget::Env:
2559 switch (pname)
2560 {
2561 case TextureEnvParameter::Mode:
2562 ConvertPackedEnum(env.mode, params);
2563 break;
2564 case TextureEnvParameter::CombineRgb:
2565 ConvertPackedEnum(env.combineRgb, params);
2566 break;
2567 case TextureEnvParameter::CombineAlpha:
2568 ConvertPackedEnum(env.combineAlpha, params);
2569 break;
2570 case TextureEnvParameter::Src0Rgb:
2571 ConvertPackedEnum(env.src0Rgb, params);
2572 break;
2573 case TextureEnvParameter::Src1Rgb:
2574 ConvertPackedEnum(env.src1Rgb, params);
2575 break;
2576 case TextureEnvParameter::Src2Rgb:
2577 ConvertPackedEnum(env.src2Rgb, params);
2578 break;
2579 case TextureEnvParameter::Src0Alpha:
2580 ConvertPackedEnum(env.src0Alpha, params);
2581 break;
2582 case TextureEnvParameter::Src1Alpha:
2583 ConvertPackedEnum(env.src1Alpha, params);
2584 break;
2585 case TextureEnvParameter::Src2Alpha:
2586 ConvertPackedEnum(env.src2Alpha, params);
2587 break;
2588 case TextureEnvParameter::Op0Rgb:
2589 ConvertPackedEnum(env.op0Rgb, params);
2590 break;
2591 case TextureEnvParameter::Op1Rgb:
2592 ConvertPackedEnum(env.op1Rgb, params);
2593 break;
2594 case TextureEnvParameter::Op2Rgb:
2595 ConvertPackedEnum(env.op2Rgb, params);
2596 break;
2597 case TextureEnvParameter::Op0Alpha:
2598 ConvertPackedEnum(env.op0Alpha, params);
2599 break;
2600 case TextureEnvParameter::Op1Alpha:
2601 ConvertPackedEnum(env.op1Alpha, params);
2602 break;
2603 case TextureEnvParameter::Op2Alpha:
2604 ConvertPackedEnum(env.op2Alpha, params);
2605 break;
2606 case TextureEnvParameter::Color:
2607 env.color.writeData(params);
2608 break;
2609 case TextureEnvParameter::RgbScale:
2610 *params = env.rgbScale;
2611 break;
2612 case TextureEnvParameter::AlphaScale:
2613 *params = env.alphaScale;
2614 break;
2615 default:
2616 UNREACHABLE();
2617 break;
2618 }
2619 break;
2620 case TextureEnvTarget::PointSprite:
2621 switch (pname)
2622 {
2623 case TextureEnvParameter::PointCoordReplace:
2624 *params = static_cast<GLfloat>(env.pointSpriteCoordReplace);
2625 break;
2626 default:
2627 UNREACHABLE();
2628 break;
2629 }
2630 break;
2631 default:
2632 UNREACHABLE();
2633 break;
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002634 }
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002635}
2636
2637unsigned int GetPointParameterCount(PointParameter pname)
2638{
2639 switch (pname)
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002640 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002641 case PointParameter::PointSizeMin:
2642 case PointParameter::PointSizeMax:
2643 case PointParameter::PointFadeThresholdSize:
2644 return 1;
2645 case PointParameter::PointDistanceAttenuation:
2646 return 3;
2647 default:
2648 return 0;
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002649 }
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07002650}
2651
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002652void SetPointParameter(GLES1State *state, PointParameter pname, const GLfloat *params)
2653{
2654
2655 PointParameters &pointParams = state->pointParameters();
2656
2657 switch (pname)
2658 {
2659 case PointParameter::PointSizeMin:
2660 pointParams.pointSizeMin = params[0];
2661 break;
2662 case PointParameter::PointSizeMax:
2663 pointParams.pointSizeMax = params[0];
2664 break;
2665 case PointParameter::PointFadeThresholdSize:
2666 pointParams.pointFadeThresholdSize = params[0];
2667 break;
2668 case PointParameter::PointDistanceAttenuation:
2669 for (unsigned int i = 0; i < 3; i++)
2670 {
2671 pointParams.pointDistanceAttenuation[i] = params[i];
2672 }
2673 break;
2674 default:
2675 UNREACHABLE();
2676 }
2677}
2678
2679void GetPointParameter(const GLES1State *state, PointParameter pname, GLfloat *params)
2680{
2681 const PointParameters &pointParams = state->pointParameters();
2682
2683 switch (pname)
2684 {
2685 case PointParameter::PointSizeMin:
2686 params[0] = pointParams.pointSizeMin;
2687 break;
2688 case PointParameter::PointSizeMax:
2689 params[0] = pointParams.pointSizeMax;
2690 break;
2691 case PointParameter::PointFadeThresholdSize:
2692 params[0] = pointParams.pointFadeThresholdSize;
2693 break;
2694 case PointParameter::PointDistanceAttenuation:
2695 for (unsigned int i = 0; i < 3; i++)
2696 {
2697 params[i] = pointParams.pointDistanceAttenuation[i];
2698 }
2699 break;
2700 default:
2701 UNREACHABLE();
2702 }
2703}
2704
2705void SetPointSize(GLES1State *state, GLfloat size)
2706{
2707 PointParameters &params = state->pointParameters();
2708 params.pointSize = size;
2709}
2710
2711void GetPointSize(GLES1State *state, GLfloat *sizeOut)
2712{
2713 const PointParameters &params = state->pointParameters();
2714 *sizeOut = params.pointSize;
2715}
2716
Lingfeng Yangf97641c2018-06-21 19:22:45 -07002717unsigned int GetTexParameterCount(GLenum pname)
2718{
2719 switch (pname)
2720 {
2721 case GL_TEXTURE_CROP_RECT_OES:
Till Rathmannb8543632018-10-02 19:46:14 +02002722 case GL_TEXTURE_BORDER_COLOR:
Lingfeng Yangf97641c2018-06-21 19:22:45 -07002723 return 4;
2724 case GL_TEXTURE_MAG_FILTER:
2725 case GL_TEXTURE_MIN_FILTER:
2726 case GL_TEXTURE_WRAP_S:
2727 case GL_TEXTURE_WRAP_T:
2728 case GL_TEXTURE_USAGE_ANGLE:
2729 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
2730 case GL_TEXTURE_IMMUTABLE_FORMAT:
2731 case GL_TEXTURE_WRAP_R:
2732 case GL_TEXTURE_IMMUTABLE_LEVELS:
2733 case GL_TEXTURE_SWIZZLE_R:
2734 case GL_TEXTURE_SWIZZLE_G:
2735 case GL_TEXTURE_SWIZZLE_B:
2736 case GL_TEXTURE_SWIZZLE_A:
2737 case GL_TEXTURE_BASE_LEVEL:
2738 case GL_TEXTURE_MAX_LEVEL:
2739 case GL_TEXTURE_MIN_LOD:
2740 case GL_TEXTURE_MAX_LOD:
2741 case GL_TEXTURE_COMPARE_MODE:
2742 case GL_TEXTURE_COMPARE_FUNC:
2743 case GL_TEXTURE_SRGB_DECODE_EXT:
2744 case GL_DEPTH_STENCIL_TEXTURE_MODE:
2745 return 1;
2746 default:
2747 return 0;
2748 }
2749}
2750
Geoff Lang65603eb2017-01-12 16:48:03 -05002751} // namespace gl
2752
2753namespace egl
2754{
2755
2756void QueryConfigAttrib(const Config *config, EGLint attribute, EGLint *value)
2757{
2758 ASSERT(config != nullptr);
2759 switch (attribute)
2760 {
2761 case EGL_BUFFER_SIZE:
2762 *value = config->bufferSize;
2763 break;
2764 case EGL_ALPHA_SIZE:
2765 *value = config->alphaSize;
2766 break;
2767 case EGL_BLUE_SIZE:
2768 *value = config->blueSize;
2769 break;
2770 case EGL_GREEN_SIZE:
2771 *value = config->greenSize;
2772 break;
2773 case EGL_RED_SIZE:
2774 *value = config->redSize;
2775 break;
2776 case EGL_DEPTH_SIZE:
2777 *value = config->depthSize;
2778 break;
2779 case EGL_STENCIL_SIZE:
2780 *value = config->stencilSize;
2781 break;
2782 case EGL_CONFIG_CAVEAT:
2783 *value = config->configCaveat;
2784 break;
2785 case EGL_CONFIG_ID:
2786 *value = config->configID;
2787 break;
2788 case EGL_LEVEL:
2789 *value = config->level;
2790 break;
2791 case EGL_NATIVE_RENDERABLE:
2792 *value = config->nativeRenderable;
2793 break;
2794 case EGL_NATIVE_VISUAL_ID:
2795 *value = config->nativeVisualID;
2796 break;
2797 case EGL_NATIVE_VISUAL_TYPE:
2798 *value = config->nativeVisualType;
2799 break;
2800 case EGL_SAMPLES:
2801 *value = config->samples;
2802 break;
2803 case EGL_SAMPLE_BUFFERS:
2804 *value = config->sampleBuffers;
2805 break;
2806 case EGL_SURFACE_TYPE:
2807 *value = config->surfaceType;
2808 break;
2809 case EGL_TRANSPARENT_TYPE:
2810 *value = config->transparentType;
2811 break;
2812 case EGL_TRANSPARENT_BLUE_VALUE:
2813 *value = config->transparentBlueValue;
2814 break;
2815 case EGL_TRANSPARENT_GREEN_VALUE:
2816 *value = config->transparentGreenValue;
2817 break;
2818 case EGL_TRANSPARENT_RED_VALUE:
2819 *value = config->transparentRedValue;
2820 break;
2821 case EGL_BIND_TO_TEXTURE_RGB:
2822 *value = config->bindToTextureRGB;
2823 break;
2824 case EGL_BIND_TO_TEXTURE_RGBA:
2825 *value = config->bindToTextureRGBA;
2826 break;
2827 case EGL_MIN_SWAP_INTERVAL:
2828 *value = config->minSwapInterval;
2829 break;
2830 case EGL_MAX_SWAP_INTERVAL:
2831 *value = config->maxSwapInterval;
2832 break;
2833 case EGL_LUMINANCE_SIZE:
2834 *value = config->luminanceSize;
2835 break;
2836 case EGL_ALPHA_MASK_SIZE:
2837 *value = config->alphaMaskSize;
2838 break;
2839 case EGL_COLOR_BUFFER_TYPE:
2840 *value = config->colorBufferType;
2841 break;
2842 case EGL_RENDERABLE_TYPE:
2843 *value = config->renderableType;
2844 break;
2845 case EGL_MATCH_NATIVE_PIXMAP:
2846 *value = false;
2847 UNIMPLEMENTED();
2848 break;
2849 case EGL_CONFORMANT:
2850 *value = config->conformant;
2851 break;
2852 case EGL_MAX_PBUFFER_WIDTH:
2853 *value = config->maxPBufferWidth;
2854 break;
2855 case EGL_MAX_PBUFFER_HEIGHT:
2856 *value = config->maxPBufferHeight;
2857 break;
2858 case EGL_MAX_PBUFFER_PIXELS:
2859 *value = config->maxPBufferPixels;
2860 break;
2861 case EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE:
2862 *value = config->optimalOrientation;
2863 break;
Geoff Langc5a2a172017-01-13 15:55:07 -05002864 case EGL_COLOR_COMPONENT_TYPE_EXT:
2865 *value = config->colorComponentType;
2866 break;
Geoff Lang65603eb2017-01-12 16:48:03 -05002867 default:
2868 UNREACHABLE();
2869 break;
2870 }
Geoff Langff5b2d52016-09-07 11:32:23 -04002871}
Geoff Lang65603eb2017-01-12 16:48:03 -05002872
Geoff Langaf143fe2017-10-05 13:59:43 -04002873void QueryContextAttrib(const gl::Context *context, EGLint attribute, EGLint *value)
2874{
2875 switch (attribute)
2876 {
2877 case EGL_CONFIG_ID:
2878 *value = context->getConfig()->configID;
2879 break;
2880 case EGL_CONTEXT_CLIENT_TYPE:
2881 *value = context->getClientType();
2882 break;
2883 case EGL_CONTEXT_CLIENT_VERSION:
2884 *value = context->getClientMajorVersion();
2885 break;
2886 case EGL_RENDER_BUFFER:
2887 *value = context->getRenderBuffer();
2888 break;
Geoff Langb433e872017-10-05 14:01:47 -04002889 case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
2890 *value = context->isRobustResourceInitEnabled();
2891 break;
Geoff Langaf143fe2017-10-05 13:59:43 -04002892 default:
2893 UNREACHABLE();
2894 break;
2895 }
2896}
2897
Geoff Lang31ecbd72017-07-26 13:01:27 -04002898void QuerySurfaceAttrib(const Surface *surface, EGLint attribute, EGLint *value)
2899{
2900 switch (attribute)
2901 {
2902 case EGL_GL_COLORSPACE:
Geoff Lang40ac7832017-07-26 14:38:46 -04002903 *value = surface->getGLColorspace();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002904 break;
2905 case EGL_VG_ALPHA_FORMAT:
Geoff Lang40ac7832017-07-26 14:38:46 -04002906 *value = surface->getVGAlphaFormat();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002907 break;
2908 case EGL_VG_COLORSPACE:
Geoff Lang40ac7832017-07-26 14:38:46 -04002909 *value = surface->getVGColorspace();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002910 break;
2911 case EGL_CONFIG_ID:
2912 *value = surface->getConfig()->configID;
2913 break;
2914 case EGL_HEIGHT:
2915 *value = surface->getHeight();
2916 break;
2917 case EGL_HORIZONTAL_RESOLUTION:
Geoff Lang40ac7832017-07-26 14:38:46 -04002918 *value = surface->getHorizontalResolution();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002919 break;
2920 case EGL_LARGEST_PBUFFER:
Geoff Lang40ac7832017-07-26 14:38:46 -04002921 // The EGL spec states that value is not written if the surface is not a pbuffer
2922 if (surface->getType() == EGL_PBUFFER_BIT)
2923 {
2924 *value = surface->getLargestPbuffer();
2925 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04002926 break;
2927 case EGL_MIPMAP_TEXTURE:
Geoff Lang40ac7832017-07-26 14:38:46 -04002928 // The EGL spec states that value is not written if the surface is not a pbuffer
2929 if (surface->getType() == EGL_PBUFFER_BIT)
2930 {
2931 *value = surface->getMipmapTexture();
2932 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04002933 break;
2934 case EGL_MIPMAP_LEVEL:
Geoff Lang40ac7832017-07-26 14:38:46 -04002935 // The EGL spec states that value is not written if the surface is not a pbuffer
2936 if (surface->getType() == EGL_PBUFFER_BIT)
2937 {
2938 *value = surface->getMipmapLevel();
2939 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04002940 break;
2941 case EGL_MULTISAMPLE_RESOLVE:
Geoff Lang40ac7832017-07-26 14:38:46 -04002942 *value = surface->getMultisampleResolve();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002943 break;
2944 case EGL_PIXEL_ASPECT_RATIO:
2945 *value = surface->getPixelAspectRatio();
2946 break;
2947 case EGL_RENDER_BUFFER:
2948 *value = surface->getRenderBuffer();
2949 break;
2950 case EGL_SWAP_BEHAVIOR:
2951 *value = surface->getSwapBehavior();
2952 break;
2953 case EGL_TEXTURE_FORMAT:
Geoff Lang40ac7832017-07-26 14:38:46 -04002954 // The EGL spec states that value is not written if the surface is not a pbuffer
2955 if (surface->getType() == EGL_PBUFFER_BIT)
2956 {
Geoff Lang8ceea812018-04-10 03:07:13 -04002957 *value = ToEGLenum(surface->getTextureFormat());
Geoff Lang40ac7832017-07-26 14:38:46 -04002958 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04002959 break;
2960 case EGL_TEXTURE_TARGET:
Geoff Lang40ac7832017-07-26 14:38:46 -04002961 // The EGL spec states that value is not written if the surface is not a pbuffer
2962 if (surface->getType() == EGL_PBUFFER_BIT)
2963 {
2964 *value = surface->getTextureTarget();
2965 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04002966 break;
2967 case EGL_VERTICAL_RESOLUTION:
Geoff Lang40ac7832017-07-26 14:38:46 -04002968 *value = surface->getVerticalResolution();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002969 break;
2970 case EGL_WIDTH:
2971 *value = surface->getWidth();
2972 break;
2973 case EGL_POST_SUB_BUFFER_SUPPORTED_NV:
2974 *value = surface->isPostSubBufferSupported();
2975 break;
2976 case EGL_FIXED_SIZE_ANGLE:
2977 *value = surface->isFixedSize();
2978 break;
2979 case EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE:
2980 *value = surface->flexibleSurfaceCompatibilityRequested();
2981 break;
2982 case EGL_SURFACE_ORIENTATION_ANGLE:
2983 *value = surface->getOrientation();
2984 break;
2985 case EGL_DIRECT_COMPOSITION_ANGLE:
2986 *value = surface->directComposition();
2987 break;
Geoff Langb433e872017-10-05 14:01:47 -04002988 case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
2989 *value = surface->isRobustResourceInitEnabled();
2990 break;
Geoff Lang31ecbd72017-07-26 13:01:27 -04002991 default:
2992 UNREACHABLE();
2993 break;
2994 }
2995}
2996
2997void SetSurfaceAttrib(Surface *surface, EGLint attribute, EGLint value)
2998{
2999 switch (attribute)
3000 {
3001 case EGL_MIPMAP_LEVEL:
Geoff Lang40ac7832017-07-26 14:38:46 -04003002 surface->setMipmapLevel(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04003003 break;
3004 case EGL_MULTISAMPLE_RESOLVE:
Geoff Lang40ac7832017-07-26 14:38:46 -04003005 surface->setMultisampleResolve(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04003006 break;
3007 case EGL_SWAP_BEHAVIOR:
Geoff Lang40ac7832017-07-26 14:38:46 -04003008 surface->setSwapBehavior(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04003009 break;
LRN03d132e2018-07-14 13:31:35 +00003010 case EGL_WIDTH:
3011 surface->setFixedWidth(value);
3012 break;
3013 case EGL_HEIGHT:
3014 surface->setFixedHeight(value);
3015 break;
Geoff Lang31ecbd72017-07-26 13:01:27 -04003016 default:
3017 UNREACHABLE();
3018 break;
3019 }
3020}
3021
Geoff Lang65603eb2017-01-12 16:48:03 -05003022} // namespace egl