blob: bc0d7e88d991132ac1bc52977c64e7cf25803e83 [file] [log] [blame]
Geoff Langff5b2d52016-09-07 11:32:23 -04001//
2// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// queryutils.cpp: Utilities for querying values from GL objects
8
9#include "libANGLE/queryutils.h"
10
Geoff Langc1984ed2016-10-07 12:41:00 -040011#include "common/utilities.h"
12
Geoff Langff5b2d52016-09-07 11:32:23 -040013#include "libANGLE/Buffer.h"
Geoff Lang65603eb2017-01-12 16:48:03 -050014#include "libANGLE/Config.h"
Jamie Madill4e0e6f82017-02-17 11:06:03 -050015#include "libANGLE/Context.h"
Geoff Lang38f2cfb2017-04-11 15:23:08 -040016#include "libANGLE/Fence.h"
Geoff Langff5b2d52016-09-07 11:32:23 -040017#include "libANGLE/Framebuffer.h"
Lingfeng Yangd0febe72018-05-17 22:36:52 -070018#include "libANGLE/GLES1State.h"
Geoff Langff5b2d52016-09-07 11:32:23 -040019#include "libANGLE/Program.h"
Geoff Lang740d9022016-10-07 11:20:52 -040020#include "libANGLE/Renderbuffer.h"
Geoff Langc1984ed2016-10-07 12:41:00 -040021#include "libANGLE/Sampler.h"
Geoff Langd7d0ed32016-10-07 11:33:51 -040022#include "libANGLE/Shader.h"
Geoff Lang31ecbd72017-07-26 13:01:27 -040023#include "libANGLE/Surface.h"
Geoff Langc1984ed2016-10-07 12:41:00 -040024#include "libANGLE/Texture.h"
Geoff Lang6899b872016-10-14 11:30:13 -040025#include "libANGLE/Uniform.h"
Geoff Lang0b031062016-10-13 14:30:04 -040026#include "libANGLE/VertexAttribute.h"
jchen10a99ed552017-09-22 08:10:32 +080027#include "libANGLE/queryconversions.h"
Geoff Langff5b2d52016-09-07 11:32:23 -040028
29namespace gl
30{
Geoff Langc1984ed2016-10-07 12:41:00 -040031
32namespace
33{
jchen10a99ed552017-09-22 08:10:32 +080034
Geoff Langc1984ed2016-10-07 12:41:00 -040035template <typename ParamType>
He Yunchao11b038b2016-11-22 21:24:04 +080036void QueryTexLevelParameterBase(const Texture *texture,
Corentin Wallez99d492c2018-02-27 15:17:10 -050037 TextureTarget target,
He Yunchao11b038b2016-11-22 21:24:04 +080038 GLint level,
39 GLenum pname,
40 ParamType *params)
41{
42 ASSERT(texture != nullptr);
43 const InternalFormat *info = texture->getTextureState().getImageDesc(target, level).format.info;
44
45 switch (pname)
46 {
47 case GL_TEXTURE_RED_TYPE:
jchen10a99ed552017-09-22 08:10:32 +080048 *params = CastFromGLintStateValue<ParamType>(
49 pname, info->redBits ? info->componentType : GL_NONE);
He Yunchao11b038b2016-11-22 21:24:04 +080050 break;
51 case GL_TEXTURE_GREEN_TYPE:
jchen10a99ed552017-09-22 08:10:32 +080052 *params = CastFromGLintStateValue<ParamType>(
53 pname, info->greenBits ? info->componentType : GL_NONE);
He Yunchao11b038b2016-11-22 21:24:04 +080054 break;
55 case GL_TEXTURE_BLUE_TYPE:
jchen10a99ed552017-09-22 08:10:32 +080056 *params = CastFromGLintStateValue<ParamType>(
57 pname, info->blueBits ? info->componentType : GL_NONE);
He Yunchao11b038b2016-11-22 21:24:04 +080058 break;
59 case GL_TEXTURE_ALPHA_TYPE:
jchen10a99ed552017-09-22 08:10:32 +080060 *params = CastFromGLintStateValue<ParamType>(
61 pname, info->alphaBits ? info->componentType : GL_NONE);
He Yunchao11b038b2016-11-22 21:24:04 +080062 break;
63 case GL_TEXTURE_DEPTH_TYPE:
jchen10a99ed552017-09-22 08:10:32 +080064 *params = CastFromGLintStateValue<ParamType>(
65 pname, info->depthBits ? info->componentType : GL_NONE);
He Yunchao11b038b2016-11-22 21:24:04 +080066 break;
67 case GL_TEXTURE_RED_SIZE:
jchen10a99ed552017-09-22 08:10:32 +080068 *params = CastFromGLintStateValue<ParamType>(pname, info->redBits);
He Yunchao11b038b2016-11-22 21:24:04 +080069 break;
70 case GL_TEXTURE_GREEN_SIZE:
jchen10a99ed552017-09-22 08:10:32 +080071 *params = CastFromGLintStateValue<ParamType>(pname, info->greenBits);
He Yunchao11b038b2016-11-22 21:24:04 +080072 break;
73 case GL_TEXTURE_BLUE_SIZE:
jchen10a99ed552017-09-22 08:10:32 +080074 *params = CastFromGLintStateValue<ParamType>(pname, info->blueBits);
He Yunchao11b038b2016-11-22 21:24:04 +080075 break;
76 case GL_TEXTURE_ALPHA_SIZE:
jchen10a99ed552017-09-22 08:10:32 +080077 *params = CastFromGLintStateValue<ParamType>(pname, info->alphaBits);
He Yunchao11b038b2016-11-22 21:24:04 +080078 break;
79 case GL_TEXTURE_DEPTH_SIZE:
jchen10a99ed552017-09-22 08:10:32 +080080 *params = CastFromGLintStateValue<ParamType>(pname, info->depthBits);
He Yunchao11b038b2016-11-22 21:24:04 +080081 break;
82 case GL_TEXTURE_STENCIL_SIZE:
jchen10a99ed552017-09-22 08:10:32 +080083 *params = CastFromGLintStateValue<ParamType>(pname, info->stencilBits);
He Yunchao11b038b2016-11-22 21:24:04 +080084 break;
85 case GL_TEXTURE_SHARED_SIZE:
jchen10a99ed552017-09-22 08:10:32 +080086 *params = CastFromGLintStateValue<ParamType>(pname, info->sharedBits);
He Yunchao11b038b2016-11-22 21:24:04 +080087 break;
88 case GL_TEXTURE_INTERNAL_FORMAT:
jchen10a99ed552017-09-22 08:10:32 +080089 *params = CastFromGLintStateValue<ParamType>(
90 pname, info->internalFormat ? info->internalFormat : GL_RGBA);
He Yunchao11b038b2016-11-22 21:24:04 +080091 break;
92 case GL_TEXTURE_WIDTH:
Corentin Wallez10d40262017-10-04 16:34:09 -040093 *params = CastFromGLintStateValue<ParamType>(
94 pname, static_cast<uint32_t>(texture->getWidth(target, level)));
He Yunchao11b038b2016-11-22 21:24:04 +080095 break;
96 case GL_TEXTURE_HEIGHT:
Corentin Wallez10d40262017-10-04 16:34:09 -040097 *params = CastFromGLintStateValue<ParamType>(
98 pname, static_cast<uint32_t>(texture->getHeight(target, level)));
He Yunchao11b038b2016-11-22 21:24:04 +080099 break;
100 case GL_TEXTURE_DEPTH:
Corentin Wallez10d40262017-10-04 16:34:09 -0400101 *params = CastFromGLintStateValue<ParamType>(
102 pname, static_cast<uint32_t>(texture->getDepth(target, level)));
He Yunchao11b038b2016-11-22 21:24:04 +0800103 break;
104 case GL_TEXTURE_SAMPLES:
jchen10a99ed552017-09-22 08:10:32 +0800105 *params = CastFromStateValue<ParamType>(pname, texture->getSamples(target, level));
He Yunchao11b038b2016-11-22 21:24:04 +0800106 break;
107 case GL_TEXTURE_FIXED_SAMPLE_LOCATIONS:
jchen10a99ed552017-09-22 08:10:32 +0800108 *params = CastFromStateValue<ParamType>(
109 pname, static_cast<GLint>(texture->getFixedSampleLocations(target, level)));
He Yunchao11b038b2016-11-22 21:24:04 +0800110 break;
111 case GL_TEXTURE_COMPRESSED:
jchen10a99ed552017-09-22 08:10:32 +0800112 *params = CastFromStateValue<ParamType>(pname, static_cast<GLint>(info->compressed));
He Yunchao11b038b2016-11-22 21:24:04 +0800113 break;
114 default:
115 UNREACHABLE();
116 break;
117 }
118}
119
120template <typename ParamType>
Geoff Langc1984ed2016-10-07 12:41:00 -0400121void QueryTexParameterBase(const Texture *texture, GLenum pname, ParamType *params)
122{
123 ASSERT(texture != nullptr);
124
125 switch (pname)
126 {
127 case GL_TEXTURE_MAG_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800128 *params = CastFromGLintStateValue<ParamType>(pname, texture->getMagFilter());
Geoff Langc1984ed2016-10-07 12:41:00 -0400129 break;
130 case GL_TEXTURE_MIN_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800131 *params = CastFromGLintStateValue<ParamType>(pname, texture->getMinFilter());
Geoff Langc1984ed2016-10-07 12:41:00 -0400132 break;
133 case GL_TEXTURE_WRAP_S:
jchen10a99ed552017-09-22 08:10:32 +0800134 *params = CastFromGLintStateValue<ParamType>(pname, texture->getWrapS());
Geoff Langc1984ed2016-10-07 12:41:00 -0400135 break;
136 case GL_TEXTURE_WRAP_T:
jchen10a99ed552017-09-22 08:10:32 +0800137 *params = CastFromGLintStateValue<ParamType>(pname, texture->getWrapT());
Geoff Langc1984ed2016-10-07 12:41:00 -0400138 break;
139 case GL_TEXTURE_WRAP_R:
jchen10a99ed552017-09-22 08:10:32 +0800140 *params = CastFromGLintStateValue<ParamType>(pname, texture->getWrapR());
Geoff Langc1984ed2016-10-07 12:41:00 -0400141 break;
142 case GL_TEXTURE_IMMUTABLE_FORMAT:
jchen10a99ed552017-09-22 08:10:32 +0800143 *params = CastFromGLintStateValue<ParamType>(pname, texture->getImmutableFormat());
Geoff Langc1984ed2016-10-07 12:41:00 -0400144 break;
145 case GL_TEXTURE_IMMUTABLE_LEVELS:
jchen10a99ed552017-09-22 08:10:32 +0800146 *params = CastFromGLintStateValue<ParamType>(pname, texture->getImmutableLevels());
Geoff Langc1984ed2016-10-07 12:41:00 -0400147 break;
148 case GL_TEXTURE_USAGE_ANGLE:
jchen10a99ed552017-09-22 08:10:32 +0800149 *params = CastFromGLintStateValue<ParamType>(pname, texture->getUsage());
Geoff Langc1984ed2016-10-07 12:41:00 -0400150 break;
151 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800152 *params = CastFromStateValue<ParamType>(pname, texture->getMaxAnisotropy());
Geoff Langc1984ed2016-10-07 12:41:00 -0400153 break;
154 case GL_TEXTURE_SWIZZLE_R:
jchen10a99ed552017-09-22 08:10:32 +0800155 *params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleRed());
Geoff Langc1984ed2016-10-07 12:41:00 -0400156 break;
157 case GL_TEXTURE_SWIZZLE_G:
jchen10a99ed552017-09-22 08:10:32 +0800158 *params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleGreen());
Geoff Langc1984ed2016-10-07 12:41:00 -0400159 break;
160 case GL_TEXTURE_SWIZZLE_B:
jchen10a99ed552017-09-22 08:10:32 +0800161 *params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleBlue());
Geoff Langc1984ed2016-10-07 12:41:00 -0400162 break;
163 case GL_TEXTURE_SWIZZLE_A:
jchen10a99ed552017-09-22 08:10:32 +0800164 *params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleAlpha());
Geoff Langc1984ed2016-10-07 12:41:00 -0400165 break;
166 case GL_TEXTURE_BASE_LEVEL:
jchen10a99ed552017-09-22 08:10:32 +0800167 *params = CastFromGLintStateValue<ParamType>(pname, texture->getBaseLevel());
Geoff Langc1984ed2016-10-07 12:41:00 -0400168 break;
169 case GL_TEXTURE_MAX_LEVEL:
jchen10a99ed552017-09-22 08:10:32 +0800170 *params = CastFromGLintStateValue<ParamType>(pname, texture->getMaxLevel());
Geoff Langc1984ed2016-10-07 12:41:00 -0400171 break;
172 case GL_TEXTURE_MIN_LOD:
Jamie Madill097d3c02018-09-12 11:03:05 -0400173 *params = CastFromStateValue<ParamType>(pname, texture->getMinLod());
Geoff Langc1984ed2016-10-07 12:41:00 -0400174 break;
175 case GL_TEXTURE_MAX_LOD:
Jamie Madill097d3c02018-09-12 11:03:05 -0400176 *params = CastFromStateValue<ParamType>(pname, texture->getMaxLod());
Geoff Langc1984ed2016-10-07 12:41:00 -0400177 break;
178 case GL_TEXTURE_COMPARE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800179 *params = CastFromGLintStateValue<ParamType>(pname, texture->getCompareMode());
Geoff Langc1984ed2016-10-07 12:41:00 -0400180 break;
181 case GL_TEXTURE_COMPARE_FUNC:
jchen10a99ed552017-09-22 08:10:32 +0800182 *params = CastFromGLintStateValue<ParamType>(pname, texture->getCompareFunc());
Geoff Langc1984ed2016-10-07 12:41:00 -0400183 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700184 case GL_TEXTURE_SRGB_DECODE_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800185 *params = CastFromGLintStateValue<ParamType>(pname, texture->getSRGBDecode());
Geoff Lang81c6b572016-10-19 14:07:52 -0700186 break;
Yunchao Hebacaa712018-01-30 14:01:39 +0800187 case GL_DEPTH_STENCIL_TEXTURE_MODE:
188 *params =
189 CastFromGLintStateValue<ParamType>(pname, texture->getDepthStencilTextureMode());
190 break;
Lingfeng Yangf97641c2018-06-21 19:22:45 -0700191 case GL_TEXTURE_CROP_RECT_OES:
192 {
193 const gl::Rectangle &crop = texture->getCrop();
194 params[0] = CastFromGLintStateValue<ParamType>(pname, crop.x);
195 params[1] = CastFromGLintStateValue<ParamType>(pname, crop.y);
196 params[2] = CastFromGLintStateValue<ParamType>(pname, crop.width);
197 params[3] = CastFromGLintStateValue<ParamType>(pname, crop.height);
198 break;
199 }
200 case GL_GENERATE_MIPMAP:
201 *params = CastFromGLintStateValue<ParamType>(pname, texture->getGenerateMipmapHint());
202 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400203 default:
204 UNREACHABLE();
205 break;
206 }
207}
208
209template <typename ParamType>
Jamie Madill4928b7c2017-06-20 12:57:39 -0400210void SetTexParameterBase(Context *context, Texture *texture, GLenum pname, const ParamType *params)
Geoff Langc1984ed2016-10-07 12:41:00 -0400211{
212 ASSERT(texture != nullptr);
213
214 switch (pname)
215 {
216 case GL_TEXTURE_WRAP_S:
jchen10a99ed552017-09-22 08:10:32 +0800217 texture->setWrapS(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400218 break;
219 case GL_TEXTURE_WRAP_T:
jchen10a99ed552017-09-22 08:10:32 +0800220 texture->setWrapT(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400221 break;
222 case GL_TEXTURE_WRAP_R:
jchen10a99ed552017-09-22 08:10:32 +0800223 texture->setWrapR(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400224 break;
225 case GL_TEXTURE_MIN_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800226 texture->setMinFilter(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400227 break;
228 case GL_TEXTURE_MAG_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800229 texture->setMagFilter(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400230 break;
231 case GL_TEXTURE_USAGE_ANGLE:
jchen10a99ed552017-09-22 08:10:32 +0800232 texture->setUsage(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400233 break;
234 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800235 texture->setMaxAnisotropy(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400236 break;
237 case GL_TEXTURE_COMPARE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800238 texture->setCompareMode(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400239 break;
240 case GL_TEXTURE_COMPARE_FUNC:
jchen10a99ed552017-09-22 08:10:32 +0800241 texture->setCompareFunc(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400242 break;
243 case GL_TEXTURE_SWIZZLE_R:
jchen10a99ed552017-09-22 08:10:32 +0800244 texture->setSwizzleRed(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400245 break;
246 case GL_TEXTURE_SWIZZLE_G:
jchen10a99ed552017-09-22 08:10:32 +0800247 texture->setSwizzleGreen(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400248 break;
249 case GL_TEXTURE_SWIZZLE_B:
jchen10a99ed552017-09-22 08:10:32 +0800250 texture->setSwizzleBlue(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400251 break;
252 case GL_TEXTURE_SWIZZLE_A:
jchen10a99ed552017-09-22 08:10:32 +0800253 texture->setSwizzleAlpha(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400254 break;
255 case GL_TEXTURE_BASE_LEVEL:
Jamie Madill4928b7c2017-06-20 12:57:39 -0400256 {
jchen10a99ed552017-09-22 08:10:32 +0800257 context->handleError(texture->setBaseLevel(
258 context, clampCast<GLuint>(CastQueryValueTo<GLint>(pname, params[0]))));
Geoff Langc1984ed2016-10-07 12:41:00 -0400259 break;
Jamie Madill4928b7c2017-06-20 12:57:39 -0400260 }
Geoff Langc1984ed2016-10-07 12:41:00 -0400261 case GL_TEXTURE_MAX_LEVEL:
jchen10a99ed552017-09-22 08:10:32 +0800262 texture->setMaxLevel(clampCast<GLuint>(CastQueryValueTo<GLint>(pname, params[0])));
Geoff Langc1984ed2016-10-07 12:41:00 -0400263 break;
264 case GL_TEXTURE_MIN_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800265 texture->setMinLod(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400266 break;
267 case GL_TEXTURE_MAX_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800268 texture->setMaxLod(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400269 break;
Geoff Lang3b573612016-10-31 14:08:10 -0400270 case GL_DEPTH_STENCIL_TEXTURE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800271 texture->setDepthStencilTextureMode(ConvertToGLenum(pname, params[0]));
Geoff Lang3b573612016-10-31 14:08:10 -0400272 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700273 case GL_TEXTURE_SRGB_DECODE_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800274 texture->setSRGBDecode(ConvertToGLenum(pname, params[0]));
Geoff Lang81c6b572016-10-19 14:07:52 -0700275 break;
Lingfeng Yangf97641c2018-06-21 19:22:45 -0700276 case GL_TEXTURE_CROP_RECT_OES:
277 texture->setCrop(gl::Rectangle(CastQueryValueTo<GLint>(pname, params[0]),
278 CastQueryValueTo<GLint>(pname, params[1]),
279 CastQueryValueTo<GLint>(pname, params[2]),
280 CastQueryValueTo<GLint>(pname, params[3])));
281 break;
282 case GL_GENERATE_MIPMAP:
283 texture->setGenerateMipmapHint(ConvertToGLenum(params[0]));
284 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400285 default:
286 UNREACHABLE();
287 break;
288 }
289}
290
291template <typename ParamType>
292void QuerySamplerParameterBase(const Sampler *sampler, GLenum pname, ParamType *params)
293{
294 switch (pname)
295 {
296 case GL_TEXTURE_MIN_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800297 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getMinFilter());
Geoff Langc1984ed2016-10-07 12:41:00 -0400298 break;
299 case GL_TEXTURE_MAG_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800300 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getMagFilter());
Geoff Langc1984ed2016-10-07 12:41:00 -0400301 break;
302 case GL_TEXTURE_WRAP_S:
jchen10a99ed552017-09-22 08:10:32 +0800303 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getWrapS());
Geoff Langc1984ed2016-10-07 12:41:00 -0400304 break;
305 case GL_TEXTURE_WRAP_T:
jchen10a99ed552017-09-22 08:10:32 +0800306 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getWrapT());
Geoff Langc1984ed2016-10-07 12:41:00 -0400307 break;
308 case GL_TEXTURE_WRAP_R:
jchen10a99ed552017-09-22 08:10:32 +0800309 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getWrapR());
Geoff Langc1984ed2016-10-07 12:41:00 -0400310 break;
311 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800312 *params = CastFromStateValue<ParamType>(pname, sampler->getMaxAnisotropy());
Geoff Langc1984ed2016-10-07 12:41:00 -0400313 break;
314 case GL_TEXTURE_MIN_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800315 *params = CastFromStateValue<ParamType>(pname, sampler->getMinLod());
Geoff Langc1984ed2016-10-07 12:41:00 -0400316 break;
317 case GL_TEXTURE_MAX_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800318 *params = CastFromStateValue<ParamType>(pname, sampler->getMaxLod());
Geoff Langc1984ed2016-10-07 12:41:00 -0400319 break;
320 case GL_TEXTURE_COMPARE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800321 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getCompareMode());
Geoff Langc1984ed2016-10-07 12:41:00 -0400322 break;
323 case GL_TEXTURE_COMPARE_FUNC:
jchen10a99ed552017-09-22 08:10:32 +0800324 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getCompareFunc());
Geoff Langc1984ed2016-10-07 12:41:00 -0400325 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700326 case GL_TEXTURE_SRGB_DECODE_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800327 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getSRGBDecode());
Geoff Lang81c6b572016-10-19 14:07:52 -0700328 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400329 default:
330 UNREACHABLE();
331 break;
332 }
333}
334
335template <typename ParamType>
Jamie Madille25b8002018-09-20 13:39:49 -0400336void SetSamplerParameterBase(Context *context,
337 Sampler *sampler,
338 GLenum pname,
339 const ParamType *params)
Geoff Langc1984ed2016-10-07 12:41:00 -0400340{
341 switch (pname)
342 {
343 case GL_TEXTURE_WRAP_S:
jchen10a99ed552017-09-22 08:10:32 +0800344 sampler->setWrapS(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400345 break;
346 case GL_TEXTURE_WRAP_T:
jchen10a99ed552017-09-22 08:10:32 +0800347 sampler->setWrapT(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400348 break;
349 case GL_TEXTURE_WRAP_R:
jchen10a99ed552017-09-22 08:10:32 +0800350 sampler->setWrapR(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400351 break;
352 case GL_TEXTURE_MIN_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800353 sampler->setMinFilter(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400354 break;
355 case GL_TEXTURE_MAG_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800356 sampler->setMagFilter(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400357 break;
358 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800359 sampler->setMaxAnisotropy(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400360 break;
361 case GL_TEXTURE_COMPARE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800362 sampler->setCompareMode(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400363 break;
364 case GL_TEXTURE_COMPARE_FUNC:
jchen10a99ed552017-09-22 08:10:32 +0800365 sampler->setCompareFunc(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400366 break;
367 case GL_TEXTURE_MIN_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800368 sampler->setMinLod(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400369 break;
370 case GL_TEXTURE_MAX_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800371 sampler->setMaxLod(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400372 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700373 case GL_TEXTURE_SRGB_DECODE_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800374 sampler->setSRGBDecode(ConvertToGLenum(pname, params[0]));
Geoff Lang81c6b572016-10-19 14:07:52 -0700375 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400376 default:
377 UNREACHABLE();
378 break;
379 }
Jamie Madille25b8002018-09-20 13:39:49 -0400380
381 sampler->onStateChange(context, angle::SubjectMessage::CONTENTS_CHANGED);
Geoff Langc1984ed2016-10-07 12:41:00 -0400382}
383
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800384// Warning: you should ensure binding really matches attrib.bindingIndex before using this function.
Geoff Lang0b031062016-10-13 14:30:04 -0400385template <typename ParamType, typename CurrentDataType, size_t CurrentValueCount>
386void QueryVertexAttribBase(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800387 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -0400388 const CurrentDataType (&currentValueData)[CurrentValueCount],
389 GLenum pname,
390 ParamType *params)
391{
392 switch (pname)
393 {
394 case GL_CURRENT_VERTEX_ATTRIB:
395 for (size_t i = 0; i < CurrentValueCount; ++i)
396 {
jchen10a99ed552017-09-22 08:10:32 +0800397 params[i] = CastFromStateValue<ParamType>(pname, currentValueData[i]);
Geoff Lang0b031062016-10-13 14:30:04 -0400398 }
399 break;
400 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
jchen10a99ed552017-09-22 08:10:32 +0800401 *params = CastFromStateValue<ParamType>(pname, static_cast<GLint>(attrib.enabled));
Geoff Lang0b031062016-10-13 14:30:04 -0400402 break;
403 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
jchen10a99ed552017-09-22 08:10:32 +0800404 *params = CastFromGLintStateValue<ParamType>(pname, attrib.size);
Geoff Lang0b031062016-10-13 14:30:04 -0400405 break;
406 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
jchen10a99ed552017-09-22 08:10:32 +0800407 *params = CastFromGLintStateValue<ParamType>(pname, attrib.vertexAttribArrayStride);
Geoff Lang0b031062016-10-13 14:30:04 -0400408 break;
409 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
jchen10a99ed552017-09-22 08:10:32 +0800410 *params = CastFromGLintStateValue<ParamType>(pname, attrib.type);
Geoff Lang0b031062016-10-13 14:30:04 -0400411 break;
412 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
jchen10a99ed552017-09-22 08:10:32 +0800413 *params = CastFromStateValue<ParamType>(pname, static_cast<GLint>(attrib.normalized));
Geoff Lang0b031062016-10-13 14:30:04 -0400414 break;
415 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
jchen10a99ed552017-09-22 08:10:32 +0800416 *params = CastFromGLintStateValue<ParamType>(pname, binding.getBuffer().id());
Geoff Lang0b031062016-10-13 14:30:04 -0400417 break;
418 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
jchen10a99ed552017-09-22 08:10:32 +0800419 *params = CastFromGLintStateValue<ParamType>(pname, binding.getDivisor());
Geoff Lang0b031062016-10-13 14:30:04 -0400420 break;
421 case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
jchen10a99ed552017-09-22 08:10:32 +0800422 *params = CastFromGLintStateValue<ParamType>(pname, attrib.pureInteger);
Geoff Lang0b031062016-10-13 14:30:04 -0400423 break;
Shao80957d92017-02-20 21:25:59 +0800424 case GL_VERTEX_ATTRIB_BINDING:
jchen10a99ed552017-09-22 08:10:32 +0800425 *params = CastFromGLintStateValue<ParamType>(pname, attrib.bindingIndex);
Shao80957d92017-02-20 21:25:59 +0800426 break;
427 case GL_VERTEX_ATTRIB_RELATIVE_OFFSET:
jchen10a99ed552017-09-22 08:10:32 +0800428 *params = CastFromGLintStateValue<ParamType>(pname, attrib.relativeOffset);
Shao80957d92017-02-20 21:25:59 +0800429 break;
Geoff Lang0b031062016-10-13 14:30:04 -0400430 default:
431 UNREACHABLE();
432 break;
433 }
434}
435
Geoff Langebebe1c2016-10-14 12:01:31 -0400436template <typename ParamType>
437void QueryBufferParameterBase(const Buffer *buffer, GLenum pname, ParamType *params)
438{
439 ASSERT(buffer != nullptr);
440
441 switch (pname)
442 {
443 case GL_BUFFER_USAGE:
Corentin Wallez2e568cf2017-09-18 17:05:22 -0400444 *params = CastFromGLintStateValue<ParamType>(pname, ToGLenum(buffer->getUsage()));
Geoff Langebebe1c2016-10-14 12:01:31 -0400445 break;
446 case GL_BUFFER_SIZE:
jchen10a99ed552017-09-22 08:10:32 +0800447 *params = CastFromStateValue<ParamType>(pname, buffer->getSize());
Geoff Langebebe1c2016-10-14 12:01:31 -0400448 break;
449 case GL_BUFFER_ACCESS_FLAGS:
jchen10a99ed552017-09-22 08:10:32 +0800450 *params = CastFromGLintStateValue<ParamType>(pname, buffer->getAccessFlags());
Geoff Langebebe1c2016-10-14 12:01:31 -0400451 break;
452 case GL_BUFFER_ACCESS_OES:
jchen10a99ed552017-09-22 08:10:32 +0800453 *params = CastFromGLintStateValue<ParamType>(pname, buffer->getAccess());
Geoff Langebebe1c2016-10-14 12:01:31 -0400454 break;
455 case GL_BUFFER_MAPPED:
jchen10a99ed552017-09-22 08:10:32 +0800456 *params = CastFromStateValue<ParamType>(pname, buffer->isMapped());
Geoff Langebebe1c2016-10-14 12:01:31 -0400457 break;
458 case GL_BUFFER_MAP_OFFSET:
jchen10a99ed552017-09-22 08:10:32 +0800459 *params = CastFromStateValue<ParamType>(pname, buffer->getMapOffset());
Geoff Langebebe1c2016-10-14 12:01:31 -0400460 break;
461 case GL_BUFFER_MAP_LENGTH:
jchen10a99ed552017-09-22 08:10:32 +0800462 *params = CastFromStateValue<ParamType>(pname, buffer->getMapLength());
Geoff Langebebe1c2016-10-14 12:01:31 -0400463 break;
464 default:
465 UNREACHABLE();
466 break;
467 }
468}
469
Olli Etuaho465835d2017-09-26 13:34:10 +0300470GLint GetCommonVariableProperty(const sh::ShaderVariable &var, GLenum prop)
jchen10880683b2017-04-12 16:21:55 +0800471{
472 switch (prop)
473 {
474 case GL_TYPE:
jchen10a99ed552017-09-22 08:10:32 +0800475 return clampCast<GLint>(var.type);
jchen10880683b2017-04-12 16:21:55 +0800476
477 case GL_ARRAY_SIZE:
Olli Etuaho465835d2017-09-26 13:34:10 +0300478 // Queryable variables are guaranteed not to be arrays of arrays or arrays of structs,
479 // see GLES 3.1 spec section 7.3.1.1 page 77.
480 return clampCast<GLint>(var.getBasicTypeElementCount());
jchen10880683b2017-04-12 16:21:55 +0800481
482 case GL_NAME_LENGTH:
jchen10880683b2017-04-12 16:21:55 +0800483 // ES31 spec p84: This counts the terminating null char.
Olli Etuahod2551232017-10-26 20:03:33 +0300484 return clampCast<GLint>(var.name.size() + 1u);
jchen10880683b2017-04-12 16:21:55 +0800485
486 default:
487 UNREACHABLE();
488 return GL_INVALID_VALUE;
489 }
490}
491
492GLint GetInputResourceProperty(const Program *program, GLuint index, GLenum prop)
493{
494 const auto &attribute = program->getInputResource(index);
495 switch (prop)
496 {
497 case GL_TYPE:
498 case GL_ARRAY_SIZE:
jchen10880683b2017-04-12 16:21:55 +0800499 case GL_NAME_LENGTH:
Olli Etuaho465835d2017-09-26 13:34:10 +0300500 return GetCommonVariableProperty(attribute, prop);
jchen10880683b2017-04-12 16:21:55 +0800501
jchen10baf5d942017-08-28 20:45:48 +0800502 case GL_LOCATION:
503 return program->getAttributeLocation(attribute.name);
504
jchen10880683b2017-04-12 16:21:55 +0800505 case GL_REFERENCED_BY_VERTEX_SHADER:
506 return 1;
507
508 case GL_REFERENCED_BY_FRAGMENT_SHADER:
509 case GL_REFERENCED_BY_COMPUTE_SHADER:
Jiawei Shaoc6f82872018-04-24 14:14:50 +0800510 case GL_REFERENCED_BY_GEOMETRY_SHADER_EXT:
jchen10880683b2017-04-12 16:21:55 +0800511 return 0;
512
513 default:
514 UNREACHABLE();
515 return GL_INVALID_VALUE;
516 }
517}
518
519GLint GetOutputResourceProperty(const Program *program, GLuint index, const GLenum prop)
520{
521 const auto &outputVariable = program->getOutputResource(index);
522 switch (prop)
523 {
524 case GL_TYPE:
525 case GL_ARRAY_SIZE:
jchen10880683b2017-04-12 16:21:55 +0800526 case GL_NAME_LENGTH:
Olli Etuaho465835d2017-09-26 13:34:10 +0300527 return GetCommonVariableProperty(outputVariable, prop);
jchen10880683b2017-04-12 16:21:55 +0800528
jchen10baf5d942017-08-28 20:45:48 +0800529 case GL_LOCATION:
530 return program->getFragDataLocation(outputVariable.name);
531
jchen10880683b2017-04-12 16:21:55 +0800532 case GL_REFERENCED_BY_FRAGMENT_SHADER:
533 return 1;
534
Jiawei Shaoc6f82872018-04-24 14:14:50 +0800535 case GL_REFERENCED_BY_VERTEX_SHADER:
jchen10880683b2017-04-12 16:21:55 +0800536 case GL_REFERENCED_BY_COMPUTE_SHADER:
Jiawei Shaoc6f82872018-04-24 14:14:50 +0800537 case GL_REFERENCED_BY_GEOMETRY_SHADER_EXT:
jchen10880683b2017-04-12 16:21:55 +0800538 return 0;
539
540 default:
541 UNREACHABLE();
542 return GL_INVALID_VALUE;
543 }
544}
545
jchen10910a3da2017-11-15 09:40:11 +0800546GLint GetTransformFeedbackVaryingResourceProperty(const Program *program,
547 GLuint index,
548 const GLenum prop)
549{
550 const auto &tfVariable = program->getTransformFeedbackVaryingResource(index);
551 switch (prop)
552 {
553 case GL_TYPE:
554 return clampCast<GLint>(tfVariable.type);
555
556 case GL_ARRAY_SIZE:
557 return clampCast<GLint>(tfVariable.size());
558
559 case GL_NAME_LENGTH:
560 return clampCast<GLint>(tfVariable.nameWithArrayIndex().size() + 1);
561
562 default:
563 UNREACHABLE();
564 return GL_INVALID_VALUE;
565 }
566}
567
jchen10d9cd7b72017-08-30 15:04:25 +0800568GLint QueryProgramInterfaceActiveResources(const Program *program, GLenum programInterface)
569{
570 switch (programInterface)
571 {
572 case GL_PROGRAM_INPUT:
jchen10a99ed552017-09-22 08:10:32 +0800573 return clampCast<GLint>(program->getAttributes().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800574
575 case GL_PROGRAM_OUTPUT:
jchen10a99ed552017-09-22 08:10:32 +0800576 return clampCast<GLint>(program->getState().getOutputVariables().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800577
578 case GL_UNIFORM:
jchen10a99ed552017-09-22 08:10:32 +0800579 return clampCast<GLint>(program->getState().getUniforms().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800580
581 case GL_UNIFORM_BLOCK:
jchen10a99ed552017-09-22 08:10:32 +0800582 return clampCast<GLint>(program->getState().getUniformBlocks().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800583
jchen1058f67be2017-10-27 08:59:27 +0800584 case GL_ATOMIC_COUNTER_BUFFER:
585 return clampCast<GLint>(program->getState().getAtomicCounterBuffers().size());
586
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800587 case GL_BUFFER_VARIABLE:
588 return clampCast<GLint>(program->getState().getBufferVariables().size());
589
590 case GL_SHADER_STORAGE_BLOCK:
591 return clampCast<GLint>(program->getState().getShaderStorageBlocks().size());
592
jchen10d9cd7b72017-08-30 15:04:25 +0800593 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10910a3da2017-11-15 09:40:11 +0800594 return clampCast<GLint>(program->getTransformFeedbackVaryingCount());
jchen10d9cd7b72017-08-30 15:04:25 +0800595
596 default:
597 UNREACHABLE();
598 return 0;
599 }
600}
601
602template <typename T, typename M>
603GLint FindMaxSize(const std::vector<T> &resources, M member)
604{
605 GLint max = 0;
606 for (const T &resource : resources)
607 {
jchen10a99ed552017-09-22 08:10:32 +0800608 max = std::max(max, clampCast<GLint>((resource.*member).size()));
jchen10d9cd7b72017-08-30 15:04:25 +0800609 }
610 return max;
611}
612
613GLint QueryProgramInterfaceMaxNameLength(const Program *program, GLenum programInterface)
614{
615 GLint maxNameLength = 0;
616 switch (programInterface)
617 {
618 case GL_PROGRAM_INPUT:
619 maxNameLength = FindMaxSize(program->getAttributes(), &sh::Attribute::name);
620 break;
621
622 case GL_PROGRAM_OUTPUT:
623 maxNameLength =
624 FindMaxSize(program->getState().getOutputVariables(), &sh::OutputVariable::name);
625 break;
626
627 case GL_UNIFORM:
628 maxNameLength = FindMaxSize(program->getState().getUniforms(), &LinkedUniform::name);
629 break;
630
631 case GL_UNIFORM_BLOCK:
Qin Jiajia9bf55522018-01-29 13:56:23 +0800632 return program->getActiveUniformBlockMaxNameLength();
jchen10d9cd7b72017-08-30 15:04:25 +0800633
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800634 case GL_BUFFER_VARIABLE:
635 maxNameLength =
636 FindMaxSize(program->getState().getBufferVariables(), &BufferVariable::name);
637 break;
638
639 case GL_SHADER_STORAGE_BLOCK:
Qin Jiajia9bf55522018-01-29 13:56:23 +0800640 return program->getActiveShaderStorageBlockMaxNameLength();
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800641
jchen10d9cd7b72017-08-30 15:04:25 +0800642 case GL_TRANSFORM_FEEDBACK_VARYING:
Qin Jiajia9bf55522018-01-29 13:56:23 +0800643 return clampCast<GLint>(program->getTransformFeedbackVaryingMaxLength());
jchen10d9cd7b72017-08-30 15:04:25 +0800644
645 default:
646 UNREACHABLE();
647 return 0;
648 }
649 // This length includes an extra character for the null terminator.
650 return (maxNameLength == 0 ? 0 : maxNameLength + 1);
651}
652
653GLint QueryProgramInterfaceMaxNumActiveVariables(const Program *program, GLenum programInterface)
654{
655 switch (programInterface)
656 {
657 case GL_UNIFORM_BLOCK:
658 return FindMaxSize(program->getState().getUniformBlocks(),
Jiajia Qin729b2c62017-08-14 09:36:11 +0800659 &InterfaceBlock::memberIndexes);
jchen1058f67be2017-10-27 08:59:27 +0800660 case GL_ATOMIC_COUNTER_BUFFER:
661 return FindMaxSize(program->getState().getAtomicCounterBuffers(),
662 &AtomicCounterBuffer::memberIndexes);
jchen10d9cd7b72017-08-30 15:04:25 +0800663
jchen10d9cd7b72017-08-30 15:04:25 +0800664 case GL_SHADER_STORAGE_BLOCK:
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800665 return FindMaxSize(program->getState().getShaderStorageBlocks(),
666 &InterfaceBlock::memberIndexes);
jchen10d9cd7b72017-08-30 15:04:25 +0800667
668 default:
669 UNREACHABLE();
670 return 0;
671 }
672}
673
jchen10baf5d942017-08-28 20:45:48 +0800674GLenum GetUniformPropertyEnum(GLenum prop)
675{
676 switch (prop)
677 {
678 case GL_UNIFORM_TYPE:
679 return GL_TYPE;
680 case GL_UNIFORM_SIZE:
681 return GL_ARRAY_SIZE;
682 case GL_UNIFORM_NAME_LENGTH:
683 return GL_NAME_LENGTH;
684 case GL_UNIFORM_BLOCK_INDEX:
685 return GL_BLOCK_INDEX;
686 case GL_UNIFORM_OFFSET:
687 return GL_OFFSET;
688 case GL_UNIFORM_ARRAY_STRIDE:
689 return GL_ARRAY_STRIDE;
690 case GL_UNIFORM_MATRIX_STRIDE:
691 return GL_MATRIX_STRIDE;
692 case GL_UNIFORM_IS_ROW_MAJOR:
693 return GL_IS_ROW_MAJOR;
694
695 default:
696 return prop;
697 }
698}
699
jchen1058f67be2017-10-27 08:59:27 +0800700GLenum GetUniformBlockPropertyEnum(GLenum prop)
701{
702 switch (prop)
703 {
704 case GL_UNIFORM_BLOCK_BINDING:
705 return GL_BUFFER_BINDING;
706
707 case GL_UNIFORM_BLOCK_DATA_SIZE:
708 return GL_BUFFER_DATA_SIZE;
709
710 case GL_UNIFORM_BLOCK_NAME_LENGTH:
711 return GL_NAME_LENGTH;
712
713 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
714 return GL_NUM_ACTIVE_VARIABLES;
715
716 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
717 return GL_ACTIVE_VARIABLES;
718
719 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
720 return GL_REFERENCED_BY_VERTEX_SHADER;
721
722 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
723 return GL_REFERENCED_BY_FRAGMENT_SHADER;
724
725 default:
726 return prop;
727 }
728}
729
730void GetShaderVariableBufferResourceProperty(const ShaderVariableBuffer &buffer,
731 GLenum pname,
732 GLint *params,
733 GLsizei bufSize,
734 GLsizei *outputPosition)
735
736{
737 switch (pname)
738 {
739 case GL_BUFFER_BINDING:
740 params[(*outputPosition)++] = buffer.binding;
741 break;
742 case GL_BUFFER_DATA_SIZE:
743 params[(*outputPosition)++] = clampCast<GLint>(buffer.dataSize);
744 break;
745 case GL_NUM_ACTIVE_VARIABLES:
746 params[(*outputPosition)++] = buffer.numActiveVariables();
747 break;
748 case GL_ACTIVE_VARIABLES:
749 for (size_t memberIndex = 0;
750 memberIndex < buffer.memberIndexes.size() && *outputPosition < bufSize;
751 ++memberIndex)
752 {
753 params[(*outputPosition)++] = clampCast<GLint>(buffer.memberIndexes[memberIndex]);
754 }
755 break;
756 case GL_REFERENCED_BY_VERTEX_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +0800757 params[(*outputPosition)++] = static_cast<GLint>(buffer.isActive(ShaderType::Vertex));
jchen1058f67be2017-10-27 08:59:27 +0800758 break;
759 case GL_REFERENCED_BY_FRAGMENT_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +0800760 params[(*outputPosition)++] = static_cast<GLint>(buffer.isActive(ShaderType::Fragment));
jchen1058f67be2017-10-27 08:59:27 +0800761 break;
762 case GL_REFERENCED_BY_COMPUTE_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +0800763 params[(*outputPosition)++] = static_cast<GLint>(buffer.isActive(ShaderType::Compute));
jchen1058f67be2017-10-27 08:59:27 +0800764 break;
Jiawei Shaoc6f82872018-04-24 14:14:50 +0800765 case GL_REFERENCED_BY_GEOMETRY_SHADER_EXT:
766 params[(*outputPosition)++] = static_cast<GLint>(buffer.isActive(ShaderType::Geometry));
767 break;
jchen1058f67be2017-10-27 08:59:27 +0800768 default:
769 UNREACHABLE();
770 break;
771 }
772}
773
774void GetInterfaceBlockResourceProperty(const InterfaceBlock &block,
775 GLenum pname,
776 GLint *params,
777 GLsizei bufSize,
778 GLsizei *outputPosition)
779{
780 if (pname == GL_NAME_LENGTH)
781 {
782 params[(*outputPosition)++] = clampCast<GLint>(block.nameWithArrayIndex().size() + 1);
783 return;
784 }
785 GetShaderVariableBufferResourceProperty(block, pname, params, bufSize, outputPosition);
786}
787
788void GetUniformBlockResourceProperty(const Program *program,
789 GLuint blockIndex,
790 GLenum pname,
791 GLint *params,
792 GLsizei bufSize,
793 GLsizei *outputPosition)
794
795{
796 ASSERT(*outputPosition < bufSize);
797 const auto &block = program->getUniformBlockByIndex(blockIndex);
798 GetInterfaceBlockResourceProperty(block, pname, params, bufSize, outputPosition);
799}
800
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800801void GetShaderStorageBlockResourceProperty(const Program *program,
802 GLuint blockIndex,
803 GLenum pname,
804 GLint *params,
805 GLsizei bufSize,
806 GLsizei *outputPosition)
807
808{
809 ASSERT(*outputPosition < bufSize);
810 const auto &block = program->getShaderStorageBlockByIndex(blockIndex);
811 GetInterfaceBlockResourceProperty(block, pname, params, bufSize, outputPosition);
812}
813
jchen1058f67be2017-10-27 08:59:27 +0800814void GetAtomicCounterBufferResourceProperty(const Program *program,
815 GLuint index,
816 GLenum pname,
817 GLint *params,
818 GLsizei bufSize,
819 GLsizei *outputPosition)
820
821{
822 ASSERT(*outputPosition < bufSize);
823 const auto &buffer = program->getState().getAtomicCounterBuffers()[index];
824 GetShaderVariableBufferResourceProperty(buffer, pname, params, bufSize, outputPosition);
825}
826
Lingfeng Yang45b5a872018-06-07 11:33:25 -0700827bool IsTextureEnvEnumParameter(TextureEnvParameter pname)
828{
829 switch (pname)
830 {
831 case TextureEnvParameter::Mode:
832 case TextureEnvParameter::CombineRgb:
833 case TextureEnvParameter::CombineAlpha:
834 case TextureEnvParameter::Src0Rgb:
835 case TextureEnvParameter::Src1Rgb:
836 case TextureEnvParameter::Src2Rgb:
837 case TextureEnvParameter::Src0Alpha:
838 case TextureEnvParameter::Src1Alpha:
839 case TextureEnvParameter::Src2Alpha:
840 case TextureEnvParameter::Op0Rgb:
841 case TextureEnvParameter::Op1Rgb:
842 case TextureEnvParameter::Op2Rgb:
843 case TextureEnvParameter::Op0Alpha:
844 case TextureEnvParameter::Op1Alpha:
845 case TextureEnvParameter::Op2Alpha:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -0700846 case TextureEnvParameter::PointCoordReplace:
Lingfeng Yang45b5a872018-06-07 11:33:25 -0700847 return true;
848 default:
849 return false;
850 }
851}
852
Geoff Langc1984ed2016-10-07 12:41:00 -0400853} // anonymous namespace
854
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -0800855void QueryFramebufferAttachmentParameteriv(const Context *context,
856 const Framebuffer *framebuffer,
Geoff Langff5b2d52016-09-07 11:32:23 -0400857 GLenum attachment,
858 GLenum pname,
859 GLint *params)
860{
861 ASSERT(framebuffer);
862
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -0800863 const FramebufferAttachment *attachmentObject = framebuffer->getAttachment(context, attachment);
864
Geoff Langff5b2d52016-09-07 11:32:23 -0400865 if (attachmentObject == nullptr)
866 {
867 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
868 // is NONE, then querying any other pname will generate INVALID_ENUM.
869
870 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
871 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
872 // INVALID_OPERATION for all other pnames
873
874 switch (pname)
875 {
876 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
877 *params = GL_NONE;
878 break;
879
880 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
881 *params = 0;
882 break;
883
884 default:
885 UNREACHABLE();
886 break;
887 }
888
889 return;
890 }
891
892 switch (pname)
893 {
894 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
895 *params = attachmentObject->type();
896 break;
897
898 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
899 *params = attachmentObject->id();
900 break;
901
902 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
903 *params = attachmentObject->mipLevel();
904 break;
905
906 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
Corentin Wallez99d492c2018-02-27 15:17:10 -0500907 {
908 TextureTarget face = attachmentObject->cubeMapFace();
909 if (face != TextureTarget::InvalidEnum)
910 {
911 *params = ToGLenum(attachmentObject->cubeMapFace());
912 }
913 else
914 {
915 // This happens when the attachment isn't a texture cube map face
916 *params = GL_NONE;
917 }
918 }
919 break;
Geoff Langff5b2d52016-09-07 11:32:23 -0400920
921 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
922 *params = attachmentObject->getRedSize();
923 break;
924
925 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
926 *params = attachmentObject->getGreenSize();
927 break;
928
929 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
930 *params = attachmentObject->getBlueSize();
931 break;
932
933 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
934 *params = attachmentObject->getAlphaSize();
935 break;
936
937 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
938 *params = attachmentObject->getDepthSize();
939 break;
940
941 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
942 *params = attachmentObject->getStencilSize();
943 break;
944
945 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
946 *params = attachmentObject->getComponentType();
947 break;
948
949 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
950 *params = attachmentObject->getColorEncoding();
951 break;
952
953 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
954 *params = attachmentObject->layer();
955 break;
956
Martin Radeve5285d22017-07-14 16:23:53 +0300957 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_ANGLE:
958 *params = attachmentObject->getNumViews();
959 break;
960
961 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_MULTIVIEW_LAYOUT_ANGLE:
962 *params = static_cast<GLint>(attachmentObject->getMultiviewLayout());
963 break;
964
965 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_ANGLE:
966 *params = attachmentObject->getBaseViewIndex();
967 break;
968
969 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_VIEWPORT_OFFSETS_ANGLE:
970 {
971 const std::vector<Offset> &offsets = attachmentObject->getMultiviewViewportOffsets();
972 for (size_t i = 0u; i < offsets.size(); ++i)
973 {
974 params[i * 2u] = offsets[i].x;
975 params[i * 2u + 1u] = offsets[i].y;
976 }
977 }
978 break;
979
Jiawei Shaoa8802472018-05-28 11:17:47 +0800980 case GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT:
981 *params = attachmentObject->isLayered();
982 break;
983
Geoff Langff5b2d52016-09-07 11:32:23 -0400984 default:
985 UNREACHABLE();
986 break;
987 }
988}
989
990void QueryBufferParameteriv(const Buffer *buffer, GLenum pname, GLint *params)
991{
Geoff Langebebe1c2016-10-14 12:01:31 -0400992 QueryBufferParameterBase(buffer, pname, params);
993}
Geoff Langff5b2d52016-09-07 11:32:23 -0400994
Geoff Langebebe1c2016-10-14 12:01:31 -0400995void QueryBufferParameteri64v(const Buffer *buffer, GLenum pname, GLint64 *params)
996{
997 QueryBufferParameterBase(buffer, pname, params);
Geoff Langff5b2d52016-09-07 11:32:23 -0400998}
999
Geoff Lang496c02d2016-10-20 11:38:11 -07001000void QueryBufferPointerv(const Buffer *buffer, GLenum pname, void **params)
1001{
1002 switch (pname)
1003 {
1004 case GL_BUFFER_MAP_POINTER:
1005 *params = buffer->getMapPointer();
1006 break;
1007
1008 default:
1009 UNREACHABLE();
1010 break;
1011 }
1012}
1013
Jamie Madillffe00c02017-06-27 16:26:55 -04001014void QueryProgramiv(const Context *context, const Program *program, GLenum pname, GLint *params)
Geoff Langff5b2d52016-09-07 11:32:23 -04001015{
1016 ASSERT(program != nullptr);
1017
1018 switch (pname)
1019 {
1020 case GL_DELETE_STATUS:
1021 *params = program->isFlaggedForDeletion();
1022 return;
1023 case GL_LINK_STATUS:
1024 *params = program->isLinked();
1025 return;
jchen107ae70d82018-07-06 13:47:01 +08001026 case GL_COMPLETION_STATUS_KHR:
1027 *params = program->isLinking() ? GL_FALSE : GL_TRUE;
1028 return;
Geoff Langff5b2d52016-09-07 11:32:23 -04001029 case GL_VALIDATE_STATUS:
1030 *params = program->isValidated();
1031 return;
1032 case GL_INFO_LOG_LENGTH:
1033 *params = program->getInfoLogLength();
1034 return;
1035 case GL_ATTACHED_SHADERS:
1036 *params = program->getAttachedShadersCount();
1037 return;
1038 case GL_ACTIVE_ATTRIBUTES:
1039 *params = program->getActiveAttributeCount();
1040 return;
1041 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
1042 *params = program->getActiveAttributeMaxLength();
1043 return;
1044 case GL_ACTIVE_UNIFORMS:
1045 *params = program->getActiveUniformCount();
1046 return;
1047 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
1048 *params = program->getActiveUniformMaxLength();
1049 return;
1050 case GL_PROGRAM_BINARY_LENGTH_OES:
Shahbaz Youssefic14ab2a2018-08-24 13:57:55 -04001051 *params = context->getCaps().programBinaryFormats.empty()
1052 ? 0
1053 : program->getBinaryLength(context);
Geoff Langff5b2d52016-09-07 11:32:23 -04001054 return;
1055 case GL_ACTIVE_UNIFORM_BLOCKS:
1056 *params = program->getActiveUniformBlockCount();
1057 return;
1058 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
Qin Jiajia9bf55522018-01-29 13:56:23 +08001059 *params = program->getActiveUniformBlockMaxNameLength();
Geoff Langff5b2d52016-09-07 11:32:23 -04001060 break;
1061 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
1062 *params = program->getTransformFeedbackBufferMode();
1063 break;
1064 case GL_TRANSFORM_FEEDBACK_VARYINGS:
jchen10910a3da2017-11-15 09:40:11 +08001065 *params = clampCast<GLint>(program->getTransformFeedbackVaryingCount());
Geoff Langff5b2d52016-09-07 11:32:23 -04001066 break;
1067 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
1068 *params = program->getTransformFeedbackVaryingMaxLength();
1069 break;
1070 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
1071 *params = program->getBinaryRetrievableHint();
1072 break;
Yunchao He61afff12017-03-14 15:34:03 +08001073 case GL_PROGRAM_SEPARABLE:
1074 *params = program->isSeparable();
1075 break;
Xinghua Cao971f8502017-10-17 13:01:24 +08001076 case GL_COMPUTE_WORK_GROUP_SIZE:
1077 {
1078 const sh::WorkGroupSize &localSize = program->getComputeShaderLocalSize();
1079 params[0] = localSize[0];
1080 params[1] = localSize[1];
1081 params[2] = localSize[2];
1082 }
1083 break;
jchen1058f67be2017-10-27 08:59:27 +08001084 case GL_ACTIVE_ATOMIC_COUNTER_BUFFERS:
1085 *params = program->getActiveAtomicCounterBufferCount();
1086 break;
Jiawei Shao447bfac2018-03-14 14:23:40 +08001087 case GL_GEOMETRY_LINKED_INPUT_TYPE_EXT:
Jamie Madill493f9572018-05-24 19:52:15 -04001088 *params = ToGLenum(program->getGeometryShaderInputPrimitiveType());
Jiawei Shao447bfac2018-03-14 14:23:40 +08001089 break;
1090 case GL_GEOMETRY_LINKED_OUTPUT_TYPE_EXT:
Jamie Madill493f9572018-05-24 19:52:15 -04001091 *params = ToGLenum(program->getGeometryShaderOutputPrimitiveType());
Jiawei Shao447bfac2018-03-14 14:23:40 +08001092 break;
1093 case GL_GEOMETRY_LINKED_VERTICES_OUT_EXT:
1094 *params = program->getGeometryShaderMaxVertices();
1095 break;
1096 case GL_GEOMETRY_SHADER_INVOCATIONS_EXT:
1097 *params = program->getGeometryShaderInvocations();
1098 break;
Geoff Langff5b2d52016-09-07 11:32:23 -04001099 default:
1100 UNREACHABLE();
1101 break;
1102 }
1103}
Geoff Lang740d9022016-10-07 11:20:52 -04001104
Jamie Madill4e0e6f82017-02-17 11:06:03 -05001105void QueryRenderbufferiv(const Context *context,
1106 const Renderbuffer *renderbuffer,
1107 GLenum pname,
1108 GLint *params)
Geoff Lang740d9022016-10-07 11:20:52 -04001109{
1110 ASSERT(renderbuffer != nullptr);
1111
1112 switch (pname)
1113 {
1114 case GL_RENDERBUFFER_WIDTH:
1115 *params = renderbuffer->getWidth();
1116 break;
1117 case GL_RENDERBUFFER_HEIGHT:
1118 *params = renderbuffer->getHeight();
1119 break;
1120 case GL_RENDERBUFFER_INTERNAL_FORMAT:
Jamie Madill4e0e6f82017-02-17 11:06:03 -05001121 // Special case the WebGL 1 DEPTH_STENCIL format.
Jamie Madilla02315b2017-02-23 14:14:47 -05001122 if (context->isWebGL1() &&
Jamie Madill4e0e6f82017-02-17 11:06:03 -05001123 renderbuffer->getFormat().info->internalFormat == GL_DEPTH24_STENCIL8)
1124 {
1125 *params = GL_DEPTH_STENCIL;
1126 }
1127 else
1128 {
1129 *params = renderbuffer->getFormat().info->internalFormat;
1130 }
Geoff Lang740d9022016-10-07 11:20:52 -04001131 break;
1132 case GL_RENDERBUFFER_RED_SIZE:
1133 *params = renderbuffer->getRedSize();
1134 break;
1135 case GL_RENDERBUFFER_GREEN_SIZE:
1136 *params = renderbuffer->getGreenSize();
1137 break;
1138 case GL_RENDERBUFFER_BLUE_SIZE:
1139 *params = renderbuffer->getBlueSize();
1140 break;
1141 case GL_RENDERBUFFER_ALPHA_SIZE:
1142 *params = renderbuffer->getAlphaSize();
1143 break;
1144 case GL_RENDERBUFFER_DEPTH_SIZE:
1145 *params = renderbuffer->getDepthSize();
1146 break;
1147 case GL_RENDERBUFFER_STENCIL_SIZE:
1148 *params = renderbuffer->getStencilSize();
1149 break;
1150 case GL_RENDERBUFFER_SAMPLES_ANGLE:
1151 *params = renderbuffer->getSamples();
1152 break;
1153 default:
1154 UNREACHABLE();
1155 break;
1156 }
1157}
Geoff Langd7d0ed32016-10-07 11:33:51 -04001158
jchen103fd614d2018-08-13 12:21:58 +08001159void QueryShaderiv(Shader *shader, GLenum pname, GLint *params)
Geoff Langd7d0ed32016-10-07 11:33:51 -04001160{
1161 ASSERT(shader != nullptr);
1162
1163 switch (pname)
1164 {
1165 case GL_SHADER_TYPE:
Jiawei Shao385b3e02018-03-21 09:43:28 +08001166 *params = static_cast<GLint>(ToGLenum(shader->getType()));
Geoff Langd7d0ed32016-10-07 11:33:51 -04001167 return;
1168 case GL_DELETE_STATUS:
1169 *params = shader->isFlaggedForDeletion();
1170 return;
1171 case GL_COMPILE_STATUS:
jchen103fd614d2018-08-13 12:21:58 +08001172 *params = shader->isCompiled() ? GL_TRUE : GL_FALSE;
Geoff Langd7d0ed32016-10-07 11:33:51 -04001173 return;
jchen107ae70d82018-07-06 13:47:01 +08001174 case GL_COMPLETION_STATUS_KHR:
jchen10a155bac2018-08-16 15:26:39 +08001175 *params = shader->isCompleted() ? GL_TRUE : GL_FALSE;
jchen107ae70d82018-07-06 13:47:01 +08001176 return;
Geoff Langd7d0ed32016-10-07 11:33:51 -04001177 case GL_INFO_LOG_LENGTH:
jchen103fd614d2018-08-13 12:21:58 +08001178 *params = shader->getInfoLogLength();
Geoff Langd7d0ed32016-10-07 11:33:51 -04001179 return;
1180 case GL_SHADER_SOURCE_LENGTH:
1181 *params = shader->getSourceLength();
1182 return;
1183 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
jchen103fd614d2018-08-13 12:21:58 +08001184 *params = shader->getTranslatedSourceWithDebugInfoLength();
Geoff Langd7d0ed32016-10-07 11:33:51 -04001185 return;
1186 default:
1187 UNREACHABLE();
1188 break;
1189 }
1190}
Geoff Langc1984ed2016-10-07 12:41:00 -04001191
He Yunchao11b038b2016-11-22 21:24:04 +08001192void QueryTexLevelParameterfv(const Texture *texture,
Corentin Wallez99d492c2018-02-27 15:17:10 -05001193 TextureTarget target,
He Yunchao11b038b2016-11-22 21:24:04 +08001194 GLint level,
1195 GLenum pname,
1196 GLfloat *params)
1197{
1198 QueryTexLevelParameterBase(texture, target, level, pname, params);
1199}
1200
1201void QueryTexLevelParameteriv(const Texture *texture,
Corentin Wallez99d492c2018-02-27 15:17:10 -05001202 TextureTarget target,
He Yunchao11b038b2016-11-22 21:24:04 +08001203 GLint level,
1204 GLenum pname,
1205 GLint *params)
1206{
1207 QueryTexLevelParameterBase(texture, target, level, pname, params);
1208}
1209
Geoff Langc1984ed2016-10-07 12:41:00 -04001210void QueryTexParameterfv(const Texture *texture, GLenum pname, GLfloat *params)
1211{
1212 QueryTexParameterBase(texture, pname, params);
1213}
1214
1215void QueryTexParameteriv(const Texture *texture, GLenum pname, GLint *params)
1216{
1217 QueryTexParameterBase(texture, pname, params);
1218}
1219
1220void QuerySamplerParameterfv(const Sampler *sampler, GLenum pname, GLfloat *params)
1221{
1222 QuerySamplerParameterBase(sampler, pname, params);
1223}
1224
1225void QuerySamplerParameteriv(const Sampler *sampler, GLenum pname, GLint *params)
1226{
1227 QuerySamplerParameterBase(sampler, pname, params);
1228}
1229
Geoff Lang0b031062016-10-13 14:30:04 -04001230void QueryVertexAttribfv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001231 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001232 const VertexAttribCurrentValueData &currentValueData,
1233 GLenum pname,
1234 GLfloat *params)
1235{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001236 QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001237}
1238
1239void QueryVertexAttribiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001240 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001241 const VertexAttribCurrentValueData &currentValueData,
1242 GLenum pname,
1243 GLint *params)
1244{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001245 QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001246}
1247
Jamie Madill876429b2017-04-20 15:46:24 -04001248void QueryVertexAttribPointerv(const VertexAttribute &attrib, GLenum pname, void **pointer)
Geoff Lang0b031062016-10-13 14:30:04 -04001249{
1250 switch (pname)
1251 {
1252 case GL_VERTEX_ATTRIB_ARRAY_POINTER:
Jamie Madill876429b2017-04-20 15:46:24 -04001253 *pointer = const_cast<void *>(attrib.pointer);
Geoff Lang0b031062016-10-13 14:30:04 -04001254 break;
1255
1256 default:
1257 UNREACHABLE();
1258 break;
1259 }
1260}
1261
1262void QueryVertexAttribIiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001263 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001264 const VertexAttribCurrentValueData &currentValueData,
1265 GLenum pname,
1266 GLint *params)
1267{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001268 QueryVertexAttribBase(attrib, binding, currentValueData.IntValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001269}
1270
1271void QueryVertexAttribIuiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001272 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001273 const VertexAttribCurrentValueData &currentValueData,
1274 GLenum pname,
1275 GLuint *params)
1276{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001277 QueryVertexAttribBase(attrib, binding, currentValueData.UnsignedIntValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001278}
1279
Geoff Lang6899b872016-10-14 11:30:13 -04001280void QueryActiveUniformBlockiv(const Program *program,
1281 GLuint uniformBlockIndex,
1282 GLenum pname,
1283 GLint *params)
1284{
jchen1058f67be2017-10-27 08:59:27 +08001285 GLenum prop = GetUniformBlockPropertyEnum(pname);
1286 QueryProgramResourceiv(program, GL_UNIFORM_BLOCK, uniformBlockIndex, 1, &prop,
1287 std::numeric_limits<GLsizei>::max(), nullptr, params);
Geoff Lang6899b872016-10-14 11:30:13 -04001288}
1289
Geoff Lang0a9661f2016-10-20 10:59:20 -07001290void QueryInternalFormativ(const TextureCaps &format, GLenum pname, GLsizei bufSize, GLint *params)
1291{
1292 switch (pname)
1293 {
1294 case GL_NUM_SAMPLE_COUNTS:
1295 if (bufSize != 0)
1296 {
jchen10a99ed552017-09-22 08:10:32 +08001297 *params = clampCast<GLint>(format.sampleCounts.size());
Geoff Lang0a9661f2016-10-20 10:59:20 -07001298 }
1299 break;
1300
1301 case GL_SAMPLES:
1302 {
1303 size_t returnCount = std::min<size_t>(bufSize, format.sampleCounts.size());
1304 auto sampleReverseIt = format.sampleCounts.rbegin();
1305 for (size_t sampleIndex = 0; sampleIndex < returnCount; ++sampleIndex)
1306 {
1307 params[sampleIndex] = *sampleReverseIt++;
1308 }
1309 }
1310 break;
1311
1312 default:
1313 UNREACHABLE();
1314 break;
1315 }
1316}
1317
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001318void QueryFramebufferParameteriv(const Framebuffer *framebuffer, GLenum pname, GLint *params)
1319{
1320 ASSERT(framebuffer);
1321
1322 switch (pname)
1323 {
1324 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
1325 *params = framebuffer->getDefaultWidth();
1326 break;
1327 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
1328 *params = framebuffer->getDefaultHeight();
1329 break;
1330 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
1331 *params = framebuffer->getDefaultSamples();
1332 break;
1333 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
Geoff Lang92019432017-11-20 13:09:34 -05001334 *params = ConvertToGLBoolean(framebuffer->getDefaultFixedSampleLocations());
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001335 break;
Jiawei Shaob1e91382018-05-17 14:33:55 +08001336 case GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT:
1337 *params = framebuffer->getDefaultLayers();
1338 break;
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001339 default:
1340 UNREACHABLE();
1341 break;
1342 }
1343}
1344
Jamie Madilla0691b72018-07-25 10:41:22 -04001345Error QuerySynciv(const Context *context,
1346 const Sync *sync,
1347 GLenum pname,
1348 GLsizei bufSize,
1349 GLsizei *length,
1350 GLint *values)
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001351{
1352 ASSERT(sync);
1353
Geoff Lang82483b92017-04-11 15:33:00 -04001354 // All queries return one value, exit early if the buffer can't fit anything.
1355 if (bufSize < 1)
1356 {
1357 if (length != nullptr)
1358 {
1359 *length = 0;
1360 }
1361 return NoError();
1362 }
1363
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001364 switch (pname)
1365 {
1366 case GL_OBJECT_TYPE:
jchen10a99ed552017-09-22 08:10:32 +08001367 *values = clampCast<GLint>(GL_SYNC_FENCE);
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001368 break;
1369 case GL_SYNC_CONDITION:
jchen10a99ed552017-09-22 08:10:32 +08001370 *values = clampCast<GLint>(sync->getCondition());
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001371 break;
1372 case GL_SYNC_FLAGS:
jchen10a99ed552017-09-22 08:10:32 +08001373 *values = clampCast<GLint>(sync->getFlags());
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001374 break;
1375 case GL_SYNC_STATUS:
Jamie Madilla0691b72018-07-25 10:41:22 -04001376 ANGLE_TRY(sync->getStatus(context, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001377 break;
1378
1379 default:
1380 UNREACHABLE();
1381 break;
1382 }
1383
Geoff Lang82483b92017-04-11 15:33:00 -04001384 if (length != nullptr)
1385 {
1386 *length = 1;
1387 }
1388
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001389 return NoError();
1390}
1391
Jamie Madill4928b7c2017-06-20 12:57:39 -04001392void SetTexParameterf(Context *context, Texture *texture, GLenum pname, GLfloat param)
Geoff Langc1984ed2016-10-07 12:41:00 -04001393{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001394 SetTexParameterBase(context, texture, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -04001395}
1396
Jamie Madill4928b7c2017-06-20 12:57:39 -04001397void SetTexParameterfv(Context *context, Texture *texture, GLenum pname, const GLfloat *params)
Geoff Langc1984ed2016-10-07 12:41:00 -04001398{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001399 SetTexParameterBase(context, texture, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001400}
1401
Jamie Madill4928b7c2017-06-20 12:57:39 -04001402void SetTexParameteri(Context *context, Texture *texture, GLenum pname, GLint param)
Geoff Langc1984ed2016-10-07 12:41:00 -04001403{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001404 SetTexParameterBase(context, texture, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -04001405}
1406
Jamie Madill4928b7c2017-06-20 12:57:39 -04001407void SetTexParameteriv(Context *context, Texture *texture, GLenum pname, const GLint *params)
Geoff Langc1984ed2016-10-07 12:41:00 -04001408{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001409 SetTexParameterBase(context, texture, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001410}
1411
Jamie Madille25b8002018-09-20 13:39:49 -04001412void SetSamplerParameterf(Context *context, Sampler *sampler, GLenum pname, GLfloat param)
Geoff Langc1984ed2016-10-07 12:41:00 -04001413{
Jamie Madille25b8002018-09-20 13:39:49 -04001414 SetSamplerParameterBase(context, sampler, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -04001415}
1416
Jamie Madille25b8002018-09-20 13:39:49 -04001417void SetSamplerParameterfv(Context *context, Sampler *sampler, GLenum pname, const GLfloat *params)
Geoff Langc1984ed2016-10-07 12:41:00 -04001418{
Jamie Madille25b8002018-09-20 13:39:49 -04001419 SetSamplerParameterBase(context, sampler, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001420}
1421
Jamie Madille25b8002018-09-20 13:39:49 -04001422void SetSamplerParameteri(Context *context, Sampler *sampler, GLenum pname, GLint param)
Geoff Langc1984ed2016-10-07 12:41:00 -04001423{
Jamie Madille25b8002018-09-20 13:39:49 -04001424 SetSamplerParameterBase(context, sampler, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -04001425}
1426
Jamie Madille25b8002018-09-20 13:39:49 -04001427void SetSamplerParameteriv(Context *context, Sampler *sampler, GLenum pname, const GLint *params)
Geoff Langc1984ed2016-10-07 12:41:00 -04001428{
Jamie Madille25b8002018-09-20 13:39:49 -04001429 SetSamplerParameterBase(context, sampler, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001430}
Geoff Lang65603eb2017-01-12 16:48:03 -05001431
Jamie Madillb983a4b2018-08-01 11:34:51 -04001432void SetFramebufferParameteri(const Context *context,
1433 Framebuffer *framebuffer,
1434 GLenum pname,
1435 GLint param)
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001436{
1437 ASSERT(framebuffer);
1438
1439 switch (pname)
1440 {
1441 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
Jamie Madillb983a4b2018-08-01 11:34:51 -04001442 framebuffer->setDefaultWidth(context, param);
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001443 break;
1444 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
Jamie Madillb983a4b2018-08-01 11:34:51 -04001445 framebuffer->setDefaultHeight(context, param);
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001446 break;
1447 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
Jamie Madillb983a4b2018-08-01 11:34:51 -04001448 framebuffer->setDefaultSamples(context, param);
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001449 break;
1450 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
Jamie Madillb983a4b2018-08-01 11:34:51 -04001451 framebuffer->setDefaultFixedSampleLocations(context, ConvertToBool(param));
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001452 break;
Jiawei Shaob1e91382018-05-17 14:33:55 +08001453 case GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT:
1454 framebuffer->setDefaultLayers(param);
1455 break;
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001456 default:
1457 UNREACHABLE();
1458 break;
1459 }
1460}
1461
Yunchao He61afff12017-03-14 15:34:03 +08001462void SetProgramParameteri(Program *program, GLenum pname, GLint value)
1463{
1464 ASSERT(program);
1465
1466 switch (pname)
1467 {
1468 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
Geoff Lang92019432017-11-20 13:09:34 -05001469 program->setBinaryRetrievableHint(ConvertToBool(value));
Yunchao He61afff12017-03-14 15:34:03 +08001470 break;
1471 case GL_PROGRAM_SEPARABLE:
Geoff Lang92019432017-11-20 13:09:34 -05001472 program->setSeparable(ConvertToBool(value));
Yunchao He61afff12017-03-14 15:34:03 +08001473 break;
1474 default:
1475 UNREACHABLE();
1476 break;
1477 }
1478}
1479
jchen10baf5d942017-08-28 20:45:48 +08001480GLint GetUniformResourceProperty(const Program *program, GLuint index, const GLenum prop)
1481{
1482 const auto &uniform = program->getUniformByIndex(index);
1483 GLenum resourceProp = GetUniformPropertyEnum(prop);
1484 switch (resourceProp)
1485 {
1486 case GL_TYPE:
1487 case GL_ARRAY_SIZE:
1488 case GL_NAME_LENGTH:
Olli Etuaho465835d2017-09-26 13:34:10 +03001489 return GetCommonVariableProperty(uniform, resourceProp);
jchen10baf5d942017-08-28 20:45:48 +08001490
1491 case GL_LOCATION:
1492 return program->getUniformLocation(uniform.name);
1493
1494 case GL_BLOCK_INDEX:
1495 return (uniform.isAtomicCounter() ? -1 : uniform.bufferIndex);
1496
1497 case GL_OFFSET:
1498 return uniform.blockInfo.offset;
1499
1500 case GL_ARRAY_STRIDE:
1501 return uniform.blockInfo.arrayStride;
1502
1503 case GL_MATRIX_STRIDE:
1504 return uniform.blockInfo.matrixStride;
1505
1506 case GL_IS_ROW_MAJOR:
1507 return static_cast<GLint>(uniform.blockInfo.isRowMajorMatrix);
1508
1509 case GL_REFERENCED_BY_VERTEX_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001510 return uniform.isActive(ShaderType::Vertex);
jchen10baf5d942017-08-28 20:45:48 +08001511
1512 case GL_REFERENCED_BY_FRAGMENT_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001513 return uniform.isActive(ShaderType::Fragment);
jchen10baf5d942017-08-28 20:45:48 +08001514
1515 case GL_REFERENCED_BY_COMPUTE_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001516 return uniform.isActive(ShaderType::Compute);
jchen10baf5d942017-08-28 20:45:48 +08001517
Jiawei Shaoc6f82872018-04-24 14:14:50 +08001518 case GL_REFERENCED_BY_GEOMETRY_SHADER_EXT:
1519 return uniform.isActive(ShaderType::Geometry);
1520
jchen10baf5d942017-08-28 20:45:48 +08001521 case GL_ATOMIC_COUNTER_BUFFER_INDEX:
1522 return (uniform.isAtomicCounter() ? uniform.bufferIndex : -1);
1523
1524 default:
1525 UNREACHABLE();
1526 return 0;
1527 }
1528}
1529
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001530GLint GetBufferVariableResourceProperty(const Program *program, GLuint index, const GLenum prop)
1531{
1532 const auto &bufferVariable = program->getBufferVariableByIndex(index);
1533 switch (prop)
1534 {
1535 case GL_TYPE:
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001536 case GL_ARRAY_SIZE:
Olli Etuaho465835d2017-09-26 13:34:10 +03001537 case GL_NAME_LENGTH:
1538 return GetCommonVariableProperty(bufferVariable, prop);
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001539
1540 case GL_BLOCK_INDEX:
1541 return bufferVariable.bufferIndex;
1542
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001543 case GL_OFFSET:
1544 return bufferVariable.blockInfo.offset;
1545
1546 case GL_ARRAY_STRIDE:
1547 return bufferVariable.blockInfo.arrayStride;
1548
1549 case GL_MATRIX_STRIDE:
1550 return bufferVariable.blockInfo.matrixStride;
1551
1552 case GL_IS_ROW_MAJOR:
1553 return static_cast<GLint>(bufferVariable.blockInfo.isRowMajorMatrix);
1554
1555 case GL_REFERENCED_BY_VERTEX_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001556 return bufferVariable.isActive(ShaderType::Vertex);
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001557
1558 case GL_REFERENCED_BY_FRAGMENT_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001559 return bufferVariable.isActive(ShaderType::Fragment);
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001560
1561 case GL_REFERENCED_BY_COMPUTE_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001562 return bufferVariable.isActive(ShaderType::Compute);
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001563
Jiawei Shaoc6f82872018-04-24 14:14:50 +08001564 case GL_REFERENCED_BY_GEOMETRY_SHADER_EXT:
1565 return bufferVariable.isActive(ShaderType::Geometry);
1566
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001567 case GL_TOP_LEVEL_ARRAY_SIZE:
1568 return bufferVariable.topLevelArraySize;
1569
1570 case GL_TOP_LEVEL_ARRAY_STRIDE:
1571 return bufferVariable.blockInfo.topLevelArrayStride;
1572
1573 default:
1574 UNREACHABLE();
1575 return 0;
1576 }
1577}
1578
jchen1015015f72017-03-16 13:54:21 +08001579GLuint QueryProgramResourceIndex(const Program *program,
1580 GLenum programInterface,
1581 const GLchar *name)
1582{
1583 switch (programInterface)
1584 {
1585 case GL_PROGRAM_INPUT:
1586 return program->getInputResourceIndex(name);
1587
1588 case GL_PROGRAM_OUTPUT:
1589 return program->getOutputResourceIndex(name);
1590
jchen1015015f72017-03-16 13:54:21 +08001591 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001592 return program->getState().getUniformIndexFromName(name);
1593
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001594 case GL_BUFFER_VARIABLE:
1595 return program->getState().getBufferVariableIndexFromName(name);
1596
1597 case GL_SHADER_STORAGE_BLOCK:
1598 return program->getShaderStorageBlockIndex(name);
1599
jchen1015015f72017-03-16 13:54:21 +08001600 case GL_UNIFORM_BLOCK:
jchen1058f67be2017-10-27 08:59:27 +08001601 return program->getUniformBlockIndex(name);
1602
jchen1015015f72017-03-16 13:54:21 +08001603 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10910a3da2017-11-15 09:40:11 +08001604 return program->getTransformFeedbackVaryingResourceIndex(name);
jchen1015015f72017-03-16 13:54:21 +08001605
1606 default:
1607 UNREACHABLE();
1608 return GL_INVALID_INDEX;
1609 }
1610}
1611
jchen10fd7c3b52017-03-21 15:36:03 +08001612void QueryProgramResourceName(const Program *program,
1613 GLenum programInterface,
1614 GLuint index,
1615 GLsizei bufSize,
1616 GLsizei *length,
1617 GLchar *name)
1618{
1619 switch (programInterface)
1620 {
1621 case GL_PROGRAM_INPUT:
1622 program->getInputResourceName(index, bufSize, length, name);
1623 break;
1624
1625 case GL_PROGRAM_OUTPUT:
1626 program->getOutputResourceName(index, bufSize, length, name);
1627 break;
1628
jchen10fd7c3b52017-03-21 15:36:03 +08001629 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001630 program->getUniformResourceName(index, bufSize, length, name);
1631 break;
1632
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001633 case GL_BUFFER_VARIABLE:
1634 program->getBufferVariableResourceName(index, bufSize, length, name);
1635 break;
1636
1637 case GL_SHADER_STORAGE_BLOCK:
1638 program->getActiveShaderStorageBlockName(index, bufSize, length, name);
1639 break;
1640
jchen10fd7c3b52017-03-21 15:36:03 +08001641 case GL_UNIFORM_BLOCK:
jchen1058f67be2017-10-27 08:59:27 +08001642 program->getActiveUniformBlockName(index, bufSize, length, name);
1643 break;
1644
jchen10fd7c3b52017-03-21 15:36:03 +08001645 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10910a3da2017-11-15 09:40:11 +08001646 program->getTransformFeedbackVarying(index, bufSize, length, nullptr, nullptr, name);
jchen10fd7c3b52017-03-21 15:36:03 +08001647 break;
1648
1649 default:
1650 UNREACHABLE();
1651 }
1652}
1653
jchen10191381f2017-04-11 13:59:04 +08001654GLint QueryProgramResourceLocation(const Program *program,
1655 GLenum programInterface,
1656 const GLchar *name)
1657{
1658 switch (programInterface)
1659 {
1660 case GL_PROGRAM_INPUT:
1661 return program->getAttributeLocation(name);
1662
1663 case GL_PROGRAM_OUTPUT:
1664 return program->getFragDataLocation(name);
1665
jchen10191381f2017-04-11 13:59:04 +08001666 case GL_UNIFORM:
Olli Etuahod2551232017-10-26 20:03:33 +03001667 return program->getUniformLocation(name);
jchen10baf5d942017-08-28 20:45:48 +08001668
jchen10191381f2017-04-11 13:59:04 +08001669 default:
1670 UNREACHABLE();
1671 return -1;
1672 }
1673}
1674
jchen10880683b2017-04-12 16:21:55 +08001675void QueryProgramResourceiv(const Program *program,
1676 GLenum programInterface,
1677 GLuint index,
1678 GLsizei propCount,
1679 const GLenum *props,
1680 GLsizei bufSize,
1681 GLsizei *length,
1682 GLint *params)
1683{
1684 if (!program->isLinked())
1685 {
1686 if (length != nullptr)
1687 {
1688 *length = 0;
1689 }
1690 return;
1691 }
1692
jchen1058f67be2017-10-27 08:59:27 +08001693 GLsizei pos = 0;
1694 for (GLsizei i = 0; i < propCount; i++)
jchen10880683b2017-04-12 16:21:55 +08001695 {
1696 switch (programInterface)
1697 {
1698 case GL_PROGRAM_INPUT:
1699 params[i] = GetInputResourceProperty(program, index, props[i]);
jchen1058f67be2017-10-27 08:59:27 +08001700 ++pos;
jchen10880683b2017-04-12 16:21:55 +08001701 break;
1702
1703 case GL_PROGRAM_OUTPUT:
1704 params[i] = GetOutputResourceProperty(program, index, props[i]);
jchen1058f67be2017-10-27 08:59:27 +08001705 ++pos;
jchen10880683b2017-04-12 16:21:55 +08001706 break;
1707
jchen10880683b2017-04-12 16:21:55 +08001708 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001709 params[i] = GetUniformResourceProperty(program, index, props[i]);
jchen1058f67be2017-10-27 08:59:27 +08001710 ++pos;
1711 break;
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001712
1713 case GL_BUFFER_VARIABLE:
1714 params[i] = GetBufferVariableResourceProperty(program, index, props[i]);
1715 ++pos;
1716 break;
1717
jchen1058f67be2017-10-27 08:59:27 +08001718 case GL_UNIFORM_BLOCK:
1719 GetUniformBlockResourceProperty(program, index, props[i], params, bufSize, &pos);
jchen10baf5d942017-08-28 20:45:48 +08001720 break;
1721
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001722 case GL_SHADER_STORAGE_BLOCK:
1723 GetShaderStorageBlockResourceProperty(program, index, props[i], params, bufSize,
1724 &pos);
1725 break;
1726
jchen1058f67be2017-10-27 08:59:27 +08001727 case GL_ATOMIC_COUNTER_BUFFER:
1728 GetAtomicCounterBufferResourceProperty(program, index, props[i], params, bufSize,
1729 &pos);
1730 break;
jchen10910a3da2017-11-15 09:40:11 +08001731
jchen10880683b2017-04-12 16:21:55 +08001732 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10910a3da2017-11-15 09:40:11 +08001733 params[i] = GetTransformFeedbackVaryingResourceProperty(program, index, props[i]);
1734 ++pos;
jchen10880683b2017-04-12 16:21:55 +08001735 break;
1736
1737 default:
1738 UNREACHABLE();
1739 params[i] = GL_INVALID_VALUE;
1740 }
jchen1058f67be2017-10-27 08:59:27 +08001741 if (pos == bufSize)
1742 {
1743 // Most properties return one value, but GL_ACTIVE_VARIABLES returns an array of values.
1744 // This checks not to break buffer bounds for such case.
1745 break;
1746 }
1747 }
1748
1749 if (length != nullptr)
1750 {
1751 *length = pos;
jchen10880683b2017-04-12 16:21:55 +08001752 }
1753}
1754
jchen10d9cd7b72017-08-30 15:04:25 +08001755void QueryProgramInterfaceiv(const Program *program,
1756 GLenum programInterface,
1757 GLenum pname,
1758 GLint *params)
1759{
1760 switch (pname)
1761 {
1762 case GL_ACTIVE_RESOURCES:
1763 *params = QueryProgramInterfaceActiveResources(program, programInterface);
1764 break;
1765
1766 case GL_MAX_NAME_LENGTH:
1767 *params = QueryProgramInterfaceMaxNameLength(program, programInterface);
1768 break;
1769
1770 case GL_MAX_NUM_ACTIVE_VARIABLES:
1771 *params = QueryProgramInterfaceMaxNumActiveVariables(program, programInterface);
1772 break;
1773
1774 default:
1775 UNREACHABLE();
1776 }
1777}
1778
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001779ClientVertexArrayType ParamToVertexArrayType(GLenum param)
1780{
1781 switch (param)
1782 {
1783 case GL_VERTEX_ARRAY:
1784 case GL_VERTEX_ARRAY_BUFFER_BINDING:
1785 case GL_VERTEX_ARRAY_STRIDE:
1786 case GL_VERTEX_ARRAY_SIZE:
1787 case GL_VERTEX_ARRAY_TYPE:
1788 case GL_VERTEX_ARRAY_POINTER:
1789 return ClientVertexArrayType::Vertex;
1790 case GL_NORMAL_ARRAY:
1791 case GL_NORMAL_ARRAY_BUFFER_BINDING:
1792 case GL_NORMAL_ARRAY_STRIDE:
1793 case GL_NORMAL_ARRAY_TYPE:
1794 case GL_NORMAL_ARRAY_POINTER:
1795 return ClientVertexArrayType::Normal;
1796 case GL_COLOR_ARRAY:
1797 case GL_COLOR_ARRAY_BUFFER_BINDING:
1798 case GL_COLOR_ARRAY_STRIDE:
1799 case GL_COLOR_ARRAY_SIZE:
1800 case GL_COLOR_ARRAY_TYPE:
1801 case GL_COLOR_ARRAY_POINTER:
1802 return ClientVertexArrayType::Color;
1803 case GL_POINT_SIZE_ARRAY_OES:
1804 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
1805 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
1806 case GL_POINT_SIZE_ARRAY_TYPE_OES:
1807 case GL_POINT_SIZE_ARRAY_POINTER_OES:
1808 return ClientVertexArrayType::PointSize;
1809 case GL_TEXTURE_COORD_ARRAY:
1810 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
1811 case GL_TEXTURE_COORD_ARRAY_STRIDE:
1812 case GL_TEXTURE_COORD_ARRAY_SIZE:
1813 case GL_TEXTURE_COORD_ARRAY_TYPE:
1814 case GL_TEXTURE_COORD_ARRAY_POINTER:
1815 return ClientVertexArrayType::TextureCoord;
1816 default:
1817 UNREACHABLE();
1818 return ClientVertexArrayType::InvalidEnum;
1819 }
1820}
1821
Lingfeng Yangd0febe72018-05-17 22:36:52 -07001822void SetLightModelParameters(GLES1State *state, GLenum pname, const GLfloat *params)
1823{
1824 LightModelParameters &lightModel = state->lightModelParameters();
1825
1826 switch (pname)
1827 {
1828 case GL_LIGHT_MODEL_AMBIENT:
1829 lightModel.color = ColorF::fromData(params);
1830 break;
1831 case GL_LIGHT_MODEL_TWO_SIDE:
1832 lightModel.twoSided = *params == 1.0f ? true : false;
1833 break;
1834 default:
1835 break;
1836 }
1837}
1838
1839void GetLightModelParameters(const GLES1State *state, GLenum pname, GLfloat *params)
1840{
1841 const LightModelParameters &lightModel = state->lightModelParameters();
1842
1843 switch (pname)
1844 {
1845 case GL_LIGHT_MODEL_TWO_SIDE:
1846 *params = lightModel.twoSided ? 1.0f : 0.0f;
1847 break;
1848 case GL_LIGHT_MODEL_AMBIENT:
1849 lightModel.color.writeData(params);
1850 break;
1851 default:
1852 break;
1853 }
1854}
1855
1856bool IsLightModelTwoSided(const GLES1State *state)
1857{
1858 return state->lightModelParameters().twoSided;
1859}
1860
1861void SetLightParameters(GLES1State *state,
1862 GLenum light,
1863 LightParameter pname,
1864 const GLfloat *params)
1865{
1866 uint32_t lightIndex = light - GL_LIGHT0;
1867
1868 LightParameters &lightParams = state->lightParameters(lightIndex);
1869
1870 switch (pname)
1871 {
1872 case LightParameter::Ambient:
1873 lightParams.ambient = ColorF::fromData(params);
1874 break;
1875 case LightParameter::Diffuse:
1876 lightParams.diffuse = ColorF::fromData(params);
1877 break;
1878 case LightParameter::Specular:
1879 lightParams.specular = ColorF::fromData(params);
1880 break;
1881 case LightParameter::Position:
1882 {
1883 angle::Mat4 mv = state->getModelviewMatrix();
1884 angle::Vector4 transformedPos =
1885 mv.product(angle::Vector4(params[0], params[1], params[2], params[3]));
1886 lightParams.position[0] = transformedPos[0];
1887 lightParams.position[1] = transformedPos[1];
1888 lightParams.position[2] = transformedPos[2];
1889 lightParams.position[3] = transformedPos[3];
1890 }
1891 break;
1892 case LightParameter::SpotDirection:
1893 {
1894 angle::Mat4 mv = state->getModelviewMatrix();
1895 angle::Vector4 transformedPos =
1896 mv.product(angle::Vector4(params[0], params[1], params[2], 0.0f));
1897 lightParams.direction[0] = transformedPos[0];
1898 lightParams.direction[1] = transformedPos[1];
1899 lightParams.direction[2] = transformedPos[2];
1900 }
1901 break;
1902 case LightParameter::SpotExponent:
1903 lightParams.spotlightExponent = *params;
1904 break;
1905 case LightParameter::SpotCutoff:
1906 lightParams.spotlightCutoffAngle = *params;
1907 break;
1908 case LightParameter::ConstantAttenuation:
1909 lightParams.attenuationConst = *params;
1910 break;
1911 case LightParameter::LinearAttenuation:
1912 lightParams.attenuationLinear = *params;
1913 break;
1914 case LightParameter::QuadraticAttenuation:
1915 lightParams.attenuationQuadratic = *params;
1916 break;
1917 default:
1918 return;
1919 }
1920}
1921
1922void GetLightParameters(const GLES1State *state,
1923 GLenum light,
1924 LightParameter pname,
1925 GLfloat *params)
1926{
1927 uint32_t lightIndex = light - GL_LIGHT0;
1928 const LightParameters &lightParams = state->lightParameters(lightIndex);
1929
1930 switch (pname)
1931 {
1932 case LightParameter::Ambient:
1933 lightParams.ambient.writeData(params);
1934 break;
1935 case LightParameter::Diffuse:
1936 lightParams.diffuse.writeData(params);
1937 break;
1938 case LightParameter::Specular:
1939 lightParams.specular.writeData(params);
1940 break;
1941 case LightParameter::Position:
1942 memcpy(params, lightParams.position.data(), 4 * sizeof(GLfloat));
1943 break;
1944 case LightParameter::SpotDirection:
1945 memcpy(params, lightParams.direction.data(), 3 * sizeof(GLfloat));
1946 break;
1947 case LightParameter::SpotExponent:
1948 *params = lightParams.spotlightExponent;
1949 break;
1950 case LightParameter::SpotCutoff:
1951 *params = lightParams.spotlightCutoffAngle;
1952 break;
1953 case LightParameter::ConstantAttenuation:
1954 *params = lightParams.attenuationConst;
1955 break;
1956 case LightParameter::LinearAttenuation:
1957 *params = lightParams.attenuationLinear;
1958 break;
1959 case LightParameter::QuadraticAttenuation:
1960 *params = lightParams.attenuationQuadratic;
1961 break;
1962 default:
1963 break;
1964 }
1965}
1966
1967void SetMaterialParameters(GLES1State *state,
1968 GLenum face,
1969 MaterialParameter pname,
1970 const GLfloat *params)
1971{
1972 MaterialParameters &material = state->materialParameters();
1973 switch (pname)
1974 {
1975 case MaterialParameter::Ambient:
1976 material.ambient = ColorF::fromData(params);
1977 break;
1978 case MaterialParameter::Diffuse:
1979 material.diffuse = ColorF::fromData(params);
1980 break;
1981 case MaterialParameter::AmbientAndDiffuse:
1982 material.ambient = ColorF::fromData(params);
1983 material.diffuse = ColorF::fromData(params);
1984 break;
1985 case MaterialParameter::Specular:
1986 material.specular = ColorF::fromData(params);
1987 break;
1988 case MaterialParameter::Emission:
1989 material.emissive = ColorF::fromData(params);
1990 break;
1991 case MaterialParameter::Shininess:
1992 material.specularExponent = *params;
1993 break;
1994 default:
1995 return;
1996 }
1997}
1998
1999void GetMaterialParameters(const GLES1State *state,
2000 GLenum face,
2001 MaterialParameter pname,
2002 GLfloat *params)
2003{
2004 const ColorF &currentColor = state->getCurrentColor();
2005 const MaterialParameters &material = state->materialParameters();
2006 const bool colorMaterialEnabled = state->isColorMaterialEnabled();
2007
2008 switch (pname)
2009 {
2010 case MaterialParameter::Ambient:
2011 if (colorMaterialEnabled)
2012 {
2013 currentColor.writeData(params);
2014 }
2015 else
2016 {
2017 material.ambient.writeData(params);
2018 }
2019 break;
2020 case MaterialParameter::Diffuse:
2021 if (colorMaterialEnabled)
2022 {
2023 currentColor.writeData(params);
2024 }
2025 else
2026 {
2027 material.diffuse.writeData(params);
2028 }
2029 break;
2030 case MaterialParameter::Specular:
2031 material.specular.writeData(params);
2032 break;
2033 case MaterialParameter::Emission:
2034 material.emissive.writeData(params);
2035 break;
2036 case MaterialParameter::Shininess:
2037 *params = material.specularExponent;
2038 break;
2039 default:
2040 return;
2041 }
2042}
2043
2044unsigned int GetLightModelParameterCount(GLenum pname)
2045{
2046 switch (pname)
2047 {
2048 case GL_LIGHT_MODEL_AMBIENT:
2049 return 4;
2050 case GL_LIGHT_MODEL_TWO_SIDE:
2051 return 1;
2052 default:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07002053 return 0;
2054 }
2055}
2056
2057unsigned int GetLightParameterCount(LightParameter pname)
2058{
2059 switch (pname)
2060 {
2061 case LightParameter::Ambient:
2062 case LightParameter::Diffuse:
2063 case LightParameter::Specular:
2064 case LightParameter::Position:
2065 return 4;
2066 case LightParameter::SpotDirection:
2067 return 3;
2068 case LightParameter::SpotExponent:
2069 case LightParameter::SpotCutoff:
2070 case LightParameter::ConstantAttenuation:
2071 case LightParameter::LinearAttenuation:
2072 case LightParameter::QuadraticAttenuation:
2073 return 1;
2074 default:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07002075 return 0;
2076 }
2077}
2078
2079unsigned int GetMaterialParameterCount(MaterialParameter pname)
2080{
2081 switch (pname)
2082 {
2083 case MaterialParameter::Ambient:
2084 case MaterialParameter::Diffuse:
2085 case MaterialParameter::Specular:
2086 case MaterialParameter::Emission:
2087 return 4;
2088 case MaterialParameter::Shininess:
2089 return 1;
2090 default:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07002091 return 0;
2092 }
2093}
2094
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07002095void SetFogParameters(GLES1State *state, GLenum pname, const GLfloat *params)
2096{
2097 FogParameters &fog = state->fogParameters();
2098 switch (pname)
2099 {
2100 case GL_FOG_MODE:
2101 fog.mode = FromGLenum<FogMode>(static_cast<GLenum>(params[0]));
2102 break;
2103 case GL_FOG_DENSITY:
2104 fog.density = params[0];
2105 break;
2106 case GL_FOG_START:
2107 fog.start = params[0];
2108 break;
2109 case GL_FOG_END:
2110 fog.end = params[0];
2111 break;
2112 case GL_FOG_COLOR:
2113 fog.color = ColorF::fromData(params);
2114 break;
2115 default:
2116 return;
2117 }
2118}
2119
2120void GetFogParameters(const GLES1State *state, GLenum pname, GLfloat *params)
2121{
2122 const FogParameters &fog = state->fogParameters();
2123 switch (pname)
2124 {
2125 case GL_FOG_MODE:
2126 params[0] = static_cast<GLfloat>(ToGLenum(fog.mode));
2127 break;
2128 case GL_FOG_DENSITY:
2129 params[0] = fog.density;
2130 break;
2131 case GL_FOG_START:
2132 params[0] = fog.start;
2133 break;
2134 case GL_FOG_END:
2135 params[0] = fog.end;
2136 break;
2137 case GL_FOG_COLOR:
2138 fog.color.writeData(params);
2139 break;
2140 default:
2141 return;
2142 }
2143}
2144
2145unsigned int GetFogParameterCount(GLenum pname)
2146{
2147 switch (pname)
2148 {
2149 case GL_FOG_MODE:
2150 case GL_FOG_DENSITY:
2151 case GL_FOG_START:
2152 case GL_FOG_END:
2153 return 1;
2154 case GL_FOG_COLOR:
2155 return 4;
2156 default:
2157 return 0;
2158 }
2159}
2160
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002161unsigned int GetTextureEnvParameterCount(TextureEnvParameter pname)
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07002162{
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002163 switch (pname)
2164 {
2165 case TextureEnvParameter::Mode:
2166 case TextureEnvParameter::CombineRgb:
2167 case TextureEnvParameter::CombineAlpha:
2168 case TextureEnvParameter::Src0Rgb:
2169 case TextureEnvParameter::Src1Rgb:
2170 case TextureEnvParameter::Src2Rgb:
2171 case TextureEnvParameter::Src0Alpha:
2172 case TextureEnvParameter::Src1Alpha:
2173 case TextureEnvParameter::Src2Alpha:
2174 case TextureEnvParameter::Op0Rgb:
2175 case TextureEnvParameter::Op1Rgb:
2176 case TextureEnvParameter::Op2Rgb:
2177 case TextureEnvParameter::Op0Alpha:
2178 case TextureEnvParameter::Op1Alpha:
2179 case TextureEnvParameter::Op2Alpha:
2180 case TextureEnvParameter::RgbScale:
2181 case TextureEnvParameter::AlphaScale:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07002182 case TextureEnvParameter::PointCoordReplace:
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002183 return 1;
2184 case TextureEnvParameter::Color:
2185 return 4;
2186 default:
2187 return 0;
2188 }
2189}
2190
2191void ConvertTextureEnvFromInt(TextureEnvParameter pname, const GLint *input, GLfloat *output)
2192{
2193 if (IsTextureEnvEnumParameter(pname))
2194 {
2195 ConvertGLenumValue(input[0], output);
2196 return;
2197 }
2198
2199 switch (pname)
2200 {
2201 case TextureEnvParameter::RgbScale:
2202 case TextureEnvParameter::AlphaScale:
2203 output[0] = static_cast<GLfloat>(input[0]);
2204 break;
2205 case TextureEnvParameter::Color:
2206 for (int i = 0; i < 4; i++)
2207 {
2208 output[i] = input[i] / 255.0f;
2209 }
2210 break;
2211 default:
2212 UNREACHABLE();
2213 break;
2214 }
2215}
2216
2217void ConvertTextureEnvFromFixed(TextureEnvParameter pname, const GLfixed *input, GLfloat *output)
2218{
2219 if (IsTextureEnvEnumParameter(pname))
2220 {
2221 ConvertGLenumValue(input[0], output);
2222 return;
2223 }
2224
2225 switch (pname)
2226 {
2227 case TextureEnvParameter::RgbScale:
2228 case TextureEnvParameter::AlphaScale:
2229 output[0] = FixedToFloat(input[0]);
2230 break;
2231 case TextureEnvParameter::Color:
2232 for (int i = 0; i < 4; i++)
2233 {
2234 output[i] = FixedToFloat(input[i]);
2235 }
2236 break;
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002237 default:
2238 UNREACHABLE();
2239 break;
2240 }
2241}
2242
2243void ConvertTextureEnvToInt(TextureEnvParameter pname, const GLfloat *input, GLint *output)
2244{
2245 if (IsTextureEnvEnumParameter(pname))
2246 {
2247 ConvertGLenumValue(input[0], output);
2248 return;
2249 }
2250
2251 switch (pname)
2252 {
2253 case TextureEnvParameter::RgbScale:
2254 case TextureEnvParameter::AlphaScale:
2255 output[0] = static_cast<GLint>(input[0]);
2256 break;
2257 case TextureEnvParameter::Color:
2258 for (int i = 0; i < 4; i++)
2259 {
2260 output[i] = static_cast<GLint>(input[i] * 255.0f);
2261 }
2262 break;
2263 default:
2264 UNREACHABLE();
2265 break;
2266 }
2267}
2268
2269void ConvertTextureEnvToFixed(TextureEnvParameter pname, const GLfloat *input, GLfixed *output)
2270{
2271 if (IsTextureEnvEnumParameter(pname))
2272 {
2273 ConvertGLenumValue(input[0], output);
2274 return;
2275 }
2276
2277 switch (pname)
2278 {
2279 case TextureEnvParameter::RgbScale:
2280 case TextureEnvParameter::AlphaScale:
2281 output[0] = FloatToFixed(input[0]);
2282 break;
2283 case TextureEnvParameter::Color:
2284 for (int i = 0; i < 4; i++)
2285 {
2286 output[i] = FloatToFixed(input[i]);
2287 }
2288 break;
2289 default:
2290 UNREACHABLE();
2291 break;
2292 }
2293}
2294
2295void SetTextureEnv(unsigned int unit,
2296 GLES1State *state,
2297 TextureEnvTarget target,
2298 TextureEnvParameter pname,
2299 const GLfloat *params)
2300{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002301 TextureEnvironmentParameters &env = state->textureEnvironment(unit);
2302 GLenum asEnum = ConvertToGLenum(params[0]);
2303
2304 switch (target)
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002305 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002306 case TextureEnvTarget::Env:
2307 switch (pname)
2308 {
2309 case TextureEnvParameter::Mode:
2310 env.mode = FromGLenum<TextureEnvMode>(asEnum);
2311 break;
2312 case TextureEnvParameter::CombineRgb:
2313 env.combineRgb = FromGLenum<TextureCombine>(asEnum);
2314 break;
2315 case TextureEnvParameter::CombineAlpha:
2316 env.combineAlpha = FromGLenum<TextureCombine>(asEnum);
2317 break;
2318 case TextureEnvParameter::Src0Rgb:
2319 env.src0Rgb = FromGLenum<TextureSrc>(asEnum);
2320 break;
2321 case TextureEnvParameter::Src1Rgb:
2322 env.src1Rgb = FromGLenum<TextureSrc>(asEnum);
2323 break;
2324 case TextureEnvParameter::Src2Rgb:
2325 env.src2Rgb = FromGLenum<TextureSrc>(asEnum);
2326 break;
2327 case TextureEnvParameter::Src0Alpha:
2328 env.src0Alpha = FromGLenum<TextureSrc>(asEnum);
2329 break;
2330 case TextureEnvParameter::Src1Alpha:
2331 env.src1Alpha = FromGLenum<TextureSrc>(asEnum);
2332 break;
2333 case TextureEnvParameter::Src2Alpha:
2334 env.src2Alpha = FromGLenum<TextureSrc>(asEnum);
2335 break;
2336 case TextureEnvParameter::Op0Rgb:
2337 env.op0Rgb = FromGLenum<TextureOp>(asEnum);
2338 break;
2339 case TextureEnvParameter::Op1Rgb:
2340 env.op1Rgb = FromGLenum<TextureOp>(asEnum);
2341 break;
2342 case TextureEnvParameter::Op2Rgb:
2343 env.op2Rgb = FromGLenum<TextureOp>(asEnum);
2344 break;
2345 case TextureEnvParameter::Op0Alpha:
2346 env.op0Alpha = FromGLenum<TextureOp>(asEnum);
2347 break;
2348 case TextureEnvParameter::Op1Alpha:
2349 env.op1Alpha = FromGLenum<TextureOp>(asEnum);
2350 break;
2351 case TextureEnvParameter::Op2Alpha:
2352 env.op2Alpha = FromGLenum<TextureOp>(asEnum);
2353 break;
2354 case TextureEnvParameter::Color:
2355 env.color = ColorF::fromData(params);
2356 break;
2357 case TextureEnvParameter::RgbScale:
2358 env.rgbScale = params[0];
2359 break;
2360 case TextureEnvParameter::AlphaScale:
2361 env.alphaScale = params[0];
2362 break;
2363 default:
2364 UNREACHABLE();
2365 break;
2366 }
2367 break;
2368 case TextureEnvTarget::PointSprite:
2369 switch (pname)
2370 {
2371 case TextureEnvParameter::PointCoordReplace:
2372 env.pointSpriteCoordReplace = static_cast<bool>(params[0]);
2373 break;
2374 default:
2375 UNREACHABLE();
2376 break;
2377 }
2378 break;
2379 default:
2380 UNREACHABLE();
2381 break;
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002382 }
2383}
2384
2385void GetTextureEnv(unsigned int unit,
2386 const GLES1State *state,
2387 TextureEnvTarget target,
2388 TextureEnvParameter pname,
2389 GLfloat *params)
2390{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002391 const TextureEnvironmentParameters &env = state->textureEnvironment(unit);
2392
2393 switch (target)
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002394 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002395 case TextureEnvTarget::Env:
2396 switch (pname)
2397 {
2398 case TextureEnvParameter::Mode:
2399 ConvertPackedEnum(env.mode, params);
2400 break;
2401 case TextureEnvParameter::CombineRgb:
2402 ConvertPackedEnum(env.combineRgb, params);
2403 break;
2404 case TextureEnvParameter::CombineAlpha:
2405 ConvertPackedEnum(env.combineAlpha, params);
2406 break;
2407 case TextureEnvParameter::Src0Rgb:
2408 ConvertPackedEnum(env.src0Rgb, params);
2409 break;
2410 case TextureEnvParameter::Src1Rgb:
2411 ConvertPackedEnum(env.src1Rgb, params);
2412 break;
2413 case TextureEnvParameter::Src2Rgb:
2414 ConvertPackedEnum(env.src2Rgb, params);
2415 break;
2416 case TextureEnvParameter::Src0Alpha:
2417 ConvertPackedEnum(env.src0Alpha, params);
2418 break;
2419 case TextureEnvParameter::Src1Alpha:
2420 ConvertPackedEnum(env.src1Alpha, params);
2421 break;
2422 case TextureEnvParameter::Src2Alpha:
2423 ConvertPackedEnum(env.src2Alpha, params);
2424 break;
2425 case TextureEnvParameter::Op0Rgb:
2426 ConvertPackedEnum(env.op0Rgb, params);
2427 break;
2428 case TextureEnvParameter::Op1Rgb:
2429 ConvertPackedEnum(env.op1Rgb, params);
2430 break;
2431 case TextureEnvParameter::Op2Rgb:
2432 ConvertPackedEnum(env.op2Rgb, params);
2433 break;
2434 case TextureEnvParameter::Op0Alpha:
2435 ConvertPackedEnum(env.op0Alpha, params);
2436 break;
2437 case TextureEnvParameter::Op1Alpha:
2438 ConvertPackedEnum(env.op1Alpha, params);
2439 break;
2440 case TextureEnvParameter::Op2Alpha:
2441 ConvertPackedEnum(env.op2Alpha, params);
2442 break;
2443 case TextureEnvParameter::Color:
2444 env.color.writeData(params);
2445 break;
2446 case TextureEnvParameter::RgbScale:
2447 *params = env.rgbScale;
2448 break;
2449 case TextureEnvParameter::AlphaScale:
2450 *params = env.alphaScale;
2451 break;
2452 default:
2453 UNREACHABLE();
2454 break;
2455 }
2456 break;
2457 case TextureEnvTarget::PointSprite:
2458 switch (pname)
2459 {
2460 case TextureEnvParameter::PointCoordReplace:
2461 *params = static_cast<GLfloat>(env.pointSpriteCoordReplace);
2462 break;
2463 default:
2464 UNREACHABLE();
2465 break;
2466 }
2467 break;
2468 default:
2469 UNREACHABLE();
2470 break;
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002471 }
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002472}
2473
2474unsigned int GetPointParameterCount(PointParameter pname)
2475{
2476 switch (pname)
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002477 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002478 case PointParameter::PointSizeMin:
2479 case PointParameter::PointSizeMax:
2480 case PointParameter::PointFadeThresholdSize:
2481 return 1;
2482 case PointParameter::PointDistanceAttenuation:
2483 return 3;
2484 default:
2485 return 0;
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002486 }
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07002487}
2488
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002489void SetPointParameter(GLES1State *state, PointParameter pname, const GLfloat *params)
2490{
2491
2492 PointParameters &pointParams = state->pointParameters();
2493
2494 switch (pname)
2495 {
2496 case PointParameter::PointSizeMin:
2497 pointParams.pointSizeMin = params[0];
2498 break;
2499 case PointParameter::PointSizeMax:
2500 pointParams.pointSizeMax = params[0];
2501 break;
2502 case PointParameter::PointFadeThresholdSize:
2503 pointParams.pointFadeThresholdSize = params[0];
2504 break;
2505 case PointParameter::PointDistanceAttenuation:
2506 for (unsigned int i = 0; i < 3; i++)
2507 {
2508 pointParams.pointDistanceAttenuation[i] = params[i];
2509 }
2510 break;
2511 default:
2512 UNREACHABLE();
2513 }
2514}
2515
2516void GetPointParameter(const GLES1State *state, PointParameter pname, GLfloat *params)
2517{
2518 const PointParameters &pointParams = state->pointParameters();
2519
2520 switch (pname)
2521 {
2522 case PointParameter::PointSizeMin:
2523 params[0] = pointParams.pointSizeMin;
2524 break;
2525 case PointParameter::PointSizeMax:
2526 params[0] = pointParams.pointSizeMax;
2527 break;
2528 case PointParameter::PointFadeThresholdSize:
2529 params[0] = pointParams.pointFadeThresholdSize;
2530 break;
2531 case PointParameter::PointDistanceAttenuation:
2532 for (unsigned int i = 0; i < 3; i++)
2533 {
2534 params[i] = pointParams.pointDistanceAttenuation[i];
2535 }
2536 break;
2537 default:
2538 UNREACHABLE();
2539 }
2540}
2541
2542void SetPointSize(GLES1State *state, GLfloat size)
2543{
2544 PointParameters &params = state->pointParameters();
2545 params.pointSize = size;
2546}
2547
2548void GetPointSize(GLES1State *state, GLfloat *sizeOut)
2549{
2550 const PointParameters &params = state->pointParameters();
2551 *sizeOut = params.pointSize;
2552}
2553
Lingfeng Yangf97641c2018-06-21 19:22:45 -07002554unsigned int GetTexParameterCount(GLenum pname)
2555{
2556 switch (pname)
2557 {
2558 case GL_TEXTURE_CROP_RECT_OES:
2559 return 4;
2560 case GL_TEXTURE_MAG_FILTER:
2561 case GL_TEXTURE_MIN_FILTER:
2562 case GL_TEXTURE_WRAP_S:
2563 case GL_TEXTURE_WRAP_T:
2564 case GL_TEXTURE_USAGE_ANGLE:
2565 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
2566 case GL_TEXTURE_IMMUTABLE_FORMAT:
2567 case GL_TEXTURE_WRAP_R:
2568 case GL_TEXTURE_IMMUTABLE_LEVELS:
2569 case GL_TEXTURE_SWIZZLE_R:
2570 case GL_TEXTURE_SWIZZLE_G:
2571 case GL_TEXTURE_SWIZZLE_B:
2572 case GL_TEXTURE_SWIZZLE_A:
2573 case GL_TEXTURE_BASE_LEVEL:
2574 case GL_TEXTURE_MAX_LEVEL:
2575 case GL_TEXTURE_MIN_LOD:
2576 case GL_TEXTURE_MAX_LOD:
2577 case GL_TEXTURE_COMPARE_MODE:
2578 case GL_TEXTURE_COMPARE_FUNC:
2579 case GL_TEXTURE_SRGB_DECODE_EXT:
2580 case GL_DEPTH_STENCIL_TEXTURE_MODE:
2581 return 1;
2582 default:
2583 return 0;
2584 }
2585}
2586
Geoff Lang65603eb2017-01-12 16:48:03 -05002587} // namespace gl
2588
2589namespace egl
2590{
2591
2592void QueryConfigAttrib(const Config *config, EGLint attribute, EGLint *value)
2593{
2594 ASSERT(config != nullptr);
2595 switch (attribute)
2596 {
2597 case EGL_BUFFER_SIZE:
2598 *value = config->bufferSize;
2599 break;
2600 case EGL_ALPHA_SIZE:
2601 *value = config->alphaSize;
2602 break;
2603 case EGL_BLUE_SIZE:
2604 *value = config->blueSize;
2605 break;
2606 case EGL_GREEN_SIZE:
2607 *value = config->greenSize;
2608 break;
2609 case EGL_RED_SIZE:
2610 *value = config->redSize;
2611 break;
2612 case EGL_DEPTH_SIZE:
2613 *value = config->depthSize;
2614 break;
2615 case EGL_STENCIL_SIZE:
2616 *value = config->stencilSize;
2617 break;
2618 case EGL_CONFIG_CAVEAT:
2619 *value = config->configCaveat;
2620 break;
2621 case EGL_CONFIG_ID:
2622 *value = config->configID;
2623 break;
2624 case EGL_LEVEL:
2625 *value = config->level;
2626 break;
2627 case EGL_NATIVE_RENDERABLE:
2628 *value = config->nativeRenderable;
2629 break;
2630 case EGL_NATIVE_VISUAL_ID:
2631 *value = config->nativeVisualID;
2632 break;
2633 case EGL_NATIVE_VISUAL_TYPE:
2634 *value = config->nativeVisualType;
2635 break;
2636 case EGL_SAMPLES:
2637 *value = config->samples;
2638 break;
2639 case EGL_SAMPLE_BUFFERS:
2640 *value = config->sampleBuffers;
2641 break;
2642 case EGL_SURFACE_TYPE:
2643 *value = config->surfaceType;
2644 break;
2645 case EGL_TRANSPARENT_TYPE:
2646 *value = config->transparentType;
2647 break;
2648 case EGL_TRANSPARENT_BLUE_VALUE:
2649 *value = config->transparentBlueValue;
2650 break;
2651 case EGL_TRANSPARENT_GREEN_VALUE:
2652 *value = config->transparentGreenValue;
2653 break;
2654 case EGL_TRANSPARENT_RED_VALUE:
2655 *value = config->transparentRedValue;
2656 break;
2657 case EGL_BIND_TO_TEXTURE_RGB:
2658 *value = config->bindToTextureRGB;
2659 break;
2660 case EGL_BIND_TO_TEXTURE_RGBA:
2661 *value = config->bindToTextureRGBA;
2662 break;
2663 case EGL_MIN_SWAP_INTERVAL:
2664 *value = config->minSwapInterval;
2665 break;
2666 case EGL_MAX_SWAP_INTERVAL:
2667 *value = config->maxSwapInterval;
2668 break;
2669 case EGL_LUMINANCE_SIZE:
2670 *value = config->luminanceSize;
2671 break;
2672 case EGL_ALPHA_MASK_SIZE:
2673 *value = config->alphaMaskSize;
2674 break;
2675 case EGL_COLOR_BUFFER_TYPE:
2676 *value = config->colorBufferType;
2677 break;
2678 case EGL_RENDERABLE_TYPE:
2679 *value = config->renderableType;
2680 break;
2681 case EGL_MATCH_NATIVE_PIXMAP:
2682 *value = false;
2683 UNIMPLEMENTED();
2684 break;
2685 case EGL_CONFORMANT:
2686 *value = config->conformant;
2687 break;
2688 case EGL_MAX_PBUFFER_WIDTH:
2689 *value = config->maxPBufferWidth;
2690 break;
2691 case EGL_MAX_PBUFFER_HEIGHT:
2692 *value = config->maxPBufferHeight;
2693 break;
2694 case EGL_MAX_PBUFFER_PIXELS:
2695 *value = config->maxPBufferPixels;
2696 break;
2697 case EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE:
2698 *value = config->optimalOrientation;
2699 break;
Geoff Langc5a2a172017-01-13 15:55:07 -05002700 case EGL_COLOR_COMPONENT_TYPE_EXT:
2701 *value = config->colorComponentType;
2702 break;
Geoff Lang65603eb2017-01-12 16:48:03 -05002703 default:
2704 UNREACHABLE();
2705 break;
2706 }
Geoff Langff5b2d52016-09-07 11:32:23 -04002707}
Geoff Lang65603eb2017-01-12 16:48:03 -05002708
Geoff Langaf143fe2017-10-05 13:59:43 -04002709void QueryContextAttrib(const gl::Context *context, EGLint attribute, EGLint *value)
2710{
2711 switch (attribute)
2712 {
2713 case EGL_CONFIG_ID:
2714 *value = context->getConfig()->configID;
2715 break;
2716 case EGL_CONTEXT_CLIENT_TYPE:
2717 *value = context->getClientType();
2718 break;
2719 case EGL_CONTEXT_CLIENT_VERSION:
2720 *value = context->getClientMajorVersion();
2721 break;
2722 case EGL_RENDER_BUFFER:
2723 *value = context->getRenderBuffer();
2724 break;
Geoff Langb433e872017-10-05 14:01:47 -04002725 case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
2726 *value = context->isRobustResourceInitEnabled();
2727 break;
Geoff Langaf143fe2017-10-05 13:59:43 -04002728 default:
2729 UNREACHABLE();
2730 break;
2731 }
2732}
2733
Geoff Lang31ecbd72017-07-26 13:01:27 -04002734void QuerySurfaceAttrib(const Surface *surface, EGLint attribute, EGLint *value)
2735{
2736 switch (attribute)
2737 {
2738 case EGL_GL_COLORSPACE:
Geoff Lang40ac7832017-07-26 14:38:46 -04002739 *value = surface->getGLColorspace();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002740 break;
2741 case EGL_VG_ALPHA_FORMAT:
Geoff Lang40ac7832017-07-26 14:38:46 -04002742 *value = surface->getVGAlphaFormat();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002743 break;
2744 case EGL_VG_COLORSPACE:
Geoff Lang40ac7832017-07-26 14:38:46 -04002745 *value = surface->getVGColorspace();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002746 break;
2747 case EGL_CONFIG_ID:
2748 *value = surface->getConfig()->configID;
2749 break;
2750 case EGL_HEIGHT:
2751 *value = surface->getHeight();
2752 break;
2753 case EGL_HORIZONTAL_RESOLUTION:
Geoff Lang40ac7832017-07-26 14:38:46 -04002754 *value = surface->getHorizontalResolution();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002755 break;
2756 case EGL_LARGEST_PBUFFER:
Geoff Lang40ac7832017-07-26 14:38:46 -04002757 // The EGL spec states that value is not written if the surface is not a pbuffer
2758 if (surface->getType() == EGL_PBUFFER_BIT)
2759 {
2760 *value = surface->getLargestPbuffer();
2761 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04002762 break;
2763 case EGL_MIPMAP_TEXTURE:
Geoff Lang40ac7832017-07-26 14:38:46 -04002764 // The EGL spec states that value is not written if the surface is not a pbuffer
2765 if (surface->getType() == EGL_PBUFFER_BIT)
2766 {
2767 *value = surface->getMipmapTexture();
2768 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04002769 break;
2770 case EGL_MIPMAP_LEVEL:
Geoff Lang40ac7832017-07-26 14:38:46 -04002771 // The EGL spec states that value is not written if the surface is not a pbuffer
2772 if (surface->getType() == EGL_PBUFFER_BIT)
2773 {
2774 *value = surface->getMipmapLevel();
2775 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04002776 break;
2777 case EGL_MULTISAMPLE_RESOLVE:
Geoff Lang40ac7832017-07-26 14:38:46 -04002778 *value = surface->getMultisampleResolve();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002779 break;
2780 case EGL_PIXEL_ASPECT_RATIO:
2781 *value = surface->getPixelAspectRatio();
2782 break;
2783 case EGL_RENDER_BUFFER:
2784 *value = surface->getRenderBuffer();
2785 break;
2786 case EGL_SWAP_BEHAVIOR:
2787 *value = surface->getSwapBehavior();
2788 break;
2789 case EGL_TEXTURE_FORMAT:
Geoff Lang40ac7832017-07-26 14:38:46 -04002790 // The EGL spec states that value is not written if the surface is not a pbuffer
2791 if (surface->getType() == EGL_PBUFFER_BIT)
2792 {
Geoff Lang8ceea812018-04-10 03:07:13 -04002793 *value = ToEGLenum(surface->getTextureFormat());
Geoff Lang40ac7832017-07-26 14:38:46 -04002794 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04002795 break;
2796 case EGL_TEXTURE_TARGET:
Geoff Lang40ac7832017-07-26 14:38:46 -04002797 // The EGL spec states that value is not written if the surface is not a pbuffer
2798 if (surface->getType() == EGL_PBUFFER_BIT)
2799 {
2800 *value = surface->getTextureTarget();
2801 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04002802 break;
2803 case EGL_VERTICAL_RESOLUTION:
Geoff Lang40ac7832017-07-26 14:38:46 -04002804 *value = surface->getVerticalResolution();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002805 break;
2806 case EGL_WIDTH:
2807 *value = surface->getWidth();
2808 break;
2809 case EGL_POST_SUB_BUFFER_SUPPORTED_NV:
2810 *value = surface->isPostSubBufferSupported();
2811 break;
2812 case EGL_FIXED_SIZE_ANGLE:
2813 *value = surface->isFixedSize();
2814 break;
2815 case EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE:
2816 *value = surface->flexibleSurfaceCompatibilityRequested();
2817 break;
2818 case EGL_SURFACE_ORIENTATION_ANGLE:
2819 *value = surface->getOrientation();
2820 break;
2821 case EGL_DIRECT_COMPOSITION_ANGLE:
2822 *value = surface->directComposition();
2823 break;
Geoff Langb433e872017-10-05 14:01:47 -04002824 case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
2825 *value = surface->isRobustResourceInitEnabled();
2826 break;
Geoff Lang31ecbd72017-07-26 13:01:27 -04002827 default:
2828 UNREACHABLE();
2829 break;
2830 }
2831}
2832
2833void SetSurfaceAttrib(Surface *surface, EGLint attribute, EGLint value)
2834{
2835 switch (attribute)
2836 {
2837 case EGL_MIPMAP_LEVEL:
Geoff Lang40ac7832017-07-26 14:38:46 -04002838 surface->setMipmapLevel(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04002839 break;
2840 case EGL_MULTISAMPLE_RESOLVE:
Geoff Lang40ac7832017-07-26 14:38:46 -04002841 surface->setMultisampleResolve(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04002842 break;
2843 case EGL_SWAP_BEHAVIOR:
Geoff Lang40ac7832017-07-26 14:38:46 -04002844 surface->setSwapBehavior(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04002845 break;
LRN03d132e2018-07-14 13:31:35 +00002846 case EGL_WIDTH:
2847 surface->setFixedWidth(value);
2848 break;
2849 case EGL_HEIGHT:
2850 surface->setFixedHeight(value);
2851 break;
Geoff Lang31ecbd72017-07-26 13:01:27 -04002852 default:
2853 UNREACHABLE();
2854 break;
2855 }
2856}
2857
Geoff Lang65603eb2017-01-12 16:48:03 -05002858} // namespace egl