blob: e7d59448137d7ad74fbf399c340bc9acf6ec0f8b [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"
18#include "libANGLE/Program.h"
Geoff Lang740d9022016-10-07 11:20:52 -040019#include "libANGLE/Renderbuffer.h"
Geoff Langc1984ed2016-10-07 12:41:00 -040020#include "libANGLE/Sampler.h"
Geoff Langd7d0ed32016-10-07 11:33:51 -040021#include "libANGLE/Shader.h"
Geoff Lang31ecbd72017-07-26 13:01:27 -040022#include "libANGLE/Surface.h"
Geoff Langc1984ed2016-10-07 12:41:00 -040023#include "libANGLE/Texture.h"
Geoff Lang6899b872016-10-14 11:30:13 -040024#include "libANGLE/Uniform.h"
Geoff Lang0b031062016-10-13 14:30:04 -040025#include "libANGLE/VertexAttribute.h"
jchen10a99ed552017-09-22 08:10:32 +080026#include "libANGLE/queryconversions.h"
Geoff Langff5b2d52016-09-07 11:32:23 -040027
28namespace gl
29{
Geoff Langc1984ed2016-10-07 12:41:00 -040030
31namespace
32{
jchen10a99ed552017-09-22 08:10:32 +080033
Geoff Langc1984ed2016-10-07 12:41:00 -040034template <typename ParamType>
He Yunchao11b038b2016-11-22 21:24:04 +080035void QueryTexLevelParameterBase(const Texture *texture,
36 GLenum target,
37 GLint level,
38 GLenum pname,
39 ParamType *params)
40{
41 ASSERT(texture != nullptr);
42 const InternalFormat *info = texture->getTextureState().getImageDesc(target, level).format.info;
43
44 switch (pname)
45 {
46 case GL_TEXTURE_RED_TYPE:
jchen10a99ed552017-09-22 08:10:32 +080047 *params = CastFromGLintStateValue<ParamType>(
48 pname, info->redBits ? info->componentType : GL_NONE);
He Yunchao11b038b2016-11-22 21:24:04 +080049 break;
50 case GL_TEXTURE_GREEN_TYPE:
jchen10a99ed552017-09-22 08:10:32 +080051 *params = CastFromGLintStateValue<ParamType>(
52 pname, info->greenBits ? info->componentType : GL_NONE);
He Yunchao11b038b2016-11-22 21:24:04 +080053 break;
54 case GL_TEXTURE_BLUE_TYPE:
jchen10a99ed552017-09-22 08:10:32 +080055 *params = CastFromGLintStateValue<ParamType>(
56 pname, info->blueBits ? info->componentType : GL_NONE);
He Yunchao11b038b2016-11-22 21:24:04 +080057 break;
58 case GL_TEXTURE_ALPHA_TYPE:
jchen10a99ed552017-09-22 08:10:32 +080059 *params = CastFromGLintStateValue<ParamType>(
60 pname, info->alphaBits ? info->componentType : GL_NONE);
He Yunchao11b038b2016-11-22 21:24:04 +080061 break;
62 case GL_TEXTURE_DEPTH_TYPE:
jchen10a99ed552017-09-22 08:10:32 +080063 *params = CastFromGLintStateValue<ParamType>(
64 pname, info->depthBits ? info->componentType : GL_NONE);
He Yunchao11b038b2016-11-22 21:24:04 +080065 break;
66 case GL_TEXTURE_RED_SIZE:
jchen10a99ed552017-09-22 08:10:32 +080067 *params = CastFromGLintStateValue<ParamType>(pname, info->redBits);
He Yunchao11b038b2016-11-22 21:24:04 +080068 break;
69 case GL_TEXTURE_GREEN_SIZE:
jchen10a99ed552017-09-22 08:10:32 +080070 *params = CastFromGLintStateValue<ParamType>(pname, info->greenBits);
He Yunchao11b038b2016-11-22 21:24:04 +080071 break;
72 case GL_TEXTURE_BLUE_SIZE:
jchen10a99ed552017-09-22 08:10:32 +080073 *params = CastFromGLintStateValue<ParamType>(pname, info->blueBits);
He Yunchao11b038b2016-11-22 21:24:04 +080074 break;
75 case GL_TEXTURE_ALPHA_SIZE:
jchen10a99ed552017-09-22 08:10:32 +080076 *params = CastFromGLintStateValue<ParamType>(pname, info->alphaBits);
He Yunchao11b038b2016-11-22 21:24:04 +080077 break;
78 case GL_TEXTURE_DEPTH_SIZE:
jchen10a99ed552017-09-22 08:10:32 +080079 *params = CastFromGLintStateValue<ParamType>(pname, info->depthBits);
He Yunchao11b038b2016-11-22 21:24:04 +080080 break;
81 case GL_TEXTURE_STENCIL_SIZE:
jchen10a99ed552017-09-22 08:10:32 +080082 *params = CastFromGLintStateValue<ParamType>(pname, info->stencilBits);
He Yunchao11b038b2016-11-22 21:24:04 +080083 break;
84 case GL_TEXTURE_SHARED_SIZE:
jchen10a99ed552017-09-22 08:10:32 +080085 *params = CastFromGLintStateValue<ParamType>(pname, info->sharedBits);
He Yunchao11b038b2016-11-22 21:24:04 +080086 break;
87 case GL_TEXTURE_INTERNAL_FORMAT:
jchen10a99ed552017-09-22 08:10:32 +080088 *params = CastFromGLintStateValue<ParamType>(
89 pname, info->internalFormat ? info->internalFormat : GL_RGBA);
He Yunchao11b038b2016-11-22 21:24:04 +080090 break;
91 case GL_TEXTURE_WIDTH:
jchen10a99ed552017-09-22 08:10:32 +080092 *params = CastFromGLintStateValue<ParamType>(pname, texture->getWidth(target, level));
He Yunchao11b038b2016-11-22 21:24:04 +080093 break;
94 case GL_TEXTURE_HEIGHT:
jchen10a99ed552017-09-22 08:10:32 +080095 *params = CastFromGLintStateValue<ParamType>(pname, texture->getHeight(target, level));
He Yunchao11b038b2016-11-22 21:24:04 +080096 break;
97 case GL_TEXTURE_DEPTH:
jchen10a99ed552017-09-22 08:10:32 +080098 *params = CastFromGLintStateValue<ParamType>(pname, texture->getDepth(target, level));
He Yunchao11b038b2016-11-22 21:24:04 +080099 break;
100 case GL_TEXTURE_SAMPLES:
jchen10a99ed552017-09-22 08:10:32 +0800101 *params = CastFromStateValue<ParamType>(pname, texture->getSamples(target, level));
He Yunchao11b038b2016-11-22 21:24:04 +0800102 break;
103 case GL_TEXTURE_FIXED_SAMPLE_LOCATIONS:
jchen10a99ed552017-09-22 08:10:32 +0800104 *params = CastFromStateValue<ParamType>(
105 pname, static_cast<GLint>(texture->getFixedSampleLocations(target, level)));
He Yunchao11b038b2016-11-22 21:24:04 +0800106 break;
107 case GL_TEXTURE_COMPRESSED:
jchen10a99ed552017-09-22 08:10:32 +0800108 *params = CastFromStateValue<ParamType>(pname, static_cast<GLint>(info->compressed));
He Yunchao11b038b2016-11-22 21:24:04 +0800109 break;
110 default:
111 UNREACHABLE();
112 break;
113 }
114}
115
116template <typename ParamType>
Geoff Langc1984ed2016-10-07 12:41:00 -0400117void QueryTexParameterBase(const Texture *texture, GLenum pname, ParamType *params)
118{
119 ASSERT(texture != nullptr);
120
121 switch (pname)
122 {
123 case GL_TEXTURE_MAG_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800124 *params = CastFromGLintStateValue<ParamType>(pname, texture->getMagFilter());
Geoff Langc1984ed2016-10-07 12:41:00 -0400125 break;
126 case GL_TEXTURE_MIN_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800127 *params = CastFromGLintStateValue<ParamType>(pname, texture->getMinFilter());
Geoff Langc1984ed2016-10-07 12:41:00 -0400128 break;
129 case GL_TEXTURE_WRAP_S:
jchen10a99ed552017-09-22 08:10:32 +0800130 *params = CastFromGLintStateValue<ParamType>(pname, texture->getWrapS());
Geoff Langc1984ed2016-10-07 12:41:00 -0400131 break;
132 case GL_TEXTURE_WRAP_T:
jchen10a99ed552017-09-22 08:10:32 +0800133 *params = CastFromGLintStateValue<ParamType>(pname, texture->getWrapT());
Geoff Langc1984ed2016-10-07 12:41:00 -0400134 break;
135 case GL_TEXTURE_WRAP_R:
jchen10a99ed552017-09-22 08:10:32 +0800136 *params = CastFromGLintStateValue<ParamType>(pname, texture->getWrapR());
Geoff Langc1984ed2016-10-07 12:41:00 -0400137 break;
138 case GL_TEXTURE_IMMUTABLE_FORMAT:
jchen10a99ed552017-09-22 08:10:32 +0800139 *params = CastFromGLintStateValue<ParamType>(pname, texture->getImmutableFormat());
Geoff Langc1984ed2016-10-07 12:41:00 -0400140 break;
141 case GL_TEXTURE_IMMUTABLE_LEVELS:
jchen10a99ed552017-09-22 08:10:32 +0800142 *params = CastFromGLintStateValue<ParamType>(pname, texture->getImmutableLevels());
Geoff Langc1984ed2016-10-07 12:41:00 -0400143 break;
144 case GL_TEXTURE_USAGE_ANGLE:
jchen10a99ed552017-09-22 08:10:32 +0800145 *params = CastFromGLintStateValue<ParamType>(pname, texture->getUsage());
Geoff Langc1984ed2016-10-07 12:41:00 -0400146 break;
147 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800148 *params = CastFromStateValue<ParamType>(pname, texture->getMaxAnisotropy());
Geoff Langc1984ed2016-10-07 12:41:00 -0400149 break;
150 case GL_TEXTURE_SWIZZLE_R:
jchen10a99ed552017-09-22 08:10:32 +0800151 *params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleRed());
Geoff Langc1984ed2016-10-07 12:41:00 -0400152 break;
153 case GL_TEXTURE_SWIZZLE_G:
jchen10a99ed552017-09-22 08:10:32 +0800154 *params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleGreen());
Geoff Langc1984ed2016-10-07 12:41:00 -0400155 break;
156 case GL_TEXTURE_SWIZZLE_B:
jchen10a99ed552017-09-22 08:10:32 +0800157 *params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleBlue());
Geoff Langc1984ed2016-10-07 12:41:00 -0400158 break;
159 case GL_TEXTURE_SWIZZLE_A:
jchen10a99ed552017-09-22 08:10:32 +0800160 *params = CastFromGLintStateValue<ParamType>(pname, texture->getSwizzleAlpha());
Geoff Langc1984ed2016-10-07 12:41:00 -0400161 break;
162 case GL_TEXTURE_BASE_LEVEL:
jchen10a99ed552017-09-22 08:10:32 +0800163 *params = CastFromGLintStateValue<ParamType>(pname, texture->getBaseLevel());
Geoff Langc1984ed2016-10-07 12:41:00 -0400164 break;
165 case GL_TEXTURE_MAX_LEVEL:
jchen10a99ed552017-09-22 08:10:32 +0800166 *params = CastFromGLintStateValue<ParamType>(pname, texture->getMaxLevel());
Geoff Langc1984ed2016-10-07 12:41:00 -0400167 break;
168 case GL_TEXTURE_MIN_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800169 *params = CastFromStateValue<ParamType>(pname, texture->getSamplerState().minLod);
Geoff Langc1984ed2016-10-07 12:41:00 -0400170 break;
171 case GL_TEXTURE_MAX_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800172 *params = CastFromStateValue<ParamType>(pname, texture->getSamplerState().maxLod);
Geoff Langc1984ed2016-10-07 12:41:00 -0400173 break;
174 case GL_TEXTURE_COMPARE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800175 *params = CastFromGLintStateValue<ParamType>(pname, texture->getCompareMode());
Geoff Langc1984ed2016-10-07 12:41:00 -0400176 break;
177 case GL_TEXTURE_COMPARE_FUNC:
jchen10a99ed552017-09-22 08:10:32 +0800178 *params = CastFromGLintStateValue<ParamType>(pname, texture->getCompareFunc());
Geoff Langc1984ed2016-10-07 12:41:00 -0400179 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700180 case GL_TEXTURE_SRGB_DECODE_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800181 *params = CastFromGLintStateValue<ParamType>(pname, texture->getSRGBDecode());
Geoff Lang81c6b572016-10-19 14:07:52 -0700182 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400183 default:
184 UNREACHABLE();
185 break;
186 }
187}
188
189template <typename ParamType>
Jamie Madill4928b7c2017-06-20 12:57:39 -0400190void SetTexParameterBase(Context *context, Texture *texture, GLenum pname, const ParamType *params)
Geoff Langc1984ed2016-10-07 12:41:00 -0400191{
192 ASSERT(texture != nullptr);
193
194 switch (pname)
195 {
196 case GL_TEXTURE_WRAP_S:
jchen10a99ed552017-09-22 08:10:32 +0800197 texture->setWrapS(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400198 break;
199 case GL_TEXTURE_WRAP_T:
jchen10a99ed552017-09-22 08:10:32 +0800200 texture->setWrapT(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400201 break;
202 case GL_TEXTURE_WRAP_R:
jchen10a99ed552017-09-22 08:10:32 +0800203 texture->setWrapR(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400204 break;
205 case GL_TEXTURE_MIN_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800206 texture->setMinFilter(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400207 break;
208 case GL_TEXTURE_MAG_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800209 texture->setMagFilter(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400210 break;
211 case GL_TEXTURE_USAGE_ANGLE:
jchen10a99ed552017-09-22 08:10:32 +0800212 texture->setUsage(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400213 break;
214 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800215 texture->setMaxAnisotropy(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400216 break;
217 case GL_TEXTURE_COMPARE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800218 texture->setCompareMode(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400219 break;
220 case GL_TEXTURE_COMPARE_FUNC:
jchen10a99ed552017-09-22 08:10:32 +0800221 texture->setCompareFunc(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400222 break;
223 case GL_TEXTURE_SWIZZLE_R:
jchen10a99ed552017-09-22 08:10:32 +0800224 texture->setSwizzleRed(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400225 break;
226 case GL_TEXTURE_SWIZZLE_G:
jchen10a99ed552017-09-22 08:10:32 +0800227 texture->setSwizzleGreen(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400228 break;
229 case GL_TEXTURE_SWIZZLE_B:
jchen10a99ed552017-09-22 08:10:32 +0800230 texture->setSwizzleBlue(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400231 break;
232 case GL_TEXTURE_SWIZZLE_A:
jchen10a99ed552017-09-22 08:10:32 +0800233 texture->setSwizzleAlpha(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400234 break;
235 case GL_TEXTURE_BASE_LEVEL:
Jamie Madill4928b7c2017-06-20 12:57:39 -0400236 {
jchen10a99ed552017-09-22 08:10:32 +0800237 context->handleError(texture->setBaseLevel(
238 context, clampCast<GLuint>(CastQueryValueTo<GLint>(pname, params[0]))));
Geoff Langc1984ed2016-10-07 12:41:00 -0400239 break;
Jamie Madill4928b7c2017-06-20 12:57:39 -0400240 }
Geoff Langc1984ed2016-10-07 12:41:00 -0400241 case GL_TEXTURE_MAX_LEVEL:
jchen10a99ed552017-09-22 08:10:32 +0800242 texture->setMaxLevel(clampCast<GLuint>(CastQueryValueTo<GLint>(pname, params[0])));
Geoff Langc1984ed2016-10-07 12:41:00 -0400243 break;
244 case GL_TEXTURE_MIN_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800245 texture->setMinLod(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400246 break;
247 case GL_TEXTURE_MAX_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800248 texture->setMaxLod(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400249 break;
Geoff Lang3b573612016-10-31 14:08:10 -0400250 case GL_DEPTH_STENCIL_TEXTURE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800251 texture->setDepthStencilTextureMode(ConvertToGLenum(pname, params[0]));
Geoff Lang3b573612016-10-31 14:08:10 -0400252 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700253 case GL_TEXTURE_SRGB_DECODE_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800254 texture->setSRGBDecode(ConvertToGLenum(pname, params[0]));
Geoff Lang81c6b572016-10-19 14:07:52 -0700255 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400256 default:
257 UNREACHABLE();
258 break;
259 }
260}
261
262template <typename ParamType>
263void QuerySamplerParameterBase(const Sampler *sampler, GLenum pname, ParamType *params)
264{
265 switch (pname)
266 {
267 case GL_TEXTURE_MIN_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800268 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getMinFilter());
Geoff Langc1984ed2016-10-07 12:41:00 -0400269 break;
270 case GL_TEXTURE_MAG_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800271 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getMagFilter());
Geoff Langc1984ed2016-10-07 12:41:00 -0400272 break;
273 case GL_TEXTURE_WRAP_S:
jchen10a99ed552017-09-22 08:10:32 +0800274 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getWrapS());
Geoff Langc1984ed2016-10-07 12:41:00 -0400275 break;
276 case GL_TEXTURE_WRAP_T:
jchen10a99ed552017-09-22 08:10:32 +0800277 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getWrapT());
Geoff Langc1984ed2016-10-07 12:41:00 -0400278 break;
279 case GL_TEXTURE_WRAP_R:
jchen10a99ed552017-09-22 08:10:32 +0800280 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getWrapR());
Geoff Langc1984ed2016-10-07 12:41:00 -0400281 break;
282 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800283 *params = CastFromStateValue<ParamType>(pname, sampler->getMaxAnisotropy());
Geoff Langc1984ed2016-10-07 12:41:00 -0400284 break;
285 case GL_TEXTURE_MIN_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800286 *params = CastFromStateValue<ParamType>(pname, sampler->getMinLod());
Geoff Langc1984ed2016-10-07 12:41:00 -0400287 break;
288 case GL_TEXTURE_MAX_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800289 *params = CastFromStateValue<ParamType>(pname, sampler->getMaxLod());
Geoff Langc1984ed2016-10-07 12:41:00 -0400290 break;
291 case GL_TEXTURE_COMPARE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800292 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getCompareMode());
Geoff Langc1984ed2016-10-07 12:41:00 -0400293 break;
294 case GL_TEXTURE_COMPARE_FUNC:
jchen10a99ed552017-09-22 08:10:32 +0800295 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getCompareFunc());
Geoff Langc1984ed2016-10-07 12:41:00 -0400296 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700297 case GL_TEXTURE_SRGB_DECODE_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800298 *params = CastFromGLintStateValue<ParamType>(pname, sampler->getSRGBDecode());
Geoff Lang81c6b572016-10-19 14:07:52 -0700299 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400300 default:
301 UNREACHABLE();
302 break;
303 }
304}
305
306template <typename ParamType>
307void SetSamplerParameterBase(Sampler *sampler, GLenum pname, const ParamType *params)
308{
309 switch (pname)
310 {
311 case GL_TEXTURE_WRAP_S:
jchen10a99ed552017-09-22 08:10:32 +0800312 sampler->setWrapS(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400313 break;
314 case GL_TEXTURE_WRAP_T:
jchen10a99ed552017-09-22 08:10:32 +0800315 sampler->setWrapT(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400316 break;
317 case GL_TEXTURE_WRAP_R:
jchen10a99ed552017-09-22 08:10:32 +0800318 sampler->setWrapR(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400319 break;
320 case GL_TEXTURE_MIN_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800321 sampler->setMinFilter(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400322 break;
323 case GL_TEXTURE_MAG_FILTER:
jchen10a99ed552017-09-22 08:10:32 +0800324 sampler->setMagFilter(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400325 break;
326 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800327 sampler->setMaxAnisotropy(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400328 break;
329 case GL_TEXTURE_COMPARE_MODE:
jchen10a99ed552017-09-22 08:10:32 +0800330 sampler->setCompareMode(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400331 break;
332 case GL_TEXTURE_COMPARE_FUNC:
jchen10a99ed552017-09-22 08:10:32 +0800333 sampler->setCompareFunc(ConvertToGLenum(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400334 break;
335 case GL_TEXTURE_MIN_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800336 sampler->setMinLod(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400337 break;
338 case GL_TEXTURE_MAX_LOD:
jchen10a99ed552017-09-22 08:10:32 +0800339 sampler->setMaxLod(CastQueryValueTo<GLfloat>(pname, params[0]));
Geoff Langc1984ed2016-10-07 12:41:00 -0400340 break;
Geoff Lang81c6b572016-10-19 14:07:52 -0700341 case GL_TEXTURE_SRGB_DECODE_EXT:
jchen10a99ed552017-09-22 08:10:32 +0800342 sampler->setSRGBDecode(ConvertToGLenum(pname, params[0]));
Geoff Lang81c6b572016-10-19 14:07:52 -0700343 break;
Geoff Langc1984ed2016-10-07 12:41:00 -0400344 default:
345 UNREACHABLE();
346 break;
347 }
348}
349
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800350// Warning: you should ensure binding really matches attrib.bindingIndex before using this function.
Geoff Lang0b031062016-10-13 14:30:04 -0400351template <typename ParamType, typename CurrentDataType, size_t CurrentValueCount>
352void QueryVertexAttribBase(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800353 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -0400354 const CurrentDataType (&currentValueData)[CurrentValueCount],
355 GLenum pname,
356 ParamType *params)
357{
358 switch (pname)
359 {
360 case GL_CURRENT_VERTEX_ATTRIB:
361 for (size_t i = 0; i < CurrentValueCount; ++i)
362 {
jchen10a99ed552017-09-22 08:10:32 +0800363 params[i] = CastFromStateValue<ParamType>(pname, currentValueData[i]);
Geoff Lang0b031062016-10-13 14:30:04 -0400364 }
365 break;
366 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
jchen10a99ed552017-09-22 08:10:32 +0800367 *params = CastFromStateValue<ParamType>(pname, static_cast<GLint>(attrib.enabled));
Geoff Lang0b031062016-10-13 14:30:04 -0400368 break;
369 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
jchen10a99ed552017-09-22 08:10:32 +0800370 *params = CastFromGLintStateValue<ParamType>(pname, attrib.size);
Geoff Lang0b031062016-10-13 14:30:04 -0400371 break;
372 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
jchen10a99ed552017-09-22 08:10:32 +0800373 *params = CastFromGLintStateValue<ParamType>(pname, attrib.vertexAttribArrayStride);
Geoff Lang0b031062016-10-13 14:30:04 -0400374 break;
375 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
jchen10a99ed552017-09-22 08:10:32 +0800376 *params = CastFromGLintStateValue<ParamType>(pname, attrib.type);
Geoff Lang0b031062016-10-13 14:30:04 -0400377 break;
378 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
jchen10a99ed552017-09-22 08:10:32 +0800379 *params = CastFromStateValue<ParamType>(pname, static_cast<GLint>(attrib.normalized));
Geoff Lang0b031062016-10-13 14:30:04 -0400380 break;
381 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
jchen10a99ed552017-09-22 08:10:32 +0800382 *params = CastFromGLintStateValue<ParamType>(pname, binding.getBuffer().id());
Geoff Lang0b031062016-10-13 14:30:04 -0400383 break;
384 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
jchen10a99ed552017-09-22 08:10:32 +0800385 *params = CastFromGLintStateValue<ParamType>(pname, binding.getDivisor());
Geoff Lang0b031062016-10-13 14:30:04 -0400386 break;
387 case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
jchen10a99ed552017-09-22 08:10:32 +0800388 *params = CastFromGLintStateValue<ParamType>(pname, attrib.pureInteger);
Geoff Lang0b031062016-10-13 14:30:04 -0400389 break;
Shao80957d92017-02-20 21:25:59 +0800390 case GL_VERTEX_ATTRIB_BINDING:
jchen10a99ed552017-09-22 08:10:32 +0800391 *params = CastFromGLintStateValue<ParamType>(pname, attrib.bindingIndex);
Shao80957d92017-02-20 21:25:59 +0800392 break;
393 case GL_VERTEX_ATTRIB_RELATIVE_OFFSET:
jchen10a99ed552017-09-22 08:10:32 +0800394 *params = CastFromGLintStateValue<ParamType>(pname, attrib.relativeOffset);
Shao80957d92017-02-20 21:25:59 +0800395 break;
Geoff Lang0b031062016-10-13 14:30:04 -0400396 default:
397 UNREACHABLE();
398 break;
399 }
400}
401
Geoff Langebebe1c2016-10-14 12:01:31 -0400402template <typename ParamType>
403void QueryBufferParameterBase(const Buffer *buffer, GLenum pname, ParamType *params)
404{
405 ASSERT(buffer != nullptr);
406
407 switch (pname)
408 {
409 case GL_BUFFER_USAGE:
jchen10a99ed552017-09-22 08:10:32 +0800410 *params = CastFromGLintStateValue<ParamType>(pname, buffer->getUsage());
Geoff Langebebe1c2016-10-14 12:01:31 -0400411 break;
412 case GL_BUFFER_SIZE:
jchen10a99ed552017-09-22 08:10:32 +0800413 *params = CastFromStateValue<ParamType>(pname, buffer->getSize());
Geoff Langebebe1c2016-10-14 12:01:31 -0400414 break;
415 case GL_BUFFER_ACCESS_FLAGS:
jchen10a99ed552017-09-22 08:10:32 +0800416 *params = CastFromGLintStateValue<ParamType>(pname, buffer->getAccessFlags());
Geoff Langebebe1c2016-10-14 12:01:31 -0400417 break;
418 case GL_BUFFER_ACCESS_OES:
jchen10a99ed552017-09-22 08:10:32 +0800419 *params = CastFromGLintStateValue<ParamType>(pname, buffer->getAccess());
Geoff Langebebe1c2016-10-14 12:01:31 -0400420 break;
421 case GL_BUFFER_MAPPED:
jchen10a99ed552017-09-22 08:10:32 +0800422 *params = CastFromStateValue<ParamType>(pname, buffer->isMapped());
Geoff Langebebe1c2016-10-14 12:01:31 -0400423 break;
424 case GL_BUFFER_MAP_OFFSET:
jchen10a99ed552017-09-22 08:10:32 +0800425 *params = CastFromStateValue<ParamType>(pname, buffer->getMapOffset());
Geoff Langebebe1c2016-10-14 12:01:31 -0400426 break;
427 case GL_BUFFER_MAP_LENGTH:
jchen10a99ed552017-09-22 08:10:32 +0800428 *params = CastFromStateValue<ParamType>(pname, buffer->getMapLength());
Geoff Langebebe1c2016-10-14 12:01:31 -0400429 break;
430 default:
431 UNREACHABLE();
432 break;
433 }
434}
435
jchen10880683b2017-04-12 16:21:55 +0800436GLint GetLocationVariableProperty(const sh::VariableWithLocation &var, GLenum prop)
437{
438 switch (prop)
439 {
440 case GL_TYPE:
jchen10a99ed552017-09-22 08:10:32 +0800441 return clampCast<GLint>(var.type);
jchen10880683b2017-04-12 16:21:55 +0800442
443 case GL_ARRAY_SIZE:
444 // TODO(jie.a.chen@intel.com): check array of array.
445 if (var.isArray() && !var.isStruct())
446 {
jchen10a99ed552017-09-22 08:10:32 +0800447 return clampCast<GLint>(var.elementCount());
jchen10880683b2017-04-12 16:21:55 +0800448 }
449 return 1;
450
451 case GL_NAME_LENGTH:
452 {
jchen10d9cd7b72017-08-30 15:04:25 +0800453 size_t length = var.name.size();
jchen10880683b2017-04-12 16:21:55 +0800454 if (var.isArray())
455 {
456 // Counts "[0]".
457 length += 3;
458 }
459 // ES31 spec p84: This counts the terminating null char.
460 ++length;
jchen10a99ed552017-09-22 08:10:32 +0800461 return clampCast<GLint>(length);
jchen10880683b2017-04-12 16:21:55 +0800462 }
463
464 case GL_LOCATION:
465 return var.location;
466
467 default:
468 UNREACHABLE();
469 return GL_INVALID_VALUE;
470 }
471}
472
473GLint GetInputResourceProperty(const Program *program, GLuint index, GLenum prop)
474{
475 const auto &attribute = program->getInputResource(index);
476 switch (prop)
477 {
478 case GL_TYPE:
479 case GL_ARRAY_SIZE:
480 case GL_LOCATION:
481 case GL_NAME_LENGTH:
482 return GetLocationVariableProperty(attribute, prop);
483
484 case GL_REFERENCED_BY_VERTEX_SHADER:
485 return 1;
486
487 case GL_REFERENCED_BY_FRAGMENT_SHADER:
488 case GL_REFERENCED_BY_COMPUTE_SHADER:
489 return 0;
490
491 default:
492 UNREACHABLE();
493 return GL_INVALID_VALUE;
494 }
495}
496
497GLint GetOutputResourceProperty(const Program *program, GLuint index, const GLenum prop)
498{
499 const auto &outputVariable = program->getOutputResource(index);
500 switch (prop)
501 {
502 case GL_TYPE:
503 case GL_ARRAY_SIZE:
504 case GL_LOCATION:
505 case GL_NAME_LENGTH:
506 return GetLocationVariableProperty(outputVariable, prop);
507
508 case GL_REFERENCED_BY_VERTEX_SHADER:
509 return 0;
510
511 case GL_REFERENCED_BY_FRAGMENT_SHADER:
512 return 1;
513
514 case GL_REFERENCED_BY_COMPUTE_SHADER:
515 return 0;
516
517 default:
518 UNREACHABLE();
519 return GL_INVALID_VALUE;
520 }
521}
522
jchen10d9cd7b72017-08-30 15:04:25 +0800523GLint QueryProgramInterfaceActiveResources(const Program *program, GLenum programInterface)
524{
525 switch (programInterface)
526 {
527 case GL_PROGRAM_INPUT:
jchen10a99ed552017-09-22 08:10:32 +0800528 return clampCast<GLint>(program->getAttributes().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800529
530 case GL_PROGRAM_OUTPUT:
jchen10a99ed552017-09-22 08:10:32 +0800531 return clampCast<GLint>(program->getState().getOutputVariables().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800532
533 case GL_UNIFORM:
jchen10a99ed552017-09-22 08:10:32 +0800534 return clampCast<GLint>(program->getState().getUniforms().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800535
536 case GL_UNIFORM_BLOCK:
jchen10a99ed552017-09-22 08:10:32 +0800537 return clampCast<GLint>(program->getState().getUniformBlocks().size());
jchen10d9cd7b72017-08-30 15:04:25 +0800538
539 // TODO(jie.a.chen@intel.com): more interfaces.
540 case GL_TRANSFORM_FEEDBACK_VARYING:
541 case GL_BUFFER_VARIABLE:
542 case GL_SHADER_STORAGE_BLOCK:
543 case GL_ATOMIC_COUNTER_BUFFER:
544 UNIMPLEMENTED();
545 return 0;
546
547 default:
548 UNREACHABLE();
549 return 0;
550 }
551}
552
553template <typename T, typename M>
554GLint FindMaxSize(const std::vector<T> &resources, M member)
555{
556 GLint max = 0;
557 for (const T &resource : resources)
558 {
jchen10a99ed552017-09-22 08:10:32 +0800559 max = std::max(max, clampCast<GLint>((resource.*member).size()));
jchen10d9cd7b72017-08-30 15:04:25 +0800560 }
561 return max;
562}
563
564GLint QueryProgramInterfaceMaxNameLength(const Program *program, GLenum programInterface)
565{
566 GLint maxNameLength = 0;
567 switch (programInterface)
568 {
569 case GL_PROGRAM_INPUT:
570 maxNameLength = FindMaxSize(program->getAttributes(), &sh::Attribute::name);
571 break;
572
573 case GL_PROGRAM_OUTPUT:
574 maxNameLength =
575 FindMaxSize(program->getState().getOutputVariables(), &sh::OutputVariable::name);
576 break;
577
578 case GL_UNIFORM:
579 maxNameLength = FindMaxSize(program->getState().getUniforms(), &LinkedUniform::name);
580 break;
581
582 case GL_UNIFORM_BLOCK:
583 maxNameLength =
Jiajia Qin729b2c62017-08-14 09:36:11 +0800584 FindMaxSize(program->getState().getUniformBlocks(), &InterfaceBlock::name);
jchen10d9cd7b72017-08-30 15:04:25 +0800585 break;
586
587 // TODO(jie.a.chen@intel.com): more interfaces.
588 case GL_TRANSFORM_FEEDBACK_VARYING:
589 case GL_BUFFER_VARIABLE:
590 case GL_SHADER_STORAGE_BLOCK:
591 UNIMPLEMENTED();
592 return 0;
593
594 default:
595 UNREACHABLE();
596 return 0;
597 }
598 // This length includes an extra character for the null terminator.
599 return (maxNameLength == 0 ? 0 : maxNameLength + 1);
600}
601
602GLint QueryProgramInterfaceMaxNumActiveVariables(const Program *program, GLenum programInterface)
603{
604 switch (programInterface)
605 {
606 case GL_UNIFORM_BLOCK:
607 return FindMaxSize(program->getState().getUniformBlocks(),
Jiajia Qin729b2c62017-08-14 09:36:11 +0800608 &InterfaceBlock::memberIndexes);
jchen10d9cd7b72017-08-30 15:04:25 +0800609
610 // TODO(jie.a.chen@intel.com): more interfaces.
611 case GL_SHADER_STORAGE_BLOCK:
612 case GL_ATOMIC_COUNTER_BUFFER:
613 UNIMPLEMENTED();
614 return 0;
615
616 default:
617 UNREACHABLE();
618 return 0;
619 }
620}
621
Geoff Langc1984ed2016-10-07 12:41:00 -0400622} // anonymous namespace
623
Geoff Langff5b2d52016-09-07 11:32:23 -0400624void QueryFramebufferAttachmentParameteriv(const Framebuffer *framebuffer,
625 GLenum attachment,
626 GLenum pname,
627 GLint *params)
628{
629 ASSERT(framebuffer);
630
631 const FramebufferAttachment *attachmentObject = framebuffer->getAttachment(attachment);
632 if (attachmentObject == nullptr)
633 {
634 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
635 // is NONE, then querying any other pname will generate INVALID_ENUM.
636
637 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
638 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
639 // INVALID_OPERATION for all other pnames
640
641 switch (pname)
642 {
643 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
644 *params = GL_NONE;
645 break;
646
647 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
648 *params = 0;
649 break;
650
651 default:
652 UNREACHABLE();
653 break;
654 }
655
656 return;
657 }
658
659 switch (pname)
660 {
661 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
662 *params = attachmentObject->type();
663 break;
664
665 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
666 *params = attachmentObject->id();
667 break;
668
669 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
670 *params = attachmentObject->mipLevel();
671 break;
672
673 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
674 *params = attachmentObject->cubeMapFace();
675 break;
676
677 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
678 *params = attachmentObject->getRedSize();
679 break;
680
681 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
682 *params = attachmentObject->getGreenSize();
683 break;
684
685 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
686 *params = attachmentObject->getBlueSize();
687 break;
688
689 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
690 *params = attachmentObject->getAlphaSize();
691 break;
692
693 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
694 *params = attachmentObject->getDepthSize();
695 break;
696
697 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
698 *params = attachmentObject->getStencilSize();
699 break;
700
701 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
702 *params = attachmentObject->getComponentType();
703 break;
704
705 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
706 *params = attachmentObject->getColorEncoding();
707 break;
708
709 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
710 *params = attachmentObject->layer();
711 break;
712
Martin Radeve5285d22017-07-14 16:23:53 +0300713 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_ANGLE:
714 *params = attachmentObject->getNumViews();
715 break;
716
717 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_MULTIVIEW_LAYOUT_ANGLE:
718 *params = static_cast<GLint>(attachmentObject->getMultiviewLayout());
719 break;
720
721 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_ANGLE:
722 *params = attachmentObject->getBaseViewIndex();
723 break;
724
725 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_VIEWPORT_OFFSETS_ANGLE:
726 {
727 const std::vector<Offset> &offsets = attachmentObject->getMultiviewViewportOffsets();
728 for (size_t i = 0u; i < offsets.size(); ++i)
729 {
730 params[i * 2u] = offsets[i].x;
731 params[i * 2u + 1u] = offsets[i].y;
732 }
733 }
734 break;
735
Geoff Langff5b2d52016-09-07 11:32:23 -0400736 default:
737 UNREACHABLE();
738 break;
739 }
740}
741
742void QueryBufferParameteriv(const Buffer *buffer, GLenum pname, GLint *params)
743{
Geoff Langebebe1c2016-10-14 12:01:31 -0400744 QueryBufferParameterBase(buffer, pname, params);
745}
Geoff Langff5b2d52016-09-07 11:32:23 -0400746
Geoff Langebebe1c2016-10-14 12:01:31 -0400747void QueryBufferParameteri64v(const Buffer *buffer, GLenum pname, GLint64 *params)
748{
749 QueryBufferParameterBase(buffer, pname, params);
Geoff Langff5b2d52016-09-07 11:32:23 -0400750}
751
Geoff Lang496c02d2016-10-20 11:38:11 -0700752void QueryBufferPointerv(const Buffer *buffer, GLenum pname, void **params)
753{
754 switch (pname)
755 {
756 case GL_BUFFER_MAP_POINTER:
757 *params = buffer->getMapPointer();
758 break;
759
760 default:
761 UNREACHABLE();
762 break;
763 }
764}
765
Jamie Madillffe00c02017-06-27 16:26:55 -0400766void QueryProgramiv(const Context *context, const Program *program, GLenum pname, GLint *params)
Geoff Langff5b2d52016-09-07 11:32:23 -0400767{
768 ASSERT(program != nullptr);
769
770 switch (pname)
771 {
772 case GL_DELETE_STATUS:
773 *params = program->isFlaggedForDeletion();
774 return;
775 case GL_LINK_STATUS:
776 *params = program->isLinked();
777 return;
778 case GL_VALIDATE_STATUS:
779 *params = program->isValidated();
780 return;
781 case GL_INFO_LOG_LENGTH:
782 *params = program->getInfoLogLength();
783 return;
784 case GL_ATTACHED_SHADERS:
785 *params = program->getAttachedShadersCount();
786 return;
787 case GL_ACTIVE_ATTRIBUTES:
788 *params = program->getActiveAttributeCount();
789 return;
790 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
791 *params = program->getActiveAttributeMaxLength();
792 return;
793 case GL_ACTIVE_UNIFORMS:
794 *params = program->getActiveUniformCount();
795 return;
796 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
797 *params = program->getActiveUniformMaxLength();
798 return;
799 case GL_PROGRAM_BINARY_LENGTH_OES:
Jamie Madillffe00c02017-06-27 16:26:55 -0400800 *params = program->getBinaryLength(context);
Geoff Langff5b2d52016-09-07 11:32:23 -0400801 return;
802 case GL_ACTIVE_UNIFORM_BLOCKS:
803 *params = program->getActiveUniformBlockCount();
804 return;
805 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
806 *params = program->getActiveUniformBlockMaxLength();
807 break;
808 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
809 *params = program->getTransformFeedbackBufferMode();
810 break;
811 case GL_TRANSFORM_FEEDBACK_VARYINGS:
812 *params = program->getTransformFeedbackVaryingCount();
813 break;
814 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
815 *params = program->getTransformFeedbackVaryingMaxLength();
816 break;
817 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
818 *params = program->getBinaryRetrievableHint();
819 break;
Yunchao He61afff12017-03-14 15:34:03 +0800820 case GL_PROGRAM_SEPARABLE:
821 *params = program->isSeparable();
822 break;
Geoff Langff5b2d52016-09-07 11:32:23 -0400823 default:
824 UNREACHABLE();
825 break;
826 }
827}
Geoff Lang740d9022016-10-07 11:20:52 -0400828
Jamie Madill4e0e6f82017-02-17 11:06:03 -0500829void QueryRenderbufferiv(const Context *context,
830 const Renderbuffer *renderbuffer,
831 GLenum pname,
832 GLint *params)
Geoff Lang740d9022016-10-07 11:20:52 -0400833{
834 ASSERT(renderbuffer != nullptr);
835
836 switch (pname)
837 {
838 case GL_RENDERBUFFER_WIDTH:
839 *params = renderbuffer->getWidth();
840 break;
841 case GL_RENDERBUFFER_HEIGHT:
842 *params = renderbuffer->getHeight();
843 break;
844 case GL_RENDERBUFFER_INTERNAL_FORMAT:
Jamie Madill4e0e6f82017-02-17 11:06:03 -0500845 // Special case the WebGL 1 DEPTH_STENCIL format.
Jamie Madilla02315b2017-02-23 14:14:47 -0500846 if (context->isWebGL1() &&
Jamie Madill4e0e6f82017-02-17 11:06:03 -0500847 renderbuffer->getFormat().info->internalFormat == GL_DEPTH24_STENCIL8)
848 {
849 *params = GL_DEPTH_STENCIL;
850 }
851 else
852 {
853 *params = renderbuffer->getFormat().info->internalFormat;
854 }
Geoff Lang740d9022016-10-07 11:20:52 -0400855 break;
856 case GL_RENDERBUFFER_RED_SIZE:
857 *params = renderbuffer->getRedSize();
858 break;
859 case GL_RENDERBUFFER_GREEN_SIZE:
860 *params = renderbuffer->getGreenSize();
861 break;
862 case GL_RENDERBUFFER_BLUE_SIZE:
863 *params = renderbuffer->getBlueSize();
864 break;
865 case GL_RENDERBUFFER_ALPHA_SIZE:
866 *params = renderbuffer->getAlphaSize();
867 break;
868 case GL_RENDERBUFFER_DEPTH_SIZE:
869 *params = renderbuffer->getDepthSize();
870 break;
871 case GL_RENDERBUFFER_STENCIL_SIZE:
872 *params = renderbuffer->getStencilSize();
873 break;
874 case GL_RENDERBUFFER_SAMPLES_ANGLE:
875 *params = renderbuffer->getSamples();
876 break;
877 default:
878 UNREACHABLE();
879 break;
880 }
881}
Geoff Langd7d0ed32016-10-07 11:33:51 -0400882
Jamie Madillbd044ed2017-06-05 12:59:21 -0400883void QueryShaderiv(const Context *context, Shader *shader, GLenum pname, GLint *params)
Geoff Langd7d0ed32016-10-07 11:33:51 -0400884{
885 ASSERT(shader != nullptr);
886
887 switch (pname)
888 {
889 case GL_SHADER_TYPE:
890 *params = shader->getType();
891 return;
892 case GL_DELETE_STATUS:
893 *params = shader->isFlaggedForDeletion();
894 return;
895 case GL_COMPILE_STATUS:
Jamie Madillbd044ed2017-06-05 12:59:21 -0400896 *params = shader->isCompiled(context) ? GL_TRUE : GL_FALSE;
Geoff Langd7d0ed32016-10-07 11:33:51 -0400897 return;
898 case GL_INFO_LOG_LENGTH:
Jamie Madillbd044ed2017-06-05 12:59:21 -0400899 *params = shader->getInfoLogLength(context);
Geoff Langd7d0ed32016-10-07 11:33:51 -0400900 return;
901 case GL_SHADER_SOURCE_LENGTH:
902 *params = shader->getSourceLength();
903 return;
904 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
Jamie Madillbd044ed2017-06-05 12:59:21 -0400905 *params = shader->getTranslatedSourceWithDebugInfoLength(context);
Geoff Langd7d0ed32016-10-07 11:33:51 -0400906 return;
907 default:
908 UNREACHABLE();
909 break;
910 }
911}
Geoff Langc1984ed2016-10-07 12:41:00 -0400912
He Yunchao11b038b2016-11-22 21:24:04 +0800913void QueryTexLevelParameterfv(const Texture *texture,
914 GLenum target,
915 GLint level,
916 GLenum pname,
917 GLfloat *params)
918{
919 QueryTexLevelParameterBase(texture, target, level, pname, params);
920}
921
922void QueryTexLevelParameteriv(const Texture *texture,
923 GLenum target,
924 GLint level,
925 GLenum pname,
926 GLint *params)
927{
928 QueryTexLevelParameterBase(texture, target, level, pname, params);
929}
930
Geoff Langc1984ed2016-10-07 12:41:00 -0400931void QueryTexParameterfv(const Texture *texture, GLenum pname, GLfloat *params)
932{
933 QueryTexParameterBase(texture, pname, params);
934}
935
936void QueryTexParameteriv(const Texture *texture, GLenum pname, GLint *params)
937{
938 QueryTexParameterBase(texture, pname, params);
939}
940
941void QuerySamplerParameterfv(const Sampler *sampler, GLenum pname, GLfloat *params)
942{
943 QuerySamplerParameterBase(sampler, pname, params);
944}
945
946void QuerySamplerParameteriv(const Sampler *sampler, GLenum pname, GLint *params)
947{
948 QuerySamplerParameterBase(sampler, pname, params);
949}
950
Geoff Lang0b031062016-10-13 14:30:04 -0400951void QueryVertexAttribfv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800952 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -0400953 const VertexAttribCurrentValueData &currentValueData,
954 GLenum pname,
955 GLfloat *params)
956{
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800957 QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -0400958}
959
960void QueryVertexAttribiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800961 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -0400962 const VertexAttribCurrentValueData &currentValueData,
963 GLenum pname,
964 GLint *params)
965{
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800966 QueryVertexAttribBase(attrib, binding, currentValueData.FloatValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -0400967}
968
Jamie Madill876429b2017-04-20 15:46:24 -0400969void QueryVertexAttribPointerv(const VertexAttribute &attrib, GLenum pname, void **pointer)
Geoff Lang0b031062016-10-13 14:30:04 -0400970{
971 switch (pname)
972 {
973 case GL_VERTEX_ATTRIB_ARRAY_POINTER:
Jamie Madill876429b2017-04-20 15:46:24 -0400974 *pointer = const_cast<void *>(attrib.pointer);
Geoff Lang0b031062016-10-13 14:30:04 -0400975 break;
976
977 default:
978 UNREACHABLE();
979 break;
980 }
981}
982
983void QueryVertexAttribIiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800984 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -0400985 const VertexAttribCurrentValueData &currentValueData,
986 GLenum pname,
987 GLint *params)
988{
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800989 QueryVertexAttribBase(attrib, binding, currentValueData.IntValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -0400990}
991
992void QueryVertexAttribIuiv(const VertexAttribute &attrib,
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800993 const VertexBinding &binding,
Geoff Lang0b031062016-10-13 14:30:04 -0400994 const VertexAttribCurrentValueData &currentValueData,
995 GLenum pname,
996 GLuint *params)
997{
Jiawei-Shao2597fb62016-12-09 16:38:02 +0800998 QueryVertexAttribBase(attrib, binding, currentValueData.UnsignedIntValues, pname, params);
Geoff Lang0b031062016-10-13 14:30:04 -0400999}
1000
Geoff Lang6899b872016-10-14 11:30:13 -04001001void QueryActiveUniformBlockiv(const Program *program,
1002 GLuint uniformBlockIndex,
1003 GLenum pname,
1004 GLint *params)
1005{
Jiajia Qin729b2c62017-08-14 09:36:11 +08001006 const InterfaceBlock &uniformBlock = program->getUniformBlockByIndex(uniformBlockIndex);
Geoff Lang6899b872016-10-14 11:30:13 -04001007 switch (pname)
1008 {
1009 case GL_UNIFORM_BLOCK_BINDING:
jchen10a99ed552017-09-22 08:10:32 +08001010 *params = clampCast<GLint>(program->getUniformBlockBinding(uniformBlockIndex));
Geoff Lang6899b872016-10-14 11:30:13 -04001011 break;
1012 case GL_UNIFORM_BLOCK_DATA_SIZE:
jchen10a99ed552017-09-22 08:10:32 +08001013 *params = clampCast<GLint>(uniformBlock.dataSize);
Geoff Lang6899b872016-10-14 11:30:13 -04001014 break;
1015 case GL_UNIFORM_BLOCK_NAME_LENGTH:
jchen10a99ed552017-09-22 08:10:32 +08001016 *params = clampCast<GLint>(uniformBlock.nameWithArrayIndex().size() + 1);
Geoff Lang6899b872016-10-14 11:30:13 -04001017 break;
1018 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
jchen10a99ed552017-09-22 08:10:32 +08001019 *params = clampCast<GLint>(uniformBlock.memberIndexes.size());
Geoff Lang6899b872016-10-14 11:30:13 -04001020 break;
1021 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
jchen10eaef1e52017-06-13 10:44:11 +08001022 for (size_t blockMemberIndex = 0; blockMemberIndex < uniformBlock.memberIndexes.size();
1023 blockMemberIndex++)
Geoff Lang6899b872016-10-14 11:30:13 -04001024 {
1025 params[blockMemberIndex] =
jchen10a99ed552017-09-22 08:10:32 +08001026 clampCast<GLint>(uniformBlock.memberIndexes[blockMemberIndex]);
Geoff Lang6899b872016-10-14 11:30:13 -04001027 }
1028 break;
1029 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
jchen10a99ed552017-09-22 08:10:32 +08001030 *params = static_cast<GLint>(uniformBlock.vertexStaticUse);
Geoff Lang6899b872016-10-14 11:30:13 -04001031 break;
1032 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
jchen10a99ed552017-09-22 08:10:32 +08001033 *params = static_cast<GLint>(uniformBlock.fragmentStaticUse);
Geoff Lang6899b872016-10-14 11:30:13 -04001034 break;
1035 default:
1036 UNREACHABLE();
1037 break;
1038 }
1039}
1040
Geoff Lang0a9661f2016-10-20 10:59:20 -07001041void QueryInternalFormativ(const TextureCaps &format, GLenum pname, GLsizei bufSize, GLint *params)
1042{
1043 switch (pname)
1044 {
1045 case GL_NUM_SAMPLE_COUNTS:
1046 if (bufSize != 0)
1047 {
jchen10a99ed552017-09-22 08:10:32 +08001048 *params = clampCast<GLint>(format.sampleCounts.size());
Geoff Lang0a9661f2016-10-20 10:59:20 -07001049 }
1050 break;
1051
1052 case GL_SAMPLES:
1053 {
1054 size_t returnCount = std::min<size_t>(bufSize, format.sampleCounts.size());
1055 auto sampleReverseIt = format.sampleCounts.rbegin();
1056 for (size_t sampleIndex = 0; sampleIndex < returnCount; ++sampleIndex)
1057 {
1058 params[sampleIndex] = *sampleReverseIt++;
1059 }
1060 }
1061 break;
1062
1063 default:
1064 UNREACHABLE();
1065 break;
1066 }
1067}
1068
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001069void QueryFramebufferParameteriv(const Framebuffer *framebuffer, GLenum pname, GLint *params)
1070{
1071 ASSERT(framebuffer);
1072
1073 switch (pname)
1074 {
1075 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
1076 *params = framebuffer->getDefaultWidth();
1077 break;
1078 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
1079 *params = framebuffer->getDefaultHeight();
1080 break;
1081 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
1082 *params = framebuffer->getDefaultSamples();
1083 break;
1084 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
1085 *params = framebuffer->getDefaultFixedSampleLocations();
1086 break;
1087 default:
1088 UNREACHABLE();
1089 break;
1090 }
1091}
1092
Jamie Madill70b5bb02017-08-28 13:32:37 -04001093Error QuerySynciv(const Sync *sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001094{
1095 ASSERT(sync);
1096
Geoff Lang82483b92017-04-11 15:33:00 -04001097 // All queries return one value, exit early if the buffer can't fit anything.
1098 if (bufSize < 1)
1099 {
1100 if (length != nullptr)
1101 {
1102 *length = 0;
1103 }
1104 return NoError();
1105 }
1106
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001107 switch (pname)
1108 {
1109 case GL_OBJECT_TYPE:
jchen10a99ed552017-09-22 08:10:32 +08001110 *values = clampCast<GLint>(GL_SYNC_FENCE);
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001111 break;
1112 case GL_SYNC_CONDITION:
jchen10a99ed552017-09-22 08:10:32 +08001113 *values = clampCast<GLint>(sync->getCondition());
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001114 break;
1115 case GL_SYNC_FLAGS:
jchen10a99ed552017-09-22 08:10:32 +08001116 *values = clampCast<GLint>(sync->getFlags());
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001117 break;
1118 case GL_SYNC_STATUS:
1119 ANGLE_TRY(sync->getStatus(values));
1120 break;
1121
1122 default:
1123 UNREACHABLE();
1124 break;
1125 }
1126
Geoff Lang82483b92017-04-11 15:33:00 -04001127 if (length != nullptr)
1128 {
1129 *length = 1;
1130 }
1131
Geoff Lang38f2cfb2017-04-11 15:23:08 -04001132 return NoError();
1133}
1134
Jamie Madill4928b7c2017-06-20 12:57:39 -04001135void SetTexParameterf(Context *context, Texture *texture, GLenum pname, GLfloat param)
Geoff Langc1984ed2016-10-07 12:41:00 -04001136{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001137 SetTexParameterBase(context, texture, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -04001138}
1139
Jamie Madill4928b7c2017-06-20 12:57:39 -04001140void SetTexParameterfv(Context *context, Texture *texture, GLenum pname, const GLfloat *params)
Geoff Langc1984ed2016-10-07 12:41:00 -04001141{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001142 SetTexParameterBase(context, texture, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001143}
1144
Jamie Madill4928b7c2017-06-20 12:57:39 -04001145void SetTexParameteri(Context *context, Texture *texture, GLenum pname, GLint param)
Geoff Langc1984ed2016-10-07 12:41:00 -04001146{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001147 SetTexParameterBase(context, texture, pname, &param);
Geoff Langc1984ed2016-10-07 12:41:00 -04001148}
1149
Jamie Madill4928b7c2017-06-20 12:57:39 -04001150void SetTexParameteriv(Context *context, Texture *texture, GLenum pname, const GLint *params)
Geoff Langc1984ed2016-10-07 12:41:00 -04001151{
Jamie Madill4928b7c2017-06-20 12:57:39 -04001152 SetTexParameterBase(context, texture, pname, params);
Geoff Langc1984ed2016-10-07 12:41:00 -04001153}
1154
1155void SetSamplerParameterf(Sampler *sampler, GLenum pname, GLfloat param)
1156{
1157 SetSamplerParameterBase(sampler, pname, &param);
1158}
1159
1160void SetSamplerParameterfv(Sampler *sampler, GLenum pname, const GLfloat *params)
1161{
1162 SetSamplerParameterBase(sampler, pname, params);
1163}
1164
1165void SetSamplerParameteri(Sampler *sampler, GLenum pname, GLint param)
1166{
1167 SetSamplerParameterBase(sampler, pname, &param);
1168}
1169
1170void SetSamplerParameteriv(Sampler *sampler, GLenum pname, const GLint *params)
1171{
1172 SetSamplerParameterBase(sampler, pname, params);
1173}
Geoff Lang65603eb2017-01-12 16:48:03 -05001174
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001175void SetFramebufferParameteri(Framebuffer *framebuffer, GLenum pname, GLint param)
1176{
1177 ASSERT(framebuffer);
1178
1179 switch (pname)
1180 {
1181 case GL_FRAMEBUFFER_DEFAULT_WIDTH:
1182 framebuffer->setDefaultWidth(param);
1183 break;
1184 case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
1185 framebuffer->setDefaultHeight(param);
1186 break;
1187 case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
1188 framebuffer->setDefaultSamples(param);
1189 break;
1190 case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
jchen10a99ed552017-09-22 08:10:32 +08001191 framebuffer->setDefaultFixedSampleLocations(CastQueryValueTo<GLboolean>(pname, param));
JiangYizhouf7bbc8a2016-11-16 09:57:22 +08001192 break;
1193 default:
1194 UNREACHABLE();
1195 break;
1196 }
1197}
1198
Yunchao He61afff12017-03-14 15:34:03 +08001199void SetProgramParameteri(Program *program, GLenum pname, GLint value)
1200{
1201 ASSERT(program);
1202
1203 switch (pname)
1204 {
1205 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
1206 program->setBinaryRetrievableHint(value != GL_FALSE);
1207 break;
1208 case GL_PROGRAM_SEPARABLE:
1209 program->setSeparable(value != GL_FALSE);
1210 break;
1211 default:
1212 UNREACHABLE();
1213 break;
1214 }
1215}
1216
jchen1015015f72017-03-16 13:54:21 +08001217GLuint QueryProgramResourceIndex(const Program *program,
1218 GLenum programInterface,
1219 const GLchar *name)
1220{
1221 switch (programInterface)
1222 {
1223 case GL_PROGRAM_INPUT:
1224 return program->getInputResourceIndex(name);
1225
1226 case GL_PROGRAM_OUTPUT:
1227 return program->getOutputResourceIndex(name);
1228
jchen10191381f2017-04-11 13:59:04 +08001229 // TODO(jie.a.chen@intel.com): more interfaces.
jchen1015015f72017-03-16 13:54:21 +08001230 case GL_UNIFORM:
1231 case GL_UNIFORM_BLOCK:
1232 case GL_TRANSFORM_FEEDBACK_VARYING:
1233 case GL_BUFFER_VARIABLE:
1234 case GL_SHADER_STORAGE_BLOCK:
1235 UNIMPLEMENTED();
1236 return GL_INVALID_INDEX;
1237
1238 default:
1239 UNREACHABLE();
1240 return GL_INVALID_INDEX;
1241 }
1242}
1243
jchen10fd7c3b52017-03-21 15:36:03 +08001244void QueryProgramResourceName(const Program *program,
1245 GLenum programInterface,
1246 GLuint index,
1247 GLsizei bufSize,
1248 GLsizei *length,
1249 GLchar *name)
1250{
1251 switch (programInterface)
1252 {
1253 case GL_PROGRAM_INPUT:
1254 program->getInputResourceName(index, bufSize, length, name);
1255 break;
1256
1257 case GL_PROGRAM_OUTPUT:
1258 program->getOutputResourceName(index, bufSize, length, name);
1259 break;
1260
jchen10191381f2017-04-11 13:59:04 +08001261 // TODO(jie.a.chen@intel.com): more interfaces.
jchen10fd7c3b52017-03-21 15:36:03 +08001262 case GL_UNIFORM:
1263 case GL_UNIFORM_BLOCK:
1264 case GL_TRANSFORM_FEEDBACK_VARYING:
1265 case GL_BUFFER_VARIABLE:
1266 case GL_SHADER_STORAGE_BLOCK:
1267 UNIMPLEMENTED();
1268 break;
1269
1270 default:
1271 UNREACHABLE();
1272 }
1273}
1274
jchen10191381f2017-04-11 13:59:04 +08001275GLint QueryProgramResourceLocation(const Program *program,
1276 GLenum programInterface,
1277 const GLchar *name)
1278{
1279 switch (programInterface)
1280 {
1281 case GL_PROGRAM_INPUT:
1282 return program->getAttributeLocation(name);
1283
1284 case GL_PROGRAM_OUTPUT:
1285 return program->getFragDataLocation(name);
1286
1287 // TODO(jie.a.chen@intel.com): more interfaces.
1288 case GL_UNIFORM:
1289 case GL_UNIFORM_BLOCK:
1290 case GL_TRANSFORM_FEEDBACK_VARYING:
1291 case GL_BUFFER_VARIABLE:
1292 case GL_SHADER_STORAGE_BLOCK:
1293 UNIMPLEMENTED();
1294 return -1;
1295
1296 default:
1297 UNREACHABLE();
1298 return -1;
1299 }
1300}
1301
jchen10880683b2017-04-12 16:21:55 +08001302void QueryProgramResourceiv(const Program *program,
1303 GLenum programInterface,
1304 GLuint index,
1305 GLsizei propCount,
1306 const GLenum *props,
1307 GLsizei bufSize,
1308 GLsizei *length,
1309 GLint *params)
1310{
1311 if (!program->isLinked())
1312 {
1313 if (length != nullptr)
1314 {
1315 *length = 0;
1316 }
1317 return;
1318 }
1319
1320 GLsizei count = std::min(propCount, bufSize);
1321 if (length != nullptr)
1322 {
1323 *length = count;
1324 }
1325
1326 for (GLsizei i = 0; i < count; i++)
1327 {
1328 switch (programInterface)
1329 {
1330 case GL_PROGRAM_INPUT:
1331 params[i] = GetInputResourceProperty(program, index, props[i]);
1332 break;
1333
1334 case GL_PROGRAM_OUTPUT:
1335 params[i] = GetOutputResourceProperty(program, index, props[i]);
1336 break;
1337
1338 // TODO(jie.a.chen@intel.com): more interfaces.
1339 case GL_UNIFORM:
1340 case GL_UNIFORM_BLOCK:
1341 case GL_TRANSFORM_FEEDBACK_VARYING:
1342 case GL_BUFFER_VARIABLE:
1343 case GL_SHADER_STORAGE_BLOCK:
1344 case GL_ATOMIC_COUNTER_BUFFER:
1345 UNIMPLEMENTED();
1346 params[i] = GL_INVALID_VALUE;
1347 break;
1348
1349 default:
1350 UNREACHABLE();
1351 params[i] = GL_INVALID_VALUE;
1352 }
1353 }
1354}
1355
jchen10d9cd7b72017-08-30 15:04:25 +08001356void QueryProgramInterfaceiv(const Program *program,
1357 GLenum programInterface,
1358 GLenum pname,
1359 GLint *params)
1360{
1361 switch (pname)
1362 {
1363 case GL_ACTIVE_RESOURCES:
1364 *params = QueryProgramInterfaceActiveResources(program, programInterface);
1365 break;
1366
1367 case GL_MAX_NAME_LENGTH:
1368 *params = QueryProgramInterfaceMaxNameLength(program, programInterface);
1369 break;
1370
1371 case GL_MAX_NUM_ACTIVE_VARIABLES:
1372 *params = QueryProgramInterfaceMaxNumActiveVariables(program, programInterface);
1373 break;
1374
1375 default:
1376 UNREACHABLE();
1377 }
1378}
1379
Geoff Lang65603eb2017-01-12 16:48:03 -05001380} // namespace gl
1381
1382namespace egl
1383{
1384
1385void QueryConfigAttrib(const Config *config, EGLint attribute, EGLint *value)
1386{
1387 ASSERT(config != nullptr);
1388 switch (attribute)
1389 {
1390 case EGL_BUFFER_SIZE:
1391 *value = config->bufferSize;
1392 break;
1393 case EGL_ALPHA_SIZE:
1394 *value = config->alphaSize;
1395 break;
1396 case EGL_BLUE_SIZE:
1397 *value = config->blueSize;
1398 break;
1399 case EGL_GREEN_SIZE:
1400 *value = config->greenSize;
1401 break;
1402 case EGL_RED_SIZE:
1403 *value = config->redSize;
1404 break;
1405 case EGL_DEPTH_SIZE:
1406 *value = config->depthSize;
1407 break;
1408 case EGL_STENCIL_SIZE:
1409 *value = config->stencilSize;
1410 break;
1411 case EGL_CONFIG_CAVEAT:
1412 *value = config->configCaveat;
1413 break;
1414 case EGL_CONFIG_ID:
1415 *value = config->configID;
1416 break;
1417 case EGL_LEVEL:
1418 *value = config->level;
1419 break;
1420 case EGL_NATIVE_RENDERABLE:
1421 *value = config->nativeRenderable;
1422 break;
1423 case EGL_NATIVE_VISUAL_ID:
1424 *value = config->nativeVisualID;
1425 break;
1426 case EGL_NATIVE_VISUAL_TYPE:
1427 *value = config->nativeVisualType;
1428 break;
1429 case EGL_SAMPLES:
1430 *value = config->samples;
1431 break;
1432 case EGL_SAMPLE_BUFFERS:
1433 *value = config->sampleBuffers;
1434 break;
1435 case EGL_SURFACE_TYPE:
1436 *value = config->surfaceType;
1437 break;
1438 case EGL_TRANSPARENT_TYPE:
1439 *value = config->transparentType;
1440 break;
1441 case EGL_TRANSPARENT_BLUE_VALUE:
1442 *value = config->transparentBlueValue;
1443 break;
1444 case EGL_TRANSPARENT_GREEN_VALUE:
1445 *value = config->transparentGreenValue;
1446 break;
1447 case EGL_TRANSPARENT_RED_VALUE:
1448 *value = config->transparentRedValue;
1449 break;
1450 case EGL_BIND_TO_TEXTURE_RGB:
1451 *value = config->bindToTextureRGB;
1452 break;
1453 case EGL_BIND_TO_TEXTURE_RGBA:
1454 *value = config->bindToTextureRGBA;
1455 break;
1456 case EGL_MIN_SWAP_INTERVAL:
1457 *value = config->minSwapInterval;
1458 break;
1459 case EGL_MAX_SWAP_INTERVAL:
1460 *value = config->maxSwapInterval;
1461 break;
1462 case EGL_LUMINANCE_SIZE:
1463 *value = config->luminanceSize;
1464 break;
1465 case EGL_ALPHA_MASK_SIZE:
1466 *value = config->alphaMaskSize;
1467 break;
1468 case EGL_COLOR_BUFFER_TYPE:
1469 *value = config->colorBufferType;
1470 break;
1471 case EGL_RENDERABLE_TYPE:
1472 *value = config->renderableType;
1473 break;
1474 case EGL_MATCH_NATIVE_PIXMAP:
1475 *value = false;
1476 UNIMPLEMENTED();
1477 break;
1478 case EGL_CONFORMANT:
1479 *value = config->conformant;
1480 break;
1481 case EGL_MAX_PBUFFER_WIDTH:
1482 *value = config->maxPBufferWidth;
1483 break;
1484 case EGL_MAX_PBUFFER_HEIGHT:
1485 *value = config->maxPBufferHeight;
1486 break;
1487 case EGL_MAX_PBUFFER_PIXELS:
1488 *value = config->maxPBufferPixels;
1489 break;
1490 case EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE:
1491 *value = config->optimalOrientation;
1492 break;
Geoff Langc5a2a172017-01-13 15:55:07 -05001493 case EGL_COLOR_COMPONENT_TYPE_EXT:
1494 *value = config->colorComponentType;
1495 break;
Geoff Lang65603eb2017-01-12 16:48:03 -05001496 default:
1497 UNREACHABLE();
1498 break;
1499 }
Geoff Langff5b2d52016-09-07 11:32:23 -04001500}
Geoff Lang65603eb2017-01-12 16:48:03 -05001501
Geoff Lang31ecbd72017-07-26 13:01:27 -04001502void QuerySurfaceAttrib(const Surface *surface, EGLint attribute, EGLint *value)
1503{
1504 switch (attribute)
1505 {
1506 case EGL_GL_COLORSPACE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001507 *value = surface->getGLColorspace();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001508 break;
1509 case EGL_VG_ALPHA_FORMAT:
Geoff Lang40ac7832017-07-26 14:38:46 -04001510 *value = surface->getVGAlphaFormat();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001511 break;
1512 case EGL_VG_COLORSPACE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001513 *value = surface->getVGColorspace();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001514 break;
1515 case EGL_CONFIG_ID:
1516 *value = surface->getConfig()->configID;
1517 break;
1518 case EGL_HEIGHT:
1519 *value = surface->getHeight();
1520 break;
1521 case EGL_HORIZONTAL_RESOLUTION:
Geoff Lang40ac7832017-07-26 14:38:46 -04001522 *value = surface->getHorizontalResolution();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001523 break;
1524 case EGL_LARGEST_PBUFFER:
Geoff Lang40ac7832017-07-26 14:38:46 -04001525 // The EGL spec states that value is not written if the surface is not a pbuffer
1526 if (surface->getType() == EGL_PBUFFER_BIT)
1527 {
1528 *value = surface->getLargestPbuffer();
1529 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001530 break;
1531 case EGL_MIPMAP_TEXTURE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001532 // The EGL spec states that value is not written if the surface is not a pbuffer
1533 if (surface->getType() == EGL_PBUFFER_BIT)
1534 {
1535 *value = surface->getMipmapTexture();
1536 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001537 break;
1538 case EGL_MIPMAP_LEVEL:
Geoff Lang40ac7832017-07-26 14:38:46 -04001539 // The EGL spec states that value is not written if the surface is not a pbuffer
1540 if (surface->getType() == EGL_PBUFFER_BIT)
1541 {
1542 *value = surface->getMipmapLevel();
1543 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001544 break;
1545 case EGL_MULTISAMPLE_RESOLVE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001546 *value = surface->getMultisampleResolve();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001547 break;
1548 case EGL_PIXEL_ASPECT_RATIO:
1549 *value = surface->getPixelAspectRatio();
1550 break;
1551 case EGL_RENDER_BUFFER:
1552 *value = surface->getRenderBuffer();
1553 break;
1554 case EGL_SWAP_BEHAVIOR:
1555 *value = surface->getSwapBehavior();
1556 break;
1557 case EGL_TEXTURE_FORMAT:
Geoff Lang40ac7832017-07-26 14:38:46 -04001558 // The EGL spec states that value is not written if the surface is not a pbuffer
1559 if (surface->getType() == EGL_PBUFFER_BIT)
1560 {
1561 *value = surface->getTextureFormat();
1562 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001563 break;
1564 case EGL_TEXTURE_TARGET:
Geoff Lang40ac7832017-07-26 14:38:46 -04001565 // The EGL spec states that value is not written if the surface is not a pbuffer
1566 if (surface->getType() == EGL_PBUFFER_BIT)
1567 {
1568 *value = surface->getTextureTarget();
1569 }
Geoff Lang31ecbd72017-07-26 13:01:27 -04001570 break;
1571 case EGL_VERTICAL_RESOLUTION:
Geoff Lang40ac7832017-07-26 14:38:46 -04001572 *value = surface->getVerticalResolution();
Geoff Lang31ecbd72017-07-26 13:01:27 -04001573 break;
1574 case EGL_WIDTH:
1575 *value = surface->getWidth();
1576 break;
1577 case EGL_POST_SUB_BUFFER_SUPPORTED_NV:
1578 *value = surface->isPostSubBufferSupported();
1579 break;
1580 case EGL_FIXED_SIZE_ANGLE:
1581 *value = surface->isFixedSize();
1582 break;
1583 case EGL_FLEXIBLE_SURFACE_COMPATIBILITY_SUPPORTED_ANGLE:
1584 *value = surface->flexibleSurfaceCompatibilityRequested();
1585 break;
1586 case EGL_SURFACE_ORIENTATION_ANGLE:
1587 *value = surface->getOrientation();
1588 break;
1589 case EGL_DIRECT_COMPOSITION_ANGLE:
1590 *value = surface->directComposition();
1591 break;
1592 default:
1593 UNREACHABLE();
1594 break;
1595 }
1596}
1597
1598void SetSurfaceAttrib(Surface *surface, EGLint attribute, EGLint value)
1599{
1600 switch (attribute)
1601 {
1602 case EGL_MIPMAP_LEVEL:
Geoff Lang40ac7832017-07-26 14:38:46 -04001603 surface->setMipmapLevel(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04001604 break;
1605 case EGL_MULTISAMPLE_RESOLVE:
Geoff Lang40ac7832017-07-26 14:38:46 -04001606 surface->setMultisampleResolve(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04001607 break;
1608 case EGL_SWAP_BEHAVIOR:
Geoff Lang40ac7832017-07-26 14:38:46 -04001609 surface->setSwapBehavior(value);
Geoff Lang31ecbd72017-07-26 13:01:27 -04001610 break;
1611 default:
1612 UNREACHABLE();
1613 break;
1614 }
1615}
1616
Geoff Lang65603eb2017-01-12 16:48:03 -05001617} // namespace egl