blob: 0b09f7ac03aa3d30d00e7d63419d34e554c1308e [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:
841 case TextureEnvParameter::RgbScale:
842 case TextureEnvParameter::AlphaScale:
843 return true;
844 default:
845 return false;
846 }
847}
848
Geoff Langc1984ed2016-10-07 12:41:00 -0400849} // anonymous namespace
850
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -0800851void QueryFramebufferAttachmentParameteriv(const Context *context,
852 const Framebuffer *framebuffer,
Geoff Langff5b2d52016-09-07 11:32:23 -0400853 GLenum attachment,
854 GLenum pname,
855 GLint *params)
856{
857 ASSERT(framebuffer);
858
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -0800859 const FramebufferAttachment *attachmentObject = framebuffer->getAttachment(context, attachment);
860
Geoff Langff5b2d52016-09-07 11:32:23 -0400861 if (attachmentObject == nullptr)
862 {
863 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
864 // is NONE, then querying any other pname will generate INVALID_ENUM.
865
866 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
867 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
868 // INVALID_OPERATION for all other pnames
869
870 switch (pname)
871 {
872 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
873 *params = GL_NONE;
874 break;
875
876 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
877 *params = 0;
878 break;
879
880 default:
881 UNREACHABLE();
882 break;
883 }
884
885 return;
886 }
887
888 switch (pname)
889 {
890 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
891 *params = attachmentObject->type();
892 break;
893
894 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
895 *params = attachmentObject->id();
896 break;
897
898 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
899 *params = attachmentObject->mipLevel();
900 break;
901
902 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
Corentin Wallez99d492c2018-02-27 15:17:10 -0500903 {
904 TextureTarget face = attachmentObject->cubeMapFace();
905 if (face != TextureTarget::InvalidEnum)
906 {
907 *params = ToGLenum(attachmentObject->cubeMapFace());
908 }
909 else
910 {
911 // This happens when the attachment isn't a texture cube map face
912 *params = GL_NONE;
913 }
914 }
915 break;
Geoff Langff5b2d52016-09-07 11:32:23 -0400916
917 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
918 *params = attachmentObject->getRedSize();
919 break;
920
921 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
922 *params = attachmentObject->getGreenSize();
923 break;
924
925 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
926 *params = attachmentObject->getBlueSize();
927 break;
928
929 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
930 *params = attachmentObject->getAlphaSize();
931 break;
932
933 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
934 *params = attachmentObject->getDepthSize();
935 break;
936
937 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
938 *params = attachmentObject->getStencilSize();
939 break;
940
941 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
942 *params = attachmentObject->getComponentType();
943 break;
944
945 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
946 *params = attachmentObject->getColorEncoding();
947 break;
948
949 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
950 *params = attachmentObject->layer();
951 break;
952
Martin Radeve5285d22017-07-14 16:23:53 +0300953 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_ANGLE:
954 *params = attachmentObject->getNumViews();
955 break;
956
957 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_MULTIVIEW_LAYOUT_ANGLE:
958 *params = static_cast<GLint>(attachmentObject->getMultiviewLayout());
959 break;
960
961 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_ANGLE:
962 *params = attachmentObject->getBaseViewIndex();
963 break;
964
965 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_VIEWPORT_OFFSETS_ANGLE:
966 {
967 const std::vector<Offset> &offsets = attachmentObject->getMultiviewViewportOffsets();
968 for (size_t i = 0u; i < offsets.size(); ++i)
969 {
970 params[i * 2u] = offsets[i].x;
971 params[i * 2u + 1u] = offsets[i].y;
972 }
973 }
974 break;
975
Jiawei Shaoa8802472018-05-28 11:17:47 +0800976 case GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT:
977 *params = attachmentObject->isLayered();
978 break;
979
Geoff Langff5b2d52016-09-07 11:32:23 -0400980 default:
981 UNREACHABLE();
982 break;
983 }
984}
985
986void QueryBufferParameteriv(const Buffer *buffer, GLenum pname, GLint *params)
987{
Geoff Langebebe1c2016-10-14 12:01:31 -0400988 QueryBufferParameterBase(buffer, pname, params);
989}
Geoff Langff5b2d52016-09-07 11:32:23 -0400990
Geoff Langebebe1c2016-10-14 12:01:31 -0400991void QueryBufferParameteri64v(const Buffer *buffer, GLenum pname, GLint64 *params)
992{
993 QueryBufferParameterBase(buffer, pname, params);
Geoff Langff5b2d52016-09-07 11:32:23 -0400994}
995
Geoff Lang496c02d2016-10-20 11:38:11 -0700996void QueryBufferPointerv(const Buffer *buffer, GLenum pname, void **params)
997{
998 switch (pname)
999 {
1000 case GL_BUFFER_MAP_POINTER:
1001 *params = buffer->getMapPointer();
1002 break;
1003
1004 default:
1005 UNREACHABLE();
1006 break;
1007 }
1008}
1009
Jamie Madillffe00c02017-06-27 16:26:55 -04001010void QueryProgramiv(const Context *context, const Program *program, GLenum pname, GLint *params)
Geoff Langff5b2d52016-09-07 11:32:23 -04001011{
1012 ASSERT(program != nullptr);
1013
1014 switch (pname)
1015 {
1016 case GL_DELETE_STATUS:
1017 *params = program->isFlaggedForDeletion();
1018 return;
1019 case GL_LINK_STATUS:
1020 *params = program->isLinked();
1021 return;
jchen107ae70d82018-07-06 13:47:01 +08001022 case GL_COMPLETION_STATUS_KHR:
1023 *params = program->isLinking() ? GL_FALSE : GL_TRUE;
1024 return;
Geoff Langff5b2d52016-09-07 11:32:23 -04001025 case GL_VALIDATE_STATUS:
1026 *params = program->isValidated();
1027 return;
1028 case GL_INFO_LOG_LENGTH:
1029 *params = program->getInfoLogLength();
1030 return;
1031 case GL_ATTACHED_SHADERS:
1032 *params = program->getAttachedShadersCount();
1033 return;
1034 case GL_ACTIVE_ATTRIBUTES:
1035 *params = program->getActiveAttributeCount();
1036 return;
1037 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
1038 *params = program->getActiveAttributeMaxLength();
1039 return;
1040 case GL_ACTIVE_UNIFORMS:
1041 *params = program->getActiveUniformCount();
1042 return;
1043 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
1044 *params = program->getActiveUniformMaxLength();
1045 return;
1046 case GL_PROGRAM_BINARY_LENGTH_OES:
Jamie Madillffe00c02017-06-27 16:26:55 -04001047 *params = program->getBinaryLength(context);
Geoff Langff5b2d52016-09-07 11:32:23 -04001048 return;
1049 case GL_ACTIVE_UNIFORM_BLOCKS:
1050 *params = program->getActiveUniformBlockCount();
1051 return;
1052 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
Qin Jiajia9bf55522018-01-29 13:56:23 +08001053 *params = program->getActiveUniformBlockMaxNameLength();
Geoff Langff5b2d52016-09-07 11:32:23 -04001054 break;
1055 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
1056 *params = program->getTransformFeedbackBufferMode();
1057 break;
1058 case GL_TRANSFORM_FEEDBACK_VARYINGS:
jchen10910a3da2017-11-15 09:40:11 +08001059 *params = clampCast<GLint>(program->getTransformFeedbackVaryingCount());
Geoff Langff5b2d52016-09-07 11:32:23 -04001060 break;
1061 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
1062 *params = program->getTransformFeedbackVaryingMaxLength();
1063 break;
1064 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
1065 *params = program->getBinaryRetrievableHint();
1066 break;
Yunchao He61afff12017-03-14 15:34:03 +08001067 case GL_PROGRAM_SEPARABLE:
1068 *params = program->isSeparable();
1069 break;
Xinghua Cao971f8502017-10-17 13:01:24 +08001070 case GL_COMPUTE_WORK_GROUP_SIZE:
1071 {
1072 const sh::WorkGroupSize &localSize = program->getComputeShaderLocalSize();
1073 params[0] = localSize[0];
1074 params[1] = localSize[1];
1075 params[2] = localSize[2];
1076 }
1077 break;
jchen1058f67be2017-10-27 08:59:27 +08001078 case GL_ACTIVE_ATOMIC_COUNTER_BUFFERS:
1079 *params = program->getActiveAtomicCounterBufferCount();
1080 break;
Jiawei Shao447bfac2018-03-14 14:23:40 +08001081 case GL_GEOMETRY_LINKED_INPUT_TYPE_EXT:
Jamie Madill493f9572018-05-24 19:52:15 -04001082 *params = ToGLenum(program->getGeometryShaderInputPrimitiveType());
Jiawei Shao447bfac2018-03-14 14:23:40 +08001083 break;
1084 case GL_GEOMETRY_LINKED_OUTPUT_TYPE_EXT:
Jamie Madill493f9572018-05-24 19:52:15 -04001085 *params = ToGLenum(program->getGeometryShaderOutputPrimitiveType());
Jiawei Shao447bfac2018-03-14 14:23:40 +08001086 break;
1087 case GL_GEOMETRY_LINKED_VERTICES_OUT_EXT:
1088 *params = program->getGeometryShaderMaxVertices();
1089 break;
1090 case GL_GEOMETRY_SHADER_INVOCATIONS_EXT:
1091 *params = program->getGeometryShaderInvocations();
1092 break;
Geoff Langff5b2d52016-09-07 11:32:23 -04001093 default:
1094 UNREACHABLE();
1095 break;
1096 }
1097}
Geoff Lang740d9022016-10-07 11:20:52 -04001098
Jamie Madill4e0e6f82017-02-17 11:06:03 -05001099void QueryRenderbufferiv(const Context *context,
1100 const Renderbuffer *renderbuffer,
1101 GLenum pname,
1102 GLint *params)
Geoff Lang740d9022016-10-07 11:20:52 -04001103{
1104 ASSERT(renderbuffer != nullptr);
1105
1106 switch (pname)
1107 {
1108 case GL_RENDERBUFFER_WIDTH:
1109 *params = renderbuffer->getWidth();
1110 break;
1111 case GL_RENDERBUFFER_HEIGHT:
1112 *params = renderbuffer->getHeight();
1113 break;
1114 case GL_RENDERBUFFER_INTERNAL_FORMAT:
Jamie Madill4e0e6f82017-02-17 11:06:03 -05001115 // Special case the WebGL 1 DEPTH_STENCIL format.
Jamie Madilla02315b2017-02-23 14:14:47 -05001116 if (context->isWebGL1() &&
Jamie Madill4e0e6f82017-02-17 11:06:03 -05001117 renderbuffer->getFormat().info->internalFormat == GL_DEPTH24_STENCIL8)
1118 {
1119 *params = GL_DEPTH_STENCIL;
1120 }
1121 else
1122 {
1123 *params = renderbuffer->getFormat().info->internalFormat;
1124 }
Geoff Lang740d9022016-10-07 11:20:52 -04001125 break;
1126 case GL_RENDERBUFFER_RED_SIZE:
1127 *params = renderbuffer->getRedSize();
1128 break;
1129 case GL_RENDERBUFFER_GREEN_SIZE:
1130 *params = renderbuffer->getGreenSize();
1131 break;
1132 case GL_RENDERBUFFER_BLUE_SIZE:
1133 *params = renderbuffer->getBlueSize();
1134 break;
1135 case GL_RENDERBUFFER_ALPHA_SIZE:
1136 *params = renderbuffer->getAlphaSize();
1137 break;
1138 case GL_RENDERBUFFER_DEPTH_SIZE:
1139 *params = renderbuffer->getDepthSize();
1140 break;
1141 case GL_RENDERBUFFER_STENCIL_SIZE:
1142 *params = renderbuffer->getStencilSize();
1143 break;
1144 case GL_RENDERBUFFER_SAMPLES_ANGLE:
1145 *params = renderbuffer->getSamples();
1146 break;
1147 default:
1148 UNREACHABLE();
1149 break;
1150 }
1151}
Geoff Langd7d0ed32016-10-07 11:33:51 -04001152
Jamie Madillbd044ed2017-06-05 12:59:21 -04001153void QueryShaderiv(const Context *context, Shader *shader, GLenum pname, GLint *params)
Geoff Langd7d0ed32016-10-07 11:33:51 -04001154{
1155 ASSERT(shader != nullptr);
1156
1157 switch (pname)
1158 {
1159 case GL_SHADER_TYPE:
Jiawei Shao385b3e02018-03-21 09:43:28 +08001160 *params = static_cast<GLint>(ToGLenum(shader->getType()));
Geoff Langd7d0ed32016-10-07 11:33:51 -04001161 return;
1162 case GL_DELETE_STATUS:
1163 *params = shader->isFlaggedForDeletion();
1164 return;
1165 case GL_COMPILE_STATUS:
Jamie Madillbd044ed2017-06-05 12:59:21 -04001166 *params = shader->isCompiled(context) ? GL_TRUE : GL_FALSE;
Geoff Langd7d0ed32016-10-07 11:33:51 -04001167 return;
jchen107ae70d82018-07-06 13:47:01 +08001168 case GL_COMPLETION_STATUS_KHR:
1169 // TODO(jie.a.chen@intel.com): Parallelize shader compilation.
1170 // http://crbug.com/849576
1171 *params = shader->isCompiled(context) ? GL_TRUE : GL_FALSE;
1172 return;
Geoff Langd7d0ed32016-10-07 11:33:51 -04001173 case GL_INFO_LOG_LENGTH:
Jamie Madillbd044ed2017-06-05 12:59:21 -04001174 *params = shader->getInfoLogLength(context);
Geoff Langd7d0ed32016-10-07 11:33:51 -04001175 return;
1176 case GL_SHADER_SOURCE_LENGTH:
1177 *params = shader->getSourceLength();
1178 return;
1179 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
Jamie Madillbd044ed2017-06-05 12:59:21 -04001180 *params = shader->getTranslatedSourceWithDebugInfoLength(context);
Geoff Langd7d0ed32016-10-07 11:33:51 -04001181 return;
1182 default:
1183 UNREACHABLE();
1184 break;
1185 }
1186}
Geoff Langc1984ed2016-10-07 12:41:00 -04001187
He Yunchao11b038b2016-11-22 21:24:04 +08001188void QueryTexLevelParameterfv(const Texture *texture,
Corentin Wallez99d492c2018-02-27 15:17:10 -05001189 TextureTarget target,
He Yunchao11b038b2016-11-22 21:24:04 +08001190 GLint level,
1191 GLenum pname,
1192 GLfloat *params)
1193{
1194 QueryTexLevelParameterBase(texture, target, level, pname, params);
1195}
1196
1197void QueryTexLevelParameteriv(const Texture *texture,
Corentin Wallez99d492c2018-02-27 15:17:10 -05001198 TextureTarget target,
He Yunchao11b038b2016-11-22 21:24:04 +08001199 GLint level,
1200 GLenum pname,
1201 GLint *params)
1202{
1203 QueryTexLevelParameterBase(texture, target, level, pname, params);
1204}
1205
Geoff Langc1984ed2016-10-07 12:41:00 -04001206void QueryTexParameterfv(const Texture *texture, GLenum pname, GLfloat *params)
1207{
1208 QueryTexParameterBase(texture, pname, params);
1209}
1210
1211void QueryTexParameteriv(const Texture *texture, GLenum pname, GLint *params)
1212{
1213 QueryTexParameterBase(texture, pname, params);
1214}
1215
1216void QuerySamplerParameterfv(const Sampler *sampler, GLenum pname, GLfloat *params)
1217{
1218 QuerySamplerParameterBase(sampler, pname, params);
1219}
1220
1221void QuerySamplerParameteriv(const Sampler *sampler, GLenum pname, GLint *params)
1222{
1223 QuerySamplerParameterBase(sampler, pname, params);
1224}
1225
Geoff Lang0b031062016-10-13 14:30:04 -04001226void QueryVertexAttribfv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001227 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001228 const VertexAttribCurrentValueData &currentValueData,
1229 GLenum pname,
1230 GLfloat *params)
1231{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001232 QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001233}
1234
1235void QueryVertexAttribiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001236 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001237 const VertexAttribCurrentValueData &currentValueData,
1238 GLenum pname,
1239 GLint *params)
1240{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001241 QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001242}
1243
Jamie Madill876429b2017-04-20 15:46:24 -04001244void QueryVertexAttribPointerv(const VertexAttribute &attrib, GLenum pname, void **pointer)
Geoff Lang0b031062016-10-13 14:30:04 -04001245{
1246 switch (pname)
1247 {
1248 case GL_VERTEX_ATTRIB_ARRAY_POINTER:
Jamie Madill876429b2017-04-20 15:46:24 -04001249 *pointer = const_cast<void *>(attrib.pointer);
Geoff Lang0b031062016-10-13 14:30:04 -04001250 break;
1251
1252 default:
1253 UNREACHABLE();
1254 break;
1255 }
1256}
1257
1258void QueryVertexAttribIiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001259 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001260 const VertexAttribCurrentValueData &currentValueData,
1261 GLenum pname,
1262 GLint *params)
1263{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001264 QueryVertexAttribBase(attrib, binding, currentValueData.IntValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001265}
1266
1267void QueryVertexAttribIuiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001268 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001269 const VertexAttribCurrentValueData &currentValueData,
1270 GLenum pname,
1271 GLuint *params)
1272{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001273 QueryVertexAttribBase(attrib, binding, currentValueData.UnsignedIntValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001274}
1275
Geoff Lang6899b872016-10-14 11:30:13 -04001276void QueryActiveUniformBlockiv(const Program *program,
1277 GLuint uniformBlockIndex,
1278 GLenum pname,
1279 GLint *params)
1280{
jchen1058f67be2017-10-27 08:59:27 +08001281 GLenum prop = GetUniformBlockPropertyEnum(pname);
1282 QueryProgramResourceiv(program, GL_UNIFORM_BLOCK, uniformBlockIndex, 1, &prop,
1283 std::numeric_limits<GLsizei>::max(), nullptr, params);
Geoff Lang6899b872016-10-14 11:30:13 -04001284}
1285
Geoff Lang0a9661f2016-10-20 10:59:20 -07001286void QueryInternalFormativ(const TextureCaps &format, GLenum pname, GLsizei bufSize, GLint *params)
1287{
1288 switch (pname)
1289 {
1290 case GL_NUM_SAMPLE_COUNTS:
1291 if (bufSize != 0)
1292 {
jchen10a99ed552017-09-22 08:10:32 +08001293 *params = clampCast<GLint>(format.sampleCounts.size());
Geoff Lang0a9661f2016-10-20 10:59:20 -07001294 }
1295 break;
1296
1297 case GL_SAMPLES:
1298 {
1299 size_t returnCount = std::min<size_t>(bufSize, format.sampleCounts.size());
1300 auto sampleReverseIt = format.sampleCounts.rbegin();
1301 for (size_t sampleIndex = 0; sampleIndex < returnCount; ++sampleIndex)
1302 {
1303 params[sampleIndex] = *sampleReverseIt++;
1304 }
1305 }
1306 break;
1307
1308 default:
1309 UNREACHABLE();
1310 break;
1311 }
1312}
1313
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001314void QueryFramebufferParameteriv(const Framebuffer *framebuffer, GLenum pname, GLint *params)
1315{
1316 ASSERT(framebuffer);
1317
1318 switch (pname)
1319 {
1320 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
1321 *params = framebuffer->getDefaultWidth();
1322 break;
1323 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
1324 *params = framebuffer->getDefaultHeight();
1325 break;
1326 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
1327 *params = framebuffer->getDefaultSamples();
1328 break;
1329 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
Geoff Lang92019432017-11-20 13:09:34 -05001330 *params = ConvertToGLBoolean(framebuffer->getDefaultFixedSampleLocations());
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001331 break;
Jiawei Shaob1e91382018-05-17 14:33:55 +08001332 case GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT:
1333 *params = framebuffer->getDefaultLayers();
1334 break;
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001335 default:
1336 UNREACHABLE();
1337 break;
1338 }
1339}
1340
Jamie Madilla0691b72018-07-25 10:41:22 -04001341Error QuerySynciv(const Context *context,
1342 const Sync *sync,
1343 GLenum pname,
1344 GLsizei bufSize,
1345 GLsizei *length,
1346 GLint *values)
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001347{
1348 ASSERT(sync);
1349
Geoff Lang82483b92017-04-11 15:33:00 -04001350 // All queries return one value, exit early if the buffer can't fit anything.
1351 if (bufSize < 1)
1352 {
1353 if (length != nullptr)
1354 {
1355 *length = 0;
1356 }
1357 return NoError();
1358 }
1359
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001360 switch (pname)
1361 {
1362 case GL_OBJECT_TYPE:
jchen10a99ed552017-09-22 08:10:32 +08001363 *values = clampCast<GLint>(GL_SYNC_FENCE);
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001364 break;
1365 case GL_SYNC_CONDITION:
jchen10a99ed552017-09-22 08:10:32 +08001366 *values = clampCast<GLint>(sync->getCondition());
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001367 break;
1368 case GL_SYNC_FLAGS:
jchen10a99ed552017-09-22 08:10:32 +08001369 *values = clampCast<GLint>(sync->getFlags());
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001370 break;
1371 case GL_SYNC_STATUS:
Jamie Madilla0691b72018-07-25 10:41:22 -04001372 ANGLE_TRY(sync->getStatus(context, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001373 break;
1374
1375 default:
1376 UNREACHABLE();
1377 break;
1378 }
1379
Geoff Lang82483b92017-04-11 15:33:00 -04001380 if (length != nullptr)
1381 {
1382 *length = 1;
1383 }
1384
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001385 return NoError();
1386}
1387
Jamie Madill4928b7c2017-06-20 12:57:39 -04001388void SetTexParameterf(Context *context, Texture *texture, GLenum pname, GLfloat param)
Geoff Langc1984ed2016-10-07 12:41:00 -04001389{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001390 SetTexParameterBase(context, texture, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -04001391}
1392
Jamie Madill4928b7c2017-06-20 12:57:39 -04001393void SetTexParameterfv(Context *context, Texture *texture, GLenum pname, const GLfloat *params)
Geoff Langc1984ed2016-10-07 12:41:00 -04001394{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001395 SetTexParameterBase(context, texture, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001396}
1397
Jamie Madill4928b7c2017-06-20 12:57:39 -04001398void SetTexParameteri(Context *context, Texture *texture, GLenum pname, GLint param)
Geoff Langc1984ed2016-10-07 12:41:00 -04001399{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001400 SetTexParameterBase(context, texture, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -04001401}
1402
Jamie Madill4928b7c2017-06-20 12:57:39 -04001403void SetTexParameteriv(Context *context, Texture *texture, GLenum pname, const GLint *params)
Geoff Langc1984ed2016-10-07 12:41:00 -04001404{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001405 SetTexParameterBase(context, texture, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001406}
1407
1408void SetSamplerParameterf(Sampler *sampler, GLenum pname, GLfloat param)
1409{
1410 SetSamplerParameterBase(sampler, pname, &param);
1411}
1412
1413void SetSamplerParameterfv(Sampler *sampler, GLenum pname, const GLfloat *params)
1414{
1415 SetSamplerParameterBase(sampler, pname, params);
1416}
1417
1418void SetSamplerParameteri(Sampler *sampler, GLenum pname, GLint param)
1419{
1420 SetSamplerParameterBase(sampler, pname, &param);
1421}
1422
1423void SetSamplerParameteriv(Sampler *sampler, GLenum pname, const GLint *params)
1424{
1425 SetSamplerParameterBase(sampler, pname, params);
1426}
Geoff Lang65603eb2017-01-12 16:48:03 -05001427
Jamie Madillb983a4b2018-08-01 11:34:51 -04001428void SetFramebufferParameteri(const Context *context,
1429 Framebuffer *framebuffer,
1430 GLenum pname,
1431 GLint param)
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001432{
1433 ASSERT(framebuffer);
1434
1435 switch (pname)
1436 {
1437 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
Jamie Madillb983a4b2018-08-01 11:34:51 -04001438 framebuffer->setDefaultWidth(context, param);
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001439 break;
1440 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
Jamie Madillb983a4b2018-08-01 11:34:51 -04001441 framebuffer->setDefaultHeight(context, param);
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001442 break;
1443 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
Jamie Madillb983a4b2018-08-01 11:34:51 -04001444 framebuffer->setDefaultSamples(context, param);
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001445 break;
1446 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
Jamie Madillb983a4b2018-08-01 11:34:51 -04001447 framebuffer->setDefaultFixedSampleLocations(context, ConvertToBool(param));
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001448 break;
Jiawei Shaob1e91382018-05-17 14:33:55 +08001449 case GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT:
1450 framebuffer->setDefaultLayers(param);
1451 break;
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001452 default:
1453 UNREACHABLE();
1454 break;
1455 }
1456}
1457
Yunchao He61afff12017-03-14 15:34:03 +08001458void SetProgramParameteri(Program *program, GLenum pname, GLint value)
1459{
1460 ASSERT(program);
1461
1462 switch (pname)
1463 {
1464 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
Geoff Lang92019432017-11-20 13:09:34 -05001465 program->setBinaryRetrievableHint(ConvertToBool(value));
Yunchao He61afff12017-03-14 15:34:03 +08001466 break;
1467 case GL_PROGRAM_SEPARABLE:
Geoff Lang92019432017-11-20 13:09:34 -05001468 program->setSeparable(ConvertToBool(value));
Yunchao He61afff12017-03-14 15:34:03 +08001469 break;
1470 default:
1471 UNREACHABLE();
1472 break;
1473 }
1474}
1475
jchen10baf5d942017-08-28 20:45:48 +08001476GLint GetUniformResourceProperty(const Program *program, GLuint index, const GLenum prop)
1477{
1478 const auto &uniform = program->getUniformByIndex(index);
1479 GLenum resourceProp = GetUniformPropertyEnum(prop);
1480 switch (resourceProp)
1481 {
1482 case GL_TYPE:
1483 case GL_ARRAY_SIZE:
1484 case GL_NAME_LENGTH:
Olli Etuaho465835d2017-09-26 13:34:10 +03001485 return GetCommonVariableProperty(uniform, resourceProp);
jchen10baf5d942017-08-28 20:45:48 +08001486
1487 case GL_LOCATION:
1488 return program->getUniformLocation(uniform.name);
1489
1490 case GL_BLOCK_INDEX:
1491 return (uniform.isAtomicCounter() ? -1 : uniform.bufferIndex);
1492
1493 case GL_OFFSET:
1494 return uniform.blockInfo.offset;
1495
1496 case GL_ARRAY_STRIDE:
1497 return uniform.blockInfo.arrayStride;
1498
1499 case GL_MATRIX_STRIDE:
1500 return uniform.blockInfo.matrixStride;
1501
1502 case GL_IS_ROW_MAJOR:
1503 return static_cast<GLint>(uniform.blockInfo.isRowMajorMatrix);
1504
1505 case GL_REFERENCED_BY_VERTEX_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001506 return uniform.isActive(ShaderType::Vertex);
jchen10baf5d942017-08-28 20:45:48 +08001507
1508 case GL_REFERENCED_BY_FRAGMENT_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001509 return uniform.isActive(ShaderType::Fragment);
jchen10baf5d942017-08-28 20:45:48 +08001510
1511 case GL_REFERENCED_BY_COMPUTE_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001512 return uniform.isActive(ShaderType::Compute);
jchen10baf5d942017-08-28 20:45:48 +08001513
Jiawei Shaoc6f82872018-04-24 14:14:50 +08001514 case GL_REFERENCED_BY_GEOMETRY_SHADER_EXT:
1515 return uniform.isActive(ShaderType::Geometry);
1516
jchen10baf5d942017-08-28 20:45:48 +08001517 case GL_ATOMIC_COUNTER_BUFFER_INDEX:
1518 return (uniform.isAtomicCounter() ? uniform.bufferIndex : -1);
1519
1520 default:
1521 UNREACHABLE();
1522 return 0;
1523 }
1524}
1525
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001526GLint GetBufferVariableResourceProperty(const Program *program, GLuint index, const GLenum prop)
1527{
1528 const auto &bufferVariable = program->getBufferVariableByIndex(index);
1529 switch (prop)
1530 {
1531 case GL_TYPE:
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001532 case GL_ARRAY_SIZE:
Olli Etuaho465835d2017-09-26 13:34:10 +03001533 case GL_NAME_LENGTH:
1534 return GetCommonVariableProperty(bufferVariable, prop);
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001535
1536 case GL_BLOCK_INDEX:
1537 return bufferVariable.bufferIndex;
1538
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001539 case GL_OFFSET:
1540 return bufferVariable.blockInfo.offset;
1541
1542 case GL_ARRAY_STRIDE:
1543 return bufferVariable.blockInfo.arrayStride;
1544
1545 case GL_MATRIX_STRIDE:
1546 return bufferVariable.blockInfo.matrixStride;
1547
1548 case GL_IS_ROW_MAJOR:
1549 return static_cast<GLint>(bufferVariable.blockInfo.isRowMajorMatrix);
1550
1551 case GL_REFERENCED_BY_VERTEX_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001552 return bufferVariable.isActive(ShaderType::Vertex);
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001553
1554 case GL_REFERENCED_BY_FRAGMENT_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001555 return bufferVariable.isActive(ShaderType::Fragment);
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001556
1557 case GL_REFERENCED_BY_COMPUTE_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001558 return bufferVariable.isActive(ShaderType::Compute);
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001559
Jiawei Shaoc6f82872018-04-24 14:14:50 +08001560 case GL_REFERENCED_BY_GEOMETRY_SHADER_EXT:
1561 return bufferVariable.isActive(ShaderType::Geometry);
1562
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001563 case GL_TOP_LEVEL_ARRAY_SIZE:
1564 return bufferVariable.topLevelArraySize;
1565
1566 case GL_TOP_LEVEL_ARRAY_STRIDE:
1567 return bufferVariable.blockInfo.topLevelArrayStride;
1568
1569 default:
1570 UNREACHABLE();
1571 return 0;
1572 }
1573}
1574
jchen1015015f72017-03-16 13:54:21 +08001575GLuint QueryProgramResourceIndex(const Program *program,
1576 GLenum programInterface,
1577 const GLchar *name)
1578{
1579 switch (programInterface)
1580 {
1581 case GL_PROGRAM_INPUT:
1582 return program->getInputResourceIndex(name);
1583
1584 case GL_PROGRAM_OUTPUT:
1585 return program->getOutputResourceIndex(name);
1586
jchen1015015f72017-03-16 13:54:21 +08001587 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001588 return program->getState().getUniformIndexFromName(name);
1589
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001590 case GL_BUFFER_VARIABLE:
1591 return program->getState().getBufferVariableIndexFromName(name);
1592
1593 case GL_SHADER_STORAGE_BLOCK:
1594 return program->getShaderStorageBlockIndex(name);
1595
jchen1015015f72017-03-16 13:54:21 +08001596 case GL_UNIFORM_BLOCK:
jchen1058f67be2017-10-27 08:59:27 +08001597 return program->getUniformBlockIndex(name);
1598
jchen1015015f72017-03-16 13:54:21 +08001599 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10910a3da2017-11-15 09:40:11 +08001600 return program->getTransformFeedbackVaryingResourceIndex(name);
jchen1015015f72017-03-16 13:54:21 +08001601
1602 default:
1603 UNREACHABLE();
1604 return GL_INVALID_INDEX;
1605 }
1606}
1607
jchen10fd7c3b52017-03-21 15:36:03 +08001608void QueryProgramResourceName(const Program *program,
1609 GLenum programInterface,
1610 GLuint index,
1611 GLsizei bufSize,
1612 GLsizei *length,
1613 GLchar *name)
1614{
1615 switch (programInterface)
1616 {
1617 case GL_PROGRAM_INPUT:
1618 program->getInputResourceName(index, bufSize, length, name);
1619 break;
1620
1621 case GL_PROGRAM_OUTPUT:
1622 program->getOutputResourceName(index, bufSize, length, name);
1623 break;
1624
jchen10fd7c3b52017-03-21 15:36:03 +08001625 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001626 program->getUniformResourceName(index, bufSize, length, name);
1627 break;
1628
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001629 case GL_BUFFER_VARIABLE:
1630 program->getBufferVariableResourceName(index, bufSize, length, name);
1631 break;
1632
1633 case GL_SHADER_STORAGE_BLOCK:
1634 program->getActiveShaderStorageBlockName(index, bufSize, length, name);
1635 break;
1636
jchen10fd7c3b52017-03-21 15:36:03 +08001637 case GL_UNIFORM_BLOCK:
jchen1058f67be2017-10-27 08:59:27 +08001638 program->getActiveUniformBlockName(index, bufSize, length, name);
1639 break;
1640
jchen10fd7c3b52017-03-21 15:36:03 +08001641 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10910a3da2017-11-15 09:40:11 +08001642 program->getTransformFeedbackVarying(index, bufSize, length, nullptr, nullptr, name);
jchen10fd7c3b52017-03-21 15:36:03 +08001643 break;
1644
1645 default:
1646 UNREACHABLE();
1647 }
1648}
1649
jchen10191381f2017-04-11 13:59:04 +08001650GLint QueryProgramResourceLocation(const Program *program,
1651 GLenum programInterface,
1652 const GLchar *name)
1653{
1654 switch (programInterface)
1655 {
1656 case GL_PROGRAM_INPUT:
1657 return program->getAttributeLocation(name);
1658
1659 case GL_PROGRAM_OUTPUT:
1660 return program->getFragDataLocation(name);
1661
jchen10191381f2017-04-11 13:59:04 +08001662 case GL_UNIFORM:
Olli Etuahod2551232017-10-26 20:03:33 +03001663 return program->getUniformLocation(name);
jchen10baf5d942017-08-28 20:45:48 +08001664
jchen10191381f2017-04-11 13:59:04 +08001665 default:
1666 UNREACHABLE();
1667 return -1;
1668 }
1669}
1670
jchen10880683b2017-04-12 16:21:55 +08001671void QueryProgramResourceiv(const Program *program,
1672 GLenum programInterface,
1673 GLuint index,
1674 GLsizei propCount,
1675 const GLenum *props,
1676 GLsizei bufSize,
1677 GLsizei *length,
1678 GLint *params)
1679{
1680 if (!program->isLinked())
1681 {
1682 if (length != nullptr)
1683 {
1684 *length = 0;
1685 }
1686 return;
1687 }
1688
jchen1058f67be2017-10-27 08:59:27 +08001689 GLsizei pos = 0;
1690 for (GLsizei i = 0; i < propCount; i++)
jchen10880683b2017-04-12 16:21:55 +08001691 {
1692 switch (programInterface)
1693 {
1694 case GL_PROGRAM_INPUT:
1695 params[i] = GetInputResourceProperty(program, index, props[i]);
jchen1058f67be2017-10-27 08:59:27 +08001696 ++pos;
jchen10880683b2017-04-12 16:21:55 +08001697 break;
1698
1699 case GL_PROGRAM_OUTPUT:
1700 params[i] = GetOutputResourceProperty(program, index, props[i]);
jchen1058f67be2017-10-27 08:59:27 +08001701 ++pos;
jchen10880683b2017-04-12 16:21:55 +08001702 break;
1703
jchen10880683b2017-04-12 16:21:55 +08001704 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001705 params[i] = GetUniformResourceProperty(program, index, props[i]);
jchen1058f67be2017-10-27 08:59:27 +08001706 ++pos;
1707 break;
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001708
1709 case GL_BUFFER_VARIABLE:
1710 params[i] = GetBufferVariableResourceProperty(program, index, props[i]);
1711 ++pos;
1712 break;
1713
jchen1058f67be2017-10-27 08:59:27 +08001714 case GL_UNIFORM_BLOCK:
1715 GetUniformBlockResourceProperty(program, index, props[i], params, bufSize, &pos);
jchen10baf5d942017-08-28 20:45:48 +08001716 break;
1717
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001718 case GL_SHADER_STORAGE_BLOCK:
1719 GetShaderStorageBlockResourceProperty(program, index, props[i], params, bufSize,
1720 &pos);
1721 break;
1722
jchen1058f67be2017-10-27 08:59:27 +08001723 case GL_ATOMIC_COUNTER_BUFFER:
1724 GetAtomicCounterBufferResourceProperty(program, index, props[i], params, bufSize,
1725 &pos);
1726 break;
jchen10910a3da2017-11-15 09:40:11 +08001727
jchen10880683b2017-04-12 16:21:55 +08001728 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10910a3da2017-11-15 09:40:11 +08001729 params[i] = GetTransformFeedbackVaryingResourceProperty(program, index, props[i]);
1730 ++pos;
jchen10880683b2017-04-12 16:21:55 +08001731 break;
1732
1733 default:
1734 UNREACHABLE();
1735 params[i] = GL_INVALID_VALUE;
1736 }
jchen1058f67be2017-10-27 08:59:27 +08001737 if (pos == bufSize)
1738 {
1739 // Most properties return one value, but GL_ACTIVE_VARIABLES returns an array of values.
1740 // This checks not to break buffer bounds for such case.
1741 break;
1742 }
1743 }
1744
1745 if (length != nullptr)
1746 {
1747 *length = pos;
jchen10880683b2017-04-12 16:21:55 +08001748 }
1749}
1750
jchen10d9cd7b72017-08-30 15:04:25 +08001751void QueryProgramInterfaceiv(const Program *program,
1752 GLenum programInterface,
1753 GLenum pname,
1754 GLint *params)
1755{
1756 switch (pname)
1757 {
1758 case GL_ACTIVE_RESOURCES:
1759 *params = QueryProgramInterfaceActiveResources(program, programInterface);
1760 break;
1761
1762 case GL_MAX_NAME_LENGTH:
1763 *params = QueryProgramInterfaceMaxNameLength(program, programInterface);
1764 break;
1765
1766 case GL_MAX_NUM_ACTIVE_VARIABLES:
1767 *params = QueryProgramInterfaceMaxNumActiveVariables(program, programInterface);
1768 break;
1769
1770 default:
1771 UNREACHABLE();
1772 }
1773}
1774
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001775ClientVertexArrayType ParamToVertexArrayType(GLenum param)
1776{
1777 switch (param)
1778 {
1779 case GL_VERTEX_ARRAY:
1780 case GL_VERTEX_ARRAY_BUFFER_BINDING:
1781 case GL_VERTEX_ARRAY_STRIDE:
1782 case GL_VERTEX_ARRAY_SIZE:
1783 case GL_VERTEX_ARRAY_TYPE:
1784 case GL_VERTEX_ARRAY_POINTER:
1785 return ClientVertexArrayType::Vertex;
1786 case GL_NORMAL_ARRAY:
1787 case GL_NORMAL_ARRAY_BUFFER_BINDING:
1788 case GL_NORMAL_ARRAY_STRIDE:
1789 case GL_NORMAL_ARRAY_TYPE:
1790 case GL_NORMAL_ARRAY_POINTER:
1791 return ClientVertexArrayType::Normal;
1792 case GL_COLOR_ARRAY:
1793 case GL_COLOR_ARRAY_BUFFER_BINDING:
1794 case GL_COLOR_ARRAY_STRIDE:
1795 case GL_COLOR_ARRAY_SIZE:
1796 case GL_COLOR_ARRAY_TYPE:
1797 case GL_COLOR_ARRAY_POINTER:
1798 return ClientVertexArrayType::Color;
1799 case GL_POINT_SIZE_ARRAY_OES:
1800 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
1801 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
1802 case GL_POINT_SIZE_ARRAY_TYPE_OES:
1803 case GL_POINT_SIZE_ARRAY_POINTER_OES:
1804 return ClientVertexArrayType::PointSize;
1805 case GL_TEXTURE_COORD_ARRAY:
1806 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
1807 case GL_TEXTURE_COORD_ARRAY_STRIDE:
1808 case GL_TEXTURE_COORD_ARRAY_SIZE:
1809 case GL_TEXTURE_COORD_ARRAY_TYPE:
1810 case GL_TEXTURE_COORD_ARRAY_POINTER:
1811 return ClientVertexArrayType::TextureCoord;
1812 default:
1813 UNREACHABLE();
1814 return ClientVertexArrayType::InvalidEnum;
1815 }
1816}
1817
Lingfeng Yangd0febe72018-05-17 22:36:52 -07001818void SetLightModelParameters(GLES1State *state, GLenum pname, const GLfloat *params)
1819{
1820 LightModelParameters &lightModel = state->lightModelParameters();
1821
1822 switch (pname)
1823 {
1824 case GL_LIGHT_MODEL_AMBIENT:
1825 lightModel.color = ColorF::fromData(params);
1826 break;
1827 case GL_LIGHT_MODEL_TWO_SIDE:
1828 lightModel.twoSided = *params == 1.0f ? true : false;
1829 break;
1830 default:
1831 break;
1832 }
1833}
1834
1835void GetLightModelParameters(const GLES1State *state, GLenum pname, GLfloat *params)
1836{
1837 const LightModelParameters &lightModel = state->lightModelParameters();
1838
1839 switch (pname)
1840 {
1841 case GL_LIGHT_MODEL_TWO_SIDE:
1842 *params = lightModel.twoSided ? 1.0f : 0.0f;
1843 break;
1844 case GL_LIGHT_MODEL_AMBIENT:
1845 lightModel.color.writeData(params);
1846 break;
1847 default:
1848 break;
1849 }
1850}
1851
1852bool IsLightModelTwoSided(const GLES1State *state)
1853{
1854 return state->lightModelParameters().twoSided;
1855}
1856
1857void SetLightParameters(GLES1State *state,
1858 GLenum light,
1859 LightParameter pname,
1860 const GLfloat *params)
1861{
1862 uint32_t lightIndex = light - GL_LIGHT0;
1863
1864 LightParameters &lightParams = state->lightParameters(lightIndex);
1865
1866 switch (pname)
1867 {
1868 case LightParameter::Ambient:
1869 lightParams.ambient = ColorF::fromData(params);
1870 break;
1871 case LightParameter::Diffuse:
1872 lightParams.diffuse = ColorF::fromData(params);
1873 break;
1874 case LightParameter::Specular:
1875 lightParams.specular = ColorF::fromData(params);
1876 break;
1877 case LightParameter::Position:
1878 {
1879 angle::Mat4 mv = state->getModelviewMatrix();
1880 angle::Vector4 transformedPos =
1881 mv.product(angle::Vector4(params[0], params[1], params[2], params[3]));
1882 lightParams.position[0] = transformedPos[0];
1883 lightParams.position[1] = transformedPos[1];
1884 lightParams.position[2] = transformedPos[2];
1885 lightParams.position[3] = transformedPos[3];
1886 }
1887 break;
1888 case LightParameter::SpotDirection:
1889 {
1890 angle::Mat4 mv = state->getModelviewMatrix();
1891 angle::Vector4 transformedPos =
1892 mv.product(angle::Vector4(params[0], params[1], params[2], 0.0f));
1893 lightParams.direction[0] = transformedPos[0];
1894 lightParams.direction[1] = transformedPos[1];
1895 lightParams.direction[2] = transformedPos[2];
1896 }
1897 break;
1898 case LightParameter::SpotExponent:
1899 lightParams.spotlightExponent = *params;
1900 break;
1901 case LightParameter::SpotCutoff:
1902 lightParams.spotlightCutoffAngle = *params;
1903 break;
1904 case LightParameter::ConstantAttenuation:
1905 lightParams.attenuationConst = *params;
1906 break;
1907 case LightParameter::LinearAttenuation:
1908 lightParams.attenuationLinear = *params;
1909 break;
1910 case LightParameter::QuadraticAttenuation:
1911 lightParams.attenuationQuadratic = *params;
1912 break;
1913 default:
1914 return;
1915 }
1916}
1917
1918void GetLightParameters(const GLES1State *state,
1919 GLenum light,
1920 LightParameter pname,
1921 GLfloat *params)
1922{
1923 uint32_t lightIndex = light - GL_LIGHT0;
1924 const LightParameters &lightParams = state->lightParameters(lightIndex);
1925
1926 switch (pname)
1927 {
1928 case LightParameter::Ambient:
1929 lightParams.ambient.writeData(params);
1930 break;
1931 case LightParameter::Diffuse:
1932 lightParams.diffuse.writeData(params);
1933 break;
1934 case LightParameter::Specular:
1935 lightParams.specular.writeData(params);
1936 break;
1937 case LightParameter::Position:
1938 memcpy(params, lightParams.position.data(), 4 * sizeof(GLfloat));
1939 break;
1940 case LightParameter::SpotDirection:
1941 memcpy(params, lightParams.direction.data(), 3 * sizeof(GLfloat));
1942 break;
1943 case LightParameter::SpotExponent:
1944 *params = lightParams.spotlightExponent;
1945 break;
1946 case LightParameter::SpotCutoff:
1947 *params = lightParams.spotlightCutoffAngle;
1948 break;
1949 case LightParameter::ConstantAttenuation:
1950 *params = lightParams.attenuationConst;
1951 break;
1952 case LightParameter::LinearAttenuation:
1953 *params = lightParams.attenuationLinear;
1954 break;
1955 case LightParameter::QuadraticAttenuation:
1956 *params = lightParams.attenuationQuadratic;
1957 break;
1958 default:
1959 break;
1960 }
1961}
1962
1963void SetMaterialParameters(GLES1State *state,
1964 GLenum face,
1965 MaterialParameter pname,
1966 const GLfloat *params)
1967{
1968 MaterialParameters &material = state->materialParameters();
1969 switch (pname)
1970 {
1971 case MaterialParameter::Ambient:
1972 material.ambient = ColorF::fromData(params);
1973 break;
1974 case MaterialParameter::Diffuse:
1975 material.diffuse = ColorF::fromData(params);
1976 break;
1977 case MaterialParameter::AmbientAndDiffuse:
1978 material.ambient = ColorF::fromData(params);
1979 material.diffuse = ColorF::fromData(params);
1980 break;
1981 case MaterialParameter::Specular:
1982 material.specular = ColorF::fromData(params);
1983 break;
1984 case MaterialParameter::Emission:
1985 material.emissive = ColorF::fromData(params);
1986 break;
1987 case MaterialParameter::Shininess:
1988 material.specularExponent = *params;
1989 break;
1990 default:
1991 return;
1992 }
1993}
1994
1995void GetMaterialParameters(const GLES1State *state,
1996 GLenum face,
1997 MaterialParameter pname,
1998 GLfloat *params)
1999{
2000 const ColorF &currentColor = state->getCurrentColor();
2001 const MaterialParameters &material = state->materialParameters();
2002 const bool colorMaterialEnabled = state->isColorMaterialEnabled();
2003
2004 switch (pname)
2005 {
2006 case MaterialParameter::Ambient:
2007 if (colorMaterialEnabled)
2008 {
2009 currentColor.writeData(params);
2010 }
2011 else
2012 {
2013 material.ambient.writeData(params);
2014 }
2015 break;
2016 case MaterialParameter::Diffuse:
2017 if (colorMaterialEnabled)
2018 {
2019 currentColor.writeData(params);
2020 }
2021 else
2022 {
2023 material.diffuse.writeData(params);
2024 }
2025 break;
2026 case MaterialParameter::Specular:
2027 material.specular.writeData(params);
2028 break;
2029 case MaterialParameter::Emission:
2030 material.emissive.writeData(params);
2031 break;
2032 case MaterialParameter::Shininess:
2033 *params = material.specularExponent;
2034 break;
2035 default:
2036 return;
2037 }
2038}
2039
2040unsigned int GetLightModelParameterCount(GLenum pname)
2041{
2042 switch (pname)
2043 {
2044 case GL_LIGHT_MODEL_AMBIENT:
2045 return 4;
2046 case GL_LIGHT_MODEL_TWO_SIDE:
2047 return 1;
2048 default:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07002049 return 0;
2050 }
2051}
2052
2053unsigned int GetLightParameterCount(LightParameter pname)
2054{
2055 switch (pname)
2056 {
2057 case LightParameter::Ambient:
2058 case LightParameter::Diffuse:
2059 case LightParameter::Specular:
2060 case LightParameter::Position:
2061 return 4;
2062 case LightParameter::SpotDirection:
2063 return 3;
2064 case LightParameter::SpotExponent:
2065 case LightParameter::SpotCutoff:
2066 case LightParameter::ConstantAttenuation:
2067 case LightParameter::LinearAttenuation:
2068 case LightParameter::QuadraticAttenuation:
2069 return 1;
2070 default:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07002071 return 0;
2072 }
2073}
2074
2075unsigned int GetMaterialParameterCount(MaterialParameter pname)
2076{
2077 switch (pname)
2078 {
2079 case MaterialParameter::Ambient:
2080 case MaterialParameter::Diffuse:
2081 case MaterialParameter::Specular:
2082 case MaterialParameter::Emission:
2083 return 4;
2084 case MaterialParameter::Shininess:
2085 return 1;
2086 default:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07002087 return 0;
2088 }
2089}
2090
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07002091void SetFogParameters(GLES1State *state, GLenum pname, const GLfloat *params)
2092{
2093 FogParameters &fog = state->fogParameters();
2094 switch (pname)
2095 {
2096 case GL_FOG_MODE:
2097 fog.mode = FromGLenum<FogMode>(static_cast<GLenum>(params[0]));
2098 break;
2099 case GL_FOG_DENSITY:
2100 fog.density = params[0];
2101 break;
2102 case GL_FOG_START:
2103 fog.start = params[0];
2104 break;
2105 case GL_FOG_END:
2106 fog.end = params[0];
2107 break;
2108 case GL_FOG_COLOR:
2109 fog.color = ColorF::fromData(params);
2110 break;
2111 default:
2112 return;
2113 }
2114}
2115
2116void GetFogParameters(const GLES1State *state, GLenum pname, GLfloat *params)
2117{
2118 const FogParameters &fog = state->fogParameters();
2119 switch (pname)
2120 {
2121 case GL_FOG_MODE:
2122 params[0] = static_cast<GLfloat>(ToGLenum(fog.mode));
2123 break;
2124 case GL_FOG_DENSITY:
2125 params[0] = fog.density;
2126 break;
2127 case GL_FOG_START:
2128 params[0] = fog.start;
2129 break;
2130 case GL_FOG_END:
2131 params[0] = fog.end;
2132 break;
2133 case GL_FOG_COLOR:
2134 fog.color.writeData(params);
2135 break;
2136 default:
2137 return;
2138 }
2139}
2140
2141unsigned int GetFogParameterCount(GLenum pname)
2142{
2143 switch (pname)
2144 {
2145 case GL_FOG_MODE:
2146 case GL_FOG_DENSITY:
2147 case GL_FOG_START:
2148 case GL_FOG_END:
2149 return 1;
2150 case GL_FOG_COLOR:
2151 return 4;
2152 default:
2153 return 0;
2154 }
2155}
2156
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002157unsigned int GetTextureEnvParameterCount(TextureEnvParameter pname)
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07002158{
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002159 switch (pname)
2160 {
2161 case TextureEnvParameter::Mode:
2162 case TextureEnvParameter::CombineRgb:
2163 case TextureEnvParameter::CombineAlpha:
2164 case TextureEnvParameter::Src0Rgb:
2165 case TextureEnvParameter::Src1Rgb:
2166 case TextureEnvParameter::Src2Rgb:
2167 case TextureEnvParameter::Src0Alpha:
2168 case TextureEnvParameter::Src1Alpha:
2169 case TextureEnvParameter::Src2Alpha:
2170 case TextureEnvParameter::Op0Rgb:
2171 case TextureEnvParameter::Op1Rgb:
2172 case TextureEnvParameter::Op2Rgb:
2173 case TextureEnvParameter::Op0Alpha:
2174 case TextureEnvParameter::Op1Alpha:
2175 case TextureEnvParameter::Op2Alpha:
2176 case TextureEnvParameter::RgbScale:
2177 case TextureEnvParameter::AlphaScale:
2178 return 1;
2179 case TextureEnvParameter::Color:
2180 return 4;
2181 default:
2182 return 0;
2183 }
2184}
2185
2186void ConvertTextureEnvFromInt(TextureEnvParameter pname, const GLint *input, GLfloat *output)
2187{
2188 if (IsTextureEnvEnumParameter(pname))
2189 {
2190 ConvertGLenumValue(input[0], output);
2191 return;
2192 }
2193
2194 switch (pname)
2195 {
2196 case TextureEnvParameter::RgbScale:
2197 case TextureEnvParameter::AlphaScale:
2198 output[0] = static_cast<GLfloat>(input[0]);
2199 break;
2200 case TextureEnvParameter::Color:
2201 for (int i = 0; i < 4; i++)
2202 {
2203 output[i] = input[i] / 255.0f;
2204 }
2205 break;
2206 default:
2207 UNREACHABLE();
2208 break;
2209 }
2210}
2211
2212void ConvertTextureEnvFromFixed(TextureEnvParameter pname, const GLfixed *input, GLfloat *output)
2213{
2214 if (IsTextureEnvEnumParameter(pname))
2215 {
2216 ConvertGLenumValue(input[0], output);
2217 return;
2218 }
2219
2220 switch (pname)
2221 {
2222 case TextureEnvParameter::RgbScale:
2223 case TextureEnvParameter::AlphaScale:
2224 output[0] = FixedToFloat(input[0]);
2225 break;
2226 case TextureEnvParameter::Color:
2227 for (int i = 0; i < 4; i++)
2228 {
2229 output[i] = FixedToFloat(input[i]);
2230 }
2231 break;
2232 break;
2233 default:
2234 UNREACHABLE();
2235 break;
2236 }
2237}
2238
2239void ConvertTextureEnvToInt(TextureEnvParameter pname, const GLfloat *input, GLint *output)
2240{
2241 if (IsTextureEnvEnumParameter(pname))
2242 {
2243 ConvertGLenumValue(input[0], output);
2244 return;
2245 }
2246
2247 switch (pname)
2248 {
2249 case TextureEnvParameter::RgbScale:
2250 case TextureEnvParameter::AlphaScale:
2251 output[0] = static_cast<GLint>(input[0]);
2252 break;
2253 case TextureEnvParameter::Color:
2254 for (int i = 0; i < 4; i++)
2255 {
2256 output[i] = static_cast<GLint>(input[i] * 255.0f);
2257 }
2258 break;
2259 default:
2260 UNREACHABLE();
2261 break;
2262 }
2263}
2264
2265void ConvertTextureEnvToFixed(TextureEnvParameter pname, const GLfloat *input, GLfixed *output)
2266{
2267 if (IsTextureEnvEnumParameter(pname))
2268 {
2269 ConvertGLenumValue(input[0], output);
2270 return;
2271 }
2272
2273 switch (pname)
2274 {
2275 case TextureEnvParameter::RgbScale:
2276 case TextureEnvParameter::AlphaScale:
2277 output[0] = FloatToFixed(input[0]);
2278 break;
2279 case TextureEnvParameter::Color:
2280 for (int i = 0; i < 4; i++)
2281 {
2282 output[i] = FloatToFixed(input[i]);
2283 }
2284 break;
2285 default:
2286 UNREACHABLE();
2287 break;
2288 }
2289}
2290
2291void SetTextureEnv(unsigned int unit,
2292 GLES1State *state,
2293 TextureEnvTarget target,
2294 TextureEnvParameter pname,
2295 const GLfloat *params)
2296{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002297 TextureEnvironmentParameters &env = state->textureEnvironment(unit);
2298 GLenum asEnum = ConvertToGLenum(params[0]);
2299
2300 switch (target)
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002301 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002302 case TextureEnvTarget::Env:
2303 switch (pname)
2304 {
2305 case TextureEnvParameter::Mode:
2306 env.mode = FromGLenum<TextureEnvMode>(asEnum);
2307 break;
2308 case TextureEnvParameter::CombineRgb:
2309 env.combineRgb = FromGLenum<TextureCombine>(asEnum);
2310 break;
2311 case TextureEnvParameter::CombineAlpha:
2312 env.combineAlpha = FromGLenum<TextureCombine>(asEnum);
2313 break;
2314 case TextureEnvParameter::Src0Rgb:
2315 env.src0Rgb = FromGLenum<TextureSrc>(asEnum);
2316 break;
2317 case TextureEnvParameter::Src1Rgb:
2318 env.src1Rgb = FromGLenum<TextureSrc>(asEnum);
2319 break;
2320 case TextureEnvParameter::Src2Rgb:
2321 env.src2Rgb = FromGLenum<TextureSrc>(asEnum);
2322 break;
2323 case TextureEnvParameter::Src0Alpha:
2324 env.src0Alpha = FromGLenum<TextureSrc>(asEnum);
2325 break;
2326 case TextureEnvParameter::Src1Alpha:
2327 env.src1Alpha = FromGLenum<TextureSrc>(asEnum);
2328 break;
2329 case TextureEnvParameter::Src2Alpha:
2330 env.src2Alpha = FromGLenum<TextureSrc>(asEnum);
2331 break;
2332 case TextureEnvParameter::Op0Rgb:
2333 env.op0Rgb = FromGLenum<TextureOp>(asEnum);
2334 break;
2335 case TextureEnvParameter::Op1Rgb:
2336 env.op1Rgb = FromGLenum<TextureOp>(asEnum);
2337 break;
2338 case TextureEnvParameter::Op2Rgb:
2339 env.op2Rgb = FromGLenum<TextureOp>(asEnum);
2340 break;
2341 case TextureEnvParameter::Op0Alpha:
2342 env.op0Alpha = FromGLenum<TextureOp>(asEnum);
2343 break;
2344 case TextureEnvParameter::Op1Alpha:
2345 env.op1Alpha = FromGLenum<TextureOp>(asEnum);
2346 break;
2347 case TextureEnvParameter::Op2Alpha:
2348 env.op2Alpha = FromGLenum<TextureOp>(asEnum);
2349 break;
2350 case TextureEnvParameter::Color:
2351 env.color = ColorF::fromData(params);
2352 break;
2353 case TextureEnvParameter::RgbScale:
2354 env.rgbScale = params[0];
2355 break;
2356 case TextureEnvParameter::AlphaScale:
2357 env.alphaScale = params[0];
2358 break;
2359 default:
2360 UNREACHABLE();
2361 break;
2362 }
2363 break;
2364 case TextureEnvTarget::PointSprite:
2365 switch (pname)
2366 {
2367 case TextureEnvParameter::PointCoordReplace:
2368 env.pointSpriteCoordReplace = static_cast<bool>(params[0]);
2369 break;
2370 default:
2371 UNREACHABLE();
2372 break;
2373 }
2374 break;
2375 default:
2376 UNREACHABLE();
2377 break;
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002378 }
2379}
2380
2381void GetTextureEnv(unsigned int unit,
2382 const GLES1State *state,
2383 TextureEnvTarget target,
2384 TextureEnvParameter pname,
2385 GLfloat *params)
2386{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002387 const TextureEnvironmentParameters &env = state->textureEnvironment(unit);
2388
2389 switch (target)
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002390 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002391 case TextureEnvTarget::Env:
2392 switch (pname)
2393 {
2394 case TextureEnvParameter::Mode:
2395 ConvertPackedEnum(env.mode, params);
2396 break;
2397 case TextureEnvParameter::CombineRgb:
2398 ConvertPackedEnum(env.combineRgb, params);
2399 break;
2400 case TextureEnvParameter::CombineAlpha:
2401 ConvertPackedEnum(env.combineAlpha, params);
2402 break;
2403 case TextureEnvParameter::Src0Rgb:
2404 ConvertPackedEnum(env.src0Rgb, params);
2405 break;
2406 case TextureEnvParameter::Src1Rgb:
2407 ConvertPackedEnum(env.src1Rgb, params);
2408 break;
2409 case TextureEnvParameter::Src2Rgb:
2410 ConvertPackedEnum(env.src2Rgb, params);
2411 break;
2412 case TextureEnvParameter::Src0Alpha:
2413 ConvertPackedEnum(env.src0Alpha, params);
2414 break;
2415 case TextureEnvParameter::Src1Alpha:
2416 ConvertPackedEnum(env.src1Alpha, params);
2417 break;
2418 case TextureEnvParameter::Src2Alpha:
2419 ConvertPackedEnum(env.src2Alpha, params);
2420 break;
2421 case TextureEnvParameter::Op0Rgb:
2422 ConvertPackedEnum(env.op0Rgb, params);
2423 break;
2424 case TextureEnvParameter::Op1Rgb:
2425 ConvertPackedEnum(env.op1Rgb, params);
2426 break;
2427 case TextureEnvParameter::Op2Rgb:
2428 ConvertPackedEnum(env.op2Rgb, params);
2429 break;
2430 case TextureEnvParameter::Op0Alpha:
2431 ConvertPackedEnum(env.op0Alpha, params);
2432 break;
2433 case TextureEnvParameter::Op1Alpha:
2434 ConvertPackedEnum(env.op1Alpha, params);
2435 break;
2436 case TextureEnvParameter::Op2Alpha:
2437 ConvertPackedEnum(env.op2Alpha, params);
2438 break;
2439 case TextureEnvParameter::Color:
2440 env.color.writeData(params);
2441 break;
2442 case TextureEnvParameter::RgbScale:
2443 *params = env.rgbScale;
2444 break;
2445 case TextureEnvParameter::AlphaScale:
2446 *params = env.alphaScale;
2447 break;
2448 default:
2449 UNREACHABLE();
2450 break;
2451 }
2452 break;
2453 case TextureEnvTarget::PointSprite:
2454 switch (pname)
2455 {
2456 case TextureEnvParameter::PointCoordReplace:
2457 *params = static_cast<GLfloat>(env.pointSpriteCoordReplace);
2458 break;
2459 default:
2460 UNREACHABLE();
2461 break;
2462 }
2463 break;
2464 default:
2465 UNREACHABLE();
2466 break;
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002467 }
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002468}
2469
2470unsigned int GetPointParameterCount(PointParameter pname)
2471{
2472 switch (pname)
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002473 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002474 case PointParameter::PointSizeMin:
2475 case PointParameter::PointSizeMax:
2476 case PointParameter::PointFadeThresholdSize:
2477 return 1;
2478 case PointParameter::PointDistanceAttenuation:
2479 return 3;
2480 default:
2481 return 0;
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002482 }
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07002483}
2484
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002485void SetPointParameter(GLES1State *state, PointParameter pname, const GLfloat *params)
2486{
2487
2488 PointParameters &pointParams = state->pointParameters();
2489
2490 switch (pname)
2491 {
2492 case PointParameter::PointSizeMin:
2493 pointParams.pointSizeMin = params[0];
2494 break;
2495 case PointParameter::PointSizeMax:
2496 pointParams.pointSizeMax = params[0];
2497 break;
2498 case PointParameter::PointFadeThresholdSize:
2499 pointParams.pointFadeThresholdSize = params[0];
2500 break;
2501 case PointParameter::PointDistanceAttenuation:
2502 for (unsigned int i = 0; i < 3; i++)
2503 {
2504 pointParams.pointDistanceAttenuation[i] = params[i];
2505 }
2506 break;
2507 default:
2508 UNREACHABLE();
2509 }
2510}
2511
2512void GetPointParameter(const GLES1State *state, PointParameter pname, GLfloat *params)
2513{
2514 const PointParameters &pointParams = state->pointParameters();
2515
2516 switch (pname)
2517 {
2518 case PointParameter::PointSizeMin:
2519 params[0] = pointParams.pointSizeMin;
2520 break;
2521 case PointParameter::PointSizeMax:
2522 params[0] = pointParams.pointSizeMax;
2523 break;
2524 case PointParameter::PointFadeThresholdSize:
2525 params[0] = pointParams.pointFadeThresholdSize;
2526 break;
2527 case PointParameter::PointDistanceAttenuation:
2528 for (unsigned int i = 0; i < 3; i++)
2529 {
2530 params[i] = pointParams.pointDistanceAttenuation[i];
2531 }
2532 break;
2533 default:
2534 UNREACHABLE();
2535 }
2536}
2537
2538void SetPointSize(GLES1State *state, GLfloat size)
2539{
2540 PointParameters &params = state->pointParameters();
2541 params.pointSize = size;
2542}
2543
2544void GetPointSize(GLES1State *state, GLfloat *sizeOut)
2545{
2546 const PointParameters &params = state->pointParameters();
2547 *sizeOut = params.pointSize;
2548}
2549
Lingfeng Yangf97641c2018-06-21 19:22:45 -07002550unsigned int GetTexParameterCount(GLenum pname)
2551{
2552 switch (pname)
2553 {
2554 case GL_TEXTURE_CROP_RECT_OES:
2555 return 4;
2556 case GL_TEXTURE_MAG_FILTER:
2557 case GL_TEXTURE_MIN_FILTER:
2558 case GL_TEXTURE_WRAP_S:
2559 case GL_TEXTURE_WRAP_T:
2560 case GL_TEXTURE_USAGE_ANGLE:
2561 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
2562 case GL_TEXTURE_IMMUTABLE_FORMAT:
2563 case GL_TEXTURE_WRAP_R:
2564 case GL_TEXTURE_IMMUTABLE_LEVELS:
2565 case GL_TEXTURE_SWIZZLE_R:
2566 case GL_TEXTURE_SWIZZLE_G:
2567 case GL_TEXTURE_SWIZZLE_B:
2568 case GL_TEXTURE_SWIZZLE_A:
2569 case GL_TEXTURE_BASE_LEVEL:
2570 case GL_TEXTURE_MAX_LEVEL:
2571 case GL_TEXTURE_MIN_LOD:
2572 case GL_TEXTURE_MAX_LOD:
2573 case GL_TEXTURE_COMPARE_MODE:
2574 case GL_TEXTURE_COMPARE_FUNC:
2575 case GL_TEXTURE_SRGB_DECODE_EXT:
2576 case GL_DEPTH_STENCIL_TEXTURE_MODE:
2577 return 1;
2578 default:
2579 return 0;
2580 }
2581}
2582
Geoff Lang65603eb2017-01-12 16:48:03 -05002583} // namespace gl
2584
2585namespace egl
2586{
2587
2588void QueryConfigAttrib(const Config *config, EGLint attribute, EGLint *value)
2589{
2590 ASSERT(config != nullptr);
2591 switch (attribute)
2592 {
2593 case EGL_BUFFER_SIZE:
2594 *value = config->bufferSize;
2595 break;
2596 case EGL_ALPHA_SIZE:
2597 *value = config->alphaSize;
2598 break;
2599 case EGL_BLUE_SIZE:
2600 *value = config->blueSize;
2601 break;
2602 case EGL_GREEN_SIZE:
2603 *value = config->greenSize;
2604 break;
2605 case EGL_RED_SIZE:
2606 *value = config->redSize;
2607 break;
2608 case EGL_DEPTH_SIZE:
2609 *value = config->depthSize;
2610 break;
2611 case EGL_STENCIL_SIZE:
2612 *value = config->stencilSize;
2613 break;
2614 case EGL_CONFIG_CAVEAT:
2615 *value = config->configCaveat;
2616 break;
2617 case EGL_CONFIG_ID:
2618 *value = config->configID;
2619 break;
2620 case EGL_LEVEL:
2621 *value = config->level;
2622 break;
2623 case EGL_NATIVE_RENDERABLE:
2624 *value = config->nativeRenderable;
2625 break;
2626 case EGL_NATIVE_VISUAL_ID:
2627 *value = config->nativeVisualID;
2628 break;
2629 case EGL_NATIVE_VISUAL_TYPE:
2630 *value = config->nativeVisualType;
2631 break;
2632 case EGL_SAMPLES:
2633 *value = config->samples;
2634 break;
2635 case EGL_SAMPLE_BUFFERS:
2636 *value = config->sampleBuffers;
2637 break;
2638 case EGL_SURFACE_TYPE:
2639 *value = config->surfaceType;
2640 break;
2641 case EGL_TRANSPARENT_TYPE:
2642 *value = config->transparentType;
2643 break;
2644 case EGL_TRANSPARENT_BLUE_VALUE:
2645 *value = config->transparentBlueValue;
2646 break;
2647 case EGL_TRANSPARENT_GREEN_VALUE:
2648 *value = config->transparentGreenValue;
2649 break;
2650 case EGL_TRANSPARENT_RED_VALUE:
2651 *value = config->transparentRedValue;
2652 break;
2653 case EGL_BIND_TO_TEXTURE_RGB:
2654 *value = config->bindToTextureRGB;
2655 break;
2656 case EGL_BIND_TO_TEXTURE_RGBA:
2657 *value = config->bindToTextureRGBA;
2658 break;
2659 case EGL_MIN_SWAP_INTERVAL:
2660 *value = config->minSwapInterval;
2661 break;
2662 case EGL_MAX_SWAP_INTERVAL:
2663 *value = config->maxSwapInterval;
2664 break;
2665 case EGL_LUMINANCE_SIZE:
2666 *value = config->luminanceSize;
2667 break;
2668 case EGL_ALPHA_MASK_SIZE:
2669 *value = config->alphaMaskSize;
2670 break;
2671 case EGL_COLOR_BUFFER_TYPE:
2672 *value = config->colorBufferType;
2673 break;
2674 case EGL_RENDERABLE_TYPE:
2675 *value = config->renderableType;
2676 break;
2677 case EGL_MATCH_NATIVE_PIXMAP:
2678 *value = false;
2679 UNIMPLEMENTED();
2680 break;
2681 case EGL_CONFORMANT:
2682 *value = config->conformant;
2683 break;
2684 case EGL_MAX_PBUFFER_WIDTH:
2685 *value = config->maxPBufferWidth;
2686 break;
2687 case EGL_MAX_PBUFFER_HEIGHT:
2688 *value = config->maxPBufferHeight;
2689 break;
2690 case EGL_MAX_PBUFFER_PIXELS:
2691 *value = config->maxPBufferPixels;
2692 break;
2693 case EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE:
2694 *value = config->optimalOrientation;
2695 break;
Geoff Langc5a2a172017-01-13 15:55:07 -05002696 case EGL_COLOR_COMPONENT_TYPE_EXT:
2697 *value = config->colorComponentType;
2698 break;
Geoff Lang65603eb2017-01-12 16:48:03 -05002699 default:
2700 UNREACHABLE();
2701 break;
2702 }
Geoff Langff5b2d52016-09-07 11:32:23 -04002703}
Geoff Lang65603eb2017-01-12 16:48:03 -05002704
Geoff Langaf143fe2017-10-05 13:59:43 -04002705void QueryContextAttrib(const gl::Context *context, EGLint attribute, EGLint *value)
2706{
2707 switch (attribute)
2708 {
2709 case EGL_CONFIG_ID:
2710 *value = context->getConfig()->configID;
2711 break;
2712 case EGL_CONTEXT_CLIENT_TYPE:
2713 *value = context->getClientType();
2714 break;
2715 case EGL_CONTEXT_CLIENT_VERSION:
2716 *value = context->getClientMajorVersion();
2717 break;
2718 case EGL_RENDER_BUFFER:
2719 *value = context->getRenderBuffer();
2720 break;
Geoff Langb433e872017-10-05 14:01:47 -04002721 case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
2722 *value = context->isRobustResourceInitEnabled();
2723 break;
Geoff Langaf143fe2017-10-05 13:59:43 -04002724 default:
2725 UNREACHABLE();
2726 break;
2727 }
2728}
2729
Geoff Lang31ecbd72017-07-26 13:01:27 -04002730void QuerySurfaceAttrib(const Surface *surface, EGLint attribute, EGLint *value)
2731{
2732 switch (attribute)
2733 {
2734 case EGL_GL_COLORSPACE:
Geoff Lang40ac7832017-07-26 14:38:46 -04002735 *value = surface->getGLColorspace();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002736 break;
2737 case EGL_VG_ALPHA_FORMAT:
Geoff Lang40ac7832017-07-26 14:38:46 -04002738 *value = surface->getVGAlphaFormat();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002739 break;
2740 case EGL_VG_COLORSPACE:
Geoff Lang40ac7832017-07-26 14:38:46 -04002741 *value = surface->getVGColorspace();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002742 break;
2743 case EGL_CONFIG_ID:
2744 *value = surface->getConfig()->configID;
2745 break;
2746 case EGL_HEIGHT:
2747 *value = surface->getHeight();
2748 break;
2749 case EGL_HORIZONTAL_RESOLUTION:
Geoff Lang40ac7832017-07-26 14:38:46 -04002750 *value = surface->getHorizontalResolution();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002751 break;
2752 case EGL_LARGEST_PBUFFER:
Geoff Lang40ac7832017-07-26 14:38:46 -04002753 // The EGL spec states that value is not written if the surface is not a pbuffer
2754 if (surface->getType() == EGL_PBUFFER_BIT)
2755 {
2756 *value = surface->getLargestPbuffer();
2757 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04002758 break;
2759 case EGL_MIPMAP_TEXTURE:
Geoff Lang40ac7832017-07-26 14:38:46 -04002760 // The EGL spec states that value is not written if the surface is not a pbuffer
2761 if (surface->getType() == EGL_PBUFFER_BIT)
2762 {
2763 *value = surface->getMipmapTexture();
2764 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04002765 break;
2766 case EGL_MIPMAP_LEVEL:
Geoff Lang40ac7832017-07-26 14:38:46 -04002767 // The EGL spec states that value is not written if the surface is not a pbuffer
2768 if (surface->getType() == EGL_PBUFFER_BIT)
2769 {
2770 *value = surface->getMipmapLevel();
2771 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04002772 break;
2773 case EGL_MULTISAMPLE_RESOLVE:
Geoff Lang40ac7832017-07-26 14:38:46 -04002774 *value = surface->getMultisampleResolve();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002775 break;
2776 case EGL_PIXEL_ASPECT_RATIO:
2777 *value = surface->getPixelAspectRatio();
2778 break;
2779 case EGL_RENDER_BUFFER:
2780 *value = surface->getRenderBuffer();
2781 break;
2782 case EGL_SWAP_BEHAVIOR:
2783 *value = surface->getSwapBehavior();
2784 break;
2785 case EGL_TEXTURE_FORMAT:
Geoff Lang40ac7832017-07-26 14:38:46 -04002786 // The EGL spec states that value is not written if the surface is not a pbuffer
2787 if (surface->getType() == EGL_PBUFFER_BIT)
2788 {
Geoff Lang8ceea812018-04-10 03:07:13 -04002789 *value = ToEGLenum(surface->getTextureFormat());
Geoff Lang40ac7832017-07-26 14:38:46 -04002790 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04002791 break;
2792 case EGL_TEXTURE_TARGET:
Geoff Lang40ac7832017-07-26 14:38:46 -04002793 // The EGL spec states that value is not written if the surface is not a pbuffer
2794 if (surface->getType() == EGL_PBUFFER_BIT)
2795 {
2796 *value = surface->getTextureTarget();
2797 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04002798 break;
2799 case EGL_VERTICAL_RESOLUTION:
Geoff Lang40ac7832017-07-26 14:38:46 -04002800 *value = surface->getVerticalResolution();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002801 break;
2802 case EGL_WIDTH:
2803 *value = surface->getWidth();
2804 break;
2805 case EGL_POST_SUB_BUFFER_SUPPORTED_NV:
2806 *value = surface->isPostSubBufferSupported();
2807 break;
2808 case EGL_FIXED_SIZE_ANGLE:
2809 *value = surface->isFixedSize();
2810 break;
2811 case EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE:
2812 *value = surface->flexibleSurfaceCompatibilityRequested();
2813 break;
2814 case EGL_SURFACE_ORIENTATION_ANGLE:
2815 *value = surface->getOrientation();
2816 break;
2817 case EGL_DIRECT_COMPOSITION_ANGLE:
2818 *value = surface->directComposition();
2819 break;
Geoff Langb433e872017-10-05 14:01:47 -04002820 case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
2821 *value = surface->isRobustResourceInitEnabled();
2822 break;
Geoff Lang31ecbd72017-07-26 13:01:27 -04002823 default:
2824 UNREACHABLE();
2825 break;
2826 }
2827}
2828
2829void SetSurfaceAttrib(Surface *surface, EGLint attribute, EGLint value)
2830{
2831 switch (attribute)
2832 {
2833 case EGL_MIPMAP_LEVEL:
Geoff Lang40ac7832017-07-26 14:38:46 -04002834 surface->setMipmapLevel(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04002835 break;
2836 case EGL_MULTISAMPLE_RESOLVE:
Geoff Lang40ac7832017-07-26 14:38:46 -04002837 surface->setMultisampleResolve(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04002838 break;
2839 case EGL_SWAP_BEHAVIOR:
Geoff Lang40ac7832017-07-26 14:38:46 -04002840 surface->setSwapBehavior(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04002841 break;
LRN03d132e2018-07-14 13:31:35 +00002842 case EGL_WIDTH:
2843 surface->setFixedWidth(value);
2844 break;
2845 case EGL_HEIGHT:
2846 surface->setFixedHeight(value);
2847 break;
Geoff Lang31ecbd72017-07-26 13:01:27 -04002848 default:
2849 UNREACHABLE();
2850 break;
2851 }
2852}
2853
Geoff Lang65603eb2017-01-12 16:48:03 -05002854} // namespace egl