blob: 4f606b4c507b2d0911a45944ca15d96fbb6eb238 [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
Olli Etuaho0ca09752018-09-24 11:00:50 +0300532 case GL_LOCATION_INDEX_EXT:
533 // EXT_blend_func_extended
534 return program->getFragDataIndex(outputVariable.name);
535
jchen10880683b2017-04-12 16:21:55 +0800536 case GL_REFERENCED_BY_FRAGMENT_SHADER:
537 return 1;
538
Jiawei Shaoc6f82872018-04-24 14:14:50 +0800539 case GL_REFERENCED_BY_VERTEX_SHADER:
jchen10880683b2017-04-12 16:21:55 +0800540 case GL_REFERENCED_BY_COMPUTE_SHADER:
Jiawei Shaoc6f82872018-04-24 14:14:50 +0800541 case GL_REFERENCED_BY_GEOMETRY_SHADER_EXT:
jchen10880683b2017-04-12 16:21:55 +0800542 return 0;
543
544 default:
545 UNREACHABLE();
546 return GL_INVALID_VALUE;
547 }
548}
549
jchen10910a3da2017-11-15 09:40:11 +0800550GLint GetTransformFeedbackVaryingResourceProperty(const Program *program,
551 GLuint index,
552 const GLenum prop)
553{
554 const auto &tfVariable = program->getTransformFeedbackVaryingResource(index);
555 switch (prop)
556 {
557 case GL_TYPE:
558 return clampCast<GLint>(tfVariable.type);
559
560 case GL_ARRAY_SIZE:
561 return clampCast<GLint>(tfVariable.size());
562
563 case GL_NAME_LENGTH:
564 return clampCast<GLint>(tfVariable.nameWithArrayIndex().size() + 1);
565
566 default:
567 UNREACHABLE();
568 return GL_INVALID_VALUE;
569 }
570}
571
jchen10d9cd7b72017-08-30 15:04:25 +0800572GLint QueryProgramInterfaceActiveResources(const Program *program, GLenum programInterface)
573{
574 switch (programInterface)
575 {
576 case GL_PROGRAM_INPUT:
jchen10a99ed552017-09-22 08:10:32 +0800577 return clampCast<GLint>(program->getAttributes().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800578
579 case GL_PROGRAM_OUTPUT:
jchen10a99ed552017-09-22 08:10:32 +0800580 return clampCast<GLint>(program->getState().getOutputVariables().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800581
582 case GL_UNIFORM:
jchen10a99ed552017-09-22 08:10:32 +0800583 return clampCast<GLint>(program->getState().getUniforms().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800584
585 case GL_UNIFORM_BLOCK:
jchen10a99ed552017-09-22 08:10:32 +0800586 return clampCast<GLint>(program->getState().getUniformBlocks().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800587
jchen1058f67be2017-10-27 08:59:27 +0800588 case GL_ATOMIC_COUNTER_BUFFER:
589 return clampCast<GLint>(program->getState().getAtomicCounterBuffers().size());
590
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800591 case GL_BUFFER_VARIABLE:
592 return clampCast<GLint>(program->getState().getBufferVariables().size());
593
594 case GL_SHADER_STORAGE_BLOCK:
595 return clampCast<GLint>(program->getState().getShaderStorageBlocks().size());
596
jchen10d9cd7b72017-08-30 15:04:25 +0800597 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10910a3da2017-11-15 09:40:11 +0800598 return clampCast<GLint>(program->getTransformFeedbackVaryingCount());
jchen10d9cd7b72017-08-30 15:04:25 +0800599
600 default:
601 UNREACHABLE();
602 return 0;
603 }
604}
605
606template <typename T, typename M>
607GLint FindMaxSize(const std::vector<T> &resources, M member)
608{
609 GLint max = 0;
610 for (const T &resource : resources)
611 {
jchen10a99ed552017-09-22 08:10:32 +0800612 max = std::max(max, clampCast<GLint>((resource.*member).size()));
jchen10d9cd7b72017-08-30 15:04:25 +0800613 }
614 return max;
615}
616
617GLint QueryProgramInterfaceMaxNameLength(const Program *program, GLenum programInterface)
618{
619 GLint maxNameLength = 0;
620 switch (programInterface)
621 {
622 case GL_PROGRAM_INPUT:
623 maxNameLength = FindMaxSize(program->getAttributes(), &sh::Attribute::name);
624 break;
625
626 case GL_PROGRAM_OUTPUT:
627 maxNameLength =
628 FindMaxSize(program->getState().getOutputVariables(), &sh::OutputVariable::name);
629 break;
630
631 case GL_UNIFORM:
632 maxNameLength = FindMaxSize(program->getState().getUniforms(), &LinkedUniform::name);
633 break;
634
635 case GL_UNIFORM_BLOCK:
Qin Jiajia9bf55522018-01-29 13:56:23 +0800636 return program->getActiveUniformBlockMaxNameLength();
jchen10d9cd7b72017-08-30 15:04:25 +0800637
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800638 case GL_BUFFER_VARIABLE:
639 maxNameLength =
640 FindMaxSize(program->getState().getBufferVariables(), &BufferVariable::name);
641 break;
642
643 case GL_SHADER_STORAGE_BLOCK:
Qin Jiajia9bf55522018-01-29 13:56:23 +0800644 return program->getActiveShaderStorageBlockMaxNameLength();
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800645
jchen10d9cd7b72017-08-30 15:04:25 +0800646 case GL_TRANSFORM_FEEDBACK_VARYING:
Qin Jiajia9bf55522018-01-29 13:56:23 +0800647 return clampCast<GLint>(program->getTransformFeedbackVaryingMaxLength());
jchen10d9cd7b72017-08-30 15:04:25 +0800648
649 default:
650 UNREACHABLE();
651 return 0;
652 }
653 // This length includes an extra character for the null terminator.
654 return (maxNameLength == 0 ? 0 : maxNameLength + 1);
655}
656
657GLint QueryProgramInterfaceMaxNumActiveVariables(const Program *program, GLenum programInterface)
658{
659 switch (programInterface)
660 {
661 case GL_UNIFORM_BLOCK:
662 return FindMaxSize(program->getState().getUniformBlocks(),
Jiajia Qin729b2c62017-08-14 09:36:11 +0800663 &InterfaceBlock::memberIndexes);
jchen1058f67be2017-10-27 08:59:27 +0800664 case GL_ATOMIC_COUNTER_BUFFER:
665 return FindMaxSize(program->getState().getAtomicCounterBuffers(),
666 &AtomicCounterBuffer::memberIndexes);
jchen10d9cd7b72017-08-30 15:04:25 +0800667
jchen10d9cd7b72017-08-30 15:04:25 +0800668 case GL_SHADER_STORAGE_BLOCK:
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800669 return FindMaxSize(program->getState().getShaderStorageBlocks(),
670 &InterfaceBlock::memberIndexes);
jchen10d9cd7b72017-08-30 15:04:25 +0800671
672 default:
673 UNREACHABLE();
674 return 0;
675 }
676}
677
jchen10baf5d942017-08-28 20:45:48 +0800678GLenum GetUniformPropertyEnum(GLenum prop)
679{
680 switch (prop)
681 {
682 case GL_UNIFORM_TYPE:
683 return GL_TYPE;
684 case GL_UNIFORM_SIZE:
685 return GL_ARRAY_SIZE;
686 case GL_UNIFORM_NAME_LENGTH:
687 return GL_NAME_LENGTH;
688 case GL_UNIFORM_BLOCK_INDEX:
689 return GL_BLOCK_INDEX;
690 case GL_UNIFORM_OFFSET:
691 return GL_OFFSET;
692 case GL_UNIFORM_ARRAY_STRIDE:
693 return GL_ARRAY_STRIDE;
694 case GL_UNIFORM_MATRIX_STRIDE:
695 return GL_MATRIX_STRIDE;
696 case GL_UNIFORM_IS_ROW_MAJOR:
697 return GL_IS_ROW_MAJOR;
698
699 default:
700 return prop;
701 }
702}
703
jchen1058f67be2017-10-27 08:59:27 +0800704GLenum GetUniformBlockPropertyEnum(GLenum prop)
705{
706 switch (prop)
707 {
708 case GL_UNIFORM_BLOCK_BINDING:
709 return GL_BUFFER_BINDING;
710
711 case GL_UNIFORM_BLOCK_DATA_SIZE:
712 return GL_BUFFER_DATA_SIZE;
713
714 case GL_UNIFORM_BLOCK_NAME_LENGTH:
715 return GL_NAME_LENGTH;
716
717 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
718 return GL_NUM_ACTIVE_VARIABLES;
719
720 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
721 return GL_ACTIVE_VARIABLES;
722
723 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
724 return GL_REFERENCED_BY_VERTEX_SHADER;
725
726 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
727 return GL_REFERENCED_BY_FRAGMENT_SHADER;
728
729 default:
730 return prop;
731 }
732}
733
734void GetShaderVariableBufferResourceProperty(const ShaderVariableBuffer &buffer,
735 GLenum pname,
736 GLint *params,
737 GLsizei bufSize,
738 GLsizei *outputPosition)
739
740{
741 switch (pname)
742 {
743 case GL_BUFFER_BINDING:
744 params[(*outputPosition)++] = buffer.binding;
745 break;
746 case GL_BUFFER_DATA_SIZE:
747 params[(*outputPosition)++] = clampCast<GLint>(buffer.dataSize);
748 break;
749 case GL_NUM_ACTIVE_VARIABLES:
750 params[(*outputPosition)++] = buffer.numActiveVariables();
751 break;
752 case GL_ACTIVE_VARIABLES:
753 for (size_t memberIndex = 0;
754 memberIndex < buffer.memberIndexes.size() && *outputPosition < bufSize;
755 ++memberIndex)
756 {
757 params[(*outputPosition)++] = clampCast<GLint>(buffer.memberIndexes[memberIndex]);
758 }
759 break;
760 case GL_REFERENCED_BY_VERTEX_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +0800761 params[(*outputPosition)++] = static_cast<GLint>(buffer.isActive(ShaderType::Vertex));
jchen1058f67be2017-10-27 08:59:27 +0800762 break;
763 case GL_REFERENCED_BY_FRAGMENT_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +0800764 params[(*outputPosition)++] = static_cast<GLint>(buffer.isActive(ShaderType::Fragment));
jchen1058f67be2017-10-27 08:59:27 +0800765 break;
766 case GL_REFERENCED_BY_COMPUTE_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +0800767 params[(*outputPosition)++] = static_cast<GLint>(buffer.isActive(ShaderType::Compute));
jchen1058f67be2017-10-27 08:59:27 +0800768 break;
Jiawei Shaoc6f82872018-04-24 14:14:50 +0800769 case GL_REFERENCED_BY_GEOMETRY_SHADER_EXT:
770 params[(*outputPosition)++] = static_cast<GLint>(buffer.isActive(ShaderType::Geometry));
771 break;
jchen1058f67be2017-10-27 08:59:27 +0800772 default:
773 UNREACHABLE();
774 break;
775 }
776}
777
778void GetInterfaceBlockResourceProperty(const InterfaceBlock &block,
779 GLenum pname,
780 GLint *params,
781 GLsizei bufSize,
782 GLsizei *outputPosition)
783{
784 if (pname == GL_NAME_LENGTH)
785 {
786 params[(*outputPosition)++] = clampCast<GLint>(block.nameWithArrayIndex().size() + 1);
787 return;
788 }
789 GetShaderVariableBufferResourceProperty(block, pname, params, bufSize, outputPosition);
790}
791
792void GetUniformBlockResourceProperty(const Program *program,
793 GLuint blockIndex,
794 GLenum pname,
795 GLint *params,
796 GLsizei bufSize,
797 GLsizei *outputPosition)
798
799{
800 ASSERT(*outputPosition < bufSize);
801 const auto &block = program->getUniformBlockByIndex(blockIndex);
802 GetInterfaceBlockResourceProperty(block, pname, params, bufSize, outputPosition);
803}
804
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800805void GetShaderStorageBlockResourceProperty(const Program *program,
806 GLuint blockIndex,
807 GLenum pname,
808 GLint *params,
809 GLsizei bufSize,
810 GLsizei *outputPosition)
811
812{
813 ASSERT(*outputPosition < bufSize);
814 const auto &block = program->getShaderStorageBlockByIndex(blockIndex);
815 GetInterfaceBlockResourceProperty(block, pname, params, bufSize, outputPosition);
816}
817
jchen1058f67be2017-10-27 08:59:27 +0800818void GetAtomicCounterBufferResourceProperty(const Program *program,
819 GLuint index,
820 GLenum pname,
821 GLint *params,
822 GLsizei bufSize,
823 GLsizei *outputPosition)
824
825{
826 ASSERT(*outputPosition < bufSize);
827 const auto &buffer = program->getState().getAtomicCounterBuffers()[index];
828 GetShaderVariableBufferResourceProperty(buffer, pname, params, bufSize, outputPosition);
829}
830
Lingfeng Yang45b5a872018-06-07 11:33:25 -0700831bool IsTextureEnvEnumParameter(TextureEnvParameter pname)
832{
833 switch (pname)
834 {
835 case TextureEnvParameter::Mode:
836 case TextureEnvParameter::CombineRgb:
837 case TextureEnvParameter::CombineAlpha:
838 case TextureEnvParameter::Src0Rgb:
839 case TextureEnvParameter::Src1Rgb:
840 case TextureEnvParameter::Src2Rgb:
841 case TextureEnvParameter::Src0Alpha:
842 case TextureEnvParameter::Src1Alpha:
843 case TextureEnvParameter::Src2Alpha:
844 case TextureEnvParameter::Op0Rgb:
845 case TextureEnvParameter::Op1Rgb:
846 case TextureEnvParameter::Op2Rgb:
847 case TextureEnvParameter::Op0Alpha:
848 case TextureEnvParameter::Op1Alpha:
849 case TextureEnvParameter::Op2Alpha:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -0700850 case TextureEnvParameter::PointCoordReplace:
Lingfeng Yang45b5a872018-06-07 11:33:25 -0700851 return true;
852 default:
853 return false;
854 }
855}
856
Geoff Langc1984ed2016-10-07 12:41:00 -0400857} // anonymous namespace
858
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -0800859void QueryFramebufferAttachmentParameteriv(const Context *context,
860 const Framebuffer *framebuffer,
Geoff Langff5b2d52016-09-07 11:32:23 -0400861 GLenum attachment,
862 GLenum pname,
863 GLint *params)
864{
865 ASSERT(framebuffer);
866
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -0800867 const FramebufferAttachment *attachmentObject = framebuffer->getAttachment(context, attachment);
868
Geoff Langff5b2d52016-09-07 11:32:23 -0400869 if (attachmentObject == nullptr)
870 {
871 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
872 // is NONE, then querying any other pname will generate INVALID_ENUM.
873
874 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
875 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
876 // INVALID_OPERATION for all other pnames
877
878 switch (pname)
879 {
880 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
881 *params = GL_NONE;
882 break;
883
884 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
885 *params = 0;
886 break;
887
888 default:
889 UNREACHABLE();
890 break;
891 }
892
893 return;
894 }
895
896 switch (pname)
897 {
898 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
899 *params = attachmentObject->type();
900 break;
901
902 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
903 *params = attachmentObject->id();
904 break;
905
906 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
907 *params = attachmentObject->mipLevel();
908 break;
909
910 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
Corentin Wallez99d492c2018-02-27 15:17:10 -0500911 {
912 TextureTarget face = attachmentObject->cubeMapFace();
913 if (face != TextureTarget::InvalidEnum)
914 {
915 *params = ToGLenum(attachmentObject->cubeMapFace());
916 }
917 else
918 {
919 // This happens when the attachment isn't a texture cube map face
920 *params = GL_NONE;
921 }
922 }
923 break;
Geoff Langff5b2d52016-09-07 11:32:23 -0400924
925 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
926 *params = attachmentObject->getRedSize();
927 break;
928
929 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
930 *params = attachmentObject->getGreenSize();
931 break;
932
933 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
934 *params = attachmentObject->getBlueSize();
935 break;
936
937 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
938 *params = attachmentObject->getAlphaSize();
939 break;
940
941 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
942 *params = attachmentObject->getDepthSize();
943 break;
944
945 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
946 *params = attachmentObject->getStencilSize();
947 break;
948
949 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
950 *params = attachmentObject->getComponentType();
951 break;
952
953 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
954 *params = attachmentObject->getColorEncoding();
955 break;
956
957 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
958 *params = attachmentObject->layer();
959 break;
960
Martin Radeve5285d22017-07-14 16:23:53 +0300961 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_ANGLE:
962 *params = attachmentObject->getNumViews();
963 break;
964
965 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_MULTIVIEW_LAYOUT_ANGLE:
966 *params = static_cast<GLint>(attachmentObject->getMultiviewLayout());
967 break;
968
969 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_ANGLE:
970 *params = attachmentObject->getBaseViewIndex();
971 break;
972
973 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_VIEWPORT_OFFSETS_ANGLE:
974 {
975 const std::vector<Offset> &offsets = attachmentObject->getMultiviewViewportOffsets();
976 for (size_t i = 0u; i < offsets.size(); ++i)
977 {
978 params[i * 2u] = offsets[i].x;
979 params[i * 2u + 1u] = offsets[i].y;
980 }
981 }
982 break;
983
Jiawei Shaoa8802472018-05-28 11:17:47 +0800984 case GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT:
985 *params = attachmentObject->isLayered();
986 break;
987
Geoff Langff5b2d52016-09-07 11:32:23 -0400988 default:
989 UNREACHABLE();
990 break;
991 }
992}
993
994void QueryBufferParameteriv(const Buffer *buffer, GLenum pname, GLint *params)
995{
Geoff Langebebe1c2016-10-14 12:01:31 -0400996 QueryBufferParameterBase(buffer, pname, params);
997}
Geoff Langff5b2d52016-09-07 11:32:23 -0400998
Geoff Langebebe1c2016-10-14 12:01:31 -0400999void QueryBufferParameteri64v(const Buffer *buffer, GLenum pname, GLint64 *params)
1000{
1001 QueryBufferParameterBase(buffer, pname, params);
Geoff Langff5b2d52016-09-07 11:32:23 -04001002}
1003
Geoff Lang496c02d2016-10-20 11:38:11 -07001004void QueryBufferPointerv(const Buffer *buffer, GLenum pname, void **params)
1005{
1006 switch (pname)
1007 {
1008 case GL_BUFFER_MAP_POINTER:
1009 *params = buffer->getMapPointer();
1010 break;
1011
1012 default:
1013 UNREACHABLE();
1014 break;
1015 }
1016}
1017
Jamie Madillffe00c02017-06-27 16:26:55 -04001018void QueryProgramiv(const Context *context, const Program *program, GLenum pname, GLint *params)
Geoff Langff5b2d52016-09-07 11:32:23 -04001019{
1020 ASSERT(program != nullptr);
1021
1022 switch (pname)
1023 {
1024 case GL_DELETE_STATUS:
1025 *params = program->isFlaggedForDeletion();
1026 return;
1027 case GL_LINK_STATUS:
1028 *params = program->isLinked();
1029 return;
jchen107ae70d82018-07-06 13:47:01 +08001030 case GL_COMPLETION_STATUS_KHR:
1031 *params = program->isLinking() ? GL_FALSE : GL_TRUE;
1032 return;
Geoff Langff5b2d52016-09-07 11:32:23 -04001033 case GL_VALIDATE_STATUS:
1034 *params = program->isValidated();
1035 return;
1036 case GL_INFO_LOG_LENGTH:
1037 *params = program->getInfoLogLength();
1038 return;
1039 case GL_ATTACHED_SHADERS:
1040 *params = program->getAttachedShadersCount();
1041 return;
1042 case GL_ACTIVE_ATTRIBUTES:
1043 *params = program->getActiveAttributeCount();
1044 return;
1045 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
1046 *params = program->getActiveAttributeMaxLength();
1047 return;
1048 case GL_ACTIVE_UNIFORMS:
1049 *params = program->getActiveUniformCount();
1050 return;
1051 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
1052 *params = program->getActiveUniformMaxLength();
1053 return;
1054 case GL_PROGRAM_BINARY_LENGTH_OES:
Shahbaz Youssefic14ab2a2018-08-24 13:57:55 -04001055 *params = context->getCaps().programBinaryFormats.empty()
1056 ? 0
1057 : program->getBinaryLength(context);
Geoff Langff5b2d52016-09-07 11:32:23 -04001058 return;
1059 case GL_ACTIVE_UNIFORM_BLOCKS:
1060 *params = program->getActiveUniformBlockCount();
1061 return;
1062 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
Qin Jiajia9bf55522018-01-29 13:56:23 +08001063 *params = program->getActiveUniformBlockMaxNameLength();
Geoff Langff5b2d52016-09-07 11:32:23 -04001064 break;
1065 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
1066 *params = program->getTransformFeedbackBufferMode();
1067 break;
1068 case GL_TRANSFORM_FEEDBACK_VARYINGS:
jchen10910a3da2017-11-15 09:40:11 +08001069 *params = clampCast<GLint>(program->getTransformFeedbackVaryingCount());
Geoff Langff5b2d52016-09-07 11:32:23 -04001070 break;
1071 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
1072 *params = program->getTransformFeedbackVaryingMaxLength();
1073 break;
1074 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
1075 *params = program->getBinaryRetrievableHint();
1076 break;
Yunchao He61afff12017-03-14 15:34:03 +08001077 case GL_PROGRAM_SEPARABLE:
1078 *params = program->isSeparable();
1079 break;
Xinghua Cao971f8502017-10-17 13:01:24 +08001080 case GL_COMPUTE_WORK_GROUP_SIZE:
1081 {
1082 const sh::WorkGroupSize &localSize = program->getComputeShaderLocalSize();
1083 params[0] = localSize[0];
1084 params[1] = localSize[1];
1085 params[2] = localSize[2];
1086 }
1087 break;
jchen1058f67be2017-10-27 08:59:27 +08001088 case GL_ACTIVE_ATOMIC_COUNTER_BUFFERS:
1089 *params = program->getActiveAtomicCounterBufferCount();
1090 break;
Jiawei Shao447bfac2018-03-14 14:23:40 +08001091 case GL_GEOMETRY_LINKED_INPUT_TYPE_EXT:
Jamie Madill493f9572018-05-24 19:52:15 -04001092 *params = ToGLenum(program->getGeometryShaderInputPrimitiveType());
Jiawei Shao447bfac2018-03-14 14:23:40 +08001093 break;
1094 case GL_GEOMETRY_LINKED_OUTPUT_TYPE_EXT:
Jamie Madill493f9572018-05-24 19:52:15 -04001095 *params = ToGLenum(program->getGeometryShaderOutputPrimitiveType());
Jiawei Shao447bfac2018-03-14 14:23:40 +08001096 break;
1097 case GL_GEOMETRY_LINKED_VERTICES_OUT_EXT:
1098 *params = program->getGeometryShaderMaxVertices();
1099 break;
1100 case GL_GEOMETRY_SHADER_INVOCATIONS_EXT:
1101 *params = program->getGeometryShaderInvocations();
1102 break;
Geoff Langff5b2d52016-09-07 11:32:23 -04001103 default:
1104 UNREACHABLE();
1105 break;
1106 }
1107}
Geoff Lang740d9022016-10-07 11:20:52 -04001108
Jamie Madill4e0e6f82017-02-17 11:06:03 -05001109void QueryRenderbufferiv(const Context *context,
1110 const Renderbuffer *renderbuffer,
1111 GLenum pname,
1112 GLint *params)
Geoff Lang740d9022016-10-07 11:20:52 -04001113{
1114 ASSERT(renderbuffer != nullptr);
1115
1116 switch (pname)
1117 {
1118 case GL_RENDERBUFFER_WIDTH:
1119 *params = renderbuffer->getWidth();
1120 break;
1121 case GL_RENDERBUFFER_HEIGHT:
1122 *params = renderbuffer->getHeight();
1123 break;
1124 case GL_RENDERBUFFER_INTERNAL_FORMAT:
Jamie Madill4e0e6f82017-02-17 11:06:03 -05001125 // Special case the WebGL 1 DEPTH_STENCIL format.
Jamie Madilla02315b2017-02-23 14:14:47 -05001126 if (context->isWebGL1() &&
Jamie Madill4e0e6f82017-02-17 11:06:03 -05001127 renderbuffer->getFormat().info->internalFormat == GL_DEPTH24_STENCIL8)
1128 {
1129 *params = GL_DEPTH_STENCIL;
1130 }
1131 else
1132 {
1133 *params = renderbuffer->getFormat().info->internalFormat;
1134 }
Geoff Lang740d9022016-10-07 11:20:52 -04001135 break;
1136 case GL_RENDERBUFFER_RED_SIZE:
1137 *params = renderbuffer->getRedSize();
1138 break;
1139 case GL_RENDERBUFFER_GREEN_SIZE:
1140 *params = renderbuffer->getGreenSize();
1141 break;
1142 case GL_RENDERBUFFER_BLUE_SIZE:
1143 *params = renderbuffer->getBlueSize();
1144 break;
1145 case GL_RENDERBUFFER_ALPHA_SIZE:
1146 *params = renderbuffer->getAlphaSize();
1147 break;
1148 case GL_RENDERBUFFER_DEPTH_SIZE:
1149 *params = renderbuffer->getDepthSize();
1150 break;
1151 case GL_RENDERBUFFER_STENCIL_SIZE:
1152 *params = renderbuffer->getStencilSize();
1153 break;
1154 case GL_RENDERBUFFER_SAMPLES_ANGLE:
1155 *params = renderbuffer->getSamples();
1156 break;
1157 default:
1158 UNREACHABLE();
1159 break;
1160 }
1161}
Geoff Langd7d0ed32016-10-07 11:33:51 -04001162
jchen103fd614d2018-08-13 12:21:58 +08001163void QueryShaderiv(Shader *shader, GLenum pname, GLint *params)
Geoff Langd7d0ed32016-10-07 11:33:51 -04001164{
1165 ASSERT(shader != nullptr);
1166
1167 switch (pname)
1168 {
1169 case GL_SHADER_TYPE:
Jiawei Shao385b3e02018-03-21 09:43:28 +08001170 *params = static_cast<GLint>(ToGLenum(shader->getType()));
Geoff Langd7d0ed32016-10-07 11:33:51 -04001171 return;
1172 case GL_DELETE_STATUS:
1173 *params = shader->isFlaggedForDeletion();
1174 return;
1175 case GL_COMPILE_STATUS:
jchen103fd614d2018-08-13 12:21:58 +08001176 *params = shader->isCompiled() ? GL_TRUE : GL_FALSE;
Geoff Langd7d0ed32016-10-07 11:33:51 -04001177 return;
jchen107ae70d82018-07-06 13:47:01 +08001178 case GL_COMPLETION_STATUS_KHR:
jchen10a155bac2018-08-16 15:26:39 +08001179 *params = shader->isCompleted() ? GL_TRUE : GL_FALSE;
jchen107ae70d82018-07-06 13:47:01 +08001180 return;
Geoff Langd7d0ed32016-10-07 11:33:51 -04001181 case GL_INFO_LOG_LENGTH:
jchen103fd614d2018-08-13 12:21:58 +08001182 *params = shader->getInfoLogLength();
Geoff Langd7d0ed32016-10-07 11:33:51 -04001183 return;
1184 case GL_SHADER_SOURCE_LENGTH:
1185 *params = shader->getSourceLength();
1186 return;
1187 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
jchen103fd614d2018-08-13 12:21:58 +08001188 *params = shader->getTranslatedSourceWithDebugInfoLength();
Geoff Langd7d0ed32016-10-07 11:33:51 -04001189 return;
1190 default:
1191 UNREACHABLE();
1192 break;
1193 }
1194}
Geoff Langc1984ed2016-10-07 12:41:00 -04001195
He Yunchao11b038b2016-11-22 21:24:04 +08001196void QueryTexLevelParameterfv(const Texture *texture,
Corentin Wallez99d492c2018-02-27 15:17:10 -05001197 TextureTarget target,
He Yunchao11b038b2016-11-22 21:24:04 +08001198 GLint level,
1199 GLenum pname,
1200 GLfloat *params)
1201{
1202 QueryTexLevelParameterBase(texture, target, level, pname, params);
1203}
1204
1205void QueryTexLevelParameteriv(const Texture *texture,
Corentin Wallez99d492c2018-02-27 15:17:10 -05001206 TextureTarget target,
He Yunchao11b038b2016-11-22 21:24:04 +08001207 GLint level,
1208 GLenum pname,
1209 GLint *params)
1210{
1211 QueryTexLevelParameterBase(texture, target, level, pname, params);
1212}
1213
Geoff Langc1984ed2016-10-07 12:41:00 -04001214void QueryTexParameterfv(const Texture *texture, GLenum pname, GLfloat *params)
1215{
1216 QueryTexParameterBase(texture, pname, params);
1217}
1218
1219void QueryTexParameteriv(const Texture *texture, GLenum pname, GLint *params)
1220{
1221 QueryTexParameterBase(texture, pname, params);
1222}
1223
1224void QuerySamplerParameterfv(const Sampler *sampler, GLenum pname, GLfloat *params)
1225{
1226 QuerySamplerParameterBase(sampler, pname, params);
1227}
1228
1229void QuerySamplerParameteriv(const Sampler *sampler, GLenum pname, GLint *params)
1230{
1231 QuerySamplerParameterBase(sampler, pname, params);
1232}
1233
Geoff Lang0b031062016-10-13 14:30:04 -04001234void QueryVertexAttribfv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001235 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001236 const VertexAttribCurrentValueData &currentValueData,
1237 GLenum pname,
1238 GLfloat *params)
1239{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001240 QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001241}
1242
1243void QueryVertexAttribiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001244 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001245 const VertexAttribCurrentValueData &currentValueData,
1246 GLenum pname,
1247 GLint *params)
1248{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001249 QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001250}
1251
Jamie Madill876429b2017-04-20 15:46:24 -04001252void QueryVertexAttribPointerv(const VertexAttribute &attrib, GLenum pname, void **pointer)
Geoff Lang0b031062016-10-13 14:30:04 -04001253{
1254 switch (pname)
1255 {
1256 case GL_VERTEX_ATTRIB_ARRAY_POINTER:
Jamie Madill876429b2017-04-20 15:46:24 -04001257 *pointer = const_cast<void *>(attrib.pointer);
Geoff Lang0b031062016-10-13 14:30:04 -04001258 break;
1259
1260 default:
1261 UNREACHABLE();
1262 break;
1263 }
1264}
1265
1266void QueryVertexAttribIiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001267 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001268 const VertexAttribCurrentValueData &currentValueData,
1269 GLenum pname,
1270 GLint *params)
1271{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001272 QueryVertexAttribBase(attrib, binding, currentValueData.IntValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001273}
1274
1275void QueryVertexAttribIuiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001276 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001277 const VertexAttribCurrentValueData &currentValueData,
1278 GLenum pname,
1279 GLuint *params)
1280{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001281 QueryVertexAttribBase(attrib, binding, currentValueData.UnsignedIntValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001282}
1283
Geoff Lang6899b872016-10-14 11:30:13 -04001284void QueryActiveUniformBlockiv(const Program *program,
1285 GLuint uniformBlockIndex,
1286 GLenum pname,
1287 GLint *params)
1288{
jchen1058f67be2017-10-27 08:59:27 +08001289 GLenum prop = GetUniformBlockPropertyEnum(pname);
1290 QueryProgramResourceiv(program, GL_UNIFORM_BLOCK, uniformBlockIndex, 1, &prop,
1291 std::numeric_limits<GLsizei>::max(), nullptr, params);
Geoff Lang6899b872016-10-14 11:30:13 -04001292}
1293
Geoff Lang0a9661f2016-10-20 10:59:20 -07001294void QueryInternalFormativ(const TextureCaps &format, GLenum pname, GLsizei bufSize, GLint *params)
1295{
1296 switch (pname)
1297 {
1298 case GL_NUM_SAMPLE_COUNTS:
1299 if (bufSize != 0)
1300 {
jchen10a99ed552017-09-22 08:10:32 +08001301 *params = clampCast<GLint>(format.sampleCounts.size());
Geoff Lang0a9661f2016-10-20 10:59:20 -07001302 }
1303 break;
1304
1305 case GL_SAMPLES:
1306 {
1307 size_t returnCount = std::min<size_t>(bufSize, format.sampleCounts.size());
1308 auto sampleReverseIt = format.sampleCounts.rbegin();
1309 for (size_t sampleIndex = 0; sampleIndex < returnCount; ++sampleIndex)
1310 {
1311 params[sampleIndex] = *sampleReverseIt++;
1312 }
1313 }
1314 break;
1315
1316 default:
1317 UNREACHABLE();
1318 break;
1319 }
1320}
1321
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001322void QueryFramebufferParameteriv(const Framebuffer *framebuffer, GLenum pname, GLint *params)
1323{
1324 ASSERT(framebuffer);
1325
1326 switch (pname)
1327 {
1328 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
1329 *params = framebuffer->getDefaultWidth();
1330 break;
1331 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
1332 *params = framebuffer->getDefaultHeight();
1333 break;
1334 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
1335 *params = framebuffer->getDefaultSamples();
1336 break;
1337 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
Geoff Lang92019432017-11-20 13:09:34 -05001338 *params = ConvertToGLBoolean(framebuffer->getDefaultFixedSampleLocations());
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001339 break;
Jiawei Shaob1e91382018-05-17 14:33:55 +08001340 case GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT:
1341 *params = framebuffer->getDefaultLayers();
1342 break;
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001343 default:
1344 UNREACHABLE();
1345 break;
1346 }
1347}
1348
Jamie Madilla0691b72018-07-25 10:41:22 -04001349Error QuerySynciv(const Context *context,
1350 const Sync *sync,
1351 GLenum pname,
1352 GLsizei bufSize,
1353 GLsizei *length,
1354 GLint *values)
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001355{
1356 ASSERT(sync);
1357
Geoff Lang82483b92017-04-11 15:33:00 -04001358 // All queries return one value, exit early if the buffer can't fit anything.
1359 if (bufSize < 1)
1360 {
1361 if (length != nullptr)
1362 {
1363 *length = 0;
1364 }
1365 return NoError();
1366 }
1367
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001368 switch (pname)
1369 {
1370 case GL_OBJECT_TYPE:
jchen10a99ed552017-09-22 08:10:32 +08001371 *values = clampCast<GLint>(GL_SYNC_FENCE);
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001372 break;
1373 case GL_SYNC_CONDITION:
jchen10a99ed552017-09-22 08:10:32 +08001374 *values = clampCast<GLint>(sync->getCondition());
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001375 break;
1376 case GL_SYNC_FLAGS:
jchen10a99ed552017-09-22 08:10:32 +08001377 *values = clampCast<GLint>(sync->getFlags());
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001378 break;
1379 case GL_SYNC_STATUS:
Jamie Madilla0691b72018-07-25 10:41:22 -04001380 ANGLE_TRY(sync->getStatus(context, values));
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001381 break;
1382
1383 default:
1384 UNREACHABLE();
1385 break;
1386 }
1387
Geoff Lang82483b92017-04-11 15:33:00 -04001388 if (length != nullptr)
1389 {
1390 *length = 1;
1391 }
1392
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001393 return NoError();
1394}
1395
Jamie Madill4928b7c2017-06-20 12:57:39 -04001396void SetTexParameterf(Context *context, Texture *texture, GLenum pname, GLfloat param)
Geoff Langc1984ed2016-10-07 12:41:00 -04001397{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001398 SetTexParameterBase(context, texture, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -04001399}
1400
Jamie Madill4928b7c2017-06-20 12:57:39 -04001401void SetTexParameterfv(Context *context, Texture *texture, GLenum pname, const GLfloat *params)
Geoff Langc1984ed2016-10-07 12:41:00 -04001402{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001403 SetTexParameterBase(context, texture, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001404}
1405
Jamie Madill4928b7c2017-06-20 12:57:39 -04001406void SetTexParameteri(Context *context, Texture *texture, GLenum pname, GLint param)
Geoff Langc1984ed2016-10-07 12:41:00 -04001407{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001408 SetTexParameterBase(context, texture, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -04001409}
1410
Jamie Madill4928b7c2017-06-20 12:57:39 -04001411void SetTexParameteriv(Context *context, Texture *texture, GLenum pname, const GLint *params)
Geoff Langc1984ed2016-10-07 12:41:00 -04001412{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001413 SetTexParameterBase(context, texture, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001414}
1415
Jamie Madille25b8002018-09-20 13:39:49 -04001416void SetSamplerParameterf(Context *context, Sampler *sampler, GLenum pname, GLfloat param)
Geoff Langc1984ed2016-10-07 12:41:00 -04001417{
Jamie Madille25b8002018-09-20 13:39:49 -04001418 SetSamplerParameterBase(context, sampler, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -04001419}
1420
Jamie Madille25b8002018-09-20 13:39:49 -04001421void SetSamplerParameterfv(Context *context, Sampler *sampler, GLenum pname, const GLfloat *params)
Geoff Langc1984ed2016-10-07 12:41:00 -04001422{
Jamie Madille25b8002018-09-20 13:39:49 -04001423 SetSamplerParameterBase(context, sampler, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001424}
1425
Jamie Madille25b8002018-09-20 13:39:49 -04001426void SetSamplerParameteri(Context *context, Sampler *sampler, GLenum pname, GLint param)
Geoff Langc1984ed2016-10-07 12:41:00 -04001427{
Jamie Madille25b8002018-09-20 13:39:49 -04001428 SetSamplerParameterBase(context, sampler, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -04001429}
1430
Jamie Madille25b8002018-09-20 13:39:49 -04001431void SetSamplerParameteriv(Context *context, Sampler *sampler, GLenum pname, const GLint *params)
Geoff Langc1984ed2016-10-07 12:41:00 -04001432{
Jamie Madille25b8002018-09-20 13:39:49 -04001433 SetSamplerParameterBase(context, sampler, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001434}
Geoff Lang65603eb2017-01-12 16:48:03 -05001435
Jamie Madillb983a4b2018-08-01 11:34:51 -04001436void SetFramebufferParameteri(const Context *context,
1437 Framebuffer *framebuffer,
1438 GLenum pname,
1439 GLint param)
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001440{
1441 ASSERT(framebuffer);
1442
1443 switch (pname)
1444 {
1445 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
Jamie Madillb983a4b2018-08-01 11:34:51 -04001446 framebuffer->setDefaultWidth(context, param);
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001447 break;
1448 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
Jamie Madillb983a4b2018-08-01 11:34:51 -04001449 framebuffer->setDefaultHeight(context, param);
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001450 break;
1451 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
Jamie Madillb983a4b2018-08-01 11:34:51 -04001452 framebuffer->setDefaultSamples(context, param);
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001453 break;
1454 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
Jamie Madillb983a4b2018-08-01 11:34:51 -04001455 framebuffer->setDefaultFixedSampleLocations(context, ConvertToBool(param));
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001456 break;
Jiawei Shaob1e91382018-05-17 14:33:55 +08001457 case GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT:
1458 framebuffer->setDefaultLayers(param);
1459 break;
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001460 default:
1461 UNREACHABLE();
1462 break;
1463 }
1464}
1465
Yunchao He61afff12017-03-14 15:34:03 +08001466void SetProgramParameteri(Program *program, GLenum pname, GLint value)
1467{
1468 ASSERT(program);
1469
1470 switch (pname)
1471 {
1472 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
Geoff Lang92019432017-11-20 13:09:34 -05001473 program->setBinaryRetrievableHint(ConvertToBool(value));
Yunchao He61afff12017-03-14 15:34:03 +08001474 break;
1475 case GL_PROGRAM_SEPARABLE:
Geoff Lang92019432017-11-20 13:09:34 -05001476 program->setSeparable(ConvertToBool(value));
Yunchao He61afff12017-03-14 15:34:03 +08001477 break;
1478 default:
1479 UNREACHABLE();
1480 break;
1481 }
1482}
1483
jchen10baf5d942017-08-28 20:45:48 +08001484GLint GetUniformResourceProperty(const Program *program, GLuint index, const GLenum prop)
1485{
1486 const auto &uniform = program->getUniformByIndex(index);
1487 GLenum resourceProp = GetUniformPropertyEnum(prop);
1488 switch (resourceProp)
1489 {
1490 case GL_TYPE:
1491 case GL_ARRAY_SIZE:
1492 case GL_NAME_LENGTH:
Olli Etuaho465835d2017-09-26 13:34:10 +03001493 return GetCommonVariableProperty(uniform, resourceProp);
jchen10baf5d942017-08-28 20:45:48 +08001494
1495 case GL_LOCATION:
1496 return program->getUniformLocation(uniform.name);
1497
1498 case GL_BLOCK_INDEX:
1499 return (uniform.isAtomicCounter() ? -1 : uniform.bufferIndex);
1500
1501 case GL_OFFSET:
1502 return uniform.blockInfo.offset;
1503
1504 case GL_ARRAY_STRIDE:
1505 return uniform.blockInfo.arrayStride;
1506
1507 case GL_MATRIX_STRIDE:
1508 return uniform.blockInfo.matrixStride;
1509
1510 case GL_IS_ROW_MAJOR:
1511 return static_cast<GLint>(uniform.blockInfo.isRowMajorMatrix);
1512
1513 case GL_REFERENCED_BY_VERTEX_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001514 return uniform.isActive(ShaderType::Vertex);
jchen10baf5d942017-08-28 20:45:48 +08001515
1516 case GL_REFERENCED_BY_FRAGMENT_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001517 return uniform.isActive(ShaderType::Fragment);
jchen10baf5d942017-08-28 20:45:48 +08001518
1519 case GL_REFERENCED_BY_COMPUTE_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001520 return uniform.isActive(ShaderType::Compute);
jchen10baf5d942017-08-28 20:45:48 +08001521
Jiawei Shaoc6f82872018-04-24 14:14:50 +08001522 case GL_REFERENCED_BY_GEOMETRY_SHADER_EXT:
1523 return uniform.isActive(ShaderType::Geometry);
1524
jchen10baf5d942017-08-28 20:45:48 +08001525 case GL_ATOMIC_COUNTER_BUFFER_INDEX:
1526 return (uniform.isAtomicCounter() ? uniform.bufferIndex : -1);
1527
1528 default:
1529 UNREACHABLE();
1530 return 0;
1531 }
1532}
1533
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001534GLint GetBufferVariableResourceProperty(const Program *program, GLuint index, const GLenum prop)
1535{
1536 const auto &bufferVariable = program->getBufferVariableByIndex(index);
1537 switch (prop)
1538 {
1539 case GL_TYPE:
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001540 case GL_ARRAY_SIZE:
Olli Etuaho465835d2017-09-26 13:34:10 +03001541 case GL_NAME_LENGTH:
1542 return GetCommonVariableProperty(bufferVariable, prop);
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001543
1544 case GL_BLOCK_INDEX:
1545 return bufferVariable.bufferIndex;
1546
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001547 case GL_OFFSET:
1548 return bufferVariable.blockInfo.offset;
1549
1550 case GL_ARRAY_STRIDE:
1551 return bufferVariable.blockInfo.arrayStride;
1552
1553 case GL_MATRIX_STRIDE:
1554 return bufferVariable.blockInfo.matrixStride;
1555
1556 case GL_IS_ROW_MAJOR:
1557 return static_cast<GLint>(bufferVariable.blockInfo.isRowMajorMatrix);
1558
1559 case GL_REFERENCED_BY_VERTEX_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001560 return bufferVariable.isActive(ShaderType::Vertex);
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001561
1562 case GL_REFERENCED_BY_FRAGMENT_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001563 return bufferVariable.isActive(ShaderType::Fragment);
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001564
1565 case GL_REFERENCED_BY_COMPUTE_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001566 return bufferVariable.isActive(ShaderType::Compute);
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001567
Jiawei Shaoc6f82872018-04-24 14:14:50 +08001568 case GL_REFERENCED_BY_GEOMETRY_SHADER_EXT:
1569 return bufferVariable.isActive(ShaderType::Geometry);
1570
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001571 case GL_TOP_LEVEL_ARRAY_SIZE:
1572 return bufferVariable.topLevelArraySize;
1573
1574 case GL_TOP_LEVEL_ARRAY_STRIDE:
1575 return bufferVariable.blockInfo.topLevelArrayStride;
1576
1577 default:
1578 UNREACHABLE();
1579 return 0;
1580 }
1581}
1582
jchen1015015f72017-03-16 13:54:21 +08001583GLuint QueryProgramResourceIndex(const Program *program,
1584 GLenum programInterface,
1585 const GLchar *name)
1586{
1587 switch (programInterface)
1588 {
1589 case GL_PROGRAM_INPUT:
1590 return program->getInputResourceIndex(name);
1591
1592 case GL_PROGRAM_OUTPUT:
1593 return program->getOutputResourceIndex(name);
1594
jchen1015015f72017-03-16 13:54:21 +08001595 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001596 return program->getState().getUniformIndexFromName(name);
1597
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001598 case GL_BUFFER_VARIABLE:
1599 return program->getState().getBufferVariableIndexFromName(name);
1600
1601 case GL_SHADER_STORAGE_BLOCK:
1602 return program->getShaderStorageBlockIndex(name);
1603
jchen1015015f72017-03-16 13:54:21 +08001604 case GL_UNIFORM_BLOCK:
jchen1058f67be2017-10-27 08:59:27 +08001605 return program->getUniformBlockIndex(name);
1606
jchen1015015f72017-03-16 13:54:21 +08001607 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10910a3da2017-11-15 09:40:11 +08001608 return program->getTransformFeedbackVaryingResourceIndex(name);
jchen1015015f72017-03-16 13:54:21 +08001609
1610 default:
1611 UNREACHABLE();
1612 return GL_INVALID_INDEX;
1613 }
1614}
1615
jchen10fd7c3b52017-03-21 15:36:03 +08001616void QueryProgramResourceName(const Program *program,
1617 GLenum programInterface,
1618 GLuint index,
1619 GLsizei bufSize,
1620 GLsizei *length,
1621 GLchar *name)
1622{
1623 switch (programInterface)
1624 {
1625 case GL_PROGRAM_INPUT:
1626 program->getInputResourceName(index, bufSize, length, name);
1627 break;
1628
1629 case GL_PROGRAM_OUTPUT:
1630 program->getOutputResourceName(index, bufSize, length, name);
1631 break;
1632
jchen10fd7c3b52017-03-21 15:36:03 +08001633 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001634 program->getUniformResourceName(index, bufSize, length, name);
1635 break;
1636
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001637 case GL_BUFFER_VARIABLE:
1638 program->getBufferVariableResourceName(index, bufSize, length, name);
1639 break;
1640
1641 case GL_SHADER_STORAGE_BLOCK:
1642 program->getActiveShaderStorageBlockName(index, bufSize, length, name);
1643 break;
1644
jchen10fd7c3b52017-03-21 15:36:03 +08001645 case GL_UNIFORM_BLOCK:
jchen1058f67be2017-10-27 08:59:27 +08001646 program->getActiveUniformBlockName(index, bufSize, length, name);
1647 break;
1648
jchen10fd7c3b52017-03-21 15:36:03 +08001649 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10910a3da2017-11-15 09:40:11 +08001650 program->getTransformFeedbackVarying(index, bufSize, length, nullptr, nullptr, name);
jchen10fd7c3b52017-03-21 15:36:03 +08001651 break;
1652
1653 default:
1654 UNREACHABLE();
1655 }
1656}
1657
jchen10191381f2017-04-11 13:59:04 +08001658GLint QueryProgramResourceLocation(const Program *program,
1659 GLenum programInterface,
1660 const GLchar *name)
1661{
1662 switch (programInterface)
1663 {
1664 case GL_PROGRAM_INPUT:
1665 return program->getAttributeLocation(name);
1666
1667 case GL_PROGRAM_OUTPUT:
1668 return program->getFragDataLocation(name);
1669
jchen10191381f2017-04-11 13:59:04 +08001670 case GL_UNIFORM:
Olli Etuahod2551232017-10-26 20:03:33 +03001671 return program->getUniformLocation(name);
jchen10baf5d942017-08-28 20:45:48 +08001672
jchen10191381f2017-04-11 13:59:04 +08001673 default:
1674 UNREACHABLE();
1675 return -1;
1676 }
1677}
1678
jchen10880683b2017-04-12 16:21:55 +08001679void QueryProgramResourceiv(const Program *program,
1680 GLenum programInterface,
1681 GLuint index,
1682 GLsizei propCount,
1683 const GLenum *props,
1684 GLsizei bufSize,
1685 GLsizei *length,
1686 GLint *params)
1687{
1688 if (!program->isLinked())
1689 {
1690 if (length != nullptr)
1691 {
1692 *length = 0;
1693 }
1694 return;
1695 }
1696
jchen1058f67be2017-10-27 08:59:27 +08001697 GLsizei pos = 0;
1698 for (GLsizei i = 0; i < propCount; i++)
jchen10880683b2017-04-12 16:21:55 +08001699 {
1700 switch (programInterface)
1701 {
1702 case GL_PROGRAM_INPUT:
1703 params[i] = GetInputResourceProperty(program, index, props[i]);
jchen1058f67be2017-10-27 08:59:27 +08001704 ++pos;
jchen10880683b2017-04-12 16:21:55 +08001705 break;
1706
1707 case GL_PROGRAM_OUTPUT:
1708 params[i] = GetOutputResourceProperty(program, index, props[i]);
jchen1058f67be2017-10-27 08:59:27 +08001709 ++pos;
jchen10880683b2017-04-12 16:21:55 +08001710 break;
1711
jchen10880683b2017-04-12 16:21:55 +08001712 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001713 params[i] = GetUniformResourceProperty(program, index, props[i]);
jchen1058f67be2017-10-27 08:59:27 +08001714 ++pos;
1715 break;
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001716
1717 case GL_BUFFER_VARIABLE:
1718 params[i] = GetBufferVariableResourceProperty(program, index, props[i]);
1719 ++pos;
1720 break;
1721
jchen1058f67be2017-10-27 08:59:27 +08001722 case GL_UNIFORM_BLOCK:
1723 GetUniformBlockResourceProperty(program, index, props[i], params, bufSize, &pos);
jchen10baf5d942017-08-28 20:45:48 +08001724 break;
1725
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001726 case GL_SHADER_STORAGE_BLOCK:
1727 GetShaderStorageBlockResourceProperty(program, index, props[i], params, bufSize,
1728 &pos);
1729 break;
1730
jchen1058f67be2017-10-27 08:59:27 +08001731 case GL_ATOMIC_COUNTER_BUFFER:
1732 GetAtomicCounterBufferResourceProperty(program, index, props[i], params, bufSize,
1733 &pos);
1734 break;
jchen10910a3da2017-11-15 09:40:11 +08001735
jchen10880683b2017-04-12 16:21:55 +08001736 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10910a3da2017-11-15 09:40:11 +08001737 params[i] = GetTransformFeedbackVaryingResourceProperty(program, index, props[i]);
1738 ++pos;
jchen10880683b2017-04-12 16:21:55 +08001739 break;
1740
1741 default:
1742 UNREACHABLE();
1743 params[i] = GL_INVALID_VALUE;
1744 }
jchen1058f67be2017-10-27 08:59:27 +08001745 if (pos == bufSize)
1746 {
1747 // Most properties return one value, but GL_ACTIVE_VARIABLES returns an array of values.
1748 // This checks not to break buffer bounds for such case.
1749 break;
1750 }
1751 }
1752
1753 if (length != nullptr)
1754 {
1755 *length = pos;
jchen10880683b2017-04-12 16:21:55 +08001756 }
1757}
1758
jchen10d9cd7b72017-08-30 15:04:25 +08001759void QueryProgramInterfaceiv(const Program *program,
1760 GLenum programInterface,
1761 GLenum pname,
1762 GLint *params)
1763{
1764 switch (pname)
1765 {
1766 case GL_ACTIVE_RESOURCES:
1767 *params = QueryProgramInterfaceActiveResources(program, programInterface);
1768 break;
1769
1770 case GL_MAX_NAME_LENGTH:
1771 *params = QueryProgramInterfaceMaxNameLength(program, programInterface);
1772 break;
1773
1774 case GL_MAX_NUM_ACTIVE_VARIABLES:
1775 *params = QueryProgramInterfaceMaxNumActiveVariables(program, programInterface);
1776 break;
1777
1778 default:
1779 UNREACHABLE();
1780 }
1781}
1782
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001783ClientVertexArrayType ParamToVertexArrayType(GLenum param)
1784{
1785 switch (param)
1786 {
1787 case GL_VERTEX_ARRAY:
1788 case GL_VERTEX_ARRAY_BUFFER_BINDING:
1789 case GL_VERTEX_ARRAY_STRIDE:
1790 case GL_VERTEX_ARRAY_SIZE:
1791 case GL_VERTEX_ARRAY_TYPE:
1792 case GL_VERTEX_ARRAY_POINTER:
1793 return ClientVertexArrayType::Vertex;
1794 case GL_NORMAL_ARRAY:
1795 case GL_NORMAL_ARRAY_BUFFER_BINDING:
1796 case GL_NORMAL_ARRAY_STRIDE:
1797 case GL_NORMAL_ARRAY_TYPE:
1798 case GL_NORMAL_ARRAY_POINTER:
1799 return ClientVertexArrayType::Normal;
1800 case GL_COLOR_ARRAY:
1801 case GL_COLOR_ARRAY_BUFFER_BINDING:
1802 case GL_COLOR_ARRAY_STRIDE:
1803 case GL_COLOR_ARRAY_SIZE:
1804 case GL_COLOR_ARRAY_TYPE:
1805 case GL_COLOR_ARRAY_POINTER:
1806 return ClientVertexArrayType::Color;
1807 case GL_POINT_SIZE_ARRAY_OES:
1808 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
1809 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
1810 case GL_POINT_SIZE_ARRAY_TYPE_OES:
1811 case GL_POINT_SIZE_ARRAY_POINTER_OES:
1812 return ClientVertexArrayType::PointSize;
1813 case GL_TEXTURE_COORD_ARRAY:
1814 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
1815 case GL_TEXTURE_COORD_ARRAY_STRIDE:
1816 case GL_TEXTURE_COORD_ARRAY_SIZE:
1817 case GL_TEXTURE_COORD_ARRAY_TYPE:
1818 case GL_TEXTURE_COORD_ARRAY_POINTER:
1819 return ClientVertexArrayType::TextureCoord;
1820 default:
1821 UNREACHABLE();
1822 return ClientVertexArrayType::InvalidEnum;
1823 }
1824}
1825
Lingfeng Yangd0febe72018-05-17 22:36:52 -07001826void SetLightModelParameters(GLES1State *state, GLenum pname, const GLfloat *params)
1827{
1828 LightModelParameters &lightModel = state->lightModelParameters();
1829
1830 switch (pname)
1831 {
1832 case GL_LIGHT_MODEL_AMBIENT:
1833 lightModel.color = ColorF::fromData(params);
1834 break;
1835 case GL_LIGHT_MODEL_TWO_SIDE:
1836 lightModel.twoSided = *params == 1.0f ? true : false;
1837 break;
1838 default:
1839 break;
1840 }
1841}
1842
1843void GetLightModelParameters(const GLES1State *state, GLenum pname, GLfloat *params)
1844{
1845 const LightModelParameters &lightModel = state->lightModelParameters();
1846
1847 switch (pname)
1848 {
1849 case GL_LIGHT_MODEL_TWO_SIDE:
1850 *params = lightModel.twoSided ? 1.0f : 0.0f;
1851 break;
1852 case GL_LIGHT_MODEL_AMBIENT:
1853 lightModel.color.writeData(params);
1854 break;
1855 default:
1856 break;
1857 }
1858}
1859
1860bool IsLightModelTwoSided(const GLES1State *state)
1861{
1862 return state->lightModelParameters().twoSided;
1863}
1864
1865void SetLightParameters(GLES1State *state,
1866 GLenum light,
1867 LightParameter pname,
1868 const GLfloat *params)
1869{
1870 uint32_t lightIndex = light - GL_LIGHT0;
1871
1872 LightParameters &lightParams = state->lightParameters(lightIndex);
1873
1874 switch (pname)
1875 {
1876 case LightParameter::Ambient:
1877 lightParams.ambient = ColorF::fromData(params);
1878 break;
1879 case LightParameter::Diffuse:
1880 lightParams.diffuse = ColorF::fromData(params);
1881 break;
1882 case LightParameter::Specular:
1883 lightParams.specular = ColorF::fromData(params);
1884 break;
1885 case LightParameter::Position:
1886 {
1887 angle::Mat4 mv = state->getModelviewMatrix();
1888 angle::Vector4 transformedPos =
1889 mv.product(angle::Vector4(params[0], params[1], params[2], params[3]));
1890 lightParams.position[0] = transformedPos[0];
1891 lightParams.position[1] = transformedPos[1];
1892 lightParams.position[2] = transformedPos[2];
1893 lightParams.position[3] = transformedPos[3];
1894 }
1895 break;
1896 case LightParameter::SpotDirection:
1897 {
1898 angle::Mat4 mv = state->getModelviewMatrix();
1899 angle::Vector4 transformedPos =
1900 mv.product(angle::Vector4(params[0], params[1], params[2], 0.0f));
1901 lightParams.direction[0] = transformedPos[0];
1902 lightParams.direction[1] = transformedPos[1];
1903 lightParams.direction[2] = transformedPos[2];
1904 }
1905 break;
1906 case LightParameter::SpotExponent:
1907 lightParams.spotlightExponent = *params;
1908 break;
1909 case LightParameter::SpotCutoff:
1910 lightParams.spotlightCutoffAngle = *params;
1911 break;
1912 case LightParameter::ConstantAttenuation:
1913 lightParams.attenuationConst = *params;
1914 break;
1915 case LightParameter::LinearAttenuation:
1916 lightParams.attenuationLinear = *params;
1917 break;
1918 case LightParameter::QuadraticAttenuation:
1919 lightParams.attenuationQuadratic = *params;
1920 break;
1921 default:
1922 return;
1923 }
1924}
1925
1926void GetLightParameters(const GLES1State *state,
1927 GLenum light,
1928 LightParameter pname,
1929 GLfloat *params)
1930{
1931 uint32_t lightIndex = light - GL_LIGHT0;
1932 const LightParameters &lightParams = state->lightParameters(lightIndex);
1933
1934 switch (pname)
1935 {
1936 case LightParameter::Ambient:
1937 lightParams.ambient.writeData(params);
1938 break;
1939 case LightParameter::Diffuse:
1940 lightParams.diffuse.writeData(params);
1941 break;
1942 case LightParameter::Specular:
1943 lightParams.specular.writeData(params);
1944 break;
1945 case LightParameter::Position:
1946 memcpy(params, lightParams.position.data(), 4 * sizeof(GLfloat));
1947 break;
1948 case LightParameter::SpotDirection:
1949 memcpy(params, lightParams.direction.data(), 3 * sizeof(GLfloat));
1950 break;
1951 case LightParameter::SpotExponent:
1952 *params = lightParams.spotlightExponent;
1953 break;
1954 case LightParameter::SpotCutoff:
1955 *params = lightParams.spotlightCutoffAngle;
1956 break;
1957 case LightParameter::ConstantAttenuation:
1958 *params = lightParams.attenuationConst;
1959 break;
1960 case LightParameter::LinearAttenuation:
1961 *params = lightParams.attenuationLinear;
1962 break;
1963 case LightParameter::QuadraticAttenuation:
1964 *params = lightParams.attenuationQuadratic;
1965 break;
1966 default:
1967 break;
1968 }
1969}
1970
1971void SetMaterialParameters(GLES1State *state,
1972 GLenum face,
1973 MaterialParameter pname,
1974 const GLfloat *params)
1975{
1976 MaterialParameters &material = state->materialParameters();
1977 switch (pname)
1978 {
1979 case MaterialParameter::Ambient:
1980 material.ambient = ColorF::fromData(params);
1981 break;
1982 case MaterialParameter::Diffuse:
1983 material.diffuse = ColorF::fromData(params);
1984 break;
1985 case MaterialParameter::AmbientAndDiffuse:
1986 material.ambient = ColorF::fromData(params);
1987 material.diffuse = ColorF::fromData(params);
1988 break;
1989 case MaterialParameter::Specular:
1990 material.specular = ColorF::fromData(params);
1991 break;
1992 case MaterialParameter::Emission:
1993 material.emissive = ColorF::fromData(params);
1994 break;
1995 case MaterialParameter::Shininess:
1996 material.specularExponent = *params;
1997 break;
1998 default:
1999 return;
2000 }
2001}
2002
2003void GetMaterialParameters(const GLES1State *state,
2004 GLenum face,
2005 MaterialParameter pname,
2006 GLfloat *params)
2007{
2008 const ColorF &currentColor = state->getCurrentColor();
2009 const MaterialParameters &material = state->materialParameters();
2010 const bool colorMaterialEnabled = state->isColorMaterialEnabled();
2011
2012 switch (pname)
2013 {
2014 case MaterialParameter::Ambient:
2015 if (colorMaterialEnabled)
2016 {
2017 currentColor.writeData(params);
2018 }
2019 else
2020 {
2021 material.ambient.writeData(params);
2022 }
2023 break;
2024 case MaterialParameter::Diffuse:
2025 if (colorMaterialEnabled)
2026 {
2027 currentColor.writeData(params);
2028 }
2029 else
2030 {
2031 material.diffuse.writeData(params);
2032 }
2033 break;
2034 case MaterialParameter::Specular:
2035 material.specular.writeData(params);
2036 break;
2037 case MaterialParameter::Emission:
2038 material.emissive.writeData(params);
2039 break;
2040 case MaterialParameter::Shininess:
2041 *params = material.specularExponent;
2042 break;
2043 default:
2044 return;
2045 }
2046}
2047
2048unsigned int GetLightModelParameterCount(GLenum pname)
2049{
2050 switch (pname)
2051 {
2052 case GL_LIGHT_MODEL_AMBIENT:
2053 return 4;
2054 case GL_LIGHT_MODEL_TWO_SIDE:
2055 return 1;
2056 default:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07002057 return 0;
2058 }
2059}
2060
2061unsigned int GetLightParameterCount(LightParameter pname)
2062{
2063 switch (pname)
2064 {
2065 case LightParameter::Ambient:
2066 case LightParameter::Diffuse:
2067 case LightParameter::Specular:
2068 case LightParameter::Position:
2069 return 4;
2070 case LightParameter::SpotDirection:
2071 return 3;
2072 case LightParameter::SpotExponent:
2073 case LightParameter::SpotCutoff:
2074 case LightParameter::ConstantAttenuation:
2075 case LightParameter::LinearAttenuation:
2076 case LightParameter::QuadraticAttenuation:
2077 return 1;
2078 default:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07002079 return 0;
2080 }
2081}
2082
2083unsigned int GetMaterialParameterCount(MaterialParameter pname)
2084{
2085 switch (pname)
2086 {
2087 case MaterialParameter::Ambient:
2088 case MaterialParameter::Diffuse:
2089 case MaterialParameter::Specular:
2090 case MaterialParameter::Emission:
2091 return 4;
2092 case MaterialParameter::Shininess:
2093 return 1;
2094 default:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07002095 return 0;
2096 }
2097}
2098
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07002099void SetFogParameters(GLES1State *state, GLenum pname, const GLfloat *params)
2100{
2101 FogParameters &fog = state->fogParameters();
2102 switch (pname)
2103 {
2104 case GL_FOG_MODE:
2105 fog.mode = FromGLenum<FogMode>(static_cast<GLenum>(params[0]));
2106 break;
2107 case GL_FOG_DENSITY:
2108 fog.density = params[0];
2109 break;
2110 case GL_FOG_START:
2111 fog.start = params[0];
2112 break;
2113 case GL_FOG_END:
2114 fog.end = params[0];
2115 break;
2116 case GL_FOG_COLOR:
2117 fog.color = ColorF::fromData(params);
2118 break;
2119 default:
2120 return;
2121 }
2122}
2123
2124void GetFogParameters(const GLES1State *state, GLenum pname, GLfloat *params)
2125{
2126 const FogParameters &fog = state->fogParameters();
2127 switch (pname)
2128 {
2129 case GL_FOG_MODE:
2130 params[0] = static_cast<GLfloat>(ToGLenum(fog.mode));
2131 break;
2132 case GL_FOG_DENSITY:
2133 params[0] = fog.density;
2134 break;
2135 case GL_FOG_START:
2136 params[0] = fog.start;
2137 break;
2138 case GL_FOG_END:
2139 params[0] = fog.end;
2140 break;
2141 case GL_FOG_COLOR:
2142 fog.color.writeData(params);
2143 break;
2144 default:
2145 return;
2146 }
2147}
2148
2149unsigned int GetFogParameterCount(GLenum pname)
2150{
2151 switch (pname)
2152 {
2153 case GL_FOG_MODE:
2154 case GL_FOG_DENSITY:
2155 case GL_FOG_START:
2156 case GL_FOG_END:
2157 return 1;
2158 case GL_FOG_COLOR:
2159 return 4;
2160 default:
2161 return 0;
2162 }
2163}
2164
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002165unsigned int GetTextureEnvParameterCount(TextureEnvParameter pname)
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07002166{
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002167 switch (pname)
2168 {
2169 case TextureEnvParameter::Mode:
2170 case TextureEnvParameter::CombineRgb:
2171 case TextureEnvParameter::CombineAlpha:
2172 case TextureEnvParameter::Src0Rgb:
2173 case TextureEnvParameter::Src1Rgb:
2174 case TextureEnvParameter::Src2Rgb:
2175 case TextureEnvParameter::Src0Alpha:
2176 case TextureEnvParameter::Src1Alpha:
2177 case TextureEnvParameter::Src2Alpha:
2178 case TextureEnvParameter::Op0Rgb:
2179 case TextureEnvParameter::Op1Rgb:
2180 case TextureEnvParameter::Op2Rgb:
2181 case TextureEnvParameter::Op0Alpha:
2182 case TextureEnvParameter::Op1Alpha:
2183 case TextureEnvParameter::Op2Alpha:
2184 case TextureEnvParameter::RgbScale:
2185 case TextureEnvParameter::AlphaScale:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07002186 case TextureEnvParameter::PointCoordReplace:
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002187 return 1;
2188 case TextureEnvParameter::Color:
2189 return 4;
2190 default:
2191 return 0;
2192 }
2193}
2194
2195void ConvertTextureEnvFromInt(TextureEnvParameter pname, const GLint *input, GLfloat *output)
2196{
2197 if (IsTextureEnvEnumParameter(pname))
2198 {
2199 ConvertGLenumValue(input[0], output);
2200 return;
2201 }
2202
2203 switch (pname)
2204 {
2205 case TextureEnvParameter::RgbScale:
2206 case TextureEnvParameter::AlphaScale:
2207 output[0] = static_cast<GLfloat>(input[0]);
2208 break;
2209 case TextureEnvParameter::Color:
2210 for (int i = 0; i < 4; i++)
2211 {
2212 output[i] = input[i] / 255.0f;
2213 }
2214 break;
2215 default:
2216 UNREACHABLE();
2217 break;
2218 }
2219}
2220
2221void ConvertTextureEnvFromFixed(TextureEnvParameter pname, const GLfixed *input, GLfloat *output)
2222{
2223 if (IsTextureEnvEnumParameter(pname))
2224 {
2225 ConvertGLenumValue(input[0], output);
2226 return;
2227 }
2228
2229 switch (pname)
2230 {
2231 case TextureEnvParameter::RgbScale:
2232 case TextureEnvParameter::AlphaScale:
2233 output[0] = FixedToFloat(input[0]);
2234 break;
2235 case TextureEnvParameter::Color:
2236 for (int i = 0; i < 4; i++)
2237 {
2238 output[i] = FixedToFloat(input[i]);
2239 }
2240 break;
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002241 default:
2242 UNREACHABLE();
2243 break;
2244 }
2245}
2246
2247void ConvertTextureEnvToInt(TextureEnvParameter pname, const GLfloat *input, GLint *output)
2248{
2249 if (IsTextureEnvEnumParameter(pname))
2250 {
2251 ConvertGLenumValue(input[0], output);
2252 return;
2253 }
2254
2255 switch (pname)
2256 {
2257 case TextureEnvParameter::RgbScale:
2258 case TextureEnvParameter::AlphaScale:
2259 output[0] = static_cast<GLint>(input[0]);
2260 break;
2261 case TextureEnvParameter::Color:
2262 for (int i = 0; i < 4; i++)
2263 {
2264 output[i] = static_cast<GLint>(input[i] * 255.0f);
2265 }
2266 break;
2267 default:
2268 UNREACHABLE();
2269 break;
2270 }
2271}
2272
2273void ConvertTextureEnvToFixed(TextureEnvParameter pname, const GLfloat *input, GLfixed *output)
2274{
2275 if (IsTextureEnvEnumParameter(pname))
2276 {
2277 ConvertGLenumValue(input[0], output);
2278 return;
2279 }
2280
2281 switch (pname)
2282 {
2283 case TextureEnvParameter::RgbScale:
2284 case TextureEnvParameter::AlphaScale:
2285 output[0] = FloatToFixed(input[0]);
2286 break;
2287 case TextureEnvParameter::Color:
2288 for (int i = 0; i < 4; i++)
2289 {
2290 output[i] = FloatToFixed(input[i]);
2291 }
2292 break;
2293 default:
2294 UNREACHABLE();
2295 break;
2296 }
2297}
2298
2299void SetTextureEnv(unsigned int unit,
2300 GLES1State *state,
2301 TextureEnvTarget target,
2302 TextureEnvParameter pname,
2303 const GLfloat *params)
2304{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002305 TextureEnvironmentParameters &env = state->textureEnvironment(unit);
2306 GLenum asEnum = ConvertToGLenum(params[0]);
2307
2308 switch (target)
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002309 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002310 case TextureEnvTarget::Env:
2311 switch (pname)
2312 {
2313 case TextureEnvParameter::Mode:
2314 env.mode = FromGLenum<TextureEnvMode>(asEnum);
2315 break;
2316 case TextureEnvParameter::CombineRgb:
2317 env.combineRgb = FromGLenum<TextureCombine>(asEnum);
2318 break;
2319 case TextureEnvParameter::CombineAlpha:
2320 env.combineAlpha = FromGLenum<TextureCombine>(asEnum);
2321 break;
2322 case TextureEnvParameter::Src0Rgb:
2323 env.src0Rgb = FromGLenum<TextureSrc>(asEnum);
2324 break;
2325 case TextureEnvParameter::Src1Rgb:
2326 env.src1Rgb = FromGLenum<TextureSrc>(asEnum);
2327 break;
2328 case TextureEnvParameter::Src2Rgb:
2329 env.src2Rgb = FromGLenum<TextureSrc>(asEnum);
2330 break;
2331 case TextureEnvParameter::Src0Alpha:
2332 env.src0Alpha = FromGLenum<TextureSrc>(asEnum);
2333 break;
2334 case TextureEnvParameter::Src1Alpha:
2335 env.src1Alpha = FromGLenum<TextureSrc>(asEnum);
2336 break;
2337 case TextureEnvParameter::Src2Alpha:
2338 env.src2Alpha = FromGLenum<TextureSrc>(asEnum);
2339 break;
2340 case TextureEnvParameter::Op0Rgb:
2341 env.op0Rgb = FromGLenum<TextureOp>(asEnum);
2342 break;
2343 case TextureEnvParameter::Op1Rgb:
2344 env.op1Rgb = FromGLenum<TextureOp>(asEnum);
2345 break;
2346 case TextureEnvParameter::Op2Rgb:
2347 env.op2Rgb = FromGLenum<TextureOp>(asEnum);
2348 break;
2349 case TextureEnvParameter::Op0Alpha:
2350 env.op0Alpha = FromGLenum<TextureOp>(asEnum);
2351 break;
2352 case TextureEnvParameter::Op1Alpha:
2353 env.op1Alpha = FromGLenum<TextureOp>(asEnum);
2354 break;
2355 case TextureEnvParameter::Op2Alpha:
2356 env.op2Alpha = FromGLenum<TextureOp>(asEnum);
2357 break;
2358 case TextureEnvParameter::Color:
2359 env.color = ColorF::fromData(params);
2360 break;
2361 case TextureEnvParameter::RgbScale:
2362 env.rgbScale = params[0];
2363 break;
2364 case TextureEnvParameter::AlphaScale:
2365 env.alphaScale = params[0];
2366 break;
2367 default:
2368 UNREACHABLE();
2369 break;
2370 }
2371 break;
2372 case TextureEnvTarget::PointSprite:
2373 switch (pname)
2374 {
2375 case TextureEnvParameter::PointCoordReplace:
2376 env.pointSpriteCoordReplace = static_cast<bool>(params[0]);
2377 break;
2378 default:
2379 UNREACHABLE();
2380 break;
2381 }
2382 break;
2383 default:
2384 UNREACHABLE();
2385 break;
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002386 }
2387}
2388
2389void GetTextureEnv(unsigned int unit,
2390 const GLES1State *state,
2391 TextureEnvTarget target,
2392 TextureEnvParameter pname,
2393 GLfloat *params)
2394{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002395 const TextureEnvironmentParameters &env = state->textureEnvironment(unit);
2396
2397 switch (target)
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002398 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002399 case TextureEnvTarget::Env:
2400 switch (pname)
2401 {
2402 case TextureEnvParameter::Mode:
2403 ConvertPackedEnum(env.mode, params);
2404 break;
2405 case TextureEnvParameter::CombineRgb:
2406 ConvertPackedEnum(env.combineRgb, params);
2407 break;
2408 case TextureEnvParameter::CombineAlpha:
2409 ConvertPackedEnum(env.combineAlpha, params);
2410 break;
2411 case TextureEnvParameter::Src0Rgb:
2412 ConvertPackedEnum(env.src0Rgb, params);
2413 break;
2414 case TextureEnvParameter::Src1Rgb:
2415 ConvertPackedEnum(env.src1Rgb, params);
2416 break;
2417 case TextureEnvParameter::Src2Rgb:
2418 ConvertPackedEnum(env.src2Rgb, params);
2419 break;
2420 case TextureEnvParameter::Src0Alpha:
2421 ConvertPackedEnum(env.src0Alpha, params);
2422 break;
2423 case TextureEnvParameter::Src1Alpha:
2424 ConvertPackedEnum(env.src1Alpha, params);
2425 break;
2426 case TextureEnvParameter::Src2Alpha:
2427 ConvertPackedEnum(env.src2Alpha, params);
2428 break;
2429 case TextureEnvParameter::Op0Rgb:
2430 ConvertPackedEnum(env.op0Rgb, params);
2431 break;
2432 case TextureEnvParameter::Op1Rgb:
2433 ConvertPackedEnum(env.op1Rgb, params);
2434 break;
2435 case TextureEnvParameter::Op2Rgb:
2436 ConvertPackedEnum(env.op2Rgb, params);
2437 break;
2438 case TextureEnvParameter::Op0Alpha:
2439 ConvertPackedEnum(env.op0Alpha, params);
2440 break;
2441 case TextureEnvParameter::Op1Alpha:
2442 ConvertPackedEnum(env.op1Alpha, params);
2443 break;
2444 case TextureEnvParameter::Op2Alpha:
2445 ConvertPackedEnum(env.op2Alpha, params);
2446 break;
2447 case TextureEnvParameter::Color:
2448 env.color.writeData(params);
2449 break;
2450 case TextureEnvParameter::RgbScale:
2451 *params = env.rgbScale;
2452 break;
2453 case TextureEnvParameter::AlphaScale:
2454 *params = env.alphaScale;
2455 break;
2456 default:
2457 UNREACHABLE();
2458 break;
2459 }
2460 break;
2461 case TextureEnvTarget::PointSprite:
2462 switch (pname)
2463 {
2464 case TextureEnvParameter::PointCoordReplace:
2465 *params = static_cast<GLfloat>(env.pointSpriteCoordReplace);
2466 break;
2467 default:
2468 UNREACHABLE();
2469 break;
2470 }
2471 break;
2472 default:
2473 UNREACHABLE();
2474 break;
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002475 }
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002476}
2477
2478unsigned int GetPointParameterCount(PointParameter pname)
2479{
2480 switch (pname)
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002481 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002482 case PointParameter::PointSizeMin:
2483 case PointParameter::PointSizeMax:
2484 case PointParameter::PointFadeThresholdSize:
2485 return 1;
2486 case PointParameter::PointDistanceAttenuation:
2487 return 3;
2488 default:
2489 return 0;
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002490 }
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07002491}
2492
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002493void SetPointParameter(GLES1State *state, PointParameter pname, const GLfloat *params)
2494{
2495
2496 PointParameters &pointParams = state->pointParameters();
2497
2498 switch (pname)
2499 {
2500 case PointParameter::PointSizeMin:
2501 pointParams.pointSizeMin = params[0];
2502 break;
2503 case PointParameter::PointSizeMax:
2504 pointParams.pointSizeMax = params[0];
2505 break;
2506 case PointParameter::PointFadeThresholdSize:
2507 pointParams.pointFadeThresholdSize = params[0];
2508 break;
2509 case PointParameter::PointDistanceAttenuation:
2510 for (unsigned int i = 0; i < 3; i++)
2511 {
2512 pointParams.pointDistanceAttenuation[i] = params[i];
2513 }
2514 break;
2515 default:
2516 UNREACHABLE();
2517 }
2518}
2519
2520void GetPointParameter(const GLES1State *state, PointParameter pname, GLfloat *params)
2521{
2522 const PointParameters &pointParams = state->pointParameters();
2523
2524 switch (pname)
2525 {
2526 case PointParameter::PointSizeMin:
2527 params[0] = pointParams.pointSizeMin;
2528 break;
2529 case PointParameter::PointSizeMax:
2530 params[0] = pointParams.pointSizeMax;
2531 break;
2532 case PointParameter::PointFadeThresholdSize:
2533 params[0] = pointParams.pointFadeThresholdSize;
2534 break;
2535 case PointParameter::PointDistanceAttenuation:
2536 for (unsigned int i = 0; i < 3; i++)
2537 {
2538 params[i] = pointParams.pointDistanceAttenuation[i];
2539 }
2540 break;
2541 default:
2542 UNREACHABLE();
2543 }
2544}
2545
2546void SetPointSize(GLES1State *state, GLfloat size)
2547{
2548 PointParameters &params = state->pointParameters();
2549 params.pointSize = size;
2550}
2551
2552void GetPointSize(GLES1State *state, GLfloat *sizeOut)
2553{
2554 const PointParameters &params = state->pointParameters();
2555 *sizeOut = params.pointSize;
2556}
2557
Lingfeng Yangf97641c2018-06-21 19:22:45 -07002558unsigned int GetTexParameterCount(GLenum pname)
2559{
2560 switch (pname)
2561 {
2562 case GL_TEXTURE_CROP_RECT_OES:
2563 return 4;
2564 case GL_TEXTURE_MAG_FILTER:
2565 case GL_TEXTURE_MIN_FILTER:
2566 case GL_TEXTURE_WRAP_S:
2567 case GL_TEXTURE_WRAP_T:
2568 case GL_TEXTURE_USAGE_ANGLE:
2569 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
2570 case GL_TEXTURE_IMMUTABLE_FORMAT:
2571 case GL_TEXTURE_WRAP_R:
2572 case GL_TEXTURE_IMMUTABLE_LEVELS:
2573 case GL_TEXTURE_SWIZZLE_R:
2574 case GL_TEXTURE_SWIZZLE_G:
2575 case GL_TEXTURE_SWIZZLE_B:
2576 case GL_TEXTURE_SWIZZLE_A:
2577 case GL_TEXTURE_BASE_LEVEL:
2578 case GL_TEXTURE_MAX_LEVEL:
2579 case GL_TEXTURE_MIN_LOD:
2580 case GL_TEXTURE_MAX_LOD:
2581 case GL_TEXTURE_COMPARE_MODE:
2582 case GL_TEXTURE_COMPARE_FUNC:
2583 case GL_TEXTURE_SRGB_DECODE_EXT:
2584 case GL_DEPTH_STENCIL_TEXTURE_MODE:
2585 return 1;
2586 default:
2587 return 0;
2588 }
2589}
2590
Geoff Lang65603eb2017-01-12 16:48:03 -05002591} // namespace gl
2592
2593namespace egl
2594{
2595
2596void QueryConfigAttrib(const Config *config, EGLint attribute, EGLint *value)
2597{
2598 ASSERT(config != nullptr);
2599 switch (attribute)
2600 {
2601 case EGL_BUFFER_SIZE:
2602 *value = config->bufferSize;
2603 break;
2604 case EGL_ALPHA_SIZE:
2605 *value = config->alphaSize;
2606 break;
2607 case EGL_BLUE_SIZE:
2608 *value = config->blueSize;
2609 break;
2610 case EGL_GREEN_SIZE:
2611 *value = config->greenSize;
2612 break;
2613 case EGL_RED_SIZE:
2614 *value = config->redSize;
2615 break;
2616 case EGL_DEPTH_SIZE:
2617 *value = config->depthSize;
2618 break;
2619 case EGL_STENCIL_SIZE:
2620 *value = config->stencilSize;
2621 break;
2622 case EGL_CONFIG_CAVEAT:
2623 *value = config->configCaveat;
2624 break;
2625 case EGL_CONFIG_ID:
2626 *value = config->configID;
2627 break;
2628 case EGL_LEVEL:
2629 *value = config->level;
2630 break;
2631 case EGL_NATIVE_RENDERABLE:
2632 *value = config->nativeRenderable;
2633 break;
2634 case EGL_NATIVE_VISUAL_ID:
2635 *value = config->nativeVisualID;
2636 break;
2637 case EGL_NATIVE_VISUAL_TYPE:
2638 *value = config->nativeVisualType;
2639 break;
2640 case EGL_SAMPLES:
2641 *value = config->samples;
2642 break;
2643 case EGL_SAMPLE_BUFFERS:
2644 *value = config->sampleBuffers;
2645 break;
2646 case EGL_SURFACE_TYPE:
2647 *value = config->surfaceType;
2648 break;
2649 case EGL_TRANSPARENT_TYPE:
2650 *value = config->transparentType;
2651 break;
2652 case EGL_TRANSPARENT_BLUE_VALUE:
2653 *value = config->transparentBlueValue;
2654 break;
2655 case EGL_TRANSPARENT_GREEN_VALUE:
2656 *value = config->transparentGreenValue;
2657 break;
2658 case EGL_TRANSPARENT_RED_VALUE:
2659 *value = config->transparentRedValue;
2660 break;
2661 case EGL_BIND_TO_TEXTURE_RGB:
2662 *value = config->bindToTextureRGB;
2663 break;
2664 case EGL_BIND_TO_TEXTURE_RGBA:
2665 *value = config->bindToTextureRGBA;
2666 break;
2667 case EGL_MIN_SWAP_INTERVAL:
2668 *value = config->minSwapInterval;
2669 break;
2670 case EGL_MAX_SWAP_INTERVAL:
2671 *value = config->maxSwapInterval;
2672 break;
2673 case EGL_LUMINANCE_SIZE:
2674 *value = config->luminanceSize;
2675 break;
2676 case EGL_ALPHA_MASK_SIZE:
2677 *value = config->alphaMaskSize;
2678 break;
2679 case EGL_COLOR_BUFFER_TYPE:
2680 *value = config->colorBufferType;
2681 break;
2682 case EGL_RENDERABLE_TYPE:
2683 *value = config->renderableType;
2684 break;
2685 case EGL_MATCH_NATIVE_PIXMAP:
2686 *value = false;
2687 UNIMPLEMENTED();
2688 break;
2689 case EGL_CONFORMANT:
2690 *value = config->conformant;
2691 break;
2692 case EGL_MAX_PBUFFER_WIDTH:
2693 *value = config->maxPBufferWidth;
2694 break;
2695 case EGL_MAX_PBUFFER_HEIGHT:
2696 *value = config->maxPBufferHeight;
2697 break;
2698 case EGL_MAX_PBUFFER_PIXELS:
2699 *value = config->maxPBufferPixels;
2700 break;
2701 case EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE:
2702 *value = config->optimalOrientation;
2703 break;
Geoff Langc5a2a172017-01-13 15:55:07 -05002704 case EGL_COLOR_COMPONENT_TYPE_EXT:
2705 *value = config->colorComponentType;
2706 break;
Geoff Lang65603eb2017-01-12 16:48:03 -05002707 default:
2708 UNREACHABLE();
2709 break;
2710 }
Geoff Langff5b2d52016-09-07 11:32:23 -04002711}
Geoff Lang65603eb2017-01-12 16:48:03 -05002712
Geoff Langaf143fe2017-10-05 13:59:43 -04002713void QueryContextAttrib(const gl::Context *context, EGLint attribute, EGLint *value)
2714{
2715 switch (attribute)
2716 {
2717 case EGL_CONFIG_ID:
2718 *value = context->getConfig()->configID;
2719 break;
2720 case EGL_CONTEXT_CLIENT_TYPE:
2721 *value = context->getClientType();
2722 break;
2723 case EGL_CONTEXT_CLIENT_VERSION:
2724 *value = context->getClientMajorVersion();
2725 break;
2726 case EGL_RENDER_BUFFER:
2727 *value = context->getRenderBuffer();
2728 break;
Geoff Langb433e872017-10-05 14:01:47 -04002729 case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
2730 *value = context->isRobustResourceInitEnabled();
2731 break;
Geoff Langaf143fe2017-10-05 13:59:43 -04002732 default:
2733 UNREACHABLE();
2734 break;
2735 }
2736}
2737
Geoff Lang31ecbd72017-07-26 13:01:27 -04002738void QuerySurfaceAttrib(const Surface *surface, EGLint attribute, EGLint *value)
2739{
2740 switch (attribute)
2741 {
2742 case EGL_GL_COLORSPACE:
Geoff Lang40ac7832017-07-26 14:38:46 -04002743 *value = surface->getGLColorspace();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002744 break;
2745 case EGL_VG_ALPHA_FORMAT:
Geoff Lang40ac7832017-07-26 14:38:46 -04002746 *value = surface->getVGAlphaFormat();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002747 break;
2748 case EGL_VG_COLORSPACE:
Geoff Lang40ac7832017-07-26 14:38:46 -04002749 *value = surface->getVGColorspace();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002750 break;
2751 case EGL_CONFIG_ID:
2752 *value = surface->getConfig()->configID;
2753 break;
2754 case EGL_HEIGHT:
2755 *value = surface->getHeight();
2756 break;
2757 case EGL_HORIZONTAL_RESOLUTION:
Geoff Lang40ac7832017-07-26 14:38:46 -04002758 *value = surface->getHorizontalResolution();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002759 break;
2760 case EGL_LARGEST_PBUFFER:
Geoff Lang40ac7832017-07-26 14:38:46 -04002761 // The EGL spec states that value is not written if the surface is not a pbuffer
2762 if (surface->getType() == EGL_PBUFFER_BIT)
2763 {
2764 *value = surface->getLargestPbuffer();
2765 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04002766 break;
2767 case EGL_MIPMAP_TEXTURE:
Geoff Lang40ac7832017-07-26 14:38:46 -04002768 // The EGL spec states that value is not written if the surface is not a pbuffer
2769 if (surface->getType() == EGL_PBUFFER_BIT)
2770 {
2771 *value = surface->getMipmapTexture();
2772 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04002773 break;
2774 case EGL_MIPMAP_LEVEL:
Geoff Lang40ac7832017-07-26 14:38:46 -04002775 // The EGL spec states that value is not written if the surface is not a pbuffer
2776 if (surface->getType() == EGL_PBUFFER_BIT)
2777 {
2778 *value = surface->getMipmapLevel();
2779 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04002780 break;
2781 case EGL_MULTISAMPLE_RESOLVE:
Geoff Lang40ac7832017-07-26 14:38:46 -04002782 *value = surface->getMultisampleResolve();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002783 break;
2784 case EGL_PIXEL_ASPECT_RATIO:
2785 *value = surface->getPixelAspectRatio();
2786 break;
2787 case EGL_RENDER_BUFFER:
2788 *value = surface->getRenderBuffer();
2789 break;
2790 case EGL_SWAP_BEHAVIOR:
2791 *value = surface->getSwapBehavior();
2792 break;
2793 case EGL_TEXTURE_FORMAT:
Geoff Lang40ac7832017-07-26 14:38:46 -04002794 // The EGL spec states that value is not written if the surface is not a pbuffer
2795 if (surface->getType() == EGL_PBUFFER_BIT)
2796 {
Geoff Lang8ceea812018-04-10 03:07:13 -04002797 *value = ToEGLenum(surface->getTextureFormat());
Geoff Lang40ac7832017-07-26 14:38:46 -04002798 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04002799 break;
2800 case EGL_TEXTURE_TARGET:
Geoff Lang40ac7832017-07-26 14:38:46 -04002801 // The EGL spec states that value is not written if the surface is not a pbuffer
2802 if (surface->getType() == EGL_PBUFFER_BIT)
2803 {
2804 *value = surface->getTextureTarget();
2805 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04002806 break;
2807 case EGL_VERTICAL_RESOLUTION:
Geoff Lang40ac7832017-07-26 14:38:46 -04002808 *value = surface->getVerticalResolution();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002809 break;
2810 case EGL_WIDTH:
2811 *value = surface->getWidth();
2812 break;
2813 case EGL_POST_SUB_BUFFER_SUPPORTED_NV:
2814 *value = surface->isPostSubBufferSupported();
2815 break;
2816 case EGL_FIXED_SIZE_ANGLE:
2817 *value = surface->isFixedSize();
2818 break;
2819 case EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE:
2820 *value = surface->flexibleSurfaceCompatibilityRequested();
2821 break;
2822 case EGL_SURFACE_ORIENTATION_ANGLE:
2823 *value = surface->getOrientation();
2824 break;
2825 case EGL_DIRECT_COMPOSITION_ANGLE:
2826 *value = surface->directComposition();
2827 break;
Geoff Langb433e872017-10-05 14:01:47 -04002828 case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
2829 *value = surface->isRobustResourceInitEnabled();
2830 break;
Geoff Lang31ecbd72017-07-26 13:01:27 -04002831 default:
2832 UNREACHABLE();
2833 break;
2834 }
2835}
2836
2837void SetSurfaceAttrib(Surface *surface, EGLint attribute, EGLint value)
2838{
2839 switch (attribute)
2840 {
2841 case EGL_MIPMAP_LEVEL:
Geoff Lang40ac7832017-07-26 14:38:46 -04002842 surface->setMipmapLevel(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04002843 break;
2844 case EGL_MULTISAMPLE_RESOLVE:
Geoff Lang40ac7832017-07-26 14:38:46 -04002845 surface->setMultisampleResolve(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04002846 break;
2847 case EGL_SWAP_BEHAVIOR:
Geoff Lang40ac7832017-07-26 14:38:46 -04002848 surface->setSwapBehavior(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04002849 break;
LRN03d132e2018-07-14 13:31:35 +00002850 case EGL_WIDTH:
2851 surface->setFixedWidth(value);
2852 break;
2853 case EGL_HEIGHT:
2854 surface->setFixedHeight(value);
2855 break;
Geoff Lang31ecbd72017-07-26 13:01:27 -04002856 default:
2857 UNREACHABLE();
2858 break;
2859 }
2860}
2861
Geoff Lang65603eb2017-01-12 16:48:03 -05002862} // namespace egl