OSDN Git Service

[WIP] ES 3.1 guestside changes
[android-x86/device-generic-goldfish-opengl.git] / system / GLESv2_enc / GLESv2Validation.cpp
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 namespace GLESv2Validation {
20
21 GLbitfield allBufferMapAccessFlags =
22     GL_MAP_READ_BIT | GL_MAP_WRITE_BIT |
23     GL_MAP_INVALIDATE_RANGE_BIT |
24     GL_MAP_INVALIDATE_BUFFER_BIT |
25     GL_MAP_FLUSH_EXPLICIT_BIT |
26     GL_MAP_UNSYNCHRONIZED_BIT;
27
28 bool bufferTarget(GL2Encoder* ctx, GLenum target) {
29     int glesMajorVersion = ctx->majorVersion();
30     int glesMinorVersion = ctx->minorVersion();
31     switch (target) {
32     case GL_ARRAY_BUFFER: // Vertex attributes
33     case GL_ELEMENT_ARRAY_BUFFER: // Vertex array indices
34         return true;
35         // GLES 3.0 buffers
36     case GL_COPY_READ_BUFFER: // Buffer copy source
37     case GL_COPY_WRITE_BUFFER: // Buffer copy destination
38     case GL_PIXEL_PACK_BUFFER: // Pixel read target
39     case GL_PIXEL_UNPACK_BUFFER: // Texture data source
40     case GL_TRANSFORM_FEEDBACK_BUFFER: // Transform feedback buffer
41     case GL_UNIFORM_BUFFER: // Uniform block storage
42         return glesMajorVersion >= 3;
43         // GLES 3.1 buffers
44     case GL_ATOMIC_COUNTER_BUFFER: // Atomic counter storage
45     case GL_DISPATCH_INDIRECT_BUFFER: // Indirect compute dispatch commands
46     case GL_DRAW_INDIRECT_BUFFER: // Indirect command arguments
47     case GL_SHADER_STORAGE_BUFFER: // Read-write storage for shaders
48         return glesMajorVersion >= 3 && glesMinorVersion >= 1;
49     default:
50         return false;
51     }
52 }
53
54 bool bufferParam(GL2Encoder* ctx, GLenum pname) {
55     int glesMajorVersion = ctx->majorVersion();
56     int glesMinorVersion = ctx->minorVersion();
57     switch (pname) {
58     case GL_BUFFER_SIZE:
59     case GL_BUFFER_USAGE:
60         return true;
61     case GL_BUFFER_ACCESS_FLAGS:
62     case GL_BUFFER_MAPPED:
63     case GL_BUFFER_MAP_LENGTH:
64     case GL_BUFFER_MAP_OFFSET:
65         return glesMajorVersion >= 3;
66     default:
67         return false;
68     }
69 }
70
71 bool pixelStoreParam(GL2Encoder* ctx, GLenum param) {
72     int glesMajorVersion = ctx->majorVersion();
73     switch(param) {
74     case GL_UNPACK_ALIGNMENT:
75     case GL_PACK_ALIGNMENT:
76         return true;
77     case GL_UNPACK_ROW_LENGTH:
78     case GL_UNPACK_IMAGE_HEIGHT:
79     case GL_UNPACK_SKIP_PIXELS:
80     case GL_UNPACK_SKIP_ROWS:
81     case GL_UNPACK_SKIP_IMAGES:
82     case GL_PACK_ROW_LENGTH:
83     case GL_PACK_SKIP_PIXELS:
84     case GL_PACK_SKIP_ROWS:
85         return glesMajorVersion >= 3;
86     default:
87         return false;
88     }
89 }
90
91 bool pixelStoreValue(GLenum param, GLint value) {
92     switch(param) {
93     case GL_UNPACK_ALIGNMENT:
94     case GL_PACK_ALIGNMENT:
95         return (value == 1) || (value == 2) || (value == 4) || (value == 8);
96     case GL_UNPACK_ROW_LENGTH:
97     case GL_UNPACK_IMAGE_HEIGHT:
98     case GL_UNPACK_SKIP_PIXELS:
99     case GL_UNPACK_SKIP_ROWS:
100     case GL_UNPACK_SKIP_IMAGES:
101     case GL_PACK_ROW_LENGTH:
102     case GL_PACK_SKIP_PIXELS:
103     case GL_PACK_SKIP_ROWS:
104         return value >= 0;
105     default:
106         return false;
107     }
108 }
109
110 bool rboFormat(GL2Encoder* ctx, GLenum internalformat) {
111     int glesMajorVersion = ctx->majorVersion();
112     switch (internalformat) {
113     // Funny internal formats
114     // that will cause an incomplete framebuffer
115     // attachment error pre-gles3. For dEQP,
116     // we can also just abort early here in
117     // RenderbufferStorage with a GL_INVALID_ENUM.
118     case GL_DEPTH_COMPONENT32F:
119     case GL_R8:
120     case GL_R8UI:
121     case GL_R8I:
122     case GL_R16UI:
123     case GL_R16I:
124     case GL_R32UI:
125     case GL_R32I:
126     case GL_RG8:
127     case GL_RG8UI:
128     case GL_RG8I:
129     case GL_RG16UI:
130     case GL_RG16I:
131     case GL_RG32UI:
132     case GL_RG32I:
133     case GL_SRGB8_ALPHA8:
134     case GL_RGBA8UI:
135     case GL_RGBA8I:
136     case GL_RGB10_A2:
137     case GL_RGB10_A2UI:
138     case GL_RGBA16UI:
139     case GL_RGBA16I:
140     case GL_RGBA32I:
141     case GL_RGBA32UI:
142     // case GL_R11F_G11F_B10F:
143     // case GL_R32F:
144     // case GL_RG32F:
145     case GL_RGB32F:
146     // case GL_RGBA32F:
147         return glesMajorVersion >= 3;
148         // These 4 formats are still not OK,
149         // but dEQP expects GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT or
150         // GL_FRAMEBUFFER_UNSUPPORTED,
151         // not a GL_INVALID_ENUM from earlier on.
152         // So let's forward these to the rest of
153         // FBO initialization
154     case GL_R16F:
155     case GL_RG16F:
156     case GL_RGB16F:
157     case GL_RGBA16F:
158         // But in GLES 3, these are rejected immediately.
159         return glesMajorVersion < 3;
160         // dEQP expects GL_FRAMEBUFFER_UNSUPPORTED or GL_FRAMEBUFFER_COMPLETE
161         // for this format
162         // These formats are OK
163     case GL_DEPTH_COMPONENT16:
164     case GL_DEPTH_COMPONENT24:
165     case GL_DEPTH_COMPONENT32_OES:
166     case GL_RGBA4:
167     case GL_RGB5_A1:
168     case GL_RGB565:
169     case GL_RGB8_OES:
170     case GL_RGBA8_OES:
171     case GL_STENCIL_INDEX8:
172     case GL_DEPTH32F_STENCIL8:
173     case GL_DEPTH24_STENCIL8_OES:
174         return true;
175         break;
176         // Everything else: still not OK,
177         // and they need the GL_INVALID_ENUM
178     }
179     return false;
180 }
181
182 bool framebufferTarget(GL2Encoder* ctx, GLenum target) {
183     int glesMajorVersion = ctx->majorVersion();
184     switch (target) {
185     case GL_FRAMEBUFFER:
186         return true;
187     case GL_DRAW_FRAMEBUFFER:
188     case GL_READ_FRAMEBUFFER:
189         return glesMajorVersion >= 3;
190     }
191     return false;
192 }
193
194 bool framebufferAttachment(GL2Encoder* ctx, GLenum attachment) {
195     int glesMajorVersion = ctx->majorVersion();
196     switch (attachment) {
197     case GL_COLOR_ATTACHMENT0:
198     case GL_DEPTH_ATTACHMENT:
199     case GL_STENCIL_ATTACHMENT:
200         return true;
201     case GL_COLOR_ATTACHMENT1:
202     case GL_COLOR_ATTACHMENT2:
203     case GL_COLOR_ATTACHMENT3:
204     case GL_COLOR_ATTACHMENT4:
205     case GL_COLOR_ATTACHMENT5:
206     case GL_COLOR_ATTACHMENT6:
207     case GL_COLOR_ATTACHMENT7:
208     case GL_COLOR_ATTACHMENT8:
209     case GL_COLOR_ATTACHMENT9:
210     case GL_COLOR_ATTACHMENT10:
211     case GL_COLOR_ATTACHMENT11:
212     case GL_COLOR_ATTACHMENT12:
213     case GL_COLOR_ATTACHMENT13:
214     case GL_COLOR_ATTACHMENT14:
215     case GL_COLOR_ATTACHMENT15:
216     case GL_DEPTH_STENCIL_ATTACHMENT:
217         return glesMajorVersion >= 3;
218     }
219     return false;
220 }
221
222 bool readPixelsFormat(GLenum format) {
223     switch (format) {
224     case GL_RED:
225     case GL_RED_INTEGER:
226     case GL_RG:
227     case GL_RG_INTEGER:
228     case GL_RGB:
229     case GL_RGB_INTEGER:
230     case GL_RGBA:
231     case GL_RGBA_INTEGER:
232     case GL_LUMINANCE_ALPHA:
233     case GL_LUMINANCE:
234     case GL_ALPHA:
235         return true;
236     }
237     return false;
238 }
239
240 bool readPixelsType(GLenum format) {
241     switch (format) {
242     case GL_UNSIGNED_BYTE:
243     case GL_BYTE:
244     case GL_HALF_FLOAT:
245     case GL_FLOAT:
246     case GL_INT:
247     case GL_UNSIGNED_SHORT_5_6_5:
248     case GL_UNSIGNED_SHORT_4_4_4_4:
249     case GL_UNSIGNED_SHORT_5_5_5_1:
250     case GL_UNSIGNED_INT:
251     case GL_UNSIGNED_INT_2_10_10_10_REV:
252     case GL_UNSIGNED_INT_10F_11F_11F_REV:
253     case GL_UNSIGNED_INT_5_9_9_9_REV:
254         return true;
255     }
256     return false;
257 }
258
259 bool vertexAttribType(GL2Encoder* ctx, GLenum type)
260 {
261     int glesMajorVersion = ctx->majorVersion();
262     bool retval = false;
263     switch (type) {
264     case GL_BYTE:
265     case GL_UNSIGNED_BYTE:
266     case GL_SHORT:
267     case GL_UNSIGNED_SHORT:
268     case GL_FIXED:
269     case GL_FLOAT:
270     // The following are technically only available if certain GLES2 extensions are.
271     // However, they are supported by desktop GL3, which is a reasonable requirement
272     // for the desktop GL version. Therefore, consider them valid.
273     case GL_INT:
274     case GL_UNSIGNED_INT:
275     case GL_HALF_FLOAT_OES:
276         retval = true;
277         break;
278     case GL_HALF_FLOAT:
279     case GL_INT_2_10_10_10_REV:
280     case GL_UNSIGNED_INT_2_10_10_10_REV:
281         retval = glesMajorVersion >= 3;
282         break;
283     }
284     return retval;
285 }
286
287 bool readPixelsFboFormatMatch(GLenum format, GLenum type, GLenum fboTexType) {
288 #define INVALID_TYPE_MATCH(x, y) \
289     if (type == x && fboTexType == y) return false; \
290     if (type == y && fboTexType == x) return false; \
291
292     // These are meant to reject additional format/type mismatches
293     // not caught by underlying system.
294     INVALID_TYPE_MATCH(GL_FLOAT, GL_BYTE)
295     INVALID_TYPE_MATCH(GL_FLOAT, GL_UNSIGNED_BYTE)
296     INVALID_TYPE_MATCH(GL_FLOAT, GL_UNSIGNED_INT)
297     INVALID_TYPE_MATCH(GL_FLOAT, GL_INT)
298
299     return true;
300 }
301
302 bool blitFramebufferFormat(GLenum readFormat, GLenum drawFormat) {
303 #define INVALID_MATCH(x, y) \
304     if (readFormat == x && drawFormat == y) return false; \
305     if (readFormat == y && drawFormat == x) return false; \
306
307     INVALID_MATCH(GL_FLOAT, GL_BYTE)
308     INVALID_MATCH(GL_FLOAT, GL_UNSIGNED_BYTE)
309     INVALID_MATCH(GL_FLOAT, GL_UNSIGNED_INT)
310     INVALID_MATCH(GL_FLOAT, GL_INT)
311     INVALID_MATCH(GL_INT, GL_UNSIGNED_BYTE);
312     INVALID_MATCH(GL_UNSIGNED_INT, GL_UNSIGNED_BYTE);
313     INVALID_MATCH(GL_INT, GL_BYTE);
314     INVALID_MATCH(GL_UNSIGNED_INT, GL_BYTE);
315     INVALID_MATCH(GL_DEPTH32F_STENCIL8, GL_DEPTH24_STENCIL8);
316
317     return true;
318 }
319
320 bool textureTarget(GL2Encoder* ctx, GLenum target) {
321     int glesMajorVersion = ctx->majorVersion();
322     int glesMinorVersion = ctx->minorVersion();
323     switch (target) {
324     case GL_TEXTURE_EXTERNAL_OES:
325     case GL_TEXTURE_2D:
326     case GL_TEXTURE_CUBE_MAP:
327     case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
328     case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
329     case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
330     case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
331     case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
332     case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
333         return true;
334     case GL_TEXTURE_2D_ARRAY:
335     case GL_TEXTURE_3D:
336         return glesMajorVersion >= 3;
337     case GL_TEXTURE_2D_MULTISAMPLE:
338         return glesMajorVersion >= 3 &&
339                glesMinorVersion >= 1;
340     default:
341         break;
342     }
343     return false;
344 }
345
346 static GLsizei ceildiv(GLsizei x, GLsizei y) {
347     return (x + y - 1) / y;
348 }
349
350 GLsizei compressedTexImageSize(GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth) {
351     GLsizei base_size = ceildiv(width, 4) * ceildiv(height, 4) * depth;
352 #define COMPRESSED_TEX_IMAGE_SIZE_CASE(internal, multiplier) \
353     case internal: \
354         return base_size * multiplier; \
355
356     switch (internalformat) {
357     COMPRESSED_TEX_IMAGE_SIZE_CASE(GL_COMPRESSED_R11_EAC, 8)
358     COMPRESSED_TEX_IMAGE_SIZE_CASE(GL_COMPRESSED_SIGNED_R11_EAC, 8)
359     COMPRESSED_TEX_IMAGE_SIZE_CASE(GL_COMPRESSED_RG11_EAC, 16)
360     COMPRESSED_TEX_IMAGE_SIZE_CASE(GL_COMPRESSED_SIGNED_RG11_EAC, 16)
361     COMPRESSED_TEX_IMAGE_SIZE_CASE(GL_COMPRESSED_RGB8_ETC2, 8)
362     COMPRESSED_TEX_IMAGE_SIZE_CASE(GL_COMPRESSED_SRGB8_ETC2, 8)
363     COMPRESSED_TEX_IMAGE_SIZE_CASE(GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, 8)
364     COMPRESSED_TEX_IMAGE_SIZE_CASE(GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, 8)
365     COMPRESSED_TEX_IMAGE_SIZE_CASE(GL_COMPRESSED_RGBA8_ETC2_EAC, 16)
366     COMPRESSED_TEX_IMAGE_SIZE_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, 16)
367     default:
368         break;
369     }
370
371     return 0;
372 }
373
374 bool isCompressedFormat(GLenum internalformat) {
375 #define COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(internal) \
376     case internal: \
377         return true; \
378
379     switch (internalformat) {
380     COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_R11_EAC)
381     COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SIGNED_R11_EAC)
382     COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RG11_EAC)
383     COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SIGNED_RG11_EAC)
384     COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGB8_ETC2)
385     COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ETC2)
386     COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2)
387     COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2)
388     COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA8_ETC2_EAC)
389     COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC)
390     COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA_ASTC_4x4_KHR)
391     COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA_ASTC_5x4_KHR)
392     COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA_ASTC_5x5_KHR)
393     COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA_ASTC_6x5_KHR)
394     COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA_ASTC_6x6_KHR)
395     COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA_ASTC_8x5_KHR)
396     COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA_ASTC_8x6_KHR)
397     COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA_ASTC_8x8_KHR)
398     COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA_ASTC_10x5_KHR)
399     COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA_ASTC_10x6_KHR)
400     COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA_ASTC_10x8_KHR)
401     COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA_ASTC_10x10_KHR)
402     COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA_ASTC_12x10_KHR)
403     COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA_ASTC_12x12_KHR)
404     COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR)
405     COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR)
406     COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR)
407     COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR)
408     COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR)
409     COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR)
410     COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR)
411     COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR)
412     COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR)
413     COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR)
414     COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR)
415     COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR)
416     COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR)
417     COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR)
418     default:
419         break;
420     }
421     return false;
422 }
423
424 bool supportedCompressedFormat(GL2Encoder* ctx, GLenum internalformat) {
425     int glesMajorVersion = ctx->majorVersion();
426     int glesMinorVersion = ctx->minorVersion();
427 #define COMPRESSED_TEX_IMAGE_SUPPORT_CASE(internal, maj, min) \
428     case internal: \
429         if (maj < 3) return true; \
430         if (glesMajorVersion < maj) return false; \
431         if (glesMinorVersion < min) return false; \
432         break; \
433
434 #define COMPRESSED_TEX_IMAGE_NOTSUPPORTED(internal) \
435     case internal: \
436         return false ; \
437
438     switch (internalformat) {
439     COMPRESSED_TEX_IMAGE_SUPPORT_CASE(GL_COMPRESSED_R11_EAC, 2, 0)
440     COMPRESSED_TEX_IMAGE_SUPPORT_CASE(GL_COMPRESSED_SIGNED_R11_EAC, 2, 0)
441     COMPRESSED_TEX_IMAGE_SUPPORT_CASE(GL_COMPRESSED_RG11_EAC, 2, 0)
442     COMPRESSED_TEX_IMAGE_SUPPORT_CASE(GL_COMPRESSED_SIGNED_RG11_EAC, 2, 0)
443     COMPRESSED_TEX_IMAGE_SUPPORT_CASE(GL_COMPRESSED_RGB8_ETC2, 2, 0)
444     COMPRESSED_TEX_IMAGE_SUPPORT_CASE(GL_COMPRESSED_SRGB8_ETC2, 2, 0)
445     COMPRESSED_TEX_IMAGE_SUPPORT_CASE(GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, 2, 0)
446     COMPRESSED_TEX_IMAGE_SUPPORT_CASE(GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, 2, 0)
447     COMPRESSED_TEX_IMAGE_SUPPORT_CASE(GL_COMPRESSED_RGBA8_ETC2_EAC, 2, 0)
448     COMPRESSED_TEX_IMAGE_SUPPORT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, 2, 0)
449     COMPRESSED_TEX_IMAGE_NOTSUPPORTED(GL_COMPRESSED_RGBA_ASTC_4x4_KHR)
450     COMPRESSED_TEX_IMAGE_NOTSUPPORTED(GL_COMPRESSED_RGBA_ASTC_5x4_KHR)
451     COMPRESSED_TEX_IMAGE_NOTSUPPORTED(GL_COMPRESSED_RGBA_ASTC_5x5_KHR)
452     COMPRESSED_TEX_IMAGE_NOTSUPPORTED(GL_COMPRESSED_RGBA_ASTC_6x5_KHR)
453     COMPRESSED_TEX_IMAGE_NOTSUPPORTED(GL_COMPRESSED_RGBA_ASTC_6x6_KHR)
454     COMPRESSED_TEX_IMAGE_NOTSUPPORTED(GL_COMPRESSED_RGBA_ASTC_8x5_KHR)
455     COMPRESSED_TEX_IMAGE_NOTSUPPORTED(GL_COMPRESSED_RGBA_ASTC_8x6_KHR)
456     COMPRESSED_TEX_IMAGE_NOTSUPPORTED(GL_COMPRESSED_RGBA_ASTC_8x8_KHR)
457     COMPRESSED_TEX_IMAGE_NOTSUPPORTED(GL_COMPRESSED_RGBA_ASTC_10x5_KHR)
458     COMPRESSED_TEX_IMAGE_NOTSUPPORTED(GL_COMPRESSED_RGBA_ASTC_10x6_KHR)
459     COMPRESSED_TEX_IMAGE_NOTSUPPORTED(GL_COMPRESSED_RGBA_ASTC_10x8_KHR)
460     COMPRESSED_TEX_IMAGE_NOTSUPPORTED(GL_COMPRESSED_RGBA_ASTC_10x10_KHR)
461     COMPRESSED_TEX_IMAGE_NOTSUPPORTED(GL_COMPRESSED_RGBA_ASTC_12x10_KHR)
462     COMPRESSED_TEX_IMAGE_NOTSUPPORTED(GL_COMPRESSED_RGBA_ASTC_12x12_KHR)
463     COMPRESSED_TEX_IMAGE_NOTSUPPORTED(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR)
464     COMPRESSED_TEX_IMAGE_NOTSUPPORTED(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR)
465     COMPRESSED_TEX_IMAGE_NOTSUPPORTED(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR)
466     COMPRESSED_TEX_IMAGE_NOTSUPPORTED(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR)
467     COMPRESSED_TEX_IMAGE_NOTSUPPORTED(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR)
468     COMPRESSED_TEX_IMAGE_NOTSUPPORTED(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR)
469     COMPRESSED_TEX_IMAGE_NOTSUPPORTED(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR)
470     COMPRESSED_TEX_IMAGE_NOTSUPPORTED(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR)
471     COMPRESSED_TEX_IMAGE_NOTSUPPORTED(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR)
472     COMPRESSED_TEX_IMAGE_NOTSUPPORTED(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR)
473     COMPRESSED_TEX_IMAGE_NOTSUPPORTED(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR)
474     COMPRESSED_TEX_IMAGE_NOTSUPPORTED(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR)
475     COMPRESSED_TEX_IMAGE_NOTSUPPORTED(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR)
476     COMPRESSED_TEX_IMAGE_NOTSUPPORTED(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR)
477     default:
478         break;
479     }
480     return true;
481 }
482
483 // TODO: fix this
484 bool filterableTexFormat(GLenum internalformat) {
485     switch (internalformat) {
486     // 32F's are not filterable.
487     case GL_R32F:
488     case GL_RG32F:
489     case GL_RGB32F:
490     case GL_RGBA32F:
491     // No integer textures are filterable.
492     case GL_R8UI:
493     case GL_R8I:
494     case GL_R16UI:
495     case GL_R16I:
496     case GL_R32UI:
497     case GL_R32I:
498     case GL_RG8UI:
499     case GL_RG8I:
500     case GL_RG16UI:
501     case GL_RG16I:
502     case GL_RG32UI:
503     case GL_RG32I:
504     case GL_RGBA8UI:
505     case GL_RGBA8I:
506     case GL_RGB10_A2UI:
507     case GL_RGBA16UI:
508     case GL_RGBA16I:
509     case GL_RGBA32I:
510     case GL_RGBA32UI:
511         return false;
512     }
513     return true;
514 }
515
516 bool unsizedFormat(GLenum format) {
517     switch (format) {
518     case GL_RED:
519     case GL_RED_INTEGER:
520     case GL_DEPTH_COMPONENT:
521     case GL_DEPTH_STENCIL:
522     case GL_RG:
523     case GL_RG_INTEGER:
524     case GL_RGB:
525     case GL_RGB_INTEGER:
526     case GL_RGBA:
527     case GL_RGBA_INTEGER:
528     case GL_ALPHA:
529     case GL_LUMINANCE:
530     case GL_LUMINANCE_ALPHA:
531         return true;
532     }
533     return false;
534 }
535 bool colorRenderableFormat(GLenum internalformat) {
536     switch (internalformat) {
537     case GL_R8:
538     case GL_RG8:
539     case GL_RGB8:
540     case GL_RGB565:
541     case GL_RGBA4:
542     case GL_RGB5_A1:
543     case GL_RGBA8:
544     case GL_RGB10_A2:
545     case GL_RGB10_A2UI:
546     case GL_SRGB8_ALPHA8:
547     case GL_R8I:
548     case GL_R8UI:
549     case GL_R16I:
550     case GL_R16UI:
551     case GL_R32I:
552     case GL_R32UI:
553     case GL_RG8I:
554     case GL_RG8UI:
555     case GL_RG16I:
556     case GL_RG16UI:
557     case GL_RG32I:
558     case GL_RG32UI:
559     case GL_RGBA8I:
560     case GL_RGBA8UI:
561     case GL_RGBA16I:
562     case GL_RGBA16UI:
563     case GL_RGBA32I:
564     case GL_RGBA32UI:
565         return true;
566     }
567     return false;
568 }
569
570 bool depthRenderableFormat(GLenum internalformat) {
571     switch (internalformat) {
572     case GL_DEPTH_COMPONENT:
573     case GL_DEPTH_STENCIL:
574     case GL_DEPTH_COMPONENT16:
575     case GL_DEPTH_COMPONENT24:
576     case GL_DEPTH_COMPONENT32F:
577     case GL_DEPTH24_STENCIL8:
578     case GL_DEPTH32F_STENCIL8:
579         return true;
580     }
581     return false;
582 }
583
584 bool stencilRenderableFormat(GLenum internalformat) {
585     switch (internalformat) {
586     case GL_DEPTH_STENCIL:
587     case GL_STENCIL_INDEX8:
588     case GL_DEPTH24_STENCIL8:
589     case GL_DEPTH32F_STENCIL8:
590         return true;
591     }
592     return false;
593 }
594
595 bool isCubeMapTarget(GLenum target) {
596     switch (target) {
597     case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
598     case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
599     case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
600     case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
601     case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
602     case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
603         return true;
604     default:
605         break;
606     }
607     return false;
608 }
609
610 #define LIST_VALID_TEXFORMATS(f) \
611     f(GL_DEPTH_COMPONENT) \
612     f(GL_DEPTH_STENCIL) \
613     f(GL_RED) \
614     f(GL_RED_INTEGER) \
615     f(GL_RG) \
616     f(GL_RGB) \
617     f(GL_RGBA) \
618     f(GL_RGBA_INTEGER) \
619     f(GL_RGB_INTEGER) \
620     f(GL_RG_INTEGER) \
621     f(GL_BGRA_EXT) \
622     f(GL_ALPHA) \
623     f(GL_LUMINANCE) \
624     f(GL_LUMINANCE_ALPHA) \
625
626 #define LIST_VALID_TEXTYPES(f) \
627     f(GL_BYTE) \
628     f(GL_FLOAT) \
629     f(GL_FLOAT_32_UNSIGNED_INT_24_8_REV) \
630     f(GL_HALF_FLOAT) \
631     f(GL_INT) \
632     f(GL_SHORT) \
633     f(GL_UNSIGNED_BYTE) \
634     f(GL_UNSIGNED_INT) \
635     f(GL_UNSIGNED_INT_10F_11F_11F_REV) \
636     f(GL_UNSIGNED_INT_2_10_10_10_REV) \
637     f(GL_UNSIGNED_INT_24_8) \
638     f(GL_UNSIGNED_INT_5_9_9_9_REV) \
639     f(GL_UNSIGNED_SHORT) \
640     f(GL_UNSIGNED_SHORT_4_4_4_4) \
641     f(GL_UNSIGNED_SHORT_5_5_5_1) \
642     f(GL_UNSIGNED_SHORT_5_6_5) \
643
644 bool pixelType(GL2Encoder* ctx, GLenum type) {
645     int glesMajorVersion = ctx->majorVersion();
646     if (glesMajorVersion < 3) {
647         switch (type) {
648         case GL_UNSIGNED_BYTE:
649         case GL_UNSIGNED_SHORT:
650         case GL_UNSIGNED_SHORT_5_6_5:
651         case GL_UNSIGNED_SHORT_4_4_4_4:
652         case GL_UNSIGNED_SHORT_5_5_5_1:
653         case GL_UNSIGNED_INT:
654         case GL_UNSIGNED_INT_10F_11F_11F_REV:
655         case GL_UNSIGNED_INT_24_8:
656         case GL_HALF_FLOAT:
657         case GL_HALF_FLOAT_OES:
658         case GL_FLOAT:
659             return true;
660         }
661         return false;
662     }
663
664 #define GLES3_TYPE_CASE(type) \
665     case type: \
666
667     switch (type) {
668         LIST_VALID_TEXTYPES(GLES3_TYPE_CASE)
669             return glesMajorVersion >= 3;
670         default:
671             break;
672     }
673
674     return false;
675 }
676
677 bool pixelFormat(GL2Encoder* ctx, GLenum format) {
678     int glesMajorVersion = ctx->majorVersion();
679     if (glesMajorVersion < 3) {
680         switch (format) {
681             case GL_DEPTH_COMPONENT:
682                 // GLES3 compatible
683                 // Required in dEQP
684             case GL_RED:
685             case GL_RG:
686             case GL_DEPTH_STENCIL_OES:
687             case GL_ALPHA:
688             case GL_RGB:
689             case GL_RGBA:
690             case GL_BGRA_EXT:
691             case GL_LUMINANCE:
692             case GL_LUMINANCE_ALPHA:
693                 return true;
694         }
695         return false;
696     }
697
698 #define GLES3_FORMAT_CASE(format) \
699     case format:
700
701     switch (format) {
702         LIST_VALID_TEXFORMATS(GLES3_FORMAT_CASE)
703             return glesMajorVersion >= 3;
704         default:
705             break;
706     }
707     return false;
708 }
709 #define LIST_VALID_TEX_INTERNALFORMATS(f) \
710     f(GL_R8) \
711     f(GL_R8_SNORM) \
712     f(GL_R16F) \
713     f(GL_R32F) \
714     f(GL_R8UI) \
715     f(GL_R8I) \
716     f(GL_R16UI) \
717     f(GL_R16I) \
718     f(GL_R32UI) \
719     f(GL_R32I) \
720     f(GL_RG8) \
721     f(GL_RG8_SNORM) \
722     f(GL_RG16F) \
723     f(GL_RG32F) \
724     f(GL_RG8UI) \
725     f(GL_RG8I) \
726     f(GL_RG16UI) \
727     f(GL_RG16I) \
728     f(GL_RG32UI) \
729     f(GL_RG32I) \
730     f(GL_RGB8) \
731     f(GL_SRGB8) \
732     f(GL_RGB565) \
733     f(GL_RGB8_SNORM) \
734     f(GL_R11F_G11F_B10F) \
735     f(GL_RGB9_E5) \
736     f(GL_RGB16F) \
737     f(GL_RGB32F) \
738     f(GL_RGB8UI) \
739     f(GL_RGB8I) \
740     f(GL_RGB16UI) \
741     f(GL_RGB16I) \
742     f(GL_RGB32UI) \
743     f(GL_RGB32I) \
744     f(GL_RGBA8) \
745     f(GL_SRGB8_ALPHA8) \
746     f(GL_RGBA8_SNORM) \
747     f(GL_RGB5_A1) \
748     f(GL_RGBA4) \
749     f(GL_RGB10_A2) \
750     f(GL_RGBA16F) \
751     f(GL_RGBA32F) \
752     f(GL_RGBA8UI) \
753     f(GL_RGBA8I) \
754     f(GL_RGB10_A2UI) \
755     f(GL_RGBA16UI) \
756     f(GL_RGBA16I) \
757     f(GL_RGBA32I) \
758     f(GL_RGBA32UI) \
759     f(GL_DEPTH_COMPONENT16) \
760     f(GL_DEPTH_COMPONENT24) \
761     f(GL_DEPTH_COMPONENT32F) \
762     f(GL_DEPTH24_STENCIL8) \
763     f(GL_DEPTH32F_STENCIL8) \
764     f(GL_COMPRESSED_R11_EAC) \
765     f(GL_COMPRESSED_SIGNED_R11_EAC) \
766     f(GL_COMPRESSED_RG11_EAC) \
767     f(GL_COMPRESSED_SIGNED_RG11_EAC) \
768     f(GL_COMPRESSED_RGB8_ETC2) \
769     f(GL_COMPRESSED_SRGB8_ETC2) \
770     f(GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2) \
771     f(GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2) \
772     f(GL_COMPRESSED_RGBA8_ETC2_EAC) \
773     f(GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC) \
774
775 bool pixelInternalFormat(GLenum internalformat) {
776 #define VALID_INTERNAL_FORMAT(format) \
777     case format: \
778         return true; \
779
780     switch (internalformat) {
781     LIST_VALID_TEX_INTERNALFORMATS(VALID_INTERNAL_FORMAT)
782     default:
783         break;
784     }
785     return false;
786 }
787
788 bool shaderType(GL2Encoder* ctx, GLenum type) {
789     int glesMajorVersion = ctx->majorVersion();
790     int glesMinorVersion = ctx->minorVersion();
791     switch (type) {
792     case GL_VERTEX_SHADER:
793     case GL_FRAGMENT_SHADER:
794         return true;
795     case GL_COMPUTE_SHADER:
796         return glesMajorVersion >= 3 && glesMinorVersion >= 1;
797     }
798     return false;
799 }
800
801 bool internalFormatTarget(GL2Encoder* ctx, GLenum target) {
802     int glesMajorVersion = ctx->majorVersion();
803     int glesMinorVersion = ctx->minorVersion();
804     switch (target) {
805     case GL_RENDERBUFFER:
806         return true;
807     case GL_TEXTURE_2D_MULTISAMPLE:
808         return glesMajorVersion >= 3 && glesMinorVersion >= 1;
809     }
810     return false;
811 }
812
813 } // namespace GLESv2Validation