blob: 2aca01f7a68b97b2449610db75198b5401440a59 [file] [log] [blame]
Geoff Langff5b2d52016-09-07 11:32:23 -04001//
2// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// queryutils.cpp: Utilities for querying values from GL objects
8
9#include "libANGLE/queryutils.h"
10
Geoff Langc1984ed2016-10-07 12:41:00 -040011#include "common/utilities.h"
12
Geoff Langff5b2d52016-09-07 11:32:23 -040013#include "libANGLE/Buffer.h"
Geoff Lang65603eb2017-01-12 16:48:03 -050014#include "libANGLE/Config.h"
Jamie Madill4e0e6f82017-02-17 11:06:03 -050015#include "libANGLE/Context.h"
Geoff Lang38f2cfb2017-04-11 15:23:08 -040016#include "libANGLE/Fence.h"
Geoff Langff5b2d52016-09-07 11:32:23 -040017#include "libANGLE/Framebuffer.h"
Lingfeng Yangd0febe72018-05-17 22:36:52 -070018#include "libANGLE/GLES1State.h"
Geoff Langff5b2d52016-09-07 11:32:23 -040019#include "libANGLE/Program.h"
Geoff Lang740d9022016-10-07 11:20:52 -040020#include "libANGLE/Renderbuffer.h"
Geoff Langc1984ed2016-10-07 12:41:00 -040021#include "libANGLE/Sampler.h"
Geoff Langd7d0ed32016-10-07 11:33:51 -040022#include "libANGLE/Shader.h"
Geoff Lang31ecbd72017-07-26 13:01:27 -040023#include "libANGLE/Surface.h"
Geoff Langc1984ed2016-10-07 12:41:00 -040024#include "libANGLE/Texture.h"
Geoff Lang6899b872016-10-14 11:30:13 -040025#include "libANGLE/Uniform.h"
Geoff Lang0b031062016-10-13 14:30:04 -040026#include "libANGLE/VertexAttribute.h"
jchen10a99ed552017-09-22 08:10:32 +080027#include "libANGLE/queryconversions.h"
Geoff Langff5b2d52016-09-07 11:32:23 -040028
29namespace gl
30{
Geoff Langc1984ed2016-10-07 12:41:00 -040031
32namespace
33{
jchen10a99ed552017-09-22 08:10:32 +080034
Geoff Langc1984ed2016-10-07 12:41:00 -040035template <typename ParamType>
He Yunchao11b038b2016-11-22 21:24:04 +080036void QueryTexLevelParameterBase(const Texture *texture,
Corentin Wallez99d492c2018-02-27 15:17:10 -050037 TextureTarget target,
He Yunchao11b038b2016-11-22 21:24:04 +080038 GLint level,
39 GLenum pname,
40 ParamType *params)
41{
42 ASSERT(texture != nullptr);
43 const InternalFormat *info = texture->getTextureState().getImageDesc(target, level).format.info;
44
45 switch (pname)
46 {
47 case GL_TEXTURE_RED_TYPE:
jchen10a99ed552017-09-22 08:10:32 +080048 *params = CastFromGLintStateValue<ParamType>(
49 pname, info->redBits ? info->componentType : GL_NONE);
He Yunchao11b038b2016-11-22 21:24:04 +080050 break;
51 case GL_TEXTURE_GREEN_TYPE:
jchen10a99ed552017-09-22 08:10:32 +080052 *params = CastFromGLintStateValue<ParamType>(
53 pname, info->greenBits ? info->componentType : GL_NONE);
He Yunchao11b038b2016-11-22 21:24:04 +080054 break;
55 case GL_TEXTURE_BLUE_TYPE:
jchen10a99ed552017-09-22 08:10:32 +080056 *params = CastFromGLintStateValue<ParamType>(
57 pname, info->blueBits ? info->componentType : GL_NONE);
He Yunchao11b038b2016-11-22 21:24:04 +080058 break;
59 case GL_TEXTURE_ALPHA_TYPE:
jchen10a99ed552017-09-22 08:10:32 +080060 *params = CastFromGLintStateValue<ParamType>(
61 pname, info->alphaBits ? info->componentType : GL_NONE);
He Yunchao11b038b2016-11-22 21:24:04 +080062 break;
63 case GL_TEXTURE_DEPTH_TYPE:
jchen10a99ed552017-09-22 08:10:32 +080064 *params = CastFromGLintStateValue<ParamType>(
65 pname, info->depthBits ? info->componentType : GL_NONE);
He Yunchao11b038b2016-11-22 21:24:04 +080066 break;
67 case GL_TEXTURE_RED_SIZE:
jchen10a99ed552017-09-22 08:10:32 +080068 *params = CastFromGLintStateValue<ParamType>(pname, info->redBits);
He Yunchao11b038b2016-11-22 21:24:04 +080069 break;
70 case GL_TEXTURE_GREEN_SIZE:
jchen10a99ed552017-09-22 08:10:32 +080071 *params = CastFromGLintStateValue<ParamType>(pname, info->greenBits);
He Yunchao11b038b2016-11-22 21:24:04 +080072 break;
73 case GL_TEXTURE_BLUE_SIZE:
jchen10a99ed552017-09-22 08:10:32 +080074 *params = CastFromGLintStateValue<ParamType>(pname, info->blueBits);
He Yunchao11b038b2016-11-22 21:24:04 +080075 break;
76 case GL_TEXTURE_ALPHA_SIZE:
jchen10a99ed552017-09-22 08:10:32 +080077 *params = CastFromGLintStateValue<ParamType>(pname, info->alphaBits);
He Yunchao11b038b2016-11-22 21:24:04 +080078 break;
79 case GL_TEXTURE_DEPTH_SIZE:
jchen10a99ed552017-09-22 08:10:32 +080080 *params = CastFromGLintStateValue<ParamType>(pname, info->depthBits);
He Yunchao11b038b2016-11-22 21:24:04 +080081 break;
82 case GL_TEXTURE_STENCIL_SIZE:
jchen10a99ed552017-09-22 08:10:32 +080083 *params = CastFromGLintStateValue<ParamType>(pname, info->stencilBits);
He Yunchao11b038b2016-11-22 21:24:04 +080084 break;
85 case GL_TEXTURE_SHARED_SIZE:
jchen10a99ed552017-09-22 08:10:32 +080086 *params = CastFromGLintStateValue<ParamType>(pname, info->sharedBits);
He Yunchao11b038b2016-11-22 21:24:04 +080087 break;
88 case GL_TEXTURE_INTERNAL_FORMAT:
jchen10a99ed552017-09-22 08:10:32 +080089 *params = CastFromGLintStateValue<ParamType>(
90 pname, info->internalFormat ? info->internalFormat : GL_RGBA);
He Yunchao11b038b2016-11-22 21:24:04 +080091 break;
92 case GL_TEXTURE_WIDTH:
Corentin Wallez10d40262017-10-04 16:34:09 -040093 *params = CastFromGLintStateValue<ParamType>(
94 pname, static_cast<uint32_t>(texture->getWidth(target, level)));
He Yunchao11b038b2016-11-22 21:24:04 +080095 break;
96 case GL_TEXTURE_HEIGHT:
Corentin Wallez10d40262017-10-04 16:34:09 -040097 *params = CastFromGLintStateValue<ParamType>(
98 pname, static_cast<uint32_t>(texture->getHeight(target, level)));
He Yunchao11b038b2016-11-22 21:24:04 +080099 break;
100 case GL_TEXTURE_DEPTH:
Corentin Wallez10d40262017-10-04 16:34:09 -0400101 *params = CastFromGLintStateValue<ParamType>(
102 pname, static_cast<uint32_t>(texture->getDepth(target, level)));
He Yunchao11b038b2016-11-22 21:24:04 +0800103 break;
104 case GL_TEXTURE_SAMPLES:
jchen10a99ed552017-09-22 08:10:32 +0800105 *params = CastFromStateValue<ParamType>(pname, texture->getSamples(target, level));
He Yunchao11b038b2016-11-22 21:24:04 +0800106 break;
107 case GL_TEXTURE_FIXED_SAMPLE_LOCATIONS:
jchen10a99ed552017-09-22 08:10:32 +0800108 *params = CastFromStateValue<ParamType>(
109 pname, static_cast<GLint>(texture->getFixedSampleLocations(target, level)));
He Yunchao11b038b2016-11-22 21:24:04 +0800110 break;
111 case GL_TEXTURE_COMPRESSED:
jchen10a99ed552017-09-22 08:10:32 +0800112 *params = CastFromStateValue<ParamType>(pname, static_cast<GLint>(info->compressed));
He Yunchao11b038b2016-11-22 21:24:04 +0800113 break;
114 default:
115 UNREACHABLE();
116 break;
117 }
118}
119
120template <typename ParamType>
Geoff Langc1984ed2016-10-07 12:41:00 -0400121void QueryTexParameterBase(const Texture *texture, GLenum pname, ParamType *params)
122{
123 ASSERT(texture != nullptr);
124
125 switch (pname)
126 {
127 case GL_TEXTURE_MAG_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800128 *params = CastFromGLintStateValue<ParamType>(pname, texture->getMagFilter());
Geoff Langc1984ed2016-10-07 12:41:00 -0400129 break;
130 case GL_TEXTURE_MIN_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800131 *params = CastFromGLintStateValue<ParamType>(pname, texture->getMinFilter());
Geoff Langc1984ed2016-10-07 12:41:00 -0400132 break;
133 case GL_TEXTURE_WRAP_S:
jchen10a99ed552017-09-22 08:10:32 +0800134 *params = CastFromGLintStateValue<ParamType>(pname, texture->getWrapS());
Geoff Langc1984ed2016-10-07 12:41:00 -0400135 break;
136 case GL_TEXTURE_WRAP_T:
jchen10a99ed552017-09-22 08:10:32 +0800137 *params = CastFromGLintStateValue<ParamType>(pname, texture->getWrapT());
Geoff Langc1984ed2016-10-07 12:41:00 -0400138 break;
139 case GL_TEXTURE_WRAP_R:
jchen10a99ed552017-09-22 08:10:32 +0800140 *params = CastFromGLintStateValue<ParamType>(pname, texture->getWrapR());
Geoff Langc1984ed2016-10-07 12:41:00 -0400141 break;
142 case GL_TEXTURE_IMMUTABLE_FORMAT:
jchen10a99ed552017-09-22 08:10:32 +0800143 *params = CastFromGLintStateValue<ParamType>(pname, texture->getImmutableFormat());
Geoff Langc1984ed2016-10-07 12:41:00 -0400144 break;
145 case GL_TEXTURE_IMMUTABLE_LEVELS:
jchen10a99ed552017-09-22 08:10:32 +0800146 *params = CastFromGLintStateValue<ParamType>(pname, texture->getImmutableLevels());
Geoff Langc1984ed2016-10-07 12:41:00 -0400147 break;
148 case GL_TEXTURE_USAGE_ANGLE:
jchen10a99ed552017-09-22 08:10:32 +0800149 *params = CastFromGLintStateValue<ParamType>(pname, texture->getUsage());
Geoff Langc1984ed2016-10-07 12:41:00 -0400150 break;
151 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800152 *params = CastFromStateValue<ParamType>(pname, texture->getMaxAnisotropy());
Geoff Langc1984ed2016-10-07 12:41:00 -0400153 break;
154 case GL_TEXTURE_SWIZZLE_R:
jchen10a99ed552017-09-22 08:10:32 +0800155 *params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleRed());
Geoff Langc1984ed2016-10-07 12:41:00 -0400156 break;
157 case GL_TEXTURE_SWIZZLE_G:
jchen10a99ed552017-09-22 08:10:32 +0800158 *params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleGreen());
Geoff Langc1984ed2016-10-07 12:41:00 -0400159 break;
160 case GL_TEXTURE_SWIZZLE_B:
jchen10a99ed552017-09-22 08:10:32 +0800161 *params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleBlue());
Geoff Langc1984ed2016-10-07 12:41:00 -0400162 break;
163 case GL_TEXTURE_SWIZZLE_A:
jchen10a99ed552017-09-22 08:10:32 +0800164 *params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleAlpha());
Geoff Langc1984ed2016-10-07 12:41:00 -0400165 break;
166 case GL_TEXTURE_BASE_LEVEL:
jchen10a99ed552017-09-22 08:10:32 +0800167 *params = CastFromGLintStateValue<ParamType>(pname, texture->getBaseLevel());
Geoff Langc1984ed2016-10-07 12:41:00 -0400168 break;
169 case GL_TEXTURE_MAX_LEVEL:
jchen10a99ed552017-09-22 08:10:32 +0800170 *params = CastFromGLintStateValue<ParamType>(pname, texture->getMaxLevel());
Geoff Langc1984ed2016-10-07 12:41:00 -0400171 break;
172 case GL_TEXTURE_MIN_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800173 *params = CastFromStateValue<ParamType>(pname, texture->getSamplerState().minLod);
Geoff Langc1984ed2016-10-07 12:41:00 -0400174 break;
175 case GL_TEXTURE_MAX_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800176 *params = CastFromStateValue<ParamType>(pname, texture->getSamplerState().maxLod);
Geoff Langc1984ed2016-10-07 12:41:00 -0400177 break;
178 case GL_TEXTURE_COMPARE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800179 *params = CastFromGLintStateValue<ParamType>(pname, texture->getCompareMode());
Geoff Langc1984ed2016-10-07 12:41:00 -0400180 break;
181 case GL_TEXTURE_COMPARE_FUNC:
jchen10a99ed552017-09-22 08:10:32 +0800182 *params = CastFromGLintStateValue<ParamType>(pname, texture->getCompareFunc());
Geoff Langc1984ed2016-10-07 12:41:00 -0400183 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700184 case GL_TEXTURE_SRGB_DECODE_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800185 *params = CastFromGLintStateValue<ParamType>(pname, texture->getSRGBDecode());
Geoff Lang81c6b572016-10-19 14:07:52 -0700186 break;
Yunchao Hebacaa712018-01-30 14:01:39 +0800187 case GL_DEPTH_STENCIL_TEXTURE_MODE:
188 *params =
189 CastFromGLintStateValue<ParamType>(pname, texture->getDepthStencilTextureMode());
190 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400191 default:
192 UNREACHABLE();
193 break;
194 }
195}
196
197template <typename ParamType>
Jamie Madill4928b7c2017-06-20 12:57:39 -0400198void SetTexParameterBase(Context *context, Texture *texture, GLenum pname, const ParamType *params)
Geoff Langc1984ed2016-10-07 12:41:00 -0400199{
200 ASSERT(texture != nullptr);
201
202 switch (pname)
203 {
204 case GL_TEXTURE_WRAP_S:
jchen10a99ed552017-09-22 08:10:32 +0800205 texture->setWrapS(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400206 break;
207 case GL_TEXTURE_WRAP_T:
jchen10a99ed552017-09-22 08:10:32 +0800208 texture->setWrapT(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400209 break;
210 case GL_TEXTURE_WRAP_R:
jchen10a99ed552017-09-22 08:10:32 +0800211 texture->setWrapR(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400212 break;
213 case GL_TEXTURE_MIN_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800214 texture->setMinFilter(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400215 break;
216 case GL_TEXTURE_MAG_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800217 texture->setMagFilter(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400218 break;
219 case GL_TEXTURE_USAGE_ANGLE:
jchen10a99ed552017-09-22 08:10:32 +0800220 texture->setUsage(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400221 break;
222 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800223 texture->setMaxAnisotropy(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400224 break;
225 case GL_TEXTURE_COMPARE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800226 texture->setCompareMode(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400227 break;
228 case GL_TEXTURE_COMPARE_FUNC:
jchen10a99ed552017-09-22 08:10:32 +0800229 texture->setCompareFunc(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400230 break;
231 case GL_TEXTURE_SWIZZLE_R:
jchen10a99ed552017-09-22 08:10:32 +0800232 texture->setSwizzleRed(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400233 break;
234 case GL_TEXTURE_SWIZZLE_G:
jchen10a99ed552017-09-22 08:10:32 +0800235 texture->setSwizzleGreen(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400236 break;
237 case GL_TEXTURE_SWIZZLE_B:
jchen10a99ed552017-09-22 08:10:32 +0800238 texture->setSwizzleBlue(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400239 break;
240 case GL_TEXTURE_SWIZZLE_A:
jchen10a99ed552017-09-22 08:10:32 +0800241 texture->setSwizzleAlpha(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400242 break;
243 case GL_TEXTURE_BASE_LEVEL:
Jamie Madill4928b7c2017-06-20 12:57:39 -0400244 {
jchen10a99ed552017-09-22 08:10:32 +0800245 context->handleError(texture->setBaseLevel(
246 context, clampCast<GLuint>(CastQueryValueTo<GLint>(pname, params[0]))));
Geoff Langc1984ed2016-10-07 12:41:00 -0400247 break;
Jamie Madill4928b7c2017-06-20 12:57:39 -0400248 }
Geoff Langc1984ed2016-10-07 12:41:00 -0400249 case GL_TEXTURE_MAX_LEVEL:
jchen10a99ed552017-09-22 08:10:32 +0800250 texture->setMaxLevel(clampCast<GLuint>(CastQueryValueTo<GLint>(pname, params[0])));
Geoff Langc1984ed2016-10-07 12:41:00 -0400251 break;
252 case GL_TEXTURE_MIN_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800253 texture->setMinLod(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400254 break;
255 case GL_TEXTURE_MAX_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800256 texture->setMaxLod(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400257 break;
Geoff Lang3b573612016-10-31 14:08:10 -0400258 case GL_DEPTH_STENCIL_TEXTURE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800259 texture->setDepthStencilTextureMode(ConvertToGLenum(pname, params[0]));
Geoff Lang3b573612016-10-31 14:08:10 -0400260 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700261 case GL_TEXTURE_SRGB_DECODE_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800262 texture->setSRGBDecode(ConvertToGLenum(pname, params[0]));
Geoff Lang81c6b572016-10-19 14:07:52 -0700263 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400264 default:
265 UNREACHABLE();
266 break;
267 }
268}
269
270template <typename ParamType>
271void QuerySamplerParameterBase(const Sampler *sampler, GLenum pname, ParamType *params)
272{
273 switch (pname)
274 {
275 case GL_TEXTURE_MIN_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800276 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getMinFilter());
Geoff Langc1984ed2016-10-07 12:41:00 -0400277 break;
278 case GL_TEXTURE_MAG_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800279 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getMagFilter());
Geoff Langc1984ed2016-10-07 12:41:00 -0400280 break;
281 case GL_TEXTURE_WRAP_S:
jchen10a99ed552017-09-22 08:10:32 +0800282 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getWrapS());
Geoff Langc1984ed2016-10-07 12:41:00 -0400283 break;
284 case GL_TEXTURE_WRAP_T:
jchen10a99ed552017-09-22 08:10:32 +0800285 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getWrapT());
Geoff Langc1984ed2016-10-07 12:41:00 -0400286 break;
287 case GL_TEXTURE_WRAP_R:
jchen10a99ed552017-09-22 08:10:32 +0800288 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getWrapR());
Geoff Langc1984ed2016-10-07 12:41:00 -0400289 break;
290 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800291 *params = CastFromStateValue<ParamType>(pname, sampler->getMaxAnisotropy());
Geoff Langc1984ed2016-10-07 12:41:00 -0400292 break;
293 case GL_TEXTURE_MIN_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800294 *params = CastFromStateValue<ParamType>(pname, sampler->getMinLod());
Geoff Langc1984ed2016-10-07 12:41:00 -0400295 break;
296 case GL_TEXTURE_MAX_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800297 *params = CastFromStateValue<ParamType>(pname, sampler->getMaxLod());
Geoff Langc1984ed2016-10-07 12:41:00 -0400298 break;
299 case GL_TEXTURE_COMPARE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800300 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getCompareMode());
Geoff Langc1984ed2016-10-07 12:41:00 -0400301 break;
302 case GL_TEXTURE_COMPARE_FUNC:
jchen10a99ed552017-09-22 08:10:32 +0800303 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getCompareFunc());
Geoff Langc1984ed2016-10-07 12:41:00 -0400304 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700305 case GL_TEXTURE_SRGB_DECODE_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800306 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getSRGBDecode());
Geoff Lang81c6b572016-10-19 14:07:52 -0700307 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400308 default:
309 UNREACHABLE();
310 break;
311 }
312}
313
314template <typename ParamType>
315void SetSamplerParameterBase(Sampler *sampler, GLenum pname, const ParamType *params)
316{
317 switch (pname)
318 {
319 case GL_TEXTURE_WRAP_S:
jchen10a99ed552017-09-22 08:10:32 +0800320 sampler->setWrapS(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400321 break;
322 case GL_TEXTURE_WRAP_T:
jchen10a99ed552017-09-22 08:10:32 +0800323 sampler->setWrapT(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400324 break;
325 case GL_TEXTURE_WRAP_R:
jchen10a99ed552017-09-22 08:10:32 +0800326 sampler->setWrapR(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400327 break;
328 case GL_TEXTURE_MIN_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800329 sampler->setMinFilter(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400330 break;
331 case GL_TEXTURE_MAG_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800332 sampler->setMagFilter(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400333 break;
334 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800335 sampler->setMaxAnisotropy(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400336 break;
337 case GL_TEXTURE_COMPARE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800338 sampler->setCompareMode(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400339 break;
340 case GL_TEXTURE_COMPARE_FUNC:
jchen10a99ed552017-09-22 08:10:32 +0800341 sampler->setCompareFunc(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400342 break;
343 case GL_TEXTURE_MIN_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800344 sampler->setMinLod(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400345 break;
346 case GL_TEXTURE_MAX_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800347 sampler->setMaxLod(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400348 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700349 case GL_TEXTURE_SRGB_DECODE_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800350 sampler->setSRGBDecode(ConvertToGLenum(pname, params[0]));
Geoff Lang81c6b572016-10-19 14:07:52 -0700351 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400352 default:
353 UNREACHABLE();
354 break;
355 }
356}
357
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800358// Warning: you should ensure binding really matches attrib.bindingIndex before using this function.
Geoff Lang0b031062016-10-13 14:30:04 -0400359template <typename ParamType, typename CurrentDataType, size_t CurrentValueCount>
360void QueryVertexAttribBase(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800361 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -0400362 const CurrentDataType (&currentValueData)[CurrentValueCount],
363 GLenum pname,
364 ParamType *params)
365{
366 switch (pname)
367 {
368 case GL_CURRENT_VERTEX_ATTRIB:
369 for (size_t i = 0; i < CurrentValueCount; ++i)
370 {
jchen10a99ed552017-09-22 08:10:32 +0800371 params[i] = CastFromStateValue<ParamType>(pname, currentValueData[i]);
Geoff Lang0b031062016-10-13 14:30:04 -0400372 }
373 break;
374 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
jchen10a99ed552017-09-22 08:10:32 +0800375 *params = CastFromStateValue<ParamType>(pname, static_cast<GLint>(attrib.enabled));
Geoff Lang0b031062016-10-13 14:30:04 -0400376 break;
377 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
jchen10a99ed552017-09-22 08:10:32 +0800378 *params = CastFromGLintStateValue<ParamType>(pname, attrib.size);
Geoff Lang0b031062016-10-13 14:30:04 -0400379 break;
380 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
jchen10a99ed552017-09-22 08:10:32 +0800381 *params = CastFromGLintStateValue<ParamType>(pname, attrib.vertexAttribArrayStride);
Geoff Lang0b031062016-10-13 14:30:04 -0400382 break;
383 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
jchen10a99ed552017-09-22 08:10:32 +0800384 *params = CastFromGLintStateValue<ParamType>(pname, attrib.type);
Geoff Lang0b031062016-10-13 14:30:04 -0400385 break;
386 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
jchen10a99ed552017-09-22 08:10:32 +0800387 *params = CastFromStateValue<ParamType>(pname, static_cast<GLint>(attrib.normalized));
Geoff Lang0b031062016-10-13 14:30:04 -0400388 break;
389 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
jchen10a99ed552017-09-22 08:10:32 +0800390 *params = CastFromGLintStateValue<ParamType>(pname, binding.getBuffer().id());
Geoff Lang0b031062016-10-13 14:30:04 -0400391 break;
392 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
jchen10a99ed552017-09-22 08:10:32 +0800393 *params = CastFromGLintStateValue<ParamType>(pname, binding.getDivisor());
Geoff Lang0b031062016-10-13 14:30:04 -0400394 break;
395 case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
jchen10a99ed552017-09-22 08:10:32 +0800396 *params = CastFromGLintStateValue<ParamType>(pname, attrib.pureInteger);
Geoff Lang0b031062016-10-13 14:30:04 -0400397 break;
Shao80957d92017-02-20 21:25:59 +0800398 case GL_VERTEX_ATTRIB_BINDING:
jchen10a99ed552017-09-22 08:10:32 +0800399 *params = CastFromGLintStateValue<ParamType>(pname, attrib.bindingIndex);
Shao80957d92017-02-20 21:25:59 +0800400 break;
401 case GL_VERTEX_ATTRIB_RELATIVE_OFFSET:
jchen10a99ed552017-09-22 08:10:32 +0800402 *params = CastFromGLintStateValue<ParamType>(pname, attrib.relativeOffset);
Shao80957d92017-02-20 21:25:59 +0800403 break;
Geoff Lang0b031062016-10-13 14:30:04 -0400404 default:
405 UNREACHABLE();
406 break;
407 }
408}
409
Geoff Langebebe1c2016-10-14 12:01:31 -0400410template <typename ParamType>
411void QueryBufferParameterBase(const Buffer *buffer, GLenum pname, ParamType *params)
412{
413 ASSERT(buffer != nullptr);
414
415 switch (pname)
416 {
417 case GL_BUFFER_USAGE:
Corentin Wallez2e568cf2017-09-18 17:05:22 -0400418 *params = CastFromGLintStateValue<ParamType>(pname, ToGLenum(buffer->getUsage()));
Geoff Langebebe1c2016-10-14 12:01:31 -0400419 break;
420 case GL_BUFFER_SIZE:
jchen10a99ed552017-09-22 08:10:32 +0800421 *params = CastFromStateValue<ParamType>(pname, buffer->getSize());
Geoff Langebebe1c2016-10-14 12:01:31 -0400422 break;
423 case GL_BUFFER_ACCESS_FLAGS:
jchen10a99ed552017-09-22 08:10:32 +0800424 *params = CastFromGLintStateValue<ParamType>(pname, buffer->getAccessFlags());
Geoff Langebebe1c2016-10-14 12:01:31 -0400425 break;
426 case GL_BUFFER_ACCESS_OES:
jchen10a99ed552017-09-22 08:10:32 +0800427 *params = CastFromGLintStateValue<ParamType>(pname, buffer->getAccess());
Geoff Langebebe1c2016-10-14 12:01:31 -0400428 break;
429 case GL_BUFFER_MAPPED:
jchen10a99ed552017-09-22 08:10:32 +0800430 *params = CastFromStateValue<ParamType>(pname, buffer->isMapped());
Geoff Langebebe1c2016-10-14 12:01:31 -0400431 break;
432 case GL_BUFFER_MAP_OFFSET:
jchen10a99ed552017-09-22 08:10:32 +0800433 *params = CastFromStateValue<ParamType>(pname, buffer->getMapOffset());
Geoff Langebebe1c2016-10-14 12:01:31 -0400434 break;
435 case GL_BUFFER_MAP_LENGTH:
jchen10a99ed552017-09-22 08:10:32 +0800436 *params = CastFromStateValue<ParamType>(pname, buffer->getMapLength());
Geoff Langebebe1c2016-10-14 12:01:31 -0400437 break;
438 default:
439 UNREACHABLE();
440 break;
441 }
442}
443
Olli Etuaho465835d2017-09-26 13:34:10 +0300444GLint GetCommonVariableProperty(const sh::ShaderVariable &var, GLenum prop)
jchen10880683b2017-04-12 16:21:55 +0800445{
446 switch (prop)
447 {
448 case GL_TYPE:
jchen10a99ed552017-09-22 08:10:32 +0800449 return clampCast<GLint>(var.type);
jchen10880683b2017-04-12 16:21:55 +0800450
451 case GL_ARRAY_SIZE:
Olli Etuaho465835d2017-09-26 13:34:10 +0300452 // Queryable variables are guaranteed not to be arrays of arrays or arrays of structs,
453 // see GLES 3.1 spec section 7.3.1.1 page 77.
454 return clampCast<GLint>(var.getBasicTypeElementCount());
jchen10880683b2017-04-12 16:21:55 +0800455
456 case GL_NAME_LENGTH:
jchen10880683b2017-04-12 16:21:55 +0800457 // ES31 spec p84: This counts the terminating null char.
Olli Etuahod2551232017-10-26 20:03:33 +0300458 return clampCast<GLint>(var.name.size() + 1u);
jchen10880683b2017-04-12 16:21:55 +0800459
460 default:
461 UNREACHABLE();
462 return GL_INVALID_VALUE;
463 }
464}
465
466GLint GetInputResourceProperty(const Program *program, GLuint index, GLenum prop)
467{
468 const auto &attribute = program->getInputResource(index);
469 switch (prop)
470 {
471 case GL_TYPE:
472 case GL_ARRAY_SIZE:
jchen10880683b2017-04-12 16:21:55 +0800473 case GL_NAME_LENGTH:
Olli Etuaho465835d2017-09-26 13:34:10 +0300474 return GetCommonVariableProperty(attribute, prop);
jchen10880683b2017-04-12 16:21:55 +0800475
jchen10baf5d942017-08-28 20:45:48 +0800476 case GL_LOCATION:
477 return program->getAttributeLocation(attribute.name);
478
jchen10880683b2017-04-12 16:21:55 +0800479 case GL_REFERENCED_BY_VERTEX_SHADER:
480 return 1;
481
482 case GL_REFERENCED_BY_FRAGMENT_SHADER:
483 case GL_REFERENCED_BY_COMPUTE_SHADER:
Jiawei Shaoc6f82872018-04-24 14:14:50 +0800484 case GL_REFERENCED_BY_GEOMETRY_SHADER_EXT:
jchen10880683b2017-04-12 16:21:55 +0800485 return 0;
486
487 default:
488 UNREACHABLE();
489 return GL_INVALID_VALUE;
490 }
491}
492
493GLint GetOutputResourceProperty(const Program *program, GLuint index, const GLenum prop)
494{
495 const auto &outputVariable = program->getOutputResource(index);
496 switch (prop)
497 {
498 case GL_TYPE:
499 case GL_ARRAY_SIZE:
jchen10880683b2017-04-12 16:21:55 +0800500 case GL_NAME_LENGTH:
Olli Etuaho465835d2017-09-26 13:34:10 +0300501 return GetCommonVariableProperty(outputVariable, prop);
jchen10880683b2017-04-12 16:21:55 +0800502
jchen10baf5d942017-08-28 20:45:48 +0800503 case GL_LOCATION:
504 return program->getFragDataLocation(outputVariable.name);
505
jchen10880683b2017-04-12 16:21:55 +0800506 case GL_REFERENCED_BY_FRAGMENT_SHADER:
507 return 1;
508
Jiawei Shaoc6f82872018-04-24 14:14:50 +0800509 case GL_REFERENCED_BY_VERTEX_SHADER:
jchen10880683b2017-04-12 16:21:55 +0800510 case GL_REFERENCED_BY_COMPUTE_SHADER:
Jiawei Shaoc6f82872018-04-24 14:14:50 +0800511 case GL_REFERENCED_BY_GEOMETRY_SHADER_EXT:
jchen10880683b2017-04-12 16:21:55 +0800512 return 0;
513
514 default:
515 UNREACHABLE();
516 return GL_INVALID_VALUE;
517 }
518}
519
jchen10910a3da2017-11-15 09:40:11 +0800520GLint GetTransformFeedbackVaryingResourceProperty(const Program *program,
521 GLuint index,
522 const GLenum prop)
523{
524 const auto &tfVariable = program->getTransformFeedbackVaryingResource(index);
525 switch (prop)
526 {
527 case GL_TYPE:
528 return clampCast<GLint>(tfVariable.type);
529
530 case GL_ARRAY_SIZE:
531 return clampCast<GLint>(tfVariable.size());
532
533 case GL_NAME_LENGTH:
534 return clampCast<GLint>(tfVariable.nameWithArrayIndex().size() + 1);
535
536 default:
537 UNREACHABLE();
538 return GL_INVALID_VALUE;
539 }
540}
541
jchen10d9cd7b72017-08-30 15:04:25 +0800542GLint QueryProgramInterfaceActiveResources(const Program *program, GLenum programInterface)
543{
544 switch (programInterface)
545 {
546 case GL_PROGRAM_INPUT:
jchen10a99ed552017-09-22 08:10:32 +0800547 return clampCast<GLint>(program->getAttributes().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800548
549 case GL_PROGRAM_OUTPUT:
jchen10a99ed552017-09-22 08:10:32 +0800550 return clampCast<GLint>(program->getState().getOutputVariables().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800551
552 case GL_UNIFORM:
jchen10a99ed552017-09-22 08:10:32 +0800553 return clampCast<GLint>(program->getState().getUniforms().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800554
555 case GL_UNIFORM_BLOCK:
jchen10a99ed552017-09-22 08:10:32 +0800556 return clampCast<GLint>(program->getState().getUniformBlocks().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800557
jchen1058f67be2017-10-27 08:59:27 +0800558 case GL_ATOMIC_COUNTER_BUFFER:
559 return clampCast<GLint>(program->getState().getAtomicCounterBuffers().size());
560
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800561 case GL_BUFFER_VARIABLE:
562 return clampCast<GLint>(program->getState().getBufferVariables().size());
563
564 case GL_SHADER_STORAGE_BLOCK:
565 return clampCast<GLint>(program->getState().getShaderStorageBlocks().size());
566
jchen10d9cd7b72017-08-30 15:04:25 +0800567 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10910a3da2017-11-15 09:40:11 +0800568 return clampCast<GLint>(program->getTransformFeedbackVaryingCount());
jchen10d9cd7b72017-08-30 15:04:25 +0800569
570 default:
571 UNREACHABLE();
572 return 0;
573 }
574}
575
576template <typename T, typename M>
577GLint FindMaxSize(const std::vector<T> &resources, M member)
578{
579 GLint max = 0;
580 for (const T &resource : resources)
581 {
jchen10a99ed552017-09-22 08:10:32 +0800582 max = std::max(max, clampCast<GLint>((resource.*member).size()));
jchen10d9cd7b72017-08-30 15:04:25 +0800583 }
584 return max;
585}
586
587GLint QueryProgramInterfaceMaxNameLength(const Program *program, GLenum programInterface)
588{
589 GLint maxNameLength = 0;
590 switch (programInterface)
591 {
592 case GL_PROGRAM_INPUT:
593 maxNameLength = FindMaxSize(program->getAttributes(), &sh::Attribute::name);
594 break;
595
596 case GL_PROGRAM_OUTPUT:
597 maxNameLength =
598 FindMaxSize(program->getState().getOutputVariables(), &sh::OutputVariable::name);
599 break;
600
601 case GL_UNIFORM:
602 maxNameLength = FindMaxSize(program->getState().getUniforms(), &LinkedUniform::name);
603 break;
604
605 case GL_UNIFORM_BLOCK:
Qin Jiajia9bf55522018-01-29 13:56:23 +0800606 return program->getActiveUniformBlockMaxNameLength();
jchen10d9cd7b72017-08-30 15:04:25 +0800607
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800608 case GL_BUFFER_VARIABLE:
609 maxNameLength =
610 FindMaxSize(program->getState().getBufferVariables(), &BufferVariable::name);
611 break;
612
613 case GL_SHADER_STORAGE_BLOCK:
Qin Jiajia9bf55522018-01-29 13:56:23 +0800614 return program->getActiveShaderStorageBlockMaxNameLength();
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800615
jchen10d9cd7b72017-08-30 15:04:25 +0800616 case GL_TRANSFORM_FEEDBACK_VARYING:
Qin Jiajia9bf55522018-01-29 13:56:23 +0800617 return clampCast<GLint>(program->getTransformFeedbackVaryingMaxLength());
jchen10d9cd7b72017-08-30 15:04:25 +0800618
619 default:
620 UNREACHABLE();
621 return 0;
622 }
623 // This length includes an extra character for the null terminator.
624 return (maxNameLength == 0 ? 0 : maxNameLength + 1);
625}
626
627GLint QueryProgramInterfaceMaxNumActiveVariables(const Program *program, GLenum programInterface)
628{
629 switch (programInterface)
630 {
631 case GL_UNIFORM_BLOCK:
632 return FindMaxSize(program->getState().getUniformBlocks(),
Jiajia Qin729b2c62017-08-14 09:36:11 +0800633 &InterfaceBlock::memberIndexes);
jchen1058f67be2017-10-27 08:59:27 +0800634 case GL_ATOMIC_COUNTER_BUFFER:
635 return FindMaxSize(program->getState().getAtomicCounterBuffers(),
636 &AtomicCounterBuffer::memberIndexes);
jchen10d9cd7b72017-08-30 15:04:25 +0800637
jchen10d9cd7b72017-08-30 15:04:25 +0800638 case GL_SHADER_STORAGE_BLOCK:
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800639 return FindMaxSize(program->getState().getShaderStorageBlocks(),
640 &InterfaceBlock::memberIndexes);
jchen10d9cd7b72017-08-30 15:04:25 +0800641
642 default:
643 UNREACHABLE();
644 return 0;
645 }
646}
647
jchen10baf5d942017-08-28 20:45:48 +0800648GLenum GetUniformPropertyEnum(GLenum prop)
649{
650 switch (prop)
651 {
652 case GL_UNIFORM_TYPE:
653 return GL_TYPE;
654 case GL_UNIFORM_SIZE:
655 return GL_ARRAY_SIZE;
656 case GL_UNIFORM_NAME_LENGTH:
657 return GL_NAME_LENGTH;
658 case GL_UNIFORM_BLOCK_INDEX:
659 return GL_BLOCK_INDEX;
660 case GL_UNIFORM_OFFSET:
661 return GL_OFFSET;
662 case GL_UNIFORM_ARRAY_STRIDE:
663 return GL_ARRAY_STRIDE;
664 case GL_UNIFORM_MATRIX_STRIDE:
665 return GL_MATRIX_STRIDE;
666 case GL_UNIFORM_IS_ROW_MAJOR:
667 return GL_IS_ROW_MAJOR;
668
669 default:
670 return prop;
671 }
672}
673
jchen1058f67be2017-10-27 08:59:27 +0800674GLenum GetUniformBlockPropertyEnum(GLenum prop)
675{
676 switch (prop)
677 {
678 case GL_UNIFORM_BLOCK_BINDING:
679 return GL_BUFFER_BINDING;
680
681 case GL_UNIFORM_BLOCK_DATA_SIZE:
682 return GL_BUFFER_DATA_SIZE;
683
684 case GL_UNIFORM_BLOCK_NAME_LENGTH:
685 return GL_NAME_LENGTH;
686
687 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
688 return GL_NUM_ACTIVE_VARIABLES;
689
690 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
691 return GL_ACTIVE_VARIABLES;
692
693 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
694 return GL_REFERENCED_BY_VERTEX_SHADER;
695
696 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
697 return GL_REFERENCED_BY_FRAGMENT_SHADER;
698
699 default:
700 return prop;
701 }
702}
703
704void GetShaderVariableBufferResourceProperty(const ShaderVariableBuffer &buffer,
705 GLenum pname,
706 GLint *params,
707 GLsizei bufSize,
708 GLsizei *outputPosition)
709
710{
711 switch (pname)
712 {
713 case GL_BUFFER_BINDING:
714 params[(*outputPosition)++] = buffer.binding;
715 break;
716 case GL_BUFFER_DATA_SIZE:
717 params[(*outputPosition)++] = clampCast<GLint>(buffer.dataSize);
718 break;
719 case GL_NUM_ACTIVE_VARIABLES:
720 params[(*outputPosition)++] = buffer.numActiveVariables();
721 break;
722 case GL_ACTIVE_VARIABLES:
723 for (size_t memberIndex = 0;
724 memberIndex < buffer.memberIndexes.size() && *outputPosition < bufSize;
725 ++memberIndex)
726 {
727 params[(*outputPosition)++] = clampCast<GLint>(buffer.memberIndexes[memberIndex]);
728 }
729 break;
730 case GL_REFERENCED_BY_VERTEX_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +0800731 params[(*outputPosition)++] = static_cast<GLint>(buffer.isActive(ShaderType::Vertex));
jchen1058f67be2017-10-27 08:59:27 +0800732 break;
733 case GL_REFERENCED_BY_FRAGMENT_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +0800734 params[(*outputPosition)++] = static_cast<GLint>(buffer.isActive(ShaderType::Fragment));
jchen1058f67be2017-10-27 08:59:27 +0800735 break;
736 case GL_REFERENCED_BY_COMPUTE_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +0800737 params[(*outputPosition)++] = static_cast<GLint>(buffer.isActive(ShaderType::Compute));
jchen1058f67be2017-10-27 08:59:27 +0800738 break;
Jiawei Shaoc6f82872018-04-24 14:14:50 +0800739 case GL_REFERENCED_BY_GEOMETRY_SHADER_EXT:
740 params[(*outputPosition)++] = static_cast<GLint>(buffer.isActive(ShaderType::Geometry));
741 break;
jchen1058f67be2017-10-27 08:59:27 +0800742 default:
743 UNREACHABLE();
744 break;
745 }
746}
747
748void GetInterfaceBlockResourceProperty(const InterfaceBlock &block,
749 GLenum pname,
750 GLint *params,
751 GLsizei bufSize,
752 GLsizei *outputPosition)
753{
754 if (pname == GL_NAME_LENGTH)
755 {
756 params[(*outputPosition)++] = clampCast<GLint>(block.nameWithArrayIndex().size() + 1);
757 return;
758 }
759 GetShaderVariableBufferResourceProperty(block, pname, params, bufSize, outputPosition);
760}
761
762void GetUniformBlockResourceProperty(const Program *program,
763 GLuint blockIndex,
764 GLenum pname,
765 GLint *params,
766 GLsizei bufSize,
767 GLsizei *outputPosition)
768
769{
770 ASSERT(*outputPosition < bufSize);
771 const auto &block = program->getUniformBlockByIndex(blockIndex);
772 GetInterfaceBlockResourceProperty(block, pname, params, bufSize, outputPosition);
773}
774
Jiajia Qin3a9090f2017-09-27 14:37:04 +0800775void GetShaderStorageBlockResourceProperty(const Program *program,
776 GLuint blockIndex,
777 GLenum pname,
778 GLint *params,
779 GLsizei bufSize,
780 GLsizei *outputPosition)
781
782{
783 ASSERT(*outputPosition < bufSize);
784 const auto &block = program->getShaderStorageBlockByIndex(blockIndex);
785 GetInterfaceBlockResourceProperty(block, pname, params, bufSize, outputPosition);
786}
787
jchen1058f67be2017-10-27 08:59:27 +0800788void GetAtomicCounterBufferResourceProperty(const Program *program,
789 GLuint index,
790 GLenum pname,
791 GLint *params,
792 GLsizei bufSize,
793 GLsizei *outputPosition)
794
795{
796 ASSERT(*outputPosition < bufSize);
797 const auto &buffer = program->getState().getAtomicCounterBuffers()[index];
798 GetShaderVariableBufferResourceProperty(buffer, pname, params, bufSize, outputPosition);
799}
800
Lingfeng Yang45b5a872018-06-07 11:33:25 -0700801bool IsTextureEnvEnumParameter(TextureEnvParameter pname)
802{
803 switch (pname)
804 {
805 case TextureEnvParameter::Mode:
806 case TextureEnvParameter::CombineRgb:
807 case TextureEnvParameter::CombineAlpha:
808 case TextureEnvParameter::Src0Rgb:
809 case TextureEnvParameter::Src1Rgb:
810 case TextureEnvParameter::Src2Rgb:
811 case TextureEnvParameter::Src0Alpha:
812 case TextureEnvParameter::Src1Alpha:
813 case TextureEnvParameter::Src2Alpha:
814 case TextureEnvParameter::Op0Rgb:
815 case TextureEnvParameter::Op1Rgb:
816 case TextureEnvParameter::Op2Rgb:
817 case TextureEnvParameter::Op0Alpha:
818 case TextureEnvParameter::Op1Alpha:
819 case TextureEnvParameter::Op2Alpha:
820 case TextureEnvParameter::RgbScale:
821 case TextureEnvParameter::AlphaScale:
822 return true;
823 default:
824 return false;
825 }
826}
827
Geoff Langc1984ed2016-10-07 12:41:00 -0400828} // anonymous namespace
829
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -0800830void QueryFramebufferAttachmentParameteriv(const Context *context,
831 const Framebuffer *framebuffer,
Geoff Langff5b2d52016-09-07 11:32:23 -0400832 GLenum attachment,
833 GLenum pname,
834 GLint *params)
835{
836 ASSERT(framebuffer);
837
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -0800838 const FramebufferAttachment *attachmentObject = framebuffer->getAttachment(context, attachment);
839
Geoff Langff5b2d52016-09-07 11:32:23 -0400840 if (attachmentObject == nullptr)
841 {
842 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
843 // is NONE, then querying any other pname will generate INVALID_ENUM.
844
845 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
846 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
847 // INVALID_OPERATION for all other pnames
848
849 switch (pname)
850 {
851 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
852 *params = GL_NONE;
853 break;
854
855 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
856 *params = 0;
857 break;
858
859 default:
860 UNREACHABLE();
861 break;
862 }
863
864 return;
865 }
866
867 switch (pname)
868 {
869 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
870 *params = attachmentObject->type();
871 break;
872
873 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
874 *params = attachmentObject->id();
875 break;
876
877 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
878 *params = attachmentObject->mipLevel();
879 break;
880
881 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
Corentin Wallez99d492c2018-02-27 15:17:10 -0500882 {
883 TextureTarget face = attachmentObject->cubeMapFace();
884 if (face != TextureTarget::InvalidEnum)
885 {
886 *params = ToGLenum(attachmentObject->cubeMapFace());
887 }
888 else
889 {
890 // This happens when the attachment isn't a texture cube map face
891 *params = GL_NONE;
892 }
893 }
894 break;
Geoff Langff5b2d52016-09-07 11:32:23 -0400895
896 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
897 *params = attachmentObject->getRedSize();
898 break;
899
900 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
901 *params = attachmentObject->getGreenSize();
902 break;
903
904 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
905 *params = attachmentObject->getBlueSize();
906 break;
907
908 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
909 *params = attachmentObject->getAlphaSize();
910 break;
911
912 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
913 *params = attachmentObject->getDepthSize();
914 break;
915
916 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
917 *params = attachmentObject->getStencilSize();
918 break;
919
920 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
921 *params = attachmentObject->getComponentType();
922 break;
923
924 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
925 *params = attachmentObject->getColorEncoding();
926 break;
927
928 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
929 *params = attachmentObject->layer();
930 break;
931
Martin Radeve5285d22017-07-14 16:23:53 +0300932 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_ANGLE:
933 *params = attachmentObject->getNumViews();
934 break;
935
936 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_MULTIVIEW_LAYOUT_ANGLE:
937 *params = static_cast<GLint>(attachmentObject->getMultiviewLayout());
938 break;
939
940 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_ANGLE:
941 *params = attachmentObject->getBaseViewIndex();
942 break;
943
944 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_VIEWPORT_OFFSETS_ANGLE:
945 {
946 const std::vector<Offset> &offsets = attachmentObject->getMultiviewViewportOffsets();
947 for (size_t i = 0u; i < offsets.size(); ++i)
948 {
949 params[i * 2u] = offsets[i].x;
950 params[i * 2u + 1u] = offsets[i].y;
951 }
952 }
953 break;
954
Jiawei Shaoa8802472018-05-28 11:17:47 +0800955 case GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT:
956 *params = attachmentObject->isLayered();
957 break;
958
Geoff Langff5b2d52016-09-07 11:32:23 -0400959 default:
960 UNREACHABLE();
961 break;
962 }
963}
964
965void QueryBufferParameteriv(const Buffer *buffer, GLenum pname, GLint *params)
966{
Geoff Langebebe1c2016-10-14 12:01:31 -0400967 QueryBufferParameterBase(buffer, pname, params);
968}
Geoff Langff5b2d52016-09-07 11:32:23 -0400969
Geoff Langebebe1c2016-10-14 12:01:31 -0400970void QueryBufferParameteri64v(const Buffer *buffer, GLenum pname, GLint64 *params)
971{
972 QueryBufferParameterBase(buffer, pname, params);
Geoff Langff5b2d52016-09-07 11:32:23 -0400973}
974
Geoff Lang496c02d2016-10-20 11:38:11 -0700975void QueryBufferPointerv(const Buffer *buffer, GLenum pname, void **params)
976{
977 switch (pname)
978 {
979 case GL_BUFFER_MAP_POINTER:
980 *params = buffer->getMapPointer();
981 break;
982
983 default:
984 UNREACHABLE();
985 break;
986 }
987}
988
Jamie Madillffe00c02017-06-27 16:26:55 -0400989void QueryProgramiv(const Context *context, const Program *program, GLenum pname, GLint *params)
Geoff Langff5b2d52016-09-07 11:32:23 -0400990{
991 ASSERT(program != nullptr);
992
993 switch (pname)
994 {
995 case GL_DELETE_STATUS:
996 *params = program->isFlaggedForDeletion();
997 return;
998 case GL_LINK_STATUS:
999 *params = program->isLinked();
1000 return;
1001 case GL_VALIDATE_STATUS:
1002 *params = program->isValidated();
1003 return;
1004 case GL_INFO_LOG_LENGTH:
1005 *params = program->getInfoLogLength();
1006 return;
1007 case GL_ATTACHED_SHADERS:
1008 *params = program->getAttachedShadersCount();
1009 return;
1010 case GL_ACTIVE_ATTRIBUTES:
1011 *params = program->getActiveAttributeCount();
1012 return;
1013 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
1014 *params = program->getActiveAttributeMaxLength();
1015 return;
1016 case GL_ACTIVE_UNIFORMS:
1017 *params = program->getActiveUniformCount();
1018 return;
1019 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
1020 *params = program->getActiveUniformMaxLength();
1021 return;
1022 case GL_PROGRAM_BINARY_LENGTH_OES:
Jamie Madillffe00c02017-06-27 16:26:55 -04001023 *params = program->getBinaryLength(context);
Geoff Langff5b2d52016-09-07 11:32:23 -04001024 return;
1025 case GL_ACTIVE_UNIFORM_BLOCKS:
1026 *params = program->getActiveUniformBlockCount();
1027 return;
1028 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
Qin Jiajia9bf55522018-01-29 13:56:23 +08001029 *params = program->getActiveUniformBlockMaxNameLength();
Geoff Langff5b2d52016-09-07 11:32:23 -04001030 break;
1031 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
1032 *params = program->getTransformFeedbackBufferMode();
1033 break;
1034 case GL_TRANSFORM_FEEDBACK_VARYINGS:
jchen10910a3da2017-11-15 09:40:11 +08001035 *params = clampCast<GLint>(program->getTransformFeedbackVaryingCount());
Geoff Langff5b2d52016-09-07 11:32:23 -04001036 break;
1037 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
1038 *params = program->getTransformFeedbackVaryingMaxLength();
1039 break;
1040 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
1041 *params = program->getBinaryRetrievableHint();
1042 break;
Yunchao He61afff12017-03-14 15:34:03 +08001043 case GL_PROGRAM_SEPARABLE:
1044 *params = program->isSeparable();
1045 break;
Xinghua Cao971f8502017-10-17 13:01:24 +08001046 case GL_COMPUTE_WORK_GROUP_SIZE:
1047 {
1048 const sh::WorkGroupSize &localSize = program->getComputeShaderLocalSize();
1049 params[0] = localSize[0];
1050 params[1] = localSize[1];
1051 params[2] = localSize[2];
1052 }
1053 break;
jchen1058f67be2017-10-27 08:59:27 +08001054 case GL_ACTIVE_ATOMIC_COUNTER_BUFFERS:
1055 *params = program->getActiveAtomicCounterBufferCount();
1056 break;
Jiawei Shao447bfac2018-03-14 14:23:40 +08001057 case GL_GEOMETRY_LINKED_INPUT_TYPE_EXT:
Jamie Madill493f9572018-05-24 19:52:15 -04001058 *params = ToGLenum(program->getGeometryShaderInputPrimitiveType());
Jiawei Shao447bfac2018-03-14 14:23:40 +08001059 break;
1060 case GL_GEOMETRY_LINKED_OUTPUT_TYPE_EXT:
Jamie Madill493f9572018-05-24 19:52:15 -04001061 *params = ToGLenum(program->getGeometryShaderOutputPrimitiveType());
Jiawei Shao447bfac2018-03-14 14:23:40 +08001062 break;
1063 case GL_GEOMETRY_LINKED_VERTICES_OUT_EXT:
1064 *params = program->getGeometryShaderMaxVertices();
1065 break;
1066 case GL_GEOMETRY_SHADER_INVOCATIONS_EXT:
1067 *params = program->getGeometryShaderInvocations();
1068 break;
Geoff Langff5b2d52016-09-07 11:32:23 -04001069 default:
1070 UNREACHABLE();
1071 break;
1072 }
1073}
Geoff Lang740d9022016-10-07 11:20:52 -04001074
Jamie Madill4e0e6f82017-02-17 11:06:03 -05001075void QueryRenderbufferiv(const Context *context,
1076 const Renderbuffer *renderbuffer,
1077 GLenum pname,
1078 GLint *params)
Geoff Lang740d9022016-10-07 11:20:52 -04001079{
1080 ASSERT(renderbuffer != nullptr);
1081
1082 switch (pname)
1083 {
1084 case GL_RENDERBUFFER_WIDTH:
1085 *params = renderbuffer->getWidth();
1086 break;
1087 case GL_RENDERBUFFER_HEIGHT:
1088 *params = renderbuffer->getHeight();
1089 break;
1090 case GL_RENDERBUFFER_INTERNAL_FORMAT:
Jamie Madill4e0e6f82017-02-17 11:06:03 -05001091 // Special case the WebGL 1 DEPTH_STENCIL format.
Jamie Madilla02315b2017-02-23 14:14:47 -05001092 if (context->isWebGL1() &&
Jamie Madill4e0e6f82017-02-17 11:06:03 -05001093 renderbuffer->getFormat().info->internalFormat == GL_DEPTH24_STENCIL8)
1094 {
1095 *params = GL_DEPTH_STENCIL;
1096 }
1097 else
1098 {
1099 *params = renderbuffer->getFormat().info->internalFormat;
1100 }
Geoff Lang740d9022016-10-07 11:20:52 -04001101 break;
1102 case GL_RENDERBUFFER_RED_SIZE:
1103 *params = renderbuffer->getRedSize();
1104 break;
1105 case GL_RENDERBUFFER_GREEN_SIZE:
1106 *params = renderbuffer->getGreenSize();
1107 break;
1108 case GL_RENDERBUFFER_BLUE_SIZE:
1109 *params = renderbuffer->getBlueSize();
1110 break;
1111 case GL_RENDERBUFFER_ALPHA_SIZE:
1112 *params = renderbuffer->getAlphaSize();
1113 break;
1114 case GL_RENDERBUFFER_DEPTH_SIZE:
1115 *params = renderbuffer->getDepthSize();
1116 break;
1117 case GL_RENDERBUFFER_STENCIL_SIZE:
1118 *params = renderbuffer->getStencilSize();
1119 break;
1120 case GL_RENDERBUFFER_SAMPLES_ANGLE:
1121 *params = renderbuffer->getSamples();
1122 break;
1123 default:
1124 UNREACHABLE();
1125 break;
1126 }
1127}
Geoff Langd7d0ed32016-10-07 11:33:51 -04001128
Jamie Madillbd044ed2017-06-05 12:59:21 -04001129void QueryShaderiv(const Context *context, Shader *shader, GLenum pname, GLint *params)
Geoff Langd7d0ed32016-10-07 11:33:51 -04001130{
1131 ASSERT(shader != nullptr);
1132
1133 switch (pname)
1134 {
1135 case GL_SHADER_TYPE:
Jiawei Shao385b3e02018-03-21 09:43:28 +08001136 *params = static_cast<GLint>(ToGLenum(shader->getType()));
Geoff Langd7d0ed32016-10-07 11:33:51 -04001137 return;
1138 case GL_DELETE_STATUS:
1139 *params = shader->isFlaggedForDeletion();
1140 return;
1141 case GL_COMPILE_STATUS:
Jamie Madillbd044ed2017-06-05 12:59:21 -04001142 *params = shader->isCompiled(context) ? GL_TRUE : GL_FALSE;
Geoff Langd7d0ed32016-10-07 11:33:51 -04001143 return;
1144 case GL_INFO_LOG_LENGTH:
Jamie Madillbd044ed2017-06-05 12:59:21 -04001145 *params = shader->getInfoLogLength(context);
Geoff Langd7d0ed32016-10-07 11:33:51 -04001146 return;
1147 case GL_SHADER_SOURCE_LENGTH:
1148 *params = shader->getSourceLength();
1149 return;
1150 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
Jamie Madillbd044ed2017-06-05 12:59:21 -04001151 *params = shader->getTranslatedSourceWithDebugInfoLength(context);
Geoff Langd7d0ed32016-10-07 11:33:51 -04001152 return;
1153 default:
1154 UNREACHABLE();
1155 break;
1156 }
1157}
Geoff Langc1984ed2016-10-07 12:41:00 -04001158
He Yunchao11b038b2016-11-22 21:24:04 +08001159void QueryTexLevelParameterfv(const Texture *texture,
Corentin Wallez99d492c2018-02-27 15:17:10 -05001160 TextureTarget target,
He Yunchao11b038b2016-11-22 21:24:04 +08001161 GLint level,
1162 GLenum pname,
1163 GLfloat *params)
1164{
1165 QueryTexLevelParameterBase(texture, target, level, pname, params);
1166}
1167
1168void QueryTexLevelParameteriv(const Texture *texture,
Corentin Wallez99d492c2018-02-27 15:17:10 -05001169 TextureTarget target,
He Yunchao11b038b2016-11-22 21:24:04 +08001170 GLint level,
1171 GLenum pname,
1172 GLint *params)
1173{
1174 QueryTexLevelParameterBase(texture, target, level, pname, params);
1175}
1176
Geoff Langc1984ed2016-10-07 12:41:00 -04001177void QueryTexParameterfv(const Texture *texture, GLenum pname, GLfloat *params)
1178{
1179 QueryTexParameterBase(texture, pname, params);
1180}
1181
1182void QueryTexParameteriv(const Texture *texture, GLenum pname, GLint *params)
1183{
1184 QueryTexParameterBase(texture, pname, params);
1185}
1186
1187void QuerySamplerParameterfv(const Sampler *sampler, GLenum pname, GLfloat *params)
1188{
1189 QuerySamplerParameterBase(sampler, pname, params);
1190}
1191
1192void QuerySamplerParameteriv(const Sampler *sampler, GLenum pname, GLint *params)
1193{
1194 QuerySamplerParameterBase(sampler, pname, params);
1195}
1196
Geoff Lang0b031062016-10-13 14:30:04 -04001197void QueryVertexAttribfv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001198 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001199 const VertexAttribCurrentValueData &currentValueData,
1200 GLenum pname,
1201 GLfloat *params)
1202{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001203 QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001204}
1205
1206void QueryVertexAttribiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001207 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001208 const VertexAttribCurrentValueData &currentValueData,
1209 GLenum pname,
1210 GLint *params)
1211{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001212 QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001213}
1214
Jamie Madill876429b2017-04-20 15:46:24 -04001215void QueryVertexAttribPointerv(const VertexAttribute &attrib, GLenum pname, void **pointer)
Geoff Lang0b031062016-10-13 14:30:04 -04001216{
1217 switch (pname)
1218 {
1219 case GL_VERTEX_ATTRIB_ARRAY_POINTER:
Jamie Madill876429b2017-04-20 15:46:24 -04001220 *pointer = const_cast<void *>(attrib.pointer);
Geoff Lang0b031062016-10-13 14:30:04 -04001221 break;
1222
1223 default:
1224 UNREACHABLE();
1225 break;
1226 }
1227}
1228
1229void QueryVertexAttribIiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001230 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001231 const VertexAttribCurrentValueData &currentValueData,
1232 GLenum pname,
1233 GLint *params)
1234{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001235 QueryVertexAttribBase(attrib, binding, currentValueData.IntValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001236}
1237
1238void QueryVertexAttribIuiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001239 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001240 const VertexAttribCurrentValueData &currentValueData,
1241 GLenum pname,
1242 GLuint *params)
1243{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001244 QueryVertexAttribBase(attrib, binding, currentValueData.UnsignedIntValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001245}
1246
Geoff Lang6899b872016-10-14 11:30:13 -04001247void QueryActiveUniformBlockiv(const Program *program,
1248 GLuint uniformBlockIndex,
1249 GLenum pname,
1250 GLint *params)
1251{
jchen1058f67be2017-10-27 08:59:27 +08001252 GLenum prop = GetUniformBlockPropertyEnum(pname);
1253 QueryProgramResourceiv(program, GL_UNIFORM_BLOCK, uniformBlockIndex, 1, &prop,
1254 std::numeric_limits<GLsizei>::max(), nullptr, params);
Geoff Lang6899b872016-10-14 11:30:13 -04001255}
1256
Geoff Lang0a9661f2016-10-20 10:59:20 -07001257void QueryInternalFormativ(const TextureCaps &format, GLenum pname, GLsizei bufSize, GLint *params)
1258{
1259 switch (pname)
1260 {
1261 case GL_NUM_SAMPLE_COUNTS:
1262 if (bufSize != 0)
1263 {
jchen10a99ed552017-09-22 08:10:32 +08001264 *params = clampCast<GLint>(format.sampleCounts.size());
Geoff Lang0a9661f2016-10-20 10:59:20 -07001265 }
1266 break;
1267
1268 case GL_SAMPLES:
1269 {
1270 size_t returnCount = std::min<size_t>(bufSize, format.sampleCounts.size());
1271 auto sampleReverseIt = format.sampleCounts.rbegin();
1272 for (size_t sampleIndex = 0; sampleIndex < returnCount; ++sampleIndex)
1273 {
1274 params[sampleIndex] = *sampleReverseIt++;
1275 }
1276 }
1277 break;
1278
1279 default:
1280 UNREACHABLE();
1281 break;
1282 }
1283}
1284
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001285void QueryFramebufferParameteriv(const Framebuffer *framebuffer, GLenum pname, GLint *params)
1286{
1287 ASSERT(framebuffer);
1288
1289 switch (pname)
1290 {
1291 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
1292 *params = framebuffer->getDefaultWidth();
1293 break;
1294 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
1295 *params = framebuffer->getDefaultHeight();
1296 break;
1297 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
1298 *params = framebuffer->getDefaultSamples();
1299 break;
1300 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
Geoff Lang92019432017-11-20 13:09:34 -05001301 *params = ConvertToGLBoolean(framebuffer->getDefaultFixedSampleLocations());
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001302 break;
Jiawei Shaob1e91382018-05-17 14:33:55 +08001303 case GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT:
1304 *params = framebuffer->getDefaultLayers();
1305 break;
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001306 default:
1307 UNREACHABLE();
1308 break;
1309 }
1310}
1311
Jamie Madill70b5bb02017-08-28 13:32:37 -04001312Error QuerySynciv(const Sync *sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001313{
1314 ASSERT(sync);
1315
Geoff Lang82483b92017-04-11 15:33:00 -04001316 // All queries return one value, exit early if the buffer can't fit anything.
1317 if (bufSize < 1)
1318 {
1319 if (length != nullptr)
1320 {
1321 *length = 0;
1322 }
1323 return NoError();
1324 }
1325
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001326 switch (pname)
1327 {
1328 case GL_OBJECT_TYPE:
jchen10a99ed552017-09-22 08:10:32 +08001329 *values = clampCast<GLint>(GL_SYNC_FENCE);
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001330 break;
1331 case GL_SYNC_CONDITION:
jchen10a99ed552017-09-22 08:10:32 +08001332 *values = clampCast<GLint>(sync->getCondition());
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001333 break;
1334 case GL_SYNC_FLAGS:
jchen10a99ed552017-09-22 08:10:32 +08001335 *values = clampCast<GLint>(sync->getFlags());
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001336 break;
1337 case GL_SYNC_STATUS:
1338 ANGLE_TRY(sync->getStatus(values));
1339 break;
1340
1341 default:
1342 UNREACHABLE();
1343 break;
1344 }
1345
Geoff Lang82483b92017-04-11 15:33:00 -04001346 if (length != nullptr)
1347 {
1348 *length = 1;
1349 }
1350
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001351 return NoError();
1352}
1353
Jamie Madill4928b7c2017-06-20 12:57:39 -04001354void SetTexParameterf(Context *context, Texture *texture, GLenum pname, GLfloat param)
Geoff Langc1984ed2016-10-07 12:41:00 -04001355{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001356 SetTexParameterBase(context, texture, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -04001357}
1358
Jamie Madill4928b7c2017-06-20 12:57:39 -04001359void SetTexParameterfv(Context *context, Texture *texture, GLenum pname, const GLfloat *params)
Geoff Langc1984ed2016-10-07 12:41:00 -04001360{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001361 SetTexParameterBase(context, texture, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001362}
1363
Jamie Madill4928b7c2017-06-20 12:57:39 -04001364void SetTexParameteri(Context *context, Texture *texture, GLenum pname, GLint param)
Geoff Langc1984ed2016-10-07 12:41:00 -04001365{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001366 SetTexParameterBase(context, texture, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -04001367}
1368
Jamie Madill4928b7c2017-06-20 12:57:39 -04001369void SetTexParameteriv(Context *context, Texture *texture, GLenum pname, const GLint *params)
Geoff Langc1984ed2016-10-07 12:41:00 -04001370{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001371 SetTexParameterBase(context, texture, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001372}
1373
1374void SetSamplerParameterf(Sampler *sampler, GLenum pname, GLfloat param)
1375{
1376 SetSamplerParameterBase(sampler, pname, &param);
1377}
1378
1379void SetSamplerParameterfv(Sampler *sampler, GLenum pname, const GLfloat *params)
1380{
1381 SetSamplerParameterBase(sampler, pname, params);
1382}
1383
1384void SetSamplerParameteri(Sampler *sampler, GLenum pname, GLint param)
1385{
1386 SetSamplerParameterBase(sampler, pname, &param);
1387}
1388
1389void SetSamplerParameteriv(Sampler *sampler, GLenum pname, const GLint *params)
1390{
1391 SetSamplerParameterBase(sampler, pname, params);
1392}
Geoff Lang65603eb2017-01-12 16:48:03 -05001393
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001394void SetFramebufferParameteri(Framebuffer *framebuffer, GLenum pname, GLint param)
1395{
1396 ASSERT(framebuffer);
1397
1398 switch (pname)
1399 {
1400 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
1401 framebuffer->setDefaultWidth(param);
1402 break;
1403 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
1404 framebuffer->setDefaultHeight(param);
1405 break;
1406 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
1407 framebuffer->setDefaultSamples(param);
1408 break;
1409 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
Geoff Lang5201ce12017-11-28 11:36:28 -05001410 framebuffer->setDefaultFixedSampleLocations(ConvertToBool(param));
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001411 break;
Jiawei Shaob1e91382018-05-17 14:33:55 +08001412 case GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT:
1413 framebuffer->setDefaultLayers(param);
1414 break;
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001415 default:
1416 UNREACHABLE();
1417 break;
1418 }
1419}
1420
Yunchao He61afff12017-03-14 15:34:03 +08001421void SetProgramParameteri(Program *program, GLenum pname, GLint value)
1422{
1423 ASSERT(program);
1424
1425 switch (pname)
1426 {
1427 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
Geoff Lang92019432017-11-20 13:09:34 -05001428 program->setBinaryRetrievableHint(ConvertToBool(value));
Yunchao He61afff12017-03-14 15:34:03 +08001429 break;
1430 case GL_PROGRAM_SEPARABLE:
Geoff Lang92019432017-11-20 13:09:34 -05001431 program->setSeparable(ConvertToBool(value));
Yunchao He61afff12017-03-14 15:34:03 +08001432 break;
1433 default:
1434 UNREACHABLE();
1435 break;
1436 }
1437}
1438
jchen10baf5d942017-08-28 20:45:48 +08001439GLint GetUniformResourceProperty(const Program *program, GLuint index, const GLenum prop)
1440{
1441 const auto &uniform = program->getUniformByIndex(index);
1442 GLenum resourceProp = GetUniformPropertyEnum(prop);
1443 switch (resourceProp)
1444 {
1445 case GL_TYPE:
1446 case GL_ARRAY_SIZE:
1447 case GL_NAME_LENGTH:
Olli Etuaho465835d2017-09-26 13:34:10 +03001448 return GetCommonVariableProperty(uniform, resourceProp);
jchen10baf5d942017-08-28 20:45:48 +08001449
1450 case GL_LOCATION:
1451 return program->getUniformLocation(uniform.name);
1452
1453 case GL_BLOCK_INDEX:
1454 return (uniform.isAtomicCounter() ? -1 : uniform.bufferIndex);
1455
1456 case GL_OFFSET:
1457 return uniform.blockInfo.offset;
1458
1459 case GL_ARRAY_STRIDE:
1460 return uniform.blockInfo.arrayStride;
1461
1462 case GL_MATRIX_STRIDE:
1463 return uniform.blockInfo.matrixStride;
1464
1465 case GL_IS_ROW_MAJOR:
1466 return static_cast<GLint>(uniform.blockInfo.isRowMajorMatrix);
1467
1468 case GL_REFERENCED_BY_VERTEX_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001469 return uniform.isActive(ShaderType::Vertex);
jchen10baf5d942017-08-28 20:45:48 +08001470
1471 case GL_REFERENCED_BY_FRAGMENT_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001472 return uniform.isActive(ShaderType::Fragment);
jchen10baf5d942017-08-28 20:45:48 +08001473
1474 case GL_REFERENCED_BY_COMPUTE_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001475 return uniform.isActive(ShaderType::Compute);
jchen10baf5d942017-08-28 20:45:48 +08001476
Jiawei Shaoc6f82872018-04-24 14:14:50 +08001477 case GL_REFERENCED_BY_GEOMETRY_SHADER_EXT:
1478 return uniform.isActive(ShaderType::Geometry);
1479
jchen10baf5d942017-08-28 20:45:48 +08001480 case GL_ATOMIC_COUNTER_BUFFER_INDEX:
1481 return (uniform.isAtomicCounter() ? uniform.bufferIndex : -1);
1482
1483 default:
1484 UNREACHABLE();
1485 return 0;
1486 }
1487}
1488
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001489GLint GetBufferVariableResourceProperty(const Program *program, GLuint index, const GLenum prop)
1490{
1491 const auto &bufferVariable = program->getBufferVariableByIndex(index);
1492 switch (prop)
1493 {
1494 case GL_TYPE:
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001495 case GL_ARRAY_SIZE:
Olli Etuaho465835d2017-09-26 13:34:10 +03001496 case GL_NAME_LENGTH:
1497 return GetCommonVariableProperty(bufferVariable, prop);
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001498
1499 case GL_BLOCK_INDEX:
1500 return bufferVariable.bufferIndex;
1501
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001502 case GL_OFFSET:
1503 return bufferVariable.blockInfo.offset;
1504
1505 case GL_ARRAY_STRIDE:
1506 return bufferVariable.blockInfo.arrayStride;
1507
1508 case GL_MATRIX_STRIDE:
1509 return bufferVariable.blockInfo.matrixStride;
1510
1511 case GL_IS_ROW_MAJOR:
1512 return static_cast<GLint>(bufferVariable.blockInfo.isRowMajorMatrix);
1513
1514 case GL_REFERENCED_BY_VERTEX_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001515 return bufferVariable.isActive(ShaderType::Vertex);
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001516
1517 case GL_REFERENCED_BY_FRAGMENT_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001518 return bufferVariable.isActive(ShaderType::Fragment);
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001519
1520 case GL_REFERENCED_BY_COMPUTE_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001521 return bufferVariable.isActive(ShaderType::Compute);
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001522
Jiawei Shaoc6f82872018-04-24 14:14:50 +08001523 case GL_REFERENCED_BY_GEOMETRY_SHADER_EXT:
1524 return bufferVariable.isActive(ShaderType::Geometry);
1525
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001526 case GL_TOP_LEVEL_ARRAY_SIZE:
1527 return bufferVariable.topLevelArraySize;
1528
1529 case GL_TOP_LEVEL_ARRAY_STRIDE:
1530 return bufferVariable.blockInfo.topLevelArrayStride;
1531
1532 default:
1533 UNREACHABLE();
1534 return 0;
1535 }
1536}
1537
jchen1015015f72017-03-16 13:54:21 +08001538GLuint QueryProgramResourceIndex(const Program *program,
1539 GLenum programInterface,
1540 const GLchar *name)
1541{
1542 switch (programInterface)
1543 {
1544 case GL_PROGRAM_INPUT:
1545 return program->getInputResourceIndex(name);
1546
1547 case GL_PROGRAM_OUTPUT:
1548 return program->getOutputResourceIndex(name);
1549
jchen1015015f72017-03-16 13:54:21 +08001550 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001551 return program->getState().getUniformIndexFromName(name);
1552
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001553 case GL_BUFFER_VARIABLE:
1554 return program->getState().getBufferVariableIndexFromName(name);
1555
1556 case GL_SHADER_STORAGE_BLOCK:
1557 return program->getShaderStorageBlockIndex(name);
1558
jchen1015015f72017-03-16 13:54:21 +08001559 case GL_UNIFORM_BLOCK:
jchen1058f67be2017-10-27 08:59:27 +08001560 return program->getUniformBlockIndex(name);
1561
jchen1015015f72017-03-16 13:54:21 +08001562 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10910a3da2017-11-15 09:40:11 +08001563 return program->getTransformFeedbackVaryingResourceIndex(name);
jchen1015015f72017-03-16 13:54:21 +08001564
1565 default:
1566 UNREACHABLE();
1567 return GL_INVALID_INDEX;
1568 }
1569}
1570
jchen10fd7c3b52017-03-21 15:36:03 +08001571void QueryProgramResourceName(const Program *program,
1572 GLenum programInterface,
1573 GLuint index,
1574 GLsizei bufSize,
1575 GLsizei *length,
1576 GLchar *name)
1577{
1578 switch (programInterface)
1579 {
1580 case GL_PROGRAM_INPUT:
1581 program->getInputResourceName(index, bufSize, length, name);
1582 break;
1583
1584 case GL_PROGRAM_OUTPUT:
1585 program->getOutputResourceName(index, bufSize, length, name);
1586 break;
1587
jchen10fd7c3b52017-03-21 15:36:03 +08001588 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001589 program->getUniformResourceName(index, bufSize, length, name);
1590 break;
1591
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001592 case GL_BUFFER_VARIABLE:
1593 program->getBufferVariableResourceName(index, bufSize, length, name);
1594 break;
1595
1596 case GL_SHADER_STORAGE_BLOCK:
1597 program->getActiveShaderStorageBlockName(index, bufSize, length, name);
1598 break;
1599
jchen10fd7c3b52017-03-21 15:36:03 +08001600 case GL_UNIFORM_BLOCK:
jchen1058f67be2017-10-27 08:59:27 +08001601 program->getActiveUniformBlockName(index, bufSize, length, name);
1602 break;
1603
jchen10fd7c3b52017-03-21 15:36:03 +08001604 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10910a3da2017-11-15 09:40:11 +08001605 program->getTransformFeedbackVarying(index, bufSize, length, nullptr, nullptr, name);
jchen10fd7c3b52017-03-21 15:36:03 +08001606 break;
1607
1608 default:
1609 UNREACHABLE();
1610 }
1611}
1612
jchen10191381f2017-04-11 13:59:04 +08001613GLint QueryProgramResourceLocation(const Program *program,
1614 GLenum programInterface,
1615 const GLchar *name)
1616{
1617 switch (programInterface)
1618 {
1619 case GL_PROGRAM_INPUT:
1620 return program->getAttributeLocation(name);
1621
1622 case GL_PROGRAM_OUTPUT:
1623 return program->getFragDataLocation(name);
1624
jchen10191381f2017-04-11 13:59:04 +08001625 case GL_UNIFORM:
Olli Etuahod2551232017-10-26 20:03:33 +03001626 return program->getUniformLocation(name);
jchen10baf5d942017-08-28 20:45:48 +08001627
jchen10191381f2017-04-11 13:59:04 +08001628 default:
1629 UNREACHABLE();
1630 return -1;
1631 }
1632}
1633
jchen10880683b2017-04-12 16:21:55 +08001634void QueryProgramResourceiv(const Program *program,
1635 GLenum programInterface,
1636 GLuint index,
1637 GLsizei propCount,
1638 const GLenum *props,
1639 GLsizei bufSize,
1640 GLsizei *length,
1641 GLint *params)
1642{
1643 if (!program->isLinked())
1644 {
1645 if (length != nullptr)
1646 {
1647 *length = 0;
1648 }
1649 return;
1650 }
1651
jchen1058f67be2017-10-27 08:59:27 +08001652 GLsizei pos = 0;
1653 for (GLsizei i = 0; i < propCount; i++)
jchen10880683b2017-04-12 16:21:55 +08001654 {
1655 switch (programInterface)
1656 {
1657 case GL_PROGRAM_INPUT:
1658 params[i] = GetInputResourceProperty(program, index, props[i]);
jchen1058f67be2017-10-27 08:59:27 +08001659 ++pos;
jchen10880683b2017-04-12 16:21:55 +08001660 break;
1661
1662 case GL_PROGRAM_OUTPUT:
1663 params[i] = GetOutputResourceProperty(program, index, props[i]);
jchen1058f67be2017-10-27 08:59:27 +08001664 ++pos;
jchen10880683b2017-04-12 16:21:55 +08001665 break;
1666
jchen10880683b2017-04-12 16:21:55 +08001667 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001668 params[i] = GetUniformResourceProperty(program, index, props[i]);
jchen1058f67be2017-10-27 08:59:27 +08001669 ++pos;
1670 break;
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001671
1672 case GL_BUFFER_VARIABLE:
1673 params[i] = GetBufferVariableResourceProperty(program, index, props[i]);
1674 ++pos;
1675 break;
1676
jchen1058f67be2017-10-27 08:59:27 +08001677 case GL_UNIFORM_BLOCK:
1678 GetUniformBlockResourceProperty(program, index, props[i], params, bufSize, &pos);
jchen10baf5d942017-08-28 20:45:48 +08001679 break;
1680
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001681 case GL_SHADER_STORAGE_BLOCK:
1682 GetShaderStorageBlockResourceProperty(program, index, props[i], params, bufSize,
1683 &pos);
1684 break;
1685
jchen1058f67be2017-10-27 08:59:27 +08001686 case GL_ATOMIC_COUNTER_BUFFER:
1687 GetAtomicCounterBufferResourceProperty(program, index, props[i], params, bufSize,
1688 &pos);
1689 break;
jchen10910a3da2017-11-15 09:40:11 +08001690
jchen10880683b2017-04-12 16:21:55 +08001691 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10910a3da2017-11-15 09:40:11 +08001692 params[i] = GetTransformFeedbackVaryingResourceProperty(program, index, props[i]);
1693 ++pos;
jchen10880683b2017-04-12 16:21:55 +08001694 break;
1695
1696 default:
1697 UNREACHABLE();
1698 params[i] = GL_INVALID_VALUE;
1699 }
jchen1058f67be2017-10-27 08:59:27 +08001700 if (pos == bufSize)
1701 {
1702 // Most properties return one value, but GL_ACTIVE_VARIABLES returns an array of values.
1703 // This checks not to break buffer bounds for such case.
1704 break;
1705 }
1706 }
1707
1708 if (length != nullptr)
1709 {
1710 *length = pos;
jchen10880683b2017-04-12 16:21:55 +08001711 }
1712}
1713
jchen10d9cd7b72017-08-30 15:04:25 +08001714void QueryProgramInterfaceiv(const Program *program,
1715 GLenum programInterface,
1716 GLenum pname,
1717 GLint *params)
1718{
1719 switch (pname)
1720 {
1721 case GL_ACTIVE_RESOURCES:
1722 *params = QueryProgramInterfaceActiveResources(program, programInterface);
1723 break;
1724
1725 case GL_MAX_NAME_LENGTH:
1726 *params = QueryProgramInterfaceMaxNameLength(program, programInterface);
1727 break;
1728
1729 case GL_MAX_NUM_ACTIVE_VARIABLES:
1730 *params = QueryProgramInterfaceMaxNumActiveVariables(program, programInterface);
1731 break;
1732
1733 default:
1734 UNREACHABLE();
1735 }
1736}
1737
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001738ClientVertexArrayType ParamToVertexArrayType(GLenum param)
1739{
1740 switch (param)
1741 {
1742 case GL_VERTEX_ARRAY:
1743 case GL_VERTEX_ARRAY_BUFFER_BINDING:
1744 case GL_VERTEX_ARRAY_STRIDE:
1745 case GL_VERTEX_ARRAY_SIZE:
1746 case GL_VERTEX_ARRAY_TYPE:
1747 case GL_VERTEX_ARRAY_POINTER:
1748 return ClientVertexArrayType::Vertex;
1749 case GL_NORMAL_ARRAY:
1750 case GL_NORMAL_ARRAY_BUFFER_BINDING:
1751 case GL_NORMAL_ARRAY_STRIDE:
1752 case GL_NORMAL_ARRAY_TYPE:
1753 case GL_NORMAL_ARRAY_POINTER:
1754 return ClientVertexArrayType::Normal;
1755 case GL_COLOR_ARRAY:
1756 case GL_COLOR_ARRAY_BUFFER_BINDING:
1757 case GL_COLOR_ARRAY_STRIDE:
1758 case GL_COLOR_ARRAY_SIZE:
1759 case GL_COLOR_ARRAY_TYPE:
1760 case GL_COLOR_ARRAY_POINTER:
1761 return ClientVertexArrayType::Color;
1762 case GL_POINT_SIZE_ARRAY_OES:
1763 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
1764 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
1765 case GL_POINT_SIZE_ARRAY_TYPE_OES:
1766 case GL_POINT_SIZE_ARRAY_POINTER_OES:
1767 return ClientVertexArrayType::PointSize;
1768 case GL_TEXTURE_COORD_ARRAY:
1769 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
1770 case GL_TEXTURE_COORD_ARRAY_STRIDE:
1771 case GL_TEXTURE_COORD_ARRAY_SIZE:
1772 case GL_TEXTURE_COORD_ARRAY_TYPE:
1773 case GL_TEXTURE_COORD_ARRAY_POINTER:
1774 return ClientVertexArrayType::TextureCoord;
1775 default:
1776 UNREACHABLE();
1777 return ClientVertexArrayType::InvalidEnum;
1778 }
1779}
1780
Lingfeng Yangd0febe72018-05-17 22:36:52 -07001781void SetLightModelParameters(GLES1State *state, GLenum pname, const GLfloat *params)
1782{
1783 LightModelParameters &lightModel = state->lightModelParameters();
1784
1785 switch (pname)
1786 {
1787 case GL_LIGHT_MODEL_AMBIENT:
1788 lightModel.color = ColorF::fromData(params);
1789 break;
1790 case GL_LIGHT_MODEL_TWO_SIDE:
1791 lightModel.twoSided = *params == 1.0f ? true : false;
1792 break;
1793 default:
1794 break;
1795 }
1796}
1797
1798void GetLightModelParameters(const GLES1State *state, GLenum pname, GLfloat *params)
1799{
1800 const LightModelParameters &lightModel = state->lightModelParameters();
1801
1802 switch (pname)
1803 {
1804 case GL_LIGHT_MODEL_TWO_SIDE:
1805 *params = lightModel.twoSided ? 1.0f : 0.0f;
1806 break;
1807 case GL_LIGHT_MODEL_AMBIENT:
1808 lightModel.color.writeData(params);
1809 break;
1810 default:
1811 break;
1812 }
1813}
1814
1815bool IsLightModelTwoSided(const GLES1State *state)
1816{
1817 return state->lightModelParameters().twoSided;
1818}
1819
1820void SetLightParameters(GLES1State *state,
1821 GLenum light,
1822 LightParameter pname,
1823 const GLfloat *params)
1824{
1825 uint32_t lightIndex = light - GL_LIGHT0;
1826
1827 LightParameters &lightParams = state->lightParameters(lightIndex);
1828
1829 switch (pname)
1830 {
1831 case LightParameter::Ambient:
1832 lightParams.ambient = ColorF::fromData(params);
1833 break;
1834 case LightParameter::Diffuse:
1835 lightParams.diffuse = ColorF::fromData(params);
1836 break;
1837 case LightParameter::Specular:
1838 lightParams.specular = ColorF::fromData(params);
1839 break;
1840 case LightParameter::Position:
1841 {
1842 angle::Mat4 mv = state->getModelviewMatrix();
1843 angle::Vector4 transformedPos =
1844 mv.product(angle::Vector4(params[0], params[1], params[2], params[3]));
1845 lightParams.position[0] = transformedPos[0];
1846 lightParams.position[1] = transformedPos[1];
1847 lightParams.position[2] = transformedPos[2];
1848 lightParams.position[3] = transformedPos[3];
1849 }
1850 break;
1851 case LightParameter::SpotDirection:
1852 {
1853 angle::Mat4 mv = state->getModelviewMatrix();
1854 angle::Vector4 transformedPos =
1855 mv.product(angle::Vector4(params[0], params[1], params[2], 0.0f));
1856 lightParams.direction[0] = transformedPos[0];
1857 lightParams.direction[1] = transformedPos[1];
1858 lightParams.direction[2] = transformedPos[2];
1859 }
1860 break;
1861 case LightParameter::SpotExponent:
1862 lightParams.spotlightExponent = *params;
1863 break;
1864 case LightParameter::SpotCutoff:
1865 lightParams.spotlightCutoffAngle = *params;
1866 break;
1867 case LightParameter::ConstantAttenuation:
1868 lightParams.attenuationConst = *params;
1869 break;
1870 case LightParameter::LinearAttenuation:
1871 lightParams.attenuationLinear = *params;
1872 break;
1873 case LightParameter::QuadraticAttenuation:
1874 lightParams.attenuationQuadratic = *params;
1875 break;
1876 default:
1877 return;
1878 }
1879}
1880
1881void GetLightParameters(const GLES1State *state,
1882 GLenum light,
1883 LightParameter pname,
1884 GLfloat *params)
1885{
1886 uint32_t lightIndex = light - GL_LIGHT0;
1887 const LightParameters &lightParams = state->lightParameters(lightIndex);
1888
1889 switch (pname)
1890 {
1891 case LightParameter::Ambient:
1892 lightParams.ambient.writeData(params);
1893 break;
1894 case LightParameter::Diffuse:
1895 lightParams.diffuse.writeData(params);
1896 break;
1897 case LightParameter::Specular:
1898 lightParams.specular.writeData(params);
1899 break;
1900 case LightParameter::Position:
1901 memcpy(params, lightParams.position.data(), 4 * sizeof(GLfloat));
1902 break;
1903 case LightParameter::SpotDirection:
1904 memcpy(params, lightParams.direction.data(), 3 * sizeof(GLfloat));
1905 break;
1906 case LightParameter::SpotExponent:
1907 *params = lightParams.spotlightExponent;
1908 break;
1909 case LightParameter::SpotCutoff:
1910 *params = lightParams.spotlightCutoffAngle;
1911 break;
1912 case LightParameter::ConstantAttenuation:
1913 *params = lightParams.attenuationConst;
1914 break;
1915 case LightParameter::LinearAttenuation:
1916 *params = lightParams.attenuationLinear;
1917 break;
1918 case LightParameter::QuadraticAttenuation:
1919 *params = lightParams.attenuationQuadratic;
1920 break;
1921 default:
1922 break;
1923 }
1924}
1925
1926void SetMaterialParameters(GLES1State *state,
1927 GLenum face,
1928 MaterialParameter pname,
1929 const GLfloat *params)
1930{
1931 MaterialParameters &material = state->materialParameters();
1932 switch (pname)
1933 {
1934 case MaterialParameter::Ambient:
1935 material.ambient = ColorF::fromData(params);
1936 break;
1937 case MaterialParameter::Diffuse:
1938 material.diffuse = ColorF::fromData(params);
1939 break;
1940 case MaterialParameter::AmbientAndDiffuse:
1941 material.ambient = ColorF::fromData(params);
1942 material.diffuse = ColorF::fromData(params);
1943 break;
1944 case MaterialParameter::Specular:
1945 material.specular = ColorF::fromData(params);
1946 break;
1947 case MaterialParameter::Emission:
1948 material.emissive = ColorF::fromData(params);
1949 break;
1950 case MaterialParameter::Shininess:
1951 material.specularExponent = *params;
1952 break;
1953 default:
1954 return;
1955 }
1956}
1957
1958void GetMaterialParameters(const GLES1State *state,
1959 GLenum face,
1960 MaterialParameter pname,
1961 GLfloat *params)
1962{
1963 const ColorF &currentColor = state->getCurrentColor();
1964 const MaterialParameters &material = state->materialParameters();
1965 const bool colorMaterialEnabled = state->isColorMaterialEnabled();
1966
1967 switch (pname)
1968 {
1969 case MaterialParameter::Ambient:
1970 if (colorMaterialEnabled)
1971 {
1972 currentColor.writeData(params);
1973 }
1974 else
1975 {
1976 material.ambient.writeData(params);
1977 }
1978 break;
1979 case MaterialParameter::Diffuse:
1980 if (colorMaterialEnabled)
1981 {
1982 currentColor.writeData(params);
1983 }
1984 else
1985 {
1986 material.diffuse.writeData(params);
1987 }
1988 break;
1989 case MaterialParameter::Specular:
1990 material.specular.writeData(params);
1991 break;
1992 case MaterialParameter::Emission:
1993 material.emissive.writeData(params);
1994 break;
1995 case MaterialParameter::Shininess:
1996 *params = material.specularExponent;
1997 break;
1998 default:
1999 return;
2000 }
2001}
2002
2003unsigned int GetLightModelParameterCount(GLenum pname)
2004{
2005 switch (pname)
2006 {
2007 case GL_LIGHT_MODEL_AMBIENT:
2008 return 4;
2009 case GL_LIGHT_MODEL_TWO_SIDE:
2010 return 1;
2011 default:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07002012 return 0;
2013 }
2014}
2015
2016unsigned int GetLightParameterCount(LightParameter pname)
2017{
2018 switch (pname)
2019 {
2020 case LightParameter::Ambient:
2021 case LightParameter::Diffuse:
2022 case LightParameter::Specular:
2023 case LightParameter::Position:
2024 return 4;
2025 case LightParameter::SpotDirection:
2026 return 3;
2027 case LightParameter::SpotExponent:
2028 case LightParameter::SpotCutoff:
2029 case LightParameter::ConstantAttenuation:
2030 case LightParameter::LinearAttenuation:
2031 case LightParameter::QuadraticAttenuation:
2032 return 1;
2033 default:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07002034 return 0;
2035 }
2036}
2037
2038unsigned int GetMaterialParameterCount(MaterialParameter pname)
2039{
2040 switch (pname)
2041 {
2042 case MaterialParameter::Ambient:
2043 case MaterialParameter::Diffuse:
2044 case MaterialParameter::Specular:
2045 case MaterialParameter::Emission:
2046 return 4;
2047 case MaterialParameter::Shininess:
2048 return 1;
2049 default:
Lingfeng Yangd0febe72018-05-17 22:36:52 -07002050 return 0;
2051 }
2052}
2053
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07002054void SetFogParameters(GLES1State *state, GLenum pname, const GLfloat *params)
2055{
2056 FogParameters &fog = state->fogParameters();
2057 switch (pname)
2058 {
2059 case GL_FOG_MODE:
2060 fog.mode = FromGLenum<FogMode>(static_cast<GLenum>(params[0]));
2061 break;
2062 case GL_FOG_DENSITY:
2063 fog.density = params[0];
2064 break;
2065 case GL_FOG_START:
2066 fog.start = params[0];
2067 break;
2068 case GL_FOG_END:
2069 fog.end = params[0];
2070 break;
2071 case GL_FOG_COLOR:
2072 fog.color = ColorF::fromData(params);
2073 break;
2074 default:
2075 return;
2076 }
2077}
2078
2079void GetFogParameters(const GLES1State *state, GLenum pname, GLfloat *params)
2080{
2081 const FogParameters &fog = state->fogParameters();
2082 switch (pname)
2083 {
2084 case GL_FOG_MODE:
2085 params[0] = static_cast<GLfloat>(ToGLenum(fog.mode));
2086 break;
2087 case GL_FOG_DENSITY:
2088 params[0] = fog.density;
2089 break;
2090 case GL_FOG_START:
2091 params[0] = fog.start;
2092 break;
2093 case GL_FOG_END:
2094 params[0] = fog.end;
2095 break;
2096 case GL_FOG_COLOR:
2097 fog.color.writeData(params);
2098 break;
2099 default:
2100 return;
2101 }
2102}
2103
2104unsigned int GetFogParameterCount(GLenum pname)
2105{
2106 switch (pname)
2107 {
2108 case GL_FOG_MODE:
2109 case GL_FOG_DENSITY:
2110 case GL_FOG_START:
2111 case GL_FOG_END:
2112 return 1;
2113 case GL_FOG_COLOR:
2114 return 4;
2115 default:
2116 return 0;
2117 }
2118}
2119
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002120unsigned int GetTextureEnvParameterCount(TextureEnvParameter pname)
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07002121{
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002122 switch (pname)
2123 {
2124 case TextureEnvParameter::Mode:
2125 case TextureEnvParameter::CombineRgb:
2126 case TextureEnvParameter::CombineAlpha:
2127 case TextureEnvParameter::Src0Rgb:
2128 case TextureEnvParameter::Src1Rgb:
2129 case TextureEnvParameter::Src2Rgb:
2130 case TextureEnvParameter::Src0Alpha:
2131 case TextureEnvParameter::Src1Alpha:
2132 case TextureEnvParameter::Src2Alpha:
2133 case TextureEnvParameter::Op0Rgb:
2134 case TextureEnvParameter::Op1Rgb:
2135 case TextureEnvParameter::Op2Rgb:
2136 case TextureEnvParameter::Op0Alpha:
2137 case TextureEnvParameter::Op1Alpha:
2138 case TextureEnvParameter::Op2Alpha:
2139 case TextureEnvParameter::RgbScale:
2140 case TextureEnvParameter::AlphaScale:
2141 return 1;
2142 case TextureEnvParameter::Color:
2143 return 4;
2144 default:
2145 return 0;
2146 }
2147}
2148
2149void ConvertTextureEnvFromInt(TextureEnvParameter pname, const GLint *input, GLfloat *output)
2150{
2151 if (IsTextureEnvEnumParameter(pname))
2152 {
2153 ConvertGLenumValue(input[0], output);
2154 return;
2155 }
2156
2157 switch (pname)
2158 {
2159 case TextureEnvParameter::RgbScale:
2160 case TextureEnvParameter::AlphaScale:
2161 output[0] = static_cast<GLfloat>(input[0]);
2162 break;
2163 case TextureEnvParameter::Color:
2164 for (int i = 0; i < 4; i++)
2165 {
2166 output[i] = input[i] / 255.0f;
2167 }
2168 break;
2169 default:
2170 UNREACHABLE();
2171 break;
2172 }
2173}
2174
2175void ConvertTextureEnvFromFixed(TextureEnvParameter pname, const GLfixed *input, GLfloat *output)
2176{
2177 if (IsTextureEnvEnumParameter(pname))
2178 {
2179 ConvertGLenumValue(input[0], output);
2180 return;
2181 }
2182
2183 switch (pname)
2184 {
2185 case TextureEnvParameter::RgbScale:
2186 case TextureEnvParameter::AlphaScale:
2187 output[0] = FixedToFloat(input[0]);
2188 break;
2189 case TextureEnvParameter::Color:
2190 for (int i = 0; i < 4; i++)
2191 {
2192 output[i] = FixedToFloat(input[i]);
2193 }
2194 break;
2195 break;
2196 default:
2197 UNREACHABLE();
2198 break;
2199 }
2200}
2201
2202void ConvertTextureEnvToInt(TextureEnvParameter pname, const GLfloat *input, GLint *output)
2203{
2204 if (IsTextureEnvEnumParameter(pname))
2205 {
2206 ConvertGLenumValue(input[0], output);
2207 return;
2208 }
2209
2210 switch (pname)
2211 {
2212 case TextureEnvParameter::RgbScale:
2213 case TextureEnvParameter::AlphaScale:
2214 output[0] = static_cast<GLint>(input[0]);
2215 break;
2216 case TextureEnvParameter::Color:
2217 for (int i = 0; i < 4; i++)
2218 {
2219 output[i] = static_cast<GLint>(input[i] * 255.0f);
2220 }
2221 break;
2222 default:
2223 UNREACHABLE();
2224 break;
2225 }
2226}
2227
2228void ConvertTextureEnvToFixed(TextureEnvParameter pname, const GLfloat *input, GLfixed *output)
2229{
2230 if (IsTextureEnvEnumParameter(pname))
2231 {
2232 ConvertGLenumValue(input[0], output);
2233 return;
2234 }
2235
2236 switch (pname)
2237 {
2238 case TextureEnvParameter::RgbScale:
2239 case TextureEnvParameter::AlphaScale:
2240 output[0] = FloatToFixed(input[0]);
2241 break;
2242 case TextureEnvParameter::Color:
2243 for (int i = 0; i < 4; i++)
2244 {
2245 output[i] = FloatToFixed(input[i]);
2246 }
2247 break;
2248 default:
2249 UNREACHABLE();
2250 break;
2251 }
2252}
2253
2254void SetTextureEnv(unsigned int unit,
2255 GLES1State *state,
2256 TextureEnvTarget target,
2257 TextureEnvParameter pname,
2258 const GLfloat *params)
2259{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002260 TextureEnvironmentParameters &env = state->textureEnvironment(unit);
2261 GLenum asEnum = ConvertToGLenum(params[0]);
2262
2263 switch (target)
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002264 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002265 case TextureEnvTarget::Env:
2266 switch (pname)
2267 {
2268 case TextureEnvParameter::Mode:
2269 env.mode = FromGLenum<TextureEnvMode>(asEnum);
2270 break;
2271 case TextureEnvParameter::CombineRgb:
2272 env.combineRgb = FromGLenum<TextureCombine>(asEnum);
2273 break;
2274 case TextureEnvParameter::CombineAlpha:
2275 env.combineAlpha = FromGLenum<TextureCombine>(asEnum);
2276 break;
2277 case TextureEnvParameter::Src0Rgb:
2278 env.src0Rgb = FromGLenum<TextureSrc>(asEnum);
2279 break;
2280 case TextureEnvParameter::Src1Rgb:
2281 env.src1Rgb = FromGLenum<TextureSrc>(asEnum);
2282 break;
2283 case TextureEnvParameter::Src2Rgb:
2284 env.src2Rgb = FromGLenum<TextureSrc>(asEnum);
2285 break;
2286 case TextureEnvParameter::Src0Alpha:
2287 env.src0Alpha = FromGLenum<TextureSrc>(asEnum);
2288 break;
2289 case TextureEnvParameter::Src1Alpha:
2290 env.src1Alpha = FromGLenum<TextureSrc>(asEnum);
2291 break;
2292 case TextureEnvParameter::Src2Alpha:
2293 env.src2Alpha = FromGLenum<TextureSrc>(asEnum);
2294 break;
2295 case TextureEnvParameter::Op0Rgb:
2296 env.op0Rgb = FromGLenum<TextureOp>(asEnum);
2297 break;
2298 case TextureEnvParameter::Op1Rgb:
2299 env.op1Rgb = FromGLenum<TextureOp>(asEnum);
2300 break;
2301 case TextureEnvParameter::Op2Rgb:
2302 env.op2Rgb = FromGLenum<TextureOp>(asEnum);
2303 break;
2304 case TextureEnvParameter::Op0Alpha:
2305 env.op0Alpha = FromGLenum<TextureOp>(asEnum);
2306 break;
2307 case TextureEnvParameter::Op1Alpha:
2308 env.op1Alpha = FromGLenum<TextureOp>(asEnum);
2309 break;
2310 case TextureEnvParameter::Op2Alpha:
2311 env.op2Alpha = FromGLenum<TextureOp>(asEnum);
2312 break;
2313 case TextureEnvParameter::Color:
2314 env.color = ColorF::fromData(params);
2315 break;
2316 case TextureEnvParameter::RgbScale:
2317 env.rgbScale = params[0];
2318 break;
2319 case TextureEnvParameter::AlphaScale:
2320 env.alphaScale = params[0];
2321 break;
2322 default:
2323 UNREACHABLE();
2324 break;
2325 }
2326 break;
2327 case TextureEnvTarget::PointSprite:
2328 switch (pname)
2329 {
2330 case TextureEnvParameter::PointCoordReplace:
2331 env.pointSpriteCoordReplace = static_cast<bool>(params[0]);
2332 break;
2333 default:
2334 UNREACHABLE();
2335 break;
2336 }
2337 break;
2338 default:
2339 UNREACHABLE();
2340 break;
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002341 }
2342}
2343
2344void GetTextureEnv(unsigned int unit,
2345 const GLES1State *state,
2346 TextureEnvTarget target,
2347 TextureEnvParameter pname,
2348 GLfloat *params)
2349{
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002350 const TextureEnvironmentParameters &env = state->textureEnvironment(unit);
2351
2352 switch (target)
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002353 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002354 case TextureEnvTarget::Env:
2355 switch (pname)
2356 {
2357 case TextureEnvParameter::Mode:
2358 ConvertPackedEnum(env.mode, params);
2359 break;
2360 case TextureEnvParameter::CombineRgb:
2361 ConvertPackedEnum(env.combineRgb, params);
2362 break;
2363 case TextureEnvParameter::CombineAlpha:
2364 ConvertPackedEnum(env.combineAlpha, params);
2365 break;
2366 case TextureEnvParameter::Src0Rgb:
2367 ConvertPackedEnum(env.src0Rgb, params);
2368 break;
2369 case TextureEnvParameter::Src1Rgb:
2370 ConvertPackedEnum(env.src1Rgb, params);
2371 break;
2372 case TextureEnvParameter::Src2Rgb:
2373 ConvertPackedEnum(env.src2Rgb, params);
2374 break;
2375 case TextureEnvParameter::Src0Alpha:
2376 ConvertPackedEnum(env.src0Alpha, params);
2377 break;
2378 case TextureEnvParameter::Src1Alpha:
2379 ConvertPackedEnum(env.src1Alpha, params);
2380 break;
2381 case TextureEnvParameter::Src2Alpha:
2382 ConvertPackedEnum(env.src2Alpha, params);
2383 break;
2384 case TextureEnvParameter::Op0Rgb:
2385 ConvertPackedEnum(env.op0Rgb, params);
2386 break;
2387 case TextureEnvParameter::Op1Rgb:
2388 ConvertPackedEnum(env.op1Rgb, params);
2389 break;
2390 case TextureEnvParameter::Op2Rgb:
2391 ConvertPackedEnum(env.op2Rgb, params);
2392 break;
2393 case TextureEnvParameter::Op0Alpha:
2394 ConvertPackedEnum(env.op0Alpha, params);
2395 break;
2396 case TextureEnvParameter::Op1Alpha:
2397 ConvertPackedEnum(env.op1Alpha, params);
2398 break;
2399 case TextureEnvParameter::Op2Alpha:
2400 ConvertPackedEnum(env.op2Alpha, params);
2401 break;
2402 case TextureEnvParameter::Color:
2403 env.color.writeData(params);
2404 break;
2405 case TextureEnvParameter::RgbScale:
2406 *params = env.rgbScale;
2407 break;
2408 case TextureEnvParameter::AlphaScale:
2409 *params = env.alphaScale;
2410 break;
2411 default:
2412 UNREACHABLE();
2413 break;
2414 }
2415 break;
2416 case TextureEnvTarget::PointSprite:
2417 switch (pname)
2418 {
2419 case TextureEnvParameter::PointCoordReplace:
2420 *params = static_cast<GLfloat>(env.pointSpriteCoordReplace);
2421 break;
2422 default:
2423 UNREACHABLE();
2424 break;
2425 }
2426 break;
2427 default:
2428 UNREACHABLE();
2429 break;
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002430 }
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002431}
2432
2433unsigned int GetPointParameterCount(PointParameter pname)
2434{
2435 switch (pname)
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002436 {
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002437 case PointParameter::PointSizeMin:
2438 case PointParameter::PointSizeMax:
2439 case PointParameter::PointFadeThresholdSize:
2440 return 1;
2441 case PointParameter::PointDistanceAttenuation:
2442 return 3;
2443 default:
2444 return 0;
Lingfeng Yang45b5a872018-06-07 11:33:25 -07002445 }
Lingfeng Yang7ba3f422018-06-01 09:43:04 -07002446}
2447
Lingfeng Yang9c4c0922018-06-13 09:29:00 -07002448void SetPointParameter(GLES1State *state, PointParameter pname, const GLfloat *params)
2449{
2450
2451 PointParameters &pointParams = state->pointParameters();
2452
2453 switch (pname)
2454 {
2455 case PointParameter::PointSizeMin:
2456 pointParams.pointSizeMin = params[0];
2457 break;
2458 case PointParameter::PointSizeMax:
2459 pointParams.pointSizeMax = params[0];
2460 break;
2461 case PointParameter::PointFadeThresholdSize:
2462 pointParams.pointFadeThresholdSize = params[0];
2463 break;
2464 case PointParameter::PointDistanceAttenuation:
2465 for (unsigned int i = 0; i < 3; i++)
2466 {
2467 pointParams.pointDistanceAttenuation[i] = params[i];
2468 }
2469 break;
2470 default:
2471 UNREACHABLE();
2472 }
2473}
2474
2475void GetPointParameter(const GLES1State *state, PointParameter pname, GLfloat *params)
2476{
2477 const PointParameters &pointParams = state->pointParameters();
2478
2479 switch (pname)
2480 {
2481 case PointParameter::PointSizeMin:
2482 params[0] = pointParams.pointSizeMin;
2483 break;
2484 case PointParameter::PointSizeMax:
2485 params[0] = pointParams.pointSizeMax;
2486 break;
2487 case PointParameter::PointFadeThresholdSize:
2488 params[0] = pointParams.pointFadeThresholdSize;
2489 break;
2490 case PointParameter::PointDistanceAttenuation:
2491 for (unsigned int i = 0; i < 3; i++)
2492 {
2493 params[i] = pointParams.pointDistanceAttenuation[i];
2494 }
2495 break;
2496 default:
2497 UNREACHABLE();
2498 }
2499}
2500
2501void SetPointSize(GLES1State *state, GLfloat size)
2502{
2503 PointParameters &params = state->pointParameters();
2504 params.pointSize = size;
2505}
2506
2507void GetPointSize(GLES1State *state, GLfloat *sizeOut)
2508{
2509 const PointParameters &params = state->pointParameters();
2510 *sizeOut = params.pointSize;
2511}
2512
Geoff Lang65603eb2017-01-12 16:48:03 -05002513} // namespace gl
2514
2515namespace egl
2516{
2517
2518void QueryConfigAttrib(const Config *config, EGLint attribute, EGLint *value)
2519{
2520 ASSERT(config != nullptr);
2521 switch (attribute)
2522 {
2523 case EGL_BUFFER_SIZE:
2524 *value = config->bufferSize;
2525 break;
2526 case EGL_ALPHA_SIZE:
2527 *value = config->alphaSize;
2528 break;
2529 case EGL_BLUE_SIZE:
2530 *value = config->blueSize;
2531 break;
2532 case EGL_GREEN_SIZE:
2533 *value = config->greenSize;
2534 break;
2535 case EGL_RED_SIZE:
2536 *value = config->redSize;
2537 break;
2538 case EGL_DEPTH_SIZE:
2539 *value = config->depthSize;
2540 break;
2541 case EGL_STENCIL_SIZE:
2542 *value = config->stencilSize;
2543 break;
2544 case EGL_CONFIG_CAVEAT:
2545 *value = config->configCaveat;
2546 break;
2547 case EGL_CONFIG_ID:
2548 *value = config->configID;
2549 break;
2550 case EGL_LEVEL:
2551 *value = config->level;
2552 break;
2553 case EGL_NATIVE_RENDERABLE:
2554 *value = config->nativeRenderable;
2555 break;
2556 case EGL_NATIVE_VISUAL_ID:
2557 *value = config->nativeVisualID;
2558 break;
2559 case EGL_NATIVE_VISUAL_TYPE:
2560 *value = config->nativeVisualType;
2561 break;
2562 case EGL_SAMPLES:
2563 *value = config->samples;
2564 break;
2565 case EGL_SAMPLE_BUFFERS:
2566 *value = config->sampleBuffers;
2567 break;
2568 case EGL_SURFACE_TYPE:
2569 *value = config->surfaceType;
2570 break;
2571 case EGL_TRANSPARENT_TYPE:
2572 *value = config->transparentType;
2573 break;
2574 case EGL_TRANSPARENT_BLUE_VALUE:
2575 *value = config->transparentBlueValue;
2576 break;
2577 case EGL_TRANSPARENT_GREEN_VALUE:
2578 *value = config->transparentGreenValue;
2579 break;
2580 case EGL_TRANSPARENT_RED_VALUE:
2581 *value = config->transparentRedValue;
2582 break;
2583 case EGL_BIND_TO_TEXTURE_RGB:
2584 *value = config->bindToTextureRGB;
2585 break;
2586 case EGL_BIND_TO_TEXTURE_RGBA:
2587 *value = config->bindToTextureRGBA;
2588 break;
2589 case EGL_MIN_SWAP_INTERVAL:
2590 *value = config->minSwapInterval;
2591 break;
2592 case EGL_MAX_SWAP_INTERVAL:
2593 *value = config->maxSwapInterval;
2594 break;
2595 case EGL_LUMINANCE_SIZE:
2596 *value = config->luminanceSize;
2597 break;
2598 case EGL_ALPHA_MASK_SIZE:
2599 *value = config->alphaMaskSize;
2600 break;
2601 case EGL_COLOR_BUFFER_TYPE:
2602 *value = config->colorBufferType;
2603 break;
2604 case EGL_RENDERABLE_TYPE:
2605 *value = config->renderableType;
2606 break;
2607 case EGL_MATCH_NATIVE_PIXMAP:
2608 *value = false;
2609 UNIMPLEMENTED();
2610 break;
2611 case EGL_CONFORMANT:
2612 *value = config->conformant;
2613 break;
2614 case EGL_MAX_PBUFFER_WIDTH:
2615 *value = config->maxPBufferWidth;
2616 break;
2617 case EGL_MAX_PBUFFER_HEIGHT:
2618 *value = config->maxPBufferHeight;
2619 break;
2620 case EGL_MAX_PBUFFER_PIXELS:
2621 *value = config->maxPBufferPixels;
2622 break;
2623 case EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE:
2624 *value = config->optimalOrientation;
2625 break;
Geoff Langc5a2a172017-01-13 15:55:07 -05002626 case EGL_COLOR_COMPONENT_TYPE_EXT:
2627 *value = config->colorComponentType;
2628 break;
Geoff Lang65603eb2017-01-12 16:48:03 -05002629 default:
2630 UNREACHABLE();
2631 break;
2632 }
Geoff Langff5b2d52016-09-07 11:32:23 -04002633}
Geoff Lang65603eb2017-01-12 16:48:03 -05002634
Geoff Langaf143fe2017-10-05 13:59:43 -04002635void QueryContextAttrib(const gl::Context *context, EGLint attribute, EGLint *value)
2636{
2637 switch (attribute)
2638 {
2639 case EGL_CONFIG_ID:
2640 *value = context->getConfig()->configID;
2641 break;
2642 case EGL_CONTEXT_CLIENT_TYPE:
2643 *value = context->getClientType();
2644 break;
2645 case EGL_CONTEXT_CLIENT_VERSION:
2646 *value = context->getClientMajorVersion();
2647 break;
2648 case EGL_RENDER_BUFFER:
2649 *value = context->getRenderBuffer();
2650 break;
Geoff Langb433e872017-10-05 14:01:47 -04002651 case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
2652 *value = context->isRobustResourceInitEnabled();
2653 break;
Geoff Langaf143fe2017-10-05 13:59:43 -04002654 default:
2655 UNREACHABLE();
2656 break;
2657 }
2658}
2659
Geoff Lang31ecbd72017-07-26 13:01:27 -04002660void QuerySurfaceAttrib(const Surface *surface, EGLint attribute, EGLint *value)
2661{
2662 switch (attribute)
2663 {
2664 case EGL_GL_COLORSPACE:
Geoff Lang40ac7832017-07-26 14:38:46 -04002665 *value = surface->getGLColorspace();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002666 break;
2667 case EGL_VG_ALPHA_FORMAT:
Geoff Lang40ac7832017-07-26 14:38:46 -04002668 *value = surface->getVGAlphaFormat();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002669 break;
2670 case EGL_VG_COLORSPACE:
Geoff Lang40ac7832017-07-26 14:38:46 -04002671 *value = surface->getVGColorspace();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002672 break;
2673 case EGL_CONFIG_ID:
2674 *value = surface->getConfig()->configID;
2675 break;
2676 case EGL_HEIGHT:
2677 *value = surface->getHeight();
2678 break;
2679 case EGL_HORIZONTAL_RESOLUTION:
Geoff Lang40ac7832017-07-26 14:38:46 -04002680 *value = surface->getHorizontalResolution();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002681 break;
2682 case EGL_LARGEST_PBUFFER:
Geoff Lang40ac7832017-07-26 14:38:46 -04002683 // The EGL spec states that value is not written if the surface is not a pbuffer
2684 if (surface->getType() == EGL_PBUFFER_BIT)
2685 {
2686 *value = surface->getLargestPbuffer();
2687 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04002688 break;
2689 case EGL_MIPMAP_TEXTURE:
Geoff Lang40ac7832017-07-26 14:38:46 -04002690 // The EGL spec states that value is not written if the surface is not a pbuffer
2691 if (surface->getType() == EGL_PBUFFER_BIT)
2692 {
2693 *value = surface->getMipmapTexture();
2694 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04002695 break;
2696 case EGL_MIPMAP_LEVEL:
Geoff Lang40ac7832017-07-26 14:38:46 -04002697 // The EGL spec states that value is not written if the surface is not a pbuffer
2698 if (surface->getType() == EGL_PBUFFER_BIT)
2699 {
2700 *value = surface->getMipmapLevel();
2701 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04002702 break;
2703 case EGL_MULTISAMPLE_RESOLVE:
Geoff Lang40ac7832017-07-26 14:38:46 -04002704 *value = surface->getMultisampleResolve();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002705 break;
2706 case EGL_PIXEL_ASPECT_RATIO:
2707 *value = surface->getPixelAspectRatio();
2708 break;
2709 case EGL_RENDER_BUFFER:
2710 *value = surface->getRenderBuffer();
2711 break;
2712 case EGL_SWAP_BEHAVIOR:
2713 *value = surface->getSwapBehavior();
2714 break;
2715 case EGL_TEXTURE_FORMAT:
Geoff Lang40ac7832017-07-26 14:38:46 -04002716 // The EGL spec states that value is not written if the surface is not a pbuffer
2717 if (surface->getType() == EGL_PBUFFER_BIT)
2718 {
Geoff Lang8ceea812018-04-10 03:07:13 -04002719 *value = ToEGLenum(surface->getTextureFormat());
Geoff Lang40ac7832017-07-26 14:38:46 -04002720 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04002721 break;
2722 case EGL_TEXTURE_TARGET:
Geoff Lang40ac7832017-07-26 14:38:46 -04002723 // The EGL spec states that value is not written if the surface is not a pbuffer
2724 if (surface->getType() == EGL_PBUFFER_BIT)
2725 {
2726 *value = surface->getTextureTarget();
2727 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04002728 break;
2729 case EGL_VERTICAL_RESOLUTION:
Geoff Lang40ac7832017-07-26 14:38:46 -04002730 *value = surface->getVerticalResolution();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002731 break;
2732 case EGL_WIDTH:
2733 *value = surface->getWidth();
2734 break;
2735 case EGL_POST_SUB_BUFFER_SUPPORTED_NV:
2736 *value = surface->isPostSubBufferSupported();
2737 break;
2738 case EGL_FIXED_SIZE_ANGLE:
2739 *value = surface->isFixedSize();
2740 break;
2741 case EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE:
2742 *value = surface->flexibleSurfaceCompatibilityRequested();
2743 break;
2744 case EGL_SURFACE_ORIENTATION_ANGLE:
2745 *value = surface->getOrientation();
2746 break;
2747 case EGL_DIRECT_COMPOSITION_ANGLE:
2748 *value = surface->directComposition();
2749 break;
Geoff Langb433e872017-10-05 14:01:47 -04002750 case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
2751 *value = surface->isRobustResourceInitEnabled();
2752 break;
Geoff Lang31ecbd72017-07-26 13:01:27 -04002753 default:
2754 UNREACHABLE();
2755 break;
2756 }
2757}
2758
2759void SetSurfaceAttrib(Surface *surface, EGLint attribute, EGLint value)
2760{
2761 switch (attribute)
2762 {
2763 case EGL_MIPMAP_LEVEL:
Geoff Lang40ac7832017-07-26 14:38:46 -04002764 surface->setMipmapLevel(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04002765 break;
2766 case EGL_MULTISAMPLE_RESOLVE:
Geoff Lang40ac7832017-07-26 14:38:46 -04002767 surface->setMultisampleResolve(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04002768 break;
2769 case EGL_SWAP_BEHAVIOR:
Geoff Lang40ac7832017-07-26 14:38:46 -04002770 surface->setSwapBehavior(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04002771 break;
2772 default:
2773 UNREACHABLE();
2774 break;
2775 }
2776}
2777
Geoff Lang65603eb2017-01-12 16:48:03 -05002778} // namespace egl