blob: 807bceb66fc9733a39bcb40eeccad36f527eec9a [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
Geoff Langc1984ed2016-10-07 12:41:00 -0400801} // anonymous namespace
802
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -0800803void QueryFramebufferAttachmentParameteriv(const Context *context,
804 const Framebuffer *framebuffer,
Geoff Langff5b2d52016-09-07 11:32:23 -0400805 GLenum attachment,
806 GLenum pname,
807 GLint *params)
808{
809 ASSERT(framebuffer);
810
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -0800811 const FramebufferAttachment *attachmentObject = framebuffer->getAttachment(context, attachment);
812
Geoff Langff5b2d52016-09-07 11:32:23 -0400813 if (attachmentObject == nullptr)
814 {
815 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
816 // is NONE, then querying any other pname will generate INVALID_ENUM.
817
818 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
819 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
820 // INVALID_OPERATION for all other pnames
821
822 switch (pname)
823 {
824 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
825 *params = GL_NONE;
826 break;
827
828 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
829 *params = 0;
830 break;
831
832 default:
833 UNREACHABLE();
834 break;
835 }
836
837 return;
838 }
839
840 switch (pname)
841 {
842 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
843 *params = attachmentObject->type();
844 break;
845
846 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
847 *params = attachmentObject->id();
848 break;
849
850 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
851 *params = attachmentObject->mipLevel();
852 break;
853
854 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
Corentin Wallez99d492c2018-02-27 15:17:10 -0500855 {
856 TextureTarget face = attachmentObject->cubeMapFace();
857 if (face != TextureTarget::InvalidEnum)
858 {
859 *params = ToGLenum(attachmentObject->cubeMapFace());
860 }
861 else
862 {
863 // This happens when the attachment isn't a texture cube map face
864 *params = GL_NONE;
865 }
866 }
867 break;
Geoff Langff5b2d52016-09-07 11:32:23 -0400868
869 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
870 *params = attachmentObject->getRedSize();
871 break;
872
873 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
874 *params = attachmentObject->getGreenSize();
875 break;
876
877 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
878 *params = attachmentObject->getBlueSize();
879 break;
880
881 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
882 *params = attachmentObject->getAlphaSize();
883 break;
884
885 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
886 *params = attachmentObject->getDepthSize();
887 break;
888
889 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
890 *params = attachmentObject->getStencilSize();
891 break;
892
893 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
894 *params = attachmentObject->getComponentType();
895 break;
896
897 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
898 *params = attachmentObject->getColorEncoding();
899 break;
900
901 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
902 *params = attachmentObject->layer();
903 break;
904
Martin Radeve5285d22017-07-14 16:23:53 +0300905 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_ANGLE:
906 *params = attachmentObject->getNumViews();
907 break;
908
909 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_MULTIVIEW_LAYOUT_ANGLE:
910 *params = static_cast<GLint>(attachmentObject->getMultiviewLayout());
911 break;
912
913 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_ANGLE:
914 *params = attachmentObject->getBaseViewIndex();
915 break;
916
917 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_VIEWPORT_OFFSETS_ANGLE:
918 {
919 const std::vector<Offset> &offsets = attachmentObject->getMultiviewViewportOffsets();
920 for (size_t i = 0u; i < offsets.size(); ++i)
921 {
922 params[i * 2u] = offsets[i].x;
923 params[i * 2u + 1u] = offsets[i].y;
924 }
925 }
926 break;
927
Geoff Langff5b2d52016-09-07 11:32:23 -0400928 default:
929 UNREACHABLE();
930 break;
931 }
932}
933
934void QueryBufferParameteriv(const Buffer *buffer, GLenum pname, GLint *params)
935{
Geoff Langebebe1c2016-10-14 12:01:31 -0400936 QueryBufferParameterBase(buffer, pname, params);
937}
Geoff Langff5b2d52016-09-07 11:32:23 -0400938
Geoff Langebebe1c2016-10-14 12:01:31 -0400939void QueryBufferParameteri64v(const Buffer *buffer, GLenum pname, GLint64 *params)
940{
941 QueryBufferParameterBase(buffer, pname, params);
Geoff Langff5b2d52016-09-07 11:32:23 -0400942}
943
Geoff Lang496c02d2016-10-20 11:38:11 -0700944void QueryBufferPointerv(const Buffer *buffer, GLenum pname, void **params)
945{
946 switch (pname)
947 {
948 case GL_BUFFER_MAP_POINTER:
949 *params = buffer->getMapPointer();
950 break;
951
952 default:
953 UNREACHABLE();
954 break;
955 }
956}
957
Jamie Madillffe00c02017-06-27 16:26:55 -0400958void QueryProgramiv(const Context *context, const Program *program, GLenum pname, GLint *params)
Geoff Langff5b2d52016-09-07 11:32:23 -0400959{
960 ASSERT(program != nullptr);
961
962 switch (pname)
963 {
964 case GL_DELETE_STATUS:
965 *params = program->isFlaggedForDeletion();
966 return;
967 case GL_LINK_STATUS:
968 *params = program->isLinked();
969 return;
970 case GL_VALIDATE_STATUS:
971 *params = program->isValidated();
972 return;
973 case GL_INFO_LOG_LENGTH:
974 *params = program->getInfoLogLength();
975 return;
976 case GL_ATTACHED_SHADERS:
977 *params = program->getAttachedShadersCount();
978 return;
979 case GL_ACTIVE_ATTRIBUTES:
980 *params = program->getActiveAttributeCount();
981 return;
982 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
983 *params = program->getActiveAttributeMaxLength();
984 return;
985 case GL_ACTIVE_UNIFORMS:
986 *params = program->getActiveUniformCount();
987 return;
988 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
989 *params = program->getActiveUniformMaxLength();
990 return;
991 case GL_PROGRAM_BINARY_LENGTH_OES:
Jamie Madillffe00c02017-06-27 16:26:55 -0400992 *params = program->getBinaryLength(context);
Geoff Langff5b2d52016-09-07 11:32:23 -0400993 return;
994 case GL_ACTIVE_UNIFORM_BLOCKS:
995 *params = program->getActiveUniformBlockCount();
996 return;
997 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
Qin Jiajia9bf55522018-01-29 13:56:23 +0800998 *params = program->getActiveUniformBlockMaxNameLength();
Geoff Langff5b2d52016-09-07 11:32:23 -0400999 break;
1000 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
1001 *params = program->getTransformFeedbackBufferMode();
1002 break;
1003 case GL_TRANSFORM_FEEDBACK_VARYINGS:
jchen10910a3da2017-11-15 09:40:11 +08001004 *params = clampCast<GLint>(program->getTransformFeedbackVaryingCount());
Geoff Langff5b2d52016-09-07 11:32:23 -04001005 break;
1006 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
1007 *params = program->getTransformFeedbackVaryingMaxLength();
1008 break;
1009 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
1010 *params = program->getBinaryRetrievableHint();
1011 break;
Yunchao He61afff12017-03-14 15:34:03 +08001012 case GL_PROGRAM_SEPARABLE:
1013 *params = program->isSeparable();
1014 break;
Xinghua Cao971f8502017-10-17 13:01:24 +08001015 case GL_COMPUTE_WORK_GROUP_SIZE:
1016 {
1017 const sh::WorkGroupSize &localSize = program->getComputeShaderLocalSize();
1018 params[0] = localSize[0];
1019 params[1] = localSize[1];
1020 params[2] = localSize[2];
1021 }
1022 break;
jchen1058f67be2017-10-27 08:59:27 +08001023 case GL_ACTIVE_ATOMIC_COUNTER_BUFFERS:
1024 *params = program->getActiveAtomicCounterBufferCount();
1025 break;
Jiawei Shao447bfac2018-03-14 14:23:40 +08001026 case GL_GEOMETRY_LINKED_INPUT_TYPE_EXT:
Jamie Madill493f9572018-05-24 19:52:15 -04001027 *params = ToGLenum(program->getGeometryShaderInputPrimitiveType());
Jiawei Shao447bfac2018-03-14 14:23:40 +08001028 break;
1029 case GL_GEOMETRY_LINKED_OUTPUT_TYPE_EXT:
Jamie Madill493f9572018-05-24 19:52:15 -04001030 *params = ToGLenum(program->getGeometryShaderOutputPrimitiveType());
Jiawei Shao447bfac2018-03-14 14:23:40 +08001031 break;
1032 case GL_GEOMETRY_LINKED_VERTICES_OUT_EXT:
1033 *params = program->getGeometryShaderMaxVertices();
1034 break;
1035 case GL_GEOMETRY_SHADER_INVOCATIONS_EXT:
1036 *params = program->getGeometryShaderInvocations();
1037 break;
Geoff Langff5b2d52016-09-07 11:32:23 -04001038 default:
1039 UNREACHABLE();
1040 break;
1041 }
1042}
Geoff Lang740d9022016-10-07 11:20:52 -04001043
Jamie Madill4e0e6f82017-02-17 11:06:03 -05001044void QueryRenderbufferiv(const Context *context,
1045 const Renderbuffer *renderbuffer,
1046 GLenum pname,
1047 GLint *params)
Geoff Lang740d9022016-10-07 11:20:52 -04001048{
1049 ASSERT(renderbuffer != nullptr);
1050
1051 switch (pname)
1052 {
1053 case GL_RENDERBUFFER_WIDTH:
1054 *params = renderbuffer->getWidth();
1055 break;
1056 case GL_RENDERBUFFER_HEIGHT:
1057 *params = renderbuffer->getHeight();
1058 break;
1059 case GL_RENDERBUFFER_INTERNAL_FORMAT:
Jamie Madill4e0e6f82017-02-17 11:06:03 -05001060 // Special case the WebGL 1 DEPTH_STENCIL format.
Jamie Madilla02315b2017-02-23 14:14:47 -05001061 if (context->isWebGL1() &&
Jamie Madill4e0e6f82017-02-17 11:06:03 -05001062 renderbuffer->getFormat().info->internalFormat == GL_DEPTH24_STENCIL8)
1063 {
1064 *params = GL_DEPTH_STENCIL;
1065 }
1066 else
1067 {
1068 *params = renderbuffer->getFormat().info->internalFormat;
1069 }
Geoff Lang740d9022016-10-07 11:20:52 -04001070 break;
1071 case GL_RENDERBUFFER_RED_SIZE:
1072 *params = renderbuffer->getRedSize();
1073 break;
1074 case GL_RENDERBUFFER_GREEN_SIZE:
1075 *params = renderbuffer->getGreenSize();
1076 break;
1077 case GL_RENDERBUFFER_BLUE_SIZE:
1078 *params = renderbuffer->getBlueSize();
1079 break;
1080 case GL_RENDERBUFFER_ALPHA_SIZE:
1081 *params = renderbuffer->getAlphaSize();
1082 break;
1083 case GL_RENDERBUFFER_DEPTH_SIZE:
1084 *params = renderbuffer->getDepthSize();
1085 break;
1086 case GL_RENDERBUFFER_STENCIL_SIZE:
1087 *params = renderbuffer->getStencilSize();
1088 break;
1089 case GL_RENDERBUFFER_SAMPLES_ANGLE:
1090 *params = renderbuffer->getSamples();
1091 break;
1092 default:
1093 UNREACHABLE();
1094 break;
1095 }
1096}
Geoff Langd7d0ed32016-10-07 11:33:51 -04001097
Jamie Madillbd044ed2017-06-05 12:59:21 -04001098void QueryShaderiv(const Context *context, Shader *shader, GLenum pname, GLint *params)
Geoff Langd7d0ed32016-10-07 11:33:51 -04001099{
1100 ASSERT(shader != nullptr);
1101
1102 switch (pname)
1103 {
1104 case GL_SHADER_TYPE:
Jiawei Shao385b3e02018-03-21 09:43:28 +08001105 *params = static_cast<GLint>(ToGLenum(shader->getType()));
Geoff Langd7d0ed32016-10-07 11:33:51 -04001106 return;
1107 case GL_DELETE_STATUS:
1108 *params = shader->isFlaggedForDeletion();
1109 return;
1110 case GL_COMPILE_STATUS:
Jamie Madillbd044ed2017-06-05 12:59:21 -04001111 *params = shader->isCompiled(context) ? GL_TRUE : GL_FALSE;
Geoff Langd7d0ed32016-10-07 11:33:51 -04001112 return;
1113 case GL_INFO_LOG_LENGTH:
Jamie Madillbd044ed2017-06-05 12:59:21 -04001114 *params = shader->getInfoLogLength(context);
Geoff Langd7d0ed32016-10-07 11:33:51 -04001115 return;
1116 case GL_SHADER_SOURCE_LENGTH:
1117 *params = shader->getSourceLength();
1118 return;
1119 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
Jamie Madillbd044ed2017-06-05 12:59:21 -04001120 *params = shader->getTranslatedSourceWithDebugInfoLength(context);
Geoff Langd7d0ed32016-10-07 11:33:51 -04001121 return;
1122 default:
1123 UNREACHABLE();
1124 break;
1125 }
1126}
Geoff Langc1984ed2016-10-07 12:41:00 -04001127
He Yunchao11b038b2016-11-22 21:24:04 +08001128void QueryTexLevelParameterfv(const Texture *texture,
Corentin Wallez99d492c2018-02-27 15:17:10 -05001129 TextureTarget target,
He Yunchao11b038b2016-11-22 21:24:04 +08001130 GLint level,
1131 GLenum pname,
1132 GLfloat *params)
1133{
1134 QueryTexLevelParameterBase(texture, target, level, pname, params);
1135}
1136
1137void QueryTexLevelParameteriv(const Texture *texture,
Corentin Wallez99d492c2018-02-27 15:17:10 -05001138 TextureTarget target,
He Yunchao11b038b2016-11-22 21:24:04 +08001139 GLint level,
1140 GLenum pname,
1141 GLint *params)
1142{
1143 QueryTexLevelParameterBase(texture, target, level, pname, params);
1144}
1145
Geoff Langc1984ed2016-10-07 12:41:00 -04001146void QueryTexParameterfv(const Texture *texture, GLenum pname, GLfloat *params)
1147{
1148 QueryTexParameterBase(texture, pname, params);
1149}
1150
1151void QueryTexParameteriv(const Texture *texture, GLenum pname, GLint *params)
1152{
1153 QueryTexParameterBase(texture, pname, params);
1154}
1155
1156void QuerySamplerParameterfv(const Sampler *sampler, GLenum pname, GLfloat *params)
1157{
1158 QuerySamplerParameterBase(sampler, pname, params);
1159}
1160
1161void QuerySamplerParameteriv(const Sampler *sampler, GLenum pname, GLint *params)
1162{
1163 QuerySamplerParameterBase(sampler, pname, params);
1164}
1165
Geoff Lang0b031062016-10-13 14:30:04 -04001166void QueryVertexAttribfv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001167 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001168 const VertexAttribCurrentValueData &currentValueData,
1169 GLenum pname,
1170 GLfloat *params)
1171{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001172 QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001173}
1174
1175void QueryVertexAttribiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001176 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001177 const VertexAttribCurrentValueData &currentValueData,
1178 GLenum pname,
1179 GLint *params)
1180{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001181 QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001182}
1183
Jamie Madill876429b2017-04-20 15:46:24 -04001184void QueryVertexAttribPointerv(const VertexAttribute &attrib, GLenum pname, void **pointer)
Geoff Lang0b031062016-10-13 14:30:04 -04001185{
1186 switch (pname)
1187 {
1188 case GL_VERTEX_ATTRIB_ARRAY_POINTER:
Jamie Madill876429b2017-04-20 15:46:24 -04001189 *pointer = const_cast<void *>(attrib.pointer);
Geoff Lang0b031062016-10-13 14:30:04 -04001190 break;
1191
1192 default:
1193 UNREACHABLE();
1194 break;
1195 }
1196}
1197
1198void QueryVertexAttribIiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001199 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001200 const VertexAttribCurrentValueData &currentValueData,
1201 GLenum pname,
1202 GLint *params)
1203{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001204 QueryVertexAttribBase(attrib, binding, currentValueData.IntValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001205}
1206
1207void QueryVertexAttribIuiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001208 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -04001209 const VertexAttribCurrentValueData &currentValueData,
1210 GLenum pname,
1211 GLuint *params)
1212{
Jiawei-Shao2597fb62016-12-09 16:38:02 +08001213 QueryVertexAttribBase(attrib, binding, currentValueData.UnsignedIntValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -04001214}
1215
Geoff Lang6899b872016-10-14 11:30:13 -04001216void QueryActiveUniformBlockiv(const Program *program,
1217 GLuint uniformBlockIndex,
1218 GLenum pname,
1219 GLint *params)
1220{
jchen1058f67be2017-10-27 08:59:27 +08001221 GLenum prop = GetUniformBlockPropertyEnum(pname);
1222 QueryProgramResourceiv(program, GL_UNIFORM_BLOCK, uniformBlockIndex, 1, &prop,
1223 std::numeric_limits<GLsizei>::max(), nullptr, params);
Geoff Lang6899b872016-10-14 11:30:13 -04001224}
1225
Geoff Lang0a9661f2016-10-20 10:59:20 -07001226void QueryInternalFormativ(const TextureCaps &format, GLenum pname, GLsizei bufSize, GLint *params)
1227{
1228 switch (pname)
1229 {
1230 case GL_NUM_SAMPLE_COUNTS:
1231 if (bufSize != 0)
1232 {
jchen10a99ed552017-09-22 08:10:32 +08001233 *params = clampCast<GLint>(format.sampleCounts.size());
Geoff Lang0a9661f2016-10-20 10:59:20 -07001234 }
1235 break;
1236
1237 case GL_SAMPLES:
1238 {
1239 size_t returnCount = std::min<size_t>(bufSize, format.sampleCounts.size());
1240 auto sampleReverseIt = format.sampleCounts.rbegin();
1241 for (size_t sampleIndex = 0; sampleIndex < returnCount; ++sampleIndex)
1242 {
1243 params[sampleIndex] = *sampleReverseIt++;
1244 }
1245 }
1246 break;
1247
1248 default:
1249 UNREACHABLE();
1250 break;
1251 }
1252}
1253
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001254void QueryFramebufferParameteriv(const Framebuffer *framebuffer, GLenum pname, GLint *params)
1255{
1256 ASSERT(framebuffer);
1257
1258 switch (pname)
1259 {
1260 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
1261 *params = framebuffer->getDefaultWidth();
1262 break;
1263 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
1264 *params = framebuffer->getDefaultHeight();
1265 break;
1266 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
1267 *params = framebuffer->getDefaultSamples();
1268 break;
1269 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
Geoff Lang92019432017-11-20 13:09:34 -05001270 *params = ConvertToGLBoolean(framebuffer->getDefaultFixedSampleLocations());
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001271 break;
Jiawei Shaob1e91382018-05-17 14:33:55 +08001272 case GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT:
1273 *params = framebuffer->getDefaultLayers();
1274 break;
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001275 default:
1276 UNREACHABLE();
1277 break;
1278 }
1279}
1280
Jamie Madill70b5bb02017-08-28 13:32:37 -04001281Error QuerySynciv(const Sync *sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001282{
1283 ASSERT(sync);
1284
Geoff Lang82483b92017-04-11 15:33:00 -04001285 // All queries return one value, exit early if the buffer can't fit anything.
1286 if (bufSize < 1)
1287 {
1288 if (length != nullptr)
1289 {
1290 *length = 0;
1291 }
1292 return NoError();
1293 }
1294
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001295 switch (pname)
1296 {
1297 case GL_OBJECT_TYPE:
jchen10a99ed552017-09-22 08:10:32 +08001298 *values = clampCast<GLint>(GL_SYNC_FENCE);
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001299 break;
1300 case GL_SYNC_CONDITION:
jchen10a99ed552017-09-22 08:10:32 +08001301 *values = clampCast<GLint>(sync->getCondition());
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001302 break;
1303 case GL_SYNC_FLAGS:
jchen10a99ed552017-09-22 08:10:32 +08001304 *values = clampCast<GLint>(sync->getFlags());
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001305 break;
1306 case GL_SYNC_STATUS:
1307 ANGLE_TRY(sync->getStatus(values));
1308 break;
1309
1310 default:
1311 UNREACHABLE();
1312 break;
1313 }
1314
Geoff Lang82483b92017-04-11 15:33:00 -04001315 if (length != nullptr)
1316 {
1317 *length = 1;
1318 }
1319
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001320 return NoError();
1321}
1322
Jamie Madill4928b7c2017-06-20 12:57:39 -04001323void SetTexParameterf(Context *context, Texture *texture, GLenum pname, GLfloat param)
Geoff Langc1984ed2016-10-07 12:41:00 -04001324{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001325 SetTexParameterBase(context, texture, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -04001326}
1327
Jamie Madill4928b7c2017-06-20 12:57:39 -04001328void SetTexParameterfv(Context *context, Texture *texture, GLenum pname, const GLfloat *params)
Geoff Langc1984ed2016-10-07 12:41:00 -04001329{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001330 SetTexParameterBase(context, texture, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001331}
1332
Jamie Madill4928b7c2017-06-20 12:57:39 -04001333void SetTexParameteri(Context *context, Texture *texture, GLenum pname, GLint param)
Geoff Langc1984ed2016-10-07 12:41:00 -04001334{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001335 SetTexParameterBase(context, texture, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -04001336}
1337
Jamie Madill4928b7c2017-06-20 12:57:39 -04001338void SetTexParameteriv(Context *context, Texture *texture, GLenum pname, const GLint *params)
Geoff Langc1984ed2016-10-07 12:41:00 -04001339{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001340 SetTexParameterBase(context, texture, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001341}
1342
1343void SetSamplerParameterf(Sampler *sampler, GLenum pname, GLfloat param)
1344{
1345 SetSamplerParameterBase(sampler, pname, &param);
1346}
1347
1348void SetSamplerParameterfv(Sampler *sampler, GLenum pname, const GLfloat *params)
1349{
1350 SetSamplerParameterBase(sampler, pname, params);
1351}
1352
1353void SetSamplerParameteri(Sampler *sampler, GLenum pname, GLint param)
1354{
1355 SetSamplerParameterBase(sampler, pname, &param);
1356}
1357
1358void SetSamplerParameteriv(Sampler *sampler, GLenum pname, const GLint *params)
1359{
1360 SetSamplerParameterBase(sampler, pname, params);
1361}
Geoff Lang65603eb2017-01-12 16:48:03 -05001362
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001363void SetFramebufferParameteri(Framebuffer *framebuffer, GLenum pname, GLint param)
1364{
1365 ASSERT(framebuffer);
1366
1367 switch (pname)
1368 {
1369 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
1370 framebuffer->setDefaultWidth(param);
1371 break;
1372 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
1373 framebuffer->setDefaultHeight(param);
1374 break;
1375 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
1376 framebuffer->setDefaultSamples(param);
1377 break;
1378 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
Geoff Lang5201ce12017-11-28 11:36:28 -05001379 framebuffer->setDefaultFixedSampleLocations(ConvertToBool(param));
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001380 break;
Jiawei Shaob1e91382018-05-17 14:33:55 +08001381 case GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT:
1382 framebuffer->setDefaultLayers(param);
1383 break;
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001384 default:
1385 UNREACHABLE();
1386 break;
1387 }
1388}
1389
Yunchao He61afff12017-03-14 15:34:03 +08001390void SetProgramParameteri(Program *program, GLenum pname, GLint value)
1391{
1392 ASSERT(program);
1393
1394 switch (pname)
1395 {
1396 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
Geoff Lang92019432017-11-20 13:09:34 -05001397 program->setBinaryRetrievableHint(ConvertToBool(value));
Yunchao He61afff12017-03-14 15:34:03 +08001398 break;
1399 case GL_PROGRAM_SEPARABLE:
Geoff Lang92019432017-11-20 13:09:34 -05001400 program->setSeparable(ConvertToBool(value));
Yunchao He61afff12017-03-14 15:34:03 +08001401 break;
1402 default:
1403 UNREACHABLE();
1404 break;
1405 }
1406}
1407
jchen10baf5d942017-08-28 20:45:48 +08001408GLint GetUniformResourceProperty(const Program *program, GLuint index, const GLenum prop)
1409{
1410 const auto &uniform = program->getUniformByIndex(index);
1411 GLenum resourceProp = GetUniformPropertyEnum(prop);
1412 switch (resourceProp)
1413 {
1414 case GL_TYPE:
1415 case GL_ARRAY_SIZE:
1416 case GL_NAME_LENGTH:
Olli Etuaho465835d2017-09-26 13:34:10 +03001417 return GetCommonVariableProperty(uniform, resourceProp);
jchen10baf5d942017-08-28 20:45:48 +08001418
1419 case GL_LOCATION:
1420 return program->getUniformLocation(uniform.name);
1421
1422 case GL_BLOCK_INDEX:
1423 return (uniform.isAtomicCounter() ? -1 : uniform.bufferIndex);
1424
1425 case GL_OFFSET:
1426 return uniform.blockInfo.offset;
1427
1428 case GL_ARRAY_STRIDE:
1429 return uniform.blockInfo.arrayStride;
1430
1431 case GL_MATRIX_STRIDE:
1432 return uniform.blockInfo.matrixStride;
1433
1434 case GL_IS_ROW_MAJOR:
1435 return static_cast<GLint>(uniform.blockInfo.isRowMajorMatrix);
1436
1437 case GL_REFERENCED_BY_VERTEX_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001438 return uniform.isActive(ShaderType::Vertex);
jchen10baf5d942017-08-28 20:45:48 +08001439
1440 case GL_REFERENCED_BY_FRAGMENT_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001441 return uniform.isActive(ShaderType::Fragment);
jchen10baf5d942017-08-28 20:45:48 +08001442
1443 case GL_REFERENCED_BY_COMPUTE_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001444 return uniform.isActive(ShaderType::Compute);
jchen10baf5d942017-08-28 20:45:48 +08001445
Jiawei Shaoc6f82872018-04-24 14:14:50 +08001446 case GL_REFERENCED_BY_GEOMETRY_SHADER_EXT:
1447 return uniform.isActive(ShaderType::Geometry);
1448
jchen10baf5d942017-08-28 20:45:48 +08001449 case GL_ATOMIC_COUNTER_BUFFER_INDEX:
1450 return (uniform.isAtomicCounter() ? uniform.bufferIndex : -1);
1451
1452 default:
1453 UNREACHABLE();
1454 return 0;
1455 }
1456}
1457
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001458GLint GetBufferVariableResourceProperty(const Program *program, GLuint index, const GLenum prop)
1459{
1460 const auto &bufferVariable = program->getBufferVariableByIndex(index);
1461 switch (prop)
1462 {
1463 case GL_TYPE:
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001464 case GL_ARRAY_SIZE:
Olli Etuaho465835d2017-09-26 13:34:10 +03001465 case GL_NAME_LENGTH:
1466 return GetCommonVariableProperty(bufferVariable, prop);
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001467
1468 case GL_BLOCK_INDEX:
1469 return bufferVariable.bufferIndex;
1470
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001471 case GL_OFFSET:
1472 return bufferVariable.blockInfo.offset;
1473
1474 case GL_ARRAY_STRIDE:
1475 return bufferVariable.blockInfo.arrayStride;
1476
1477 case GL_MATRIX_STRIDE:
1478 return bufferVariable.blockInfo.matrixStride;
1479
1480 case GL_IS_ROW_MAJOR:
1481 return static_cast<GLint>(bufferVariable.blockInfo.isRowMajorMatrix);
1482
1483 case GL_REFERENCED_BY_VERTEX_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001484 return bufferVariable.isActive(ShaderType::Vertex);
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001485
1486 case GL_REFERENCED_BY_FRAGMENT_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001487 return bufferVariable.isActive(ShaderType::Fragment);
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001488
1489 case GL_REFERENCED_BY_COMPUTE_SHADER:
Jiawei Shao3dd8d2912018-03-30 09:39:09 +08001490 return bufferVariable.isActive(ShaderType::Compute);
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001491
Jiawei Shaoc6f82872018-04-24 14:14:50 +08001492 case GL_REFERENCED_BY_GEOMETRY_SHADER_EXT:
1493 return bufferVariable.isActive(ShaderType::Geometry);
1494
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001495 case GL_TOP_LEVEL_ARRAY_SIZE:
1496 return bufferVariable.topLevelArraySize;
1497
1498 case GL_TOP_LEVEL_ARRAY_STRIDE:
1499 return bufferVariable.blockInfo.topLevelArrayStride;
1500
1501 default:
1502 UNREACHABLE();
1503 return 0;
1504 }
1505}
1506
jchen1015015f72017-03-16 13:54:21 +08001507GLuint QueryProgramResourceIndex(const Program *program,
1508 GLenum programInterface,
1509 const GLchar *name)
1510{
1511 switch (programInterface)
1512 {
1513 case GL_PROGRAM_INPUT:
1514 return program->getInputResourceIndex(name);
1515
1516 case GL_PROGRAM_OUTPUT:
1517 return program->getOutputResourceIndex(name);
1518
jchen1015015f72017-03-16 13:54:21 +08001519 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001520 return program->getState().getUniformIndexFromName(name);
1521
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001522 case GL_BUFFER_VARIABLE:
1523 return program->getState().getBufferVariableIndexFromName(name);
1524
1525 case GL_SHADER_STORAGE_BLOCK:
1526 return program->getShaderStorageBlockIndex(name);
1527
jchen1015015f72017-03-16 13:54:21 +08001528 case GL_UNIFORM_BLOCK:
jchen1058f67be2017-10-27 08:59:27 +08001529 return program->getUniformBlockIndex(name);
1530
jchen1015015f72017-03-16 13:54:21 +08001531 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10910a3da2017-11-15 09:40:11 +08001532 return program->getTransformFeedbackVaryingResourceIndex(name);
jchen1015015f72017-03-16 13:54:21 +08001533
1534 default:
1535 UNREACHABLE();
1536 return GL_INVALID_INDEX;
1537 }
1538}
1539
jchen10fd7c3b52017-03-21 15:36:03 +08001540void QueryProgramResourceName(const Program *program,
1541 GLenum programInterface,
1542 GLuint index,
1543 GLsizei bufSize,
1544 GLsizei *length,
1545 GLchar *name)
1546{
1547 switch (programInterface)
1548 {
1549 case GL_PROGRAM_INPUT:
1550 program->getInputResourceName(index, bufSize, length, name);
1551 break;
1552
1553 case GL_PROGRAM_OUTPUT:
1554 program->getOutputResourceName(index, bufSize, length, name);
1555 break;
1556
jchen10fd7c3b52017-03-21 15:36:03 +08001557 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001558 program->getUniformResourceName(index, bufSize, length, name);
1559 break;
1560
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001561 case GL_BUFFER_VARIABLE:
1562 program->getBufferVariableResourceName(index, bufSize, length, name);
1563 break;
1564
1565 case GL_SHADER_STORAGE_BLOCK:
1566 program->getActiveShaderStorageBlockName(index, bufSize, length, name);
1567 break;
1568
jchen10fd7c3b52017-03-21 15:36:03 +08001569 case GL_UNIFORM_BLOCK:
jchen1058f67be2017-10-27 08:59:27 +08001570 program->getActiveUniformBlockName(index, bufSize, length, name);
1571 break;
1572
jchen10fd7c3b52017-03-21 15:36:03 +08001573 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10910a3da2017-11-15 09:40:11 +08001574 program->getTransformFeedbackVarying(index, bufSize, length, nullptr, nullptr, name);
jchen10fd7c3b52017-03-21 15:36:03 +08001575 break;
1576
1577 default:
1578 UNREACHABLE();
1579 }
1580}
1581
jchen10191381f2017-04-11 13:59:04 +08001582GLint QueryProgramResourceLocation(const Program *program,
1583 GLenum programInterface,
1584 const GLchar *name)
1585{
1586 switch (programInterface)
1587 {
1588 case GL_PROGRAM_INPUT:
1589 return program->getAttributeLocation(name);
1590
1591 case GL_PROGRAM_OUTPUT:
1592 return program->getFragDataLocation(name);
1593
jchen10191381f2017-04-11 13:59:04 +08001594 case GL_UNIFORM:
Olli Etuahod2551232017-10-26 20:03:33 +03001595 return program->getUniformLocation(name);
jchen10baf5d942017-08-28 20:45:48 +08001596
jchen10191381f2017-04-11 13:59:04 +08001597 default:
1598 UNREACHABLE();
1599 return -1;
1600 }
1601}
1602
jchen10880683b2017-04-12 16:21:55 +08001603void QueryProgramResourceiv(const Program *program,
1604 GLenum programInterface,
1605 GLuint index,
1606 GLsizei propCount,
1607 const GLenum *props,
1608 GLsizei bufSize,
1609 GLsizei *length,
1610 GLint *params)
1611{
1612 if (!program->isLinked())
1613 {
1614 if (length != nullptr)
1615 {
1616 *length = 0;
1617 }
1618 return;
1619 }
1620
jchen1058f67be2017-10-27 08:59:27 +08001621 GLsizei pos = 0;
1622 for (GLsizei i = 0; i < propCount; i++)
jchen10880683b2017-04-12 16:21:55 +08001623 {
1624 switch (programInterface)
1625 {
1626 case GL_PROGRAM_INPUT:
1627 params[i] = GetInputResourceProperty(program, index, props[i]);
jchen1058f67be2017-10-27 08:59:27 +08001628 ++pos;
jchen10880683b2017-04-12 16:21:55 +08001629 break;
1630
1631 case GL_PROGRAM_OUTPUT:
1632 params[i] = GetOutputResourceProperty(program, index, props[i]);
jchen1058f67be2017-10-27 08:59:27 +08001633 ++pos;
jchen10880683b2017-04-12 16:21:55 +08001634 break;
1635
jchen10880683b2017-04-12 16:21:55 +08001636 case GL_UNIFORM:
jchen10baf5d942017-08-28 20:45:48 +08001637 params[i] = GetUniformResourceProperty(program, index, props[i]);
jchen1058f67be2017-10-27 08:59:27 +08001638 ++pos;
1639 break;
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001640
1641 case GL_BUFFER_VARIABLE:
1642 params[i] = GetBufferVariableResourceProperty(program, index, props[i]);
1643 ++pos;
1644 break;
1645
jchen1058f67be2017-10-27 08:59:27 +08001646 case GL_UNIFORM_BLOCK:
1647 GetUniformBlockResourceProperty(program, index, props[i], params, bufSize, &pos);
jchen10baf5d942017-08-28 20:45:48 +08001648 break;
1649
Jiajia Qin3a9090f2017-09-27 14:37:04 +08001650 case GL_SHADER_STORAGE_BLOCK:
1651 GetShaderStorageBlockResourceProperty(program, index, props[i], params, bufSize,
1652 &pos);
1653 break;
1654
jchen1058f67be2017-10-27 08:59:27 +08001655 case GL_ATOMIC_COUNTER_BUFFER:
1656 GetAtomicCounterBufferResourceProperty(program, index, props[i], params, bufSize,
1657 &pos);
1658 break;
jchen10910a3da2017-11-15 09:40:11 +08001659
jchen10880683b2017-04-12 16:21:55 +08001660 case GL_TRANSFORM_FEEDBACK_VARYING:
jchen10910a3da2017-11-15 09:40:11 +08001661 params[i] = GetTransformFeedbackVaryingResourceProperty(program, index, props[i]);
1662 ++pos;
jchen10880683b2017-04-12 16:21:55 +08001663 break;
1664
1665 default:
1666 UNREACHABLE();
1667 params[i] = GL_INVALID_VALUE;
1668 }
jchen1058f67be2017-10-27 08:59:27 +08001669 if (pos == bufSize)
1670 {
1671 // Most properties return one value, but GL_ACTIVE_VARIABLES returns an array of values.
1672 // This checks not to break buffer bounds for such case.
1673 break;
1674 }
1675 }
1676
1677 if (length != nullptr)
1678 {
1679 *length = pos;
jchen10880683b2017-04-12 16:21:55 +08001680 }
1681}
1682
jchen10d9cd7b72017-08-30 15:04:25 +08001683void QueryProgramInterfaceiv(const Program *program,
1684 GLenum programInterface,
1685 GLenum pname,
1686 GLint *params)
1687{
1688 switch (pname)
1689 {
1690 case GL_ACTIVE_RESOURCES:
1691 *params = QueryProgramInterfaceActiveResources(program, programInterface);
1692 break;
1693
1694 case GL_MAX_NAME_LENGTH:
1695 *params = QueryProgramInterfaceMaxNameLength(program, programInterface);
1696 break;
1697
1698 case GL_MAX_NUM_ACTIVE_VARIABLES:
1699 *params = QueryProgramInterfaceMaxNumActiveVariables(program, programInterface);
1700 break;
1701
1702 default:
1703 UNREACHABLE();
1704 }
1705}
1706
Lingfeng Yangabb09f12018-04-16 10:43:53 -07001707ClientVertexArrayType ParamToVertexArrayType(GLenum param)
1708{
1709 switch (param)
1710 {
1711 case GL_VERTEX_ARRAY:
1712 case GL_VERTEX_ARRAY_BUFFER_BINDING:
1713 case GL_VERTEX_ARRAY_STRIDE:
1714 case GL_VERTEX_ARRAY_SIZE:
1715 case GL_VERTEX_ARRAY_TYPE:
1716 case GL_VERTEX_ARRAY_POINTER:
1717 return ClientVertexArrayType::Vertex;
1718 case GL_NORMAL_ARRAY:
1719 case GL_NORMAL_ARRAY_BUFFER_BINDING:
1720 case GL_NORMAL_ARRAY_STRIDE:
1721 case GL_NORMAL_ARRAY_TYPE:
1722 case GL_NORMAL_ARRAY_POINTER:
1723 return ClientVertexArrayType::Normal;
1724 case GL_COLOR_ARRAY:
1725 case GL_COLOR_ARRAY_BUFFER_BINDING:
1726 case GL_COLOR_ARRAY_STRIDE:
1727 case GL_COLOR_ARRAY_SIZE:
1728 case GL_COLOR_ARRAY_TYPE:
1729 case GL_COLOR_ARRAY_POINTER:
1730 return ClientVertexArrayType::Color;
1731 case GL_POINT_SIZE_ARRAY_OES:
1732 case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
1733 case GL_POINT_SIZE_ARRAY_STRIDE_OES:
1734 case GL_POINT_SIZE_ARRAY_TYPE_OES:
1735 case GL_POINT_SIZE_ARRAY_POINTER_OES:
1736 return ClientVertexArrayType::PointSize;
1737 case GL_TEXTURE_COORD_ARRAY:
1738 case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
1739 case GL_TEXTURE_COORD_ARRAY_STRIDE:
1740 case GL_TEXTURE_COORD_ARRAY_SIZE:
1741 case GL_TEXTURE_COORD_ARRAY_TYPE:
1742 case GL_TEXTURE_COORD_ARRAY_POINTER:
1743 return ClientVertexArrayType::TextureCoord;
1744 default:
1745 UNREACHABLE();
1746 return ClientVertexArrayType::InvalidEnum;
1747 }
1748}
1749
Lingfeng Yangd0febe72018-05-17 22:36:52 -07001750void SetLightModelParameters(GLES1State *state, GLenum pname, const GLfloat *params)
1751{
1752 LightModelParameters &lightModel = state->lightModelParameters();
1753
1754 switch (pname)
1755 {
1756 case GL_LIGHT_MODEL_AMBIENT:
1757 lightModel.color = ColorF::fromData(params);
1758 break;
1759 case GL_LIGHT_MODEL_TWO_SIDE:
1760 lightModel.twoSided = *params == 1.0f ? true : false;
1761 break;
1762 default:
1763 break;
1764 }
1765}
1766
1767void GetLightModelParameters(const GLES1State *state, GLenum pname, GLfloat *params)
1768{
1769 const LightModelParameters &lightModel = state->lightModelParameters();
1770
1771 switch (pname)
1772 {
1773 case GL_LIGHT_MODEL_TWO_SIDE:
1774 *params = lightModel.twoSided ? 1.0f : 0.0f;
1775 break;
1776 case GL_LIGHT_MODEL_AMBIENT:
1777 lightModel.color.writeData(params);
1778 break;
1779 default:
1780 break;
1781 }
1782}
1783
1784bool IsLightModelTwoSided(const GLES1State *state)
1785{
1786 return state->lightModelParameters().twoSided;
1787}
1788
1789void SetLightParameters(GLES1State *state,
1790 GLenum light,
1791 LightParameter pname,
1792 const GLfloat *params)
1793{
1794 uint32_t lightIndex = light - GL_LIGHT0;
1795
1796 LightParameters &lightParams = state->lightParameters(lightIndex);
1797
1798 switch (pname)
1799 {
1800 case LightParameter::Ambient:
1801 lightParams.ambient = ColorF::fromData(params);
1802 break;
1803 case LightParameter::Diffuse:
1804 lightParams.diffuse = ColorF::fromData(params);
1805 break;
1806 case LightParameter::Specular:
1807 lightParams.specular = ColorF::fromData(params);
1808 break;
1809 case LightParameter::Position:
1810 {
1811 angle::Mat4 mv = state->getModelviewMatrix();
1812 angle::Vector4 transformedPos =
1813 mv.product(angle::Vector4(params[0], params[1], params[2], params[3]));
1814 lightParams.position[0] = transformedPos[0];
1815 lightParams.position[1] = transformedPos[1];
1816 lightParams.position[2] = transformedPos[2];
1817 lightParams.position[3] = transformedPos[3];
1818 }
1819 break;
1820 case LightParameter::SpotDirection:
1821 {
1822 angle::Mat4 mv = state->getModelviewMatrix();
1823 angle::Vector4 transformedPos =
1824 mv.product(angle::Vector4(params[0], params[1], params[2], 0.0f));
1825 lightParams.direction[0] = transformedPos[0];
1826 lightParams.direction[1] = transformedPos[1];
1827 lightParams.direction[2] = transformedPos[2];
1828 }
1829 break;
1830 case LightParameter::SpotExponent:
1831 lightParams.spotlightExponent = *params;
1832 break;
1833 case LightParameter::SpotCutoff:
1834 lightParams.spotlightCutoffAngle = *params;
1835 break;
1836 case LightParameter::ConstantAttenuation:
1837 lightParams.attenuationConst = *params;
1838 break;
1839 case LightParameter::LinearAttenuation:
1840 lightParams.attenuationLinear = *params;
1841 break;
1842 case LightParameter::QuadraticAttenuation:
1843 lightParams.attenuationQuadratic = *params;
1844 break;
1845 default:
1846 return;
1847 }
1848}
1849
1850void GetLightParameters(const GLES1State *state,
1851 GLenum light,
1852 LightParameter pname,
1853 GLfloat *params)
1854{
1855 uint32_t lightIndex = light - GL_LIGHT0;
1856 const LightParameters &lightParams = state->lightParameters(lightIndex);
1857
1858 switch (pname)
1859 {
1860 case LightParameter::Ambient:
1861 lightParams.ambient.writeData(params);
1862 break;
1863 case LightParameter::Diffuse:
1864 lightParams.diffuse.writeData(params);
1865 break;
1866 case LightParameter::Specular:
1867 lightParams.specular.writeData(params);
1868 break;
1869 case LightParameter::Position:
1870 memcpy(params, lightParams.position.data(), 4 * sizeof(GLfloat));
1871 break;
1872 case LightParameter::SpotDirection:
1873 memcpy(params, lightParams.direction.data(), 3 * sizeof(GLfloat));
1874 break;
1875 case LightParameter::SpotExponent:
1876 *params = lightParams.spotlightExponent;
1877 break;
1878 case LightParameter::SpotCutoff:
1879 *params = lightParams.spotlightCutoffAngle;
1880 break;
1881 case LightParameter::ConstantAttenuation:
1882 *params = lightParams.attenuationConst;
1883 break;
1884 case LightParameter::LinearAttenuation:
1885 *params = lightParams.attenuationLinear;
1886 break;
1887 case LightParameter::QuadraticAttenuation:
1888 *params = lightParams.attenuationQuadratic;
1889 break;
1890 default:
1891 break;
1892 }
1893}
1894
1895void SetMaterialParameters(GLES1State *state,
1896 GLenum face,
1897 MaterialParameter pname,
1898 const GLfloat *params)
1899{
1900 MaterialParameters &material = state->materialParameters();
1901 switch (pname)
1902 {
1903 case MaterialParameter::Ambient:
1904 material.ambient = ColorF::fromData(params);
1905 break;
1906 case MaterialParameter::Diffuse:
1907 material.diffuse = ColorF::fromData(params);
1908 break;
1909 case MaterialParameter::AmbientAndDiffuse:
1910 material.ambient = ColorF::fromData(params);
1911 material.diffuse = ColorF::fromData(params);
1912 break;
1913 case MaterialParameter::Specular:
1914 material.specular = ColorF::fromData(params);
1915 break;
1916 case MaterialParameter::Emission:
1917 material.emissive = ColorF::fromData(params);
1918 break;
1919 case MaterialParameter::Shininess:
1920 material.specularExponent = *params;
1921 break;
1922 default:
1923 return;
1924 }
1925}
1926
1927void GetMaterialParameters(const GLES1State *state,
1928 GLenum face,
1929 MaterialParameter pname,
1930 GLfloat *params)
1931{
1932 const ColorF &currentColor = state->getCurrentColor();
1933 const MaterialParameters &material = state->materialParameters();
1934 const bool colorMaterialEnabled = state->isColorMaterialEnabled();
1935
1936 switch (pname)
1937 {
1938 case MaterialParameter::Ambient:
1939 if (colorMaterialEnabled)
1940 {
1941 currentColor.writeData(params);
1942 }
1943 else
1944 {
1945 material.ambient.writeData(params);
1946 }
1947 break;
1948 case MaterialParameter::Diffuse:
1949 if (colorMaterialEnabled)
1950 {
1951 currentColor.writeData(params);
1952 }
1953 else
1954 {
1955 material.diffuse.writeData(params);
1956 }
1957 break;
1958 case MaterialParameter::Specular:
1959 material.specular.writeData(params);
1960 break;
1961 case MaterialParameter::Emission:
1962 material.emissive.writeData(params);
1963 break;
1964 case MaterialParameter::Shininess:
1965 *params = material.specularExponent;
1966 break;
1967 default:
1968 return;
1969 }
1970}
1971
1972unsigned int GetLightModelParameterCount(GLenum pname)
1973{
1974 switch (pname)
1975 {
1976 case GL_LIGHT_MODEL_AMBIENT:
1977 return 4;
1978 case GL_LIGHT_MODEL_TWO_SIDE:
1979 return 1;
1980 default:
1981 UNREACHABLE();
1982 return 0;
1983 }
1984}
1985
1986unsigned int GetLightParameterCount(LightParameter pname)
1987{
1988 switch (pname)
1989 {
1990 case LightParameter::Ambient:
1991 case LightParameter::Diffuse:
1992 case LightParameter::Specular:
1993 case LightParameter::Position:
1994 return 4;
1995 case LightParameter::SpotDirection:
1996 return 3;
1997 case LightParameter::SpotExponent:
1998 case LightParameter::SpotCutoff:
1999 case LightParameter::ConstantAttenuation:
2000 case LightParameter::LinearAttenuation:
2001 case LightParameter::QuadraticAttenuation:
2002 return 1;
2003 default:
2004 UNREACHABLE();
2005 return 0;
2006 }
2007}
2008
2009unsigned int GetMaterialParameterCount(MaterialParameter pname)
2010{
2011 switch (pname)
2012 {
2013 case MaterialParameter::Ambient:
2014 case MaterialParameter::Diffuse:
2015 case MaterialParameter::Specular:
2016 case MaterialParameter::Emission:
2017 return 4;
2018 case MaterialParameter::Shininess:
2019 return 1;
2020 default:
2021 UNREACHABLE();
2022 return 0;
2023 }
2024}
2025
Geoff Lang65603eb2017-01-12 16:48:03 -05002026} // namespace gl
2027
2028namespace egl
2029{
2030
2031void QueryConfigAttrib(const Config *config, EGLint attribute, EGLint *value)
2032{
2033 ASSERT(config != nullptr);
2034 switch (attribute)
2035 {
2036 case EGL_BUFFER_SIZE:
2037 *value = config->bufferSize;
2038 break;
2039 case EGL_ALPHA_SIZE:
2040 *value = config->alphaSize;
2041 break;
2042 case EGL_BLUE_SIZE:
2043 *value = config->blueSize;
2044 break;
2045 case EGL_GREEN_SIZE:
2046 *value = config->greenSize;
2047 break;
2048 case EGL_RED_SIZE:
2049 *value = config->redSize;
2050 break;
2051 case EGL_DEPTH_SIZE:
2052 *value = config->depthSize;
2053 break;
2054 case EGL_STENCIL_SIZE:
2055 *value = config->stencilSize;
2056 break;
2057 case EGL_CONFIG_CAVEAT:
2058 *value = config->configCaveat;
2059 break;
2060 case EGL_CONFIG_ID:
2061 *value = config->configID;
2062 break;
2063 case EGL_LEVEL:
2064 *value = config->level;
2065 break;
2066 case EGL_NATIVE_RENDERABLE:
2067 *value = config->nativeRenderable;
2068 break;
2069 case EGL_NATIVE_VISUAL_ID:
2070 *value = config->nativeVisualID;
2071 break;
2072 case EGL_NATIVE_VISUAL_TYPE:
2073 *value = config->nativeVisualType;
2074 break;
2075 case EGL_SAMPLES:
2076 *value = config->samples;
2077 break;
2078 case EGL_SAMPLE_BUFFERS:
2079 *value = config->sampleBuffers;
2080 break;
2081 case EGL_SURFACE_TYPE:
2082 *value = config->surfaceType;
2083 break;
2084 case EGL_TRANSPARENT_TYPE:
2085 *value = config->transparentType;
2086 break;
2087 case EGL_TRANSPARENT_BLUE_VALUE:
2088 *value = config->transparentBlueValue;
2089 break;
2090 case EGL_TRANSPARENT_GREEN_VALUE:
2091 *value = config->transparentGreenValue;
2092 break;
2093 case EGL_TRANSPARENT_RED_VALUE:
2094 *value = config->transparentRedValue;
2095 break;
2096 case EGL_BIND_TO_TEXTURE_RGB:
2097 *value = config->bindToTextureRGB;
2098 break;
2099 case EGL_BIND_TO_TEXTURE_RGBA:
2100 *value = config->bindToTextureRGBA;
2101 break;
2102 case EGL_MIN_SWAP_INTERVAL:
2103 *value = config->minSwapInterval;
2104 break;
2105 case EGL_MAX_SWAP_INTERVAL:
2106 *value = config->maxSwapInterval;
2107 break;
2108 case EGL_LUMINANCE_SIZE:
2109 *value = config->luminanceSize;
2110 break;
2111 case EGL_ALPHA_MASK_SIZE:
2112 *value = config->alphaMaskSize;
2113 break;
2114 case EGL_COLOR_BUFFER_TYPE:
2115 *value = config->colorBufferType;
2116 break;
2117 case EGL_RENDERABLE_TYPE:
2118 *value = config->renderableType;
2119 break;
2120 case EGL_MATCH_NATIVE_PIXMAP:
2121 *value = false;
2122 UNIMPLEMENTED();
2123 break;
2124 case EGL_CONFORMANT:
2125 *value = config->conformant;
2126 break;
2127 case EGL_MAX_PBUFFER_WIDTH:
2128 *value = config->maxPBufferWidth;
2129 break;
2130 case EGL_MAX_PBUFFER_HEIGHT:
2131 *value = config->maxPBufferHeight;
2132 break;
2133 case EGL_MAX_PBUFFER_PIXELS:
2134 *value = config->maxPBufferPixels;
2135 break;
2136 case EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE:
2137 *value = config->optimalOrientation;
2138 break;
Geoff Langc5a2a172017-01-13 15:55:07 -05002139 case EGL_COLOR_COMPONENT_TYPE_EXT:
2140 *value = config->colorComponentType;
2141 break;
Geoff Lang65603eb2017-01-12 16:48:03 -05002142 default:
2143 UNREACHABLE();
2144 break;
2145 }
Geoff Langff5b2d52016-09-07 11:32:23 -04002146}
Geoff Lang65603eb2017-01-12 16:48:03 -05002147
Geoff Langaf143fe2017-10-05 13:59:43 -04002148void QueryContextAttrib(const gl::Context *context, EGLint attribute, EGLint *value)
2149{
2150 switch (attribute)
2151 {
2152 case EGL_CONFIG_ID:
2153 *value = context->getConfig()->configID;
2154 break;
2155 case EGL_CONTEXT_CLIENT_TYPE:
2156 *value = context->getClientType();
2157 break;
2158 case EGL_CONTEXT_CLIENT_VERSION:
2159 *value = context->getClientMajorVersion();
2160 break;
2161 case EGL_RENDER_BUFFER:
2162 *value = context->getRenderBuffer();
2163 break;
Geoff Langb433e872017-10-05 14:01:47 -04002164 case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
2165 *value = context->isRobustResourceInitEnabled();
2166 break;
Geoff Langaf143fe2017-10-05 13:59:43 -04002167 default:
2168 UNREACHABLE();
2169 break;
2170 }
2171}
2172
Geoff Lang31ecbd72017-07-26 13:01:27 -04002173void QuerySurfaceAttrib(const Surface *surface, EGLint attribute, EGLint *value)
2174{
2175 switch (attribute)
2176 {
2177 case EGL_GL_COLORSPACE:
Geoff Lang40ac7832017-07-26 14:38:46 -04002178 *value = surface->getGLColorspace();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002179 break;
2180 case EGL_VG_ALPHA_FORMAT:
Geoff Lang40ac7832017-07-26 14:38:46 -04002181 *value = surface->getVGAlphaFormat();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002182 break;
2183 case EGL_VG_COLORSPACE:
Geoff Lang40ac7832017-07-26 14:38:46 -04002184 *value = surface->getVGColorspace();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002185 break;
2186 case EGL_CONFIG_ID:
2187 *value = surface->getConfig()->configID;
2188 break;
2189 case EGL_HEIGHT:
2190 *value = surface->getHeight();
2191 break;
2192 case EGL_HORIZONTAL_RESOLUTION:
Geoff Lang40ac7832017-07-26 14:38:46 -04002193 *value = surface->getHorizontalResolution();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002194 break;
2195 case EGL_LARGEST_PBUFFER:
Geoff Lang40ac7832017-07-26 14:38:46 -04002196 // The EGL spec states that value is not written if the surface is not a pbuffer
2197 if (surface->getType() == EGL_PBUFFER_BIT)
2198 {
2199 *value = surface->getLargestPbuffer();
2200 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04002201 break;
2202 case EGL_MIPMAP_TEXTURE:
Geoff Lang40ac7832017-07-26 14:38:46 -04002203 // The EGL spec states that value is not written if the surface is not a pbuffer
2204 if (surface->getType() == EGL_PBUFFER_BIT)
2205 {
2206 *value = surface->getMipmapTexture();
2207 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04002208 break;
2209 case EGL_MIPMAP_LEVEL:
Geoff Lang40ac7832017-07-26 14:38:46 -04002210 // The EGL spec states that value is not written if the surface is not a pbuffer
2211 if (surface->getType() == EGL_PBUFFER_BIT)
2212 {
2213 *value = surface->getMipmapLevel();
2214 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04002215 break;
2216 case EGL_MULTISAMPLE_RESOLVE:
Geoff Lang40ac7832017-07-26 14:38:46 -04002217 *value = surface->getMultisampleResolve();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002218 break;
2219 case EGL_PIXEL_ASPECT_RATIO:
2220 *value = surface->getPixelAspectRatio();
2221 break;
2222 case EGL_RENDER_BUFFER:
2223 *value = surface->getRenderBuffer();
2224 break;
2225 case EGL_SWAP_BEHAVIOR:
2226 *value = surface->getSwapBehavior();
2227 break;
2228 case EGL_TEXTURE_FORMAT:
Geoff Lang40ac7832017-07-26 14:38:46 -04002229 // The EGL spec states that value is not written if the surface is not a pbuffer
2230 if (surface->getType() == EGL_PBUFFER_BIT)
2231 {
Geoff Lang8ceea812018-04-10 03:07:13 -04002232 *value = ToEGLenum(surface->getTextureFormat());
Geoff Lang40ac7832017-07-26 14:38:46 -04002233 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04002234 break;
2235 case EGL_TEXTURE_TARGET:
Geoff Lang40ac7832017-07-26 14:38:46 -04002236 // The EGL spec states that value is not written if the surface is not a pbuffer
2237 if (surface->getType() == EGL_PBUFFER_BIT)
2238 {
2239 *value = surface->getTextureTarget();
2240 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04002241 break;
2242 case EGL_VERTICAL_RESOLUTION:
Geoff Lang40ac7832017-07-26 14:38:46 -04002243 *value = surface->getVerticalResolution();
Geoff Lang31ecbd72017-07-26 13:01:27 -04002244 break;
2245 case EGL_WIDTH:
2246 *value = surface->getWidth();
2247 break;
2248 case EGL_POST_SUB_BUFFER_SUPPORTED_NV:
2249 *value = surface->isPostSubBufferSupported();
2250 break;
2251 case EGL_FIXED_SIZE_ANGLE:
2252 *value = surface->isFixedSize();
2253 break;
2254 case EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE:
2255 *value = surface->flexibleSurfaceCompatibilityRequested();
2256 break;
2257 case EGL_SURFACE_ORIENTATION_ANGLE:
2258 *value = surface->getOrientation();
2259 break;
2260 case EGL_DIRECT_COMPOSITION_ANGLE:
2261 *value = surface->directComposition();
2262 break;
Geoff Langb433e872017-10-05 14:01:47 -04002263 case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
2264 *value = surface->isRobustResourceInitEnabled();
2265 break;
Geoff Lang31ecbd72017-07-26 13:01:27 -04002266 default:
2267 UNREACHABLE();
2268 break;
2269 }
2270}
2271
2272void SetSurfaceAttrib(Surface *surface, EGLint attribute, EGLint value)
2273{
2274 switch (attribute)
2275 {
2276 case EGL_MIPMAP_LEVEL:
Geoff Lang40ac7832017-07-26 14:38:46 -04002277 surface->setMipmapLevel(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04002278 break;
2279 case EGL_MULTISAMPLE_RESOLVE:
Geoff Lang40ac7832017-07-26 14:38:46 -04002280 surface->setMultisampleResolve(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04002281 break;
2282 case EGL_SWAP_BEHAVIOR:
Geoff Lang40ac7832017-07-26 14:38:46 -04002283 surface->setSwapBehavior(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04002284 break;
2285 default:
2286 UNREACHABLE();
2287 break;
2288 }
2289}
2290
Geoff Lang65603eb2017-01-12 16:48:03 -05002291} // namespace egl