2 * Copyright (C) 2016 The Android Open Source Project
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 #include "GLESv2Validation.h"
19 namespace GLESv2Validation {
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;
28 bool bufferTarget(GL2Encoder* ctx, GLenum target) {
29 int glesMajorVersion = ctx->majorVersion();
30 int glesMinorVersion = ctx->minorVersion();
32 case GL_ARRAY_BUFFER: // Vertex attributes
33 case GL_ELEMENT_ARRAY_BUFFER: // Vertex array indices
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;
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;
54 bool bufferParam(GL2Encoder* ctx, GLenum pname) {
55 int glesMajorVersion = ctx->majorVersion();
56 int glesMinorVersion = ctx->minorVersion();
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;
71 bool pixelStoreParam(GL2Encoder* ctx, GLenum param) {
72 int glesMajorVersion = ctx->majorVersion();
74 case GL_UNPACK_ALIGNMENT:
75 case GL_PACK_ALIGNMENT:
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;
91 bool pixelStoreValue(GLenum param, GLint value) {
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:
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:
133 case GL_SRGB8_ALPHA8:
142 // case GL_R11F_G11F_B10F:
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
158 // But in GLES 3, these are rejected immediately.
159 return glesMajorVersion < 3;
160 // dEQP expects GL_FRAMEBUFFER_UNSUPPORTED or GL_FRAMEBUFFER_COMPLETE
162 // These formats are OK
163 case GL_DEPTH_COMPONENT16:
164 case GL_DEPTH_COMPONENT24:
165 case GL_DEPTH_COMPONENT32_OES:
171 case GL_STENCIL_INDEX8:
172 case GL_DEPTH32F_STENCIL8:
173 case GL_DEPTH24_STENCIL8_OES:
176 // Everything else: still not OK,
177 // and they need the GL_INVALID_ENUM
182 bool framebufferTarget(GL2Encoder* ctx, GLenum target) {
183 int glesMajorVersion = ctx->majorVersion();
187 case GL_DRAW_FRAMEBUFFER:
188 case GL_READ_FRAMEBUFFER:
189 return glesMajorVersion >= 3;
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:
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;
222 bool readPixelsFormat(GLenum format) {
231 case GL_RGBA_INTEGER:
232 case GL_LUMINANCE_ALPHA:
240 bool readPixelsType(GLenum format) {
242 case GL_UNSIGNED_BYTE:
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:
259 bool vertexAttribType(GL2Encoder* ctx, GLenum type)
261 int glesMajorVersion = ctx->majorVersion();
265 case GL_UNSIGNED_BYTE:
267 case GL_UNSIGNED_SHORT:
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.
274 case GL_UNSIGNED_INT:
275 case GL_HALF_FLOAT_OES:
279 case GL_INT_2_10_10_10_REV:
280 case GL_UNSIGNED_INT_2_10_10_10_REV:
281 retval = glesMajorVersion >= 3;
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; \
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)
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; \
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);
320 bool textureTarget(GL2Encoder* ctx, GLenum target) {
321 int glesMajorVersion = ctx->majorVersion();
322 int glesMinorVersion = ctx->minorVersion();
324 case GL_TEXTURE_EXTERNAL_OES:
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:
334 case GL_TEXTURE_2D_ARRAY:
336 return glesMajorVersion >= 3;
337 case GL_TEXTURE_2D_MULTISAMPLE:
338 return glesMajorVersion >= 3 &&
339 glesMinorVersion >= 1;
346 static GLsizei ceildiv(GLsizei x, GLsizei y) {
347 return (x + y - 1) / y;
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) \
354 return base_size * multiplier; \
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)
374 bool isCompressedFormat(GLenum internalformat) {
375 #define COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(internal) \
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)
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) \
429 if (maj < 3) return true; \
430 if (glesMajorVersion < maj) return false; \
431 if (glesMinorVersion < min) return false; \
434 #define COMPRESSED_TEX_IMAGE_NOTSUPPORTED(internal) \
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)
484 bool filterableTexFormat(GLenum internalformat) {
485 switch (internalformat) {
486 // 32F's are not filterable.
491 // No integer textures are filterable.
516 bool unsizedFormat(GLenum format) {
520 case GL_DEPTH_COMPONENT:
521 case GL_DEPTH_STENCIL:
527 case GL_RGBA_INTEGER:
530 case GL_LUMINANCE_ALPHA:
535 bool colorRenderableFormat(GLenum internalformat) {
536 switch (internalformat) {
546 case GL_SRGB8_ALPHA8:
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:
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:
595 bool isCubeMapTarget(GLenum 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:
610 #define LIST_VALID_TEXFORMATS(f) \
611 f(GL_DEPTH_COMPONENT) \
612 f(GL_DEPTH_STENCIL) \
624 f(GL_LUMINANCE_ALPHA) \
626 #define LIST_VALID_TEXTYPES(f) \
629 f(GL_FLOAT_32_UNSIGNED_INT_24_8_REV) \
633 f(GL_UNSIGNED_BYTE) \
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) \
644 bool pixelType(GL2Encoder* ctx, GLenum type) {
645 int glesMajorVersion = ctx->majorVersion();
646 if (glesMajorVersion < 3) {
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:
657 case GL_HALF_FLOAT_OES:
664 #define GLES3_TYPE_CASE(type) \
668 LIST_VALID_TEXTYPES(GLES3_TYPE_CASE)
669 return glesMajorVersion >= 3;
677 bool pixelFormat(GL2Encoder* ctx, GLenum format) {
678 int glesMajorVersion = ctx->majorVersion();
679 if (glesMajorVersion < 3) {
681 case GL_DEPTH_COMPONENT:
686 case GL_DEPTH_STENCIL_OES:
692 case GL_LUMINANCE_ALPHA:
698 #define GLES3_FORMAT_CASE(format) \
702 LIST_VALID_TEXFORMATS(GLES3_FORMAT_CASE)
703 return glesMajorVersion >= 3;
709 #define LIST_VALID_TEX_INTERNALFORMATS(f) \
734 f(GL_R11F_G11F_B10F) \
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) \
775 bool pixelInternalFormat(GLenum internalformat) {
776 #define VALID_INTERNAL_FORMAT(format) \
780 switch (internalformat) {
781 LIST_VALID_TEX_INTERNALFORMATS(VALID_INTERNAL_FORMAT)
788 bool shaderType(GL2Encoder* ctx, GLenum type) {
789 int glesMajorVersion = ctx->majorVersion();
790 int glesMinorVersion = ctx->minorVersion();
792 case GL_VERTEX_SHADER:
793 case GL_FRAGMENT_SHADER:
795 case GL_COMPUTE_SHADER:
796 return glesMajorVersion >= 3 && glesMinorVersion >= 1;
801 bool internalFormatTarget(GL2Encoder* ctx, GLenum target) {
802 int glesMajorVersion = ctx->majorVersion();
803 int glesMinorVersion = ctx->minorVersion();
805 case GL_RENDERBUFFER:
807 case GL_TEXTURE_2D_MULTISAMPLE:
808 return glesMajorVersion >= 3 && glesMinorVersion >= 1;
813 } // namespace GLESv2Validation