blob: 8c7e838a4b6b0aae66f7ffbbe7f963adaa51f8b9 [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
Geoff Langc1984ed2016-10-07 12:41:00 -040035template <typename ParamType>
He Yunchao11b038b2016-11-22 21:24:04 +080036void QueryTexLevelParameterBase(const Texture *texture,
Corentin Wallez99d492c2018-02-27 15:17:10 -050037 TextureTarget target,
He Yunchao11b038b2016-11-22 21:24:04 +080038 GLint level,
39 GLenum pname,
40 ParamType *params)
41{
42 ASSERT(texture != nullptr);
43 const InternalFormat *info = texture->getTextureState().getImageDesc(target, level).format.info;
44
45 switch (pname)
46 {
47 case GL_TEXTURE_RED_TYPE:
jchen10a99ed552017-09-22 08:10:32 +080048 *params = CastFromGLintStateValue<ParamType>(
49 pname, info->redBits ? info->componentType : GL_NONE);
He Yunchao11b038b2016-11-22 21:24:04 +080050 break;
51 case GL_TEXTURE_GREEN_TYPE:
jchen10a99ed552017-09-22 08:10:32 +080052 *params = CastFromGLintStateValue<ParamType>(
53 pname, info->greenBits ? info->componentType : GL_NONE);
He Yunchao11b038b2016-11-22 21:24:04 +080054 break;
55 case GL_TEXTURE_BLUE_TYPE:
jchen10a99ed552017-09-22 08:10:32 +080056 *params = CastFromGLintStateValue<ParamType>(
57 pname, info->blueBits ? info->componentType : GL_NONE);
He Yunchao11b038b2016-11-22 21:24:04 +080058 break;
59 case GL_TEXTURE_ALPHA_TYPE:
jchen10a99ed552017-09-22 08:10:32 +080060 *params = CastFromGLintStateValue<ParamType>(
61 pname, info->alphaBits ? info->componentType : GL_NONE);
He Yunchao11b038b2016-11-22 21:24:04 +080062 break;
63 case GL_TEXTURE_DEPTH_TYPE:
jchen10a99ed552017-09-22 08:10:32 +080064 *params = CastFromGLintStateValue<ParamType>(
65 pname, info->depthBits ? info->componentType : GL_NONE);
He Yunchao11b038b2016-11-22 21:24:04 +080066 break;
67 case GL_TEXTURE_RED_SIZE:
jchen10a99ed552017-09-22 08:10:32 +080068 *params = CastFromGLintStateValue<ParamType>(pname, info->redBits);
He Yunchao11b038b2016-11-22 21:24:04 +080069 break;
70 case GL_TEXTURE_GREEN_SIZE:
jchen10a99ed552017-09-22 08:10:32 +080071 *params = CastFromGLintStateValue<ParamType>(pname, info->greenBits);
He Yunchao11b038b2016-11-22 21:24:04 +080072 break;
73 case GL_TEXTURE_BLUE_SIZE:
jchen10a99ed552017-09-22 08:10:32 +080074 *params = CastFromGLintStateValue<ParamType>(pname, info->blueBits);
He Yunchao11b038b2016-11-22 21:24:04 +080075 break;
76 case GL_TEXTURE_ALPHA_SIZE:
jchen10a99ed552017-09-22 08:10:32 +080077 *params = CastFromGLintStateValue<ParamType>(pname, info->alphaBits);
He Yunchao11b038b2016-11-22 21:24:04 +080078 break;
79 case GL_TEXTURE_DEPTH_SIZE:
jchen10a99ed552017-09-22 08:10:32 +080080 *params = CastFromGLintStateValue<ParamType>(pname, info->depthBits);
He Yunchao11b038b2016-11-22 21:24:04 +080081 break;
82 case GL_TEXTURE_STENCIL_SIZE:
jchen10a99ed552017-09-22 08:10:32 +080083 *params = CastFromGLintStateValue<ParamType>(pname, info->stencilBits);
He Yunchao11b038b2016-11-22 21:24:04 +080084 break;
85 case GL_TEXTURE_SHARED_SIZE:
jchen10a99ed552017-09-22 08:10:32 +080086 *params = CastFromGLintStateValue<ParamType>(pname, info->sharedBits);
He Yunchao11b038b2016-11-22 21:24:04 +080087 break;
88 case GL_TEXTURE_INTERNAL_FORMAT:
jchen10a99ed552017-09-22 08:10:32 +080089 *params = CastFromGLintStateValue<ParamType>(
90 pname, info->internalFormat ? info->internalFormat : GL_RGBA);
He Yunchao11b038b2016-11-22 21:24:04 +080091 break;
92 case GL_TEXTURE_WIDTH:
Corentin Wallez10d40262017-10-04 16:34:09 -040093 *params = CastFromGLintStateValue<ParamType>(
94 pname, static_cast<uint32_t>(texture->getWidth(target, level)));
He Yunchao11b038b2016-11-22 21:24:04 +080095 break;
96 case GL_TEXTURE_HEIGHT:
Corentin Wallez10d40262017-10-04 16:34:09 -040097 *params = CastFromGLintStateValue<ParamType>(
98 pname, static_cast<uint32_t>(texture->getHeight(target, level)));
He Yunchao11b038b2016-11-22 21:24:04 +080099 break;
100 case GL_TEXTURE_DEPTH:
Corentin Wallez10d40262017-10-04 16:34:09 -0400101 *params = CastFromGLintStateValue<ParamType>(
102 pname, static_cast<uint32_t>(texture->getDepth(target, level)));
He Yunchao11b038b2016-11-22 21:24:04 +0800103 break;
104 case GL_TEXTURE_SAMPLES:
jchen10a99ed552017-09-22 08:10:32 +0800105 *params = CastFromStateValue<ParamType>(pname, texture->getSamples(target, level));
He Yunchao11b038b2016-11-22 21:24:04 +0800106 break;
107 case GL_TEXTURE_FIXED_SAMPLE_LOCATIONS:
jchen10a99ed552017-09-22 08:10:32 +0800108 *params = CastFromStateValue<ParamType>(
109 pname, static_cast<GLint>(texture->getFixedSampleLocations(target, level)));
He Yunchao11b038b2016-11-22 21:24:04 +0800110 break;
111 case GL_TEXTURE_COMPRESSED:
jchen10a99ed552017-09-22 08:10:32 +0800112 *params = CastFromStateValue<ParamType>(pname, static_cast<GLint>(info->compressed));
He Yunchao11b038b2016-11-22 21:24:04 +0800113 break;
114 default:
115 UNREACHABLE();
116 break;
117 }
118}
119
120template <typename ParamType>
Geoff Langc1984ed2016-10-07 12:41:00 -0400121void QueryTexParameterBase(const Texture *texture, GLenum pname, ParamType *params)
122{
123 ASSERT(texture != nullptr);
124
125 switch (pname)
126 {
127 case GL_TEXTURE_MAG_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800128 *params = CastFromGLintStateValue<ParamType>(pname, texture->getMagFilter());
Geoff Langc1984ed2016-10-07 12:41:00 -0400129 break;
130 case GL_TEXTURE_MIN_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800131 *params = CastFromGLintStateValue<ParamType>(pname, texture->getMinFilter());
Geoff Langc1984ed2016-10-07 12:41:00 -0400132 break;
133 case GL_TEXTURE_WRAP_S:
jchen10a99ed552017-09-22 08:10:32 +0800134 *params = CastFromGLintStateValue<ParamType>(pname, texture->getWrapS());
Geoff Langc1984ed2016-10-07 12:41:00 -0400135 break;
136 case GL_TEXTURE_WRAP_T:
jchen10a99ed552017-09-22 08:10:32 +0800137 *params = CastFromGLintStateValue<ParamType>(pname, texture->getWrapT());
Geoff Langc1984ed2016-10-07 12:41:00 -0400138 break;
139 case GL_TEXTURE_WRAP_R:
jchen10a99ed552017-09-22 08:10:32 +0800140 *params = CastFromGLintStateValue<ParamType>(pname, texture->getWrapR());
Geoff Langc1984ed2016-10-07 12:41:00 -0400141 break;
142 case GL_TEXTURE_IMMUTABLE_FORMAT:
jchen10a99ed552017-09-22 08:10:32 +0800143 *params = CastFromGLintStateValue<ParamType>(pname, texture->getImmutableFormat());
Geoff Langc1984ed2016-10-07 12:41:00 -0400144 break;
145 case GL_TEXTURE_IMMUTABLE_LEVELS:
jchen10a99ed552017-09-22 08:10:32 +0800146 *params = CastFromGLintStateValue<ParamType>(pname, texture->getImmutableLevels());
Geoff Langc1984ed2016-10-07 12:41:00 -0400147 break;
148 case GL_TEXTURE_USAGE_ANGLE:
jchen10a99ed552017-09-22 08:10:32 +0800149 *params = CastFromGLintStateValue<ParamType>(pname, texture->getUsage());
Geoff Langc1984ed2016-10-07 12:41:00 -0400150 break;
151 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800152 *params = CastFromStateValue<ParamType>(pname, texture->getMaxAnisotropy());
Geoff Langc1984ed2016-10-07 12:41:00 -0400153 break;
154 case GL_TEXTURE_SWIZZLE_R:
jchen10a99ed552017-09-22 08:10:32 +0800155 *params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleRed());
Geoff Langc1984ed2016-10-07 12:41:00 -0400156 break;
157 case GL_TEXTURE_SWIZZLE_G:
jchen10a99ed552017-09-22 08:10:32 +0800158 *params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleGreen());
Geoff Langc1984ed2016-10-07 12:41:00 -0400159 break;
160 case GL_TEXTURE_SWIZZLE_B:
jchen10a99ed552017-09-22 08:10:32 +0800161 *params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleBlue());
Geoff Langc1984ed2016-10-07 12:41:00 -0400162 break;
163 case GL_TEXTURE_SWIZZLE_A:
jchen10a99ed552017-09-22 08:10:32 +0800164 *params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleAlpha());
Geoff Langc1984ed2016-10-07 12:41:00 -0400165 break;
166 case GL_TEXTURE_BASE_LEVEL:
jchen10a99ed552017-09-22 08:10:32 +0800167 *params = CastFromGLintStateValue<ParamType>(pname, texture->getBaseLevel());
Geoff Langc1984ed2016-10-07 12:41:00 -0400168 break;
169 case GL_TEXTURE_MAX_LEVEL:
jchen10a99ed552017-09-22 08:10:32 +0800170 *params = CastFromGLintStateValue<ParamType>(pname, texture->getMaxLevel());
Geoff Langc1984ed2016-10-07 12:41:00 -0400171 break;
172 case GL_TEXTURE_MIN_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800173 *params = CastFromStateValue<ParamType>(pname, texture->getSamplerState().minLod);
Geoff Langc1984ed2016-10-07 12:41:00 -0400174 break;
175 case GL_TEXTURE_MAX_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800176 *params = CastFromStateValue<ParamType>(pname, texture->getSamplerState().maxLod);
Geoff Langc1984ed2016-10-07 12:41:00 -0400177 break;
178 case GL_TEXTURE_COMPARE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800179 *params = CastFromGLintStateValue<ParamType>(pname, texture->getCompareMode());
Geoff Langc1984ed2016-10-07 12:41:00 -0400180 break;
181 case GL_TEXTURE_COMPARE_FUNC:
jchen10a99ed552017-09-22 08:10:32 +0800182 *params = CastFromGLintStateValue<ParamType>(pname, texture->getCompareFunc());
Geoff Langc1984ed2016-10-07 12:41:00 -0400183 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700184 case GL_TEXTURE_SRGB_DECODE_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800185 *params = CastFromGLintStateValue<ParamType>(pname, texture->getSRGBDecode());
Geoff Lang81c6b572016-10-19 14:07:52 -0700186 break;
Yunchao Hebacaa712018-01-30 14:01:39 +0800187 case GL_DEPTH_STENCIL_TEXTURE_MODE:
188 *params =
189 CastFromGLintStateValue<ParamType>(pname, texture->getDepthStencilTextureMode());
190 break;
Lingfeng Yangf97641c2018-06-21 19:22:45 -0700191 case GL_TEXTURE_CROP_RECT_OES:
192 {
193 const gl::Rectangle &crop = texture->getCrop();
194 params[0] = CastFromGLintStateValue<ParamType>(pname, crop.x);
195 params[1] = CastFromGLintStateValue<ParamType>(pname, crop.y);
196 params[2] = CastFromGLintStateValue<ParamType>(pname, crop.width);
197 params[3] = CastFromGLintStateValue<ParamType>(pname, crop.height);
198 break;
199 }
200 case GL_GENERATE_MIPMAP:
201 *params = CastFromGLintStateValue<ParamType>(pname, texture->getGenerateMipmapHint());
202 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400203 default:
204 UNREACHABLE();
205 break;
206 }
207}
208
209template <typename ParamType>
Jamie Madill4928b7c2017-06-20 12:57:39 -0400210void SetTexParameterBase(Context *context, Texture *texture, GLenum pname, const ParamType *params)
Geoff Langc1984ed2016-10-07 12:41:00 -0400211{
212 ASSERT(texture != nullptr);
213
214 switch (pname)
215 {
216 case GL_TEXTURE_WRAP_S:
jchen10a99ed552017-09-22 08:10:32 +0800217 texture->setWrapS(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400218 break;
219 case GL_TEXTURE_WRAP_T:
jchen10a99ed552017-09-22 08:10:32 +0800220 texture->setWrapT(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400221 break;
222 case GL_TEXTURE_WRAP_R:
jchen10a99ed552017-09-22 08:10:32 +0800223 texture->setWrapR(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400224 break;
225 case GL_TEXTURE_MIN_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800226 texture->setMinFilter(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400227 break;
228 case GL_TEXTURE_MAG_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800229 texture->setMagFilter(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400230 break;
231 case GL_TEXTURE_USAGE_ANGLE:
jchen10a99ed552017-09-22 08:10:32 +0800232 texture->setUsage(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400233 break;
234 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800235 texture->setMaxAnisotropy(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400236 break;
237 case GL_TEXTURE_COMPARE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800238 texture->setCompareMode(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400239 break;
240 case GL_TEXTURE_COMPARE_FUNC:
jchen10a99ed552017-09-22 08:10:32 +0800241 texture->setCompareFunc(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400242 break;
243 case GL_TEXTURE_SWIZZLE_R:
jchen10a99ed552017-09-22 08:10:32 +0800244 texture->setSwizzleRed(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400245 break;
246 case GL_TEXTURE_SWIZZLE_G:
jchen10a99ed552017-09-22 08:10:32 +0800247 texture->setSwizzleGreen(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400248 break;
249 case GL_TEXTURE_SWIZZLE_B:
jchen10a99ed552017-09-22 08:10:32 +0800250 texture->setSwizzleBlue(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400251 break;
252 case GL_TEXTURE_SWIZZLE_A:
jchen10a99ed552017-09-22 08:10:32 +0800253 texture->setSwizzleAlpha(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400254 break;
255 case GL_TEXTURE_BASE_LEVEL:
Jamie Madill4928b7c2017-06-20 12:57:39 -0400256 {
jchen10a99ed552017-09-22 08:10:32 +0800257 context->handleError(texture->setBaseLevel(
258 context, clampCast<GLuint>(CastQueryValueTo<GLint>(pname, params[0]))));
Geoff Langc1984ed2016-10-07 12:41:00 -0400259 break;
Jamie Madill4928b7c2017-06-20 12:57:39 -0400260 }
Geoff Langc1984ed2016-10-07 12:41:00 -0400261 case GL_TEXTURE_MAX_LEVEL:
jchen10a99ed552017-09-22 08:10:32 +0800262 texture->setMaxLevel(clampCast<GLuint>(CastQueryValueTo<GLint>(pname, params[0])));
Geoff Langc1984ed2016-10-07 12:41:00 -0400263 break;
264 case GL_TEXTURE_MIN_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800265 texture->setMinLod(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400266 break;
267 case GL_TEXTURE_MAX_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800268 texture->setMaxLod(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400269 break;
Geoff Lang3b573612016-10-31 14:08:10 -0400270 case GL_DEPTH_STENCIL_TEXTURE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800271 texture->setDepthStencilTextureMode(ConvertToGLenum(pname, params[0]));
Geoff Lang3b573612016-10-31 14:08:10 -0400272 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700273 case GL_TEXTURE_SRGB_DECODE_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800274 texture->setSRGBDecode(ConvertToGLenum(pname, params[0]));
Geoff Lang81c6b572016-10-19 14:07:52 -0700275 break;
Lingfeng Yangf97641c2018-06-21 19:22:45 -0700276 case GL_TEXTURE_CROP_RECT_OES:
277 texture->setCrop(gl::Rectangle(CastQueryValueTo<GLint>(pname, params[0]),
278 CastQueryValueTo<GLint>(pname, params[1]),
279 CastQueryValueTo<GLint>(pname, params[2]),
280 CastQueryValueTo<GLint>(pname, params[3])));
281 break;
282 case GL_GENERATE_MIPMAP:
283 texture->setGenerateMipmapHint(ConvertToGLenum(params[0]));
284 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400285 default:
286 UNREACHABLE();
287 break;
288 }
289}
290
291template <typename ParamType>
292void QuerySamplerParameterBase(const Sampler *sampler, GLenum pname, ParamType *params)
293{
294 switch (pname)
295 {
296 case GL_TEXTURE_MIN_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800297 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getMinFilter());
Geoff Langc1984ed2016-10-07 12:41:00 -0400298 break;
299 case GL_TEXTURE_MAG_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800300 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getMagFilter());
Geoff Langc1984ed2016-10-07 12:41:00 -0400301 break;
302 case GL_TEXTURE_WRAP_S:
jchen10a99ed552017-09-22 08:10:32 +0800303 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getWrapS());
Geoff Langc1984ed2016-10-07 12:41:00 -0400304 break;
305 case GL_TEXTURE_WRAP_T:
jchen10a99ed552017-09-22 08:10:32 +0800306 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getWrapT());
Geoff Langc1984ed2016-10-07 12:41:00 -0400307 break;
308 case GL_TEXTURE_WRAP_R:
jchen10a99ed552017-09-22 08:10:32 +0800309 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getWrapR());
Geoff Langc1984ed2016-10-07 12:41:00 -0400310 break;
311 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800312 *params = CastFromStateValue<ParamType>(pname, sampler->getMaxAnisotropy());
Geoff Langc1984ed2016-10-07 12:41:00 -0400313 break;
314 case GL_TEXTURE_MIN_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800315 *params = CastFromStateValue<ParamType>(pname, sampler->getMinLod());
Geoff Langc1984ed2016-10-07 12:41:00 -0400316 break;
317 case GL_TEXTURE_MAX_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800318 *params = CastFromStateValue<ParamType>(pname, sampler->getMaxLod());
Geoff Langc1984ed2016-10-07 12:41:00 -0400319 break;
320 case GL_TEXTURE_COMPARE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800321 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getCompareMode());
Geoff Langc1984ed2016-10-07 12:41:00 -0400322 break;
323 case GL_TEXTURE_COMPARE_FUNC:
jchen10a99ed552017-09-22 08:10:32 +0800324 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getCompareFunc());
Geoff Langc1984ed2016-10-07 12:41:00 -0400325 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700326 case GL_TEXTURE_SRGB_DECODE_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800327 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getSRGBDecode());
Geoff Lang81c6b572016-10-19 14:07:52 -0700328 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400329 default:
330 UNREACHABLE();
331 break;
332 }
333}
334
335template <typename ParamType>
336void SetSamplerParameterBase(Sampler *sampler, GLenum pname, const ParamType *params)
337{
338 switch (pname)
339 {
340 case GL_TEXTURE_WRAP_S:
jchen10a99ed552017-09-22 08:10:32 +0800341 sampler->setWrapS(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400342 break;
343 case GL_TEXTURE_WRAP_T:
jchen10a99ed552017-09-22 08:10:32 +0800344 sampler->setWrapT(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400345 break;
346 case GL_TEXTURE_WRAP_R:
jchen10a99ed552017-09-22 08:10:32 +0800347 sampler->setWrapR(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400348 break;
349 case GL_TEXTURE_MIN_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800350 sampler->setMinFilter(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400351 break;
352 case GL_TEXTURE_MAG_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800353 sampler->setMagFilter(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400354 break;
355 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800356 sampler->setMaxAnisotropy(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400357 break;
358 case GL_TEXTURE_COMPARE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800359 sampler->setCompareMode(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400360 break;
361 case GL_TEXTURE_COMPARE_FUNC:
jchen10a99ed552017-09-22 08:10:32 +0800362 sampler->setCompareFunc(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400363 break;
364 case GL_TEXTURE_MIN_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800365 sampler->setMinLod(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400366 break;
367 case GL_TEXTURE_MAX_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800368 sampler->setMaxLod(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400369 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700370 case GL_TEXTURE_SRGB_DECODE_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800371 sampler->setSRGBDecode(ConvertToGLenum(pname, params[0]));
Geoff Lang81c6b572016-10-19 14:07:52 -0700372 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400373 default:
374 UNREACHABLE();
375 break;
376 }
377}
378
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800379// Warning: you should ensure binding really matches attrib.bindingIndex before using this function.
Geoff Lang0b031062016-10-13 14:30:04 -0400380template <typename ParamType, typename CurrentDataType, size_t CurrentValueCount>
381void QueryVertexAttribBase(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800382 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -0400383 const CurrentDataType (&currentValueData)[CurrentValueCount],
384 GLenum pname,
385 ParamType *params)
386{
387 switch (pname)
388 {
389 case GL_CURRENT_VERTEX_ATTRIB:
390 for (size_t i = 0; i < CurrentValueCount; ++i)
391 {
jchen10a99ed552017-09-22 08:10:32 +0800392 params[i] = CastFromStateValue<ParamType>(pname, currentValueData[i]);
Geoff Lang0b031062016-10-13 14:30:04 -0400393 }
394 break;
395 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
jchen10a99ed552017-09-22 08:10:32 +0800396 *params = CastFromStateValue<ParamType>(pname, static_cast<GLint>(attrib.enabled));
Geoff Lang0b031062016-10-13 14:30:04 -0400397 break;
398 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
jchen10a99ed552017-09-22 08:10:32 +0800399 *params = CastFromGLintStateValue<ParamType>(pname, attrib.size);
Geoff Lang0b031062016-10-13 14:30:04 -0400400 break;
401 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
jchen10a99ed552017-09-22 08:10:32 +0800402 *params = CastFromGLintStateValue<ParamType>(pname, attrib.vertexAttribArrayStride);
Geoff Lang0b031062016-10-13 14:30:04 -0400403 break;
404 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
jchen10a99ed552017-09-22 08:10:32 +0800405 *params = CastFromGLintStateValue<ParamType>(pname, attrib.type);
Geoff Lang0b031062016-10-13 14:30:04 -0400406 break;
407 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
jchen10a99ed552017-09-22 08:10:32 +0800408 *params = CastFromStateValue<ParamType>(pname, static_cast<GLint>(attrib.normalized));
Geoff Lang0b031062016-10-13 14:30:04 -0400409 break;
410 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
jchen10a99ed552017-09-22 08:10:32 +0800411 *params = CastFromGLintStateValue<ParamType>(pname, binding.getBuffer().id());
Geoff Lang0b031062016-10-13 14:30:04 -0400412 break;
413 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
jchen10a99ed552017-09-22 08:10:32 +0800414 *params = CastFromGLintStateValue<ParamType>(pname, binding.getDivisor());
Geoff Lang0b031062016-10-13 14:30:04 -0400415 break;
416 case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
jchen10a99ed552017-09-22 08:10:32 +0800417 *params = CastFromGLintStateValue<ParamType>(pname, attrib.pureInteger);
Geoff Lang0b031062016-10-13 14:30:04 -0400418 break;
Shao80957d92017-02-20 21:25:59 +0800419 case GL_VERTEX_ATTRIB_BINDING:
jchen10a99ed552017-09-22 08:10:32 +0800420 *params = CastFromGLintStateValue<ParamType>(pname, attrib.bindingIndex);
Shao80957d92017-02-20 21:25:59 +0800421 break;
422 case GL_VERTEX_ATTRIB_RELATIVE_OFFSET:
jchen10a99ed552017-09-22 08:10:32 +0800423 *params = CastFromGLintStateValue<ParamType>(pname, attrib.relativeOffset);
Shao80957d92017-02-20 21:25:59 +0800424 break;
Geoff Lang0b031062016-10-13 14:30:04 -0400425 default:
426 UNREACHABLE();
427 break;
428 }
429}
430
Geoff Langebebe1c2016-10-14 12:01:31 -0400431template <typename ParamType>
432void QueryBufferParameterBase(const Buffer *buffer, GLenum pname, ParamType *params)
433{
434 ASSERT(buffer != nullptr);
435
436 switch (pname)
437 {
438 case GL_BUFFER_USAGE:
Corentin Wallez2e568cf2017-09-18 17:05:22 -0400439 *params = CastFromGLintStateValue<ParamType>(pname, ToGLenum(buffer->getUsage()));
Geoff Langebebe1c2016-10-14 12:01:31 -0400440 break;
441 case GL_BUFFER_SIZE:
jchen10a99ed552017-09-22 08:10:32 +0800442 *params = CastFromStateValue<ParamType>(pname, buffer->getSize());
Geoff Langebebe1c2016-10-14 12:01:31 -0400443 break;
444 case GL_BUFFER_ACCESS_FLAGS:
jchen10a99ed552017-09-22 08:10:32 +0800445 *params = CastFromGLintStateValue<ParamType>(pname, buffer->getAccessFlags());
Geoff Langebebe1c2016-10-14 12:01:31 -0400446 break;
447 case GL_BUFFER_ACCESS_OES:
jchen10a99ed552017-09-22 08:10:32 +0800448 *params = CastFromGLintStateValue<ParamType>(pname, buffer->getAccess());
Geoff Langebebe1c2016-10-14 12:01:31 -0400449 break;
450 case GL_BUFFER_MAPPED:
jchen10a99ed552017-09-22 08:10:32 +0800451 *params = CastFromStateValue<ParamType>(pname, buffer->isMapped());
Geoff Langebebe1c2016-10-14 12:01:31 -0400452 break;
453 case GL_BUFFER_MAP_OFFSET:
jchen10a99ed552017-09-22 08:10:32 +0800454 *params = CastFromStateValue<ParamType>(pname, buffer->getMapOffset());
Geoff Langebebe1c2016-10-14 12:01:31 -0400455 break;
456 case GL_BUFFER_MAP_LENGTH:
jchen10a99ed552017-09-22 08:10:32 +0800457 *params = CastFromStateValue<ParamType>(pname, buffer->getMapLength());
Geoff Langebebe1c2016-10-14 12:01:31 -0400458 break;
459 default:
460 UNREACHABLE();
461 break;
462 }
463}
464
Olli Etuaho465835d2017-09-26 13:34:10 +0300465GLint GetCommonVariableProperty(const sh::ShaderVariable &var, GLenum prop)
jchen10880683b2017-04-12 16:21:55 +0800466{
467 switch (prop)
468 {
469 case GL_TYPE:
jchen10a99ed552017-09-22 08:10:32 +0800470 return clampCast<GLint>(var.type);
jchen10880683b2017-04-12 16:21:55 +0800471
472 case GL_ARRAY_SIZE:
Olli Etuaho465835d2017-09-26 13:34:10 +0300473 // Queryable variables are guaranteed not to be arrays of arrays or arrays of structs,
474 // see GLES 3.1 spec section 7.3.1.1 page 77.
475 return clampCast<GLint>(var.getBasicTypeElementCount());
jchen10880683b2017-04-12 16:21:55 +0800476
477 case GL_NAME_LENGTH:
jchen10880683b2017-04-12 16:21:55 +0800478 // ES31 spec p84: This counts the terminating null char.
Olli Etuahod2551232017-10-26 20:03:33 +0300479 return clampCast<GLint>(var.name.size() + 1u);
jchen10880683b2017-04-12 16:21:55 +0800480
481 default:
482 UNREACHABLE();
483 return GL_INVALID_VALUE;
484 }
485}
486
487GLint GetInputResourceProperty(const Program *program, GLuint index, GLenum prop)
488{
489 const auto &attribute = program->getInputResource(index);
490 switch (prop)
491 {
492 case GL_TYPE:
493 case GL_ARRAY_SIZE:
jchen10880683b2017-04-12 16:21:55 +0800494 case GL_NAME_LENGTH:
Olli Etuaho465835d2017-09-26 13:34:10 +0300495 return GetCommonVariableProperty(attribute, prop);
jchen10880683b2017-04-12 16:21:55 +0800496
jchen10baf5d942017-08-28 20:45:48 +0800497 case GL_LOCATION:
498 return program->getAttributeLocation(attribute.name);
499
jchen10880683b2017-04-12 16:21:55 +0800500 case GL_REFERENCED_BY_VERTEX_SHADER:
501 return 1;
502
503 case GL_REFERENCED_BY_FRAGMENT_SHADER:
504 case GL_REFERENCED_BY_COMPUTE_SHADER:
Jiawei Shaoc6f82872018-04-24 14:14:50 +0800505 case GL_REFERENCED_BY_GEOMETRY_SHADER_EXT:
jchen10880683b2017-04-12 16:21:55 +0800506 return 0;
507
508 default:
509 UNREACHABLE();
510 return GL_INVALID_VALUE;
511 }
512}
513
514GLint GetOutputResourceProperty(const Program *program, GLuint index, const GLenum prop)
515{
516 const auto &outputVariable = program->getOutputResource(index);
517 switch (prop)
518 {
519 case GL_TYPE:
520 case GL_ARRAY_SIZE:
jchen10880683b2017-04-12 16:21:55 +0800521 case GL_NAME_LENGTH:
Olli Etuaho465835d2017-09-26 13:34:10 +0300522 return GetCommonVariableProperty(outputVariable, prop);
jchen10880683b2017-04-12 16:21:55 +0800523
jchen10baf5d942017-08-28 20:45:48 +0800524 case GL_LOCATION:
525 return program->getFragDataLocation(outputVariable.name);
526
jchen10880683b2017-04-12 16:21:55 +0800527 case GL_REFERENCED_BY_FRAGMENT_SHADER:
528 return 1;
529
Jiawei Shaoc6f82872018-04-24 14:14:50 +0800530 case GL_REFERENCED_BY_VERTEX_SHADER:
jchen10880683b2017-04-12 16:21:55 +0800531 case GL_REFERENCED_BY_COMPUTE_SHADER:
Jiawei Shaoc6f82872018-04-24 14:14:50 +0800532 case GL_REFERENCED_BY_GEOMETRY_SHADER_EXT:
jchen10880683b2017-04-12 16:21:55 +0800533 return 0;
534
535 default:
536 UNREACHABLE();
537 return GL_INVALID_VALUE;
538 }
539}
540
jchen10910a3da2017-11-15 09:40:11 +0800541GLint GetTransformFeedbackVaryingResourceProperty(const Program *program,
542 GLuint index,
543 const GLenum prop)
544{
545 const auto &tfVariable = program->getTransformFeedbackVaryingResource(index);
546 switch (prop)
547 {
548 case GL_TYPE:
549 return clampCast<GLint>(tfVariable.type);
550
551 case GL_ARRAY_SIZE:
552 return clampCast<GLint>(tfVariable.size());
553
554 case GL_NAME_LENGTH:
555 return clampCast<GLint>(tfVariable.nameWithArrayIndex().size() + 1);
556
557 default:
558 UNREACHABLE();
559 return GL_INVALID_VALUE;
560 }
561}
562
jchen10d9cd7b72017-08-30 15:04:25 +0800563GLint QueryProgramInterfaceActiveResources(const Program *program, GLenum programInterface)
564{
565 switch (programInterface)
566 {
567 case GL_PROGRAM_INPUT:
jchen10a99ed552017-09-22 08:10:32 +0800568 return clampCast<GLint>(program->getAttributes().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800569
570 case GL_PROGRAM_OUTPUT:
jchen10a99ed552017-09-22 08:10:32 +0800571 return clampCast<GLint>(program->getState().getOutputVariables().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800572
573 case GL_UNIFORM:
jchen10a99ed552017-09-22 08:10:32 +0800574 return clampCast<GLint>(program->getState().getUniforms().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800575
576 case GL_UNIFORM_BLOCK:
jchen10a99ed552017-09-22 08:10:32 +0800577 return clampCast<GLint>(program->getState().getUniformBlocks().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800578
jchen1058f67be2017-10-27 08:59:27 +0800579 case GL_ATOMIC_COUNTER_BUFFER:
580 return clampCast<GLint>(program->getState().getAtomicCounterBuffers().size());
581
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800582 case GL_BUFFER_VARIABLE:
583 return clampCast<GLint>(program->getState().getBufferVariables().size());
584
585 case GL_SHADER_STORAGE_BLOCK:
586 return clampCast<GLint>(program->getState().getShaderStorageBlocks().size());
587
jchen10d9cd7b72017-08-30 15:04:25 +0800588 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10910a3da2017-11-15 09:40:11 +0800589 return clampCast<GLint>(program->getTransformFeedbackVaryingCount());
jchen10d9cd7b72017-08-30 15:04:25 +0800590
591 default:
592 UNREACHABLE();
593 return 0;
594 }
595}
596
597template <typename T, typename M>
598GLint FindMaxSize(const std::vector<T> &resources, M member)
599{
600 GLint max = 0;
601 for (const T &resource : resources)
602 {
jchen10a99ed552017-09-22 08:10:32 +0800603 max = std::max(max, clampCast<GLint>((resource.*member).size()));
jchen10d9cd7b72017-08-30 15:04:25 +0800604 }
605 return max;
606}
607
608GLint QueryProgramInterfaceMaxNameLength(const Program *program, GLenum programInterface)
609{
610 GLint maxNameLength = 0;
611 switch (programInterface)
612 {
613 case GL_PROGRAM_INPUT:
614 maxNameLength = FindMaxSize(program->getAttributes(), &sh::Attribute::name);
615 break;
616
617 case GL_PROGRAM_OUTPUT:
618 maxNameLength =
619 FindMaxSize(program->getState().getOutputVariables(), &sh::OutputVariable::name);
620 break;
621
622 case GL_UNIFORM:
623 maxNameLength = FindMaxSize(program->getState().getUniforms(), &LinkedUniform::name);
624 break;
625
626 case GL_UNIFORM_BLOCK:
Qin Jiajia9bf55522018-01-29 13:56:23 +0800627 return program->getActiveUniformBlockMaxNameLength();
jchen10d9cd7b72017-08-30 15:04:25 +0800628
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800629 case GL_BUFFER_VARIABLE:
630 maxNameLength =
631 FindMaxSize(program->getState().getBufferVariables(), &BufferVariable::name);
632 break;
633
634 case GL_SHADER_STORAGE_BLOCK:
Qin Jiajia9bf55522018-01-29 13:56:23 +0800635 return program->getActiveShaderStorageBlockMaxNameLength();
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800636
jchen10d9cd7b72017-08-30 15:04:25 +0800637 case GL_TRANSFORM_FEEDBACK_VARYING:
Qin Jiajia9bf55522018-01-29 13:56:23 +0800638 return clampCast<GLint>(program->getTransformFeedbackVaryingMaxLength());
jchen10d9cd7b72017-08-30 15:04:25 +0800639
640 default:
641 UNREACHABLE();
642 return 0;
643 }
644 // This length includes an extra character for the null terminator.
645 return (maxNameLength == 0 ? 0 : maxNameLength + 1);
646}
647
648GLint QueryProgramInterfaceMaxNumActiveVariables(const Program *program, GLenum programInterface)
649{
650 switch (programInterface)
651 {
652 case GL_UNIFORM_BLOCK:
653 return FindMaxSize(program->getState().getUniformBlocks(),
Jiajia Qin729b2c62017-08-14 09:36:11 +0800654 &InterfaceBlock::memberIndexes);
jchen1058f67be2017-10-27 08:59:27 +0800655 case GL_ATOMIC_COUNTER_BUFFER:
656 return FindMaxSize(program->getState().getAtomicCounterBuffers(),
657 &AtomicCounterBuffer::memberIndexes);
jchen10d9cd7b72017-08-30 15:04:25 +0800658
jchen10d9cd7b72017-08-30 15:04:25 +0800659 case GL_SHADER_STORAGE_BLOCK:
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800660 return FindMaxSize(program->getState().getShaderStorageBlocks(),
661 &InterfaceBlock::memberIndexes);
jchen10d9cd7b72017-08-30 15:04:25 +0800662
663 default:
664 UNREACHABLE();
665 return 0;
666 }
667}
668
jchen10baf5d942017-08-28 20:45:48 +0800669GLenum GetUniformPropertyEnum(GLenum prop)
670{
671 switch (prop)
672 {
673 case GL_UNIFORM_TYPE:
674 return GL_TYPE;
675 case GL_UNIFORM_SIZE:
676 return GL_ARRAY_SIZE;
677 case GL_UNIFORM_NAME_LENGTH:
678 return GL_NAME_LENGTH;
679 case GL_UNIFORM_BLOCK_INDEX:
680 return GL_BLOCK_INDEX;
681 case GL_UNIFORM_OFFSET:
682 return GL_OFFSET;
683 case GL_UNIFORM_ARRAY_STRIDE:
684 return GL_ARRAY_STRIDE;
685 case GL_UNIFORM_MATRIX_STRIDE:
686 return GL_MATRIX_STRIDE;
687 case GL_UNIFORM_IS_ROW_MAJOR:
688 return GL_IS_ROW_MAJOR;
689
690 default:
691 return prop;
692 }
693}
694
jchen1058f67be2017-10-27 08:59:27 +0800695GLenum GetUniformBlockPropertyEnum(GLenum prop)
696{
697 switch (prop)
698 {
699 case GL_UNIFORM_BLOCK_BINDING:
700 return GL_BUFFER_BINDING;
701
702 case GL_UNIFORM_BLOCK_DATA_SIZE:
703 return GL_BUFFER_DATA_SIZE;
704
705 case GL_UNIFORM_BLOCK_NAME_LENGTH:
706 return GL_NAME_LENGTH;
707
708 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
709 return GL_NUM_ACTIVE_VARIABLES;
710
711 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
712 return GL_ACTIVE_VARIABLES;
713
714 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
715 return GL_REFERENCED_BY_VERTEX_SHADER;
716
717 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
718 return GL_REFERENCED_BY_FRAGMENT_SHADER;
719
720 default:
721 return prop;
722 }
723}
724
725void GetShaderVariableBufferResourceProperty(const ShaderVariableBuffer &buffer,
726 GLenum pname,
727 GLint *params,
728 GLsizei bufSize,
729 GLsizei *outputPosition)
730
731{
732 switch (pname)
733 {
734 case GL_BUFFER_BINDING:
735 params[(*outputPosition)++] = buffer.binding;
736 break;
737 case GL_BUFFER_DATA_SIZE:
738 params[(*outputPosition)++] = clampCast<GLint>(buffer.dataSize);
739 break;
740 case GL_NUM_ACTIVE_VARIABLES:
741 params[(*outputPosition)++] = buffer.numActiveVariables();
742 break;
743 case GL_ACTIVE_VARIABLES:
744 for (size_t memberIndex = 0;
745 memberIndex < buffer.memberIndexes.size() && *outputPosition < bufSize;
746 ++memberIndex)
747 {
748 params[(*outputPosition)++] = clampCast<GLint>(buffer.memberIndexes[memberIndex]);
749 }
750 break;
751 case GL_REFERENCED_BY_VERTEX_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +0800752 params[(*outputPosition)++] = static_cast<GLint>(buffer.isActive(ShaderType::Vertex));
jchen1058f67be2017-10-27 08:59:27 +0800753 break;
754 case GL_REFERENCED_BY_FRAGMENT_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +0800755 params[(*outputPosition)++] = static_cast<GLint>(buffer.isActive(ShaderType::Fragment));
jchen1058f67be2017-10-27 08:59:27 +0800756 break;
757 case GL_REFERENCED_BY_COMPUTE_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +0800758 params[(*outputPosition)++] = static_cast<GLint>(buffer.isActive(ShaderType::Compute));
jchen1058f67be2017-10-27 08:59:27 +0800759 break;
Jiawei Shaoc6f82872018-04-24 14:14:50 +0800760 case GL_REFERENCED_BY_GEOMETRY_SHADER_EXT:
761 params[(*outputPosition)++] = static_cast<GLint>(buffer.isActive(ShaderType::Geometry));
762 break;
jchen1058f67be2017-10-27 08:59:27 +0800763 default:
764 UNREACHABLE();
765 break;
766 }
767}
768
769void GetInterfaceBlockResourceProperty(const InterfaceBlock &block,
770 GLenum pname,
771 GLint *params,
772 GLsizei bufSize,
773 GLsizei *outputPosition)
774{
775 if (pname == GL_NAME_LENGTH)
776 {
777 params[(*outputPosition)++] = clampCast<GLint>(block.nameWithArrayIndex().size() + 1);
778 return;
779 }
780 GetShaderVariableBufferResourceProperty(block, pname, params, bufSize, outputPosition);
781}
782
783void GetUniformBlockResourceProperty(const Program *program,
784 GLuint blockIndex,
785 GLenum pname,
786 GLint *params,
787 GLsizei bufSize,
788 GLsizei *outputPosition)
789
790{
791 ASSERT(*outputPosition < bufSize);
792 const auto &block = program->getUniformBlockByIndex(blockIndex);
793 GetInterfaceBlockResourceProperty(block, pname, params, bufSize, outputPosition);
794}
795
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800796void GetShaderStorageBlockResourceProperty(const Program *program,
797 GLuint blockIndex,
798 GLenum pname,
799 GLint *params,
800 GLsizei bufSize,
801 GLsizei *outputPosition)
802
803{
804 ASSERT(*outputPosition < bufSize);
805 const auto &block = program->getShaderStorageBlockByIndex(blockIndex);
806 GetInterfaceBlockResourceProperty(block, pname, params, bufSize, outputPosition);
807}
808
jchen1058f67be2017-10-27 08:59:27 +0800809void GetAtomicCounterBufferResourceProperty(const Program *program,
810 GLuint index,
811 GLenum pname,
812 GLint *params,
813 GLsizei bufSize,
814 GLsizei *outputPosition)
815
816{
817 ASSERT(*outputPosition < bufSize);
818 const auto &buffer = program->getState().getAtomicCounterBuffers()[index];
819 GetShaderVariableBufferResourceProperty(buffer, pname, params, bufSize, outputPosition);
820}
821
Lingfeng Yang45b5a872018-06-07 11:33:25 -0700822bool IsTextureEnvEnumParameter(TextureEnvParameter pname)
823{
824 switch (pname)
825 {
826 case TextureEnvParameter::Mode:
827 case TextureEnvParameter::CombineRgb:
828 case TextureEnvParameter::CombineAlpha:
829 case TextureEnvParameter::Src0Rgb:
830 case TextureEnvParameter::Src1Rgb:
831 case TextureEnvParameter::Src2Rgb:
832 case TextureEnvParameter::Src0Alpha:
833 case TextureEnvParameter::Src1Alpha:
834 case TextureEnvParameter::Src2Alpha:
835 case TextureEnvParameter::Op0Rgb:
836 case TextureEnvParameter::Op1Rgb:
837 case TextureEnvParameter::Op2Rgb:
838 case TextureEnvParameter::Op0Alpha:
839 case TextureEnvParameter::Op1Alpha:
840 case TextureEnvParameter::Op2Alpha:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -0700841 case TextureEnvParameter::PointCoordReplace:
Lingfeng Yang45b5a872018-06-07 11:33:25 -0700842 return true;
843 default:
844 return false;
845 }
846}
847
Geoff Langc1984ed2016-10-07 12:41:00 -0400848} // anonymous namespace
849
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -0800850void QueryFramebufferAttachmentParameteriv(const Context *context,
851 const Framebuffer *framebuffer,
Geoff Langff5b2d52016-09-07 11:32:23 -0400852 GLenum attachment,
853 GLenum pname,
854 GLint *params)
855{
856 ASSERT(framebuffer);
857
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -0800858 const FramebufferAttachment *attachmentObject = framebuffer->getAttachment(context, attachment);
859
Geoff Langff5b2d52016-09-07 11:32:23 -0400860 if (attachmentObject == nullptr)
861 {
862 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
863 // is NONE, then querying any other pname will generate INVALID_ENUM.
864
865 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
866 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
867 // INVALID_OPERATION for all other pnames
868
869 switch (pname)
870 {
871 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
872 *params = GL_NONE;
873 break;
874
875 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
876 *params = 0;
877 break;
878
879 default:
880 UNREACHABLE();
881 break;
882 }
883
884 return;
885 }
886
887 switch (pname)
888 {
889 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
890 *params = attachmentObject->type();
891 break;
892
893 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
894 *params = attachmentObject->id();
895 break;
896
897 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
898 *params = attachmentObject->mipLevel();
899 break;
900
901 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
Corentin Wallez99d492c2018-02-27 15:17:10 -0500902 {
903 TextureTarget face = attachmentObject->cubeMapFace();
904 if (face != TextureTarget::InvalidEnum)
905 {
906 *params = ToGLenum(attachmentObject->cubeMapFace());
907 }
908 else
909 {
910 // This happens when the attachment isn't a texture cube map face
911 *params = GL_NONE;
912 }
913 }
914 break;
Geoff Langff5b2d52016-09-07 11:32:23 -0400915
916 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
917 *params = attachmentObject->getRedSize();
918 break;
919
920 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
921 *params = attachmentObject->getGreenSize();
922 break;
923
924 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
925 *params = attachmentObject->getBlueSize();
926 break;
927
928 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
929 *params = attachmentObject->getAlphaSize();
930 break;
931
932 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
933 *params = attachmentObject->getDepthSize();
934 break;
935
936 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
937 *params = attachmentObject->getStencilSize();
938 break;
939
940 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
941 *params = attachmentObject->getComponentType();
942 break;
943
944 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
945 *params = attachmentObject->getColorEncoding();
946 break;
947
948 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
949 *params = attachmentObject->layer();
950 break;
951
Martin Radeve5285d22017-07-14 16:23:53 +0300952 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_ANGLE:
953 *params = attachmentObject->getNumViews();
954 break;
955
956 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_MULTIVIEW_LAYOUT_ANGLE:
957 *params = static_cast<GLint>(attachmentObject->getMultiviewLayout());
958 break;
959
960 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_ANGLE:
961 *params = attachmentObject->getBaseViewIndex();
962 break;
963
964 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_VIEWPORT_OFFSETS_ANGLE:
965 {
966 const std::vector<Offset> &offsets = attachmentObject->getMultiviewViewportOffsets();
967 for (size_t i = 0u; i < offsets.size(); ++i)
968 {
969 params[i * 2u] = offsets[i].x;
970 params[i * 2u + 1u] = offsets[i].y;
971 }
972 }
973 break;
974
Jiawei Shaoa8802472018-05-28 11:17:47 +0800975 case GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT:
976 *params = attachmentObject->isLayered();
977 break;
978
Geoff Langff5b2d52016-09-07 11:32:23 -0400979 default:
980 UNREACHABLE();
981 break;
982 }
983}
984
985void QueryBufferParameteriv(const Buffer *buffer, GLenum pname, GLint *params)
986{
Geoff Langebebe1c2016-10-14 12:01:31 -0400987 QueryBufferParameterBase(buffer, pname, params);
988}
Geoff Langff5b2d52016-09-07 11:32:23 -0400989
Geoff Langebebe1c2016-10-14 12:01:31 -0400990void QueryBufferParameteri64v(const Buffer *buffer, GLenum pname, GLint64 *params)
991{
992 QueryBufferParameterBase(buffer, pname, params);
Geoff Langff5b2d52016-09-07 11:32:23 -0400993}
994
Geoff Lang496c02d2016-10-20 11:38:11 -0700995void QueryBufferPointerv(const Buffer *buffer, GLenum pname, void **params)
996{
997 switch (pname)
998 {
999 case GL_BUFFER_MAP_POINTER:
1000 *params = buffer->getMapPointer();
1001 break;
1002
1003 default:
1004 UNREACHABLE();
1005 break;
1006 }
1007}
1008
Jamie Madillffe00c02017-06-27 16:26:55 -04001009void QueryProgramiv(const Context *context, const Program *program, GLenum pname, GLint *params)
Geoff Langff5b2d52016-09-07 11:32:23 -04001010{
1011 ASSERT(program != nullptr);
1012
1013 switch (pname)
1014 {
1015 case GL_DELETE_STATUS:
1016 *params = program->isFlaggedForDeletion();
1017 return;
1018 case GL_LINK_STATUS:
1019 *params = program->isLinked();
1020 return;
jchen107ae70d82018-07-06 13:47:01 +08001021 case GL_COMPLETION_STATUS_KHR:
1022 *params = program->isLinking() ? GL_FALSE : GL_TRUE;
1023 return;
Geoff Langff5b2d52016-09-07 11:32:23 -04001024 case GL_VALIDATE_STATUS:
1025 *params = program->isValidated();
1026 return;
1027 case GL_INFO_LOG_LENGTH:
1028 *params = program->getInfoLogLength();
1029 return;
1030 case GL_ATTACHED_SHADERS:
1031 *params = program->getAttachedShadersCount();
1032 return;
1033 case GL_ACTIVE_ATTRIBUTES:
1034 *params = program->getActiveAttributeCount();
1035 return;
1036 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
1037 *params = program->getActiveAttributeMaxLength();
1038 return;
1039 case GL_ACTIVE_UNIFORMS:
1040 *params = program->getActiveUniformCount();
1041 return;
1042 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
1043 *params = program->getActiveUniformMaxLength();
1044 return;
1045 case GL_PROGRAM_BINARY_LENGTH_OES:
Shahbaz Youssefic14ab2a2018-08-24 13:57:55 -04001046 *params = context->getCaps().programBinaryFormats.empty()
1047 ? 0
1048 : program->getBinaryLength(context);
Geoff Langff5b2d52016-09-07 11:32:23 -04001049 return;
1050 case GL_ACTIVE_UNIFORM_BLOCKS:
1051 *params = program->getActiveUniformBlockCount();
1052 return;
1053 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
Qin Jiajia9bf55522018-01-29 13:56:23 +08001054 *params = program->getActiveUniformBlockMaxNameLength();
Geoff Langff5b2d52016-09-07 11:32:23 -04001055 break;
1056 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
1057 *params = program->getTransformFeedbackBufferMode();
1058 break;
1059 case GL_TRANSFORM_FEEDBACK_VARYINGS:
jchen10910a3da2017-11-15 09:40:11 +08001060 *params = clampCast<GLint>(program->getTransformFeedbackVaryingCount());
Geoff Langff5b2d52016-09-07 11:32:23 -04001061 break;
1062 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
1063 *params = program->getTransformFeedbackVaryingMaxLength();
1064 break;
1065 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
1066 *params = program->getBinaryRetrievableHint();
1067 break;
Yunchao He61afff12017-03-14 15:34:03 +08001068 case GL_PROGRAM_SEPARABLE:
1069 *params = program->isSeparable();
1070 break;
Xinghua Cao971f8502017-10-17 13:01:24 +08001071 case GL_COMPUTE_WORK_GROUP_SIZE:
1072 {
1073 const sh::WorkGroupSize &localSize = program->getComputeShaderLocalSize();
1074 params[0] = localSize[0];
1075 params[1] = localSize[1];
1076 params[2] = localSize[2];
1077 }
1078 break;
jchen1058f67be2017-10-27 08:59:27 +08001079 case GL_ACTIVE_ATOMIC_COUNTER_BUFFERS:
1080 *params = program->getActiveAtomicCounterBufferCount();
1081 break;
Jiawei Shao447bfac2018-03-14 14:23:40 +08001082 case GL_GEOMETRY_LINKED_INPUT_TYPE_EXT:
Jamie Madill493f9572018-05-24 19:52:15 -04001083 *params = ToGLenum(program->getGeometryShaderInputPrimitiveType());
Jiawei Shao447bfac2018-03-14 14:23:40 +08001084 break;
1085 case GL_GEOMETRY_LINKED_OUTPUT_TYPE_EXT:
Jamie Madill493f9572018-05-24 19:52:15 -04001086 *params = ToGLenum(program->getGeometryShaderOutputPrimitiveType());
Jiawei Shao447bfac2018-03-14 14:23:40 +08001087 break;
1088 case GL_GEOMETRY_LINKED_VERTICES_OUT_EXT:
1089 *params = program->getGeometryShaderMaxVertices();
1090 break;
1091 case GL_GEOMETRY_SHADER_INVOCATIONS_EXT:
1092 *params = program->getGeometryShaderInvocations();
1093 break;
Geoff Langff5b2d52016-09-07 11:32:23 -04001094 default:
1095 UNREACHABLE();
1096 break;
1097 }
1098}
Geoff Lang740d9022016-10-07 11:20:52 -04001099
Jamie Madill4e0e6f82017-02-17 11:06:03 -05001100void QueryRenderbufferiv(const Context *context,
1101 const Renderbuffer *renderbuffer,
1102 GLenum pname,
1103 GLint *params)
Geoff Lang740d9022016-10-07 11:20:52 -04001104{
1105 ASSERT(renderbuffer != nullptr);
1106
1107 switch (pname)
1108 {
1109 case GL_RENDERBUFFER_WIDTH:
1110 *params = renderbuffer->getWidth();
1111 break;
1112 case GL_RENDERBUFFER_HEIGHT:
1113 *params = renderbuffer->getHeight();
1114 break;
1115 case GL_RENDERBUFFER_INTERNAL_FORMAT:
Jamie Madill4e0e6f82017-02-17 11:06:03 -05001116 // Special case the WebGL 1 DEPTH_STENCIL format.
Jamie Madilla02315b2017-02-23 14:14:47 -05001117 if (context->isWebGL1() &&
Jamie Madill4e0e6f82017-02-17 11:06:03 -05001118 renderbuffer->getFormat().info->internalFormat == GL_DEPTH24_STENCIL8)
1119 {
1120 *params = GL_DEPTH_STENCIL;
1121 }
1122 else
1123 {
1124 *params = renderbuffer->getFormat().info->internalFormat;
1125 }
Geoff Lang740d9022016-10-07 11:20:52 -04001126 break;
1127 case GL_RENDERBUFFER_RED_SIZE:
1128 *params = renderbuffer->getRedSize();
1129 break;
1130 case GL_RENDERBUFFER_GREEN_SIZE:
1131 *params = renderbuffer->getGreenSize();
1132 break;
1133 case GL_RENDERBUFFER_BLUE_SIZE:
1134 *params = renderbuffer->getBlueSize();
1135 break;
1136 case GL_RENDERBUFFER_ALPHA_SIZE:
1137 *params = renderbuffer->getAlphaSize();
1138 break;
1139 case GL_RENDERBUFFER_DEPTH_SIZE:
1140 *params = renderbuffer->getDepthSize();
1141 break;
1142 case GL_RENDERBUFFER_STENCIL_SIZE:
1143 *params = renderbuffer->getStencilSize();
1144 break;
1145 case GL_RENDERBUFFER_SAMPLES_ANGLE:
1146 *params = renderbuffer->getSamples();
1147 break;
1148 default:
1149 UNREACHABLE();
1150 break;
1151 }
1152}
Geoff Langd7d0ed32016-10-07 11:33:51 -04001153
jchen103fd614d2018-08-13 12:21:58 +08001154void QueryShaderiv(Shader *shader, GLenum pname, GLint *params)
Geoff Langd7d0ed32016-10-07 11:33:51 -04001155{
1156 ASSERT(shader != nullptr);
1157
1158 switch (pname)
1159 {
1160 case GL_SHADER_TYPE:
Jiawei Shao385b3e02018-03-21 09:43:28 +08001161 *params = static_cast<GLint>(ToGLenum(shader->getType()));
Geoff Langd7d0ed32016-10-07 11:33:51 -04001162 return;
1163 case GL_DELETE_STATUS:
1164 *params = shader->isFlaggedForDeletion();
1165 return;
1166 case GL_COMPILE_STATUS:
jchen103fd614d2018-08-13 12:21:58 +08001167 *params = shader->isCompiled() ? GL_TRUE : GL_FALSE;
Geoff Langd7d0ed32016-10-07 11:33:51 -04001168 return;
jchen107ae70d82018-07-06 13:47:01 +08001169 case GL_COMPLETION_STATUS_KHR:
1170 // TODO(jie.a.chen@intel.com): Parallelize shader compilation.
1171 // http://crbug.com/849576
jchen103fd614d2018-08-13 12:21:58 +08001172 *params = shader->isCompiled() ? GL_TRUE : GL_FALSE;
jchen107ae70d82018-07-06 13:47:01 +08001173 return;
Geoff Langd7d0ed32016-10-07 11:33:51 -04001174 case GL_INFO_LOG_LENGTH:
jchen103fd614d2018-08-13 12:21:58 +08001175 *params = shader->getInfoLogLength();
Geoff Langd7d0ed32016-10-07 11:33:51 -04001176 return;
1177 case GL_SHADER_SOURCE_LENGTH:
1178 *params = shader->getSourceLength();
1179 return;
1180 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
jchen103fd614d2018-08-13 12:21:58 +08001181 *params = shader->getTranslatedSourceWithDebugInfoLength();
Geoff Langd7d0ed32016-10-07 11:33:51 -04001182 return;
1183 default:
1184 UNREACHABLE();
1185 break;
1186 }
1187}
Geoff Langc1984ed2016-10-07 12:41:00 -04001188
He Yunchao11b038b2016-11-22 21:24:04 +08001189void QueryTexLevelParameterfv(const Texture *texture,
Corentin Wallez99d492c2018-02-27 15:17:10 -05001190 TextureTarget target,
He Yunchao11b038b2016-11-22 21:24:04 +08001191 GLint level,
1192 GLenum pname,
1193 GLfloat *params)
1194{
1195 QueryTexLevelParameterBase(texture, target, level, pname, params);
1196}
1197
1198void QueryTexLevelParameteriv(const Texture *texture,
Corentin Wallez99d492c2018-02-27 15:17:10 -05001199 TextureTarget target,
He Yunchao11b038b2016-11-22 21:24:04 +08001200 GLint level,
1201 GLenum pname,
1202 GLint *params)
1203{
1204 QueryTexLevelParameterBase(texture, target, level, pname, params);
1205}
1206
Geoff Langc1984ed2016-10-07 12:41:00 -04001207void QueryTexParameterfv(const Texture *texture, GLenum pname, GLfloat *params)
1208{
1209 QueryTexParameterBase(texture, pname, params);
1210}
1211
1212void QueryTexParameteriv(const Texture *texture, GLenum pname, GLint *params)
1213{
1214 QueryTexParameterBase(texture, pname, params);
1215}
1216
1217void QuerySamplerParameterfv(const Sampler *sampler, GLenum pname, GLfloat *params)
1218{
1219 QuerySamplerParameterBase(sampler, pname, params);
1220}
1221
1222void QuerySamplerParameteriv(const Sampler *sampler, GLenum pname, GLint *params)
1223{
1224 QuerySamplerParameterBase(sampler, pname, params);
1225}
1226
Geoff Lang0b031062016-10-13 14:30:04 -04001227void QueryVertexAttribfv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001228 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001229 const VertexAttribCurrentValueData &currentValueData,
1230 GLenum pname,
1231 GLfloat *params)
1232{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001233 QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001234}
1235
1236void QueryVertexAttribiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001237 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001238 const VertexAttribCurrentValueData &currentValueData,
1239 GLenum pname,
1240 GLint *params)
1241{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001242 QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001243}
1244
Jamie Madill876429b2017-04-20 15:46:24 -04001245void QueryVertexAttribPointerv(const VertexAttribute &attrib, GLenum pname, void **pointer)
Geoff Lang0b031062016-10-13 14:30:04 -04001246{
1247 switch (pname)
1248 {
1249 case GL_VERTEX_ATTRIB_ARRAY_POINTER:
Jamie Madill876429b2017-04-20 15:46:24 -04001250 *pointer = const_cast<void *>(attrib.pointer);
Geoff Lang0b031062016-10-13 14:30:04 -04001251 break;
1252
1253 default:
1254 UNREACHABLE();
1255 break;
1256 }
1257}
1258
1259void QueryVertexAttribIiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001260 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001261 const VertexAttribCurrentValueData &currentValueData,
1262 GLenum pname,
1263 GLint *params)
1264{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001265 QueryVertexAttribBase(attrib, binding, currentValueData.IntValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001266}
1267
1268void QueryVertexAttribIuiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001269 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001270 const VertexAttribCurrentValueData &currentValueData,
1271 GLenum pname,
1272 GLuint *params)
1273{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001274 QueryVertexAttribBase(attrib, binding, currentValueData.UnsignedIntValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001275}
1276
Geoff Lang6899b872016-10-14 11:30:13 -04001277void QueryActiveUniformBlockiv(const Program *program,
1278 GLuint uniformBlockIndex,
1279 GLenum pname,
1280 GLint *params)
1281{
jchen1058f67be2017-10-27 08:59:27 +08001282 GLenum prop = GetUniformBlockPropertyEnum(pname);
1283 QueryProgramResourceiv(program, GL_UNIFORM_BLOCK, uniformBlockIndex, 1, &prop,
1284 std::numeric_limits<GLsizei>::max(), nullptr, params);
Geoff Lang6899b872016-10-14 11:30:13 -04001285}
1286
Geoff Lang0a9661f2016-10-20 10:59:20 -07001287void QueryInternalFormativ(const TextureCaps &format, GLenum pname, GLsizei bufSize, GLint *params)
1288{
1289 switch (pname)
1290 {
1291 case GL_NUM_SAMPLE_COUNTS:
1292 if (bufSize != 0)
1293 {
jchen10a99ed552017-09-22 08:10:32 +08001294 *params = clampCast<GLint>(format.sampleCounts.size());
Geoff Lang0a9661f2016-10-20 10:59:20 -07001295 }
1296 break;
1297
1298 case GL_SAMPLES:
1299 {
1300 size_t returnCount = std::min<size_t>(bufSize, format.sampleCounts.size());
1301 auto sampleReverseIt = format.sampleCounts.rbegin();
1302 for (size_t sampleIndex = 0; sampleIndex < returnCount; ++sampleIndex)
1303 {
1304 params[sampleIndex] = *sampleReverseIt++;
1305 }
1306 }
1307 break;
1308
1309 default:
1310 UNREACHABLE();
1311 break;
1312 }
1313}
1314
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001315void QueryFramebufferParameteriv(const Framebuffer *framebuffer, GLenum pname, GLint *params)
1316{
1317 ASSERT(framebuffer);
1318
1319 switch (pname)
1320 {
1321 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
1322 *params = framebuffer->getDefaultWidth();
1323 break;
1324 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
1325 *params = framebuffer->getDefaultHeight();
1326 break;
1327 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
1328 *params = framebuffer->getDefaultSamples();
1329 break;
1330 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
Geoff Lang92019432017-11-20 13:09:34 -05001331 *params = ConvertToGLBoolean(framebuffer->getDefaultFixedSampleLocations());
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001332 break;
Jiawei Shaob1e91382018-05-17 14:33:55 +08001333 case GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT:
1334 *params = framebuffer->getDefaultLayers();
1335 break;
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001336 default:
1337 UNREACHABLE();
1338 break;
1339 }
1340}
1341
Jamie Madilla0691b72018-07-25 10:41:22 -04001342Error QuerySynciv(const Context *context,
1343 const Sync *sync,
1344 GLenum pname,
1345 GLsizei bufSize,
1346 GLsizei *length,
1347 GLint *values)
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001348{
1349 ASSERT(sync);
1350
Geoff Lang82483b92017-04-11 15:33:00 -04001351 // All queries return one value, exit early if the buffer can't fit anything.
1352 if (bufSize < 1)
1353 {
1354 if (length != nullptr)
1355 {
1356 *length = 0;
1357 }
1358 return NoError();
1359 }
1360
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001361 switch (pname)
1362 {
1363 case GL_OBJECT_TYPE:
jchen10a99ed552017-09-22 08:10:32 +08001364 *values = clampCast<GLint>(GL_SYNC_FENCE);
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001365 break;
1366 case GL_SYNC_CONDITION:
jchen10a99ed552017-09-22 08:10:32 +08001367 *values = clampCast<GLint>(sync->getCondition());
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001368 break;
1369 case GL_SYNC_FLAGS:
jchen10a99ed552017-09-22 08:10:32 +08001370 *values = clampCast<GLint>(sync->getFlags());
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001371 break;
1372 case GL_SYNC_STATUS:
Jamie Madilla0691b72018-07-25 10:41:22 -04001373 ANGLE_TRY(sync->getStatus(context, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001374 break;
1375
1376 default:
1377 UNREACHABLE();
1378 break;
1379 }
1380
Geoff Lang82483b92017-04-11 15:33:00 -04001381 if (length != nullptr)
1382 {
1383 *length = 1;
1384 }
1385
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001386 return NoError();
1387}
1388
Jamie Madill4928b7c2017-06-20 12:57:39 -04001389void SetTexParameterf(Context *context, Texture *texture, GLenum pname, GLfloat param)
Geoff Langc1984ed2016-10-07 12:41:00 -04001390{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001391 SetTexParameterBase(context, texture, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -04001392}
1393
Jamie Madill4928b7c2017-06-20 12:57:39 -04001394void SetTexParameterfv(Context *context, Texture *texture, GLenum pname, const GLfloat *params)
Geoff Langc1984ed2016-10-07 12:41:00 -04001395{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001396 SetTexParameterBase(context, texture, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001397}
1398
Jamie Madill4928b7c2017-06-20 12:57:39 -04001399void SetTexParameteri(Context *context, Texture *texture, GLenum pname, GLint param)
Geoff Langc1984ed2016-10-07 12:41:00 -04001400{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001401 SetTexParameterBase(context, texture, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -04001402}
1403
Jamie Madill4928b7c2017-06-20 12:57:39 -04001404void SetTexParameteriv(Context *context, Texture *texture, GLenum pname, const GLint *params)
Geoff Langc1984ed2016-10-07 12:41:00 -04001405{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001406 SetTexParameterBase(context, texture, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001407}
1408
1409void SetSamplerParameterf(Sampler *sampler, GLenum pname, GLfloat param)
1410{
1411 SetSamplerParameterBase(sampler, pname, &param);
1412}
1413
1414void SetSamplerParameterfv(Sampler *sampler, GLenum pname, const GLfloat *params)
1415{
1416 SetSamplerParameterBase(sampler, pname, params);
1417}
1418
1419void SetSamplerParameteri(Sampler *sampler, GLenum pname, GLint param)
1420{
1421 SetSamplerParameterBase(sampler, pname, &param);
1422}
1423
1424void SetSamplerParameteriv(Sampler *sampler, GLenum pname, const GLint *params)
1425{
1426 SetSamplerParameterBase(sampler, pname, params);
1427}
Geoff Lang65603eb2017-01-12 16:48:03 -05001428
Jamie Madillb983a4b2018-08-01 11:34:51 -04001429void SetFramebufferParameteri(const Context *context,
1430 Framebuffer *framebuffer,
1431 GLenum pname,
1432 GLint param)
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001433{
1434 ASSERT(framebuffer);
1435
1436 switch (pname)
1437 {
1438 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
Jamie Madillb983a4b2018-08-01 11:34:51 -04001439 framebuffer->setDefaultWidth(context, param);
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001440 break;
1441 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
Jamie Madillb983a4b2018-08-01 11:34:51 -04001442 framebuffer->setDefaultHeight(context, param);
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001443 break;
1444 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
Jamie Madillb983a4b2018-08-01 11:34:51 -04001445 framebuffer->setDefaultSamples(context, param);
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001446 break;
1447 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
Jamie Madillb983a4b2018-08-01 11:34:51 -04001448 framebuffer->setDefaultFixedSampleLocations(context, ConvertToBool(param));
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001449 break;
Jiawei Shaob1e91382018-05-17 14:33:55 +08001450 case GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT:
1451 framebuffer->setDefaultLayers(param);
1452 break;
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001453 default:
1454 UNREACHABLE();
1455 break;
1456 }
1457}
1458
Yunchao He61afff12017-03-14 15:34:03 +08001459void SetProgramParameteri(Program *program, GLenum pname, GLint value)
1460{
1461 ASSERT(program);
1462
1463 switch (pname)
1464 {
1465 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
Geoff Lang92019432017-11-20 13:09:34 -05001466 program->setBinaryRetrievableHint(ConvertToBool(value));
Yunchao He61afff12017-03-14 15:34:03 +08001467 break;
1468 case GL_PROGRAM_SEPARABLE:
Geoff Lang92019432017-11-20 13:09:34 -05001469 program->setSeparable(ConvertToBool(value));
Yunchao He61afff12017-03-14 15:34:03 +08001470 break;
1471 default:
1472 UNREACHABLE();
1473 break;
1474 }
1475}
1476
jchen10baf5d942017-08-28 20:45:48 +08001477GLint GetUniformResourceProperty(const Program *program, GLuint index, const GLenum prop)
1478{
1479 const auto &uniform = program->getUniformByIndex(index);
1480 GLenum resourceProp = GetUniformPropertyEnum(prop);
1481 switch (resourceProp)
1482 {
1483 case GL_TYPE:
1484 case GL_ARRAY_SIZE:
1485 case GL_NAME_LENGTH:
Olli Etuaho465835d2017-09-26 13:34:10 +03001486 return GetCommonVariableProperty(uniform, resourceProp);
jchen10baf5d942017-08-28 20:45:48 +08001487
1488 case GL_LOCATION:
1489 return program->getUniformLocation(uniform.name);
1490
1491 case GL_BLOCK_INDEX:
1492 return (uniform.isAtomicCounter() ? -1 : uniform.bufferIndex);
1493
1494 case GL_OFFSET:
1495 return uniform.blockInfo.offset;
1496
1497 case GL_ARRAY_STRIDE:
1498 return uniform.blockInfo.arrayStride;
1499
1500 case GL_MATRIX_STRIDE:
1501 return uniform.blockInfo.matrixStride;
1502
1503 case GL_IS_ROW_MAJOR:
1504 return static_cast<GLint>(uniform.blockInfo.isRowMajorMatrix);
1505
1506 case GL_REFERENCED_BY_VERTEX_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001507 return uniform.isActive(ShaderType::Vertex);
jchen10baf5d942017-08-28 20:45:48 +08001508
1509 case GL_REFERENCED_BY_FRAGMENT_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001510 return uniform.isActive(ShaderType::Fragment);
jchen10baf5d942017-08-28 20:45:48 +08001511
1512 case GL_REFERENCED_BY_COMPUTE_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001513 return uniform.isActive(ShaderType::Compute);
jchen10baf5d942017-08-28 20:45:48 +08001514
Jiawei Shaoc6f82872018-04-24 14:14:50 +08001515 case GL_REFERENCED_BY_GEOMETRY_SHADER_EXT:
1516 return uniform.isActive(ShaderType::Geometry);
1517
jchen10baf5d942017-08-28 20:45:48 +08001518 case GL_ATOMIC_COUNTER_BUFFER_INDEX:
1519 return (uniform.isAtomicCounter() ? uniform.bufferIndex : -1);
1520
1521 default:
1522 UNREACHABLE();
1523 return 0;
1524 }
1525}
1526
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001527GLint GetBufferVariableResourceProperty(const Program *program, GLuint index, const GLenum prop)
1528{
1529 const auto &bufferVariable = program->getBufferVariableByIndex(index);
1530 switch (prop)
1531 {
1532 case GL_TYPE:
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001533 case GL_ARRAY_SIZE:
Olli Etuaho465835d2017-09-26 13:34:10 +03001534 case GL_NAME_LENGTH:
1535 return GetCommonVariableProperty(bufferVariable, prop);
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001536
1537 case GL_BLOCK_INDEX:
1538 return bufferVariable.bufferIndex;
1539
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001540 case GL_OFFSET:
1541 return bufferVariable.blockInfo.offset;
1542
1543 case GL_ARRAY_STRIDE:
1544 return bufferVariable.blockInfo.arrayStride;
1545
1546 case GL_MATRIX_STRIDE:
1547 return bufferVariable.blockInfo.matrixStride;
1548
1549 case GL_IS_ROW_MAJOR:
1550 return static_cast<GLint>(bufferVariable.blockInfo.isRowMajorMatrix);
1551
1552 case GL_REFERENCED_BY_VERTEX_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001553 return bufferVariable.isActive(ShaderType::Vertex);
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001554
1555 case GL_REFERENCED_BY_FRAGMENT_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001556 return bufferVariable.isActive(ShaderType::Fragment);
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001557
1558 case GL_REFERENCED_BY_COMPUTE_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001559 return bufferVariable.isActive(ShaderType::Compute);
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001560
Jiawei Shaoc6f82872018-04-24 14:14:50 +08001561 case GL_REFERENCED_BY_GEOMETRY_SHADER_EXT:
1562 return bufferVariable.isActive(ShaderType::Geometry);
1563
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001564 case GL_TOP_LEVEL_ARRAY_SIZE:
1565 return bufferVariable.topLevelArraySize;
1566
1567 case GL_TOP_LEVEL_ARRAY_STRIDE:
1568 return bufferVariable.blockInfo.topLevelArrayStride;
1569
1570 default:
1571 UNREACHABLE();
1572 return 0;
1573 }
1574}
1575
jchen1015015f72017-03-16 13:54:21 +08001576GLuint QueryProgramResourceIndex(const Program *program,
1577 GLenum programInterface,
1578 const GLchar *name)
1579{
1580 switch (programInterface)
1581 {
1582 case GL_PROGRAM_INPUT:
1583 return program->getInputResourceIndex(name);
1584
1585 case GL_PROGRAM_OUTPUT:
1586 return program->getOutputResourceIndex(name);
1587
jchen1015015f72017-03-16 13:54:21 +08001588 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001589 return program->getState().getUniformIndexFromName(name);
1590
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001591 case GL_BUFFER_VARIABLE:
1592 return program->getState().getBufferVariableIndexFromName(name);
1593
1594 case GL_SHADER_STORAGE_BLOCK:
1595 return program->getShaderStorageBlockIndex(name);
1596
jchen1015015f72017-03-16 13:54:21 +08001597 case GL_UNIFORM_BLOCK:
jchen1058f67be2017-10-27 08:59:27 +08001598 return program->getUniformBlockIndex(name);
1599
jchen1015015f72017-03-16 13:54:21 +08001600 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10910a3da2017-11-15 09:40:11 +08001601 return program->getTransformFeedbackVaryingResourceIndex(name);
jchen1015015f72017-03-16 13:54:21 +08001602
1603 default:
1604 UNREACHABLE();
1605 return GL_INVALID_INDEX;
1606 }
1607}
1608
jchen10fd7c3b52017-03-21 15:36:03 +08001609void QueryProgramResourceName(const Program *program,
1610 GLenum programInterface,
1611 GLuint index,
1612 GLsizei bufSize,
1613 GLsizei *length,
1614 GLchar *name)
1615{
1616 switch (programInterface)
1617 {
1618 case GL_PROGRAM_INPUT:
1619 program->getInputResourceName(index, bufSize, length, name);
1620 break;
1621
1622 case GL_PROGRAM_OUTPUT:
1623 program->getOutputResourceName(index, bufSize, length, name);
1624 break;
1625
jchen10fd7c3b52017-03-21 15:36:03 +08001626 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001627 program->getUniformResourceName(index, bufSize, length, name);
1628 break;
1629
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001630 case GL_BUFFER_VARIABLE:
1631 program->getBufferVariableResourceName(index, bufSize, length, name);
1632 break;
1633
1634 case GL_SHADER_STORAGE_BLOCK:
1635 program->getActiveShaderStorageBlockName(index, bufSize, length, name);
1636 break;
1637
jchen10fd7c3b52017-03-21 15:36:03 +08001638 case GL_UNIFORM_BLOCK:
jchen1058f67be2017-10-27 08:59:27 +08001639 program->getActiveUniformBlockName(index, bufSize, length, name);
1640 break;
1641
jchen10fd7c3b52017-03-21 15:36:03 +08001642 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10910a3da2017-11-15 09:40:11 +08001643 program->getTransformFeedbackVarying(index, bufSize, length, nullptr, nullptr, name);
jchen10fd7c3b52017-03-21 15:36:03 +08001644 break;
1645
1646 default:
1647 UNREACHABLE();
1648 }
1649}
1650
jchen10191381f2017-04-11 13:59:04 +08001651GLint QueryProgramResourceLocation(const Program *program,
1652 GLenum programInterface,
1653 const GLchar *name)
1654{
1655 switch (programInterface)
1656 {
1657 case GL_PROGRAM_INPUT:
1658 return program->getAttributeLocation(name);
1659
1660 case GL_PROGRAM_OUTPUT:
1661 return program->getFragDataLocation(name);
1662
jchen10191381f2017-04-11 13:59:04 +08001663 case GL_UNIFORM:
Olli Etuahod2551232017-10-26 20:03:33 +03001664 return program->getUniformLocation(name);
jchen10baf5d942017-08-28 20:45:48 +08001665
jchen10191381f2017-04-11 13:59:04 +08001666 default:
1667 UNREACHABLE();
1668 return -1;
1669 }
1670}
1671
jchen10880683b2017-04-12 16:21:55 +08001672void QueryProgramResourceiv(const Program *program,
1673 GLenum programInterface,
1674 GLuint index,
1675 GLsizei propCount,
1676 const GLenum *props,
1677 GLsizei bufSize,
1678 GLsizei *length,
1679 GLint *params)
1680{
1681 if (!program->isLinked())
1682 {
1683 if (length != nullptr)
1684 {
1685 *length = 0;
1686 }
1687 return;
1688 }
1689
jchen1058f67be2017-10-27 08:59:27 +08001690 GLsizei pos = 0;
1691 for (GLsizei i = 0; i < propCount; i++)
jchen10880683b2017-04-12 16:21:55 +08001692 {
1693 switch (programInterface)
1694 {
1695 case GL_PROGRAM_INPUT:
1696 params[i] = GetInputResourceProperty(program, index, props[i]);
jchen1058f67be2017-10-27 08:59:27 +08001697 ++pos;
jchen10880683b2017-04-12 16:21:55 +08001698 break;
1699
1700 case GL_PROGRAM_OUTPUT:
1701 params[i] = GetOutputResourceProperty(program, index, props[i]);
jchen1058f67be2017-10-27 08:59:27 +08001702 ++pos;
jchen10880683b2017-04-12 16:21:55 +08001703 break;
1704
jchen10880683b2017-04-12 16:21:55 +08001705 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001706 params[i] = GetUniformResourceProperty(program, index, props[i]);
jchen1058f67be2017-10-27 08:59:27 +08001707 ++pos;
1708 break;
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001709
1710 case GL_BUFFER_VARIABLE:
1711 params[i] = GetBufferVariableResourceProperty(program, index, props[i]);
1712 ++pos;
1713 break;
1714
jchen1058f67be2017-10-27 08:59:27 +08001715 case GL_UNIFORM_BLOCK:
1716 GetUniformBlockResourceProperty(program, index, props[i], params, bufSize, &pos);
jchen10baf5d942017-08-28 20:45:48 +08001717 break;
1718
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001719 case GL_SHADER_STORAGE_BLOCK:
1720 GetShaderStorageBlockResourceProperty(program, index, props[i], params, bufSize,
1721 &pos);
1722 break;
1723
jchen1058f67be2017-10-27 08:59:27 +08001724 case GL_ATOMIC_COUNTER_BUFFER:
1725 GetAtomicCounterBufferResourceProperty(program, index, props[i], params, bufSize,
1726 &pos);
1727 break;
jchen10910a3da2017-11-15 09:40:11 +08001728
jchen10880683b2017-04-12 16:21:55 +08001729 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10910a3da2017-11-15 09:40:11 +08001730 params[i] = GetTransformFeedbackVaryingResourceProperty(program, index, props[i]);
1731 ++pos;
jchen10880683b2017-04-12 16:21:55 +08001732 break;
1733
1734 default:
1735 UNREACHABLE();
1736 params[i] = GL_INVALID_VALUE;
1737 }
jchen1058f67be2017-10-27 08:59:27 +08001738 if (pos == bufSize)
1739 {
1740 // Most properties return one value, but GL_ACTIVE_VARIABLES returns an array of values.
1741 // This checks not to break buffer bounds for such case.
1742 break;
1743 }
1744 }
1745
1746 if (length != nullptr)
1747 {
1748 *length = pos;
jchen10880683b2017-04-12 16:21:55 +08001749 }
1750}
1751
jchen10d9cd7b72017-08-30 15:04:25 +08001752void QueryProgramInterfaceiv(const Program *program,
1753 GLenum programInterface,
1754 GLenum pname,
1755 GLint *params)
1756{
1757 switch (pname)
1758 {
1759 case GL_ACTIVE_RESOURCES:
1760 *params = QueryProgramInterfaceActiveResources(program, programInterface);
1761 break;
1762
1763 case GL_MAX_NAME_LENGTH:
1764 *params = QueryProgramInterfaceMaxNameLength(program, programInterface);
1765 break;
1766
1767 case GL_MAX_NUM_ACTIVE_VARIABLES:
1768 *params = QueryProgramInterfaceMaxNumActiveVariables(program, programInterface);
1769 break;
1770
1771 default:
1772 UNREACHABLE();
1773 }
1774}
1775
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001776ClientVertexArrayType ParamToVertexArrayType(GLenum param)
1777{
1778 switch (param)
1779 {
1780 case GL_VERTEX_ARRAY:
1781 case GL_VERTEX_ARRAY_BUFFER_BINDING:
1782 case GL_VERTEX_ARRAY_STRIDE:
1783 case GL_VERTEX_ARRAY_SIZE:
1784 case GL_VERTEX_ARRAY_TYPE:
1785 case GL_VERTEX_ARRAY_POINTER:
1786 return ClientVertexArrayType::Vertex;
1787 case GL_NORMAL_ARRAY:
1788 case GL_NORMAL_ARRAY_BUFFER_BINDING:
1789 case GL_NORMAL_ARRAY_STRIDE:
1790 case GL_NORMAL_ARRAY_TYPE:
1791 case GL_NORMAL_ARRAY_POINTER:
1792 return ClientVertexArrayType::Normal;
1793 case GL_COLOR_ARRAY:
1794 case GL_COLOR_ARRAY_BUFFER_BINDING:
1795 case GL_COLOR_ARRAY_STRIDE:
1796 case GL_COLOR_ARRAY_SIZE:
1797 case GL_COLOR_ARRAY_TYPE:
1798 case GL_COLOR_ARRAY_POINTER:
1799 return ClientVertexArrayType::Color;
1800 case GL_POINT_SIZE_ARRAY_OES:
1801 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
1802 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
1803 case GL_POINT_SIZE_ARRAY_TYPE_OES:
1804 case GL_POINT_SIZE_ARRAY_POINTER_OES:
1805 return ClientVertexArrayType::PointSize;
1806 case GL_TEXTURE_COORD_ARRAY:
1807 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
1808 case GL_TEXTURE_COORD_ARRAY_STRIDE:
1809 case GL_TEXTURE_COORD_ARRAY_SIZE:
1810 case GL_TEXTURE_COORD_ARRAY_TYPE:
1811 case GL_TEXTURE_COORD_ARRAY_POINTER:
1812 return ClientVertexArrayType::TextureCoord;
1813 default:
1814 UNREACHABLE();
1815 return ClientVertexArrayType::InvalidEnum;
1816 }
1817}
1818
Lingfeng Yangd0febe72018-05-17 22:36:52 -07001819void SetLightModelParameters(GLES1State *state, GLenum pname, const GLfloat *params)
1820{
1821 LightModelParameters &lightModel = state->lightModelParameters();
1822
1823 switch (pname)
1824 {
1825 case GL_LIGHT_MODEL_AMBIENT:
1826 lightModel.color = ColorF::fromData(params);
1827 break;
1828 case GL_LIGHT_MODEL_TWO_SIDE:
1829 lightModel.twoSided = *params == 1.0f ? true : false;
1830 break;
1831 default:
1832 break;
1833 }
1834}
1835
1836void GetLightModelParameters(const GLES1State *state, GLenum pname, GLfloat *params)
1837{
1838 const LightModelParameters &lightModel = state->lightModelParameters();
1839
1840 switch (pname)
1841 {
1842 case GL_LIGHT_MODEL_TWO_SIDE:
1843 *params = lightModel.twoSided ? 1.0f : 0.0f;
1844 break;
1845 case GL_LIGHT_MODEL_AMBIENT:
1846 lightModel.color.writeData(params);
1847 break;
1848 default:
1849 break;
1850 }
1851}
1852
1853bool IsLightModelTwoSided(const GLES1State *state)
1854{
1855 return state->lightModelParameters().twoSided;
1856}
1857
1858void SetLightParameters(GLES1State *state,
1859 GLenum light,
1860 LightParameter pname,
1861 const GLfloat *params)
1862{
1863 uint32_t lightIndex = light - GL_LIGHT0;
1864
1865 LightParameters &lightParams = state->lightParameters(lightIndex);
1866
1867 switch (pname)
1868 {
1869 case LightParameter::Ambient:
1870 lightParams.ambient = ColorF::fromData(params);
1871 break;
1872 case LightParameter::Diffuse:
1873 lightParams.diffuse = ColorF::fromData(params);
1874 break;
1875 case LightParameter::Specular:
1876 lightParams.specular = ColorF::fromData(params);
1877 break;
1878 case LightParameter::Position:
1879 {
1880 angle::Mat4 mv = state->getModelviewMatrix();
1881 angle::Vector4 transformedPos =
1882 mv.product(angle::Vector4(params[0], params[1], params[2], params[3]));
1883 lightParams.position[0] = transformedPos[0];
1884 lightParams.position[1] = transformedPos[1];
1885 lightParams.position[2] = transformedPos[2];
1886 lightParams.position[3] = transformedPos[3];
1887 }
1888 break;
1889 case LightParameter::SpotDirection:
1890 {
1891 angle::Mat4 mv = state->getModelviewMatrix();
1892 angle::Vector4 transformedPos =
1893 mv.product(angle::Vector4(params[0], params[1], params[2], 0.0f));
1894 lightParams.direction[0] = transformedPos[0];
1895 lightParams.direction[1] = transformedPos[1];
1896 lightParams.direction[2] = transformedPos[2];
1897 }
1898 break;
1899 case LightParameter::SpotExponent:
1900 lightParams.spotlightExponent = *params;
1901 break;
1902 case LightParameter::SpotCutoff:
1903 lightParams.spotlightCutoffAngle = *params;
1904 break;
1905 case LightParameter::ConstantAttenuation:
1906 lightParams.attenuationConst = *params;
1907 break;
1908 case LightParameter::LinearAttenuation:
1909 lightParams.attenuationLinear = *params;
1910 break;
1911 case LightParameter::QuadraticAttenuation:
1912 lightParams.attenuationQuadratic = *params;
1913 break;
1914 default:
1915 return;
1916 }
1917}
1918
1919void GetLightParameters(const GLES1State *state,
1920 GLenum light,
1921 LightParameter pname,
1922 GLfloat *params)
1923{
1924 uint32_t lightIndex = light - GL_LIGHT0;
1925 const LightParameters &lightParams = state->lightParameters(lightIndex);
1926
1927 switch (pname)
1928 {
1929 case LightParameter::Ambient:
1930 lightParams.ambient.writeData(params);
1931 break;
1932 case LightParameter::Diffuse:
1933 lightParams.diffuse.writeData(params);
1934 break;
1935 case LightParameter::Specular:
1936 lightParams.specular.writeData(params);
1937 break;
1938 case LightParameter::Position:
1939 memcpy(params, lightParams.position.data(), 4 * sizeof(GLfloat));
1940 break;
1941 case LightParameter::SpotDirection:
1942 memcpy(params, lightParams.direction.data(), 3 * sizeof(GLfloat));
1943 break;
1944 case LightParameter::SpotExponent:
1945 *params = lightParams.spotlightExponent;
1946 break;
1947 case LightParameter::SpotCutoff:
1948 *params = lightParams.spotlightCutoffAngle;
1949 break;
1950 case LightParameter::ConstantAttenuation:
1951 *params = lightParams.attenuationConst;
1952 break;
1953 case LightParameter::LinearAttenuation:
1954 *params = lightParams.attenuationLinear;
1955 break;
1956 case LightParameter::QuadraticAttenuation:
1957 *params = lightParams.attenuationQuadratic;
1958 break;
1959 default:
1960 break;
1961 }
1962}
1963
1964void SetMaterialParameters(GLES1State *state,
1965 GLenum face,
1966 MaterialParameter pname,
1967 const GLfloat *params)
1968{
1969 MaterialParameters &material = state->materialParameters();
1970 switch (pname)
1971 {
1972 case MaterialParameter::Ambient:
1973 material.ambient = ColorF::fromData(params);
1974 break;
1975 case MaterialParameter::Diffuse:
1976 material.diffuse = ColorF::fromData(params);
1977 break;
1978 case MaterialParameter::AmbientAndDiffuse:
1979 material.ambient = ColorF::fromData(params);
1980 material.diffuse = ColorF::fromData(params);
1981 break;
1982 case MaterialParameter::Specular:
1983 material.specular = ColorF::fromData(params);
1984 break;
1985 case MaterialParameter::Emission:
1986 material.emissive = ColorF::fromData(params);
1987 break;
1988 case MaterialParameter::Shininess:
1989 material.specularExponent = *params;
1990 break;
1991 default:
1992 return;
1993 }
1994}
1995
1996void GetMaterialParameters(const GLES1State *state,
1997 GLenum face,
1998 MaterialParameter pname,
1999 GLfloat *params)
2000{
2001 const ColorF &currentColor = state->getCurrentColor();
2002 const MaterialParameters &material = state->materialParameters();
2003 const bool colorMaterialEnabled = state->isColorMaterialEnabled();
2004
2005 switch (pname)
2006 {
2007 case MaterialParameter::Ambient:
2008 if (colorMaterialEnabled)
2009 {
2010 currentColor.writeData(params);
2011 }
2012 else
2013 {
2014 material.ambient.writeData(params);
2015 }
2016 break;
2017 case MaterialParameter::Diffuse:
2018 if (colorMaterialEnabled)
2019 {
2020 currentColor.writeData(params);
2021 }
2022 else
2023 {
2024 material.diffuse.writeData(params);
2025 }
2026 break;
2027 case MaterialParameter::Specular:
2028 material.specular.writeData(params);
2029 break;
2030 case MaterialParameter::Emission:
2031 material.emissive.writeData(params);
2032 break;
2033 case MaterialParameter::Shininess:
2034 *params = material.specularExponent;
2035 break;
2036 default:
2037 return;
2038 }
2039}
2040
2041unsigned int GetLightModelParameterCount(GLenum pname)
2042{
2043 switch (pname)
2044 {
2045 case GL_LIGHT_MODEL_AMBIENT:
2046 return 4;
2047 case GL_LIGHT_MODEL_TWO_SIDE:
2048 return 1;
2049 default:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07002050 return 0;
2051 }
2052}
2053
2054unsigned int GetLightParameterCount(LightParameter pname)
2055{
2056 switch (pname)
2057 {
2058 case LightParameter::Ambient:
2059 case LightParameter::Diffuse:
2060 case LightParameter::Specular:
2061 case LightParameter::Position:
2062 return 4;
2063 case LightParameter::SpotDirection:
2064 return 3;
2065 case LightParameter::SpotExponent:
2066 case LightParameter::SpotCutoff:
2067 case LightParameter::ConstantAttenuation:
2068 case LightParameter::LinearAttenuation:
2069 case LightParameter::QuadraticAttenuation:
2070 return 1;
2071 default:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07002072 return 0;
2073 }
2074}
2075
2076unsigned int GetMaterialParameterCount(MaterialParameter pname)
2077{
2078 switch (pname)
2079 {
2080 case MaterialParameter::Ambient:
2081 case MaterialParameter::Diffuse:
2082 case MaterialParameter::Specular:
2083 case MaterialParameter::Emission:
2084 return 4;
2085 case MaterialParameter::Shininess:
2086 return 1;
2087 default:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07002088 return 0;
2089 }
2090}
2091
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07002092void SetFogParameters(GLES1State *state, GLenum pname, const GLfloat *params)
2093{
2094 FogParameters &fog = state->fogParameters();
2095 switch (pname)
2096 {
2097 case GL_FOG_MODE:
2098 fog.mode = FromGLenum<FogMode>(static_cast<GLenum>(params[0]));
2099 break;
2100 case GL_FOG_DENSITY:
2101 fog.density = params[0];
2102 break;
2103 case GL_FOG_START:
2104 fog.start = params[0];
2105 break;
2106 case GL_FOG_END:
2107 fog.end = params[0];
2108 break;
2109 case GL_FOG_COLOR:
2110 fog.color = ColorF::fromData(params);
2111 break;
2112 default:
2113 return;
2114 }
2115}
2116
2117void GetFogParameters(const GLES1State *state, GLenum pname, GLfloat *params)
2118{
2119 const FogParameters &fog = state->fogParameters();
2120 switch (pname)
2121 {
2122 case GL_FOG_MODE:
2123 params[0] = static_cast<GLfloat>(ToGLenum(fog.mode));
2124 break;
2125 case GL_FOG_DENSITY:
2126 params[0] = fog.density;
2127 break;
2128 case GL_FOG_START:
2129 params[0] = fog.start;
2130 break;
2131 case GL_FOG_END:
2132 params[0] = fog.end;
2133 break;
2134 case GL_FOG_COLOR:
2135 fog.color.writeData(params);
2136 break;
2137 default:
2138 return;
2139 }
2140}
2141
2142unsigned int GetFogParameterCount(GLenum pname)
2143{
2144 switch (pname)
2145 {
2146 case GL_FOG_MODE:
2147 case GL_FOG_DENSITY:
2148 case GL_FOG_START:
2149 case GL_FOG_END:
2150 return 1;
2151 case GL_FOG_COLOR:
2152 return 4;
2153 default:
2154 return 0;
2155 }
2156}
2157
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002158unsigned int GetTextureEnvParameterCount(TextureEnvParameter pname)
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07002159{
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002160 switch (pname)
2161 {
2162 case TextureEnvParameter::Mode:
2163 case TextureEnvParameter::CombineRgb:
2164 case TextureEnvParameter::CombineAlpha:
2165 case TextureEnvParameter::Src0Rgb:
2166 case TextureEnvParameter::Src1Rgb:
2167 case TextureEnvParameter::Src2Rgb:
2168 case TextureEnvParameter::Src0Alpha:
2169 case TextureEnvParameter::Src1Alpha:
2170 case TextureEnvParameter::Src2Alpha:
2171 case TextureEnvParameter::Op0Rgb:
2172 case TextureEnvParameter::Op1Rgb:
2173 case TextureEnvParameter::Op2Rgb:
2174 case TextureEnvParameter::Op0Alpha:
2175 case TextureEnvParameter::Op1Alpha:
2176 case TextureEnvParameter::Op2Alpha:
2177 case TextureEnvParameter::RgbScale:
2178 case TextureEnvParameter::AlphaScale:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07002179 case TextureEnvParameter::PointCoordReplace:
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002180 return 1;
2181 case TextureEnvParameter::Color:
2182 return 4;
2183 default:
2184 return 0;
2185 }
2186}
2187
2188void ConvertTextureEnvFromInt(TextureEnvParameter pname, const GLint *input, GLfloat *output)
2189{
2190 if (IsTextureEnvEnumParameter(pname))
2191 {
2192 ConvertGLenumValue(input[0], output);
2193 return;
2194 }
2195
2196 switch (pname)
2197 {
2198 case TextureEnvParameter::RgbScale:
2199 case TextureEnvParameter::AlphaScale:
2200 output[0] = static_cast<GLfloat>(input[0]);
2201 break;
2202 case TextureEnvParameter::Color:
2203 for (int i = 0; i < 4; i++)
2204 {
2205 output[i] = input[i] / 255.0f;
2206 }
2207 break;
2208 default:
2209 UNREACHABLE();
2210 break;
2211 }
2212}
2213
2214void ConvertTextureEnvFromFixed(TextureEnvParameter pname, const GLfixed *input, GLfloat *output)
2215{
2216 if (IsTextureEnvEnumParameter(pname))
2217 {
2218 ConvertGLenumValue(input[0], output);
2219 return;
2220 }
2221
2222 switch (pname)
2223 {
2224 case TextureEnvParameter::RgbScale:
2225 case TextureEnvParameter::AlphaScale:
2226 output[0] = FixedToFloat(input[0]);
2227 break;
2228 case TextureEnvParameter::Color:
2229 for (int i = 0; i < 4; i++)
2230 {
2231 output[i] = FixedToFloat(input[i]);
2232 }
2233 break;
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002234 default:
2235 UNREACHABLE();
2236 break;
2237 }
2238}
2239
2240void ConvertTextureEnvToInt(TextureEnvParameter pname, const GLfloat *input, GLint *output)
2241{
2242 if (IsTextureEnvEnumParameter(pname))
2243 {
2244 ConvertGLenumValue(input[0], output);
2245 return;
2246 }
2247
2248 switch (pname)
2249 {
2250 case TextureEnvParameter::RgbScale:
2251 case TextureEnvParameter::AlphaScale:
2252 output[0] = static_cast<GLint>(input[0]);
2253 break;
2254 case TextureEnvParameter::Color:
2255 for (int i = 0; i < 4; i++)
2256 {
2257 output[i] = static_cast<GLint>(input[i] * 255.0f);
2258 }
2259 break;
2260 default:
2261 UNREACHABLE();
2262 break;
2263 }
2264}
2265
2266void ConvertTextureEnvToFixed(TextureEnvParameter pname, const GLfloat *input, GLfixed *output)
2267{
2268 if (IsTextureEnvEnumParameter(pname))
2269 {
2270 ConvertGLenumValue(input[0], output);
2271 return;
2272 }
2273
2274 switch (pname)
2275 {
2276 case TextureEnvParameter::RgbScale:
2277 case TextureEnvParameter::AlphaScale:
2278 output[0] = FloatToFixed(input[0]);
2279 break;
2280 case TextureEnvParameter::Color:
2281 for (int i = 0; i < 4; i++)
2282 {
2283 output[i] = FloatToFixed(input[i]);
2284 }
2285 break;
2286 default:
2287 UNREACHABLE();
2288 break;
2289 }
2290}
2291
2292void SetTextureEnv(unsigned int unit,
2293 GLES1State *state,
2294 TextureEnvTarget target,
2295 TextureEnvParameter pname,
2296 const GLfloat *params)
2297{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002298 TextureEnvironmentParameters &env = state->textureEnvironment(unit);
2299 GLenum asEnum = ConvertToGLenum(params[0]);
2300
2301 switch (target)
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002302 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002303 case TextureEnvTarget::Env:
2304 switch (pname)
2305 {
2306 case TextureEnvParameter::Mode:
2307 env.mode = FromGLenum<TextureEnvMode>(asEnum);
2308 break;
2309 case TextureEnvParameter::CombineRgb:
2310 env.combineRgb = FromGLenum<TextureCombine>(asEnum);
2311 break;
2312 case TextureEnvParameter::CombineAlpha:
2313 env.combineAlpha = FromGLenum<TextureCombine>(asEnum);
2314 break;
2315 case TextureEnvParameter::Src0Rgb:
2316 env.src0Rgb = FromGLenum<TextureSrc>(asEnum);
2317 break;
2318 case TextureEnvParameter::Src1Rgb:
2319 env.src1Rgb = FromGLenum<TextureSrc>(asEnum);
2320 break;
2321 case TextureEnvParameter::Src2Rgb:
2322 env.src2Rgb = FromGLenum<TextureSrc>(asEnum);
2323 break;
2324 case TextureEnvParameter::Src0Alpha:
2325 env.src0Alpha = FromGLenum<TextureSrc>(asEnum);
2326 break;
2327 case TextureEnvParameter::Src1Alpha:
2328 env.src1Alpha = FromGLenum<TextureSrc>(asEnum);
2329 break;
2330 case TextureEnvParameter::Src2Alpha:
2331 env.src2Alpha = FromGLenum<TextureSrc>(asEnum);
2332 break;
2333 case TextureEnvParameter::Op0Rgb:
2334 env.op0Rgb = FromGLenum<TextureOp>(asEnum);
2335 break;
2336 case TextureEnvParameter::Op1Rgb:
2337 env.op1Rgb = FromGLenum<TextureOp>(asEnum);
2338 break;
2339 case TextureEnvParameter::Op2Rgb:
2340 env.op2Rgb = FromGLenum<TextureOp>(asEnum);
2341 break;
2342 case TextureEnvParameter::Op0Alpha:
2343 env.op0Alpha = FromGLenum<TextureOp>(asEnum);
2344 break;
2345 case TextureEnvParameter::Op1Alpha:
2346 env.op1Alpha = FromGLenum<TextureOp>(asEnum);
2347 break;
2348 case TextureEnvParameter::Op2Alpha:
2349 env.op2Alpha = FromGLenum<TextureOp>(asEnum);
2350 break;
2351 case TextureEnvParameter::Color:
2352 env.color = ColorF::fromData(params);
2353 break;
2354 case TextureEnvParameter::RgbScale:
2355 env.rgbScale = params[0];
2356 break;
2357 case TextureEnvParameter::AlphaScale:
2358 env.alphaScale = params[0];
2359 break;
2360 default:
2361 UNREACHABLE();
2362 break;
2363 }
2364 break;
2365 case TextureEnvTarget::PointSprite:
2366 switch (pname)
2367 {
2368 case TextureEnvParameter::PointCoordReplace:
2369 env.pointSpriteCoordReplace = static_cast<bool>(params[0]);
2370 break;
2371 default:
2372 UNREACHABLE();
2373 break;
2374 }
2375 break;
2376 default:
2377 UNREACHABLE();
2378 break;
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002379 }
2380}
2381
2382void GetTextureEnv(unsigned int unit,
2383 const GLES1State *state,
2384 TextureEnvTarget target,
2385 TextureEnvParameter pname,
2386 GLfloat *params)
2387{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002388 const TextureEnvironmentParameters &env = state->textureEnvironment(unit);
2389
2390 switch (target)
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002391 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002392 case TextureEnvTarget::Env:
2393 switch (pname)
2394 {
2395 case TextureEnvParameter::Mode:
2396 ConvertPackedEnum(env.mode, params);
2397 break;
2398 case TextureEnvParameter::CombineRgb:
2399 ConvertPackedEnum(env.combineRgb, params);
2400 break;
2401 case TextureEnvParameter::CombineAlpha:
2402 ConvertPackedEnum(env.combineAlpha, params);
2403 break;
2404 case TextureEnvParameter::Src0Rgb:
2405 ConvertPackedEnum(env.src0Rgb, params);
2406 break;
2407 case TextureEnvParameter::Src1Rgb:
2408 ConvertPackedEnum(env.src1Rgb, params);
2409 break;
2410 case TextureEnvParameter::Src2Rgb:
2411 ConvertPackedEnum(env.src2Rgb, params);
2412 break;
2413 case TextureEnvParameter::Src0Alpha:
2414 ConvertPackedEnum(env.src0Alpha, params);
2415 break;
2416 case TextureEnvParameter::Src1Alpha:
2417 ConvertPackedEnum(env.src1Alpha, params);
2418 break;
2419 case TextureEnvParameter::Src2Alpha:
2420 ConvertPackedEnum(env.src2Alpha, params);
2421 break;
2422 case TextureEnvParameter::Op0Rgb:
2423 ConvertPackedEnum(env.op0Rgb, params);
2424 break;
2425 case TextureEnvParameter::Op1Rgb:
2426 ConvertPackedEnum(env.op1Rgb, params);
2427 break;
2428 case TextureEnvParameter::Op2Rgb:
2429 ConvertPackedEnum(env.op2Rgb, params);
2430 break;
2431 case TextureEnvParameter::Op0Alpha:
2432 ConvertPackedEnum(env.op0Alpha, params);
2433 break;
2434 case TextureEnvParameter::Op1Alpha:
2435 ConvertPackedEnum(env.op1Alpha, params);
2436 break;
2437 case TextureEnvParameter::Op2Alpha:
2438 ConvertPackedEnum(env.op2Alpha, params);
2439 break;
2440 case TextureEnvParameter::Color:
2441 env.color.writeData(params);
2442 break;
2443 case TextureEnvParameter::RgbScale:
2444 *params = env.rgbScale;
2445 break;
2446 case TextureEnvParameter::AlphaScale:
2447 *params = env.alphaScale;
2448 break;
2449 default:
2450 UNREACHABLE();
2451 break;
2452 }
2453 break;
2454 case TextureEnvTarget::PointSprite:
2455 switch (pname)
2456 {
2457 case TextureEnvParameter::PointCoordReplace:
2458 *params = static_cast<GLfloat>(env.pointSpriteCoordReplace);
2459 break;
2460 default:
2461 UNREACHABLE();
2462 break;
2463 }
2464 break;
2465 default:
2466 UNREACHABLE();
2467 break;
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002468 }
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002469}
2470
2471unsigned int GetPointParameterCount(PointParameter pname)
2472{
2473 switch (pname)
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002474 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002475 case PointParameter::PointSizeMin:
2476 case PointParameter::PointSizeMax:
2477 case PointParameter::PointFadeThresholdSize:
2478 return 1;
2479 case PointParameter::PointDistanceAttenuation:
2480 return 3;
2481 default:
2482 return 0;
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002483 }
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07002484}
2485
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002486void SetPointParameter(GLES1State *state, PointParameter pname, const GLfloat *params)
2487{
2488
2489 PointParameters &pointParams = state->pointParameters();
2490
2491 switch (pname)
2492 {
2493 case PointParameter::PointSizeMin:
2494 pointParams.pointSizeMin = params[0];
2495 break;
2496 case PointParameter::PointSizeMax:
2497 pointParams.pointSizeMax = params[0];
2498 break;
2499 case PointParameter::PointFadeThresholdSize:
2500 pointParams.pointFadeThresholdSize = params[0];
2501 break;
2502 case PointParameter::PointDistanceAttenuation:
2503 for (unsigned int i = 0; i < 3; i++)
2504 {
2505 pointParams.pointDistanceAttenuation[i] = params[i];
2506 }
2507 break;
2508 default:
2509 UNREACHABLE();
2510 }
2511}
2512
2513void GetPointParameter(const GLES1State *state, PointParameter pname, GLfloat *params)
2514{
2515 const PointParameters &pointParams = state->pointParameters();
2516
2517 switch (pname)
2518 {
2519 case PointParameter::PointSizeMin:
2520 params[0] = pointParams.pointSizeMin;
2521 break;
2522 case PointParameter::PointSizeMax:
2523 params[0] = pointParams.pointSizeMax;
2524 break;
2525 case PointParameter::PointFadeThresholdSize:
2526 params[0] = pointParams.pointFadeThresholdSize;
2527 break;
2528 case PointParameter::PointDistanceAttenuation:
2529 for (unsigned int i = 0; i < 3; i++)
2530 {
2531 params[i] = pointParams.pointDistanceAttenuation[i];
2532 }
2533 break;
2534 default:
2535 UNREACHABLE();
2536 }
2537}
2538
2539void SetPointSize(GLES1State *state, GLfloat size)
2540{
2541 PointParameters &params = state->pointParameters();
2542 params.pointSize = size;
2543}
2544
2545void GetPointSize(GLES1State *state, GLfloat *sizeOut)
2546{
2547 const PointParameters &params = state->pointParameters();
2548 *sizeOut = params.pointSize;
2549}
2550
Lingfeng Yangf97641c2018-06-21 19:22:45 -07002551unsigned int GetTexParameterCount(GLenum pname)
2552{
2553 switch (pname)
2554 {
2555 case GL_TEXTURE_CROP_RECT_OES:
2556 return 4;
2557 case GL_TEXTURE_MAG_FILTER:
2558 case GL_TEXTURE_MIN_FILTER:
2559 case GL_TEXTURE_WRAP_S:
2560 case GL_TEXTURE_WRAP_T:
2561 case GL_TEXTURE_USAGE_ANGLE:
2562 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
2563 case GL_TEXTURE_IMMUTABLE_FORMAT:
2564 case GL_TEXTURE_WRAP_R:
2565 case GL_TEXTURE_IMMUTABLE_LEVELS:
2566 case GL_TEXTURE_SWIZZLE_R:
2567 case GL_TEXTURE_SWIZZLE_G:
2568 case GL_TEXTURE_SWIZZLE_B:
2569 case GL_TEXTURE_SWIZZLE_A:
2570 case GL_TEXTURE_BASE_LEVEL:
2571 case GL_TEXTURE_MAX_LEVEL:
2572 case GL_TEXTURE_MIN_LOD:
2573 case GL_TEXTURE_MAX_LOD:
2574 case GL_TEXTURE_COMPARE_MODE:
2575 case GL_TEXTURE_COMPARE_FUNC:
2576 case GL_TEXTURE_SRGB_DECODE_EXT:
2577 case GL_DEPTH_STENCIL_TEXTURE_MODE:
2578 return 1;
2579 default:
2580 return 0;
2581 }
2582}
2583
Geoff Lang65603eb2017-01-12 16:48:03 -05002584} // namespace gl
2585
2586namespace egl
2587{
2588
2589void QueryConfigAttrib(const Config *config, EGLint attribute, EGLint *value)
2590{
2591 ASSERT(config != nullptr);
2592 switch (attribute)
2593 {
2594 case EGL_BUFFER_SIZE:
2595 *value = config->bufferSize;
2596 break;
2597 case EGL_ALPHA_SIZE:
2598 *value = config->alphaSize;
2599 break;
2600 case EGL_BLUE_SIZE:
2601 *value = config->blueSize;
2602 break;
2603 case EGL_GREEN_SIZE:
2604 *value = config->greenSize;
2605 break;
2606 case EGL_RED_SIZE:
2607 *value = config->redSize;
2608 break;
2609 case EGL_DEPTH_SIZE:
2610 *value = config->depthSize;
2611 break;
2612 case EGL_STENCIL_SIZE:
2613 *value = config->stencilSize;
2614 break;
2615 case EGL_CONFIG_CAVEAT:
2616 *value = config->configCaveat;
2617 break;
2618 case EGL_CONFIG_ID:
2619 *value = config->configID;
2620 break;
2621 case EGL_LEVEL:
2622 *value = config->level;
2623 break;
2624 case EGL_NATIVE_RENDERABLE:
2625 *value = config->nativeRenderable;
2626 break;
2627 case EGL_NATIVE_VISUAL_ID:
2628 *value = config->nativeVisualID;
2629 break;
2630 case EGL_NATIVE_VISUAL_TYPE:
2631 *value = config->nativeVisualType;
2632 break;
2633 case EGL_SAMPLES:
2634 *value = config->samples;
2635 break;
2636 case EGL_SAMPLE_BUFFERS:
2637 *value = config->sampleBuffers;
2638 break;
2639 case EGL_SURFACE_TYPE:
2640 *value = config->surfaceType;
2641 break;
2642 case EGL_TRANSPARENT_TYPE:
2643 *value = config->transparentType;
2644 break;
2645 case EGL_TRANSPARENT_BLUE_VALUE:
2646 *value = config->transparentBlueValue;
2647 break;
2648 case EGL_TRANSPARENT_GREEN_VALUE:
2649 *value = config->transparentGreenValue;
2650 break;
2651 case EGL_TRANSPARENT_RED_VALUE:
2652 *value = config->transparentRedValue;
2653 break;
2654 case EGL_BIND_TO_TEXTURE_RGB:
2655 *value = config->bindToTextureRGB;
2656 break;
2657 case EGL_BIND_TO_TEXTURE_RGBA:
2658 *value = config->bindToTextureRGBA;
2659 break;
2660 case EGL_MIN_SWAP_INTERVAL:
2661 *value = config->minSwapInterval;
2662 break;
2663 case EGL_MAX_SWAP_INTERVAL:
2664 *value = config->maxSwapInterval;
2665 break;
2666 case EGL_LUMINANCE_SIZE:
2667 *value = config->luminanceSize;
2668 break;
2669 case EGL_ALPHA_MASK_SIZE:
2670 *value = config->alphaMaskSize;
2671 break;
2672 case EGL_COLOR_BUFFER_TYPE:
2673 *value = config->colorBufferType;
2674 break;
2675 case EGL_RENDERABLE_TYPE:
2676 *value = config->renderableType;
2677 break;
2678 case EGL_MATCH_NATIVE_PIXMAP:
2679 *value = false;
2680 UNIMPLEMENTED();
2681 break;
2682 case EGL_CONFORMANT:
2683 *value = config->conformant;
2684 break;
2685 case EGL_MAX_PBUFFER_WIDTH:
2686 *value = config->maxPBufferWidth;
2687 break;
2688 case EGL_MAX_PBUFFER_HEIGHT:
2689 *value = config->maxPBufferHeight;
2690 break;
2691 case EGL_MAX_PBUFFER_PIXELS:
2692 *value = config->maxPBufferPixels;
2693 break;
2694 case EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE:
2695 *value = config->optimalOrientation;
2696 break;
Geoff Langc5a2a172017-01-13 15:55:07 -05002697 case EGL_COLOR_COMPONENT_TYPE_EXT:
2698 *value = config->colorComponentType;
2699 break;
Geoff Lang65603eb2017-01-12 16:48:03 -05002700 default:
2701 UNREACHABLE();
2702 break;
2703 }
Geoff Langff5b2d52016-09-07 11:32:23 -04002704}
Geoff Lang65603eb2017-01-12 16:48:03 -05002705
Geoff Langaf143fe2017-10-05 13:59:43 -04002706void QueryContextAttrib(const gl::Context *context, EGLint attribute, EGLint *value)
2707{
2708 switch (attribute)
2709 {
2710 case EGL_CONFIG_ID:
2711 *value = context->getConfig()->configID;
2712 break;
2713 case EGL_CONTEXT_CLIENT_TYPE:
2714 *value = context->getClientType();
2715 break;
2716 case EGL_CONTEXT_CLIENT_VERSION:
2717 *value = context->getClientMajorVersion();
2718 break;
2719 case EGL_RENDER_BUFFER:
2720 *value = context->getRenderBuffer();
2721 break;
Geoff Langb433e872017-10-05 14:01:47 -04002722 case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
2723 *value = context->isRobustResourceInitEnabled();
2724 break;
Geoff Langaf143fe2017-10-05 13:59:43 -04002725 default:
2726 UNREACHABLE();
2727 break;
2728 }
2729}
2730
Geoff Lang31ecbd72017-07-26 13:01:27 -04002731void QuerySurfaceAttrib(const Surface *surface, EGLint attribute, EGLint *value)
2732{
2733 switch (attribute)
2734 {
2735 case EGL_GL_COLORSPACE:
Geoff Lang40ac7832017-07-26 14:38:46 -04002736 *value = surface->getGLColorspace();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002737 break;
2738 case EGL_VG_ALPHA_FORMAT:
Geoff Lang40ac7832017-07-26 14:38:46 -04002739 *value = surface->getVGAlphaFormat();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002740 break;
2741 case EGL_VG_COLORSPACE:
Geoff Lang40ac7832017-07-26 14:38:46 -04002742 *value = surface->getVGColorspace();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002743 break;
2744 case EGL_CONFIG_ID:
2745 *value = surface->getConfig()->configID;
2746 break;
2747 case EGL_HEIGHT:
2748 *value = surface->getHeight();
2749 break;
2750 case EGL_HORIZONTAL_RESOLUTION:
Geoff Lang40ac7832017-07-26 14:38:46 -04002751 *value = surface->getHorizontalResolution();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002752 break;
2753 case EGL_LARGEST_PBUFFER:
Geoff Lang40ac7832017-07-26 14:38:46 -04002754 // The EGL spec states that value is not written if the surface is not a pbuffer
2755 if (surface->getType() == EGL_PBUFFER_BIT)
2756 {
2757 *value = surface->getLargestPbuffer();
2758 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04002759 break;
2760 case EGL_MIPMAP_TEXTURE:
Geoff Lang40ac7832017-07-26 14:38:46 -04002761 // The EGL spec states that value is not written if the surface is not a pbuffer
2762 if (surface->getType() == EGL_PBUFFER_BIT)
2763 {
2764 *value = surface->getMipmapTexture();
2765 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04002766 break;
2767 case EGL_MIPMAP_LEVEL:
Geoff Lang40ac7832017-07-26 14:38:46 -04002768 // The EGL spec states that value is not written if the surface is not a pbuffer
2769 if (surface->getType() == EGL_PBUFFER_BIT)
2770 {
2771 *value = surface->getMipmapLevel();
2772 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04002773 break;
2774 case EGL_MULTISAMPLE_RESOLVE:
Geoff Lang40ac7832017-07-26 14:38:46 -04002775 *value = surface->getMultisampleResolve();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002776 break;
2777 case EGL_PIXEL_ASPECT_RATIO:
2778 *value = surface->getPixelAspectRatio();
2779 break;
2780 case EGL_RENDER_BUFFER:
2781 *value = surface->getRenderBuffer();
2782 break;
2783 case EGL_SWAP_BEHAVIOR:
2784 *value = surface->getSwapBehavior();
2785 break;
2786 case EGL_TEXTURE_FORMAT:
Geoff Lang40ac7832017-07-26 14:38:46 -04002787 // The EGL spec states that value is not written if the surface is not a pbuffer
2788 if (surface->getType() == EGL_PBUFFER_BIT)
2789 {
Geoff Lang8ceea812018-04-10 03:07:13 -04002790 *value = ToEGLenum(surface->getTextureFormat());
Geoff Lang40ac7832017-07-26 14:38:46 -04002791 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04002792 break;
2793 case EGL_TEXTURE_TARGET:
Geoff Lang40ac7832017-07-26 14:38:46 -04002794 // The EGL spec states that value is not written if the surface is not a pbuffer
2795 if (surface->getType() == EGL_PBUFFER_BIT)
2796 {
2797 *value = surface->getTextureTarget();
2798 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04002799 break;
2800 case EGL_VERTICAL_RESOLUTION:
Geoff Lang40ac7832017-07-26 14:38:46 -04002801 *value = surface->getVerticalResolution();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002802 break;
2803 case EGL_WIDTH:
2804 *value = surface->getWidth();
2805 break;
2806 case EGL_POST_SUB_BUFFER_SUPPORTED_NV:
2807 *value = surface->isPostSubBufferSupported();
2808 break;
2809 case EGL_FIXED_SIZE_ANGLE:
2810 *value = surface->isFixedSize();
2811 break;
2812 case EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE:
2813 *value = surface->flexibleSurfaceCompatibilityRequested();
2814 break;
2815 case EGL_SURFACE_ORIENTATION_ANGLE:
2816 *value = surface->getOrientation();
2817 break;
2818 case EGL_DIRECT_COMPOSITION_ANGLE:
2819 *value = surface->directComposition();
2820 break;
Geoff Langb433e872017-10-05 14:01:47 -04002821 case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
2822 *value = surface->isRobustResourceInitEnabled();
2823 break;
Geoff Lang31ecbd72017-07-26 13:01:27 -04002824 default:
2825 UNREACHABLE();
2826 break;
2827 }
2828}
2829
2830void SetSurfaceAttrib(Surface *surface, EGLint attribute, EGLint value)
2831{
2832 switch (attribute)
2833 {
2834 case EGL_MIPMAP_LEVEL:
Geoff Lang40ac7832017-07-26 14:38:46 -04002835 surface->setMipmapLevel(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04002836 break;
2837 case EGL_MULTISAMPLE_RESOLVE:
Geoff Lang40ac7832017-07-26 14:38:46 -04002838 surface->setMultisampleResolve(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04002839 break;
2840 case EGL_SWAP_BEHAVIOR:
Geoff Lang40ac7832017-07-26 14:38:46 -04002841 surface->setSwapBehavior(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04002842 break;
LRN03d132e2018-07-14 13:31:35 +00002843 case EGL_WIDTH:
2844 surface->setFixedWidth(value);
2845 break;
2846 case EGL_HEIGHT:
2847 surface->setFixedHeight(value);
2848 break;
Geoff Lang31ecbd72017-07-26 13:01:27 -04002849 default:
2850 UNREACHABLE();
2851 break;
2852 }
2853}
2854
Geoff Lang65603eb2017-01-12 16:48:03 -05002855} // namespace egl