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