blob: a9aada0ca6abd22545d569fe6871f32e42ef4967 [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;
Geoff Lang79b91402018-10-04 15:11:30 -0400114 case GL_MEMORY_SIZE_ANGLE:
115 *params =
116 CastFromStateValue<ParamType>(pname, texture->getLevelMemorySize(target, level));
117 break;
He Yunchao11b038b2016-11-22 21:24:04 +0800118 default:
119 UNREACHABLE();
120 break;
121 }
122}
123
124template <typename ParamType>
Geoff Langc1984ed2016-10-07 12:41:00 -0400125void QueryTexParameterBase(const Texture *texture, GLenum pname, ParamType *params)
126{
127 ASSERT(texture != nullptr);
128
129 switch (pname)
130 {
131 case GL_TEXTURE_MAG_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800132 *params = CastFromGLintStateValue<ParamType>(pname, texture->getMagFilter());
Geoff Langc1984ed2016-10-07 12:41:00 -0400133 break;
134 case GL_TEXTURE_MIN_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800135 *params = CastFromGLintStateValue<ParamType>(pname, texture->getMinFilter());
Geoff Langc1984ed2016-10-07 12:41:00 -0400136 break;
137 case GL_TEXTURE_WRAP_S:
jchen10a99ed552017-09-22 08:10:32 +0800138 *params = CastFromGLintStateValue<ParamType>(pname, texture->getWrapS());
Geoff Langc1984ed2016-10-07 12:41:00 -0400139 break;
140 case GL_TEXTURE_WRAP_T:
jchen10a99ed552017-09-22 08:10:32 +0800141 *params = CastFromGLintStateValue<ParamType>(pname, texture->getWrapT());
Geoff Langc1984ed2016-10-07 12:41:00 -0400142 break;
143 case GL_TEXTURE_WRAP_R:
jchen10a99ed552017-09-22 08:10:32 +0800144 *params = CastFromGLintStateValue<ParamType>(pname, texture->getWrapR());
Geoff Langc1984ed2016-10-07 12:41:00 -0400145 break;
146 case GL_TEXTURE_IMMUTABLE_FORMAT:
jchen10a99ed552017-09-22 08:10:32 +0800147 *params = CastFromGLintStateValue<ParamType>(pname, texture->getImmutableFormat());
Geoff Langc1984ed2016-10-07 12:41:00 -0400148 break;
149 case GL_TEXTURE_IMMUTABLE_LEVELS:
jchen10a99ed552017-09-22 08:10:32 +0800150 *params = CastFromGLintStateValue<ParamType>(pname, texture->getImmutableLevels());
Geoff Langc1984ed2016-10-07 12:41:00 -0400151 break;
152 case GL_TEXTURE_USAGE_ANGLE:
jchen10a99ed552017-09-22 08:10:32 +0800153 *params = CastFromGLintStateValue<ParamType>(pname, texture->getUsage());
Geoff Langc1984ed2016-10-07 12:41:00 -0400154 break;
155 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800156 *params = CastFromStateValue<ParamType>(pname, texture->getMaxAnisotropy());
Geoff Langc1984ed2016-10-07 12:41:00 -0400157 break;
158 case GL_TEXTURE_SWIZZLE_R:
jchen10a99ed552017-09-22 08:10:32 +0800159 *params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleRed());
Geoff Langc1984ed2016-10-07 12:41:00 -0400160 break;
161 case GL_TEXTURE_SWIZZLE_G:
jchen10a99ed552017-09-22 08:10:32 +0800162 *params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleGreen());
Geoff Langc1984ed2016-10-07 12:41:00 -0400163 break;
164 case GL_TEXTURE_SWIZZLE_B:
jchen10a99ed552017-09-22 08:10:32 +0800165 *params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleBlue());
Geoff Langc1984ed2016-10-07 12:41:00 -0400166 break;
167 case GL_TEXTURE_SWIZZLE_A:
jchen10a99ed552017-09-22 08:10:32 +0800168 *params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleAlpha());
Geoff Langc1984ed2016-10-07 12:41:00 -0400169 break;
170 case GL_TEXTURE_BASE_LEVEL:
jchen10a99ed552017-09-22 08:10:32 +0800171 *params = CastFromGLintStateValue<ParamType>(pname, texture->getBaseLevel());
Geoff Langc1984ed2016-10-07 12:41:00 -0400172 break;
173 case GL_TEXTURE_MAX_LEVEL:
jchen10a99ed552017-09-22 08:10:32 +0800174 *params = CastFromGLintStateValue<ParamType>(pname, texture->getMaxLevel());
Geoff Langc1984ed2016-10-07 12:41:00 -0400175 break;
176 case GL_TEXTURE_MIN_LOD:
Jamie Madill097d3c02018-09-12 11:03:05 -0400177 *params = CastFromStateValue<ParamType>(pname, texture->getMinLod());
Geoff Langc1984ed2016-10-07 12:41:00 -0400178 break;
179 case GL_TEXTURE_MAX_LOD:
Jamie Madill097d3c02018-09-12 11:03:05 -0400180 *params = CastFromStateValue<ParamType>(pname, texture->getMaxLod());
Geoff Langc1984ed2016-10-07 12:41:00 -0400181 break;
182 case GL_TEXTURE_COMPARE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800183 *params = CastFromGLintStateValue<ParamType>(pname, texture->getCompareMode());
Geoff Langc1984ed2016-10-07 12:41:00 -0400184 break;
185 case GL_TEXTURE_COMPARE_FUNC:
jchen10a99ed552017-09-22 08:10:32 +0800186 *params = CastFromGLintStateValue<ParamType>(pname, texture->getCompareFunc());
Geoff Langc1984ed2016-10-07 12:41:00 -0400187 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700188 case GL_TEXTURE_SRGB_DECODE_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800189 *params = CastFromGLintStateValue<ParamType>(pname, texture->getSRGBDecode());
Geoff Lang81c6b572016-10-19 14:07:52 -0700190 break;
Yunchao Hebacaa712018-01-30 14:01:39 +0800191 case GL_DEPTH_STENCIL_TEXTURE_MODE:
192 *params =
193 CastFromGLintStateValue<ParamType>(pname, texture->getDepthStencilTextureMode());
194 break;
Lingfeng Yangf97641c2018-06-21 19:22:45 -0700195 case GL_TEXTURE_CROP_RECT_OES:
196 {
197 const gl::Rectangle &crop = texture->getCrop();
198 params[0] = CastFromGLintStateValue<ParamType>(pname, crop.x);
199 params[1] = CastFromGLintStateValue<ParamType>(pname, crop.y);
200 params[2] = CastFromGLintStateValue<ParamType>(pname, crop.width);
201 params[3] = CastFromGLintStateValue<ParamType>(pname, crop.height);
202 break;
203 }
204 case GL_GENERATE_MIPMAP:
205 *params = CastFromGLintStateValue<ParamType>(pname, texture->getGenerateMipmapHint());
206 break;
Geoff Lang79b91402018-10-04 15:11:30 -0400207 case GL_MEMORY_SIZE_ANGLE:
208 *params = CastFromStateValue<ParamType>(pname, texture->getMemorySize());
209 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400210 default:
211 UNREACHABLE();
212 break;
213 }
214}
215
216template <typename ParamType>
Jamie Madill4928b7c2017-06-20 12:57:39 -0400217void SetTexParameterBase(Context *context, Texture *texture, GLenum pname, const ParamType *params)
Geoff Langc1984ed2016-10-07 12:41:00 -0400218{
219 ASSERT(texture != nullptr);
220
221 switch (pname)
222 {
223 case GL_TEXTURE_WRAP_S:
jchen10a99ed552017-09-22 08:10:32 +0800224 texture->setWrapS(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400225 break;
226 case GL_TEXTURE_WRAP_T:
jchen10a99ed552017-09-22 08:10:32 +0800227 texture->setWrapT(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400228 break;
229 case GL_TEXTURE_WRAP_R:
jchen10a99ed552017-09-22 08:10:32 +0800230 texture->setWrapR(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400231 break;
232 case GL_TEXTURE_MIN_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800233 texture->setMinFilter(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400234 break;
235 case GL_TEXTURE_MAG_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800236 texture->setMagFilter(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400237 break;
238 case GL_TEXTURE_USAGE_ANGLE:
jchen10a99ed552017-09-22 08:10:32 +0800239 texture->setUsage(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400240 break;
241 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800242 texture->setMaxAnisotropy(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400243 break;
244 case GL_TEXTURE_COMPARE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800245 texture->setCompareMode(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400246 break;
247 case GL_TEXTURE_COMPARE_FUNC:
jchen10a99ed552017-09-22 08:10:32 +0800248 texture->setCompareFunc(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400249 break;
250 case GL_TEXTURE_SWIZZLE_R:
jchen10a99ed552017-09-22 08:10:32 +0800251 texture->setSwizzleRed(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400252 break;
253 case GL_TEXTURE_SWIZZLE_G:
jchen10a99ed552017-09-22 08:10:32 +0800254 texture->setSwizzleGreen(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400255 break;
256 case GL_TEXTURE_SWIZZLE_B:
jchen10a99ed552017-09-22 08:10:32 +0800257 texture->setSwizzleBlue(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400258 break;
259 case GL_TEXTURE_SWIZZLE_A:
jchen10a99ed552017-09-22 08:10:32 +0800260 texture->setSwizzleAlpha(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400261 break;
262 case GL_TEXTURE_BASE_LEVEL:
Jamie Madill4928b7c2017-06-20 12:57:39 -0400263 {
jchen10a99ed552017-09-22 08:10:32 +0800264 context->handleError(texture->setBaseLevel(
265 context, clampCast<GLuint>(CastQueryValueTo<GLint>(pname, params[0]))));
Geoff Langc1984ed2016-10-07 12:41:00 -0400266 break;
Jamie Madill4928b7c2017-06-20 12:57:39 -0400267 }
Geoff Langc1984ed2016-10-07 12:41:00 -0400268 case GL_TEXTURE_MAX_LEVEL:
jchen10a99ed552017-09-22 08:10:32 +0800269 texture->setMaxLevel(clampCast<GLuint>(CastQueryValueTo<GLint>(pname, params[0])));
Geoff Langc1984ed2016-10-07 12:41:00 -0400270 break;
271 case GL_TEXTURE_MIN_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800272 texture->setMinLod(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400273 break;
274 case GL_TEXTURE_MAX_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800275 texture->setMaxLod(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400276 break;
Geoff Lang3b573612016-10-31 14:08:10 -0400277 case GL_DEPTH_STENCIL_TEXTURE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800278 texture->setDepthStencilTextureMode(ConvertToGLenum(pname, params[0]));
Geoff Lang3b573612016-10-31 14:08:10 -0400279 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700280 case GL_TEXTURE_SRGB_DECODE_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800281 texture->setSRGBDecode(ConvertToGLenum(pname, params[0]));
Geoff Lang81c6b572016-10-19 14:07:52 -0700282 break;
Lingfeng Yangf97641c2018-06-21 19:22:45 -0700283 case GL_TEXTURE_CROP_RECT_OES:
284 texture->setCrop(gl::Rectangle(CastQueryValueTo<GLint>(pname, params[0]),
285 CastQueryValueTo<GLint>(pname, params[1]),
286 CastQueryValueTo<GLint>(pname, params[2]),
287 CastQueryValueTo<GLint>(pname, params[3])));
288 break;
289 case GL_GENERATE_MIPMAP:
290 texture->setGenerateMipmapHint(ConvertToGLenum(params[0]));
291 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400292 default:
293 UNREACHABLE();
294 break;
295 }
296}
297
298template <typename ParamType>
299void QuerySamplerParameterBase(const Sampler *sampler, GLenum pname, ParamType *params)
300{
301 switch (pname)
302 {
303 case GL_TEXTURE_MIN_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800304 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getMinFilter());
Geoff Langc1984ed2016-10-07 12:41:00 -0400305 break;
306 case GL_TEXTURE_MAG_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800307 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getMagFilter());
Geoff Langc1984ed2016-10-07 12:41:00 -0400308 break;
309 case GL_TEXTURE_WRAP_S:
jchen10a99ed552017-09-22 08:10:32 +0800310 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getWrapS());
Geoff Langc1984ed2016-10-07 12:41:00 -0400311 break;
312 case GL_TEXTURE_WRAP_T:
jchen10a99ed552017-09-22 08:10:32 +0800313 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getWrapT());
Geoff Langc1984ed2016-10-07 12:41:00 -0400314 break;
315 case GL_TEXTURE_WRAP_R:
jchen10a99ed552017-09-22 08:10:32 +0800316 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getWrapR());
Geoff Langc1984ed2016-10-07 12:41:00 -0400317 break;
318 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800319 *params = CastFromStateValue<ParamType>(pname, sampler->getMaxAnisotropy());
Geoff Langc1984ed2016-10-07 12:41:00 -0400320 break;
321 case GL_TEXTURE_MIN_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800322 *params = CastFromStateValue<ParamType>(pname, sampler->getMinLod());
Geoff Langc1984ed2016-10-07 12:41:00 -0400323 break;
324 case GL_TEXTURE_MAX_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800325 *params = CastFromStateValue<ParamType>(pname, sampler->getMaxLod());
Geoff Langc1984ed2016-10-07 12:41:00 -0400326 break;
327 case GL_TEXTURE_COMPARE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800328 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getCompareMode());
Geoff Langc1984ed2016-10-07 12:41:00 -0400329 break;
330 case GL_TEXTURE_COMPARE_FUNC:
jchen10a99ed552017-09-22 08:10:32 +0800331 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getCompareFunc());
Geoff Langc1984ed2016-10-07 12:41:00 -0400332 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700333 case GL_TEXTURE_SRGB_DECODE_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800334 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getSRGBDecode());
Geoff Lang81c6b572016-10-19 14:07:52 -0700335 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400336 default:
337 UNREACHABLE();
338 break;
339 }
340}
341
342template <typename ParamType>
Jamie Madille25b8002018-09-20 13:39:49 -0400343void SetSamplerParameterBase(Context *context,
344 Sampler *sampler,
345 GLenum pname,
346 const ParamType *params)
Geoff Langc1984ed2016-10-07 12:41:00 -0400347{
348 switch (pname)
349 {
350 case GL_TEXTURE_WRAP_S:
jchen10a99ed552017-09-22 08:10:32 +0800351 sampler->setWrapS(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400352 break;
353 case GL_TEXTURE_WRAP_T:
jchen10a99ed552017-09-22 08:10:32 +0800354 sampler->setWrapT(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400355 break;
356 case GL_TEXTURE_WRAP_R:
jchen10a99ed552017-09-22 08:10:32 +0800357 sampler->setWrapR(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400358 break;
359 case GL_TEXTURE_MIN_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800360 sampler->setMinFilter(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400361 break;
362 case GL_TEXTURE_MAG_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800363 sampler->setMagFilter(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400364 break;
365 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800366 sampler->setMaxAnisotropy(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400367 break;
368 case GL_TEXTURE_COMPARE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800369 sampler->setCompareMode(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400370 break;
371 case GL_TEXTURE_COMPARE_FUNC:
jchen10a99ed552017-09-22 08:10:32 +0800372 sampler->setCompareFunc(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400373 break;
374 case GL_TEXTURE_MIN_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800375 sampler->setMinLod(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400376 break;
377 case GL_TEXTURE_MAX_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800378 sampler->setMaxLod(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400379 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700380 case GL_TEXTURE_SRGB_DECODE_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800381 sampler->setSRGBDecode(ConvertToGLenum(pname, params[0]));
Geoff Lang81c6b572016-10-19 14:07:52 -0700382 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400383 default:
384 UNREACHABLE();
385 break;
386 }
Jamie Madille25b8002018-09-20 13:39:49 -0400387
388 sampler->onStateChange(context, angle::SubjectMessage::CONTENTS_CHANGED);
Geoff Langc1984ed2016-10-07 12:41:00 -0400389}
390
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800391// Warning: you should ensure binding really matches attrib.bindingIndex before using this function.
Geoff Lang0b031062016-10-13 14:30:04 -0400392template <typename ParamType, typename CurrentDataType, size_t CurrentValueCount>
393void QueryVertexAttribBase(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800394 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -0400395 const CurrentDataType (&currentValueData)[CurrentValueCount],
396 GLenum pname,
397 ParamType *params)
398{
399 switch (pname)
400 {
401 case GL_CURRENT_VERTEX_ATTRIB:
402 for (size_t i = 0; i < CurrentValueCount; ++i)
403 {
jchen10a99ed552017-09-22 08:10:32 +0800404 params[i] = CastFromStateValue<ParamType>(pname, currentValueData[i]);
Geoff Lang0b031062016-10-13 14:30:04 -0400405 }
406 break;
407 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
jchen10a99ed552017-09-22 08:10:32 +0800408 *params = CastFromStateValue<ParamType>(pname, static_cast<GLint>(attrib.enabled));
Geoff Lang0b031062016-10-13 14:30:04 -0400409 break;
410 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
jchen10a99ed552017-09-22 08:10:32 +0800411 *params = CastFromGLintStateValue<ParamType>(pname, attrib.size);
Geoff Lang0b031062016-10-13 14:30:04 -0400412 break;
413 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
jchen10a99ed552017-09-22 08:10:32 +0800414 *params = CastFromGLintStateValue<ParamType>(pname, attrib.vertexAttribArrayStride);
Geoff Lang0b031062016-10-13 14:30:04 -0400415 break;
416 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
jchen10a99ed552017-09-22 08:10:32 +0800417 *params = CastFromGLintStateValue<ParamType>(pname, attrib.type);
Geoff Lang0b031062016-10-13 14:30:04 -0400418 break;
419 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
jchen10a99ed552017-09-22 08:10:32 +0800420 *params = CastFromStateValue<ParamType>(pname, static_cast<GLint>(attrib.normalized));
Geoff Lang0b031062016-10-13 14:30:04 -0400421 break;
422 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
jchen10a99ed552017-09-22 08:10:32 +0800423 *params = CastFromGLintStateValue<ParamType>(pname, binding.getBuffer().id());
Geoff Lang0b031062016-10-13 14:30:04 -0400424 break;
425 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
Joonatan Saarhelobbd532d2018-10-10 17:40:26 +0300426 *params = CastFromStateValue<ParamType>(pname, binding.getDivisor());
Geoff Lang0b031062016-10-13 14:30:04 -0400427 break;
428 case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
jchen10a99ed552017-09-22 08:10:32 +0800429 *params = CastFromGLintStateValue<ParamType>(pname, attrib.pureInteger);
Geoff Lang0b031062016-10-13 14:30:04 -0400430 break;
Shao80957d92017-02-20 21:25:59 +0800431 case GL_VERTEX_ATTRIB_BINDING:
jchen10a99ed552017-09-22 08:10:32 +0800432 *params = CastFromGLintStateValue<ParamType>(pname, attrib.bindingIndex);
Shao80957d92017-02-20 21:25:59 +0800433 break;
434 case GL_VERTEX_ATTRIB_RELATIVE_OFFSET:
jchen10a99ed552017-09-22 08:10:32 +0800435 *params = CastFromGLintStateValue<ParamType>(pname, attrib.relativeOffset);
Shao80957d92017-02-20 21:25:59 +0800436 break;
Geoff Lang0b031062016-10-13 14:30:04 -0400437 default:
438 UNREACHABLE();
439 break;
440 }
441}
442
Geoff Langebebe1c2016-10-14 12:01:31 -0400443template <typename ParamType>
444void QueryBufferParameterBase(const Buffer *buffer, GLenum pname, ParamType *params)
445{
446 ASSERT(buffer != nullptr);
447
448 switch (pname)
449 {
450 case GL_BUFFER_USAGE:
Corentin Wallez2e568cf2017-09-18 17:05:22 -0400451 *params = CastFromGLintStateValue<ParamType>(pname, ToGLenum(buffer->getUsage()));
Geoff Langebebe1c2016-10-14 12:01:31 -0400452 break;
453 case GL_BUFFER_SIZE:
jchen10a99ed552017-09-22 08:10:32 +0800454 *params = CastFromStateValue<ParamType>(pname, buffer->getSize());
Geoff Langebebe1c2016-10-14 12:01:31 -0400455 break;
456 case GL_BUFFER_ACCESS_FLAGS:
jchen10a99ed552017-09-22 08:10:32 +0800457 *params = CastFromGLintStateValue<ParamType>(pname, buffer->getAccessFlags());
Geoff Langebebe1c2016-10-14 12:01:31 -0400458 break;
459 case GL_BUFFER_ACCESS_OES:
jchen10a99ed552017-09-22 08:10:32 +0800460 *params = CastFromGLintStateValue<ParamType>(pname, buffer->getAccess());
Geoff Langebebe1c2016-10-14 12:01:31 -0400461 break;
462 case GL_BUFFER_MAPPED:
jchen10a99ed552017-09-22 08:10:32 +0800463 *params = CastFromStateValue<ParamType>(pname, buffer->isMapped());
Geoff Langebebe1c2016-10-14 12:01:31 -0400464 break;
465 case GL_BUFFER_MAP_OFFSET:
jchen10a99ed552017-09-22 08:10:32 +0800466 *params = CastFromStateValue<ParamType>(pname, buffer->getMapOffset());
Geoff Langebebe1c2016-10-14 12:01:31 -0400467 break;
468 case GL_BUFFER_MAP_LENGTH:
jchen10a99ed552017-09-22 08:10:32 +0800469 *params = CastFromStateValue<ParamType>(pname, buffer->getMapLength());
Geoff Langebebe1c2016-10-14 12:01:31 -0400470 break;
Geoff Lang79b91402018-10-04 15:11:30 -0400471 case GL_MEMORY_SIZE_ANGLE:
472 *params = CastFromStateValue<ParamType>(pname, buffer->getMemorySize());
473 break;
Geoff Langebebe1c2016-10-14 12:01:31 -0400474 default:
475 UNREACHABLE();
476 break;
477 }
478}
479
Olli Etuaho465835d2017-09-26 13:34:10 +0300480GLint GetCommonVariableProperty(const sh::ShaderVariable &var, GLenum prop)
jchen10880683b2017-04-12 16:21:55 +0800481{
482 switch (prop)
483 {
484 case GL_TYPE:
jchen10a99ed552017-09-22 08:10:32 +0800485 return clampCast<GLint>(var.type);
jchen10880683b2017-04-12 16:21:55 +0800486
487 case GL_ARRAY_SIZE:
Olli Etuaho465835d2017-09-26 13:34:10 +0300488 // Queryable variables are guaranteed not to be arrays of arrays or arrays of structs,
489 // see GLES 3.1 spec section 7.3.1.1 page 77.
490 return clampCast<GLint>(var.getBasicTypeElementCount());
jchen10880683b2017-04-12 16:21:55 +0800491
492 case GL_NAME_LENGTH:
jchen10880683b2017-04-12 16:21:55 +0800493 // ES31 spec p84: This counts the terminating null char.
Olli Etuahod2551232017-10-26 20:03:33 +0300494 return clampCast<GLint>(var.name.size() + 1u);
jchen10880683b2017-04-12 16:21:55 +0800495
496 default:
497 UNREACHABLE();
498 return GL_INVALID_VALUE;
499 }
500}
501
502GLint GetInputResourceProperty(const Program *program, GLuint index, GLenum prop)
503{
504 const auto &attribute = program->getInputResource(index);
505 switch (prop)
506 {
507 case GL_TYPE:
508 case GL_ARRAY_SIZE:
jchen10880683b2017-04-12 16:21:55 +0800509 case GL_NAME_LENGTH:
Olli Etuaho465835d2017-09-26 13:34:10 +0300510 return GetCommonVariableProperty(attribute, prop);
jchen10880683b2017-04-12 16:21:55 +0800511
jchen10baf5d942017-08-28 20:45:48 +0800512 case GL_LOCATION:
513 return program->getAttributeLocation(attribute.name);
514
jchen10880683b2017-04-12 16:21:55 +0800515 case GL_REFERENCED_BY_VERTEX_SHADER:
516 return 1;
517
518 case GL_REFERENCED_BY_FRAGMENT_SHADER:
519 case GL_REFERENCED_BY_COMPUTE_SHADER:
Jiawei Shaoc6f82872018-04-24 14:14:50 +0800520 case GL_REFERENCED_BY_GEOMETRY_SHADER_EXT:
jchen10880683b2017-04-12 16:21:55 +0800521 return 0;
522
523 default:
524 UNREACHABLE();
525 return GL_INVALID_VALUE;
526 }
527}
528
529GLint GetOutputResourceProperty(const Program *program, GLuint index, const GLenum prop)
530{
531 const auto &outputVariable = program->getOutputResource(index);
532 switch (prop)
533 {
534 case GL_TYPE:
535 case GL_ARRAY_SIZE:
jchen10880683b2017-04-12 16:21:55 +0800536 case GL_NAME_LENGTH:
Olli Etuaho465835d2017-09-26 13:34:10 +0300537 return GetCommonVariableProperty(outputVariable, prop);
jchen10880683b2017-04-12 16:21:55 +0800538
jchen10baf5d942017-08-28 20:45:48 +0800539 case GL_LOCATION:
540 return program->getFragDataLocation(outputVariable.name);
541
Olli Etuaho0ca09752018-09-24 11:00:50 +0300542 case GL_LOCATION_INDEX_EXT:
543 // EXT_blend_func_extended
544 return program->getFragDataIndex(outputVariable.name);
545
jchen10880683b2017-04-12 16:21:55 +0800546 case GL_REFERENCED_BY_FRAGMENT_SHADER:
547 return 1;
548
Jiawei Shaoc6f82872018-04-24 14:14:50 +0800549 case GL_REFERENCED_BY_VERTEX_SHADER:
jchen10880683b2017-04-12 16:21:55 +0800550 case GL_REFERENCED_BY_COMPUTE_SHADER:
Jiawei Shaoc6f82872018-04-24 14:14:50 +0800551 case GL_REFERENCED_BY_GEOMETRY_SHADER_EXT:
jchen10880683b2017-04-12 16:21:55 +0800552 return 0;
553
554 default:
555 UNREACHABLE();
556 return GL_INVALID_VALUE;
557 }
558}
559
jchen10910a3da2017-11-15 09:40:11 +0800560GLint GetTransformFeedbackVaryingResourceProperty(const Program *program,
561 GLuint index,
562 const GLenum prop)
563{
564 const auto &tfVariable = program->getTransformFeedbackVaryingResource(index);
565 switch (prop)
566 {
567 case GL_TYPE:
568 return clampCast<GLint>(tfVariable.type);
569
570 case GL_ARRAY_SIZE:
571 return clampCast<GLint>(tfVariable.size());
572
573 case GL_NAME_LENGTH:
574 return clampCast<GLint>(tfVariable.nameWithArrayIndex().size() + 1);
575
576 default:
577 UNREACHABLE();
578 return GL_INVALID_VALUE;
579 }
580}
581
jchen10d9cd7b72017-08-30 15:04:25 +0800582GLint QueryProgramInterfaceActiveResources(const Program *program, GLenum programInterface)
583{
584 switch (programInterface)
585 {
586 case GL_PROGRAM_INPUT:
jchen10a99ed552017-09-22 08:10:32 +0800587 return clampCast<GLint>(program->getAttributes().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800588
589 case GL_PROGRAM_OUTPUT:
jchen10a99ed552017-09-22 08:10:32 +0800590 return clampCast<GLint>(program->getState().getOutputVariables().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800591
592 case GL_UNIFORM:
jchen10a99ed552017-09-22 08:10:32 +0800593 return clampCast<GLint>(program->getState().getUniforms().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800594
595 case GL_UNIFORM_BLOCK:
jchen10a99ed552017-09-22 08:10:32 +0800596 return clampCast<GLint>(program->getState().getUniformBlocks().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800597
jchen1058f67be2017-10-27 08:59:27 +0800598 case GL_ATOMIC_COUNTER_BUFFER:
599 return clampCast<GLint>(program->getState().getAtomicCounterBuffers().size());
600
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800601 case GL_BUFFER_VARIABLE:
602 return clampCast<GLint>(program->getState().getBufferVariables().size());
603
604 case GL_SHADER_STORAGE_BLOCK:
605 return clampCast<GLint>(program->getState().getShaderStorageBlocks().size());
606
jchen10d9cd7b72017-08-30 15:04:25 +0800607 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10910a3da2017-11-15 09:40:11 +0800608 return clampCast<GLint>(program->getTransformFeedbackVaryingCount());
jchen10d9cd7b72017-08-30 15:04:25 +0800609
610 default:
611 UNREACHABLE();
612 return 0;
613 }
614}
615
616template <typename T, typename M>
617GLint FindMaxSize(const std::vector<T> &resources, M member)
618{
619 GLint max = 0;
620 for (const T &resource : resources)
621 {
jchen10a99ed552017-09-22 08:10:32 +0800622 max = std::max(max, clampCast<GLint>((resource.*member).size()));
jchen10d9cd7b72017-08-30 15:04:25 +0800623 }
624 return max;
625}
626
627GLint QueryProgramInterfaceMaxNameLength(const Program *program, GLenum programInterface)
628{
629 GLint maxNameLength = 0;
630 switch (programInterface)
631 {
632 case GL_PROGRAM_INPUT:
633 maxNameLength = FindMaxSize(program->getAttributes(), &sh::Attribute::name);
634 break;
635
636 case GL_PROGRAM_OUTPUT:
637 maxNameLength =
638 FindMaxSize(program->getState().getOutputVariables(), &sh::OutputVariable::name);
639 break;
640
641 case GL_UNIFORM:
642 maxNameLength = FindMaxSize(program->getState().getUniforms(), &LinkedUniform::name);
643 break;
644
645 case GL_UNIFORM_BLOCK:
Qin Jiajia9bf55522018-01-29 13:56:23 +0800646 return program->getActiveUniformBlockMaxNameLength();
jchen10d9cd7b72017-08-30 15:04:25 +0800647
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800648 case GL_BUFFER_VARIABLE:
649 maxNameLength =
650 FindMaxSize(program->getState().getBufferVariables(), &BufferVariable::name);
651 break;
652
653 case GL_SHADER_STORAGE_BLOCK:
Qin Jiajia9bf55522018-01-29 13:56:23 +0800654 return program->getActiveShaderStorageBlockMaxNameLength();
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800655
jchen10d9cd7b72017-08-30 15:04:25 +0800656 case GL_TRANSFORM_FEEDBACK_VARYING:
Qin Jiajia9bf55522018-01-29 13:56:23 +0800657 return clampCast<GLint>(program->getTransformFeedbackVaryingMaxLength());
jchen10d9cd7b72017-08-30 15:04:25 +0800658
659 default:
660 UNREACHABLE();
661 return 0;
662 }
663 // This length includes an extra character for the null terminator.
664 return (maxNameLength == 0 ? 0 : maxNameLength + 1);
665}
666
667GLint QueryProgramInterfaceMaxNumActiveVariables(const Program *program, GLenum programInterface)
668{
669 switch (programInterface)
670 {
671 case GL_UNIFORM_BLOCK:
672 return FindMaxSize(program->getState().getUniformBlocks(),
Jiajia Qin729b2c62017-08-14 09:36:11 +0800673 &InterfaceBlock::memberIndexes);
jchen1058f67be2017-10-27 08:59:27 +0800674 case GL_ATOMIC_COUNTER_BUFFER:
675 return FindMaxSize(program->getState().getAtomicCounterBuffers(),
676 &AtomicCounterBuffer::memberIndexes);
jchen10d9cd7b72017-08-30 15:04:25 +0800677
jchen10d9cd7b72017-08-30 15:04:25 +0800678 case GL_SHADER_STORAGE_BLOCK:
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800679 return FindMaxSize(program->getState().getShaderStorageBlocks(),
680 &InterfaceBlock::memberIndexes);
jchen10d9cd7b72017-08-30 15:04:25 +0800681
682 default:
683 UNREACHABLE();
684 return 0;
685 }
686}
687
jchen10baf5d942017-08-28 20:45:48 +0800688GLenum GetUniformPropertyEnum(GLenum prop)
689{
690 switch (prop)
691 {
692 case GL_UNIFORM_TYPE:
693 return GL_TYPE;
694 case GL_UNIFORM_SIZE:
695 return GL_ARRAY_SIZE;
696 case GL_UNIFORM_NAME_LENGTH:
697 return GL_NAME_LENGTH;
698 case GL_UNIFORM_BLOCK_INDEX:
699 return GL_BLOCK_INDEX;
700 case GL_UNIFORM_OFFSET:
701 return GL_OFFSET;
702 case GL_UNIFORM_ARRAY_STRIDE:
703 return GL_ARRAY_STRIDE;
704 case GL_UNIFORM_MATRIX_STRIDE:
705 return GL_MATRIX_STRIDE;
706 case GL_UNIFORM_IS_ROW_MAJOR:
707 return GL_IS_ROW_MAJOR;
708
709 default:
710 return prop;
711 }
712}
713
jchen1058f67be2017-10-27 08:59:27 +0800714GLenum GetUniformBlockPropertyEnum(GLenum prop)
715{
716 switch (prop)
717 {
718 case GL_UNIFORM_BLOCK_BINDING:
719 return GL_BUFFER_BINDING;
720
721 case GL_UNIFORM_BLOCK_DATA_SIZE:
722 return GL_BUFFER_DATA_SIZE;
723
724 case GL_UNIFORM_BLOCK_NAME_LENGTH:
725 return GL_NAME_LENGTH;
726
727 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
728 return GL_NUM_ACTIVE_VARIABLES;
729
730 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
731 return GL_ACTIVE_VARIABLES;
732
733 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
734 return GL_REFERENCED_BY_VERTEX_SHADER;
735
736 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
737 return GL_REFERENCED_BY_FRAGMENT_SHADER;
738
739 default:
740 return prop;
741 }
742}
743
744void GetShaderVariableBufferResourceProperty(const ShaderVariableBuffer &buffer,
745 GLenum pname,
746 GLint *params,
747 GLsizei bufSize,
748 GLsizei *outputPosition)
749
750{
751 switch (pname)
752 {
753 case GL_BUFFER_BINDING:
754 params[(*outputPosition)++] = buffer.binding;
755 break;
756 case GL_BUFFER_DATA_SIZE:
757 params[(*outputPosition)++] = clampCast<GLint>(buffer.dataSize);
758 break;
759 case GL_NUM_ACTIVE_VARIABLES:
760 params[(*outputPosition)++] = buffer.numActiveVariables();
761 break;
762 case GL_ACTIVE_VARIABLES:
763 for (size_t memberIndex = 0;
764 memberIndex < buffer.memberIndexes.size() && *outputPosition < bufSize;
765 ++memberIndex)
766 {
767 params[(*outputPosition)++] = clampCast<GLint>(buffer.memberIndexes[memberIndex]);
768 }
769 break;
770 case GL_REFERENCED_BY_VERTEX_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +0800771 params[(*outputPosition)++] = static_cast<GLint>(buffer.isActive(ShaderType::Vertex));
jchen1058f67be2017-10-27 08:59:27 +0800772 break;
773 case GL_REFERENCED_BY_FRAGMENT_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +0800774 params[(*outputPosition)++] = static_cast<GLint>(buffer.isActive(ShaderType::Fragment));
jchen1058f67be2017-10-27 08:59:27 +0800775 break;
776 case GL_REFERENCED_BY_COMPUTE_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +0800777 params[(*outputPosition)++] = static_cast<GLint>(buffer.isActive(ShaderType::Compute));
jchen1058f67be2017-10-27 08:59:27 +0800778 break;
Jiawei Shaoc6f82872018-04-24 14:14:50 +0800779 case GL_REFERENCED_BY_GEOMETRY_SHADER_EXT:
780 params[(*outputPosition)++] = static_cast<GLint>(buffer.isActive(ShaderType::Geometry));
781 break;
jchen1058f67be2017-10-27 08:59:27 +0800782 default:
783 UNREACHABLE();
784 break;
785 }
786}
787
788void GetInterfaceBlockResourceProperty(const InterfaceBlock &block,
789 GLenum pname,
790 GLint *params,
791 GLsizei bufSize,
792 GLsizei *outputPosition)
793{
794 if (pname == GL_NAME_LENGTH)
795 {
796 params[(*outputPosition)++] = clampCast<GLint>(block.nameWithArrayIndex().size() + 1);
797 return;
798 }
799 GetShaderVariableBufferResourceProperty(block, pname, params, bufSize, outputPosition);
800}
801
802void GetUniformBlockResourceProperty(const Program *program,
803 GLuint blockIndex,
804 GLenum pname,
805 GLint *params,
806 GLsizei bufSize,
807 GLsizei *outputPosition)
808
809{
810 ASSERT(*outputPosition < bufSize);
811 const auto &block = program->getUniformBlockByIndex(blockIndex);
812 GetInterfaceBlockResourceProperty(block, pname, params, bufSize, outputPosition);
813}
814
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800815void GetShaderStorageBlockResourceProperty(const Program *program,
816 GLuint blockIndex,
817 GLenum pname,
818 GLint *params,
819 GLsizei bufSize,
820 GLsizei *outputPosition)
821
822{
823 ASSERT(*outputPosition < bufSize);
824 const auto &block = program->getShaderStorageBlockByIndex(blockIndex);
825 GetInterfaceBlockResourceProperty(block, pname, params, bufSize, outputPosition);
826}
827
jchen1058f67be2017-10-27 08:59:27 +0800828void GetAtomicCounterBufferResourceProperty(const Program *program,
829 GLuint index,
830 GLenum pname,
831 GLint *params,
832 GLsizei bufSize,
833 GLsizei *outputPosition)
834
835{
836 ASSERT(*outputPosition < bufSize);
837 const auto &buffer = program->getState().getAtomicCounterBuffers()[index];
838 GetShaderVariableBufferResourceProperty(buffer, pname, params, bufSize, outputPosition);
839}
840
Lingfeng Yang45b5a872018-06-07 11:33:25 -0700841bool IsTextureEnvEnumParameter(TextureEnvParameter pname)
842{
843 switch (pname)
844 {
845 case TextureEnvParameter::Mode:
846 case TextureEnvParameter::CombineRgb:
847 case TextureEnvParameter::CombineAlpha:
848 case TextureEnvParameter::Src0Rgb:
849 case TextureEnvParameter::Src1Rgb:
850 case TextureEnvParameter::Src2Rgb:
851 case TextureEnvParameter::Src0Alpha:
852 case TextureEnvParameter::Src1Alpha:
853 case TextureEnvParameter::Src2Alpha:
854 case TextureEnvParameter::Op0Rgb:
855 case TextureEnvParameter::Op1Rgb:
856 case TextureEnvParameter::Op2Rgb:
857 case TextureEnvParameter::Op0Alpha:
858 case TextureEnvParameter::Op1Alpha:
859 case TextureEnvParameter::Op2Alpha:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -0700860 case TextureEnvParameter::PointCoordReplace:
Lingfeng Yang45b5a872018-06-07 11:33:25 -0700861 return true;
862 default:
863 return false;
864 }
865}
866
Geoff Langc1984ed2016-10-07 12:41:00 -0400867} // anonymous namespace
868
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -0800869void QueryFramebufferAttachmentParameteriv(const Context *context,
870 const Framebuffer *framebuffer,
Geoff Langff5b2d52016-09-07 11:32:23 -0400871 GLenum attachment,
872 GLenum pname,
873 GLint *params)
874{
875 ASSERT(framebuffer);
876
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -0800877 const FramebufferAttachment *attachmentObject = framebuffer->getAttachment(context, attachment);
878
Geoff Langff5b2d52016-09-07 11:32:23 -0400879 if (attachmentObject == nullptr)
880 {
881 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
882 // is NONE, then querying any other pname will generate INVALID_ENUM.
883
884 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
885 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
886 // INVALID_OPERATION for all other pnames
887
888 switch (pname)
889 {
890 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
891 *params = GL_NONE;
892 break;
893
894 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
895 *params = 0;
896 break;
897
898 default:
899 UNREACHABLE();
900 break;
901 }
902
903 return;
904 }
905
906 switch (pname)
907 {
908 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
909 *params = attachmentObject->type();
910 break;
911
912 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
913 *params = attachmentObject->id();
914 break;
915
916 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
917 *params = attachmentObject->mipLevel();
918 break;
919
920 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
Corentin Wallez99d492c2018-02-27 15:17:10 -0500921 {
922 TextureTarget face = attachmentObject->cubeMapFace();
923 if (face != TextureTarget::InvalidEnum)
924 {
925 *params = ToGLenum(attachmentObject->cubeMapFace());
926 }
927 else
928 {
929 // This happens when the attachment isn't a texture cube map face
930 *params = GL_NONE;
931 }
932 }
933 break;
Geoff Langff5b2d52016-09-07 11:32:23 -0400934
935 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
936 *params = attachmentObject->getRedSize();
937 break;
938
939 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
940 *params = attachmentObject->getGreenSize();
941 break;
942
943 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
944 *params = attachmentObject->getBlueSize();
945 break;
946
947 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
948 *params = attachmentObject->getAlphaSize();
949 break;
950
951 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
952 *params = attachmentObject->getDepthSize();
953 break;
954
955 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
956 *params = attachmentObject->getStencilSize();
957 break;
958
959 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
960 *params = attachmentObject->getComponentType();
961 break;
962
963 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
964 *params = attachmentObject->getColorEncoding();
965 break;
966
967 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
968 *params = attachmentObject->layer();
969 break;
970
Martin Radeve5285d22017-07-14 16:23:53 +0300971 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_ANGLE:
972 *params = attachmentObject->getNumViews();
973 break;
974
975 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_MULTIVIEW_LAYOUT_ANGLE:
976 *params = static_cast<GLint>(attachmentObject->getMultiviewLayout());
977 break;
978
979 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_ANGLE:
980 *params = attachmentObject->getBaseViewIndex();
981 break;
982
983 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_VIEWPORT_OFFSETS_ANGLE:
984 {
985 const std::vector<Offset> &offsets = attachmentObject->getMultiviewViewportOffsets();
986 for (size_t i = 0u; i < offsets.size(); ++i)
987 {
988 params[i * 2u] = offsets[i].x;
989 params[i * 2u + 1u] = offsets[i].y;
990 }
991 }
992 break;
993
Jiawei Shaoa8802472018-05-28 11:17:47 +0800994 case GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT:
995 *params = attachmentObject->isLayered();
996 break;
997
Geoff Langff5b2d52016-09-07 11:32:23 -0400998 default:
999 UNREACHABLE();
1000 break;
1001 }
1002}
1003
1004void QueryBufferParameteriv(const Buffer *buffer, GLenum pname, GLint *params)
1005{
Geoff Langebebe1c2016-10-14 12:01:31 -04001006 QueryBufferParameterBase(buffer, pname, params);
1007}
Geoff Langff5b2d52016-09-07 11:32:23 -04001008
Geoff Langebebe1c2016-10-14 12:01:31 -04001009void QueryBufferParameteri64v(const Buffer *buffer, GLenum pname, GLint64 *params)
1010{
1011 QueryBufferParameterBase(buffer, pname, params);
Geoff Langff5b2d52016-09-07 11:32:23 -04001012}
1013
Geoff Lang496c02d2016-10-20 11:38:11 -07001014void QueryBufferPointerv(const Buffer *buffer, GLenum pname, void **params)
1015{
1016 switch (pname)
1017 {
1018 case GL_BUFFER_MAP_POINTER:
1019 *params = buffer->getMapPointer();
1020 break;
1021
1022 default:
1023 UNREACHABLE();
1024 break;
1025 }
1026}
1027
Jamie Madillffe00c02017-06-27 16:26:55 -04001028void QueryProgramiv(const Context *context, const Program *program, GLenum pname, GLint *params)
Geoff Langff5b2d52016-09-07 11:32:23 -04001029{
1030 ASSERT(program != nullptr);
1031
1032 switch (pname)
1033 {
1034 case GL_DELETE_STATUS:
1035 *params = program->isFlaggedForDeletion();
1036 return;
1037 case GL_LINK_STATUS:
1038 *params = program->isLinked();
1039 return;
jchen107ae70d82018-07-06 13:47:01 +08001040 case GL_COMPLETION_STATUS_KHR:
1041 *params = program->isLinking() ? GL_FALSE : GL_TRUE;
1042 return;
Geoff Langff5b2d52016-09-07 11:32:23 -04001043 case GL_VALIDATE_STATUS:
1044 *params = program->isValidated();
1045 return;
1046 case GL_INFO_LOG_LENGTH:
1047 *params = program->getInfoLogLength();
1048 return;
1049 case GL_ATTACHED_SHADERS:
1050 *params = program->getAttachedShadersCount();
1051 return;
1052 case GL_ACTIVE_ATTRIBUTES:
1053 *params = program->getActiveAttributeCount();
1054 return;
1055 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
1056 *params = program->getActiveAttributeMaxLength();
1057 return;
1058 case GL_ACTIVE_UNIFORMS:
1059 *params = program->getActiveUniformCount();
1060 return;
1061 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
1062 *params = program->getActiveUniformMaxLength();
1063 return;
1064 case GL_PROGRAM_BINARY_LENGTH_OES:
Shahbaz Youssefic14ab2a2018-08-24 13:57:55 -04001065 *params = context->getCaps().programBinaryFormats.empty()
1066 ? 0
1067 : program->getBinaryLength(context);
Geoff Langff5b2d52016-09-07 11:32:23 -04001068 return;
1069 case GL_ACTIVE_UNIFORM_BLOCKS:
1070 *params = program->getActiveUniformBlockCount();
1071 return;
1072 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
Qin Jiajia9bf55522018-01-29 13:56:23 +08001073 *params = program->getActiveUniformBlockMaxNameLength();
Geoff Langff5b2d52016-09-07 11:32:23 -04001074 break;
1075 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
1076 *params = program->getTransformFeedbackBufferMode();
1077 break;
1078 case GL_TRANSFORM_FEEDBACK_VARYINGS:
jchen10910a3da2017-11-15 09:40:11 +08001079 *params = clampCast<GLint>(program->getTransformFeedbackVaryingCount());
Geoff Langff5b2d52016-09-07 11:32:23 -04001080 break;
1081 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
1082 *params = program->getTransformFeedbackVaryingMaxLength();
1083 break;
1084 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
1085 *params = program->getBinaryRetrievableHint();
1086 break;
Yunchao He61afff12017-03-14 15:34:03 +08001087 case GL_PROGRAM_SEPARABLE:
1088 *params = program->isSeparable();
1089 break;
Xinghua Cao971f8502017-10-17 13:01:24 +08001090 case GL_COMPUTE_WORK_GROUP_SIZE:
1091 {
1092 const sh::WorkGroupSize &localSize = program->getComputeShaderLocalSize();
1093 params[0] = localSize[0];
1094 params[1] = localSize[1];
1095 params[2] = localSize[2];
1096 }
1097 break;
jchen1058f67be2017-10-27 08:59:27 +08001098 case GL_ACTIVE_ATOMIC_COUNTER_BUFFERS:
1099 *params = program->getActiveAtomicCounterBufferCount();
1100 break;
Jiawei Shao447bfac2018-03-14 14:23:40 +08001101 case GL_GEOMETRY_LINKED_INPUT_TYPE_EXT:
Jamie Madill493f9572018-05-24 19:52:15 -04001102 *params = ToGLenum(program->getGeometryShaderInputPrimitiveType());
Jiawei Shao447bfac2018-03-14 14:23:40 +08001103 break;
1104 case GL_GEOMETRY_LINKED_OUTPUT_TYPE_EXT:
Jamie Madill493f9572018-05-24 19:52:15 -04001105 *params = ToGLenum(program->getGeometryShaderOutputPrimitiveType());
Jiawei Shao447bfac2018-03-14 14:23:40 +08001106 break;
1107 case GL_GEOMETRY_LINKED_VERTICES_OUT_EXT:
1108 *params = program->getGeometryShaderMaxVertices();
1109 break;
1110 case GL_GEOMETRY_SHADER_INVOCATIONS_EXT:
1111 *params = program->getGeometryShaderInvocations();
1112 break;
Geoff Langff5b2d52016-09-07 11:32:23 -04001113 default:
1114 UNREACHABLE();
1115 break;
1116 }
1117}
Geoff Lang740d9022016-10-07 11:20:52 -04001118
Jamie Madill4e0e6f82017-02-17 11:06:03 -05001119void QueryRenderbufferiv(const Context *context,
1120 const Renderbuffer *renderbuffer,
1121 GLenum pname,
1122 GLint *params)
Geoff Lang740d9022016-10-07 11:20:52 -04001123{
1124 ASSERT(renderbuffer != nullptr);
1125
1126 switch (pname)
1127 {
1128 case GL_RENDERBUFFER_WIDTH:
1129 *params = renderbuffer->getWidth();
1130 break;
1131 case GL_RENDERBUFFER_HEIGHT:
1132 *params = renderbuffer->getHeight();
1133 break;
1134 case GL_RENDERBUFFER_INTERNAL_FORMAT:
Jamie Madill4e0e6f82017-02-17 11:06:03 -05001135 // Special case the WebGL 1 DEPTH_STENCIL format.
Jamie Madilla02315b2017-02-23 14:14:47 -05001136 if (context->isWebGL1() &&
Jamie Madill4e0e6f82017-02-17 11:06:03 -05001137 renderbuffer->getFormat().info->internalFormat == GL_DEPTH24_STENCIL8)
1138 {
1139 *params = GL_DEPTH_STENCIL;
1140 }
1141 else
1142 {
1143 *params = renderbuffer->getFormat().info->internalFormat;
1144 }
Geoff Lang740d9022016-10-07 11:20:52 -04001145 break;
1146 case GL_RENDERBUFFER_RED_SIZE:
1147 *params = renderbuffer->getRedSize();
1148 break;
1149 case GL_RENDERBUFFER_GREEN_SIZE:
1150 *params = renderbuffer->getGreenSize();
1151 break;
1152 case GL_RENDERBUFFER_BLUE_SIZE:
1153 *params = renderbuffer->getBlueSize();
1154 break;
1155 case GL_RENDERBUFFER_ALPHA_SIZE:
1156 *params = renderbuffer->getAlphaSize();
1157 break;
1158 case GL_RENDERBUFFER_DEPTH_SIZE:
1159 *params = renderbuffer->getDepthSize();
1160 break;
1161 case GL_RENDERBUFFER_STENCIL_SIZE:
1162 *params = renderbuffer->getStencilSize();
1163 break;
1164 case GL_RENDERBUFFER_SAMPLES_ANGLE:
1165 *params = renderbuffer->getSamples();
1166 break;
Geoff Lang79b91402018-10-04 15:11:30 -04001167 case GL_MEMORY_SIZE_ANGLE:
1168 *params = renderbuffer->getMemorySize();
1169 break;
Geoff Lang740d9022016-10-07 11:20:52 -04001170 default:
1171 UNREACHABLE();
1172 break;
1173 }
1174}
Geoff Langd7d0ed32016-10-07 11:33:51 -04001175
jchen103fd614d2018-08-13 12:21:58 +08001176void QueryShaderiv(Shader *shader, GLenum pname, GLint *params)
Geoff Langd7d0ed32016-10-07 11:33:51 -04001177{
1178 ASSERT(shader != nullptr);
1179
1180 switch (pname)
1181 {
1182 case GL_SHADER_TYPE:
Jiawei Shao385b3e02018-03-21 09:43:28 +08001183 *params = static_cast<GLint>(ToGLenum(shader->getType()));
Geoff Langd7d0ed32016-10-07 11:33:51 -04001184 return;
1185 case GL_DELETE_STATUS:
1186 *params = shader->isFlaggedForDeletion();
1187 return;
1188 case GL_COMPILE_STATUS:
jchen103fd614d2018-08-13 12:21:58 +08001189 *params = shader->isCompiled() ? GL_TRUE : GL_FALSE;
Geoff Langd7d0ed32016-10-07 11:33:51 -04001190 return;
jchen107ae70d82018-07-06 13:47:01 +08001191 case GL_COMPLETION_STATUS_KHR:
jchen10a155bac2018-08-16 15:26:39 +08001192 *params = shader->isCompleted() ? GL_TRUE : GL_FALSE;
jchen107ae70d82018-07-06 13:47:01 +08001193 return;
Geoff Langd7d0ed32016-10-07 11:33:51 -04001194 case GL_INFO_LOG_LENGTH:
jchen103fd614d2018-08-13 12:21:58 +08001195 *params = shader->getInfoLogLength();
Geoff Langd7d0ed32016-10-07 11:33:51 -04001196 return;
1197 case GL_SHADER_SOURCE_LENGTH:
1198 *params = shader->getSourceLength();
1199 return;
1200 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
jchen103fd614d2018-08-13 12:21:58 +08001201 *params = shader->getTranslatedSourceWithDebugInfoLength();
Geoff Langd7d0ed32016-10-07 11:33:51 -04001202 return;
1203 default:
1204 UNREACHABLE();
1205 break;
1206 }
1207}
Geoff Langc1984ed2016-10-07 12:41:00 -04001208
He Yunchao11b038b2016-11-22 21:24:04 +08001209void QueryTexLevelParameterfv(const Texture *texture,
Corentin Wallez99d492c2018-02-27 15:17:10 -05001210 TextureTarget target,
He Yunchao11b038b2016-11-22 21:24:04 +08001211 GLint level,
1212 GLenum pname,
1213 GLfloat *params)
1214{
1215 QueryTexLevelParameterBase(texture, target, level, pname, params);
1216}
1217
1218void QueryTexLevelParameteriv(const Texture *texture,
Corentin Wallez99d492c2018-02-27 15:17:10 -05001219 TextureTarget target,
He Yunchao11b038b2016-11-22 21:24:04 +08001220 GLint level,
1221 GLenum pname,
1222 GLint *params)
1223{
1224 QueryTexLevelParameterBase(texture, target, level, pname, params);
1225}
1226
Geoff Langc1984ed2016-10-07 12:41:00 -04001227void QueryTexParameterfv(const Texture *texture, GLenum pname, GLfloat *params)
1228{
1229 QueryTexParameterBase(texture, pname, params);
1230}
1231
1232void QueryTexParameteriv(const Texture *texture, GLenum pname, GLint *params)
1233{
1234 QueryTexParameterBase(texture, pname, params);
1235}
1236
1237void QuerySamplerParameterfv(const Sampler *sampler, GLenum pname, GLfloat *params)
1238{
1239 QuerySamplerParameterBase(sampler, pname, params);
1240}
1241
1242void QuerySamplerParameteriv(const Sampler *sampler, GLenum pname, GLint *params)
1243{
1244 QuerySamplerParameterBase(sampler, pname, params);
1245}
1246
Geoff Lang0b031062016-10-13 14:30:04 -04001247void QueryVertexAttribfv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001248 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001249 const VertexAttribCurrentValueData &currentValueData,
1250 GLenum pname,
1251 GLfloat *params)
1252{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001253 QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001254}
1255
1256void QueryVertexAttribiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001257 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001258 const VertexAttribCurrentValueData &currentValueData,
1259 GLenum pname,
1260 GLint *params)
1261{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001262 QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001263}
1264
Jamie Madill876429b2017-04-20 15:46:24 -04001265void QueryVertexAttribPointerv(const VertexAttribute &attrib, GLenum pname, void **pointer)
Geoff Lang0b031062016-10-13 14:30:04 -04001266{
1267 switch (pname)
1268 {
1269 case GL_VERTEX_ATTRIB_ARRAY_POINTER:
Jamie Madill876429b2017-04-20 15:46:24 -04001270 *pointer = const_cast<void *>(attrib.pointer);
Geoff Lang0b031062016-10-13 14:30:04 -04001271 break;
1272
1273 default:
1274 UNREACHABLE();
1275 break;
1276 }
1277}
1278
1279void QueryVertexAttribIiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001280 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001281 const VertexAttribCurrentValueData &currentValueData,
1282 GLenum pname,
1283 GLint *params)
1284{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001285 QueryVertexAttribBase(attrib, binding, currentValueData.IntValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001286}
1287
1288void QueryVertexAttribIuiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001289 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001290 const VertexAttribCurrentValueData &currentValueData,
1291 GLenum pname,
1292 GLuint *params)
1293{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001294 QueryVertexAttribBase(attrib, binding, currentValueData.UnsignedIntValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001295}
1296
Geoff Lang6899b872016-10-14 11:30:13 -04001297void QueryActiveUniformBlockiv(const Program *program,
1298 GLuint uniformBlockIndex,
1299 GLenum pname,
1300 GLint *params)
1301{
jchen1058f67be2017-10-27 08:59:27 +08001302 GLenum prop = GetUniformBlockPropertyEnum(pname);
1303 QueryProgramResourceiv(program, GL_UNIFORM_BLOCK, uniformBlockIndex, 1, &prop,
1304 std::numeric_limits<GLsizei>::max(), nullptr, params);
Geoff Lang6899b872016-10-14 11:30:13 -04001305}
1306
Geoff Lang0a9661f2016-10-20 10:59:20 -07001307void QueryInternalFormativ(const TextureCaps &format, GLenum pname, GLsizei bufSize, GLint *params)
1308{
1309 switch (pname)
1310 {
1311 case GL_NUM_SAMPLE_COUNTS:
1312 if (bufSize != 0)
1313 {
jchen10a99ed552017-09-22 08:10:32 +08001314 *params = clampCast<GLint>(format.sampleCounts.size());
Geoff Lang0a9661f2016-10-20 10:59:20 -07001315 }
1316 break;
1317
1318 case GL_SAMPLES:
1319 {
1320 size_t returnCount = std::min<size_t>(bufSize, format.sampleCounts.size());
1321 auto sampleReverseIt = format.sampleCounts.rbegin();
1322 for (size_t sampleIndex = 0; sampleIndex < returnCount; ++sampleIndex)
1323 {
1324 params[sampleIndex] = *sampleReverseIt++;
1325 }
1326 }
1327 break;
1328
1329 default:
1330 UNREACHABLE();
1331 break;
1332 }
1333}
1334
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001335void QueryFramebufferParameteriv(const Framebuffer *framebuffer, GLenum pname, GLint *params)
1336{
1337 ASSERT(framebuffer);
1338
1339 switch (pname)
1340 {
1341 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
1342 *params = framebuffer->getDefaultWidth();
1343 break;
1344 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
1345 *params = framebuffer->getDefaultHeight();
1346 break;
1347 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
1348 *params = framebuffer->getDefaultSamples();
1349 break;
1350 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
Geoff Lang92019432017-11-20 13:09:34 -05001351 *params = ConvertToGLBoolean(framebuffer->getDefaultFixedSampleLocations());
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001352 break;
Jiawei Shaob1e91382018-05-17 14:33:55 +08001353 case GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT:
1354 *params = framebuffer->getDefaultLayers();
1355 break;
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001356 default:
1357 UNREACHABLE();
1358 break;
1359 }
1360}
1361
Jamie Madilla0691b72018-07-25 10:41:22 -04001362Error QuerySynciv(const Context *context,
1363 const Sync *sync,
1364 GLenum pname,
1365 GLsizei bufSize,
1366 GLsizei *length,
1367 GLint *values)
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001368{
1369 ASSERT(sync);
1370
Geoff Lang82483b92017-04-11 15:33:00 -04001371 // All queries return one value, exit early if the buffer can't fit anything.
1372 if (bufSize < 1)
1373 {
1374 if (length != nullptr)
1375 {
1376 *length = 0;
1377 }
1378 return NoError();
1379 }
1380
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001381 switch (pname)
1382 {
1383 case GL_OBJECT_TYPE:
jchen10a99ed552017-09-22 08:10:32 +08001384 *values = clampCast<GLint>(GL_SYNC_FENCE);
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001385 break;
1386 case GL_SYNC_CONDITION:
jchen10a99ed552017-09-22 08:10:32 +08001387 *values = clampCast<GLint>(sync->getCondition());
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001388 break;
1389 case GL_SYNC_FLAGS:
jchen10a99ed552017-09-22 08:10:32 +08001390 *values = clampCast<GLint>(sync->getFlags());
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001391 break;
1392 case GL_SYNC_STATUS:
Jamie Madilla0691b72018-07-25 10:41:22 -04001393 ANGLE_TRY(sync->getStatus(context, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001394 break;
1395
1396 default:
1397 UNREACHABLE();
1398 break;
1399 }
1400
Geoff Lang82483b92017-04-11 15:33:00 -04001401 if (length != nullptr)
1402 {
1403 *length = 1;
1404 }
1405
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001406 return NoError();
1407}
1408
Jamie Madill4928b7c2017-06-20 12:57:39 -04001409void SetTexParameterf(Context *context, Texture *texture, GLenum pname, GLfloat param)
Geoff Langc1984ed2016-10-07 12:41:00 -04001410{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001411 SetTexParameterBase(context, texture, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -04001412}
1413
Jamie Madill4928b7c2017-06-20 12:57:39 -04001414void SetTexParameterfv(Context *context, Texture *texture, GLenum pname, const GLfloat *params)
Geoff Langc1984ed2016-10-07 12:41:00 -04001415{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001416 SetTexParameterBase(context, texture, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001417}
1418
Jamie Madill4928b7c2017-06-20 12:57:39 -04001419void SetTexParameteri(Context *context, Texture *texture, GLenum pname, GLint param)
Geoff Langc1984ed2016-10-07 12:41:00 -04001420{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001421 SetTexParameterBase(context, texture, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -04001422}
1423
Jamie Madill4928b7c2017-06-20 12:57:39 -04001424void SetTexParameteriv(Context *context, Texture *texture, GLenum pname, const GLint *params)
Geoff Langc1984ed2016-10-07 12:41:00 -04001425{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001426 SetTexParameterBase(context, texture, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001427}
1428
Jamie Madille25b8002018-09-20 13:39:49 -04001429void SetSamplerParameterf(Context *context, Sampler *sampler, GLenum pname, GLfloat param)
Geoff Langc1984ed2016-10-07 12:41:00 -04001430{
Jamie Madille25b8002018-09-20 13:39:49 -04001431 SetSamplerParameterBase(context, sampler, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -04001432}
1433
Jamie Madille25b8002018-09-20 13:39:49 -04001434void SetSamplerParameterfv(Context *context, Sampler *sampler, GLenum pname, const GLfloat *params)
Geoff Langc1984ed2016-10-07 12:41:00 -04001435{
Jamie Madille25b8002018-09-20 13:39:49 -04001436 SetSamplerParameterBase(context, sampler, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001437}
1438
Jamie Madille25b8002018-09-20 13:39:49 -04001439void SetSamplerParameteri(Context *context, Sampler *sampler, GLenum pname, GLint param)
Geoff Langc1984ed2016-10-07 12:41:00 -04001440{
Jamie Madille25b8002018-09-20 13:39:49 -04001441 SetSamplerParameterBase(context, sampler, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -04001442}
1443
Jamie Madille25b8002018-09-20 13:39:49 -04001444void SetSamplerParameteriv(Context *context, Sampler *sampler, GLenum pname, const GLint *params)
Geoff Langc1984ed2016-10-07 12:41:00 -04001445{
Jamie Madille25b8002018-09-20 13:39:49 -04001446 SetSamplerParameterBase(context, sampler, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001447}
Geoff Lang65603eb2017-01-12 16:48:03 -05001448
Jamie Madillb983a4b2018-08-01 11:34:51 -04001449void SetFramebufferParameteri(const Context *context,
1450 Framebuffer *framebuffer,
1451 GLenum pname,
1452 GLint param)
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001453{
1454 ASSERT(framebuffer);
1455
1456 switch (pname)
1457 {
1458 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
Jamie Madillb983a4b2018-08-01 11:34:51 -04001459 framebuffer->setDefaultWidth(context, param);
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001460 break;
1461 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
Jamie Madillb983a4b2018-08-01 11:34:51 -04001462 framebuffer->setDefaultHeight(context, param);
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001463 break;
1464 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
Jamie Madillb983a4b2018-08-01 11:34:51 -04001465 framebuffer->setDefaultSamples(context, param);
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001466 break;
1467 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
Jamie Madillb983a4b2018-08-01 11:34:51 -04001468 framebuffer->setDefaultFixedSampleLocations(context, ConvertToBool(param));
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001469 break;
Jiawei Shaob1e91382018-05-17 14:33:55 +08001470 case GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT:
1471 framebuffer->setDefaultLayers(param);
1472 break;
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001473 default:
1474 UNREACHABLE();
1475 break;
1476 }
1477}
1478
Yunchao He61afff12017-03-14 15:34:03 +08001479void SetProgramParameteri(Program *program, GLenum pname, GLint value)
1480{
1481 ASSERT(program);
1482
1483 switch (pname)
1484 {
1485 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
Geoff Lang92019432017-11-20 13:09:34 -05001486 program->setBinaryRetrievableHint(ConvertToBool(value));
Yunchao He61afff12017-03-14 15:34:03 +08001487 break;
1488 case GL_PROGRAM_SEPARABLE:
Geoff Lang92019432017-11-20 13:09:34 -05001489 program->setSeparable(ConvertToBool(value));
Yunchao He61afff12017-03-14 15:34:03 +08001490 break;
1491 default:
1492 UNREACHABLE();
1493 break;
1494 }
1495}
1496
jchen10baf5d942017-08-28 20:45:48 +08001497GLint GetUniformResourceProperty(const Program *program, GLuint index, const GLenum prop)
1498{
1499 const auto &uniform = program->getUniformByIndex(index);
1500 GLenum resourceProp = GetUniformPropertyEnum(prop);
1501 switch (resourceProp)
1502 {
1503 case GL_TYPE:
1504 case GL_ARRAY_SIZE:
1505 case GL_NAME_LENGTH:
Olli Etuaho465835d2017-09-26 13:34:10 +03001506 return GetCommonVariableProperty(uniform, resourceProp);
jchen10baf5d942017-08-28 20:45:48 +08001507
1508 case GL_LOCATION:
1509 return program->getUniformLocation(uniform.name);
1510
1511 case GL_BLOCK_INDEX:
1512 return (uniform.isAtomicCounter() ? -1 : uniform.bufferIndex);
1513
1514 case GL_OFFSET:
1515 return uniform.blockInfo.offset;
1516
1517 case GL_ARRAY_STRIDE:
1518 return uniform.blockInfo.arrayStride;
1519
1520 case GL_MATRIX_STRIDE:
1521 return uniform.blockInfo.matrixStride;
1522
1523 case GL_IS_ROW_MAJOR:
1524 return static_cast<GLint>(uniform.blockInfo.isRowMajorMatrix);
1525
1526 case GL_REFERENCED_BY_VERTEX_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001527 return uniform.isActive(ShaderType::Vertex);
jchen10baf5d942017-08-28 20:45:48 +08001528
1529 case GL_REFERENCED_BY_FRAGMENT_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001530 return uniform.isActive(ShaderType::Fragment);
jchen10baf5d942017-08-28 20:45:48 +08001531
1532 case GL_REFERENCED_BY_COMPUTE_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001533 return uniform.isActive(ShaderType::Compute);
jchen10baf5d942017-08-28 20:45:48 +08001534
Jiawei Shaoc6f82872018-04-24 14:14:50 +08001535 case GL_REFERENCED_BY_GEOMETRY_SHADER_EXT:
1536 return uniform.isActive(ShaderType::Geometry);
1537
jchen10baf5d942017-08-28 20:45:48 +08001538 case GL_ATOMIC_COUNTER_BUFFER_INDEX:
1539 return (uniform.isAtomicCounter() ? uniform.bufferIndex : -1);
1540
1541 default:
1542 UNREACHABLE();
1543 return 0;
1544 }
1545}
1546
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001547GLint GetBufferVariableResourceProperty(const Program *program, GLuint index, const GLenum prop)
1548{
1549 const auto &bufferVariable = program->getBufferVariableByIndex(index);
1550 switch (prop)
1551 {
1552 case GL_TYPE:
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001553 case GL_ARRAY_SIZE:
Olli Etuaho465835d2017-09-26 13:34:10 +03001554 case GL_NAME_LENGTH:
1555 return GetCommonVariableProperty(bufferVariable, prop);
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001556
1557 case GL_BLOCK_INDEX:
1558 return bufferVariable.bufferIndex;
1559
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001560 case GL_OFFSET:
1561 return bufferVariable.blockInfo.offset;
1562
1563 case GL_ARRAY_STRIDE:
1564 return bufferVariable.blockInfo.arrayStride;
1565
1566 case GL_MATRIX_STRIDE:
1567 return bufferVariable.blockInfo.matrixStride;
1568
1569 case GL_IS_ROW_MAJOR:
1570 return static_cast<GLint>(bufferVariable.blockInfo.isRowMajorMatrix);
1571
1572 case GL_REFERENCED_BY_VERTEX_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001573 return bufferVariable.isActive(ShaderType::Vertex);
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001574
1575 case GL_REFERENCED_BY_FRAGMENT_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001576 return bufferVariable.isActive(ShaderType::Fragment);
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001577
1578 case GL_REFERENCED_BY_COMPUTE_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001579 return bufferVariable.isActive(ShaderType::Compute);
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001580
Jiawei Shaoc6f82872018-04-24 14:14:50 +08001581 case GL_REFERENCED_BY_GEOMETRY_SHADER_EXT:
1582 return bufferVariable.isActive(ShaderType::Geometry);
1583
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001584 case GL_TOP_LEVEL_ARRAY_SIZE:
1585 return bufferVariable.topLevelArraySize;
1586
1587 case GL_TOP_LEVEL_ARRAY_STRIDE:
1588 return bufferVariable.blockInfo.topLevelArrayStride;
1589
1590 default:
1591 UNREACHABLE();
1592 return 0;
1593 }
1594}
1595
jchen1015015f72017-03-16 13:54:21 +08001596GLuint QueryProgramResourceIndex(const Program *program,
1597 GLenum programInterface,
1598 const GLchar *name)
1599{
1600 switch (programInterface)
1601 {
1602 case GL_PROGRAM_INPUT:
1603 return program->getInputResourceIndex(name);
1604
1605 case GL_PROGRAM_OUTPUT:
1606 return program->getOutputResourceIndex(name);
1607
jchen1015015f72017-03-16 13:54:21 +08001608 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001609 return program->getState().getUniformIndexFromName(name);
1610
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001611 case GL_BUFFER_VARIABLE:
1612 return program->getState().getBufferVariableIndexFromName(name);
1613
1614 case GL_SHADER_STORAGE_BLOCK:
1615 return program->getShaderStorageBlockIndex(name);
1616
jchen1015015f72017-03-16 13:54:21 +08001617 case GL_UNIFORM_BLOCK:
jchen1058f67be2017-10-27 08:59:27 +08001618 return program->getUniformBlockIndex(name);
1619
jchen1015015f72017-03-16 13:54:21 +08001620 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10910a3da2017-11-15 09:40:11 +08001621 return program->getTransformFeedbackVaryingResourceIndex(name);
jchen1015015f72017-03-16 13:54:21 +08001622
1623 default:
1624 UNREACHABLE();
1625 return GL_INVALID_INDEX;
1626 }
1627}
1628
jchen10fd7c3b52017-03-21 15:36:03 +08001629void QueryProgramResourceName(const Program *program,
1630 GLenum programInterface,
1631 GLuint index,
1632 GLsizei bufSize,
1633 GLsizei *length,
1634 GLchar *name)
1635{
1636 switch (programInterface)
1637 {
1638 case GL_PROGRAM_INPUT:
1639 program->getInputResourceName(index, bufSize, length, name);
1640 break;
1641
1642 case GL_PROGRAM_OUTPUT:
1643 program->getOutputResourceName(index, bufSize, length, name);
1644 break;
1645
jchen10fd7c3b52017-03-21 15:36:03 +08001646 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001647 program->getUniformResourceName(index, bufSize, length, name);
1648 break;
1649
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001650 case GL_BUFFER_VARIABLE:
1651 program->getBufferVariableResourceName(index, bufSize, length, name);
1652 break;
1653
1654 case GL_SHADER_STORAGE_BLOCK:
1655 program->getActiveShaderStorageBlockName(index, bufSize, length, name);
1656 break;
1657
jchen10fd7c3b52017-03-21 15:36:03 +08001658 case GL_UNIFORM_BLOCK:
jchen1058f67be2017-10-27 08:59:27 +08001659 program->getActiveUniformBlockName(index, bufSize, length, name);
1660 break;
1661
jchen10fd7c3b52017-03-21 15:36:03 +08001662 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10910a3da2017-11-15 09:40:11 +08001663 program->getTransformFeedbackVarying(index, bufSize, length, nullptr, nullptr, name);
jchen10fd7c3b52017-03-21 15:36:03 +08001664 break;
1665
1666 default:
1667 UNREACHABLE();
1668 }
1669}
1670
jchen10191381f2017-04-11 13:59:04 +08001671GLint QueryProgramResourceLocation(const Program *program,
1672 GLenum programInterface,
1673 const GLchar *name)
1674{
1675 switch (programInterface)
1676 {
1677 case GL_PROGRAM_INPUT:
1678 return program->getAttributeLocation(name);
1679
1680 case GL_PROGRAM_OUTPUT:
1681 return program->getFragDataLocation(name);
1682
jchen10191381f2017-04-11 13:59:04 +08001683 case GL_UNIFORM:
Olli Etuahod2551232017-10-26 20:03:33 +03001684 return program->getUniformLocation(name);
jchen10baf5d942017-08-28 20:45:48 +08001685
jchen10191381f2017-04-11 13:59:04 +08001686 default:
1687 UNREACHABLE();
1688 return -1;
1689 }
1690}
1691
jchen10880683b2017-04-12 16:21:55 +08001692void QueryProgramResourceiv(const Program *program,
1693 GLenum programInterface,
1694 GLuint index,
1695 GLsizei propCount,
1696 const GLenum *props,
1697 GLsizei bufSize,
1698 GLsizei *length,
1699 GLint *params)
1700{
1701 if (!program->isLinked())
1702 {
1703 if (length != nullptr)
1704 {
1705 *length = 0;
1706 }
1707 return;
1708 }
1709
jchen1058f67be2017-10-27 08:59:27 +08001710 GLsizei pos = 0;
1711 for (GLsizei i = 0; i < propCount; i++)
jchen10880683b2017-04-12 16:21:55 +08001712 {
1713 switch (programInterface)
1714 {
1715 case GL_PROGRAM_INPUT:
1716 params[i] = GetInputResourceProperty(program, index, props[i]);
jchen1058f67be2017-10-27 08:59:27 +08001717 ++pos;
jchen10880683b2017-04-12 16:21:55 +08001718 break;
1719
1720 case GL_PROGRAM_OUTPUT:
1721 params[i] = GetOutputResourceProperty(program, index, props[i]);
jchen1058f67be2017-10-27 08:59:27 +08001722 ++pos;
jchen10880683b2017-04-12 16:21:55 +08001723 break;
1724
jchen10880683b2017-04-12 16:21:55 +08001725 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001726 params[i] = GetUniformResourceProperty(program, index, props[i]);
jchen1058f67be2017-10-27 08:59:27 +08001727 ++pos;
1728 break;
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001729
1730 case GL_BUFFER_VARIABLE:
1731 params[i] = GetBufferVariableResourceProperty(program, index, props[i]);
1732 ++pos;
1733 break;
1734
jchen1058f67be2017-10-27 08:59:27 +08001735 case GL_UNIFORM_BLOCK:
1736 GetUniformBlockResourceProperty(program, index, props[i], params, bufSize, &pos);
jchen10baf5d942017-08-28 20:45:48 +08001737 break;
1738
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001739 case GL_SHADER_STORAGE_BLOCK:
1740 GetShaderStorageBlockResourceProperty(program, index, props[i], params, bufSize,
1741 &pos);
1742 break;
1743
jchen1058f67be2017-10-27 08:59:27 +08001744 case GL_ATOMIC_COUNTER_BUFFER:
1745 GetAtomicCounterBufferResourceProperty(program, index, props[i], params, bufSize,
1746 &pos);
1747 break;
jchen10910a3da2017-11-15 09:40:11 +08001748
jchen10880683b2017-04-12 16:21:55 +08001749 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10910a3da2017-11-15 09:40:11 +08001750 params[i] = GetTransformFeedbackVaryingResourceProperty(program, index, props[i]);
1751 ++pos;
jchen10880683b2017-04-12 16:21:55 +08001752 break;
1753
1754 default:
1755 UNREACHABLE();
1756 params[i] = GL_INVALID_VALUE;
1757 }
jchen1058f67be2017-10-27 08:59:27 +08001758 if (pos == bufSize)
1759 {
1760 // Most properties return one value, but GL_ACTIVE_VARIABLES returns an array of values.
1761 // This checks not to break buffer bounds for such case.
1762 break;
1763 }
1764 }
1765
1766 if (length != nullptr)
1767 {
1768 *length = pos;
jchen10880683b2017-04-12 16:21:55 +08001769 }
1770}
1771
jchen10d9cd7b72017-08-30 15:04:25 +08001772void QueryProgramInterfaceiv(const Program *program,
1773 GLenum programInterface,
1774 GLenum pname,
1775 GLint *params)
1776{
1777 switch (pname)
1778 {
1779 case GL_ACTIVE_RESOURCES:
1780 *params = QueryProgramInterfaceActiveResources(program, programInterface);
1781 break;
1782
1783 case GL_MAX_NAME_LENGTH:
1784 *params = QueryProgramInterfaceMaxNameLength(program, programInterface);
1785 break;
1786
1787 case GL_MAX_NUM_ACTIVE_VARIABLES:
1788 *params = QueryProgramInterfaceMaxNumActiveVariables(program, programInterface);
1789 break;
1790
1791 default:
1792 UNREACHABLE();
1793 }
1794}
1795
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001796ClientVertexArrayType ParamToVertexArrayType(GLenum param)
1797{
1798 switch (param)
1799 {
1800 case GL_VERTEX_ARRAY:
1801 case GL_VERTEX_ARRAY_BUFFER_BINDING:
1802 case GL_VERTEX_ARRAY_STRIDE:
1803 case GL_VERTEX_ARRAY_SIZE:
1804 case GL_VERTEX_ARRAY_TYPE:
1805 case GL_VERTEX_ARRAY_POINTER:
1806 return ClientVertexArrayType::Vertex;
1807 case GL_NORMAL_ARRAY:
1808 case GL_NORMAL_ARRAY_BUFFER_BINDING:
1809 case GL_NORMAL_ARRAY_STRIDE:
1810 case GL_NORMAL_ARRAY_TYPE:
1811 case GL_NORMAL_ARRAY_POINTER:
1812 return ClientVertexArrayType::Normal;
1813 case GL_COLOR_ARRAY:
1814 case GL_COLOR_ARRAY_BUFFER_BINDING:
1815 case GL_COLOR_ARRAY_STRIDE:
1816 case GL_COLOR_ARRAY_SIZE:
1817 case GL_COLOR_ARRAY_TYPE:
1818 case GL_COLOR_ARRAY_POINTER:
1819 return ClientVertexArrayType::Color;
1820 case GL_POINT_SIZE_ARRAY_OES:
1821 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
1822 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
1823 case GL_POINT_SIZE_ARRAY_TYPE_OES:
1824 case GL_POINT_SIZE_ARRAY_POINTER_OES:
1825 return ClientVertexArrayType::PointSize;
1826 case GL_TEXTURE_COORD_ARRAY:
1827 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
1828 case GL_TEXTURE_COORD_ARRAY_STRIDE:
1829 case GL_TEXTURE_COORD_ARRAY_SIZE:
1830 case GL_TEXTURE_COORD_ARRAY_TYPE:
1831 case GL_TEXTURE_COORD_ARRAY_POINTER:
1832 return ClientVertexArrayType::TextureCoord;
1833 default:
1834 UNREACHABLE();
1835 return ClientVertexArrayType::InvalidEnum;
1836 }
1837}
1838
Lingfeng Yangd0febe72018-05-17 22:36:52 -07001839void SetLightModelParameters(GLES1State *state, GLenum pname, const GLfloat *params)
1840{
1841 LightModelParameters &lightModel = state->lightModelParameters();
1842
1843 switch (pname)
1844 {
1845 case GL_LIGHT_MODEL_AMBIENT:
1846 lightModel.color = ColorF::fromData(params);
1847 break;
1848 case GL_LIGHT_MODEL_TWO_SIDE:
1849 lightModel.twoSided = *params == 1.0f ? true : false;
1850 break;
1851 default:
1852 break;
1853 }
1854}
1855
1856void GetLightModelParameters(const GLES1State *state, GLenum pname, GLfloat *params)
1857{
1858 const LightModelParameters &lightModel = state->lightModelParameters();
1859
1860 switch (pname)
1861 {
1862 case GL_LIGHT_MODEL_TWO_SIDE:
1863 *params = lightModel.twoSided ? 1.0f : 0.0f;
1864 break;
1865 case GL_LIGHT_MODEL_AMBIENT:
1866 lightModel.color.writeData(params);
1867 break;
1868 default:
1869 break;
1870 }
1871}
1872
1873bool IsLightModelTwoSided(const GLES1State *state)
1874{
1875 return state->lightModelParameters().twoSided;
1876}
1877
1878void SetLightParameters(GLES1State *state,
1879 GLenum light,
1880 LightParameter pname,
1881 const GLfloat *params)
1882{
1883 uint32_t lightIndex = light - GL_LIGHT0;
1884
1885 LightParameters &lightParams = state->lightParameters(lightIndex);
1886
1887 switch (pname)
1888 {
1889 case LightParameter::Ambient:
1890 lightParams.ambient = ColorF::fromData(params);
1891 break;
1892 case LightParameter::Diffuse:
1893 lightParams.diffuse = ColorF::fromData(params);
1894 break;
1895 case LightParameter::Specular:
1896 lightParams.specular = ColorF::fromData(params);
1897 break;
1898 case LightParameter::Position:
1899 {
1900 angle::Mat4 mv = state->getModelviewMatrix();
1901 angle::Vector4 transformedPos =
1902 mv.product(angle::Vector4(params[0], params[1], params[2], params[3]));
1903 lightParams.position[0] = transformedPos[0];
1904 lightParams.position[1] = transformedPos[1];
1905 lightParams.position[2] = transformedPos[2];
1906 lightParams.position[3] = transformedPos[3];
1907 }
1908 break;
1909 case LightParameter::SpotDirection:
1910 {
1911 angle::Mat4 mv = state->getModelviewMatrix();
1912 angle::Vector4 transformedPos =
1913 mv.product(angle::Vector4(params[0], params[1], params[2], 0.0f));
1914 lightParams.direction[0] = transformedPos[0];
1915 lightParams.direction[1] = transformedPos[1];
1916 lightParams.direction[2] = transformedPos[2];
1917 }
1918 break;
1919 case LightParameter::SpotExponent:
1920 lightParams.spotlightExponent = *params;
1921 break;
1922 case LightParameter::SpotCutoff:
1923 lightParams.spotlightCutoffAngle = *params;
1924 break;
1925 case LightParameter::ConstantAttenuation:
1926 lightParams.attenuationConst = *params;
1927 break;
1928 case LightParameter::LinearAttenuation:
1929 lightParams.attenuationLinear = *params;
1930 break;
1931 case LightParameter::QuadraticAttenuation:
1932 lightParams.attenuationQuadratic = *params;
1933 break;
1934 default:
1935 return;
1936 }
1937}
1938
1939void GetLightParameters(const GLES1State *state,
1940 GLenum light,
1941 LightParameter pname,
1942 GLfloat *params)
1943{
1944 uint32_t lightIndex = light - GL_LIGHT0;
1945 const LightParameters &lightParams = state->lightParameters(lightIndex);
1946
1947 switch (pname)
1948 {
1949 case LightParameter::Ambient:
1950 lightParams.ambient.writeData(params);
1951 break;
1952 case LightParameter::Diffuse:
1953 lightParams.diffuse.writeData(params);
1954 break;
1955 case LightParameter::Specular:
1956 lightParams.specular.writeData(params);
1957 break;
1958 case LightParameter::Position:
1959 memcpy(params, lightParams.position.data(), 4 * sizeof(GLfloat));
1960 break;
1961 case LightParameter::SpotDirection:
1962 memcpy(params, lightParams.direction.data(), 3 * sizeof(GLfloat));
1963 break;
1964 case LightParameter::SpotExponent:
1965 *params = lightParams.spotlightExponent;
1966 break;
1967 case LightParameter::SpotCutoff:
1968 *params = lightParams.spotlightCutoffAngle;
1969 break;
1970 case LightParameter::ConstantAttenuation:
1971 *params = lightParams.attenuationConst;
1972 break;
1973 case LightParameter::LinearAttenuation:
1974 *params = lightParams.attenuationLinear;
1975 break;
1976 case LightParameter::QuadraticAttenuation:
1977 *params = lightParams.attenuationQuadratic;
1978 break;
1979 default:
1980 break;
1981 }
1982}
1983
1984void SetMaterialParameters(GLES1State *state,
1985 GLenum face,
1986 MaterialParameter pname,
1987 const GLfloat *params)
1988{
1989 MaterialParameters &material = state->materialParameters();
1990 switch (pname)
1991 {
1992 case MaterialParameter::Ambient:
1993 material.ambient = ColorF::fromData(params);
1994 break;
1995 case MaterialParameter::Diffuse:
1996 material.diffuse = ColorF::fromData(params);
1997 break;
1998 case MaterialParameter::AmbientAndDiffuse:
1999 material.ambient = ColorF::fromData(params);
2000 material.diffuse = ColorF::fromData(params);
2001 break;
2002 case MaterialParameter::Specular:
2003 material.specular = ColorF::fromData(params);
2004 break;
2005 case MaterialParameter::Emission:
2006 material.emissive = ColorF::fromData(params);
2007 break;
2008 case MaterialParameter::Shininess:
2009 material.specularExponent = *params;
2010 break;
2011 default:
2012 return;
2013 }
2014}
2015
2016void GetMaterialParameters(const GLES1State *state,
2017 GLenum face,
2018 MaterialParameter pname,
2019 GLfloat *params)
2020{
2021 const ColorF &currentColor = state->getCurrentColor();
2022 const MaterialParameters &material = state->materialParameters();
2023 const bool colorMaterialEnabled = state->isColorMaterialEnabled();
2024
2025 switch (pname)
2026 {
2027 case MaterialParameter::Ambient:
2028 if (colorMaterialEnabled)
2029 {
2030 currentColor.writeData(params);
2031 }
2032 else
2033 {
2034 material.ambient.writeData(params);
2035 }
2036 break;
2037 case MaterialParameter::Diffuse:
2038 if (colorMaterialEnabled)
2039 {
2040 currentColor.writeData(params);
2041 }
2042 else
2043 {
2044 material.diffuse.writeData(params);
2045 }
2046 break;
2047 case MaterialParameter::Specular:
2048 material.specular.writeData(params);
2049 break;
2050 case MaterialParameter::Emission:
2051 material.emissive.writeData(params);
2052 break;
2053 case MaterialParameter::Shininess:
2054 *params = material.specularExponent;
2055 break;
2056 default:
2057 return;
2058 }
2059}
2060
2061unsigned int GetLightModelParameterCount(GLenum pname)
2062{
2063 switch (pname)
2064 {
2065 case GL_LIGHT_MODEL_AMBIENT:
2066 return 4;
2067 case GL_LIGHT_MODEL_TWO_SIDE:
2068 return 1;
2069 default:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07002070 return 0;
2071 }
2072}
2073
2074unsigned int GetLightParameterCount(LightParameter pname)
2075{
2076 switch (pname)
2077 {
2078 case LightParameter::Ambient:
2079 case LightParameter::Diffuse:
2080 case LightParameter::Specular:
2081 case LightParameter::Position:
2082 return 4;
2083 case LightParameter::SpotDirection:
2084 return 3;
2085 case LightParameter::SpotExponent:
2086 case LightParameter::SpotCutoff:
2087 case LightParameter::ConstantAttenuation:
2088 case LightParameter::LinearAttenuation:
2089 case LightParameter::QuadraticAttenuation:
2090 return 1;
2091 default:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07002092 return 0;
2093 }
2094}
2095
2096unsigned int GetMaterialParameterCount(MaterialParameter pname)
2097{
2098 switch (pname)
2099 {
2100 case MaterialParameter::Ambient:
2101 case MaterialParameter::Diffuse:
2102 case MaterialParameter::Specular:
2103 case MaterialParameter::Emission:
2104 return 4;
2105 case MaterialParameter::Shininess:
2106 return 1;
2107 default:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07002108 return 0;
2109 }
2110}
2111
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07002112void SetFogParameters(GLES1State *state, GLenum pname, const GLfloat *params)
2113{
2114 FogParameters &fog = state->fogParameters();
2115 switch (pname)
2116 {
2117 case GL_FOG_MODE:
2118 fog.mode = FromGLenum<FogMode>(static_cast<GLenum>(params[0]));
2119 break;
2120 case GL_FOG_DENSITY:
2121 fog.density = params[0];
2122 break;
2123 case GL_FOG_START:
2124 fog.start = params[0];
2125 break;
2126 case GL_FOG_END:
2127 fog.end = params[0];
2128 break;
2129 case GL_FOG_COLOR:
2130 fog.color = ColorF::fromData(params);
2131 break;
2132 default:
2133 return;
2134 }
2135}
2136
2137void GetFogParameters(const GLES1State *state, GLenum pname, GLfloat *params)
2138{
2139 const FogParameters &fog = state->fogParameters();
2140 switch (pname)
2141 {
2142 case GL_FOG_MODE:
2143 params[0] = static_cast<GLfloat>(ToGLenum(fog.mode));
2144 break;
2145 case GL_FOG_DENSITY:
2146 params[0] = fog.density;
2147 break;
2148 case GL_FOG_START:
2149 params[0] = fog.start;
2150 break;
2151 case GL_FOG_END:
2152 params[0] = fog.end;
2153 break;
2154 case GL_FOG_COLOR:
2155 fog.color.writeData(params);
2156 break;
2157 default:
2158 return;
2159 }
2160}
2161
2162unsigned int GetFogParameterCount(GLenum pname)
2163{
2164 switch (pname)
2165 {
2166 case GL_FOG_MODE:
2167 case GL_FOG_DENSITY:
2168 case GL_FOG_START:
2169 case GL_FOG_END:
2170 return 1;
2171 case GL_FOG_COLOR:
2172 return 4;
2173 default:
2174 return 0;
2175 }
2176}
2177
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002178unsigned int GetTextureEnvParameterCount(TextureEnvParameter pname)
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07002179{
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002180 switch (pname)
2181 {
2182 case TextureEnvParameter::Mode:
2183 case TextureEnvParameter::CombineRgb:
2184 case TextureEnvParameter::CombineAlpha:
2185 case TextureEnvParameter::Src0Rgb:
2186 case TextureEnvParameter::Src1Rgb:
2187 case TextureEnvParameter::Src2Rgb:
2188 case TextureEnvParameter::Src0Alpha:
2189 case TextureEnvParameter::Src1Alpha:
2190 case TextureEnvParameter::Src2Alpha:
2191 case TextureEnvParameter::Op0Rgb:
2192 case TextureEnvParameter::Op1Rgb:
2193 case TextureEnvParameter::Op2Rgb:
2194 case TextureEnvParameter::Op0Alpha:
2195 case TextureEnvParameter::Op1Alpha:
2196 case TextureEnvParameter::Op2Alpha:
2197 case TextureEnvParameter::RgbScale:
2198 case TextureEnvParameter::AlphaScale:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07002199 case TextureEnvParameter::PointCoordReplace:
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002200 return 1;
2201 case TextureEnvParameter::Color:
2202 return 4;
2203 default:
2204 return 0;
2205 }
2206}
2207
2208void ConvertTextureEnvFromInt(TextureEnvParameter pname, const GLint *input, GLfloat *output)
2209{
2210 if (IsTextureEnvEnumParameter(pname))
2211 {
2212 ConvertGLenumValue(input[0], output);
2213 return;
2214 }
2215
2216 switch (pname)
2217 {
2218 case TextureEnvParameter::RgbScale:
2219 case TextureEnvParameter::AlphaScale:
2220 output[0] = static_cast<GLfloat>(input[0]);
2221 break;
2222 case TextureEnvParameter::Color:
2223 for (int i = 0; i < 4; i++)
2224 {
2225 output[i] = input[i] / 255.0f;
2226 }
2227 break;
2228 default:
2229 UNREACHABLE();
2230 break;
2231 }
2232}
2233
2234void ConvertTextureEnvFromFixed(TextureEnvParameter pname, const GLfixed *input, GLfloat *output)
2235{
2236 if (IsTextureEnvEnumParameter(pname))
2237 {
2238 ConvertGLenumValue(input[0], output);
2239 return;
2240 }
2241
2242 switch (pname)
2243 {
2244 case TextureEnvParameter::RgbScale:
2245 case TextureEnvParameter::AlphaScale:
2246 output[0] = FixedToFloat(input[0]);
2247 break;
2248 case TextureEnvParameter::Color:
2249 for (int i = 0; i < 4; i++)
2250 {
2251 output[i] = FixedToFloat(input[i]);
2252 }
2253 break;
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002254 default:
2255 UNREACHABLE();
2256 break;
2257 }
2258}
2259
2260void ConvertTextureEnvToInt(TextureEnvParameter pname, const GLfloat *input, GLint *output)
2261{
2262 if (IsTextureEnvEnumParameter(pname))
2263 {
2264 ConvertGLenumValue(input[0], output);
2265 return;
2266 }
2267
2268 switch (pname)
2269 {
2270 case TextureEnvParameter::RgbScale:
2271 case TextureEnvParameter::AlphaScale:
2272 output[0] = static_cast<GLint>(input[0]);
2273 break;
2274 case TextureEnvParameter::Color:
2275 for (int i = 0; i < 4; i++)
2276 {
2277 output[i] = static_cast<GLint>(input[i] * 255.0f);
2278 }
2279 break;
2280 default:
2281 UNREACHABLE();
2282 break;
2283 }
2284}
2285
2286void ConvertTextureEnvToFixed(TextureEnvParameter pname, const GLfloat *input, GLfixed *output)
2287{
2288 if (IsTextureEnvEnumParameter(pname))
2289 {
2290 ConvertGLenumValue(input[0], output);
2291 return;
2292 }
2293
2294 switch (pname)
2295 {
2296 case TextureEnvParameter::RgbScale:
2297 case TextureEnvParameter::AlphaScale:
2298 output[0] = FloatToFixed(input[0]);
2299 break;
2300 case TextureEnvParameter::Color:
2301 for (int i = 0; i < 4; i++)
2302 {
2303 output[i] = FloatToFixed(input[i]);
2304 }
2305 break;
2306 default:
2307 UNREACHABLE();
2308 break;
2309 }
2310}
2311
2312void SetTextureEnv(unsigned int unit,
2313 GLES1State *state,
2314 TextureEnvTarget target,
2315 TextureEnvParameter pname,
2316 const GLfloat *params)
2317{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002318 TextureEnvironmentParameters &env = state->textureEnvironment(unit);
2319 GLenum asEnum = ConvertToGLenum(params[0]);
2320
2321 switch (target)
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002322 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002323 case TextureEnvTarget::Env:
2324 switch (pname)
2325 {
2326 case TextureEnvParameter::Mode:
2327 env.mode = FromGLenum<TextureEnvMode>(asEnum);
2328 break;
2329 case TextureEnvParameter::CombineRgb:
2330 env.combineRgb = FromGLenum<TextureCombine>(asEnum);
2331 break;
2332 case TextureEnvParameter::CombineAlpha:
2333 env.combineAlpha = FromGLenum<TextureCombine>(asEnum);
2334 break;
2335 case TextureEnvParameter::Src0Rgb:
2336 env.src0Rgb = FromGLenum<TextureSrc>(asEnum);
2337 break;
2338 case TextureEnvParameter::Src1Rgb:
2339 env.src1Rgb = FromGLenum<TextureSrc>(asEnum);
2340 break;
2341 case TextureEnvParameter::Src2Rgb:
2342 env.src2Rgb = FromGLenum<TextureSrc>(asEnum);
2343 break;
2344 case TextureEnvParameter::Src0Alpha:
2345 env.src0Alpha = FromGLenum<TextureSrc>(asEnum);
2346 break;
2347 case TextureEnvParameter::Src1Alpha:
2348 env.src1Alpha = FromGLenum<TextureSrc>(asEnum);
2349 break;
2350 case TextureEnvParameter::Src2Alpha:
2351 env.src2Alpha = FromGLenum<TextureSrc>(asEnum);
2352 break;
2353 case TextureEnvParameter::Op0Rgb:
2354 env.op0Rgb = FromGLenum<TextureOp>(asEnum);
2355 break;
2356 case TextureEnvParameter::Op1Rgb:
2357 env.op1Rgb = FromGLenum<TextureOp>(asEnum);
2358 break;
2359 case TextureEnvParameter::Op2Rgb:
2360 env.op2Rgb = FromGLenum<TextureOp>(asEnum);
2361 break;
2362 case TextureEnvParameter::Op0Alpha:
2363 env.op0Alpha = FromGLenum<TextureOp>(asEnum);
2364 break;
2365 case TextureEnvParameter::Op1Alpha:
2366 env.op1Alpha = FromGLenum<TextureOp>(asEnum);
2367 break;
2368 case TextureEnvParameter::Op2Alpha:
2369 env.op2Alpha = FromGLenum<TextureOp>(asEnum);
2370 break;
2371 case TextureEnvParameter::Color:
2372 env.color = ColorF::fromData(params);
2373 break;
2374 case TextureEnvParameter::RgbScale:
2375 env.rgbScale = params[0];
2376 break;
2377 case TextureEnvParameter::AlphaScale:
2378 env.alphaScale = params[0];
2379 break;
2380 default:
2381 UNREACHABLE();
2382 break;
2383 }
2384 break;
2385 case TextureEnvTarget::PointSprite:
2386 switch (pname)
2387 {
2388 case TextureEnvParameter::PointCoordReplace:
2389 env.pointSpriteCoordReplace = static_cast<bool>(params[0]);
2390 break;
2391 default:
2392 UNREACHABLE();
2393 break;
2394 }
2395 break;
2396 default:
2397 UNREACHABLE();
2398 break;
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002399 }
2400}
2401
2402void GetTextureEnv(unsigned int unit,
2403 const GLES1State *state,
2404 TextureEnvTarget target,
2405 TextureEnvParameter pname,
2406 GLfloat *params)
2407{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002408 const TextureEnvironmentParameters &env = state->textureEnvironment(unit);
2409
2410 switch (target)
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002411 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002412 case TextureEnvTarget::Env:
2413 switch (pname)
2414 {
2415 case TextureEnvParameter::Mode:
2416 ConvertPackedEnum(env.mode, params);
2417 break;
2418 case TextureEnvParameter::CombineRgb:
2419 ConvertPackedEnum(env.combineRgb, params);
2420 break;
2421 case TextureEnvParameter::CombineAlpha:
2422 ConvertPackedEnum(env.combineAlpha, params);
2423 break;
2424 case TextureEnvParameter::Src0Rgb:
2425 ConvertPackedEnum(env.src0Rgb, params);
2426 break;
2427 case TextureEnvParameter::Src1Rgb:
2428 ConvertPackedEnum(env.src1Rgb, params);
2429 break;
2430 case TextureEnvParameter::Src2Rgb:
2431 ConvertPackedEnum(env.src2Rgb, params);
2432 break;
2433 case TextureEnvParameter::Src0Alpha:
2434 ConvertPackedEnum(env.src0Alpha, params);
2435 break;
2436 case TextureEnvParameter::Src1Alpha:
2437 ConvertPackedEnum(env.src1Alpha, params);
2438 break;
2439 case TextureEnvParameter::Src2Alpha:
2440 ConvertPackedEnum(env.src2Alpha, params);
2441 break;
2442 case TextureEnvParameter::Op0Rgb:
2443 ConvertPackedEnum(env.op0Rgb, params);
2444 break;
2445 case TextureEnvParameter::Op1Rgb:
2446 ConvertPackedEnum(env.op1Rgb, params);
2447 break;
2448 case TextureEnvParameter::Op2Rgb:
2449 ConvertPackedEnum(env.op2Rgb, params);
2450 break;
2451 case TextureEnvParameter::Op0Alpha:
2452 ConvertPackedEnum(env.op0Alpha, params);
2453 break;
2454 case TextureEnvParameter::Op1Alpha:
2455 ConvertPackedEnum(env.op1Alpha, params);
2456 break;
2457 case TextureEnvParameter::Op2Alpha:
2458 ConvertPackedEnum(env.op2Alpha, params);
2459 break;
2460 case TextureEnvParameter::Color:
2461 env.color.writeData(params);
2462 break;
2463 case TextureEnvParameter::RgbScale:
2464 *params = env.rgbScale;
2465 break;
2466 case TextureEnvParameter::AlphaScale:
2467 *params = env.alphaScale;
2468 break;
2469 default:
2470 UNREACHABLE();
2471 break;
2472 }
2473 break;
2474 case TextureEnvTarget::PointSprite:
2475 switch (pname)
2476 {
2477 case TextureEnvParameter::PointCoordReplace:
2478 *params = static_cast<GLfloat>(env.pointSpriteCoordReplace);
2479 break;
2480 default:
2481 UNREACHABLE();
2482 break;
2483 }
2484 break;
2485 default:
2486 UNREACHABLE();
2487 break;
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002488 }
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002489}
2490
2491unsigned int GetPointParameterCount(PointParameter pname)
2492{
2493 switch (pname)
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002494 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002495 case PointParameter::PointSizeMin:
2496 case PointParameter::PointSizeMax:
2497 case PointParameter::PointFadeThresholdSize:
2498 return 1;
2499 case PointParameter::PointDistanceAttenuation:
2500 return 3;
2501 default:
2502 return 0;
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002503 }
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07002504}
2505
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002506void SetPointParameter(GLES1State *state, PointParameter pname, const GLfloat *params)
2507{
2508
2509 PointParameters &pointParams = state->pointParameters();
2510
2511 switch (pname)
2512 {
2513 case PointParameter::PointSizeMin:
2514 pointParams.pointSizeMin = params[0];
2515 break;
2516 case PointParameter::PointSizeMax:
2517 pointParams.pointSizeMax = params[0];
2518 break;
2519 case PointParameter::PointFadeThresholdSize:
2520 pointParams.pointFadeThresholdSize = params[0];
2521 break;
2522 case PointParameter::PointDistanceAttenuation:
2523 for (unsigned int i = 0; i < 3; i++)
2524 {
2525 pointParams.pointDistanceAttenuation[i] = params[i];
2526 }
2527 break;
2528 default:
2529 UNREACHABLE();
2530 }
2531}
2532
2533void GetPointParameter(const GLES1State *state, PointParameter pname, GLfloat *params)
2534{
2535 const PointParameters &pointParams = state->pointParameters();
2536
2537 switch (pname)
2538 {
2539 case PointParameter::PointSizeMin:
2540 params[0] = pointParams.pointSizeMin;
2541 break;
2542 case PointParameter::PointSizeMax:
2543 params[0] = pointParams.pointSizeMax;
2544 break;
2545 case PointParameter::PointFadeThresholdSize:
2546 params[0] = pointParams.pointFadeThresholdSize;
2547 break;
2548 case PointParameter::PointDistanceAttenuation:
2549 for (unsigned int i = 0; i < 3; i++)
2550 {
2551 params[i] = pointParams.pointDistanceAttenuation[i];
2552 }
2553 break;
2554 default:
2555 UNREACHABLE();
2556 }
2557}
2558
2559void SetPointSize(GLES1State *state, GLfloat size)
2560{
2561 PointParameters &params = state->pointParameters();
2562 params.pointSize = size;
2563}
2564
2565void GetPointSize(GLES1State *state, GLfloat *sizeOut)
2566{
2567 const PointParameters &params = state->pointParameters();
2568 *sizeOut = params.pointSize;
2569}
2570
Lingfeng Yangf97641c2018-06-21 19:22:45 -07002571unsigned int GetTexParameterCount(GLenum pname)
2572{
2573 switch (pname)
2574 {
2575 case GL_TEXTURE_CROP_RECT_OES:
2576 return 4;
2577 case GL_TEXTURE_MAG_FILTER:
2578 case GL_TEXTURE_MIN_FILTER:
2579 case GL_TEXTURE_WRAP_S:
2580 case GL_TEXTURE_WRAP_T:
2581 case GL_TEXTURE_USAGE_ANGLE:
2582 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
2583 case GL_TEXTURE_IMMUTABLE_FORMAT:
2584 case GL_TEXTURE_WRAP_R:
2585 case GL_TEXTURE_IMMUTABLE_LEVELS:
2586 case GL_TEXTURE_SWIZZLE_R:
2587 case GL_TEXTURE_SWIZZLE_G:
2588 case GL_TEXTURE_SWIZZLE_B:
2589 case GL_TEXTURE_SWIZZLE_A:
2590 case GL_TEXTURE_BASE_LEVEL:
2591 case GL_TEXTURE_MAX_LEVEL:
2592 case GL_TEXTURE_MIN_LOD:
2593 case GL_TEXTURE_MAX_LOD:
2594 case GL_TEXTURE_COMPARE_MODE:
2595 case GL_TEXTURE_COMPARE_FUNC:
2596 case GL_TEXTURE_SRGB_DECODE_EXT:
2597 case GL_DEPTH_STENCIL_TEXTURE_MODE:
2598 return 1;
2599 default:
2600 return 0;
2601 }
2602}
2603
Geoff Lang65603eb2017-01-12 16:48:03 -05002604} // namespace gl
2605
2606namespace egl
2607{
2608
2609void QueryConfigAttrib(const Config *config, EGLint attribute, EGLint *value)
2610{
2611 ASSERT(config != nullptr);
2612 switch (attribute)
2613 {
2614 case EGL_BUFFER_SIZE:
2615 *value = config->bufferSize;
2616 break;
2617 case EGL_ALPHA_SIZE:
2618 *value = config->alphaSize;
2619 break;
2620 case EGL_BLUE_SIZE:
2621 *value = config->blueSize;
2622 break;
2623 case EGL_GREEN_SIZE:
2624 *value = config->greenSize;
2625 break;
2626 case EGL_RED_SIZE:
2627 *value = config->redSize;
2628 break;
2629 case EGL_DEPTH_SIZE:
2630 *value = config->depthSize;
2631 break;
2632 case EGL_STENCIL_SIZE:
2633 *value = config->stencilSize;
2634 break;
2635 case EGL_CONFIG_CAVEAT:
2636 *value = config->configCaveat;
2637 break;
2638 case EGL_CONFIG_ID:
2639 *value = config->configID;
2640 break;
2641 case EGL_LEVEL:
2642 *value = config->level;
2643 break;
2644 case EGL_NATIVE_RENDERABLE:
2645 *value = config->nativeRenderable;
2646 break;
2647 case EGL_NATIVE_VISUAL_ID:
2648 *value = config->nativeVisualID;
2649 break;
2650 case EGL_NATIVE_VISUAL_TYPE:
2651 *value = config->nativeVisualType;
2652 break;
2653 case EGL_SAMPLES:
2654 *value = config->samples;
2655 break;
2656 case EGL_SAMPLE_BUFFERS:
2657 *value = config->sampleBuffers;
2658 break;
2659 case EGL_SURFACE_TYPE:
2660 *value = config->surfaceType;
2661 break;
2662 case EGL_TRANSPARENT_TYPE:
2663 *value = config->transparentType;
2664 break;
2665 case EGL_TRANSPARENT_BLUE_VALUE:
2666 *value = config->transparentBlueValue;
2667 break;
2668 case EGL_TRANSPARENT_GREEN_VALUE:
2669 *value = config->transparentGreenValue;
2670 break;
2671 case EGL_TRANSPARENT_RED_VALUE:
2672 *value = config->transparentRedValue;
2673 break;
2674 case EGL_BIND_TO_TEXTURE_RGB:
2675 *value = config->bindToTextureRGB;
2676 break;
2677 case EGL_BIND_TO_TEXTURE_RGBA:
2678 *value = config->bindToTextureRGBA;
2679 break;
2680 case EGL_MIN_SWAP_INTERVAL:
2681 *value = config->minSwapInterval;
2682 break;
2683 case EGL_MAX_SWAP_INTERVAL:
2684 *value = config->maxSwapInterval;
2685 break;
2686 case EGL_LUMINANCE_SIZE:
2687 *value = config->luminanceSize;
2688 break;
2689 case EGL_ALPHA_MASK_SIZE:
2690 *value = config->alphaMaskSize;
2691 break;
2692 case EGL_COLOR_BUFFER_TYPE:
2693 *value = config->colorBufferType;
2694 break;
2695 case EGL_RENDERABLE_TYPE:
2696 *value = config->renderableType;
2697 break;
2698 case EGL_MATCH_NATIVE_PIXMAP:
2699 *value = false;
2700 UNIMPLEMENTED();
2701 break;
2702 case EGL_CONFORMANT:
2703 *value = config->conformant;
2704 break;
2705 case EGL_MAX_PBUFFER_WIDTH:
2706 *value = config->maxPBufferWidth;
2707 break;
2708 case EGL_MAX_PBUFFER_HEIGHT:
2709 *value = config->maxPBufferHeight;
2710 break;
2711 case EGL_MAX_PBUFFER_PIXELS:
2712 *value = config->maxPBufferPixels;
2713 break;
2714 case EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE:
2715 *value = config->optimalOrientation;
2716 break;
Geoff Langc5a2a172017-01-13 15:55:07 -05002717 case EGL_COLOR_COMPONENT_TYPE_EXT:
2718 *value = config->colorComponentType;
2719 break;
Geoff Lang65603eb2017-01-12 16:48:03 -05002720 default:
2721 UNREACHABLE();
2722 break;
2723 }
Geoff Langff5b2d52016-09-07 11:32:23 -04002724}
Geoff Lang65603eb2017-01-12 16:48:03 -05002725
Geoff Langaf143fe2017-10-05 13:59:43 -04002726void QueryContextAttrib(const gl::Context *context, EGLint attribute, EGLint *value)
2727{
2728 switch (attribute)
2729 {
2730 case EGL_CONFIG_ID:
2731 *value = context->getConfig()->configID;
2732 break;
2733 case EGL_CONTEXT_CLIENT_TYPE:
2734 *value = context->getClientType();
2735 break;
2736 case EGL_CONTEXT_CLIENT_VERSION:
2737 *value = context->getClientMajorVersion();
2738 break;
2739 case EGL_RENDER_BUFFER:
2740 *value = context->getRenderBuffer();
2741 break;
Geoff Langb433e872017-10-05 14:01:47 -04002742 case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
2743 *value = context->isRobustResourceInitEnabled();
2744 break;
Geoff Langaf143fe2017-10-05 13:59:43 -04002745 default:
2746 UNREACHABLE();
2747 break;
2748 }
2749}
2750
Geoff Lang31ecbd72017-07-26 13:01:27 -04002751void QuerySurfaceAttrib(const Surface *surface, EGLint attribute, EGLint *value)
2752{
2753 switch (attribute)
2754 {
2755 case EGL_GL_COLORSPACE:
Geoff Lang40ac7832017-07-26 14:38:46 -04002756 *value = surface->getGLColorspace();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002757 break;
2758 case EGL_VG_ALPHA_FORMAT:
Geoff Lang40ac7832017-07-26 14:38:46 -04002759 *value = surface->getVGAlphaFormat();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002760 break;
2761 case EGL_VG_COLORSPACE:
Geoff Lang40ac7832017-07-26 14:38:46 -04002762 *value = surface->getVGColorspace();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002763 break;
2764 case EGL_CONFIG_ID:
2765 *value = surface->getConfig()->configID;
2766 break;
2767 case EGL_HEIGHT:
2768 *value = surface->getHeight();
2769 break;
2770 case EGL_HORIZONTAL_RESOLUTION:
Geoff Lang40ac7832017-07-26 14:38:46 -04002771 *value = surface->getHorizontalResolution();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002772 break;
2773 case EGL_LARGEST_PBUFFER:
Geoff Lang40ac7832017-07-26 14:38:46 -04002774 // The EGL spec states that value is not written if the surface is not a pbuffer
2775 if (surface->getType() == EGL_PBUFFER_BIT)
2776 {
2777 *value = surface->getLargestPbuffer();
2778 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04002779 break;
2780 case EGL_MIPMAP_TEXTURE:
Geoff Lang40ac7832017-07-26 14:38:46 -04002781 // The EGL spec states that value is not written if the surface is not a pbuffer
2782 if (surface->getType() == EGL_PBUFFER_BIT)
2783 {
2784 *value = surface->getMipmapTexture();
2785 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04002786 break;
2787 case EGL_MIPMAP_LEVEL:
Geoff Lang40ac7832017-07-26 14:38:46 -04002788 // The EGL spec states that value is not written if the surface is not a pbuffer
2789 if (surface->getType() == EGL_PBUFFER_BIT)
2790 {
2791 *value = surface->getMipmapLevel();
2792 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04002793 break;
2794 case EGL_MULTISAMPLE_RESOLVE:
Geoff Lang40ac7832017-07-26 14:38:46 -04002795 *value = surface->getMultisampleResolve();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002796 break;
2797 case EGL_PIXEL_ASPECT_RATIO:
2798 *value = surface->getPixelAspectRatio();
2799 break;
2800 case EGL_RENDER_BUFFER:
2801 *value = surface->getRenderBuffer();
2802 break;
2803 case EGL_SWAP_BEHAVIOR:
2804 *value = surface->getSwapBehavior();
2805 break;
2806 case EGL_TEXTURE_FORMAT:
Geoff Lang40ac7832017-07-26 14:38:46 -04002807 // The EGL spec states that value is not written if the surface is not a pbuffer
2808 if (surface->getType() == EGL_PBUFFER_BIT)
2809 {
Geoff Lang8ceea812018-04-10 03:07:13 -04002810 *value = ToEGLenum(surface->getTextureFormat());
Geoff Lang40ac7832017-07-26 14:38:46 -04002811 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04002812 break;
2813 case EGL_TEXTURE_TARGET:
Geoff Lang40ac7832017-07-26 14:38:46 -04002814 // The EGL spec states that value is not written if the surface is not a pbuffer
2815 if (surface->getType() == EGL_PBUFFER_BIT)
2816 {
2817 *value = surface->getTextureTarget();
2818 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04002819 break;
2820 case EGL_VERTICAL_RESOLUTION:
Geoff Lang40ac7832017-07-26 14:38:46 -04002821 *value = surface->getVerticalResolution();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002822 break;
2823 case EGL_WIDTH:
2824 *value = surface->getWidth();
2825 break;
2826 case EGL_POST_SUB_BUFFER_SUPPORTED_NV:
2827 *value = surface->isPostSubBufferSupported();
2828 break;
2829 case EGL_FIXED_SIZE_ANGLE:
2830 *value = surface->isFixedSize();
2831 break;
2832 case EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE:
2833 *value = surface->flexibleSurfaceCompatibilityRequested();
2834 break;
2835 case EGL_SURFACE_ORIENTATION_ANGLE:
2836 *value = surface->getOrientation();
2837 break;
2838 case EGL_DIRECT_COMPOSITION_ANGLE:
2839 *value = surface->directComposition();
2840 break;
Geoff Langb433e872017-10-05 14:01:47 -04002841 case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
2842 *value = surface->isRobustResourceInitEnabled();
2843 break;
Geoff Lang31ecbd72017-07-26 13:01:27 -04002844 default:
2845 UNREACHABLE();
2846 break;
2847 }
2848}
2849
2850void SetSurfaceAttrib(Surface *surface, EGLint attribute, EGLint value)
2851{
2852 switch (attribute)
2853 {
2854 case EGL_MIPMAP_LEVEL:
Geoff Lang40ac7832017-07-26 14:38:46 -04002855 surface->setMipmapLevel(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04002856 break;
2857 case EGL_MULTISAMPLE_RESOLVE:
Geoff Lang40ac7832017-07-26 14:38:46 -04002858 surface->setMultisampleResolve(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04002859 break;
2860 case EGL_SWAP_BEHAVIOR:
Geoff Lang40ac7832017-07-26 14:38:46 -04002861 surface->setSwapBehavior(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04002862 break;
LRN03d132e2018-07-14 13:31:35 +00002863 case EGL_WIDTH:
2864 surface->setFixedWidth(value);
2865 break;
2866 case EGL_HEIGHT:
2867 surface->setFixedHeight(value);
2868 break;
Geoff Lang31ecbd72017-07-26 13:01:27 -04002869 default:
2870 UNREACHABLE();
2871 break;
2872 }
2873}
2874
Geoff Lang65603eb2017-01-12 16:48:03 -05002875} // namespace egl