1 /*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include "GLESv2Validation.h"
18
19 #include <sstream>
20
21 #define LIST_VALID_TEX_INTERNALFORMATS(f) \
22 f(GL_BGRA8_EXT) \
23 f(GL_R8) \
24 f(GL_R8_SNORM) \
25 f(GL_R16F) \
26 f(GL_R32F) \
27 f(GL_R8UI) \
28 f(GL_R8I) \
29 f(GL_R16UI) \
30 f(GL_R16I) \
31 f(GL_R32UI) \
32 f(GL_R32I) \
33 f(GL_RG8) \
34 f(GL_RG8_SNORM) \
35 f(GL_RG16F) \
36 f(GL_RG32F) \
37 f(GL_RG8UI) \
38 f(GL_RG8I) \
39 f(GL_RG16UI) \
40 f(GL_RG16I) \
41 f(GL_RG32UI) \
42 f(GL_RG32I) \
43 f(GL_RGB8) \
44 f(GL_SRGB8) \
45 f(GL_RGB565) \
46 f(GL_RGB8_SNORM) \
47 f(GL_R11F_G11F_B10F) \
48 f(GL_RGB9_E5) \
49 f(GL_RGB16F) \
50 f(GL_RGB32F) \
51 f(GL_RGB8UI) \
52 f(GL_RGB8I) \
53 f(GL_RGB16UI) \
54 f(GL_RGB16I) \
55 f(GL_RGB32UI) \
56 f(GL_RGB32I) \
57 f(GL_RGBA8) \
58 f(GL_SRGB8_ALPHA8) \
59 f(GL_RGBA8_SNORM) \
60 f(GL_RGB5_A1) \
61 f(GL_RGBA4) \
62 f(GL_RGB10_A2) \
63 f(GL_RGBA16F) \
64 f(GL_RGBA32F) \
65 f(GL_RGBA8UI) \
66 f(GL_RGBA8I) \
67 f(GL_RGB10_A2UI) \
68 f(GL_RGBA16UI) \
69 f(GL_RGBA16I) \
70 f(GL_RGBA32I) \
71 f(GL_RGBA32UI) \
72 f(GL_DEPTH_COMPONENT16) \
73 f(GL_DEPTH_COMPONENT24) \
74 f(GL_DEPTH_COMPONENT32F) \
75 f(GL_DEPTH24_STENCIL8) \
76 f(GL_DEPTH32F_STENCIL8) \
77 f(GL_ETC1_RGB8_OES) \
78 f(GL_COMPRESSED_R11_EAC) \
79 f(GL_COMPRESSED_SIGNED_R11_EAC) \
80 f(GL_COMPRESSED_RG11_EAC) \
81 f(GL_COMPRESSED_SIGNED_RG11_EAC) \
82 f(GL_COMPRESSED_RGB8_ETC2) \
83 f(GL_COMPRESSED_SRGB8_ETC2) \
84 f(GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2) \
85 f(GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2) \
86 f(GL_COMPRESSED_RGBA8_ETC2_EAC) \
87 f(GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC) \
88 f(GL_COMPRESSED_RGBA_ASTC_4x4_KHR) \
89 f(GL_COMPRESSED_RGBA_ASTC_5x4_KHR) \
90 f(GL_COMPRESSED_RGBA_ASTC_5x5_KHR) \
91 f(GL_COMPRESSED_RGBA_ASTC_6x5_KHR) \
92 f(GL_COMPRESSED_RGBA_ASTC_6x6_KHR) \
93 f(GL_COMPRESSED_RGBA_ASTC_8x5_KHR) \
94 f(GL_COMPRESSED_RGBA_ASTC_8x6_KHR) \
95 f(GL_COMPRESSED_RGBA_ASTC_8x8_KHR) \
96 f(GL_COMPRESSED_RGBA_ASTC_10x5_KHR) \
97 f(GL_COMPRESSED_RGBA_ASTC_10x6_KHR) \
98 f(GL_COMPRESSED_RGBA_ASTC_10x8_KHR) \
99 f(GL_COMPRESSED_RGBA_ASTC_10x10_KHR) \
100 f(GL_COMPRESSED_RGBA_ASTC_12x10_KHR) \
101 f(GL_COMPRESSED_RGBA_ASTC_12x12_KHR) \
102 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR) \
103 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR) \
104 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR) \
105 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR) \
106 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR) \
107 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR) \
108 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR) \
109 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR) \
110 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR) \
111 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR) \
112 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR) \
113 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR) \
114 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR) \
115 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR) \
116 f(GL_COMPRESSED_RGBA_BPTC_UNORM_EXT) \
117 f(GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT) \
118 f(GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT) \
119 f(GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT) \
120 f(GL_COMPRESSED_RGB_S3TC_DXT1_EXT) \
121 f(GL_COMPRESSED_RGBA_S3TC_DXT1_EXT) \
122 f(GL_COMPRESSED_RGBA_S3TC_DXT3_EXT) \
123 f(GL_COMPRESSED_RGBA_S3TC_DXT5_EXT) \
124 f(GL_COMPRESSED_SRGB_S3TC_DXT1_EXT) \
125 f(GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT) \
126 f(GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT) \
127 f(GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT)
128
129
130 #define LIST_INTEGER_TEX_FORMATS(f) \
131 f(GL_RED_INTEGER) \
132 f(GL_RG_INTEGER) \
133 f(GL_RGB_INTEGER) \
134 f(GL_RGBA_INTEGER) \
135 f(GL_R8UI) \
136 f(GL_R8I) \
137 f(GL_R16UI) \
138 f(GL_R16I) \
139 f(GL_R32UI) \
140 f(GL_R32I) \
141 f(GL_RG8UI) \
142 f(GL_RG8I) \
143 f(GL_RG16UI) \
144 f(GL_RG16I) \
145 f(GL_RG32UI) \
146 f(GL_RG32I) \
147 f(GL_RGB8UI) \
148 f(GL_RGB8I) \
149 f(GL_RGB16UI) \
150 f(GL_RGB16I) \
151 f(GL_RGB32UI) \
152 f(GL_RGB32I) \
153 f(GL_RGBA8UI) \
154 f(GL_RGBA8I) \
155 f(GL_RGB10_A2UI) \
156 f(GL_RGBA16UI) \
157 f(GL_RGBA16I) \
158 f(GL_RGBA32I) \
159 f(GL_RGBA32UI) \
160
161 #define LIST_VALID_TEXFORMAT_COMBINATIONS(f) \
162 f(GL_BGRA8_EXT, GL_BGRA_EXT, GL_UNSIGNED_BYTE) \
163 f(GL_R8, GL_RED, GL_UNSIGNED_BYTE) \
164 f(GL_R8_SNORM, GL_RED, GL_BYTE) \
165 f(GL_R16F, GL_RED, GL_FLOAT) \
166 f(GL_R16F, GL_RED, GL_HALF_FLOAT) \
167 f(GL_R32F, GL_RED, GL_FLOAT) \
168 f(GL_R8UI, GL_RED_INTEGER, GL_UNSIGNED_BYTE) \
169 f(GL_R8I, GL_RED_INTEGER, GL_BYTE) \
170 f(GL_R16UI, GL_RED_INTEGER, GL_UNSIGNED_SHORT) \
171 f(GL_R16I, GL_RED_INTEGER, GL_SHORT) \
172 f(GL_R32UI, GL_RED_INTEGER, GL_UNSIGNED_INT) \
173 f(GL_R32I, GL_RED_INTEGER, GL_INT) \
174 f(GL_RG8, GL_RG, GL_UNSIGNED_BYTE) \
175 f(GL_RG8_SNORM, GL_RG, GL_BYTE) \
176 f(GL_RG16F, GL_RG, GL_HALF_FLOAT) \
177 f(GL_RG16F, GL_RG, GL_FLOAT) \
178 f(GL_RG32F, GL_RG, GL_FLOAT) \
179 f(GL_RG8UI, GL_RG_INTEGER, GL_UNSIGNED_BYTE) \
180 f(GL_RG8I, GL_RG_INTEGER, GL_BYTE) \
181 f(GL_RG16UI, GL_RG_INTEGER, GL_UNSIGNED_SHORT) \
182 f(GL_RG16I, GL_RG_INTEGER, GL_SHORT) \
183 f(GL_RG32UI, GL_RG_INTEGER, GL_UNSIGNED_INT) \
184 f(GL_RG32I, GL_RG_INTEGER, GL_INT) \
185 f(GL_RGB8, GL_RGB, GL_UNSIGNED_BYTE) \
186 f(GL_SRGB8, GL_RGB, GL_UNSIGNED_BYTE) \
187 f(GL_RGB565, GL_RGB, GL_UNSIGNED_BYTE) \
188 f(GL_RGB565, GL_RGB, GL_UNSIGNED_SHORT_5_6_5) \
189 f(GL_RGB8_SNORM, GL_RGB, GL_BYTE) \
190 f(GL_R11F_G11F_B10F, GL_RGB, GL_UNSIGNED_INT_10F_11F_11F_REV) \
191 f(GL_R11F_G11F_B10F, GL_RGB, GL_HALF_FLOAT) \
192 f(GL_R11F_G11F_B10F, GL_RGB, GL_FLOAT) \
193 f(GL_RGB9_E5, GL_RGB, GL_UNSIGNED_INT_5_9_9_9_REV) \
194 f(GL_RGB9_E5, GL_RGB, GL_HALF_FLOAT) \
195 f(GL_RGB9_E5, GL_RGB, GL_FLOAT) \
196 f(GL_RGB16F, GL_RGB, GL_HALF_FLOAT) \
197 f(GL_RGB16F, GL_RGB, GL_FLOAT) \
198 f(GL_RGB32F, GL_RGB, GL_FLOAT) \
199 f(GL_RGB8UI, GL_RGB_INTEGER, GL_UNSIGNED_BYTE) \
200 f(GL_RGB8I, GL_RGB_INTEGER, GL_BYTE) \
201 f(GL_RGB16UI, GL_RGB_INTEGER, GL_UNSIGNED_SHORT) \
202 f(GL_RGB16I, GL_RGB_INTEGER, GL_SHORT) \
203 f(GL_RGB32UI, GL_RGB_INTEGER, GL_UNSIGNED_INT) \
204 f(GL_RGB32I, GL_RGB_INTEGER, GL_INT) \
205 f(GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE) \
206 f(GL_SRGB8_ALPHA8, GL_RGBA, GL_UNSIGNED_BYTE) \
207 f(GL_RGBA8_SNORM, GL_RGBA, GL_BYTE) \
208 f(GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_BYTE) \
209 f(GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1) \
210 f(GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV) \
211 f(GL_RGBA4, GL_RGBA, GL_UNSIGNED_BYTE) \
212 f(GL_RGBA4, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4) \
213 f(GL_RGB10_A2, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV) \
214 f(GL_RGBA16F, GL_RGBA, GL_HALF_FLOAT) \
215 f(GL_RGBA16F, GL_RGBA, GL_FLOAT) \
216 f(GL_RGBA32F, GL_RGBA, GL_FLOAT) \
217 f(GL_RGBA8UI, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE) \
218 f(GL_RGBA8I, GL_RGBA_INTEGER, GL_BYTE) \
219 f(GL_RGB10_A2UI, GL_RGBA_INTEGER, GL_UNSIGNED_INT_2_10_10_10_REV) \
220 f(GL_RGBA16UI, GL_RGBA_INTEGER, GL_UNSIGNED_SHORT) \
221 f(GL_RGBA16I, GL_RGBA_INTEGER, GL_SHORT) \
222 f(GL_RGBA32I, GL_RGBA_INTEGER, GL_INT) \
223 f(GL_RGBA32UI, GL_RGBA_INTEGER, GL_UNSIGNED_INT) \
224 f(GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT) \
225 f(GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT) \
226 f(GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT) \
227 f(GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, GL_FLOAT) \
228 f(GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8) \
229 f(GL_DEPTH32F_STENCIL8, GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV) \
230 f(GL_COMPRESSED_R11_EAC, GL_RED, GL_FLOAT) \
231 f(GL_COMPRESSED_SIGNED_R11_EAC, GL_RED, GL_FLOAT) \
232 f(GL_COMPRESSED_RG11_EAC, GL_RG, GL_FLOAT) \
233 f(GL_COMPRESSED_SIGNED_RG11_EAC, GL_RG, GL_FLOAT) \
234 f(GL_COMPRESSED_RGB8_ETC2, GL_RGB, GL_UNSIGNED_BYTE) \
235 f(GL_COMPRESSED_SRGB8_ETC2, GL_RGB, GL_UNSIGNED_BYTE) \
236 f(GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, GL_RGBA, GL_UNSIGNED_BYTE) \
237 f(GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, GL_RGBA, GL_UNSIGNED_BYTE) \
238 f(GL_COMPRESSED_RGBA8_ETC2_EAC, GL_RGBA, GL_UNSIGNED_BYTE) \
239 f(GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, GL_RGBA, GL_UNSIGNED_BYTE) \
240 f(GL_COMPRESSED_RGBA_ASTC_4x4_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
241 f(GL_COMPRESSED_RGBA_ASTC_5x4_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
242 f(GL_COMPRESSED_RGBA_ASTC_5x5_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
243 f(GL_COMPRESSED_RGBA_ASTC_6x5_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
244 f(GL_COMPRESSED_RGBA_ASTC_6x6_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
245 f(GL_COMPRESSED_RGBA_ASTC_8x5_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
246 f(GL_COMPRESSED_RGBA_ASTC_8x6_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
247 f(GL_COMPRESSED_RGBA_ASTC_8x8_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
248 f(GL_COMPRESSED_RGBA_ASTC_10x5_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
249 f(GL_COMPRESSED_RGBA_ASTC_10x6_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
250 f(GL_COMPRESSED_RGBA_ASTC_10x8_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
251 f(GL_COMPRESSED_RGBA_ASTC_10x10_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
252 f(GL_COMPRESSED_RGBA_ASTC_12x10_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
253 f(GL_COMPRESSED_RGBA_ASTC_12x12_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
254 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
255 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
256 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
257 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
258 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
259 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
260 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
261 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
262 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
263 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
264 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
265 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
266 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
267 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
268 f(GL_COMPRESSED_RGBA_BPTC_UNORM_EXT, GL_RGBA, GL_UNSIGNED_BYTE) \
269 f(GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT, GL_RGBA, GL_UNSIGNED_BYTE) \
270 f(GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT, GL_RGB, GL_UNSIGNED_BYTE) \
271 f(GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT, GL_RGB, GL_UNSIGNED_BYTE) \
272 f(GL_COMPRESSED_RGB_S3TC_DXT1_EXT, GL_RGB, GL_UNSIGNED_BYTE) \
273 f(GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, GL_RGBA, GL_UNSIGNED_BYTE) \
274 f(GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_RGBA, GL_UNSIGNED_BYTE) \
275 f(GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_RGBA, GL_UNSIGNED_BYTE) \
276 f(GL_COMPRESSED_SRGB_S3TC_DXT1_EXT, GL_RGBA, GL_UNSIGNED_BYTE) \
277 f(GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, GL_RGBA, GL_UNSIGNED_BYTE) \
278 f(GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, GL_RGBA, GL_UNSIGNED_BYTE) \
279 f(GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, GL_RGBA, GL_UNSIGNED_BYTE)
280
281
282 namespace GLESv2Validation {
283
284 GLbitfield allBufferMapAccessFlags =
285 GL_MAP_READ_BIT | GL_MAP_WRITE_BIT |
286 GL_MAP_INVALIDATE_RANGE_BIT |
287 GL_MAP_INVALIDATE_BUFFER_BIT |
288 GL_MAP_FLUSH_EXPLICIT_BIT |
289 GL_MAP_UNSYNCHRONIZED_BIT;
290
bufferTarget(GL2Encoder * ctx,GLenum target)291 bool bufferTarget(GL2Encoder* ctx, GLenum target) {
292 int glesMajorVersion = ctx->majorVersion();
293 int glesMinorVersion = ctx->minorVersion();
294 switch (target) {
295 case GL_ARRAY_BUFFER: // Vertex attributes
296 case GL_ELEMENT_ARRAY_BUFFER: // Vertex array indices
297 return true;
298 // GLES 3.0 buffers
299 case GL_COPY_READ_BUFFER: // Buffer copy source
300 case GL_COPY_WRITE_BUFFER: // Buffer copy destination
301 case GL_PIXEL_PACK_BUFFER: // Pixel read target
302 case GL_PIXEL_UNPACK_BUFFER: // Texture data source
303 case GL_TRANSFORM_FEEDBACK_BUFFER: // Transform feedback buffer
304 case GL_UNIFORM_BUFFER: // Uniform block storage
305 return glesMajorVersion >= 3;
306 // GLES 3.1 buffers
307 case GL_ATOMIC_COUNTER_BUFFER: // Atomic counter storage
308 case GL_DISPATCH_INDIRECT_BUFFER: // Indirect compute dispatch commands
309 case GL_DRAW_INDIRECT_BUFFER: // Indirect command arguments
310 case GL_SHADER_STORAGE_BUFFER: // Read-write storage for shaders
311 return glesMajorVersion >= 3 && glesMinorVersion >= 1;
312 default:
313 return false;
314 }
315 }
316
bufferParam(GL2Encoder * ctx,GLenum pname)317 bool bufferParam(GL2Encoder* ctx, GLenum pname) {
318 int glesMajorVersion = ctx->majorVersion();
319 switch (pname) {
320 case GL_BUFFER_SIZE:
321 case GL_BUFFER_USAGE:
322 return true;
323 case GL_BUFFER_ACCESS_FLAGS:
324 case GL_BUFFER_MAPPED:
325 case GL_BUFFER_MAP_LENGTH:
326 case GL_BUFFER_MAP_OFFSET:
327 return glesMajorVersion >= 3;
328 default:
329 return false;
330 }
331 }
332
bufferUsage(GL2Encoder * ctx,GLenum usage)333 bool bufferUsage(GL2Encoder* ctx, GLenum usage) {
334 int glesMajorVersion = ctx->majorVersion();
335 switch(usage) {
336 case GL_STREAM_DRAW:
337 case GL_STATIC_DRAW:
338 case GL_DYNAMIC_DRAW:
339 return true;
340 case GL_STREAM_READ:
341 case GL_STATIC_READ:
342 case GL_DYNAMIC_READ:
343 case GL_STREAM_COPY:
344 case GL_STATIC_COPY:
345 case GL_DYNAMIC_COPY:
346 return glesMajorVersion >= 3;
347 }
348 return false;
349
350 }
pixelStoreParam(GL2Encoder * ctx,GLenum param)351 bool pixelStoreParam(GL2Encoder* ctx, GLenum param) {
352 int glesMajorVersion = ctx->majorVersion();
353 switch(param) {
354 case GL_UNPACK_ALIGNMENT:
355 case GL_PACK_ALIGNMENT:
356 return true;
357 case GL_UNPACK_ROW_LENGTH:
358 case GL_UNPACK_IMAGE_HEIGHT:
359 case GL_UNPACK_SKIP_PIXELS:
360 case GL_UNPACK_SKIP_ROWS:
361 case GL_UNPACK_SKIP_IMAGES:
362 case GL_PACK_ROW_LENGTH:
363 case GL_PACK_SKIP_PIXELS:
364 case GL_PACK_SKIP_ROWS:
365 return glesMajorVersion >= 3;
366 default:
367 return false;
368 }
369 }
370
pixelStoreValue(GLenum param,GLint value)371 bool pixelStoreValue(GLenum param, GLint value) {
372 switch(param) {
373 case GL_UNPACK_ALIGNMENT:
374 case GL_PACK_ALIGNMENT:
375 return (value == 1) || (value == 2) || (value == 4) || (value == 8);
376 case GL_UNPACK_ROW_LENGTH:
377 case GL_UNPACK_IMAGE_HEIGHT:
378 case GL_UNPACK_SKIP_PIXELS:
379 case GL_UNPACK_SKIP_ROWS:
380 case GL_UNPACK_SKIP_IMAGES:
381 case GL_PACK_ROW_LENGTH:
382 case GL_PACK_SKIP_PIXELS:
383 case GL_PACK_SKIP_ROWS:
384 return value >= 0;
385 default:
386 return false;
387 }
388 }
389
rboFormat(GL2Encoder * ctx,GLenum internalformat)390 bool rboFormat(GL2Encoder* ctx, GLenum internalformat) {
391 int glesMajorVersion = ctx->majorVersion();
392
393 switch (internalformat) {
394 // Funny internal formats
395 // that will cause an incomplete framebuffer
396 // attachment error pre-gles3. For dEQP,
397 // we can also just abort early here in
398 // RenderbufferStorage with a GL_INVALID_ENUM.
399 case GL_DEPTH_COMPONENT32F:
400 case GL_R8:
401 case GL_R8UI:
402 case GL_R8I:
403 case GL_R16UI:
404 case GL_R16I:
405 case GL_R32UI:
406 case GL_R32I:
407 case GL_RG8:
408 case GL_RG8UI:
409 case GL_RG8I:
410 case GL_RG16UI:
411 case GL_RG16I:
412 case GL_RG32UI:
413 case GL_RG32I:
414 case GL_SRGB8_ALPHA8:
415 case GL_RGBA8UI:
416 case GL_RGBA8I:
417 case GL_RGB10_A2:
418 case GL_RGB10_A2UI:
419 case GL_RGBA16UI:
420 case GL_RGBA16I:
421 case GL_RGBA32I:
422 case GL_RGBA32UI:
423 case GL_RGB32F:
424 return glesMajorVersion >= 3;
425 // These 4 formats are still not OK,
426 // but dEQP expects GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT or
427 // GL_FRAMEBUFFER_UNSUPPORTED if the extension is not present,
428 // not a GL_INVALID_ENUM from earlier on.
429 // So let's forward these to the rest of
430 // FBO initialization
431 // In GLES 3, these are rejected immediately if not
432 // supported.
433 case GL_R16F:
434 case GL_RG16F:
435 case GL_RGBA16F:
436 case GL_R32F:
437 case GL_RG32F:
438 case GL_RGBA32F:
439 case GL_R11F_G11F_B10F:
440 return glesMajorVersion >= 3 && ctx->hasExtension("GL_EXT_color_buffer_float");
441 case GL_RGB16F:
442 return glesMajorVersion >= 3 && ctx->hasExtension("GL_EXT_color_buffer_half_float");
443 // dEQP expects GL_FRAMEBUFFER_UNSUPPORTED or GL_FRAMEBUFFER_COMPLETE
444 // for this format
445 // These formats are OK
446 case GL_DEPTH_COMPONENT16:
447 case GL_DEPTH_COMPONENT24:
448 case GL_DEPTH_COMPONENT32_OES:
449 case GL_RGBA4:
450 case GL_RGB5_A1:
451 case GL_RGB565:
452 case GL_RGB8_OES:
453 case GL_RGBA8_OES:
454 case GL_STENCIL_INDEX8:
455 case GL_DEPTH32F_STENCIL8:
456 case GL_DEPTH24_STENCIL8_OES:
457 return true;
458 break;
459 // Everything else: still not OK,
460 // and they need the GL_INVALID_ENUM
461 }
462 return false;
463 }
464
framebufferTarget(GL2Encoder * ctx,GLenum target)465 bool framebufferTarget(GL2Encoder* ctx, GLenum target) {
466 int glesMajorVersion = ctx->majorVersion();
467 switch (target) {
468 case GL_FRAMEBUFFER:
469 return true;
470 case GL_DRAW_FRAMEBUFFER:
471 case GL_READ_FRAMEBUFFER:
472 return glesMajorVersion >= 3;
473 }
474 return false;
475 }
476
framebufferAttachment(GL2Encoder * ctx,GLenum attachment)477 bool framebufferAttachment(GL2Encoder* ctx, GLenum attachment) {
478 int glesMajorVersion = ctx->majorVersion();
479 switch (attachment) {
480 case GL_COLOR_ATTACHMENT0:
481 case GL_DEPTH_ATTACHMENT:
482 case GL_STENCIL_ATTACHMENT:
483 return true;
484 case GL_COLOR_ATTACHMENT1:
485 case GL_COLOR_ATTACHMENT2:
486 case GL_COLOR_ATTACHMENT3:
487 case GL_COLOR_ATTACHMENT4:
488 case GL_COLOR_ATTACHMENT5:
489 case GL_COLOR_ATTACHMENT6:
490 case GL_COLOR_ATTACHMENT7:
491 case GL_COLOR_ATTACHMENT8:
492 case GL_COLOR_ATTACHMENT9:
493 case GL_COLOR_ATTACHMENT10:
494 case GL_COLOR_ATTACHMENT11:
495 case GL_COLOR_ATTACHMENT12:
496 case GL_COLOR_ATTACHMENT13:
497 case GL_COLOR_ATTACHMENT14:
498 case GL_COLOR_ATTACHMENT15:
499 case GL_DEPTH_STENCIL_ATTACHMENT:
500 return glesMajorVersion >= 3;
501 }
502 return false;
503 }
504
readPixelsFormat(GLenum format)505 bool readPixelsFormat(GLenum format) {
506 switch (format) {
507 case GL_RED:
508 case GL_RED_INTEGER:
509 case GL_RG:
510 case GL_RG_INTEGER:
511 case GL_RGB:
512 case GL_RGB_INTEGER:
513 case GL_RGBA:
514 case GL_RGBA_INTEGER:
515 case GL_LUMINANCE_ALPHA:
516 case GL_LUMINANCE:
517 case GL_ALPHA:
518 return true;
519 }
520 return false;
521 }
522
readPixelsType(GLenum format)523 bool readPixelsType(GLenum format) {
524 switch (format) {
525 case GL_UNSIGNED_BYTE:
526 case GL_BYTE:
527 case GL_HALF_FLOAT:
528 case GL_FLOAT:
529 case GL_INT:
530 case GL_UNSIGNED_SHORT_5_6_5:
531 case GL_UNSIGNED_SHORT_4_4_4_4:
532 case GL_UNSIGNED_SHORT_5_5_5_1:
533 case GL_UNSIGNED_INT:
534 case GL_UNSIGNED_INT_2_10_10_10_REV:
535 case GL_UNSIGNED_INT_10F_11F_11F_REV:
536 case GL_UNSIGNED_INT_5_9_9_9_REV:
537 return true;
538 }
539 return false;
540 }
541
pixelOp(GLenum format,GLenum type)542 bool pixelOp(GLenum format,GLenum type) {
543 switch(type) {
544 case GL_UNSIGNED_SHORT_4_4_4_4:
545 case GL_UNSIGNED_SHORT_5_5_5_1:
546 return format == GL_RGBA;
547 case GL_UNSIGNED_SHORT_5_6_5:
548 return format == GL_RGB;
549 }
550 return true;
551 }
552
vertexAttribType(GL2Encoder * ctx,GLenum type)553 bool vertexAttribType(GL2Encoder* ctx, GLenum type)
554 {
555 int glesMajorVersion = ctx->majorVersion();
556 bool retval = false;
557 switch (type) {
558 case GL_BYTE:
559 case GL_UNSIGNED_BYTE:
560 case GL_SHORT:
561 case GL_UNSIGNED_SHORT:
562 case GL_FIXED:
563 case GL_FLOAT:
564 // The following are technically only available if certain GLES2 extensions are.
565 // However, they are supported by desktop GL3, which is a reasonable requirement
566 // for the desktop GL version. Therefore, consider them valid.
567 case GL_INT:
568 case GL_UNSIGNED_INT:
569 case GL_HALF_FLOAT_OES:
570 retval = true;
571 break;
572 case GL_HALF_FLOAT:
573 case GL_INT_2_10_10_10_REV:
574 case GL_UNSIGNED_INT_2_10_10_10_REV:
575 retval = glesMajorVersion >= 3;
576 break;
577 }
578 return retval;
579 }
580
readPixelsFboFormatMatch(GLenum,GLenum type,GLenum fboTexType)581 bool readPixelsFboFormatMatch(GLenum, GLenum type, GLenum fboTexType) {
582 #define INVALID_TYPE_MATCH(x, y) \
583 if (type == x && fboTexType == y) return false; \
584 if (type == y && fboTexType == x) return false; \
585
586 // These are meant to reject additional format/type mismatches
587 // not caught by underlying system.
588 INVALID_TYPE_MATCH(GL_FLOAT, GL_BYTE)
589 INVALID_TYPE_MATCH(GL_FLOAT, GL_UNSIGNED_BYTE)
590 INVALID_TYPE_MATCH(GL_FLOAT, GL_UNSIGNED_INT)
591 INVALID_TYPE_MATCH(GL_FLOAT, GL_INT)
592
593 return true;
594 }
595
blitFramebufferFormat(GLenum readFormat,GLenum drawFormat)596 bool blitFramebufferFormat(GLenum readFormat, GLenum drawFormat) {
597 #define INVALID_MATCH(x, y) \
598 if (readFormat == x && drawFormat == y) return false; \
599 if (readFormat == y && drawFormat == x) return false; \
600
601 INVALID_MATCH(GL_FLOAT, GL_BYTE)
602 INVALID_MATCH(GL_FLOAT, GL_UNSIGNED_BYTE)
603 INVALID_MATCH(GL_FLOAT, GL_UNSIGNED_INT)
604 INVALID_MATCH(GL_FLOAT, GL_INT)
605 INVALID_MATCH(GL_INT, GL_UNSIGNED_BYTE);
606 INVALID_MATCH(GL_UNSIGNED_INT, GL_UNSIGNED_BYTE);
607 INVALID_MATCH(GL_INT, GL_BYTE);
608 INVALID_MATCH(GL_UNSIGNED_INT, GL_BYTE);
609 INVALID_MATCH(GL_DEPTH32F_STENCIL8, GL_DEPTH24_STENCIL8);
610
611 return true;
612 }
613
textureTarget(GL2Encoder * ctx,GLenum target)614 bool textureTarget(GL2Encoder* ctx, GLenum target) {
615 int glesMajorVersion = ctx->majorVersion();
616 int glesMinorVersion = ctx->minorVersion();
617 switch (target) {
618 case GL_TEXTURE_EXTERNAL_OES:
619 case GL_TEXTURE_2D:
620 case GL_TEXTURE_CUBE_MAP:
621 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
622 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
623 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
624 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
625 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
626 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
627 return true;
628 case GL_TEXTURE_2D_ARRAY:
629 case GL_TEXTURE_3D:
630 return glesMajorVersion >= 3;
631 case GL_TEXTURE_2D_MULTISAMPLE:
632 return glesMajorVersion >= 3 &&
633 glesMinorVersion >= 1;
634 default:
635 break;
636 }
637 return false;
638 }
639
textureParams(GL2Encoder * ctx,GLenum param)640 bool textureParams(GL2Encoder* ctx, GLenum param) {
641 int glesMajorVersion = ctx->majorVersion();
642 int glesMinorVersion = ctx->minorVersion();
643 switch(param) {
644 case GL_TEXTURE_MIN_FILTER:
645 case GL_TEXTURE_MAG_FILTER:
646 case GL_TEXTURE_WRAP_S:
647 case GL_TEXTURE_WRAP_T:
648 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
649 return true;
650 case GL_TEXTURE_SWIZZLE_R:
651 case GL_TEXTURE_SWIZZLE_G:
652 case GL_TEXTURE_SWIZZLE_B:
653 case GL_TEXTURE_SWIZZLE_A:
654 case GL_TEXTURE_MIN_LOD:
655 case GL_TEXTURE_MAX_LOD:
656 case GL_TEXTURE_BASE_LEVEL:
657 case GL_TEXTURE_MAX_LEVEL:
658 case GL_TEXTURE_COMPARE_MODE:
659 case GL_TEXTURE_COMPARE_FUNC:
660 case GL_TEXTURE_WRAP_R:
661 case GL_TEXTURE_IMMUTABLE_FORMAT:
662 case GL_TEXTURE_IMMUTABLE_LEVELS:
663 return glesMajorVersion >= 3;
664 case GL_DEPTH_STENCIL_TEXTURE_MODE:
665 return glesMajorVersion >= 3 && glesMinorVersion >= 1;
666 default:
667 return false;
668 }
669 }
670
samplerParams(GL2Encoder * ctx,GLenum param)671 bool samplerParams(GL2Encoder* ctx, GLenum param) {
672 (void)ctx;
673 switch(param) {
674 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
675 case GL_TEXTURE_MIN_FILTER:
676 case GL_TEXTURE_MAG_FILTER:
677 case GL_TEXTURE_WRAP_S:
678 case GL_TEXTURE_WRAP_T:
679 case GL_TEXTURE_WRAP_R:
680 case GL_TEXTURE_MIN_LOD:
681 case GL_TEXTURE_MAX_LOD:
682 case GL_TEXTURE_COMPARE_MODE:
683 case GL_TEXTURE_COMPARE_FUNC:
684 return true;
685 default:
686 return false;
687 }
688 }
689
textureParamValue(GL2Encoder * ctx,GLenum pname,GLint intval,GLfloat floatval,GLenum enumval)690 bool textureParamValue(GL2Encoder* ctx, GLenum pname, GLint intval, GLfloat floatval, GLenum enumval) {
691 (void)ctx;
692 (void)floatval;
693 switch (pname) {
694 case GL_TEXTURE_BASE_LEVEL:
695 return intval >= 0;
696 case GL_TEXTURE_COMPARE_MODE:
697 return
698 (enumval == GL_NONE) ||
699 (enumval == GL_COMPARE_REF_TO_TEXTURE);
700 case GL_TEXTURE_COMPARE_FUNC:
701 return
702 (enumval == GL_LEQUAL) ||
703 (enumval == GL_GEQUAL) ||
704 (enumval == GL_LESS) ||
705 (enumval == GL_GREATER) ||
706 (enumval == GL_EQUAL) ||
707 (enumval == GL_NOTEQUAL) ||
708 (enumval == GL_ALWAYS) ||
709 (enumval == GL_NEVER);
710 case GL_TEXTURE_MAG_FILTER:
711 return
712 (enumval == GL_NEAREST) ||
713 (enumval == GL_LINEAR);
714 case GL_TEXTURE_MAX_LEVEL:
715 return intval >= 0;
716 case GL_TEXTURE_MAX_LOD:
717 return true;
718 case GL_TEXTURE_MIN_FILTER:
719 return
720 (enumval == GL_NEAREST) ||
721 (enumval == GL_LINEAR) ||
722 (enumval == GL_NEAREST_MIPMAP_NEAREST) ||
723 (enumval == GL_NEAREST_MIPMAP_LINEAR) ||
724 (enumval == GL_LINEAR_MIPMAP_NEAREST) ||
725 (enumval == GL_LINEAR_MIPMAP_LINEAR);
726 case GL_TEXTURE_MIN_LOD:
727 return true;
728 case GL_TEXTURE_SWIZZLE_R:
729 case GL_TEXTURE_SWIZZLE_G:
730 case GL_TEXTURE_SWIZZLE_B:
731 case GL_TEXTURE_SWIZZLE_A:
732 return
733 (enumval == GL_RED) ||
734 (enumval == GL_GREEN) ||
735 (enumval == GL_BLUE) ||
736 (enumval == GL_ALPHA) ||
737 (enumval == GL_ZERO) ||
738 (enumval == GL_ONE);
739 case GL_TEXTURE_WRAP_S:
740 case GL_TEXTURE_WRAP_T:
741 case GL_TEXTURE_WRAP_R:
742 return
743 (enumval == GL_CLAMP_TO_EDGE) ||
744 (enumval == GL_REPEAT) ||
745 (enumval == GL_MIRRORED_REPEAT);
746 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
747 return true;
748 case GL_TEXTURE_IMMUTABLE_FORMAT:
749 case GL_TEXTURE_IMMUTABLE_LEVELS:
750 case GL_DEPTH_STENCIL_TEXTURE_MODE:
751 return true;
752 default:
753 return true;
754 }
755 }
756
isIntegerFormat(GLenum format)757 bool isIntegerFormat(GLenum format) {
758
759 #define CHECK_EQUAL(x) case x: return true;
760
761 switch (format) {
762 LIST_INTEGER_TEX_FORMATS(CHECK_EQUAL)
763
764 default:
765 return false;
766 }
767 }
768
isCompressedFormat(GLenum internalformat)769 bool isCompressedFormat(GLenum internalformat) {
770 #define COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(internal) \
771 case internal: \
772 return true; \
773
774 switch (internalformat) {
775 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_R11_EAC)
776 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SIGNED_R11_EAC)
777 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RG11_EAC)
778 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SIGNED_RG11_EAC)
779 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGB8_ETC2)
780 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ETC2)
781 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2)
782 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2)
783 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA8_ETC2_EAC)
784 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC)
785 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA_ASTC_4x4_KHR)
786 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA_ASTC_5x4_KHR)
787 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA_ASTC_5x5_KHR)
788 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA_ASTC_6x5_KHR)
789 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA_ASTC_6x6_KHR)
790 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA_ASTC_8x5_KHR)
791 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA_ASTC_8x6_KHR)
792 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA_ASTC_8x8_KHR)
793 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA_ASTC_10x5_KHR)
794 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA_ASTC_10x6_KHR)
795 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA_ASTC_10x8_KHR)
796 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA_ASTC_10x10_KHR)
797 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA_ASTC_12x10_KHR)
798 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA_ASTC_12x12_KHR)
799 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR)
800 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR)
801 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR)
802 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR)
803 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR)
804 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR)
805 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR)
806 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR)
807 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR)
808 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR)
809 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR)
810 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR)
811 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR)
812 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR)
813 default:
814 break;
815 }
816 return false;
817 }
818
supportedCompressedFormat(GL2Encoder * ctx,GLenum internalformat)819 bool supportedCompressedFormat(GL2Encoder* ctx, GLenum internalformat) {
820 int glesMajorVersion = ctx->majorVersion();
821 int glesMinorVersion = ctx->minorVersion();
822
823 #define COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(internal) \
824 case internal: \
825 return glesMajorVersion > 1 && ctx->hasExtension("GL_KHR_texture_compression_astc_ldr"); \
826
827 #define COMPRESSED_TEX_IMAGE_SUPPORT_CASE_BPTC(internal) \
828 case internal: \
829 return glesMajorVersion > 1 && ctx->hasExtension("GL_EXT_texture_compression_bptc"); \
830
831 #define COMPRESSED_TEX_IMAGE_SUPPORT_CASE_S3TC(internal) \
832 case internal: \
833 return glesMajorVersion > 1 && ctx->hasExtension("GL_EXT_texture_compression_s3tc"); \
834
835 #define COMPRESSED_TEX_IMAGE_SUPPORT_CASE_S3TC_SRGB(internal) \
836 case internal: \
837 return glesMajorVersion > 1 && ctx->hasExtension("GL_EXT_texture_compression_s3tc") && ctx->hasExtension("GL_EXT_texture_sRGB"); \
838
839 #define COMPRESSED_TEX_IMAGE_SUPPORT_CASE(internal, maj, min) \
840 case internal: \
841 if (maj < 3) return true; \
842 if (glesMajorVersion < maj) return false; \
843 if (glesMinorVersion < min) return false; \
844 break; \
845
846 #define COMPRESSED_TEX_IMAGE_NOTSUPPORTED(internal) \
847 case internal: \
848 return false ; \
849
850 switch (internalformat) {
851 COMPRESSED_TEX_IMAGE_SUPPORT_CASE(GL_ETC1_RGB8_OES, 2, 0)
852 COMPRESSED_TEX_IMAGE_SUPPORT_CASE(GL_COMPRESSED_R11_EAC, 2, 0)
853 COMPRESSED_TEX_IMAGE_SUPPORT_CASE(GL_COMPRESSED_SIGNED_R11_EAC, 2, 0)
854 COMPRESSED_TEX_IMAGE_SUPPORT_CASE(GL_COMPRESSED_RG11_EAC, 2, 0)
855 COMPRESSED_TEX_IMAGE_SUPPORT_CASE(GL_COMPRESSED_SIGNED_RG11_EAC, 2, 0)
856 COMPRESSED_TEX_IMAGE_SUPPORT_CASE(GL_COMPRESSED_RGB8_ETC2, 2, 0)
857 COMPRESSED_TEX_IMAGE_SUPPORT_CASE(GL_COMPRESSED_SRGB8_ETC2, 2, 0)
858 COMPRESSED_TEX_IMAGE_SUPPORT_CASE(GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, 2, 0)
859 COMPRESSED_TEX_IMAGE_SUPPORT_CASE(GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, 2, 0)
860 COMPRESSED_TEX_IMAGE_SUPPORT_CASE(GL_COMPRESSED_RGBA8_ETC2_EAC, 2, 0)
861 COMPRESSED_TEX_IMAGE_SUPPORT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, 2, 0)
862 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_RGBA_ASTC_4x4_KHR)
863 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_RGBA_ASTC_5x4_KHR)
864 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_RGBA_ASTC_5x5_KHR)
865 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_RGBA_ASTC_6x5_KHR)
866 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_RGBA_ASTC_6x6_KHR)
867 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_RGBA_ASTC_8x5_KHR)
868 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_RGBA_ASTC_8x6_KHR)
869 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_RGBA_ASTC_8x8_KHR)
870 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_RGBA_ASTC_10x5_KHR)
871 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_RGBA_ASTC_10x6_KHR)
872 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_RGBA_ASTC_10x8_KHR)
873 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_RGBA_ASTC_10x10_KHR)
874 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_RGBA_ASTC_12x10_KHR)
875 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_RGBA_ASTC_12x12_KHR)
876 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR)
877 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR)
878 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR)
879 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR)
880 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR)
881 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR)
882 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR)
883 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR)
884 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR)
885 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR)
886 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR)
887 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR)
888 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR)
889 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR)
890 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_BPTC(GL_COMPRESSED_RGBA_BPTC_UNORM_EXT)
891 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_BPTC(GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT)
892 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_BPTC(GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT)
893 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_BPTC(GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT)
894 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_S3TC(GL_COMPRESSED_RGB_S3TC_DXT1_EXT)
895 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_S3TC(GL_COMPRESSED_RGBA_S3TC_DXT1_EXT)
896 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_S3TC(GL_COMPRESSED_RGBA_S3TC_DXT3_EXT)
897 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_S3TC(GL_COMPRESSED_RGBA_S3TC_DXT5_EXT)
898 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_S3TC(GL_COMPRESSED_SRGB_S3TC_DXT1_EXT)
899 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_S3TC_SRGB(GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT)
900 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_S3TC_SRGB(GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT)
901 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_S3TC_SRGB(GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT)
902 default:
903 break;
904 }
905 return false;
906 }
907
unsizedFormat(GLenum format)908 bool unsizedFormat(GLenum format) {
909 switch (format) {
910 case GL_RED:
911 case GL_RED_INTEGER:
912 case GL_DEPTH_COMPONENT:
913 case GL_DEPTH_STENCIL:
914 case GL_RG:
915 case GL_RG_INTEGER:
916 case GL_RGB:
917 case GL_RGB_INTEGER:
918 case GL_RGBA:
919 case GL_RGBA_INTEGER:
920 case GL_ALPHA:
921 case GL_LUMINANCE:
922 case GL_LUMINANCE_ALPHA:
923 return true;
924 }
925 return false;
926 }
927
928 // TODO: fix this
filterableTexFormat(GL2Encoder * ctx,GLenum internalformat)929 bool filterableTexFormat(GL2Encoder* ctx, GLenum internalformat) {
930 switch (internalformat) {
931 case GL_R32F:
932 case GL_RG32F:
933 case GL_RGB32F:
934 case GL_RGBA32F:
935 return ctx->hasExtension("GL_OES_texture_float");
936 case GL_R8UI:
937 case GL_R8I:
938 case GL_R16UI:
939 case GL_R16I:
940 case GL_R32UI:
941 case GL_R32I:
942 case GL_RG8UI:
943 case GL_RG8I:
944 case GL_RG16UI:
945 case GL_RG16I:
946 case GL_RG32UI:
947 case GL_RG32I:
948 case GL_RGBA8UI:
949 case GL_RGBA8I:
950 case GL_RGB10_A2UI:
951 case GL_RGBA16UI:
952 case GL_RGBA16I:
953 case GL_RGBA32I:
954 case GL_RGBA32UI:
955 return false;
956 }
957 return true;
958 }
959
960
colorRenderableFormat(GL2Encoder * ctx,GLenum internalformat)961 bool colorRenderableFormat(GL2Encoder* ctx, GLenum internalformat) {
962 int glesMajorVersion = ctx->majorVersion();
963 switch (internalformat) {
964 case GL_R8:
965 case GL_RG8:
966 case GL_RGB8:
967 case GL_RGB565:
968 case GL_RGBA4:
969 case GL_RGB5_A1:
970 case GL_RGBA8:
971 case GL_RGB10_A2:
972 case GL_RGB10_A2UI:
973 case GL_SRGB8_ALPHA8:
974 case GL_R8I:
975 case GL_R8UI:
976 case GL_R16I:
977 case GL_R16UI:
978 case GL_R32I:
979 case GL_R32UI:
980 case GL_RG8I:
981 case GL_RG8UI:
982 case GL_RG16I:
983 case GL_RG16UI:
984 case GL_RG32I:
985 case GL_RG32UI:
986 case GL_RGBA8I:
987 case GL_RGBA8UI:
988 case GL_RGBA16I:
989 case GL_RGBA16UI:
990 case GL_RGBA32I:
991 case GL_RGBA32UI:
992 return true;
993 case GL_R16F:
994 case GL_RG16F:
995 case GL_RGBA16F:
996 case GL_R32F:
997 case GL_RG32F:
998 case GL_RGBA32F:
999 case GL_R11F_G11F_B10F:
1000 return glesMajorVersion >= 3 && ctx->hasExtension("GL_EXT_color_buffer_float");
1001 break;
1002 case GL_RGB16F:
1003 return glesMajorVersion >= 3 && ctx->hasExtension("GL_EXT_color_buffer_half_float");
1004 break;
1005 }
1006 return false;
1007 }
1008
depthRenderableFormat(GL2Encoder * ctx,GLenum internalformat)1009 bool depthRenderableFormat(GL2Encoder* ctx, GLenum internalformat) {
1010 switch (internalformat) {
1011 case GL_DEPTH_COMPONENT:
1012 case GL_DEPTH_STENCIL:
1013 case GL_DEPTH_COMPONENT16:
1014 case GL_DEPTH_COMPONENT24:
1015 case GL_DEPTH_COMPONENT32F:
1016 case GL_DEPTH24_STENCIL8:
1017 case GL_DEPTH32F_STENCIL8:
1018 return true;
1019 case GL_DEPTH_COMPONENT32_OES:
1020 return ctx->hasExtension("GL_OES_depth32");
1021 }
1022 return false;
1023 }
1024
stencilRenderableFormat(GL2Encoder *,GLenum internalformat)1025 bool stencilRenderableFormat(GL2Encoder*, GLenum internalformat) {
1026 switch (internalformat) {
1027 case GL_DEPTH_STENCIL:
1028 case GL_STENCIL_INDEX8:
1029 case GL_DEPTH24_STENCIL8:
1030 case GL_DEPTH32F_STENCIL8:
1031 return true;
1032 }
1033 return false;
1034 }
1035
isCubeMapTarget(GLenum target)1036 bool isCubeMapTarget(GLenum target) {
1037 switch (target) {
1038 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1039 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1040 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1041 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1042 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1043 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1044 return true;
1045 default:
1046 break;
1047 }
1048 return false;
1049 }
1050
1051 #define LIST_VALID_TEXFORMATS(f) \
1052 f(GL_DEPTH_COMPONENT) \
1053 f(GL_DEPTH_STENCIL) \
1054 f(GL_RED) \
1055 f(GL_RED_INTEGER) \
1056 f(GL_RG) \
1057 f(GL_RGB) \
1058 f(GL_RGBA) \
1059 f(GL_RGBA_INTEGER) \
1060 f(GL_RGB_INTEGER) \
1061 f(GL_RG_INTEGER) \
1062 f(GL_BGRA_EXT) \
1063 f(GL_ALPHA) \
1064 f(GL_LUMINANCE) \
1065 f(GL_LUMINANCE_ALPHA) \
1066
1067 #define LIST_VALID_TEXTYPES(f) \
1068 f(GL_BYTE) \
1069 f(GL_FLOAT) \
1070 f(GL_FLOAT_32_UNSIGNED_INT_24_8_REV) \
1071 f(GL_HALF_FLOAT) \
1072 f(GL_HALF_FLOAT_OES) \
1073 f(GL_INT) \
1074 f(GL_SHORT) \
1075 f(GL_UNSIGNED_BYTE) \
1076 f(GL_UNSIGNED_INT) \
1077 f(GL_UNSIGNED_INT_10F_11F_11F_REV) \
1078 f(GL_UNSIGNED_INT_2_10_10_10_REV) \
1079 f(GL_UNSIGNED_INT_24_8) \
1080 f(GL_UNSIGNED_INT_5_9_9_9_REV) \
1081 f(GL_UNSIGNED_SHORT) \
1082 f(GL_UNSIGNED_SHORT_4_4_4_4) \
1083 f(GL_UNSIGNED_SHORT_5_5_5_1) \
1084 f(GL_UNSIGNED_SHORT_5_6_5) \
1085
pixelType(GL2Encoder * ctx,GLenum type)1086 bool pixelType(GL2Encoder* ctx, GLenum type) {
1087 int glesMajorVersion = ctx->majorVersion();
1088 if (glesMajorVersion < 3) {
1089 switch (type) {
1090 case GL_UNSIGNED_BYTE:
1091 case GL_UNSIGNED_SHORT:
1092 case GL_UNSIGNED_SHORT_5_6_5:
1093 case GL_UNSIGNED_SHORT_4_4_4_4:
1094 case GL_UNSIGNED_SHORT_5_5_5_1:
1095 case GL_UNSIGNED_INT:
1096 case GL_UNSIGNED_INT_10F_11F_11F_REV:
1097 case GL_UNSIGNED_INT_24_8:
1098 case GL_HALF_FLOAT:
1099 case GL_HALF_FLOAT_OES:
1100 case GL_FLOAT:
1101 return true;
1102 }
1103 return false;
1104 }
1105
1106 #define GLES3_TYPE_CASE(type) \
1107 case type: \
1108
1109 switch (type) {
1110 LIST_VALID_TEXTYPES(GLES3_TYPE_CASE)
1111 return glesMajorVersion >= 3;
1112 default:
1113 break;
1114 }
1115
1116 return false;
1117 }
1118
pixelFormat(GL2Encoder * ctx,GLenum format)1119 bool pixelFormat(GL2Encoder* ctx, GLenum format) {
1120 int glesMajorVersion = ctx->majorVersion();
1121 if (glesMajorVersion < 3) {
1122 switch (format) {
1123 case GL_DEPTH_COMPONENT:
1124 // GLES3 compatible
1125 // Required in dEQP
1126 case GL_RED:
1127 case GL_RG:
1128 case GL_DEPTH_STENCIL_OES:
1129 case GL_ALPHA:
1130 case GL_RGB:
1131 case GL_RGBA:
1132 case GL_BGRA_EXT:
1133 case GL_LUMINANCE:
1134 case GL_LUMINANCE_ALPHA:
1135 return true;
1136 }
1137 return false;
1138 }
1139
1140 #define GLES3_FORMAT_CASE(format) \
1141 case format:
1142
1143 switch (format) {
1144 LIST_VALID_TEXFORMATS(GLES3_FORMAT_CASE)
1145 return glesMajorVersion >= 3;
1146 default:
1147 break;
1148 }
1149 return false;
1150 }
pixelInternalFormat(GLenum internalformat)1151 bool pixelInternalFormat(GLenum internalformat) {
1152 #define VALID_INTERNAL_FORMAT(format) \
1153 case format: \
1154 return true; \
1155
1156 switch (internalformat) {
1157 LIST_VALID_TEX_INTERNALFORMATS(VALID_INTERNAL_FORMAT)
1158 default:
1159 break;
1160 }
1161
1162 ALOGW("error internal format: 0x%x is invalid\n", internalformat);
1163 return false;
1164 }
1165
pixelSizedFormat(GL2Encoder * ctx,GLenum internalformat,GLenum format,GLenum type)1166 bool pixelSizedFormat(GL2Encoder* ctx, GLenum internalformat, GLenum format, GLenum type) {
1167 int glesMajorVersion = ctx->majorVersion();
1168 if (internalformat == format) {
1169 return true;
1170 }
1171
1172 if (glesMajorVersion < 3) {
1173 switch (format) {
1174 case GL_RED:
1175 switch (type) {
1176 case GL_UNSIGNED_BYTE:
1177 return internalformat == GL_R8;
1178 case GL_HALF_FLOAT:
1179 case GL_FLOAT:
1180 return internalformat == GL_R16F;
1181 case GL_BYTE:
1182 return internalformat == GL_R8_SNORM;
1183 default:
1184 return false;
1185 }
1186 break;
1187 case GL_RG:
1188 switch (type) {
1189 case GL_UNSIGNED_BYTE:
1190 return internalformat == GL_RG8;
1191 case GL_HALF_FLOAT:
1192 case GL_FLOAT:
1193 return internalformat == GL_RG16F;
1194 default:
1195 return false;
1196 }
1197 break;
1198 case GL_RGB:
1199 switch (type) {
1200 case GL_HALF_FLOAT:
1201 case GL_FLOAT:
1202 return internalformat == GL_RGB16F
1203 || internalformat == GL_R11F_G11F_B10F;
1204 case GL_UNSIGNED_INT_10F_11F_11F_REV:
1205 return internalformat == GL_R11F_G11F_B10F;
1206 default:
1207 return internalformat == GL_RGB8 ||
1208 internalformat == GL_RGB;
1209 }
1210 break;
1211 case GL_RGBA:
1212 switch (type) {
1213 case GL_HALF_FLOAT:
1214 case GL_FLOAT:
1215 return internalformat == GL_RGBA16F;
1216 default:
1217 return internalformat == GL_RGBA8 ||
1218 internalformat == GL_RGBA;
1219 }
1220 break;
1221 }
1222 }
1223
1224 #define VALIDATE_FORMAT_COMBINATION(x, y, z) \
1225 if (internalformat == x && format == y && type == z) return true; \
1226
1227 LIST_VALID_TEXFORMAT_COMBINATIONS(VALIDATE_FORMAT_COMBINATION)
1228
1229 return false;
1230 }
1231
getCompatibleFormatTypeForInternalFormat(GLenum internalformat,GLenum * format_out,GLenum * type_out)1232 void getCompatibleFormatTypeForInternalFormat(GLenum internalformat, GLenum* format_out, GLenum* type_out) {
1233 #define RETURN_COMPATIBLE_FORMAT(x, y, z) \
1234 if (internalformat == x) { \
1235 *format_out = y; \
1236 *type_out = z; \
1237 return; \
1238 } \
1239
1240 LIST_VALID_TEXFORMAT_COMBINATIONS(RETURN_COMPATIBLE_FORMAT)
1241 }
1242
shaderType(GL2Encoder * ctx,GLenum type)1243 bool shaderType(GL2Encoder* ctx, GLenum type) {
1244 int glesMajorVersion = ctx->majorVersion();
1245 int glesMinorVersion = ctx->minorVersion();
1246 switch (type) {
1247 case GL_VERTEX_SHADER:
1248 case GL_FRAGMENT_SHADER:
1249 return true;
1250 case GL_COMPUTE_SHADER:
1251 return glesMajorVersion >= 3 && glesMinorVersion >= 1;
1252 }
1253 return false;
1254 }
1255
internalFormatTarget(GL2Encoder * ctx,GLenum target)1256 bool internalFormatTarget(GL2Encoder* ctx, GLenum target) {
1257 int glesMajorVersion = ctx->majorVersion();
1258 int glesMinorVersion = ctx->minorVersion();
1259 switch (target) {
1260 case GL_RENDERBUFFER:
1261 return true;
1262 case GL_TEXTURE_2D_MULTISAMPLE:
1263 return glesMajorVersion >= 3 && glesMinorVersion >= 1;
1264 }
1265 return false;
1266 }
1267
vertexAttribIndexRangeErrorMsg(GL2Encoder * ctx,GLuint index)1268 std::string vertexAttribIndexRangeErrorMsg(GL2Encoder* ctx, GLuint index) {
1269 std::stringstream ss;
1270 GLint maxIndex;
1271 ctx->glGetIntegerv(ctx, GL_MAX_VERTEX_ATTRIBS, &maxIndex);
1272 ss << "Invalid vertex attribute index. Wanted index: " << index << ". Max index: " << maxIndex;
1273 return ss.str();
1274 }
1275
allowedFace(GLenum face)1276 bool allowedFace(GLenum face) {
1277 switch (face) {
1278 case GL_FRONT:
1279 case GL_BACK:
1280 case GL_FRONT_AND_BACK:
1281 return true;
1282 default:
1283 return false;
1284 }
1285 }
1286
allowedFunc(GLenum func)1287 bool allowedFunc(GLenum func) {
1288 switch (func) {
1289 case GL_NEVER:
1290 case GL_ALWAYS:
1291 case GL_LESS:
1292 case GL_LEQUAL:
1293 case GL_EQUAL:
1294 case GL_GREATER:
1295 case GL_GEQUAL:
1296 case GL_NOTEQUAL:
1297 return true;
1298 default:
1299 return false;
1300 }
1301 }
1302
allowedStencilOp(GLenum op)1303 bool allowedStencilOp(GLenum op) {
1304 switch (op) {
1305 case GL_KEEP:
1306 case GL_ZERO:
1307 case GL_REPLACE:
1308 case GL_INCR:
1309 case GL_DECR:
1310 case GL_INVERT:
1311 case GL_INCR_WRAP:
1312 case GL_DECR_WRAP:
1313 return true;
1314 default:
1315 return false;
1316 }
1317 }
1318
allowedBlendEquation(GLenum eq)1319 bool allowedBlendEquation(GLenum eq) {
1320 switch (eq) {
1321 case GL_FUNC_ADD:
1322 case GL_FUNC_SUBTRACT:
1323 case GL_FUNC_REVERSE_SUBTRACT:
1324 case GL_MIN:
1325 case GL_MAX:
1326 return true;
1327 default:
1328 return false;
1329 }
1330 }
1331
allowedBlendFunc(GLenum func)1332 bool allowedBlendFunc(GLenum func) {
1333 switch (func) {
1334 case GL_ZERO:
1335 case GL_ONE:
1336 case GL_SRC_COLOR:
1337 case GL_ONE_MINUS_SRC_COLOR:
1338 case GL_DST_COLOR:
1339 case GL_ONE_MINUS_DST_COLOR:
1340 case GL_SRC_ALPHA:
1341 case GL_ONE_MINUS_SRC_ALPHA:
1342 case GL_DST_ALPHA:
1343 case GL_ONE_MINUS_DST_ALPHA:
1344 case GL_CONSTANT_COLOR:
1345 case GL_ONE_MINUS_CONSTANT_COLOR:
1346 case GL_CONSTANT_ALPHA:
1347 case GL_ONE_MINUS_CONSTANT_ALPHA:
1348 case GL_SRC_ALPHA_SATURATE:
1349 return true;
1350 default:
1351 return false;
1352 }
1353 }
1354
allowedCullFace(GLenum mode)1355 bool allowedCullFace(GLenum mode) {
1356 switch (mode) {
1357 case GL_FRONT:
1358 case GL_BACK:
1359 case GL_FRONT_AND_BACK:
1360 return true;
1361 default:
1362 return false;
1363 }
1364 }
1365
allowedFrontFace(GLenum mode)1366 bool allowedFrontFace(GLenum mode) {
1367 switch (mode) {
1368 case GL_CCW:
1369 case GL_CW:
1370 return true;
1371 default:
1372 return false;
1373 }
1374 }
1375
allowedEnable(int majorVersion,int minorVersion,GLenum cap)1376 bool allowedEnable(int majorVersion, int minorVersion, GLenum cap) {
1377 switch (cap) {
1378 case GL_CULL_FACE:
1379 case GL_POLYGON_OFFSET_FILL:
1380 case GL_SAMPLE_ALPHA_TO_COVERAGE:
1381 case GL_SAMPLE_COVERAGE:
1382 case GL_SCISSOR_TEST:
1383 case GL_STENCIL_TEST:
1384 case GL_DEPTH_TEST:
1385 case GL_BLEND:
1386 case GL_DITHER:
1387 return true;
1388 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
1389 case GL_RASTERIZER_DISCARD:
1390 return majorVersion >= 3;
1391 case GL_SAMPLE_MASK:
1392 return majorVersion >= 3 && minorVersion >= 1;
1393 default:
1394 return false;
1395 }
1396 }
1397
allowedGetShader(GLenum pname)1398 bool allowedGetShader(GLenum pname) {
1399 switch (pname) {
1400 case GL_SHADER_TYPE:
1401 case GL_DELETE_STATUS:
1402 case GL_COMPILE_STATUS:
1403 case GL_INFO_LOG_LENGTH:
1404 case GL_SHADER_SOURCE_LENGTH:
1405 return true;
1406 default:
1407 return false;
1408 }
1409 }
1410
allowedShaderType(GLenum shadertype)1411 bool allowedShaderType(GLenum shadertype) {
1412 switch (shadertype) {
1413 case GL_VERTEX_SHADER:
1414 case GL_FRAGMENT_SHADER:
1415 return true;
1416 default:
1417 return false;
1418 }
1419 }
1420
allowedPrecisionType(GLenum precisiontype)1421 bool allowedPrecisionType(GLenum precisiontype) {
1422 switch (precisiontype) {
1423 case GL_LOW_FLOAT:
1424 case GL_MEDIUM_FLOAT:
1425 case GL_HIGH_FLOAT:
1426 case GL_LOW_INT:
1427 case GL_MEDIUM_INT:
1428 case GL_HIGH_INT:
1429 return true;
1430 default:
1431 return false;
1432 }
1433 }
1434
allowedGetProgram(int majorVersion,int minorVersion,GLenum pname)1435 bool allowedGetProgram(int majorVersion, int minorVersion, GLenum pname) {
1436 switch (pname) {
1437 case GL_DELETE_STATUS:
1438 case GL_LINK_STATUS:
1439 case GL_VALIDATE_STATUS:
1440 case GL_INFO_LOG_LENGTH:
1441 case GL_ATTACHED_SHADERS:
1442 case GL_ACTIVE_ATTRIBUTES:
1443 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
1444 case GL_ACTIVE_UNIFORMS:
1445 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
1446 return true;
1447 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
1448 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
1449 case GL_PROGRAM_BINARY_LENGTH:
1450 case GL_TRANSFORM_FEEDBACK_VARYINGS:
1451 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
1452 case GL_ACTIVE_UNIFORM_BLOCKS:
1453 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
1454 return majorVersion > 2;
1455 case GL_COMPUTE_WORK_GROUP_SIZE:
1456 case GL_PROGRAM_SEPARABLE:
1457 case GL_ACTIVE_ATOMIC_COUNTER_BUFFERS:
1458 return majorVersion > 2 && minorVersion > 0;
1459 default:
1460 return false;
1461 }
1462 }
1463
allowedGetActiveUniforms(GLenum pname)1464 bool allowedGetActiveUniforms(GLenum pname) {
1465 switch (pname) {
1466 case GL_UNIFORM_TYPE:
1467 case GL_UNIFORM_SIZE:
1468 case GL_UNIFORM_NAME_LENGTH:
1469 case GL_UNIFORM_BLOCK_INDEX:
1470 case GL_UNIFORM_OFFSET:
1471 case GL_UNIFORM_ARRAY_STRIDE:
1472 case GL_UNIFORM_MATRIX_STRIDE:
1473 case GL_UNIFORM_IS_ROW_MAJOR:
1474 return true;
1475 default:
1476 return false;
1477 }
1478 }
1479
allowedGetActiveUniformBlock(GLenum pname)1480 bool allowedGetActiveUniformBlock(GLenum pname) {
1481 switch (pname) {
1482 case GL_UNIFORM_BLOCK_BINDING:
1483 case GL_UNIFORM_BLOCK_DATA_SIZE:
1484 case GL_UNIFORM_BLOCK_NAME_LENGTH:
1485 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
1486 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
1487 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
1488 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
1489 return true;
1490 default:
1491 return false;
1492 }
1493 }
1494
allowedGetVertexAttrib(GLenum pname)1495 bool allowedGetVertexAttrib(GLenum pname) {
1496 switch (pname) {
1497 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
1498 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
1499 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
1500 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
1501 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
1502 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
1503 case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
1504 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
1505 case GL_VERTEX_ATTRIB_BINDING:
1506 case GL_VERTEX_ATTRIB_RELATIVE_OFFSET:
1507 case GL_CURRENT_VERTEX_ATTRIB:
1508 return true;
1509 default:
1510 return false;
1511 }
1512 }
1513
allowedGetRenderbufferParameter(GLenum pname)1514 bool allowedGetRenderbufferParameter(GLenum pname) {
1515 switch (pname) {
1516 case GL_RENDERBUFFER_WIDTH:
1517 case GL_RENDERBUFFER_HEIGHT:
1518 case GL_RENDERBUFFER_INTERNAL_FORMAT:
1519 case GL_RENDERBUFFER_RED_SIZE:
1520 case GL_RENDERBUFFER_GREEN_SIZE:
1521 case GL_RENDERBUFFER_BLUE_SIZE:
1522 case GL_RENDERBUFFER_ALPHA_SIZE:
1523 case GL_RENDERBUFFER_DEPTH_SIZE:
1524 case GL_RENDERBUFFER_STENCIL_SIZE:
1525 case GL_RENDERBUFFER_SAMPLES:
1526 return true;
1527 default:
1528 return false;
1529 }
1530 }
1531
allowedQueryTarget(GLenum target)1532 bool allowedQueryTarget(GLenum target) {
1533 switch (target) {
1534 case GL_ANY_SAMPLES_PASSED:
1535 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE:
1536 case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN:
1537 return true;
1538 default:
1539 return false;
1540 }
1541 }
1542
allowedQueryParam(GLenum pname)1543 bool allowedQueryParam(GLenum pname) {
1544 switch (pname) {
1545 case GL_CURRENT_QUERY:
1546 return true;
1547 default:
1548 return false;
1549 }
1550 }
1551
allowedQueryObjectParam(GLenum pname)1552 bool allowedQueryObjectParam(GLenum pname) {
1553 switch (pname) {
1554 case GL_QUERY_RESULT:
1555 case GL_QUERY_RESULT_AVAILABLE:
1556 return true;
1557 default:
1558 return false;
1559 }
1560 }
1561
allowedGetSyncParam(GLenum pname)1562 bool allowedGetSyncParam(GLenum pname) {
1563 switch (pname) {
1564 case GL_OBJECT_TYPE:
1565 case GL_SYNC_STATUS:
1566 case GL_SYNC_CONDITION:
1567 case GL_SYNC_FLAGS:
1568 return true;
1569 default:
1570 return false;
1571 }
1572 }
1573
allowedHintTarget(GLenum target)1574 bool allowedHintTarget(GLenum target) {
1575 switch (target) {
1576 case GL_GENERATE_MIPMAP_HINT:
1577 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
1578 return true;
1579 default:
1580 return false;
1581 }
1582 }
1583
allowedHintMode(GLenum mode)1584 bool allowedHintMode(GLenum mode) {
1585 switch (mode) {
1586 case GL_DONT_CARE:
1587 case GL_NICEST:
1588 case GL_FASTEST:
1589 return true;
1590 default:
1591 return false;
1592 }
1593 }
1594
1595 } // namespace GLESv2Validation
1596